symbol-registry.js   [plain text]


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

(function () {
    var hello = Symbol("Hello");
    var proto = Symbol("__proto__");

    for (var sym of [ hello, proto, Symbol.iterator ]) {
        var key = Symbol.keyFor(sym);
        test(key, undefined);
        // twice
        var key = Symbol.keyFor(sym);
        test(key, undefined);
    }
}());

(function () {
    var keys = [
        "Hello",
        "__proto__",
        "Symbol.iterator",
        '',
        null,
        undefined,
        42,
        20.5,
        -42,
        -20.5,
        true,
        false,
        {},
        function () {},
        [],
    ];
    for (var key of keys) {
        var sym = Symbol.for(key);
        test(typeof sym, "symbol");
        test(sym.toString(), "Symbol(" + String(key) + ")");

        var sym2 = Symbol.for(key);
        test(sym === sym2, true);

        var key = Symbol.keyFor(sym);
        test(key, key);
        var key = Symbol.keyFor(sym2);
        test(key, key);
    }
}());

(function () {
    var error = null;
    try {
        var key = {
            toString() {
                throw new Error('toString');
            }
        };
        Symbol.for(key);
    } catch (e) {
        error = e;
    }
    if (!error)
        throw new Error('not thrown');
    if (String(error) !== 'Error: toString')
        throw new Error('bad error: ' + String(error));
}());

(function () {
    var elements = [
        null,
        undefined,
        42,
        20.5,
        true,
        false,
        'string',
        {},
        function () {},
        [],
    ];
    for (var item of elements) {
        var error = null;
        try {
            Symbol.keyFor(item);
        } catch (e) {
            error = e;
        }
        if (!error)
            throw new Error('not thrown');
        if (String(error) !== 'TypeError: Type error')
            throw new Error('bad error: ' + String(error));
    }
}());

(function () {
    for (var i = 0; i < 10000; ++i)
        Symbol.for(i);
    gc();
}());

(function () {
    for (var i = 0; i < 100; ++i) {
        var symbol = Symbol.for(i);
        test(String(symbol), "Symbol(" + i + ")");
        test(symbol, Symbol.for(i));
        gc();
    }
    gc();
}());

(function () {
    var symbols = [];
    for (var i = 0; i < 100; ++i) {
        var symbol = Symbol.for(i);
        symbols.push(symbol);
    }

    for (var i = 0; i < 100; ++i)
        test(Symbol.for(i), symbols[i]);

    for (var i = 0; i < 100; ++i)
        test(Symbol.keyFor(Symbol(i)), undefined);
}());