| // 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() { |
| const iter = 'a'.matchAll(/./); |
| assertThrows( |
| () => iter.next.call(0), |
| TypeError |
| ); |
| })(); |
| |
| |
| (function TestAncestry() { |
| const iterProto = Object.getPrototypeOf('a'.matchAll(/./)); |
| 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/); |
| TestNoMatch('a', /b/g); |
| TestNoMatch('a', 'b'); |
| |
| |
| (function NonGlobalRegex() { |
| const iter = 'ab'.matchAll(/./); |
| let next_result = iter.next(); |
| assertEquals(['a'], next_result.value); |
| assertFalse(next_result.done); |
| |
| next_result = iter.next(); |
| assertEquals(undefined, next_result.value); |
| assertTrue(next_result.done); |
| })(); |
| |
| |
| 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); |
| })(); |