package mulCal.equationParser; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static mulCal.equationParser.Tokenize.readFunction; import static mulCal.equationParser.Tokenize.readNumber; import static mulCal.equationParser.Tokenize.readSpecial; import static mulCal.equationParser.Tokenize.startWithNumber; import static mulCal.equationParser.Tokenize.toTokens; import java.util.List; import mulCal.equationParser.Tokenize.Token; import org.junit.Test; public class TokenizeTest { @Test public void testIsNumber() throws Exception { assertTrue(startWithNumber("0")); assertTrue(startWithNumber("1")); assertTrue(startWithNumber("10")); assertTrue(startWithNumber("01234567890")); assertFalse(startWithNumber("+0")); assertFalse(startWithNumber("+1")); assertFalse(startWithNumber("+10")); assertFalse(startWithNumber("+0001")); assertFalse(startWithNumber("+01234567890")); assertTrue(startWithNumber("-0")); assertTrue(startWithNumber("-1")); assertTrue(startWithNumber("-10")); assertTrue(startWithNumber("-0001")); assertTrue(startWithNumber("-01234567890")); assertFalse(startWithNumber("")); assertFalse(startWithNumber("--1")); assertFalse(startWithNumber("_5")); assertFalse(startWithNumber("asdf")); assertFalse(startWithNumber("a5")); assertFalse(startWithNumber("a5a")); assertFalse(startWithNumber("+a1")); assertFalse(startWithNumber("-a3")); assertTrue(startWithNumber("5a")); assertTrue(startWithNumber("5a5")); assertFalse(startWithNumber("+9a")); assertTrue(startWithNumber("-9a")); assertTrue(startWithNumber("-10+")); assertTrue(startWithNumber("-10.1200")); assertFalse(startWithNumber("+945.00750")); assertTrue(startWithNumber("945.00750")); assertTrue(startWithNumber("0.0")); assertFalse(startWithNumber(".00750")); assertFalse(startWithNumber("+.00750")); assertFalse(startWithNumber("-.7878")); assertFalse(startWithNumber("-")); assertFalse(startWithNumber("+")); assertFalse(startWithNumber(".")); assertTrue(startWithNumber("0.")); // the '.' wont be in the match } @Test public void testReadNumber() throws Exception { assertEquals(readNumber("0"), "0"); assertEquals(readNumber("1"), "1"); assertEquals(readNumber("10"), "10"); assertEquals(readNumber("01234567890"), "01234567890"); assertEquals(readNumber("-0"), "-0"); assertEquals(readNumber("-1"), "-1"); assertEquals(readNumber("-10"), "-10"); assertEquals(readNumber("-0001"), "-0001"); assertEquals(readNumber("-01234567890"), "-01234567890"); assertEquals(readNumber("5a"), "5"); assertEquals(readNumber("5a5"), "5"); assertEquals(readNumber("-9a"), "-9"); assertEquals(readNumber("-10+"), "-10"); assertEquals(readNumber("-10.1200"), "-10.1200"); assertEquals(readNumber("945.00750"), "945.00750"); assertEquals(readNumber("0.0"), "0.0"); assertEquals(readNumber("0."), "0"); } @Test(expected=IllegalStateException.class) public void testReadNumberFail() throws Exception { readNumber("-.7878"); } @Test(expected=IllegalStateException.class) public void testReadNumberFail2() throws Exception { readNumber("+7878"); } @Test public void testReadFunction() throws Exception { assertEquals(readFunction("a"), "a"); assertEquals(readFunction("bc"), "bc"); assertEquals(readFunction("asbc"), "asbc"); assertEquals(readFunction("+"), "+"); assertEquals(readFunction("-"), "-"); assertEquals(readFunction("/"), "/"); assertEquals(readFunction("*"), "*"); assertEquals(readFunction("!"), "!"); assertEquals(readFunction("^"), "^"); assertEquals(readFunction("%"), "%"); assertEquals(readFunction("+-/*!^%"), "+"); assertEquals(readFunction("b-c"), "b"); assertEquals(readFunction("-c"), "-"); } @Test(expected=Exception.class) public void testReadFunctionFail() throws Exception { readFunction("7+"); } @Test(expected=Exception.class) public void testReadFunctionFail2() throws Exception { readFunction("E*"); } @Test public void testReadSpecial() throws Exception { assertEquals(readSpecial("[123 456]789"), "[123 456]"); assertEquals(readSpecial("[asd%!�$1325]!%"), "[asd%!�$1325]"); assertEquals(readSpecial("[one]two]"), "[one]"); assertEquals(readSpecial("[one][two]"), "[one]"); assertEquals(readSpecial("[o[n[e][two]"), "[o[n[e]"); } @Test(expected=IllegalStateException.class) public void testReadSpecialFail() throws Exception { readSpecial("["); } @Test(expected=IllegalStateException.class) public void testReadSpecialFail2() throws Exception { readSpecial("]"); } @Test(expected=IllegalStateException.class) public void testReadSpecialFail3() throws Exception { readSpecial("-[one]"); } @Test public void testToTokens() throws Exception { List<Token> tokens = toTokens(""); assertTrue(tokens.isEmpty()); } @Test public void testToTokens2() throws Exception { List<Token> tokens = toTokens("1"); assertEquals(tokens.size(), 1); assertEquals(tokens.get(0).text, "1"); assertEquals(tokens.get(0).type, Tokenize.TokenType.NUMBER); } @Test public void testToTokens3() throws Exception { List<Token> tokens = toTokens("1+2"); assertEquals(tokens.size(), 3); assertEquals(tokens.get(0).text, "1"); assertEquals(tokens.get(0).type, Tokenize.TokenType.NUMBER); assertEquals(tokens.get(1).text, "+"); assertEquals(tokens.get(1).type, Tokenize.TokenType.OPERATOR); assertEquals(tokens.get(2).text, "2"); assertEquals(tokens.get(2).type, Tokenize.TokenType.NUMBER); } @Test public void testToTokens4() throws Exception { List<Token> tokens = toTokens(")("); assertEquals(tokens.size(), 2); assertEquals(tokens.get(0).text, ")"); assertEquals(tokens.get(0).type, Tokenize.TokenType.CLOSEBRACKET); assertEquals(tokens.get(1).text, "("); assertEquals(tokens.get(1).type, Tokenize.TokenType.OPENBRACKET); } @Test public void testToTokens5() throws Exception { List<Token> tokens = toTokens("( 8 * [+(12) / 96 - 4 hello)] ("); assertEquals(tokens.size(), 5); assertEquals(tokens.get(0).text, "("); assertEquals(tokens.get(0).type, Tokenize.TokenType.OPENBRACKET); assertEquals(tokens.get(1).text, "8"); assertEquals(tokens.get(1).type, Tokenize.TokenType.NUMBER); assertEquals(tokens.get(2).text, "*"); assertEquals(tokens.get(2).type, Tokenize.TokenType.OPERATOR); assertEquals(tokens.get(3).text, "[+(12) / 96 - 4 hello)]"); assertEquals(tokens.get(3).type, Tokenize.TokenType.SPECIAL); assertEquals(tokens.get(4).text, "("); assertEquals(tokens.get(4).type, Tokenize.TokenType.OPENBRACKET); } @Test public void testToTokens6() throws Exception { List<Token> tokens = toTokens("1+B"); assertEquals(tokens.size(), 3); assertEquals(tokens.get(0).text, "1"); assertEquals(tokens.get(0).type, Tokenize.TokenType.NUMBER); assertEquals(tokens.get(1).text, "+"); assertEquals(tokens.get(1).type, Tokenize.TokenType.OPERATOR); assertEquals(tokens.get(2).text, "B"); assertEquals(tokens.get(2).type, Tokenize.TokenType.VARIABLE); } @Test public void testToTokens7() throws Exception { List<Token> tokens = toTokens("4 / sin cos X"); assertEquals(tokens.size(), 5); assertEquals(tokens.get(0).text, "4"); assertEquals(tokens.get(0).type, Tokenize.TokenType.NUMBER); assertEquals(tokens.get(1).text, "/"); assertEquals(tokens.get(1).type, Tokenize.TokenType.OPERATOR); assertEquals(tokens.get(2).text, "sin"); assertEquals(tokens.get(2).type, Tokenize.TokenType.FUNCTION); assertEquals(tokens.get(3).text, "cos"); assertEquals(tokens.get(3).type, Tokenize.TokenType.FUNCTION); assertEquals(tokens.get(4).text, "X"); assertEquals(tokens.get(4).type, Tokenize.TokenType.VARIABLE); } public boolean containsFunction(List<Token> tokens) { for (Token token : tokens) { if (token.type == Tokenize.TokenType.FUNCTION) { return true; } } return false; } @Test public void testNextIsFunction() throws Exception { assertTrue(containsFunction(toTokens("1 + sin x"))); assertTrue(containsFunction(toTokens("1 + sin (x + y)"))); assertTrue(containsFunction(toTokens("sin x"))); assertTrue(containsFunction(toTokens("- 4"))); assertTrue(containsFunction(toTokens("-(5+2)"))); assertTrue(containsFunction(toTokens("sin sin x"))); assertTrue(containsFunction(toTokens("1 + sin sin x"))); assertTrue(containsFunction(toTokens("1 + (sin x)"))); assertFalse(containsFunction(toTokens("-4"))); assertFalse(containsFunction(toTokens("1+1"))); assertFalse(containsFunction(toTokens("A+B"))); assertFalse(containsFunction(toTokens("A + B * C"))); assertFalse(containsFunction(toTokens("(1) + (2)"))); assertTrue(containsFunction(toTokens("(1 - - -4)"))); // a binary operators, unary functions, and negative number assertTrue(containsFunction(toTokens("(1 +--- -4)"))); // a mess (with proper syntax) } }