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;
}
}