Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / third_party / WebKit / LayoutTests / fast / regex / script-tests / non-pattern-characters.js
blobb73c9a242665e179f546aae3ae5a168ecc56a72e
1 description(
2 "This page tests handling of characters which, according to ECMA 262, are not regular expression PatternCharacters. Those characters are: ^ $ \ . * + ? ( ) [ ] { } |"
3 );
5 // We test two cases, to match the two cases in the WREC parser.
6 // Test 1: the character stand-alone.
7 // Test 2: the character following a PatternCharacter.
9 var regexp;
11 // ^: Always allowed, always an assertion.
13 regexp = /^/g;
14 debug("\nTesting regexp: " + regexp);
15 shouldBeTrue("regexp.test('')");
16 shouldBe("regexp.lastIndex", "0");
18 regexp = /\n^/gm;
19 debug("\nTesting regexp: " + regexp);
20 shouldBeTrue("regexp.test('\\n\\n')");
21 shouldBe("regexp.lastIndex", "1");
23 // $: Always allowed, always an assertion.
25 regexp = /$/g;
26 debug("\nTesting regexp: " + regexp);
27 shouldBeTrue("regexp.test('')");
28 shouldBe("regexp.lastIndex", "0");
30 regexp = /\n$/gm;
31 debug("\nTesting regexp: " + regexp);
32 shouldBeTrue("regexp.test('\\n\\n')");
33 shouldBe("regexp.lastIndex", "1");
35 // \: Only allowed as a prefix. Contrary to spec, always treated as an
36 // IdentityEscape when followed by an invalid escape postfix.
37 regexp = /\z/;
38 debug("\nTesting regexp: " + regexp);
39 shouldBeTrue("regexp.test('z')"); // invalid postfix => IdentityEscape
41 regexp = /a\z/;
42 debug("\nTesting regexp: " + regexp);
43 shouldBeTrue("regexp.test('az')"); // invalid postfix => IdentityEscape
45 regexp = /\_/;
46 debug("\nTesting regexp: " + regexp);
47 shouldBeTrue("regexp.test('_')"); // invalid postfix => IdentityEscape
49 regexp = /a\_/;
50 debug("\nTesting regexp: " + regexp);
51 shouldBeTrue("regexp.test('a_')"); // invalid postfix => IdentityEscape
53 debug("\nTesting regexp: " + "[invalid \\ variations]");
54 shouldThrow("/\\/"); // no postfix => not allowed
55 shouldThrow("/a\\/"); // no postfix => not allowed
57 // .: Always allowed, always a non-newline wildcard.
58 regexp = /./;
59 debug("\nTesting regexp: " + regexp);
60 shouldBeTrue("regexp.test('a')");
61 shouldBeFalse("regexp.test('\\n')");
63 regexp = /a./;
64 debug("\nTesting regexp: " + regexp);
65 shouldBeTrue("regexp.test('aa')");
66 shouldBeFalse("regexp.test('a\\n')");
68 // *: Only allowed as a postfix to a PatternCharacter. Behaves as a {0,Infinity} quantifier.
69 regexp = /a*/gm;
70 debug("\nTesting regexp: " + regexp);
71 shouldBeTrue("regexp.test('b')");
72 shouldBe("regexp.lastIndex", "0");
74 shouldBeTrue("regexp.test('aaba')");
75 shouldBe("regexp.lastIndex", "2");
77 debug("\nTesting regexp: " + "[invalid * variations]");
78 shouldThrow("/*/"); // Unterminated comment.
79 shouldThrow("/^*/"); // Prefixed by ^ to avoid confusion with comment syntax.
81 // +: Only allowed as a postfix to a PatternCharacter. Behaves as a {1,Infinity} quantifier.
82 regexp = /a+/gm;
83 debug("\nTesting regexp: " + regexp);
84 shouldBeFalse("regexp.test('b')");
86 shouldBeTrue("regexp.test('aaba')");
87 shouldBe("regexp.lastIndex", "2");
89 debug("\nTesting regexp: " + "[invalid + variations]");
90 shouldThrow("/+/");
92 // ?: Only allowed as a postfix to a PatternCharacter. Behaves as a {0,1} quantifier.
93 regexp = /a?/gm;
94 debug("\nTesting regexp: " + regexp);
95 shouldBeTrue("regexp.test('b')");
96 shouldBe("regexp.lastIndex", "0");
98 shouldBeTrue("regexp.test('aaba')");
99 shouldBe("regexp.lastIndex", "1");
101 debug("\nTesting regexp: " + "[invalid ? variations]");
102 shouldThrow("/?/");
104 // (: Only allowed if it matches a ).
105 debug("\nTesting regexp: " + "[invalid ( variations]");
106 shouldThrow("/(/");
107 shouldThrow("/a(/");
109 // ): Only allowed if it matches a (.
110 debug("\nTesting regexp: " + "[invalid ) variations]");
111 shouldThrow("/)/");
112 shouldThrow("/a)/");
114 // [: Only allowed if it matches a ] and the stuff in between is a valid character class.
115 debug("\nTesting regexp: " + "[invalid [ variations]");
116 shouldThrow("/[/");
117 shouldThrow("/a[/");
119 shouldThrow("/[b-a]/");
120 shouldThrow("/a[b-a]/");
122 // ]: Closes a ]. Contrary to spec, if no [ was seen, acts as a regular PatternCharacter.
123 regexp = /]/gm;
124 debug("\nTesting regexp: " + regexp);
125 shouldBeTrue("regexp.test(']')");
126 shouldBe("regexp.lastIndex", "1");
128 regexp = /a]/gm;
129 debug("\nTesting regexp: " + regexp);
130 shouldBeTrue("regexp.test('a]')");
131 shouldBe("regexp.lastIndex", "2");
133 // {: Begins a quantifier. Contrary to spec, if no } is seen, or if the stuff in
134 // between does not lex as a quantifier, acts as a regular PatternCharacter. If
135 // the stuff in between does lex as a quantifier, but the quantifier is invalid,
136 // acts as a syntax error.
137 regexp = /{/gm;
138 debug("\nTesting regexp: " + regexp);
139 shouldBeTrue("regexp.test('{')");
140 shouldBe("regexp.lastIndex", "1");
142 regexp = /a{/gm;
143 debug("\nTesting regexp: " + regexp);
144 shouldBeTrue("regexp.test('a{')");
145 shouldBe("regexp.lastIndex", "2");
147 regexp = /{a/gm;
148 debug("\nTesting regexp: " + regexp);
149 shouldBeTrue("regexp.test('{a')");
150 shouldBe("regexp.lastIndex", "2");
152 regexp = /a{a/gm;
153 debug("\nTesting regexp: " + regexp);
154 shouldBeTrue("regexp.test('a{a')");
155 shouldBe("regexp.lastIndex", "3");
157 regexp = /{1,/gm;
158 debug("\nTesting regexp: " + regexp);
159 shouldBeTrue("regexp.test('{1,')");
160 shouldBe("regexp.lastIndex", "3");
162 regexp = /a{1,/gm;
163 debug("\nTesting regexp: " + regexp);
164 shouldBeTrue("regexp.test('a{1,')");
165 shouldBe("regexp.lastIndex", "4");
167 regexp = /{1,a/gm;
168 debug("\nTesting regexp: " + regexp);
169 shouldBeTrue("regexp.test('{1,a')");
170 shouldBe("regexp.lastIndex", "4");
172 regexp = /{1,0/gm;
173 debug("\nTesting regexp: " + regexp);
174 shouldBeTrue("regexp.test('{1,0')");
175 shouldBe("regexp.lastIndex", "4");
177 regexp = /{1, 0}/gm;
178 debug("\nTesting regexp: " + regexp);
179 shouldBeTrue("regexp.test('{1, 0}')");
180 shouldBe("regexp.lastIndex", "6");
182 regexp = /a{1, 0}/gm;
183 debug("\nTesting regexp: " + regexp);
184 shouldBeTrue("regexp.test('a{1, 0}')");
185 shouldBe("regexp.lastIndex", "7");
187 try { regexp = new RegExp("a{1,0", "gm"); } catch(e) { regexp = e; }; // Work around exception thrown in Firefox -- probably too weird to be worth matching. 
188 debug("\nTesting regexp: " + regexp);
189 shouldBeTrue("regexp.test('a{1,0')");
190 shouldBe("regexp.lastIndex", "5");
192 regexp = /a{0}/gm;
193 debug("\nTesting regexp: " + regexp);
194 shouldBeTrue("regexp.test('a')");
195 shouldBe("regexp.lastIndex", "0");
196 shouldBeTrue("regexp.test('b')");
197 shouldBe("regexp.lastIndex", "0");
199 debug("\nTesting regexp: " + "[invalid {} variations]");
200 shouldThrow("/{0}/");
201 shouldThrow("/{1,0}/");
202 shouldThrow("/a{1,0}/");
204 // }: Ends a quantifier. Same rules as for {.
205 regexp = /}/gm;
206 debug("\nTesting regexp: " + regexp);
207 shouldBeTrue("regexp.test('}')");
208 shouldBe("regexp.lastIndex", "1");
210 regexp = /a}/gm;
211 debug("\nTesting regexp: " + regexp);
212 shouldBeTrue("regexp.test('a}')");
213 shouldBe("regexp.lastIndex", "2");
215 // |: Always allowed, always separates two alternatives.
216 regexp = new RegExp("", "gm");
217 debug("\nTesting regexp: " + regexp);
218 shouldBeTrue("regexp.test('')");
219 shouldBe("regexp.lastIndex", "0");
221 regexp = /|/gm;
222 debug("\nTesting regexp: " + regexp);
223 shouldBeTrue("regexp.test('|')");
224 shouldBe("regexp.lastIndex", "0");
226 regexp = /a|/gm;
227 debug("\nTesting regexp: " + regexp);
228 shouldBeTrue("regexp.test('|')");
229 shouldBe("regexp.lastIndex", "0");