Index: test/mjsunit/harmony/array-includes.js |
diff --git a/test/mjsunit/harmony/array-includes.js b/test/mjsunit/harmony/array-includes.js |
deleted file mode 100644 |
index 2cdd1123d711b03ad76a6a252d26f386b6a6d1fe..0000000000000000000000000000000000000000 |
--- a/test/mjsunit/harmony/array-includes.js |
+++ /dev/null |
@@ -1,677 +0,0 @@ |
-// Copyright 2014 the V8 project authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-// Flags: --harmony-array-includes |
- |
-// Largely ported from |
-// https://github.com/tc39/Array.prototype.includes/tree/master/test |
-// using https://www.npmjs.org/package/test262-to-mjsunit with further edits |
- |
- |
-// Array.prototype.includes sees a new element added by a getter that is hit |
-// during iteration |
-(function() { |
- var arrayLike = { |
- length: 5, |
- 0: "a", |
- |
- get 1() { |
- this[2] = "c"; |
- return "b"; |
- } |
- }; |
- |
- assertTrue(Array.prototype.includes.call(arrayLike, "c")); |
-})(); |
- |
- |
-// Array.prototype.includes works on array-like objects |
-(function() { |
- var arrayLike1 = { |
- length: 5, |
- 0: "a", |
- 1: "b" |
- }; |
- |
- assertTrue(Array.prototype.includes.call(arrayLike1, "a")); |
- assertFalse(Array.prototype.includes.call(arrayLike1, "c")); |
- |
- var arrayLike2 = { |
- length: 2, |
- 0: "a", |
- 1: "b", |
- 2: "c" |
- }; |
- |
- assertTrue(Array.prototype.includes.call(arrayLike2, "b")); |
- assertFalse(Array.prototype.includes.call(arrayLike2, "c")); |
-})(); |
- |
- |
-// Array.prototype.includes should fail if used on a null or undefined this |
-(function() { |
- assertThrows(function() { |
- Array.prototype.includes.call(null, "a"); |
- }, TypeError); |
- |
- assertThrows(function() { |
- Array.prototype.includes.call(undefined, "a"); |
- }, TypeError); |
-})(); |
- |
- |
-// Array.prototype.includes should terminate if getting an index throws an |
-// exception |
-(function() { |
- function Test262Error() {} |
- |
- var trappedZero = { |
- length: 2, |
- |
- get 0() { |
- throw new Test262Error(); |
- }, |
- |
- get 1() { |
- assertUnreachable("Should not try to get the first element"); |
- } |
- }; |
- |
- assertThrows(function() { |
- Array.prototype.includes.call(trappedZero, "a"); |
- }, Test262Error); |
-})(); |
- |
- |
-// Array.prototype.includes should terminate if ToNumber ends up being called on |
-// a symbol fromIndex |
-(function() { |
- var trappedZero = { |
- length: 1, |
- |
- get 0() { |
- assertUnreachable("Should not try to get the zeroth element"); |
- } |
- }; |
- |
- assertThrows(function() { |
- Array.prototype.includes.call(trappedZero, "a", Symbol()); |
- }, TypeError); |
-})(); |
- |
- |
-// Array.prototype.includes should terminate if an exception occurs converting |
-// the fromIndex to a number |
-(function() { |
- function Test262Error() {} |
- |
- var fromIndex = { |
- valueOf: function() { |
- throw new Test262Error(); |
- } |
- }; |
- |
- var trappedZero = { |
- length: 1, |
- |
- get 0() { |
- assertUnreachable("Should not try to get the zeroth element"); |
- } |
- }; |
- |
- assertThrows(function() { |
- Array.prototype.includes.call(trappedZero, "a", fromIndex); |
- }, Test262Error); |
-})(); |
- |
- |
-// Array.prototype.includes should terminate if an exception occurs getting the |
-// length |
-(function() { |
- function Test262Error() {} |
- |
- var fromIndexTrap = { |
- valueOf: function() { |
- assertUnreachable("Should not try to call ToInteger on valueOf"); |
- } |
- }; |
- |
- var throwingLength = { |
- get length() { |
- throw new Test262Error(); |
- }, |
- |
- get 0() { |
- assertUnreachable("Should not try to get the zeroth element"); |
- } |
- }; |
- |
- assertThrows(function() { |
- Array.prototype.includes.call(throwingLength, "a", fromIndexTrap); |
- }, Test262Error); |
-})(); |
- |
- |
-// Array.prototype.includes should terminate if ToLength ends up being called on |
-// a symbol length |
-(function() { |
- var fromIndexTrap = { |
- valueOf: function() { |
- assertUnreachable("Should not try to call ToInteger on valueOf"); |
- } |
- }; |
- |
- var badLength = { |
- length: Symbol(), |
- |
- get 0() { |
- assertUnreachable("Should not try to get the zeroth element"); |
- } |
- }; |
- |
- assertThrows(function() { |
- Array.prototype.includes.call(badLength, "a", fromIndexTrap); |
- }, TypeError); |
-})(); |
- |
- |
-// Array.prototype.includes should terminate if an exception occurs converting |
-// the length to a number |
-(function() { |
- function Test262Error() {} |
- |
- var fromIndexTrap = { |
- valueOf: function() { |
- assertUnreachable("Should not try to call ToInteger on valueOf"); |
- } |
- }; |
- |
- var badLength = { |
- length: { |
- valueOf: function() { |
- throw new Test262Error(); |
- } |
- }, |
- |
- get 0() { |
- assertUnreachable("Should not try to get the zeroth element"); |
- } |
- }; |
- |
- assertThrows(function() { |
- Array.prototype.includes.call(badLength, "a", fromIndexTrap); |
- }, Test262Error); |
-})(); |
- |
- |
-// Array.prototype.includes should search the whole array, as the optional |
-// second argument fromIndex defaults to 0 |
-(function() { |
- assertTrue([10, 11].includes(10)); |
- assertTrue([10, 11].includes(11)); |
- |
- var arrayLike = { |
- length: 2, |
- |
- get 0() { |
- return "1"; |
- }, |
- |
- get 1() { |
- return "2"; |
- } |
- }; |
- |
- assertTrue(Array.prototype.includes.call(arrayLike, "1")); |
- assertTrue(Array.prototype.includes.call(arrayLike, "2")); |
-})(); |
- |
- |
-// Array.prototype.includes returns false if fromIndex is greater or equal to |
-// the length of the array |
-(function() { |
- assertFalse([1, 2].includes(2, 3)); |
- assertFalse([1, 2].includes(2, 2)); |
- |
- var arrayLikeWithTrap = { |
- length: 2, |
- |
- get 0() { |
- assertUnreachable("Getter for 0 was called"); |
- }, |
- |
- get 1() { |
- assertUnreachable("Getter for 1 was called"); |
- } |
- }; |
- |
- assertFalse(Array.prototype.includes.call(arrayLikeWithTrap, "c", 2)); |
- assertFalse(Array.prototype.includes.call(arrayLikeWithTrap, "c", 3)); |
-})(); |
- |
- |
-// Array.prototype.includes searches the whole array if the computed index from |
-// the given negative fromIndex argument is less than 0 |
-(function() { |
- assertTrue([1, 3].includes(1, -4)); |
- assertTrue([1, 3].includes(3, -4)); |
- |
- var arrayLike = { |
- length: 2, |
- 0: "a", |
- |
- get 1() { |
- return "b"; |
- }, |
- |
- get "-1"() { |
- assertUnreachable("Should not try to get the element at index -1"); |
- } |
- }; |
- |
- assertTrue(Array.prototype.includes.call(arrayLike, "a", -4)); |
- assertTrue(Array.prototype.includes.call(arrayLike, "b", -4)); |
-})(); |
- |
- |
-// Array.prototype.includes should use a negative value as the offset from the |
-// end of the array to compute fromIndex |
-(function() { |
- assertTrue([12, 13].includes(13, -1)); |
- assertFalse([12, 13].includes(12, -1)); |
- assertTrue([12, 13].includes(12, -2)); |
- |
- var arrayLike = { |
- length: 2, |
- |
- get 0() { |
- return "a"; |
- }, |
- |
- get 1() { |
- return "b"; |
- } |
- }; |
- |
- assertTrue(Array.prototype.includes.call(arrayLike, "b", -1)); |
- assertFalse(Array.prototype.includes.call(arrayLike, "a", -1)); |
- assertTrue(Array.prototype.includes.call(arrayLike, "a", -2)); |
-})(); |
- |
- |
-// Array.prototype.includes converts its fromIndex parameter to an integer |
-(function() { |
- assertFalse(["a", "b"].includes("a", 2.3)); |
- |
- var arrayLikeWithTraps = { |
- length: 2, |
- |
- get 0() { |
- assertUnreachable("Getter for 0 was called"); |
- }, |
- |
- get 1() { |
- assertUnreachable("Getter for 1 was called"); |
- } |
- }; |
- |
- assertFalse(Array.prototype.includes.call(arrayLikeWithTraps, "c", 2.1)); |
- assertFalse(Array.prototype.includes.call(arrayLikeWithTraps, "c", +Infinity)); |
- assertTrue(["a", "b", "c"].includes("a", -Infinity)); |
- assertTrue(["a", "b", "c"].includes("c", 2.9)); |
- assertTrue(["a", "b", "c"].includes("c", NaN)); |
- |
- var arrayLikeWithTrapAfterZero = { |
- length: 2, |
- |
- get 0() { |
- return "a"; |
- }, |
- |
- get 1() { |
- assertUnreachable("Getter for 1 was called"); |
- } |
- }; |
- |
- assertTrue(Array.prototype.includes.call(arrayLikeWithTrapAfterZero, "a", NaN)); |
- |
- var numberLike = { |
- valueOf: function() { |
- return 2; |
- } |
- }; |
- |
- assertFalse(["a", "b", "c"].includes("a", numberLike)); |
- assertFalse(["a", "b", "c"].includes("a", "2")); |
- assertTrue(["a", "b", "c"].includes("c", numberLike)); |
- assertTrue(["a", "b", "c"].includes("c", "2")); |
-})(); |
- |
- |
-// Array.prototype.includes should have length 1 |
-(function() { |
- assertEquals(1, Array.prototype.includes.length); |
-})(); |
- |
- |
-// Array.prototype.includes should have name property with value 'includes' |
-(function() { |
- assertEquals("includes", Array.prototype.includes.name); |
-})(); |
- |
- |
-// !!! Test failed to convert: |
-// Cannot convert tests with includes. |
-// !!! |
- |
- |
-// Array.prototype.includes does not skip holes; if the array has a prototype it |
-// gets from that |
-(function() { |
- var holesEverywhere = [,,,]; |
- |
- holesEverywhere.__proto__ = { |
- 1: "a" |
- }; |
- |
- holesEverywhere.__proto__.__proto__ = Array.prototype; |
- assertTrue(holesEverywhere.includes("a")); |
- var oneHole = ["a", "b",, "d"]; |
- |
- oneHole.__proto__ = { |
- get 2() { |
- return "c"; |
- } |
- }; |
- |
- assertTrue(Array.prototype.includes.call(oneHole, "c")); |
-})(); |
- |
- |
-// Array.prototype.includes does not skip holes; instead it treates them as |
-// undefined |
-(function() { |
- assertTrue([,,,].includes(undefined)); |
- assertTrue(["a", "b",, "d"].includes(undefined)); |
-})(); |
- |
- |
-// Array.prototype.includes gets length property from the prototype if it's |
-// available |
-(function() { |
- var proto = { |
- length: 1 |
- }; |
- |
- var arrayLike = Object.create(proto); |
- arrayLike[0] = "a"; |
- |
- Object.defineProperty(arrayLike, "1", { |
- get: function() { |
- assertUnreachable("Getter for 1 was called"); |
- } |
- }); |
- |
- assertTrue(Array.prototype.includes.call(arrayLike, "a")); |
-})(); |
- |
- |
-// Array.prototype.includes treats a missing length property as zero |
-(function() { |
- var arrayLikeWithTraps = { |
- get 0() { |
- assertUnreachable("Getter for 0 was called"); |
- }, |
- |
- get 1() { |
- assertUnreachable("Getter for 1 was called"); |
- } |
- }; |
- |
- assertFalse(Array.prototype.includes.call(arrayLikeWithTraps, "a")); |
-})(); |
- |
- |
-// Array.prototype.includes should always return false on negative-length |
-// objects |
-(function() { |
- assertFalse(Array.prototype.includes.call({ |
- length: -1 |
- }, 2)); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: -2 |
- })); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: -Infinity |
- }, undefined)); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: -Math.pow(2, 53) |
- }, NaN)); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: -1, |
- "-1": 2 |
- }, 2)); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: -3, |
- "-1": 2 |
- }, 2)); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: -Infinity, |
- "-1": 2 |
- }, 2)); |
- |
- var arrayLikeWithTrap = { |
- length: -1, |
- |
- get 0() { |
- assertUnreachable("Getter for 0 was called"); |
- } |
- }; |
- |
- assertFalse(Array.prototype.includes.call(arrayLikeWithTrap, 2)); |
-})(); |
- |
- |
-// Array.prototype.includes should clamp positive lengths to 2^53 - 1 |
-(function() { |
- var fromIndexForLargeIndexTests = 9007199254740990; |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: 1 |
- }, 2)); |
- |
- assertTrue(Array.prototype.includes.call({ |
- length: 1, |
- 0: "a" |
- }, "a")); |
- |
- assertTrue(Array.prototype.includes.call({ |
- length: +Infinity, |
- 0: "a" |
- }, "a")); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: +Infinity |
- }, "a", fromIndexForLargeIndexTests)); |
- |
- var arrayLikeWithTrap = { |
- length: +Infinity, |
- |
- get 9007199254740992() { |
- assertUnreachable("Getter for 9007199254740992 (i.e. 2^53) was called"); |
- }, |
- |
- "9007199254740993": "a" |
- }; |
- |
- assertFalse( |
- Array.prototype.includes.call(arrayLikeWithTrap, "a", fromIndexForLargeIndexTests) |
- ); |
- |
- var arrayLikeWithTooBigLength = { |
- length: 9007199254740996, |
- "9007199254740992": "a" |
- }; |
- |
- assertFalse( |
- Array.prototype.includes.call(arrayLikeWithTooBigLength, "a", fromIndexForLargeIndexTests) |
- ); |
-})(); |
- |
- |
-// Array.prototype.includes should always return false on zero-length objects |
-(function() { |
- assertFalse([].includes(2)); |
- assertFalse([].includes()); |
- assertFalse([].includes(undefined)); |
- assertFalse([].includes(NaN)); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: 0 |
- }, 2)); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: 0 |
- })); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: 0 |
- }, undefined)); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: 0 |
- }, NaN)); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: 0, |
- 0: 2 |
- }, 2)); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: 0, |
- 0: undefined |
- })); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: 0, |
- 0: undefined |
- }, undefined)); |
- |
- assertFalse(Array.prototype.includes.call({ |
- length: 0, |
- 0: NaN |
- }, NaN)); |
- |
- var arrayLikeWithTrap = { |
- length: 0, |
- |
- get 0() { |
- assertUnreachable("Getter for 0 was called"); |
- } |
- }; |
- |
- Array.prototype.includes.call(arrayLikeWithTrap); |
- |
- var trappedFromIndex = { |
- valueOf: function() { |
- assertUnreachable("Should not try to convert fromIndex to a number on a zero-length array"); |
- } |
- }; |
- |
- [].includes("a", trappedFromIndex); |
- |
- Array.prototype.includes.call({ |
- length: 0 |
- }, trappedFromIndex); |
-})(); |
- |
- |
-// Array.prototype.includes works on objects |
-(function() { |
- assertFalse(["a", "b", "c"].includes({})); |
- assertFalse([{}, {}].includes({})); |
- var obj = {}; |
- assertTrue([obj].includes(obj)); |
- assertFalse([obj].includes(obj, 1)); |
- assertTrue([obj, obj].includes(obj, 1)); |
- |
- var stringyObject = { |
- toString: function() { |
- return "a"; |
- } |
- }; |
- |
- assertFalse(["a", "b", obj].includes(stringyObject)); |
-})(); |
- |
- |
-// Array.prototype.includes does not see an element removed by a getter that is |
-// hit during iteration |
-(function() { |
- var arrayLike = { |
- length: 5, |
- 0: "a", |
- |
- get 1() { |
- delete this[2]; |
- return "b"; |
- }, |
- |
- 2: "c" |
- }; |
- |
- assertFalse(Array.prototype.includes.call(arrayLike, "c")); |
-})(); |
- |
- |
-// Array.prototype.includes should use the SameValueZero algorithm to compare |
-(function() { |
- assertTrue([1, 2, 3].includes(2)); |
- assertFalse([1, 2, 3].includes(4)); |
- assertTrue([1, 2, NaN].includes(NaN)); |
- assertTrue([1, 2, -0].includes(+0)); |
- assertTrue([1, 2, -0].includes(-0)); |
- assertTrue([1, 2, +0].includes(-0)); |
- assertTrue([1, 2, +0].includes(+0)); |
- assertFalse([1, 2, -Infinity].includes(+Infinity)); |
- assertTrue([1, 2, -Infinity].includes(-Infinity)); |
- assertFalse([1, 2, +Infinity].includes(-Infinity)); |
- assertTrue([1, 2, +Infinity].includes(+Infinity)); |
-})(); |
- |
- |
-// Array.prototype.includes stops once it hits the length of an array-like, even |
-// if there are more after |
-(function() { |
- var arrayLike = { |
- length: 2, |
- 0: "a", |
- 1: "b", |
- |
- get 2() { |
- assertUnreachable("Should not try to get the second element"); |
- } |
- }; |
- |
- assertFalse(Array.prototype.includes.call(arrayLike, "c")); |
-})(); |
- |
- |
-// Array.prototype.includes works on typed arrays |
-(function() { |
- assertTrue(Array.prototype.includes.call(new Uint8Array([1, 2, 3]), 2)); |
- |
- assertTrue( |
- Array.prototype.includes.call(new Float32Array([2.5, 3.14, Math.PI]), 3.1415927410125732) |
- ); |
- |
- assertFalse(Array.prototype.includes.call(new Uint8Array([1, 2, 3]), 4)); |
- assertFalse(Array.prototype.includes.call(new Uint8Array([1, 2, 3]), 2, 2)); |
-})(); |