From c9e1c1c2b8835599e3fbab0116d3a4dfc8f7c11d Mon Sep 17 00:00:00 2001 From: Alexey Shvayka Date: Sat, 8 Feb 2020 22:00:11 +0200 Subject: [PATCH] Add named capture groups abrupt coercion tests --- .../result-coerce-groups-err.js | 38 +++++++++++ .../result-coerce-groups-prop-err.js | 67 +++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 test/built-ins/RegExp/prototype/Symbol.replace/result-coerce-groups-err.js create mode 100644 test/built-ins/RegExp/prototype/Symbol.replace/result-coerce-groups-prop-err.js diff --git a/test/built-ins/RegExp/prototype/Symbol.replace/result-coerce-groups-err.js b/test/built-ins/RegExp/prototype/Symbol.replace/result-coerce-groups-err.js new file mode 100644 index 0000000000..d9221d2ac9 --- /dev/null +++ b/test/built-ins/RegExp/prototype/Symbol.replace/result-coerce-groups-err.js @@ -0,0 +1,38 @@ +// Copyright (C) 2020 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-regexp.prototype-@@replace +description: > + Abrupt completion during coercion of "groups" + property of the value returned by RegExpExec. +info: | + RegExp.prototype [ @@replace ] ( string, replaceValue ) + + [...] + 14. For each result in results, do + [...] + j. Let namedCaptures be ? Get(result, "groups"). + k. If functionalReplace is true, then + [...] + l. Else, + i. If namedCaptures is not undefined, then + 1. Set namedCaptures to ? ToObject(namedCaptures). +features: [Symbol.replace, regexp-named-groups] +---*/ + +var r = /./; +var coercibleValue = { + length: 1, + 0: '', + index: 0, + groups: null, +}; + +r.exec = function() { + return coercibleValue; +}; + +assert.throws(TypeError, function() { + r[Symbol.replace]('bar', ''); +}); diff --git a/test/built-ins/RegExp/prototype/Symbol.replace/result-coerce-groups-prop-err.js b/test/built-ins/RegExp/prototype/Symbol.replace/result-coerce-groups-prop-err.js new file mode 100644 index 0000000000..d6770b5fc4 --- /dev/null +++ b/test/built-ins/RegExp/prototype/Symbol.replace/result-coerce-groups-prop-err.js @@ -0,0 +1,67 @@ +// Copyright (C) 2020 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-regexp.prototype-@@replace +description: > + Abrupt completion during coercion of value of "groups" object. +info: | + RegExp.prototype [ @@replace ] ( string, replaceValue ) + + [...] + 14. For each result in results, do + [...] + j. Let namedCaptures be ? Get(result, "groups"). + k. If functionalReplace is true, then + [...] + l. Else, + [...] + ii. Let replacement be ? GetSubstitution(matched, S, position, captures, namedCaptures, replaceValue). + + Runtime Semantics: GetSubstitution ( matched, str, position, captures, namedCaptures, replacement ) + + [...] + 11. Let result be the String value derived from replacement by copying code unit elements + from replacement to result while performing replacements as specified in Table 54. + These $ replacements are done left-to-right, and, once such a replacement is performed, + the new replacement text is not subject to further replacements. + 12. Return result. + + Table 54: Replacement Text Symbol Substitutions + + $< + + 1. If namedCaptures is undefined, the replacement text is the String "$<". + 2. Else, + a. Assert: Type(namedCaptures) is Object. + b. Scan until the next > U+003E (GREATER-THAN SIGN). + c. If none is found, the replacement text is the String "$<". + d. Else, + i. Let groupName be the enclosed substring. + ii. Let capture be ? Get(namedCaptures, groupName). + iii. If capture is undefined, replace the text through > with the empty String. + iv. Otherwise, replace the text through > with ? ToString(capture). +features: [Symbol.replace, regexp-named-groups] +---*/ + +var r = /./; +var coercibleValue = { + length: 1, + 0: '', + index: 0, + groups: { + foo: { + toString: function() { + throw new Test262Error(); + }, + }, + }, +}; + +r.exec = function() { + return coercibleValue; +}; + +assert.throws(Test262Error, function() { + r[Symbol.replace]('a', '$'); +});