]> Lady’s Gitweb - Pisces/blobdiff - string.test.js
Support unicode sets in Matchers
[Pisces] / string.test.js
index bdef3897cde4c7a1fa8babfbf1086bf1c941d252..147e109c6ee692b07cf9f7dfb21d5a2118fe2293 100644 (file)
@@ -1,11 +1,14 @@
-// ♓🌟 Piscēs ∷ string.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 <https://mozilla.org/MPL/2.0/>.
+// SPDX-FileCopyrightText: 2022, 2023, 2025 Lady <https://www.ladys.computer/about/#lady>
+// SPDX-License-Identifier: MPL-2.0
+/**
+ * ⁌ ♓🧩 Piscēs ∷ string.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 <https://mozilla.org/MPL/2.0/>.
+ */
 
 import {
   assert,
 
 import {
   assert,
@@ -29,6 +32,7 @@ import {
   getCodeUnit,
   getFirstSubstringIndex,
   getLastSubstringIndex,
   getCodeUnit,
   getFirstSubstringIndex,
   getLastSubstringIndex,
+  isArrayIndexString,
   isIntegerIndexString,
   join,
   Matcher,
   isIntegerIndexString,
   join,
   Matcher,
@@ -74,7 +78,11 @@ describe("Matcher", () => {
     assert(new Matcher(/(?:)/u));
   });
 
     assert(new Matcher(/(?:)/u));
   });
 
-  it("[[Construct]] throws with a non·unicode regular expression first argument", () => {
+  it("[[Construct]] accepts a unicode sets regular expression first argument", () => {
+    assert(new Matcher(/(?:)/v));
+  });
+
+  it("[[Construct]] throws with a non·unicode·aware regular expression first argument", () => {
     assertThrows(() => new Matcher(/(?:)/));
   });
 
     assertThrows(() => new Matcher(/(?:)/));
   });
 
@@ -109,6 +117,12 @@ describe("Matcher", () => {
     });
   });
 
     });
   });
 
+  describe("::constructor", () => {
+    it("[[Get]] returns the same constructor", () => {
+      assertStrictEquals(new Matcher(/(?:)/su).constructor, Matcher);
+    });
+  });
+
   describe("::dotAll", () => {
     it("[[Get]] returns true when the dotAll flag is present", () => {
       assertStrictEquals(new Matcher(/(?:)/su).dotAll, true);
   describe("::dotAll", () => {
     it("[[Get]] returns true when the dotAll flag is present", () => {
       assertStrictEquals(new Matcher(/(?:)/su).dotAll, true);
@@ -118,7 +132,7 @@ describe("Matcher", () => {
       assertStrictEquals(new Matcher(/(?:)/u).dotAll, false);
     });
 
       assertStrictEquals(new Matcher(/(?:)/u).dotAll, false);
     });
 
-    describe(".length", () => {
+    describe("[[GetOwnProperty]].get.length", () => {
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -130,7 +144,7 @@ describe("Matcher", () => {
       });
     });
 
       });
     });
 
-    describe(".name", () => {
+    describe("[[GetOwnProperty]].get.name", () => {
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -193,6 +207,11 @@ describe("Matcher", () => {
       );
     });
 
       );
     });
 
+    it("[[Construct]] throws an error", () => {
+      const matcher = new Matcher("");
+      assertThrows(() => new matcher.exec());
+    });
+
     describe(".length", () => {
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(Matcher.prototype.exec.length, 1);
     describe(".length", () => {
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(Matcher.prototype.exec.length, 1);
@@ -215,7 +234,7 @@ describe("Matcher", () => {
       assertStrictEquals(new Matcher(/(?:)/u).global, false);
     });
 
       assertStrictEquals(new Matcher(/(?:)/u).global, false);
     });
 
-    describe(".length", () => {
+    describe("[[GetOwnProperty]].get.length", () => {
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -227,7 +246,7 @@ describe("Matcher", () => {
       });
     });
 
       });
     });
 
-    describe(".name", () => {
+    describe("[[GetOwnProperty]].get.name", () => {
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -249,7 +268,7 @@ describe("Matcher", () => {
       assertStrictEquals(new Matcher(/(?:)/u).hasIndices, false);
     });
 
       assertStrictEquals(new Matcher(/(?:)/u).hasIndices, false);
     });
 
-    describe(".length", () => {
+    describe("[[GetOwnProperty]].get.length", () => {
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -261,7 +280,7 @@ describe("Matcher", () => {
       });
     });
 
       });
     });
 
-    describe(".name", () => {
+    describe("[[GetOwnProperty]].get.name", () => {
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -283,7 +302,7 @@ describe("Matcher", () => {
       assertStrictEquals(new Matcher(/(?:)/u).ignoreCase, false);
     });
 
       assertStrictEquals(new Matcher(/(?:)/u).ignoreCase, false);
     });
 
-    describe(".length", () => {
+    describe("[[GetOwnProperty]].get.length", () => {
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -295,7 +314,7 @@ describe("Matcher", () => {
       });
     });
 
       });
     });
 
-    describe(".name", () => {
+    describe("[[GetOwnProperty]].get.name", () => {
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -317,7 +336,7 @@ describe("Matcher", () => {
       assertStrictEquals(new Matcher(/(?:)/u).multiline, false);
     });
 
       assertStrictEquals(new Matcher(/(?:)/u).multiline, false);
     });
 
-    describe(".length", () => {
+    describe("[[GetOwnProperty]].get.length", () => {
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -329,7 +348,7 @@ describe("Matcher", () => {
       });
     });
 
       });
     });
 
-    describe(".name", () => {
+    describe("[[GetOwnProperty]].get.name", () => {
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -348,7 +367,7 @@ describe("Matcher", () => {
       assertStrictEquals(new Matcher(/.*/su).source, ".*");
     });
 
       assertStrictEquals(new Matcher(/.*/su).source, ".*");
     });
 
-    describe(".length", () => {
+    describe("[[GetOwnProperty]].get.length", () => {
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -360,7 +379,7 @@ describe("Matcher", () => {
       });
     });
 
       });
     });
 
-    describe(".name", () => {
+    describe("[[GetOwnProperty]].get.name", () => {
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -382,7 +401,7 @@ describe("Matcher", () => {
       assertStrictEquals(new Matcher(/(?:)/u).sticky, false);
     });
 
       assertStrictEquals(new Matcher(/(?:)/u).sticky, false);
     });
 
-    describe(".length", () => {
+    describe("[[GetOwnProperty]].get.length", () => {
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -394,7 +413,7 @@ describe("Matcher", () => {
       });
     });
 
       });
     });
 
-    describe(".name", () => {
+    describe("[[GetOwnProperty]].get.name", () => {
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -411,6 +430,26 @@ describe("Matcher", () => {
     it("[[Call]] returns the string source", () => {
       assertStrictEquals(new Matcher(/(?:)/u).toString(), "/(?:)/u");
     });
     it("[[Call]] returns the string source", () => {
       assertStrictEquals(new Matcher(/(?:)/u).toString(), "/(?:)/u");
     });
+
+    it("[[Construct]] throws an error", () => {
+      const matcher = new Matcher("");
+      assertThrows(() => new matcher.toString());
+    });
+
+    describe(".length", () => {
+      it("[[Get]] returns the correct length", () => {
+        assertStrictEquals(Matcher.prototype.toString.length, 0);
+      });
+    });
+
+    describe(".name", () => {
+      it("[[Get]] returns the correct name", () => {
+        assertStrictEquals(
+          Matcher.prototype.toString.name,
+          "toString",
+        );
+      });
+    });
   });
 
   describe("::unicode", () => {
   });
 
   describe("::unicode", () => {
@@ -418,7 +457,7 @@ describe("Matcher", () => {
       assertStrictEquals(new Matcher(/(?:)/u).unicode, true);
     });
 
       assertStrictEquals(new Matcher(/(?:)/u).unicode, true);
     });
 
-    describe(".length", () => {
+    describe("[[GetOwnProperty]].get.length", () => {
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct length", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -430,7 +469,7 @@ describe("Matcher", () => {
       });
     });
 
       });
     });
 
-    describe(".name", () => {
+    describe("[[GetOwnProperty]].get.name", () => {
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
       it("[[Get]] returns the correct name", () => {
         assertStrictEquals(
           Object.getOwnPropertyDescriptor(
@@ -443,6 +482,36 @@ describe("Matcher", () => {
     });
   });
 
     });
   });
 
+  describe("::unicodeSets", () => {
+    it("[[Get]] returns true when the unicode sets flag is present", () => {
+      assertStrictEquals(new Matcher(/(?:)/v).unicodeSets, true);
+    });
+
+    describe("[[GetOwnProperty]].get.length", () => {
+      it("[[Get]] returns the correct length", () => {
+        assertStrictEquals(
+          Object.getOwnPropertyDescriptor(
+            Matcher.prototype,
+            "unicodeSets",
+          ).get.length,
+          0,
+        );
+      });
+    });
+
+    describe("[[GetOwnProperty]].get.name", () => {
+      it("[[Get]] returns the correct name", () => {
+        assertStrictEquals(
+          Object.getOwnPropertyDescriptor(
+            Matcher.prototype,
+            "unicodeSets",
+          ).get.name,
+          "get unicodeSets",
+        );
+      });
+    });
+  });
+
   describe("~", () => {
     it("[[Call]] returns true for a complete match", () => {
       assertStrictEquals(new Matcher("")(""), true);
   describe("~", () => {
     it("[[Call]] returns true for a complete match", () => {
       assertStrictEquals(new Matcher("")(""), true);
@@ -484,6 +553,11 @@ describe("Matcher", () => {
         false,
       );
     });
         false,
       );
     });
+
+    it("[[Construct]] throws an error", () => {
+      const matcher = new Matcher("");
+      assertThrows(() => new matcher(""));
+    });
   });
 
   describe("~lastIndex", () => {
   });
 
   describe("~lastIndex", () => {
@@ -934,6 +1008,69 @@ describe("getLastSubstringIndex", () => {
   });
 });
 
   });
 });
 
+describe("isArrayIndexString", () => {
+  it("[[Call]] returns false for nonstrings", () => {
+    assertStrictEquals(isArrayIndexString(1), false);
+  });
+
+  it("[[Call]] returns false for noncanonical strings", () => {
+    assertStrictEquals(isArrayIndexString(""), false);
+    assertStrictEquals(isArrayIndexString("01"), false);
+    assertStrictEquals(isArrayIndexString("9007199254740993"), false);
+  });
+
+  it("[[Call]] returns false for nonfinite numbers", () => {
+    assertStrictEquals(isArrayIndexString("NaN"), false);
+    assertStrictEquals(isArrayIndexString("Infinity"), false);
+    assertStrictEquals(isArrayIndexString("-Infinity"), false);
+  });
+
+  it("[[Call]] returns false for negative numbers", () => {
+    assertStrictEquals(isArrayIndexString("-0"), false);
+    assertStrictEquals(isArrayIndexString("-1"), false);
+  });
+
+  it("[[Call]] returns false for nonintegers", () => {
+    assertStrictEquals(isArrayIndexString("0.25"), false);
+    assertStrictEquals(isArrayIndexString("1.1"), false);
+  });
+
+  it("[[Call]] returns false for numbers greater than or equal to -1 >>> 0", () => {
+    assertStrictEquals(isArrayIndexString(String(-1 >>> 0)), false);
+    assertStrictEquals(
+      isArrayIndexString(String((-1 >>> 0) + 1)),
+      false,
+    );
+  });
+
+  it("[[Call]] returns true for array lengths less than -1 >>> 0", () => {
+    assertStrictEquals(isArrayIndexString("0"), true);
+    assertStrictEquals(
+      isArrayIndexString(String((-1 >>> 0) - 1)),
+      true,
+    );
+  });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new isArrayIndexString("0"));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(isArrayIndexString.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(
+        isArrayIndexString.name,
+        "isArrayIndexString",
+      );
+    });
+  });
+});
+
 describe("isIntegerIndexString", () => {
   it("[[Call]] returns false for nonstrings", () => {
     assertStrictEquals(isIntegerIndexString(1), false);
 describe("isIntegerIndexString", () => {
   it("[[Call]] returns false for nonstrings", () => {
     assertStrictEquals(isIntegerIndexString(1), false);
@@ -975,6 +1112,25 @@ describe("isIntegerIndexString", () => {
     assertStrictEquals(isIntegerIndexString("0"), true);
     assertStrictEquals(isIntegerIndexString("9007199254740991"), true);
   });
     assertStrictEquals(isIntegerIndexString("0"), true);
     assertStrictEquals(isIntegerIndexString("9007199254740991"), true);
   });
+
+  it("[[Construct]] throws an error", () => {
+    assertThrows(() => new isIntegerIndexString("0"));
+  });
+
+  describe(".length", () => {
+    it("[[Get]] returns the correct length", () => {
+      assertStrictEquals(isIntegerIndexString.length, 1);
+    });
+  });
+
+  describe(".name", () => {
+    it("[[Get]] returns the correct name", () => {
+      assertStrictEquals(
+        isIntegerIndexString.name,
+        "isIntegerIndexString",
+      );
+    });
+  });
 });
 
 describe("join", () => {
 });
 
 describe("join", () => {
@@ -1619,8 +1775,8 @@ describe("stringReplace", () => {
         "very success full",
         /([sc]+)[ue]?/g,
         (...$s) =>
         "very success full",
         /([sc]+)[ue]?/g,
         (...$s) =>
-          `${$s[0].length}`.repeat($s[1].length) +
-          $s[0].substring($s[1].length),
+          `${$s[0].length}`.repeat($s[1].length)
+          $s[0].substring($s[1].length),
       ),
       "very 2u33e22 full",
     );
       ),
       "very 2u33e22 full",
     );
@@ -1654,8 +1810,8 @@ describe("stringReplaceAll", () => {
         "very success full",
         /([sc]+)[ue]?/g,
         (...$s) =>
         "very success full",
         /([sc]+)[ue]?/g,
         (...$s) =>
-          `${$s[0].length}`.repeat($s[1].length) +
-          $s[0].substring($s[1].length),
+          `${$s[0].length}`.repeat($s[1].length)
+          $s[0].substring($s[1].length),
       ),
       "very 2u33e22 full",
     );
       ),
       "very 2u33e22 full",
     );
This page took 0.30809 seconds and 4 git commands to generate.