Index: test/mjsunit/harmony/iterator-close.js |
diff --git a/test/mjsunit/harmony/iterator-close.js b/test/mjsunit/harmony/iterator-close.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..21d7347a1bafb26fba1cfbaee950338b5fac1ecd |
--- /dev/null |
+++ b/test/mjsunit/harmony/iterator-close.js |
@@ -0,0 +1,226 @@ |
+// Copyright 2016 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+ |
+function* g() { yield 42; return 88 }; |
+ |
+ |
+// Return method is "undefined". |
+{ |
+ g.prototype.return = null; |
+ |
+ assertEquals(undefined, (() => { |
+ for (let x of g()) { break; } |
+ })()); |
+ |
+ assertEquals(undefined, (() => { |
+ for (x of g()) { break; } |
+ })()); |
+ |
+ assertThrowsEquals(() => { |
+ for (let x of g()) { throw 42; } |
+ }, 42); |
+ |
+ assertThrowsEquals(() => { |
+ for (x of g()) { throw 42; } |
+ }, 42); |
+ |
+ assertEquals(42, (() => { |
+ for (let 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 (let x of g()) { x; }')); |
+} |
+ |
+ |
+// Return method is not callable. |
+{ |
+ g.prototype.return = 666; |
+ |
+ assertThrows(() => { |
+ for (let x of g()) { break; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ for (x of g()) { break; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ for (let x of g()) { throw 666; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ for (x of g()) { throw 666; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ for (let 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 (let x of g()) { x; }')); |
+} |
+ |
+ |
+// Return method does not return an object. |
+{ |
+ g.prototype.return = () => 666; |
+ |
+ assertThrows(() => { |
+ for (let x of g()) { break; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ for (x of g()) { break; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ for (let x of g()) { throw 666; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ for (x of g()) { throw 666; } |
+ }, TypeError); |
+ |
+ assertThrows(() => { |
+ for (let 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 (x of g()) { x; }')); |
+} |
+ |
+ |
+// Return method returns an object. |
+{ |
+ let log = []; |
+ g.prototype.return = (...args) => { log.push(args); return {} }; |
+ |
+ log.length = 0; |
+ for (let x of g()) { break; } |
+ assertEquals([[]], log); |
+ |
+ log.length = 0; |
+ for (x of g()) { break; } |
+ assertEquals([[]], log); |
+ |
+ log.length = 0; |
+ assertThrowsEquals(() => { |
+ for (let x of g()) { throw 42; } |
+ }, 42); |
+ assertEquals([[]], log); |
+ |
+ log.length = 0; |
+ assertThrowsEquals(() => { |
+ for (x of g()) { throw 42; } |
+ }, 42); |
+ assertEquals([[]], log); |
+ |
+ log.length = 0; |
+ assertEquals(42, (() => { |
+ for (let x of g()) { return 42; } |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ log.length = 0; |
+ assertEquals(42, (() => { |
+ for (x of g()) { return 42; } |
+ })()); |
+ assertEquals([[]], log); |
+ |
+ log.length = 0; |
+ assertEquals(42, eval('for (let x of g()) { x; }')); |
+ assertEquals([], log); |
+ |
+ log.length = 0; |
+ assertEquals(42, eval('for (x of g()) { x; }')); |
+ assertEquals([], log); |
+} |
+ |
+ |
+// Return method throws. |
+{ |
+ let log = []; |
+ g.prototype.return = (...args) => { log.push(args); throw 23 }; |
+ |
+ log.length = 0; |
+ assertThrowsEquals(() => { |
+ for (let x of g()) { break; } |
+ }, 23); |
+ assertEquals([[]], log); |
+ |
+ log.length = 0; |
+ assertThrowsEquals(() => { |
+ for (x of g()) { break; } |
+ }, 23); |
+ assertEquals([[]], log); |
+ |
+ log.length = 0; |
+ assertThrowsEquals(() => { |
+ for (let x of g()) { throw 42; } |
+ }, 42); |
+ assertEquals([[]], log); |
+ |
+ log.length = 0; |
+ assertThrowsEquals(() => { |
+ for (x of g()) { throw 42; } |
+ }, 42); |
+ assertEquals([[]], log); |
+ |
+ log.length = 0; |
+ assertThrowsEquals(() => { |
+ for (let x of g()) { return 42; } |
+ }, 23); |
+ assertEquals([[]], log); |
+ |
+ log.length = 0; |
+ assertThrowsEquals(() => { |
+ for (x of g()) { return 42; } |
+ }, 23); |
+ assertEquals([[]], log); |
+ |
+ log.length = 0; |
+ assertEquals(42, eval('for (let x of g()) { x; }')); |
+ assertEquals([], log); |
+ |
+ log.length = 0; |
+ assertEquals(42, eval('for (x of g()) { x; }')); |
+ assertEquals([], log); |
+} |
+ |
+ |
+// Next method throws. |
+{ |
+ let log = []; |
+ g.prototype.next = (...args) => { log.push(1, args); throw 666; }; |
+ g.prototype.return = (...args) => { log.push(2, args); return {} }; |
+ |
+ log.length = 0; |
+ assertThrowsEquals(() => { |
+ for (let x of g()) {} |
+ }, 666); |
+ assertEquals([1, [], 2, []], log); |
+ |
+ log.length = 0; |
+ assertThrowsEquals(() => { |
+ for (x of g()) {} |
+ }, 666); |
+ assertEquals([1, [], 2, []], log); |
+} |
Dan Ehrenberg
2016/02/16 21:18:30
Can you write some tests to ensure that at least s
rossberg
2016/02/17 12:54:45
Done.
|