package nebula.lang;
import static nebula.lang.Reference.ByVal;
import static nebula.lang.Reference.Cascade;
import static nebula.lang.Reference.Inline;
import java.math.BigDecimal;
import junit.framework.TestCase;
public class NebulaParser_TypeTest extends TestCase {
RuntimeContext context = new RuntimeContext() {
};
TypeLoaderForTest compiler;
@Override
protected void setUp() throws Exception {
compiler = new TypeLoaderForTest(new SystemTypeLoader());
}
final StringBuilder sb = new StringBuilder();
public void test_buildin() throws Exception {
//@formatter:off
String text = "" +
"define FullName extends Name { " +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("FullName", type.name);
assertEquals(TypeStandalone.Basic, type.standalone);
assertEquals(0, type.fields.size());
}
public void test_buildin_extends() throws Exception {
//@formatter:off
String text = "" +
"@MaxLength(120)\n" +
"define Name extends String { \n" +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("Name", type.name);
assertEquals("String", type.superType.getName());
assertEquals(TypeStandalone.Basic, type.standalone);
assertEquals(0, type.fields.size());
assertEquals(new Long("120"), type.attrs.get("MaxLength"));
}
public void test_Transaction_1() throws Exception {
//@formatter:off
String text = "" +
"tx Order { " +
" !ID;" +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("Order", type.name);
assertEquals(TypeStandalone.Transaction, type.standalone);
assertEquals(1, type.fields.size());
assertEquals("ID", type.fields.get(0).name);
}
public void test_type_1() throws Exception {
//@formatter:off
String text = "" +
"type Person { " +
" Name;" +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("Person", type.name);
assertEquals(TypeStandalone.Master, type.standalone);
assertEquals(1, type.fields.size());
assertEquals("Name", type.fields.get(0).name);
}
public void test_type_File_import() throws Exception {
TypeImp type = (TypeImp) compiler.findType("PersonTest");
assertEquals("PersonTest", type.name);
assertEquals(9, type.fields.size());
int i = 0;
assertEquals("Name", type.fields.get(i).name);
i = 7;
assertEquals("Welcome", type.fields.get(i).name);
assertEquals("# this is a <h1> tag\n## this is a <h2> tag\n###### this is a <h6> tag\n",
((String) type.fields.get(i).getExprAsm().eval(context, null, null)).replaceAll("\r\n", "\n"));
i++;
assertEquals("Education", type.fields.get(i).name);
assertEquals("PersonTest$Education", type.fields.get(i).type.getName());
assertEquals(Inline, type.fields.get(i).refer);
assertEquals(true, type.fields.get(i).array);
assertEquals(0, type.fields.get(i).rangeFrom);
assertEquals(5, type.fields.get(i).rangeTo);
}
public void test_type_Person() throws Exception {
TypeImp type = (TypeImp) compiler.findType("Person");
assertEquals("Person", type.name);
assertEquals(9, type.fields.size());
int i = 0;
assertEquals("Name", type.fields.get(i).name);
i = 8;
assertEquals("Education", type.fields.get(i).name);
assertEquals("Person$Education", type.fields.get(i).type.getName());
assertEquals(Inline, type.fields.get(i).refer);
assertEquals(true, type.fields.get(i).array);
assertEquals(0, type.fields.get(i).rangeFrom);
assertEquals(5, type.fields.get(i).rangeTo);
}
public void test_type_Relation() throws Exception {
//@formatter:off
String text = "" +
"rt CompanyPersonMemeber extends Member<Company,Person> { " +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("CompanyPersonMemeber", type.name);
assertEquals(2, type.relations.size());// TODO add relation function
assertEquals(TypeStandalone.Relation, type.standalone);
assertEquals(2, type.getDeclaredFields().size());
int i = 0;
assertEquals("Company", type.getDeclaredFields().get(i++).name);
assertEquals("Person", type.getDeclaredFields().get(i++).name);
i = 0;
assertEquals(true, type.getDeclaredFields().get(i).isCore());
assertEquals("Attach", type.getDeclaredFields().get(i++).attrs.get("Attach"));
assertEquals(true, type.getDeclaredFields().get(i).isCore());
assertEquals("Attach", type.getDeclaredFields().get(i++).attrs.get("Attach"));
assertEquals(5, type.getFields().size());
i = 0;
assertEquals("ID", type.getFields().get(i++).name);
assertEquals("FromDate", type.getFields().get(i++).name);
assertEquals("ToDate", type.getFields().get(i++).name);
assertEquals("Company", type.getFields().get(i++).name);
assertEquals("Person", type.getFields().get(i++).name);
}
public void test_type_PersonCircularDependency() throws Exception {
TypeImp type = (TypeImp) compiler.findType("PersonCircularDependency");
assertEquals("PersonCircularDependency", type.name);
assertEquals(8, type.fields.size());
int i = 0;
assertEquals("Name", type.fields.get(i).name);
i = 1;
assertEquals("CompanyCircularDependency", type.fields.get(i).name);
assertEquals("CompanyCircularDependency", type.fields.get(i).type.getName());
assertEquals("Manager", type.fields.get(i).type.getFields().get(i).name);
assertEquals("PersonCircularDependency", type.fields.get(i).type.getFields().get(i).type.getName());
}
public void test_type_with_importance() throws Exception {
//@formatter:off
String text = "" +
"type Person { \n" +
" !Name;\n" +
" *Sex;\n" +
" #Length;\n" +
" ?Height;\n" +
" Age;\n" +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("Person", type.name);
assertEquals(5, type.fields.size());
int i = 0;
assertEquals("Name", type.fields.get(i).name);
assertEquals(true, type.fields.get(i).isUnique());
assertEquals(true, type.fields.get(i).isKey());
++i;
assertEquals("Sex", type.fields.get(i).name);
assertEquals(true, type.fields.get(i).isCore());
++i;
assertEquals("Length", type.fields.get(i).name);
assertEquals(true, type.fields.get(i).isRequired());
++i;
assertEquals("Height", type.fields.get(i).name);
assertEquals(true, type.fields.get(i).isNullable());
++i;
assertEquals("Age", type.fields.get(i).name);
assertEquals(true, type.fields.get(i).isRequired());
}
public void test_type_inline() throws Exception {
//@formatter:off
String text = "" +
"type Person { \n" +
" !Name Text;\n" +
" Sex;\n" +
" &Length;\n" +
" !%Height;\n" +
" Age;\n" +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("Person", type.name);
assertEquals(5, type.fields.size());
int i = 0;
assertEquals("Name", type.fields.get(i).name);
assertEquals(true, type.fields.get(i).isKey());
assertEquals(true, type.fields.get(i).isUnique());
assertEquals("Text", type.fields.get(i).type.getName());
assertEquals(ByVal, type.fields.get(i).refer);
++i;
assertEquals("Sex", type.fields.get(i).name);
assertEquals(true, type.fields.get(i).isRequired());
assertEquals("Sex", type.fields.get(i).type.getName());
assertEquals(ByVal, type.fields.get(i).refer);
++i;
assertEquals("Length", type.fields.get(i).name);
assertEquals(true, type.fields.get(i).isRequired());
assertEquals(Inline, type.fields.get(i).refer);
++i;
assertEquals("Height", type.fields.get(i).name);
assertEquals(true, type.fields.get(i).isUnique());
assertEquals(Cascade, type.fields.get(i).refer);
++i;
assertEquals("Age", type.fields.get(i).name);
assertEquals(true, type.fields.get(i).isRequired());
assertEquals("Age", type.fields.get(i).type.getName());
}
public void test_type_type() throws Exception {
//@formatter:off
String text = "" +
"type Person { \n" +
" !Name Text;\n" +
" Sex;\n" +
" Length;\n" +
" Height;\n" +
" Age;\n" +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("Person", type.name);
assertEquals(5, type.fields.size());
int i = 0;
assertEquals("Name", type.fields.get(i).name);
assertEquals(true, type.fields.get(i).isKey());
assertEquals(true, type.fields.get(i).isUnique());
assertEquals("Text", type.fields.get(i).type.getName());
++i;
assertEquals("Sex", type.fields.get(i).name);
assertEquals("Sex", type.fields.get(i).type.getName());
++i;
assertEquals("Length", type.fields.get(i).name);
assertEquals("Length", type.fields.get(i).type.getName());
++i;
assertEquals("Height", type.fields.get(i).name);
assertEquals("Height", type.fields.get(i).type.getName());
++i;
assertEquals("Age", type.fields.get(i).name);
assertEquals("Age", type.fields.get(i).type.getName());
}
public void test_type_array() throws Exception {
//@formatter:off
String text = "" +
"type Person { \n" +
" !Name Text;\n" +
" Sex[1..] Text;\n" +
" &Length[];\n" +
" !%Height[1..5];\n" +
" Age[..5];\n" +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("Person", type.name);
assertEquals(5, type.fields.size());
int i = 0;
assertEquals("Name", type.fields.get(i).name);
assertEquals("Text", type.fields.get(i).type.getName());
assertEquals(false, type.fields.get(i).array);
++i;
assertEquals("Sex", type.fields.get(i).name);
assertEquals(1, type.fields.get(i).rangeFrom);
assertEquals(Integer.MAX_VALUE, type.fields.get(i).rangeTo);
assertEquals(true, type.fields.get(i).array);
++i;
assertEquals("Length", type.fields.get(i).name);
assertEquals(Inline, type.fields.get(i).refer);
assertEquals(0, type.fields.get(i).rangeFrom);
assertEquals(Integer.MAX_VALUE, type.fields.get(i).rangeTo);
assertEquals(true, type.fields.get(i).array);
++i;
assertEquals("Height", type.fields.get(i).name);
assertEquals(Cascade, type.fields.get(i).refer);
assertEquals(1, type.fields.get(i).rangeFrom);
assertEquals(5, type.fields.get(i).rangeTo);
assertEquals(true, type.fields.get(i).array);
++i;
assertEquals("Age", type.fields.get(i).name);
assertEquals("Age", type.fields.get(i).type.getName());
assertEquals(0, type.fields.get(i).rangeFrom);
assertEquals(5, type.fields.get(i).rangeTo);
assertEquals(true, type.fields.get(i).array);
}
public void test_type_attr_with_inheritFieldTypeAttrs() throws Exception {
//@formatter:off
String text = "" +
"@Length(1)" +
"@Match(\"dd\")" +
"@Max(3.8)" +
"type Person { \n" +
" Name;" +
" @MaxLength(120)WithCustomAttr Name;" +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("Person", type.name);
assertEquals(2, type.fields.size());
int i = 0;
assertEquals("Name", type.fields.get(i).name);
assertEquals(60L, type.fields.get(i).attrs.get("MaxLength"));
i++;
assertEquals("WithCustomAttr", type.fields.get(i).name);
assertEquals(120L, type.fields.get(i).attrs.get("MaxLength"));
assertEquals(4, type.attrs.size());
assertEquals(1L, type.attrs.get("Length"));
assertEquals("dd", type.attrs.get("Match"));
assertEquals(new BigDecimal("3.8"), type.attrs.get("Max"));
}
public void test_type_attr_Code() throws Exception {
//@formatter:off
String text = "" +
"type Person { \n" +
" Name;" +
" Age;" +
" @DisplayOn(#this.Age>0#)" +
" AgeDefault Age;" +
" @ReqiredOn(#this.Age>10#)" +
" AgeDerived Age;" +
"};";
//@formatter:on
TypeImp type = (TypeImp) compiler.load(text);
assertEquals("Person", type.name);
int i = 0;
assertEquals("Name", type.fields.get(i).name);
i++;
assertEquals("Age", type.fields.get(i).name);
i++;
assertEquals("AgeDefault", type.fields.get(i).name);
assertEquals("(this.Age > 0)", String.valueOf(type.fields.get(i).attrs.get("DisplayOn")));
i++;
assertEquals("AgeDerived", type.fields.get(i).name);
assertEquals("(this.Age > 10)", String.valueOf(type.fields.get(i).attrs.get("ReqiredOn")));
i++;
assertEquals(i, type.fields.size());
// @formatter:off
/*
script: scriptDirective,
ngHide: ngHideDirective,
ngShow: ngShowDirective,
required: requiredDirective,
ngRequired: requiredDirective,
ngValue: ngValueDirective
*/
//@formatter:on
}
}