test("rest parameter with no arguments", () => {
    function foo(...a) {
        expect(a).toBeInstanceOf(Array);
        expect(a).toHaveLength(0);
    }
    foo();
});

test("rest parameter with arguments", () => {
    function foo(...a) {
        expect(a).toEqual(["foo", 123, undefined, { foo: "bar" }]);
    }
    foo("foo", 123, undefined, { foo: "bar" });
});

test("rest parameter after normal parameters with no arguments", () => {
    function foo(a, b, ...c) {
        expect(a).toBe("foo");
        expect(b).toBe(123);
        expect(c).toEqual([]);
    }
    foo("foo", 123);
});

test("rest parameter after normal parameters with arguments", () => {
    function foo(a, b, ...c) {
        expect(a).toBe("foo");
        expect(b).toBe(123);
        expect(c).toEqual([undefined, { foo: "bar" }]);
    }
    foo("foo", 123, undefined, { foo: "bar" });
});

test("basic arrow function rest parameters", () => {
    let foo = (...a) => {
        expect(a).toBeInstanceOf(Array);
        expect(a).toHaveLength(0);
    };
    foo();

    foo = (a, b, ...c) => {
        expect(a).toBe("foo");
        expect(b).toBe(123);
        expect(c).toEqual([undefined, { foo: "bar" }]);
    };
    foo("foo", 123, undefined, { foo: "bar" });
});