2018-04-05 14:41:26 +00:00
|
|
|
// Copyright 2018 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.
|
|
|
|
|
|
|
|
(function TestReceiverNonString() {
|
2019-10-15 14:34:02 +00:00
|
|
|
const iter = 'a'.matchAll(/./g);
|
2018-04-05 14:41:26 +00:00
|
|
|
assertThrows(
|
|
|
|
() => iter.next.call(0),
|
|
|
|
TypeError
|
|
|
|
);
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
(function TestAncestry() {
|
2019-10-15 14:34:02 +00:00
|
|
|
const iterProto = Object.getPrototypeOf('a'.matchAll(/./g));
|
2018-04-05 14:41:26 +00:00
|
|
|
const arrProto = Object.getPrototypeOf([][Symbol.iterator]());
|
|
|
|
|
|
|
|
assertSame(Object.getPrototypeOf(iterProto), Object.getPrototypeOf(arrProto));
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
function TestNoMatch(string, regex_or_string) {
|
|
|
|
const next_result = string.matchAll(regex_or_string).next();
|
|
|
|
assertSame(undefined, next_result.value);
|
|
|
|
assertTrue(next_result.done);
|
|
|
|
}
|
|
|
|
TestNoMatch('a', /b/g);
|
|
|
|
TestNoMatch('a', 'b');
|
|
|
|
|
|
|
|
|
|
|
|
(function NonGlobalRegex() {
|
2019-10-15 14:34:02 +00:00
|
|
|
assertThrows(
|
|
|
|
() => { const iter = 'ab'.matchAll(/./); },
|
|
|
|
TypeError);
|
2018-04-05 14:41:26 +00:00
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
function TestGlobalRegex(regex_or_string) {
|
|
|
|
const iter = 'ab'.matchAll(/./g);
|
|
|
|
let next_result = iter.next();
|
|
|
|
assertEquals(['a'], next_result.value);
|
|
|
|
assertFalse(next_result.done);
|
|
|
|
|
|
|
|
next_result = iter.next();
|
|
|
|
assertEquals(['b'], next_result.value);
|
|
|
|
assertFalse(next_result.done);
|
|
|
|
|
|
|
|
next_result = iter.next();
|
|
|
|
assertSame(undefined, next_result.value);
|
|
|
|
assertTrue(next_result.done);
|
|
|
|
}
|
|
|
|
TestGlobalRegex(/./g);
|
|
|
|
TestGlobalRegex('.');
|
|
|
|
|
|
|
|
|
|
|
|
function TestEmptyGlobalRegExp(regex_or_string) {
|
|
|
|
const iter = 'd'.matchAll(regex_or_string);
|
|
|
|
let next_result = iter.next();
|
|
|
|
assertEquals([''], next_result.value);
|
|
|
|
assertFalse(next_result.done);
|
|
|
|
|
|
|
|
next_result = iter.next();
|
|
|
|
assertEquals([''], next_result.value);
|
|
|
|
assertFalse(next_result.done);
|
|
|
|
|
|
|
|
next_result = iter.next();
|
|
|
|
assertSame(undefined, next_result.value);
|
|
|
|
assertTrue(next_result.done);
|
|
|
|
}
|
|
|
|
TestEmptyGlobalRegExp(undefined);
|
|
|
|
TestEmptyGlobalRegExp(/(?:)/g);
|
|
|
|
TestEmptyGlobalRegExp('');
|
|
|
|
|
|
|
|
|
|
|
|
(function TestGlobalRegExpLastIndex() {
|
|
|
|
const regex = /./g;
|
|
|
|
const string = 'abc';
|
|
|
|
regex.exec(string);
|
|
|
|
assertSame(1, regex.lastIndex);
|
|
|
|
|
|
|
|
const iter = string.matchAll(regex);
|
|
|
|
|
|
|
|
// Verify an internal RegExp is created and mutations to the provided RegExp
|
|
|
|
// are not abservered.
|
|
|
|
regex.exec(string);
|
|
|
|
assertSame(2, regex.lastIndex);
|
|
|
|
|
|
|
|
let next_result = iter.next();
|
|
|
|
assertEquals(['b'], next_result.value);
|
|
|
|
assertFalse(next_result.done);
|
|
|
|
assertSame(2, regex.lastIndex);
|
|
|
|
})();
|