]> Lady’s Gitweb - Pisces/blobdiff - value.test.js
Add methods for own entries and values to object.js
[Pisces] / value.test.js
index 6729b85cbc43eacf93f18b43ffe98f44d2d9690e..ce6464d07091e19fd89b84b578d7a0ede3cb258f 100644 (file)
 // ♓🌟 Piscēs ∷ value.test.js
 // ====================================================================
 //
-// Copyright © 2022 Lady [@ Lady’s Computer].
+// Copyright © 2022–2023 Lady [@ Lady’s Computer].
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
 // file, You can obtain one at <https://mozilla.org/MPL/2.0/>.
 
 import {
-  assert,
+  assertEquals,
   assertStrictEquals,
   assertThrows,
   describe,
   it,
 } from "./dev-deps.js";
 import {
+  ASYNC_ITERATOR,
+  completePropertyDescriptor,
+  HAS_INSTANCE,
+  IS_CONCAT_SPREADABLE,
+  isAccessorDescriptor,
+  isDataDescriptor,
+  isFullyPopulatedDescriptor,
+  isGenericDescriptor,
+  ITERATOR,
+  LN10,
+  LN2,
+  LOG10ℇ,
+  LOG2ℇ,
+  MATCH,
+  MATCH_ALL,
+  MAXIMUM_NUMBER,
+  MAXIMUM_SAFE_INTEGRAL_NUMBER,
+  MINIMUM_NUMBER,
+  MINIMUM_SAFE_INTEGRAL_NUMBER,
+  NAN,
+  NEGATIVE_INFINITY,
+  NEGATIVE_ZERO,
   NULL,
   ordinaryToPrimitive,
+  POSITIVE_INFINITY,
+  POSITIVE_ZERO,
+  RECIPROCAL_SQRT2,
+  REPLACE,
   sameValue,
   sameValueZero,
+  SPECIES,
+  SPLIT,
+  SQRT2,
+  TO_PRIMITIVE,
+  TO_STRING_TAG,
+  toFunctionName,
+  toIndex,
+  toLength,
   toPrimitive,
+  toPropertyKey,
   type,
   UNDEFINED,
+  UNSCOPABLES,
+  Ε,
+  Π,
+  ℇ,
 } from "./value.js";
 
+describe("ASYNC_ITERATOR", () => {
+  it("[[Get]] is @@asyncIterator", () => {
+    assertStrictEquals(ASYNC_ITERATOR, Symbol.asyncIterator);
+  });
+});
+
+describe("HAS_INSTANCE", () => {
+  it("[[Get]] is @@hasInstance", () => {
+    assertStrictEquals(HAS_INSTANCE, Symbol.hasInstance);
+  });
+});
+
+describe("IS_CONCAT_SPREADABLE", () => {
+  it("[[Get]] is @@isConcatSpreadable", () => {
+    assertStrictEquals(
+      IS_CONCAT_SPREADABLE,
+      Symbol.isConcatSpreadable,
+    );
+  });
+});
+
+describe("ITERATOR", () => {
+  it("[[Get]] is @@iterator", () => {
+    assertStrictEquals(ITERATOR, Symbol.iterator);
+  });
+});
+
+describe("LN10", () => {
+  it("[[Get]] is ln(10)", () => {
+    assertStrictEquals(LN10, Math.LN10);
+  });
+});
+
+describe("LN2", () => {
+  it("[[Get]] is ln(2)", () => {
+    assertStrictEquals(LN2, Math.LN2);
+  });
+});
+
+describe("LOG10ℇ", () => {
+  it("[[Get]] is log10(ℇ)", () => {
+    assertStrictEquals(LOG10ℇ, Math.LOG10E);
+  });
+});
+
+describe("LOG2ℇ", () => {
+  it("[[Get]] is log2(ℇ)", () => {
+    assertStrictEquals(LOG2ℇ, Math.LOG2E);
+  });
+});
+
+describe("MATCH", () => {
+  it("[[Get]] is @@match", () => {
+    assertStrictEquals(MATCH, Symbol.match);
+  });
+});
+
+describe("MATCH_ALL", () => {
+  it("[[Get]] is @@matchAll", () => {
+    assertStrictEquals(MATCH_ALL, Symbol.matchAll);
+  });
+});
+
+describe("MAXIMUM_NUMBER", () => {
+  it("[[Get]] is the maximum number", () => {
+    assertStrictEquals(MAXIMUM_NUMBER, Number.MAX_VALUE);
+  });
+});
+
+describe("MAXIMUM_SAFE_INTEGRAL_NUMBER", () => {
+  it("[[Get]] is the maximum safe integral number", () => {
+    assertStrictEquals(
+      MAXIMUM_SAFE_INTEGRAL_NUMBER,
+      Number.MAX_SAFE_INTEGER,
+    );
+  });
+});
+
+describe("MINIMUM_NUMBER", () => {
+  it("[[Get]] is the minimum number", () => {
+    assertStrictEquals(MINIMUM_NUMBER, Number.MIN_VALUE);
+  });
+});
+
+describe("MINIMUM_SAFE_INTEGRAL_NUMBER", () => {
+  it("[[Get]] is the minimum safe integral number", () => {
+    assertStrictEquals(
+      MINIMUM_SAFE_INTEGRAL_NUMBER,
+      Number.MIN_SAFE_INTEGER,
+    );
+  });
+});
+
+describe("NAN", () => {
+  it("[[Get]] is nan", () => {
+    assertStrictEquals(NAN, NaN);
+  });
+});
+
+describe("NEGATIVE_INFINITY", () => {
+  it("[[Get]] is negative infinity", () => {
+    assertStrictEquals(NEGATIVE_INFINITY, -Infinity);
+  });
+});
+
+describe("NEGATIVE_ZERO", () => {
+  it("[[Get]] is negative zero", () => {
+    assertStrictEquals(NEGATIVE_ZERO, -0);
+  });
+});
+
 describe("NULL", () => {
   it("[[Get]] is null", () => {
     assertStrictEquals(NULL, null);
   });
 });
 
+describe("POSITIVE_INFINITY", () => {
+  it("[[Get]] is negative infinity", () => {
+    assertStrictEquals(POSITIVE_INFINITY, Infinity);
+  });
+});
+
+describe("POSITIVE_ZERO", () => {
+  it("[[Get]] is positive zero", () => {
+    assertStrictEquals(POSITIVE_ZERO, 0);
+  });
+});
+
+describe("RECIPROCAL_SQRT2", () => {
+  it("[[Get]] is sqrt(½)", () => {
+    assertStrictEquals(RECIPROCAL_SQRT2, Math.SQRT1_2);
+  });
+});
+
+describe("REPLACE", () => {
+  it("[[Get]] is @@replace", () => {
+    assertStrictEquals(REPLACE, Symbol.replace);
+  });
+});
+
+describe("SPECIES", () => {
+  it("[[Get]] is @@species", () => {
+    assertStrictEquals(SPECIES, Symbol.species);
+  });
+});
+
+describe("SPLIT", () => {
+  it("[[Get]] is @@split", () => {
+    assertStrictEquals(SPLIT, Symbol.split);
+  });
+});
+
+describe("SQRT2", () => {
+  it("[[Get]] is sqrt(2)", () => {
+    assertStrictEquals(SQRT2, Math.SQRT2);
+  });
+});
+
+describe("TO_PRIMITIVE", () => {
+  it("[[Get]] is @@toPrimitive", () => {
+    assertStrictEquals(TO_PRIMITIVE, Symbol.toPrimitive);
+  });
+});
+
+describe("TO_STRING_TAG", () => {
+  it("[[Get]] is @@toStringTag", () => {
+    assertStrictEquals(TO_STRING_TAG, Symbol.toStringTag);
+  });
+});
+
 describe("UNDEFINED", () => {
   it("[[Get]] is undefined", () => {
     assertStrictEquals(UNDEFINED, void {});
   });
 });
 
+describe("UNSCOPABLES", () => {
+  it("[[Get]] is @@unscopables", () => {
+    assertStrictEquals(UNSCOPABLES, Symbol.unscopables);
+  });
+});
+
+describe("completePropertyDescriptor", () => {
+  it("[[Call]] completes a generic descriptor", () => {
+    const desc = {};
+    completePropertyDescriptor(desc);
+    assertEquals(desc, {
+      configurable: false,
+      enumerable: false,
+      value: undefined,
+      writable: false,
+    });
+  });
+
+  it("[[Call]] completes a data descriptor", () => {
+    const desc = { value: undefined };
+    completePropertyDescriptor(desc);
+    assertEquals(desc, {
+      configurable: false,
+      enumerable: false,
+      value: undefined,
+      writable: false,
+    });
+  });
+
+  it("[[Call]] completes an accessor descriptor", () => {
+    const desc = { get: undefined };
+    completePropertyDescriptor(desc);
+    assertEquals(desc, {
+      configurable: false,
+      enumerable: false,
+      get: undefined,
+      set: undefined,
+    });
+  });
+
+  it("[[Call]] throws an error when the descriptor is undefined", () => {
+    assertThrows(() => new completePropertyDescriptor(undefined));
+  });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new completePropertyDescriptor({}));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(completePropertyDescriptor.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(
+        completePropertyDescriptor.name,
+        "completePropertyDescriptor",
+      );
+    });
+  });
+});
+
+describe("isAccessorDescriptor", () => {
+  it("[[Call]] returns false for a generic descriptor", () => {
+    assertStrictEquals(isAccessorDescriptor({}), false);
+  });
+
+  it("[[Get]] returns false for a data descriptor", () => {
+    assertStrictEquals(
+      isAccessorDescriptor({ value: undefined }),
+      false,
+    );
+    assertStrictEquals(
+      isAccessorDescriptor({ writable: undefined }),
+      false,
+    );
+  });
+
+  it("[[Get]] returns true for an accessor descriptor", () => {
+    assertStrictEquals(isAccessorDescriptor({ get: undefined }), true);
+    assertStrictEquals(isAccessorDescriptor({ set: undefined }), true);
+  });
+
+  it("[[Get]] returns false for undefined", () => {
+    assertStrictEquals(isAccessorDescriptor(undefined), false);
+  });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new isAccessorDescriptor({}));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(isAccessorDescriptor.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(
+        isAccessorDescriptor.name,
+        "isAccessorDescriptor",
+      );
+    });
+  });
+});
+
+describe("isDataDescriptor", () => {
+  it("[[Call]] returns false for a generic descriptor", () => {
+    assertStrictEquals(isDataDescriptor({}), false);
+  });
+
+  it("[[Get]] returns true for a data descriptor", () => {
+    assertStrictEquals(isDataDescriptor({ value: undefined }), true);
+    assertStrictEquals(isDataDescriptor({ writable: true }), true);
+  });
+
+  it("[[Get]] returns false for an accessor descriptor", () => {
+    assertStrictEquals(isDataDescriptor({ get: undefined }), false);
+    assertStrictEquals(isDataDescriptor({ set: undefined }), false);
+  });
+
+  it("[[Get]] returns false for undefined", () => {
+    assertStrictEquals(isDataDescriptor(undefined), false);
+  });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new isDataDescriptor({}));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(isDataDescriptor.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(isDataDescriptor.name, "isDataDescriptor");
+    });
+  });
+});
+
+describe("isFullyPopulatedDescriptor", () => {
+  it("[[Call]] returns false for a generic descriptor", () => {
+    assertStrictEquals(isFullyPopulatedDescriptor({}), false);
+  });
+
+  it("[[Get]] returns false for a non‐fully‐populated data descriptor", () => {
+    assertStrictEquals(
+      isFullyPopulatedDescriptor({ value: undefined }),
+      false,
+    );
+    assertStrictEquals(
+      isFullyPopulatedDescriptor({ writable: true }),
+      false,
+    );
+  });
+
+  it("[[Get]] returns true for a fully‐populated data descriptor", () => {
+    assertStrictEquals(
+      isFullyPopulatedDescriptor({
+        configurable: true,
+        enumerable: true,
+        value: undefined,
+        writable: true,
+      }),
+      true,
+    );
+  });
+
+  it("[[Get]] returns false for a non‐fully‐populated accessor descriptor", () => {
+    assertStrictEquals(
+      isFullyPopulatedDescriptor({ get: undefined }),
+      false,
+    );
+    assertStrictEquals(
+      isFullyPopulatedDescriptor({ set: undefined }),
+      false,
+    );
+  });
+
+  it("[[Get]] returns true for a fully‐populated accessor descriptor", () => {
+    assertStrictEquals(
+      isFullyPopulatedDescriptor({
+        configurable: true,
+        enumerable: true,
+        get: undefined,
+        set: undefined,
+      }),
+      true,
+    );
+  });
+
+  it("[[Get]] returns false for undefined", () => {
+    assertStrictEquals(isFullyPopulatedDescriptor(undefined), false);
+  });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new isFullyPopulatedDescriptor({}));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(isFullyPopulatedDescriptor.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(
+        isFullyPopulatedDescriptor.name,
+        "isFullyPopulatedDescriptor",
+      );
+    });
+  });
+});
+
+describe("isGenericDescriptor", () => {
+  it("[[Call]] returns true for a generic descriptor", () => {
+    assertStrictEquals(isGenericDescriptor({}), true);
+  });
+
+  it("[[Get]] returns false for a data descriptor", () => {
+    assertStrictEquals(
+      isGenericDescriptor({ value: undefined }),
+      false,
+    );
+    assertStrictEquals(isGenericDescriptor({ writable: true }), false);
+  });
+
+  it("[[Get]] returns false for an accessor descriptor", () => {
+    assertStrictEquals(isGenericDescriptor({ get: undefined }), false);
+    assertStrictEquals(isGenericDescriptor({ set: undefined }), false);
+  });
+
+  it("[[Get]] returns false for undefined", () => {
+    assertStrictEquals(isGenericDescriptor(undefined), false);
+  });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new isGenericDescriptor({}));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(isGenericDescriptor.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(
+        isGenericDescriptor.name,
+        "isGenericDescriptor",
+      );
+    });
+  });
+});
+
 describe("ordinaryToPrimitive", () => {
   it("[[Call]] prefers `valueOf` by default", () => {
     const obj = {
@@ -115,83 +581,301 @@ describe("ordinaryToPrimitive", () => {
     };
     assertThrows(() => ordinaryToPrimitive(obj));
   });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new ordinaryToPrimitive(""));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(ordinaryToPrimitive.length, 2);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(
+        ordinaryToPrimitive.name,
+        "ordinaryToPrimitive",
+      );
+    });
+  });
 });
 
 describe("sameValue", () => {
   it("[[Call]] returns false for null 🆚 undefined", () => {
-    assert(!sameValue(null, void {}));
+    assertStrictEquals(sameValue(null, undefined), false);
   });
 
   it("[[Call]] returns false for null 🆚 an object", () => {
-    assert(!sameValue(null, {}));
+    assertStrictEquals(sameValue(null, {}), false);
   });
 
   it("[[Call]] returns true for null 🆚 null", () => {
-    assert(sameValue(null, null));
+    assertStrictEquals(sameValue(null, null), true);
   });
 
   it("[[Call]] returns false for two different objects", () => {
-    assert(!sameValue({}, {}));
+    assertStrictEquals(sameValue({}, {}), false);
   });
 
   it("[[Call]] returns true for the same object", () => {
     const obj = {};
-    assert(sameValue(obj, obj));
+    assertStrictEquals(sameValue(obj, obj), true);
   });
 
   it("[[Call]] returns false for ±0", () => {
-    assert(!sameValue(0, -0));
+    assertStrictEquals(sameValue(0, -0), false);
   });
 
   it("[[Call]] returns true for -0", () => {
-    assert(sameValue(-0, -0));
+    assertStrictEquals(sameValue(-0, -0), true);
   });
 
   it("[[Call]] returns true for nan", () => {
-    assert(sameValue(0 / 0, 0 / 0));
+    assertStrictEquals(sameValue(0 / 0, 0 / 0), true);
   });
 
   it("[[Call]] returns false for a primitive and its wrapped object", () => {
-    assert(!sameValue(false, new Boolean(false)));
+    assertStrictEquals(sameValue(false, new Boolean(false)), false);
+  });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new sameValue(true, true));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(sameValue.length, 2);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(sameValue.name, "sameValue");
+    });
   });
 });
 
 describe("sameValueZero", () => {
   it("[[Call]] returns false for null 🆚 undefined", () => {
-    assert(!sameValueZero(null, void {}));
+    assertStrictEquals(sameValueZero(null, undefined), false);
   });
 
   it("[[Call]] returns false for null 🆚 an object", () => {
-    assert(!sameValueZero(null, {}));
+    assertStrictEquals(sameValueZero(null, {}), false);
   });
 
   it("[[Call]] returns true for null 🆚 null", () => {
-    assert(sameValueZero(null, null));
+    assertStrictEquals(sameValueZero(null, null), true);
   });
 
   it("[[Call]] returns false for two different objects", () => {
-    assert(!sameValueZero({}, {}));
+    assertStrictEquals(sameValueZero({}, {}), false);
   });
 
   it("[[Call]] returns true for the same object", () => {
     const obj = {};
-    assert(sameValueZero(obj, obj));
+    assertStrictEquals(sameValueZero(obj, obj), true);
   });
 
   it("[[Call]] returns true for ±0", () => {
-    assert(sameValueZero(0, -0));
+    assertStrictEquals(sameValueZero(0, -0), true);
   });
 
   it("[[Call]] returns true for -0", () => {
-    assert(sameValueZero(-0, -0));
+    assertStrictEquals(sameValueZero(-0, -0), true);
   });
 
   it("[[Call]] returns true for nan", () => {
-    assert(sameValueZero(0 / 0, 0 / 0));
+    assertStrictEquals(sameValueZero(0 / 0, 0 / 0), true);
   });
 
   it("[[Call]] returns false for a primitive and its wrapped object", () => {
-    assert(!sameValueZero(false, new Boolean(false)));
+    assertStrictEquals(
+      sameValueZero(false, new Boolean(false)),
+      false,
+    );
+  });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new sameValueZero(true, true));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(sameValueZero.length, 2);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(sameValueZero.name, "sameValueZero");
+    });
+  });
+});
+
+describe("toFunctionName", () => {
+  it("[[Call]] works with strings and no prefix", () => {
+    assertStrictEquals(toFunctionName("etaoin"), "etaoin");
+  });
+
+  it("[[Call]] works with objects and no prefix", () => {
+    assertStrictEquals(
+      toFunctionName({
+        toString() {
+          return "etaoin";
+        },
+      }),
+      "etaoin",
+    );
+  });
+
+  it("[[Call]] works with descriptionless symbols and no prefix", () => {
+    assertStrictEquals(toFunctionName(Symbol()), "");
+  });
+
+  it("[[Call]] works with empty description symbols and no prefix", () => {
+    assertStrictEquals(toFunctionName(Symbol("")), "[]");
+  });
+
+  it("[[Call]] works with described symbols and no prefix", () => {
+    assertStrictEquals(toFunctionName(Symbol("etaoin")), "[etaoin]");
+  });
+
+  it("[[Call]] works with strings and a prefix", () => {
+    assertStrictEquals(toFunctionName("etaoin", "foo"), "foo etaoin");
+  });
+
+  it("[[Call]] works with objects and no prefix", () => {
+    assertStrictEquals(
+      toFunctionName({
+        toString() {
+          return "etaoin";
+        },
+      }, "foo"),
+      "foo etaoin",
+    );
+  });
+
+  it("[[Call]] works with descriptionless symbols and no prefix", () => {
+    assertStrictEquals(toFunctionName(Symbol(), "foo"), "foo ");
+  });
+
+  it("[[Call]] works with empty description symbols and no prefix", () => {
+    assertStrictEquals(toFunctionName(Symbol(""), "foo"), "foo []");
+  });
+
+  it("[[Call]] works with described symbols and no prefix", () => {
+    assertStrictEquals(
+      toFunctionName(Symbol("etaoin"), "foo"),
+      "foo [etaoin]",
+    );
+  });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new toFunctionName(""));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(toFunctionName.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(
+        toFunctionName.name,
+        "toFunctionName",
+      );
+    });
+  });
+});
+
+describe("toIndex", () => {
+  it("[[Call]] returns an index", () => {
+    assertStrictEquals(toIndex(9007199254740991), 9007199254740991);
+  });
+
+  it("[[Call]] returns zero for a zerolike argument", () => {
+    assertStrictEquals(toIndex(NaN), 0);
+    assertStrictEquals(toIndex("failure"), 0);
+    assertStrictEquals(toIndex(-0), 0);
+  });
+
+  it("[[Call]] rounds down to the nearest integer", () => {
+    assertStrictEquals(toIndex(0.25), 0);
+    assertStrictEquals(toIndex(1.1), 1);
+  });
+
+  it("[[Call]] throws when provided a negative number", () => {
+    assertThrows(() => toIndex(-1));
+    assertThrows(() => toIndex(-Infinity));
+  });
+
+  it("[[Call]] throws when provided a number greater than or equal to 2 ** 53", () => {
+    assertThrows(() => toIndex(9007199254740992));
+    assertThrows(() => toIndex(Infinity));
+  });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new toIndex(0));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(toIndex.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(toIndex.name, "toIndex");
+    });
+  });
+});
+
+describe("toLength", () => {
+  it("[[Call]] returns a length", () => {
+    assertStrictEquals(toLength(9007199254740991), 9007199254740991);
+  });
+
+  it("[[Call]] returns zero for a nan argument", () => {
+    assertStrictEquals(toLength(NaN), 0);
+    assertStrictEquals(toLength("failure"), 0);
+  });
+
+  it("[[Call]] rounds down to the nearest integer", () => {
+    assertStrictEquals(toLength(0.25), 0);
+    assertStrictEquals(toLength(1.1), 1);
+  });
+
+  it("[[Call]] returns a result greater than or equal to zero", () => {
+    assertStrictEquals(toLength(-0), 0);
+    assertStrictEquals(toLength(-1), 0);
+    assertStrictEquals(toLength(-Infinity), 0);
+  });
+
+  it("[[Call]] returns a result less than 2 ** 53", () => {
+    assertStrictEquals(toLength(9007199254740992), 9007199254740991);
+    assertStrictEquals(toLength(Infinity), 9007199254740991);
+  });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new toLength(0));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(toLength.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(toLength.name, "toLength");
+    });
   });
 });
 
@@ -266,7 +950,7 @@ describe("toPrimitive", () => {
         },
       },
     );
-    assertStrictEquals(toPrimitive(value, "default"), "success");
+    assertStrictEquals(toPrimitive(value), "success");
   });
 
   it("[[Call]] throws for an invalid hint", () => {
@@ -290,6 +974,63 @@ describe("toPrimitive", () => {
     assertThrows(() => toPrimitive(value2, "badhint"));
     assertThrows(() => toPrimitive(true, "badhint"));
   });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new toPrimitive(true));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(toPrimitive.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(toPrimitive.name, "toPrimitive");
+    });
+  });
+});
+
+describe("toPropertyKey", () => {
+  it("returns a string or symbol", () => {
+    const sym = Symbol();
+    assertStrictEquals(toPropertyKey(sym), sym);
+    assertStrictEquals(
+      toPropertyKey(new String("success")),
+      "success",
+    );
+  });
+
+  it("favours the `toString` representation", () => {
+    assertStrictEquals(
+      toPropertyKey({
+        toString() {
+          return "success";
+        },
+        valueOf() {
+          return "failure";
+        },
+      }),
+      "success",
+    );
+  });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new toPropertyKey(""));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(toPropertyKey.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(toPropertyKey.name, "toPropertyKey");
+    });
+  });
 });
 
 describe("type", () => {
@@ -312,4 +1053,38 @@ describe("type", () => {
   it('[[Call]] returns "object" for constructable objects', () => {
     assertStrictEquals(type(class {}), "object");
   });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new type({}));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(type.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(type.name, "type");
+    });
+  });
+});
+
+describe("Ε", () => {
+  it("[[Get]] is ε", () => {
+    assertStrictEquals(Ε, Number.EPSILON);
+  });
+});
+
+describe("Π", () => {
+  it("[[Get]] is π", () => {
+    assertStrictEquals(Π, Math.PI);
+  });
+});
+
+describe("ℇ", () => {
+  it("[[Get]] is ℇ", () => {
+    assertStrictEquals(ℇ, Math.E);
+  });
 });
This page took 0.084724 seconds and 4 git commands to generate.