summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/TypedArray/slice-species.js
blob: 8a03f2f6ee4dd33c7b10fc9671f96f209411c972 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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);