]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - tests/stress/symbol-registry.js
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / tests / stress / symbol-registry.js
diff --git a/tests/stress/symbol-registry.js b/tests/stress/symbol-registry.js
new file mode 100644 (file)
index 0000000..8a1a05a
--- /dev/null
@@ -0,0 +1,125 @@
+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);
+}());