v8/test/mjsunit/es6/unicode-regexp-zero-length.js
adamk c7eb436d09 Remove all harmony runtime flags which shipped in M51
Flags removed (all begin with "harmony-"):
  function-name
  instanceof
  iterator-close
  unicode-regexps
  regexp-exec
  regexp-subclass
  species

BUG=v8:3566, v8:3648, v8:3699, v8:4093, v8:4447, v8:4602

Review-Url: https://codereview.chromium.org/2096933002
Cr-Commit-Position: refs/heads/master@{#37235}
2016-06-24 01:13:10 +00:00

57 lines
1.8 KiB
JavaScript

// 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));
// Also test RegExp.prototype.@@split.
assertEquals(["\u{12345}"], "\u{12345}".split(/(?:)/u));