package nebula.lang; import junit.framework.TestCase; import nebula.data.DataRepos; import nebula.data.DataStore; import nebula.data.Entity; import nebula.data.impl.DefaultDataRepos; import nebula.data.impl.EditableEntity; import nebula.data.impl.TypeDatastore; import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.RecognitionException; public class NebulaParser_Expr_EntityTest extends TestCase { RuntimeContext context = new RuntimeContext() { }; TypeLoaderForTest compiler; Entity data = new EditableEntity(); TypeImp type; DataRepos repos; long Age = 10; @Override protected void setUp() throws Exception { compiler = new TypeLoaderForTest(new SystemTypeLoader()); repos = new DefaultDataRepos(new TypeDatastore(compiler)); } @SuppressWarnings("unchecked") private <T> T compute(Expr<?> expr, Entity entity) { EntityExpressionComplier complier = EntityExpressionComplier.DEFAULT; expr.scan(new CompilerContext() { @Override public Type resolveType(String name) { return compiler.findType(name); } }); return (T) complier.compile(type, "test", expr).eval(context, repos, entity); } private void eqValue(Object result, String exprText) { try { assertEquals(result, compute(parse(exprText), data)); } catch (RecognitionException e) { fail(e.toString()); } } private void eqExpr(String exprText, Object expectedResult) { try { Expr<?> expr = parse(exprText); assertEquals(expectedResult, expr.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, compiler); type = new TypeImp(compiler, "Test"); Field field; field = new Field(type, "Name"); field.type = parser.resolveType("Name"); type.fields.add(field); field = new Field(type, "Age"); field.type = parser.resolveType("Age"); type.fields.add(field); field = new Field(type, "Height"); field.type = parser.resolveType("Age"); type.fields.add(field); parser.typesLoading.put(type.name, type); parser.currentType = type; parser.enterMethod(type); return parser.expression(); } public void testTypeDefinition() { eqExpr("this.Age", "this.Age"); // } public void testCompute() { data.put("Age", Age); eqValue(this.Age, "this.Age"); eqValue(this.Age + 10, "this.Age + 10"); eqValue(this.Age - 10, "this.Age - 10"); eqValue(this.Age * 10, "this.Age * 10"); eqValue(this.Age / 10, "this.Age / 10"); eqValue(this.Age % 10, "this.Age % 10"); this.Age = 10L; data.put("Age", Age); eqValue(this.Age == 10L, "this.Age == 10"); this.Age = 9L; data.put("Age", Age); eqValue(this.Age == 10L, "this.Age == 10"); this.Age = 9L; data.put("Age", Age); eqValue(this.Age >= 10, "this.Age >= 10"); this.Age = 10L; data.put("Age", Age); eqValue(this.Age >= 10, "this.Age >= 10"); this.Age = 11L; data.put("Age", Age); eqValue(this.Age >= 10, "this.Age >= 10"); this.Age = 10; data.put("Age", Age); eqValue(this.Age > 10 && this.Age < 40, "this.Age > 10 && this.Age < 40"); this.Age = 20; data.put("Age", Age); eqValue(this.Age > 10 && this.Age < 40, "this.Age > 10 && this.Age < 40"); this.Age = 30; data.put("Age", Age); eqValue(this.Age > 10 && this.Age < 40, "this.Age > 10 && this.Age < 40"); this.Age = 40; data.put("Age", Age); eqValue(this.Age > 10, "this.Age > 10 "); eqValue(this.Age < 40, " this.Age < 40"); eqValue(this.Age > 10 && this.Age < 40, "this.Age > 10 && this.Age < 40"); eqValue(this.Age > 20 && this.Age <= 40, "this.Age > 20 && this.Age <= 40"); eqValue(this.Age > 40 && this.Age == 30, "this.Age > 40 && this.Age == 30"); eqValue(this.Age > 40 || this.Age == 30, "this.Age > 40 || this.Age == 30"); } public void testComputeWithRepos() { data.put("Age", Age); DataStore<Entity> dataStore = repos.define(String.class, Entity.class, "Person"); EditableEntity person = new EditableEntity(); person.put("Name", "wangshilian1"); person.put("Age", 10L); dataStore.add(person); person = new EditableEntity(); person.put("Name", "wangshilian2"); person.put("Age", 10L); dataStore.add(person); person = new EditableEntity(); person.put("Name", "wangshilian3"); person.put("Age", 10L); dataStore.add(person); dataStore.flush(); eqValue(this.Age+10, "$Person[0].Age + 10"); } }