1 // SPDX-FileCopyrightText: 2022, 2023, 2025 Lady <https://www.ladys.computer/about/#lady>
2 // SPDX-License-Identifier: MPL-2.0
4 * β βπ PiscΔs β· value.test.js
6 * Copyright Β© 2022β2023, 2025 Lady [@ Ladys Computer].
8 * This Source Code Form is subject to the terms of the Mozilla Public
9 * License, v. 2.0. If a copy of the MPL was not distributed with this
10 * file, You can obtain one at <https://mozilla.org/MPL/2.0/>.
19 } from "./dev-deps.js";
22 completePropertyDescriptor
,
27 isFullyPopulatedDescriptor
,
37 MAXIMUM_SAFE_INTEGRAL_NUMBER
,
39 MINIMUM_SAFE_INTEGRAL_NUMBER
,
69 describe("ASYNC_ITERATOR", () => {
70 it("[[Get]] is @@asyncIterator", () => {
71 assertStrictEquals(ASYNC_ITERATOR
, Symbol
.asyncIterator
);
75 describe("HAS_INSTANCE", () => {
76 it("[[Get]] is @@hasInstance", () => {
77 assertStrictEquals(HAS_INSTANCE
, Symbol
.hasInstance
);
81 describe("IS_CONCAT_SPREADABLE", () => {
82 it("[[Get]] is @@isConcatSpreadable", () => {
85 Symbol
.isConcatSpreadable
,
90 describe("ITERATOR", () => {
91 it("[[Get]] is @@iterator", () => {
92 assertStrictEquals(ITERATOR
, Symbol
.iterator
);
96 describe("LN_10", () => {
97 it("[[Get]] is ln(10)", () => {
98 assertStrictEquals(LN_10
, Math
.LN10
);
102 describe("LN_2", () => {
103 it("[[Get]] is ln(2)", () => {
104 assertStrictEquals(LN_2
, Math
.LN2
);
108 describe("LOG10_π", () => {
109 it("[[Get]] is log10(π)", () => {
110 assertStrictEquals(LOG10_
π, Math
.LOG10E
);
114 describe("LOG2_π", () => {
115 it("[[Get]] is log2(β)", () => {
116 assertStrictEquals(LOG2_
π, Math
.LOG2E
);
120 describe("MATCH", () => {
121 it("[[Get]] is @@match", () => {
122 assertStrictEquals(MATCH
, Symbol
.match
);
126 describe("MATCH_ALL", () => {
127 it("[[Get]] is @@matchAll", () => {
128 assertStrictEquals(MATCH_ALL
, Symbol
.matchAll
);
132 describe("MAXIMUM_NUMBER", () => {
133 it("[[Get]] is the maximum number", () => {
134 assertStrictEquals(MAXIMUM_NUMBER
, Number
.MAX_VALUE
);
138 describe("MAXIMUM_SAFE_INTEGRAL_NUMBER", () => {
139 it("[[Get]] is the maximum safe integral number", () => {
141 MAXIMUM_SAFE_INTEGRAL_NUMBER
,
142 Number
.MAX_SAFE_INTEGER
,
147 describe("MINIMUM_NUMBER", () => {
148 it("[[Get]] is the minimum number", () => {
149 assertStrictEquals(MINIMUM_NUMBER
, Number
.MIN_VALUE
);
153 describe("MINIMUM_SAFE_INTEGRAL_NUMBER", () => {
154 it("[[Get]] is the minimum safe integral number", () => {
156 MINIMUM_SAFE_INTEGRAL_NUMBER
,
157 Number
.MIN_SAFE_INTEGER
,
162 describe("NAN", () => {
163 it("[[Get]] is nan", () => {
164 assertStrictEquals(NAN
, NaN
);
168 describe("NEGATIVE_INFINITY", () => {
169 it("[[Get]] is negative infinity", () => {
170 assertStrictEquals(NEGATIVE_INFINITY
, -Infinity
);
174 describe("NEGATIVE_ZERO", () => {
175 it("[[Get]] is negative zero", () => {
176 assertStrictEquals(NEGATIVE_ZERO
, -0);
180 describe("NULL", () => {
181 it("[[Get]] is null", () => {
182 assertStrictEquals(NULL
, null);
186 describe("POSITIVE_INFINITY", () => {
187 it("[[Get]] is negative infinity", () => {
188 assertStrictEquals(POSITIVE_INFINITY
, Infinity
);
192 describe("POSITIVE_ZERO", () => {
193 it("[[Get]] is positive zero", () => {
194 assertStrictEquals(POSITIVE_ZERO
, 0);
198 describe("RECIPROCAL_SQRT_2", () => {
199 it("[[Get]] is sqrt(Β½)", () => {
200 assertStrictEquals(RECIPROCAL_SQRT_2
, Math
.SQRT1_2
);
204 describe("REPLACE", () => {
205 it("[[Get]] is @@replace", () => {
206 assertStrictEquals(REPLACE
, Symbol
.replace
);
210 describe("SPECIES", () => {
211 it("[[Get]] is @@species", () => {
212 assertStrictEquals(SPECIES
, Symbol
.species
);
216 describe("SPLIT", () => {
217 it("[[Get]] is @@split", () => {
218 assertStrictEquals(SPLIT
, Symbol
.split
);
222 describe("SQRT_2", () => {
223 it("[[Get]] is sqrt(2)", () => {
224 assertStrictEquals(SQRT_2
, Math
.SQRT2
);
228 describe("TO_PRIMITIVE", () => {
229 it("[[Get]] is @@toPrimitive", () => {
230 assertStrictEquals(TO_PRIMITIVE
, Symbol
.toPrimitive
);
234 describe("TO_STRING_TAG", () => {
235 it("[[Get]] is @@toStringTag", () => {
236 assertStrictEquals(TO_STRING_TAG
, Symbol
.toStringTag
);
240 describe("UNDEFINED", () => {
241 it("[[Get]] is undefined", () => {
242 assertStrictEquals(UNDEFINED
, void {});
246 describe("UNSCOPABLES", () => {
247 it("[[Get]] is @@unscopables", () => {
248 assertStrictEquals(UNSCOPABLES
, Symbol
.unscopables
);
252 describe("completePropertyDescriptor", () => {
253 it("[[Call]] completes a generic descriptor", () => {
255 completePropertyDescriptor(desc
);
264 it("[[Call]] completes a data descriptor", () => {
265 const desc
= { value: undefined };
266 completePropertyDescriptor(desc
);
275 it("[[Call]] completes an accessor descriptor", () => {
276 const desc
= { get: undefined };
277 completePropertyDescriptor(desc
);
286 it("[[Call]] throws an error when the descriptor is undefined", () => {
287 assertThrows(() => new completePropertyDescriptor(undefined));
290 it("[[Construct]] throws an error", () => {
291 assertThrows(() => new completePropertyDescriptor({}));
294 describe(".length", () => {
295 it("[[Get]] returns the correct length", () => {
296 assertStrictEquals(completePropertyDescriptor
.length
, 1);
300 describe(".name", () => {
301 it("[[Get]] returns the correct name", () => {
303 completePropertyDescriptor
.name
,
304 "completePropertyDescriptor",
310 describe("isAccessorDescriptor", () => {
311 it("[[Call]] returns false for a generic descriptor", () => {
312 assertStrictEquals(isAccessorDescriptor({}), false);
315 it("[[Get]] returns false for a data descriptor", () => {
317 isAccessorDescriptor({ value: undefined }),
321 isAccessorDescriptor({ writable: undefined }),
326 it("[[Get]] returns true for an accessor descriptor", () => {
327 assertStrictEquals(isAccessorDescriptor({ get: undefined }), true);
328 assertStrictEquals(isAccessorDescriptor({ set: undefined }), true);
331 it("[[Get]] returns false for undefined", () => {
332 assertStrictEquals(isAccessorDescriptor(undefined), false);
335 it("[[Construct]] throws an error", () => {
336 assertThrows(() => new isAccessorDescriptor({}));
339 describe(".length", () => {
340 it("[[Get]] returns the correct length", () => {
341 assertStrictEquals(isAccessorDescriptor
.length
, 1);
345 describe(".name", () => {
346 it("[[Get]] returns the correct name", () => {
348 isAccessorDescriptor
.name
,
349 "isAccessorDescriptor",
355 describe("isDataDescriptor", () => {
356 it("[[Call]] returns false for a generic descriptor", () => {
357 assertStrictEquals(isDataDescriptor({}), false);
360 it("[[Get]] returns true for a data descriptor", () => {
361 assertStrictEquals(isDataDescriptor({ value: undefined }), true);
362 assertStrictEquals(isDataDescriptor({ writable: true }), true);
365 it("[[Get]] returns false for an accessor descriptor", () => {
366 assertStrictEquals(isDataDescriptor({ get: undefined }), false);
367 assertStrictEquals(isDataDescriptor({ set: undefined }), false);
370 it("[[Get]] returns false for undefined", () => {
371 assertStrictEquals(isDataDescriptor(undefined), false);
374 it("[[Construct]] throws an error", () => {
375 assertThrows(() => new isDataDescriptor({}));
378 describe(".length", () => {
379 it("[[Get]] returns the correct length", () => {
380 assertStrictEquals(isDataDescriptor
.length
, 1);
384 describe(".name", () => {
385 it("[[Get]] returns the correct name", () => {
386 assertStrictEquals(isDataDescriptor
.name
, "isDataDescriptor");
391 describe("isFullyPopulatedDescriptor", () => {
392 it("[[Call]] returns false for a generic descriptor", () => {
393 assertStrictEquals(isFullyPopulatedDescriptor({}), false);
396 it("[[Get]] returns false for a nonβfullyβpopulated data descriptor", () => {
398 isFullyPopulatedDescriptor({ value: undefined }),
402 isFullyPopulatedDescriptor({ writable: true }),
407 it("[[Get]] returns true for a fullyβpopulated data descriptor", () => {
409 isFullyPopulatedDescriptor({
419 it("[[Get]] returns false for a nonβfullyβpopulated accessor descriptor", () => {
421 isFullyPopulatedDescriptor({ get: undefined }),
425 isFullyPopulatedDescriptor({ set: undefined }),
430 it("[[Get]] returns true for a fullyβpopulated accessor descriptor", () => {
432 isFullyPopulatedDescriptor({
442 it("[[Get]] returns false for undefined", () => {
443 assertStrictEquals(isFullyPopulatedDescriptor(undefined), false);
446 it("[[Construct]] throws an error", () => {
447 assertThrows(() => new isFullyPopulatedDescriptor({}));
450 describe(".length", () => {
451 it("[[Get]] returns the correct length", () => {
452 assertStrictEquals(isFullyPopulatedDescriptor
.length
, 1);
456 describe(".name", () => {
457 it("[[Get]] returns the correct name", () => {
459 isFullyPopulatedDescriptor
.name
,
460 "isFullyPopulatedDescriptor",
466 describe("isGenericDescriptor", () => {
467 it("[[Call]] returns true for a generic descriptor", () => {
468 assertStrictEquals(isGenericDescriptor({}), true);
471 it("[[Get]] returns false for a data descriptor", () => {
473 isGenericDescriptor({ value: undefined }),
476 assertStrictEquals(isGenericDescriptor({ writable: true }), false);
479 it("[[Get]] returns false for an accessor descriptor", () => {
480 assertStrictEquals(isGenericDescriptor({ get: undefined }), false);
481 assertStrictEquals(isGenericDescriptor({ set: undefined }), false);
484 it("[[Get]] returns false for undefined", () => {
485 assertStrictEquals(isGenericDescriptor(undefined), false);
488 it("[[Construct]] throws an error", () => {
489 assertThrows(() => new isGenericDescriptor({}));
492 describe(".length", () => {
493 it("[[Get]] returns the correct length", () => {
494 assertStrictEquals(isGenericDescriptor
.length
, 1);
498 describe(".name", () => {
499 it("[[Get]] returns the correct name", () => {
501 isGenericDescriptor
.name
,
502 "isGenericDescriptor",
508 describe("ordinaryToPrimitive", () => {
509 it("[[Call]] prefers `valueOf` by default", () => {
518 assertStrictEquals(ordinaryToPrimitive(obj
), "success");
519 assertStrictEquals(ordinaryToPrimitive(obj
, "default"), "success");
522 it('[[Call]] prefers `valueOf` for a "number" hint', () => {
531 assertStrictEquals(ordinaryToPrimitive(obj
, "number"), "success");
534 it('[[Call]] prefers `toString` for a "string" hint', () => {
543 assertStrictEquals(ordinaryToPrimitive(obj
, "string"), "success");
546 it("[[Call]] falls back to the other method if the first isnβt callable", () => {
553 assertStrictEquals(ordinaryToPrimitive(obj
), "success");
556 it("[[Call]] falls back to the other method if the first returns an object", () => {
562 return new String("failure");
565 assertStrictEquals(ordinaryToPrimitive(obj
), "success");
568 it("[[Call]] throws an error if neither method is callable", () => {
573 assertThrows(() => ordinaryToPrimitive(obj
));
576 it("[[Call]] throws an error if neither method returns an object", () => {
579 return new String("failure");
582 return new String("failure");
585 assertThrows(() => ordinaryToPrimitive(obj
));
588 it("[[Construct]] throws an error", () => {
589 assertThrows(() => new ordinaryToPrimitive(""));
592 describe(".length", () => {
593 it("[[Get]] returns the correct length", () => {
594 assertStrictEquals(ordinaryToPrimitive
.length
, 2);
598 describe(".name", () => {
599 it("[[Get]] returns the correct name", () => {
601 ordinaryToPrimitive
.name
,
602 "ordinaryToPrimitive",
608 describe("sameValue", () => {
609 it("[[Call]] returns false for null π undefined", () => {
610 assertStrictEquals(sameValue(null, undefined), false);
613 it("[[Call]] returns false for null π an object", () => {
614 assertStrictEquals(sameValue(null, {}), false);
617 it("[[Call]] returns true for null π null", () => {
618 assertStrictEquals(sameValue(null, null), true);
621 it("[[Call]] returns false for two different objects", () => {
622 assertStrictEquals(sameValue({}, {}), false);
625 it("[[Call]] returns true for the same object", () => {
627 assertStrictEquals(sameValue(obj
, obj
), true);
630 it("[[Call]] returns false for Β±0", () => {
631 assertStrictEquals(sameValue(0, -0), false);
634 it("[[Call]] returns true for -0", () => {
635 assertStrictEquals(sameValue(-0, -0), true);
638 it("[[Call]] returns true for nan", () => {
639 assertStrictEquals(sameValue(0 / 0, 0 / 0), true);
642 it("[[Call]] returns false for a primitive and its wrapped object", () => {
643 assertStrictEquals(sameValue(false, new Boolean(false)), false);
646 it("[[Construct]] throws an error", () => {
647 assertThrows(() => new sameValue(true, true));
650 describe(".length", () => {
651 it("[[Get]] returns the correct length", () => {
652 assertStrictEquals(sameValue
.length
, 2);
656 describe(".name", () => {
657 it("[[Get]] returns the correct name", () => {
658 assertStrictEquals(sameValue
.name
, "sameValue");
663 describe("sameValueZero", () => {
664 it("[[Call]] returns false for null π undefined", () => {
665 assertStrictEquals(sameValueZero(null, undefined), false);
668 it("[[Call]] returns false for null π an object", () => {
669 assertStrictEquals(sameValueZero(null, {}), false);
672 it("[[Call]] returns true for null π null", () => {
673 assertStrictEquals(sameValueZero(null, null), true);
676 it("[[Call]] returns false for two different objects", () => {
677 assertStrictEquals(sameValueZero({}, {}), false);
680 it("[[Call]] returns true for the same object", () => {
682 assertStrictEquals(sameValueZero(obj
, obj
), true);
685 it("[[Call]] returns true for Β±0", () => {
686 assertStrictEquals(sameValueZero(0, -0), true);
689 it("[[Call]] returns true for -0", () => {
690 assertStrictEquals(sameValueZero(-0, -0), true);
693 it("[[Call]] returns true for nan", () => {
694 assertStrictEquals(sameValueZero(0 / 0, 0 / 0), true);
697 it("[[Call]] returns false for a primitive and its wrapped object", () => {
699 sameValueZero(false, new Boolean(false)),
704 it("[[Construct]] throws an error", () => {
705 assertThrows(() => new sameValueZero(true, true));
708 describe(".length", () => {
709 it("[[Get]] returns the correct length", () => {
710 assertStrictEquals(sameValueZero
.length
, 2);
714 describe(".name", () => {
715 it("[[Get]] returns the correct name", () => {
716 assertStrictEquals(sameValueZero
.name
, "sameValueZero");
721 describe("toFunctionName", () => {
722 it("[[Call]] works with strings and no prefix", () => {
723 assertStrictEquals(toFunctionName("etaoin"), "etaoin");
726 it("[[Call]] works with objects and no prefix", () => {
737 it("[[Call]] works with descriptionless symbols and no prefix", () => {
738 assertStrictEquals(toFunctionName(Symbol()), "");
741 it("[[Call]] works with empty description symbols and no prefix", () => {
742 assertStrictEquals(toFunctionName(Symbol("")), "[]");
745 it("[[Call]] works with described symbols and no prefix", () => {
746 assertStrictEquals(toFunctionName(Symbol("etaoin")), "[etaoin]");
749 it("[[Call]] works with strings and a prefix", () => {
750 assertStrictEquals(toFunctionName("etaoin", "foo"), "foo etaoin");
753 it("[[Call]] works with objects and no prefix", () => {
764 it("[[Call]] works with descriptionless symbols and no prefix", () => {
765 assertStrictEquals(toFunctionName(Symbol(), "foo"), "foo ");
768 it("[[Call]] works with empty description symbols and no prefix", () => {
769 assertStrictEquals(toFunctionName(Symbol(""), "foo"), "foo []");
772 it("[[Call]] works with described symbols and no prefix", () => {
774 toFunctionName(Symbol("etaoin"), "foo"),
779 it("[[Construct]] throws an error", () => {
780 assertThrows(() => new toFunctionName(""));
783 describe(".length", () => {
784 it("[[Get]] returns the correct length", () => {
785 assertStrictEquals(toFunctionName
.length
, 1);
789 describe(".name", () => {
790 it("[[Get]] returns the correct name", () => {
799 describe("toIndex", () => {
800 it("[[Call]] returns an index", () => {
801 assertStrictEquals(toIndex(9007199254740991), 9007199254740991);
804 it("[[Call]] returns zero for a zerolike argument", () => {
805 assertStrictEquals(toIndex(NaN
), 0);
806 assertStrictEquals(toIndex("failure"), 0);
807 assertStrictEquals(toIndex(-0), 0);
810 it("[[Call]] rounds down to the nearest integer", () => {
811 assertStrictEquals(toIndex(0.25), 0);
812 assertStrictEquals(toIndex(1.1), 1);
815 it("[[Call]] throws when provided a negative number", () => {
816 assertThrows(() => toIndex(-1));
817 assertThrows(() => toIndex(-Infinity
));
820 it("[[Call]] throws when provided a number greater than or equal to 2 ** 53", () => {
821 assertThrows(() => toIndex(9007199254740992));
822 assertThrows(() => toIndex(Infinity
));
825 it("[[Construct]] throws an error", () => {
826 assertThrows(() => new toIndex(0));
829 describe(".length", () => {
830 it("[[Get]] returns the correct length", () => {
831 assertStrictEquals(toIndex
.length
, 1);
835 describe(".name", () => {
836 it("[[Get]] returns the correct name", () => {
837 assertStrictEquals(toIndex
.name
, "toIndex");
842 describe("toLength", () => {
843 it("[[Call]] returns a length", () => {
844 assertStrictEquals(toLength(9007199254740991), 9007199254740991);
847 it("[[Call]] returns zero for a nan argument", () => {
848 assertStrictEquals(toLength(NaN
), 0);
849 assertStrictEquals(toLength("failure"), 0);
852 it("[[Call]] rounds down to the nearest integer", () => {
853 assertStrictEquals(toLength(0.25), 0);
854 assertStrictEquals(toLength(1.1), 1);
857 it("[[Call]] returns a result greater than or equal to zero", () => {
858 assertStrictEquals(toLength(-0), 0);
859 assertStrictEquals(toLength(-1), 0);
860 assertStrictEquals(toLength(-Infinity
), 0);
863 it("[[Call]] returns a result less than 2 ** 53", () => {
864 assertStrictEquals(toLength(9007199254740992), 9007199254740991);
865 assertStrictEquals(toLength(Infinity
), 9007199254740991);
868 it("[[Construct]] throws an error", () => {
869 assertThrows(() => new toLength(0));
872 describe(".length", () => {
873 it("[[Get]] returns the correct length", () => {
874 assertStrictEquals(toLength
.length
, 1);
878 describe(".name", () => {
879 it("[[Get]] returns the correct name", () => {
880 assertStrictEquals(toLength
.name
, "toLength");
885 describe("toPrimitive", () => {
886 it("[[Call]] returns the argument when passed a primitive", () => {
887 const value
= Symbol();
888 assertStrictEquals(toPrimitive(value
), value
);
891 it("[[Call]] works with nullish values", () => {
892 assertStrictEquals(toPrimitive(null), null);
893 assertStrictEquals(toPrimitive(), void {});
896 it("[[Call]] calls ordinaryToPrimitive by default", () => {
897 const value
= Object
.assign(
905 assertStrictEquals(toPrimitive(value
), "success");
908 it("[[Call]] accepts a hint", () => {
909 const value
= Object
.assign(
920 assertStrictEquals(toPrimitive(value
, "string"), "success");
923 it("[[Call]] uses the exotic toPrimitive method if available", () => {
924 const value
= Object
.assign(
927 [Symbol
.toPrimitive
]() {
932 assertStrictEquals(toPrimitive(value
), "success");
935 it("[[Call]] passes the hint to the exotic toPrimitive", () => {
936 const value
= Object
.assign(
939 [Symbol
.toPrimitive
](hint
) {
940 return hint
=== "string" ? "success" : "failure";
944 assertStrictEquals(toPrimitive(value
, "string"), "success");
947 it('[[Call]] passes a "default" hint by default', () => {
948 const value
= Object
.assign(
951 [Symbol
.toPrimitive
](hint
) {
952 return hint
=== "default" ? "success" : "failure";
956 assertStrictEquals(toPrimitive(value
), "success");
959 it("[[Call]] throws for an invalid hint", () => {
960 const value1
= Object
.assign(
963 [Symbol
.toPrimitive
]() {
968 const value2
= Object
.assign(
976 assertThrows(() => toPrimitive(value1
, "badhint"));
977 assertThrows(() => toPrimitive(value2
, "badhint"));
978 assertThrows(() => toPrimitive(true, "badhint"));
981 it("[[Construct]] throws an error", () => {
982 assertThrows(() => new toPrimitive(true));
985 describe(".length", () => {
986 it("[[Get]] returns the correct length", () => {
987 assertStrictEquals(toPrimitive
.length
, 1);
991 describe(".name", () => {
992 it("[[Get]] returns the correct name", () => {
993 assertStrictEquals(toPrimitive
.name
, "toPrimitive");
998 describe("toPropertyKey", () => {
999 it("returns a string or symbol", () => {
1000 const sym
= Symbol();
1001 assertStrictEquals(toPropertyKey(sym
), sym
);
1003 toPropertyKey(new String("success")),
1008 it("favours the `toString` representation", () => {
1022 it("[[Construct]] throws an error", () => {
1023 assertThrows(() => new toPropertyKey(""));
1026 describe(".length", () => {
1027 it("[[Get]] returns the correct length", () => {
1028 assertStrictEquals(toPropertyKey
.length
, 1);
1032 describe(".name", () => {
1033 it("[[Get]] returns the correct name", () => {
1034 assertStrictEquals(toPropertyKey
.name
, "toPropertyKey");
1039 describe("type", () => {
1040 it('[[Call]] returns "null" for null', () => {
1041 assertStrictEquals(type(null), "null");
1044 it('[[Call]] returns "undefined" for undefined', () => {
1045 assertStrictEquals(type(void {}), "undefined");
1048 it('[[Call]] returns "object" for nonβcallable objects', () => {
1049 assertStrictEquals(type(Object
.create(null)), "object");
1052 it('[[Call]] returns "object" for callable objects', () => {
1053 assertStrictEquals(type(() => {}), "object");
1056 it('[[Call]] returns "object" for constructable objects', () => {
1057 assertStrictEquals(type(class {}), "object");
1060 it("[[Construct]] throws an error", () => {
1061 assertThrows(() => new type({}));
1064 describe(".length", () => {
1065 it("[[Get]] returns the correct length", () => {
1066 assertStrictEquals(type
.length
, 1);
1070 describe(".name", () => {
1071 it("[[Get]] returns the correct name", () => {
1072 assertStrictEquals(type
.name
, "type");
1077 describe("π", () => {
1078 it("[[Get]] is π", () => {
1079 assertStrictEquals(π, Math
.E
);
1083 describe("π", () => {
1084 it("[[Get]] is π", () => {
1085 assertStrictEquals(π, Number
.EPSILON
);
1089 describe("π", () => {
1090 it("[[Get]] is π", () => {
1091 assertStrictEquals(π, Math
.PI
);