package testAux;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import coreVisitors.From;
import coreVisitors.FromInClass;
import facade.Parser;
import ast.Ast.Path;
import ast.ExpCore.ClassB;
import sugarVisitors.Desugar;
import sugarVisitors.InjectionOnCore;
import ast.ExpCore;
public class TestFrom {
@RunWith(Parameterized.class)
public static class Test1 {
@Parameter(0) public String p1;
@Parameter(1) public String p2;
@Parameter(2) public String pr;
@Parameterized.Parameters
public static List<Object[]> createData() {
return Arrays.asList(new Object[][] {
{"This1.C", "This0.C","This0.C"
},{"This1.Foo.Bar", "This3.Beer.Baz","This3.Beer.Foo.Bar"
},{"This1.A.B", "This40.C.D","This40.C.A.B"
},{"This10.A.B", "This3.C.D","This11.A.B"
},{"This2.A.B", "This2.C.D","This2.A.B"
},{"This0.A.B.C.D.E", "This0.A1.B1.C2.D1","This0.A1.B1.C2.D1.A.B.C.D.E"
},{"This0.A.B.C.D.E", "This1.A1.B1.C2.D1","This1.A1.B1.C2.D1.A.B.C.D.E"
},{"This0.A.B.C.D.E", "This2.A1.B1.C2.D1","This2.A1.B1.C2.D1.A.B.C.D.E"
},{"This1.A.B.C.D.E", "This0.A1.B1.C2.D1","This0.A1.B1.C2.A.B.C.D.E"
},{"This2.A.B.C.D.E", "This0.A1.B1.C2.D1","This0.A1.B1.A.B.C.D.E"
},{"This3.A.B.C.D.E", "This0.A1.B1.C2.D1","This0.A1.A.B.C.D.E"
},{"This3.A.B.C.D.E", "This1.A1.B1.C2.D1","This1.A1.A.B.C.D.E"
},{"This3.A.B.C.D.E", "This2.A1.B1.C2.D1","This2.A1.A.B.C.D.E"
},{"This0", "This1","This1"
},{"This2.B","This1.C.A","This1.B"
}});}
@Test
public void testFromP() {
Path pp1=Path.parse(p1);
Path pp2=Path.parse(p2);
Path ppr=Path.parse(pr);
Assert.assertEquals(From.fromP(pp1, pp2),ppr);
}
}
@RunWith(Parameterized.class)
public static class Test2 {
@Parameter(0) public String e1;
@Parameter(1) public String path;
@Parameter(2) public String er;
@Parameterized.Parameters
public static List<Object[]> createData() {
return Arrays.asList(new Object[][] {
{"{ method () (This3.A.m())}", "This2.B","{ method () (This4.A.m())}"
},{"{ C:{ method () (This3.A.m())}}",
"This2.B",
"{ C:{ method () (This4.A.m())}}"
},{"{ C:{ method () (This1.A.m())}}", "This2.B","{ C:{ method () (This1.A.m())}}"
},{"{ C:{ method () (This1.A.m())}}", "This20.B","{ C:{ method () (This1.A.m())}}"
},{"{ C:{ method () (This1.A.m())}}", "This0.B","{ C:{ method () (This1.A.m())}}"
},{"{interface method Void m()^## This10}","This1","{interface method Void m()^## This11}"
},{"{interface method Void m()^## This0}","This1","{interface method Void m()^## This0}"
//and would be different as members out of a class
},{"{method This2.B #apply() }",
"This1.C.A",
"{method This2.C.B #apply() }"
}});}
@Test
public void testFrom() {
ExpCore ee1=Parser.parse(null,e1).accept(new InjectionOnCore());
ExpCore eer=Parser.parse(null,er).accept(new InjectionOnCore());
Path pp2=Path.parse(path);
Assert.assertEquals(FromInClass.of((ClassB) ee1,pp2),eer);
}
}
@RunWith(Parameterized.class)
public static class Test3 {
@Parameter(0) public String e1;
@Parameter(1) public String path;
@Parameter(2) public String er;
@Parameterized.Parameters
public static List<Object[]> createData() {
return Arrays.asList(new Object[][] {{"{ method Void m() exception Void void}", "This2.B","{ method Void m() exception Void void}"
},{"{method This2.B #apply() }", "This1.C.A","{method This1.B #apply() }"
},{"{ method Void m() This0<{ implements This1 } }",
"This0.C",
"{ method Void m() This0.C <{ implements This1.C } }"
},{"{ method Void m() This0.B<This1.B<This2.B<This0<{ implements This1, This0.A, This1.A,This2.A } }",
"This0.C",//as in D:C.m() C:{ m { implements This1.A,This2.A }}
"{ method Void m() This0.C.B<This0.B<This1.B<This0.C <{ implements This1.C, This0.A, This1.C.A,This1.A } }"
},{"{ method Void m() This0.B<This1.B<This2.B<This0<{ D:{ implements This2, This1.A, This2.A,This3.A } }}",
"This0.C",//as in D:C.m() C:{ m { implements This1.A,This2.A }}
"{ method Void m() This0.C.B<This0.B<This1.B<This0.C <{ D:{ implements This2.C, This1.A, This2.C.A,This2.A } } }"
},{"{ method Void m() This0.B<This1.B<This2.B<This0<{ implements This1, This0.A, This1.A,This2.A } }",
"This1.C",//as in D:This1.C.m() C:{ m { implements This1.A,This2.A }}
"{ method Void m() This1.C.B<This1.B<This2.B<This1.C <{ implements This2.C, This0.A, This2.C.A,This2.A } }"
},{"{ method Void m() This0.B<This1.B<This2.B<This0<{ D:{ implements This2, This1.A, This2.A,This3.A } }}",
"This1.C",//as in D:This1.C.m() C:{ m { implements This1.A,This2.A }}
"{ method Void m() This1.C.B<This1.B<This2.B<This1.C <{ D:{ implements This3.C, This1.A, This3.C.A,This3.A } } }"
}});}
@Test
public void testFromMethod() {
ClassB cb1=(ClassB)Desugar.of(Parser.parse(null,e1)).accept(new InjectionOnCore());
ClassB cb2=(ClassB)Desugar.of(Parser.parse(null,er)).accept(new InjectionOnCore());
Path p=Path.parse(path);
Assert.assertEquals(
cb1.withMs(Collections.singletonList(From.from(cb1.getMs().get(0),p))),
cb2);
}
}
}