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:
Jason Orendorff 2014-08-20 13:30:04 -05:00
parent 7fe93c6acb
commit 8329a70b42
78 changed files with 1115 additions and 951 deletions

View File

@ -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);

View File

@ -1,5 +1,6 @@
function f() {
return Object(Symbol());
if (typeof Symbol === "function")
return Object(Symbol());
}
for (var i = 0; i < 4; i++) {

View File

@ -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();

View File

@ -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);
}

View File

@ -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);");

View File

@ -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);

View File

@ -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);

View File

@ -23,7 +23,8 @@ test(null);
test(false);
test(1);
test("stringy");
test(Symbol("symbolic"));
if (typeof Symbol === "function")
test(Symbol("symbolic"));
test({});
test([]);

View File

@ -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);

View File

@ -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);

View File

@ -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" +
"})()");
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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) {}
}

View File

@ -1,4 +1,5 @@
x = function() {};
y = new WeakMap;
selectforgc({});;
y.set(x, Symbol());
if (typeof Symbol === "function")
y.set(x, Symbol());

View File

@ -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));
}

View File

@ -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());
}

View File

@ -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();
}

View File

@ -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)

View File

@ -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);

View File

@ -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 = {};

View File

@ -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());
}

View File

@ -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");
}

View File

@ -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 =

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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) {

View File

@ -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);
}

View File

@ -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

View File

@ -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;
}
}

View File

@ -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) {

View File

@ -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',

View File

@ -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({}, {});

View File

@ -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());

View File

@ -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;

View File

@ -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);
}

View File

@ -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);

View File

@ -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";

View File

@ -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) {

View File

@ -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());

View File

@ -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 = [];

View File

@ -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;} };

View File

@ -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);

View File

@ -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.

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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")

View File

@ -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);
}
}
}

View File

@ -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);

View File

@ -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")

View File

@ -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);

View File

@ -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);

View File

@ -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);
}
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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');

View File

@ -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')

View File

@ -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);

View File

@ -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);

View File

@ -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")

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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")

View File

@ -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);

View File

@ -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);

View File

@ -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")

View File

@ -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);

View File

@ -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);

View File

@ -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")

View File

@ -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);

View File

@ -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),

View File

@ -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);

View File

@ -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);

View File

@ -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);