mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1041631, part 1 - Change Symbol tests to pass if Symbol is not defined. r=Waldo.
--HG-- extra : rebase_source : b8510807640d3f0da483904079a26467829f7e70
This commit is contained in:
parent
7fe93c6acb
commit
8329a70b42
@ -150,8 +150,10 @@ assertEq(f(40), INT32_MAX + 1 | 0);
|
||||
function testBadConversions(f) {
|
||||
valueToConvert = {valueOf: function () { throw "FAIL"; }};
|
||||
assertThrowsValue(() => f(40), "FAIL");
|
||||
valueToConvert = Symbol();
|
||||
assertThrowsInstanceOf(() => f(40), TypeError);
|
||||
if (typeof Symbol === "function") {
|
||||
valueToConvert = Symbol();
|
||||
assertThrowsInstanceOf(() => f(40), TypeError);
|
||||
}
|
||||
}
|
||||
testBadConversions(f);
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
function f() {
|
||||
return Object(Symbol());
|
||||
if (typeof Symbol === "function")
|
||||
return Object(Symbol());
|
||||
}
|
||||
|
||||
for (var i = 0; i < 4; i++) {
|
||||
|
@ -17,7 +17,8 @@ check(false);
|
||||
check(1);
|
||||
check(NaN);
|
||||
check("ok");
|
||||
check(Symbol("ok"));
|
||||
if (typeof Symbol === "function")
|
||||
check(Symbol("ok"));
|
||||
|
||||
// A Debugger.Object that belongs to a different Debugger object is invalid.
|
||||
var g = newGlobal();
|
||||
|
@ -18,7 +18,8 @@ g.eval("" +
|
||||
obj[" "] = 3;
|
||||
obj[""] = 4;
|
||||
obj[0] = 5;
|
||||
obj[Symbol.for("moon")] = 6;
|
||||
if (typeof Symbol === "function")
|
||||
obj[Symbol.for("moon")] = 6;
|
||||
return obj;
|
||||
})
|
||||
g.eval("fill(this);\n" +
|
||||
@ -30,5 +31,6 @@ for (var names of [withNames, globalNames]) {
|
||||
assertEq(names.indexOf(" "), -1);
|
||||
assertEq(names.indexOf(""), -1);
|
||||
assertEq(names.indexOf("0"), -1);
|
||||
assertEq(names.indexOf(Symbol.for("moon")), -1);
|
||||
if (typeof Symbol === "function")
|
||||
assertEq(names.indexOf(Symbol.for("moon")), -1);
|
||||
}
|
||||
|
@ -22,7 +22,9 @@ g.eval("function f() { debugger; }");
|
||||
hits = 0;
|
||||
g.eval("args = []; f();");
|
||||
g.eval("this.f();");
|
||||
g.eval("var world = Symbol('world'); " +
|
||||
g.eval("var world = 'world'; " +
|
||||
"if (typeof Symbol === 'function') " +
|
||||
" Symbol('world'); " +
|
||||
"args = ['hello', world, 3.14, true, false, null, undefined]; " +
|
||||
"f('hello', world, 3.14, true, false, null, undefined);");
|
||||
g.eval("f.apply(undefined, args);");
|
||||
|
@ -15,7 +15,9 @@ g.eval("function f(obj, expected) { debugger; }");
|
||||
|
||||
g.eval("f(new Number(-0), '0');");
|
||||
g.eval("f(new String('ok'), 'ok');");
|
||||
g.eval("f(Symbol('still ok'), 'Symbol(still ok)');");
|
||||
g.eval("f(Object(Symbol('still ok')), 'Symbol(still ok)');");
|
||||
if (typeof Symbol === "function") {
|
||||
g.eval("f(Symbol('still ok'), 'Symbol(still ok)');");
|
||||
g.eval("f(Object(Symbol('still ok')), 'Symbol(still ok)');");
|
||||
}
|
||||
g.eval("f({toString: function () { return f; }}, f);");
|
||||
assertEq(hits, 5);
|
||||
assertEq(hits, typeof Symbol === "function" ? 5 : 3);
|
||||
|
@ -12,5 +12,6 @@ dbg.onDebuggerStatement = function (frame) {
|
||||
hits++;
|
||||
};
|
||||
g.eval("function f() { debugger; }");
|
||||
g.eval("f(undefined, -0, NaN, '\uffff', Symbol('alpha'), Array.prototype, Math, f);");
|
||||
var symbolExpr = typeof Symbol === "function" ? "Symbol('alpha')" : "'alpha'";
|
||||
g.eval("f(undefined, -0, NaN, '\uffff', " + symbolExpr + ", Array.prototype, Math, f);");
|
||||
assertEq(hits, 1);
|
||||
|
@ -23,7 +23,8 @@ test(null);
|
||||
test(false);
|
||||
test(1);
|
||||
test("stringy");
|
||||
test(Symbol("symbolic"));
|
||||
if (typeof Symbol === "function")
|
||||
test(Symbol("symbolic"));
|
||||
test({});
|
||||
test([]);
|
||||
|
||||
|
@ -16,9 +16,11 @@ g.eval("Number.prototype.f = f; v = 3.14; v.f();");
|
||||
g.eval("f.call(v);");
|
||||
g.eval("String.prototype.f = f; v = 'hello'; v.f();");
|
||||
g.eval("f.call(v);");
|
||||
g.eval("Symbol.prototype.f = f; v = Symbol('world'); v.f();");
|
||||
g.eval("f.call(v);");
|
||||
if (typeof Symbol === "function") {
|
||||
g.eval("Symbol.prototype.f = f; v = Symbol('world'); v.f();");
|
||||
g.eval("f.call(v);");
|
||||
}
|
||||
g.eval("v = undefined; f.call(v);");
|
||||
g.eval("v = null; f.call(v);");
|
||||
|
||||
assertEq(hits, 10);
|
||||
assertEq(hits, typeof Symbol === "function" ? 10 : 8);
|
||||
|
@ -21,9 +21,11 @@ g.eval("Number.prototype.f = f; v = 3.14; v.f();");
|
||||
g.eval("f.call(v);");
|
||||
g.eval("String.prototype.f = f; v = 'hello'; v.f();");
|
||||
g.eval("f.call(v);");
|
||||
g.eval("Symbol.prototype.f = f; v = Symbol('world'); v.f();");
|
||||
g.eval("f.call(v);");
|
||||
if (typeof Symbol === "function") {
|
||||
g.eval("Symbol.prototype.f = f; v = Symbol('world'); v.f();");
|
||||
g.eval("f.call(v);");
|
||||
}
|
||||
g.eval("v = undefined; f.call(v);");
|
||||
g.eval("v = null; f.call(v);");
|
||||
|
||||
assertEq(hits, 10);
|
||||
assertEq(hits, typeof Symbol === "function" ? 10 : 8);
|
||||
|
@ -26,8 +26,10 @@ test("[0, 1, 2]");
|
||||
test("[,,,,,]");
|
||||
test("/a*a/");
|
||||
test("function () {}");
|
||||
test("(function () {\n" +
|
||||
" var x = {};\n" +
|
||||
" x[Symbol()] = 1; x[Symbol.for('moon')] = 2; x[Symbol.iterator] = 3;\n" +
|
||||
" return x;\n" +
|
||||
"})()");
|
||||
if (typeof Symbol === "function") {
|
||||
test("(function () {\n" +
|
||||
" var x = {};\n" +
|
||||
" x[Symbol()] = 1; x[Symbol.for('moon')] = 2; x[Symbol.iterator] = 3;\n" +
|
||||
" return x;\n" +
|
||||
"})()");
|
||||
}
|
||||
|
@ -4,7 +4,8 @@ var g = newGlobal();
|
||||
var dbg = Debugger();
|
||||
var gobj = dbg.addDebuggee(g);
|
||||
g.p = {xyzzy: 8}; // makes a cross-compartment wrapper
|
||||
g.p[Symbol.for("plugh")] = 9;
|
||||
if (typeof Symbol === "function")
|
||||
g.p[Symbol.for("plugh")] = 9;
|
||||
var wp = gobj.getOwnPropertyDescriptor("p").value;
|
||||
var names = wp.getOwnPropertyNames();
|
||||
assertEq(names.length, 1);
|
||||
|
@ -38,5 +38,7 @@ assertEq(gw.makeDebuggeeValue(null), null);
|
||||
assertEq(gw.makeDebuggeeValue(1729), 1729);
|
||||
assertEq(gw.makeDebuggeeValue(Math.PI), Math.PI);
|
||||
assertEq(gw.makeDebuggeeValue(undefined), undefined);
|
||||
var s = g.eval("Symbol('Stavromula Beta')");
|
||||
assertEq(gw.makeDebuggeeValue(s), s);
|
||||
if (typeof Symbol === "function") {
|
||||
var s = g.eval("Symbol('Stavromula Beta')");
|
||||
assertEq(gw.makeDebuggeeValue(s), s);
|
||||
}
|
||||
|
@ -1,3 +1,5 @@
|
||||
gczeal(4);
|
||||
var symbols = [Symbol(), Symbol("comet"), Symbol.for("moon"), Symbol.iterator, 0];
|
||||
for (var a of symbols) {}
|
||||
if (typeof Symbol === "function") {
|
||||
gczeal(4);
|
||||
var symbols = [Symbol(), Symbol("comet"), Symbol.for("moon"), Symbol.iterator, 0];
|
||||
for (var a of symbols) {}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
x = function() {};
|
||||
y = new WeakMap;
|
||||
selectforgc({});;
|
||||
y.set(x, Symbol());
|
||||
if (typeof Symbol === "function")
|
||||
y.set(x, Symbol());
|
||||
|
@ -1,6 +1,8 @@
|
||||
gczeal(9);
|
||||
Symbol.for("a");
|
||||
gcslice(1);
|
||||
var a = Symbol.for("a");
|
||||
gcslice();
|
||||
print(Symbol.keyFor(a));
|
||||
if (typeof Symbol === "function") {
|
||||
gczeal(9);
|
||||
Symbol.for("a");
|
||||
gcslice(1);
|
||||
var a = Symbol.for("a");
|
||||
gcslice();
|
||||
print(Symbol.keyFor(a));
|
||||
}
|
||||
|
@ -42,8 +42,10 @@ Match.Pattern([{node: {}, edge: "shape"},
|
||||
.assert(findPath(o, o));
|
||||
print(findPath(o, o).map((e) => e.edge).toString());
|
||||
|
||||
// Check that we can generate ubi::Nodes for Symbols.
|
||||
var so = { sym: Symbol() };
|
||||
Match.Pattern([{node: {}, edge: "sym" }])
|
||||
.assert(findPath(so, so.sym));
|
||||
print(findPath(so, so.sym).map((e) => e.edge).toString());
|
||||
if (typeof Symbol === "function") {
|
||||
// Check that we can generate ubi::Nodes for Symbols.
|
||||
var so = { sym: Symbol() };
|
||||
Match.Pattern([{node: {}, edge: "sym" }])
|
||||
.assert(findPath(so, so.sym));
|
||||
print(findPath(so, so.sym).map((e) => e.edge).toString());
|
||||
}
|
||||
|
@ -1,13 +1,14 @@
|
||||
// |jit-test| error: TypeError
|
||||
g = (function() {
|
||||
var Int32ArrayView = Int32Array();
|
||||
function f() {
|
||||
Int32ArrayView[Symbol() >> 2]
|
||||
}
|
||||
return f;
|
||||
})();
|
||||
try {
|
||||
if (typeof Symbol === "function") {
|
||||
g = (function() {
|
||||
var Int32ArrayView = Int32Array();
|
||||
function f() {
|
||||
Int32ArrayView[Symbol() >> 2]
|
||||
}
|
||||
return f;
|
||||
})();
|
||||
try {
|
||||
g();
|
||||
} catch (e) {}
|
||||
g();
|
||||
} catch (e) {}
|
||||
g();
|
||||
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
if (getBuildConfiguration().parallelJS) {
|
||||
if (getBuildConfiguration().parallelJS && typeof Symbol === "function") {
|
||||
x = Array.buildPar(7, Symbol);
|
||||
Array.prototype.push.call(x, 2);
|
||||
x.mapPar(function(){}, 1)
|
||||
|
@ -1,27 +1,29 @@
|
||||
// test against future pic support for symbols
|
||||
|
||||
// assignments to watched objects must not be cached
|
||||
var obj = {};
|
||||
var x = Symbol.for("x");
|
||||
obj[x] = 0;
|
||||
var hits = 0;
|
||||
obj.watch(x, function (id, oldval, newval) { hits++; return newval; });
|
||||
for (var i = 0; i < 10; i++)
|
||||
obj[x] = i;
|
||||
assertEq(hits, 10);
|
||||
if (typeof Symbol === "function") {
|
||||
// assignments to watched objects must not be cached
|
||||
var obj = {};
|
||||
var x = Symbol.for("x");
|
||||
obj[x] = 0;
|
||||
var hits = 0;
|
||||
obj.watch(x, function (id, oldval, newval) { hits++; return newval; });
|
||||
for (var i = 0; i < 10; i++)
|
||||
obj[x] = i;
|
||||
assertEq(hits, 10);
|
||||
|
||||
// assignments to watched properties via ++ must not be cached
|
||||
hits = 0;
|
||||
for (var i = 0; i < 10; i++)
|
||||
obj[x]++;
|
||||
assertEq(hits, 10);
|
||||
// assignments to watched properties via ++ must not be cached
|
||||
hits = 0;
|
||||
for (var i = 0; i < 10; i++)
|
||||
obj[x]++;
|
||||
assertEq(hits, 10);
|
||||
|
||||
// adding assignment + watchpoint vs. caching
|
||||
hits = 0;
|
||||
obj = {};
|
||||
obj.watch(x, function (id, oldval, newval) { hits++; return newval; });
|
||||
for (var i = 0; i < 10; i++) {
|
||||
obj[x] = 1;
|
||||
delete obj[x];
|
||||
// adding assignment + watchpoint vs. caching
|
||||
hits = 0;
|
||||
obj = {};
|
||||
obj.watch(x, function (id, oldval, newval) { hits++; return newval; });
|
||||
for (var i = 0; i < 10; i++) {
|
||||
obj[x] = 1;
|
||||
delete obj[x];
|
||||
}
|
||||
assertEq(hits, 10);
|
||||
}
|
||||
assertEq(hits, 10);
|
||||
|
@ -15,7 +15,10 @@ function testProxy(p, key) {
|
||||
assertEq(desc.configurable, true);
|
||||
}
|
||||
|
||||
for (var key of ['foo', Symbol("quux")]) {
|
||||
var keys = ['foo'];
|
||||
if (typeof Symbol === "function")
|
||||
keys.push(Symbol("quux"));
|
||||
for (var key of keys) {
|
||||
target = {};
|
||||
testProxy(new Proxy(target, {}), key);
|
||||
target = {};
|
||||
|
@ -23,11 +23,15 @@ var desc = {
|
||||
configurable: true
|
||||
};
|
||||
|
||||
function quux() {
|
||||
return typeof Symbol === "function" ? Symbol.for('quux') : 'quux';
|
||||
}
|
||||
|
||||
for (let p of [new Proxy(target, handler), Proxy.revocable(target, handler).proxy]) {
|
||||
var log = [];
|
||||
Object.defineProperty(p, 'foo', desc);
|
||||
Object.defineProperty(p, Symbol.for('quux'), desc);
|
||||
Object.defineProperty(p, quux(), desc);
|
||||
assertEq(log.length, 2);
|
||||
assertEq(log[0], 'foo');
|
||||
assertEq(log[1], Symbol.for('quux'));
|
||||
assertEq(log[1], quux());
|
||||
}
|
||||
|
@ -5,8 +5,10 @@ for (let p of [new Proxy(target, {}), Proxy.revocable(target, {}).proxy]) {
|
||||
assertEq(p['foo'], 'bar');
|
||||
}
|
||||
|
||||
var s = Symbol.for("moon");
|
||||
var obj = {};
|
||||
obj[s] = "dust";
|
||||
for (let p of [new Proxy(obj, {}), Proxy.revocable(obj, {}).proxy])
|
||||
assertEq(p[s], "dust");
|
||||
if (typeof Symbol === "function") {
|
||||
var s = Symbol.for("moon");
|
||||
var obj = {};
|
||||
obj[s] = "dust";
|
||||
for (let p of [new Proxy(obj, {}), Proxy.revocable(obj, {}).proxy])
|
||||
assertEq(p[s], "dust");
|
||||
}
|
||||
|
@ -4,7 +4,10 @@
|
||||
* as the third argument
|
||||
*/
|
||||
var target = {};
|
||||
for (var key of ['foo', Symbol.iterator]) {
|
||||
var keys = ['foo'];
|
||||
if (typeof Symbol === "function")
|
||||
keys.push(Symbol.iterator);
|
||||
for (var key of keys) {
|
||||
handler = {};
|
||||
for (let p of [new Proxy(target, handler), Proxy.revocable(target, handler).proxy]) {
|
||||
handler.get =
|
||||
|
@ -1,7 +1,9 @@
|
||||
// Return the trap result
|
||||
var target = { foo: 'bar' };
|
||||
var s1 = Symbol("moon"), s2 = Symbol("sun");
|
||||
target[s1] = "wrong";
|
||||
if (typeof Symbol === "function") {
|
||||
var s1 = Symbol("moon"), s2 = Symbol("sun");
|
||||
target[s1] = "wrong";
|
||||
}
|
||||
|
||||
var handler = { };
|
||||
for (let p of [new Proxy(target, handler), Proxy.revocable(target, handler).proxy]) {
|
||||
@ -11,6 +13,8 @@ for (let p of [new Proxy(target, handler), Proxy.revocable(target, handler).prox
|
||||
handler.get = (() => undefined);
|
||||
assertEq(p.foo, undefined);
|
||||
|
||||
handler.get = (() => s2);
|
||||
assertEq(p[s1], s2);
|
||||
if (typeof Symbol === "function") {
|
||||
handler.get = (() => s2);
|
||||
assertEq(p[s1], s2);
|
||||
}
|
||||
}
|
||||
|
@ -21,7 +21,8 @@ var objCD = Object.create(objAB, {
|
||||
}
|
||||
});
|
||||
|
||||
objCD[Symbol("moon")] = "something";
|
||||
if (typeof Symbol === "function")
|
||||
objCD[Symbol("moon")] = "something";
|
||||
for (let p of [new Proxy(objCD, {}), Proxy.revocable(objCD, {}).proxy]) {
|
||||
var names = Object.getOwnPropertyNames(p);
|
||||
assertEq(names.length, 2);
|
||||
|
@ -14,5 +14,6 @@ for (let p of [new Proxy(target, {}), Proxy.revocable(target, {}).proxy]) {
|
||||
assertEq('foo' in p, true);
|
||||
assertEq('bar' in p, true);
|
||||
assertEq('baz' in p, false);
|
||||
assertEq(Symbol() in p, false);
|
||||
if (typeof Symbol === "function")
|
||||
assertEq(Symbol() in p, false);
|
||||
}
|
||||
|
@ -3,7 +3,10 @@
|
||||
* argument, and the name of the property as the second argument
|
||||
*/
|
||||
var target = {};
|
||||
for (var key of ['foo', Symbol('bar')]) {
|
||||
var keys = ['foo'];
|
||||
if (typeof Symbol === "function")
|
||||
keys.push(Symbol('bar'));
|
||||
for (var key of keys) {
|
||||
var called;
|
||||
var handler = {
|
||||
has: function (target1, name) {
|
||||
|
@ -9,5 +9,6 @@ var handler = { has: () => false };
|
||||
|
||||
for (let p of [new Proxy(target, handler), Proxy.revocable(target, handler).proxy]) {
|
||||
assertEq('foo' in p, false);
|
||||
assertEq(Symbol.iterator in p, false);
|
||||
if (typeof Symbol === "function")
|
||||
assertEq(Symbol.iterator in p, false);
|
||||
}
|
||||
|
@ -9,16 +9,19 @@ var descs = {
|
||||
configurable: true
|
||||
}
|
||||
};
|
||||
descs[Symbol.for("quux")] = {configurable: true};
|
||||
if (typeof Symbol === "function")
|
||||
descs[Symbol.for("quux")] = {configurable: true};
|
||||
var target = Object.create(proto, descs);
|
||||
|
||||
for (let p of [new Proxy(target, {}), Proxy.revocable(target, {}).proxy]) {
|
||||
assertEq(({}).hasOwnProperty.call(p, 'foo'), false);
|
||||
assertEq(({}).hasOwnProperty.call(p, 'bar'), true);
|
||||
assertEq(({}).hasOwnProperty.call(p, 'quux'), false);
|
||||
assertEq(({}).hasOwnProperty.call(p, Symbol('quux')), false);
|
||||
assertEq(({}).hasOwnProperty.call(p, 'Symbol(quux)'), false);
|
||||
assertEq(({}).hasOwnProperty.call(p, Symbol.for('quux')), true);
|
||||
if (typeof Symbol === "function") {
|
||||
assertEq(({}).hasOwnProperty.call(p, Symbol('quux')), false);
|
||||
assertEq(({}).hasOwnProperty.call(p, 'Symbol(quux)'), false);
|
||||
assertEq(({}).hasOwnProperty.call(p, Symbol.for('quux')), true);
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure only the getOwnPropertyDescriptor trap is called, and not the has
|
||||
|
@ -10,9 +10,11 @@ for (let p of [new Proxy(target, {}), Proxy.revocable(target, {}).proxy]) {
|
||||
p['foo'] = 'buz';
|
||||
assertEq(target.foo, 'buz');
|
||||
|
||||
var sym = Symbol.for('quux');
|
||||
p[sym] = sym;
|
||||
assertEq(target[sym], sym);
|
||||
// Reset for second iteration
|
||||
target[sym] = undefined;
|
||||
if (typeof Symbol === "function") {
|
||||
var sym = Symbol.for('quux');
|
||||
p[sym] = sym;
|
||||
assertEq(target[sym], sym);
|
||||
// Reset for second iteration
|
||||
target[sym] = undefined;
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,10 @@
|
||||
* third argument, and the receiver as the fourth argument
|
||||
*/
|
||||
var target = {};
|
||||
for (var key of ['foo', Symbol.for('quux')]) {
|
||||
var keys = ['foo'];
|
||||
if (typeof Symbol === "function")
|
||||
keys.push(Symbol.for('quux'));
|
||||
for (var key of keys) {
|
||||
var handler = { };
|
||||
for (let p of [new Proxy(target, handler), Proxy.revocable(target, handler).proxy]) {
|
||||
handler.set = function (target1, name, val, receiver) {
|
||||
|
@ -1,7 +1,10 @@
|
||||
load(libdir + "asserts.js");
|
||||
|
||||
// Throw a TypeError if the trap sets a non-writable, non-configurable property
|
||||
for (var key of ['foo', Symbol.for('quux')]) {
|
||||
var keys = ['foo'];
|
||||
if (typeof Symbol === "function")
|
||||
keys.push(Symbol.for('quux'));
|
||||
for (var key of keys) {
|
||||
var target = {};
|
||||
Object.defineProperty(target, key, {
|
||||
value: 'bar',
|
||||
|
@ -14,22 +14,24 @@ assertNotDeepEq(undefined, null);
|
||||
assertNotDeepEq({}, null);
|
||||
|
||||
// symbols
|
||||
assertDeepEq(Symbol(), Symbol());
|
||||
assertNotDeepEq(Symbol(), Symbol(""));
|
||||
assertDeepEq(Symbol("tweedledum"), Symbol("tweedledum"));
|
||||
assertNotDeepEq(Symbol("tweedledum"), Symbol("alice"));
|
||||
assertNotDeepEq(Symbol("what-its-called"), Symbol.for("what-its-called"));
|
||||
assertNotDeepEq(Symbol.iterator, Symbol.for("Symbol.iterator"));
|
||||
assertDeepEq([Symbol(), Symbol(), Symbol()],
|
||||
[Symbol(), Symbol(), Symbol()]);
|
||||
var sym = Symbol();
|
||||
assertDeepEq([sym, sym], [sym, sym]);
|
||||
assertNotDeepEq([sym, sym], [Symbol(), Symbol()]);
|
||||
assertNotDeepEq([sym, sym], [Symbol(), sym]);
|
||||
var obj1 = {}, obj2 = {};
|
||||
obj1[Symbol("x")] = "y";
|
||||
obj2[Symbol("x")] = "y";
|
||||
assertDeepEq(obj1, obj2);
|
||||
if (typeof Symbol === "function") {
|
||||
assertDeepEq(Symbol(), Symbol());
|
||||
assertNotDeepEq(Symbol(), Symbol(""));
|
||||
assertDeepEq(Symbol("tweedledum"), Symbol("tweedledum"));
|
||||
assertNotDeepEq(Symbol("tweedledum"), Symbol("alice"));
|
||||
assertNotDeepEq(Symbol("what-its-called"), Symbol.for("what-its-called"));
|
||||
assertNotDeepEq(Symbol.iterator, Symbol.for("Symbol.iterator"));
|
||||
assertDeepEq([Symbol(), Symbol(), Symbol()],
|
||||
[Symbol(), Symbol(), Symbol()]);
|
||||
var sym = Symbol();
|
||||
assertDeepEq([sym, sym], [sym, sym]);
|
||||
assertNotDeepEq([sym, sym], [Symbol(), Symbol()]);
|
||||
assertNotDeepEq([sym, sym], [Symbol(), sym]);
|
||||
var obj1 = {}, obj2 = {};
|
||||
obj1[Symbol("x")] = "y";
|
||||
obj2[Symbol("x")] = "y";
|
||||
assertDeepEq(obj1, obj2);
|
||||
}
|
||||
|
||||
// objects
|
||||
assertDeepEq({}, {});
|
||||
|
@ -1,6 +1,12 @@
|
||||
function sym() {
|
||||
return typeof Symbol === "function" ? Symbol() : "non-symbol";
|
||||
}
|
||||
|
||||
function f(x, y) {
|
||||
return x == y;
|
||||
}
|
||||
|
||||
f(1.1, 2.2);
|
||||
for (var i=0; i<5; i++)
|
||||
f(1, Symbol());
|
||||
f(1, sym());
|
||||
|
||||
|
@ -1,7 +1,9 @@
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertEq(!Symbol(), false, "symbols are truthy");
|
||||
var sym = this.Symbol || (() => "truthy");
|
||||
|
||||
var a = [0, 0, 0, 0, 0, Symbol(), Symbol()];
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertEq(!sym(), false, "symbols are truthy");
|
||||
|
||||
var a = [0, 0, 0, 0, 0, sym(), sym()];
|
||||
var b = [];
|
||||
function f(i, v) {
|
||||
b[i] = !v;
|
||||
|
@ -1,36 +1,24 @@
|
||||
load(libdir + "asserts.js");
|
||||
|
||||
var sym = Symbol();
|
||||
|
||||
function add2(x) {
|
||||
return x + 2;
|
||||
}
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertThrowsInstanceOf(() => add2(sym), TypeError);
|
||||
|
||||
function sqr(x) {
|
||||
return x * x;
|
||||
}
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertThrowsInstanceOf(() => sqr(sym), TypeError);
|
||||
|
||||
function bit_or(x) {
|
||||
return x | x;
|
||||
}
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertThrowsInstanceOf(() => bit_or(sym), TypeError);
|
||||
|
||||
function bit_not(x) {
|
||||
return ~x;
|
||||
}
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertThrowsInstanceOf(() => bit_not(sym), TypeError);
|
||||
|
||||
function plus(x) {
|
||||
return +x;
|
||||
}
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertThrowsInstanceOf(() => plus(sym), TypeError);
|
||||
|
||||
function f(a, b) {
|
||||
return a + b;
|
||||
@ -46,8 +34,22 @@ function testPoly() {
|
||||
assertThrowsInstanceOf(() => f(13.719, Symbol("14")), TypeError);
|
||||
}
|
||||
|
||||
for (var i = 0; i < 9; i++)
|
||||
testPoly();
|
||||
if (typeof Symbol === "function") {
|
||||
var sym = Symbol();
|
||||
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertThrowsInstanceOf(() => assertEq(f(Symbol("14"), "40"), NaN), TypeError);
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertThrowsInstanceOf(() => add2(sym), TypeError);
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertThrowsInstanceOf(() => sqr(sym), TypeError);
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertThrowsInstanceOf(() => bit_or(sym), TypeError);
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertThrowsInstanceOf(() => bit_not(sym), TypeError);
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertThrowsInstanceOf(() => plus(sym), TypeError);
|
||||
for (var i = 0; i < 9; i++)
|
||||
testPoly();
|
||||
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertThrowsInstanceOf(() => assertEq(f(Symbol("14"), "40"), NaN), TypeError);
|
||||
}
|
||||
|
@ -1,11 +1,13 @@
|
||||
// ToString(symbol) throws a TypeError.
|
||||
|
||||
var N = 10, obj, hits = 0;
|
||||
for (var i = 0; i < N; i++) {
|
||||
try {
|
||||
obj = new String(Symbol());
|
||||
} catch (exc) {
|
||||
hits++;
|
||||
if (typeof Symbol === "function") {
|
||||
var N = 10, obj, hits = 0;
|
||||
for (var i = 0; i < N; i++) {
|
||||
try {
|
||||
obj = new String(Symbol());
|
||||
} catch (exc) {
|
||||
hits++;
|
||||
}
|
||||
}
|
||||
assertEq(hits, N);
|
||||
}
|
||||
assertEq(hits, N);
|
||||
|
@ -1,7 +1,9 @@
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertEq(Symbol() ? 1 : 0, 1, "symbols are truthy");
|
||||
var sym = this.Symbol || (() => "truthy");
|
||||
|
||||
var a = [0, 0, 0, 0, 0, Symbol(), Symbol()];
|
||||
for (var i = 0; i < 9; i++)
|
||||
assertEq(sym() ? 1 : 0, 1, "symbols are truthy");
|
||||
|
||||
var a = [0, 0, 0, 0, 0, sym(), sym()];
|
||||
var b = [];
|
||||
function f(i, v) {
|
||||
b[i] = v ? "yes" : "no";
|
||||
|
@ -2,9 +2,11 @@ load(libdir + "asserts.js");
|
||||
|
||||
var LENGTH = 1024, SYMBOL_INDEX = 999;
|
||||
|
||||
var sym = this.Symbol ? () => Symbol.for("comet") : () => NaN;
|
||||
|
||||
var big = [];
|
||||
for (var i = 0; i < LENGTH; i++)
|
||||
big[i] = (i === SYMBOL_INDEX ? Symbol.for("comet") : i);
|
||||
big[i] = (i === SYMBOL_INDEX ? sym() : i);
|
||||
|
||||
var progress;
|
||||
function copy(arr, big) {
|
||||
|
@ -1,9 +1,18 @@
|
||||
var a = [0, 0, 0, 0, 0, Symbol(), Symbol()];
|
||||
function sym() {
|
||||
return typeof Symbol === "function" ? Symbol() : "symbol";
|
||||
}
|
||||
|
||||
function typ() {
|
||||
return typeof Symbol === "function" ? "symbol" : "string";
|
||||
}
|
||||
|
||||
var a = [0, 0, 0, 0, 0, sym(), sym()];
|
||||
var b = [];
|
||||
function f(i, v) {
|
||||
b[i] = typeof v;
|
||||
}
|
||||
for (var i = 0; i < a.length; i++)
|
||||
f(i, a[i]);
|
||||
assertEq(b[b.length - 2], "symbol");
|
||||
assertEq(b[b.length - 1], "symbol");
|
||||
assertEq(b[b.length - 2], typ());
|
||||
assertEq(b[b.length - 1], typ());
|
||||
|
||||
|
@ -95,10 +95,12 @@ a = {["x"]: 1, x: 2};
|
||||
assertEq(a.x, 2);
|
||||
|
||||
// Symbols
|
||||
var unique_sym = Symbol("1"), registered_sym = Symbol.for("2");
|
||||
a = { [unique_sym] : 2, [registered_sym] : 3 };
|
||||
assertEq(a[unique_sym], 2);
|
||||
assertEq(a[registered_sym], 3);
|
||||
if (typeof Symbol === "function") {
|
||||
var unique_sym = Symbol("1"), registered_sym = Symbol.for("2");
|
||||
a = { [unique_sym] : 2, [registered_sym] : 3 };
|
||||
assertEq(a[unique_sym], 2);
|
||||
assertEq(a[registered_sym], 3);
|
||||
}
|
||||
|
||||
// Same expression can be run several times to build objects with different property names.
|
||||
a = [];
|
||||
|
@ -102,10 +102,12 @@ assertEq(a.foo3(), 3);
|
||||
assertEq(a.foo4(), 4);
|
||||
|
||||
// Symbols.
|
||||
var unique_sym = Symbol("1"), registered_sym = Symbol.for("2");
|
||||
a = { [unique_sym](){return 2;}, [registered_sym](){return 3;} };
|
||||
assertEq(a[unique_sym](), 2);
|
||||
assertEq(a[registered_sym](), 3);
|
||||
if (typeof Symbol === "function") {
|
||||
var unique_sym = Symbol("1"), registered_sym = Symbol.for("2");
|
||||
a = { [unique_sym](){return 2;}, [registered_sym](){return 3;} };
|
||||
assertEq(a[unique_sym](), 2);
|
||||
assertEq(a[registered_sym](), 3);
|
||||
}
|
||||
|
||||
// Method characteristics.
|
||||
a = { b(){ return 4;} };
|
||||
|
@ -1,33 +1,35 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
var m = new Map;
|
||||
if (typeof Symbol === "function") {
|
||||
var m = new Map;
|
||||
|
||||
// Symbols can be Map keys.
|
||||
var sym = Symbol();
|
||||
m.set(sym, "zero");
|
||||
assertEq(m.has(sym), true);
|
||||
assertEq(m.get(sym), "zero");
|
||||
assertEq(m.has(Symbol()), false);
|
||||
assertEq(m.get(Symbol()), undefined);
|
||||
assertEq([...m][0][0], sym);
|
||||
m.set(sym, "replaced");
|
||||
assertEq(m.get(sym), "replaced");
|
||||
m.delete(sym);
|
||||
assertEq(m.has(sym), false);
|
||||
assertEq(m.size, 0);
|
||||
// Symbols can be Map keys.
|
||||
var sym = Symbol();
|
||||
m.set(sym, "zero");
|
||||
assertEq(m.has(sym), true);
|
||||
assertEq(m.get(sym), "zero");
|
||||
assertEq(m.has(Symbol()), false);
|
||||
assertEq(m.get(Symbol()), undefined);
|
||||
assertEq([...m][0][0], sym);
|
||||
m.set(sym, "replaced");
|
||||
assertEq(m.get(sym), "replaced");
|
||||
m.delete(sym);
|
||||
assertEq(m.has(sym), false);
|
||||
assertEq(m.size, 0);
|
||||
|
||||
// Symbols returned by Symbol.for() can be Map keys.
|
||||
for (var word of "that that is is that that is not is not is that not it".split(' ')) {
|
||||
sym = Symbol.for(word);
|
||||
m.set(sym, (m.get(sym) || 0) + 1);
|
||||
// Symbols returned by Symbol.for() can be Map keys.
|
||||
for (var word of "that that is is that that is not is not is that not it".split(' ')) {
|
||||
sym = Symbol.for(word);
|
||||
m.set(sym, (m.get(sym) || 0) + 1);
|
||||
}
|
||||
assertDeepEq([...m], [
|
||||
[Symbol.for("that"), 5],
|
||||
[Symbol.for("is"), 5],
|
||||
[Symbol.for("not"), 3],
|
||||
[Symbol.for("it"), 1]
|
||||
]);
|
||||
}
|
||||
assertDeepEq([...m], [
|
||||
[Symbol.for("that"), 5],
|
||||
[Symbol.for("is"), 5],
|
||||
[Symbol.for("not"), 3],
|
||||
[Symbol.for("it"), 1]
|
||||
]);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -36,7 +36,8 @@ function basicSymbols() {
|
||||
assertEq(a.bProp, 7);
|
||||
assertEq(a[aSymbol], 22);
|
||||
}
|
||||
basicSymbols();
|
||||
if (typeof Symbol === "function")
|
||||
basicSymbols();
|
||||
|
||||
// Calls ToObject() for target, skips null/undefined sources, uses
|
||||
// ToObject(source) otherwise.
|
||||
|
@ -1,11 +1,6 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// getOwnPropertySymbols(proxy) calls the getOwnPropertyNames hook (only).
|
||||
|
||||
var symbols = [Symbol(), Symbol("moon"), Symbol.for("sun"), Symbol.iterator];
|
||||
var hits = 0;
|
||||
|
||||
function HandlerProxy() {
|
||||
return new Proxy({}, {
|
||||
get: function (t, key) {
|
||||
@ -21,8 +16,15 @@ function OwnKeysProxy() {
|
||||
return new Proxy({}, new HandlerProxy);
|
||||
}
|
||||
|
||||
assertDeepEq(Object.getOwnPropertySymbols(new OwnKeysProxy), symbols);
|
||||
assertEq(hits, 1);
|
||||
if (typeof Symbol === "function") {
|
||||
// getOwnPropertySymbols(proxy) calls the getOwnPropertyNames hook (only).
|
||||
|
||||
var symbols = [Symbol(), Symbol("moon"), Symbol.for("sun"), Symbol.iterator];
|
||||
var hits = 0;
|
||||
|
||||
assertDeepEq(Object.getOwnPropertySymbols(new OwnKeysProxy), symbols);
|
||||
assertEq(hits, 1);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,46 +1,48 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
assertDeepEq(Object.getOwnPropertySymbols({}), []);
|
||||
if (typeof Symbol === "function") {
|
||||
assertDeepEq(Object.getOwnPropertySymbols({}), []);
|
||||
|
||||
// String keys are ignored.
|
||||
assertEq(Object.getOwnPropertySymbols({a: 1, b: 2}).length, 0);
|
||||
assertEq(Object.getOwnPropertySymbols([0, 1, 2, 3]).length, 0);
|
||||
// String keys are ignored.
|
||||
assertEq(Object.getOwnPropertySymbols({a: 1, b: 2}).length, 0);
|
||||
assertEq(Object.getOwnPropertySymbols([0, 1, 2, 3]).length, 0);
|
||||
|
||||
// Symbol keys are observed.
|
||||
var iterable = {};
|
||||
Object.defineProperty(iterable, Symbol.iterator, {
|
||||
value: () => [][Symbol.iterator]()
|
||||
});
|
||||
assertDeepEq(Object.getOwnPropertySymbols(iterable), [Symbol.iterator]);
|
||||
assertDeepEq(Object.getOwnPropertySymbols(new Proxy(iterable, {})), [Symbol.iterator]);
|
||||
// Symbol keys are observed.
|
||||
var iterable = {};
|
||||
Object.defineProperty(iterable, Symbol.iterator, {
|
||||
value: () => [][Symbol.iterator]()
|
||||
});
|
||||
assertDeepEq(Object.getOwnPropertySymbols(iterable), [Symbol.iterator]);
|
||||
assertDeepEq(Object.getOwnPropertySymbols(new Proxy(iterable, {})), [Symbol.iterator]);
|
||||
|
||||
// Test on an object with a thousand own properties.
|
||||
var obj = {};
|
||||
for (var i = 0; i < 1000; i++) {
|
||||
obj[Symbol.for("x" + i)] = 1;
|
||||
// Test on an object with a thousand own properties.
|
||||
var obj = {};
|
||||
for (var i = 0; i < 1000; i++) {
|
||||
obj[Symbol.for("x" + i)] = 1;
|
||||
}
|
||||
assertEq(Object.getOwnPropertyNames(obj).length, 0);
|
||||
var symbols = Object.getOwnPropertySymbols(obj);
|
||||
assertEq(symbols.length, 1000);
|
||||
assertEq(symbols.indexOf(Symbol.for("x0")) !== -1, true);
|
||||
assertEq(symbols.indexOf(Symbol.for("x241")) !== -1, true);
|
||||
assertEq(symbols.indexOf(Symbol.for("x999")) !== -1, true);
|
||||
assertEq(Object.getOwnPropertySymbols(new Proxy(obj, {})).length, 1000);
|
||||
|
||||
// The prototype chain is not consulted.
|
||||
assertEq(Object.getOwnPropertySymbols(Object.create(obj)).length, 0);
|
||||
assertEq(Object.getOwnPropertySymbols(new Proxy(Object.create(obj), {})).length, 0);
|
||||
|
||||
// Primitives are coerced to objects; but there are never any symbol-keyed
|
||||
// properties on the resulting wrapper objects.
|
||||
assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(), TypeError);
|
||||
assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(undefined), TypeError);
|
||||
assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(null), TypeError);
|
||||
for (var primitive of [true, 1, 3.14, "hello", Symbol()])
|
||||
assertEq(Object.getOwnPropertySymbols(primitive).length, 0);
|
||||
|
||||
assertEq(Object.getOwnPropertySymbols.length, 1);
|
||||
}
|
||||
assertEq(Object.getOwnPropertyNames(obj).length, 0);
|
||||
var symbols = Object.getOwnPropertySymbols(obj);
|
||||
assertEq(symbols.length, 1000);
|
||||
assertEq(symbols.indexOf(Symbol.for("x0")) !== -1, true);
|
||||
assertEq(symbols.indexOf(Symbol.for("x241")) !== -1, true);
|
||||
assertEq(symbols.indexOf(Symbol.for("x999")) !== -1, true);
|
||||
assertEq(Object.getOwnPropertySymbols(new Proxy(obj, {})).length, 1000);
|
||||
|
||||
// The prototype chain is not consulted.
|
||||
assertEq(Object.getOwnPropertySymbols(Object.create(obj)).length, 0);
|
||||
assertEq(Object.getOwnPropertySymbols(new Proxy(Object.create(obj), {})).length, 0);
|
||||
|
||||
// Primitives are coerced to objects; but there are never any symbol-keyed
|
||||
// properties on the resulting wrapper objects.
|
||||
assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(), TypeError);
|
||||
assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(undefined), TypeError);
|
||||
assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(null), TypeError);
|
||||
for (var primitive of [true, 1, 3.14, "hello", Symbol()])
|
||||
assertEq(Object.getOwnPropertySymbols(primitive).length, 0);
|
||||
|
||||
assertEq(Object.getOwnPropertySymbols.length, 1);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,27 +1,29 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
var s = new Set;
|
||||
if (typeof Symbol === "function") {
|
||||
var s = new Set;
|
||||
|
||||
// Symbols can be stored in Sets.
|
||||
var sym = Symbol();
|
||||
s.add(sym);
|
||||
assertEq(s.has(sym), true);
|
||||
assertEq(s.has(Symbol()), false);
|
||||
assertEq([...s][0], sym);
|
||||
s.add(sym);
|
||||
assertEq(s.has(sym), true);
|
||||
assertEq(s.size, 1);
|
||||
s.delete(sym);
|
||||
assertEq(s.has(sym), false);
|
||||
assertEq(s.size, 0);
|
||||
// Symbols can be stored in Sets.
|
||||
var sym = Symbol();
|
||||
s.add(sym);
|
||||
assertEq(s.has(sym), true);
|
||||
assertEq(s.has(Symbol()), false);
|
||||
assertEq([...s][0], sym);
|
||||
s.add(sym);
|
||||
assertEq(s.has(sym), true);
|
||||
assertEq(s.size, 1);
|
||||
s.delete(sym);
|
||||
assertEq(s.has(sym), false);
|
||||
assertEq(s.size, 0);
|
||||
|
||||
// Symbols returned by Symbol.for() can be in Sets.
|
||||
var str = "how much wood would a woodchuck chuck if a woodchuck could chuck wood";
|
||||
var s2 = "how much wood would a woodchuck chuck if could";
|
||||
var arr = [for (word of str.split(" ")) Symbol.for(word)];
|
||||
s = new Set(arr);
|
||||
assertDeepEq([...s], [for (word of s2.split(" ")) Symbol.for(word)]);
|
||||
// Symbols returned by Symbol.for() can be in Sets.
|
||||
var str = "how much wood would a woodchuck chuck if a woodchuck could chuck wood";
|
||||
var s2 = "how much wood would a woodchuck chuck if could";
|
||||
var arr = [for (word of str.split(" ")) Symbol.for(word)];
|
||||
s = new Set(arr);
|
||||
assertDeepEq([...s], [for (word of s2.split(" ")) Symbol.for(word)]);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,88 +1,90 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// Like other primitives, symbols can be treated as objects, using object-like
|
||||
// syntax: `symbol.prop` or `symbol[key]`.
|
||||
//
|
||||
// In ECMAScript spec jargon, this creates a Reference whose base value is a
|
||||
// primitive Symbol value.
|
||||
if (typeof Symbol === "function") {
|
||||
// Like other primitives, symbols can be treated as objects, using object-like
|
||||
// syntax: `symbol.prop` or `symbol[key]`.
|
||||
//
|
||||
// In ECMAScript spec jargon, this creates a Reference whose base value is a
|
||||
// primitive Symbol value.
|
||||
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol("ponies"),
|
||||
Symbol.for("sym"),
|
||||
Symbol.iterator
|
||||
];
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol("ponies"),
|
||||
Symbol.for("sym"),
|
||||
Symbol.iterator
|
||||
];
|
||||
|
||||
// Test accessor property, used below.
|
||||
var gets, sets;
|
||||
Object.defineProperty(Symbol.prototype, "prop", {
|
||||
get: function () {
|
||||
"use strict";
|
||||
gets++;
|
||||
assertEq(typeof this, "object");
|
||||
assertEq(this instanceof Symbol, true);
|
||||
assertEq(this.valueOf(), sym);
|
||||
return "got";
|
||||
},
|
||||
set: function (v) {
|
||||
"use strict";
|
||||
sets++;
|
||||
assertEq(typeof this, "object");
|
||||
assertEq(this instanceof Symbol, true);
|
||||
assertEq(this.valueOf(), sym);
|
||||
assertEq(v, "newvalue");
|
||||
// Test accessor property, used below.
|
||||
var gets, sets;
|
||||
Object.defineProperty(Symbol.prototype, "prop", {
|
||||
get: function () {
|
||||
"use strict";
|
||||
gets++;
|
||||
assertEq(typeof this, "object");
|
||||
assertEq(this instanceof Symbol, true);
|
||||
assertEq(this.valueOf(), sym);
|
||||
return "got";
|
||||
},
|
||||
set: function (v) {
|
||||
"use strict";
|
||||
sets++;
|
||||
assertEq(typeof this, "object");
|
||||
assertEq(this instanceof Symbol, true);
|
||||
assertEq(this.valueOf(), sym);
|
||||
assertEq(v, "newvalue");
|
||||
}
|
||||
});
|
||||
|
||||
for (var sym of symbols) {
|
||||
assertEq(sym.constructor, Symbol);
|
||||
|
||||
// method on Object.prototype
|
||||
assertEq(sym.hasOwnProperty("constructor"), false);
|
||||
assertEq(sym.toLocaleString(), sym.toString()); // once .toString() exists
|
||||
|
||||
// custom method monkeypatched onto Symbol.prototype
|
||||
Symbol.prototype.nonStrictMethod = function (arg) {
|
||||
assertEq(arg, "ok");
|
||||
assertEq(this instanceof Symbol, true);
|
||||
assertEq(this.valueOf(), sym);
|
||||
return 13;
|
||||
};
|
||||
assertEq(sym.nonStrictMethod("ok"), 13);
|
||||
|
||||
// the same, but strict mode
|
||||
Symbol.prototype.strictMethod = function (arg) {
|
||||
"use strict";
|
||||
assertEq(arg, "ok2");
|
||||
assertEq(this, sym);
|
||||
return 14;
|
||||
};
|
||||
assertEq(sym.strictMethod("ok2"), 14);
|
||||
|
||||
// getter/setter on Symbol.prototype
|
||||
gets = 0;
|
||||
sets = 0;
|
||||
var propname = "prop";
|
||||
|
||||
assertEq(sym.prop, "got");
|
||||
assertEq(gets, 1);
|
||||
assertEq(sym[propname], "got");
|
||||
assertEq(gets, 2);
|
||||
|
||||
assertEq(sym.prop = "newvalue", "newvalue");
|
||||
assertEq(sets, 1);
|
||||
assertEq(sym[propname] = "newvalue", "newvalue");
|
||||
assertEq(sets, 2);
|
||||
|
||||
// non-existent property
|
||||
assertEq(sym.noSuchProp, undefined);
|
||||
var noSuchPropName = "nonesuch";
|
||||
assertEq(sym[noSuchPropName], undefined);
|
||||
|
||||
// non-existent method
|
||||
assertThrowsInstanceOf(() => sym.noSuchProp(), TypeError);
|
||||
assertThrowsInstanceOf(() => sym[noSuchPropName](), TypeError);
|
||||
}
|
||||
});
|
||||
|
||||
for (var sym of symbols) {
|
||||
assertEq(sym.constructor, Symbol);
|
||||
|
||||
// method on Object.prototype
|
||||
assertEq(sym.hasOwnProperty("constructor"), false);
|
||||
assertEq(sym.toLocaleString(), sym.toString()); // once .toString() exists
|
||||
|
||||
// custom method monkeypatched onto Symbol.prototype
|
||||
Symbol.prototype.nonStrictMethod = function (arg) {
|
||||
assertEq(arg, "ok");
|
||||
assertEq(this instanceof Symbol, true);
|
||||
assertEq(this.valueOf(), sym);
|
||||
return 13;
|
||||
};
|
||||
assertEq(sym.nonStrictMethod("ok"), 13);
|
||||
|
||||
// the same, but strict mode
|
||||
Symbol.prototype.strictMethod = function (arg) {
|
||||
"use strict";
|
||||
assertEq(arg, "ok2");
|
||||
assertEq(this, sym);
|
||||
return 14;
|
||||
};
|
||||
assertEq(sym.strictMethod("ok2"), 14);
|
||||
|
||||
// getter/setter on Symbol.prototype
|
||||
gets = 0;
|
||||
sets = 0;
|
||||
var propname = "prop";
|
||||
|
||||
assertEq(sym.prop, "got");
|
||||
assertEq(gets, 1);
|
||||
assertEq(sym[propname], "got");
|
||||
assertEq(gets, 2);
|
||||
|
||||
assertEq(sym.prop = "newvalue", "newvalue");
|
||||
assertEq(sets, 1);
|
||||
assertEq(sym[propname] = "newvalue", "newvalue");
|
||||
assertEq(sets, 2);
|
||||
|
||||
// non-existent property
|
||||
assertEq(sym.noSuchProp, undefined);
|
||||
var noSuchPropName = "nonesuch";
|
||||
assertEq(sym[noSuchPropName], undefined);
|
||||
|
||||
// non-existent method
|
||||
assertThrowsInstanceOf(() => sym.noSuchProp(), TypeError);
|
||||
assertThrowsInstanceOf(() => sym[noSuchPropName](), TypeError);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
|
@ -1,32 +1,34 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol("0"),
|
||||
Symbol.for("snowman"),
|
||||
Symbol.iterator
|
||||
];
|
||||
if (typeof Symbol === "function") {
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol("0"),
|
||||
Symbol.for("snowman"),
|
||||
Symbol.iterator
|
||||
];
|
||||
|
||||
var values = [
|
||||
undefined, null, 0, 3.14, -0, NaN, "", "alphabet", Symbol("0"),
|
||||
{}, []
|
||||
];
|
||||
var values = [
|
||||
undefined, null, 0, 3.14, -0, NaN, "", "alphabet", Symbol("0"),
|
||||
{}, []
|
||||
];
|
||||
|
||||
for (var comparator of ["==", "!=", "===", "!=="]) {
|
||||
var f = Function("a, b", "return a " + comparator + " b;");
|
||||
var expected = (comparator[0] == '!');
|
||||
for (var a of symbols) {
|
||||
for (var b of values)
|
||||
assertEq(f(a, b), expected);
|
||||
for (var comparator of ["==", "!=", "===", "!=="]) {
|
||||
var f = Function("a, b", "return a " + comparator + " b;");
|
||||
var expected = (comparator[0] == '!');
|
||||
for (var a of symbols) {
|
||||
for (var b of values)
|
||||
assertEq(f(a, b), expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (var comparator of ["<", "<=", ">", ">="]) {
|
||||
var f = Function("a, b", "return a " + comparator + " b;");
|
||||
for (var a of symbols) {
|
||||
for (var b of values)
|
||||
assertThrowsInstanceOf(() => f(a, b), TypeError);
|
||||
for (var comparator of ["<", "<=", ">", ">="]) {
|
||||
var f = Function("a, b", "return a " + comparator + " b;");
|
||||
for (var a of symbols) {
|
||||
for (var b of values)
|
||||
assertThrowsInstanceOf(() => f(a, b), TypeError);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,35 +1,37 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// Symbol(symbol) throws a TypeError.
|
||||
var sym = Symbol();
|
||||
assertThrowsInstanceOf(() => Symbol(sym), TypeError);
|
||||
if (typeof Symbol === "function") {
|
||||
// Symbol(symbol) throws a TypeError.
|
||||
var sym = Symbol();
|
||||
assertThrowsInstanceOf(() => Symbol(sym), TypeError);
|
||||
|
||||
// Symbol(undefined) is equivalent to Symbol().
|
||||
assertEq(Symbol(undefined).toString(), "Symbol()");
|
||||
// Symbol(undefined) is equivalent to Symbol().
|
||||
assertEq(Symbol(undefined).toString(), "Symbol()");
|
||||
|
||||
// Otherwise, Symbol(v) means Symbol(ToString(v)).
|
||||
assertEq(Symbol(7).toString(), "Symbol(7)");
|
||||
assertEq(Symbol(true).toString(), "Symbol(true)");
|
||||
assertEq(Symbol(null).toString(), "Symbol(null)");
|
||||
assertEq(Symbol([1, 2]).toString(), "Symbol(1,2)");
|
||||
var symobj = Object(sym);
|
||||
assertThrowsInstanceOf(() => Symbol(symobj), TypeError);
|
||||
// Otherwise, Symbol(v) means Symbol(ToString(v)).
|
||||
assertEq(Symbol(7).toString(), "Symbol(7)");
|
||||
assertEq(Symbol(true).toString(), "Symbol(true)");
|
||||
assertEq(Symbol(null).toString(), "Symbol(null)");
|
||||
assertEq(Symbol([1, 2]).toString(), "Symbol(1,2)");
|
||||
var symobj = Object(sym);
|
||||
assertThrowsInstanceOf(() => Symbol(symobj), TypeError);
|
||||
|
||||
var hits = 0;
|
||||
var obj = {
|
||||
toString: function () {
|
||||
hits++;
|
||||
return "ponies";
|
||||
}
|
||||
};
|
||||
assertEq(Symbol(obj).toString(), "Symbol(ponies)");
|
||||
assertEq(hits, 1);
|
||||
var hits = 0;
|
||||
var obj = {
|
||||
toString: function () {
|
||||
hits++;
|
||||
return "ponies";
|
||||
}
|
||||
};
|
||||
assertEq(Symbol(obj).toString(), "Symbol(ponies)");
|
||||
assertEq(hits, 1);
|
||||
|
||||
assertEq(Object.getPrototypeOf(Symbol.prototype), Object.prototype);
|
||||
assertEq(Object.getPrototypeOf(Symbol.prototype), Object.prototype);
|
||||
|
||||
// Symbol.prototype is not itself a Symbol object.
|
||||
assertThrowsInstanceOf(() => Symbol.prototype.valueOf(), TypeError);
|
||||
// Symbol.prototype is not itself a Symbol object.
|
||||
assertThrowsInstanceOf(() => Symbol.prototype.valueOf(), TypeError);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,59 +1,61 @@
|
||||
// Section numbers cite ES6 rev 24 (2014 April 27).
|
||||
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol("one"),
|
||||
Symbol.for("two"),
|
||||
Symbol.iterator
|
||||
];
|
||||
if (typeof Symbol === "function") {
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol("one"),
|
||||
Symbol.for("two"),
|
||||
Symbol.iterator
|
||||
];
|
||||
|
||||
if (Symbol.toPrimitive in Symbol.prototype) {
|
||||
// We should test that deleting Symbol.prototype[@@toPrimitive] changes the
|
||||
// behavior of ToPrimitive on Symbol objects, but @@toPrimitive is not
|
||||
// implemented yet.
|
||||
throw new Error("Congratulations on implementing @@toPrimitive! Please update this test.");
|
||||
}
|
||||
if (Symbol.toPrimitive in Symbol.prototype) {
|
||||
// We should test that deleting Symbol.prototype[@@toPrimitive] changes the
|
||||
// behavior of ToPrimitive on Symbol objects, but @@toPrimitive is not
|
||||
// implemented yet.
|
||||
throw new Error("Congratulations on implementing @@toPrimitive! Please update this test.");
|
||||
}
|
||||
|
||||
for (var sym of symbols) {
|
||||
// 7.1.1 ToPrimitive
|
||||
var symobj = Object(sym);
|
||||
assertThrowsInstanceOf(() => Number(symobj), TypeError);
|
||||
assertThrowsInstanceOf(() => String(symobj), TypeError);
|
||||
assertThrowsInstanceOf(() => symobj < 0, TypeError);
|
||||
assertThrowsInstanceOf(() => 0 < symobj, TypeError);
|
||||
assertThrowsInstanceOf(() => symobj + 1, TypeError);
|
||||
assertThrowsInstanceOf(() => "" + symobj, TypeError);
|
||||
assertEq(sym == symobj, true);
|
||||
assertEq(sym === symobj, false);
|
||||
assertEq(symobj == 0, false);
|
||||
assertEq(0 != symobj, true);
|
||||
for (var sym of symbols) {
|
||||
// 7.1.1 ToPrimitive
|
||||
var symobj = Object(sym);
|
||||
assertThrowsInstanceOf(() => Number(symobj), TypeError);
|
||||
assertThrowsInstanceOf(() => String(symobj), TypeError);
|
||||
assertThrowsInstanceOf(() => symobj < 0, TypeError);
|
||||
assertThrowsInstanceOf(() => 0 < symobj, TypeError);
|
||||
assertThrowsInstanceOf(() => symobj + 1, TypeError);
|
||||
assertThrowsInstanceOf(() => "" + symobj, TypeError);
|
||||
assertEq(sym == symobj, true);
|
||||
assertEq(sym === symobj, false);
|
||||
assertEq(symobj == 0, false);
|
||||
assertEq(0 != symobj, true);
|
||||
|
||||
// 7.1.2 ToBoolean
|
||||
assertEq(Boolean(sym), true);
|
||||
assertEq(!sym, false);
|
||||
assertEq(sym || 13, sym);
|
||||
assertEq(sym && 13, 13);
|
||||
// 7.1.2 ToBoolean
|
||||
assertEq(Boolean(sym), true);
|
||||
assertEq(!sym, false);
|
||||
assertEq(sym || 13, sym);
|
||||
assertEq(sym && 13, 13);
|
||||
|
||||
// 7.1.3 ToNumber
|
||||
assertThrowsInstanceOf(() => +sym, TypeError);
|
||||
assertThrowsInstanceOf(() => sym | 0, TypeError);
|
||||
// 7.1.3 ToNumber
|
||||
assertThrowsInstanceOf(() => +sym, TypeError);
|
||||
assertThrowsInstanceOf(() => sym | 0, TypeError);
|
||||
|
||||
// 7.1.12 ToString
|
||||
assertThrowsInstanceOf(() => String(sym), TypeError);
|
||||
assertThrowsInstanceOf(() => "" + sym, TypeError);
|
||||
assertThrowsInstanceOf(() => sym + "", TypeError);
|
||||
assertThrowsInstanceOf(() => "" + [1, 2, Symbol()], TypeError);
|
||||
assertThrowsInstanceOf(() => ["simple", "thimble", Symbol()].join(), TypeError);
|
||||
// 7.1.12 ToString
|
||||
assertThrowsInstanceOf(() => String(sym), TypeError);
|
||||
assertThrowsInstanceOf(() => "" + sym, TypeError);
|
||||
assertThrowsInstanceOf(() => sym + "", TypeError);
|
||||
assertThrowsInstanceOf(() => "" + [1, 2, Symbol()], TypeError);
|
||||
assertThrowsInstanceOf(() => ["simple", "thimble", Symbol()].join(), TypeError);
|
||||
|
||||
// 7.1.13 ToObject
|
||||
var obj = Object(sym);
|
||||
assertEq(typeof obj, "object");
|
||||
assertEq(Object.prototype.toString.call(obj), "[object Symbol]");
|
||||
assertEq(Object.getPrototypeOf(obj), Symbol.prototype);
|
||||
assertEq(Object.getOwnPropertyNames(obj).length, 0);
|
||||
assertEq(Object(sym) === Object(sym), false); // new object each time
|
||||
var f = function () { return this; };
|
||||
assertEq(f.call(sym) === f.call(sym), false); // new object each time
|
||||
// 7.1.13 ToObject
|
||||
var obj = Object(sym);
|
||||
assertEq(typeof obj, "object");
|
||||
assertEq(Object.prototype.toString.call(obj), "[object Symbol]");
|
||||
assertEq(Object.getPrototypeOf(obj), Symbol.prototype);
|
||||
assertEq(Object.getOwnPropertyNames(obj).length, 0);
|
||||
assertEq(Object(sym) === Object(sym), false); // new object each time
|
||||
var f = function () { return this; };
|
||||
assertEq(f.call(sym) === f.call(sym), false); // new object each time
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
|
@ -1,8 +1,6 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// ES6 draft rev 25 (2014 May 22), 9.1.12 "[[OwnPropertyKeys]] ()":
|
||||
//
|
||||
var log;
|
||||
function LoggingProxy() {
|
||||
return new Proxy({}, {
|
||||
@ -13,18 +11,6 @@ function LoggingProxy() {
|
||||
});
|
||||
}
|
||||
|
||||
var keys = [
|
||||
"before",
|
||||
Symbol(),
|
||||
"during",
|
||||
Symbol.for("during"),
|
||||
Symbol.iterator,
|
||||
"after"
|
||||
];
|
||||
var descs = {};
|
||||
for (var k of keys)
|
||||
descs[k] = {configurable: true, value: 0};
|
||||
|
||||
function test(descsObj) {
|
||||
log = [];
|
||||
Object.defineProperties(LoggingProxy(), descs);
|
||||
@ -34,8 +20,24 @@ function test(descsObj) {
|
||||
assertEq(log.indexOf(key) !== -1, true);
|
||||
}
|
||||
|
||||
test(descs);
|
||||
test(new Proxy(descs, {}));
|
||||
if (typeof Symbol === "function") {
|
||||
// ES6 draft rev 25 (2014 May 22), 9.1.12 "[[OwnPropertyKeys]] ()":
|
||||
|
||||
var keys = [
|
||||
"before",
|
||||
Symbol(),
|
||||
"during",
|
||||
Symbol.for("during"),
|
||||
Symbol.iterator,
|
||||
"after"
|
||||
];
|
||||
var descs = {};
|
||||
for (var k of keys)
|
||||
descs[k] = {configurable: true, value: 0};
|
||||
|
||||
test(descs);
|
||||
test(new Proxy(descs, {}));
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,52 +1,54 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// for-in loops skip properties with symbol keys, even enumerable properties.
|
||||
var obj = {};
|
||||
obj[Symbol.for("moon")] = "sun";
|
||||
obj[Symbol("asleep")] = "awake";
|
||||
obj[Symbol.iterator] = "List";
|
||||
for (var x in obj)
|
||||
throw "FAIL: " + uneval(x);
|
||||
if (typeof Symbol === "function") {
|
||||
// for-in loops skip properties with symbol keys, even enumerable properties.
|
||||
var obj = {};
|
||||
obj[Symbol.for("moon")] = "sun";
|
||||
obj[Symbol("asleep")] = "awake";
|
||||
obj[Symbol.iterator] = "List";
|
||||
for (var x in obj)
|
||||
throw "FAIL: " + uneval(x);
|
||||
|
||||
// This includes inherited properties.
|
||||
var obj2 = Object.create(obj);
|
||||
for (var x in obj2)
|
||||
throw "FAIL: " + uneval(x);
|
||||
// This includes inherited properties.
|
||||
var obj2 = Object.create(obj);
|
||||
for (var x in obj2)
|
||||
throw "FAIL: " + uneval(x);
|
||||
|
||||
// The same goes for proxies.
|
||||
var p = new Proxy(obj, {});
|
||||
for (var x in p)
|
||||
throw "FAIL: " + uneval(x);
|
||||
var p2 = new Proxy(obj2, {});
|
||||
for (var x in p2)
|
||||
throw "FAIL: " + uneval(x);
|
||||
// The same goes for proxies.
|
||||
var p = new Proxy(obj, {});
|
||||
for (var x in p)
|
||||
throw "FAIL: " + uneval(x);
|
||||
var p2 = new Proxy(obj2, {});
|
||||
for (var x in p2)
|
||||
throw "FAIL: " + uneval(x);
|
||||
|
||||
// Object.keys() and .getOwnPropertyNames() also skip symbols.
|
||||
assertEq(Object.keys(obj).length, 0);
|
||||
assertEq(Object.keys(p).length, 0);
|
||||
assertEq(Object.keys(obj2).length, 0);
|
||||
assertEq(Object.keys(p2).length, 0);
|
||||
assertEq(Object.getOwnPropertyNames(obj).length, 0);
|
||||
assertEq(Object.getOwnPropertyNames(p).length, 0);
|
||||
assertEq(Object.getOwnPropertyNames(obj2).length, 0);
|
||||
assertEq(Object.getOwnPropertyNames(p2).length, 0);
|
||||
// Object.keys() and .getOwnPropertyNames() also skip symbols.
|
||||
assertEq(Object.keys(obj).length, 0);
|
||||
assertEq(Object.keys(p).length, 0);
|
||||
assertEq(Object.keys(obj2).length, 0);
|
||||
assertEq(Object.keys(p2).length, 0);
|
||||
assertEq(Object.getOwnPropertyNames(obj).length, 0);
|
||||
assertEq(Object.getOwnPropertyNames(p).length, 0);
|
||||
assertEq(Object.getOwnPropertyNames(obj2).length, 0);
|
||||
assertEq(Object.getOwnPropertyNames(p2).length, 0);
|
||||
|
||||
// Test interaction of Object.keys(), proxies, and symbol property keys.
|
||||
var log = [];
|
||||
var h = {
|
||||
ownKeys: (t) => {
|
||||
log.push("ownKeys");
|
||||
return ["a", "0", Symbol.for("moon"), Symbol("asleep"), Symbol.iterator];
|
||||
},
|
||||
getOwnPropertyDescriptor: (t, key) => {
|
||||
log.push("gopd", key);
|
||||
return {configurable: true, enumerable: true, value: 0, writable: true};
|
||||
}
|
||||
};
|
||||
p = new Proxy({}, h);
|
||||
assertDeepEq(Object.keys(p), ["a", "0"]);
|
||||
assertDeepEq(log, ["ownKeys", "gopd", "a", "gopd", "0"]);
|
||||
// Test interaction of Object.keys(), proxies, and symbol property keys.
|
||||
var log = [];
|
||||
var h = {
|
||||
ownKeys: (t) => {
|
||||
log.push("ownKeys");
|
||||
return ["a", "0", Symbol.for("moon"), Symbol("asleep"), Symbol.iterator];
|
||||
},
|
||||
getOwnPropertyDescriptor: (t, key) => {
|
||||
log.push("gopd", key);
|
||||
return {configurable: true, enumerable: true, value: 0, writable: true};
|
||||
}
|
||||
};
|
||||
p = new Proxy({}, h);
|
||||
assertDeepEq(Object.keys(p), ["a", "0"]);
|
||||
assertDeepEq(log, ["ownKeys", "gopd", "a", "gopd", "0"]);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,27 +1,29 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// Symbol.for returns the same symbol whenever the same argument is passed.
|
||||
assertEq(Symbol.for("q") === Symbol.for("q"), true);
|
||||
if (typeof Symbol === "function") {
|
||||
// Symbol.for returns the same symbol whenever the same argument is passed.
|
||||
assertEq(Symbol.for("q") === Symbol.for("q"), true);
|
||||
|
||||
// Several distinct Symbol values.
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol("Symbol.iterator"),
|
||||
Symbol("Symbol.iterator"), // distinct new symbol with the same description
|
||||
Symbol.for("Symbol.iterator")
|
||||
];
|
||||
// Several distinct Symbol values.
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol("Symbol.iterator"),
|
||||
Symbol("Symbol.iterator"), // distinct new symbol with the same description
|
||||
Symbol.for("Symbol.iterator")
|
||||
];
|
||||
|
||||
// Distinct symbols are never equal to each other, even if they have the same
|
||||
// description.
|
||||
for (var i = 0; i < symbols.length; i++) {
|
||||
for (var j = i; j < symbols.length; j++) {
|
||||
var expected = (i === j);
|
||||
assertEq(symbols[i] == symbols[j], expected);
|
||||
assertEq(symbols[i] != symbols[j], !expected);
|
||||
assertEq(symbols[i] === symbols[j], expected);
|
||||
assertEq(symbols[i] !== symbols[j], !expected);
|
||||
assertEq(Object.is(symbols[i], symbols[j]), expected);
|
||||
// Distinct symbols are never equal to each other, even if they have the same
|
||||
// description.
|
||||
for (var i = 0; i < symbols.length; i++) {
|
||||
for (var j = i; j < symbols.length; j++) {
|
||||
var expected = (i === j);
|
||||
assertEq(symbols[i] == symbols[j], expected);
|
||||
assertEq(symbols[i] != symbols[j], !expected);
|
||||
assertEq(symbols[i] === symbols[j], expected);
|
||||
assertEq(symbols[i] !== symbols[j], !expected);
|
||||
assertEq(Object.is(symbols[i], symbols[j]), expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,17 +1,19 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// Section numbers cite ES6 rev 24 (2014 April 27).
|
||||
if (typeof Symbol === "function") {
|
||||
// Section numbers cite ES6 rev 24 (2014 April 27).
|
||||
|
||||
var sym = Symbol();
|
||||
var sym = Symbol();
|
||||
|
||||
// 7.2.2 IsCallable
|
||||
assertThrowsInstanceOf(() => sym(), TypeError);
|
||||
assertThrowsInstanceOf(() => Function.prototype.call.call(sym), TypeError);
|
||||
// 7.2.2 IsCallable
|
||||
assertThrowsInstanceOf(() => sym(), TypeError);
|
||||
assertThrowsInstanceOf(() => Function.prototype.call.call(sym), TypeError);
|
||||
|
||||
// 7.2.5 IsConstructor
|
||||
assertThrowsInstanceOf(() => new sym(), TypeError);
|
||||
assertThrowsInstanceOf(() => new Symbol(), TypeError);
|
||||
// 7.2.5 IsConstructor
|
||||
assertThrowsInstanceOf(() => new sym(), TypeError);
|
||||
assertThrowsInstanceOf(() => new Symbol(), TypeError);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,33 +1,35 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// ES6 does not specify enumeration order, but implementations mostly retain
|
||||
// property insertion order -- and must, for web compatibility. This test checks
|
||||
// that symbol-keyed properties do not interfere with that order.
|
||||
if (typeof Symbol === "function") {
|
||||
// ES6 does not specify enumeration order, but implementations mostly retain
|
||||
// property insertion order -- and must, for web compatibility. This test checks
|
||||
// that symbol-keyed properties do not interfere with that order.
|
||||
|
||||
var obj = {};
|
||||
obj[Symbol("moon")] = 0;
|
||||
obj.x = 1;
|
||||
obj[Symbol.for("y")] = 2
|
||||
obj.y = 3;
|
||||
obj[Symbol.iterator] = function* () { yield 4; };
|
||||
obj.z = 5;
|
||||
Object.prototype[Symbol.for("comet")] = 6;
|
||||
var obj = {};
|
||||
obj[Symbol("moon")] = 0;
|
||||
obj.x = 1;
|
||||
obj[Symbol.for("y")] = 2
|
||||
obj.y = 3;
|
||||
obj[Symbol.iterator] = function* () { yield 4; };
|
||||
obj.z = 5;
|
||||
Object.prototype[Symbol.for("comet")] = 6;
|
||||
|
||||
var keys = [];
|
||||
for (var k in obj)
|
||||
keys.push(k);
|
||||
assertDeepEq(keys, ["x", "y", "z"]);
|
||||
assertDeepEq(Object.keys(obj), ["x", "y", "z"]);
|
||||
var keys = [];
|
||||
for (var k in obj)
|
||||
keys.push(k);
|
||||
assertDeepEq(keys, ["x", "y", "z"]);
|
||||
assertDeepEq(Object.keys(obj), ["x", "y", "z"]);
|
||||
|
||||
// Test with more properties.
|
||||
for (var i = 0; i < 1000; i++)
|
||||
obj[Symbol(i)] = i;
|
||||
obj.w = 1000;
|
||||
keys = []
|
||||
for (var k in obj)
|
||||
keys.push(k);
|
||||
assertDeepEq(keys, ["x", "y", "z", "w"]);
|
||||
// Test with more properties.
|
||||
for (var i = 0; i < 1000; i++)
|
||||
obj[Symbol(i)] = i;
|
||||
obj.w = 1000;
|
||||
keys = []
|
||||
for (var k in obj)
|
||||
keys.push(k);
|
||||
assertDeepEq(keys, ["x", "y", "z", "w"]);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,31 +1,33 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// Symbol.for called twice with the same argument returns the same symbol.
|
||||
assertEq(Symbol.for("ponies"), Symbol.for("ponies"));
|
||||
if (typeof Symbol === "function") {
|
||||
// Symbol.for called twice with the same argument returns the same symbol.
|
||||
assertEq(Symbol.for("ponies"), Symbol.for("ponies"));
|
||||
|
||||
// Called twice with equal strings: still the same result.
|
||||
var one = Array(64+1).join("x");
|
||||
var two = Array(8+1).join(Array(8+1).join("x"));
|
||||
assertEq(Symbol.for(one), Symbol.for(two));
|
||||
// Called twice with equal strings: still the same result.
|
||||
var one = Array(64+1).join("x");
|
||||
var two = Array(8+1).join(Array(8+1).join("x"));
|
||||
assertEq(Symbol.for(one), Symbol.for(two));
|
||||
|
||||
// Symbols created by calling Symbol() are not in the symbol registry.
|
||||
var sym = Symbol("123");
|
||||
assertEq(Symbol.for("123") !== sym, true);
|
||||
// Symbols created by calling Symbol() are not in the symbol registry.
|
||||
var sym = Symbol("123");
|
||||
assertEq(Symbol.for("123") !== sym, true);
|
||||
|
||||
// Empty string is fine.
|
||||
assertEq(typeof Symbol.for(""), "symbol");
|
||||
// Empty string is fine.
|
||||
assertEq(typeof Symbol.for(""), "symbol");
|
||||
|
||||
// Primitive arguments.
|
||||
assertEq(Symbol.for(3), Symbol.for("3"));
|
||||
assertEq(Symbol.for(null), Symbol.for("null"));
|
||||
assertEq(Symbol.for(undefined), Symbol.for("undefined"));
|
||||
assertEq(Symbol.for(), Symbol.for("undefined"));
|
||||
// Primitive arguments.
|
||||
assertEq(Symbol.for(3), Symbol.for("3"));
|
||||
assertEq(Symbol.for(null), Symbol.for("null"));
|
||||
assertEq(Symbol.for(undefined), Symbol.for("undefined"));
|
||||
assertEq(Symbol.for(), Symbol.for("undefined"));
|
||||
|
||||
// Symbol.for ignores the 'this' value.
|
||||
var foo = Symbol.for("foo")
|
||||
assertEq(Symbol.for.call(String, "foo"), foo);
|
||||
assertEq(Symbol.for.call(3.14, "foo"), foo);
|
||||
// Symbol.for ignores the 'this' value.
|
||||
var foo = Symbol.for("foo");
|
||||
assertEq(Symbol.for.call(String, "foo"), foo);
|
||||
assertEq(Symbol.for.call(3.14, "foo"), foo);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,19 +1,21 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// JSON.stringify ignores symbol-keyed properties, even enumerable ones.
|
||||
if (typeof Symbol === "function") {
|
||||
// JSON.stringify ignores symbol-keyed properties, even enumerable ones.
|
||||
|
||||
var obj = {a: 1};
|
||||
obj[Symbol.for("ponies")] = {toJSON: function () { throw "fit"; }};
|
||||
obj[Symbol.iterator] = {toJSON: function () { throw "fit"; }};
|
||||
assertEq(JSON.stringify(obj), '{"a":1}');
|
||||
var obj = {a: 1};
|
||||
obj[Symbol.for("ponies")] = {toJSON: function () { throw "fit"; }};
|
||||
obj[Symbol.iterator] = {toJSON: function () { throw "fit"; }};
|
||||
assertEq(JSON.stringify(obj), '{"a":1}');
|
||||
|
||||
var replacer = function (k, v) {
|
||||
if (typeof k === "symbol")
|
||||
throw "fit";
|
||||
return v;
|
||||
};
|
||||
assertEq(JSON.stringify(obj, replacer), '{"a":1}');
|
||||
var replacer = function (k, v) {
|
||||
if (typeof k === "symbol")
|
||||
throw "fit";
|
||||
return v;
|
||||
};
|
||||
assertEq(JSON.stringify(obj, replacer), '{"a":1}');
|
||||
}
|
||||
|
||||
if (typeof reportCompare === 'function')
|
||||
reportCompare(0, 0, 'ok');
|
||||
|
@ -1,32 +1,34 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// To JSON.stringify, symbols are the same as undefined.
|
||||
if (typeof Symbol === "function") {
|
||||
// To JSON.stringify, symbols are the same as undefined.
|
||||
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol.for("ponies"),
|
||||
Symbol.iterator
|
||||
];
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol.for("ponies"),
|
||||
Symbol.iterator
|
||||
];
|
||||
|
||||
for (var sym of symbols) {
|
||||
assertEq(JSON.stringify(sym), undefined);
|
||||
assertEq(JSON.stringify([sym]), "[null]");
|
||||
for (var sym of symbols) {
|
||||
assertEq(JSON.stringify(sym), undefined);
|
||||
assertEq(JSON.stringify([sym]), "[null]");
|
||||
|
||||
// JSON.stringify skips symbol-valued properties!
|
||||
assertEq(JSON.stringify({x: sym}), '{}');
|
||||
// JSON.stringify skips symbol-valued properties!
|
||||
assertEq(JSON.stringify({x: sym}), '{}');
|
||||
|
||||
// However such properties are passed to the replacerFunction if any.
|
||||
var replacer = function (key, val) {
|
||||
assertEq(typeof this, "object");
|
||||
if (typeof val === "symbol") {
|
||||
assertEq(val, sym);
|
||||
return "ding";
|
||||
}
|
||||
return val;
|
||||
};
|
||||
assertEq(JSON.stringify(sym, replacer), '"ding"');
|
||||
assertEq(JSON.stringify({x: sym}, replacer), '{"x":"ding"}');
|
||||
// However such properties are passed to the replacerFunction if any.
|
||||
var replacer = function (key, val) {
|
||||
assertEq(typeof this, "object");
|
||||
if (typeof val === "symbol") {
|
||||
assertEq(val, sym);
|
||||
return "ding";
|
||||
}
|
||||
return val;
|
||||
};
|
||||
assertEq(JSON.stringify(sym, replacer), '"ding"');
|
||||
assertEq(JSON.stringify({x: sym}, replacer), '{"x":"ding"}');
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof reportCompare === 'function')
|
||||
|
@ -1,15 +1,17 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
assertEq(Symbol.keyFor(Symbol.for("moon")), "moon");
|
||||
assertEq(Symbol.keyFor(Symbol.for("")), "");
|
||||
assertEq(Symbol.keyFor(Symbol("moon")), undefined);
|
||||
assertEq(Symbol.keyFor(Symbol.iterator), undefined);
|
||||
if (typeof Symbol === "function") {
|
||||
assertEq(Symbol.keyFor(Symbol.for("moon")), "moon");
|
||||
assertEq(Symbol.keyFor(Symbol.for("")), "");
|
||||
assertEq(Symbol.keyFor(Symbol("moon")), undefined);
|
||||
assertEq(Symbol.keyFor(Symbol.iterator), undefined);
|
||||
|
||||
assertThrowsInstanceOf(() => Symbol.keyFor(), TypeError);
|
||||
assertThrowsInstanceOf(() => Symbol.keyFor(Object(Symbol("moon"))), TypeError);
|
||||
assertThrowsInstanceOf(() => Symbol.keyFor(), TypeError);
|
||||
assertThrowsInstanceOf(() => Symbol.keyFor(Object(Symbol("moon"))), TypeError);
|
||||
|
||||
assertEq(Symbol.keyFor.length, 1);
|
||||
assertEq(Symbol.keyFor.length, 1);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,39 +1,41 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
var obj = {};
|
||||
var sym = Symbol();
|
||||
if (typeof Symbol === "function") {
|
||||
var obj = {};
|
||||
var sym = Symbol();
|
||||
|
||||
var gets = 0;
|
||||
var sets = [];
|
||||
Object.defineProperty(obj, sym, {
|
||||
get: function () { return ++gets; },
|
||||
set: function (v) { sets.push(v); }
|
||||
});
|
||||
var gets = 0;
|
||||
var sets = [];
|
||||
Object.defineProperty(obj, sym, {
|
||||
get: function () { return ++gets; },
|
||||
set: function (v) { sets.push(v); }
|
||||
});
|
||||
|
||||
// getter
|
||||
for (var i = 1; i < 9; i++)
|
||||
assertEq(obj[sym], i);
|
||||
// getter
|
||||
for (var i = 1; i < 9; i++)
|
||||
assertEq(obj[sym], i);
|
||||
|
||||
// setter
|
||||
var expected = [];
|
||||
for (var i = 0; i < 9; i++) {
|
||||
assertEq(obj[sym] = i, i);
|
||||
expected.push(i);
|
||||
// setter
|
||||
var expected = [];
|
||||
for (var i = 0; i < 9; i++) {
|
||||
assertEq(obj[sym] = i, i);
|
||||
expected.push(i);
|
||||
}
|
||||
assertDeepEq(sets, expected);
|
||||
|
||||
// increment operator
|
||||
gets = 0;
|
||||
sets = [];
|
||||
assertEq(obj[sym]++, 1);
|
||||
assertDeepEq(sets, [2]);
|
||||
|
||||
// assignment
|
||||
gets = 0;
|
||||
sets = [];
|
||||
assertEq(obj[sym] *= 12, 12);
|
||||
assertDeepEq(sets, [12]);
|
||||
}
|
||||
assertDeepEq(sets, expected);
|
||||
|
||||
// increment operator
|
||||
gets = 0;
|
||||
sets = [];
|
||||
assertEq(obj[sym]++, 1);
|
||||
assertDeepEq(sets, [2]);
|
||||
|
||||
// assignment
|
||||
gets = 0;
|
||||
sets = [];
|
||||
assertEq(obj[sym] *= 12, 12);
|
||||
assertDeepEq(sets, [12]);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,42 +1,44 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol("one"),
|
||||
Symbol.for("two"),
|
||||
Symbol.iterator
|
||||
];
|
||||
if (typeof Symbol === "function") {
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol("one"),
|
||||
Symbol.for("two"),
|
||||
Symbol.iterator
|
||||
];
|
||||
|
||||
for (var sym of symbols) {
|
||||
var obj = {};
|
||||
for (var sym of symbols) {
|
||||
var obj = {};
|
||||
|
||||
// access a nonexistent property
|
||||
assertEq(sym in obj, false);
|
||||
assertEq(obj.hasOwnProperty(sym), false);
|
||||
assertEq(obj[sym], undefined);
|
||||
assertEq(typeof obj[sym], "undefined");
|
||||
assertEq(Object.getOwnPropertyDescriptor(obj, sym), undefined);
|
||||
// access a nonexistent property
|
||||
assertEq(sym in obj, false);
|
||||
assertEq(obj.hasOwnProperty(sym), false);
|
||||
assertEq(obj[sym], undefined);
|
||||
assertEq(typeof obj[sym], "undefined");
|
||||
assertEq(Object.getOwnPropertyDescriptor(obj, sym), undefined);
|
||||
|
||||
// assign, then try accessing again
|
||||
obj[sym] = "ok";
|
||||
assertEq(sym in obj, true);
|
||||
assertEq(obj.hasOwnProperty(sym), true);
|
||||
assertEq(obj[sym], "ok");
|
||||
assertDeepEq(Object.getOwnPropertyDescriptor(obj, sym), {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
value: "ok",
|
||||
writable: true
|
||||
});
|
||||
// assign, then try accessing again
|
||||
obj[sym] = "ok";
|
||||
assertEq(sym in obj, true);
|
||||
assertEq(obj.hasOwnProperty(sym), true);
|
||||
assertEq(obj[sym], "ok");
|
||||
assertDeepEq(Object.getOwnPropertyDescriptor(obj, sym), {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
value: "ok",
|
||||
writable: true
|
||||
});
|
||||
|
||||
// assign again, observe value is overwritten
|
||||
obj[sym] = 12;
|
||||
assertEq(obj[sym], 12);
|
||||
// assign again, observe value is overwritten
|
||||
obj[sym] = 12;
|
||||
assertEq(obj[sym], 12);
|
||||
|
||||
// increment
|
||||
assertEq(obj[sym]++, 12);
|
||||
assertEq(obj[sym], 13);
|
||||
// increment
|
||||
assertEq(obj[sym]++, 12);
|
||||
assertEq(obj[sym], 13);
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
|
@ -1,50 +1,53 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
var sym = Symbol.for("hello");
|
||||
function F() {}
|
||||
var f = new F();
|
||||
|
||||
// inherited data property
|
||||
F.prototype[sym] = "world";
|
||||
assertEq(sym in f, true);
|
||||
assertEq(f.hasOwnProperty(sym), false);
|
||||
assertEq(f[sym], "world");
|
||||
if (typeof Symbol === "function") {
|
||||
var sym = Symbol.for("hello");
|
||||
var f = new F();
|
||||
|
||||
// shadowing assignment
|
||||
f[sym] = "kitty";
|
||||
assertEq(f[sym], "kitty");
|
||||
assertEq(F.prototype[sym], "world");
|
||||
// inherited data property
|
||||
F.prototype[sym] = "world";
|
||||
assertEq(sym in f, true);
|
||||
assertEq(f.hasOwnProperty(sym), false);
|
||||
assertEq(f[sym], "world");
|
||||
|
||||
// deletion, revealing previously shadowed property
|
||||
assertEq(delete f[sym], true);
|
||||
assertEq(f.hasOwnProperty(sym), false);
|
||||
assertEq(f[sym], "world");
|
||||
// shadowing assignment
|
||||
f[sym] = "kitty";
|
||||
assertEq(f[sym], "kitty");
|
||||
assertEq(F.prototype[sym], "world");
|
||||
|
||||
// inherited accessor property
|
||||
var value = undefined;
|
||||
Object.defineProperty(F.prototype, sym, {
|
||||
configurable: true,
|
||||
get: function () { return 23; },
|
||||
set: function (v) { value = v; }
|
||||
});
|
||||
assertEq(sym in f, true);
|
||||
assertEq(f.hasOwnProperty(sym), false);
|
||||
assertEq(f[sym], 23);
|
||||
f[sym] = "gravity";
|
||||
assertEq(value, "gravity");
|
||||
// deletion, revealing previously shadowed property
|
||||
assertEq(delete f[sym], true);
|
||||
assertEq(f.hasOwnProperty(sym), false);
|
||||
assertEq(f[sym], "world");
|
||||
|
||||
// inherited accessor property with no setter
|
||||
Object.defineProperty(F.prototype, sym, {
|
||||
set: undefined
|
||||
});
|
||||
assertThrowsInstanceOf(function () { "use strict"; f[sym] = 0; }, TypeError);
|
||||
// inherited accessor property
|
||||
var value = undefined;
|
||||
Object.defineProperty(F.prototype, sym, {
|
||||
configurable: true,
|
||||
get: function () { return 23; },
|
||||
set: function (v) { value = v; }
|
||||
});
|
||||
assertEq(sym in f, true);
|
||||
assertEq(f.hasOwnProperty(sym), false);
|
||||
assertEq(f[sym], 23);
|
||||
f[sym] = "gravity";
|
||||
assertEq(value, "gravity");
|
||||
|
||||
// deeply inherited accessor property
|
||||
var g = Object.create(f);
|
||||
for (var i = 0; i < 100; i++)
|
||||
g = Object.create(g);
|
||||
assertEq(g[sym], 23);
|
||||
// inherited accessor property with no setter
|
||||
Object.defineProperty(F.prototype, sym, {
|
||||
set: undefined
|
||||
});
|
||||
assertThrowsInstanceOf(function () { "use strict"; f[sym] = 0; }, TypeError);
|
||||
|
||||
// deeply inherited accessor property
|
||||
var g = Object.create(f);
|
||||
for (var i = 0; i < 100; i++)
|
||||
g = Object.create(g);
|
||||
assertEq(g[sym], 23);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,7 +1,6 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
var sym = Symbol.for("moon");
|
||||
function checkNotWritable(obj) {
|
||||
// In sloppy mode, assigning to a nonwritable property silently fails.
|
||||
obj[sym] = "portals";
|
||||
@ -12,20 +11,24 @@ function checkNotWritable(obj) {
|
||||
assertEq(obj[sym], "cheese");
|
||||
}
|
||||
|
||||
var x = {};
|
||||
Object.defineProperty(x, sym, {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
value: "cheese",
|
||||
writable: false
|
||||
});
|
||||
if (typeof Symbol === "function") {
|
||||
var sym = Symbol.for("moon");
|
||||
|
||||
checkNotWritable(x);
|
||||
var x = {};
|
||||
Object.defineProperty(x, sym, {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
value: "cheese",
|
||||
writable: false
|
||||
});
|
||||
|
||||
// Assignment can't shadow inherited nonwritable properties either.
|
||||
var y = Object.create(x);
|
||||
checkNotWritable(y);
|
||||
checkNotWritable(Object.create(y));
|
||||
checkNotWritable(x);
|
||||
|
||||
// Assignment can't shadow inherited nonwritable properties either.
|
||||
var y = Object.create(x);
|
||||
checkNotWritable(y);
|
||||
checkNotWritable(Object.create(y));
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,138 +1,141 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// Basic tests for standard Object APIs interacting with symbols.
|
||||
|
||||
// Object.defineProperty
|
||||
function F() {}
|
||||
var f = new F;
|
||||
Object.defineProperty(f, Symbol.for("name"), {
|
||||
configurable: true,
|
||||
value: "eff"
|
||||
});
|
||||
assertEq("name" in f, false);
|
||||
assertEq("Symbol(name)" in f, false);
|
||||
assertEq(Symbol.for("name") in f, true);
|
||||
assertEq(f[Symbol.for("name")], "eff");
|
||||
|
||||
// Object.defineProperties
|
||||
function D() {}
|
||||
var descs = new D;
|
||||
var s1 = Symbol("s1");
|
||||
var hits = 0;
|
||||
descs[s1] = {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
get: () => hits++,
|
||||
set: undefined
|
||||
};
|
||||
var s2 = Symbol("s2");
|
||||
descs[s2] = {
|
||||
configurable: true,
|
||||
enumerable: false,
|
||||
value: {},
|
||||
writable: true
|
||||
};
|
||||
var s3 = Symbol("s3");
|
||||
D.prototype[s3] = {value: "FAIL"};
|
||||
assertEq(Object.defineProperties(f, descs), f);
|
||||
assertEq(s1 in f, true);
|
||||
assertEq(f[s1], 0);
|
||||
assertEq(hits, 1);
|
||||
assertEq(s2 in f, true);
|
||||
assertEq(f[s2], descs[s2].value);
|
||||
assertEq(s3 in f, false);
|
||||
|
||||
// Object.create
|
||||
var n = Object.create({}, descs);
|
||||
assertEq(s1 in n, true);
|
||||
assertEq(n[s1], 1);
|
||||
assertEq(hits, 2);
|
||||
assertEq(s2 in n, true);
|
||||
assertEq(n[s2], descs[s2].value);
|
||||
assertEq(s3 in n, false);
|
||||
if (typeof Symbol === "function") {
|
||||
// Basic tests for standard Object APIs interacting with symbols.
|
||||
|
||||
// Object.getOwnPropertyDescriptor
|
||||
var desc = Object.getOwnPropertyDescriptor(n, s1);
|
||||
assertDeepEq(desc, descs[s1]);
|
||||
assertEq(desc.get, descs[s1].get);
|
||||
desc = Object.getOwnPropertyDescriptor(n, s2);
|
||||
assertDeepEq(desc, descs[s2]);
|
||||
assertEq(desc.value, descs[s2].value);
|
||||
// Object.defineProperty
|
||||
var f = new F;
|
||||
Object.defineProperty(f, Symbol.for("name"), {
|
||||
configurable: true,
|
||||
value: "eff"
|
||||
});
|
||||
assertEq("name" in f, false);
|
||||
assertEq("Symbol(name)" in f, false);
|
||||
assertEq(Symbol.for("name") in f, true);
|
||||
assertEq(f[Symbol.for("name")], "eff");
|
||||
|
||||
// Object.prototype.hasOwnProperty
|
||||
assertEq(descs.hasOwnProperty(s1), true);
|
||||
assertEq(descs.hasOwnProperty(s2), true);
|
||||
assertEq(descs.hasOwnProperty(s3), false);
|
||||
assertEq([].hasOwnProperty(Symbol.iterator), false);
|
||||
if (!("@@iterator" in []))
|
||||
throw new Error("Congratulations on implementing Symbol.iterator! Please update this test.");
|
||||
assertEq(Array.prototype.hasOwnProperty(Symbol.iterator), false); // should be true
|
||||
// Object.defineProperties
|
||||
var descs = new D;
|
||||
var s1 = Symbol("s1");
|
||||
var hits = 0;
|
||||
descs[s1] = {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
get: () => hits++,
|
||||
set: undefined
|
||||
};
|
||||
var s2 = Symbol("s2");
|
||||
descs[s2] = {
|
||||
configurable: true,
|
||||
enumerable: false,
|
||||
value: {},
|
||||
writable: true
|
||||
};
|
||||
var s3 = Symbol("s3");
|
||||
D.prototype[s3] = {value: "FAIL"};
|
||||
assertEq(Object.defineProperties(f, descs), f);
|
||||
assertEq(s1 in f, true);
|
||||
assertEq(f[s1], 0);
|
||||
assertEq(hits, 1);
|
||||
assertEq(s2 in f, true);
|
||||
assertEq(f[s2], descs[s2].value);
|
||||
assertEq(s3 in f, false);
|
||||
|
||||
// Object.prototype.propertyIsEnumerable
|
||||
assertEq(n.propertyIsEnumerable(s1), true);
|
||||
assertEq(n.propertyIsEnumerable(s2), false);
|
||||
assertEq(n.propertyIsEnumerable(s3), false); // no such property
|
||||
assertEq(D.prototype.propertyIsEnumerable(s3), true);
|
||||
assertEq(descs.propertyIsEnumerable(s3), false); // inherited properties are not considered
|
||||
// Object.create
|
||||
var n = Object.create({}, descs);
|
||||
assertEq(s1 in n, true);
|
||||
assertEq(n[s1], 1);
|
||||
assertEq(hits, 2);
|
||||
assertEq(s2 in n, true);
|
||||
assertEq(n[s2], descs[s2].value);
|
||||
assertEq(s3 in n, false);
|
||||
|
||||
// Object.preventExtensions
|
||||
var obj = {};
|
||||
obj[s1] = 1;
|
||||
assertEq(Object.preventExtensions(obj), obj);
|
||||
assertThrowsInstanceOf(function () { "use strict"; obj[s2] = 2; }, TypeError);
|
||||
obj[s2] = 2; // still no effect
|
||||
assertEq(s2 in obj, false);
|
||||
// Object.getOwnPropertyDescriptor
|
||||
var desc = Object.getOwnPropertyDescriptor(n, s1);
|
||||
assertDeepEq(desc, descs[s1]);
|
||||
assertEq(desc.get, descs[s1].get);
|
||||
desc = Object.getOwnPropertyDescriptor(n, s2);
|
||||
assertDeepEq(desc, descs[s2]);
|
||||
assertEq(desc.value, descs[s2].value);
|
||||
|
||||
// Object.isSealed, Object.isFrozen
|
||||
assertEq(Object.isSealed(obj), false);
|
||||
assertEq(Object.isFrozen(obj), false);
|
||||
assertEq(delete obj[s1], true);
|
||||
assertEq(Object.isSealed(obj), true);
|
||||
assertEq(Object.isFrozen(obj), true);
|
||||
// Object.prototype.hasOwnProperty
|
||||
assertEq(descs.hasOwnProperty(s1), true);
|
||||
assertEq(descs.hasOwnProperty(s2), true);
|
||||
assertEq(descs.hasOwnProperty(s3), false);
|
||||
assertEq([].hasOwnProperty(Symbol.iterator), false);
|
||||
if (!("@@iterator" in []))
|
||||
throw new Error("Congratulations on implementing Symbol.iterator! Please update this test.");
|
||||
assertEq(Array.prototype.hasOwnProperty(Symbol.iterator), false); // should be true
|
||||
|
||||
obj = {};
|
||||
obj[s1] = 1;
|
||||
Object.preventExtensions(obj);
|
||||
Object.defineProperty(obj, s1, {configurable: false}); // still writable
|
||||
assertEq(Object.isSealed(obj), true);
|
||||
assertEq(Object.isFrozen(obj), false);
|
||||
obj[s1] = 2;
|
||||
assertEq(obj[s1], 2);
|
||||
Object.defineProperty(obj, s1, {writable: false});
|
||||
assertEq(Object.isFrozen(obj), true);
|
||||
// Object.prototype.propertyIsEnumerable
|
||||
assertEq(n.propertyIsEnumerable(s1), true);
|
||||
assertEq(n.propertyIsEnumerable(s2), false);
|
||||
assertEq(n.propertyIsEnumerable(s3), false); // no such property
|
||||
assertEq(D.prototype.propertyIsEnumerable(s3), true);
|
||||
assertEq(descs.propertyIsEnumerable(s3), false); // inherited properties are not considered
|
||||
|
||||
// Object.seal, Object.freeze
|
||||
var obj = {};
|
||||
obj[s1] = 1;
|
||||
Object.seal(obj);
|
||||
desc = Object.getOwnPropertyDescriptor(obj, s1);
|
||||
assertEq(desc.configurable, false);
|
||||
assertEq(desc.writable, true);
|
||||
Object.freeze(obj);
|
||||
assertEq(Object.getOwnPropertyDescriptor(obj, s1).writable, false);
|
||||
// Object.preventExtensions
|
||||
var obj = {};
|
||||
obj[s1] = 1;
|
||||
assertEq(Object.preventExtensions(obj), obj);
|
||||
assertThrowsInstanceOf(function () { "use strict"; obj[s2] = 2; }, TypeError);
|
||||
obj[s2] = 2; // still no effect
|
||||
assertEq(s2 in obj, false);
|
||||
|
||||
// Object.setPrototypeOf purges caches for symbol-keyed properties.
|
||||
var proto = {};
|
||||
proto[s1] = 1;
|
||||
Object.defineProperty(proto, s2, {
|
||||
get: () => 2,
|
||||
set: v => undefined
|
||||
});
|
||||
var obj = Object.create(proto);
|
||||
var last1, last2;
|
||||
var N = 9;
|
||||
for (var i = 0; i < N; i++) {
|
||||
last1 = obj[s1];
|
||||
last2 = obj[s2];
|
||||
obj[s2] = "marker";
|
||||
if (i === N - 2)
|
||||
Object.setPrototypeOf(obj, {});
|
||||
// Object.isSealed, Object.isFrozen
|
||||
assertEq(Object.isSealed(obj), false);
|
||||
assertEq(Object.isFrozen(obj), false);
|
||||
assertEq(delete obj[s1], true);
|
||||
assertEq(Object.isSealed(obj), true);
|
||||
assertEq(Object.isFrozen(obj), true);
|
||||
|
||||
obj = {};
|
||||
obj[s1] = 1;
|
||||
Object.preventExtensions(obj);
|
||||
Object.defineProperty(obj, s1, {configurable: false}); // still writable
|
||||
assertEq(Object.isSealed(obj), true);
|
||||
assertEq(Object.isFrozen(obj), false);
|
||||
obj[s1] = 2;
|
||||
assertEq(obj[s1], 2);
|
||||
Object.defineProperty(obj, s1, {writable: false});
|
||||
assertEq(Object.isFrozen(obj), true);
|
||||
|
||||
// Object.seal, Object.freeze
|
||||
var obj = {};
|
||||
obj[s1] = 1;
|
||||
Object.seal(obj);
|
||||
desc = Object.getOwnPropertyDescriptor(obj, s1);
|
||||
assertEq(desc.configurable, false);
|
||||
assertEq(desc.writable, true);
|
||||
Object.freeze(obj);
|
||||
assertEq(Object.getOwnPropertyDescriptor(obj, s1).writable, false);
|
||||
|
||||
// Object.setPrototypeOf purges caches for symbol-keyed properties.
|
||||
var proto = {};
|
||||
proto[s1] = 1;
|
||||
Object.defineProperty(proto, s2, {
|
||||
get: () => 2,
|
||||
set: v => undefined
|
||||
});
|
||||
var obj = Object.create(proto);
|
||||
var last1, last2;
|
||||
var N = 9;
|
||||
for (var i = 0; i < N; i++) {
|
||||
last1 = obj[s1];
|
||||
last2 = obj[s2];
|
||||
obj[s2] = "marker";
|
||||
if (i === N - 2)
|
||||
Object.setPrototypeOf(obj, {});
|
||||
}
|
||||
assertEq(last1, undefined);
|
||||
assertEq(last2, undefined);
|
||||
assertEq(obj.hasOwnProperty(s2), true);
|
||||
assertEq(obj[s2], "marker");
|
||||
}
|
||||
assertEq(last1, undefined);
|
||||
assertEq(last2, undefined);
|
||||
assertEq(obj.hasOwnProperty(s2), true);
|
||||
assertEq(obj[s2], "marker");
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,35 +1,37 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// Symbols can be shared across realms.
|
||||
if (typeof Symbol === "function") {
|
||||
// Symbols can be shared across realms.
|
||||
|
||||
if (typeof Reflect !== "undefined" && typeof Reflect.Realm === "function") {
|
||||
throw new Error("Congratulations on implementing Reflect.Realm! " +
|
||||
"Please update this test to use it.");
|
||||
}
|
||||
if (typeof newGlobal === "function") {
|
||||
var g = newGlobal();
|
||||
var gj = g.eval("jones = Symbol('jones')");
|
||||
assertEq(typeof gj, "symbol");
|
||||
assertEq(g.jones, g.jones);
|
||||
assertEq(gj, g.jones);
|
||||
assertEq(gj !== Symbol("jones"), true);
|
||||
if (typeof Reflect !== "undefined" && typeof Reflect.Realm === "function") {
|
||||
throw new Error("Congratulations on implementing Reflect.Realm! " +
|
||||
"Please update this test to use it.");
|
||||
}
|
||||
if (typeof newGlobal === "function") {
|
||||
var g = newGlobal();
|
||||
var gj = g.eval("jones = Symbol('jones')");
|
||||
assertEq(typeof gj, "symbol");
|
||||
assertEq(g.jones, g.jones);
|
||||
assertEq(gj, g.jones);
|
||||
assertEq(gj !== Symbol("jones"), true);
|
||||
|
||||
// A symbol can be round-tripped to another realm and back;
|
||||
// the result is the original symbol.
|
||||
var smith = Symbol("smith");
|
||||
g.smith = smith; // put smith into the realm
|
||||
assertEq(g.smith, smith); // pull it back out
|
||||
// A symbol can be round-tripped to another realm and back;
|
||||
// the result is the original symbol.
|
||||
var smith = Symbol("smith");
|
||||
g.smith = smith; // put smith into the realm
|
||||
assertEq(g.smith, smith); // pull it back out
|
||||
|
||||
// Spot-check that non-generic methods can be applied to symbols and Symbol
|
||||
// objects from other realms.
|
||||
assertEq(Symbol.prototype.toString.call(gj), "Symbol(jones)");
|
||||
assertEq(Symbol.prototype.toString.call(g.eval("Object(Symbol('brown'))")),
|
||||
"Symbol(brown)");
|
||||
// Spot-check that non-generic methods can be applied to symbols and Symbol
|
||||
// objects from other realms.
|
||||
assertEq(Symbol.prototype.toString.call(gj), "Symbol(jones)");
|
||||
assertEq(Symbol.prototype.toString.call(g.eval("Object(Symbol('brown'))")),
|
||||
"Symbol(brown)");
|
||||
|
||||
// Symbol.for functions share a symbol registry across all realms.
|
||||
assertEq(g.Symbol.for("ponies"), Symbol.for("ponies"));
|
||||
assertEq(g.eval("Symbol.for('rainbows')"), Symbol.for("rainbows"));
|
||||
// Symbol.for functions share a symbol registry across all realms.
|
||||
assertEq(g.Symbol.for("ponies"), Symbol.for("ponies"));
|
||||
assertEq(g.eval("Symbol.for('rainbows')"), Symbol.for("rainbows"));
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
|
@ -1,29 +1,31 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// Test superficial properties of the Symbol constructor and prototype.
|
||||
if (typeof Symbol === "function") {
|
||||
// Test superficial properties of the Symbol constructor and prototype.
|
||||
|
||||
var desc = Object.getOwnPropertyDescriptor(this, "Symbol");
|
||||
assertEq(desc.configurable, true);
|
||||
assertEq(desc.enumerable, false);
|
||||
assertEq(desc.writable, true);
|
||||
assertEq(typeof Symbol, "function");
|
||||
assertEq(Symbol.length, 1);
|
||||
var desc = Object.getOwnPropertyDescriptor(this, "Symbol");
|
||||
assertEq(desc.configurable, true);
|
||||
assertEq(desc.enumerable, false);
|
||||
assertEq(desc.writable, true);
|
||||
assertEq(typeof Symbol, "function");
|
||||
assertEq(Symbol.length, 1);
|
||||
|
||||
desc = Object.getOwnPropertyDescriptor(Symbol, "prototype");
|
||||
assertEq(desc.configurable, false);
|
||||
assertEq(desc.enumerable, false);
|
||||
assertEq(desc.writable, false);
|
||||
desc = Object.getOwnPropertyDescriptor(Symbol, "prototype");
|
||||
assertEq(desc.configurable, false);
|
||||
assertEq(desc.enumerable, false);
|
||||
assertEq(desc.writable, false);
|
||||
|
||||
assertEq(Symbol.prototype.constructor, Symbol);
|
||||
desc = Object.getOwnPropertyDescriptor(Symbol.prototype, "constructor");
|
||||
assertEq(desc.configurable, true);
|
||||
assertEq(desc.enumerable, false);
|
||||
assertEq(desc.writable, true);
|
||||
assertEq(Symbol.prototype.constructor, Symbol);
|
||||
desc = Object.getOwnPropertyDescriptor(Symbol.prototype, "constructor");
|
||||
assertEq(desc.configurable, true);
|
||||
assertEq(desc.enumerable, false);
|
||||
assertEq(desc.writable, true);
|
||||
|
||||
assertEq(Symbol.for.length, 1);
|
||||
assertEq(Symbol.prototype.toString.length, 0);
|
||||
assertEq(Symbol.prototype.valueOf.length, 0);
|
||||
assertEq(Symbol.for.length, 1);
|
||||
assertEq(Symbol.prototype.toString.length, 0);
|
||||
assertEq(Symbol.prototype.valueOf.length, 0);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,27 +1,29 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
var cases = [
|
||||
{sym: Symbol(), str: "Symbol()"},
|
||||
{sym: Symbol("ok"), str: "Symbol(ok)"},
|
||||
{sym: Symbol("\0"), str: "Symbol(\0)"},
|
||||
{sym: Symbol.iterator, str: "Symbol(Symbol.iterator)"},
|
||||
{sym: Symbol.for("dummies"), str: "Symbol(dummies)"}
|
||||
];
|
||||
if (typeof Symbol === "function") {
|
||||
var cases = [
|
||||
{sym: Symbol(), str: "Symbol()"},
|
||||
{sym: Symbol("ok"), str: "Symbol(ok)"},
|
||||
{sym: Symbol("\0"), str: "Symbol(\0)"},
|
||||
{sym: Symbol.iterator, str: "Symbol(Symbol.iterator)"},
|
||||
{sym: Symbol.for("dummies"), str: "Symbol(dummies)"}
|
||||
];
|
||||
|
||||
// Symbol.prototype.toString works on both primitive symbols and Symbol
|
||||
// objects.
|
||||
for (var test of cases) {
|
||||
assertEq(test.sym.toString(), test.str);
|
||||
assertEq(Object(test.sym).toString(), test.str);
|
||||
// Symbol.prototype.toString works on both primitive symbols and Symbol
|
||||
// objects.
|
||||
for (var test of cases) {
|
||||
assertEq(test.sym.toString(), test.str);
|
||||
assertEq(Object(test.sym).toString(), test.str);
|
||||
}
|
||||
|
||||
// Any other value throws.
|
||||
var nonsymbols = [
|
||||
undefined, null, "not-ok", new String("still-not-ok"), {}, []
|
||||
];
|
||||
for (var nonsym of nonsymbols)
|
||||
assertThrowsInstanceOf(() => Symbol.prototype.toString.call(nonsym), TypeError);
|
||||
}
|
||||
|
||||
// Any other value throws.
|
||||
var nonsymbols = [
|
||||
undefined, null, "not-ok", new String("still-not-ok"), {}, []
|
||||
];
|
||||
for (var nonsym of nonsymbols)
|
||||
assertThrowsInstanceOf(() => Symbol.prototype.toString.call(nonsym), TypeError);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,16 +1,18 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// Symbol-to-number type conversions involving typed arrays.
|
||||
if (typeof Symbol === "function") {
|
||||
// Symbol-to-number type conversions involving typed arrays.
|
||||
|
||||
for (var T of [Uint8Array, Uint8ClampedArray, Int16Array, Float32Array]) {
|
||||
// Typed array constructors convert symbols using ToNumber(), which throws.
|
||||
assertThrowsInstanceOf(() => new T([Symbol("a")]), TypeError);
|
||||
for (var T of [Uint8Array, Uint8ClampedArray, Int16Array, Float32Array]) {
|
||||
// Typed array constructors convert symbols using ToNumber(), which throws.
|
||||
assertThrowsInstanceOf(() => new T([Symbol("a")]), TypeError);
|
||||
|
||||
// Assignment does the same.
|
||||
var arr = new T([1]);
|
||||
assertThrowsInstanceOf(() => { arr[0] = Symbol.iterator; }, TypeError);
|
||||
assertEq(arr[0], 1);
|
||||
// Assignment does the same.
|
||||
var arr = new T([1]);
|
||||
assertThrowsInstanceOf(() => { arr[0] = Symbol.iterator; }, TypeError);
|
||||
assertEq(arr[0], 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
|
@ -1,11 +1,13 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
assertEq(typeof Symbol(), "symbol");
|
||||
assertEq(typeof Symbol("ponies"), "symbol");
|
||||
assertEq(typeof Symbol.for("ponies"), "symbol");
|
||||
if (typeof Symbol === "function") {
|
||||
assertEq(typeof Symbol(), "symbol");
|
||||
assertEq(typeof Symbol("ponies"), "symbol");
|
||||
assertEq(typeof Symbol.for("ponies"), "symbol");
|
||||
|
||||
assertEq(typeof Object(Symbol()), "object");
|
||||
assertEq(typeof Object(Symbol()), "object");
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,22 +1,24 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol("ok"),
|
||||
Symbol.for("dummies"),
|
||||
Symbol.iterator
|
||||
];
|
||||
if (typeof Symbol === "function") {
|
||||
var symbols = [
|
||||
Symbol(),
|
||||
Symbol("ok"),
|
||||
Symbol.for("dummies"),
|
||||
Symbol.iterator
|
||||
];
|
||||
|
||||
for (var sym of symbols) {
|
||||
assertEq(sym.valueOf(), sym);
|
||||
assertEq(Object(sym).valueOf(), sym);
|
||||
for (var sym of symbols) {
|
||||
assertEq(sym.valueOf(), sym);
|
||||
assertEq(Object(sym).valueOf(), sym);
|
||||
}
|
||||
|
||||
// Any other value throws.
|
||||
var nonsymbols = [undefined, null, NaN, {}, Symbol.prototype];
|
||||
for (var nonsym of nonsymbols)
|
||||
assertThrowsInstanceOf(() => Symbol.prototype.valueOf.call(nonsym), TypeError);
|
||||
}
|
||||
|
||||
// Any other value throws.
|
||||
var nonsymbols = [undefined, null, NaN, {}, Symbol.prototype];
|
||||
for (var nonsym of nonsymbols)
|
||||
assertThrowsInstanceOf(() => Symbol.prototype.valueOf.call(nonsym), TypeError);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,18 +1,20 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// Well-known symbols exist.
|
||||
assertEq(typeof Symbol.iterator, "symbol");
|
||||
if (typeof Symbol === "function") {
|
||||
// Well-known symbols exist.
|
||||
assertEq(typeof Symbol.iterator, "symbol");
|
||||
|
||||
// They are never in the registry.
|
||||
assertEq(Symbol.iterator !== Symbol.for("Symbol.iterator"), true);
|
||||
// They are never in the registry.
|
||||
assertEq(Symbol.iterator !== Symbol.for("Symbol.iterator"), true);
|
||||
|
||||
// They are shared across realms.
|
||||
if (typeof Realm === 'function')
|
||||
throw new Error("please update this test to use Realms");
|
||||
if (typeof newGlobal === 'function') {
|
||||
var g = newGlobal();
|
||||
assertEq(Symbol.iterator, g.Symbol.iterator);
|
||||
// They are shared across realms.
|
||||
if (typeof Realm === 'function')
|
||||
throw new Error("please update this test to use Realms");
|
||||
if (typeof newGlobal === 'function') {
|
||||
var g = newGlobal();
|
||||
assertEq(Symbol.iterator, g.Symbol.iterator);
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
|
@ -1,10 +1,12 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
// Symbols can't be WeakMap keys.
|
||||
var m = new WeakMap;
|
||||
var sym = Symbol();
|
||||
assertThrowsInstanceOf(() => m.set(sym, 0), TypeError);
|
||||
if (typeof Symbol === "function") {
|
||||
// Symbols can't be WeakMap keys.
|
||||
var m = new WeakMap;
|
||||
var sym = Symbol();
|
||||
assertThrowsInstanceOf(() => m.set(sym, 0), TypeError);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -44,7 +44,6 @@ if (typeof assertDeepEq === 'undefined') {
|
||||
var call = Function.prototype.call,
|
||||
Map_ = Map,
|
||||
Error_ = Error,
|
||||
Symbol_ = Symbol,
|
||||
Map_has = call.bind(Map.prototype.has),
|
||||
Map_get = call.bind(Map.prototype.get),
|
||||
Map_set = call.bind(Map.prototype.set),
|
||||
|
@ -1,19 +1,21 @@
|
||||
// Any copyright is dedicated to the Public Domain.
|
||||
// http://creativecommons.org/licenses/publicdomain/
|
||||
|
||||
var sym = Symbol("method");
|
||||
var hits = 0;
|
||||
var obj = {
|
||||
__noSuchMethod__: function (key, args) {
|
||||
assertEq(key, sym);
|
||||
assertEq(args.length, 2);
|
||||
assertEq(args[0], "hello");
|
||||
assertEq(args[1], "world");
|
||||
hits++;
|
||||
}
|
||||
};
|
||||
obj[sym]("hello", "world");
|
||||
assertEq(hits, 1);
|
||||
if (typeof Symbol === "function") {
|
||||
var sym = Symbol("method");
|
||||
var hits = 0;
|
||||
var obj = {
|
||||
__noSuchMethod__: function (key, args) {
|
||||
assertEq(key, sym);
|
||||
assertEq(args.length, 2);
|
||||
assertEq(args[0], "hello");
|
||||
assertEq(args[1], "world");
|
||||
hits++;
|
||||
}
|
||||
};
|
||||
obj[sym]("hello", "world");
|
||||
assertEq(hits, 1);
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,14 +1,16 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/licenses/publicdomain/ */
|
||||
|
||||
var obj = {};
|
||||
obj[Symbol.iterator] = 1;
|
||||
assertEq(obj.toSource(), "({[Symbol.iterator]:1})");
|
||||
obj[Symbol(undefined)] = 2;
|
||||
obj[Symbol('ponies')] = 3;
|
||||
obj[Symbol.for('ponies')] = 4;
|
||||
assertEq(obj.toSource(),
|
||||
'({[Symbol.iterator]:1, [Symbol()]:2, [Symbol("ponies")]:3, [Symbol.for("ponies")]:4})');
|
||||
if (typeof Symbol === "function") {
|
||||
var obj = {};
|
||||
obj[Symbol.iterator] = 1;
|
||||
assertEq(obj.toSource(), "({[Symbol.iterator]:1})");
|
||||
obj[Symbol(undefined)] = 2;
|
||||
obj[Symbol('ponies')] = 3;
|
||||
obj[Symbol.for('ponies')] = 4;
|
||||
assertEq(obj.toSource(),
|
||||
'({[Symbol.iterator]:1, [Symbol()]:2, [Symbol("ponies")]:3, [Symbol.for("ponies")]:4})');
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
@ -1,13 +1,15 @@
|
||||
// Any copyright is dedicated to the Public Domain.
|
||||
// http://creativecommons.org/licenses/publicdomain/
|
||||
|
||||
assertEq(uneval(Symbol.iterator), "Symbol.iterator");
|
||||
assertEq(uneval(Symbol()), "Symbol()");
|
||||
assertEq(uneval(Symbol("")), 'Symbol("")');
|
||||
assertEq(uneval(Symbol("ponies")), 'Symbol("ponies")');
|
||||
assertEq(uneval(Symbol.for("ponies")), 'Symbol.for("ponies")');
|
||||
if (typeof Symbol === "function") {
|
||||
assertEq(uneval(Symbol.iterator), "Symbol.iterator");
|
||||
assertEq(uneval(Symbol()), "Symbol()");
|
||||
assertEq(uneval(Symbol("")), 'Symbol("")');
|
||||
assertEq(uneval(Symbol("ponies")), 'Symbol("ponies")');
|
||||
assertEq(uneval(Symbol.for("ponies")), 'Symbol.for("ponies")');
|
||||
|
||||
assertEq({glyph: Symbol(undefined)}.toSource(), "({glyph:Symbol()})");
|
||||
assertEq({glyph: Symbol(undefined)}.toSource(), "({glyph:Symbol()})");
|
||||
}
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(0, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user