package org.enumerable.lambda.support.expression; import static org.enumerable.lambda.Lambda.*; import static org.enumerable.lambda.Parameters.*; import static org.enumerable.lambda.primitives.LambdaPrimitives.*; import static org.enumerable.lambda.support.expression.LambdaExpressionTrees.*; import static org.junit.Assert.*; import japa.parser.ast.expr.BinaryExpr; import japa.parser.ast.expr.NullLiteralExpr; import org.enumerable.lambda.Fn0; import org.enumerable.lambda.Fn1; import org.enumerable.lambda.Fn2; import org.junit.Test; public class LambdaExpressionTreesTest { @Test public void turnLambdasIntoExpressions() throws Exception { assertEquals(new NullLiteralExpr(), toExpression(λ(null))); assertEquals(parseExpression("n * 2"), toExpression(λ(n, n * 2))); assertEquals(parseExpression("n * m"), toExpression(λ(n, m, n * m))); } @Test public void turnExpressionsIntoLambdas() throws Exception { Fn0<Object> fn0 = toFn0(Object.class, new NullLiteralExpr()); assertNull(fn0.call()); Fn1<Integer, Integer> fn1 = toFn1(Integer.class, Integer.class, "n", parseExpression("n * 2")); assertEquals(4, (int) fn1.call(2)); Fn2<Integer, Integer, Integer> fn2 = toFn2(Integer.class, Integer.class, "n", Integer.class, "m", parseExpression("n * m")); assertEquals(8, (int) fn2.call(2, 4)); } @Test public void turnLambdasIntoExpressionsAndThenBackToLambdaAfterModification() throws Exception { BinaryExpr expression = toExpression(λ(n, n * 2)); expression.setOperator(BinaryExpr.Operator.divide); assertEquals(parseExpression("n / 2"), expression); Fn1<Integer, Integer> half = toFn1(Integer.class, Integer.class, "n", expression); assertEquals(2, (int) half.call(4)); } @Test(expected = IllegalArgumentException.class) public void turnClosureIntoExpressionThrowsException() throws Exception { int i = 1; toExpression(λ(i)); } }