michael@0: // Test that yield* can appear in a loop, and alongside yield. michael@0: michael@0: function* countdown(n) { michael@0: while (n > 0) { michael@0: yield n; michael@0: yield* countdown(--n); michael@0: } michael@0: return 34; michael@0: } michael@0: michael@0: function collect_results(iter) { michael@0: var ret = []; michael@0: var result; michael@0: do { michael@0: result = iter.next(); michael@0: ret.push(result); michael@0: } while (!result.done); michael@0: return ret; michael@0: } michael@0: michael@0: var expected = [ michael@0: // yield in countdown(3), n == 3 michael@0: {value: 3, done: false}, michael@0: // yield in yield* countdown(2), n == 2 michael@0: {value: 2, done: false}, michael@0: // yield in nested yield* countdown(1), n == 1 michael@0: {value: 1, done: false}, michael@0: // countdown(0) yields no values michael@0: // second go-through of countdown(2) loop, n == 1 michael@0: {value: 1, done: false}, michael@0: // second go-through of countdown(3) loop, n == 2 michael@0: {value: 2, done: false}, michael@0: // yield in yield* countdown(1), n == 1 michael@0: {value: 1, done: false}, michael@0: // third go-through of countdown(3) loop, n == 1 michael@0: {value: 1, done: false}, michael@0: // done michael@0: {value: 34, done: true} michael@0: ]; michael@0: michael@0: assertDeepEq(expected, collect_results(countdown(3))); michael@0: michael@0: if (typeof reportCompare == "function") michael@0: reportCompare(true, true);