package aima.test.core.unit.logic.propositional.parsing; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import aima.core.logic.common.LexerException; import aima.core.logic.common.LogicTokenTypes; import aima.core.logic.common.ParserException; import aima.core.logic.propositional.parsing.PLParser; import aima.core.logic.propositional.parsing.ast.Sentence; /** * @author Ravi Mohan * @author Ciaran O'Reilly */ public class PLParserTest { private PLParser parser = null; private Sentence sentence = null; private String expected = null; @Before public void setUp() { parser = new PLParser(); } @Test public void testAtomicSentenceTrueParse() { sentence = parser.parse("true"); expected = prettyPrintF("True"); Assert.assertTrue(sentence.isPropositionSymbol()); Assert.assertEquals(expected, sentence.toString()); sentence = parser.parse("(true)"); expected = prettyPrintF("True"); Assert.assertTrue(sentence.isPropositionSymbol()); Assert.assertEquals(expected, sentence.toString()); sentence = parser.parse("((true))"); expected = prettyPrintF("True"); Assert.assertTrue(sentence.isPropositionSymbol()); Assert.assertEquals(expected, sentence.toString()); } @Test public void testAtomicSentenceFalseParse() { sentence = parser.parse("faLse"); expected = prettyPrintF("False"); Assert.assertTrue(sentence.isPropositionSymbol()); Assert.assertEquals(expected, sentence.toString()); } @Test public void testAtomicSentenceSymbolParse() { sentence = parser.parse("AIMA"); expected = prettyPrintF("AIMA"); Assert.assertTrue(sentence.isPropositionSymbol()); Assert.assertEquals(expected, sentence.toString()); } @Test public void testNotSentenceParse() { sentence = parser.parse("~ AIMA"); expected = prettyPrintF("~AIMA"); Assert.assertTrue(sentence.isNotSentence()); Assert.assertEquals(expected, sentence.toString()); } @Test public void testDoubleNegation() { sentence = parser.parse("~~AIMA"); expected = prettyPrintF("~~AIMA"); Assert.assertTrue(sentence.isNotSentence()); Assert.assertTrue(sentence.getSimplerSentence(0).isNotSentence()); Assert.assertTrue(sentence.getSimplerSentence(0).getSimplerSentence(0).isPropositionSymbol()); Assert.assertEquals(expected, sentence.toString()); } @Test public void testBinarySentenceParse() { sentence = parser.parse("PETER & NORVIG"); expected = prettyPrintF("PETER & NORVIG"); Assert.assertTrue(sentence.isAndSentence()); Assert.assertTrue(sentence.getSimplerSentence(0).isPropositionSymbol()); Assert.assertTrue(sentence.getSimplerSentence(1).isPropositionSymbol()); Assert.assertEquals(expected, sentence.toString()); } @Test public void testComplexSentenceParse() { sentence = parser.parse("(NORVIG | AIMA | LISP) & TRUE"); expected = prettyPrintF("(NORVIG | AIMA | LISP) & True"); Assert.assertTrue(sentence.isAndSentence()); Assert.assertEquals(expected, sentence.toString()); sentence = parser.parse("((NORVIG | AIMA | LISP) & (((LISP => COOL))))"); expected = prettyPrintF("(NORVIG | AIMA | LISP) & (LISP => COOL)"); Assert.assertTrue(sentence.isAndSentence()); Assert.assertEquals(expected, sentence.toString()); sentence = parser.parse("((~ (P & Q )) & ((~ (R & S))))"); expected = prettyPrintF("~(P & Q) & ~(R & S)"); Assert.assertEquals(expected, sentence.toString()); sentence = parser.parse("((P & Q) | (S & T))"); expected = prettyPrintF("P & Q | S & T"); Assert.assertTrue(sentence.isOrSentence()); Assert.assertEquals(expected, sentence.toString()); sentence = parser.parse("(~ ((P & Q) => (S & T)))"); expected = prettyPrintF("~(P & Q => S & T)"); Assert.assertTrue(sentence.isNotSentence()); Assert.assertEquals(expected, sentence.toString()); sentence = parser.parse("(~ (P <=> (S & T)))"); expected = prettyPrintF("~(P <=> S & T)"); Assert.assertTrue(sentence.isNotSentence()); Assert.assertEquals(expected, sentence.toString()); sentence = parser.parse("(P <=> (S & T))"); expected = prettyPrintF("P <=> S & T"); Assert.assertTrue(sentence.isBiconditionalSentence()); Assert.assertEquals(expected, sentence.toString()); sentence = parser.parse("(P => Q)"); expected = prettyPrintF("P => Q"); Assert.assertTrue(sentence.isImplicationSentence()); Assert.assertEquals(expected, sentence.toString()); sentence = parser.parse("((P & Q) => R)"); expected = prettyPrintF("P & Q => R"); Assert.assertTrue(sentence.isImplicationSentence()); Assert.assertEquals(expected, sentence.toString()); } @Test public void testSquareBracketsParse() { // Instead of sentence = parser.parse("[NORVIG | AIMA | LISP] & TRUE"); expected = prettyPrintF("(NORVIG | AIMA | LISP) & True"); Assert.assertEquals(expected, sentence.toString()); // Alternating sentence = parser.parse("[A | B | C] & D & [C | D & (F | G | H & [I | J])]"); expected = prettyPrintF("(A | B | C) & D & (C | D & (F | G | H & (I | J)))"); Assert.assertEquals(expected, sentence.toString()); } @Test public void testParserException() { try { sentence = parser.parse(""); Assert.fail("A Parser Exception should have been thrown."); } catch (ParserException pex) { Assert.assertEquals(0, pex.getProblematicTokens().size()); } try { sentence = parser.parse("A A1.2"); Assert.fail("A Parser Exception should have been thrown."); } catch (ParserException pex) { Assert.assertEquals(0, pex.getProblematicTokens().size()); Assert.assertTrue(pex.getCause() instanceof LexerException); Assert.assertEquals(4, ((LexerException)pex.getCause()).getCurrentPositionInInputExceptionThrown()); } try { sentence = parser.parse("A & & B"); Assert.fail("A Parser Exception should have been thrown."); } catch (ParserException pex) { Assert.assertEquals(1, pex.getProblematicTokens().size()); Assert.assertTrue(pex.getProblematicTokens().get(0).getType() == LogicTokenTypes.CONNECTIVE); Assert.assertEquals(4, pex.getProblematicTokens().get(0).getStartCharPositionInInput()); } try { sentence = parser.parse("A & (B & C &)"); Assert.fail("A Parser Exception should have been thrown."); } catch (ParserException pex) { Assert.assertEquals(1, pex.getProblematicTokens().size()); Assert.assertTrue(pex.getProblematicTokens().get(0).getType() == LogicTokenTypes.CONNECTIVE); Assert.assertEquals(11, pex.getProblematicTokens().get(0).getStartCharPositionInInput()); } } @Test public void testIssue72() { // filter1 AND filter2 AND filter3 AND filter4 sentence = parser.parse("filter1 & filter2 & filter3 & filter4"); expected = prettyPrintF("filter1 & filter2 & filter3 & filter4"); Assert.assertEquals(expected, sentence.toString()); // (filter1 AND filter2) AND (filter3 AND filter4) sentence = parser.parse("(filter1 & filter2) & (filter3 & filter4)"); expected = prettyPrintF("filter1 & filter2 & filter3 & filter4"); Assert.assertEquals(expected, sentence.toString()); // ((filter1 AND filter2) AND (filter3 AND filter4)) sentence = parser.parse("((filter1 & filter2) & (filter3 & filter4))"); expected = prettyPrintF("filter1 & filter2 & filter3 & filter4"); Assert.assertEquals(expected, sentence.toString()); } private String prettyPrintF(String prettyPrintedFormula) { Sentence s = parser.parse(prettyPrintedFormula); Assert.assertEquals("The pretty print formula should parse and print the same.", prettyPrintedFormula, ""+s); return prettyPrintedFormula; } }