X-Git-Url: https://git.ladys.computer/Pisces/blobdiff_plain/37c295ffa9d5a062fe15d78427e2a7096a416bb3..9c6be9646631101a3883d4dac08495d5e35e9977:/value.test.js diff --git a/value.test.js b/value.test.js index 9121af4..b7dcd69 100644 --- a/value.test.js +++ b/value.test.js @@ -1,13 +1,17 @@ -// ♓🌟 Piscēs ∷ value.test.js -// ==================================================================== -// -// 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 . +// SPDX-FileCopyrightText: 2022, 2023, 2025 Lady +// SPDX-License-Identifier: MPL-2.0 +/** + * ⁌ ♓🌟 Piscēs ∷ value.test.js + * + * Copyright © 2022–2023, 2025 Lady [@ Ladys 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 . + */ import { + assertEquals, assertStrictEquals, assertThrows, describe, @@ -15,13 +19,18 @@ import { } from "./dev-deps.js"; import { ASYNC_ITERATOR, + completePropertyDescriptor, HAS_INSTANCE, IS_CONCAT_SPREADABLE, + isAccessorDescriptor, + isDataDescriptor, + isFullyPopulatedDescriptor, + isGenericDescriptor, ITERATOR, - LN10, - LN2, - LOG10ℇ, - LOG2ℇ, + LN_10, + LN_2, + LOG10_𝑒, + LOG2_𝑒, MATCH, MATCH_ALL, MAXIMUM_NUMBER, @@ -35,25 +44,26 @@ import { ordinaryToPrimitive, POSITIVE_INFINITY, POSITIVE_ZERO, - RECIPROCAL_SQRT2, + RECIPROCAL_SQRT_2, REPLACE, sameValue, sameValueZero, SPECIES, SPLIT, - SQRT2, + SQRT_2, TO_PRIMITIVE, TO_STRING_TAG, toFunctionName, toIndex, toLength, toPrimitive, + toPropertyKey, type, UNDEFINED, UNSCOPABLES, - Ε, - Π, - ℇ, + 𝑒, + 𝜀, + 𝜋, } from "./value.js"; describe("ASYNC_ITERATOR", () => { @@ -83,27 +93,27 @@ describe("ITERATOR", () => { }); }); -describe("LN10", () => { +describe("LN_10", () => { it("[[Get]] is ln(10)", () => { - assertStrictEquals(LN10, Math.LN10); + assertStrictEquals(LN_10, Math.LN10); }); }); -describe("LN2", () => { +describe("LN_2", () => { it("[[Get]] is ln(2)", () => { - assertStrictEquals(LN2, Math.LN2); + assertStrictEquals(LN_2, Math.LN2); }); }); -describe("LOG10ℇ", () => { - it("[[Get]] is log10(ℇ)", () => { - assertStrictEquals(LOG10ℇ, Math.LOG10E); +describe("LOG10_𝑒", () => { + it("[[Get]] is log10(𝑒)", () => { + assertStrictEquals(LOG10_𝑒, Math.LOG10E); }); }); -describe("LOG2ℇ", () => { +describe("LOG2_𝑒", () => { it("[[Get]] is log2(ℇ)", () => { - assertStrictEquals(LOG2ℇ, Math.LOG2E); + assertStrictEquals(LOG2_𝑒, Math.LOG2E); }); }); @@ -185,9 +195,9 @@ describe("POSITIVE_ZERO", () => { }); }); -describe("RECIPROCAL_SQRT2", () => { +describe("RECIPROCAL_SQRT_2", () => { it("[[Get]] is sqrt(½)", () => { - assertStrictEquals(RECIPROCAL_SQRT2, Math.SQRT1_2); + assertStrictEquals(RECIPROCAL_SQRT_2, Math.SQRT1_2); }); }); @@ -209,9 +219,9 @@ describe("SPLIT", () => { }); }); -describe("SQRT2", () => { +describe("SQRT_2", () => { it("[[Get]] is sqrt(2)", () => { - assertStrictEquals(SQRT2, Math.SQRT2); + assertStrictEquals(SQRT_2, Math.SQRT2); }); }); @@ -239,21 +249,259 @@ describe("UNSCOPABLES", () => { }); }); -describe("Ε", () => { - it("[[Get]] is ε", () => { - assertStrictEquals(Ε, Number.EPSILON); +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("Π", () => { - it("[[Get]] is π", () => { - assertStrictEquals(Π, Math.PI); +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("ℇ", () => { - it("[[Get]] is ℇ", () => { - assertStrictEquals(ℇ, Math.E); +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", + ); + }); }); }); @@ -747,6 +995,47 @@ describe("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", () => { it('[[Call]] returns "null" for null', () => { assertStrictEquals(type(null), "null"); @@ -784,3 +1073,21 @@ describe("type", () => { }); }); }); + +describe("𝑒", () => { + it("[[Get]] is 𝑒", () => { + assertStrictEquals(𝑒, Math.E); + }); +}); + +describe("𝜀", () => { + it("[[Get]] is 𝜀", () => { + assertStrictEquals(𝜀, Number.EPSILON); + }); +}); + +describe("𝜋", () => { + it("[[Get]] is 𝜋", () => { + assertStrictEquals(𝜋, Math.PI); + }); +});