test("length is 2", () => {
    expect(Object.assign).toHaveLength(2);
});

describe("errors", () => {
    test("first argument must coercible to object", () => {
        expect(() => {
            Object.assign(null);
        }).toThrowWithMessage(TypeError, "ToObject on null or undefined");
        expect(() => {
            Object.assign(undefined);
        }).toThrowWithMessage(TypeError, "ToObject on null or undefined");
    });
});

describe("normal behavior", () => {
    test("returns first argument coerced to object", () => {
        const o = {};
        expect(Object.assign(o)).toBe(o);
        expect(Object.assign(o, {})).toBe(o);
        expect(Object.assign(42)).toEqual(new Number(42));
    });

    test("alters first argument object if sources are given", () => {
        const o = { foo: 0 };
        expect(Object.assign(o, { foo: 1 })).toBe(o);
        expect(o).toEqual({ foo: 1 });
    });

    test("merges objects", () => {
        const s = Symbol();
        expect(Object.assign({}, { foo: 0, bar: "baz" }, { [s]: [1, 2, 3] }, { foo: 1 }, { [42]: "test" })).toEqual({
            foo: 1,
            bar: "baz",
            [s]: [1, 2, 3],
            42: "test",
        });
    });
});
