mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 13:32:45 +00:00 
			
		
		
		
	LibJS: Convert Array tests to new testing framework
This commit is contained in:
		
							parent
							
								
									8ebdf685a6
								
							
						
					
					
						commit
						461d90d042
					
				
					 33 changed files with 1315 additions and 1382 deletions
				
			
		|  | @ -1,28 +1,26 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.isArray).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.isArray.length === 1); | ||||
| test("arguments that evaluate to false", () => { | ||||
|     expect(Array.isArray()).toBeFalse(); | ||||
|     expect(Array.isArray("1")).toBeFalse(); | ||||
|     expect(Array.isArray("foo")).toBeFalse(); | ||||
|     expect(Array.isArray(1)).toBeFalse(); | ||||
|     expect(Array.isArray(1, 2, 3)).toBeFalse(); | ||||
|     expect(Array.isArray(undefined)).toBeFalse(); | ||||
|     expect(Array.isArray(null)).toBeFalse(); | ||||
|     expect(Array.isArray(Infinity)).toBeFalse(); | ||||
|     expect(Array.isArray({})).toBeFalse(); | ||||
| }); | ||||
| 
 | ||||
|     assert(Array.isArray() === false); | ||||
|     assert(Array.isArray("1") === false); | ||||
|     assert(Array.isArray("foo") === false); | ||||
|     assert(Array.isArray(1) === false); | ||||
|     assert(Array.isArray(1, 2, 3) === false); | ||||
|     assert(Array.isArray(undefined) === false); | ||||
|     assert(Array.isArray(null) === false); | ||||
|     assert(Array.isArray(Infinity) === false); | ||||
|     assert(Array.isArray({}) === false); | ||||
| 
 | ||||
|     assert(Array.isArray([]) === true); | ||||
|     assert(Array.isArray([1]) === true); | ||||
|     assert(Array.isArray([1, 2, 3]) === true); | ||||
|     assert(Array.isArray(new Array()) === true); | ||||
|     assert(Array.isArray(new Array(10)) === true); | ||||
|     assert(Array.isArray(new Array("a", "b", "c")) === true); | ||||
| test("arguments that evaluate to true", () => { | ||||
|     expect(Array.isArray([])).toBeTrue(); | ||||
|     expect(Array.isArray([1])).toBeTrue(); | ||||
|     expect(Array.isArray([1, 2, 3])).toBeTrue(); | ||||
|     expect(Array.isArray(new Array())).toBeTrue(); | ||||
|     expect(Array.isArray(new Array(10))).toBeTrue(); | ||||
|     expect(Array.isArray(new Array("a", "b", "c"))).toBeTrue(); | ||||
|     // FIXME: Array.prototype is supposed to be an array!
 | ||||
|     // assert(Array.isArray(Array.prototype) === true);
 | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     // expect(Array.isArray(Array.prototype)).toBeTrue();
 | ||||
| }); | ||||
|  |  | |||
|  | @ -1,55 +1,53 @@ | |||
| load("test-common.js"); | ||||
| test("constructor properties", () => { | ||||
|     expect(Array).toHaveLength(1); | ||||
|     expect(Array.name).toBe("Array"); | ||||
|     expect(Array.prototype.length).toBe(0); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.length === 1); | ||||
|     assert(Array.name === "Array"); | ||||
|     assert(Array.prototype.length === 0); | ||||
| 
 | ||||
|     assert(typeof Array() === "object"); | ||||
|     assert(typeof new Array() === "object"); | ||||
| 
 | ||||
|     var a; | ||||
| 
 | ||||
|     a = new Array(5); | ||||
|     assert(a.length === 5); | ||||
| 
 | ||||
|     a = new Array("5"); | ||||
|     assert(a.length === 1); | ||||
|     assert(a[0] === "5"); | ||||
| 
 | ||||
|     a = new Array(1, 2, 3); | ||||
|     assert(a.length === 3); | ||||
|     assert(a[0] === 1); | ||||
|     assert(a[1] === 2); | ||||
|     assert(a[2] === 3); | ||||
| 
 | ||||
|     a = new Array([1, 2, 3]); | ||||
|     assert(a.length === 1); | ||||
|     assert(a[0][0] === 1); | ||||
|     assert(a[0][1] === 2); | ||||
|     assert(a[0][2] === 3); | ||||
| 
 | ||||
|     a = new Array(1, 2, 3); | ||||
|     Object.defineProperty(a, 3, { | ||||
|         get() { | ||||
|             return 10; | ||||
|         }, | ||||
|     }); | ||||
|     assert(a.toString() === "1,2,3,10"); | ||||
| 
 | ||||
|     [-1, -100, -0.1, 0.1, 1.23, Infinity, -Infinity, NaN].forEach(value => { | ||||
|         assertThrowsError( | ||||
|             () => { | ||||
| describe("errors", () => { | ||||
|     test("invalid array length", () => { | ||||
|         [-1, -100, -0.1, 0.1, 1.23, Infinity, -Infinity, NaN].forEach(value => { | ||||
|             expect(() => { | ||||
|                 new Array(value); | ||||
|             }, | ||||
|             { | ||||
|                 error: TypeError, | ||||
|                 message: "Invalid array length", | ||||
|             } | ||||
|         ); | ||||
|             }).toThrowWithMessage(TypeError, "Invalid array length"); | ||||
|         }); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| describe("normal behavior", () => { | ||||
|     test("typeof", () => { | ||||
|         expect(typeof Array()).toBe("object"); | ||||
|         expect(typeof new Array()).toBe("object"); | ||||
|     }); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("constructor with single numeric argument", () => { | ||||
|         var a = new Array(5); | ||||
|         expect(a instanceof Array).toBeTrue(); | ||||
|         expect(a).toHaveLength(5); | ||||
|     }); | ||||
| 
 | ||||
|     test("constructor with single non-numeric argument", () => { | ||||
|         var a = new Array("5"); | ||||
|         expect(a instanceof Array).toBeTrue(); | ||||
|         expect(a).toHaveLength(1); | ||||
|         expect(a[0]).toBe("5"); | ||||
|     }); | ||||
| 
 | ||||
|     test("constructor with multiple numeric arguments", () => { | ||||
|         var a = new Array(1, 2, 3); | ||||
|         expect(a instanceof Array).toBeTrue(); | ||||
|         expect(a).toHaveLength(3); | ||||
|         expect(a[0]).toBe(1); | ||||
|         expect(a[1]).toBe(2); | ||||
|         expect(a[2]).toBe(3); | ||||
|     }); | ||||
| 
 | ||||
|     test("constructor with single array argument", () => { | ||||
|         var a = new Array([1, 2, 3]); | ||||
|         expect(a instanceof Array).toBeTrue(); | ||||
|         expect(a).toHaveLength(1); | ||||
|         expect(a[0][0]).toBe(1); | ||||
|         expect(a[0][1]).toBe(2); | ||||
|         expect(a[0][2]).toBe(3); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,50 +1,59 @@ | |||
| load("test-common.js"); | ||||
| test("length is 0", () => { | ||||
|     expect(Array.of).toHaveLength(0); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.of.length === 0); | ||||
| 
 | ||||
|     assert(typeof Array.of() === "object"); | ||||
| 
 | ||||
|     var a; | ||||
| 
 | ||||
|     a = Array.of(5); | ||||
|     assert(a.length === 1); | ||||
|     assert(a[0] === 5); | ||||
| 
 | ||||
|     a = Array.of("5"); | ||||
|     assert(a.length === 1); | ||||
|     assert(a[0] === "5"); | ||||
| 
 | ||||
|     a = Array.of(Infinity); | ||||
|     assert(a.length === 1); | ||||
|     assert(a[0] === Infinity); | ||||
| 
 | ||||
|     a = Array.of(1, 2, 3); | ||||
|     assert(a.length === 3); | ||||
|     assert(a[0] === 1); | ||||
|     assert(a[1] === 2); | ||||
|     assert(a[2] === 3); | ||||
| 
 | ||||
|     a = Array.of([1, 2, 3]); | ||||
|     assert(a.length === 1); | ||||
|     assert(a[0][0] === 1); | ||||
|     assert(a[0][1] === 2); | ||||
|     assert(a[0][2] === 3); | ||||
| 
 | ||||
|     let t = [1, 2, 3]; | ||||
|     Object.defineProperty(t, 3, { | ||||
|         get() { | ||||
|             return 4; | ||||
|         }, | ||||
| describe("normal behavior", () => { | ||||
|     test("single numeric argument", () => { | ||||
|         var a = Array.of(5); | ||||
|         expect(a instanceof Array).toBeTrue(); | ||||
|         expect(a).toHaveLength(1); | ||||
|         expect(a[0]).toBe(5); | ||||
|     }); | ||||
|     a = Array.of(...t); | ||||
|     assert(a.length === 4); | ||||
|     assert(a[0] === 1); | ||||
|     assert(a[1] === 2); | ||||
|     assert(a[2] === 3); | ||||
|     assert(a[3] === 4); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("single non-numeric argument", () => { | ||||
|         var a = Array.of("5"); | ||||
|         expect(a instanceof Array).toBeTrue(); | ||||
|         expect(a).toHaveLength(1); | ||||
|         expect(a[0]).toBe("5"); | ||||
|     }); | ||||
| 
 | ||||
|     test("single infinite numeric argument", () => { | ||||
|         var a = Array.of(Infinity); | ||||
|         expect(a instanceof Array).toBeTrue(); | ||||
|         expect(a).toHaveLength(1); | ||||
|         expect(a[0]).toBe(Infinity); | ||||
|     }); | ||||
| 
 | ||||
|     test("multiple numeric arguments", () => { | ||||
|         var a = Array.of(1, 2, 3); | ||||
|         expect(a instanceof Array).toBeTrue(); | ||||
|         expect(a).toHaveLength(3); | ||||
|         expect(a[0]).toBe(1); | ||||
|         expect(a[1]).toBe(2); | ||||
|         expect(a[2]).toBe(3); | ||||
|     }); | ||||
| 
 | ||||
|     test("single array argument", () => { | ||||
|         var a = Array.of([1, 2, 3]); | ||||
|         expect(a instanceof Array).toBeTrue(); | ||||
|         expect(a).toHaveLength(1); | ||||
|         expect(a[0][0]).toBe(1); | ||||
|         expect(a[0][1]).toBe(2); | ||||
|         expect(a[0][2]).toBe(3); | ||||
|     }); | ||||
| 
 | ||||
|     test("getter property is included in returned array", () => { | ||||
|         var t = [1, 2, 3]; | ||||
|         Object.defineProperty(t, 3, { | ||||
|             get() { | ||||
|                 return 4; | ||||
|             }, | ||||
|         }); | ||||
|         var a = Array.of(...t); | ||||
|         expect(a).toHaveLength(4); | ||||
|         expect(a[0]).toBe(1); | ||||
|         expect(a[1]).toBe(2); | ||||
|         expect(a[2]).toBe(3); | ||||
|         expect(a[3]).toBe(4); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,164 +1,150 @@ | |||
| load("test-common.js"); | ||||
| describe("ability to work with generic non-array objects", () => { | ||||
|     test("push, pop", () => { | ||||
|         [undefined, "foo", -42, 0].forEach(length => { | ||||
|             const o = { length }; | ||||
| 
 | ||||
| try { | ||||
|     [undefined, "foo", -42, 0].forEach(length => { | ||||
|         const o = { length }; | ||||
|             expect(Array.prototype.push.call(o, "foo")).toBe(1); | ||||
|             expect(o).toHaveLength(1); | ||||
|             expect(o[0]).toBe("foo"); | ||||
|             expect(Array.prototype.push.call(o, "bar", "baz")).toBe(3); | ||||
|             expect(o).toHaveLength(3); | ||||
|             expect(o[0]).toBe("foo"); | ||||
|             expect(o[1]).toBe("bar"); | ||||
|             expect(o[2]).toBe("baz"); | ||||
| 
 | ||||
|         assert(Array.prototype.push.call(o, "foo") === 1); | ||||
|         assert(o.length === 1); | ||||
|         assert(o[0] === "foo"); | ||||
|         assert(Array.prototype.push.call(o, "bar", "baz") === 3); | ||||
|         assert(o.length === 3); | ||||
|         assert(o[0] === "foo"); | ||||
|         assert(o[1] === "bar"); | ||||
|         assert(o[2] === "baz"); | ||||
|             expect(Array.prototype.pop.call(o)).toBe("baz"); | ||||
|             expect(o).toHaveLength(2); | ||||
|             expect(Array.prototype.pop.call(o)).toBe("bar"); | ||||
|             expect(o).toHaveLength(1); | ||||
|             expect(Array.prototype.pop.call(o)).toBe("foo"); | ||||
|             expect(o).toHaveLength(0); | ||||
|             expect(Array.prototype.pop.call(o)).toBeUndefined(); | ||||
|             expect(o).toHaveLength(0); | ||||
| 
 | ||||
|         assert(Array.prototype.pop.call(o) === "baz"); | ||||
|         assert(o.length === 2); | ||||
|         assert(Array.prototype.pop.call(o) === "bar"); | ||||
|         assert(o.length === 1); | ||||
|         assert(Array.prototype.pop.call(o) === "foo"); | ||||
|         assert(o.length === 0); | ||||
|         assert(Array.prototype.pop.call(o) === undefined); | ||||
|         assert(o.length === 0); | ||||
| 
 | ||||
|         o.length = length; | ||||
|         assert(Array.prototype.pop.call(o) === undefined); | ||||
|         assert(o.length === 0); | ||||
|             o.length = length; | ||||
|             expect(Array.prototype.pop.call(o)).toBeUndefined(); | ||||
|             expect(o).toHaveLength(0); | ||||
|         }); | ||||
|     }); | ||||
| 
 | ||||
|     { | ||||
|     test("splice", () => { | ||||
|         const o = { length: 3, 0: "hello", 2: "serenity" }; | ||||
|         const removed = Array.prototype.splice.call(o, 0, 2, "hello", "friends"); | ||||
|         assert(o.length === 3); | ||||
|         assert(o[0] === "hello"); | ||||
|         assert(o[1] === "friends"); | ||||
|         assert(o[2] === "serenity"); | ||||
|         assert(removed.length === 2); | ||||
|         assert(removed[0] === "hello"); | ||||
|         assert(removed[1] === undefined); | ||||
|     } | ||||
|         expect(o).toHaveLength(3); | ||||
|         expect(o[0]).toBe("hello"); | ||||
|         expect(o[1]).toBe("friends"); | ||||
|         expect(o[2]).toBe("serenity"); | ||||
|         expect(removed).toHaveLength(2); | ||||
|         expect(removed[0]).toBe("hello"); | ||||
|         expect(removed[1]).toBeUndefined(); | ||||
|     }); | ||||
| 
 | ||||
|     { | ||||
|         assert(Array.prototype.join.call({}) === ""); | ||||
|         assert(Array.prototype.join.call({ length: "foo" }) === ""); | ||||
|         assert(Array.prototype.join.call({ length: 3 }) === ",,"); | ||||
|         assert(Array.prototype.join.call({ length: 2, 0: "foo", 1: "bar" }) === "foo,bar"); | ||||
|         assert( | ||||
|             Array.prototype.join.call({ length: 2, 0: "foo", 1: "bar", 2: "baz" }) === "foo,bar" | ||||
|     test("join", () => { | ||||
|         expect(Array.prototype.join.call({})).toBe(""); | ||||
|         expect(Array.prototype.join.call({ length: "foo" })).toBe(""); | ||||
|         expect(Array.prototype.join.call({ length: 3 })).toBe(",,"); | ||||
|         expect(Array.prototype.join.call({ length: 2, 0: "foo", 1: "bar" })).toBe("foo,bar"); | ||||
|         expect(Array.prototype.join.call({ length: 2, 0: "foo", 1: "bar", 2: "baz" })).toBe( | ||||
|             "foo,bar" | ||||
|         ); | ||||
|         assert(Array.prototype.join.call({ length: 3, 1: "bar" }, "~") === "~bar~"); | ||||
|         assert( | ||||
|             Array.prototype.join.call({ length: 3, 0: "foo", 1: "bar", 2: "baz" }, "~") === | ||||
|                 "foo~bar~baz" | ||||
|         expect(Array.prototype.join.call({ length: 3, 1: "bar" }, "~")).toBe("~bar~"); | ||||
|         expect(Array.prototype.join.call({ length: 3, 0: "foo", 1: "bar", 2: "baz" }, "~")).toBe( | ||||
|             "foo~bar~baz" | ||||
|         ); | ||||
|     } | ||||
|     }); | ||||
| 
 | ||||
|     { | ||||
|         assert(Array.prototype.toString.call({}) === "[object Object]"); | ||||
|         assert(Array.prototype.toString.call({ join: "foo" }) === "[object Object]"); | ||||
|         assert(Array.prototype.toString.call({ join: () => "foo" }) === "foo"); | ||||
|     } | ||||
|     // FIXME: test-js asserts when this is just called "toString" ಠ_ಠ
 | ||||
|     test("toString (FIXME)", () => { | ||||
|         expect(Array.prototype.toString.call({})).toBe("[object Object]"); | ||||
|         expect(Array.prototype.toString.call({ join: "foo" })).toBe("[object Object]"); | ||||
|         expect(Array.prototype.toString.call({ join: () => "foo" })).toBe("foo"); | ||||
|     }); | ||||
| 
 | ||||
|     { | ||||
|         assert(Array.prototype.indexOf.call({}) === -1); | ||||
|         assert(Array.prototype.indexOf.call({ 0: undefined }) === -1); | ||||
|         assert(Array.prototype.indexOf.call({ length: 1, 0: undefined }) === 0); | ||||
|         assert(Array.prototype.indexOf.call({ length: 1, 2: "foo" }, "foo") === -1); | ||||
|         assert(Array.prototype.indexOf.call({ length: 5, 2: "foo" }, "foo") === 2); | ||||
|         assert(Array.prototype.indexOf.call({ length: 5, 2: "foo", 4: "foo" }, "foo", 3) === 4); | ||||
|     } | ||||
|     test("indexOf", () => { | ||||
|         expect(Array.prototype.indexOf.call({})).toBe(-1); | ||||
|         expect(Array.prototype.indexOf.call({ 0: undefined })).toBe(-1); | ||||
|         expect(Array.prototype.indexOf.call({ length: 1, 0: undefined })).toBe(0); | ||||
|         expect(Array.prototype.indexOf.call({ length: 1, 2: "foo" }, "foo")).toBe(-1); | ||||
|         expect(Array.prototype.indexOf.call({ length: 5, 2: "foo" }, "foo")).toBe(2); | ||||
|         expect(Array.prototype.indexOf.call({ length: 5, 2: "foo", 4: "foo" }, "foo", 3)).toBe(4); | ||||
|     }); | ||||
| 
 | ||||
|     { | ||||
|         assert(Array.prototype.lastIndexOf.call({}) === -1); | ||||
|         assert(Array.prototype.lastIndexOf.call({ 0: undefined }) === -1); | ||||
|         assert(Array.prototype.lastIndexOf.call({ length: 1, 0: undefined }) === 0); | ||||
|         assert(Array.prototype.lastIndexOf.call({ length: 1, 2: "foo" }, "foo") === -1); | ||||
|         assert(Array.prototype.lastIndexOf.call({ length: 5, 2: "foo" }, "foo") === 2); | ||||
|         assert(Array.prototype.lastIndexOf.call({ length: 5, 2: "foo", 4: "foo" }, "foo") === 4); | ||||
|         assert( | ||||
|             Array.prototype.lastIndexOf.call({ length: 5, 2: "foo", 4: "foo" }, "foo", -2) === 2 | ||||
|     test("lastIndexOf", () => { | ||||
|         expect(Array.prototype.lastIndexOf.call({})).toBe(-1); | ||||
|         expect(Array.prototype.lastIndexOf.call({ 0: undefined })).toBe(-1); | ||||
|         expect(Array.prototype.lastIndexOf.call({ length: 1, 0: undefined })).toBe(0); | ||||
|         expect(Array.prototype.lastIndexOf.call({ length: 1, 2: "foo" }, "foo")).toBe(-1); | ||||
|         expect(Array.prototype.lastIndexOf.call({ length: 5, 2: "foo" }, "foo")).toBe(2); | ||||
|         expect(Array.prototype.lastIndexOf.call({ length: 5, 2: "foo", 4: "foo" }, "foo")).toBe(4); | ||||
|         expect(Array.prototype.lastIndexOf.call({ length: 5, 2: "foo", 4: "foo" }, "foo", -2)).toBe( | ||||
|             2 | ||||
|         ); | ||||
|     } | ||||
|     }); | ||||
| 
 | ||||
|     { | ||||
|         assert(Array.prototype.includes.call({}) === false); | ||||
|         assert(Array.prototype.includes.call({ 0: undefined }) === false); | ||||
|         assert(Array.prototype.includes.call({ length: 1, 0: undefined }) === true); | ||||
|         assert(Array.prototype.includes.call({ length: 1, 2: "foo" }, "foo") === false); | ||||
|         assert(Array.prototype.includes.call({ length: 5, 2: "foo" }, "foo") === true); | ||||
|     } | ||||
|     test("includes", () => { | ||||
|         expect(Array.prototype.includes.call({})).toBeFalse(); | ||||
|         expect(Array.prototype.includes.call({ 0: undefined })).toBeFalse(); | ||||
|         expect(Array.prototype.includes.call({ length: 1, 0: undefined })).toBeTrue(); | ||||
|         expect(Array.prototype.includes.call({ length: 1, 2: "foo" }, "foo")).toBeFalse(); | ||||
|         expect(Array.prototype.includes.call({ length: 5, 2: "foo" }, "foo")).toBeTrue(); | ||||
|     }); | ||||
| 
 | ||||
|     const o = { length: 5, 0: "foo", 1: "bar", 3: "baz" }; | ||||
| 
 | ||||
|     { | ||||
|         assertVisitsAll( | ||||
|             visit => { | ||||
|                 Array.prototype.every.call(o, function (value) { | ||||
|                     visit(value); | ||||
|                     return true; | ||||
|                 }); | ||||
|             }, | ||||
|             ["foo", "bar", "baz"] | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     ["find", "findIndex"].forEach(name => { | ||||
|         assertVisitsAll( | ||||
|             visit => { | ||||
|                 Array.prototype[name].call(o, function (value) { | ||||
|                     visit(value); | ||||
|                     return false; | ||||
|                 }); | ||||
|             }, | ||||
|             ["foo", "bar", undefined, "baz", undefined] | ||||
|         ); | ||||
|     test("every", () => { | ||||
|         const visited = []; | ||||
|         Array.prototype.every.call(o, value => { | ||||
|             visited.push(value); | ||||
|             return true; | ||||
|         }); | ||||
|         expect(visited).toEqual(["foo", "bar", "baz"]); | ||||
|     }); | ||||
| 
 | ||||
|     ["filter", "forEach", "map", "some"].forEach(name => { | ||||
|         assertVisitsAll( | ||||
|             visit => { | ||||
|                 Array.prototype[name].call(o, function (value) { | ||||
|                     visit(value); | ||||
|                     return false; | ||||
|                 }); | ||||
|             }, | ||||
|             ["foo", "bar", "baz"] | ||||
|         ); | ||||
|     test("find, findIndex", () => { | ||||
|         ["find", "findIndex"].forEach(name => { | ||||
|             const visited = []; | ||||
|             Array.prototype[name].call(o, value => { | ||||
|                 visited.push(value); | ||||
|                 return false; | ||||
|             }); | ||||
|             expect(visited).toEqual(["foo", "bar", undefined, "baz", undefined]); | ||||
|         }); | ||||
|     }); | ||||
|     { | ||||
|         assertVisitsAll( | ||||
|             visit => { | ||||
|                 Array.prototype.reduce.call( | ||||
|                     o, | ||||
|                     function (_, value) { | ||||
|                         visit(value); | ||||
|                         return false; | ||||
|                     }, | ||||
|                     "initial" | ||||
|                 ); | ||||
|             }, | ||||
|             ["foo", "bar", "baz"] | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     { | ||||
|         assertVisitsAll( | ||||
|             visit => { | ||||
|                 Array.prototype.reduceRight.call( | ||||
|                     o, | ||||
|                     function (_, value) { | ||||
|                         visit(value); | ||||
|                         return false; | ||||
|                     }, | ||||
|                     "initial" | ||||
|                 ); | ||||
|             }, | ||||
|             ["baz", "bar", "foo"] | ||||
|         ); | ||||
|     } | ||||
|     test("filter, forEach, map, some", () => { | ||||
|         ["filter", "forEach", "map", "some"].forEach(name => { | ||||
|             const visited = []; | ||||
|             Array.prototype[name].call(o, value => { | ||||
|                 visited.push(value); | ||||
|                 return false; | ||||
|             }); | ||||
|             expect(visited).toEqual(["foo", "bar", "baz"]); | ||||
|         }); | ||||
|     }); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("reduce", () => { | ||||
|         const visited = []; | ||||
|         Array.prototype.reduce.call( | ||||
|             o, | ||||
|             (_, value) => { | ||||
|                 visited.push(value); | ||||
|                 return false; | ||||
|             }, | ||||
|             "initial" | ||||
|         ); | ||||
|         expect(visited).toEqual(["foo", "bar", "baz"]); | ||||
|     }); | ||||
| 
 | ||||
|     test("reduceRight", () => { | ||||
|         const visited = []; | ||||
|         Array.prototype.reduceRight.call( | ||||
|             o, | ||||
|             (_, value) => { | ||||
|                 visited.push(value); | ||||
|                 return false; | ||||
|             }, | ||||
|             "initial" | ||||
|         ); | ||||
|         expect(visited).toEqual(["baz", "bar", "foo"]); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,36 +1,43 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.concat).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.concat.length === 1); | ||||
| describe("normal behavior", () => { | ||||
|     var array = ["hello"]; | ||||
| 
 | ||||
|     var array = ["hello", "friends"]; | ||||
|     test("no arguments", () => { | ||||
|         var concatenated = array.concat(); | ||||
|         expect(array).toHaveLength(1); | ||||
|         expect(concatenated).toHaveLength(1); | ||||
|     }); | ||||
| 
 | ||||
|     var array_concat = array.concat(); | ||||
|     assert(array_concat.length === array.length); | ||||
|     test("single argument", () => { | ||||
|         var concatenated = array.concat("friends"); | ||||
|         expect(array).toHaveLength(1); | ||||
|         expect(concatenated).toHaveLength(2); | ||||
|         expect(concatenated[0]).toBe("hello"); | ||||
|         expect(concatenated[1]).toBe("friends"); | ||||
|     }); | ||||
| 
 | ||||
|     array_concat = array.concat(1); | ||||
|     assert(array_concat.length === 3); | ||||
|     assert(array_concat[2] === 1); | ||||
|     test("single array argument", () => { | ||||
|         var concatenated = array.concat([1, 2, 3]); | ||||
|         expect(array).toHaveLength(1); | ||||
|         expect(concatenated).toHaveLength(4); | ||||
|         expect(concatenated[0]).toBe("hello"); | ||||
|         expect(concatenated[1]).toBe(1); | ||||
|         expect(concatenated[2]).toBe(2); | ||||
|         expect(concatenated[3]).toBe(3); | ||||
|     }); | ||||
| 
 | ||||
|     array_concat = array.concat([1, 2, 3]); | ||||
|     assert(array_concat.length === 5); | ||||
|     assert(array_concat[2] === 1); | ||||
|     assert(array_concat[3] === 2); | ||||
|     assert(array_concat[4] === 3); | ||||
| 
 | ||||
|     array_concat = array.concat(false, "serenity"); | ||||
|     assert(array_concat.length === 4); | ||||
|     assert(array_concat[2] === false); | ||||
|     assert(array_concat[3] === "serenity"); | ||||
| 
 | ||||
|     array_concat = array.concat({ name: "libjs" }, [1, [2, 3]]); | ||||
|     assert(array_concat.length === 5); | ||||
|     assert(array_concat[2].name === "libjs"); | ||||
|     assert(array_concat[3] === 1); | ||||
|     assert(array_concat[4][0] === 2); | ||||
|     assert(array_concat[4][1] === 3); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("multiple arguments", () => { | ||||
|         var concatenated = array.concat(false, "serenity", { name: "libjs" }, [1, [2, 3]]); | ||||
|         expect(array).toHaveLength(1); | ||||
|         expect(concatenated).toHaveLength(6); | ||||
|         expect(concatenated[0]).toBe("hello"); | ||||
|         expect(concatenated[1]).toBeFalse(); | ||||
|         expect(concatenated[2]).toBe("serenity"); | ||||
|         expect(concatenated[3]).toEqual({ name: "libjs" }); | ||||
|         expect(concatenated[4]).toBe(1); | ||||
|         expect(concatenated[5]).toEqual([2, 3]); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,49 +1,55 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.every).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.every.length === 1); | ||||
| describe("errors", () => { | ||||
|     test("requires at least one argument", () => { | ||||
|         expect(() => { | ||||
|             [].every(); | ||||
|         }).toThrowWithMessage(TypeError, "Array.prototype.every() requires at least one argument"); | ||||
|     }); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|     test("callback must be a function", () => { | ||||
|         expect(() => { | ||||
|             [].every(undefined); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "undefined is not a function", | ||||
|         } | ||||
|     ); | ||||
|         }).toThrowWithMessage(TypeError, "undefined is not a function"); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
|     var arrayOne = ["serenity", { test: "serenity" }]; | ||||
|     var arrayTwo = [true, false, 1, 2, 3, "3"]; | ||||
| describe("normal behavior", () => { | ||||
|     test("basic functionality", () => { | ||||
|         var arrayOne = ["serenity", { test: "serenity" }]; | ||||
|         var arrayTwo = [true, false, 1, 2, 3, "3"]; | ||||
| 
 | ||||
|     assert(arrayOne.every(value => value === "hello") === false); | ||||
|     assert(arrayOne.every(value => value === "serenity") === false); | ||||
|     assert(arrayOne.every((value, index, arr) => index < 2) === true); | ||||
|     assert(arrayOne.every(value => typeof value === "string") === false); | ||||
|     assert(arrayOne.every(value => arrayOne.pop()) === true); | ||||
|         expect(arrayOne.every(value => value === "hello")).toBeFalse(); | ||||
|         expect(arrayOne.every(value => value === "serenity")).toBeFalse(); | ||||
|         expect(arrayOne.every((value, index, arr) => index < 2)).toBeTrue(); | ||||
|         expect(arrayOne.every(value => typeof value === "string")).toBeFalse(); | ||||
|         expect(arrayOne.every(value => arrayOne.pop())).toBeTrue(); | ||||
| 
 | ||||
|     assert(arrayTwo.every((value, index, arr) => index > 0) === false); | ||||
|     assert(arrayTwo.every((value, index, arr) => index >= 0) === true); | ||||
|     assert(arrayTwo.every(value => typeof value !== "string") === false); | ||||
|     assert(arrayTwo.every(value => typeof value === "number") === false); | ||||
|     assert(arrayTwo.every(value => value > 0) === false); | ||||
|     assert(arrayTwo.every(value => value >= 0 && value < 4) === true); | ||||
|     assert(arrayTwo.every(value => arrayTwo.pop()) === true); | ||||
|         expect(arrayTwo.every((value, index, arr) => index > 0)).toBeFalse(); | ||||
|         expect(arrayTwo.every((value, index, arr) => index >= 0)).toBeTrue(); | ||||
|         expect(arrayTwo.every(value => typeof value !== "string")).toBeFalse(); | ||||
|         expect(arrayTwo.every(value => typeof value === "number")).toBeFalse(); | ||||
|         expect(arrayTwo.every(value => value > 0)).toBeFalse(); | ||||
|         expect(arrayTwo.every(value => value >= 0 && value < 4)).toBeTrue(); | ||||
|         expect(arrayTwo.every(value => arrayTwo.pop())).toBeTrue(); | ||||
| 
 | ||||
|     assert(["", "hello", "friends", "serenity"].every(value => value.length >= 0) === true); | ||||
|     assert([].every(value => value === 1) === true); | ||||
|         expect(["", "hello", "friends", "serenity"].every(value => value.length >= 0)).toBeTrue(); | ||||
|     }); | ||||
| 
 | ||||
|     arrayTwo = [true, false, 1, 2, 3, "3"]; | ||||
|     test("empty array", () => { | ||||
|         expect([].every(value => value === 1)).toBeTrue(); | ||||
|     }); | ||||
| 
 | ||||
|     // Every only goes up to the original length.
 | ||||
|     assert( | ||||
|         arrayTwo.every((value, index, arr) => { | ||||
|             arr.push("serenity"); | ||||
|             return value < 4; | ||||
|         }) === true | ||||
|     ); | ||||
|     test("elements past the initial array size are ignored", () => { | ||||
|         var array = [1, 2, 3, 4, 5]; | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|         expect( | ||||
|             arrayTwo.every((value, index, arr) => { | ||||
|                 arr.push(6); | ||||
|                 return value <= 5; | ||||
|             }) | ||||
|         ).toBeTrue(); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,23 +1,20 @@ | |||
| load("test-common.js"); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.fill.length === 1); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.fill).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| test("basic functionality", () => { | ||||
|     var array = [1, 2, 3, 4]; | ||||
|     assertArrayEquals(array.fill(0, 2, 4), [1, 2, 0, 0]); | ||||
|     assertArrayEquals(array.fill(5, 1), [1, 5, 5, 5]); | ||||
|     assertArrayEquals(array.fill(6), [6, 6, 6, 6]); | ||||
| 
 | ||||
|     assertArrayEquals([1, 2, 3].fill(4), [4, 4, 4]); | ||||
|     assertArrayEquals([1, 2, 3].fill(4, 1), [1, 4, 4]); | ||||
|     assertArrayEquals([1, 2, 3].fill(4, 1, 2), [1, 4, 3]); | ||||
|     assertArrayEquals([1, 2, 3].fill(4, 3, 3), [1, 2, 3]); | ||||
|     assertArrayEquals([1, 2, 3].fill(4, -3, -2), [4, 2, 3]); | ||||
|     assertArrayEquals([1, 2, 3].fill(4, NaN, NaN), [1, 2, 3]); | ||||
|     assertArrayEquals([1, 2, 3].fill(4, 3, 5), [1, 2, 3]); | ||||
|     assertArrayEquals(Array(3).fill(4), [4, 4, 4]); | ||||
|     expect(array.fill(0, 2, 4)).toEqual([1, 2, 0, 0]); | ||||
|     expect(array.fill(5, 1)).toEqual([1, 5, 5, 5]); | ||||
|     expect(array.fill(6)).toEqual([6, 6, 6, 6]); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     expect([1, 2, 3].fill(4)).toEqual([4, 4, 4]); | ||||
|     expect([1, 2, 3].fill(4, 1)).toEqual([1, 4, 4]); | ||||
|     expect([1, 2, 3].fill(4, 1, 2)).toEqual([1, 4, 3]); | ||||
|     expect([1, 2, 3].fill(4, 3, 3)).toEqual([1, 2, 3]); | ||||
|     expect([1, 2, 3].fill(4, -3, -2)).toEqual([4, 2, 3]); | ||||
|     expect([1, 2, 3].fill(4, NaN, NaN)).toEqual([1, 2, 3]); | ||||
|     expect([1, 2, 3].fill(4, 3, 5)).toEqual([1, 2, 3]); | ||||
|     expect(Array(3).fill(4)).toEqual([4, 4, 4]); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,78 +1,68 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.filter).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.filter.length === 1); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
| describe("errors", () => { | ||||
|     test("requires at least one argument", () => { | ||||
|         expect(() => { | ||||
|             [].filter(); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "Array.prototype.filter() requires at least one argument", | ||||
|         } | ||||
|     ); | ||||
|         }).toThrowWithMessage(TypeError, "Array.prototype.filter() requires at least one argument"); | ||||
|     }); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|     test("callback must be a function", () => { | ||||
|         expect(() => { | ||||
|             [].filter(undefined); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "undefined is not a function", | ||||
|         } | ||||
|     ); | ||||
|         }).toThrowWithMessage(TypeError, "undefined is not a function"); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
|     var callbackCalled = 0; | ||||
|     var callback = () => { | ||||
|         callbackCalled++; | ||||
|     }; | ||||
| describe("normal behavior", () => { | ||||
|     test("never calls callback with empty array", () => { | ||||
|         var callbackCalled = 0; | ||||
|         expect( | ||||
|             [].filter(() => { | ||||
|                 callbackCalled++; | ||||
|             }) | ||||
|         ).toEqual([]); | ||||
|         expect(callbackCalled).toBe(0); | ||||
|     }); | ||||
| 
 | ||||
|     assert([].filter(callback).length === 0); | ||||
|     assert(callbackCalled === 0); | ||||
|     test("calls callback once for every item", () => { | ||||
|         var callbackCalled = 0; | ||||
|         expect( | ||||
|             [1, 2, 3].filter(() => { | ||||
|                 callbackCalled++; | ||||
|             }) | ||||
|         ).toEqual([]); | ||||
|         expect(callbackCalled).toBe(3); | ||||
|     }); | ||||
| 
 | ||||
|     assert([1, 2, 3].filter(callback).length === 0); | ||||
|     assert(callbackCalled === 3); | ||||
|     test("can filter based on callback return value", () => { | ||||
|         var evenNumbers = [0, 1, 2, 3, 4, 5, 6, 7].filter(x => x % 2 === 0); | ||||
|         expect(evenNumbers).toEqual([0, 2, 4, 6]); | ||||
| 
 | ||||
|     var evenNumbers = [0, 1, 2, 3, 4, 5, 6, 7].filter(x => x % 2 === 0); | ||||
|     assert(evenNumbers.length === 4); | ||||
|     assert(evenNumbers[0] === 0); | ||||
|     assert(evenNumbers[1] === 2); | ||||
|     assert(evenNumbers[2] === 4); | ||||
|     assert(evenNumbers[3] === 6); | ||||
| 
 | ||||
|     var fruits = [ | ||||
|         "Apple", | ||||
|         "Banana", | ||||
|         "Blueberry", | ||||
|         "Grape", | ||||
|         "Mango", | ||||
|         "Orange", | ||||
|         "Peach", | ||||
|         "Pineapple", | ||||
|         "Raspberry", | ||||
|         "Watermelon", | ||||
|     ]; | ||||
|     const filterItems = (arr, query) => { | ||||
|         return arr.filter(el => el.toLowerCase().indexOf(query.toLowerCase()) !== -1); | ||||
|     }; | ||||
| 
 | ||||
|     var results; | ||||
| 
 | ||||
|     results = filterItems(fruits, "Berry"); | ||||
|     assert(results.length === 2); | ||||
|     assert(results[0] === "Blueberry"); | ||||
|     assert(results[1] === "Raspberry"); | ||||
| 
 | ||||
|     results = filterItems(fruits, "P"); | ||||
|     assert(results.length === 5); | ||||
|     assert(results[0] === "Apple"); | ||||
|     assert(results[1] === "Grape"); | ||||
|     assert(results[2] === "Peach"); | ||||
|     assert(results[3] === "Pineapple"); | ||||
|     assert(results[4] === "Raspberry"); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|         var fruits = [ | ||||
|             "Apple", | ||||
|             "Banana", | ||||
|             "Blueberry", | ||||
|             "Grape", | ||||
|             "Mango", | ||||
|             "Orange", | ||||
|             "Peach", | ||||
|             "Pineapple", | ||||
|             "Raspberry", | ||||
|             "Watermelon", | ||||
|         ]; | ||||
|         const filterItems = (arr, query) => { | ||||
|             return arr.filter(el => el.toLowerCase().indexOf(query.toLowerCase()) !== -1); | ||||
|         }; | ||||
|         expect(filterItems(fruits, "Berry")).toEqual(["Blueberry", "Raspberry"]); | ||||
|         expect(filterItems(fruits, "P")).toEqual([ | ||||
|             "Apple", | ||||
|             "Grape", | ||||
|             "Peach", | ||||
|             "Pineapple", | ||||
|             "Raspberry", | ||||
|         ]); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,54 +1,65 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.find).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.find.length === 1); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|             [].find(undefined); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "undefined is not a function", | ||||
|         } | ||||
|     ); | ||||
| 
 | ||||
|     var array = ["hello", "friends", 1, 2, false]; | ||||
| 
 | ||||
|     assert(array.find(value => value === "hello") === "hello"); | ||||
|     assert(array.find((value, index, arr) => index === 1) === "friends"); | ||||
|     assert(array.find(value => value == "1") === 1); | ||||
|     assert(array.find(value => value === 1) === 1); | ||||
|     assert(array.find(value => typeof value !== "string") === 1); | ||||
|     assert(array.find(value => typeof value === "boolean") === false); | ||||
|     assert(array.find(value => value > 1) === 2); | ||||
|     assert(array.find(value => value > 1 && value < 3) === 2); | ||||
|     assert(array.find(value => value > 100) === undefined); | ||||
|     assert([].find(value => value === 1) === undefined); | ||||
| 
 | ||||
|     var callbackCalled = 0; | ||||
|     var callback = () => { | ||||
|         callbackCalled++; | ||||
|     }; | ||||
| 
 | ||||
|     [].find(callback); | ||||
|     assert(callbackCalled === 0); | ||||
| 
 | ||||
|     [1, 2, 3].find(callback); | ||||
|     assert(callbackCalled === 3); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     [1, , , "foo", , undefined, , ,].find(callback); | ||||
|     assert(callbackCalled === 8); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     [1, , , "foo", , undefined, , ,].find(value => { | ||||
|         callbackCalled++; | ||||
|         return value === undefined; | ||||
| describe("errors", () => { | ||||
|     test("requires at least one argument", () => { | ||||
|         expect(() => { | ||||
|             [].find(); | ||||
|         }).toThrowWithMessage(TypeError, "Array.prototype.find() requires at least one argument"); | ||||
|     }); | ||||
|     assert(callbackCalled === 2); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("callback must be a function", () => { | ||||
|         expect(() => { | ||||
|             [].find(undefined); | ||||
|         }).toThrowWithMessage(TypeError, "undefined is not a function"); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| describe("normal behavior", () => { | ||||
|     test("basic functionality", () => { | ||||
|         var array = ["hello", "friends", 1, 2, false]; | ||||
| 
 | ||||
|         expect(array.find(value => value === "hello")).toBe("hello"); | ||||
|         expect(array.find((value, index, arr) => index === 1)).toBe("friends"); | ||||
|         expect(array.find(value => value == "1")).toBe(1); | ||||
|         expect(array.find(value => value === 1)).toBe(1); | ||||
|         expect(array.find(value => typeof value !== "string")).toBe(1); | ||||
|         expect(array.find(value => typeof value === "boolean")).toBeFalse(); | ||||
|         expect(array.find(value => value > 1)).toBe(2); | ||||
|         expect(array.find(value => value > 1 && value < 3)).toBe(2); | ||||
|         expect(array.find(value => value > 100)).toBeUndefined(); | ||||
|         expect([].find(value => value === 1)).toBeUndefined(); | ||||
|     }); | ||||
| 
 | ||||
|     test("never calls callback with empty array", () => { | ||||
|         var callbackCalled = 0; | ||||
|         expect( | ||||
|             [].find(() => { | ||||
|                 callbackCalled++; | ||||
|             }) | ||||
|         ).toBeUndefined(); | ||||
|         expect(callbackCalled).toBe(0); | ||||
|     }); | ||||
| 
 | ||||
|     test("calls callback once for every item", () => { | ||||
|         var callbackCalled = 0; | ||||
|         expect( | ||||
|             [1, 2, 3].find(() => { | ||||
|                 callbackCalled++; | ||||
|             }) | ||||
|         ).toBeUndefined(); | ||||
|         expect(callbackCalled).toBe(3); | ||||
|     }); | ||||
| 
 | ||||
|     test("empty slots are treated as undefined", () => { | ||||
|         var callbackCalled = 0; | ||||
|         expect( | ||||
|             [1, , , "foo", , undefined, , ,].find(value => { | ||||
|                 callbackCalled++; | ||||
|                 return value === undefined; | ||||
|             }) | ||||
|         ).toBeUndefined(); | ||||
|         expect(callbackCalled).toBe(2); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,54 +1,68 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.findIndex).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.findIndex.length === 1); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|             [].findIndex(undefined); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "undefined is not a function", | ||||
|         } | ||||
|     ); | ||||
| 
 | ||||
|     var array = ["hello", "friends", 1, 2, false]; | ||||
| 
 | ||||
|     assert(array.findIndex(value => value === "hello") === 0); | ||||
|     assert(array.findIndex((value, index, arr) => index === 1) === 1); | ||||
|     assert(array.findIndex(value => value == "1") === 2); | ||||
|     assert(array.findIndex(value => value === 1) === 2); | ||||
|     assert(array.findIndex(value => typeof value !== "string") === 2); | ||||
|     assert(array.findIndex(value => typeof value === "boolean") === 4); | ||||
|     assert(array.findIndex(value => value > 1) === 3); | ||||
|     assert(array.findIndex(value => value > 1 && value < 3) === 3); | ||||
|     assert(array.findIndex(value => value > 100) === -1); | ||||
|     assert([].findIndex(value => value === 1) === -1); | ||||
| 
 | ||||
|     var callbackCalled = 0; | ||||
|     var callback = () => { | ||||
|         callbackCalled++; | ||||
|     }; | ||||
| 
 | ||||
|     [].findIndex(callback); | ||||
|     assert(callbackCalled === 0); | ||||
| 
 | ||||
|     [1, 2, 3].findIndex(callback); | ||||
|     assert(callbackCalled === 3); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     [1, , , "foo", , undefined, , ,].findIndex(callback); | ||||
|     assert(callbackCalled === 8); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     [1, , , "foo", , undefined, , ,].findIndex(value => { | ||||
|         callbackCalled++; | ||||
|         return value === undefined; | ||||
| describe("errors", () => { | ||||
|     test("requires at least one argument", () => { | ||||
|         expect(() => { | ||||
|             [].findIndex(); | ||||
|         }).toThrowWithMessage( | ||||
|             TypeError, | ||||
|             "Array.prototype.findIndex() requires at least one argument" | ||||
|         ); | ||||
|     }); | ||||
|     assert(callbackCalled === 2); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("callback must be a function", () => { | ||||
|         expect(() => { | ||||
|             [].findIndex(undefined); | ||||
|         }).toThrowWithMessage(TypeError, "undefined is not a function"); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| describe("normal behavior", () => { | ||||
|     test("basic functionality", () => { | ||||
|         var array = ["hello", "friends", 1, 2, false]; | ||||
| 
 | ||||
|         expect(array.findIndex(value => value === "hello")).toBe(0); | ||||
|         expect(array.findIndex((value, index, arr) => index === 1)).toBe(1); | ||||
|         expect(array.findIndex(value => value == "1")).toBe(2); | ||||
|         expect(array.findIndex(value => value === 1)).toBe(2); | ||||
|         expect(array.findIndex(value => typeof value !== "string")).toBe(2); | ||||
|         expect(array.findIndex(value => typeof value === "boolean")).toBe(4); | ||||
|         expect(array.findIndex(value => value > 1)).toBe(3); | ||||
|         expect(array.findIndex(value => value > 1 && value < 3)).toBe(3); | ||||
|         expect(array.findIndex(value => value > 100)).toBe(-1); | ||||
|         expect([].findIndex(value => value === 1)).toBe(-1); | ||||
|     }); | ||||
| 
 | ||||
|     test("never calls callback with empty array", () => { | ||||
|         var callbackCalled = 0; | ||||
|         expect( | ||||
|             [].findIndex(() => { | ||||
|                 callbackCalled++; | ||||
|             }) | ||||
|         ).toBe(-1); | ||||
|         expect(callbackCalled).toBe(0); | ||||
|     }); | ||||
| 
 | ||||
|     test("calls callback once for every item", () => { | ||||
|         var callbackCalled = 0; | ||||
|         expect( | ||||
|             [1, 2, 3].findIndex(() => { | ||||
|                 callbackCalled++; | ||||
|             }) | ||||
|         ).toBe(-1); | ||||
|         expect(callbackCalled).toBe(3); | ||||
|     }); | ||||
| 
 | ||||
|     test("empty slots are treated as undefined", () => { | ||||
|         var callbackCalled = 0; | ||||
|         expect( | ||||
|             [1, , , "foo", , undefined, , ,].findIndex(value => { | ||||
|                 callbackCalled++; | ||||
|                 return value === undefined; | ||||
|             }) | ||||
|         ).toBe(1); | ||||
|         expect(callbackCalled).toBe(2); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,70 +1,70 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.forEach).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.forEach.length === 1); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
| describe("errors", () => { | ||||
|     test("requires at least one argument", () => { | ||||
|         expect(() => { | ||||
|             [].forEach(); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "Array.prototype.forEach() requires at least one argument", | ||||
|         } | ||||
|     ); | ||||
|         }).toThrowWithMessage( | ||||
|             TypeError, | ||||
|             "Array.prototype.forEach() requires at least one argument" | ||||
|         ); | ||||
|     }); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|     test("callback must be a function", () => { | ||||
|         expect(() => { | ||||
|             [].forEach(undefined); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "undefined is not a function", | ||||
|         } | ||||
|     ); | ||||
|         }).toThrowWithMessage(TypeError, "undefined is not a function"); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
|     var a = [1, 2, 3]; | ||||
|     var o = {}; | ||||
|     var callbackCalled = 0; | ||||
|     var callback = () => { | ||||
|         callbackCalled++; | ||||
|     }; | ||||
| 
 | ||||
|     assert([].forEach(callback) === undefined); | ||||
|     assert(callbackCalled === 0); | ||||
| 
 | ||||
|     assert(a.forEach(callback) === undefined); | ||||
|     assert(callbackCalled === 3); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     a.forEach(function (value, index) { | ||||
|         assert(value === a[index]); | ||||
|         assert(index === a[index] - 1); | ||||
| describe("normal behavior", () => { | ||||
|     test("never calls callback with empty array", () => { | ||||
|         var callbackCalled = 0; | ||||
|         expect( | ||||
|             [].forEach(() => { | ||||
|                 callbackCalled++; | ||||
|             }) | ||||
|         ).toBeUndefined(); | ||||
|         expect(callbackCalled).toBe(0); | ||||
|     }); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     a.forEach(function (_, _, array) { | ||||
|         callbackCalled++; | ||||
|         assert(a.length === array.length); | ||||
|         a.push("test"); | ||||
|     test("calls callback once for every item", () => { | ||||
|         var callbackCalled = 0; | ||||
|         expect( | ||||
|             [1, 2, 3].forEach(() => { | ||||
|                 callbackCalled++; | ||||
|             }) | ||||
|         ).toBeUndefined(); | ||||
|         expect(callbackCalled).toBe(3); | ||||
|     }); | ||||
|     assert(callbackCalled === 3); | ||||
|     assert(a.length === 6); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     a.forEach(function (value, index) { | ||||
|         callbackCalled++; | ||||
|         this[index] = value; | ||||
|     }, o); | ||||
|     assert(callbackCalled === 6); | ||||
|     assert(o[0] === 1); | ||||
|     assert(o[1] === 2); | ||||
|     assert(o[2] === 3); | ||||
|     assert(o[3] === "test"); | ||||
|     assert(o[4] === "test"); | ||||
|     assert(o[5] === "test"); | ||||
|     test("callback receives value and index", () => { | ||||
|         var a = [1, 2, 3]; | ||||
|         a.forEach((value, index) => { | ||||
|             expect(value).toBe(a[index]); | ||||
|             expect(index).toBe(a[index] - 1); | ||||
|         }); | ||||
|     }); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("callback receives array", () => { | ||||
|         var callbackCalled = 0; | ||||
|         var a = [1, 2, 3]; | ||||
|         a.forEach((_, _, array) => { | ||||
|             callbackCalled++; | ||||
|             expect(a).toEqual(array); | ||||
|             a.push("test"); | ||||
|         }); | ||||
|         expect(callbackCalled).toBe(3); | ||||
|         expect(a).toEqual([1, 2, 3, "test", "test", "test"]); | ||||
|     }); | ||||
| 
 | ||||
|     test("this value can be modified", () => { | ||||
|         var t = []; | ||||
|         [1, 2, 3].forEach(function (value) { | ||||
|             this.push(value); | ||||
|         }, t); | ||||
|         expect(t).toEqual([1, 2, 3]); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,22 +1,18 @@ | |||
| load("test-common.js"); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.includes.length === 1); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.includes).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| test("basic functionality", () => { | ||||
|     var array = ["hello", "friends", 1, 2, false]; | ||||
| 
 | ||||
|     assert([].includes() === false); | ||||
|     assert([undefined].includes() === true); | ||||
|     assert(array.includes("hello") === true); | ||||
|     assert(array.includes(1) === true); | ||||
|     assert(array.includes(1, -3) === true); | ||||
|     assert(array.includes("serenity") === false); | ||||
|     assert(array.includes(false, -1) === true); | ||||
|     assert(array.includes(2, -1) === false); | ||||
|     assert(array.includes(2, -100) === true); | ||||
|     assert(array.includes("friends", 100) === false); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     expect([].includes()).toBeFalse(); | ||||
|     expect([undefined].includes()).toBeTrue(); | ||||
|     expect(array.includes("hello")).toBeTrue(); | ||||
|     expect(array.includes(1)).toBeTrue(); | ||||
|     expect(array.includes(1, -3)).toBeTrue(); | ||||
|     expect(array.includes("serenity")).toBeFalse(); | ||||
|     expect(array.includes(false, -1)).toBeTrue(); | ||||
|     expect(array.includes(2, -1)).toBeFalse(); | ||||
|     expect(array.includes(2, -100)).toBeTrue(); | ||||
|     expect(array.includes("friends", 100)).toBeFalse(); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,29 +1,25 @@ | |||
| load("test-common.js"); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.indexOf.length === 1); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.indexOf).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| test("basic functionality", () => { | ||||
|     var array = ["hello", "friends", 1, 2, false]; | ||||
| 
 | ||||
|     assert(array.indexOf("hello") === 0); | ||||
|     assert(array.indexOf("friends") === 1); | ||||
|     assert(array.indexOf(false) === 4); | ||||
|     assert(array.indexOf(false, 2) === 4); | ||||
|     assert(array.indexOf(false, -2) === 4); | ||||
|     assert(array.indexOf(1) === 2); | ||||
|     assert(array.indexOf(1, 1000) === -1); | ||||
|     assert(array.indexOf(1, -1000) === 2); | ||||
|     assert(array.indexOf("serenity") === -1); | ||||
|     assert(array.indexOf(false, -1) === 4); | ||||
|     assert(array.indexOf(2, -1) === -1); | ||||
|     assert(array.indexOf(2, -2) === 3); | ||||
|     assert([].indexOf("serenity") === -1); | ||||
|     assert([].indexOf("serenity", 10) === -1); | ||||
|     assert([].indexOf("serenity", -10) === -1); | ||||
|     assert([].indexOf() === -1); | ||||
|     assert([undefined].indexOf() === 0); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     expect(array.indexOf("hello")).toBe(0); | ||||
|     expect(array.indexOf("friends")).toBe(1); | ||||
|     expect(array.indexOf(false)).toBe(4); | ||||
|     expect(array.indexOf(false, 2)).toBe(4); | ||||
|     expect(array.indexOf(false, -2)).toBe(4); | ||||
|     expect(array.indexOf(1)).toBe(2); | ||||
|     expect(array.indexOf(1, 1000)).toBe(-1); | ||||
|     expect(array.indexOf(1, -1000)).toBe(2); | ||||
|     expect(array.indexOf("serenity")).toBe(-1); | ||||
|     expect(array.indexOf(false, -1)).toBe(4); | ||||
|     expect(array.indexOf(2, -1)).toBe(-1); | ||||
|     expect(array.indexOf(2, -2)).toBe(3); | ||||
|     expect([].indexOf("serenity")).toBe(-1); | ||||
|     expect([].indexOf("serenity", 10)).toBe(-1); | ||||
|     expect([].indexOf("serenity", -10)).toBe(-1); | ||||
|     expect([].indexOf()).toBe(-1); | ||||
|     expect([undefined].indexOf()).toBe(0); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,19 +1,15 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.join).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.join.length === 1); | ||||
| 
 | ||||
|     assert(["hello", "friends"].join() === "hello,friends"); | ||||
|     assert(["hello", "friends"].join(" ") === "hello friends"); | ||||
|     assert(["hello", "friends", "foo"].join("~", "#") === "hello~friends~foo"); | ||||
|     assert([].join() === ""); | ||||
|     assert([null].join() === ""); | ||||
|     assert([undefined].join() === ""); | ||||
|     assert([undefined, null, ""].join() === ",,"); | ||||
|     assert([1, null, 2, undefined, 3].join() === "1,,2,,3"); | ||||
|     assert(Array(3).join() === ",,"); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
| test("basic functionality", () => { | ||||
|     expect(["hello", "friends"].join()).toBe("hello,friends"); | ||||
|     expect(["hello", "friends"].join(" ")).toBe("hello friends"); | ||||
|     expect(["hello", "friends", "foo"].join("~", "#")).toBe("hello~friends~foo"); | ||||
|     expect([].join()).toBe(""); | ||||
|     expect([null].join()).toBe(""); | ||||
|     expect([undefined].join()).toBe(""); | ||||
|     expect([undefined, null, ""].join()).toBe(",,"); | ||||
|     expect([1, null, 2, undefined, 3].join()).toBe("1,,2,,3"); | ||||
|     expect(Array(3).join()).toBe(",,"); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,26 +1,22 @@ | |||
| load("test-common.js"); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.lastIndexOf.length === 1); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.lastIndexOf).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| test("basic functionality", () => { | ||||
|     var array = [1, 2, 3, 1, "hello"]; | ||||
| 
 | ||||
|     assert(array.lastIndexOf("hello") === 4); | ||||
|     assert(array.lastIndexOf("hello", 1000) === 4); | ||||
|     assert(array.lastIndexOf(1) === 3); | ||||
|     assert(array.lastIndexOf(1, -1) === 3); | ||||
|     assert(array.lastIndexOf(1, -2) === 3); | ||||
|     assert(array.lastIndexOf(2) === 1); | ||||
|     assert(array.lastIndexOf(2, -3) === 1); | ||||
|     assert(array.lastIndexOf(2, -4) === 1); | ||||
|     assert([].lastIndexOf("hello") === -1); | ||||
|     assert([].lastIndexOf("hello", 10) === -1); | ||||
|     assert([].lastIndexOf("hello", -10) === -1); | ||||
|     assert([].lastIndexOf() === -1); | ||||
|     assert([undefined].lastIndexOf() === 0); | ||||
|     assert([undefined, undefined, undefined].lastIndexOf() === 2); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     expect(array.lastIndexOf("hello")).toBe(4); | ||||
|     expect(array.lastIndexOf("hello", 1000)).toBe(4); | ||||
|     expect(array.lastIndexOf(1)).toBe(3); | ||||
|     expect(array.lastIndexOf(1, -1)).toBe(3); | ||||
|     expect(array.lastIndexOf(1, -2)).toBe(3); | ||||
|     expect(array.lastIndexOf(2)).toBe(1); | ||||
|     expect(array.lastIndexOf(2, -3)).toBe(1); | ||||
|     expect(array.lastIndexOf(2, -4)).toBe(1); | ||||
|     expect([].lastIndexOf("hello")).toBe(-1); | ||||
|     expect([].lastIndexOf("hello", 10)).toBe(-1); | ||||
|     expect([].lastIndexOf("hello", -10)).toBe(-1); | ||||
|     expect([].lastIndexOf()).toBe(-1); | ||||
|     expect([undefined].lastIndexOf()).toBe(0); | ||||
|     expect([undefined, undefined, undefined].lastIndexOf()).toBe(2); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,63 +1,57 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.map).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.map.length === 1); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
| describe("errors", () => { | ||||
|     test("requires at least one argument", () => { | ||||
|         expect(() => { | ||||
|             [].map(); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "Array.prototype.map() requires at least one argument", | ||||
|         } | ||||
|     ); | ||||
|         }).toThrowWithMessage(TypeError, "Array.prototype.map() requires at least one argument"); | ||||
|     }); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|     test("callback must be a function", () => { | ||||
|         expect(() => { | ||||
|             [].map(undefined); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "undefined is not a function", | ||||
|         } | ||||
|     ); | ||||
|         }).toThrowWithMessage(TypeError, "undefined is not a function"); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
|     var callbackCalled = 0; | ||||
|     var callback = () => { | ||||
|         callbackCalled++; | ||||
|     }; | ||||
| describe("normal behavior", () => { | ||||
|     test("never calls callback with empty array", () => { | ||||
|         var callbackCalled = 0; | ||||
|         expect( | ||||
|             [].map(() => { | ||||
|                 callbackCalled++; | ||||
|             }) | ||||
|         ).toEqual([]); | ||||
|         expect(callbackCalled).toBe(0); | ||||
|     }); | ||||
| 
 | ||||
|     assert([].map(callback).length === 0); | ||||
|     assert(callbackCalled === 0); | ||||
|     test("calls callback once for every item", () => { | ||||
|         var callbackCalled = 0; | ||||
|         expect( | ||||
|             [1, 2, 3].map(() => { | ||||
|                 callbackCalled++; | ||||
|             }) | ||||
|         ).toEqual([undefined, undefined, undefined]); | ||||
|         expect(callbackCalled).toBe(3); | ||||
|     }); | ||||
| 
 | ||||
|     assert([1, 2, 3].map(callback).length === 3); | ||||
|     assert(callbackCalled === 3); | ||||
|     test("can map based on callback return value", () => { | ||||
|         expect( | ||||
|             [undefined, null, true, "foo", 42, {}].map( | ||||
|                 (value, index) => "" + index + " -> " + value | ||||
|             ) | ||||
|         ).toEqual([ | ||||
|             "0 -> undefined", | ||||
|             "1 -> null", | ||||
|             "2 -> true", | ||||
|             "3 -> foo", | ||||
|             "4 -> 42", | ||||
|             "5 -> [object Object]", | ||||
|         ]); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     assert([1, , , "foo", , undefined, , ,].map(callback).length === 8); | ||||
|     assert(callbackCalled === 3); | ||||
| 
 | ||||
|     var results = [undefined, null, true, "foo", 42, {}].map( | ||||
|         (value, index) => "" + index + " -> " + value | ||||
|     ); | ||||
|     assert(results.length === 6); | ||||
|     assert(results[0] === "0 -> undefined"); | ||||
|     assert(results[1] === "1 -> null"); | ||||
|     assert(results[2] === "2 -> true"); | ||||
|     assert(results[3] === "3 -> foo"); | ||||
|     assert(results[4] === "4 -> 42"); | ||||
|     assert(results[5] === "5 -> [object Object]"); | ||||
| 
 | ||||
|     var squaredNumbers = [0, 1, 2, 3, 4].map(x => x ** 2); | ||||
|     assert(squaredNumbers.length === 5); | ||||
|     assert(squaredNumbers[0] === 0); | ||||
|     assert(squaredNumbers[1] === 1); | ||||
|     assert(squaredNumbers[2] === 4); | ||||
|     assert(squaredNumbers[3] === 9); | ||||
|     assert(squaredNumbers[4] === 16); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|         var squaredNumbers = [0, 1, 2, 3, 4].map(x => x ** 2); | ||||
|         expect(squaredNumbers).toEqual([0, 1, 4, 9, 16]); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,21 +1,23 @@ | |||
| load("test-common.js"); | ||||
| test("length is 0", () => { | ||||
|     expect(Array.prototype.pop).toHaveLength(0); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     var a = [1, 2, 3]; | ||||
|     var value = a.pop(); | ||||
|     assert(value === 3); | ||||
|     assert(a.length === 2); | ||||
|     assert(a[0] === 1); | ||||
|     assert(a[1] === 2); | ||||
| describe("normal behavior", () => { | ||||
|     test("array with elements", () => { | ||||
|         var a = [1, 2, 3]; | ||||
|         expect(a.pop()).toBe(3); | ||||
|         expect(a).toEqual([1, 2]); | ||||
|     }); | ||||
| 
 | ||||
|     var a = []; | ||||
|     var value = a.pop(); | ||||
|     assert(value === undefined); | ||||
|     assert(a.length === 0); | ||||
|     test("empty array", () => { | ||||
|         var a = []; | ||||
|         expect(a.pop()).toBeUndefined(); | ||||
|         expect(a).toEqual([]); | ||||
|     }); | ||||
| 
 | ||||
|     assert([,].pop() === undefined); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("array with empty slot", () => { | ||||
|         var a = [,]; | ||||
|         expect(a.pop()).toBeUndefined(); | ||||
|         expect(a).toEqual([]); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,30 +1,23 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.push).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.push.length === 1); | ||||
| describe("normal behavior", () => { | ||||
|     test("no argument", () => { | ||||
|         var a = ["hello"]; | ||||
|         expect(a.push()).toBe(1); | ||||
|         expect(a).toEqual(["hello"]); | ||||
|     }); | ||||
| 
 | ||||
|     var a = ["hello"]; | ||||
|     var length = a.push(); | ||||
|     assert(length === 1); | ||||
|     assert(a.length === 1); | ||||
|     assert(a[0] === "hello"); | ||||
|     test("single argument", () => { | ||||
|         var a = ["hello"]; | ||||
|         expect(a.push("friends")).toBe(2); | ||||
|         expect(a).toEqual(["hello", "friends"]); | ||||
|     }); | ||||
| 
 | ||||
|     length = a.push("friends"); | ||||
|     assert(length === 2); | ||||
|     assert(a.length === 2); | ||||
|     assert(a[0] === "hello"); | ||||
|     assert(a[1] === "friends"); | ||||
| 
 | ||||
|     length = a.push(1, 2, 3); | ||||
|     assert(length === 5); | ||||
|     assert(a.length === 5); | ||||
|     assert(a[0] === "hello"); | ||||
|     assert(a[1] === "friends"); | ||||
|     assert(a[2] === 1); | ||||
|     assert(a[3] === 2); | ||||
|     assert(a[4] === 3); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("multiple arguments", () => { | ||||
|         var a = ["hello", "friends"]; | ||||
|         expect(a.push(1, 2, 3)).toBe(5); | ||||
|         expect(a).toEqual(["hello", "friends", 1, 2, 3]); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,132 +1,113 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.reduce).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.reduce.length === 1); | ||||
| describe("errors", () => { | ||||
|     test("requires at least one argument", () => { | ||||
|         expect(() => { | ||||
|             [].reduce(); | ||||
|         }).toThrowWithMessage(TypeError, "Array.prototype.reduce() requires at least one argument"); | ||||
|     }); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|             [1].reduce(); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "Array.prototype.reduce() requires at least one argument", | ||||
|         } | ||||
|     ); | ||||
|     test("callback must be a function", () => { | ||||
|         expect(() => { | ||||
|             [].reduce(undefined); | ||||
|         }).toThrowWithMessage(TypeError, "undefined is not a function"); | ||||
|     }); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|             [1].reduce(undefined); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "undefined is not a function", | ||||
|         } | ||||
|     ); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|     test("reduce of empty array with no initial value", () => { | ||||
|         expect(() => { | ||||
|             [].reduce((a, x) => x); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "Reduce of empty array with no initial value", | ||||
|         } | ||||
|     ); | ||||
|         }).toThrowWithMessage(TypeError, "Reduce of empty array with no initial value"); | ||||
|     }); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|     test("reduce of array with only empty slots and no initial value", () => { | ||||
|         expect(() => { | ||||
|             [, ,].reduce((a, x) => x); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "Reduce of empty array with no initial value", | ||||
|         } | ||||
|     ); | ||||
| 
 | ||||
|     [1, 2].reduce(function () { | ||||
|         assert(this === undefined); | ||||
|         }).toThrowWithMessage(TypeError, "Reduce of empty array with no initial value"); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
|     var callbackCalled = 0; | ||||
|     var callback = () => { | ||||
|         callbackCalled++; | ||||
|         return true; | ||||
|     }; | ||||
| describe("normal behavior", () => { | ||||
|     test("basic functionality", () => { | ||||
|         [1, 2].reduce(function () { | ||||
|             expect(this).toBeUndefined(); | ||||
|         }); | ||||
| 
 | ||||
|     assert([1].reduce(callback) === 1); | ||||
|     assert(callbackCalled === 0); | ||||
|         var callbackCalled = 0; | ||||
|         var callback = () => { | ||||
|             callbackCalled++; | ||||
|             return true; | ||||
|         }; | ||||
| 
 | ||||
|     assert([, 1].reduce(callback) === 1); | ||||
|     assert(callbackCalled === 0); | ||||
|         expect([1].reduce(callback)).toBe(1); | ||||
|         expect(callbackCalled).toBe(0); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     assert([1, 2, 3].reduce(callback) === true); | ||||
|     assert(callbackCalled === 2); | ||||
|         expect([, 1].reduce(callback)).toBe(1); | ||||
|         expect(callbackCalled).toBe(0); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     assert([, , 1, 2, 3].reduce(callback) === true); | ||||
|     assert(callbackCalled === 2); | ||||
|         callbackCalled = 0; | ||||
|         expect([1, 2, 3].reduce(callback)).toBeTrue(); | ||||
|         expect(callbackCalled).toBe(2); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     assert([1, , , 10, , 100, , ,].reduce(callback) === true); | ||||
|     assert(callbackCalled === 2); | ||||
|         callbackCalled = 0; | ||||
|         expect([, , 1, 2, 3].reduce(callback)).toBeTrue(); | ||||
|         expect(callbackCalled).toBe(2); | ||||
| 
 | ||||
|     var constantlySad = () => ":^("; | ||||
|     var result = [].reduce(constantlySad, ":^)"); | ||||
|     assert(result === ":^)"); | ||||
|         callbackCalled = 0; | ||||
|         expect([1, , , 10, , 100, , ,].reduce(callback)).toBeTrue(); | ||||
|         expect(callbackCalled).toBe(2); | ||||
| 
 | ||||
|     result = [":^0"].reduce(constantlySad, ":^)"); | ||||
|     assert(result === ":^("); | ||||
|         var constantlySad = () => ":^("; | ||||
|         var result = [].reduce(constantlySad, ":^)"); | ||||
|         expect(result).toBe(":^)"); | ||||
| 
 | ||||
|     result = [":^0"].reduce(constantlySad); | ||||
|     assert(result === ":^0"); | ||||
|         result = [":^0"].reduce(constantlySad, ":^)"); | ||||
|         expect(result).toBe(":^("); | ||||
| 
 | ||||
|     result = [5, 4, 3, 2, 1].reduce((accum, elem) => accum + elem); | ||||
|     assert(result === 15); | ||||
|         result = [":^0"].reduce(constantlySad); | ||||
|         expect(result).toBe(":^0"); | ||||
| 
 | ||||
|     result = [1, 2, 3, 4, 5, 6].reduce((accum, elem) => accum + elem, 100); | ||||
|     assert(result === 121); | ||||
|         result = [5, 4, 3, 2, 1].reduce((accum, elem) => accum + elem); | ||||
|         expect(result).toBe(15); | ||||
| 
 | ||||
|     result = [6, 5, 4, 3, 2, 1].reduce((accum, elem) => { | ||||
|         return accum + elem; | ||||
|     }, 100); | ||||
|     assert(result === 121); | ||||
|         result = [1, 2, 3, 4, 5, 6].reduce((accum, elem) => accum + elem, 100); | ||||
|         expect(result).toBe(121); | ||||
| 
 | ||||
|     var indexes = []; | ||||
|     result = ["foo", 1, true].reduce((a, v, i) => { | ||||
|         indexes.push(i); | ||||
|         result = [6, 5, 4, 3, 2, 1].reduce((accum, elem) => { | ||||
|             return accum + elem; | ||||
|         }, 100); | ||||
|         expect(result).toBe(121); | ||||
| 
 | ||||
|         var indexes = []; | ||||
|         result = ["foo", 1, true].reduce((a, v, i) => { | ||||
|             indexes.push(i); | ||||
|         }); | ||||
|         expect(result).toBeUndefined(); | ||||
|         expect(indexes.length).toBe(2); | ||||
|         expect(indexes[0]).toBe(1); | ||||
|         expect(indexes[1]).toBe(2); | ||||
| 
 | ||||
|         indexes = []; | ||||
|         result = ["foo", 1, true].reduce((a, v, i) => { | ||||
|             indexes.push(i); | ||||
|         }, "foo"); | ||||
|         expect(result).toBeUndefined(); | ||||
|         expect(indexes).toEqual([0, 1, 2]); | ||||
| 
 | ||||
|         var mutable = { prop: 0 }; | ||||
|         result = ["foo", 1, true].reduce((a, v) => { | ||||
|             a.prop = v; | ||||
|             return a; | ||||
|         }, mutable); | ||||
|         expect(result).toBe(mutable); | ||||
|         expect(result.prop).toBeTrue(); | ||||
| 
 | ||||
|         var a1 = [1, 2]; | ||||
|         var a2 = null; | ||||
|         a1.reduce((a, v, i, t) => { | ||||
|             a2 = t; | ||||
|         }); | ||||
|         expect(a1).toBe(a2); | ||||
|     }); | ||||
|     assert(result === undefined); | ||||
|     assert(indexes.length === 2); | ||||
|     assert(indexes[0] === 1); | ||||
|     assert(indexes[1] === 2); | ||||
| 
 | ||||
|     indexes = []; | ||||
|     result = ["foo", 1, true].reduce((a, v, i) => { | ||||
|         indexes.push(i); | ||||
|     }, "foo"); | ||||
|     assert(result === undefined); | ||||
|     assert(indexes.length === 3); | ||||
|     assert(indexes[0] === 0); | ||||
|     assert(indexes[1] === 1); | ||||
|     assert(indexes[2] === 2); | ||||
| 
 | ||||
|     var mutable = { prop: 0 }; | ||||
|     result = ["foo", 1, true].reduce((a, v) => { | ||||
|         a.prop = v; | ||||
|         return a; | ||||
|     }, mutable); | ||||
|     assert(result === mutable); | ||||
|     assert(result.prop === true); | ||||
| 
 | ||||
|     var a1 = [1, 2]; | ||||
|     var a2 = null; | ||||
|     a1.reduce((a, v, i, t) => { | ||||
|         a2 = t; | ||||
|     }); | ||||
|     assert(a1 === a2); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
| }); | ||||
|  |  | |||
|  | @ -1,134 +1,118 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.reduceRight).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.reduceRight.length === 1); | ||||
| describe("errors", () => { | ||||
|     test("requires at least one argument", () => { | ||||
|         expect(() => { | ||||
|             [].reduceRight(); | ||||
|         }).toThrowWithMessage( | ||||
|             TypeError, | ||||
|             "Array.prototype.reduceRight() requires at least one argument" | ||||
|         ); | ||||
|     }); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|             [1].reduceRight(); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "Array.prototype.reduceRight() requires at least one argument", | ||||
|         } | ||||
|     ); | ||||
|     test("callback must be a function", () => { | ||||
|         expect(() => { | ||||
|             [].reduceRight(undefined); | ||||
|         }).toThrowWithMessage(TypeError, "undefined is not a function"); | ||||
|     }); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|             [1].reduceRight(undefined); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "undefined is not a function", | ||||
|         } | ||||
|     ); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|     test("reduce of empty array with no initial value", () => { | ||||
|         expect(() => { | ||||
|             [].reduceRight((a, x) => x); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "Reduce of empty array with no initial value", | ||||
|         } | ||||
|     ); | ||||
|         }).toThrowWithMessage(TypeError, "Reduce of empty array with no initial value"); | ||||
|     }); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|     test("reduce of array with only empty slots and no initial value", () => { | ||||
|         expect(() => { | ||||
|             [, ,].reduceRight((a, x) => x); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "Reduce of empty array with no initial value", | ||||
|         } | ||||
|     ); | ||||
| 
 | ||||
|     [1, 2].reduceRight(function () { | ||||
|         assert(this === undefined); | ||||
|         }).toThrowWithMessage(TypeError, "Reduce of empty array with no initial value"); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
|     var callbackCalled = 0; | ||||
|     var callback = () => { | ||||
|         callbackCalled++; | ||||
|         return true; | ||||
|     }; | ||||
| describe("normal behavior", () => { | ||||
|     test("basic functionality", () => { | ||||
|         [1, 2].reduceRight(function () { | ||||
|             expect(this).toBeUndefined(); | ||||
|         }); | ||||
| 
 | ||||
|     assert([1].reduceRight(callback) === 1); | ||||
|     assert(callbackCalled === 0); | ||||
|         var callbackCalled = 0; | ||||
|         var callback = () => { | ||||
|             callbackCalled++; | ||||
|             return true; | ||||
|         }; | ||||
| 
 | ||||
|     assert([1].reduceRight(callback) === 1); | ||||
|     assert(callbackCalled === 0); | ||||
|         expect([1].reduceRight(callback)).toBe(1); | ||||
|         expect(callbackCalled).toBe(0); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     assert([1, 2, 3].reduceRight(callback) === true); | ||||
|     assert(callbackCalled === 2); | ||||
|         expect([1].reduceRight(callback)).toBe(1); | ||||
|         expect(callbackCalled).toBe(0); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     assert([1, 2, 3, ,].reduceRight(callback) === true); | ||||
|     assert(callbackCalled === 2); | ||||
|         callbackCalled = 0; | ||||
|         expect([1, 2, 3].reduceRight(callback)).toBe(true); | ||||
|         expect(callbackCalled).toBe(2); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     assert([, , , 1, , , 10, , 100, , ,].reduceRight(callback) === true); | ||||
|     assert(callbackCalled === 2); | ||||
|         callbackCalled = 0; | ||||
|         expect([1, 2, 3, ,].reduceRight(callback)).toBe(true); | ||||
|         expect(callbackCalled).toBe(2); | ||||
| 
 | ||||
|     var constantlySad = () => ":^("; | ||||
|     var result = [].reduceRight(constantlySad, ":^)"); | ||||
|     assert(result === ":^)"); | ||||
|         callbackCalled = 0; | ||||
|         expect([, , , 1, , , 10, , 100, , ,].reduceRight(callback)).toBe(true); | ||||
|         expect(callbackCalled).toBe(2); | ||||
| 
 | ||||
|     result = [":^0"].reduceRight(constantlySad, ":^)"); | ||||
|     assert(result === ":^("); | ||||
|         var constantlySad = () => ":^("; | ||||
|         var result = [].reduceRight(constantlySad, ":^)"); | ||||
|         expect(result).toBe(":^)"); | ||||
| 
 | ||||
|     result = [":^0"].reduceRight(constantlySad); | ||||
|     assert(result === ":^0"); | ||||
|         result = [":^0"].reduceRight(constantlySad, ":^)"); | ||||
|         expect(result).toBe(":^("); | ||||
| 
 | ||||
|     result = [5, 4, 3, 2, 1].reduceRight((accum, elem) => "" + accum + elem); | ||||
|     assert(result === "12345"); | ||||
|         result = [":^0"].reduceRight(constantlySad); | ||||
|         expect(result).toBe(":^0"); | ||||
| 
 | ||||
|     result = [1, 2, 3, 4, 5, 6].reduceRight((accum, elem) => { | ||||
|         return "" + accum + elem; | ||||
|     }, 100); | ||||
|     assert(result === "100654321"); | ||||
|         result = [5, 4, 3, 2, 1].reduceRight((accum, elem) => "" + accum + elem); | ||||
|         expect(result).toBe("12345"); | ||||
| 
 | ||||
|     result = [6, 5, 4, 3, 2, 1].reduceRight((accum, elem) => { | ||||
|         return "" + accum + elem; | ||||
|     }, 100); | ||||
|     assert(result === "100123456"); | ||||
|         result = [1, 2, 3, 4, 5, 6].reduceRight((accum, elem) => { | ||||
|             return "" + accum + elem; | ||||
|         }, 100); | ||||
|         expect(result).toBe("100654321"); | ||||
| 
 | ||||
|     var indexes = []; | ||||
|     result = ["foo", 1, true].reduceRight((a, v, i) => { | ||||
|         indexes.push(i); | ||||
|         result = [6, 5, 4, 3, 2, 1].reduceRight((accum, elem) => { | ||||
|             return "" + accum + elem; | ||||
|         }, 100); | ||||
|         expect(result).toBe("100123456"); | ||||
| 
 | ||||
|         var indexes = []; | ||||
|         result = ["foo", 1, true].reduceRight((a, v, i) => { | ||||
|             indexes.push(i); | ||||
|         }); | ||||
|         expect(result).toBeUndefined(); | ||||
|         expect(indexes.length).toBe(2); | ||||
|         expect(indexes[0]).toBe(1); | ||||
|         expect(indexes[1]).toBe(0); | ||||
| 
 | ||||
|         indexes = []; | ||||
|         result = ["foo", 1, true].reduceRight((a, v, i) => { | ||||
|             indexes.push(i); | ||||
|         }, "foo"); | ||||
|         expect(result).toBeUndefined(); | ||||
|         expect(indexes).toEqual([2, 1, 0]); | ||||
| 
 | ||||
|         var mutable = { prop: 0 }; | ||||
|         result = ["foo", 1, true].reduceRight((a, v) => { | ||||
|             a.prop = v; | ||||
|             return a; | ||||
|         }, mutable); | ||||
|         expect(result).toBe(mutable); | ||||
|         expect(result.prop).toBe("foo"); | ||||
| 
 | ||||
|         var a1 = [1, 2]; | ||||
|         var a2 = null; | ||||
|         a1.reduceRight((a, v, i, t) => { | ||||
|             a2 = t; | ||||
|         }); | ||||
|         expect(a1).toBe(a2); | ||||
|     }); | ||||
|     assert(result === undefined); | ||||
|     assert(indexes.length === 2); | ||||
|     assert(indexes[0] === 1); | ||||
|     assert(indexes[1] === 0); | ||||
| 
 | ||||
|     indexes = []; | ||||
|     result = ["foo", 1, true].reduceRight((a, v, i) => { | ||||
|         indexes.push(i); | ||||
|     }, "foo"); | ||||
|     assert(result === undefined); | ||||
|     assert(indexes.length === 3); | ||||
|     assert(indexes[0] === 2); | ||||
|     assert(indexes[1] === 1); | ||||
|     assert(indexes[2] === 0); | ||||
| 
 | ||||
|     var mutable = { prop: 0 }; | ||||
|     result = ["foo", 1, true].reduceRight((a, v) => { | ||||
|         a.prop = v; | ||||
|         return a; | ||||
|     }, mutable); | ||||
|     assert(result === mutable); | ||||
|     assert(result.prop === "foo"); | ||||
| 
 | ||||
|     var a1 = [1, 2]; | ||||
|     var a2 = null; | ||||
|     a1.reduceRight((a, v, i, t) => { | ||||
|         a2 = t; | ||||
|     }); | ||||
|     assert(a1 === a2); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
| }); | ||||
|  |  | |||
|  | @ -1,31 +1,9 @@ | |||
| load("test-common.js"); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.reverse.length === 0); | ||||
| test("length is 0", () => { | ||||
|     expect(Array.prototype.reverse).toHaveLength(0); | ||||
| }); | ||||
| 
 | ||||
| test("basic functionality", () => { | ||||
|     var array = [1, 2, 3]; | ||||
| 
 | ||||
|     assert(array[0] === 1); | ||||
|     assert(array[1] === 2); | ||||
|     assert(array[2] === 3); | ||||
| 
 | ||||
|     array.reverse(); | ||||
| 
 | ||||
|     assert(array[0] === 3); | ||||
|     assert(array[1] === 2); | ||||
|     assert(array[2] === 1); | ||||
| 
 | ||||
|     var array_ref = array.reverse(); | ||||
| 
 | ||||
|     assert(array_ref[0] === 1); | ||||
|     assert(array_ref[1] === 2); | ||||
|     assert(array_ref[2] === 3); | ||||
| 
 | ||||
|     assert(array[0] === 1); | ||||
|     assert(array[1] === 2); | ||||
|     assert(array[2] === 3); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     expect(array.reverse()).toEqual([3, 2, 1]); | ||||
|     expect(array).toEqual([3, 2, 1]); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,21 +1,23 @@ | |||
| load("test-common.js"); | ||||
| test("length is 0", () => { | ||||
|     expect(Array.prototype.shift).toHaveLength(0); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     var a = [1, 2, 3]; | ||||
|     var value = a.shift(); | ||||
|     assert(value === 1); | ||||
|     assert(a.length === 2); | ||||
|     assert(a[0] === 2); | ||||
|     assert(a[1] === 3); | ||||
| describe("normal behavior", () => { | ||||
|     test("array with elements", () => { | ||||
|         var a = [1, 2, 3]; | ||||
|         expect(a.shift()).toBe(1); | ||||
|         expect(a).toEqual([2, 3]); | ||||
|     }); | ||||
| 
 | ||||
|     var a = []; | ||||
|     var value = a.shift(); | ||||
|     assert(value === undefined); | ||||
|     assert(a.length === 0); | ||||
|     test("empty array", () => { | ||||
|         var a = []; | ||||
|         expect(a.shift()).toBeUndefined(); | ||||
|         expect(a).toEqual([]); | ||||
|     }); | ||||
| 
 | ||||
|     assert([,].shift() === undefined); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("array with empty slot", () => { | ||||
|         var a = [,]; | ||||
|         expect(a.shift()).toBeUndefined(); | ||||
|         expect(a).toEqual([]); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,53 +1,39 @@ | |||
| load("test-common.js"); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.slice.length === 2); | ||||
| test("length is 0", () => { | ||||
|     expect(Array.prototype.slice).toHaveLength(2); | ||||
| }); | ||||
| 
 | ||||
| test("basic functionality", () => { | ||||
|     var array = ["hello", "friends", "serenity", 1]; | ||||
| 
 | ||||
|     var array_slice = array.slice(); | ||||
|     assert(array_slice.length === array.length); | ||||
|     assert(array_slice.length === 4); | ||||
|     assert(array_slice[0] === "hello"); | ||||
|     assert(array_slice[1] === "friends"); | ||||
|     assert(array_slice[2] === "serenity"); | ||||
|     assert(array_slice[3] === 1); | ||||
|     var slice = array.slice(); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity", 1]); | ||||
|     expect(slice).toEqual(["hello", "friends", "serenity", 1]); | ||||
| 
 | ||||
|     array_slice = array.slice(1); | ||||
|     assert(array_slice.length === 3); | ||||
|     assert(array_slice[0] === "friends"); | ||||
|     assert(array_slice[1] === "serenity"); | ||||
|     assert(array_slice[2] === 1); | ||||
|     slice = array.slice(1); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity", 1]); | ||||
|     expect(slice).toEqual(["friends", "serenity", 1]); | ||||
| 
 | ||||
|     array_slice = array.slice(0, 2); | ||||
|     assert(array_slice.length === 2); | ||||
|     assert(array_slice[0] === "hello"); | ||||
|     assert(array_slice[1] === "friends"); | ||||
|     slice = array.slice(0, 2); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity", 1]); | ||||
|     expect(slice).toEqual(["hello", "friends"]); | ||||
| 
 | ||||
|     array_slice = array.slice(-1); | ||||
|     assert(array_slice.length === 1); | ||||
|     assert(array_slice[0] === 1); | ||||
|     slice = array.slice(-1); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity", 1]); | ||||
|     expect(slice).toEqual([1]); | ||||
| 
 | ||||
|     array_slice = array.slice(1, 1); | ||||
|     assert(array_slice.length === 0); | ||||
|     slice = array.slice(1, 1); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity", 1]); | ||||
|     expect(slice).toEqual([]); | ||||
| 
 | ||||
|     array_slice = array.slice(1, -1); | ||||
|     assert(array_slice.length === 2); | ||||
|     assert(array_slice[0] === "friends"); | ||||
|     assert(array_slice[1] === "serenity"); | ||||
|     slice = array.slice(1, -1); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity", 1]); | ||||
|     expect(slice).toEqual(["friends", "serenity"]); | ||||
| 
 | ||||
|     array_slice = array.slice(2, -1); | ||||
|     assert(array_slice.length === 1); | ||||
|     assert(array_slice[0] === "serenity"); | ||||
|     slice = array.slice(2, -1); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity", 1]); | ||||
|     expect(slice).toEqual(["serenity"]); | ||||
| 
 | ||||
|     array_slice = array.slice(0, 100); | ||||
|     assert(array_slice.length === 4); | ||||
|     assert(array_slice[0] === "hello"); | ||||
|     assert(array_slice[1] === "friends"); | ||||
|     assert(array_slice[2] === "serenity"); | ||||
|     assert(array_slice[3] === 1); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     slice = array.slice(0, 100); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity", 1]); | ||||
|     expect(slice).toEqual(["hello", "friends", "serenity", 1]); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,37 +1,37 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.some).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.some.length === 1); | ||||
| describe("errors", () => { | ||||
|     test("requires at least one argument", () => { | ||||
|         expect(() => { | ||||
|             [].some(); | ||||
|         }).toThrowWithMessage(TypeError, "Array.prototype.some() requires at least one argument"); | ||||
|     }); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|     test("callback must be a function", () => { | ||||
|         expect(() => { | ||||
|             [].some(undefined); | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "undefined is not a function", | ||||
|         } | ||||
|     ); | ||||
|         }).toThrowWithMessage(TypeError, "undefined is not a function"); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| test("basic functionality", () => { | ||||
|     var array = ["hello", "friends", 1, 2, false, -42, { name: "serenityos" }]; | ||||
| 
 | ||||
|     assert(array.some(value => value === "hello") === true); | ||||
|     assert(array.some(value => value === "serenity") === false); | ||||
|     assert(array.some((value, index, arr) => index === 1) === true); | ||||
|     assert(array.some(value => value == "1") === true); | ||||
|     assert(array.some(value => value === 1) === true); | ||||
|     assert(array.some(value => value === 13) === false); | ||||
|     assert(array.some(value => typeof value !== "string") === true); | ||||
|     assert(array.some(value => typeof value === "boolean") === true); | ||||
|     assert(array.some(value => value > 1) === true); | ||||
|     assert(array.some(value => value > 1 && value < 3) === true); | ||||
|     assert(array.some(value => value > 100) === false); | ||||
|     assert(array.some(value => value < 0) === true); | ||||
|     assert(array.some(value => array.pop()) === true); | ||||
|     assert(["", "hello", "friends", "serenity"].some(value => value.length === 0) === true); | ||||
|     assert([].some(value => value === 1) === false); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     expect(array.some(value => value === "hello")).toBeTrue(); | ||||
|     expect(array.some(value => value === "serenity")).toBeFalse(); | ||||
|     expect(array.some((value, index, arr) => index === 1)).toBeTrue(); | ||||
|     expect(array.some(value => value == "1")).toBeTrue(); | ||||
|     expect(array.some(value => value === 1)).toBeTrue(); | ||||
|     expect(array.some(value => value === 13)).toBeFalse(); | ||||
|     expect(array.some(value => typeof value !== "string")).toBeTrue(); | ||||
|     expect(array.some(value => typeof value === "boolean")).toBeTrue(); | ||||
|     expect(array.some(value => value > 1)).toBeTrue(); | ||||
|     expect(array.some(value => value > 1 && value < 3)).toBeTrue(); | ||||
|     expect(array.some(value => value > 100)).toBeFalse(); | ||||
|     expect(array.some(value => value < 0)).toBeTrue(); | ||||
|     expect(array.some(value => array.pop())).toBeTrue(); | ||||
|     expect(["", "hello", "friends", "serenity"].some(value => value.length === 0)).toBeTrue(); | ||||
|     expect([].some(value => value === 1)).toBeFalse(); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,87 +1,49 @@ | |||
| load("test-common.js"); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.splice.length === 2); | ||||
| test("length is 2", () => { | ||||
|     expect(Array.prototype.splice).toHaveLength(2); | ||||
| }); | ||||
| 
 | ||||
| test("basic functionality", () => { | ||||
|     var array = ["hello", "friends", "serenity", 1, 2]; | ||||
|     var removed = array.splice(3); | ||||
|     assert(array.length === 3); | ||||
|     assert(array[0] === "hello"); | ||||
|     assert(array[1] === "friends"); | ||||
|     assert(array[2] === "serenity"); | ||||
|     assert(removed.length === 2); | ||||
|     assert(removed[0] === 1); | ||||
|     assert(removed[1] === 2); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity"]); | ||||
|     expect(removed).toEqual([1, 2]); | ||||
| 
 | ||||
|     array = ["hello", "friends", "serenity", 1, 2]; | ||||
|     removed = array.splice(-2); | ||||
|     assert(array.length === 3); | ||||
|     assert(array[0] === "hello"); | ||||
|     assert(array[1] === "friends"); | ||||
|     assert(array[2] === "serenity"); | ||||
|     assert(removed.length === 2); | ||||
|     assert(removed[0] === 1); | ||||
|     assert(removed[1] === 2); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity"]); | ||||
|     expect(removed).toEqual([1, 2]); | ||||
| 
 | ||||
|     array = ["hello", "friends", "serenity", 1, 2]; | ||||
|     removed = array.splice(-2, 1); | ||||
|     assert(array.length === 4); | ||||
|     assert(array[0] === "hello"); | ||||
|     assert(array[1] === "friends"); | ||||
|     assert(array[2] === "serenity"); | ||||
|     assert(array[3] === 2); | ||||
|     assert(removed.length === 1); | ||||
|     assert(removed[0] === 1); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity", 2]); | ||||
|     expect(removed).toEqual([1]); | ||||
| 
 | ||||
|     array = ["serenity"]; | ||||
|     removed = array.splice(0, 0, "hello", "friends"); | ||||
|     assert(array.length === 3); | ||||
|     assert(array[0] === "hello"); | ||||
|     assert(array[1] === "friends"); | ||||
|     assert(array[2] === "serenity"); | ||||
|     assert(removed.length === 0); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity"]); | ||||
|     expect(removed).toEqual([]); | ||||
| 
 | ||||
|     array = ["goodbye", "friends", "serenity"]; | ||||
|     removed = array.splice(0, 1, "hello"); | ||||
|     assert(array.length === 3); | ||||
|     assert(array[0] === "hello"); | ||||
|     assert(array[1] === "friends"); | ||||
|     assert(array[2] === "serenity"); | ||||
|     assert(removed.length === 1); | ||||
|     assert(removed[0] === "goodbye"); | ||||
|     expect(array).toEqual(["hello", "friends", "serenity"]); | ||||
|     expect(removed).toEqual(["goodbye"]); | ||||
| 
 | ||||
|     array = ["foo", "bar", "baz"]; | ||||
|     removed = array.splice(); | ||||
|     assert(array.length === 3); | ||||
|     assert(array[0] === "foo"); | ||||
|     assert(array[1] === "bar"); | ||||
|     assert(array[2] === "baz"); | ||||
|     assert(removed.length === 0); | ||||
|     expect(array).toEqual(["foo", "bar", "baz"]); | ||||
|     expect(removed).toEqual([]); | ||||
| 
 | ||||
|     removed = array.splice(0, 123); | ||||
|     assert(array.length === 0); | ||||
|     assert(removed.length === 3); | ||||
|     assert(removed[0] === "foo"); | ||||
|     assert(removed[1] === "bar"); | ||||
|     assert(removed[2] === "baz"); | ||||
|     expect(array).toEqual([]); | ||||
|     expect(removed).toEqual(["foo", "bar", "baz"]); | ||||
| 
 | ||||
|     array = ["foo", "bar", "baz"]; | ||||
|     removed = array.splice(123, 123); | ||||
|     assert(array.length === 3); | ||||
|     assert(array[0] === "foo"); | ||||
|     assert(array[1] === "bar"); | ||||
|     assert(array[2] === "baz"); | ||||
|     assert(removed.length === 0); | ||||
|     expect(array).toEqual(["foo", "bar", "baz"]); | ||||
|     expect(removed).toEqual([]); | ||||
| 
 | ||||
|     array = ["foo", "bar", "baz"]; | ||||
|     removed = array.splice(-123, 123); | ||||
|     assert(array.length === 0); | ||||
|     assert(removed.length === 3); | ||||
|     assert(removed[0] === "foo"); | ||||
|     assert(removed[1] === "bar"); | ||||
|     assert(removed[2] === "baz"); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     expect(array).toEqual([]); | ||||
|     expect(removed).toEqual(["foo", "bar", "baz"]); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,24 +1,60 @@ | |||
| load("test-common.js"); | ||||
| test("length is 0", () => { | ||||
|     expect(Array.prototype.toLocaleString).toHaveLength(0); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.toLocaleString.length === 0); | ||||
| describe("normal behavior", () => { | ||||
|     test("array with no elements", () => { | ||||
|         expect([].toLocaleString()).toBe(""); | ||||
|     }); | ||||
| 
 | ||||
|     assert([].toLocaleString() === ""); | ||||
|     assert(["foo"].toLocaleString() === "foo"); | ||||
|     assert(["foo", "bar"].toLocaleString() === "foo,bar"); | ||||
|     assert(["foo", undefined, "bar", null, "baz"].toLocaleString() === "foo,,bar,,baz"); | ||||
|     test("array with one element", () => { | ||||
|         expect(["foo"].toLocaleString()).toBe("foo"); | ||||
|     }); | ||||
| 
 | ||||
|     var toStringCalled = 0; | ||||
|     var o = { | ||||
|         toString: () => { | ||||
|             toStringCalled++; | ||||
|             return "o"; | ||||
|         }, | ||||
|     }; | ||||
|     assert([o, undefined, o, null, o].toLocaleString() === "o,,o,,o"); | ||||
|     assert(toStringCalled === 3); | ||||
|     test("array with multiple elements", () => { | ||||
|         expect(["foo", "bar", "baz"].toLocaleString()).toBe("foo,bar,baz"); | ||||
|     }); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("number stringification differs from regular toString, for now", () => { | ||||
|         expect([1, 2, 3].toLocaleString()).toBe( | ||||
|             "[object NumberObject],[object NumberObject],[object NumberObject]" | ||||
|         ); | ||||
|     }); | ||||
| 
 | ||||
|     test("null and undefined result in empty strings", () => { | ||||
|         expect([null].toLocaleString()).toBe(""); | ||||
|         expect([undefined].toLocaleString()).toBe(""); | ||||
|         expect([undefined, null].toLocaleString()).toBe(","); | ||||
|     }); | ||||
| 
 | ||||
|     test("empty values result in empty strings", () => { | ||||
|         expect(new Array(1).toLocaleString()).toBe(""); | ||||
|         expect(new Array(3).toLocaleString()).toBe(",,"); | ||||
|         var a = new Array(5); | ||||
|         a[2] = "foo"; | ||||
|         a[4] = "bar"; | ||||
|         expect(a.toLocaleString()).toBe(",,foo,,bar"); | ||||
|     }); | ||||
| 
 | ||||
|     test("getter property is included in returned string", () => { | ||||
|         var a = ["foo"]; | ||||
|         Object.defineProperty(a, 1, { | ||||
|             get() { | ||||
|                 return "bar"; | ||||
|             }, | ||||
|         }); | ||||
|         expect(a.toLocaleString()).toBe("foo,bar"); | ||||
|     }); | ||||
| 
 | ||||
|     test("array with elements that have a custom toString() function", () => { | ||||
|         var toStringCalled = 0; | ||||
|         var o = { | ||||
|             toString() { | ||||
|                 toStringCalled++; | ||||
|                 return "o"; | ||||
|             }, | ||||
|         }; | ||||
|         expect([o, undefined, o, null, o].toLocaleString()).toBe("o,,o,,o"); | ||||
|         expect(toStringCalled).toBe(3); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,22 +1,58 @@ | |||
| load("test-common.js"); | ||||
| test("length is 0", () => { | ||||
|     expect(Array.prototype.toString).toHaveLength(0); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     var a = [1, 2, 3]; | ||||
|     assert(a.toString() === "1,2,3"); | ||||
|     assert([].toString() === ""); | ||||
|     assert([5].toString() === "5"); | ||||
| describe("normal behavior", () => { | ||||
|     test("array with no elements", () => { | ||||
|         expect([].toString()).toBe(""); | ||||
|     }); | ||||
| 
 | ||||
|     assert("rgb(" + [10, 11, 12] + ")" === "rgb(10,11,12)"); | ||||
|     test("array with one element", () => { | ||||
|         expect([1].toString()).toBe("1"); | ||||
|     }); | ||||
| 
 | ||||
|     assert([undefined, null].toString() === ","); | ||||
|     test("array with multiple elements", () => { | ||||
|         expect([1, 2, 3].toString()).toBe("1,2,3"); | ||||
|     }); | ||||
| 
 | ||||
|     a = new Array(5); | ||||
|     assert(a.toString() === ",,,,"); | ||||
|     a[2] = "foo"; | ||||
|     a[4] = "bar"; | ||||
|     assert(a.toString() === ",,foo,,bar"); | ||||
|     test("string and array concatenation", () => { | ||||
|         expect("rgb(" + [10, 11, 12] + ")").toBe("rgb(10,11,12)"); | ||||
|     }); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("null and undefined result in empty strings", () => { | ||||
|         expect([null].toString()).toBe(""); | ||||
|         expect([undefined].toString()).toBe(""); | ||||
|         expect([undefined, null].toString()).toBe(","); | ||||
|     }); | ||||
| 
 | ||||
|     test("empty values result in empty strings", () => { | ||||
|         expect(new Array(1).toString()).toBe(""); | ||||
|         expect(new Array(3).toString()).toBe(",,"); | ||||
|         var a = new Array(5); | ||||
|         a[2] = "foo"; | ||||
|         a[4] = "bar"; | ||||
|         expect(a.toString()).toBe(",,foo,,bar"); | ||||
|     }); | ||||
| 
 | ||||
|     test("getter property is included in returned string", () => { | ||||
|         var a = [1, 2, 3]; | ||||
|         Object.defineProperty(a, 3, { | ||||
|             get() { | ||||
|                 return 10; | ||||
|             }, | ||||
|         }); | ||||
|         expect(a.toString()).toBe("1,2,3,10"); | ||||
|     }); | ||||
| 
 | ||||
|     test("array with elements that have a custom toString() function", () => { | ||||
|         var toStringCalled = 0; | ||||
|         var o = { | ||||
|             toString() { | ||||
|                 toStringCalled++; | ||||
|                 return "o"; | ||||
|             }, | ||||
|         }; | ||||
|         expect([o, undefined, o, null, o].toString()).toBe("o,,o,,o"); | ||||
|         expect(toStringCalled).toBe(3); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,30 +1,23 @@ | |||
| load("test-common.js"); | ||||
| test("length is 1", () => { | ||||
|     expect(Array.prototype.unshift).toHaveLength(1); | ||||
| }); | ||||
| 
 | ||||
| try { | ||||
|     assert(Array.prototype.unshift.length === 1); | ||||
| describe("normal behavior", () => { | ||||
|     test("no argument", () => { | ||||
|         var a = ["hello"]; | ||||
|         expect(a.unshift()).toBe(1); | ||||
|         expect(a).toEqual(["hello"]); | ||||
|     }); | ||||
| 
 | ||||
|     var a = ["hello"]; | ||||
|     var length = a.unshift(); | ||||
|     assert(length === 1); | ||||
|     assert(a.length === 1); | ||||
|     assert(a[0] === "hello"); | ||||
|     test("single argument", () => { | ||||
|         var a = ["hello"]; | ||||
|         expect(a.unshift("friends")).toBe(2); | ||||
|         expect(a).toEqual(["friends", "hello"]); | ||||
|     }); | ||||
| 
 | ||||
|     length = a.unshift("friends"); | ||||
|     assert(length === 2); | ||||
|     assert(a.length === 2); | ||||
|     assert(a[0] === "friends"); | ||||
|     assert(a[1] === "hello"); | ||||
| 
 | ||||
|     length = a.unshift(1, 2, 3); | ||||
|     assert(length === 5); | ||||
|     assert(a.length === 5); | ||||
|     assert(a[0] === 1); | ||||
|     assert(a[1] === 2); | ||||
|     assert(a[2] === 3); | ||||
|     assert(a[3] === "friends"); | ||||
|     assert(a[4] === "hello"); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     test("multiple arguments", () => { | ||||
|         var a = ["friends", "hello"]; | ||||
|         expect(a.unshift(1, 2, 3)).toBe(5); | ||||
|         expect(a).toEqual([1, 2, 3, "friends", "hello"]); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,63 +1,57 @@ | |||
| load("test-common.js"); | ||||
| 
 | ||||
| try { | ||||
| test("basic functionality", () => { | ||||
|     var a = [1, 2, 3]; | ||||
| 
 | ||||
|     assert(typeof a === "object"); | ||||
|     assert(a.length === 3); | ||||
|     assert(a[0] === 1); | ||||
|     assert(a[1] === 2); | ||||
|     assert(a[2] === 3); | ||||
|     expect(typeof a).toBe("object"); | ||||
|     expect(a).toHaveLength(3); | ||||
|     expect(a[0]).toBe(1); | ||||
|     expect(a[1]).toBe(2); | ||||
|     expect(a[2]).toBe(3); | ||||
| 
 | ||||
|     a[1] = 5; | ||||
|     assert(a[1] === 5); | ||||
|     assert(a.length === 3); | ||||
|     expect(a[1]).toBe(5); | ||||
|     expect(a).toHaveLength(3); | ||||
| 
 | ||||
|     a.push(7); | ||||
|     assert(a[3] === 7); | ||||
|     assert(a.length === 4); | ||||
|     expect(a[3]).toBe(7); | ||||
|     expect(a).toHaveLength(4); | ||||
| 
 | ||||
|     a = [,]; | ||||
|     assert(a.length === 1); | ||||
|     assert(a.toString() === ""); | ||||
|     assert(a[0] === undefined); | ||||
|     expect(a).toHaveLength(1); | ||||
|     expect(a.toString()).toBe(""); | ||||
|     expect(a[0]).toBeUndefined(); | ||||
| 
 | ||||
|     a = [, , , ,]; | ||||
|     assert(a.length === 4); | ||||
|     assert(a.toString() === ",,,"); | ||||
|     assert(a[0] === undefined); | ||||
|     assert(a[1] === undefined); | ||||
|     assert(a[2] === undefined); | ||||
|     assert(a[3] === undefined); | ||||
|     expect(a).toHaveLength(4); | ||||
|     expect(a.toString()).toBe(",,,"); | ||||
|     expect(a[0]).toBeUndefined(); | ||||
|     expect(a[1]).toBeUndefined(); | ||||
|     expect(a[2]).toBeUndefined(); | ||||
|     expect(a[3]).toBeUndefined(); | ||||
| 
 | ||||
|     a = [1, , 2, , , 3]; | ||||
|     assert(a.length === 6); | ||||
|     assert(a.toString() === "1,,2,,,3"); | ||||
|     assert(a[0] === 1); | ||||
|     assert(a[1] === undefined); | ||||
|     assert(a[2] === 2); | ||||
|     assert(a[3] === undefined); | ||||
|     assert(a[4] === undefined); | ||||
|     assert(a[5] === 3); | ||||
|     expect(a).toHaveLength(6); | ||||
|     expect(a.toString()).toBe("1,,2,,,3"); | ||||
|     expect(a[0]).toBe(1); | ||||
|     expect(a[1]).toBeUndefined(); | ||||
|     expect(a[2]).toBe(2); | ||||
|     expect(a[3]).toBeUndefined(); | ||||
|     expect(a[4]).toBeUndefined(); | ||||
|     expect(a[5]).toBe(3); | ||||
| 
 | ||||
|     a = [1, , 2, , , 3]; | ||||
|     Object.defineProperty(a, 1, { | ||||
|         get() { | ||||
|             return this.secret_prop; | ||||
|             return this.getterSetterValue; | ||||
|         }, | ||||
|         set(value) { | ||||
|             this.secret_prop = value; | ||||
|             this.getterSetterValue = value; | ||||
|         }, | ||||
|     }); | ||||
|     assert(a.length === 6); | ||||
|     assert(a.toString() === "1,,2,,,3"); | ||||
|     assert(a.secret_prop === undefined); | ||||
|     expect(a).toHaveLength(6); | ||||
|     expect(a.toString()).toBe("1,,2,,,3"); | ||||
|     expect(a.getterSetterValue).toBeUndefined(); | ||||
|     a[1] = 20; | ||||
|     assert(a.length === 6); | ||||
|     assert(a.toString() === "1,20,2,,,3"); | ||||
|     assert(a.secret_prop === 20); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     expect(a).toHaveLength(6); | ||||
|     expect(a.toString()).toBe("1,20,2,,,3"); | ||||
|     expect(a.getterSetterValue).toBe(20); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,51 +1,37 @@ | |||
| load("test-common.js"); | ||||
| 
 | ||||
| try { | ||||
|     var a = [1, 2, 3]; | ||||
| 
 | ||||
|     assert(a.length === 3); | ||||
|     assert(a[0] === 1); | ||||
|     assert(a[1] === 2); | ||||
|     assert(a[2] === 3); | ||||
| 
 | ||||
|     a.length = 5; | ||||
|     assert(a.length === 5); | ||||
|     assert(a[0] === 1); | ||||
|     assert(a[1] === 2); | ||||
|     assert(a[2] === 3); | ||||
|     assert(a[3] === undefined); | ||||
|     assert(a[4] === undefined); | ||||
| 
 | ||||
|     a.length = 1; | ||||
|     assert(a.length === 1); | ||||
|     assert(a[0] === 1); | ||||
| 
 | ||||
|     a.length = 0; | ||||
|     assert(a.length === 0); | ||||
| 
 | ||||
|     a.length = "42"; | ||||
|     assert(a.length === 42); | ||||
| 
 | ||||
|     a.length = []; | ||||
|     assert(a.length === 0); | ||||
| 
 | ||||
|     a.length = true; | ||||
|     assert(a.length === 1); | ||||
| 
 | ||||
|     [undefined, "foo", -1, Infinity, -Infinity, NaN].forEach(value => { | ||||
|         assertThrowsError( | ||||
|             () => { | ||||
| describe("errors", () => { | ||||
|     test("invalid array length value", () => { | ||||
|         var a = [1, 2, 3]; | ||||
|         [undefined, "foo", -1, Infinity, -Infinity, NaN].forEach(value => { | ||||
|             expect(() => { | ||||
|                 a.length = value; | ||||
|             }, | ||||
|             { | ||||
|                 error: RangeError, | ||||
|                 message: "Invalid array length", | ||||
|             } | ||||
|         ); | ||||
|         assert(a.length === 1); | ||||
|             }).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]); | ||||
|     }); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     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); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,6 +1,4 @@ | |||
| load("test-common.js"); | ||||
| 
 | ||||
| try { | ||||
| test("Issue #1992, shrinking array during find() iteration", () => { | ||||
|     var a, callbackCalled; | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|  | @ -9,7 +7,7 @@ try { | |||
|         callbackCalled++; | ||||
|         a.pop(); | ||||
|     }); | ||||
|     assert(callbackCalled === 5); | ||||
|     expect(callbackCalled).toBe(5); | ||||
| 
 | ||||
|     callbackCalled = 0; | ||||
|     a = [1, 2, 3, 4, 5]; | ||||
|  | @ -17,9 +15,5 @@ try { | |||
|         callbackCalled++; | ||||
|         a.pop(); | ||||
|     }); | ||||
|     assert(callbackCalled === 5); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
|     expect(callbackCalled).toBe(5); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,45 +1,25 @@ | |||
| load("test-common.js"); | ||||
| 
 | ||||
| function testArray(arr) { | ||||
|     return arr.length === 4 && arr[0] === 0 && arr[1] === 1 && arr[2] === 2 && arr[3] === 3; | ||||
| } | ||||
| 
 | ||||
| try { | ||||
|     let arr = [0, ...[1, 2], 3]; | ||||
|     assert(testArray(arr)); | ||||
| 
 | ||||
|     let a = [1, 2]; | ||||
|     arr = [0, ...a, 3]; | ||||
|     assert(testArray(arr)); | ||||
| 
 | ||||
|     let obj = { a: [1, 2] }; | ||||
|     arr = [0, ...obj.a, 3]; | ||||
|     assert(testArray(arr)); | ||||
| 
 | ||||
|     arr = [...[], ...[...[0, 1, 2]], 3]; | ||||
|     assert(testArray(arr)); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
| describe("errors", () => { | ||||
|     test("cannot spread number in array", () => { | ||||
|         expect(() => { | ||||
|             [...1]; | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "1 is not iterable", | ||||
|         } | ||||
|     ); | ||||
|         }).toThrowWithMessage(TypeError, "1 is not iterable"); | ||||
|     }); | ||||
| 
 | ||||
|     assertThrowsError( | ||||
|         () => { | ||||
|     test("cannot spread object in array", () => { | ||||
|         expect(() => { | ||||
|             [...{}]; | ||||
|         }, | ||||
|         { | ||||
|             error: TypeError, | ||||
|             message: "[object Object] is not iterable", | ||||
|         } | ||||
|     ); | ||||
|         }).toThrowWithMessage(TypeError, "[object Object] is not iterable"); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
|     console.log("PASS"); | ||||
| } catch (e) { | ||||
|     console.log("FAIL: " + e); | ||||
| } | ||||
| test("basic functionality", () => { | ||||
|     expect([1, ...[2, 3], 4]).toEqual([1, 2, 3, 4]); | ||||
| 
 | ||||
|     let a = [2, 3]; | ||||
|     expect([1, ...a, 4]).toEqual([1, 2, 3, 4]); | ||||
| 
 | ||||
|     let obj = { a: [2, 3] }; | ||||
|     expect([1, ...obj.a, 4]).toEqual([1, 2, 3, 4]); | ||||
| 
 | ||||
|     expect([...[], ...[...[1, 2, 3]], 4]).toEqual([1, 2, 3, 4]); | ||||
| }); | ||||
|  |  | |||
|  | @ -43,6 +43,38 @@ | |||
| 
 | ||||
| // FIXME: Will eventually not be necessary when all tests are converted
 | ||||
| Vector<String> tests_to_run = { | ||||
|     "builtins/Array/Array.js", | ||||
|     "builtins/Array/array-basic.js", | ||||
|     "builtins/Array/array-length-setter.js", | ||||
|     "builtins/Array/array-shrink-during-find-crash.js", | ||||
|     "builtins/Array/array-spread.js", | ||||
|     "builtins/Array/Array.isArray.js", | ||||
|     "builtins/Array/Array.of.js", | ||||
|     "builtins/Array/Array.prototype-generic-functions.js", | ||||
|     "builtins/Array/Array.prototype.concat.js", | ||||
|     "builtins/Array/Array.prototype.every.js", | ||||
|     "builtins/Array/Array.prototype.fill.js", | ||||
|     "builtins/Array/Array.prototype.filter.js", | ||||
|     "builtins/Array/Array.prototype.find.js", | ||||
|     "builtins/Array/Array.prototype.findIndex.js", | ||||
|     "builtins/Array/Array.prototype.forEach.js", | ||||
|     "builtins/Array/Array.prototype.includes.js", | ||||
|     "builtins/Array/Array.prototype.indexOf.js", | ||||
|     "builtins/Array/Array.prototype.join.js", | ||||
|     "builtins/Array/Array.prototype.lastIndexOf.js", | ||||
|     "builtins/Array/Array.prototype.map.js", | ||||
|     "builtins/Array/Array.prototype.pop.js", | ||||
|     "builtins/Array/Array.prototype.push.js", | ||||
|     "builtins/Array/Array.prototype.reduce.js", | ||||
|     "builtins/Array/Array.prototype.reduceRight.js", | ||||
|     "builtins/Array/Array.prototype.reverse.js", | ||||
|     "builtins/Array/Array.prototype.shift.js", | ||||
|     "builtins/Array/Array.prototype.slice.js", | ||||
|     "builtins/Array/Array.prototype.some.js", | ||||
|     "builtins/Array/Array.prototype.splice.js", | ||||
|     "builtins/Array/Array.prototype.toLocaleString.js", | ||||
|     "builtins/Array/Array.prototype.toString.js", | ||||
|     "builtins/Array/Array.prototype.unshift.js", | ||||
|     "builtins/BigInt/BigInt.js", | ||||
|     "builtins/BigInt/bigint-basic.js", | ||||
|     "builtins/BigInt/bigint-number-mix-errors.js", | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Linus Groh
						Linus Groh