assertEquals({ value: value, done: done}, result);
}
+function assertIteratorIsClosed(iter) {
+ assertIteratorResult(undefined, true, iter.next());
+ assertDoesNotThrow(function() { iter.next(); });
+}
+
+function assertThrownIteratorIsClosed(iter) {
+ // TODO(yusukesuzuki): Since status of a thrown generator is "executing",
+ // following tests are failed.
+ // https://code.google.com/p/v8/issues/detail?id=3096
+ // assertIteratorIsClosed(iter);
+}
+
function TestGeneratorResultPrototype() {
function* g() { yield 1; }
var iter = g();
function testNext(thunk) {
var iter = thunk();
for (var i = 0; i < expected_values_for_next.length; i++) {
- assertIteratorResult(expected_values_for_next[i],
- i == expected_values_for_next.length - 1,
- iter.next());
+ var v1 = expected_values_for_next[i];
+ var v2 = i == expected_values_for_next.length - 1;
+ // var v3 = iter.next();
+ assertIteratorResult(v1, v2, iter.next());
}
- assertThrows(function() { iter.next(); }, Error);
+ assertIteratorIsClosed(iter);
}
function testSend(thunk) {
var iter = thunk();
i == expected_values_for_send.length - 1,
iter.next(send_val));
}
- assertThrows(function() { iter.next(send_val); }, Error);
+ assertIteratorIsClosed(iter);
}
function testThrow(thunk) {
for (var i = 0; i < expected_values_for_next.length; i++) {
}
function Sentinel() {}
assertThrows(function () { iter.throw(new Sentinel); }, Sentinel);
- assertThrows(function () { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
}
"foo",
[2, "1foo3", 5, "4foo6", "foofoo"]);
+// Yield with no arguments yields undefined.
+TestGenerator(
+ function* g26() { return yield yield },
+ [undefined, undefined, undefined],
+ "foo",
+ [undefined, "foo", "foo"]);
+
+// A newline causes the parser to stop looking for an argument to yield.
+TestGenerator(
+ function* g27() {
+ yield
+ 3
+ return
+ },
+ [undefined, undefined],
+ "foo",
+ [undefined, undefined]);
+
+// TODO(wingo): We should use TestGenerator for these, except that
+// currently yield* will unconditionally propagate a throw() to the
+// delegate iterator, which fails for these iterators that don't have
+// throw(). See http://code.google.com/p/v8/issues/detail?id=3484.
+(function() {
+ function* g28() {
+ yield* [1, 2, 3];
+ }
+ var iter = g28();
+ assertIteratorResult(1, false, iter.next());
+ assertIteratorResult(2, false, iter.next());
+ assertIteratorResult(3, false, iter.next());
+ assertIteratorResult(undefined, true, iter.next());
+})();
+
+(function() {
+ function* g29() {
+ yield* "abc";
+ }
+ var iter = g29();
+ assertIteratorResult("a", false, iter.next());
+ assertIteratorResult("b", false, iter.next());
+ assertIteratorResult("c", false, iter.next());
+ assertIteratorResult(undefined, true, iter.next());
+})();
+
// Generator function instances.
TestGenerator(GeneratorFunction(),
[undefined],
function next() {
return results[i++];
}
- return { next: next }
+ var iter = { next: next };
+ var ret = {};
+ ret[Symbol.iterator] = function() { return iter; };
+ return ret;
}
function* yield_results(expected) {
return yield* results(expected);
}
- function collect_results(iter) {
+ function collect_results(iterable) {
+ var iter = iterable[Symbol.iterator]();
var ret = [];
var result;
do {
assertIteratorResult(1, false, iter.next());
assertIteratorResult(2, false, iter.next());
assertIteratorResult(3, false, iter.next());
- assertIteratorResult(undefined, true, iter.next());
- assertThrows(function() { iter.next(); }, Error);
+ assertIteratorIsClosed(iter);
}
Test1(instantiate(g));
function Test2(iter) {
assertThrows(function() { iter.throw(new Sentinel); }, Sentinel);
- assertThrows(function() { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
Test2(instantiate(g));
function Test3(iter) {
assertIteratorResult(1, false, iter.next());
assertThrows(function() { iter.throw(new Sentinel); }, Sentinel);
- assertThrows(function() { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
Test3(instantiate(g));
var exn = new Sentinel;
assertIteratorResult(exn, false, iter.throw(exn));
assertIteratorResult(3, false, iter.next());
- assertIteratorResult(undefined, true, iter.next());
- assertThrows(function() { iter.next(); }, Error);
+ assertIteratorIsClosed(iter);
}
Test4(instantiate(g));
assertIteratorResult(exn, false, iter.throw(exn));
assertIteratorResult(3, false, iter.next());
assertThrows(function() { iter.throw(new Sentinel); }, Sentinel);
- assertThrows(function() { iter.next(); }, Error);
-
+ assertThrownIteratorIsClosed(iter);
}
Test5(instantiate(g));
var exn = new Sentinel;
assertIteratorResult(exn, false, iter.throw(exn));
assertThrows(function() { iter.throw(new Sentinel); }, Sentinel);
- assertThrows(function() { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
Test6(instantiate(g));
assertIteratorResult(1, false, iter.next());
assertIteratorResult(2, false, iter.next());
assertIteratorResult(3, false, iter.next());
- assertIteratorResult(undefined, true, iter.next());
- assertThrows(function() { iter.next(); }, Error);
+ assertIteratorIsClosed(iter);
}
Test7(instantiate(g));
}
assertIteratorResult(2, false, iter.next());
assertIteratorResult(3, false, iter.next());
assertIteratorResult(4, false, iter.next());
- assertIteratorResult(undefined, true, iter.next());
- assertThrows(function() { iter.next(); }, Error);
+ assertIteratorIsClosed(iter);
}
Test1(instantiate(g));
function Test2(iter) {
assertThrows(function() { iter.throw(new Sentinel); }, Sentinel);
- assertThrows(function() { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
Test2(instantiate(g));
function Test3(iter) {
assertIteratorResult(1, false, iter.next());
assertThrows(function() { iter.throw(new Sentinel); }, Sentinel);
- assertThrows(function() { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
Test3(instantiate(g));
assertIteratorResult(2, false, iter.next());
assertIteratorResult(3, false, iter.throw(new Sentinel));
assertThrows(function() { iter.next(); }, Sentinel);
- assertThrows(function() { iter.next(); }, Error);
-
+ assertThrownIteratorIsClosed(iter);
}
Test4(instantiate(g));
assertIteratorResult(2, false, iter.next());
assertIteratorResult(3, false, iter.throw(new Sentinel));
assertThrows(function() { iter.throw(new Sentinel2); }, Sentinel2);
- assertThrows(function() { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
Test5(instantiate(g));
assertIteratorResult(2, false, iter.next());
assertIteratorResult(3, false, iter.next());
assertThrows(function() { iter.throw(new Sentinel); }, Sentinel);
- assertThrows(function() { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
Test6(instantiate(g));
assertIteratorResult(3, false, iter.next());
assertIteratorResult(4, false, iter.next());
assertThrows(function() { iter.throw(new Sentinel); }, Sentinel);
- assertThrows(function() { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
Test7(instantiate(g));
assertIteratorResult(2, false, iter.next());
assertIteratorResult(3, false, iter.next());
assertIteratorResult(4, false, iter.next());
- assertIteratorResult(undefined, true, iter.next());
- assertThrows(function() { iter.next(); }, Error);
-
+ assertIteratorIsClosed(iter);
}
Test8(instantiate(g));
}
assertIteratorResult(3, false, iter.next());
assertIteratorResult(4, false, iter.next());
assertIteratorResult(5, false, iter.next());
- assertIteratorResult(undefined, true, iter.next());
- assertThrows(function() { iter.next(); }, Error);
+ assertIteratorIsClosed(iter);
}
Test1(instantiate(g));
function Test2(iter) {
assertThrows(function() { iter.throw(new Sentinel); }, Sentinel);
- assertThrows(function() { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
Test2(instantiate(g));
assertIteratorResult(1, false, iter.next());
assertIteratorResult(4, false, iter.throw(new Sentinel));
assertThrows(function() { iter.next(); }, Sentinel);
- assertThrows(function() { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
Test3(instantiate(g));
assertIteratorResult(1, false, iter.next());
assertIteratorResult(4, false, iter.throw(new Sentinel));
assertThrows(function() { iter.throw(new Sentinel2); }, Sentinel2);
- assertThrows(function() { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
Test4(instantiate(g));
assertIteratorResult(3, false, iter.next());
assertIteratorResult(4, false, iter.next());
assertIteratorResult(5, false, iter.next());
- assertIteratorResult(undefined, true, iter.next());
- assertThrows(function() { iter.next(); }, Error);
-
+ assertIteratorIsClosed(iter);
}
Test5(instantiate(g));
assertIteratorResult(exn, false, iter.throw(exn));
assertIteratorResult(4, false, iter.throw(new Sentinel2));
assertThrows(function() { iter.next(); }, Sentinel2);
- assertThrows(function() { iter.next(); }, Error);
+ assertThrownIteratorIsClosed(iter);
}
Test6(instantiate(g));
assertIteratorResult(3, false, iter.next());
assertIteratorResult(4, false, iter.throw(new Sentinel2));
assertThrows(function() { iter.next(); }, Sentinel2);
- assertThrows(function() { iter.next(); }, Error);
-
+ assertThrownIteratorIsClosed(iter);
}
Test7(instantiate(g));