blob: f39004fe973eebdf9678c855c7ce5f848e0d707d [file] [log] [blame]
Ben Murdoch097c5b22016-05-18 11:27:45 +01001// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Murdoch61f157c2016-09-16 13:49:30 +01005// Flags: --harmony-regexp-lookbehind
Ben Murdoch097c5b22016-05-18 11:27:45 +01006
7function execl(expectation, regexp, subject) {
8 if (regexp instanceof String) regexp = new RegExp(regexp, "u");
9 assertEquals(expectation, regexp.exec(subject));
10}
11
12function execs(expectation, regexp_source, subject) {
13 execl(expectation, new RegExp(regexp_source, "u"), subject);
14}
15
16// Character ranges.
17execl(["A"], /[A-D]/u, "A");
18execs(["A"], "[A-D]", "A");
19execl(["ABCD"], /[A-D]+/u, "ZABCDEF");
20execs(["ABCD"], "[A-D]+", "ZABCDEF");
21
22execl(["\u{12345}"], /[\u1234-\u{12345}]/u, "\u{12345}");
23execs(["\u{12345}"], "[\u1234-\u{12345}]", "\u{12345}");
24execl(null, /[^\u1234-\u{12345}]/u, "\u{12345}");
25execs(null, "[^\u1234-\u{12345}]", "\u{12345}");
26
27execl(["\u{1234}"], /[\u1234-\u{12345}]/u, "\u{1234}");
28execs(["\u{1234}"], "[\u1234-\u{12345}]", "\u{1234}");
29execl(null, /[^\u1234-\u{12345}]/u, "\u{1234}");
30execs(null, "[^\u1234-\u{12345}]", "\u{1234}");
31
32execl(null, /[\u1234-\u{12345}]/u, "\u{1233}");
33execs(null, "[\u1234-\u{12345}]", "\u{1233}");
34execl(["\u{1233}"], /[^\u1234-\u{12345}]/u, "\u{1233}");
35execs(["\u{1233}"], "[^\u1234-\u{12345}]", "\u{1233}");
36
37execl(["\u{12346}"], /[^\u1234-\u{12345}]/u, "\u{12346}");
38execs(["\u{12346}"], "[^\u1234-\u{12345}]", "\u{12346}");
39execl(null, /[\u1234-\u{12345}]/u, "\u{12346}");
40execs(null, "[\u1234-\u{12345}]", "\u{12346}");
41
42execl(["\u{12342}"], /[\u{12340}-\u{12345}]/u, "\u{12342}");
43execs(["\u{12342}"], "[\u{12340}-\u{12345}]", "\u{12342}");
44execl(["\u{12342}"], /[\ud808\udf40-\ud808\udf45]/u, "\u{12342}");
45execs(["\u{12342}"], "[\ud808\udf40-\ud808\udf45]", "\u{12342}");
46execl(null, /[^\u{12340}-\u{12345}]/u, "\u{12342}");
47execs(null, "[^\u{12340}-\u{12345}]", "\u{12342}");
48execl(null, /[^\ud808\udf40-\ud808\udf45]/u, "\u{12342}");
49execs(null, "[^\ud808\udf40-\ud808\udf45]", "\u{12342}");
50
51execl(["\u{ffff}"], /[\u{ff80}-\u{12345}]/u, "\u{ffff}");
52execs(["\u{ffff}"], "[\u{ff80}-\u{12345}]", "\u{ffff}");
53execl(["\u{ffff}"], /[\u{ff80}-\ud808\udf45]/u, "\u{ffff}");
54execs(["\u{ffff}"], "[\u{ff80}-\ud808\udf45]", "\u{ffff}");
55execl(null, /[^\u{ff80}-\u{12345}]/u, "\u{ffff}");
56execs(null, "[^\u{ff80}-\u{12345}]", "\u{ffff}");
57execl(null, /[^\u{ff80}-\ud808\udf45]/u, "\u{ffff}");
58execs(null, "[^\u{ff80}-\ud808\udf45]", "\u{ffff}");
59
60// Lone surrogate
61execl(["\ud800"], /[^\u{ff80}-\u{12345}]/u, "\uff99\u{d800}A");
62execs(["\udc00"], "[^\u{ff80}-\u{12345}]", "\uff99\u{dc00}A");
63execl(["\udc01"], /[\u0100-\u{10ffff}]/u, "A\udc01");
64execl(["\udc03"], /[\udc01-\udc03]/u, "\ud801\udc02\udc03");
65execl(["\ud801"], /[\ud801-\ud803]/u, "\ud802\udc01\ud801");
66
67// Paired sorrogate.
68execl(null, /[^\u{ff80}-\u{12345}]/u, "\u{d800}\u{dc00}");
69execs(null, "[^\u{ff80}-\u{12345}]", "\u{d800}\u{dc00}");
70execl(["\ud800\udc00"], /[\u{ff80}-\u{12345}]/u, "\u{d800}\u{dc00}");
71execs(["\ud800\udc00"], "[\u{ff80}-\u{12345}]", "\u{d800}\u{dc00}");
72execl(["foo\u{10e6d}bar"], /foo\ud803\ude6dbar/u, "foo\u{10e6d}bar");
73
74// Lone surrogates
75execl(["\ud801\ud801"], /\ud801+/u, "\ud801\udc01\ud801\ud801");
76execl(["\udc01\udc01"], /\udc01+/u, "\ud801\ud801\udc01\udc01\udc01");
77
78execl(["\udc02\udc03A"], /\W\WA/u, "\ud801\udc01A\udc02\udc03A");
79execl(["\ud801\ud802"], /\ud801./u, "\ud801\udc01\ud801\ud802");
80execl(["\udc02\udc03A"], /[\ud800-\udfff][\ud800-\udfff]A/u,
81 "\ud801\udc01A\udc02\udc03A");
82
83// Character classes
84execl(null, /\w/u, "\ud801\udc01");
85execl(["\ud801"], /[^\w]/, "\ud801\udc01");
86execl(["\ud801\udc01"], /[^\w]/u, "\ud801\udc01");
87execl(["\ud801"], /\W/, "\ud801\udc01");
88execl(["\ud801\udc01"], /\W/u, "\ud801\udc01");
89
90execl(["\ud800X"], /.X/u, "\ud800XaX");
91execl(["aX"], /.(?<!\ud800)X/u, "\ud800XaX");
92execl(["aX"], /.(?<![\ud800-\ud900])X/u, "\ud800XaX");
93
94execl(null, /[]/u, "\u1234");
95execl(["0abc"], /[^]abc/u, "0abc");
96execl(["\u1234abc"], /[^]abc/u, "\u1234abc");
97execl(["\u{12345}abc"], /[^]abc/u, "\u{12345}abc");
98
99execl(null, /[\u{0}-\u{1F444}]/u, "\ud83d\udfff");
100
101// Backward matches of lone surrogates.
102execl(["B", "\ud803A"], /(?<=([\ud800-\ud900]A))B/u,
103 "\ud801\udc00AB\udc00AB\ud802\ud803AB");
104execl(["B", "\udc00A"], /(?<=([\ud800-\u{10300}]A))B/u,
105 "\ud801\udc00AB\udc00AB\ud802\ud803AB");
106execl(["B", "\udc11A"], /(?<=([\udc00-\udd00]A))B/u,
107 "\ud801\udc00AB\udc11AB\ud802\ud803AB");
108execl(["X", "\ud800C"], /(?<=(\ud800\w))X/u,
109 "\ud800\udc00AX\udc11BX\ud800\ud800CX");
110execl(["C", "\ud800\ud800"], /(?<=(\ud800.))\w/u,
111 "\ud800\udc00AX\udc11BX\ud800\ud800CX");
112execl(["X", "\udc01C"], /(?<=(\udc01\w))X/u,
113 "\ud800\udc01AX\udc11BX\udc01\udc01CX");
114execl(["C", "\udc01\udc01"], /(?<=(\udc01.))./u,
115 "\ud800\udc01AX\udc11BX\udc01\udc01CX");
116
117var L = "\ud800";
118var T = "\udc00";
119var X = "X";
120
121// Test string contains only match.
122function testw(expect, src, subject) {
123 var re = new RegExp("^" + src + "$", "u");
124 assertEquals(expect, re.test(subject));
125}
126
127// Test string starts with match.
128function tests(expect, src, subject) {
129 var re = new RegExp("^" + src, "u");
130 assertEquals(expect, re.test(subject));
131}
132
133testw(true, X, X);
134testw(true, L, L);
135testw(true, T, T);
136testw(true, L + T, L + T);
137testw(true, T + L, T + L);
138testw(false, T, L + T);
139testw(false, L, L + T);
140testw(true, ".(?<=" + L + ")", L);
141testw(true, ".(?<=" + T + ")", T);
142testw(true, ".(?<=" + L + T + ")", L + T);
143testw(true, ".(?<=" + L + T + ")", L + T);
144tests(true, ".(?<=" + T + ")", T + L);
145tests(false, ".(?<=" + L + ")", L + T);
146tests(false, ".(?<=" + T + ")", L + T);
147tests(true, "..(?<=" + T + ")", T + T + L);
148tests(true, "..(?<=" + T + ")", X + T + L);
149tests(true, "...(?<=" + L + ")", X + T + L);
150tests(false, "...(?<=" + T + ")", X + L + T)
151tests(true, "..(?<=" + L + T + ")", X + L + T)
152tests(true, "..(?<=" + L + T + "(?<=" + L + T + "))", X + L + T);
153tests(false, "..(?<=" + L + "(" + T + "))", X + L + T);
154tests(false, ".*" + L, X + L + T);
155tests(true, ".*" + L, X + L + L + T);
156tests(false, ".*" + L, X + L + T + L + T);
157tests(false, ".*" + T, X + L + T + L + T);
158tests(true, ".*" + T, X + L + T + T + L + T);