blob: e188e9fe6e788af33019c62767035cee5706aa7c [file] [log] [blame]
/**********************************************************************
* This file is part of "Object Teams Development Tooling"-Software
*
* Copyright 2004, 2010 IT Service Omikron GmbH and others.
*
* 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:
* Thomas Dudziak - Initial API and implementation
* Stephan Herrmann - Initial API and implementation
**********************************************************************/
package org.eclipse.objectteams.otdt.tests.otjld.rolesandteams;
import java.util.Map;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.objectteams.otdt.tests.otjld.AbstractOTJLDTest;
import junit.framework.Test;
@SuppressWarnings("unchecked")
public class AcquisitionAndInheritanceOfRoleClasses extends AbstractOTJLDTest {
public AcquisitionAndInheritanceOfRoleClasses(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[] { "test139_illegalTsuperAccess7" };
// TESTS_NUMBERS = new int[] { 1459 };
// TESTS_RANGE = new int[] { 1097, -1 };
}
public static Test suite() {
return buildComparableTestSuite(testClass());
}
public static Class testClass() {
return AcquisitionAndInheritanceOfRoleClasses.class;
}
// a team accesses a public feature of an unbound role class defined in it
// 1.3.1-otjld-role-feature-access-1
public void test131_roleFeatureAccess1() {
runConformTest(
new String[] {
"T131rfa1Main.java",
"\n" +
"public class T131rfa1Main {\n" +
" public static void main(String[] args) {\n" +
" Team131rfa1 t = new Team131rfa1();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team131rfa1.java",
"\n" +
"public team class Team131rfa1 {\n" +
"\n" +
" public String getValue() {\n" +
" return new Role131rfa1().getValue();\n" +
" }\n" +
"\n" +
" protected class Role131rfa1 {\n" +
" public String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a team accesses a friendly feature of a bound role class defined in it
// 1.3.1-otjld-role-feature-access-2
public void test131_roleFeatureAccess2() {
runConformTest(
new String[] {
"T131rfa2Main.java",
"\n" +
"public class T131rfa2Main {\n" +
" public static void main(String[] args) {\n" +
" Team131rfa2 t = new Team131rfa2();\n" +
" T131rfa2 o = new T131rfa2();\n" +
"\n" +
" System.out.print(t.getValue(o));\n" +
" }\n" +
"}\n" +
" \n",
"T131rfa2.java",
"\n" +
"public class T131rfa2 {\n" +
" public String getValue() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
"}\n" +
" \n",
"Team131rfa2.java",
"\n" +
"public team class Team131rfa2 {\n" +
" public String getValue(T131rfa2 as Role131rfa2 obj) {\n" +
" return obj.getValue();\n" +
" }\n" +
"\n" +
" protected class Role131rfa2 playedBy T131rfa2 {\n" +
" protected abstract String getValue();\n" +
" String getValue() -> String getValue() with {\n" +
" result <- \"OK\"\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a team accesses a protected feature of an unbound role inherited from an indirect super team
// 1.3.1-otjld-role-feature-access-3
public void test131_roleFeatureAccess3() {
runConformTest(
new String[] {
"T131rfa3Main.java",
"\n" +
"public class T131rfa3Main {\n" +
" public static void main(String[] args) {\n" +
" Team131rfa3_3 t = new Team131rfa3_3();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team131rfa3_1.java",
"\n" +
"public team class Team131rfa3_1 {\n" +
" protected class Role131rfa3 {\n" +
" protected String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team131rfa3_2.java",
"\n" +
"public team class Team131rfa3_2 extends Team131rfa3_1 {}\n" +
" \n",
"Team131rfa3_3.java",
"\n" +
"public team class Team131rfa3_3 extends Team131rfa3_2 {\n" +
" public String getValue() {\n" +
" return new Role131rfa3().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a team accesses a static protected feature of a bound role inherited from a direct super team - callout
// 1.3.1-otjld-role-feature-access-4
public void test131_roleFeatureAccess4() {
runConformTest(
new String[] {
"T131rfa4Main.java",
"\n" +
"public class T131rfa4Main {\n" +
" public static void main(String[] args) {\n" +
" Team131rfa4_2 t = new Team131rfa4_2();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"T131rfa4.java",
"\n" +
"public class T131rfa4 {\n" +
" public static String getValue() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
"}\n" +
" \n",
"Team131rfa4_1.java",
"\n" +
"public team class Team131rfa4_1 {\n" +
" protected class Role131rfa4 playedBy T131rfa4 {\n" +
" protected abstract static String getValue();\n" +
" String getValue() -> String getValue() with {\n" +
" result <- \"OK\"\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team131rfa4_2.java",
"\n" +
"public team class Team131rfa4_2 extends Team131rfa4_1 {\n" +
" public String getValue() {\n" +
" return Role131rfa4.getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a team accesses a static protected feature of a bound role inherited from a direct super team - shorthand callout
// 1.3.1-otjld-role-feature-access-4s
public void test131_roleFeatureAccess4s() {
runConformTest(
new String[] {
"T131rfa4sMain.java",
"\n" +
"public class T131rfa4sMain {\n" +
" public static void main(String[] args) {\n" +
" Team131rfa4s_2 t = new Team131rfa4s_2();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"T131rfa4s.java",
"\n" +
"public class T131rfa4s {\n" +
" public static String getValue() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
"}\n" +
" \n",
"Team131rfa4s_1.java",
"\n" +
"public team class Team131rfa4s_1 {\n" +
" protected class Role131rfa4s playedBy T131rfa4s {\n" +
" protected String getValue() -> String getValue() with {\n" +
" result <- \"OK\"\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team131rfa4s_2.java",
"\n" +
"public team class Team131rfa4s_2 extends Team131rfa4s_1 {\n" +
" public String getValue() {\n" +
" return Role131rfa4s.getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a team accesses a static protected feature of a unbound role inherited from a direct super team - regular method
// 1.3.1-otjld-role-feature-access-5
public void test131_roleFeatureAccess5() {
runConformTest(
new String[] {
"T131rfa5Main.java",
"\n" +
"public class T131rfa5Main {\n" +
" public static void main(String[] args) {\n" +
" Team131rfa5_2 t = new Team131rfa5_2();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team131rfa5_1.java",
"\n" +
"public abstract team class Team131rfa5_1 {\n" +
" protected abstract class Role131rfa5_1 {\n" +
" protected static String getValue(Role131rfa5_2 r) {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
" protected abstract class Role131rfa5_2 extends Role131rfa5_1 {}\n" +
"}\n" +
" \n",
"Team131rfa5_2.java",
"\n" +
"public team class Team131rfa5_2 extends Team131rfa5_1 {\n" +
" protected class Role131rfa5_2 {}\n" +
" public String getValue() {\n" +
" return Role131rfa5_1.getValue(new Role131rfa5_2());\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// role feature accessed via function in the team, overridden (challenging weakening
// 1.3.1-otjld-role-feature-access-6
public void test131_roleFeatureAccess6() {
runConformTest(
new String[] {
"Team131rfa6_2.java",
"\n" +
"public team class Team131rfa6_2 extends Team131rfa6_1 {\n" +
" public class R {\n" +
" String val;\n" +
" protected R(String val) { this.val = val; }\n" +
" protected void test() {\n" +
" System.out.print(this.val);\n" +
" }\n" +
" }\n" +
" public R getR() { return new R(\"OK\"); }\n" +
" void test() {\n" +
" getR().test();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new Team131rfa6_2().test();\n" +
" }\n" +
"}\n" +
" \n",
"Team131rfa6_1.java",
"\n" +
"public team class Team131rfa6_1 {\n" +
" public class R {}\n" +
" public R getR() { return new R(); }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class accesses a feature inherited from its implicit super role
// 1.3.2-otjld-role-inherited-feature-access-1
public void test132_roleInheritedFeatureAccess1() {
runConformTest(
new String[] {
"T132rfa1Main.java",
"\n" +
"public class T132rfa1Main {\n" +
" public static void main(String[] args) {\n" +
" Team132rfa1_2 t = new Team132rfa1_2();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team132rfa1_1.java",
"\n" +
"public team class Team132rfa1_1 {\n" +
" public class Role132rfa1 {\n" +
" private String getValueInternal() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team132rfa1_2.java",
"\n" +
"public team class Team132rfa1_2 extends Team132rfa1_1 {\n" +
" public class Role132rfa1 {\n" +
" protected String getValue() {\n" +
" return getValueInternal();\n" +
" }\n" +
" }\n" +
"\n" +
" public String getValue() {\n" +
" return new Role132rfa1().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class accesses an overwritten feature that it indirectly inherited from its implicit super role - default visibility
// 1.3.2-otjld-role-inherited-feature-access-2
public void test132_roleInheritedFeatureAccess2() {
runConformTest(
new String[] {
"T132rfa2Main.java",
"\n" +
"public class T132rfa2Main {\n" +
" public static void main(String[] args) {\n" +
" Team132rfa2_3 t = new Team132rfa2_3();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team132rfa2_1.java",
"\n" +
"public team class Team132rfa2_1 {\n" +
" protected class Role132rfa2 {\n" +
" String getValueInternal() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team132rfa2_2.java",
"\n" +
"public team class Team132rfa2_2 extends Team132rfa2_1 {}\n" +
" \n",
"Team132rfa2_3.java",
"\n" +
"public team class Team132rfa2_3 extends Team132rfa2_2 {\n" +
" protected class Role132rfa2 {\n" +
" String getValueInternal() {\n" +
" return \"OK\";\n" +
" }\n" +
" protected String getValue() {\n" +
" return getValueInternal();\n" +
" }\n" +
" }\n" +
"\n" +
" public String getValue() {\n" +
" return new Role132rfa2().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class accesses an overwritten feature that it indirectly inherited from its implicit super role
// 1.3.2-otjld-role-inherited-feature-access-2a
public void test132_roleInheritedFeatureAccess2a() {
runConformTest(
new String[] {
"T132rfa2aMain.java",
"\n" +
"public class T132rfa2aMain {\n" +
" public static void main(String[] args) {\n" +
" Team132rfa2a_3 t = new Team132rfa2a_3();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team132rfa2a_1.java",
"\n" +
"public team class Team132rfa2a_1 {\n" +
" protected class Role132rfa2a {\n" +
" private String getValueInternal() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team132rfa2a_2.java",
"\n" +
"public team class Team132rfa2a_2 extends Team132rfa2a_1 {}\n" +
" \n",
"Team132rfa2a_3.java",
"\n" +
"public team class Team132rfa2a_3 extends Team132rfa2a_2 {\n" +
" protected class Role132rfa2a {\n" +
" private String getValueInternal() {\n" +
" return \"OK\";\n" +
" }\n" +
" protected String getValue() {\n" +
" return getValueInternal();\n" +
" }\n" +
" }\n" +
"\n" +
" public String getValue() {\n" +
" return new Role132rfa2a().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class accesses an overwritten feature that it indirectly inherited from its implicit super role
// challenge tsuper from private
public void _test132_roleInheritedFeatureAccess2b() {
runConformTest(
new String[] {
"T132rfa2bMain.java",
"\n" +
"public class T132rfa2bMain {\n" +
" public static void main(String[] args) {\n" +
" Team132rfa2b_3 t = new Team132rfa2b_3();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team132rfa2b_1.java",
"\n" +
"public team class Team132rfa2b_1 {\n" +
" protected class Role132rfa2b {\n" +
" private String getValueInternal() {\n" +
" return \"K\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team132rfa2b_2.java",
"\n" +
"public team class Team132rfa2b_2 extends Team132rfa2b_1 {}\n" +
" \n",
"Team132rfa2b_3.java",
"\n" +
"public team class Team132rfa2b_3 extends Team132rfa2b_2 {\n" +
" protected class Role132rfa2b {\n" +
" private String getValueInternal() {\n" +
" return \"O\"+tsuper.getValueInternal();\n" +
" }\n" +
" protected String getValue() {\n" +
" return getValueInternal();\n" +
" }\n" +
" }\n" +
"\n" +
" public String getValue() {\n" +
" return new Role132rfa2b().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class accesses a feature inherited from its direct explicit super role
// 1.3.2-otjld-role-inherited-feature-access-3
public void test132_roleInheritedFeatureAccess3() {
runConformTest(
new String[] {
"T132rfa3Main.java",
"\n" +
"public class T132rfa3Main {\n" +
" public static void main(String[] args) {\n" +
" Team132rfa3_2 t = new Team132rfa3_2();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team132rfa3_1.java",
"\n" +
"public team class Team132rfa3_1 {\n" +
" protected class Role132rfa3_1 {\n" +
" private String getRealValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" protected String getValueInternal() {\n" +
" return getRealValue();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team132rfa3_2.java",
"\n" +
"public team class Team132rfa3_2 extends Team132rfa3_1 {\n" +
" protected class Role132rfa3_2 extends Role132rfa3_1 {\n" +
" protected String getValue() {\n" +
" return getValueInternal();\n" +
" }\n" +
" }\n" +
"\n" +
" public String getValue() {\n" +
" return new Role132rfa3_2().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class accesses an overwritten feature inherited from an indirectly explicit super role
// 1.3.2-otjld-role-inherited-feature-access-4
public void test132_roleInheritedFeatureAccess4() {
runConformTest(
new String[] {
"T132rfa4Main.java",
"\n" +
"public class T132rfa4Main {\n" +
" public static void main(String[] args) {\n" +
" Team132rfa4_3 t = new Team132rfa4_3();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team132rfa4_1.java",
"\n" +
"public team class Team132rfa4_1 {\n" +
" public class Role132rfa4_1 {\n" +
" protected String getValueInternal() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team132rfa4_2.java",
"\n" +
"public team class Team132rfa4_2 extends Team132rfa4_1 {\n" +
" public class Role132rfa4_2 extends Role132rfa4_1 {}\n" +
"}\n" +
" \n",
"Team132rfa4_3.java",
"\n" +
"public team class Team132rfa4_3 extends Team132rfa4_2 {\n" +
" public class Role132rfa4_2 {\n" +
" protected String getValue() {\n" +
" return getValueInternal();\n" +
" }\n" +
" protected String getValueInternal() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"\n" +
" public String getValue() {\n" +
" return new Role132rfa4_2().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// an implicitly inherited role class is not the subtype (as of Java) of its super role
// 1.3.3-otjld-role-not-subtype-of-superrole-1
public void test133_roleNotSubtypeOfSuperrole1() {
runConformTest(
new String[] {
"T133rnsos1Main.java",
"\n" +
"public class T133rnsos1Main {\n" +
" public static void main(String[] args) {\n" +
" final Team133rnsos1_1 t1 = new Team133rnsos1_1();\n" +
" final Team133rnsos1_2 t2 = new Team133rnsos1_2();\n" +
"\n" +
" System.out.print(t2.getRole() instanceof Role133rnsos1<@t1> ? \"NOTOK\" : \"OK\");\n" +
" }\n" +
"}\n" +
" \n",
"Team133rnsos1_1.java",
"\n" +
"public team class Team133rnsos1_1 {\n" +
" public class Role133rnsos1 {}\n" +
"\n" +
" public Role133rnsos1 getRole() {\n" +
" return new Role133rnsos1();\n" +
" }\n" +
"}\n" +
" \n",
"Team133rnsos1_2.java",
"\n" +
"public team class Team133rnsos1_2 extends Team133rnsos1_1 {}\n" +
" \n"
},
"OK");
}
// an implicitly inherited role class is not the subtype (as of Java) of its super role, cast fails
// 1.3.3-otjld-role-not-subtype-of-superrole-1a
public void test133_roleNotSubtypeOfSuperrole1a() {
runConformTest(
new String[] {
"T133rnsos1aMain.java",
"\n" +
"public class T133rnsos1aMain {\n" +
" public static void main(String[] args) {\n" +
" final Team133rnsos1a_1 t1 = new Team133rnsos1a_1();\n" +
" final Team133rnsos1a_2 t2 = new Team133rnsos1a_2();\n" +
"\n" +
" try {\n" +
" Role133rnsos1a<@t1> r = (Role133rnsos1a<@t1>)t2.getRole();\n" +
" System.out.print(\"NOTOK\"+r);\n" +
" } catch (ClassCastException cce) {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team133rnsos1a_1.java",
"\n" +
"public team class Team133rnsos1a_1 {\n" +
" public class Role133rnsos1a {}\n" +
"\n" +
" public Role133rnsos1a getRole() {\n" +
" return new Role133rnsos1a();\n" +
" }\n" +
"}\n" +
" \n",
"Team133rnsos1a_2.java",
"\n" +
"public team class Team133rnsos1a_2 extends Team133rnsos1a_1 {}\n" +
" \n"
},
"OK");
}
// an implicitly inherited role class is not the subtype (as of Java) of its super role -- cast to unqualified role type
// 1.3.3-otjld-role-not-subtype-of-superrole-1c
public void test133_roleNotSubtypeOfSuperrole1c() {
runConformTest(
new String[] {
"Team133rnsos1c_2.java",
"\n" +
"public team class Team133rnsos1c_2 extends Team133rnsos1c_1 {\n" +
" public void test() {\n" +
" final Team133rnsos1c_2 t2 = new Team133rnsos1c_2();\n" +
" try {\n" +
" System.out.print((Role133rnsos1c)t2.getRole());\n" +
" } catch (ClassCastException cce) {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new Team133rnsos1c_2().test();\n" +
" }\n" +
"}\n" +
" \n",
"Team133rnsos1c_1.java",
"\n" +
"public team class Team133rnsos1c_1 {\n" +
" public class Role133rnsos1c {}\n" +
"\n" +
" public Role133rnsos1c getRole() {\n" +
" return new Role133rnsos1c();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// an implicitly inherited role class is not the subtype (as of Java) of its super role -- unqualified role type expands to "tthis.R"
// 1.3.3-otjld-role-not-subtype-of-superrole-1e
public void test133_roleNotSubtypeOfSuperrole1e() {
runConformTest(
new String[] {
"Team133rnsos1e_2.java",
"\n" +
"public team class Team133rnsos1e_2 extends Team133rnsos1e_1 {\n" +
" public void test() {\n" +
" final Team133rnsos1e_2 t2 = new Team133rnsos1e_2();\n" +
"\n" +
" System.out.print(t2.getRole() instanceof Role133rnsos1e ? \"NOTOK\" : \"OK\");\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new Team133rnsos1e_2().test();\n" +
" }\n" +
"}\n" +
" \n",
"Team133rnsos1e_1.java",
"\n" +
"public team class Team133rnsos1e_1 {\n" +
" public class Role133rnsos1e {}\n" +
"\n" +
" public Role133rnsos1e getRole() {\n" +
" return new Role133rnsos1e();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// an implicitly inherited role class is not the subtype (as of Java) of its super role - anchors are fields
// 1.3.3-otjld-role-not-subtype-of-superrole-1f
public void test133_roleNotSubtypeOfSuperrole1f() {
runConformTest(
new String[] {
"T133rnsos1fMain.java",
"\n" +
"public class T133rnsos1fMain {\n" +
" static final Team133rnsos1f_1 t1 = new Team133rnsos1f_1();\n" +
" static final Team133rnsos1f_2 t2 = new Team133rnsos1f_2();\n" +
" public static void main(String[] args) {\n" +
" System.out.print(t2.getRole() instanceof Role133rnsos1f<@t1> ? \"NOTOK\" : \"OK\");\n" +
" }\n" +
"}\n" +
" \n",
"Team133rnsos1f_1.java",
"\n" +
"public team class Team133rnsos1f_1 {\n" +
" public class Role133rnsos1f {}\n" +
"\n" +
" public Role133rnsos1f getRole() {\n" +
" return new Role133rnsos1f();\n" +
" }\n" +
"}\n" +
" \n",
"Team133rnsos1f_2.java",
"\n" +
"public team class Team133rnsos1f_2 extends Team133rnsos1f_1 {}\n" +
" \n"
},
"OK");
}
// a role class is not the subtype (as of Java) of its implicit super role
// 1.3.3-otjld-role-not-subtype-of-superrole-2
public void test133_roleNotSubtypeOfSuperrole2() {
runConformTest(
new String[] {
"T133rnsos2Main.java",
"\n" +
"public class T133rnsos2Main {\n" +
" public static void main(String[] args) {\n" +
" final Team133rnsos2_1 t1 = new Team133rnsos2_1();\n" +
" final Team133rnsos2_2 t2 = new Team133rnsos2_2();\n" +
"\n" +
" System.out.print(t2.getRole() instanceof Role133rnsos2<@t1> ? \"NOTOK\" : \"OK\");\n" +
" final Team133rnsos2_1 t1a = t2;\n" +
" System.out.print(t2.getRole() instanceof Role133rnsos2<@t1a> ? \"OK\" : \"NOTOK\");\n" +
" System.out.print(t1a.getRole() instanceof Role133rnsos2<@t2> ? \"OK\" : \"NOTOK\");\n" +
" }\n" +
"}\n" +
" \n",
"Team133rnsos2_1.java",
"\n" +
"public team class Team133rnsos2_1 {\n" +
" public class Role133rnsos2 {}\n" +
"\n" +
" public Role133rnsos2 getRole() {\n" +
" return new Role133rnsos2();\n" +
" }\n" +
"}\n" +
" \n",
"Team133rnsos2_2.java",
"\n" +
"public team class Team133rnsos2_2 extends Team133rnsos2_1 {\n" +
" public class Role133rnsos2 {}\n" +
"}\n" +
" \n"
},
"OKOKOK");
}
// a role class is a subtype (as of Java) of its explicit super role
// 1.3.3-otjld-role-not-subtype-of-superrole-3
public void test133_roleNotSubtypeOfSuperrole3() {
runConformTest(
new String[] {
"T133rnsos3Main.java",
"\n" +
"public class T133rnsos3Main {\n" +
" public static void main(String[] args) {\n" +
" Team133rnsos3 t = new Team133rnsos3();\n" +
"\n" +
" System.out.print(t.test());\n" +
" }\n" +
"}\n" +
" \n",
"Team133rnsos3.java",
"\n" +
"public team class Team133rnsos3 {\n" +
" public class Role133rnsos3_1 {}\n" +
" public class Role133rnsos3_2 extends Role133rnsos3_1 {}\n" +
"\n" +
" public String test() {\n" +
" Role133rnsos3_2 r = new Role133rnsos3_2();\n" +
"\n" +
" return r instanceof Role133rnsos3_1 ? \"OK\" : \"NOTOK\";\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// within a subteam, an instance of an implicitly inherited role is assigned to a variable of the superteam's role class
// 1.3.4-otjld-subrole-not-assignment-compatible-1
public void test134_subroleNotAssignmentCompatible1() {
runNegativeTestMatching(
new String[] {
"Team134snac1_1.java",
"\n" +
"public team class Team134snac1_1 {\n" +
" public class Role134snac1 {}\n" +
"}\n" +
" \n",
"Team134snac1_2.java",
"\n" +
"public team class Team134snac1_2 extends Team134snac1_1 {\n" +
" public void test() {\n" +
" final Team134snac1_1 t = new Team134snac1_1();\n" +
" Role134snac1<@t> r = new Role134snac1();\n" +
" }\n" +
"}\n" +
" \n"
},
"1.3.1(d)");
}
// within a subteam, an instance of an implicitly inherited role is assigned to a variable of the superteam's role class - role not externalizable
// 1.3.4-otjld-subrole-not-assignment-compatible-1f
public void test134_subroleNotAssignmentCompatible1f() {
runNegativeTestMatching(
new String[] {
"Team134snac1f_1.java",
"\n" +
"public team class Team134snac1f_1 {\n" +
" protected class Role134snac1f {}\n" +
"}\n" +
" \n",
"Team134snac1f_2.java",
"\n" +
"public team class Team134snac1f_2 extends Team134snac1f_1 {\n" +
" public void test() {\n" +
" final Team134snac1f_1 t = new Team134snac1f_1();\n" +
" Role134snac1f<@t> r = new Role134snac1f();\n" +
" }\n" +
"}\n" +
" \n"
},
"1.2.3(b)");
}
// within a subteam, an instance of an implicitly inherited role (that is redefined in the subteam) is assigned to a variable of the superteam's role class
// 1.3.4-otjld-subrole-not-assignment-compatible-2
public void test134_subroleNotAssignmentCompatible2() {
runNegativeTestMatching(
new String[] {
"Team134snac2_1.java",
"\n" +
"public team class Team134snac2_1 {\n" +
" public class Role134snac2 {}\n" +
"}\n" +
" \n",
"Team134snac2_2.java",
"\n" +
"public team class Team134snac2_2 extends Team134snac2_1 {\n" +
" protected class Role134rsnac2 {}\n" +
" public void test() {\n" +
" final Team134snac2_1 t = new Team134snac2_1();\n" +
" Role134snac2<@t> r = new Role134snac2();\n" +
" }\n" +
"}\n" +
" \n"
},
"1.3.1(d)");
}
// a subteam redefines an implicitly inherited role class including one of the role class's features
// 1.3.5-otjld-redefining-role-feature
public void test135_redefiningRoleFeature() {
runConformTest(
new String[] {
"T135rrfMain.java",
"\n" +
"public class T135rrfMain {\n" +
" public static void main(String[] args) {\n" +
" final Team135rrf_2 t = new Team135rrf_2();\n" +
" Role135rrf<@t> r = t.new Role135rrf();\n" +
"\n" +
" System.out.print(r.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team135rrf_1.java",
"\n" +
"public team class Team135rrf_1 {\n" +
" public class Role135rrf {\n" +
" protected String getValue() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team135rrf_2.java",
"\n" +
"public team class Team135rrf_2 extends Team135rrf_1 {\n" +
" public class Role135rrf {\n" +
" public String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a subteam redefines an implicitly inherited role class that is used via an anchored type in a feature of another role of the superteam
// 1.3.6-otjld-redefined-anchored-type-1
public void test136_redefinedAnchoredType1() {
runConformTest(
new String[] {
"T136rat1Main.java",
"\n" +
"public class T136rat1Main {\n" +
" public static void main(String[] args) {\n" +
" Team136rat1_2 t = new Team136rat1_2();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team136rat1_1.java",
"\n" +
"public team class Team136rat1_1 {\n" +
" public class Role136rat1_1 {\n" +
" public String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
" public class Role136rat1_2 {\n" +
" protected String getValue() {\n" +
" final Team136rat1_1 t = new Team136rat1_1();\n" +
" Role136rat1_1<@t> r = t.new Role136rat1_1();\n" +
"\n" +
" return r.getValue();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team136rat1_2.java",
"\n" +
"public team class Team136rat1_2 extends Team136rat1_1 {\n" +
" public class Role136rat1_1 {\n" +
" public String getValue() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
" }\n" +
" protected String getValue() {\n" +
" return new Role136rat1_2().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a subteam redefines an implicitly inherited role class that is used via an anchored type in an inner class of another role of the superteam
// 1.3.6-otjld-redefined-anchored-type-2
public void test136_redefinedAnchoredType2() {
runConformTest(
new String[] {
"T136rat2Main.java",
"\n" +
"public class T136rat2Main {\n" +
" public static void main(String[] args) {\n" +
" Team136rat2_2 t = new Team136rat2_2();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team136rat2_1.java",
"\n" +
"public team class Team136rat2_1 {\n" +
" public class Role136rat2_1 {\n" +
" public String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
" protected team class Role136rat2_2 {\n" +
" protected class Inner136rat2 {\n" +
" public String getValue() {\n" +
" final Team136rat2_1 t = new Team136rat2_1();\n" +
" Role136rat2_1<@t> r = t.new Role136rat2_1();\n" +
" \n" +
" return r.getValue();\n" +
" }\n" +
" }\n" +
" public String getValue() {\n" +
" return new Inner136rat2().getValue();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team136rat2_2.java",
"\n" +
"public team class Team136rat2_2 extends Team136rat2_1 {\n" +
" public class Role136rat2_1 {\n" +
" public String getValue() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
" }\n" +
" protected String getValue() {\n" +
" return new Role136rat2_2().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a subteam redefines an implicitly inherited role class that is used via an anchored type in a local class of another role of the superteam
// 1.3.6-otjld-redefined-anchored-type-3
public void test136_redefinedAnchoredType3() {
runConformTest(
new String[] {
"T136rat3Main.java",
"\n" +
"public class T136rat3Main {\n" +
" public static void main(String[] args) {\n" +
" Team136rat3_2 t = new Team136rat3_2();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team136rat3_1.java",
"\n" +
"public team class Team136rat3_1 {\n" +
" public class Role136rat3_1 {\n" +
" public String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
" protected class Role136rat3_2 {\n" +
" public String getValue() {\n" +
" class Local136rat3 {\n" +
" String getValue() {\n" +
" final Team136rat3_1 t = new Team136rat3_1();\n" +
" Role136rat3_1<@t> r = t.new Role136rat3_1();\n" +
" \n" +
" return r.getValue();\n" +
" }\n" +
" }\n" +
" return new Local136rat3().getValue();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team136rat3_2.java",
"\n" +
"public team class Team136rat3_2 extends Team136rat3_1 {\n" +
" public class Role136rat3_1 {\n" +
" public String getValue() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
" }\n" +
" protected String getValue() {\n" +
" return new Role136rat3_2().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class accesses a feature of its explicit super role via super
// 1.3.7-otjld-access-to-explicit-superrole-1
public void test137_accessToExplicitSuperrole1() {
runConformTest(
new String[] {
"T137ates1Main.java",
"\n" +
"public class T137ates1Main {\n" +
" public static void main(String[] args) {\n" +
" Team137ates1 t = new Team137ates1();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team137ates1.java",
"\n" +
"public team class Team137ates1 {\n" +
" protected class Role137ates1_1 {\n" +
" protected String getValueInternal() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
" protected class Role137ates1_2 extends Role137ates1_1 {\n" +
" protected String getValueInternal() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
" public String getValue() {\n" +
" return super.getValueInternal();\n" +
" }\n" +
" }\n" +
" protected String getValue() {\n" +
" return new Role137ates1_2().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class accesses a feature of its explicit super role via super in an inner class
// 1.3.7-otjld-access-to-explicit-superrole-2
public void test137_accessToExplicitSuperrole2() {
runConformTest(
new String[] {
"T137ates2Main.java",
"\n" +
"public class T137ates2Main {\n" +
" public static void main(String[] args) {\n" +
" Team137ates2_2 t = new Team137ates2_2();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team137ates2_1.java",
"\n" +
"public team class Team137ates2_1 {\n" +
" protected team class Role137ates2_1 {\n" +
" protected String getValueInternal() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team137ates2_2.java",
"\n" +
"public team class Team137ates2_2 extends Team137ates2_1 {\n" +
" protected team class Role137ates2_2 extends Role137ates2_1 {\n" +
" public class Inner137ates2 {\n" +
" public String getValue() {\n" +
" return Role137ates2_2.super.getValueInternal();\n" +
" }\n" +
" }\n" +
" protected String getValueInternal() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
" public String getValue() {\n" +
" return new Inner137ates2().getValue();\n" +
" }\n" +
" }\n" +
"\n" +
" protected team class Role137ates2_1 {\n" +
" protected String getValueInternal() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"\n" +
" protected String getValue() {\n" +
" return new Role137ates2_2().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class accesses a feature defined in a super role of its explicit super role via super in a local class
// 1.3.7-otjld-access-to-explicit-superrole-3
public void test137_accessToExplicitSuperrole3() {
runConformTest(
new String[] {
"T137ates3Main.java",
"\n" +
"public class T137ates3Main {\n" +
" public static void main(String[] args) {\n" +
" Team137ates3_3 t = new Team137ates3_3();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team137ates3_1.java",
"\n" +
"public team class Team137ates3_1 {\n" +
" protected class Role137ates3_1 {\n" +
" protected String getValueInternal() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team137ates3_2.java",
"\n" +
"public team class Team137ates3_2 extends Team137ates3_1 {\n" +
" protected class Role137ates3_1 {}\n" +
"}\n" +
" \n",
"Team137ates3_3.java",
"\n" +
"public team class Team137ates3_3 extends Team137ates3_2 {\n" +
" protected class Role137ates3_2 extends Role137ates3_1 {\n" +
" protected String getValueInternal() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
" public String getValue() {\n" +
" class Local137ates3 {\n" +
" String getValue() {\n" +
" return Role137ates3_2.super.getValueInternal();\n" +
" }\n" +
" }\n" +
" return new Local137ates3().getValue();\n" +
" }\n" +
" }\n" +
"\n" +
" protected String getValue() {\n" +
" return new Role137ates3_2().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class accesses a method of its implicit super role via tsuper
// 1.3.8-otjld-access-to-superrole-1
public void test138_accessToSuperrole1() {
runConformTest(
new String[] {
"T138ats1Main.java",
"\n" +
"public class T138ats1Main {\n" +
" public static void main(String[] args) {\n" +
" Team138ats1_2 t = new Team138ats1_2();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team138ats1_1.java",
"\n" +
"public team class Team138ats1_1 {\n" +
" protected class Role138ats1_1 {\n" +
" protected String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team138ats1_2.java",
"\n" +
"public team class Team138ats1_2 extends Team138ats1_1 {\n" +
" protected class Role138ats1_1 {\n" +
" public String getValue() {\n" +
" return tsuper.getValue();\n" +
" }\n" +
" }\n" +
" protected String getValue() {\n" +
" return new Role138ats1_1().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class accesses a method defined in a super role of its implicit super role via tsuper from an anonymous class
// 1.3.8-otjld-access-to-superrole-2
public void test138_accessToSuperrole2() {
runConformTest(
new String[] {
"T138ats2Main.java",
"\n" +
"public class T138ats2Main {\n" +
" public static void main(String[] args) {\n" +
" Team138ats2_3 t = new Team138ats2_3();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team138ats2_1.java",
"\n" +
"public team class Team138ats2_1 {\n" +
" protected class Role138ats2_1 {\n" +
" protected String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team138ats2_2.java",
"\n" +
"public team class Team138ats2_2 extends Team138ats2_1 {\n" +
" protected class Role138ats2_2 extends Role138ats2_1 {}\n" +
"}\n" +
" \n",
"Team138ats2_3.java",
"\n" +
"public team class Team138ats2_3 extends Team138ats2_2 {\n" +
" protected class Role138ats2_2 {\n" +
" public String getValue() {\n" +
" final String tmp = tsuper.getValue();\n" +
" Object obj = new Object() {\n" +
" public String toString() {\n" +
" return tmp;\n" +
" }\n" +
" };\n" +
"\n" +
" return obj.toString();\n" +
" }\n" +
" }\n" +
" protected String getValue() {\n" +
" return new Role138ats2_2().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class accesses a tsuper method outside overriding methods - overriding implicitly inherited attribute
// 1.3.8-otjld-access-to-superrole-3f
public void test138_accessToSuperrole3f() {
runNegativeTestMatching(
new String[] {
"Team138ats3f_1.java",
"\n" +
"public team class Team138ats3f_1 {\n" +
" protected class Role138ats3f_1 {\n" +
" protected String attr = \"NOTOK\";\n" +
" protected String getAttr() {\n" +
" return attr;\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team138ats3f_2.java",
"\n" +
"public team class Team138ats3f_2 extends Team138ats3f_1 {\n" +
" protected class Role138ats3f_1 {\n" +
" protected String attr = tsuper.getAttr().substring(3);\n" +
" }\n" +
" protected String getValue() {\n" +
" return new Role138ats3f_1().attr;\n" +
" }\n" +
"}\n" +
" \n"
},
"1.4(b)");
}
// a role class accesses a tsuper method outside overriding methods
// 1.3.8-otjld-access-to-superrole-3
public void test138_accessToSuperrole3() {
runNegativeTestMatching(
new String[] {
"Team138ats3_1.java",
"\n" +
"public team class Team138ats3_1 {\n" +
" protected class Role138ats3_1 {\n" +
" protected String attr = \"NOTOK\";\n" +
" protected String getAttr() {\n" +
" return attr;\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team138ats3_2.java",
"\n" +
"public team class Team138ats3_2 extends Team138ats3_1 {\n" +
" protected class Role138ats3_1 {\n" +
" protected String attr2 = tsuper.getAttr().substring(3);\n" +
" }\n" +
" protected String getValue() {\n" +
" return new Role138ats3_1().attr;\n" +
" }\n" +
"}\n" +
" \n"
},
"1.3.1(f)");
}
// a role class accesses a field of its implicit super role via tsuper
// 1.3.8-otjld-access-to-superrole-4
public void test138_accessToSuperrole4() {
runConformTest(
new String[] {
"T138ats4Main.java",
"\n" +
"public class T138ats4Main {\n" +
" public static void main(String[] args) {\n" +
" Team138ats4_2 t = new Team138ats4_2();\n" +
"\n" +
" System.out.print(t.getValue());\n" +
" }\n" +
"}\n" +
" \n",
"Team138ats4_1.java",
"\n" +
"public team class Team138ats4_1 {\n" +
" protected class Role138ats4_1 {\n" +
" protected String attr = \"NOTOK\";\n" +
" protected String getAttr() {\n" +
" return attr;\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team138ats4_2.java",
"\n" +
"public team class Team138ats4_2 extends Team138ats4_1 {\n" +
" protected class Role138ats4_1 {\n" +
" protected String getAttr() {\n" +
" return tsuper.getAttr();\n" +
" }\n" +
" public Role138ats4_1() {\n" +
" tsuper();\n" +
" attr = getAttr().substring(3);\n" +
" }\n" +
" protected String getValue() { return attr; }\n" +
" }\n" +
" protected String getValue() {\n" +
" return new Role138ats4_1().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a role class overrides an implicitly inherited field
// 1.3.8-otjld-access-to-superrole-5
public void test138_accessToSuperrole5() {
runNegativeTestMatching(
new String[] {
"Team138ats5_1.java",
"\n" +
"public team class Team138ats5_1 {\n" +
" protected class Role138ats5_1 {\n" +
" protected String attr = \"NOTOK\";\n" +
" protected String getAttr() {\n" +
" return attr;\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team138ats5_2.java",
"\n" +
"public team class Team138ats5_2 extends Team138ats5_1 {\n" +
" protected class Role138ats5_1 {\n" +
" protected String getAttr() {\n" +
" return tsuper.getAttr();\n" +
" }\n" +
" String attr = getAttr().substring(3);\n" +
" }\n" +
" protected String getValue() {\n" +
" return new Role138ats5_1().attr;\n" +
" }\n" +
"}\n" +
" \n"
},
"1.4(b)");
}
// illegal tsuper call in an anonymous class
// 1.3.8-otjld-access-to-superrole-6
public void test138_accessToSuperrole6() {
runNegativeTestMatching(
new String[] {
"Team138ats6_1.java",
"\n" +
"public team class Team138ats6_1 {\n" +
" protected class Role138ats6_1 {\n" +
" protected String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team138ats6_2.java",
"\n" +
"public team class Team138ats6_2 extends Team138ats6_1 {\n" +
" protected class Role138ats6_2 extends Role138ats6_1 {}\n" +
"}\n" +
" \n",
"Team138ats6_3.java",
"\n" +
"public team class Team138ats6_3 extends Team138ats6_2 {\n" +
" protected class Role138ats6_2 {\n" +
" public String getValue() {\n" +
" Object obj = new Object() {\n" +
" public String toString() {\n" +
" return Role138ats6_2.tsuper.getValue();\n" +
" }\n" +
" };\n" +
"\n" +
" return obj.toString();\n" +
" }\n" +
" }\n" +
" protected String getValue() {\n" +
" return new Role138ats6_2().getValue();\n" +
" }\n" +
"}\n" +
" \n"
},
"1.3.1(f)");
}
// qualified tsuper refers to enclosing team without super
// 1.3.8-otjld-access-to-superrole-7
public void test138_accessToSuperrole7() {
runNegativeTest(
new String[] {
"Team138ats7.java",
"\n" +
"public team class Team138ats7 {\n" +
" protected team class Mid1 {\n" +
" protected class R {\n" +
" void foo() {}\n" +
" }\n" +
" }\n" +
" protected team class Mid2 extends Mid1 {\n" +
" @Override\n" +
" protected class R {\n" +
" @Override\n" +
" void foo() {\n" +
" Team138ats7.tsuper.foo();\n" +
" }\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in Team138ats7.java (at line 13)\n" +
" Team138ats7.tsuper.foo();\n" +
" ^^^^^^^^^^^^^^^^^^\n" +
"Invalid qualified \'tsuper\': type org.objectteams.Team contains no role corresponding to Team138ats7.Mid2.R (OTJLD 1.3.1(f)).\n" +
"----------\n");
}
// a role class accesses a feature of its explicit super role via tsuper
// 1.3.9-otjld-illegal-tsuper-access-1
public void test139_illegalTsuperAccess1() {
runNegativeTestMatching(
new String[] {
"Team139ita1_1.java",
"\n" +
"public team class Team139ita1_1 {\n" +
" protected class Role139ita1_1 {\n" +
" protected String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team139ita1_2.java",
"\n" +
"public team class Team139ita1_2 extends Team139ita1_1 {\n" +
" protected class Role139ita1_2 extends Role139ita1_1 {\n" +
" public String getValue() {\n" +
" return tsuper.getValue();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"1.3.1(f)");
}
// a role class accesses a different method of its implicit super role via tsuper
// 1.3.9-otjld-illegal-tsuper-access-2
public void test139_illegalTsuperAccess2() {
runNegativeTestMatching(
new String[] {
"Team139ita2_1.java",
"\n" +
"public team class Team139ita2_1 {\n" +
" protected class Role139ita2 {\n" +
" protected String getValueInternal() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team139ita2_2.java",
"\n" +
"public team class Team139ita2_2 extends Team139ita2_1 {\n" +
" protected class Role139ita2 {\n" +
" public String getValue() {\n" +
" return tsuper.getValueInternal();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"1.3.1(f)");
}
// a role class accesses a field of its implicit super role via tsuper
// 1.3.9-otjld-illegal-tsuper-access-3
public void test139_illegalTsuperAccess3() {
runNegativeTestMatching(
new String[] {
"Team139ita3_1.java",
"\n" +
"public team class Team139ita3_1 {\n" +
" protected class Role139ita3 {\n" +
" protected String attr = \"OK\";\n" +
" }\n" +
"}\n" +
" \n",
"Team139ita3_2.java",
"\n" +
"public team class Team139ita3_2 extends Team139ita3_1 {\n" +
" protected class Role139ita3 {\n" +
" public String getValue() {\n" +
" return tsuper.attr;\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"yntax");
}
// a role class accesses a method with the same name but different signature of its implicit super role via tsuper
// 1.3.9-otjld-illegal-tsuper-access-4
public void test139_illegalTsuperAccess4() {
runNegativeTest(
new String[] {
"Team139ita4_1.java",
"\n" +
"public team class Team139ita4_1 {\n" +
" protected class Role139ita4 {\n" +
" public String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team139ita4_2.java",
"\n" +
"public team class Team139ita4_2 extends Team139ita4_1 {\n" +
" @Override\n" +
" protected class Role139ita4 {\n" +
" public String getValue(String arg) {\n" +
" return tsuper.getValue();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in Team139ita4_2.java (at line 6)\n" +
" return tsuper.getValue();\n" +
" ^^^^^^^^^^^^^^^^^\n" +
"Illegal tsuper call: can only invoke the method being overridden by the current method (OTJLD 1.3.1(f)).\n" +
"----------\n");
}
// a role class accesses a method of its implicit super role via tsuper within an inner class - missing team keyword
// 1.3.9-otjld-illegal-tsuper-access-5f
public void test139_illegalTsuperAccess5f() {
runNegativeTestMatching(
new String[] {
"Team139ita5f_1.java",
"\n" +
"public team class Team139ita5f_1 {\n" +
" protected class Role139ita5f {\n" +
" protected String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team139ita5f_2.java",
"\n" +
"public team class Team139ita5f_2 extends Team139ita5f_1 {\n" +
" protected class Role139ita5f {\n" +
" class Inner139ita5f {\n" +
" private String getValue() {\n" +
" return tsuper.getValue();\n" +
" }\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"1.5");
}
// a role class accesses a method of its implicit super role via tsuper within an inner class
// 1.3.9-otjld-illegal-tsuper-access-5
public void test139_illegalTsuperAccess5() {
runNegativeTestMatching(
new String[] {
"Team139ita5_1.java",
"\n" +
"public team class Team139ita5_1 {\n" +
" protected class Role139ita5 {\n" +
" protected String getValue() {\n" +
" return \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"Team139ita5_2.java",
"\n" +
"public team class Team139ita5_2 extends Team139ita5_1 {\n" +
" protected team class Role139ita5 {\n" +
" protected class Inner139ita5 {\n" +
" @SuppressWarnings(\"unused\")\n" +
" private String getValue() {\n" +
" return tsuper.getValue();\n" +
" }\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"1.3.1(f)");
}
// a tsuper call is unresolved (requires specific error reporting, setting tsuperMethod to a ProblemMethodBinding)
public void test139_illegalTsuperAccess6() {
runNegativeTestMatching(
new String[] {
"Team139ita6_1.java",
"\n" +
"public team class Team139ita6_1 {\n" +
" protected class Role139ita6 {\n" +
" }\n" +
"}\n" +
" \n",
"Team139ita6_2.java",
"\n" +
"public team class Team139ita6_2 extends Team139ita6_1 {\n" +
" @Override\n" +
" protected class Role139ita6 {\n" +
" callin String getValue(String arg) {\n" +
" return tsuper.getValue(arg);\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in Team139ita6_2.java (at line 6)\n" +
" return tsuper.getValue(arg);\n" +
" ^^^^^^^^\n" +
"The method getValue(String) is undefined for the type Team139ita6_1.Role139ita6\n" +
"----------\n");
}
// Bug 343079 - [compiler] internal compiler error when trying to invoke an abstract method as tsuper
public void test139_illegalTsuperAccess7() {
runNegativeTest(
new String[] {
"Team139ita7_1.java",
"public team class Team139ita7_1 {\n" +
" public abstract class R {\n" +
" abstract void rm();\n" +
" }\n" +
"}\n",
"Team139ita7_2.java",
"public team class Team139ita7_2 extends Team139ita7_1 {\n" +
" @Override\n" +
" public class R {\n" +
" @Override\n" +
" void rm() {\n" +
" tsuper.rm();\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in Team139ita7_2.java (at line 6)\n" +
" tsuper.rm();\n" +
" ^^^^^^^^^^^\n" +
"Cannot directly invoke the abstract method rm() for the type Team139ita7_1.R\n" +
"----------\n");
}
// a tsuper call in a callin method with generic return type (requries copyInheritanceSrc to be reflected when creating a ParameterizedMethodBinding)
public void _test139_tsuperCallWithTypeParameter1() {
runConformTest(
new String[] {
"T139tcwtp1Main.java",
"public class T139tcwtp1Main {\n" +
" public static void main(String[] args) {\n" +
" new Team139tcwtp1_2().activate();\n" +
" System.out.print(new T139tcwtp1().getValue(\"nv\"));\n" +
" }\n" +
"}\n",
"T139tcwtp1.java",
"public class T139tcwtp1 {\n" +
" String getValue(String arg) {\n" +
" return \"NOTOK\";\n" +
" }\n" +
"}\n",
"Team139tcwtp1_1.java",
"\n" +
"public team class Team139tcwtp1_1 {\n" +
" protected class Role139tcwtp1<E> {\n" +
" abstract E val();\n" +
" callin E getValue(String arg) {\n" +
" return this.val();\n" +
" }\n" +
" }\n" +
"}\n",
"Team139tcwtp1_2.java",
"\n" +
"public team class Team139tcwtp1_2 extends Team139tcwtp1_1 {\n" +
" protected class Role139tcwtp1<String> playedBy T139tcwtp1 {\n" +
" String val() { return \"OK\"; }\n" +
" getValue <- replace getValue;\n" +
" callin String getValue(String arg) {\n" +
" return tsuper.getValue(arg);\n" +
" }\n" +
" }\n" +
"}\n"
},
"OK");
}
// a role class has stronger access rights than its implicit superrole
// 1.3.10-otjld-stronger-access-than-superrole-1
public void test1310_strongerAccessThanSuperrole1() {
runNegativeTestMatching(
new String[] {
"Team1310sats1_1.java",
"\n" +
"public team class Team1310sats1_1 {\n" +
" public class Role1310sats1 {}\n" +
"}\n" +
" \n",
"Team1310sats1_2.java",
"\n" +
"public team class Team1310sats1_2 extends Team1310sats1_1 {\n" +
" protected class Role1310sats1 {}\n" +
"}\n" +
" \n"
},
"1.3.1(h)");
}
// a role class has access rights that are incompatible to its implicit superrole - also illegal visibility for role
// 1.3.10-otjld-stronger-access-than-superrole-2
public void test1310_strongerAccessThanSuperrole2() {
runNegativeTestMatching(
new String[] {
"Team1310sats2_1.java",
"\n" +
"public team class Team1310sats2_1 {\n" +
" protected class Role1310sats2 {}\n" +
"}\n" +
" \n",
"Team1310sats2_2.java",
"\n" +
"public team class Team1310sats2_2 extends Team1310sats2_1 {\n" +
" class Role1310sats2 {}\n" +
"}\n" +
" \n"
},
"1.2.1(a)");
}
// a role class has weaker access rights than its implicit superrole
// 1.3.11-otjld-weaker-access-than-superrole-1
public void test1311_weakerAccessThanSuperrole1() {
runConformTest(
new String[] {
"Team1311wats1_1.java",
"\n" +
"public team class Team1311wats1_1 {\n" +
" protected class Role1311wats1 {}\n" +
"}\n" +
" \n",
"Team1311wats1_2.java",
"\n" +
"public team class Team1311wats1_2 extends Team1311wats1_1 {\n" +
" public class Role1311wats1 {}\n" +
"}\n" +
" \n"
});
}
// a role class has weaker access rights than its implicit superrole
// 1.3.11-otjld-weaker-access-than-superrole-2
public void test1311_weakerAccessThanSuperrole2() {
runConformTest(
new String[] {
"Team1311wats2_1.java",
"\n" +
"public team class Team1311wats2_1 {\n" +
" protected class Role1311wats2 {}\n" +
"}\n" +
" \n",
"Team1311wats2_2.java",
"\n" +
"public team class Team1311wats2_2 extends Team1311wats2_1 {\n" +
" public class Role1311wats2 {}\n" +
"}\n" +
" \n"
});
}
// a role class has other access rights than its explicit superrole
// 1.3.12-otjld-other-access-than-explicit-superrole-1
public void test1312_otherAccessThanExplicitSuperrole1() {
runConformTest(
new String[] {
"Team1312oates1.java",
"\n" +
"public team class Team1312oates1 {\n" +
" protected class Role1312oates1_1 {}\n" +
" public class Role1312oates1_2 extends Role1312oates1_1 {}\n" +
"}\n" +
" \n"
});
}
// a role class has other access rights than its explicit superrole
// 1.3.12-otjld-other-access-than-explicit-superrole-2
public void test1312_otherAccessThanExplicitSuperrole2() {
runConformTest(
new String[] {
"Team1312oates2.java",
"\n" +
"public team class Team1312oates2 {\n" +
" public class Role1312oates2_1 {}\n" +
" protected class Role1312oates2_2 extends Role1312oates2_1 {}\n" +
"}\n" +
" \n"
});
}
// a redefined method in a role class has weaker access rights than in its implicit superrole
// 1.3.13-otjld-weaker-redefined-method-access-1
public void test1313_weakerRedefinedMethodAccess1() {
runConformTest(
new String[] {
"Team1313wrma1_1.java",
"\n" +
"public team class Team1313wrma1_1 {\n" +
" public class Role1313wrma1 {\n" +
" protected void test() {}\n" +
" }\n" +
"}\n" +
" \n",
"Team1313wrma1_2.java",
"\n" +
"public team class Team1313wrma1_2 extends Team1313wrma1_1 {\n" +
" public class Role1313wrma1 {\n" +
" public void test() {}\n" +
" }\n" +
"}\n" +
" \n"
});
}
// a redefined method in a role class has weaker access rights than in its explicit superrole
// 1.3.13-otjld-weaker-redefined-method-access-2
public void test1313_weakerRedefinedMethodAccess2() {
runConformTest(
new String[] {
"Team1313wrma2.java",
"\n" +
"public team class Team1313wrma2 {\n" +
" public class Role1313wrma2_1 {\n" +
" void test() {}\n" +
" }\n" +
"\n" +
" public class Role1313wrma2_2 extends Role1313wrma2_1 {\n" +
" public void test() {}\n" +
" }\n" +
"}\n" +
" \n"
});
}
// a redefined method in a role class has stronger access rights than in its implicit superrole
// 1.3.14-otjld-stronger-redefined-method-access-1
public void test1314_strongerRedefinedMethodAccess1() {
runNegativeTestMatching(
new String[] {
"Team1314srma1_1.java",
"\n" +
"public team class Team1314srma1_1 {\n" +
" public class Role1314srma1 {\n" +
" public void test() {}\n" +
" }\n" +
"}\n" +
" \n",
"Team1314srma1_2.java",
"\n" +
"public team class Team1314srma1_2 extends Team1314srma1_1 {\n" +
" public class Role1314srma1 {\n" +
" protected void test() {}\n" +
" }\n" +
"}\n" +
" \n"
},
"1.3.1(h)");
}
// a redefined method in a role class has stronger access rights than in its explicit superrole
// 1.3.14-otjld-stronger-redefined-method-access-2
public void test1314_strongerRedefinedMethodAccess2() {
runNegativeTestMatching(
new String[] {
"Team1314srma2.java",
"\n" +
"public team class Team1314srma2 {\n" +
" public class Role1314srma2_1 {\n" +
" protected void test() {}\n" +
" }\n" +
"\n" +
" public class Role1314srma2_2 extends Role1314srma2_1 {\n" +
" void test() {}\n" +
" }\n" +
"}\n" +
" \n"
},
"visibility");
}
// a role class accesses a method of its implicit superclass using super
// 1.3.15-otjld-feature-access-with-super-1
public void test1315_featureAccessWithSuper1() {
runNegativeTestMatching(
new String[] {
"Team1315faws1_1.java",
"\n" +
"public team class Team1315faws1_1 {\n" +
" public class Role1315faws1 {\n" +
" public void test() {}\n" +
" }\n" +
"}\n" +
" \n",
"Team1315faws1_2.java",
"\n" +
"public team class Team1315faws1_2 extends Team1315faws1_1 {\n" +
" public class Role1315faws1 {\n" +
" public void test() {\n" +
" super.test();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"undefined");
}
// a role class accesses a field of its implicit superclass using super
// 1.3.15-otjld-feature-access-with-super-2
public void test1315_featureAccessWithSuper2() {
runNegativeTestMatching(
new String[] {
"Team1315faws2_1.java",
"\n" +
"public team class Team1315faws2_1 {\n" +
" public class Role1315faws2 {\n" +
" protected String attr;\n" +
" }\n" +
"}\n" +
" \n",
"Team1315faws2_2.java",
"\n" +
"public team class Team1315faws2_2 extends Team1315faws2_1 {\n" +
" public class Role1315faws2 {\n" +
" public String getValue() {\n" +
" return super.attr;\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"resolved");
}
// a team accesses a bound feature of a role class defined in it without providing a base object
// 1.3.16-otjld-role-feature-access-without-baseobject
public void test1316_roleFeatureAccessWithoutBaseobject() {
runNegativeTestMatching(
new String[] {
"T1316rfa.java",
"\n" +
"public class T1316rfa {\n" +
" public String getValue() {\n" +
" return \"NOTOK\";\n" +
" }\n" +
"}\n" +
" \n",
"Team1316rfa.java",
"\n" +
"public team class Team1316rfa {\n" +
" public String getValue() {\n" +
" return new Role1316rfa().getValue();\n" +
" }\n" +
"\n" +
" protected class Role1316rfa playedBy T1316rfa {\n" +
" protected abstract String getValue();\n" +
" String getValue() -> String getValue() with {\n" +
" result <- \"OK\"\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"2.3.1(b)");
}
//
// 1.3.17-otjld-multilevel-role-overriding-1
public void test1317_multilevelRoleOverriding1() {
runConformTest(
new String[] {
"Team1317mro1_3.java",
"\n" +
"public team class Team1317mro1_3 extends Team1317mro1_2 {\n" +
" public class R {\n" +
" public void test() { System.out.print(\"OK\"); }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new Team1317mro1_3();\n" +
" }\n" +
"} \n" +
" \n",
"Team1317mro1_1.java",
"\n" +
"public team class Team1317mro1_1 {\n" +
" public class R {\n" +
" protected void test() { System.out.print(\"NOK\"); }\n" +
" }\n" +
" public Team1317mro1_1() {\n" +
" R r = new R();\n" +
" r.test();\n" +
" }\n" +
"} \n" +
" \n",
"Team1317mro1_2.java",
"\n" +
"public team class Team1317mro1_2 extends Team1317mro1_1 {\n" +
" public class R {\n" +
" protected void test() { System.out.print(\"NOK2\"); }\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// a object of static non-role type is checked instanceof wrt a role type, witness for NPE reported by woll
// 1.3.18-otjld-instanceof-non-role-to-role-1
public void test1318_instanceofNonRoleToRole1() {
runConformTest(
new String[] {
"Team1318inrtr1_2.java",
"\n" +
"public team class Team1318inrtr1_2 {\n" +
" protected team class Inner playedBy Team1318inrtr1_1 {\n" +
" void test(Object o) {\n" +
" if (o instanceof R<@base>)\n" +
" System.out.print(\"OK\");\n" +
" else\n" +
" System.out.print(\"NOK\");\n" +
" }\n" +
" protected Inner () {\n" +
" base();\n" +
" R<@base> r = getR();\n" +
" test(r);\n" +
" }\n" +
" R<@base> getR() -> R<@base> getR();\n" +
" }\n" +
" Team1318inrtr1_2() {\n" +
" new Inner();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new Team1318inrtr1_2();\n" +
" }\n" +
"}\n" +
" \n",
"Team1318inrtr1_1.java",
"\n" +
"public team class Team1318inrtr1_1 {\n" +
" public class R0 {}\n" +
" public class R extends R0 { }\n" +
" public R getR() {\n" +
" return new R();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// illegal attempting to import a role type
// 1.3.19-otjld-role-import-1
public void test1319_roleImport1() {
runNegativeTestMatching(
new String[] {
"p1/Team1319ri1.java",
"\n" +
"package p1;\n" +
"public team class Team1319ri1 {\n" +
" public class R {}\n" +
"}\n" +
" \n",
"T1319ri1.java",
"\n" +
"import p1.Team1319ri1.R;\n" +
"public class T1319ri1 {}\n" +
" \n"
},
"1.2.2(i)");
}
// a role declares a constant which is imported
// 1.3.19-otjld-role-import-2
public void test1319_roleImport2() {
runConformTest(
new String[] {
"T1319ri2Main.java",
"\n" +
"import static p1.Team1319ri2.R.VAL;\n" +
"public class T1319ri2Main {\n" +
" public static void main(String[] args) {\n" +
" System.out.print(VAL);\n" +
" }\n" +
"}\n" +
" \n",
"p1/Team1319ri2.java",
"\n" +
"package p1;\n" +
"public team class Team1319ri2 {\n" +
" public class R {\n" +
" public static final String VAL = \"OK\";\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// EXPERIMENTAL, method arg
// 1.3.20-otjld-tournament-polymorphism-1
public void test1320_tournamentPolymorphism1() {
runConformTest(
new String[] {
"Team1320tp1_3.java",
"\n" +
"public team class Team1320tp1_3 {\n" +
" public final team class Nested extends Team1320tp1_1 {\n" +
" public class R implements org.objectteams.ITeamMigratable {}\n" +
" }\n" +
" void test () {\n" +
" final Nested n1 = new Nested();\n" +
" final Nested n2 = new Nested();\n" +
" R<@n1> r = new R<@n1>(\"OK\");\n" +
" n2.setR(r.migrateToTeam(n2));\n" +
" n2.test();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new Team1320tp1_3().test();\n" +
" }\n" +
"}\n" +
" \n",
"Team1320tp1_1.java",
"\n" +
"public team class Team1320tp1_1 {\n" +
" public class R {\n" +
" String val;\n" +
" public R(String v) { this.val = v; }\n" +
" protected String getVal() { return this.val; }\n" +
" }\n" +
" R r;\n" +
" public void setR(R r) { this.r=r; }\n" +
" public void test() {\n" +
" System.out.print(r.getVal());\n" +
" }\n" +
"}\n" +
" \n",
"Team1320tp1_2.java",
"\n" +
"public team class Team1320tp1_2 extends Team1320tp1_1 { }\n" +
" \n"
},
"OK");
}
// EXPERIMENTAL, assignment
// 1.3.20-otjld-tournament-polymorphism-2
public void test1320_tournamentPolymorphism2() {
runConformTest(
new String[] {
"Team1320tp2_3.java",
"\n" +
"public team class Team1320tp2_3 {\n" +
" public final team class Nested extends Team1320tp2_1 {\n" +
" public class R implements org.objectteams.ITeamMigratable {}\n" +
" }\n" +
" void test () {\n" +
" final Nested n1 = new Nested();\n" +
" final Nested n2 = new Nested();\n" +
" R<@n1> r = new R<@n1>(\"OK\");\n" +
" R<@n2> r2 = r.migrateToTeam(n2);\n" +
" n2.test(r2);\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new Team1320tp2_3().test();\n" +
" }\n" +
"}\n" +
" \n",
"Team1320tp2_1.java",
"\n" +
"public team class Team1320tp2_1 {\n" +
" public class R {\n" +
" String val;\n" +
" public R(String v) { this.val = v; }\n" +
" protected String getVal() { return this.val; }\n" +
" }\n" +
" public void test(R r) {\n" +
" System.out.print(r.getVal());\n" +
" }\n" +
"}\n" +
" \n",
"Team1320tp2_2.java",
"\n" +
"public team class Team1320tp2_2 extends Team1320tp2_1 { }\n" +
" \n"
},
"OK");
}
// EXPERIMENTAL, assignment, hierarchies on both sides, polymorphic use
// 1.3.20-otjld-tournament-polymorphism-3
public void test1320_tournamentPolymorphism3() {
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_ReportOverrideFinalRole, CompilerOptions.IGNORE);
runConformTest(
new String[] {
"Team1320tp3_4.java",
"\n" +
"public team class Team1320tp3_4 extends Team1320tp3_3 {\n" +
" public final team class Nested extends Team1320tp3_2 {\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new Team1320tp3_4().test();\n" +
" }\n" +
"}\n" +
" \n",
"Team1320tp3_1.java",
"\n" +
"public team class Team1320tp3_1 {\n" +
" public class R {\n" +
" String val;\n" +
" public R(String v) { this.val = v; }\n" +
" protected String getVal() { return this.val; }\n" +
" }\n" +
" public void test(R r) {\n" +
" System.out.print(r.getVal());\n" +
" }\n" +
"}\n" +
" \n",
"Team1320tp3_2.java",
"\n" +
"public team class Team1320tp3_2 extends Team1320tp3_1 { }\n" +
" \n",
"Team1320tp3_3.java",
"\n" +
"public team class Team1320tp3_3 {\n" +
" public final team class Nested extends Team1320tp3_1 {\n" +
" public class R implements org.objectteams.ITeamMigratable {}\n" +
" }\n" +
" void test () {\n" +
" final Nested n1 = new Nested();\n" +
" final Nested n2 = new Nested();\n" +
" R<@n1> r = new R<@n1>(\"OK\");\n" +
" R<@n2> r2 = r.migrateToTeam(n2);\n" +
" n2.test(r2);\n" +
" }\n" +
"}\n" +
" \n"
},
"OK",
null/*classLibraries*/,
true/*shouldFlushOutputDirectory*/,
null/*vmArguments*/,
customOptions,
null/*no custom requestor*/);
}
// EXPERIMENTAL, assignment, hierarchies on both sides, polymorphic use, method is witness for tricky resolving of anchored types
// 1.3.20-otjld-tournament-polymorphism-4
public void test1320_tournamentPolymorphism4() {
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_ReportOverrideFinalRole, CompilerOptions.IGNORE);
runConformTest(
new String[] {
"Team1320tp4_4.java",
"\n" +
"public team class Team1320tp4_4 extends Team1320tp4_3 {\n" +
" public final team class Nested extends Team1320tp4_2 {\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new Team1320tp4_4().test();\n" +
" }\n" +
"}\n" +
" \n",
"Team1320tp4_1.java",
"\n" +
"public team class Team1320tp4_1 {\n" +
" public class R {\n" +
" String val;\n" +
" public R(String v) { this.val = v; }\n" +
" protected String getVal() { return this.val; }\n" +
" }\n" +
" public void test(R r) {\n" +
" System.out.print(r.getVal());\n" +
" }\n" +
"}\n" +
" \n",
"Team1320tp4_2.java",
"\n" +
"public team class Team1320tp4_2 extends Team1320tp4_1 { }\n" +
" \n",
"Team1320tp4_3.java",
"\n" +
"public team class Team1320tp4_3 {\n" +
" public final team class Nested extends Team1320tp4_1 {\n" +
" public class R implements org.objectteams.ITeamMigratable {}\n" +
" }\n" +
" void test2(final Nested n1, final Nested n2) {\n" +
" R<@n1> r1 = new R<@n1>(\"OK\");\n" +
" n2.test(r1.migrateToTeam(n2));\n" +
" }\n" +
" void test () {\n" +
" test2(new Nested(), new Nested());\n" +
" }\n" +
"}\n" +
" \n"
},
"OK",
null/*classLibraries*/,
true/*shouldFlushOutputDirectory*/,
null/*vmArguments*/,
customOptions,
null/*no custom requestor*/);
}
// a role migrates to a different team, wrong team
// 1.3.21-otjld-team-migration-1
public void test1321_teamMigration1() {
runNegativeTestMatching(
new String[] {
"Team1321tm1.java",
"\n" +
"import org.objectteams.*;\n" +
"public final team class Team1321tm1 {\n" +
" public class R implements ITeamMigratable {\n" +
"\n" +
" }\n" +
" void test(Team other) {\n" +
" R r = new R();\n" +
" r.migrateToTeam(other);\n" +
" }\n" +
" public static void main (String[] args) {\n" +
" new Team1321tm1().test(null);\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in Team1321tm1.java (at line 9)\n" +
" r.migrateToTeam(other);\n" +
" ^^^^^\n" +
"The special method R.migrateToTeam(Team1321tm1) is not applicable for the arguments (org.objectteams.Team).\n" +
"----------\n");
}
// a role migrates to a different team, non-final team
// 1.3.21-otjld-team-migration-2
public void test1321_teamMigration2() {
runNegativeTestMatching(
new String[] {
"Team1321tm2.java",
"\n" +
"import org.objectteams.*;\n" +
"public team class Team1321tm2 {\n" +
" public class R implements ITeamMigratable {\n" +
" }\n" +
" void test(Team1321tm2 other) {\n" +
" R r = new R();\n" +
" r.migrateToTeam(other);\n" +
" }\n" +
" public static void main (String[] args) {\n" +
" new Team1321tm2().test(null);\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in Team1321tm2.java (at line 4)\n" +
" public class R implements ITeamMigratable {\n" +
" ^^^^^^^^^^^^^^^\n" +
"Team migration not possible because enclosing team class Team1321tm2 is not final (OT/J experimental feature). \n" +
"----------\n" +
"2. ERROR in Team1321tm2.java (at line 8)\n" +
" r.migrateToTeam(other);\n" +
" ^^^^^^^^^^^^^\n" +
"The method migrateToTeam(Team1321tm2) is undefined for the type R<@tthis[Team1321tm2]>\n" +
"----------\n");
}
// a role migrates to a different team, null team
// 1.3.21-otjld-team-migration-3
public void test1321_teamMigration3() {
runConformTest(
new String[] {
"Team1321tm3.java",
"\n" +
"import org.objectteams.*;\n" +
"public final team class Team1321tm3 {\n" +
" public class R implements ITeamMigratable { \n" +
" }\n" +
" void test(Team1321tm3 other) {\n" +
" R r = new R();\n" +
" try {\n" +
" r.migrateToTeam(other);\n" +
" } catch (NullPointerException npe) {\n" +
" System.out.print(npe.getMessage());\n" +
" }\n" +
" }\n" +
" public static void main (String[] args) {\n" +
" new Team1321tm3().test(null);\n" +
" }\n" +
"}\n" +
" \n"
},
"Team argument must not be null");
}
// a role migrates to a different team, null team
// 1.3.21-otjld-team-migration-4
public void test1321_teamMigration4() {
runNegativeTestMatching(
new String[] {
"Team1321tm4.java",
"\n" +
"import org.objectteams.*;\n" +
"public final team class Team1321tm4 {\n" +
" public class R implements ITeamMigratable {\n" +
" }\n" +
" void test() {\n" +
" R r = new R();\n" +
" r.migrateToTeam(null);\n" +
" }\n" +
" public static void main (String[] args) {\n" +
" new Team1321tm4().test();\n" +
" }\n" +
"}\n" +
" \n"
},
"not a valid new team anchor");
}
// a non-role tries to use team migration
// 1.3.21-otjld-team-migration-5
public void test1321_teamMigration5() {
runNegativeTestMatching(
new String[] {
"T1321tm5.java",
"\n" +
"public class T1321tm5 implements org.objectteams.ITeamMigratable {\n" +
" void foo(org.objectteams.Team aTeam) {\n" +
" this.migrateToTeam(aTeam);\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in T1321tm5.java (at line 2)\n" +
" public class T1321tm5 implements org.objectteams.ITeamMigratable {\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Type T1321tm5 does not support team migration, only applicable for roles (OT/J experimental feature).\n" +
"----------\n" +
"2. ERROR in T1321tm5.java (at line 4)\n" +
" this.migrateToTeam(aTeam);\n" +
" ^^^^^^^^^^^^^\n" +
"The method migrateToTeam(Team) is undefined for the type T1321tm5\n" +
"----------\n");
}
// an empty team inherits a role with a callin binding, regression: byte code copy did not find the callin wrapper's byte code
// 1.3.22-otjld-inherited-callin-1
public void test1322_inheritedCallin1() {
runConformTest(
new String[] {
"Team1322ic1_2.java",
"\n" +
"public team class Team1322ic1_2 extends Team1322ic1_1 {\n" +
" protected class R {}\n" +
" public static void main(String[] args) {\n" +
" new Team1322ic1_2().activate();\n" +
" new T1322ic1().test();\n" +
" }\n" +
"}\n" +
" \n",
"Team1322ic1_1.java",
"public team class Team1322ic1_1 {\n" +
" protected class R playedBy T1322ic1 {\n" +
" private void o () { System.out.print(\"O\"); }\n" +
" o <- before test;\n" +
" }\n" +
"}",
"T1322ic1.java",
"\n" +
"public class T1322ic1 {\n" +
" public void test() {\n" +
" System.out.print(\"K\");\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
}