blob: 42bb2d71dc3c8f97ea05d386f5df5ba807e81a00 [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 Murdoch097c5b22016-05-18 11:27:45 +01005var L = "\ud800";
6var T = "\udc00";
7var x = "x";
8
9var r = /()/g; // Global, but not unicode.
10// Zero-length matches do not advance lastIndex.
11assertEquals(["", ""], r.exec(L + T + L + T));
12assertEquals(0, r.lastIndex);
13r.lastIndex = 1;
14assertEquals(["", ""], r.exec(L + T + L + T));
15assertEquals(1, r.lastIndex);
16
17var u = /()/ug; // Global and unicode.
18// Zero-length matches do not advance lastIndex.
19assertEquals(["", ""], u.exec(L + T + L + T));
20assertEquals(0, u.lastIndex);
21u.lastIndex = 1;
22assertEquals(["", ""], u.exec(L + T + L + T));
23assertEquals(0, u.lastIndex);
24
25// However, with repeating matches, lastIndex does not matter.
26// We do advance from match to match.
27r.lastIndex = 2;
28assertEquals(x + L + x + T + x + L + x + T + x,
29 (L + T + L + T).replace(r, "x"));
30
31// With unicode flag, we advance code point by code point.
32u.lastIndex = 3;
33assertEquals(x + L + T + x + L + T + x,
34 (L + T + L + T).replace(u, "x"));
35
36// Test that exhausting the global match cache is fine.
37assertEquals((x + L + T).repeat(1000) + x,
38 (L + T).repeat(1000).replace(u, "x"));
39
40// Same thing for RegExp.prototype.match.
41r.lastIndex = 1;
42assertEquals(["","","","",""], (L + T + L + T).match(r));
43r.lastIndex = 2;
44assertEquals(["","","","",""], (L + T + L + T).match(r));
45
46u.lastIndex = 1;
47assertEquals(["","",""], (L + T + L + T).match(u));
48u.lastIndex = 2;
49assertEquals(["","",""], (L + T + L + T).match(u));
50
51var expected = [];
52for (var i = 0; i <= 1000; i++) expected.push("");
53assertEquals(expected, (L + T).repeat(1000).match(u));
54
55// Also test RegExp.prototype.@@split.
56assertEquals(["\u{12345}"], "\u{12345}".split(/(?:)/u));