/** * */ package it.xsemantics.example.fj.tests; import it.xsemantics.example.fj.tests.loader.FJAbstractTests; import it.xsemantics.example.fj.typesystem.fj.validator.FJTypeSystemValidator; import it.xsemantics.example.fj.validation.FJJavaValidator; import it.xsemantics.example.fj.fj.Field; import it.xsemantics.example.fj.fj.Method; import it.xsemantics.example.fj.fj.Program; import it.xsemantics.example.fj.lookup.FjAuxiliaryFunctions; import org.eclipse.xtext.junit.validation.AssertableDiagnostics; import org.eclipse.xtext.junit.validation.ValidatorTester; /** * @author bettini * */ public class FjValidatorTest extends FJAbstractTests { private ValidatorTester<FJJavaValidator> tester; @Override protected void setUp() throws Exception { super.setUp(); FJJavaValidator validator = get(FJJavaValidator.class); tester = new ValidatorTester<FJJavaValidator>(validator, getInjector()); } public void testFieldOk() throws Exception { Program program = getProgramFromString("class A { int i; int j; }"); AssertableDiagnostics validate = tester.validate(program); validate.assertOK(); } public void testFieldDuplicate() throws Exception { Program program = getProgramFromString("class A { int i; int i; }"); Field i = FjAuxiliaryFunctions.selectFields(program.getClasses().get(0)).get(0); AssertableDiagnostics validate = tester.validate(i); validate.assertAny(AssertableDiagnostics .errorCode(FJTypeSystemValidator.CHECK_TYPE_FAILED_FIELD), AssertableDiagnostics .errorMsg("duplicate field in the same class")); } public void testFieldDuplicateInBaseClass() throws Exception { Program program = getProgramFromString("class A { int i; } class B extends A { int i; }"); Field i = FjAuxiliaryFunctions.selectFields(program.getClasses().get(1)).get(0); AssertableDiagnostics validate = tester.validate(i); validate.assertAny(AssertableDiagnostics .errorCode(FJTypeSystemValidator.CHECK_TYPE_FAILED_FIELD), AssertableDiagnostics .errorMsg("duplicate field in base class")); } public void testMethodOk() throws Exception { Program program = getProgramFromString("class A { Object m() {return new A();} }"); Method method = FjAuxiliaryFunctions.selectMethods(program.getClasses().get(0)).get(0); AssertableDiagnostics validate = tester.validate(method); validate.assertOK(); } public void testMethodOk2() throws Exception { Program program = getProgramFromString("class A { Object m() {return this;} }"); Method method = FjAuxiliaryFunctions.selectMethods(program.getClasses().get(0)).get(0); AssertableDiagnostics validate = tester.validate(method); validate.assertOK(); } public void testMethodOk3() throws Exception { Program program = getProgramFromString("class A { Object i; Object m() {return this.i;} }"); Method method = FjAuxiliaryFunctions.selectMethods(program.getClasses().get(0)).get(0); AssertableDiagnostics validate = tester.validate(method); validate.assertOK(); } public void testMethodDuplicate() throws Exception { Program program = getProgramFromString("class A { int n(Object s) {return 1;} String n() {return 'foo';} } "); AssertableDiagnostics validate = tester.validate(program); validate.assertAny( AssertableDiagnostics.error(0, "TMethodOk"), AssertableDiagnostics .errorCode(FJTypeSystemValidator.CHECK_TYPE_FAILED_METHOD), AssertableDiagnostics .errorMsg("duplicate method in the same class")); } public void testMainOk() throws Exception { Program program = getProgramFromString("class A { int i; int m() {return this.i;} } new A(10).m()"); AssertableDiagnostics validate = tester.validate(program); validate.assertOK(); } public void testMainWrongThis() throws Exception { Program program = getProgramFromString("this"); AssertableDiagnostics validate = tester.validate(program); System.out.println(validate); validate.assertAny( AssertableDiagnostics .errorMsg("main expression This 'this' is not welltyped")); } }