test("basic functionality", () => {
    const sum = (a, b, c) => a + b + c;
    const a = [1, 2, 3];

    expect(sum(...a)).toBe(6);
    expect(sum(1, ...a)).toBe(4);
    expect(sum(...a, 10)).toBe(6);

    const foo = (a, b, c) => c;

    const o = { bar: [1, 2, 3] };
    expect(foo(...o.bar)).toBe(3);
    expect(foo(..."abc")).toBe("c");
});

test("spreading custom iterable", () => {
    let o = {
        [Symbol.iterator]() {
            return {
                i: 0,
                next() {
                    if (this.i++ === 3) {
                        return { done: true };
                    }
                    return { value: this.i };
                },
            };
        },
    };

    expect(Math.max(...o)).toBe(3);
});

test("spreading non iterable", () => {
    expect(() => {
        [...1];
    }).toThrowWithMessage(TypeError, "1 is not iterable");
});