package aima.test.core.unit.logic.fol.parsing; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import aima.core.logic.common.LogicTokenTypes; import aima.core.logic.common.Token; import aima.core.logic.fol.domain.FOLDomain; import aima.core.logic.fol.parsing.FOLLexer; /** * @author Ravi Mohan * */ public class FOLLexerTest { FOLLexer lexer; @Before public void setUp() { FOLDomain domain = new FOLDomain(); domain.addConstant("P"); domain.addConstant("John"); domain.addConstant("Saladin"); domain.addFunction("LeftLeg"); domain.addFunction("BrotherOf"); domain.addFunction("EnemyOf"); domain.addPredicate("HasColor"); domain.addPredicate("King"); lexer = new FOLLexer(domain); } @Test public void testLexBasicExpression() { lexer.setInput("( P )"); Assert.assertEquals(new Token(LogicTokenTypes.LPAREN, "("), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.CONSTANT, "P"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.RPAREN, ")"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.EOI, "EOI"), lexer.nextToken()); } @Test public void testConnectors() { lexer.setInput(" p AND q"); Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "p"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.CONNECTOR, "AND"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "q"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.EOI, "EOI"), lexer.nextToken()); } @Test public void testFunctions() { lexer.setInput(" LeftLeg(q)"); Assert.assertEquals(new Token(LogicTokenTypes.FUNCTION, "LeftLeg"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.LPAREN, "("), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "q"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.RPAREN, ")"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.EOI, "EOI"), lexer.nextToken()); } @Test public void testPredicate() { lexer.setInput(" HasColor(r)"); Assert.assertEquals(new Token(LogicTokenTypes.PREDICATE, "HasColor"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.LPAREN, "("), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "r"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.RPAREN, ")"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.EOI, "EOI"), lexer.nextToken()); } @Test public void testMultiArgPredicate() { lexer.setInput(" King(x,y)"); Assert.assertEquals(new Token(LogicTokenTypes.PREDICATE, "King"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.LPAREN, "("), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "x"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.COMMA, ","), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "y"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.RPAREN, ")"), lexer.nextToken()); } @Test public void testQuantifier() { lexer.setInput("FORALL x,y"); Assert.assertEquals(new Token(LogicTokenTypes.QUANTIFIER, "FORALL"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "x"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.COMMA, ","), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "y"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.EOI, "EOI"), lexer.nextToken()); } @Test public void testTermEquality() { lexer.setInput("BrotherOf(John) = EnemyOf(Saladin)"); Assert.assertEquals(new Token(LogicTokenTypes.FUNCTION, "BrotherOf"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.LPAREN, "("), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.CONSTANT, "John"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.RPAREN, ")"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.EQUALS, "="), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.FUNCTION, "EnemyOf"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.LPAREN, "("), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.CONSTANT, "Saladin"), lexer.nextToken()); Assert.assertEquals(new Token(LogicTokenTypes.RPAREN, ")"), lexer.nextToken()); } }