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