trailing-comma-in-patterns.js   [plain text]


function shouldBe(actual, expected) {
    if (actual !== expected)
        throw new Error('bad value: ' + actual);
}

function iterator(array) {
    var nextCount = 0;
    var returnCount = 0;
    var original =  array.values();
    return {
        [Symbol.iterator]() {
            return this;
        },

        next() {
            ++nextCount;
            return original.next();
        },

        return() {
            ++returnCount;
            return { done: true };
        },

        reportNext() {
            return nextCount;
        },

        reportReturn() {
            return returnCount;
        }
    };
};

(function () {
    var iter = iterator([1, 2, 3]);
    var [] = iter;
    shouldBe(iter.reportNext(), 0);
    shouldBe(iter.reportReturn(), 1);
}());

(function () {
    var iter = iterator([1, 2, 3]);
    var [,] = iter;
    shouldBe(iter.reportNext(), 1);
    shouldBe(iter.reportReturn(), 1);
}());

(function () {
    var iter = iterator([1, 2, 3]);
    var [,,] = iter;
    shouldBe(iter.reportNext(), 2);
    shouldBe(iter.reportReturn(), 1);
}());

(function () {
    var iter = iterator([1, 2, 3]);
    var [,,,] = iter;
    shouldBe(iter.reportNext(), 3);
    shouldBe(iter.reportReturn(), 1);
}());

(function () {
    var iter = iterator([1, 2, 3]);
    var [,,,,] = iter;
    shouldBe(iter.reportNext(), 4);
    shouldBe(iter.reportReturn(), 0);
}());

(function () {
    var iter = iterator([1, 2, 3]);
    var [,,,,,] = iter;
    shouldBe(iter.reportNext(), 4);
    shouldBe(iter.reportReturn(), 0);
}());

(function () {
    var iter = iterator([1, 2, 3]);
    var [,a,] = iter;
    shouldBe(iter.reportNext(), 2);
    shouldBe(iter.reportReturn(), 1);
    shouldBe(a, 2);
}());

(function () {
    var iter = iterator([1, 2, 3]);
    var [a,] = iter;
    shouldBe(iter.reportNext(), 1);
    shouldBe(iter.reportReturn(), 1);
    shouldBe(a, 1);
}());

(function () {
    var iter = iterator([1, 2, 3]);
    var [a,,] = iter;
    shouldBe(iter.reportNext(), 2);
    shouldBe(iter.reportReturn(), 1);
    shouldBe(a, 1);
}());

(function () {
    var iter = iterator([1, 2, 3]);
    var [a,b = 42,] = iter;
    shouldBe(iter.reportNext(), 2);
    shouldBe(iter.reportReturn(), 1);
    shouldBe(a, 1);
    shouldBe(b, 2);
}());

(function () {
    var {} = { Cocoa: 15, Cappuccino: 13 };
}());

(function () {
    var {Cocoa,} = { Cocoa: 15, Cappuccino: 13 };
    shouldBe(Cocoa, 15);
}());

(function () {
    var {Cocoa = 'Cocoa',} = { Cocoa: 15, Cappuccino: 13 };
    shouldBe(Cocoa, 15);
}());

(function () {
    var {Cocoa, Kilimanjaro = 'Coffee'} = { Cocoa: 15, Cappuccino: 13 };
    shouldBe(Cocoa, 15);
    shouldBe(Kilimanjaro, 'Coffee');
}());

(function () {
    var {Cocoa, Kilimanjaro = 'Coffee'} = {};
    shouldBe(Cocoa, undefined);
    shouldBe(Kilimanjaro, 'Coffee');
}());

(function () {
    var {Cocoa, Kilimanjaro = 'Coffee',} = { Cocoa: 15, Cappuccino: 13 };
    shouldBe(Cocoa, 15);
    shouldBe(Kilimanjaro, 'Coffee');
}());

function testSyntaxError(script, message) {
    var error = null;
    try {
        eval(script);
    } catch (e) {
        error = e;
    }
    if (!error)
        throw new Error("Expected syntax error not thrown");

    if (String(error) !== message)
        throw new Error("Bad error: " + String(error));
}

testSyntaxError(String.raw`var {,} = {Cocoa: 15}`, String.raw`SyntaxError: Unexpected token ','. Expected a property name.`);
testSyntaxError(String.raw`var {,} = {}`, String.raw`SyntaxError: Unexpected token ','. Expected a property name.`);