package jetbrains.mps.closures.test; /*Generated by MPS */ import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import java.util.List; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.Iterator; import jetbrains.mps.baseLanguage.closures.runtime.YieldingIterator; import java.util.Arrays; import java.util.ArrayList; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.IListSequence; import jetbrains.mps.internal.collections.runtime.ISequence; import jetbrains.mps.internal.collections.runtime.ISelector; import junit.framework.Assert; import jetbrains.mps.internal.collections.runtime.ISequenceClosure; import jetbrains.mps.internal.collections.runtime.IterableUtils; import java.util.NoSuchElementException; import jetbrains.mps.baseLanguage.closures.runtime.DelayedException; public class YieldClosures_Test extends ClosuresBase_Test { public void test_ifStatement() throws Exception { this.assertResultsEqual(new _FunctionTypes._void_P1_E0<List<Integer>>() { public void invoke(List<Integer> exp) { ListSequence.fromList(exp).addElement(1); if (true) { ListSequence.fromList(exp).addElement(2); } if (0 == 1) { ListSequence.fromList(exp).addElement(3); } else { ListSequence.fromList(exp).addElement(4); } ListSequence.fromList(exp).addElement(5); if (0 == 1) { ListSequence.fromList(exp).addElement(6); } } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 3: if (0 == 0) { this.__CP__ = 4; break; } this.__CP__ = 5; break; case 5: if (0 == 1) { this.__CP__ = 7; break; } this.__CP__ = 10; break; case 12: if (0 == 1) { this.__CP__ = 13; break; } this.__CP__ = 1; break; case 2: this.__CP__ = 3; this.yield(1); return true; case 6: this.__CP__ = 5; this.yield(2); return true; case 9: this.__CP__ = 8; this.yield(3); return true; case 11: this.__CP__ = 8; this.yield(4); return true; case 8: this.__CP__ = 12; this.yield(5); return true; case 14: this.__CP__ = 1; this.yield(6); return true; case 0: this.__CP__ = 2; break; case 4: this.__CP__ = 6; break; case 7: this.__CP__ = 9; break; case 10: this.__CP__ = 11; break; case 13: this.__CP__ = 14; break; default: break __loop__; } } while (true); return false; } }; } }; } }); } public void test_whileStatement() throws Exception { this.assertResultsEqual(new _FunctionTypes._void_P1_E0<List<Integer>>() { public void invoke(List<Integer> exp) { int i = 3; ListSequence.fromList(exp).addElement(i); while (i > 0) { int j = 1; ListSequence.fromList(exp).addElement(j); while (j <= 3) { ListSequence.fromList(exp).addElement(i * j); j++; } ListSequence.fromList(exp).addElement(j); i--; } ListSequence.fromList(exp).addElement(i); // must not return anything } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 5: if (_3_i > 0) { this.__CP__ = 6; break; } this.__CP__ = 7; break; case 11: if (_9_j <= 3) { this.__CP__ = 12; break; } this.__CP__ = 13; break; case 4: this.__CP__ = 5; this.yield(_3_i); return true; case 10: this.__CP__ = 11; this.yield(_9_j); return true; case 14: this.__CP__ = 15; this.yield(_3_i * _9_j); return true; case 13: this.__CP__ = 16; this.yield(_9_j); return true; case 7: this.__CP__ = 17; this.yield(_3_i); return true; case 0: this._3_i = 3; this.__CP__ = 4; break; case 17: // placeholder this.__CP__ = 1; break; case 6: this._9_j = 1; this.__CP__ = 10; break; case 16: _3_i--; this.__CP__ = 5; break; case 12: this.__CP__ = 14; break; case 15: _9_j++; this.__CP__ = 11; break; default: break __loop__; } } while (true); return false; } private int _3_i; private int _9_j; }; } }; } }); } public void test_doWhileStatement() throws Exception { this.assertResultsEqual(new _FunctionTypes._void_P1_E0<List<Integer>>() { public void invoke(List<Integer> exp) { ListSequence.fromList(exp).addElement(-1); int i = 3; ListSequence.fromList(exp).addElement(i); do { int j = i; ListSequence.fromList(exp).addElement(j); do { ListSequence.fromList(exp).addElement(j * i); j--; ListSequence.fromList(exp).addElement(j + i); } while (j > 0); i--; } while (i > 0); i = 0; ListSequence.fromList(exp).addElement(i); // must not return value } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 7: if (_4_i > 0) { this.__CP__ = 6; break; } this.__CP__ = 8; break; case 13: if (_10_j > 0) { this.__CP__ = 12; break; } this.__CP__ = 14; break; case 2: this.__CP__ = 3; this.yield(-1); return true; case 5: this.__CP__ = 6; this.yield(_4_i); return true; case 11: this.__CP__ = 12; this.yield(_10_j); return true; case 15: this.__CP__ = 16; this.yield(_10_j * _4_i); return true; case 17: this.__CP__ = 13; this.yield(_10_j + _4_i); return true; case 18: this.__CP__ = 19; this.yield(_4_i); return true; case 0: this.__CP__ = 2; break; case 3: this._4_i = 3; this.__CP__ = 5; break; case 8: _4_i = 0; this.__CP__ = 18; break; case 19: // placeholder this.__CP__ = 1; break; case 6: this._10_j = _4_i; this.__CP__ = 11; break; case 14: _4_i--; this.__CP__ = 7; break; case 12: this.__CP__ = 15; break; case 16: _10_j--; this.__CP__ = 17; break; default: break __loop__; } } while (true); return false; } private int _4_i; private int _10_j; }; } }; } }); } public void test_forStatement() throws Exception { this.assertResultsEqual(new _FunctionTypes._void_P1_E0<List<Integer>>() { public void invoke(List<Integer> exp) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { ListSequence.fromList(exp).addElement(i); ListSequence.fromList(exp).addElement(j); } } } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: this._2_i = 0; case 3: if (!(_2_i < 3)) { this.__CP__ = 1; break; } this.__CP__ = 4; break; case 5: _2_i++; this.__CP__ = 3; break; case 6: this._6_j = 0; case 7: if (!(_6_j < 3)) { this.__CP__ = 5; break; } this.__CP__ = 8; break; case 9: _6_j++; this.__CP__ = 7; break; case 10: this.__CP__ = 11; this.yield(_2_i); return true; case 11: this.__CP__ = 9; this.yield(_6_j); return true; case 0: this.__CP__ = 2; break; case 4: this.__CP__ = 6; break; case 8: this.__CP__ = 10; break; default: break __loop__; } } while (true); return false; } private int _2_i; private int _6_j; }; } }; } }); } public void test_foreachStatement() throws Exception { final List<Integer> data1 = (List<Integer>) Arrays.asList(1, 2, 3, 4, 5); final List<Integer> data2 = (List<Integer>) Arrays.asList(1, 2, 3, 4, 5); this.assertResultsEqual(new _FunctionTypes._void_P1_E0<List<Integer>>() { public void invoke(List<Integer> exp) { for (int i : data1) { ListSequence.fromList(exp).addElement(i); for (int j : data2) { ListSequence.fromList(exp).addElement(j); ListSequence.fromList(exp).addElement(i + j); } ListSequence.fromList(exp).addElement(i * i); } } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: this._2_i_it = data1.iterator(); case 3: if (!(this._2_i_it.hasNext())) { this.__CP__ = 1; break; } this._2_i = this._2_i_it.next(); this.__CP__ = 4; break; case 6: this._6_j_it = data2.iterator(); case 7: if (!(this._6_j_it.hasNext())) { this.__CP__ = 9; break; } this._6_j = this._6_j_it.next(); this.__CP__ = 8; break; case 5: this.__CP__ = 6; this.yield(_2_i); return true; case 10: this.__CP__ = 11; this.yield(_6_j); return true; case 11: this.__CP__ = 7; this.yield(_2_i + _6_j); return true; case 9: this.__CP__ = 3; this.yield(_2_i * _2_i); return true; case 0: this.__CP__ = 2; break; case 4: this.__CP__ = 5; break; case 8: this.__CP__ = 10; break; default: break __loop__; } } while (true); return false; } private int _2_i; private Iterator<Integer> _2_i_it; private int _6_j; private Iterator<Integer> _6_j_it; }; } }; } }); } public void test_dmitriev() throws Exception { this.assertResultsEqual(new _FunctionTypes._void_P1_E0<List<Integer>>() { public void invoke(List<Integer> exp) { int a = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (i + j < 5) { continue; } if (i < j) { a = a + i + j; ListSequence.fromList(exp).addElement(a); } } } } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 4: this._4_i = 0; case 5: if (!(_4_i < 10)) { this.__CP__ = 1; break; } this.__CP__ = 6; break; case 7: _4_i++; this.__CP__ = 5; break; case 8: this._8_j = 0; case 9: if (!(_8_j < 10)) { this.__CP__ = 7; break; } this.__CP__ = 10; break; case 11: _8_j++; this.__CP__ = 9; break; case 12: if (_4_i + _8_j < 5) { this.__CP__ = 13; break; } this.__CP__ = 14; break; case 14: if (_4_i < _8_j) { this.__CP__ = 16; break; } this.__CP__ = 11; break; case 18: this.__CP__ = 11; this.yield(_3_a); return true; case 0: this._3_a = 0; this.__CP__ = 4; break; case 6: this.__CP__ = 8; break; case 10: this.__CP__ = 12; break; case 13: this.__CP__ = 11; break; case 16: _3_a = _3_a + _4_i + _8_j; this.__CP__ = 18; break; default: break __loop__; } } while (true); return false; } private int _3_a; private int _8_j; private int _4_i; }; } }; } }); } public void test_switchStatement() throws Exception { this.assertResultsEqual(new _FunctionTypes._void_P1_E0<List<Integer>>() { public void invoke(List<Integer> exp) { for (Fruits fr : Arrays.asList(new Fruits[]{Fruits.APPLES, Fruits.ORANGES, Fruits.CARS})) { switch (fr) { case APPLES: ListSequence.fromList(exp).addElement(1); ListSequence.fromList(exp).addElement(2); // fall through case ORANGES: ListSequence.fromList(exp).addElement(3); break; default: ListSequence.fromList(exp).addElement(-1); break; } } } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: this._2_fr_it = Arrays.asList(new Fruits[]{Fruits.APPLES, Fruits.ORANGES, Fruits.CARS}).iterator(); case 3: if (!(this._2_fr_it.hasNext())) { this.__CP__ = 1; break; } this._2_fr = this._2_fr_it.next(); this.__CP__ = 4; break; case 5: switch (_2_fr) { case APPLES: this.__CP__ = 6; break __switch__; case ORANGES: this.__CP__ = 7; break __switch__; default: this.__CP__ = 14; break __switch__; } case 8: this.__CP__ = 9; this.yield(1); return true; case 9: this.__CP__ = 10; this.yield(2); return true; case 12: this.__CP__ = 13; this.yield(3); return true; case 15: this.__CP__ = 16; this.yield(-1); return true; case 0: this.__CP__ = 2; break; case 4: this.__CP__ = 5; break; case 6: this.__CP__ = 8; break; case 10: // fall through this.__CP__ = 7; break; case 7: this.__CP__ = 12; break; case 13: this.__CP__ = 3; break; case 14: this.__CP__ = 15; break; case 16: this.__CP__ = 3; break; default: break __loop__; } } while (true); return false; } private Fruits _2_fr; private Iterator<Fruits> _2_fr_it; }; } }; } }); } public void test_elseIfClauses() throws Exception { this.assertResultsEqual(new _FunctionTypes._void_P1_E0<List<Integer>>() { public void invoke(List<Integer> exp) { for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { ListSequence.fromList(exp).addElement(i * 10); } else if (i % 3 == 0) { ListSequence.fromList(exp).addElement(i * 100); } else if (i % 5 == 0) { ListSequence.fromList(exp).addElement(i * 1000); } else { ListSequence.fromList(exp).addElement(i * 10000); if (true) { ListSequence.fromList(exp).addElement(i * 100000); } } } } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: this._2_i = 1; case 3: if (!(_2_i <= 10)) { this.__CP__ = 1; break; } this.__CP__ = 4; break; case 5: _2_i++; this.__CP__ = 3; break; case 6: if (_2_i % 2 == 0) { this.__CP__ = 7; break; } else if (_2_i % 3 == 0) { this.__CP__ = 9; break; } else if (_2_i % 5 == 0) { this.__CP__ = 11; break; } this.__CP__ = 13; break; case 16: if (true) { this.__CP__ = 17; break; } this.__CP__ = 5; break; case 8: this.__CP__ = 5; this.yield(_2_i * 10); return true; case 10: this.__CP__ = 5; this.yield(_2_i * 100); return true; case 12: this.__CP__ = 5; this.yield(_2_i * 1000); return true; case 14: this.__CP__ = 15; this.yield(_2_i * 10000); return true; case 18: this.__CP__ = 5; this.yield(_2_i * 100000); return true; case 0: this.__CP__ = 2; break; case 4: this.__CP__ = 6; break; case 7: this.__CP__ = 8; break; case 9: this.__CP__ = 10; break; case 11: this.__CP__ = 12; break; case 13: this.__CP__ = 14; break; case 15: this.__CP__ = 16; break; case 17: this.__CP__ = 18; break; default: break __loop__; } } while (true); return false; } private int _2_i; }; } }; } }); } public void test_mps7920() throws Exception { final boolean cond1 = false; final boolean cond2 = false; this.assertResultsEqual(new _FunctionTypes._void_P1_E0<List<Integer>>() { public void invoke(List<Integer> exp) { if (cond1) { ListSequence.fromList(exp).addElement(13); } else { List<Integer> ll = ListSequence.fromListAndArray(new ArrayList<Integer>(), 21, 34, 55, 89); if (cond2) { ll = ListSequence.fromList(ll).reversedList(); } else { ll = ll; } for (Integer ii : ll) { ListSequence.fromList(exp).addSequence(ListSequence.fromList(ll).subListSequence(ListSequence.fromList(ll).indexOf(ii), ListSequence.fromList(ll).count())); } } } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 10: this._13_ii_it = _7_ll.iterator(); case 14: if (!(this._13_ii_it.hasNext())) { this.__CP__ = 1; break; } this._13_ii = this._13_ii_it.next(); this.__CP__ = 15; break; case 16: this._16__yield_75e5vq_a0c0a0a1a0c0i0_it = Sequence.fromIterable(ListSequence.fromList(_7_ll).subListSequence(ListSequence.fromList(_7_ll).indexOf(_13_ii), ListSequence.fromList(_7_ll).count())).iterator(); case 17: if (!(this._16__yield_75e5vq_a0c0a0a1a0c0i0_it.hasNext())) { this.__CP__ = 14; break; } this._16__yield_75e5vq_a0c0a0a1a0c0i0 = this._16__yield_75e5vq_a0c0a0a1a0c0i0_it.next(); this.__CP__ = 18; break; case 2: if (cond1) { this.__CP__ = 3; break; } this.__CP__ = 5; break; case 8: if (cond2) { this.__CP__ = 9; break; } this.__CP__ = 12; break; case 4: this.__CP__ = 1; this.yield(13); return true; case 19: this.__CP__ = 17; this.yield(_16__yield_75e5vq_a0c0a0a1a0c0i0); return true; case 0: this.__CP__ = 2; break; case 3: this.__CP__ = 4; break; case 5: this._7_ll = ListSequence.fromListAndArray(new ArrayList<Integer>(), 21, 34, 55, 89); this.__CP__ = 8; break; case 9: _7_ll = ListSequence.fromList(_7_ll).reversedList(); this.__CP__ = 10; break; case 12: _7_ll = _7_ll; this.__CP__ = 10; break; case 15: this.__CP__ = 16; break; case 18: this.__CP__ = 19; break; default: break __loop__; } } while (true); return false; } private List<Integer> _7_ll; private Integer _16__yield_75e5vq_a0c0a0a1a0c0i0; private Iterator<Integer> _16__yield_75e5vq_a0c0a0a1a0c0i0_it; private Integer _13_ii; private Iterator<Integer> _13_ii_it; }; } }; } }); } public void test_mps_1503() throws Exception { this.assertResultsEqual(new _FunctionTypes._void_P1_E0<List<Integer>>() { public void invoke(List<Integer> exp) { int val = 0; if (0 == 1) { val = 42; } else if (true) { int foo = -1; val = 24; } if (val != 0) { ListSequence.fromList(exp).addElement(val); } } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 4: if (0 == 1) { this.__CP__ = 5; break; } this.__CP__ = 8; break; case 8: if (true) { this.__CP__ = 9; break; } this.__CP__ = 6; break; case 6: if (_3_val != 0) { this.__CP__ = 12; break; } this.__CP__ = 1; break; case 13: this.__CP__ = 1; this.yield(_3_val); return true; case 0: this._3_val = 0; this.__CP__ = 4; break; case 5: _3_val = 42; this.__CP__ = 6; break; case 9: this._11_foo = -1; _3_val = 24; this.__CP__ = 6; break; case 12: this.__CP__ = 13; break; default: break __loop__; } } while (true); return false; } private int _3_val; private int _11_foo; }; } }; } }); } public void test_allKindsOfLoopLabels() throws Exception { this.assertResultsEqual(new _FunctionTypes._void_P1_E0<List<Integer>>() { public void invoke(List<Integer> exp) { int i = 10; label1: while (i > 0) { label2: for (int j = i % 5; j >= 0; j--) { label3: do { if (i % 2 > j) { continue label2; } ListSequence.fromList(exp).addElement(i + j); i--; } while ((i + j) % 3 == 2); switch (j) { case 1: continue; case 2: break; case 3: continue label1; default: break label2; } ListSequence.fromList(exp).addElement(j); } ListSequence.fromList(exp).addElement(i); i--; } } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 6: this._6_j = _3_i % 5; case 7: if (!(_6_j >= 0)) { this.__CP__ = 10; break; } this.__CP__ = 8; break; case 9: _6_j--; this.__CP__ = 7; break; case 14: if (_3_i % 2 > _6_j) { this.__CP__ = 15; break; } this.__CP__ = 16; break; case 13: switch (_6_j) { case 1: this.__CP__ = 20; break __switch__; case 2: this.__CP__ = 21; break __switch__; case 3: this.__CP__ = 23; break __switch__; default: this.__CP__ = 27; break __switch__; } case 4: if (_3_i > 0) { this.__CP__ = 5; break; } this.__CP__ = 1; break; case 12: if ((_3_i + _6_j) % 3 == 2) { this.__CP__ = 11; break; } this.__CP__ = 13; break; case 16: this.__CP__ = 18; this.yield(_3_i + _6_j); return true; case 19: this.__CP__ = 9; this.yield(_6_j); return true; case 10: this.__CP__ = 29; this.yield(_3_i); return true; case 0: this._3_i = 10; this.__CP__ = 4; break; case 5: this.__CP__ = 6; break; case 29: _3_i--; this.__CP__ = 4; break; case 8: this.__CP__ = 11; break; case 11: this.__CP__ = 14; break; case 18: _3_i--; this.__CP__ = 12; break; case 15: this.__CP__ = 12; break; case 20: this.__CP__ = 9; break; case 21: this.__CP__ = 19; break; case 23: this.__CP__ = 9; break; case 27: this.__CP__ = 10; break; default: break __loop__; } } while (true); return false; } private int _3_i; private int _6_j; }; } }; } }); } public void test_yieldAllLast() throws Exception { this.assertResultsEqual2(new _FunctionTypes._return_P0_E0<IListSequence<Integer>>() { public IListSequence<Integer> invoke() { return ListSequence.fromListAndArray(new ArrayList<Integer>(), 1, 2, 3); } }, new _FunctionTypes._return_P0_E0<IListSequence<Integer>>() { public IListSequence<Integer> invoke() { // some statements return ListSequence.fromListAndArray(new ArrayList<Integer>(), 1, 2, 3); } }); } public void test_yieldAll() throws Exception { this.assertResultsEqual2(new _FunctionTypes._return_P0_E0<IListSequence<Integer>>() { public IListSequence<Integer> invoke() { return ListSequence.fromListAndArray(new ArrayList<Integer>(), 1, 2, 3); } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: this._2__yield_75e5vq_a0b0a0a21a_it = Sequence.fromIterable(ListSequence.fromListAndArray(new ArrayList<Integer>(), 1, 2, 3)).iterator(); case 3: if (!(this._2__yield_75e5vq_a0b0a0a21a_it.hasNext())) { this.__CP__ = 5; break; } this._2__yield_75e5vq_a0b0a0a21a = this._2__yield_75e5vq_a0b0a0a21a_it.next(); this.__CP__ = 4; break; case 6: this.__CP__ = 3; this.yield(_2__yield_75e5vq_a0b0a0a21a); return true; case 0: this.__CP__ = 2; break; case 5: // last statement this.__CP__ = 1; break; case 4: this.__CP__ = 6; break; default: break __loop__; } } while (true); return false; } private Integer _2__yield_75e5vq_a0b0a0a21a; private Iterator<Integer> _2__yield_75e5vq_a0b0a0a21a_it; }; } }; } }); } public void test_yieldYieldAll() throws Exception { this.assertResultsEqual2(new _FunctionTypes._return_P0_E0<IListSequence<Integer>>() { public IListSequence<Integer> invoke() { return ListSequence.fromListAndArray(new ArrayList<Integer>(), 1, 2, 3); } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 3: this._3__yield_75e5vq_b0b0a0a31a_it = Sequence.fromIterable(ListSequence.fromListAndArray(new ArrayList<Integer>(), 2, 3)).iterator(); case 4: if (!(this._3__yield_75e5vq_b0b0a0a31a_it.hasNext())) { this.__CP__ = 1; break; } this._3__yield_75e5vq_b0b0a0a31a = this._3__yield_75e5vq_b0b0a0a31a_it.next(); this.__CP__ = 5; break; case 2: this.__CP__ = 3; this.yield(1); return true; case 6: this.__CP__ = 4; this.yield(_3__yield_75e5vq_b0b0a0a31a); return true; case 0: this.__CP__ = 2; break; case 5: this.__CP__ = 6; break; default: break __loop__; } } while (true); return false; } private Integer _3__yield_75e5vq_b0b0a0a31a; private Iterator<Integer> _3__yield_75e5vq_b0b0a0a31a_it; }; } }; } }); } public void test_yieldAllYieldAll() throws Exception { this.assertResultsEqual2(new _FunctionTypes._return_P0_E0<IListSequence<Integer>>() { public IListSequence<Integer> invoke() { return ListSequence.fromListAndArray(new ArrayList<Integer>(), 1, 2, 3, 4); } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: this._2__yield_75e5vq_a0b0a0a41a_it = Sequence.fromIterable(ListSequence.fromListAndArray(new ArrayList<Integer>(), 1, 2)).iterator(); case 3: if (!(this._2__yield_75e5vq_a0b0a0a41a_it.hasNext())) { this.__CP__ = 5; break; } this._2__yield_75e5vq_a0b0a0a41a = this._2__yield_75e5vq_a0b0a0a41a_it.next(); this.__CP__ = 4; break; case 5: this._6__yield_75e5vq_b0b0a0a41a_it = Sequence.fromIterable(ListSequence.fromListAndArray(new ArrayList<Integer>(), 3, 4)).iterator(); case 7: if (!(this._6__yield_75e5vq_b0b0a0a41a_it.hasNext())) { this.__CP__ = 1; break; } this._6__yield_75e5vq_b0b0a0a41a = this._6__yield_75e5vq_b0b0a0a41a_it.next(); this.__CP__ = 8; break; case 6: this.__CP__ = 3; this.yield(_2__yield_75e5vq_a0b0a0a41a); return true; case 9: this.__CP__ = 7; this.yield(_6__yield_75e5vq_b0b0a0a41a); return true; case 0: this.__CP__ = 2; break; case 4: this.__CP__ = 6; break; case 8: this.__CP__ = 9; break; default: break __loop__; } } while (true); return false; } private Integer _2__yield_75e5vq_a0b0a0a41a; private Iterator<Integer> _2__yield_75e5vq_a0b0a0a41a_it; private Integer _6__yield_75e5vq_b0b0a0a41a; private Iterator<Integer> _6__yield_75e5vq_b0b0a0a41a_it; }; } }; } }); } public void test_yieldAllInCycle() throws Exception { this.assertResultsEqual2(new _FunctionTypes._return_P0_E0<IListSequence<Integer>>() { public IListSequence<Integer> invoke() { return ListSequence.fromListAndArray(new ArrayList<Integer>(), 1, 2, 3, 4); } }, new _FunctionTypes._return_P0_E0<Iterable<Integer>>() { public Iterable<Integer> invoke() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: this._2_i = 1; case 3: if (!(_2_i <= 4)) { this.__CP__ = 1; break; } this.__CP__ = 4; break; case 5: _2_i++; this.__CP__ = 3; break; case 6: this._6__yield_75e5vq_a0a0b0a0a51a_it = Sequence.fromIterable(ListSequence.fromListAndArray(new ArrayList<Integer>(), _2_i)).iterator(); case 7: if (!(this._6__yield_75e5vq_a0a0b0a0a51a_it.hasNext())) { this.__CP__ = 5; break; } this._6__yield_75e5vq_a0a0b0a0a51a = this._6__yield_75e5vq_a0a0b0a0a51a_it.next(); this.__CP__ = 8; break; case 9: this.__CP__ = 7; this.yield(_6__yield_75e5vq_a0a0b0a0a51a); return true; case 0: this.__CP__ = 2; break; case 4: this.__CP__ = 6; break; case 8: this.__CP__ = 9; break; default: break __loop__; } } while (true); return false; } private Integer _6__yield_75e5vq_a0a0b0a0a51a; private Iterator<Integer> _6__yield_75e5vq_a0a0b0a0a51a_it; private int _2_i; }; } }; } }); } public void test_timur1() throws Exception { // {1, 2, 3}.select{ it => yield 4; yield 5; } final List<Integer> input = ListSequence.fromListAndArray(new ArrayList<Integer>(), 1, 2, 3); List<Iterable<Integer>> exp = ListSequence.fromListAndArray(new ArrayList<Iterable<Integer>>(), ListSequence.fromListAndArray(new ArrayList<Integer>(), 4, 5), ListSequence.fromListAndArray(new ArrayList<Integer>(), 4, 5), ListSequence.fromListAndArray(new ArrayList<Integer>(), 4, 5)); List<Iterable<Integer>> res = ListSequence.fromList(new ArrayList<Iterable<Integer>>()); ListSequence.fromList(res).addSequence(Sequence.fromIterable(new _FunctionTypes._return_P0_E0<ISequence<Iterable<Integer>>>() { public ISequence<Iterable<Integer>> invoke() { return ListSequence.fromList(input).select(new ISelector<Integer, Iterable<Integer>>() { public Iterable<Integer> select(final Integer it) { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: this.__CP__ = 3; this.yield(4); return true; case 3: this.__CP__ = 1; this.yield(5); return true; case 0: this.__CP__ = 2; break; default: break __loop__; } } while (true); return false; } }; } }; } }); } }.invoke())); this.assertEquals(exp, res); } public void test_timur2() throws Exception { // {1, 2, 3}.select{ it => if (it == 2) {yield 4;}; } final List<Integer> input = ListSequence.fromListAndArray(new ArrayList<Integer>(), 1, 2, 3); List<Iterable<Integer>> exp = ListSequence.fromListAndArray(new ArrayList<Iterable<Integer>>(), ListSequence.fromList(new ArrayList<Integer>()), ListSequence.fromListAndArray(new ArrayList<Integer>(), 4), ListSequence.fromList(new ArrayList<Integer>())); List<Iterable<Integer>> res = ListSequence.fromList(new ArrayList<Iterable<Integer>>()); ListSequence.fromList(res).addSequence(Sequence.fromIterable(new _FunctionTypes._return_P0_E0<ISequence<Iterable<Integer>>>() { public ISequence<Iterable<Integer>> invoke() { return ListSequence.fromList(input).select(new ISelector<Integer, Iterable<Integer>>() { public Iterable<Integer> select(final Integer it) { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: if (it == 2) { this.__CP__ = 3; break; } this.__CP__ = 1; break; case 4: this.__CP__ = 1; this.yield(4); return true; case 0: this.__CP__ = 2; break; case 3: this.__CP__ = 4; break; default: break __loop__; } } while (true); return false; } }; } }; } }); } }.invoke())); this.assertEquals(exp, res); } public void test_mps3477() throws Exception { List<Integer> exp = ListSequence.fromListAndArray(new ArrayList<Integer>(), 10, 0, 20, 11, 1, 21, 12, 2, 22, 13, 3, 23, 14, 4, 24, 15, 5, 25, 16, 6, 26, 17, 7, 27, 18, 8, 28, 19, 9, 29); final List<Integer> res = ListSequence.fromList(new ArrayList<Integer>()); _FunctionTypes._return_P2_E0<? extends Iterable<Integer>, ? super Integer, ? super Integer> foo = new _FunctionTypes._return_P2_E0<Iterable<Integer>, Integer, Integer>() { public Iterable<Integer> invoke(final Integer start, final Integer end) { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: this._2_i = start; case 3: if (!(_2_i < end)) { this.__CP__ = 1; break; } this.__CP__ = 4; break; case 5: _2_i++; this.__CP__ = 3; break; case 7: this.__CP__ = 8; this.yield(_2_i); return true; case 0: this.__CP__ = 2; break; case 4: ListSequence.fromList(res).addElement(_2_i + 10); this.__CP__ = 7; break; case 8: ListSequence.fromList(res).addElement(_2_i + 20); this.__CP__ = 5; break; default: break __loop__; } } while (true); return false; } private int _2_i; }; } }; } }; Iterable<Integer> out = foo.invoke(0, 10); for (int k : out) { ListSequence.fromList(res).addElement(k); } Assert.assertEquals(exp, res); } public void test_mps10427() throws Exception { final Iterable<String> s1 = Sequence.fromClosure(new ISequenceClosure<String>() { public Iterable<String> iterable() { return new Iterable<String>() { public Iterator<String> iterator() { return new YieldingIterator<String>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: this.__CP__ = 1; this.yield("foo"); return true; case 0: this.__CP__ = 2; break; default: break __loop__; } } while (true); return false; } }; } }; } }); final Iterable<String> s2 = null; final Iterable<String> s3 = Sequence.<String>singleton("bar"); String s = IterableUtils.join(Sequence.fromIterable(Sequence.fromClosure(new ISequenceClosure<String>() { public Iterable<String> iterable() { return new Iterable<String>() { public Iterator<String> iterator() { return new YieldingIterator<String>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: this._2__yield_75e5vq_a0a0a0a3a91a_it = Sequence.fromIterable(s1).iterator(); case 3: if (!(this._2__yield_75e5vq_a0a0a0a3a91a_it.hasNext())) { this.__CP__ = 5; break; } this._2__yield_75e5vq_a0a0a0a3a91a = this._2__yield_75e5vq_a0a0a0a3a91a_it.next(); this.__CP__ = 4; break; case 5: this._6__yield_75e5vq_b0a0a0a3a91a_it = Sequence.fromIterable(s2).iterator(); case 7: if (!(this._6__yield_75e5vq_b0a0a0a3a91a_it.hasNext())) { this.__CP__ = 9; break; } this._6__yield_75e5vq_b0a0a0a3a91a = this._6__yield_75e5vq_b0a0a0a3a91a_it.next(); this.__CP__ = 8; break; case 9: this._10__yield_75e5vq_c0a0a0a3a91a_it = Sequence.fromIterable(s3).iterator(); case 11: if (!(this._10__yield_75e5vq_c0a0a0a3a91a_it.hasNext())) { this.__CP__ = 1; break; } this._10__yield_75e5vq_c0a0a0a3a91a = this._10__yield_75e5vq_c0a0a0a3a91a_it.next(); this.__CP__ = 12; break; case 6: this.__CP__ = 3; this.yield(_2__yield_75e5vq_a0a0a0a3a91a); return true; case 10: this.__CP__ = 7; this.yield(_6__yield_75e5vq_b0a0a0a3a91a); return true; case 13: this.__CP__ = 11; this.yield(_10__yield_75e5vq_c0a0a0a3a91a); return true; case 0: this.__CP__ = 2; break; case 4: this.__CP__ = 6; break; case 8: this.__CP__ = 10; break; case 12: this.__CP__ = 13; break; default: break __loop__; } } while (true); return false; } private String _2__yield_75e5vq_a0a0a0a3a91a; private Iterator<String> _2__yield_75e5vq_a0a0a0a3a91a_it; private String _6__yield_75e5vq_b0a0a0a3a91a; private Iterator<String> _6__yield_75e5vq_b0a0a0a3a91a_it; private String _10__yield_75e5vq_c0a0a0a3a91a; private Iterator<String> _10__yield_75e5vq_c0a0a0a3a91a_it; }; } }; } })), ", "); Assert.assertEquals("foo, bar", s); } public void test_yieldNext() throws Exception { Iterable<Integer> test = Sequence.fromClosure(new ISequenceClosure<Integer>() { public Iterable<Integer> iterable() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 2: this.__CP__ = 3; this.yield(42); return true; case 3: this.__CP__ = 1; this.yield(24); return true; case 0: this.__CP__ = 2; break; default: break __loop__; } } while (true); return false; } }; } }; } }); Iterator<Integer> it = test.iterator(); Assert.assertTrue(it.hasNext()); Assert.assertSame(42, it.next()); // don't call hasNext, must still yield result Assert.assertSame(24, it.next()); try { it.next(); Assert.assertTrue(false); } catch (NoSuchElementException e) { // ok } Assert.assertFalse(it.hasNext()); } public void test_delayedException() throws Exception { Iterable<Integer> seq = Sequence.fromClosure(new ISequenceClosure<Integer>() { public Iterable<Integer> iterable() { return new Iterable<Integer>() { public Iterator<Integer> iterator() { return new YieldingIterator<Integer>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 3: if (0 == 0) { this.__CP__ = 4; break; } this.__CP__ = 5; break; case 2: this.__CP__ = 3; this.yield(1); return true; case 5: this.__CP__ = 1; this.yield(-1); return true; case 0: this.__CP__ = 2; break; case 4: throw new DelayedException(); default: break __loop__; } } while (true); return false; } }; } }; } }); Iterator<Integer> it = seq.iterator(); Assert.assertSame(1, it.next()); try { it.next(); Assert.assertTrue(false); } catch (NoSuchElementException e) { // ok } try { Assert.assertFalse(it.hasNext()); Assert.assertTrue(false); } catch (DelayedException e) { // ok } it = seq.iterator(); Assert.assertSame(1, it.next()); try { Assert.assertFalse(it.hasNext()); Assert.assertTrue(false); } catch (DelayedException e) { // ok } try { it.next(); Assert.assertTrue(false); } catch (NoSuchElementException e) { // ok } } public void test_mps10640() throws Exception { Object input = new Object[]{"a", "b", new Object[]{"c", "d"}}; Iterable<Object> output = new _FunctionTypes._return_P1_E0<Iterable<Object>, Object>() { public Iterable<Object> invoke(final Object o) { return new Iterable<Object>() { public Iterator<Object> iterator() { return new YieldingIterator<Object>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 8: this._8__yield_75e5vq_a0a0b0a0a1a22a_it = Sequence.fromIterable(invoke(_5_os)).iterator(); case 9: if (!(this._8__yield_75e5vq_a0a0b0a0a1a22a_it.hasNext())) { this.__CP__ = 6; break; } this._8__yield_75e5vq_a0a0b0a0a1a22a = this._8__yield_75e5vq_a0a0b0a0a1a22a_it.next(); this.__CP__ = 10; break; case 5: this._5_os_idx = 0; case 6: if (this._5_os_idx >= ((Object[]) o).length) { this.__CP__ = 1; break; } this._5_os = ((Object[]) o)[this._5_os_idx++]; this.__CP__ = 7; break; case 3: if (o instanceof Object[]) { this.__CP__ = 4; break; } this.__CP__ = 1; break; case 2: this.__CP__ = 3; this.yield(o); return true; case 11: this.__CP__ = 9; this.yield(_8__yield_75e5vq_a0a0b0a0a1a22a); return true; case 0: this.__CP__ = 2; break; case 4: this.__CP__ = 5; break; case 7: this.__CP__ = 8; break; case 10: this.__CP__ = 11; break; default: break __loop__; } } while (true); return false; } private Object _5_os; private int _5_os_idx; private Object _8__yield_75e5vq_a0a0b0a0a1a22a; private Iterator<Object> _8__yield_75e5vq_a0a0b0a0a1a22a_it; }; } }; } }.invoke(input); Sequence.fromIterable(output).disjunction(ListSequence.fromList(ListSequence.fromListAndArray(new ArrayList(), "a", "b", "c", "d"))).isEmpty(); } public void test_mps15041() throws Exception { Iterable<? extends Number> seq = new _FunctionTypes._return_P0_E0<Iterable<? extends Number>>() { public Iterable<Number> invoke() { return new Iterable<Number>() { public Iterator<Number> iterator() { return new YieldingIterator<Number>() { private int __CP__ = 0; protected boolean moveToNext() { __loop__: do { __switch__: switch (this.__CP__) { case -1: assert false : "Internal error"; return false; case 5: this._5__yield_75e5vq_d0a0a0a32a_it = Sequence.fromIterable(numberSubtypes()).iterator(); case 6: if (!(this._5__yield_75e5vq_d0a0a0a32a_it.hasNext())) { this.__CP__ = 1; break; } this._5__yield_75e5vq_d0a0a0a32a = this._5__yield_75e5vq_d0a0a0a32a_it.next(); this.__CP__ = 7; break; case 2: this.__CP__ = 3; this.yield(ListSequence.fromList(numberSubtypes()).getElement(0)); return true; case 3: this.__CP__ = 4; this.yield(ListSequence.fromList(numberSubtypes()).getElement(1)); return true; case 4: this.__CP__ = 5; this.yield(ListSequence.fromList(numberSubtypes()).getElement(2)); return true; case 8: this.__CP__ = 6; this.yield(_5__yield_75e5vq_d0a0a0a32a); return true; case 0: this.__CP__ = 2; break; case 7: this.__CP__ = 8; break; default: break __loop__; } } while (true); return false; } private Number _5__yield_75e5vq_d0a0a0a32a; private Iterator<? extends Number> _5__yield_75e5vq_d0a0a0a32a_it; }; } }; } }.invoke(); Assert.assertEquals(Integer.valueOf(42), Sequence.fromIterable(seq).first()); Assert.assertEquals(Long.valueOf(100500L), Sequence.fromIterable(seq).skip(1).first()); Assert.assertEquals(Double.valueOf(2.718281828), Sequence.fromIterable(seq).skip(2).first()); Assert.assertEquals(Integer.valueOf(42), Sequence.fromIterable(seq).first()); Assert.assertEquals(Long.valueOf(100500L), Sequence.fromIterable(seq).skip(1).first()); Assert.assertEquals(Double.valueOf(2.718281828), Sequence.fromIterable(seq).skip(2).first()); Iterable<? extends Number> seq2 = new _FunctionTypes._return_P0_E0<List<? extends Number>>() { public List<? extends Number> invoke() { return numberSubtypes(); } }.invoke(); Assert.assertEquals(Integer.valueOf(42), Sequence.fromIterable(seq).first()); Assert.assertEquals(Long.valueOf(100500L), Sequence.fromIterable(seq).skip(1).first()); Assert.assertEquals(Double.valueOf(2.718281828), Sequence.fromIterable(seq).skip(2).first()); } public YieldClosures_Test() { } private List<? extends Number> numberSubtypes() { return Sequence.fromIterable(Sequence.fromArray(new Number[]{Integer.valueOf(42), Long.valueOf(100500L), Double.valueOf(2.718281828)})).toListSequence(); } private void assertEquals(List<Iterable<Integer>> exp, List<Iterable<Integer>> res) { Assert.assertSame(ListSequence.fromList(exp).count(), ListSequence.fromList(res).count()); { Iterator<Iterable<Integer>> foo_it = ListSequence.fromList(exp).iterator(); Iterator<Iterable<Integer>> bar_it = ListSequence.fromList(res).iterator(); Iterable<Integer> foo_var; Iterable<Integer> bar_var; while (foo_it.hasNext() && bar_it.hasNext()) { foo_var = foo_it.next(); bar_var = bar_it.next(); Assert.assertSame(Sequence.fromIterable(foo_var).count(), Sequence.fromIterable(bar_var).count()); { Iterator<Integer> a_it = Sequence.fromIterable(foo_var).iterator(); Iterator<Integer> b_it = Sequence.fromIterable(bar_var).iterator(); int a_var; int b_var; while (a_it.hasNext() && b_it.hasNext()) { a_var = a_it.next(); b_var = b_it.next(); Assert.assertSame(a_var, b_var); } } } } } }