ladybird/Userland/Libraries/LibJS/Tests/builtins/RegExp/RegExp.js
Ali Mohammad Pur 17087ac4a2 LibJS: Unescape incorrectly escaped code units in regex patterns
We were translating the pattern [\⪾-\⫀] to [\\u2abe-\\u2ac0], which
is a very different pattern; as a code unit converted to the \uhhh
format has no meaning when escaped, this commit makes us simply skip
escaping it when translating the pattern.
2023-09-16 15:21:09 +02:00

68 lines
2.3 KiB
JavaScript

describe("errors", () => {
test("invalid pattern", () => {
expect(() => {
RegExp("[");
}).toThrowWithMessage(
SyntaxError,
"RegExp compile error: Error during parsing of regular expression:"
);
});
test("invalid flag", () => {
expect(() => {
RegExp("", "x");
}).toThrowWithMessage(SyntaxError, "Invalid RegExp flag 'x'");
});
test("repeated flag", () => {
expect(() => {
RegExp("", "gg");
}).toThrowWithMessage(SyntaxError, "Repeated RegExp flag 'g'");
});
});
test("basic functionality", () => {
expect(RegExp().toString()).toBe("/(?:)/");
expect(RegExp(undefined).toString()).toBe("/(?:)/");
expect(RegExp("foo").toString()).toBe("/foo/");
expect(RegExp("foo", undefined).toString()).toBe("/foo/");
expect(RegExp("foo", "g").toString()).toBe("/foo/g");
expect(RegExp(undefined, "g").toString()).toBe("/(?:)/g");
});
test("regexp object as pattern parameter", () => {
expect(RegExp(/foo/).toString()).toBe("/foo/");
expect(RegExp(/foo/g).toString()).toBe("/foo/g");
expect(RegExp(/foo/g, "").toString()).toBe("/foo/");
expect(RegExp(/foo/g, "y").toString()).toBe("/foo/y");
var regex_like_object_without_flags = {
source: "foo",
[Symbol.match]: function () {},
};
expect(RegExp(regex_like_object_without_flags).toString()).toBe("/foo/");
expect(RegExp(regex_like_object_without_flags, "y").toString()).toBe("/foo/y");
var regex_like_object_with_flags = {
source: "foo",
flags: "g",
[Symbol.match]: function () {},
};
expect(RegExp(regex_like_object_with_flags).toString()).toBe("/foo/g");
expect(RegExp(regex_like_object_with_flags, "").toString()).toBe("/foo/");
expect(RegExp(regex_like_object_with_flags, "y").toString()).toBe("/foo/y");
});
test("regexp literals are re-useable", () => {
for (var i = 0; i < 2; ++i) {
const re = /test/;
expect(re.test("te")).toBeFalse();
expect(re.test("test")).toBeTrue();
}
});
test("Incorrectly escaped code units not converted to invalid patterns", () => {
const re = /[\⪾-\⫀]/;
expect(re.test("⫀")).toBeTrue();
expect(re.test("\\u2abe")).toBeFalse(); // ⫀ is \u2abe
});