diff options
Diffstat (limited to 'js/src/tests/ecma_7/Destructuring/rest-parameter-aray-iterator.js')
-rw-r--r-- | js/src/tests/ecma_7/Destructuring/rest-parameter-aray-iterator.js | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/js/src/tests/ecma_7/Destructuring/rest-parameter-aray-iterator.js b/js/src/tests/ecma_7/Destructuring/rest-parameter-aray-iterator.js new file mode 100644 index 000000000..bf9643fd7 --- /dev/null +++ b/js/src/tests/ecma_7/Destructuring/rest-parameter-aray-iterator.js @@ -0,0 +1,40 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Destructuring rest arrays call the array iterator. This behaviour is +// observable when Array.prototype[Symbol.iterator] is overridden. + +const oldArrayIterator = Array.prototype[Symbol.iterator]; +try { + let callCount = 0; + Array.prototype[Symbol.iterator] = function() { + callCount += 1; + return oldArrayIterator.call(this); + }; + + // Array iterator called exactly once. + function arrayIterCalledOnce(...[]) { } + assertEq(callCount, 0); + arrayIterCalledOnce(); + assertEq(callCount, 1); + + // Array iterator not called before rest parameter. + callCount = 0; + function arrayIterNotCalledBeforeRest(t = assertEq(callCount, 0), ...[]) { } + assertEq(callCount, 0); + arrayIterNotCalledBeforeRest(); + assertEq(callCount, 1); + + // Array iterator called when rest parameter is processed. + callCount = 0; + function arrayIterCalledWhenDestructuring(...[t = assertEq(callCount, 1)]) { } + assertEq(callCount, 0); + arrayIterCalledWhenDestructuring(); + assertEq(callCount, 1); +} finally { + Array.prototype[Symbol.iterator] = oldArrayIterator; +} + +if (typeof reportCompare === "function") + reportCompare(0, 0); |