--- /dev/null
+function test(actual, expected) {
+ if (actual !== expected)
+ throw new Error('bad value: ' + actual);
+}
+
+function testArguments(check) {
+ (function () {
+ check(arguments, []);
+ }());
+
+ (function (a, b, c) {
+ check(arguments, [a, b, c]);
+ }());
+
+ (function () {
+ 'use strict';
+ check(arguments, []);
+ }());
+
+ (function (a, b, c) {
+ 'use strict';
+ check(arguments, [a, b, c]);
+ }());
+}
+
+testArguments(function (args) {
+ var iteratorMethod = args[Symbol.iterator];
+ test(iteratorMethod, Array.prototype.values);
+ var descriptor = Object.getOwnPropertyDescriptor(args, Symbol.iterator);
+ test(descriptor.writable, true);
+ test(descriptor.configurable, true);
+ test(descriptor.enumerable, false);
+ test(descriptor.value, iteratorMethod);
+});
+
+testArguments(function (args, expected) {
+ var iterator = args[Symbol.iterator]();
+ test(iterator.toString(), '[object Array Iterator]');
+ var index = 0;
+ for (var value of iterator) {
+ test(value, expected[index++]);
+ }
+ test(args.length, index);
+
+ var index = 0;
+ for (var value of args) {
+ test(value, expected[index++]);
+ }
+ test(args.length, index);
+});
+
+testArguments(function (args) {
+ var symbols = Object.getOwnPropertySymbols(args);
+ test(symbols.length, 1);
+ test(symbols[0], Symbol.iterator);
+});
+
+testArguments(function (args) {
+ 'use strict';
+ args[Symbol.iterator] = 'not throw error';
+});
+
+testArguments(function (args) {
+ 'use strict';
+ delete args[Symbol.iterator];
+ test(args[Symbol.iterator], undefined);
+
+ var symbols = Object.getOwnPropertySymbols(args);
+ test(symbols.length, 0);
+});