| // 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); |