package jetbrains.mps.closures.test;
/*Generated by MPS */
import junit.framework.TestCase;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import junit.framework.Assert;
public class AdvancedFunctionTypes_Test extends TestCase {
public void test_returnsFunction() throws Exception {
_FunctionTypes._return_P0_E0<? extends _FunctionTypes._return_P0_E0<? extends Integer>> fun1 = new _FunctionTypes._return_P0_E0<_FunctionTypes._return_P0_E0<? extends Integer>>() {
public _FunctionTypes._return_P0_E0<? extends Integer> invoke() {
return new _FunctionTypes._return_P0_E0<Integer>() {
public Integer invoke() {
return 1;
}
};
}
};
_FunctionTypes._return_P0_E0<? extends _FunctionTypes._return_P0_E0<? extends _FunctionTypes._return_P0_E0<? extends Integer>>> fun2 = new _FunctionTypes._return_P0_E0<_FunctionTypes._return_P0_E0<? extends _FunctionTypes._return_P0_E0<? extends Integer>>>() {
public _FunctionTypes._return_P0_E0<? extends _FunctionTypes._return_P0_E0<? extends Integer>> invoke() {
return new _FunctionTypes._return_P0_E0<_FunctionTypes._return_P0_E0<? extends Integer>>() {
public _FunctionTypes._return_P0_E0<? extends Integer> invoke() {
return new _FunctionTypes._return_P0_E0<Integer>() {
public Integer invoke() {
return 1;
}
};
}
};
}
};
_FunctionTypes._return_P0_E0<? extends _FunctionTypes._return_P0_E0<? extends Integer>> fun3;
_FunctionTypes._return_P0_E0<? extends _FunctionTypes._return_P0_E0<? extends Number>> fun4;
fun1 = fun2.invoke();
fun3 = fun1;
fun4 = fun3;
fun4 = fun2.invoke();
}
public void test_acceptsFunction() throws Exception {
_FunctionTypes._return_P1_E0<? extends Integer, ? super _FunctionTypes._return_P0_E0<? extends Integer>> fun = new _FunctionTypes._return_P1_E0<Integer, _FunctionTypes._return_P0_E0<? extends Integer>>() {
public Integer invoke(_FunctionTypes._return_P0_E0<? extends Integer> f) {
return f.invoke();
}
};
_FunctionTypes._return_P2_E0<? extends Integer, ? super Integer, ? super Integer> add = new _FunctionTypes._return_P2_E0<Integer, Integer, Integer>() {
public Integer invoke(Integer x, Integer y) {
return x + y;
}
};
_FunctionTypes._return_P1_E0<? extends Integer, ? super Integer> plusThree = new _FunctionTypes._return_P1_E0<Integer, Integer>() {
public Integer invoke(Integer x) {
return x + 3;
}
};
_FunctionTypes._return_P1_E0<? extends Integer, ? super Integer> curriedPlusThree = this.curry(add, 3);
Assert.assertEquals(plusThree.invoke(1), curriedPlusThree.invoke(1));
}
public AdvancedFunctionTypes_Test() {
}
public _FunctionTypes._return_P1_E0<? extends Integer, ? super Integer> curry(final _FunctionTypes._return_P2_E0<? extends Integer, ? super Integer, ? super Integer> fun, final int y) {
return new _FunctionTypes._return_P1_E0<Integer, Integer>() {
public Integer invoke(Integer x) {
return fun.invoke(x, y);
}
};
}
}