function shouldBe(actual, expected) { if (actual !== expected) throw new Error(`bad value: ${String(actual)}`); } function shouldThrow(func, errorMessage) { var errorThrown = false; var error = null; try { func(); } catch (e) { errorThrown = true; error = e; } if (!errorThrown) throw new Error('not thrown'); if (String(error) !== errorMessage) throw new Error(`bad error: ${String(error)}`); } var s0 = Symbol("Cocoa"); var s1 = Symbol("Cappuccino"); var s2 = Symbol(""); var s3 = Symbol(); shouldBe(s0.description, "Cocoa"); shouldBe(s0.toString(), "Symbol(Cocoa)"); shouldBe(s1.description, "Cappuccino"); shouldBe(s1.toString(), "Symbol(Cappuccino)"); shouldBe(s2.description, ""); shouldBe(s2.toString(), "Symbol()"); shouldBe(s3.description, undefined); shouldBe(s3.toString(), "Symbol()"); var o0 = Object(s0); var o1 = Object(s1); var o2 = Object(s2); var o3 = Object(s3); shouldBe(o0.description, "Cocoa"); shouldBe(o0.toString(), "Symbol(Cocoa)"); shouldBe(o1.description, "Cappuccino"); shouldBe(o1.toString(), "Symbol(Cappuccino)"); shouldBe(o2.description, ""); shouldBe(o2.toString(), "Symbol()"); shouldBe(o3.description, undefined); shouldBe(o3.toString(), "Symbol()"); var descriptor = Object.getOwnPropertyDescriptor(Symbol.prototype, "description"); shouldBe(descriptor.enumerable, false); shouldBe(descriptor.configurable, true); shouldBe(descriptor.set, undefined); shouldBe(typeof descriptor.get, "function"); shouldThrow(() => { "use strict"; s0.description = "Matcha"; }, `TypeError: Attempted to assign to readonly property.`); shouldThrow(() => { "use strict"; o0.description = "Matcha"; }, `TypeError: Attempted to assign to readonly property.`); shouldThrow(() => { descriptor.get.call({}); }, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); shouldThrow(() => { descriptor.get.call(null); }, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); shouldThrow(() => { descriptor.get.call(undefined); }, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); shouldThrow(() => { descriptor.get.call(42); }, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); shouldThrow(() => { descriptor.get.call("Hello"); }, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); shouldThrow(() => { descriptor.get.call(42.195); }, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); shouldThrow(() => { descriptor.get.call(false); }, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); shouldBe(descriptor.get.call(s0), "Cocoa"); shouldBe(descriptor.get.call(o0), "Cocoa"); o0.__proto__ = {}; shouldBe(descriptor.get.call(o0), "Cocoa");