raise-error-in-iterator-close.js   [plain text]



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

(function test() {
    var outerIterator = createIterator();
    var innerIterator = createIterator(function () {
        throw new Error("Inner return called.");
    });
    var error = null;
    try {
        outer: for (var e1 of outerIterator) {
            inner: for (var e2 of innerIterator) {
                break;
            }
        }
    } catch (e) {
        error = e;
    }
    if (!error)
        throw new Error("no error");
    if (String(error) !== "Error: Inner return called.")
        throw new Error("bad error: " + String(error));
    if (!innerIterator.returned)
        throw new Error("bad value: " + innerIterator.returned);
    if (!outerIterator.returned)
        throw new Error("bad value: " + outerIterator.returned);
}());

(function test() {
    var outerIterator = createIterator(function () {
        throw new Error("Outer return called.");
    });
    var innerIterator = createIterator(function () {
        throw new Error("Inner return called.");
    });
    var error = null;
    try {
        outer: for (var e1 of outerIterator) {
            inner: for (var e2 of innerIterator) {
                break;
            }
        }
    } catch (e) {
        error = e;
    }
    if (!error)
        throw new Error("no error");
    if (String(error) !== "Error: Inner return called.")
        throw new Error("bad error: " + String(error));
    if (!innerIterator.returned)
        throw new Error("bad value: " + innerIterator.returned);
    if (!outerIterator.returned)
        throw new Error("bad value: " + outerIterator.returned);
}());

(function test() {
    var outerIterator = createIterator(function () {
        throw new Error("Outer return called.");
    });
    var innerIterator = createIterator();
    var error = null;
    try {
        outer: for (var e1 of outerIterator) {
            inner: for (var e2 of innerIterator) {
                break outer;
            }
        }
    } catch (e) {
        error = e;
    }
    if (!error)
        throw new Error("no error");
    if (String(error) !== "Error: Outer return called.")
        throw new Error("bad error: " + String(error));
    if (!innerIterator.returned)
        throw new Error("bad value: " + innerIterator.returned);
    if (!outerIterator.returned)
        throw new Error("bad value: " + outerIterator.returned);
}());

(function test() {
    var outerIterator = createIterator(function () {
        throw new Error("Outer return called.");
    });
    var innerIterator = createIterator(function () {
        throw new Error("Inner return called.");
    });
    var error = null;
    try {
        outer: for (var e1 of outerIterator) {
            inner: for (var e2 of innerIterator) {
                throw new Error("Loop raises error.");
            }
        }
    } catch (e) {
        error = e;
    }
    if (!error)
        throw new Error("no error");
    if (String(error) !== "Error: Loop raises error.")
        throw new Error("bad error: " + String(error));
    if (!innerIterator.returned)
        throw new Error("bad value: " + innerIterator.returned);
    if (!outerIterator.returned)
        throw new Error("bad value: " + outerIterator.returned);
}());