+
+describe("symbolToString", () => {
+ it('[[Call]] returns "Symbol()" when the symbol has no description', () => {
+ assertStrictEquals(symbolToString(Symbol()), "Symbol()");
+ });
+
+ it('[[Call]] returns "Symbol()" when the symbol has an empty description', () => {
+ assertStrictEquals(symbolToString(Symbol("")), "Symbol()");
+ });
+
+ it('[[Call]] returns "Symbol()" wrapping the description', () => {
+ assertStrictEquals(
+ symbolToString(Symbol("etaoin")),
+ "Symbol(etaoin)",
+ );
+ });
+
+ it("[[Construct]] throws an error", () => {
+ assertThrows(() => new symbolToString(Symbol()));
+ });
+
+ describe(".name", () => {
+ it("[[Get]] returns the correct name", () => {
+ assertStrictEquals(
+ symbolToString.name,
+ "symbolToString",
+ );
+ });
+ });
+});
+
+describe("symbolValue", () => {
+ it("[[Call]] returns the value of a symbol", () => {
+ const symbol = Symbol();
+ assertStrictEquals(symbolValue(symbol), symbol);
+ });
+
+ it("[[Call]] returns the value of a symbol wrapper", () => {
+ const symbol = Symbol();
+ assertStrictEquals(symbolValue(new Object(symbol)), symbol);
+ });
+
+ it("[[Call]] returns the value of a symbol subclass", () => {
+ class SymbolExtension extends Symbol {
+ constructor(symbol) {
+ return Object.setPrototypeOf(
+ new Object(symbol),
+ SymbolExtension.prototype,
+ );
+ }
+ }
+ const symbol = Symbol();
+ assertStrictEquals(
+ symbolValue(new SymbolExtension(symbol)),
+ symbol,
+ );
+ });
+
+ it("[[Construct]] throws an error", () => {
+ assertThrows(() => new symbolValue(Symbol()));
+ });
+
+ describe(".name", () => {
+ it("[[Get]] returns the correct name", () => {
+ assertStrictEquals(
+ symbolValue.name,
+ "symbolValue",
+ );
+ });
+ });
+});