From 7f53ea671cf24ef2dbc8dd65a461c2e7aec302ba Mon Sep 17 00:00:00 2001 From: Alexey Shvayka Date: Wed, 27 May 2020 12:32:52 +0300 Subject: [PATCH] Add for/of tests --- ...ator-close-non-throw-get-method-is-null.js | 50 +++++++++++++++++++ ...ator-close-non-throw-get-method-is-null.js | 47 +++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 test/language/statements/for-await-of/iterator-close-non-throw-get-method-is-null.js create mode 100644 test/language/statements/for-of/iterator-close-non-throw-get-method-is-null.js diff --git a/test/language/statements/for-await-of/iterator-close-non-throw-get-method-is-null.js b/test/language/statements/for-await-of/iterator-close-non-throw-get-method-is-null.js new file mode 100644 index 0000000000..bb60c757a1 --- /dev/null +++ b/test/language/statements/for-await-of/iterator-close-non-throw-get-method-is-null.js @@ -0,0 +1,50 @@ +// Copyright (C) 2020 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-asynciteratorclose +description: > + If iterator's "return" method is `null`, + received non-throw completion is forwarded to the runtime. +info: | + AsyncIteratorClose ( iteratorRecord, completion ) + + [...] + 4. Let innerResult be GetMethod(iterator, "return"). + 5. If innerResult.[[Type]] is normal, + a. Let return be innerResult.[[Value]]. + b. If return is undefined, return Completion(completion). + + GetMethod ( V, P ) + + [...] + 2. Let func be ? GetV(V, P). + 3. If func is either undefined or null, return undefined. +features: [Symbol.asyncIterator, async-iteration] +flags: [async] +---*/ + +var iterationCount = 0; +var returnGets = 0; + +var iterable = {}; +iterable[Symbol.asyncIterator] = function() { + return { + next: function() { + return {value: 1, done: false}; + }, + get return() { + returnGets += 1; + return null; + }, + }; +}; + +(async function() { + for await (var _ of iterable) { + iterationCount += 1; + break; + } + + assert.sameValue(iterationCount, 1); + assert.sameValue(returnGets, 1); +}()).then($DONE, $DONE); diff --git a/test/language/statements/for-of/iterator-close-non-throw-get-method-is-null.js b/test/language/statements/for-of/iterator-close-non-throw-get-method-is-null.js new file mode 100644 index 0000000000..420f4c5917 --- /dev/null +++ b/test/language/statements/for-of/iterator-close-non-throw-get-method-is-null.js @@ -0,0 +1,47 @@ +// Copyright (C) 2020 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorclose +description: > + If iterator's "return" method is `null`, + received non-throw completion is forwarded to the runtime. +info: | + IteratorClose ( iteratorRecord, completion ) + + [...] + 4. Let innerResult be GetMethod(iterator, "return"). + 5. If innerResult.[[Type]] is normal, + a. Let return be innerResult.[[Value]]. + b. If return is undefined, return Completion(completion). + + GetMethod ( V, P ) + + [...] + 2. Let func be ? GetV(V, P). + 3. If func is either undefined or null, return undefined. +features: [Symbol.iterator] +---*/ + +var iterationCount = 0; +var returnGets = 0; + +var iterable = {}; +iterable[Symbol.iterator] = function() { + return { + next: function() { + return {value: 1, done: false}; + }, + get return() { + returnGets += 1; + return null; + }, + }; +}; + +for (var _ of iterable) { + iterationCount += 1; + break; +} + +assert.sameValue(iterationCount, 1); +assert.sameValue(returnGets, 1);