Chromium Code Reviews| Index: test/mjsunit/harmony/arguments-iterator.js |
| diff --git a/test/mjsunit/harmony/arguments-iterator.js b/test/mjsunit/harmony/arguments-iterator.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..cd9c864611defdc13e2344bb479fb2299377ce60 |
| --- /dev/null |
| +++ b/test/mjsunit/harmony/arguments-iterator.js |
| @@ -0,0 +1,155 @@ |
| +// Copyright 2014 the V8 project authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +// Flags: --harmony-iteration |
| + |
| + |
| +// Note in general that "arguments.foo" and "var o = arguments; o.foo" |
| +// are treated differently by full-codegen, and so both cases need to be |
| +// tested. |
| + |
| +function TestDirectArgumentsIteratorProperty() { |
| + assertTrue(arguments.hasOwnProperty(Symbol.iterator)); |
| + assertFalse(arguments.propertyIsEnumerable(Symbol.iterator)); |
| + assertEquals(arguments[Symbol.iterator], [].values); |
| +} |
| +TestDirectArgumentsIteratorProperty(); |
| + |
| + |
| +function TestIndirectArgumentsIteratorProperty() { |
| + var o = arguments; |
| + assertTrue(o.hasOwnProperty(Symbol.iterator)); |
| + assertFalse(o.propertyIsEnumerable(Symbol.iterator)); |
| + assertEquals(o[Symbol.iterator], [].values); |
| +} |
| +TestIndirectArgumentsIteratorProperty(); |
| + |
| + |
| +function assertIteratorResult(value, done, result) { |
| + assertEquals({value: value, done: done}, result); |
| +} |
| + |
| + |
| +function TestDirectValues1(a, b, c) { |
| + var iterator = arguments[Symbol.iterator](); |
| + assertIteratorResult(a, false, iterator.next()); |
| + assertIteratorResult(b, false, iterator.next()); |
| + assertIteratorResult(c, false, iterator.next()); |
| + assertIteratorResult(void 0, true, iterator.next()); |
|
rossberg
2014/06/26 15:51:53
Nit: no reason to use void 0 instead of undefined
|
| +} |
| +TestDirectValues1(1, 2, 3); |
| + |
| + |
| +function TestIndirectValues1(a, b, c) { |
| + var args = arguments; |
| + var iterator = args[Symbol.iterator](); |
| + assertIteratorResult(a, false, iterator.next()); |
| + assertIteratorResult(b, false, iterator.next()); |
| + assertIteratorResult(c, false, iterator.next()); |
| + assertIteratorResult(void 0, true, iterator.next()); |
| +} |
| +TestIndirectValues1(1, 2, 3); |
| + |
| + |
| +function TestDirectValues2(a, b, c) { |
| + var iterator = arguments[Symbol.iterator](); |
| + assertIteratorResult(a, false, iterator.next()); |
| + assertIteratorResult(b, false, iterator.next()); |
| + assertIteratorResult(c, false, iterator.next()); |
| + assertIteratorResult(void 0, true, iterator.next()); |
| + |
| + arguments[3] = 4; |
| + arguments.length = 4; |
| + assertIteratorResult(void 0, true, iterator.next()); |
| +} |
| +TestDirectValues2(1, 2, 3); |
| + |
| + |
| +function TestIndirectValues2(a, b, c) { |
| + var args = arguments; |
| + var iterator = args[Symbol.iterator](); |
| + assertIteratorResult(a, false, iterator.next()); |
| + assertIteratorResult(b, false, iterator.next()); |
| + assertIteratorResult(c, false, iterator.next()); |
| + assertIteratorResult(void 0, true, iterator.next()); |
| + |
| + arguments[3] = 4; |
| + arguments.length = 4; |
| + assertIteratorResult(void 0, true, iterator.next()); |
| +} |
| +TestIndirectValues2(1, 2, 3); |
| + |
| + |
| +function TestDirectValues3(a, b, c) { |
| + var iterator = arguments[Symbol.iterator](); |
| + assertIteratorResult(a, false, iterator.next()); |
| + assertIteratorResult(b, false, iterator.next()); |
| + |
| + arguments.length = 2; |
| + assertIteratorResult(void 0, true, iterator.next()); |
| +} |
| +TestDirectValues3(1, 2, 3); |
| + |
| + |
| +function TestIndirectValues3(a, b, c) { |
| + var args = arguments; |
| + var iterator = args[Symbol.iterator](); |
| + assertIteratorResult(a, false, iterator.next()); |
| + assertIteratorResult(b, false, iterator.next()); |
| + |
| + arguments.length = 2; |
| + assertIteratorResult(void 0, true, iterator.next()); |
| +} |
| +TestIndirectValues3(1, 2, 3); |
| + |
| + |
| +function TestDirectValues4(a, b, c) { |
| + var iterator = arguments[Symbol.iterator](); |
| + assertIteratorResult(a, false, iterator.next()); |
| + assertIteratorResult(b, false, iterator.next()); |
| + assertIteratorResult(c, false, iterator.next()); |
| + |
| + arguments.length = 4; |
| + assertIteratorResult(void 0, false, iterator.next()); |
| + assertIteratorResult(void 0, true, iterator.next()); |
| +} |
| +TestDirectValues4(1, 2, 3); |
| + |
| + |
| +function TestIndirectValues4(a, b, c) { |
|
rossberg
2014/06/26 15:51:52
It would be good to also test that
- changing an
|
| + var args = arguments; |
| + var iterator = args[Symbol.iterator](); |
| + assertIteratorResult(a, false, iterator.next()); |
| + assertIteratorResult(b, false, iterator.next()); |
| + assertIteratorResult(c, false, iterator.next()); |
| + |
| + arguments.length = 4; |
| + assertIteratorResult(void 0, false, iterator.next()); |
| + assertIteratorResult(void 0, true, iterator.next()); |
| +} |
| +TestIndirectValues4(1, 2, 3); |
| + |
| + |
| +function TestForOf() { |
| + var i = 0; |
| + for (var value of arguments) { |
| + assertEquals(arguments[i++], value); |
| + } |
| + |
| + assertEquals(arguments.length, i); |
| +} |
| +TestForOf(1, 2, 3, 4, 5); |
| + |
| + |
| +function TestAssignmentToIterator() { |
| + var i = 0; |
| + arguments[Symbol.iterator] = [].entries; |
| + for (var entry of arguments) { |
| + assertEquals([i, arguments[i]], entry); |
| + i++; |
| + } |
| + |
| + assertEquals(arguments.length, i); |
| +} |
| +TestAssignmentToIterator(1, 2, 3, 4, 5); |