package function.builtin.special; import static org.junit.Assert.*; import static testutil.TestUtilities.*; import org.junit.Test; import function.ArgumentValidator.*; import sexpression.*; public class LAMBDATester { @Test public void testLambda() { String input = "(lambda (x) x)"; assertSExpressionsMatch(parseString("(LAMBDA (X) X)"), evaluateString(input)); } @Test public void lambdaExpressionIsLambdaExpression() { Cons lambdaExpression = new Cons(new Symbol("LAMBDA"), new Cons(Nil.getInstance(), new Cons(Nil.getInstance(), Nil.getInstance()))); assertTrue(LAMBDA.isLambdaExpression(lambdaExpression)); } @Test public void somethingElseIsNotLambdaExpression() { assertFalse(LAMBDA.isLambdaExpression(Symbol.T)); } @Test public void testCreateLambdaExpression() { Cons lambdaExpression = new Cons(new Symbol("LAMBDA"), new Cons(Nil.getInstance(), new Cons(Nil.getInstance(), Nil.getInstance()))); assertSExpressionsMatch(parseString("(:LAMBDA () ())"), LAMBDA.createFunction(lambdaExpression).getLambdaExpression()); } @Test(expected = DottedArgumentListException.class) public void testLambdaWithDottedArgumentList() { String input = "(apply 'lambda (cons '(x) 1))"; evaluateString(input); } @Test(expected = DottedArgumentListException.class) public void testCreateFunctionWithDottedArgumentList() { Cons lambdaExpression = new Cons(new Symbol("LAMBDA"), new Cons(Nil.getInstance(), LispNumber.ONE)); LAMBDA.createFunction(lambdaExpression); } @Test(expected = BadArgumentTypeException.class) public void testCreateFunctionWithNonList() { Cons lambdaExpression = new Cons(new Symbol("LAMBDA"), LispNumber.ONE); LAMBDA.createFunction(lambdaExpression); } @Test(expected = TooFewArgumentsException.class) public void testLambdaWithTooFewArguments() { evaluateString("(lambda ())"); } }