summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/Array/for_of_1.js
blob: 0233c1d2788e4b54c0fb846bb2550d9f887992d8 (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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Test corner cases of for-of iteration over Arrays.
// The current SetObject::construct method uses a ForOfIterator to extract
// values from the array, so we use that mechanism to test ForOfIterator here.

// Test the properties and prototype of a generator object.
function TestManySmallArrays() {
    function doIter(f, arr) {
        return f(...new Set(arr));
    }

    function fun(a, b, c) {
        var result = 0;
        for (var i = 0; i < arguments.length; i++)
            result += arguments[i];
        return result;
    }


    var TRUE_SUM = 0;
    var N = 100;
    var M = 3;
    var sum = 0;
    for (var i = 0; i < N; i++) {
        var arr = new Array(M);
        for (var j = 0; j < M; j++) {
            arr[j] = j;
            TRUE_SUM += j;
        }
        sum += doIter(fun, arr);
    }
    assertEq(sum, TRUE_SUM);
}
TestManySmallArrays();

// Test the properties and prototype of a generator object.
function TestSingleSmallArray() {
    function doIter(f, arr) {
        return f(...new Set(arr));
    }

    function fun(a, b, c) {
        var result = 0;
        for (var i = 0; i < arguments.length; i++)
            result += arguments[i];
        return result;
    }


    var TRUE_SUM = 0;
    var N = 100;
    var M = 3;
    var arr = new Array(M);
    for (var j = 0; j < M; j++) {
        arr[j] = j;
        TRUE_SUM += j;
    }
    TRUE_SUM *= N;

    var sum = 0;
    for (var i = 0; i < N; i++) {
        sum += doIter(fun, arr);
    }
    assertEq(sum, TRUE_SUM);
}
TestSingleSmallArray();


function TestChangeArrayPrototype() {
    function doIter(f, arr) {
        return f(...new Set(arr));
    }

    function fun(a, b, c) {
        var result = 0;
        for (var i = 0; i < arguments.length; i++)
            result += arguments[i];
        return result;
    }

    var Proto1 = Object.create(Array.prototype);

    var TRUE_SUM = 0;
    var N = 100;
    var MID = N/2;
    var M = 3;
    var arr = new Array(M);
    var ARR_SUM = 0;
    for (var j = 0; j < M; j++) {
        arr[j] = j;
        ARR_SUM += j;
    }

    var sum = 0;
    for (var i = 0; i < N; i++) {
        sum += doIter(fun, arr);
        if (i == MID)
            arr.__proto__ = Proto1;
        TRUE_SUM += ARR_SUM;
    }
    assertEq(sum, TRUE_SUM);
}
TestChangeArrayPrototype();


function TestChangeManyArrayShape() {
    function doIter(f, arr) {
        return f(...new Set(arr));
    }

    function fun(a, b, c) {
        var result = 0;
        for (var i = 0; i < arguments.length; i++)
            result += arguments[i];
        return result;
    }

    var TRUE_SUM = 0;
    var N = 100;
    var MID = N/2;
    var M = 3;
    var sum = 0;
    for (var i = 0; i < N; i++) {
        var arr = new Array(M);
        var ARR_SUM = 0;
        for (var j = 0; j < M; j++) {
            arr[j] = j;
            ARR_SUM += j;
        }
        arr['v_' + i] = i;
        sum += doIter(fun, arr);
        TRUE_SUM += ARR_SUM;
    }
    assertEq(sum, TRUE_SUM);
}
TestChangeManyArrayShape();

if (typeof reportCompare === "function")
  reportCompare(true, true);