1 package tests.jfun.parsec; 2 3 import jfun.parsec.Lexers; 4 import jfun.parsec.Map; 5 import jfun.parsec.Maps; 6 import jfun.parsec.Parser; 7 import jfun.parsec.Parsers; 8 import jfun.parsec.Scanners; 9 import jfun.parsec.Tok; 10 import jfun.parsec.Tokenizer; 11 import jfun.parsec._; 12 import jfun.parsec.pattern.Patterns; 13 import jfun.parsec.tokens.Tokenizers; 14 import junit.framework.TestCase; 15 16 public class SimpleInterpolationTestCase extends TestCase { 17 private static class Var{ 18 private final String name; 19 20 public Var(String name) { 21 this.name = name; 22 } 23 24 public String getName() { 25 return name; 26 } 27 28 @Override 29 public String toString() { 30 return name; 31 } 32 33 @Override 34 public boolean equals(Object obj) { 35 if(obj instanceof Var){ 36 return name.equals(((Var)obj).name); 37 } 38 else return false; 39 } 40 41 } 42 private static Parser<Object []> getParser(){ 43 final Parser<_> fragment = Scanners.isPattern(Patterns.notString("${").many1(), "literal"); 44 final Parser<Object > literal = Lexers.lexer(fragment, Tokenizers.forString()).map(Maps.toToken()); 45 final Parser<Object > word = Lexers.lexer( 46 Scanners.isPattern(Patterns.isWord(), "variable"), 47 new Tokenizer(){ 48 public Object toToken(CharSequence cs, int from, int len) { 49 return new Var(cs.subSequence(from, from+len).toString().trim()); 50 } 51 } 52 ).map(Maps.toToken()); 53 final Parser<Object > var = Parsers.between(Scanners.isString("${"), Scanners.isChar('}'), word); 54 final Parser<Object > element = Parsers.plus(literal, var); 55 return element.many(Object .class); 56 } 57 public void testSimpleString(){ 58 verifyResult("abc", "abc"); 59 } 60 public void testEmptyString(){ 61 verifyResult(""); 62 } 63 public void testOneVariable(){ 64 verifyResult("${var1}", new Var("var1")); 65 } 66 public void testTwoVariables(){ 67 verifyResult("hello ${name}, today is ${today}.", "hello ", new Var("name"), ", today is ", new Var("today"), "."); 68 } 69 private static void verifyResult(String src, Object ... expected){ 70 Object [] result = getParser().parse(src); 71 assertEquals(expected.length, result.length); 72 for(int i=0; i<expected.length; i++){ 73 assertEquals(expected[i], result[i]); 74 } 75 } 76 } 77 | Popular Tags |