iterator-return-beyond-multiple-iteration-scopes.js   [plain text]



function createIterator(callback) {
    var array = [0,1,2,3,4,5];
    var iterator = array[Symbol.iterator]();
    iterator.return = function () {
        ++iterator.returned;
        if (callback)
            return callback(this);
        return { done: true, value: undefined };
    };
    iterator.returned = 0;
    return iterator;
}

(function test() {
    var outerIterator = createIterator();
    var innerIterator = createIterator();
    outer: for (var e1 of outerIterator) {
        inner: for (var e2 of innerIterator) {
            break outer;
        }
    }
    if (innerIterator.returned !== 1)
        throw new Error("bad value: " + innerIterator.returned);
    if (outerIterator.returned !== 1)
        throw new Error("bad value: " + outerIterator.returned);
}());

(function test() {
    var outerIterator = createIterator();
    var innerIterator = createIterator();
    outer: for (var e1 of outerIterator) {
        inner: for (var e2 of innerIterator) {
            break inner;
        }
    }
    if (innerIterator.returned !== 6)
        throw new Error("bad value: " + innerIterator.returned);
    if (outerIterator.returned !== 0)
        throw new Error("bad value: " + outerIterator.returned);
}());

(function test() {
    var outerIterator = createIterator();
    var innerIterator = createIterator();
    outer: for (var e1 of outerIterator) {
        inner: for (var e2 of innerIterator) {
            break;
        }
    }
    if (innerIterator.returned !== 6)
        throw new Error("bad value: " + innerIterator.returned);
    if (outerIterator.returned !== 0)
        throw new Error("bad value: " + outerIterator.returned);
}());

(function test() {
    var outerIterator = createIterator();
    var innerIterator = createIterator();
    outer: for (var e1 of outerIterator) {
        inner: for (var e2 of innerIterator) {
            break;
        }
    }
    if (innerIterator.returned !== 6)
        throw new Error("bad value: " + innerIterator.returned);
    if (outerIterator.returned !== 0)
        throw new Error("bad value: " + outerIterator.returned);
}());

(function test() {
    var outerIterator = createIterator();
    var innerIterator = createIterator();
    outer: for (var e1 of outerIterator) {
        inner: for (var e2 of innerIterator) {
            continue;
        }
    }
    if (innerIterator.returned !== 0)
        throw new Error("bad value: " + innerIterator.returned);
    if (outerIterator.returned !== 0)
        throw new Error("bad value: " + outerIterator.returned);
}());

(function test() {
    var outerIterator = createIterator();
    var innerIterator = createIterator();
    outer: for (var e1 of outerIterator) {
        inner: for (var e2 of innerIterator) {
            continue inner;
        }
    }
    if (innerIterator.returned !== 0)
        throw new Error("bad value: " + innerIterator.returned);
    if (outerIterator.returned !== 0)
        throw new Error("bad value: " + outerIterator.returned);
}());

(function test() {
    var outerIterator = createIterator();
    var innerIterator = createIterator();
    outer: for (var e1 of outerIterator) {
        inner: for (var e2 of innerIterator) {
            continue outer;
        }
    }
    if (innerIterator.returned !== 6)
        throw new Error("bad value: " + innerIterator.returned);
    if (outerIterator.returned !== 0)
        throw new Error("bad value: " + outerIterator.returned);
}());

(function test() {
    var outerIterator = createIterator();
    var innerIterator = createIterator();
    (function () {
        outer: for (var e1 of outerIterator) {
            inner: for (var e2 of innerIterator) {
                return;
            }
        }
    }());
    if (innerIterator.returned !== 1)
        throw new Error("bad value: " + innerIterator.returned);
    if (outerIterator.returned !== 1)
        throw new Error("bad value: " + outerIterator.returned);
}());

(function test() {
    var outerIterator = createIterator();
    var innerIterator = createIterator();
    (function () {
        outer: for (var e1 of outerIterator) {
            inner: for (var e2 of innerIterator) {
            }
            return;
        }
    }());
    if (innerIterator.returned !== 0)
        throw new Error("bad value: " + innerIterator.returned);
    if (outerIterator.returned !== 1)
        throw new Error("bad value: " + outerIterator.returned);
}());


(function test() {
    function raiseError() {
        throw new Error("Cocoa");
    }
    var outerIterator = createIterator();
    var innerIterator = createIterator();
    (function () {
        var error = null;
        try {
            outer: for (var e1 of outerIterator) {
                inner: for (var e2 of innerIterator) {
                    raiseError();
                }
            }
        } catch (e) {
            error = e;
        }
        if (innerIterator.returned !== 1)
            throw new Error("bad value: " + innerIterator.returned);
        if (outerIterator.returned !== 1)
            throw new Error("bad value: " + outerIterator.returned);
        if (!error)
            throw new Error("not thrown");
        if (String(error) !== "Error: Cocoa")
            throw new Error("bad error: " + String(error));
    }());
}());