unscopables.js   [plain text]


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

(function () {
    var array = [];
    var unscopables = array[Symbol.unscopables];

    test(typeof unscopables, "object");
    test(unscopables.__proto__, undefined);
    test(String(Object.keys(unscopables).sort()), "copyWithin,entries,fill,find,findIndex,keys,values");
}());

(function () {
    var find = "Cocoa";
    var forEach = "Hidden";
    var array = [];
    test(typeof array.find, "function");

    with (array) {
        test(typeof find, "string");
        test(find, "Cocoa");
        test(typeof forEach, "function");
        test(__proto__, Array.prototype);  // array's unscopables.__proto__ is undefined => false.
    }
}());

(function () {
    var object = {
        [Symbol.unscopables]: {
            Cocoa: false,
            Cappuccino: true
        },

        Cocoa: null,
        Cappuccino: null
    };

    var Cocoa = "Cocoa";
    var Cappuccino = "Cappuccino";
    var toString = "toString";

    with (object) {
        test(Cocoa, null);
        test(Cappuccino, "Cappuccino");
        test(toString, "toString");  // object.toString is hidden by unscopables.toString.
    }

    object[Symbol.unscopables].Cocoa = true;

    with (object) {
        test(Cocoa, "Cocoa");
        test(Cappuccino, "Cappuccino");
    }
}());

(function () {
    var unscopables = Object.create(null);
    unscopables.Cocoa = false;
    unscopables.Cappuccino = true;

    var object = {
        [Symbol.unscopables]: unscopables,
        Cocoa: null,
        Cappuccino: null,
        Matcha: null
    };

    var Cocoa = "Cocoa";
    var Cappuccino = "Cappuccino";
    var Matcha = "Matcha";
    var toString = "toString";

    with (object) {
        test(Cocoa, null);
        test(Cappuccino, "Cappuccino");
        test(Matcha, null);
        test(toString, Object.prototype.toString);
    }

    object[Symbol.unscopables].Cocoa = true;
    object[Symbol.unscopables].Cappuccino = false;
    object[Symbol.unscopables].toString = true;

    with (object) {
        test(Cocoa, "Cocoa");
        test(Cappuccino, null);
        test(toString, "toString");
        test(Matcha, null);
    }
}());

(function () {
    var proto = Object.create(null);
    var unscopables = Object.create(proto);
    unscopables.Cocoa = false;
    unscopables.Cappuccino = true;

    var object = {
        [Symbol.unscopables]: unscopables,
        Cocoa: null,
        Cappuccino: null,
        Matcha: null
    };

    var Cocoa = "Cocoa";
    var Cappuccino = "Cappuccino";
    var Matcha = "Matcha";
    var toString = "toString";

    with (object) {
        test(Cocoa, null);
        test(Cappuccino, "Cappuccino");
        test(Matcha, null);
        test(toString, Object.prototype.toString);
    }

    object[Symbol.unscopables].Cocoa = true;
    object[Symbol.unscopables].Cappuccino = false;
    object[Symbol.unscopables].toString = true;

    with (object) {
        test(Cocoa, "Cocoa");
        test(Cappuccino, null);
        test(toString, "toString");
        test(Matcha, null);
    }

    proto.Matcha = true;

    with (object) {
        test(Cocoa, "Cocoa");
        test(Cappuccino, null);
        test(toString, "toString");
        test(Matcha, "Matcha");
    }
}());

(function () {
    var object = {
        get Cocoa() {
            throw new Error("bad trap");
        },
        Cappuccino: null
    };

    object[Symbol.unscopables] = {
        Cocoa: true,
        Cappuccino: true
    };

    var Cocoa = "Cocoa";
    var Cappuccino = "Cappuccino";
    var toString = "toString";

    with (object) {
        test(Cocoa, "Cocoa");
    }

    object[Symbol.unscopables].Cocoa = false;

    var error = null;
    try {
        with (object) {
            Cocoa;
        }
    } catch (e) {
        error = e;
    }
    test(String(error), "Error: bad trap");
}());

(function () {
    var object = {
        Cocoa: null,
    };
    Object.defineProperty(object, Symbol.unscopables, {
        get: function () {
            throw new Error("unscopables trap");
        }
    });

    var Cocoa = "Cocoa";
    var Cappuccino = "Cappuccino";

    var error = null;
    try {
        with (object) {
            Cocoa
        }
    } catch (e) {
        error = e;
    }
    test(String(error), "Error: unscopables trap");

    with (object) {
        test(Cappuccino, "Cappuccino");
    }
}());

(function () {
    var object = {
        [Symbol.unscopables]: {
            get Cocoa() {
                throw new Error("unscopables trap");
            }
        },
        Cocoa: null,
    };
    var Cocoa = "Cocoa";
    var Cappuccino = "Cappuccino";

    var error = null;
    try {
        with (object) {
            Cocoa
        }
    } catch (e) {
        error = e;
    }
    test(String(error), "Error: unscopables trap");

    with (object) {
        test(Cappuccino, "Cappuccino");
    }
}());

(function () {
    var object = {
        [Symbol.unscopables]: 42,
        Cocoa: "OK",
    };
    var Cocoa = "Cocoa";

    with (object) {
        test(Cocoa, "OK");
    }
}());