Skip to content

Commit

Permalink
Fleshed out tests for String.p.matchAll, RegExp.p[@@matchall], and %R…
Browse files Browse the repository at this point in the history
…egExpStringIteratorPrototype%

Tests were updated and assuming tc39/proposal-string-matchall#33 will be merged.
  • Loading branch information
peterwmwong committed Mar 18, 2018
1 parent 879ecf3 commit 6a87be1
Show file tree
Hide file tree
Showing 62 changed files with 1,815 additions and 215 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright (C) 2018 Peter Wong. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: pending
description: |
Throws TypeError when internally created RegExp's lastIndex is not 0
info: |
RegExp.prototype [ @@matchAll ] ( string )
[...]
3. Return ? MatchAllIterator(R, string).
MatchAllIterator ( R, O )
[...]
2. If ? IsRegExp(R) is true, then
[...]
3. Else,
a. Let matcher be RegExpCreate(R, "g").
b. If ? IsRegExp(matcher) is not true, throw a TypeError exception.
[...]
3. If Get(matcher, "lastIndex") is not 0, throw a TypeError exception.
features: [Symbol.match, Symbol.matchAll]
---*/

const originalMatch = RegExp.prototype[Symbol.match];
Object.defineProperty(RegExp.prototype, Symbol.match, {
get() {
this.lastIndex = 1;
return true;
}
});

try {
assert.throws(TypeError, () => {
RegExp.prototype[Symbol.matchAll].call({}, '');
});
} finally {
Object.defineProperty(RegExp.prototype, Symbol.match, {
value: originalMatch
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Copyright (C) 2018 Peter Wong. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: pending
description: Throws TypeError when internally created RegExp's @@match is false
info: |
RegExp.prototype [ @@matchAll ] ( string )
[...]
3. Return ? MatchAllIterator(R, string).
MatchAllIterator ( R, O )
[...]
2. If ? IsRegExp(R) is true, then
[...]
3. Else,
a. Let matcher be RegExpCreate(R, "g").
b. If ? IsRegExp(matcher) is not true, throw a TypeError exception.
features: [Symbol.match, Symbol.matchAll]
---*/

const originalMatch = RegExp.prototype[Symbol.match];
Object.defineProperty(RegExp.prototype, Symbol.match, {
get() {
return false;
}
});

try {
assert.throws(TypeError, () => {
RegExp.prototype[Symbol.matchAll].call({}, '');
});
} finally {
Object.defineProperty(RegExp.prototype, Symbol.match, {
value: originalMatch
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Copyright (C) 2018 Peter Wong. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: pending
description: Re-throw errors from during retrieval of @@match property
info: |
RegExp.prototype [ @@matchAll ] ( string )
[...]
3. Return ? MatchAllIterator(R, string).
MatchAllIterator ( R, O )
[...]
2. If ? IsRegExp(R) is true, then
[...]
3. Else,
a. Let matcher be RegExpCreate(R, "g").
b. If ? IsRegExp(matcher) is not true, throw a TypeError exception.
features: [Symbol.match, Symbol.matchAll]
---*/

const originalMatch = RegExp.prototype[Symbol.match];
Object.defineProperty(RegExp.prototype, Symbol.match, {
get() {
throw new Test262Error();
}
});

try {
assert.throws(Test262Error, () => {
RegExp.prototype[Symbol.matchAll].call({}, '');
});
} finally {
Object.defineProperty(RegExp.prototype, Symbol.match, {
value: originalMatch
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Copyright (C) 2018 Peter Wong. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: pending
description: Re-throw errors from regexp's @@match getter
info: |
RegExp.prototype [ @@matchAll ] ( string )
[...]
3. Return ? MatchAllIterator(R, string).
MatchAllIterator ( R, O )
[...]
2. If ? IsRegExp(R) is true, then
[...]
features: [Symbol.match, Symbol.matchAll]
---*/

const obj = {
get [Symbol.match]() {
throw new Test262Error();
}
};

assert.throws(Test262Error, () => {
RegExp.prototype[Symbol.matchAll].call(obj, '');
});
17 changes: 11 additions & 6 deletions test/built-ins/RegExp/prototype/Symbol.matchAll/length.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
// Copyright (C) 2018 Jordan Harband. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: pending
description: RegExp.prototype[Symbol.matchAll] `length` property
info: |
ES6 Section 17:
Every built-in Function object, including constructors, has a length
property whose value is an integer. Unless otherwise specified, this value
is equal to the largest number of named arguments shown in the subclause
headings for the function description, including optional parameters.
17 ECMAScript Standard Built-in Objects:
[...]
Unless otherwise specified, the length property of a built-in Function
Every built-in function object, including constructors, has a length
property whose value is an integer. Unless otherwise specified, this
value is equal to the largest number of named arguments shown in the
subclause headings for the function description. Optional parameters
(which are indicated with brackets: [ ]) or rest parameters (which
are shown using the form «...name») are not included in the default
argument count.
Unless otherwise specified, the length property of a built-in function
object has the attributes { [[Writable]]: false, [[Enumerable]]: false,
[[Configurable]]: true }.
includes: [propertyHelper.js]
Expand Down
11 changes: 8 additions & 3 deletions test/built-ins/RegExp/prototype/Symbol.matchAll/name.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
// Copyright (C) 2018 Jordan Harband. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: pending
description: RegExp.prototype[Symbol.matchAll] `name` property
info: |
The value of the name property of this function is "[Symbol.matchAll]".
17 ECMAScript Standard Built-in Objects:
ES6 Section 17:
[...]
Every built-in function object, including constructors, that is not
identified as an anonymous function has a name property whose value
is a String.
[...]
Unless otherwise specified, the name property of a built-in Function
Unless otherwise specified, the name property of a built-in function
object, if it exists, has the attributes { [[Writable]]: false,
[[Enumerable]]: false, [[Configurable]]: true }.
includes: [propertyHelper.js]
Expand Down
7 changes: 5 additions & 2 deletions test/built-ins/RegExp/prototype/Symbol.matchAll/prop-desc.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
// Copyright (C) 2018 Jordan Harband. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: pending
description: RegExp.prototype[Symbol.matchAll] property descriptor
info: |
ES6 Section 17
17 ECMAScript Standard Built-in Objects:
[...]
Every other data property described in clauses 18 through 26 and in Annex
B.2 has the attributes { [[Writable]]: true, [[Enumerable]]: false,
Expand All @@ -14,6 +16,7 @@ features: [Symbol.matchAll]
---*/

assert.sameValue(typeof RegExp.prototype[Symbol.matchAll], 'function');

verifyNotEnumerable(RegExp.prototype, Symbol.matchAll);
verifyWritable(RegExp.prototype, Symbol.matchAll);
verifyConfigurable(RegExp.prototype, Symbol.matchAll);
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// Copyright (C) 2018 Peter Wong. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: pending
description: Re-throw errors from creating internal RegExp
info: |
RegExp.prototype [ @@matchAll ] ( string )
[...]
3. Return ? MatchAllIterator(R, string).
MatchAllIterator ( R, O )
[...]
2. If ? IsRegExp(R) is true, then
[...]
3. Else,
a. Let R be RegExpCreate(R, "g").
features: [Symbol.matchAll]
---*/

const obj = {
toString() {
throw new Test262Error();
}
};

assert.throws(Test262Error, function() {
RegExp.prototype[Symbol.matchAll].call(obj, '');
});

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright (C) 2018 Peter Wong. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: pending
description: |
Re-throw errors from RegExp's constructor getter
info: |
RegExp.prototype [ @@matchAll ] ( string )
[...]
3. Return ? MatchAllIterator(R, string).
MatchAllIterator ( R, O )
[...]
2. If ? IsRegExp(R) is true, then
a. Let C be ? SpeciesConstructor(R, RegExp).
SpeciesConstructor ( O, defaultConstructor )
[...]
2. Let C be ? Get(O, "constructor").
features: [Symbol.matchAll]
---*/

const regexp = /./;
Object.defineProperty(regexp, 'constructor', {
get(){
throw new Test262Error();
}
});

assert.throws(Test262Error, () => {
regexp[Symbol.matchAll]('');
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (C) 2018 Peter Wong. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: pending
description: Re-throw errors from during retrieval of @@species property
info: |
RegExp.prototype [ @@matchAll ] ( string )
[...]
3. Return ? MatchAllIterator(R, string).
MatchAllIterator ( R, O )
[...]
2. If ? IsRegExp(R) is true, then
a. Let C be ? SpeciesConstructor(R, RegExp).
SpeciesConstructor ( O, defaultConstructor )
[...]
2. Let C be ? Get(O, "constructor").
features: [Symbol.matchAll, Symbol.species]
---*/

const regexp = /./;
regexp.constructor = {
get [Symbol.species]() {
throw new Test262Error();
}
};

assert.throws(Test262Error, () => {
regexp[Symbol.matchAll]('');
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Copyright (C) 2018 Peter Wong. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: pending
description: Throws TypeError if `constructor` property is not an object
info: |
RegExp.prototype [ @@matchAll ] ( string )
[...]
3. Return ? MatchAllIterator(R, string).
MatchAllIterator ( R, O )
[...]
2. If ? IsRegExp(R) is true, then
a. Let C be ? SpeciesConstructor(R, RegExp).
SpeciesConstructor ( O, defaultConstructor )
[...]
2. Let C be ? Get(O, "constructor").
3. If C is undefined, return defaultConstructor.
4. If Type(C) is not Object, throw a TypeError exception.
features: [Symbol.matchAll]
---*/

const regexp = /./;

function callMatchAll() { regexp[Symbol.matchAll](''); }

regexp.constructor = null;
assert.throws(TypeError, callMatchAll, "`constructor` value is null");

regexp.constructor = true;
assert.throws(TypeError, callMatchAll, "`constructor` value is Boolean");

regexp.constructor = "";
assert.throws(TypeError, callMatchAll, "`constructor` value is String");

regexp.constructor = Symbol();
assert.throws(TypeError, callMatchAll, "`constructor` value is Symbol");

regexp.constructor = 1;
assert.throws(TypeError, callMatchAll, "`constructor` value is Number");
Loading

0 comments on commit 6a87be1

Please sign in to comment.