diff options
Diffstat (limited to '')
-rw-r--r-- | js/src/tests/non262/TypedArray/slice-species.js | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/js/src/tests/non262/TypedArray/slice-species.js b/js/src/tests/non262/TypedArray/slice-species.js new file mode 100644 index 0000000000..8a03f2f6ee --- /dev/null +++ b/js/src/tests/non262/TypedArray/slice-species.js @@ -0,0 +1,49 @@ +for (var constructor of typedArrayConstructors) { + // Basic tests for our SpeciesConstructor implementation. + var undefConstructor = new constructor(2); + undefConstructor.constructor = undefined; + assertDeepEq(undefConstructor.slice(1), new constructor(1)); + + assertThrowsInstanceOf(() => { + var strConstructor = new constructor; + strConstructor.constructor = "not a constructor"; + strConstructor.slice(123); + }, TypeError, "Assert that we have an invalid constructor"); + + // If obj.constructor[@@species] is undefined or null then the default + // constructor is used. + var mathConstructor = new constructor(8); + mathConstructor.constructor = Math.sin; + assertDeepEq(mathConstructor.slice(4), new constructor(4)); + + var undefSpecies = new constructor(2); + undefSpecies.constructor = { [Symbol.species]: undefined }; + assertDeepEq(undefSpecies.slice(1), new constructor(1)); + + var nullSpecies = new constructor(2); + nullSpecies.constructor = { [Symbol.species]: null }; + assertDeepEq(nullSpecies.slice(1), new constructor(1)); + + // If obj.constructor[@@species] is different constructor, it should be + // used. + for (var constructor2 of typedArrayConstructors) { + var modifiedConstructor = new constructor(2); + modifiedConstructor.constructor = constructor2; + assertDeepEq(modifiedConstructor.slice(1), new constructor2(1)); + + var modifiedSpecies = new constructor(2); + modifiedSpecies.constructor = { [Symbol.species]: constructor2 }; + assertDeepEq(modifiedSpecies.slice(1), new constructor2(1)); + } + + // If obj.constructor[@@species] is neither undefined nor null, and it's + // not a constructor, TypeError should be thrown. + assertThrowsInstanceOf(() => { + var strSpecies = new constructor; + strSpecies.constructor = { [Symbol.species]: "not a constructor" }; + strSpecies.slice(123); + }, TypeError); +} + +if (typeof reportCompare === "function") + reportCompare(true, true); |