summaryrefslogtreecommitdiff
path: root/js/src/jit-test/lib/regexp_parse.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/lib/regexp_parse.js')
-rw-r--r--js/src/jit-test/lib/regexp_parse.js205
1 files changed, 205 insertions, 0 deletions
diff --git a/js/src/jit-test/lib/regexp_parse.js b/js/src/jit-test/lib/regexp_parse.js
new file mode 100644
index 0000000000..ac6ec02f3d
--- /dev/null
+++ b/js/src/jit-test/lib/regexp_parse.js
@@ -0,0 +1,205 @@
+load(libdir + "asserts.js");
+
+// helper functions
+
+function Disjunction(alternatives) {
+ return{
+ type: "Disjunction",
+ alternatives: alternatives
+ };
+}
+
+function Alternative(nodes) {
+ return {
+ type: "Alternative",
+ nodes: nodes
+ };
+}
+
+function Empty() {
+ return {
+ type: "Empty"
+ };
+}
+
+function Text(elements) {
+ return {
+ type: "Text",
+ elements: elements
+ };
+}
+
+function Assertion(type) {
+ return {
+ type: "Assertion",
+ assertion_type: type
+ };
+}
+
+function Atom(data) {
+ return {
+ type: "Atom",
+ data: data
+ };
+}
+
+const kInfinity = 0x7FFFFFFF;
+function Quantifier(min, max, type, body) {
+ return {
+ type: "Quantifier",
+ min: min,
+ max: max,
+ quantifier_type: type,
+ body: body
+ };
+}
+
+function Lookahead(body) {
+ return {
+ type: "Lookahead",
+ is_positive: true,
+ body: body
+ };
+}
+
+function NegativeLookahead(body) {
+ return {
+ type: "Lookahead",
+ is_positive: false,
+ body: body
+ };
+}
+
+function BackReference(index) {
+ return {
+ type: "BackReference",
+ index: index
+ };
+}
+
+function CharacterClass(ranges) {
+ return {
+ type: "CharacterClass",
+ is_negated: false,
+ ranges: ranges.map(([from, to]) => ({ from ,to }))
+ };
+}
+
+function NegativeCharacterClass(ranges) {
+ return {
+ type: "CharacterClass",
+ is_negated: true,
+ ranges: ranges.map(([from, to]) => ({ from ,to }))
+ };
+}
+
+function Capture(index, body) {
+ return {
+ type: "Capture",
+ index: index,
+ body: body
+ };
+}
+
+function AllSurrogateAndCharacterClass(ranges) {
+ return Disjunction([
+ CharacterClass(ranges),
+ Alternative([
+ CharacterClass([["\uD800", "\uDBFF"]]),
+ NegativeLookahead(CharacterClass([["\uDC00", "\uDFFF"]]))
+ ]),
+ Alternative([
+ Assertion("NOT_AFTER_LEAD_SURROGATE"),
+ CharacterClass([["\uDC00", "\uDFFF"]])
+ ]),
+ Text([
+ CharacterClass([["\uD800", "\uDBFF"]]),
+ CharacterClass([["\uDC00", "\uDFFF"]])
+ ])
+ ]);
+}
+
+// testing functions
+
+var all_flags = [
+ "",
+ "i",
+ "m",
+ "u",
+ "im",
+ "iu",
+ "mu",
+ "imu",
+];
+
+var no_unicode_flags = [
+ "",
+ "i",
+ "m",
+ "im",
+];
+
+var unicode_flags = [
+ "u",
+ "iu",
+ "mu",
+ "imu",
+];
+
+var no_multiline_flags = [
+ "",
+ "i",
+ "u",
+ "iu",
+];
+
+var multiline_flags = [
+ "m",
+ "im",
+ "mu",
+ "imu",
+];
+
+function test_flags(pattern, flags, match_only, expected) {
+ for (var flag of flags) {
+ assertDeepEq(parseRegExp(pattern, flag, match_only), expected);
+ }
+}
+
+function make_mix(tree) {
+ if (tree.type == "Atom") {
+ return Atom("X" + tree.data + "Y");
+ }
+ if (tree.type == "CharacterClass") {
+ return Text([
+ Atom("X"),
+ tree,
+ Atom("Y")
+ ]);
+ }
+ if (tree.type == "Alternative") {
+ return Alternative([
+ Atom("X"),
+ ...tree.nodes,
+ Atom("Y")
+ ]);
+ }
+ return Alternative([
+ Atom("X"),
+ tree,
+ Atom("Y")
+ ]);
+}
+
+function test_mix(pattern, flags, expected) {
+ test_flags(pattern, flags, false, expected);
+ test_flags("X" + pattern + "Y", flags, false, make_mix(expected));
+}
+
+function test(pattern, flags, expected) {
+ test_flags(pattern, flags, false, expected);
+}
+
+function test_match_only(pattern, flags, expected) {
+ test_flags(pattern, flags, true, expected);
+}