package is.L42.connected.withSafeOperators;
import static helpers.TestHelper.getClassB;
import static helpers.TestHelper.lineNumber;
import static org.junit.Assert.fail;
import helpers.TestHelper;
import java.util.Arrays;
import java.util.List;
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 platformSpecific.javaTranslation.Resources;
import ast.Ast;
import ast.Ast.MethodSelector;
import ast.Ast.Path;
import ast.Ast.Stage;
import ast.ExpCore.ClassB;
import auxiliaryGrammar.Functions;
import programReduction.Program;
public class TestAbstract{
@RunWith(Parameterized.class)
public static class TestAbstractMeth {//add more test for error cases
//@Parameter(0) public int _lineNumber;
@Parameter(0) public String _cb1;
@Parameter(1) public String _path;
@Parameter(2) public String _ms;
@Parameter(3) public String _expected;
@Parameter(4) public boolean isError;
@Parameterized.Parameters
public static List<Object[]> createData() {
return Arrays.asList(new Object[][] {
{"{B:{ method Void m() void}}","B","m()","{B:{ method Void m()}}",false
},{"{B:{ method Void m(Any x) void}}","B","m(x)","{B:{ method Void m(Any x)}}",false
},{"{ method Void m(Any x) void}","This0","m(x)","{ method Void m(Any x)}",false
},{"{C:{B:{ method Void m(Any x) void}}}","C.B","m(x)","{C:{B:{ method Void m(Any x)}}}",false
},{"{ method Void m()}","This0","m()","{ method Void m()}",false
},{"{B:{ method Void m(Any x) void}}", "C", "m(x)",
"{Kind:{//@stringU\n//MemberUnavailable\n}"+
"Path:{//@.C\n}"+
"Selector:{//@stringU\n//m(x)\n}"+
"InvalidKind:{//@stringU\n//NonExistentPath\n}"+
"IsPrivate:{//@stringU\n//false\n}}",
true
},{"{B:{ method Void m(Any x) void}}", "B", "k()",
"{Kind:{//@stringU\n//MemberUnavailable\n}"+
"Path:{//@.B\n}"+
"Selector:{//@stringU\n//k()\n}"+
"InvalidKind:{//@stringU\n//NonExistentMethod\n}"+
"IsPrivate:{//@stringU\n//false\n}}",
true
},{"{B:{ method Void m(Any x) void}}", "B", "m()",
"{Kind:{//@stringU\n//MemberUnavailable\n}"+
"Path:{//@.B\n}"+
"Selector:{//@stringU\n//m()\n}"+
"InvalidKind:{//@stringU\n//NonExistentMethod\n}"+
"IsPrivate:{//@stringU\n//false\n}}",
true
}});}
@Test public void test() {
ClassB cb1=getClassB(_cb1);
List<Ast.C> path=TestHelper.cs(_path);
MethodSelector ms=MethodSelector.parse(_ms);
assert ms!=null;
ClassB expected=getClassB(_expected);
if(!isError){
//TODO: mettere tests per il caso con un selettore destinazione. In particolare testare interfacce
ClassB res=Abstract.toAbstract(Program.emptyLibraryProgram(),cb1, path, ms,null);
TestHelper.assertEqualExp(expected,res);
}
else{
try{Abstract.toAbstract(Program.emptyLibraryProgram(),cb1, path, ms,null);fail("error expected");}
catch(Resources.Error err){
ClassB res=(ClassB)err.unbox;
TestHelper.assertEqualExp(expected,res);
}
}
}
}
@RunWith(Parameterized.class)
public static class TestMoveMeth {//add more test for error cases
@Parameter(0) public int _lineNumber;
@Parameter(1) public String _cb1;
@Parameter(2) public String _path;
@Parameter(3) public String _ms1;
@Parameter(4) public String _ms2;
@Parameter(5) public String _expected;
@Parameter(6) public boolean isError;
@Parameterized.Parameters
public static List<Object[]> createData() {
return Arrays.asList(new Object[][] {
{lineNumber(),//
"{B:{ method Void m() void}}","B","m()","k()","{B:{ method Void m() method Void k() void}}",false
},{lineNumber(),//
"{B:{ method Void m(Any x) }}","B","m(x)","k(x)","{B:{ method Void m(Any x) method Void k(Any x)}}",false
},{lineNumber(),//
"{ method Void m(Any x) void}","This0","m(x)","k(x)","{ method Void m(Any x) method Void k(Any x) void}",false
},{lineNumber(),//
"{C:{B:{ method Void m(Any x) }}}","C.B","m(x)","k(x)","{C:{B:{ method Void m(Any x) method Void k(Any x)}}}",false
},{
lineNumber(),//
"{ method Void m()}","This0","m()","k(x)",
" {Kind:{//@stringU\n"+
" //MethodClash\n"+
" }Path:{//@.\n"+
" }Left:{//@stringU\n"+
" //method Void m()\n"+
" }Right:{//@stringU\n"+
" //method Void k(Void x)\n"+
" }LeftKind:{//@stringU\n"+
" //AbstractMethod\n"+
" }RightKind:{//@stringU\n"+
" //AbstractMethod\n"+
" }DifferentParameters:{//@stringU\n"+
" //[0]\n"+
" }DifferentReturnType:{//@stringU\n"+
" //false\n"+
" }DifferentThisMdf:{//@stringU\n"+
" //false\n"+
" }IncompatibleException:{//@stringU\n"+
" //false\n"+
"}}"
,true
}});}
@Test public void test() {
TestHelper.configureForTest();
ClassB cb1=getClassB(_cb1);
List<Ast.C> path=TestHelper.cs(_path);
MethodSelector ms1=MethodSelector.parse(_ms1);
assert ms1!=null;
MethodSelector ms2=MethodSelector.parse(_ms2);
assert ms2!=null;
ClassB expected=getClassB(_expected);
if(!isError){
//TODO: mettere tests per il caso con un selettore destinazione. In particolare testare interfacce
ClassB res=Abstract.toAbstract(Program.emptyLibraryProgram(),cb1, path, ms1,ms2);
TestHelper.assertEqualExp(expected,res);
}
else{
try{Abstract.toAbstract(Program.emptyLibraryProgram(),cb1, path, ms1,ms2);fail("error expected");}
catch(Resources.Error err){
ClassB res=(ClassB)err.unbox;
TestHelper.assertEqualExp(expected,res);
}
}
}
}
@RunWith(Parameterized.class)
public static class TestAbstractClass {//add more test for error cases
@Parameter(0) public int _lineNumber;
@Parameter(1) public String _cb1;
@Parameter(2) public String _path;
@Parameter(3) public String _expected;
@Parameter(4) public boolean isError;
@Parameters(name = "{index}: line {0}")
public static List<Object[]> createData() {
return Arrays.asList(new Object[][] {
{lineNumber(),//
"{B:{ method Void m() void}}","B","{B:{ method Void m()}}",false
},{lineNumber(),//
"{B:{ method //@private\n Void m() void}}","B","{B:{}}",false
},{lineNumber(),//
"{B:{ method Void m(Any x) void}}","B","{B:{ method Void m(Any x)}}",false
},{lineNumber(),//
"{ method Void m(Any x) void}","This0","{ method Void m(Any x)}",false
},{lineNumber(),//
"{B:{ method //@private\n Void m() void method Void n() void}}","B","{B:{ method Void n()}}",false
},{lineNumber(),//
"{ method //@private\n Void m(Any x) void}","This0","{}",false
},{lineNumber(),//
"{C:{B:{ method Void m(Any x) void}}}","C.B","{C:{B:{ method Void m(Any x)}}}",false
},{lineNumber(),//
"{C:{B:{ method //@private\n Void m(Any x) void}}}","C.B","{C:{B:{}}}",false
},{lineNumber(),//
"{C:{B:{ method Void m(Any x) void method //@private\nVoid foo() void }}}",
"C.B",
"{C:{B:{ method Void m(Any x)}}}",
false
},{lineNumber(),//
"{B:{interface method Void m()}}","B","{B:{interface method Void m()}}",false
},{lineNumber(),//
"{B:{interface method Void m() void}}","B","{B:{interface method Void m()}}",false
},{lineNumber(),//
"{C:{B:{ A://@private\n{} }}}","C","{C:{B:{}}}",false
},{lineNumber(),//
"{C:{B:{ A://@private\n{} }}}","C.B","{C:{B:{}}}",false
},{lineNumber(),//
"{C:{B://@private\n{}}}","C","{C:{}}",false
},{lineNumber(),//
"{C:{B://@private\n{} D:{}}}","C","{C:{D:{}}}",false
},{lineNumber(),//
"{C:{B://@private\n{} D:{E://@private\n{} }}}","C.D","{C:{B://@private\n{} D:{}}}",false
},{lineNumber(),//
"{C:{ method //@private\n Void m() void D:{E://@private\n{} }}}",
"C.D",
"{C:{ method //@private\n Void m() void D:{}}}",
false
},{lineNumber(),//
"{C:{ method //@private\n Void m() void D:{method //@private\n Void m() void}}}",
"C.D",
"{C:{ method //@private\n Void m() void D:{}}}",
false
},{lineNumber(),//
"{C:{ method Void m() D.m() D:{ class method Void m() void}}}",
"C.D",
"{C:{ method Void m() D.m() D:{ class method Void m() }}}",
false
},{lineNumber(),//
"{C:{ method Void m() A.D.m() A:{D:{ class method Void m() void}}}}",
"C.A.D",
"{C:{ method Void m() A.D.m() A:{D:{ class method Void m() }}}}",
false
},{lineNumber(),//
"{C:{ method Void m() A.D.m()} A:{D:{ class method Void m() void class method//@private\n Void k() void}}}",
"A.D",
"{C:{ method Void m() A.D.m()} A:{D:{ class method Void m() }}}",
false
},{lineNumber(),//
"{C:{ B://@private\n{}}}","C.B",
"{Kind:{//@stringU\n//MemberUnavailable\n}"+
"Path:{//@.C.B\n}"+
"Selector:{//@stringU\n//\n}"+
"InvalidKind:{//@stringU\n//PrivatePath\n}"+
"IsPrivate:{//@stringU\n//true\n}}",
true
},{lineNumber(),//
"{C:{}}","C.B",
"{Kind:{//@stringU\n//MemberUnavailable\n}"+
"Path:{//@.C.B\n}"+
"Selector:{//@stringU\n//\n}"+
"InvalidKind:{//@stringU\n//NonExistentPath\n}"+
"IsPrivate:{//@stringU\n//false\n}}",
true
},{lineNumber(),//
"{C:{}}","B",
"{Kind:{//@stringU\n//MemberUnavailable\n}"+
"Path:{//@.B\n}"+
"Selector:{//@stringU\n//\n}"+
"InvalidKind:{//@stringU\n//NonExistentPath\n}"+
"IsPrivate:{//@stringU\n//false\n}}",
true
},{lineNumber(),//
"{C:{B:{ method Void m(Any x) void method //@private\nVoid foo() void } D:{ method Void bar() B.foo() }}}",
"C.B",
"{Kind:{//@stringU\n//PrivacyCoupuled\n}"+
"CoupuledPath:{//@stringU\n//[]\n}"+
"CoupuledMethods:{//@stringU\n//"
//+ "[This2.C.B.foo()]\n}}",the user or the used??
+"[This0.C.D::bar()]\n}}",
true
},{lineNumber(),//
"{C:{B://@private\n{} D:{ method B bar() void }}}",
"C",
"{Kind:{//@stringU\n//PrivacyCoupuled\n}"+
"CoupuledPath:{//@stringU\n//[This0.C.B]\n}"+
"CoupuledMethods:{//@stringU\n//[]\n}}",
true
}});}
@Test public void test() {
TestHelper.configureForTest();
ClassB cb1=getClassB(_cb1);
List<Ast.C> path=TestHelper.cs(_path);
ClassB expected=getClassB(_expected);
if(!isError){
ClassB res=Abstract.toAbstract(cb1, path);
TestHelper.assertEqualExp(expected,res);
}
else{
try{Abstract.toAbstract(cb1, path);fail("error expected");}
catch(Resources.Error err){
ClassB res=(ClassB)err.unbox;
TestHelper.assertEqualExp(expected,res);
}
}
}
}
}