package newTypeSystem; import helpers.TestHelper; import static helpers.TestHelper.lineNumber; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; import facade.Configuration; import facade.Parser; import sugarVisitors.Desugar; import sugarVisitors.InjectionOnCore; import ast.Ast.Stage; import ast.ErrorMessage; import ast.ExpCore; import ast.Ast.Path; import ast.ExpCore.ClassB; import ast.ExpCore.ClassB.Phase; import programReduction.Program; public class TestTypeSystemOk { @RunWith(Parameterized.class) public static class TestOk { @Parameter(0) public int _lineNumber; @Parameter(1) public String s1; @Parameter(2) public String s2; @Parameter(3) public String s3; @Parameters(name = "{index}: line {0}") public static List<Object[]> createData() { return Arrays.asList(new Object[][] { {lineNumber(),"This0.C", "{C:{class method Void foo() (This0.foo())} }", "{C:{class method Void foo() (This0.foo())}##star^## }##star^##" },{lineNumber(),"This0.C", "{C:{E:{class method Void foo() (This1.foo())} class method Void foo() (D.foo())} D:{class method Void foo() (C.E.foo())}}", "{C:{class method Void foo() (D.foo()) E:{class method Void foo() (This1.foo())}} D:{class method Void foo() (C.E.foo())}}" },{lineNumber(),"This0.C", "{K:{E:{class method Void foo() (This2.C.foo())}} C:{class method Void foo() (D.foo())} D:{class method Void foo() (K.E.foo())}}", "{K:{E:{class method Void foo() (This2.C.foo())}##star^##}##star ^## C:{class method Void foo() (D.foo())}##star^## D:{class method Void foo() (K.E.foo())}##star^##}##star^##" },{lineNumber(),"This0.C", "{K:{ E:{class method C foo() (C.foo())}} C:{class method C foo() (D.foo())} D:{class method C foo() (K.E.foo())}}", "{K:{ E:{class method C foo() (C.foo())}} C:{class method C foo() (D.foo())} D:{class method C foo() (K.E.foo())}}" //norm//NO, Norm is executed only in the extracted method //},{"This0.C", // "{K:{E:{class method C.foo() foo() (C.foo())}} C:{class method C foo() (D.foo())} D:{class method C foo() (K.E.foo())}}", // "{K:{E:{class method C foo() (C.foo())}##plus^##}##plus ^## C:{class method C foo() (D.foo())}##plus^## D:{class method C foo() (K.E.foo())}##plus^##}##plus^##" //},{"This0.C", // "{K:{E:{class method C.foo().foo() foo() (C.foo())}} C:{class method C foo() (D.foo())} D:{class method C foo() (K.E.foo())}}", // "{K:{E:{class method C foo() (C.foo())}##plus^##}##plus^## C:{class method C foo() (D.foo())}##plus^## D:{class method C foo() (K.E.foo())}##plus^##}##plus^##" },{lineNumber(),"This0.C", "{C:{ method Void foo() (This0 x= this void)} }", "{C:{ method Void foo() (This0 x= this void)}##star^## }##star^##" },{lineNumber(),"This0.C", "{C:{ method Void foo() (C x= this void)} }", "{C:{ method Void foo() (C x= this void)}##star^## }##star^##" }});} @Test() public void testAllSteps() {//s1 unused :( ClassB cb1=runTypeSystem(s2); ClassB cb2=(ClassB)Desugar.of(Parser.parse(null,s3)).accept(new InjectionOnCore()); TestHelper.assertEqualExp(cb1,cb2); } } @RunWith(Parameterized.class) public static class TesFail { @Parameter(0) public String s1; @Parameter(1) public String s2; @Parameterized.Parameters public static List<Object[]> createData() { return Arrays.asList(new Object[][] { {"This0.C", "{C:{class method Void foo() (D.foo())} " +"D:{class method Void bar() (void)}}" },{"This0.C", "{C:{E:{class method Void foo() (This1.foo())} class method Library foo() (D.foo())} D:{class method Void foo() (C.E.foo())}}" },{"This0.C", "{C:{E:{class method Void foo() (This1.foo())} class method Library foo() (D.foo())} D:{class method Void foo() (C.E.foo())}}" },{"This0.C", "{K:{E:{class method Any foo() (This1.foo())}} C:{class method Void foo() (D.foo())} D:{class method Library foo() (K.E.foo())}}" }});} @Test(expected=FormattedError.class) public void testAllSteps() {//s1 unused :( runTypeSystem(s2); //assert false; } } static ClassB runTypeSystem(String scb1) { TestHelper.configureForTest(); ClassB cb1=(ClassB)Desugar.of(Parser.parse(null,scb1)).accept(new InjectionOnCore()); Program p=Program.emptyLibraryProgram(); return TypeSystem.instance().topTypeLib(Phase.Coherent, p.evilPush(cb1)); } }