js/src/tests/ecma_6/Array/for_of_1.js

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:974c5688f72d
1 // Test corner cases of for-of iteration over Arrays.
2 // The current spidermonky JSOP_SPREAD implementation for function calls
3 // with '...rest' arguments uses a ForOfIterator to extract values from
4 // the array, so we use that mechanism to test ForOfIterator here.
5
6
7 // Test the properties and prototype of a generator object.
8 function TestManySmallArrays() {
9 function doIter(f, arr) {
10 return f(...arr)
11 }
12
13 function fun(a, b, c) {
14 var result = 0;
15 for (var i = 0; i < arguments.length; i++)
16 result += arguments[i];
17 return result;
18 }
19
20
21 var TRUE_SUM = 0;
22 var N = 100;
23 var M = 3;
24 var sum = 0;
25 for (var i = 0; i < N; i++) {
26 var arr = new Array(M);
27 for (var j = 0; j < M; j++) {
28 arr[j] = j;
29 TRUE_SUM += j;
30 }
31 sum += doIter(fun, arr);
32 }
33 assertEq(sum, TRUE_SUM);
34 }
35 TestManySmallArrays();
36
37 // Test the properties and prototype of a generator object.
38 function TestSingleSmallArray() {
39 function doIter(f, arr) {
40 return f(...arr)
41 }
42
43 function fun(a, b, c) {
44 var result = 0;
45 for (var i = 0; i < arguments.length; i++)
46 result += arguments[i];
47 return result;
48 }
49
50
51 var TRUE_SUM = 0;
52 var N = 100;
53 var M = 3;
54 var arr = new Array(M);
55 for (var j = 0; j < M; j++) {
56 arr[j] = j;
57 TRUE_SUM += j;
58 }
59 TRUE_SUM *= N;
60
61 var sum = 0;
62 for (var i = 0; i < N; i++) {
63 sum += doIter(fun, arr);
64 }
65 assertEq(sum, TRUE_SUM);
66 }
67 TestSingleSmallArray();
68
69
70 function TestChangeArrayPrototype() {
71 function doIter(f, arr) {
72 return f(...arr)
73 }
74
75 function fun(a, b, c) {
76 var result = 0;
77 for (var i = 0; i < arguments.length; i++)
78 result += arguments[i];
79 return result;
80 }
81
82 var Proto1 = Object.create(Array.prototype);
83
84 var TRUE_SUM = 0;
85 var N = 100;
86 var MID = N/2;
87 var M = 3;
88 var arr = new Array(M);
89 var ARR_SUM = 0;
90 for (var j = 0; j < M; j++) {
91 arr[j] = j;
92 ARR_SUM += j;
93 }
94
95 var sum = 0;
96 for (var i = 0; i < N; i++) {
97 sum += doIter(fun, arr);
98 if (i == MID)
99 arr.__proto__ = Proto1;
100 TRUE_SUM += ARR_SUM;
101 }
102 assertEq(sum, TRUE_SUM);
103 }
104 TestChangeArrayPrototype();
105
106
107 function TestChangeManyArrayShape() {
108 function doIter(f, arr) {
109 return f(...arr)
110 }
111
112 function fun(a, b, c) {
113 var result = 0;
114 for (var i = 0; i < arguments.length; i++)
115 result += arguments[i];
116 return result;
117 }
118
119 var TRUE_SUM = 0;
120 var N = 100;
121 var MID = N/2;
122 var M = 3;
123 var sum = 0;
124 for (var i = 0; i < N; i++) {
125 var arr = new Array(M);
126 var ARR_SUM = 0;
127 for (var j = 0; j < M; j++) {
128 arr[j] = j;
129 ARR_SUM += j;
130 }
131 arr['v_' + i] = i;
132 sum += doIter(fun, arr);
133 TRUE_SUM += ARR_SUM;
134 }
135 assertEq(sum, TRUE_SUM);
136 }
137 TestChangeManyArrayShape();
138
139 if (typeof reportCompare === "function")
140 reportCompare(true, true);

mercurial