describe("errors", () => { test("invalid array length value", () => { var a = [1, 2, 3]; [undefined, "foo", -1, Infinity, -Infinity, NaN].forEach(value => { expect(() => { a.length = value; }).toThrowWithMessage(RangeError, "Invalid array length"); expect(a).toHaveLength(3); }); }); }); describe("normal behavior", () => { test("extend array by setting length", () => { var a = [1, 2, 3]; a.length = 5; expect(a).toEqual([1, 2, 3, undefined, undefined]); }); test("truncate array by setting length", () => { var a = [1, 2, 3]; a.length = 2; expect(a).toEqual([1, 2]); a.length = 0; expect(a).toEqual([]); }); test("length value is coerced to number if possible", () => { var a = [1, 2, 3]; a.length = "42"; expect(a).toHaveLength(42); a.length = []; expect(a).toHaveLength(0); a.length = true; expect(a).toHaveLength(1); }); test("setting a huge array length", () => { var a = []; a.length = 0x80000000; expect(a.length).toEqual(0x80000000); var b = []; b.length = 0x80000001; expect(b.length).toEqual(0x80000001); }); test("should not remove non-configurable values", () => { var a = [1, undefined, 3]; Object.defineProperty(a, 1, { configurable: false, value: 2 }); expect(a.length).toEqual(3); expect((a.length = 1)).toEqual(1); expect(a.length).toEqual(2); expect(a[1]).toEqual(2); }); });