Chromium Code Reviews| Index: test/mjsunit/es6/arguments-iterator.js |
| diff --git a/test/mjsunit/es6/arguments-iterator.js b/test/mjsunit/es6/arguments-iterator.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..bba3b32856faa9e20c5902a5327ecf1e3f437abf |
| --- /dev/null |
| +++ b/test/mjsunit/es6/arguments-iterator.js |
| @@ -0,0 +1,193 @@ |
| +// 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. |
| + |
| + |
| +// 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)); |
|
arv (Not doing code reviews)
2014/08/12 16:31:53
Can you change this to?
var descr = Object.getOwn
|
| + 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(undefined, true, iterator.next()); |
| +} |
| +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(undefined, 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(undefined, true, iterator.next()); |
| + |
| + arguments[3] = 4; |
| + arguments.length = 4; |
| + assertIteratorResult(undefined, 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(undefined, true, iterator.next()); |
| + |
| + arguments[3] = 4; |
| + arguments.length = 4; |
| + assertIteratorResult(undefined, 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(undefined, 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(undefined, 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(undefined, false, iterator.next()); |
| + assertIteratorResult(undefined, true, iterator.next()); |
| +} |
| +TestDirectValues4(1, 2, 3); |
| + |
| + |
| +function TestIndirectValues4(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()); |
| + |
| + arguments.length = 4; |
| + assertIteratorResult(undefined, false, iterator.next()); |
| + assertIteratorResult(undefined, 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); |
| + |
| + |
| +function TestArgumentsMutation() { |
| + var i = 0; |
| + for (var x of arguments) { |
| + assertEquals(arguments[i], x); |
| + arguments[i+1] *= 2; |
| + i++; |
| + } |
| + |
| + assertEquals(arguments.length, i); |
| +} |
| +TestArgumentsMutation(1, 2, 3, 4, 5); |
| + |
| + |
| +function TestSloppyArgumentsAliasing(a0, a1, a2, a3, a4) { |
| + var i = 0; |
| + for (var x of arguments) { |
| + assertEquals(arguments[i], x); |
| + a0 = a1; a1 = a2; a3 = a4; |
| + i++; |
| + } |
| + |
| + assertEquals(arguments.length, i); |
| +} |
| +TestSloppyArgumentsAliasing(1, 2, 3, 4, 5); |
| + |
| + |
| +function TestStrictArgumentsAliasing(a0, a1, a2, a3, a4) { |
| + "use strict"; |
| + var i = 0; |
| + for (var x of arguments) { |
| + a0 = a1; a1 = a2; a3 = a4; |
| + assertEquals(arguments[i], x); |
| + i++; |
| + } |
| + |
| + assertEquals(arguments.length, i); |
| +} |
| +TestStrictArgumentsAliasing(1, 2, 3, 4, 5); |