1 6 package tests.jfun.parsec; 7 8 import jfun.parsec.*; 13 import junit.framework.Test; 14 import junit.framework.TestCase; 15 import junit.framework.TestSuite; 16 import jfun.parsec.FromLong; 17 import jfun.parsec.OperatorTable; 18 import jfun.parsec.Expressions; 19 20 25 26 public final class ParserTestCase extends TestCase { 27 private static Object parse(final String src, final Parser lexer, 28 final Parser p){ 29 return Parsers.runParser(src, Parsers.parseTokens(lexer, p, "TestParser"), 30 new DefaultPositionMap(src, 1, 1), "TestParser"); 31 } 32 private static void testGood(final String str, final long v){ 33 final Parser p = getParser(); 34 final Object r = parse(str, lexer1(), p); 35 assertEquals(new Long (v), r); 36 } 37 private static String testBad(final String str){ 38 try{ 39 parse(str, lexer1(), getParser()); 40 throw new IllegalStateException ("should have failed!"); 41 } 42 catch(ParserException e){ 43 return e.getMessage(); 44 } 45 } 46 private static final Terms words = Terms.getOperatorsInstance(new String []{ 47 "+", "-", "*", "/", "(", ")" ,"." 48 }); 49 private static final Parser lazy_expr = Parsers.lazy("lazy_expr", new ParserEval(){ 50 public Parser eval(){ 51 return expr(); 52 } 53 }); 54 private static Parser lexer1(){ 55 return Lexers.lexeme(Scanners.javaDelimiter(), Parsers.plus(Lexers.lexLong(), words.getLexer())); 56 } 57 private static Parser op(final String n, final Map2 m2){ 58 return words.getParser(n).seq(Parsers.retn(m2)); 59 } 60 private static Parser op(final String n, final Map m){ 61 return words.getParser(n).seq(Parsers.retn(m)); 62 } 63 private static final Parser term = Parsers.plus( 64 Parsers.between( 65 words.getParser("("), 66 words.getParser(")"), 67 lazy_expr 68 ), 69 Terms.integerParser(new FromLong(){ 70 public Object fromLong(int from, int len, final long l){ 71 return new Long (l); 72 } 73 }) 74 ); 75 private static final Map negate = new Map(){ 76 public Object map(final Object o){ 77 return new Long (-((Number )o).longValue()); 78 } 79 }; 80 private static final Map2 add = new Map2(){ 81 public Object map(final Object a, final Object b){ 82 final Number l1 = (Number )a; 83 final Number l2 = (Number )b; 84 return new Long (l1.longValue()+l2.longValue()); 85 } 86 }; 87 private static final Map2 sub = new Map2(){ 88 public Object map(final Object a, final Object b){ 89 final Number l1 = (Number )a; 90 final Number l2 = (Number )b; 91 return new Long (l1.longValue()-l2.longValue()); 92 } 93 }; 94 private static final Map2 mul = new Map2(){ 95 public Object map(final Object a, final Object b){ 96 final Number l1 = (Number )a; 97 final Number l2 = (Number )b; 98 return new Long (l1.longValue()*l2.longValue()); 99 } 100 }; 101 private static final Map2 div = new Map2(){ 102 public Object map(final Object a, final Object b){ 103 final Number l1 = (Number )a; 104 final Number l2 = (Number )b; 105 return new Long (l1.longValue()/l2.longValue()); 106 } 107 }; 108 109 110 private static Parser expr(){ 111 final OperatorTable ops = new OperatorTable(); 112 ops.prefix(op("+", Maps.id()), 50) 113 .prefix(op("-", negate), 50) 114 .infixl(op("+", add), 30) 115 .infixl(op("-", sub), 30) 116 .infixl(op("*", mul), 40) 117 .infixl(op("/", div), 40); 118 return Expressions.buildExpressionParser("expr", term, ops); 119 } 120 156 157 public void test1(){ 158 try{ 159 testGood("1 + 2 ...", 3); 160 } 161 catch(ParserException e){ 162 fail(e.getMessage()); 163 } 164 } 165 public void test2(){ 166 try{ 167 testGood("1 + 2 * 3 ..", 7); 168 } 169 catch(ParserException e){ 170 fail(e.getMessage()); 171 } 172 } 173 public void test3(){ 174 try{ 175 testGood("//tesst\n (1 + /*ok*/ 2) * (5-4)", 3); 176 } 177 catch(ParserException e){ 178 fail(e.getMessage()); 179 } 180 } 181 public void test4(){ 182 try{ 183 testGood("//tesst\n (1 + /*ok*/ 2) * ((5/(4)+3))", 12); 184 } 185 catch(ParserException e){ 186 e.printStackTrace(System.err); 187 fail(e.getMessage()); 188 } 189 } 190 public void test5(){ 191 try{ 192 testGood("--1-+-+5 ", 6); 193 } 194 catch(ParserException e){ 195 e.printStackTrace(System.err); 196 fail(e.getMessage()); 197 } 198 } 199 public void testa(){ 200 try{ 201 System.out.println(testBad("1\t2 ")); 202 } 203 catch(ParserException e){ 204 e.printStackTrace(System.err); 205 fail(e.getMessage()); 206 } 207 } 208 public void testb(){ 209 try{ 210 System.out.println(testBad("1.... ")); 211 } 212 catch(ParserException e){ 213 e.printStackTrace(System.err); 214 fail(e.getMessage()); 215 } 216 } 217 private static Parser getParser(){ 218 return expr().followedBy(words.getParser(".").some(3).seq(Parsers.eof())); 219 } 220 221 222 223 public static Test suite(){ 224 return new TestSuite(ParserTestCase.class); 225 } 226 public static void main(String [] args){ 227 junit.textui.TestRunner.run(suite()); 228 } 229 } 230 | Popular Tags |