package compiler.util; import static compiler.util.PEGCompiler.compile; import driver.Context; import grammar.Expression; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.junit.runners.MethodSorters; import static grammar.GrammarDSL.*; import static org.junit.Assert.assertEquals; /** * Test {@link PEGCompiler} and its underlying mechanism in * {@link grammar.java.CallbacksExpression}. */ @RunWith(JUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class PEGCompilerTests { void assertExpr(Expression expected, Expression actual) { assertEquals(Context.get().grammar().clean(expected), actual); } /****************************************************************************/ @Test public void aa_test() { Expression e; e = compile("expression"); assertExpr(ref("expression"), e); e = compile("expression | statement"); assertExpr(choice(ref("expression"), ref("statement")), e); e = compile("expression statement | statement"); assertExpr(choice( seq(ref("expression"), ref("statement")), ref("statement")), e); e = compile("expression statement | statement"); assertExpr(choice( seq(ref("expression"), ref("statement")), seq(ref("statement"))), e); e = compile("expression statement | statement"); assertExpr(choice( seq(ref("expression"), ref("statement")), seq(ref("statement"))), e); e = compile("\"test\"*"); assertExpr(star(str("test"), ref("spacing")), e); e = compile("\"test\"-*"); assertExpr(star(str("test")), e); e = compile("(\"test\")?"); assertExpr(opt(str("test"), ref("spacing")), e); e = compile("_+"); assertExpr(plus(any), e); e = compile("[abc] *+ ^[xyz]"); assertExpr(until(chars("abc"), notChars("xyz")), e); e = compile("[a-c] ++ ^[x-z]"); assertExpr(untilOnce(range('a', 'c'), notRange('x', 'z')), e); e = compile("[a-c] +/ [x-z]"); assertExpr(list(range('x', 'z'), range('a', 'c')), e); e = compile("_* *+ _"); assertExpr(until(star(any), any), e); e = compile("_+ ++ _"); assertExpr(untilOnce(plus(any), any), e); e = compile("_+ +/ _"); assertExpr(list(any, plus(any)), e); e = compile("&expression _*"); assertExpr(seq(and(ref("expression")), star(any)), e); e = compile("!(!expression) *+ _"); assertExpr(until(not(not(ref("expression"))), any), e); e = compile("[a-c] ++ ^[x-z] | \"test\"* expression | !(!expression) *+ _"); assertExpr(choice( untilOnce(range('a', 'c'), notRange('x', 'z')), seq(star(str("test"), ref("spacing")), ref("expression")), until(not(not(ref("expression"))), any) ), e); e = compile("\"\\\"\\n\"-"); assertExpr(str("\"\n"), e); e = compile("[\\\"\\n]"); assertExpr(chars("\"\n"), e); e = compile("[\\]-\\]]"); assertExpr(range(']', ']'), e); // untested (but should work): captures } }