package testAux; import static helpers.TestHelper.lineNumber; import java.util.Arrays; import java.util.List; import org.antlr.v4.runtime.misc.ParseCancellationException; 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 org.junit.runners.Parameterized.Parameters; import facade.Parser; import sugarVisitors.Desugar; import sugarVisitors.InjectionOnCore; import ast.ErrorMessage; import ast.ErrorMessage.PreParserError; import ast.Expression; public class TestParseAndDoAst { @RunWith(Parameterized.class) public static class Test1 { @Parameter(0) public int _lineNumber; @Parameter(1) public String s; @Parameters(name = "{index}: line {0}") public static List<Object[]> createData() { return Arrays.asList(new Object[][] { {lineNumber(),"a" },{lineNumber(),"a*b" },{lineNumber(),"a*b+c==d&k+a+b*c>g|e" },{lineNumber(),"a*b+c==d&k+a+b * c >g | , e" },{lineNumber(),"a *b" },{lineNumber(),"a.m()" },{lineNumber(),"a.m(a)" },{lineNumber(),"a.m(a:c)" },{lineNumber(),"a.m(a a:c)" },{lineNumber(),"a.m(//blah\n a a:c)" },{lineNumber(),"a.m(//blah\n)" },{lineNumber(),"a.m(//bla\n a:c,,)" },{lineNumber(),"a//bla\n" },{lineNumber(),"a+b//bla\n" },{lineNumber(),"a()" },{lineNumber(),"a(a)" },{lineNumber(),"a(a:c)" },{lineNumber(),"a(a a:c)" },{lineNumber(),"a(//blah\n a a:c)" },{lineNumber(),"a(//blah\n)" },{lineNumber(),"a(//bla\n a:c,,)" },{lineNumber(),"a[]" },{lineNumber(),"a[a;]" },{lineNumber(),"a[a:c;]" },{lineNumber(),"a[a a:c;]" },{lineNumber(),"a[//blah\n a a:c;]" },{lineNumber(),"a[a a:c;//bleh\n]" },{lineNumber(),"a[//blah\n a a:c;//bleh\n]" },{lineNumber(),"a[//blah\n]" },{lineNumber(),"a[//bla\n a:c,;,]" },{lineNumber()," (a)" },{lineNumber()," (a a)" },{lineNumber()," (a b c)" },{lineNumber()," ( a = b c)" },{lineNumber()," ( C a = b c)" },{lineNumber()," ( C a = b, D b=c c)" },{lineNumber()," ( C.D b=c c)" },{lineNumber()," ( This2.D b=c c)" },{lineNumber()," ( Any b=c c)" },{lineNumber()," ( mut Any b=c c)" },{lineNumber()," ( class Any b=c c)" },{lineNumber()," ( fwd class Any b=c c)" },{lineNumber()," if a (b)" },{lineNumber()," if a (b) else e" },{lineNumber()," while a (b)" },{lineNumber()," error a" },{lineNumber()," exception a" },{lineNumber()," return a" },{lineNumber()," ( a catch error Any x (foo) a)" },{lineNumber()," ( a=e catch error Any x (foo) catch error Bar x fee a)" },{lineNumber()," ( a catch error Any x (foo) b c d a)" },{lineNumber()," ( a catch error Any x (foo) b c catch error Any x (foo) d a)" },{lineNumber()," {a}" },{lineNumber()," {a a}" },{lineNumber()," {a b c}" },{lineNumber()," { a = b c}" },{lineNumber()," { a = b c=d}" },{lineNumber()," { C a = b c}" },{lineNumber()," { C a = b, D b=c c}" },{lineNumber()," { a catch error Any x (foo) a}" },{lineNumber()," { a catch error Any x (foo)}" },{lineNumber()," { a=e catch error Any x (foo) catch error Bar x fee}" },{lineNumber()," { a=e catch error Any x foo catch error Bar x (fee) a}" },{lineNumber()," { a catch error Any x (foo) b c d a}" },{lineNumber()," { a catch error Any x (foo) b c catch error Any x (foo)}" },{lineNumber()," { var C.B a=d catch error Any x (foo) b c d a}" },{lineNumber()," ( A: x+y n)" },{lineNumber()," { var C.B a=d A: x+y n w catch error Any x (foo) b c d a}" },{lineNumber()," {x( A f )}" },{lineNumber()," {x( A f B f2)}" },{lineNumber()," {( A f B f2)}" },{lineNumber()," {}" },{lineNumber()," { }" },{lineNumber()," {()}" },{lineNumber()," {interface}" },{lineNumber()," { implements A.B, C}" },{lineNumber(),"with x (on T y)" },{lineNumber(),"with x (on T y on T case e z)" },{lineNumber(),"with x (on T y default e+e)" },{lineNumber(),"with x y z (on T y)" },{lineNumber(),"with x=a var y=b+c() z=t (on T y)" },{lineNumber(),"with x in a var y in b+c() z=t (on T y)" },{lineNumber(),"with a b c x in a var y in b+c() z=t (on T y)" },{lineNumber(),"with x in a (a+b*c)" },{lineNumber(),"a[with x in a (use[a+b*c])]" },{lineNumber(),"{ method a(b c) {d e f}}" },{lineNumber(),"{ class method T () (e)}" },{lineNumber(),"{ class method T #a(T b) exception C (e)}" },{lineNumber(),"{ class method T #a(T b) exception C ^## C.D (e)}" },{lineNumber(),"{ class method T #a(T b) exception C}" },{lineNumber(),"{ class method T #a(T b) }" },{lineNumber(),"{ class method T #a(T b) ##field}" },{lineNumber(),"{C: e}" },{lineNumber(),"{C: ...}" },{lineNumber(),"use Foo.BAr check time(limit:soFoo) b+a" },{lineNumber(),"use Foo.BAr check time(//bla bla \n limit:soFoo) b+a" },{lineNumber(),"Foo\"bla\"" //},{"(a+b)//bla\n" }});} @Test public void testOk() { //Object o=new ast.ExpCore.Signal(); Parser.parse(null,s); } } @RunWith(Parameterized.class) public static class Test2 { @Parameter(0) public int _lineNumber; @Parameter(1) public String s; @Parameter(2) public String expected; @Parameters(name = "{index}: line {0}") public static List<Object[]> createData() { return Arrays.asList(new Object[][] { {lineNumber(),"a","a" },{lineNumber(),"5N","Expression.Literal(receiver=N, inner=5, isNumber=true)" },{lineNumber(),"5-5N","Expression.Literal(receiver=N, inner=5-5, isNumber=true)" },{lineNumber(),"a-5N","(a-Expression.Literal(receiver=N, inner=5, isNumber=true))" },{lineNumber()," (a (5N) e)","Expression.RoundBlock(doc=, inner=e, contents=[Expression.BlockContent(decs=[Ast.VarDecE(inner=a), Ast.VarDecE(inner=Expression.RoundBlock(doc=, inner=Expression.Literal(receiver=N, inner=5, isNumber=true), contents=[]))], _catch=[])])" },{lineNumber(),"a*b","(a*b)" },{lineNumber(),"a*b*c","((a*b)*c)" },{lineNumber(),"a*b*c*d","(((a*b)*c)*d)" },{lineNumber(),"a**b","(a**b)" },{lineNumber(),"a**b**c","(a**(b**c))" },{lineNumber(),"a**b**c**d","(a**(b**(c**d)))" },{lineNumber(),"a**b**c**d**e","(a**(b**(c**(d**e))))" },{lineNumber(),"a**b**c**d**e**f","(a**(b**(c**(d**(e**f)))))" },{lineNumber(),"a>>b>>c>>d>>e","(a>>(b>>(c>>(d>>e))))" },{lineNumber(),"a>>b>>c>>d>>e>>f","(a>>(b>>(c>>(d>>(e>>f)))))" //},{"a+ b -c","(a)" is this not giving error since it is captured later? how? },{lineNumber(),"a*b < c+d","((a*b)<(c+d))" },{lineNumber()," (a=b c)","Expression.RoundBlock(doc=, inner=c, contents=[Expression.BlockContent(decs=[Ast.VarDecXE(isVar=false, t=Optional.empty, x=a, inner=b)], _catch=[])])" },{lineNumber()," (var a=b c)","Expression.RoundBlock(doc=, inner=c, contents=[Expression.BlockContent(decs=[Ast.VarDecXE(isVar=true, t=Optional.empty, x=a, inner=b)], _catch=[])])" },{lineNumber()," (A::b() a=b c)","Expression.RoundBlock(doc=, inner=c, contents=[Expression.BlockContent(decs=[Ast.VarDecXE(isVar=false, t=Optional[Ast.HistoricType(path=A, selectors=[Ast.MethodSelectorX(ms=b(), x=)], doc=)], x=a, inner=b)], _catch=[])])" },{lineNumber(),"{a(A a)}","Expression.ClassB(doc1=, h=Ast.ConcreteHeader(mdf=Immutable, name=a, fs=[Ast.FieldDec(isVar=false, t=Immutable[A], name=a, doc=)]), fields=[], supertypes=[], ms=[])" },{lineNumber(),"{(A a)}","Expression.ClassB(doc1=, h=Ast.ConcreteHeader(mdf=Immutable, name=, fs=[Ast.FieldDec(isVar=false, t=Immutable[A], name=a, doc=)]), fields=[], supertypes=[], ms=[])" },{lineNumber(),"{ method a(b c) {d e f}}","Expression.ClassB(doc1=, h=Ast.TraitHeader(), fields=[], supertypes=[], ms=[Expression.ClassB.MethodImplemented(doc=, s=a(b,c), inner=Expression.CurlyBlock(doc=, contents=[Expression.BlockContent(decs=[Ast.VarDecE(inner=d), Ast.VarDecE(inner=e), Ast.VarDecE(inner=f)], _catch=[])]))])" },{lineNumber(),"if a (b) else c.h()","Expression.If(cond=a, then=Expression.RoundBlock(doc=, inner=b, contents=[]), _else=Optional[Expression.MCall(receiver=c, name=h, doc=, ps=Ast.Parameters(e=Optional.empty, xs=[], es=[]))])" },{lineNumber(),"Foo\"bla\"","Expression.Literal(receiver=Foo, inner=bla, isNumber=false)" },{lineNumber(),"Foo\" bla \"","Expression.Literal(receiver=Foo, inner= bla , isNumber=false)" },{lineNumber(),"Foo\"\n 'bla\n , \"","Expression.Literal(receiver=Foo, inner=bla\n, isNumber=false)" },{lineNumber(),"Foo\"\n 'bla\n 'ble\n , \"","Expression.Literal(receiver=Foo, inner=bla\nble\n, isNumber=false)" },{lineNumber()," { }","Expression.ClassB(doc1=, h=Ast.TraitHeader(), fields=[], supertypes=[], ms=[])" },{lineNumber()," {()}","Expression.ClassB(doc1=, h=Ast.ConcreteHeader(mdf=Immutable, name=, fs=[]), fields=[], supertypes=[], ms=[])" },{lineNumber()," {mut ()}","Expression.ClassB(doc1=, h=Ast.ConcreteHeader(mdf=Mutable, name=, fs=[]), fields=[], supertypes=[], ms=[])" },{lineNumber()," {//aa\n mut foo()}","Expression.ClassB(doc1=aa\n, h=Ast.ConcreteHeader(mdf=Mutable, name=foo, fs=[]), fields=[], supertypes=[], ms=[])" },{lineNumber()," {interface}","Expression.ClassB(doc1=, h=Ast.InterfaceHeader(), fields=[], supertypes=[], ms=[])" },{lineNumber()," { implements A.B, C}","Expression.ClassB(doc1=, h=Ast.TraitHeader(), fields=[], supertypes=[Immutable[A.B], Immutable[C]], ms=[])" },{lineNumber()," {//foo\n implements A.B, C //bar\n}","Expression.ClassB(doc1=foo\n, h=Ast.TraitHeader(), fields=[], supertypes=[Immutable[A.B], Immutable[C]], ms=[])" },{lineNumber()," {//foo\n implements A.B, C }","Expression.ClassB(doc1=foo\n, h=Ast.TraitHeader(), fields=[], supertypes=[Immutable[A.B], Immutable[C]], ms=[])" },{lineNumber()," { implements A.B, C //bar\n}","Expression.ClassB(doc1=, h=Ast.TraitHeader(), fields=[], supertypes=[Immutable[A.B], Immutable[C]], ms=[])" },{lineNumber(),"{ method Any a()}","Expression.ClassB(doc1=, h=Ast.TraitHeader(), fields=[], supertypes=[], ms=[Expression.ClassB.MethodWithType(doc=, ms=a(), mt=Immutable:->Immutable[Any], inner=Optional.empty)])" },{lineNumber(),"{ method //a\nAny a()}","Expression.ClassB(doc1=, h=Ast.TraitHeader(), fields=[], supertypes=[], ms=[Expression.ClassB.MethodWithType(doc=a\n, ms=a(), mt=Immutable:->Immutable[Any], inner=Optional.empty)])" },{lineNumber(),"{ method Any a()//b\n}","Expression.ClassB(doc1=, h=Ast.TraitHeader(), fields=[], supertypes=[], ms=[Expression.ClassB.MethodWithType(doc=, ms=a(), mt=Immutable:->Immutable[Any], inner=Optional.empty)])" },{lineNumber(),"{ method //a\nAny a()//b\n}","Expression.ClassB(doc1=, h=Ast.TraitHeader(), fields=[], supertypes=[], ms=[Expression.ClassB.MethodWithType(doc=a\n, ms=a(), mt=Immutable:->Immutable[Any], inner=Optional.empty)])" },{lineNumber(),"{ method Any a(T x, C y, B z)}","Expression.ClassB(doc1=, h=Ast.TraitHeader(), fields=[], supertypes=[], ms=[Expression.ClassB.MethodWithType(doc=, ms=a(x,y,z), mt=Immutable:Immutable[T],Immutable[C],Immutable[B]->Immutable[Any], inner=Optional.empty)])" },{lineNumber(),"{ method Any a(T x, C y//foo\n,,,,,,,,,,,,, B z)}","Expression.ClassB(doc1=, h=Ast.TraitHeader(), fields=[], supertypes=[], ms=[Expression.ClassB.MethodWithType(doc=, ms=a(x,y,z), mt=Immutable:Immutable[T],Immutable[C],Immutable[B]->Immutable[Any], inner=Optional.empty)])" },{lineNumber(),"{ (A a //foo\n)}","Expression.ClassB(doc1=, h=Ast.ConcreteHeader(mdf=Immutable, name=, fs=[Ast.FieldDec(isVar=false, t=Immutable[A], name=a, doc=foo\n)]), fields=[], supertypes=[], ms=[])" },{lineNumber()," (a )(b,x:c)","Expression.FCall(receiver=Expression.RoundBlock(doc=, inner=a, contents=[]), doc=, ps=Ast.Parameters(e=Optional[b], xs=[x], es=[c]))" },{lineNumber()," a //bar\n ","Expression.DocE(inner=a, doc=bar\n)" },{lineNumber(),"with x in a var y in b+c() z=t (on T y)","Expression.With(xs=[], is=[Ast.VarDecXE(isVar=false, t=Optional.empty, x=x, inner=a), Ast.VarDecXE(isVar=true, t=Optional.empty, x=y, inner=(b+Expression.FCall(receiver=c, doc=, ps=Ast.Parameters(e=Optional.empty, xs=[], es=[]))))], decs=[Ast.VarDecXE(isVar=false, t=Optional.empty, x=z, inner=t)], ons=[Expression.With.On(ts=[Immutable[T]], inner=y)], defaultE=Optional.empty)" },{lineNumber(),"S\"a//bla\"\n","Expression.Literal(receiver=S, inner=a//bla, isNumber=false)" }});} @Test public void testOkToString() { Expression x = Parser.parse(null,s); //x.accept(new Desugar()).accept(new InjectionOnCore()); Assert.assertEquals(x.toString(), expected); } } @RunWith(Parameterized.class) public static class TestParseFail { @Parameter(0) public String s; @Parameterized.Parameters public static List<Object[]> createData() { return Arrays.asList(new Object[][] { {"a //@bla" },{"a \"ff" },{"a b" },{" ( )" },{" { Void #default##square(that) void }" }});} @Test public void testNotOk() { try{ Expression e1 = Parser.parse(null,s); //String rep=e1.toString(); //Assert.assertEquals(rep+"\n"+s,""); throw new Error(); } catch(ParseCancellationException e){} catch(IllegalArgumentException e){} catch(ErrorMessage.UnclosedParenthesis e){} } } @RunWith(Parameterized.class) public static class TestBalancedPar { @Parameter(0) public String s; @Parameterized.Parameters public static List<Object[]> createData() { return Arrays.asList(new Object[][] { {"a" },{"a \"aa\"" },{"a(b)" },{" ( (a[]))" },{"a /*a*/ " },{"{ class method Library traitUnit() { } } " }});} @Test public void test() { Parser.checkForBalancedParenthesis(s); Expression e1 = Parser.parse(null,s); String rep=e1.toString(); } } @RunWith(Parameterized.class) public static class TestUnBalancedPar { @Parameter(0) public String s; @Parameterized.Parameters public static List<Object[]> createData() { return Arrays.asList(new Object[][] { {"a)" },{"a{{} \"aa\"" },{"a(b" },{" ( a[]))" },{"a( /*a*/ " },{"{ class method Library traitUnit() { } } }" }});} @Test(expected=PreParserError.class) public void test() { Parser.checkForBalancedParenthesis(s); } } }