summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/cacheir/string-at.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/cacheir/string-at.js')
-rw-r--r--js/src/jit-test/tests/cacheir/string-at.js115
1 files changed, 115 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/cacheir/string-at.js b/js/src/jit-test/tests/cacheir/string-at.js
new file mode 100644
index 0000000000..8dfb2f779e
--- /dev/null
+++ b/js/src/jit-test/tests/cacheir/string-at.js
@@ -0,0 +1,115 @@
+// Test String.prototype.at with negative and non-negative indices.
+
+function* characters(...ranges) {
+ for (let [start, end] of ranges) {
+ for (let i = start; i <= end; ++i) {
+ yield i;
+ }
+ }
+}
+
+const empty = [];
+
+const ascii = [...characters(
+ [0x41, 0x5A], // A..Z
+ [0x61, 0x7A], // a..z
+)];
+
+const latin1 = [...characters(
+ [0xC0, 0xFF], // À..ÿ
+)];
+
+const twoByte = [...characters(
+ [0x100, 0x17E], // Ā..ž
+)];
+
+function atomize(s) {
+ return Object.keys({[s]: 0})[0];
+}
+
+function codePoints() {
+ return [empty, ascii, latin1, twoByte];
+}
+
+function toRope(s) {
+ // Ropes have at least two characters.
+ if (s.length < 2) {
+ return s;
+ }
+ if (s.length === 2) {
+ return newRope(s[0], s[1]);
+ }
+ return newRope(s[0], s.substring(1));
+}
+
+function makeStrings() {
+ let strings = codePoints()
+ .map(codePoints => String.fromCodePoint(...codePoints))
+ .flatMap(x => [
+ x,
+ toRope(x),
+ newString(x, {twoByte: true}),
+ atomize(x),
+ ]);
+ return strings;
+}
+
+function testNonNegativeIndexConstant() {
+ let strings = makeStrings();
+ for (let i = 0; i < 200; ++i) {
+ let str = strings[i % strings.length];
+ let index = 0;
+ let ch = str.at(index);
+ let expected = str.charAt(index);
+ if (expected === "") expected = undefined;
+ assertEq(ch, expected);
+ }
+}
+for (let i = 0; i < 2; ++i) {
+ testNonNegativeIndexConstant();
+}
+
+function testNonNegativeIndex() {
+ let strings = makeStrings();
+ for (let i = 0; i < 200; ++i) {
+ let str = strings[i % strings.length];
+ let index = i & 3;
+ let ch = str.at(index);
+ let expected = str.charAt(index);
+ if (expected === "") expected = undefined;
+ assertEq(ch, expected);
+ }
+}
+for (let i = 0; i < 2; ++i) {
+ testNonNegativeIndex();
+}
+
+function testNegativeIndexConstant() {
+ let strings = makeStrings();
+ for (let i = 0; i < 200; ++i) {
+ let str = strings[i % strings.length];
+ let index = -1;
+ let ch = str.at(index);
+ let expected = str.charAt(str.length + index);
+ if (expected === "") expected = undefined;
+ assertEq(ch, expected);
+ }
+}
+for (let i = 0; i < 2; ++i) {
+ testNegativeIndexConstant();
+}
+
+function testNegativeIndex() {
+ let strings = makeStrings();
+ for (let i = 0; i < 200; ++i) {
+ let str = strings[i % strings.length];
+ let index = -(i & 3) - 1;
+ let ch = str.at(index);
+ let expected = str.charAt(str.length + index);
+ if (expected === "") expected = undefined;
+ assertEq(ch, expected);
+ }
+}
+for (let i = 0; i < 2; ++i) {
+ testNegativeIndex();
+}