package jetbrains.mps.closures.test; /*Generated by MPS */ import junit.framework.TestCase; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import junit.framework.Assert; import java.util.Iterator; import jetbrains.mps.baseLanguage.closures.runtime.YieldingIterator; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.ILeftCombinator; public class ExternalReferences_Test extends TestCase { public void test_localVariableDeclaration() throws Exception { final Wrappers._int foo = new Wrappers._int(42); int bar = new _FunctionTypes._return_P0_E0<Integer>() { public Integer invoke() { return ++foo.value; } }.invoke(); Assert.assertEquals(foo.value, bar); } public void test_alteredLocalvariable() throws Exception { final Wrappers._int res = new Wrappers._int(0); for (int i = 1; i <= 5; i++) { new _FunctionTypes._return_P0_E0<Integer>() { public Integer invoke() { return res.value++; } }.invoke(); } res.value = res.value - 5; Assert.assertEquals(0, res.value); } public void test_alteredLocalVariable2() throws Exception { final Wrappers._int res = new Wrappers._int(0); for (int i = 1; i <= 5; i++) { for (int 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 3: this.__CP__ = 1; this.yield(-1); return true; case 0: res.value++; this.__CP__ = 3; break; default: break __loop__; } } while (true); return false; } }; } }; } }.invoke()) { } } res.value = res.value - 5; Assert.assertEquals(0, res.value); } public void test_lvdsWithYieldFromNestedClosure() throws Exception { final Wrappers._int res = new Wrappers._int(0); int x = Sequence.fromIterable(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.__CP__ = 1; this.yield(_3_local); return true; case 0: this._3_local = 10; res.value = new _FunctionTypes._return_P0_E0<Integer>() { public Integer invoke() { return _3_local++; } }.invoke(); _3_local++; this.__CP__ = 4; break; default: break __loop__; } } while (true); return false; } private int _3_local; }; } }; } }.invoke()).first(); Assert.assertEquals(10, res.value); Assert.assertEquals(12, x); } public void test_lvdsNoYieldFromNestedClosure() throws Exception { final Wrappers._int res = new Wrappers._int(0); int x = new _FunctionTypes._return_P0_E0<Integer>() { public Integer invoke() { final Wrappers._int local = new Wrappers._int(10); res.value = new _FunctionTypes._return_P0_E0<Integer>() { public Integer invoke() { return ++local.value; } }.invoke(); return ++local.value; } }.invoke(); Assert.assertEquals(11, res.value); Assert.assertEquals(12, x); } public void test_alteredLocalVariable3() throws Exception { final Wrappers._T<byte[]> bytes = new Wrappers._T<byte[]>(new byte[1]); new _FunctionTypes._return_P0_E0<byte[]>() { public byte[] invoke() { return bytes.value = new byte[3]; // no return value } }.invoke(); Assert.assertSame(3, bytes.value.length); } public void test_methodParameter() throws Exception { Worker wrk = new Worker() { @Override public String doWork(final Integer d) { return new _FunctionTypes._return_P0_E0<String>() { public String invoke() { return "Done: " + d; } }.invoke(); } }; Assert.assertEquals("Done: 1234", wrk.doWork(1234)); } public void test_methodParameter2() throws Exception { Worker wrk = new Worker() { @Override public String doWork(Integer d) { final Wrappers._T<Integer> _d = new Wrappers._T<Integer>(d); new _FunctionTypes._return_P0_E0<Integer>() { public Integer invoke() { return _d.value = _d.value * 2; } }.invoke(); return "Done: " + _d.value; } }; Assert.assertEquals("Done: 2468", wrk.doWork(1234)); } public void test_field() throws Exception { Worker wrk = new Worker() { public int field; public int foo; @Override public String doWork(Integer foo) { this.foo = foo; this.field = this.foo; return new _FunctionTypes._return_P0_E0<String>() { public String invoke() { return "Done: " + field; } }.invoke(); } }; Assert.assertEquals("Done: 4321", wrk.doWork(4321)); } public void test_mps4102() throws Exception { int a; for (final Wrappers._int i = new Wrappers._int(0); i.value < 10; i.value++) { a = new _FunctionTypes._return_P0_E0<Integer>() { public Integer invoke() { return i.value; } }.invoke(); } } public void test_mps7432() throws Exception { String res = MPS7432.<String>aaaa(new _FunctionTypes._return_P0_E0<String>() { public String invoke() { return "fubar"; } }); Assert.assertEquals("fubar", res); } public void test_mps10242() throws Exception { int num = 0; int res = mps10242_helper(num, new _FunctionTypes._return_P1_E0<Integer, Integer>() { public Integer invoke(Integer i) { return i + 42; } }); Assert.assertSame(42, res); } public void test_mps12286() throws Exception { final String foo; if (true == false) { foo = null; } else { foo = "bar"; } String f = Sequence.fromIterable(Sequence.<Integer>singleton(42)).foldLeft(foo, new ILeftCombinator<Integer, String>() { public String combine(String s, Integer it) { return "" + it + s; } }); Assert.assertEquals("42bar", f); Assert.assertTrue((foo).getClass() == String.class); } public ExternalReferences_Test() { } public <T> T mps10242_helper(T t, final _FunctionTypes._return_P1_E0<? extends T, ? super T> fun) { final Wrappers._T<T> _t = new Wrappers._T<T>(t); new _FunctionTypes._return_P0_E0<T>() { public T invoke() { return _t.value = fun.invoke(_t.value); } }.invoke(); return _t.value; } }