mirror of
https://github.com/tc39/test262.git
synced 2025-11-03 13:14:28 +01:00
Utilize the test generation tool to increase coverage of destructuring assignment semantics. Previously, only destructuring assignment in the AssignmentExpression position was tested. With this change applied, the same tests will assert expected behavior for destructuring assignment in `for..of` statements, as well. A limited number of tests are applied to the `for..in` statement as well, but due to the iteration protocol observed by that statement, many destructuring tests are not relevant, and others cannot be automatically generated from this format.
65 lines
1.7 KiB
Plaintext
65 lines
1.7 KiB
Plaintext
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
|
// This code is governed by the BSD license found in the LICENSE file.
|
|
/*---
|
|
desc: >
|
|
IteratorClose is called when AssignmentRestEvaluation produces a "throw"
|
|
completion due to reference evaluation
|
|
info: |
|
|
ArrayAssignmentPattern :
|
|
[ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
|
|
|
|
[...]
|
|
7. If AssignmentRestElement is present, then
|
|
a. Let status be the result of performing
|
|
IteratorDestructuringAssignmentEvaluation of AssignmentRestElement
|
|
with iteratorRecord as the argument.
|
|
8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator,
|
|
status).
|
|
9. Return Completion(status).
|
|
|
|
7.4.6 IteratorClose( iterator, completion )
|
|
|
|
[...]
|
|
7. If completion.[[type]] is throw, return Completion(completion)
|
|
features: [Symbol.iterator]
|
|
template: error
|
|
es6id: 12.14.5.2
|
|
esid: sec-runtime-semantics-destructuringassignmentevaluation
|
|
---*/
|
|
|
|
//- setup
|
|
var nextCount = 0;
|
|
var returnCount = 0;
|
|
var x;
|
|
function ReturnError() {}
|
|
var iterable = {};
|
|
var iterator = {
|
|
next: function() {
|
|
nextCount += 1;
|
|
// Set an upper-bound to limit unnecessary iteration in non-conformant
|
|
// implementations
|
|
return { done: nextCount > 10 };
|
|
},
|
|
return: function() {
|
|
returnCount += 1;
|
|
|
|
// This value should be discarded.
|
|
throw new ReturnError();
|
|
}
|
|
};
|
|
var thrower = function() {
|
|
throw new Test262Error();
|
|
};
|
|
iterable[Symbol.iterator] = function() {
|
|
return iterator;
|
|
};
|
|
//- error
|
|
Test262Error
|
|
//- elems
|
|
[ x , ...{}[thrower()] ]
|
|
//- vals
|
|
iterable
|
|
//- teardown
|
|
assert.sameValue(nextCount, 1);
|
|
assert.sameValue(returnCount, 1);
|