Index: test/mjsunit/harmony/iterator-close.js |
diff --git a/test/mjsunit/harmony/iterator-close.js b/test/mjsunit/harmony/iterator-close.js |
index d3b7dc91684dad9a2ea0e2697b17c8dd6b2fb981..923f9d44586fc2a6dc27ca531c1e65ee57a4ee3f 100644 |
--- a/test/mjsunit/harmony/iterator-close.js |
+++ b/test/mjsunit/harmony/iterator-close.js |
@@ -4,6 +4,7 @@ |
// Flags: --harmony-iterator-close |
adamk
2016/03/07 20:28:05
There are a ton of new tests in here, but I don't
neis
2016/03/08 13:40:10
Yes, definitely. I added more.
|
+ |
function* g() { yield 42; return 88 }; |
@@ -11,33 +12,82 @@ function* g() { yield 42; return 88 }; |
{ |
g.prototype.return = null; |
+ |
+ assertEquals(undefined, (() => { |
+ for (var x of g()) { break; } |
+ })()); |
+ |
assertEquals(undefined, (() => { |
for (let x of g()) { break; } |
})()); |
assertEquals(undefined, (() => { |
+ for (const x of g()) { break; } |
+ })()); |
+ |
+ assertEquals(undefined, (() => { |
for (x of g()) { break; } |
})()); |
+ |
+ assertThrowsEquals(() => { |
+ for (var x of g()) { throw 42; } |
+ }, 42); |
+ |
assertThrowsEquals(() => { |
for (let x of g()) { throw 42; } |
}, 42); |
assertThrowsEquals(() => { |
+ for (const x of g()) { throw 42; } |
+ }, 42); |
+ |
+ assertThrowsEquals(() => { |
for (x of g()) { throw 42; } |
}, 42); |
+ |
+ assertEquals(42, (() => { |
+ for (var x of g()) { return 42; } |
+ })()); |
+ |
assertEquals(42, (() => { |
for (let x of g()) { return 42; } |
})()); |
assertEquals(42, (() => { |
+ for (const x of g()) { return 42; } |
+ })()); |
+ |
+ assertEquals(42, (() => { |
for (x of g()) { return 42; } |
})()); |
- assertEquals(42, eval('for (let x of g()) { x; }')); |
+ |
+ assertEquals(42, eval('for (var x of g()) { x; }')); |
assertEquals(42, eval('for (let x of g()) { x; }')); |
+ |
+ assertEquals(42, eval('for (const x of g()) { x; }')); |
+ |
+ assertEquals(42, eval('for (x of g()) { x; }')); |
+ |
+ |
+ assertEquals(42, (() => { |
+ var [x] = g(); return x; |
+ })()); |
+ |
+ assertEquals(42, (() => { |
+ let [x] = g(); return x; |
+ })()); |
+ |
+ assertEquals(42, (() => { |
+ const [x] = g(); return x; |
+ })()); |
+ |
+ assertEquals(42, (() => { |
+ [x] = g(); return x; |
+ })()); |
} |
@@ -45,33 +95,82 @@ function* g() { yield 42; return 88 }; |
{ |
g.prototype.return = 666; |
+ |
+ assertThrows(() => { |
+ for (var x of g()) { break; } |
+ }, TypeError); |
+ |
assertThrows(() => { |
for (let x of g()) { break; } |
}, TypeError); |
assertThrows(() => { |
+ for (const x of g()) { break; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
for (x of g()) { break; } |
}, TypeError); |
+ |
+ assertThrows(() => { |
+ for (var x of g()) { throw 666; } |
+ }, TypeError); |
+ |
assertThrows(() => { |
for (let x of g()) { throw 666; } |
}, TypeError); |
assertThrows(() => { |
+ for (const x of g()) { throw 666; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
for (x of g()) { throw 666; } |
}, TypeError); |
+ |
+ assertThrows(() => { |
+ for (var x of g()) { return 666; } |
+ }, TypeError); |
+ |
assertThrows(() => { |
for (let x of g()) { return 666; } |
}, TypeError); |
assertThrows(() => { |
+ for (const x of g()) { return 666; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
for (x of g()) { return 666; } |
}, TypeError); |
- assertEquals(42, eval('for (let x of g()) { x; }')); |
+ |
+ assertEquals(42, eval('for (var x of g()) { x; }')); |
assertEquals(42, eval('for (let x of g()) { x; }')); |
+ |
+ assertEquals(42, eval('for (const x of g()) { x; }')); |
+ |
+ assertEquals(42, eval('for (x of g()) { x; }')); |
+ |
+ |
+ assertThrows(() => { |
+ var [x] = g(); return x; |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ let [x] = g(); return x; |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ const [x] = g(); return x; |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ [x] = g(); return x; |
+ }, TypeError); |
} |
@@ -79,35 +178,85 @@ function* g() { yield 42; return 88 }; |
{ |
g.prototype.return = () => 666; |
+ |
+ assertThrows(() => { |
+ for (var x of g()) { break; } |
+ }, TypeError); |
+ |
assertThrows(() => { |
for (let x of g()) { break; } |
}, TypeError); |
assertThrows(() => { |
+ for (const x of g()) { break; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
for (x of g()) { break; } |
}, TypeError); |
+ |
// Throw from the body of a for loop 'wins' vs throw |
// originating from a bad 'return' value. |
+ |
+ assertThrowsEquals(() => { |
+ for (var x of g()) { throw 666; } |
+ }, 666); |
+ |
assertThrowsEquals(() => { |
for (let x of g()) { throw 666; } |
}, 666); |
assertThrowsEquals(() => { |
+ for (const x of g()) { throw 666; } |
+ }, 666); |
+ |
+ assertThrowsEquals(() => { |
for (x of g()) { throw 666; } |
}, 666); |
+ |
+ assertThrows(() => { |
+ for (var x of g()) { return 666; } |
+ }, TypeError); |
+ |
assertThrows(() => { |
for (let x of g()) { return 666; } |
}, TypeError); |
assertThrows(() => { |
+ for (const x of g()) { return 666; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
for (x of g()) { return 666; } |
}, TypeError); |
+ |
+ assertEquals(42, eval('for (var x of g()) { x; }')); |
+ |
assertEquals(42, eval('for (let x of g()) { x; }')); |
+ assertEquals(42, eval('for (const x of g()) { x; }')); |
+ |
assertEquals(42, eval('for (x of g()) { x; }')); |
+ |
+ |
+ assertThrows(() => { |
+ var [x] = g(); return x; |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ let [x] = g(); return x; |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ const [x] = g(); return x; |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ [x] = g(); return x; |
+ }, TypeError); |
} |
@@ -116,14 +265,30 @@ function* g() { yield 42; return 88 }; |
let log = []; |
g.prototype.return = (...args) => { log.push(args); return {} }; |
+ |
+ log = []; |
+ for (var x of g()) { break; } |
+ assertEquals([[]], log); |
+ |
log = []; |
for (let x of g()) { break; } |
assertEquals([[]], log); |
log = []; |
+ for (const x of g()) { break; } |
+ assertEquals([[]], log); |
+ |
+ log = []; |
for (x of g()) { break; } |
assertEquals([[]], log); |
+ |
+ log = []; |
+ assertThrowsEquals(() => { |
+ for (var x of g()) { throw 42; } |
+ }, 42); |
+ assertEquals([[]], log); |
+ |
log = []; |
assertThrowsEquals(() => { |
for (let x of g()) { throw 42; } |
@@ -132,10 +297,23 @@ function* g() { yield 42; return 88 }; |
log = []; |
assertThrowsEquals(() => { |
+ for (const x of g()) { throw 42; } |
+ }, 42); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertThrowsEquals(() => { |
for (x of g()) { throw 42; } |
}, 42); |
assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ for (var x of g()) { return 42; } |
+ })()); |
+ assertEquals([[]], log); |
+ |
log = []; |
assertEquals(42, (() => { |
for (let x of g()) { return 42; } |
@@ -144,24 +322,291 @@ function* g() { yield 42; return 88 }; |
log = []; |
assertEquals(42, (() => { |
+ for (const x of g()) { return 42; } |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
for (x of g()) { return 42; } |
})()); |
assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals(42, eval('for (var x of g()) { x; }')); |
+ assertEquals([], log); |
+ |
log = []; |
assertEquals(42, eval('for (let x of g()) { x; }')); |
assertEquals([], log); |
log = []; |
+ assertEquals(42, eval('for (const x of g()) { x; }')); |
+ assertEquals([], log); |
+ |
+ log = []; |
assertEquals(42, eval('for (x of g()) { x; }')); |
assertEquals([], log); |
+ |
// Even if doing the assignment throws, still call return |
+ log = []; |
x = { set attr(_) { throw 1234; } }; |
assertThrowsEquals(() => { |
for (x.attr of g()) { throw 456; } |
}, 1234); |
assertEquals([[]], log); |
+ |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ var [x] = g(); return x; |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ let [x] = g(); return x; |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ const [x] = g(); return x; |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ [x] = g(); return x; |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ var [x,] = g(); return x; |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ let [x,] = g(); return x; |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ const [x,] = g(); return x; |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ [x,] = g(); return x; |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ var [x,,] = g(); return x; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ let [x,,] = g(); return x; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ const [x,,] = g(); return x; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals(42, (() => { |
+ [x,,] = g(); return x; |
+ })()); |
+ assertEquals([], log); |
+ |
+ |
+ log = []; |
+ assertEquals([42, undefined], (() => { |
+ var [x, y] = g(); return [x, y]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42, undefined], (() => { |
+ let [x, y] = g(); return [x, y]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42, undefined], (() => { |
+ const [x, y] = g(); return [x, y]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42, undefined], (() => { |
+ [x, y] = g(); return [x, y]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ |
+ log = []; |
+ assertEquals([42], (() => { |
+ var [...x] = g(); return x; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42], (() => { |
+ let [...x] = g(); return x; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42], (() => { |
+ const [...x] = g(); return x; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42], (() => { |
+ [...x] = g(); return x; |
+ })()); |
+ assertEquals([], log); |
+ |
+ |
+ log = []; |
+ assertEquals([42, []], (() => { |
+ var [x, ...y] = g(); return [x, y]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42, []], (() => { |
+ let [x, ...y] = g(); return [x, y]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42, []], (() => { |
+ const [x, ...y] = g(); return [x, y]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42, []], (() => { |
+ [x, ...y] = g(); return [x, y]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ |
+ log = []; |
+ assertEquals([], (() => { |
+ var [] = g(); return []; |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals([], (() => { |
+ let [] = g(); return []; |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals([], (() => { |
+ const [] = g(); return []; |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals([], (() => { |
+ [] = g(); return []; |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ |
+ log = []; |
+ assertEquals([], (() => { |
+ var [...[]] = g(); return []; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([], (() => { |
+ let [...[]] = g(); return []; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([], (() => { |
+ const [...[]] = g(); return []; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([], (() => { |
+ [...[]] = g(); return []; |
+ })()); |
+ assertEquals([], log); |
+ |
+ |
+ log = []; |
+ assertEquals([42], (() => { |
+ var [...[x]] = g(); return [x]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42], (() => { |
+ let [...[x]] = g(); return [x]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42], (() => { |
+ const [...[x]] = g(); return [x]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42], (() => { |
+ [...[x]] = g(); return [x]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ |
+ log = []; |
+ assertEquals([42, undefined], (() => { |
+ var [...[x, y]] = g(); return [x, y]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42, undefined], (() => { |
+ let [...[x, y]] = g(); return [x, y]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42, undefined], (() => { |
+ const [...[x, y]] = g(); return [x, y]; |
+ })()); |
+ assertEquals([], log); |
+ |
+ log = []; |
+ assertEquals([42, undefined], (() => { |
+ [...[x, y]] = g(); return [x, y]; |
+ })()); |
+ assertEquals([], log); |
} |
@@ -170,6 +615,13 @@ function* g() { yield 42; return 88 }; |
let log = []; |
g.prototype.return = (...args) => { log.push(args); throw 23 }; |
+ |
+ log = []; |
+ assertThrowsEquals(() => { |
+ for (var x of g()) { break; } |
+ }, 23); |
+ assertEquals([[]], log); |
+ |
log = []; |
assertThrowsEquals(() => { |
for (let x of g()) { break; } |
@@ -178,10 +630,23 @@ function* g() { yield 42; return 88 }; |
log = []; |
assertThrowsEquals(() => { |
+ for (const x of g()) { break; } |
+ }, 23); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertThrowsEquals(() => { |
for (x of g()) { break; } |
}, 23); |
assertEquals([[]], log); |
+ |
+ log = []; |
+ assertThrowsEquals(() => { |
+ for (var x of g()) { throw 42; } |
+ }, 42); |
+ assertEquals([[]], log); |
+ |
log = []; |
assertThrowsEquals(() => { |
for (let x of g()) { throw 42; } |
@@ -190,10 +655,23 @@ function* g() { yield 42; return 88 }; |
log = []; |
assertThrowsEquals(() => { |
+ for (const x of g()) { throw 42; } |
+ }, 42); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertThrowsEquals(() => { |
for (x of g()) { throw 42; } |
}, 42); |
assertEquals([[]], log); |
+ |
+ log = []; |
+ assertThrowsEquals(() => { |
+ for (var x of g()) { return 42; } |
+ }, 23); |
+ assertEquals([[]], log); |
+ |
log = []; |
assertThrowsEquals(() => { |
for (let x of g()) { return 42; } |
@@ -202,17 +680,56 @@ function* g() { yield 42; return 88 }; |
log = []; |
assertThrowsEquals(() => { |
+ for (const x of g()) { return 42; } |
+ }, 23); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertThrowsEquals(() => { |
for (x of g()) { return 42; } |
}, 23); |
assertEquals([[]], log); |
+ |
+ log = []; |
+ assertEquals(42, eval('for (var x of g()) { x; }')); |
+ assertEquals([], log); |
+ |
log = []; |
assertEquals(42, eval('for (let x of g()) { x; }')); |
assertEquals([], log); |
log = []; |
+ assertEquals(42, eval('for (const x of g()) { x; }')); |
+ assertEquals([], log); |
+ |
+ log = []; |
assertEquals(42, eval('for (x of g()) { x; }')); |
assertEquals([], log); |
+ |
+ log = []; |
+ assertThrowsEquals(() => { |
+ var [x] = g(); return x; |
+ }, 23); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertThrowsEquals(() => { |
+ let [x] = g(); return x; |
+ }, 23); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertThrowsEquals(() => { |
+ const [x] = g(); return x; |
+ }, 23); |
+ assertEquals([[]], log); |
+ |
+ log = []; |
+ assertThrowsEquals(x => { |
+ [x] = g(); return x; |
+ }, 23); |
+ assertEquals([[]], log); |
} |
@@ -221,11 +738,20 @@ function* g() { yield 42; return 88 }; |
g.prototype.next = () => { throw 666; }; |
g.prototype.return = () => { assertUnreachable() }; |
+ |
+ assertThrowsEquals(() => { |
+ for (var x of g()) {} |
+ }, 666); |
+ |
assertThrowsEquals(() => { |
for (let x of g()) {} |
}, 666); |
assertThrowsEquals(() => { |
+ for (const x of g()) {} |
+ }, 666); |
+ |
+ assertThrowsEquals(() => { |
for (x of g()) {} |
}, 666); |
} |