Files
ladybird/Tests/LibJS/Runtime/3rdparty/webkit/unicodeCaseInsensitive.js
Andreas Kling 3646912c5c Tests: Import V8 and WebKit regexp suites
Add scripts for importing the V8 and WebKit regexp suites into
`Tests/LibJS/Runtime/3rdparty/` and commit the imported tests.

Also update the local harness helpers so these suites can run under
LibJS. In particular, teach the assertion shims to compare RegExp values
the way the imported tests expect and to treat `new Function(...)`
throwing as a valid `assertThrows` case.

This gives the regex rewrite a large bank of external conformance tests
that exercise parser and matcher behavior beyond in-tree coverage.
2026-03-27 17:32:19 +01:00

130 lines
4.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
test("unicodeCaseInsensitive", () => {
// WebKit assertion compatibility shim for Ladybird's test-js harness
function description(msg) {
// No-op, just used for test documentation in WebKit.
}
function shouldBe(actual_code, expected_code) {
let actual = eval(actual_code);
let expected = eval(expected_code);
if (typeof actual === "string" && typeof expected === "string") {
expect(actual).toBe(expected);
} else if (Array.isArray(actual) && Array.isArray(expected)) {
expect(actual).toEqual(expected);
} else if (actual !== null && typeof actual === "object" && expected !== null && typeof expected === "object") {
expect(actual).toEqual(expected);
} else {
expect(actual).toBe(expected);
}
}
function shouldBeTrue(code) {
expect(eval(code)).toBeTrue();
}
function shouldBeFalse(code) {
expect(eval(code)).toBeFalse();
}
function shouldBeNull(code) {
expect(eval(code)).toBeNull();
}
function shouldBeUndefined(code) {
expect(eval(code)).toBeUndefined();
}
function shouldThrow(code, expected_error) {
expect(() => eval(code)).toThrow();
}
function shouldNotThrow(code) {
eval(code);
}
description("https://bugs.webkit.org/show_bug.cgi?id=82063");
shouldBeTrue('/ΣΤΙΓΜΑΣ/i.test("στιγμας")');
shouldBeTrue('/ΔΣΔ/i.test("δςδ")');
shouldBeTrue('/ς/i.test("σ")');
shouldBeTrue('/σ/i.test("ς")');
// Simple case, has no canonical equivalents
shouldBeTrue('/\u1f16/i.test("\u1f16")');
// Test the sets of USC2 code points that have more than one canonically equivalent value.
function ucs2CodePoint(x) {
var s = x.toString(16);
while (s.length < 4) s = 0 + s;
return eval('"\\u' + s + '"');
}
function testSet(set) {
for (i in set) {
for (j in set) {
shouldBeTrue("/" + ucs2CodePoint(set[i]) + '/i.test("' + ucs2CodePoint(set[j]) + '")');
shouldBeTrue(
"/[" +
ucs2CodePoint(set[i] - 1) +
"-" +
ucs2CodePoint(set[i] + 1) +
']/i.test("' +
ucs2CodePoint(set[j]) +
'")'
);
}
}
}
testSet([0x01c4, 0x01c5, 0x01c6]);
testSet([0x01c7, 0x01c8, 0x01c9]);
testSet([0x01ca, 0x01cb, 0x01cc]);
testSet([0x01f1, 0x01f2, 0x01f3]);
testSet([0x0392, 0x03b2, 0x03d0]);
testSet([0x0395, 0x03b5, 0x03f5]);
testSet([0x0398, 0x03b8, 0x03d1]);
testSet([0x0345, 0x0399, 0x03b9, 0x1fbe]);
testSet([0x039a, 0x03ba, 0x03f0]);
testSet([0x00b5, 0x039c, 0x03bc]);
testSet([0x03a0, 0x03c0, 0x03d6]);
testSet([0x03a1, 0x03c1, 0x03f1]);
testSet([0x03a3, 0x03c2, 0x03c3]);
testSet([0x03a6, 0x03c6, 0x03d5]);
testSet([0x1e60, 0x1e61, 0x1e9b]);
// Test a couple of lo/hi pairs
shouldBeTrue('/\u03cf/i.test("\u03cf")');
shouldBeTrue('/\u03d7/i.test("\u03cf")');
shouldBeTrue('/\u03cf/i.test("\u03d7")');
shouldBeTrue('/\u03d7/i.test("\u03d7")');
shouldBeTrue('/\u1f11/i.test("\u1f11")');
shouldBeTrue('/\u1f19/i.test("\u1f11")');
shouldBeTrue('/\u1f11/i.test("\u1f19")');
shouldBeTrue('/\u1f19/i.test("\u1f19")');
// Test an aligned alternating capitalization pair.
shouldBeFalse('/\u0489/i.test("\u048a")');
shouldBeTrue('/\u048a/i.test("\u048a")');
shouldBeTrue('/\u048b/i.test("\u048a")');
shouldBeFalse('/\u048c/i.test("\u048a")');
shouldBeFalse('/\u0489/i.test("\u048b")');
shouldBeTrue('/\u048a/i.test("\u048b")');
shouldBeTrue('/\u048b/i.test("\u048b")');
shouldBeFalse('/\u048c/i.test("\u048b")');
shouldBeTrue('/[\u0489-\u048a]/i.test("\u048b")');
shouldBeTrue('/[\u048b-\u048c]/i.test("\u048a")');
// Test an unaligned alternating capitalization pair.
shouldBeFalse('/\u04c4/i.test("\u04c5")');
shouldBeTrue('/\u04c5/i.test("\u04c5")');
shouldBeTrue('/\u04c6/i.test("\u04c5")');
shouldBeFalse('/\u04c7/i.test("\u04c5")');
shouldBeFalse('/\u04c4/i.test("\u04c6")');
shouldBeTrue('/\u04c5/i.test("\u04c6")');
shouldBeTrue('/\u04c6/i.test("\u04c6")');
shouldBeFalse('/\u04c7/i.test("\u04c6")');
shouldBeTrue('/[\u04c4-\u04c5]/i.test("\u04c6")');
shouldBeTrue('/[\u04c6-\u04c7]/i.test("\u04c5")');
var successfullyParsed = true;
});