1 // ♓🌟 Piscēs ∷ value.test.js
2 // ====================================================================
4 // Copyright © 2022–2023 Lady [@ Lady’s Computer].
6 // This Source Code Form is subject to the terms of the Mozilla Public
7 // License, v. 2.0. If a copy of the MPL was not distributed with this
8 // file, You can obtain one at <https://mozilla.org/MPL/2.0/>.
16 } from "./dev-deps.js";
19 completePropertyDescriptor
,
24 isFullyPopulatedDescriptor
,
34 MAXIMUM_SAFE_INTEGRAL_NUMBER
,
36 MINIMUM_SAFE_INTEGRAL_NUMBER
,
66 describe("ASYNC_ITERATOR", () => {
67 it("[[Get]] is @@asyncIterator", () => {
68 assertStrictEquals(ASYNC_ITERATOR
, Symbol
.asyncIterator
);
72 describe("HAS_INSTANCE", () => {
73 it("[[Get]] is @@hasInstance", () => {
74 assertStrictEquals(HAS_INSTANCE
, Symbol
.hasInstance
);
78 describe("IS_CONCAT_SPREADABLE", () => {
79 it("[[Get]] is @@isConcatSpreadable", () => {
82 Symbol
.isConcatSpreadable
,
87 describe("ITERATOR", () => {
88 it("[[Get]] is @@iterator", () => {
89 assertStrictEquals(ITERATOR
, Symbol
.iterator
);
93 describe("LN10", () => {
94 it("[[Get]] is ln(10)", () => {
95 assertStrictEquals(LN10
, Math
.LN10
);
99 describe("LN2", () => {
100 it("[[Get]] is ln(2)", () => {
101 assertStrictEquals(LN2
, Math
.LN2
);
105 describe("LOG10ℇ", () => {
106 it("[[Get]] is log10(ℇ)", () => {
107 assertStrictEquals(LOG10
ℇ, Math
.LOG10E
);
111 describe("LOG2ℇ", () => {
112 it("[[Get]] is log2(ℇ)", () => {
113 assertStrictEquals(LOG2
ℇ, Math
.LOG2E
);
117 describe("MATCH", () => {
118 it("[[Get]] is @@match", () => {
119 assertStrictEquals(MATCH
, Symbol
.match
);
123 describe("MATCH_ALL", () => {
124 it("[[Get]] is @@matchAll", () => {
125 assertStrictEquals(MATCH_ALL
, Symbol
.matchAll
);
129 describe("MAXIMUM_NUMBER", () => {
130 it("[[Get]] is the maximum number", () => {
131 assertStrictEquals(MAXIMUM_NUMBER
, Number
.MAX_VALUE
);
135 describe("MAXIMUM_SAFE_INTEGRAL_NUMBER", () => {
136 it("[[Get]] is the maximum safe integral number", () => {
138 MAXIMUM_SAFE_INTEGRAL_NUMBER
,
139 Number
.MAX_SAFE_INTEGER
,
144 describe("MINIMUM_NUMBER", () => {
145 it("[[Get]] is the minimum number", () => {
146 assertStrictEquals(MINIMUM_NUMBER
, Number
.MIN_VALUE
);
150 describe("MINIMUM_SAFE_INTEGRAL_NUMBER", () => {
151 it("[[Get]] is the minimum safe integral number", () => {
153 MINIMUM_SAFE_INTEGRAL_NUMBER
,
154 Number
.MIN_SAFE_INTEGER
,
159 describe("NAN", () => {
160 it("[[Get]] is nan", () => {
161 assertStrictEquals(NAN
, NaN
);
165 describe("NEGATIVE_INFINITY", () => {
166 it("[[Get]] is negative infinity", () => {
167 assertStrictEquals(NEGATIVE_INFINITY
, -Infinity
);
171 describe("NEGATIVE_ZERO", () => {
172 it("[[Get]] is negative zero", () => {
173 assertStrictEquals(NEGATIVE_ZERO
, -0);
177 describe("NULL", () => {
178 it("[[Get]] is null", () => {
179 assertStrictEquals(NULL
, null);
183 describe("POSITIVE_INFINITY", () => {
184 it("[[Get]] is negative infinity", () => {
185 assertStrictEquals(POSITIVE_INFINITY
, Infinity
);
189 describe("POSITIVE_ZERO", () => {
190 it("[[Get]] is positive zero", () => {
191 assertStrictEquals(POSITIVE_ZERO
, 0);
195 describe("RECIPROCAL_SQRT2", () => {
196 it("[[Get]] is sqrt(½)", () => {
197 assertStrictEquals(RECIPROCAL_SQRT2
, Math
.SQRT1_2
);
201 describe("REPLACE", () => {
202 it("[[Get]] is @@replace", () => {
203 assertStrictEquals(REPLACE
, Symbol
.replace
);
207 describe("SPECIES", () => {
208 it("[[Get]] is @@species", () => {
209 assertStrictEquals(SPECIES
, Symbol
.species
);
213 describe("SPLIT", () => {
214 it("[[Get]] is @@split", () => {
215 assertStrictEquals(SPLIT
, Symbol
.split
);
219 describe("SQRT2", () => {
220 it("[[Get]] is sqrt(2)", () => {
221 assertStrictEquals(SQRT2
, Math
.SQRT2
);
225 describe("TO_PRIMITIVE", () => {
226 it("[[Get]] is @@toPrimitive", () => {
227 assertStrictEquals(TO_PRIMITIVE
, Symbol
.toPrimitive
);
231 describe("TO_STRING_TAG", () => {
232 it("[[Get]] is @@toStringTag", () => {
233 assertStrictEquals(TO_STRING_TAG
, Symbol
.toStringTag
);
237 describe("UNDEFINED", () => {
238 it("[[Get]] is undefined", () => {
239 assertStrictEquals(UNDEFINED
, void {});
243 describe("UNSCOPABLES", () => {
244 it("[[Get]] is @@unscopables", () => {
245 assertStrictEquals(UNSCOPABLES
, Symbol
.unscopables
);
249 describe("completePropertyDescriptor", () => {
250 it("[[Call]] completes a generic descriptor", () => {
252 completePropertyDescriptor(desc
);
261 it("[[Call]] completes a data descriptor", () => {
262 const desc
= { value
: undefined };
263 completePropertyDescriptor(desc
);
272 it("[[Call]] completes an accessor descriptor", () => {
273 const desc
= { get: undefined };
274 completePropertyDescriptor(desc
);
283 it("[[Call]] throws an error when the descriptor is undefined", () => {
284 assertThrows(() => new completePropertyDescriptor(undefined));
287 it("[[Construct]] throws an error", () => {
288 assertThrows(() => new completePropertyDescriptor({}));
291 describe(".length", () => {
292 it("[[Get]] returns the correct length", () => {
293 assertStrictEquals(completePropertyDescriptor
.length
, 1);
297 describe(".name", () => {
298 it("[[Get]] returns the correct name", () => {
300 completePropertyDescriptor
.name
,
301 "completePropertyDescriptor",
307 describe("isAccessorDescriptor", () => {
308 it("[[Call]] returns false for a generic descriptor", () => {
309 assertStrictEquals(isAccessorDescriptor({}), false);
312 it("[[Get]] returns false for a data descriptor", () => {
314 isAccessorDescriptor({ value
: undefined }),
318 isAccessorDescriptor({ writable
: undefined }),
323 it("[[Get]] returns true for an accessor descriptor", () => {
324 assertStrictEquals(isAccessorDescriptor({ get: undefined }), true);
325 assertStrictEquals(isAccessorDescriptor({ set: undefined }), true);
328 it("[[Get]] returns false for undefined", () => {
329 assertStrictEquals(isAccessorDescriptor(undefined), false);
332 it("[[Construct]] throws an error", () => {
333 assertThrows(() => new isAccessorDescriptor({}));
336 describe(".length", () => {
337 it("[[Get]] returns the correct length", () => {
338 assertStrictEquals(isAccessorDescriptor
.length
, 1);
342 describe(".name", () => {
343 it("[[Get]] returns the correct name", () => {
345 isAccessorDescriptor
.name
,
346 "isAccessorDescriptor",
352 describe("isDataDescriptor", () => {
353 it("[[Call]] returns false for a generic descriptor", () => {
354 assertStrictEquals(isDataDescriptor({}), false);
357 it("[[Get]] returns true for a data descriptor", () => {
358 assertStrictEquals(isDataDescriptor({ value
: undefined }), true);
359 assertStrictEquals(isDataDescriptor({ writable
: true }), true);
362 it("[[Get]] returns false for an accessor descriptor", () => {
363 assertStrictEquals(isDataDescriptor({ get: undefined }), false);
364 assertStrictEquals(isDataDescriptor({ set: undefined }), false);
367 it("[[Get]] returns false for undefined", () => {
368 assertStrictEquals(isDataDescriptor(undefined), false);
371 it("[[Construct]] throws an error", () => {
372 assertThrows(() => new isDataDescriptor({}));
375 describe(".length", () => {
376 it("[[Get]] returns the correct length", () => {
377 assertStrictEquals(isDataDescriptor
.length
, 1);
381 describe(".name", () => {
382 it("[[Get]] returns the correct name", () => {
383 assertStrictEquals(isDataDescriptor
.name
, "isDataDescriptor");
388 describe("isFullyPopulatedDescriptor", () => {
389 it("[[Call]] returns false for a generic descriptor", () => {
390 assertStrictEquals(isFullyPopulatedDescriptor({}), false);
393 it("[[Get]] returns false for a non‐fully‐populated data descriptor", () => {
395 isFullyPopulatedDescriptor({ value
: undefined }),
399 isFullyPopulatedDescriptor({ writable
: true }),
404 it("[[Get]] returns true for a fully‐populated data descriptor", () => {
406 isFullyPopulatedDescriptor({
416 it("[[Get]] returns false for a non‐fully‐populated accessor descriptor", () => {
418 isFullyPopulatedDescriptor({ get: undefined }),
422 isFullyPopulatedDescriptor({ set: undefined }),
427 it("[[Get]] returns true for a fully‐populated accessor descriptor", () => {
429 isFullyPopulatedDescriptor({
439 it("[[Get]] returns false for undefined", () => {
440 assertStrictEquals(isFullyPopulatedDescriptor(undefined), false);
443 it("[[Construct]] throws an error", () => {
444 assertThrows(() => new isFullyPopulatedDescriptor({}));
447 describe(".length", () => {
448 it("[[Get]] returns the correct length", () => {
449 assertStrictEquals(isFullyPopulatedDescriptor
.length
, 1);
453 describe(".name", () => {
454 it("[[Get]] returns the correct name", () => {
456 isFullyPopulatedDescriptor
.name
,
457 "isFullyPopulatedDescriptor",
463 describe("isGenericDescriptor", () => {
464 it("[[Call]] returns true for a generic descriptor", () => {
465 assertStrictEquals(isGenericDescriptor({}), true);
468 it("[[Get]] returns false for a data descriptor", () => {
470 isGenericDescriptor({ value
: undefined }),
473 assertStrictEquals(isGenericDescriptor({ writable
: true }), false);
476 it("[[Get]] returns false for an accessor descriptor", () => {
477 assertStrictEquals(isGenericDescriptor({ get: undefined }), false);
478 assertStrictEquals(isGenericDescriptor({ set: undefined }), false);
481 it("[[Get]] returns false for undefined", () => {
482 assertStrictEquals(isGenericDescriptor(undefined), false);
485 it("[[Construct]] throws an error", () => {
486 assertThrows(() => new isGenericDescriptor({}));
489 describe(".length", () => {
490 it("[[Get]] returns the correct length", () => {
491 assertStrictEquals(isGenericDescriptor
.length
, 1);
495 describe(".name", () => {
496 it("[[Get]] returns the correct name", () => {
498 isGenericDescriptor
.name
,
499 "isGenericDescriptor",
505 describe("ordinaryToPrimitive", () => {
506 it("[[Call]] prefers `valueOf` by default", () => {
515 assertStrictEquals(ordinaryToPrimitive(obj
), "success");
516 assertStrictEquals(ordinaryToPrimitive(obj
, "default"), "success");
519 it('[[Call]] prefers `valueOf` for a "number" hint', () => {
528 assertStrictEquals(ordinaryToPrimitive(obj
, "number"), "success");
531 it('[[Call]] prefers `toString` for a "string" hint', () => {
540 assertStrictEquals(ordinaryToPrimitive(obj
, "string"), "success");
543 it("[[Call]] falls back to the other method if the first isn’t callable", () => {
550 assertStrictEquals(ordinaryToPrimitive(obj
), "success");
553 it("[[Call]] falls back to the other method if the first returns an object", () => {
559 return new String("failure");
562 assertStrictEquals(ordinaryToPrimitive(obj
), "success");
565 it("[[Call]] throws an error if neither method is callable", () => {
570 assertThrows(() => ordinaryToPrimitive(obj
));
573 it("[[Call]] throws an error if neither method returns an object", () => {
576 return new String("failure");
579 return new String("failure");
582 assertThrows(() => ordinaryToPrimitive(obj
));
585 it("[[Construct]] throws an error", () => {
586 assertThrows(() => new ordinaryToPrimitive(""));
589 describe(".length", () => {
590 it("[[Get]] returns the correct length", () => {
591 assertStrictEquals(ordinaryToPrimitive
.length
, 2);
595 describe(".name", () => {
596 it("[[Get]] returns the correct name", () => {
598 ordinaryToPrimitive
.name
,
599 "ordinaryToPrimitive",
605 describe("sameValue", () => {
606 it("[[Call]] returns false for null 🆚 undefined", () => {
607 assertStrictEquals(sameValue(null, undefined), false);
610 it("[[Call]] returns false for null 🆚 an object", () => {
611 assertStrictEquals(sameValue(null, {}), false);
614 it("[[Call]] returns true for null 🆚 null", () => {
615 assertStrictEquals(sameValue(null, null), true);
618 it("[[Call]] returns false for two different objects", () => {
619 assertStrictEquals(sameValue({}, {}), false);
622 it("[[Call]] returns true for the same object", () => {
624 assertStrictEquals(sameValue(obj
, obj
), true);
627 it("[[Call]] returns false for ±0", () => {
628 assertStrictEquals(sameValue(0, -0), false);
631 it("[[Call]] returns true for -0", () => {
632 assertStrictEquals(sameValue(-0, -0), true);
635 it("[[Call]] returns true for nan", () => {
636 assertStrictEquals(sameValue(0 / 0, 0 / 0), true);
639 it("[[Call]] returns false for a primitive and its wrapped object", () => {
640 assertStrictEquals(sameValue(false, new Boolean(false)), false);
643 it("[[Construct]] throws an error", () => {
644 assertThrows(() => new sameValue(true, true));
647 describe(".length", () => {
648 it("[[Get]] returns the correct length", () => {
649 assertStrictEquals(sameValue
.length
, 2);
653 describe(".name", () => {
654 it("[[Get]] returns the correct name", () => {
655 assertStrictEquals(sameValue
.name
, "sameValue");
660 describe("sameValueZero", () => {
661 it("[[Call]] returns false for null 🆚 undefined", () => {
662 assertStrictEquals(sameValueZero(null, undefined), false);
665 it("[[Call]] returns false for null 🆚 an object", () => {
666 assertStrictEquals(sameValueZero(null, {}), false);
669 it("[[Call]] returns true for null 🆚 null", () => {
670 assertStrictEquals(sameValueZero(null, null), true);
673 it("[[Call]] returns false for two different objects", () => {
674 assertStrictEquals(sameValueZero({}, {}), false);
677 it("[[Call]] returns true for the same object", () => {
679 assertStrictEquals(sameValueZero(obj
, obj
), true);
682 it("[[Call]] returns true for ±0", () => {
683 assertStrictEquals(sameValueZero(0, -0), true);
686 it("[[Call]] returns true for -0", () => {
687 assertStrictEquals(sameValueZero(-0, -0), true);
690 it("[[Call]] returns true for nan", () => {
691 assertStrictEquals(sameValueZero(0 / 0, 0 / 0), true);
694 it("[[Call]] returns false for a primitive and its wrapped object", () => {
696 sameValueZero(false, new Boolean(false)),
701 it("[[Construct]] throws an error", () => {
702 assertThrows(() => new sameValueZero(true, true));
705 describe(".length", () => {
706 it("[[Get]] returns the correct length", () => {
707 assertStrictEquals(sameValueZero
.length
, 2);
711 describe(".name", () => {
712 it("[[Get]] returns the correct name", () => {
713 assertStrictEquals(sameValueZero
.name
, "sameValueZero");
718 describe("toFunctionName", () => {
719 it("[[Call]] works with strings and no prefix", () => {
720 assertStrictEquals(toFunctionName("etaoin"), "etaoin");
723 it("[[Call]] works with objects and no prefix", () => {
734 it("[[Call]] works with descriptionless symbols and no prefix", () => {
735 assertStrictEquals(toFunctionName(Symbol()), "");
738 it("[[Call]] works with empty description symbols and no prefix", () => {
739 assertStrictEquals(toFunctionName(Symbol("")), "[]");
742 it("[[Call]] works with described symbols and no prefix", () => {
743 assertStrictEquals(toFunctionName(Symbol("etaoin")), "[etaoin]");
746 it("[[Call]] works with strings and a prefix", () => {
747 assertStrictEquals(toFunctionName("etaoin", "foo"), "foo etaoin");
750 it("[[Call]] works with objects and no prefix", () => {
761 it("[[Call]] works with descriptionless symbols and no prefix", () => {
762 assertStrictEquals(toFunctionName(Symbol(), "foo"), "foo ");
765 it("[[Call]] works with empty description symbols and no prefix", () => {
766 assertStrictEquals(toFunctionName(Symbol(""), "foo"), "foo []");
769 it("[[Call]] works with described symbols and no prefix", () => {
771 toFunctionName(Symbol("etaoin"), "foo"),
776 it("[[Construct]] throws an error", () => {
777 assertThrows(() => new toFunctionName(""));
780 describe(".length", () => {
781 it("[[Get]] returns the correct length", () => {
782 assertStrictEquals(toFunctionName
.length
, 1);
786 describe(".name", () => {
787 it("[[Get]] returns the correct name", () => {
796 describe("toIndex", () => {
797 it("[[Call]] returns an index", () => {
798 assertStrictEquals(toIndex(9007199254740991), 9007199254740991);
801 it("[[Call]] returns zero for a zerolike argument", () => {
802 assertStrictEquals(toIndex(NaN
), 0);
803 assertStrictEquals(toIndex("failure"), 0);
804 assertStrictEquals(toIndex(-0), 0);
807 it("[[Call]] rounds down to the nearest integer", () => {
808 assertStrictEquals(toIndex(0.25), 0);
809 assertStrictEquals(toIndex(1.1), 1);
812 it("[[Call]] throws when provided a negative number", () => {
813 assertThrows(() => toIndex(-1));
814 assertThrows(() => toIndex(-Infinity
));
817 it("[[Call]] throws when provided a number greater than or equal to 2 ** 53", () => {
818 assertThrows(() => toIndex(9007199254740992));
819 assertThrows(() => toIndex(Infinity
));
822 it("[[Construct]] throws an error", () => {
823 assertThrows(() => new toIndex(0));
826 describe(".length", () => {
827 it("[[Get]] returns the correct length", () => {
828 assertStrictEquals(toIndex
.length
, 1);
832 describe(".name", () => {
833 it("[[Get]] returns the correct name", () => {
834 assertStrictEquals(toIndex
.name
, "toIndex");
839 describe("toLength", () => {
840 it("[[Call]] returns a length", () => {
841 assertStrictEquals(toLength(9007199254740991), 9007199254740991);
844 it("[[Call]] returns zero for a nan argument", () => {
845 assertStrictEquals(toLength(NaN
), 0);
846 assertStrictEquals(toLength("failure"), 0);
849 it("[[Call]] rounds down to the nearest integer", () => {
850 assertStrictEquals(toLength(0.25), 0);
851 assertStrictEquals(toLength(1.1), 1);
854 it("[[Call]] returns a result greater than or equal to zero", () => {
855 assertStrictEquals(toLength(-0), 0);
856 assertStrictEquals(toLength(-1), 0);
857 assertStrictEquals(toLength(-Infinity
), 0);
860 it("[[Call]] returns a result less than 2 ** 53", () => {
861 assertStrictEquals(toLength(9007199254740992), 9007199254740991);
862 assertStrictEquals(toLength(Infinity
), 9007199254740991);
865 it("[[Construct]] throws an error", () => {
866 assertThrows(() => new toLength(0));
869 describe(".length", () => {
870 it("[[Get]] returns the correct length", () => {
871 assertStrictEquals(toLength
.length
, 1);
875 describe(".name", () => {
876 it("[[Get]] returns the correct name", () => {
877 assertStrictEquals(toLength
.name
, "toLength");
882 describe("toPrimitive", () => {
883 it("[[Call]] returns the argument when passed a primitive", () => {
884 const value
= Symbol();
885 assertStrictEquals(toPrimitive(value
), value
);
888 it("[[Call]] works with nullish values", () => {
889 assertStrictEquals(toPrimitive(null), null);
890 assertStrictEquals(toPrimitive(), void {});
893 it("[[Call]] calls ordinaryToPrimitive by default", () => {
894 const value
= Object
.assign(
902 assertStrictEquals(toPrimitive(value
), "success");
905 it("[[Call]] accepts a hint", () => {
906 const value
= Object
.assign(
917 assertStrictEquals(toPrimitive(value
, "string"), "success");
920 it("[[Call]] uses the exotic toPrimitive method if available", () => {
921 const value
= Object
.assign(
924 [Symbol
.toPrimitive
]() {
929 assertStrictEquals(toPrimitive(value
), "success");
932 it("[[Call]] passes the hint to the exotic toPrimitive", () => {
933 const value
= Object
.assign(
936 [Symbol
.toPrimitive
](hint
) {
937 return hint
=== "string" ? "success" : "failure";
941 assertStrictEquals(toPrimitive(value
, "string"), "success");
944 it('[[Call]] passes a "default" hint by default', () => {
945 const value
= Object
.assign(
948 [Symbol
.toPrimitive
](hint
) {
949 return hint
=== "default" ? "success" : "failure";
953 assertStrictEquals(toPrimitive(value
), "success");
956 it("[[Call]] throws for an invalid hint", () => {
957 const value1
= Object
.assign(
960 [Symbol
.toPrimitive
]() {
965 const value2
= Object
.assign(
973 assertThrows(() => toPrimitive(value1
, "badhint"));
974 assertThrows(() => toPrimitive(value2
, "badhint"));
975 assertThrows(() => toPrimitive(true, "badhint"));
978 it("[[Construct]] throws an error", () => {
979 assertThrows(() => new toPrimitive(true));
982 describe(".length", () => {
983 it("[[Get]] returns the correct length", () => {
984 assertStrictEquals(toPrimitive
.length
, 1);
988 describe(".name", () => {
989 it("[[Get]] returns the correct name", () => {
990 assertStrictEquals(toPrimitive
.name
, "toPrimitive");
995 describe("toPropertyKey", () => {
996 it("returns a string or symbol", () => {
997 const sym
= Symbol();
998 assertStrictEquals(toPropertyKey(sym
), sym
);
1000 toPropertyKey(new String("success")),
1005 it("favours the `toString` representation", () => {
1019 it("[[Construct]] throws an error", () => {
1020 assertThrows(() => new toPropertyKey(""));
1023 describe(".length", () => {
1024 it("[[Get]] returns the correct length", () => {
1025 assertStrictEquals(toPropertyKey
.length
, 1);
1029 describe(".name", () => {
1030 it("[[Get]] returns the correct name", () => {
1031 assertStrictEquals(toPropertyKey
.name
, "toPropertyKey");
1036 describe("type", () => {
1037 it('[[Call]] returns "null" for null', () => {
1038 assertStrictEquals(type(null), "null");
1041 it('[[Call]] returns "undefined" for undefined', () => {
1042 assertStrictEquals(type(void {}), "undefined");
1045 it('[[Call]] returns "object" for non‐callable objects', () => {
1046 assertStrictEquals(type(Object
.create(null)), "object");
1049 it('[[Call]] returns "object" for callable objects', () => {
1050 assertStrictEquals(type(() => {}), "object");
1053 it('[[Call]] returns "object" for constructable objects', () => {
1054 assertStrictEquals(type(class {}), "object");
1057 it("[[Construct]] throws an error", () => {
1058 assertThrows(() => new type({}));
1061 describe(".length", () => {
1062 it("[[Get]] returns the correct length", () => {
1063 assertStrictEquals(type
.length
, 1);
1067 describe(".name", () => {
1068 it("[[Get]] returns the correct name", () => {
1069 assertStrictEquals(type
.name
, "type");
1074 describe("Ε", () => {
1075 it("[[Get]] is ε", () => {
1076 assertStrictEquals(Ε, Number
.EPSILON
);
1080 describe("Π", () => {
1081 it("[[Get]] is π", () => {
1082 assertStrictEquals(Π, Math
.PI
);
1086 describe("ℇ", () => {
1087 it("[[Get]] is ℇ", () => {
1088 assertStrictEquals(ℇ, Math
.E
);