1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/ecma_6/Generators/delegating-yield-6.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,56 @@ 1.4 +// Test that each yield* loop just checks "done", and "value" is only 1.5 +// fetched once at the end. 1.6 + 1.7 +var log = ""; 1.8 + 1.9 +function collect_results(iter) { 1.10 + var ret = []; 1.11 + var result; 1.12 + do { 1.13 + result = iter.next(); 1.14 + ret.push(result); 1.15 + } while (!result.done); 1.16 + return ret; 1.17 +} 1.18 + 1.19 +function Iter(val, count) { 1.20 + function next() { 1.21 + log += 'n'; 1.22 + return { 1.23 + get done() { log += "d"; return count-- == 0; }, 1.24 + get value() { log += "v"; return val; } 1.25 + } 1.26 + } 1.27 + 1.28 + function iterator() { 1.29 + log += 'i'; 1.30 + return this; 1.31 + } 1.32 + 1.33 + this.next = next; 1.34 + this[std_iterator] = iterator; 1.35 +} 1.36 + 1.37 +function* delegate(iter) { return yield* iter; } 1.38 + 1.39 +var inner = new Iter(42, 5); 1.40 +var outer = delegate(inner); 1.41 + 1.42 +// Five values, and one terminal value. 1.43 +outer.next(); 1.44 +outer.next(); 1.45 +outer.next(); 1.46 +outer.next(); 1.47 +outer.next(); 1.48 +outer.next(); 1.49 + 1.50 +assertEq(log, "indndndndndndv"); 1.51 + 1.52 +// Outer's dead, man. Outer's dead. 1.53 +assertDeepEq(outer.next(), {value: undefined, done: true}); 1.54 + 1.55 +// No more checking the iterator. 1.56 +assertEq(log, "indndndndndndv"); 1.57 + 1.58 +if (typeof reportCompare == "function") 1.59 + reportCompare(true, true);