tizen beta release
[profile/ivi/webkit-efl.git] / LayoutTests / fast / regex / script-tests / parentheses.js
1 description("This page tests handling of parentheses subexpressions.");
2
3 var regexp1 = /(a|A)(b|B)/;
4 shouldBe("regexp1.exec('abc')", "['ab','a','b']");
5
6 var regexp2 = /(a((b)|c|d))e/;
7 shouldBe("regexp2.exec('abacadabe')", "['abe','ab','b','b']");
8
9 var regexp3 = /(a(b|(c)|d))e/;
10 shouldBe("regexp3.exec('abacadabe')", "['abe','ab','b',undefined]");
11
12 var regexp4 = /(a(b|c|(d)))e/;
13 shouldBe("regexp4.exec('abacadabe')", "['abe','ab','b',undefined]");
14
15 var regexp5 = /(a((b)|(c)|(d)))e/;
16 shouldBe("regexp5.exec('abacadabe')", "['abe','ab','b','b',undefined,undefined]");
17
18 var regexp6 = /(a((b)|(c)|(d)))/;
19 shouldBe("regexp6.exec('abcde')", "['ab','ab','b','b',undefined,undefined]");
20
21 var regexp7 = /(a(b)??)??c/;
22 shouldBe("regexp7.exec('abc')", "['abc','ab','b']");
23
24 var regexp8 = /(a|(e|q))(x|y)/;
25 shouldBe("regexp8.exec('bcaddxqy')" , "['qy','q','q','y']");
26
27 var regexp9 = /((t|b)?|a)$/;
28 shouldBe("regexp9.exec('asdfjejgsdflaksdfjkeljghkjea')", "['a','a',undefined]");
29
30 var regexp10 = /(?:h|e?(?:t|b)?|a?(?:t|b)?)(?:$)/;
31 shouldBe("regexp10.exec('asdfjejgsdflaksdfjkeljghat')", "['at']");
32
33 var regexp11 = /([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/;
34 shouldBeNull("regexp11.exec('Developing with JavaScript is dangerous, do not try it without assistance')");
35
36 var regexp12 = /(?:(.+), )?(.+), (..) to (?:(.+), )?(.+), (..)/;
37 shouldBe("regexp12.exec('Seattle, WA to Buckley, WA')", "['Seattle, WA to Buckley, WA', undefined, 'Seattle', 'WA', undefined, 'Buckley', 'WA']");
38
39 var regexp13 = /(A)?(A.*)/;
40 shouldBe("regexp13.exec('zxcasd;fl\ ^AaaAAaaaf;lrlrzs')", "['AaaAAaaaf;lrlrzs',undefined,'AaaAAaaaf;lrlrzs']");
41
42 var regexp14 = /(a)|(b)/;
43 shouldBe("regexp14.exec('b')", "['b',undefined,'b']");
44
45 var regexp15 = /^(?!(ab)de|x)(abd)(f)/;
46 shouldBe("regexp15.exec('abdf')", "['abdf',undefined,'abd','f']");
47
48 var regexp16 = /(a|A)(b|B)/;
49 shouldBe("regexp16.exec('abc')", "['ab','a','b']");
50
51 var regexp17 = /(a|d|q|)x/i;
52 shouldBe("regexp17.exec('bcaDxqy')", "['Dx','D']");
53
54 var regexp18 = /^.*?(:|$)/;
55 shouldBe("regexp18.exec('Hello: World')", "['Hello:',':']");
56
57 var regexp19 = /(ab|^.{0,2})bar/;
58 shouldBe("regexp19.exec('barrel')", "['bar','']");
59
60 var regexp20 = /(?:(?!foo)...|^.{0,2})bar(.*)/;
61 shouldBe("regexp20.exec('barrel')", "['barrel','rel']");
62 shouldBe("regexp20.exec('2barrel')", "['2barrel','rel']");
63
64 var regexp21 = /([a-g](b|B)|xyz)/;
65 shouldBe("regexp21.exec('abc')", "['ab','ab','b']");
66
67 var regexp22 = /(?:^|;)\s*abc=([^;]*)/;
68 shouldBeNull("regexp22.exec('abcdlskfgjdslkfg')");
69
70 var regexp23 = /"[^<"]*"|'[^<']*'/;
71 shouldBe("regexp23.exec('<html xmlns=\"http://www.w3.org/1999/xhtml\"')", "['\"http://www.w3.org/1999/xhtml\"']");
72
73 var regexp24 = /^(?:(?=abc)\w{3}:|\d\d)$/;
74 shouldBeNull("regexp24.exec('123')");
75
76 var regexp25 = /^\s*(\*|[\w\-]+)(\b|$)?/;
77 shouldBe("regexp25.exec('this is a test')", "['this','this',undefined]");
78 shouldBeNull("regexp25.exec('!this is a test')");
79
80 var regexp26 = /a(b)(a*)|aaa/;
81 shouldBe("regexp26.exec('aaa')", "['aaa',undefined,undefined]");
82
83 var regexp27 = new RegExp(
84     "^" +
85     "(?:" +
86         "([^:/?#]+):" + /* scheme */
87     ")?" +
88     "(?:" +
89         "(//)" + /* authorityRoot */
90         "(" + /* authority */
91             "(?:" +
92                 "(" + /* userInfo */
93                     "([^:@]*)" + /* user */
94                     ":?" +
95                     "([^:@]*)" + /* password */
96                 ")?" +
97                 "@" +
98             ")?" +
99             "([^:/?#]*)" + /* domain */
100             "(?::(\\d*))?" + /* port */
101         ")" +
102     ")?" +
103     "([^?#]*)" + /*path*/
104     "(?:\\?([^#]*))?" + /* queryString */
105     "(?:#(.*))?" /*fragment */
106 );
107 shouldBe("regexp27.exec('file:///Users/Someone/Desktop/HelloWorld/index.html')", "['file:///Users/Someone/Desktop/HelloWorld/index.html','file','//','',undefined,undefined,undefined,'',undefined,'/Users/Someone/Desktop/HelloWorld/index.html',undefined,undefined]");
108
109 var regexp28 = new RegExp(
110     "^" +
111     "(?:" +
112         "([^:/?#]+):" + /* scheme */
113     ")?" +
114     "(?:" +
115         "(//)" + /* authorityRoot */
116         "(" + /* authority */
117             "(" + /* userInfo */
118                 "([^:@]*)" + /* user */
119                 ":?" +
120                 "([^:@]*)" + /* password */
121             ")?" +
122             "@" +
123         ")" +
124     ")?"
125 );
126 shouldBe("regexp28.exec('file:///Users/Someone/Desktop/HelloWorld/index.html')", "['file:','file',undefined,undefined,undefined,undefined,undefined]");
127
128 var regexp29 = /^\s*((\[[^\]]+\])|(u?)("[^"]+"))\s*/;
129 shouldBeNull("regexp29.exec('Committer:')");
130
131 var regexp30 = /^\s*((\[[^\]]+\])|m(u?)("[^"]+"))\s*/;
132 shouldBeNull("regexp30.exec('Committer:')");
133
134 var regexp31 = /^\s*(m(\[[^\]]+\])|m(u?)("[^"]+"))\s*/;
135 shouldBeNull("regexp31.exec('Committer:')");
136
137 var regexp32 = /\s*(m(\[[^\]]+\])|m(u?)("[^"]+"))\s*/;
138 shouldBeNull("regexp32.exec('Committer:')");
139
140 var regexp33 = RegExp('^(?:(?:(a)(xyz|[^>"\'\s]*)?)|(/?>)|.[^\w\s>]*)');
141 shouldBe("regexp33.exec('> <head>')","['>',undefined,undefined,'>']");
142
143 var regexp34 = /(?:^|\b)btn-\S+/;
144 shouldBeNull("regexp34.exec('xyz123')");
145 shouldBe("regexp34.exec('btn-abc')","['btn-abc']");
146 shouldBeNull("regexp34.exec('btn- abc')");
147 shouldBeNull("regexp34.exec('XXbtn-abc')");
148 shouldBe("regexp34.exec('XX btn-abc')","['btn-abc']");
149
150 var regexp35 = /^((a|b)(x|xxx)|)$/;
151 shouldBe("regexp35.exec('ax')", "['ax','ax','a','x']");
152 shouldBeNull("regexp35.exec('axx')");
153 shouldBe("regexp35.exec('axxx')", "['axxx','axxx','a','xxx']");
154 shouldBe("regexp35.exec('bx')", "['bx','bx','b','x']");
155 shouldBeNull("regexp35.exec('bxx')");
156 shouldBe("regexp35.exec('bxxx')", "['bxxx','bxxx','b','xxx']");
157
158 var regexp36 = /^((\/|\.|\-)(\d\d|\d\d\d\d)|)$/;
159 shouldBe("regexp36.exec('/2011')", "['/2011','/2011','/','2011']");
160 shouldBe("regexp36.exec('/11')", "['/11','/11','/','11']");
161 shouldBeNull("regexp36.exec('/123')");
162
163 var regexp37 = /^([1][0-2]|[0]\d|\d)(\/|\.|\-)([0-2]\d|[3][0-1]|\d)((\/|\.|\-)(\d\d|\d\d\d\d)|)$/;
164 shouldBe("regexp37.exec('7/4/1776')", "['7/4/1776','7','/','4','/1776','/','1776']");
165 shouldBe("regexp37.exec('07-04-1776')", "['07-04-1776','07','-','04','-1776','-','1776']");
166
167 var regexp38 = /^(z|(x|xx)|b|)$/;
168 shouldBe("regexp38.exec('xx')", "['xx','xx','xx']");
169 shouldBe("regexp38.exec('b')", "['b','b',undefined]");
170 shouldBe("regexp38.exec('z')", "['z','z',undefined]");
171 shouldBe("regexp38.exec('')", "['','',undefined]");
172
173 var regexp39 = /(8|((?=P)))?/;
174 shouldBe("regexp39.exec('')", "['',undefined,undefined]");
175 shouldBe("regexp39.exec('8')", "['8','8',undefined]");
176 shouldBe("regexp39.exec('zP')", "['',undefined,undefined]");
177
178 var regexp40 = /((8)|((?=P){4}))?()/;
179 shouldBe("regexp40.exec('')", "['',undefined,undefined,undefined,'']");
180 shouldBe("regexp40.exec('8')", "['8','8','8',undefined,'']");
181 shouldBe("regexp40.exec('zPz')", "['',undefined,undefined,undefined,'']");
182 shouldBe("regexp40.exec('zPPz')", "['',undefined,undefined,undefined,'']");
183 shouldBe("regexp40.exec('zPPPz')", "['',undefined,undefined,undefined,'']");
184 shouldBe("regexp40.exec('zPPPPz')", "['',undefined,undefined,undefined,'']");
185
186 var regexp41 = /(([\w\-]+:\/\/?|www[.])[^\s()<>]+(?:([\w\d]+)|([^\[:punct:\]\s()<>\W]|\/)))/;
187 shouldBe("regexp41.exec('Here is a link: http://www.acme.com/our_products/index.html. That is all we want!')", "['http://www.acme.com/our_products/index.html','http://www.acme.com/our_products/index.html','http://','l',undefined]");
188
189 var regexp42 = /((?:(4)?))?/;
190 shouldBe("regexp42.exec('')", "['',undefined,undefined]");
191 shouldBe("regexp42.exec('4')", "['4','4','4']");
192 shouldBe("regexp42.exec('4321')", "['4','4','4']");
193
194 shouldBeTrue("/(?!(?=r{0}){2,})|((z)?)?/gi.test('')");
195
196 var regexp43 = /(?!(?:\1+s))/;
197 shouldBe("regexp43.exec('SSS')", "['']");
198
199 var regexp44 = /(?!(?:\3+(s+?)))/g;
200 shouldBe("regexp44.exec('SSS')", "['',undefined]");
201
202 var regexp45 = /((?!(?:|)v{2,}|))/;
203 shouldBeNull("regexp45.exec('vt')");
204
205 var regexp46 = /(w)(?:5{3}|())|pk/;
206 shouldBeNull("regexp46.exec('5')");
207 shouldBe("regexp46.exec('pk')", "['pk',undefined,undefined]");
208 shouldBe("regexp46.exec('Xw555')", "['w555','w',undefined]");
209 shouldBe("regexp46.exec('Xw55pk5')", "['w','w','']");
210
211 var regexp47 = /(.*?)(?:(?:\?(.*?)?)?)(?:(?:#)?)$/;
212 shouldBe("regexp47.exec('/www.acme.com/this/is/a/path/file.txt')", "['/www.acme.com/this/is/a/path/file.txt','/www.acme.com/this/is/a/path/file.txt',undefined]");
213
214 var regexp48 = /^(?:(\w+):\/*([\w\.\-\d]+)(?::(\d+)|)(?=(?:\/|$))|)(?:$|\/?(.*?)(?:\?(.*?)?|)(?:#(.*)|)$)/;
215 /* The regexp on the prior line confuses Xcode syntax highlighting, this coment fixes it! */
216 shouldBe("regexp48.exec('http://www.acme.com/this/is/a/path/file.txt')", "['http://www.acme.com/this/is/a/path/file.txt','http','www.acme.com',undefined,'this/is/a/path/file.txt',undefined,undefined]");
217
218 var regexp49 = /(?:([^:]*?)(?:(?:\?(.*?)?)?)(?:(?:#)?)$)|(?:^(?:(\w+):\/*([\w\.\-\d]+)(?::(\d+)|)(?=(?:\/|$))|)(?:$|\/?(.*?)(?:\?(.*?)?|)(?:#(.*)|)$))/;
219 /* The regexp on the prior line confuses Xcode syntax highlighting, this coment fixes it! */
220 shouldBe("regexp49.exec('http://www.acme.com/this/is/a/path/file.txt')", "['http://www.acme.com/this/is/a/path/file.txt',undefined,undefined,'http','www.acme.com',undefined,'this/is/a/path/file.txt',undefined,undefined]");
221
222 var regexp50 = /((a)b{28,}c|d)x/;
223 shouldBeNull("regexp50.exec('((a)b{28,}c|d)x')");
224 shouldBe("regexp50.exec('abbbbbbbbbbbbbbbbbbbbbbbbbbbbcx')", "['abbbbbbbbbbbbbbbbbbbbbbbbbbbbcx', 'abbbbbbbbbbbbbbbbbbbbbbbbbbbbc', 'a']");
225 shouldBe("regexp50.exec('dx')", "['dx', 'd', undefined]");
226
227 var s = "((.\s{-}).{28,}\P{Yi}?{,30}\|.)\x9e{-,}\P{Any}";
228 var regexp51 = new RegExp(s);
229 shouldBeNull("regexp51.exec('abc')");
230 shouldBe("regexp51.exec(s)", "[')\x9e{-,}P{Any}',')',undefined]");
231
232 var regexp52 = /(Rob)|(Bob)|(Robert)|(Bobby)/;
233 shouldBe("'Hi Bob'.match(regexp52)", "['Bob',undefined,'Bob',undefined,undefined]");
234
235 // Test cases discovered by fuzzing that crashed the compiler.
236 var regexp53 = /(?=(?:(?:(gB)|(?!cs|<))((?=(?!v6){0,})))|(?=#)+?)/m;
237 shouldBe("regexp53.exec('#')", "['',undefined,'']");
238 var regexp54 = /((?:(?:()|(?!))((?=(?!))))|())/m;
239 shouldBe("regexp54.exec('#')", "['','',undefined,undefined,'']");
240 var regexp55 = /(?:(?:(?:a?|(?:))((?:)))|a?)/m;
241 shouldBe("regexp55.exec('#')", "['','']");
242
243 // Test evaluation order of empty subpattern alternatives.
244 var regexp56 = /(|a)/;
245 shouldBe("regexp56.exec('a')", "['','']");
246 var regexp57 = /(a|)/;
247 shouldBe("regexp57.exec('a')", "['a','a']");
248
249 // Tests that non-greedy repeat quantified parentheses will backtrack through multiple frames of subpattern matches.
250 var regexp58 = /a|b(?:[^b])*?c/;
251 shouldBe("regexp58.exec('badbc')", "['a']");
252 var regexp59 = /(X(?:.(?!X))*?Y)|(Y(?:.(?!Y))*?Z)/g;
253 shouldBe("'Y aaa X Match1 Y aaa Y Match2 Z'.match(regexp59)", "['X Match1 Y','Y Match2 Z']");
254