2016-01-27 13:08:32 +00:00
|
|
|
// Copyright 2016 the V8 project authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
|
|
|
var L = "\ud800";
|
|
|
|
var T = "\udc00";
|
|
|
|
var x = "x";
|
|
|
|
|
|
|
|
var r = /()/g; // Global, but not unicode.
|
|
|
|
// Zero-length matches do not advance lastIndex.
|
|
|
|
assertEquals(["", ""], r.exec(L + T + L + T));
|
|
|
|
assertEquals(0, r.lastIndex);
|
|
|
|
r.lastIndex = 1;
|
|
|
|
assertEquals(["", ""], r.exec(L + T + L + T));
|
|
|
|
assertEquals(1, r.lastIndex);
|
|
|
|
|
|
|
|
var u = /()/ug; // Global and unicode.
|
|
|
|
// Zero-length matches do not advance lastIndex.
|
|
|
|
assertEquals(["", ""], u.exec(L + T + L + T));
|
|
|
|
assertEquals(0, u.lastIndex);
|
|
|
|
u.lastIndex = 1;
|
|
|
|
assertEquals(["", ""], u.exec(L + T + L + T));
|
|
|
|
assertEquals(0, u.lastIndex);
|
|
|
|
|
|
|
|
// However, with repeating matches, lastIndex does not matter.
|
|
|
|
// We do advance from match to match.
|
|
|
|
r.lastIndex = 2;
|
|
|
|
assertEquals(x + L + x + T + x + L + x + T + x,
|
|
|
|
(L + T + L + T).replace(r, "x"));
|
|
|
|
|
|
|
|
// With unicode flag, we advance code point by code point.
|
|
|
|
u.lastIndex = 3;
|
|
|
|
assertEquals(x + L + T + x + L + T + x,
|
|
|
|
(L + T + L + T).replace(u, "x"));
|
|
|
|
|
|
|
|
// Test that exhausting the global match cache is fine.
|
|
|
|
assertEquals((x + L + T).repeat(1000) + x,
|
|
|
|
(L + T).repeat(1000).replace(u, "x"));
|
|
|
|
|
|
|
|
// Same thing for RegExp.prototype.match.
|
|
|
|
r.lastIndex = 1;
|
|
|
|
assertEquals(["","","","",""], (L + T + L + T).match(r));
|
|
|
|
r.lastIndex = 2;
|
|
|
|
assertEquals(["","","","",""], (L + T + L + T).match(r));
|
|
|
|
|
|
|
|
u.lastIndex = 1;
|
|
|
|
assertEquals(["","",""], (L + T + L + T).match(u));
|
|
|
|
u.lastIndex = 2;
|
|
|
|
assertEquals(["","",""], (L + T + L + T).match(u));
|
|
|
|
|
|
|
|
var expected = [];
|
|
|
|
for (var i = 0; i <= 1000; i++) expected.push("");
|
|
|
|
assertEquals(expected, (L + T).repeat(1000).match(u));
|
2016-02-03 14:48:34 +00:00
|
|
|
|
|
|
|
// Also test RegExp.prototype.@@split.
|
|
|
|
assertEquals(["\u{12345}"], "\u{12345}".split(/(?:)/u));
|