package nebula.lang; import junit.framework.TestCase; import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.RecognitionException; public class NebulaParser_Expr_JsTest extends TestCase { TypeLoaderForTest typeLoader; @Override protected void setUp() throws Exception { typeLoader = new TypeLoaderForTest(); } private void eqExpr(String exprText, String expectedResult) { try { Expr<?> expr = parse(exprText); JsCompiler compiler = new JsCompiler(){ @Override public void varRefer(Var var) { sb.append(var.name); } }; // expr.scan(new CompilerContext() { // // @Override // public Type resolveType(String name) { // return typeLoader.findType(name); // } // }); expr.compile(compiler); assertEquals(expectedResult, compiler.toString()); } catch (RecognitionException e) { fail(e.toString()); } } private Expr<?> parse(String exprText) throws RecognitionException { NebulaLexer lexer = new NebulaLexer(new ANTLRStringStream(exprText)); CommonTokenStream tokens = new CommonTokenStream(lexer); NebulaParser parser = new NebulaParser(tokens, typeLoader); parser.enterMethod(null); parser.pushLocal("a", (Type) null); parser.pushLocal("b", (Type) null); parser.pushLocal("n", (Type) null); return parser.expression(); } public void testTypeDefinition() { eqExpr("a+b", "(a+b)"); eqExpr("a-b", "(a-b)"); eqExpr("a*b", "(a*b)"); eqExpr("a/b", "(a/b)"); eqExpr("a%b", "(a%b)"); eqExpr("++a", "(++a)"); eqExpr("--a", "(--a)"); // eqExpr("+a","(+a)"); // eqExpr("-a","(-a)"); eqExpr("a+1*b/10-1", "((a+((1*b)/10))-1)"); eqExpr("a>b", "(a>b)"); eqExpr("a==b", "(a==b)"); eqExpr("a<b", "(a<b)"); eqExpr("a>=b", "(a>=b)"); eqExpr("a<=b", "(a<=b)"); eqExpr("a!=b", "(a!=b)"); eqExpr("a&&b", "(a&&b)"); eqExpr("a<b&&b>=a", "((a<b)&&(b>=a))"); eqExpr("a and b", "(a&&b)"); eqExpr("a||b", "(a||b)"); eqExpr("a or b", "(a||b)"); eqExpr("!a", "(!a)"); eqExpr("not a", "(!a)"); eqExpr("not(a)", "(!a)"); eqExpr("not(a==b)", "(!(a==b))"); eqExpr("a>=10&&n==1 or a!=b", "(((a>=10)&&(n==1))||(a!=b))"); try { parse("$Person[12]"); parse("$Person[12,34234,33..33,22..]"); parse("$Person[a==10&&b==2]"); parse("$Person[a==10&&b==2]"); } catch (RecognitionException e) { throw new RuntimeException(e); } // eqExpr("$Person[a==10 && b==2]",""); // } }