summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/warp/compare-empty-string.js
blob: 30cf03f874c1a8b3e7cc343e4b9feb5752ee8d3e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Test case to cover empty string comparison folding.
//
// MCompare can fold comparison with an empty string constant and replace it
// with |string.length <op> 0|.

const strings = [
  // Zero length string.
  "",

  // Uncommon zero length strings.
  newString("", {external: true}),

  // Latin-1 strings.
  "a",
  "ä",
  "monkey",

  // Two-byte strings.
  "猿",
  "🐒",
  newString("monkey", {twoByte: true}),
];

const operators = [
  "==", "===", "!=", "!==",
  "<", "<=", ">=", ">",
];

for (let op of operators) {
  let lhs = x => `${x} ${op} ""`;
  let rhs = x => `"" ${op} ${x}`;

  for (let input of [lhs, rhs]) {
    let fn = Function("strings", `
      const expected = strings.map(x => {
        // Prevent Warp compilation when computing the expected results.
        with ({}) ;
        return ${input("x")};
      });

      for (let i = 0; i < 200; ++i) {
        let idx = i % strings.length;
        let str = strings[idx];
        let res = ${input("str")};
        assertEq(res, expected[idx]);
      }
    `);
    fn(strings);
  }
}