arguments-iterator.js   [plain text]


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