package nebula.lang;
import java.util.List;
import junit.framework.TestCase;
import nebula.data.Entity;
import nebula.data.impl.EditableEntity;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;
public class NebulaParser_Expr_JsCallTest extends TestCase {
RuntimeContext context = new RuntimeContext() {
};
TypeLoaderForTest compiler;
Entity data = new EditableEntity();
TypeImp type;
long Age = 10;
@Override
protected void setUp() throws Exception {
compiler = new TypeLoaderForTest();
}
private String compute(Code expr, Entity entity) {
JsCallCompiler complier = new JsCallCompiler("this", "$scope.$parent.data");
expr.scan(new CompilerContext() {
@Override
public Type resolveType(String name) {
return compiler.findType(name);
}
});
return complier.compile( "data.Age", expr);
}
private void eqValue(Object result, String exprText) {
try {
assertEquals(result, compute(parse(exprText), data));
} catch (RecognitionException e) {
fail(e.toString());
}
}
private Statement 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.statement();
}
public void test_expr_ComputeBackend__this_Name() throws Exception {
//@formatter:off
String text = "" +
"@MaxLength(120)\n" +
"type Person { \n" +
" Name;" +
" @ComputeBackend TestName Name = this.Name;" +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("Person", type.name);
assertEquals("Master", type.superType.getName());
assertEquals(TypeStandalone.Master, type.standalone);
int index=0;
assertEquals("Name", type.fields.get(index).name);
index++;
assertEquals("TestName", type.fields.get(index).name);
index++;
assertEquals(index, type.fields.size());
List<Field> fields = type.getFields();
StringBuilder sb = new StringBuilder();
String ctrlName = type.getName() + "_OnChangeCtrl";
sb.append("<script>function " + ctrlName + "($scope){var doCall = function( $scope ){");
for (int i = 0; i < fields.size(); i++) {
Field field = fields.get(i);
if (field.getOnChangeCode() != null) {
sb.append(JsCallCompiler.compiler("data." + field.getName(), field.getOnChangeCode(), "this", "data"));
}
}
sb.append("};doCall( $scope.$parent );}</script>");
type.getAttrs().put("AjaxExpressionName", ctrlName);
type.getAttrs().put("AjaxExpression", sb.toString());
assertEquals("<script>function Person_OnChangeCtrl($scope){var doCall = function( $scope ){$scope.$watch('data.Name', function(newValue, oldValue) {\nif(newValue){$scope.$ajaxCall({'$getaction' : 'data.Name','data.Name':$scope.data.Name},function($scope,result){$scope.data.TestName=result.TestName;});}\n});};doCall( $scope.$parent );}</script>", type.getAttrs().get("AjaxExpression").toString());
}
public void test_expr_ComputeBackend__repos_Age_Age2() throws Exception {
//@formatter:off
String text = "" +
"@MaxLength(120)\n" +
"type Person { \n" +
" Name;" +
" Age;" +
" Age2 Age;" +
" AgeDerived Age := this.Age + $Person[0].Age;" +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("Person", type.name);
assertEquals("Master", type.superType.getName());
assertEquals(TypeStandalone.Master, type.standalone);
int index=0;
assertEquals("Name", type.fields.get(index).name);
index++;
assertEquals("Age", type.fields.get(index).name);
index++;
assertEquals("Age2", type.fields.get(index).name);
index++;
assertEquals("AgeDerived", type.fields.get(index).name);
index++;
assertEquals(index, type.fields.size());
List<Field> fields = type.getFields();
StringBuilder sb = new StringBuilder();
String ctrlName = type.getName() + "_OnChangeCtrl";
sb.append("<script>function " + ctrlName + "($scope){var doCall = function( $scope ){");
for (int i = 0; i < fields.size(); i++) {
Field field = fields.get(i);
if (field.getOnChangeCode() != null) {
sb.append(JsCallCompiler.compiler("data." + field.getName(), field.getOnChangeCode(), "this", "data"));
}
}
sb.append("};doCall( $scope.$parent );}</script>");
type.getAttrs().put("AjaxExpressionName", ctrlName);
type.getAttrs().put("AjaxExpression", sb.toString());
assertEquals("<script>function Person_OnChangeCtrl($scope){var doCall = function( $scope ){$scope.$watch('data.Age', function(newValue, oldValue) {\n" +
"if(newValue){$scope.$ajaxCall({'$getaction' : 'data.Age','data.Age':$scope.data.Age},function($scope,result){$scope.data.AgeDerived=result.AgeDerived;});}\n" +
"});};doCall( $scope.$parent );}</script>", type.getAttrs().get("AjaxExpression").toString());
}
public void test_expr_ComputeBackend__repos_Name() throws Exception {
//@formatter:off
String text = "" +
"@MaxLength(120)\n" +
"type Person { \n" +
" Name;" +
" @ComputeBackend TestName Name := $Person[0].Name;" +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("Person", type.name);
assertEquals("Master", type.superType.getName());
assertEquals(TypeStandalone.Master, type.standalone);
int index=0;
assertEquals("Name", type.fields.get(index).name);
index++;
assertEquals("TestName", type.fields.get(index).name);
index++;
assertEquals(index, type.fields.size());
List<Field> fields = type.getFields();
StringBuilder sb = new StringBuilder();
String ctrlName = type.getName() + "_OnChangeCtrl";
sb.append("<script>function " + ctrlName + "($scope){var doCall = function( $scope ){");
for (int i = 0; i < fields.size(); i++) {
Field field = fields.get(i);
if (field.getOnChangeCode() != null) {
sb.append(JsCallCompiler.compiler("data." + field.getName(), field.getOnChangeCode(), "this", "data"));
}
}
sb.append("};doCall( $scope.$parent );}</script>");
type.getAttrs().put("AjaxExpressionName", ctrlName);
type.getAttrs().put("AjaxExpression", sb.toString());
assertEquals("<script>function Person_OnChangeCtrl($scope){var doCall = function( $scope ){};doCall( $scope.$parent );}</script>", type.getAttrs().get("AjaxExpression"));
}
public void testCompute() {
data.put("Age", Age);
// @formatter:off
eqValue("" +
"$scope.$watch('data.Age', function(newValue, oldValue) {\n" +
"if(newValue){" +
"$scope.$ajaxCall({" +
"'$getaction' : 'data.Age'," +
"'data.Age':$scope.data.Age}," +
"function($scope,result){" +
"$scope.data.AgeDerived=result.AgeDerived;" +
"});" +
"}" +
"\n});",
"this.AgeDerived = this.Age;");
// @formatter:on
}
}