nodejs/deps/v8/test/mjsunit/regexp-lookbehind-experimental.js
Michaël Zasso 918fe04351
deps: update V8 to 13.6.233.8
PR-URL: https://github.com/nodejs/node/pull/58070
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Darshan Sen <raisinten@gmail.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
2025-05-02 15:06:53 +02:00

124 lines
3.3 KiB
JavaScript

// Copyright 2024 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.
//
// Flags: --allow-natives-syntax --default-to-experimental-regexp-engine --experimental-regexp-engine-capture-group-opt
// Tests captures in positive and negative look-ahead in regular expressions.
function stringEscape(string) {
// Converts string to source literal.
return '"' + string.replace(/["\\]/g, '\\$1') + '"';
}
function testRE(re, input, expected_result) {
assertEquals(%RegexpTypeTag(re), 'EXPERIMENTAL');
var testName = re + '.test(' + stringEscape(input) + ')';
if (expected_result) {
assertTrue(re.test(input), testName);
} else {
assertFalse(re.test(input), testName);
}
}
function execRE(re, input, expected_result) {
assertEquals(%RegexpTypeTag(re), 'EXPERIMENTAL');
var testName = re + ".exec('" + stringEscape(input) + "')";
assertEquals(expected_result, re.exec(input), testName);
}
// Test of simple positive lookahead.
var re = /(?<=a)$/;
testRE(re, 'a', true);
testRE(re, 'b', false);
execRE(re, 'a', ['']);
re = /\wf(?<=oo\w)$/;
testRE(re, 'oof', true);
testRE(re, 'oob', false);
testRE(re, 'oaf', false);
testRE(re, 'aof', false);
execRE(re, 'oof', ['of']);
re = /(?<=\W).(?<=\w)/;
testRE(re, ' !a.', true);
testRE(re, ' !.', false);
testRE(re, ' !ba.', true);
execRE(re, ' !ba.', ['b']);
re = /..(?<=.(?<=o[^f])f)/;
testRE(re, '!oof ,', true);
testRE(re, '!of ,', false);
testRE(re, 'off ,', false);
execRE(re, '!oof ,', ['of']);
re = /^(?:a(?<=(.))|b|c)$/;
testRE(re, 'a', true);
testRE(re, 'b', true);
testRE(re, 'c', true);
testRE(re, 'd', false);
execRE(re, 'a', ['a', 'a']);
execRE(re, 'b', ['b', undefined]);
execRE(re, 'c', ['c', undefined]);
execRE(/b(?<=(b))$/, 'b', ['b', 'b']);
execRE(/^(?:(?<=(b))|a)b/, 'ab', ['ab', undefined]);
execRE(/^bd(?:(?<=(b)(?:(?<=(c))|d))|)/, 'bd', ['bd', 'b', undefined]);
// Test of Negative Look-Ahead.
re = /.(?<!x)/;
testRE(re, 'y', true);
testRE(re, 'x', false);
execRE(re, 'y', ['y']);
// Test mixed nested look-ahead with captures.
re = /(?<=(?<=(x))(y))$/;
testRE(re, 'xy', true);
testRE(re, 'xz', false);
execRE(re, 'xy', ['', 'x', 'y']);
re = /(?<!(?<!(x))(y))$/;
testRE(re, 'xy', true);
testRE(re, 'yy', false);
execRE(re, 'xy', ['', undefined, undefined]);
re = /(?<=(?<!(x))(y))$/;
testRE(re, 'yy', true);
testRE(re, 'xy', false);
execRE(re, 'yy', ['', undefined, 'y']);
re = /(?<!(?<=(x))(y))$/;
testRE(re, 'xz', true);
testRE(re, 'xy', false);
execRE(re, 'xz', ['', undefined, undefined]);
re = /(?<=(?<!(?<=(x))(y))(z))$/;
testRE(re, 'xaz', true);
testRE(re, 'ayz', true);
testRE(re, 'xyz', false);
testRE(re, 'a', false);
execRE(re, 'xaz', ['', undefined, undefined, 'z']);
execRE(re, 'ayz', ['', undefined, undefined, 'z']);
re = /(?<=(?<!(?<=(x))(y))(z))$/;
testRE(re, 'xaz', true);
testRE(re, 'ayz', true);
testRE(re, 'xyz', false);
testRE(re, 'a', false);
execRE(re, 'xaz', ['', undefined, undefined, 'z']);
execRE(re, 'ayz', ['', undefined, undefined, 'z']);
re = /(?<!(?<=(?<!(x))(y))(z))$/;
testRE(re, 'a', true);
testRE(re, 'xa', true);
testRE(re, 'xyz', true);
testRE(re, 'ayz', false);
execRE(re, 'a', ['', undefined, undefined, undefined]);
execRE(re, 'xa', ['', undefined, undefined, undefined]);
execRE(re, 'xyz', ['', undefined, undefined, undefined]);