package function.builtin.special; import static testutil.TestUtilities.*; import org.junit.Test; import function.ArgumentValidator.*; public class CONDTester { @Test public void condWithNoArguments() { String input = "(cond)"; assertSExpressionsMatch(parseString("nil"), evaluateString(input)); } @Test public void condWithTrue() { String input = "(cond (T))"; assertSExpressionsMatch(parseString("T"), evaluateString(input)); } @Test public void condWithNumber() { String input = "(cond ((+ 1 2)))"; assertSExpressionsMatch(parseString("3"), evaluateString(input)); } @Test public void condWithSingleExpression() { String input = "(cond (T \"true\"))"; assertSExpressionsMatch(parseString("\"true\""), evaluateString(input)); } @Test public void condWithMultipleExpressions() { String input = "(cond ((= 1 2) 2) ((= 1 2) 2) ((= 1 1) 3))"; assertSExpressionsMatch(parseString("3"), evaluateString(input)); } @Test public void condWithMultipleConditionsMatching_ReturnFirstOne() { String input = "(cond ((= 1 1) 2) ((= 1 1) 3))"; assertSExpressionsMatch(parseString("2"), evaluateString(input)); } @Test public void condWithMultipleConditionsMatching_OnlyEvaluatesFirstOne() { String input = "(cond ((= 1 1) 2) ((= 1 1) x))"; assertSExpressionsMatch(parseString("2"), evaluateString(input)); } @Test public void condWithMultipleResultValues_OnlyReturnsLast() { String input = "(cond ((= 1 1) 2 3 4))"; assertSExpressionsMatch(parseString("4"), evaluateString(input)); } @Test public void condWithNoConditionMatching_ReturnsNil() { String input = "(cond ((= 1 2) T) ((= 1 3) T))"; assertSExpressionsMatch(parseString("nil"), evaluateString(input)); } @Test(expected = BadArgumentTypeException.class) public void condWithNilArgument_ThrowsException() { evaluateString("(cond ())"); } @Test(expected = BadArgumentTypeException.class) public void condWithNonListArgument_ThrowsException() { evaluateString("(cond o)"); } @Test(expected = DottedArgumentListException.class) public void condWithDottedArgumentList_ThrowsException() { evaluateString("(apply 'cond (cons '(nil T) 'b))"); } }