Files
jerryscript/tests/jerry/es.next/for-await-of-iterator-close.js
T
2020-07-03 11:04:27 +02:00

650 lines
9.8 KiB
JavaScript

// Copyright JS Foundation and other contributors, http://js.foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
var successCount = 0;
// Test 1
var asyncIter1 = {
[Symbol.asyncIterator]() {
var idx = 0;
return {
next() {
assert(++idx === 1)
return Promise.resolve({ value: "Val", done: false })
}
/* No return() function */
}
}
}
async function f1() {
for await (var v of asyncIter1) {
assert(v === "Val")
break
}
successCount++
exit:
for await (var v of asyncIter1) {
for await (var v of asyncIter1) {
assert(v === "Val")
break exit
}
assert(false)
}
successCount++
try {
for await (var v of asyncIter1) {
assert(v === "Val")
throw 3.75
}
assert(false)
} catch (e) {
assert(e === 3.75)
successCount++
}
try {
for await (var v of asyncIter1) {
assert(v === "Val")
return {}
}
assert(false)
} finally {
successCount++
}
assert(false)
}
f1()
// Test 2
var o2 = {}
var returnCount2 = 0
var asyncIter2 = {
[Symbol.asyncIterator]() {
var idx = 0;
return {
next() {
assert(++idx === 1)
return Promise.resolve({ value: o2, done: false })
},
return(...v) {
assert(v.length === 0)
returnCount2++
return Promise.resolve({})
}
}
}
}
async function f2() {
for await (var v of asyncIter2) {
assert(v === o2)
break
}
successCount++
exit:
for await (var v of asyncIter2) {
for await (var v of asyncIter2) {
assert(v === o2)
break exit
}
assert(false)
}
successCount++
try {
for await (var v of asyncIter2) {
assert(v === o2)
throw o2
}
assert(false)
} catch (e) {
assert(e === o2)
successCount++
}
try {
for await (var v of asyncIter2) {
assert(v === o2)
return "Ret"
}
assert(false)
} finally {
successCount++
}
assert(false)
print("OK")
}
f2()
// Test 3
var asyncIter3 = {
[Symbol.asyncIterator]() {
var idx = 0;
return {
next() {
assert(++idx === 1)
return Promise.resolve({ value: -4.5, done: false })
},
return() {
throw "Error"
}
}
}
}
async function *f3() {
try {
for await (var v of asyncIter3) {
assert(v === -4.5)
break
}
assert(false)
} catch (e) {
assert(e === "Error")
successCount++
}
try {
for await (var v of asyncIter3) {
assert(v === -4.5)
return
}
assert(false)
} catch (e) {
assert(e === "Error")
successCount++
}
try {
for await (var v of asyncIter3) {
assert(v === -4.5)
throw "Exit"
}
assert(false)
} catch (e) {
assert(e === "Exit")
successCount++
}
}
f3().next()
// Test 4
var o4 = {}
var asyncIter4 = {
[Symbol.asyncIterator]() {
var idx = 0;
return {
next() {
assert(++idx === 1)
return Promise.resolve({ value: -4.5, done: false })
},
get return() {
throw o4
}
}
}
}
async function *f4() {
try {
for await (var v of asyncIter4) {
assert(v === -4.5)
break
}
assert(false)
} catch (e) {
assert(e === o4)
successCount++
}
try {
for await (var v of asyncIter4) {
assert(v === -4.5)
return
}
assert(false)
} catch (e) {
assert(e === o4)
successCount++
}
try {
for await (var v of asyncIter4) {
assert(v === -4.5)
throw 9.25
}
assert(false)
} catch (e) {
assert(e === 9.25)
successCount++
}
}
f4().next()
// Test 5
var asyncIter5 = {
[Symbol.asyncIterator]() {
var idx = 0;
return {
next() {
assert(++idx === 1)
return Promise.resolve({ value: -4.5, done: false })
},
get return() {
return "Not callable"
}
}
}
}
async function f5() {
try {
for await (var v of asyncIter5) {
assert(v === -4.5)
break
}
assert(false)
} catch (e) {
assert(e instanceof TypeError)
successCount++
}
try {
for await (var v of asyncIter5) {
assert(v === -4.5)
return
}
assert(false)
} catch (e) {
assert(e instanceof TypeError)
successCount++
}
var o = {}
try {
for await (var v of asyncIter5) {
assert(v === -4.5)
throw o
}
assert(false)
} catch (e) {
assert(e === o)
successCount++
}
}
f5()
// Test 6
var asyncIter6 = {
[Symbol.asyncIterator]() {
var idx = 0;
return {
next() {
assert(++idx === 1)
return Promise.resolve({ value: -4.5, done: false })
},
return() {
return Promise.resolve(4.5)
}
}
}
}
async function f6() {
try {
for await (var v of asyncIter6) {
assert(v === -4.5)
break
}
assert(false)
} catch (e) {
assert(e instanceof TypeError)
successCount++
}
try {
for await (var v of asyncIter6) {
assert(v === -4.5)
return
}
assert(false)
} catch (e) {
assert(e instanceof TypeError)
successCount++
}
try {
for await (var v of asyncIter6) {
assert(v === -4.5)
throw true
}
assert(false)
} catch (e) {
assert(e === true)
successCount++
}
}
f6()
// Test 7
var asyncIter7 = {
[Symbol.asyncIterator]() {
var idx = 0;
return {
next() {
assert(++idx === 1)
return Promise.resolve({ value: -4.5, done: false })
},
return() {
return Promise.reject("Rejected")
}
}
}
}
async function f7() {
try {
for await (var v of asyncIter7) {
assert(v === -4.5)
break
}
assert(false)
} catch (e) {
assert(e === "Rejected")
successCount++
}
try {
for await (var v of asyncIter7) {
assert(v === -4.5)
return
}
assert(false)
} catch (e) {
assert(e === "Rejected")
successCount++
}
try {
for await (var v of asyncIter7) {
assert(v === -4.5)
throw true
}
assert(false)
} catch (e) {
assert(e === true)
successCount++
}
}
f7()
// Test 8
var asyncIter8 = {
[Symbol.asyncIterator]() {
var idx = 0;
return {
next() {
assert(++idx === 1)
return Promise.resolve({ value: -4.5, done: false })
},
return() {
return {}
}
}
}
}
async function f8() {
for await (var v of asyncIter8) {
assert(v === -4.5)
break
}
successCount++
try {
for await (var v of asyncIter8) {
assert(v === -4.5)
throw null
}
assert(false)
} catch (e) {
assert(e === null)
successCount++
}
try {
for await (var v of asyncIter8) {
assert(v === -4.5)
return
}
assert(false)
} finally {
successCount++
}
}
f8()
// Test 9
var asyncIter9 = {
[Symbol.asyncIterator]() {
var idx = 0;
return {
next() {
assert(++idx === 1)
return Promise.resolve({ value: -4.5, done: false })
},
return() {
throw "Except"
}
}
}
}
async function f9() {
try {
for await (var v of asyncIter9) {
assert(v === -4.5)
break
}
assert(false)
} catch (e) {
assert(e === "Except")
successCount++
}
try {
for await (var v of asyncIter9) {
assert(v === -4.5)
throw 7.5
}
assert(false)
} catch (e) {
assert(e === 7.5)
successCount++
}
try {
for await (var v of asyncIter9) {
assert(v === -4.5)
for await (var v of asyncIter9) {
assert(v === -4.5)
for await (var v of asyncIter9) {
assert(v === -4.5)
throw "Leave"
}
assert(false)
}
assert(false)
}
assert(false)
} catch (e) {
assert(e === "Leave")
successCount++
}
try {
for await (var v of asyncIter9) {
assert(v === -4.5)
return
}
assert(false)
} catch (e) {
assert(e === "Except")
successCount++
}
}
f9()
// Test 10
var asyncIter10 = {
[Symbol.asyncIterator]() {
var idx = 0;
return {
next() {
throw "NoNext"
},
return() {
assert(false)
},
throw() {
assert(false)
}
}
}
}
async function f10() {
try {
try {
for await (var v of asyncIter10) {
assert(false)
}
assert(false)
} finally {
successCount++
}
} catch (e) {
assert(e === "NoNext")
successCount++
}
}
f10()
// Test 11
var asyncIter11 = {
[Symbol.asyncIterator]() {
var idx = 0;
return {
next() {
if (++idx < 3)
return Promise.resolve({ value: -4.5, done: false })
throw "NoNext"
},
return() {
assert(false)
},
throw() {
assert(false)
}
}
}
}
async function f11() {
try {
try {
for await (var v of asyncIter11) {
assert(v === -4.5)
}
assert(false)
} finally {
successCount++
}
} catch (e) {
assert(e === "NoNext")
successCount++
}
}
f11()
// Test 12
var o12 = {}
async function *gen12()
{
try {
yield 9.5
assert(false)
} finally {
successCount++
}
assert(false)
}
async function f12()
{
for await (var v of gen12())
{
assert(v === 9.5)
break;
}
successCount++
}
f12()
// END
function __checkAsync() {
assert(returnCount2 === 5)
assert(successCount === 36)
}