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, "(", 0),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.CONSTANT, "P", 2),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.RPAREN, ")", 4),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.EOI, "EOI", 5),
lexer.nextToken());
}
@Test
public void testConnectors() {
lexer.setInput(" p AND q");
Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "p", 1),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.CONNECTIVE, "AND", 4),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "q", 8),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.EOI, "EOI", 9),
lexer.nextToken());
}
@Test
public void testFunctions() {
lexer.setInput(" LeftLeg(q)");
Assert.assertEquals(new Token(LogicTokenTypes.FUNCTION, "LeftLeg", 1),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.LPAREN, "(", 8),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "q", 9),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.RPAREN, ")", 10),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.EOI, "EOI", 11),
lexer.nextToken());
}
@Test
public void testPredicate() {
lexer.setInput(" HasColor(r)");
Assert.assertEquals(new Token(LogicTokenTypes.PREDICATE, "HasColor", 1),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.LPAREN, "(", 9),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "r", 10),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.RPAREN, ")", 11),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.EOI, "EOI", 12),
lexer.nextToken());
}
@Test
public void testMultiArgPredicate() {
lexer.setInput(" King(x,y)");
Assert.assertEquals(new Token(LogicTokenTypes.PREDICATE, "King", 1),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.LPAREN, "(", 5),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "x", 6),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.COMMA, ",", 7),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "y", 8),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.RPAREN, ")", 9),
lexer.nextToken());
}
@Test
public void testQuantifier() {
lexer.setInput("FORALL x,y");
Assert.assertEquals(new Token(LogicTokenTypes.QUANTIFIER, "FORALL", 0),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "x", 7),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.COMMA, ",", 8),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.VARIABLE, "y", 9),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.EOI, "EOI", 10),
lexer.nextToken());
}
@Test
public void testTermEquality() {
lexer.setInput("BrotherOf(John) = EnemyOf(Saladin)");
Assert.assertEquals(new Token(LogicTokenTypes.FUNCTION, "BrotherOf", 0),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.LPAREN, "(", 9),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.CONSTANT, "John", 10),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.RPAREN, ")", 14),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.EQUALS, "=", 16),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.FUNCTION, "EnemyOf", 18),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.LPAREN, "(", 25),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.CONSTANT, "Saladin", 26),
lexer.nextToken());
Assert.assertEquals(new Token(LogicTokenTypes.RPAREN, ")", 33),
lexer.nextToken());
}
}