blob: 7e7578464aba9607cab258c57db41599dcb4827b [file] [log] [blame]
/**********************************************************************
* This file is part of "Object Teams Development Tooling"-Software
*
* Copyright 2010 Stephan Herrmann
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
* $Id$
*
* Please visit http://www.eclipse.org/objectteams for updates and contact.
*
* Contributors:
* Stephan Herrmann - Initial API and implementation
**********************************************************************/
package org.eclipse.objectteams.otdt.tests.otjld.callinbinding;
import junit.framework.Test;
import org.eclipse.objectteams.otdt.tests.otjld.AbstractOTJLDTest;
public class CallinWithTranslation extends AbstractOTJLDTest {
public CallinWithTranslation(String name) {
super(name);
}
// Static initializer to specify tests subset using TESTS_* static variables
// All specified tests which does not belong to the class are skipped...
static {
// TESTS_NAMES = new String[] { "test0c11_implicitlyInheritingStaticRoleMethod1"};
// TESTS_NUMBERS = new int[] { 1459 };
// TESTS_RANGE = new int[] { 1097, -1 };
}
public static Test suite() {
return buildComparableTestSuite(testClass());
}
public static Class testClass() {
return CallinWithTranslation.class;
}
// a callin binding without signatures lifts its parameter
// 4.4.1-otjld-callin-with-parameter-lifting-1
public void test441_callinWithParameterLifting1() {
runConformTest(
new String[] {
"Team441cwpl1.java",
"\n" +
"public team class Team441cwpl1 {\n" +
" public class R playedBy T441cwpl1 {\n" +
" void aspect (R other) {\n" +
" System.out.print(other.getValue());\n" +
" }\n" +
" String getValue() {\n" +
" return \"K\";\n" +
" }\n" +
" aspect <- after foo;\n" +
" }\n" +
" public Team441cwpl1(T441cwpl1 o1, T441cwpl1 o2) {\n" +
" activate();\n" +
" o1.foo(o2);\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new Team441cwpl1(new T441cwpl1(), new T441cwpl1());\n" +
" }\n" +
"}\n" +
" \n",
"T441cwpl1.java",
"\n" +
"public class T441cwpl1 {\n" +
" void foo(T441cwpl1 other) {\n" +
" System.out.print(\"O\");\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a callin binding with array result lifting
// 4.4.1-otjld-callin-with-result-lifting-2
public void test441_callinWithResultLifting2() {
runConformTest(
new String[] {
"Team441cwrl2.java",
"\n" +
"public team class Team441cwrl2 {\n" +
" public class R playedBy T441cwrl2 {\n" +
" callin R[] aspect() {\n" +
" R[] ra = base.aspect();\n" +
" System.out.print(ra[0].getValue());\n" +
" return ra;\n" +
" }\n" +
" String getValue() {\n" +
" return \"K\";\n" +
" }\n" +
" aspect <- replace foo;\n" +
" }\n" +
" public Team441cwrl2(T441cwrl2 o1, T441cwrl2 o2) {\n" +
" activate();\n" +
" o1.foo();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new Team441cwrl2(new T441cwrl2(), new T441cwrl2());\n" +
" }\n" +
"}\n" +
" \n",
"T441cwrl2.java",
"\n" +
"public class T441cwrl2 {\n" +
" T441cwrl2[] foo() {\n" +
" System.out.print(\"O\");\n" +
" T441cwrl2 b = new T441cwrl2();\n" +
" T441cwrl2[] ba = new T441cwrl2[1];\n" +
" ba[0] = b;\n" +
" return ba;\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a callin binding with array result lifting , base is inner class
// 4.4.1-otjld-callin-with-result-lifting-2i
public void test441_callinWithResultLifting2i() {
runConformTest(
new String[] {
"Team441cwrl2i.java",
"\n" +
"public team class Team441cwrl2i {\n" +
" public class R playedBy T441cwrl2i.Inner {\n" +
" callin R[] aspect() {\n" +
" R[] ra = base.aspect();\n" +
" System.out.print(ra[0].getValue());\n" +
" return ra;\n" +
" }\n" +
" String getValue() {\n" +
" return \"K\";\n" +
" }\n" +
" aspect <- replace foo;\n" +
" }\n" +
" public Team441cwrl2i(T441cwrl2i.Inner o1, T441cwrl2i.Inner o2) {\n" +
" activate();\n" +
" o1.foo();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" T441cwrl2i outer= new T441cwrl2i();\n" +
" new Team441cwrl2i(outer.new Inner(), outer.new Inner());\n" +
" }\n" +
"}\n" +
" \n",
"T441cwrl2i.java",
"\n" +
"public class T441cwrl2i {\n" +
" public class Inner {\n" +
" Inner[] foo() {\n" +
" System.out.print(\"O\");\n" +
" Inner b = new Inner();\n" +
" Inner[] ba = new Inner[1];\n" +
" ba[0] = b;\n" +
" return ba;\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a callin binds an overloaded base method without specifying signatures
// 4.4.2-otjld-ambiguous-callin-binding-1
public void test442_ambiguousCallinBinding1() {
runNegativeTest(
new String[] {
"T442acb1.java",
"\n" +
"public class T442acb1 {\n" +
" void foo() {}\n" +
" void foo(int i) {}\n" +
"}\n" +
" \n",
"Team442acb1.java",
"\n" +
"public team class Team442acb1 {\n" +
" protected class R playedBy T442acb1 {\n" +
" void bar () { }\n" +
" bar <- after foo;\n" +
" }\n" +
"}\n" +
" \n"
},
null);
}
// a callin binds a base method that is overloaded along extends without specifying signatures
// 4.4.2-otjld-ambiguous-callin-binding-2
public void test442_ambiguousCallinBinding2() {
runNegativeTest(
new String[] {
"T442acb2_1.java",
"\n" +
"public class T442acb2_1 {\n" +
" void foo(int i) {}\n" +
"}\n" +
" \n",
"T442acb2_2.java",
"\n" +
"public class T442acb2_2 extends T442acb2_1 {\n" +
" void foo() {}\n" +
"}\n" +
" \n",
"Team442acb2.java",
"\n" +
"public team class Team442acb2 {\n" +
" protected class R playedBy T442acb2_2 {\n" +
" void bar () { }\n" +
" bar <- after foo;\n" +
" }\n" +
"}\n" +
" \n"
},
null);
}
// a role method return a result which is lowered for passing back to the base
// 4.4.3-otjld-callin-with-result-lowering-1
public void test443_callinWithResultLowering1() {
runConformTest(
new String[] {
"T443cwrl1Main.java",
"\n" +
"public class T443cwrl1Main {\n" +
" public static void main (String[] args) {\n" +
" Team443cwrl1 t = new Team443cwrl1();\n" +
" t.test(new T443cwrl1(\"OK\"));\n" +
" }\n" +
"}\n" +
" \n",
"T443cwrl1.java",
"\n" +
"public class T443cwrl1 {\n" +
" private String value;\n" +
" public T443cwrl1(String value) { this.value = value; }\n" +
" public T443cwrl1 getOther() { return null; }\n" +
" public String getValue() { return this.value; }\n" +
"}\n" +
" \n",
"Team443cwrl1.java",
"\n" +
"public team class Team443cwrl1 {\n" +
" R masterR;\n" +
" public class R playedBy T443cwrl1 {\n" +
" callin R getMasterR() {\n" +
" return masterR;\n" +
" }\n" +
" getMasterR <- replace getOther;\n" +
" }\n" +
" public void test (T443cwrl1 as R r) {\n" +
" masterR = r;\n" +
" activate();\n" +
" T443cwrl1 obj = new T443cwrl1(\"NOK\");\n" +
" T443cwrl1 other = obj.getOther();\n" +
" System.out.print(other.getValue());\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// A callin method lifts its arg and passes it (lowered) back to the base call
// 4.4.4-otjld-callin-replace-lifts-arg-1
public void test444_callinReplaceLiftsArg1() {
runConformTest(
new String[] {
"Team444crla1_2.java",
"\n" +
"public team class Team444crla1_2 extends Team444crla1_1 {\n" +
" protected class R1 {\n" +
" grumble <- replace test;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" (new Team444crla1_2()).activate();\n" +
" (new T444crla1_1()).test(new T444crla1_2()); \n" +
" }\n" +
"}\n" +
" \n",
"T444crla1_1.java",
"\n" +
"public class T444crla1_1 {\n" +
" void test(T444crla1_2 b) {\n" +
" b.test();\n" +
" }\n" +
"}\n" +
" \n",
"T444crla1_2.java",
"\n" +
"public class T444crla1_2 {\n" +
" public void test() {\n" +
" System.out.print(\"K\");\n" +
" }\n" +
"} \n" +
" \n",
"Team444crla1_1.java",
"\n" +
"public team class Team444crla1_1 {\n" +
" protected class R0 playedBy T444crla1_2 {}\n" +
" protected class R2 extends R0 {}\n" +
" protected class R1 playedBy T444crla1_1 {\n" +
" callin void grumble(R2 r) {\n" +
" System.out.print(\"O\");\n" +
" base.grumble(r);\n" +
" }\n" +
"\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// A callin method casts its arg and passes it (downcasted) back to the base call
// 4.4.5-otjld-callin-replace-casts-arg-1f
public void test445_callinReplaceCastsArg1f() {
runNegativeTestMatching(
new String[] {
"Team445crca1f.java",
"\n" +
"public team class Team445crca1f {\n" +
" protected class R playedBy T445crca1f {\n" +
" callin void rm(Object o) {\n" +
" System.out.print(\"O\");\n" +
" base.rm(o);\n" +
" }\n" +
" rm <- replace bm;\n" +
" }\n" +
"}\n" +
" \n",
"T445crca1f.java",
"\n" +
"public class T445crca1f {\n" +
" public void bm(String s) {\n" +
" System.out.print(s);\n" +
" }\n" +
"} \n" +
" \n"
},
"4.5(d)");
}
// A callin method casts its arg and passes it (downcasted) back to the base call
// 4.4.5-otjld-callin-replace-casts-arg-1
public void test445_callinReplaceCastsArg1() {
runConformTest(
new String[] {
"Team445crca1.java",
"\n" +
"public team class Team445crca1 {\n" +
" protected class R playedBy T445crca1 {\n" +
" callin <T> void rm(T o) {\n" +
" System.out.print(\"O\");\n" +
" base.rm(o);\n" +
" }\n" +
" rm <- replace bm;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" T445crca1 b = new T445crca1();\n" +
" Team445crca1 t = new Team445crca1();\n" +
" t.activate();\n" +
" b.bm(\"K\");\n" +
" }\n" +
"\n" +
"}\n" +
" \n",
"T445crca1.java",
"\n" +
"public class T445crca1 {\n" +
" public void bm(String s) {\n" +
" System.out.print(s);\n" +
" }\n" +
"} \n" +
" \n"
},
"OK");
}
// a callin method lifts an array of bases (inner class)
// 4.4.6-otjld-callin-array-arg-lifting-1
public void test446_callinArrayArgLifting1() {
runConformTest(
new String[] {
"Team446caal1.java",
"\n" +
"public team class Team446caal1 {\n" +
" protected class R playedBy T446caal1.Inner {\n" +
" callin void printArray(R[] rs) {\n" +
" System.out.print(\"->\");\n" +
" base.printArray(rs);\n" +
" System.out.print(\"<-\");\n" +
" }\n" +
" void printArray(R[] rs) <- replace void printArray(T446caal1.Inner[] is);\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new Team446caal1().activate();\n" +
" new T446caal1().test();\n" +
" }\n" +
"}\n" +
" \n",
"T446caal1.java",
"\n" +
"public class T446caal1 {\n" +
" public class Inner {\n" +
" void printArray(Inner[] inners) {\n" +
" for (Inner i : inners)\n" +
" i.print();\n" +
" }\n" +
" void print() {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
" }\n" +
" void test() {\n" +
" Inner i= new Inner();\n" +
" i.printArray(new Inner[]{i});\n" +
" }\n" +
"}\n" +
" \n"
},
"->OK<-");
}
public void testBug473392() {
runConformTest(
new String[] {
"t1/MyTeam.java",
"package t1;\n" +
"\n" +
"import b1.MyBase;\n" +
"\n" +
"public team class MyTeam {\n" +
" protected team class Mid { \n" +
" \n" +
" protected class R playedBy MyBase {\n" +
" callin void rm1(R r) {\n" +
" System.out.println(\"rm1 \" + r.getClass().getName());\n" +
" base.rm1(r);\n" +
" }\n" +
" callin1: rm1 <- replace id, process;\n" +
" callin R rm2(R r) {\n" +
" System.out.println(\"rm2\");\n" +
" return this;\n" +
" }\n" +
" callin2: rm2 <- replace id\n" +
" base when (false);\n" +
"\n" +
" precedence callin2, callin1;\n" +
" }\n" +
" }\n" +
" \n" +
" public static void main(String[] args) {\n" +
" new MyTeam().new Mid().activate();\n" +
" new MyBase().process(new MyBase());\n" +
" }\n" +
"}\n",
"b1/MyBase.java",
"package b1;\n" +
"\n" +
"public class MyBase {\n" +
" MyBase id(MyBase other) { return this; }\n" +
" public MyBase process(MyBase other) {\n" +
" other = id(other);\n" +
" System.out.println(other.getClass().getName());\n" +
" return null;\n" +
" }\n" +
"}\n"
},
"rm1 t1.MyTeam$__OT__Mid$__OT__R\n" +
"rm1 t1.MyTeam$__OT__Mid$__OT__R\n" +
"b1.MyBase");
}
public void testBug531011_secondary() {
runNegativeTest(
new String[] {
"Main.java",
"public class Main {\n" +
" public static void main(String... args) {\n" +
" new t.Team1().activate();\n" +
" System.out.print(b.Base.<String>m());\n" +
" }\n" +
"}\n",
"b/Base.java",
"package b;\n" +
"public class Base {\n" +
" public static <T> T m() { return null; }\n" +
"}\n",
"t/Team1.java",
"package t;\n" +
"import base b.Base;\n" +
"public team class Team1 {\n" +
" protected class R playedBy Base {\n" +
" R() { base(); }\n" +
" <T> T rm() <- replace T m()\n" +
" with { result -> result }\n" +
" static callin <T> T rm() {\n" +
" return base.rm();\n" +
" }\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in t\\Team1.java (at line 6)\n" +
" <T> T rm() <- replace T m()\n" +
" ^^\n" +
"T cannot be resolved to a type\n" +
"----------\n" +
"2. ERROR in t\\Team1.java (at line 6)\n" +
" <T> T rm() <- replace T m()\n" +
" ^^\n" +
"T cannot be resolved to a type\n" +
"----------\n");
}
}