blob: c363f1bc15381a9572fe318790567ea1c612adcc [file] [log] [blame]
/**********************************************************************
* This file is part of "Object Teams Development Tooling"-Software
*
* Copyright 2005, 2014 Berlin Institute of Technology, Germany.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Please visit http://www.eclipse.org/objectteams for updates and contact.
*
* Contributors:
* Berlin Institute of Technology - Initial API and implementation
**********************************************************************/
package org.eclipse.objectteams.otdt.tests.otjld.regression;
import java.util.Map;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.objectteams.otdt.core.ext.WeavingScheme;
import org.eclipse.objectteams.otdt.tests.otjld.AbstractOTJLDTest;
import junit.framework.Test;
/**
* @author Christine Hundt
* @author Stephan Herrmann
* @author Jürgen Widiker
*/
@SuppressWarnings("unchecked")
public class ReportedBugs extends AbstractOTJLDTest {
public ReportedBugs(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[] { "testBug433146"};
// TESTS_NUMBERS = new int[] { 1459 };
// TESTS_RANGE = new int[] { 1097, -1 };
}
public static Test suite() {
return buildComparableTestSuite(testClass());
}
public static Class testClass() {
return ReportedBugs.class;
}
String[] getClassLibraries(String jarFilename) {
String destPath = this.outputRootDirectoryPath+"/regression";
createOutputTestDirectory("/regression");
// upload the jar:
Util.copy(getTestResourcePath(jarFilename), destPath);
// setup classpath:
String[] classPaths = getDefaultClassPaths();
int l = classPaths.length;
System.arraycopy(classPaths, 0, classPaths=new String[l+1], 0, l);
classPaths[l] = this.outputRootDirectoryPath+"/regression/"+jarFilename;
return classPaths;
}
// reported against GebitProposalComputer - typo in testcase
// B.1.1-otjld-sh-1f
public void testB11_sh1f() {
runNegativeTest(
new String[] {
"TB11sh1fMain.java",
"\n" +
"public class TB11sh1fMain {\n" +
" public TB11sh1fMain() {\n" +
" // type in this declaration has a typo:\n" +
" final TeamB11sh1f1 theTeam = new TeamB11sh1f();\n" +
" theTeam.R1[] r1s = new theTeam.R1[1];\n" +
" r1s[0] = theTeam.new R1();\n" +
" theTeam.R3 r3 = r1s[0].getR2().getR3();\n" +
" r3.test();\n" +
" }\n" +
"} \n" +
" \n",
"TeamB11sh1f.java",
"\n" +
"public team class TeamB11sh1f {\n" +
" public class R1 {\n" +
" public R2 getR2() {return new R2();}\n" +
" }\n" +
" public class R2 {\n" +
" public R3 getR3() {return new R3();}\n" +
" }\n" +
" public class R3 {\n" +
" public void test() {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
" }\n" +
"} \n" +
" \n"
},
"----------\n" +
"1. ERROR in TB11sh1fMain.java (at line 5)\n" +
" final TeamB11sh1f1 theTeam = new TeamB11sh1f();\n" +
" ^^^^^^^^^^^^\n" +
"TeamB11sh1f1 cannot be resolved to a type\n" +
"----------\n" +
"2. ERROR in TB11sh1fMain.java (at line 6)\n" +
" theTeam.R1[] r1s = new theTeam.R1[1];\n" +
" ^^^^^^^\n" +
"theTeam cannot be resolved to a type\n" +
"----------\n" +
"3. ERROR in TB11sh1fMain.java (at line 6)\n" +
" theTeam.R1[] r1s = new theTeam.R1[1];\n" +
" ^^^^^^^\n" +
"theTeam cannot be resolved to a type\n" +
"----------\n" +
"4. ERROR in TB11sh1fMain.java (at line 7)\n" +
" r1s[0] = theTeam.new R1();\n" +
" ^^\n" +
"TeamB11sh1f1.R1 cannot be resolved to a type\n" +
"----------\n" +
"5. ERROR in TB11sh1fMain.java (at line 8)\n" +
" theTeam.R3 r3 = r1s[0].getR2().getR3();\n" +
" ^^^^^^^\n" +
"theTeam cannot be resolved to a type\n" +
"----------\n"
);
}
// reported by Robert in GebitProposalComputer
// B.1.1-otjld-sh-1
public void testB11_sh1() {
runConformTest(
new String[] {
"TB11sh1Main.java",
"\n" +
"public class TB11sh1Main {\n" +
" public static void main(String[] args) { \n" +
" final TeamB11sh1 theTeam = new TeamB11sh1();\n" +
" R1<@theTeam>[] r1s = new R1<@theTeam>[1];\n" +
" r1s[0] = theTeam.new R1();\n" +
" R3<@theTeam> r3 = r1s[0].getR2().getR3();\n" +
" r3.test();\n" +
" }\n" +
"} \n" +
" \n",
"TeamB11sh1.java",
"\n" +
"public team class TeamB11sh1 {\n" +
" public class R1 {\n" +
" public R2 getR2() {return new R2();}\n" +
" }\n" +
" public class R2 {\n" +
" public R3 getR3() {return new R3();}\n" +
" }\n" +
" public class R3 {\n" +
" public void test() {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
" }\n" +
"} \n" +
" \n"
},
"OK");
}
// TPX-298
// B.1.1-otjld-sh-2
public void testB11_sh2() {
runNegativeTestMatching(
new String[] {
"test/TeamB11sh2.java",
"\n" +
"package test;\n" +
"public team class TeamB11sh2 {\n" +
" public class R extends TB11sh2 {\n" +
" protected void m1(){} \n" +
" }\n" +
"} \n" +
" \n",
"test/TB11sh2.java",
"\n" +
"package test;\n" +
"public class TB11sh2 {\n" +
" public void m1() {} \n" +
"} \n" +
" \n"
},
"reduce");
}
// TPX-288
// B.1.1-otjld-sh-3
public void testB11_sh3() {
runConformTest(
new String[] {
"TeamB11sh3.java",
"\n" +
"public team class TeamB11sh3 {\n" +
" public class Role1 { \n" +
" public synchronized void foo() {} \n" +
" } \n" +
"} \n" +
" \n"
});
}
// TPX-282
// B.1.1-otjld-sh-4
public void testB11_sh4() {
Map customOptions = getCompilerOptions();
runNegativeTest(
new String[] {
"TB11sh4.java",
"\n" +
"public class TB11sh4 {} \n" +
" \n",
"TeamB11sh4_1.java",
"\n" +
"public team class TeamB11sh4_1 {\n" +
" protected TeamB11sh4_1 (Role1 r) { \n" +
" foo(); \n" +
" } \n" +
" public class Role1 {} \n" +
"} \n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh4_1.java (at line 4)\n" +
" foo(); \n" +
" ^^^\n" +
"The method foo() is undefined for the type TeamB11sh4_1\n" +
"----------\n",
null/*classLibraries*/,
true/*shouldFlushOutputDirectory*/,
customOptions,
true/*generateOutput*/,
false/*showCategory*/,
false/*showWarningToken*/);
runNegativeTest(
new String[] {
"TeamB11sh4_2.java",
"\n" +
"public team class TeamB11sh4_2 extends TeamB11sh4_1 {\n" +
" TeamB11sh4_2(TB11sh4 as Role2 b) { \n" +
" super(b); \n" +
" } \n" +
" @Override\n" +
" public class Role1 extends Role2 playedBy TB11sh4 {} \n" +
"} \n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh4_2.java (at line 3)\n" +
" TeamB11sh4_2(TB11sh4 as Role2 b) { \n" +
" ^^^^^\n" +
"Role2 cannot be resolved to a type\n" +
"----------\n" +
"2. ERROR in TeamB11sh4_2.java (at line 7)\n" +
" public class Role1 extends Role2 playedBy TB11sh4 {} \n" +
" ^^^^^\n" +
"Role2 cannot be resolved to a type\n" +
"----------\n",
null/*classLibraries*/,
false/*shouldFlushOutputDirectory*/,
customOptions);
}
// TPX-262 follow up: not falsely recognizing CallinLabels
// B.1.1-otjld-sh-5
public void testB11_sh5() {
runConformTest(
new String[] {
"TB11sh5.java",
"\n" +
"public class TB11sh5 {\n" +
" int x = 1;\n" +
" void foo(int i) { \n" +
" switch (i) {\n" +
" case Integer.MAX_VALUE: break;\n" +
" }\n" +
" }\n" +
"} \n" +
" \n"
});
}
// TPX-262 follow up: syntax errors recognizing CallinLabels in wrong locations
// B.1.1-otjld-sh-6
public void testB11_sh6() {
runNegativeTest(
new String[] {
"TB11sh6.java",
"\n" +
"public class TB11sh6 {\n" +
" int team x = 1;\n" +
" void foo(int i) { \n" +
" switch (i) {\n" +
" case Integer.MAX_VALUE: break;\n" +
" }\n" +
" }\n" +
"} \n" +
" \n"
},
"----------\n" +
"1. ERROR in TB11sh6.java (at line 3)\n" +
" int team x = 1;\n" +
" ^^^^\n" +
"Syntax error on token \"team\", delete this token\n" +
"----------\n");
}
// TPX-262 follow up: syntax errors recognizing CallinLabels
// B.1.1-otjld-sh-7
public void testB11_sh7() {
runNegativeTest(
new String[] {
"TB11sh7.java",
"\n" +
"public team class TB11sh7 {\n" +
" protected class R playedBy TB11sh7_2 {\n" +
" int team x = 1;\n" +
" void foo(int i) { \n" +
" }\n" +
" myCallin:\n" +
" foo <- after charAt;\n" +
" }\n" +
"} \n" +
" \n",
"TB11sh7_2.java",
"public class TB11sh7_2 {\n" +
" char charAt(int i) { return 'c'; }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in TB11sh7.java (at line 4)\n" +
" int team x = 1;\n" +
" ^^^^\n" +
"Syntax error on token \"team\", delete this token\n" +
"----------\n");
}
// originally an OOSE error, stripped down by resix, problem was: not generating ReferencedTeams regarding team in a package
// B.1.1-otjld-sh-8
public void testB11_sh8() {
Map customOptions = getCompilerOptions();
myWriteFiles(
new String[] {
"mypackage/config.txt",
"\n" +
"mypackage.SubTeamB11sh8_2\n" +
" \n"});
runConformTest(
new String[] {
"mypackage/B11sh8Main.java",
"\n" +
"package mypackage;\n" +
"public class B11sh8Main {\n" +
" public static void main(String[] args) {\n" +
" TeamB11sh8_1 t = new TeamB11sh8_1();\n" +
" t.tm();\n" +
" }\n" +
"}\n" +
" \n",
"mypackage/TeamB11sh8_1.java",
"\n" +
"package mypackage;\n" +
"public team class TeamB11sh8_1 {\n" +
" public void tm() {}\n" +
"}\n" +
" \n",
"mypackage/TeamB11sh8_2.java",
"\n" +
"package mypackage;\n" +
"public team class TeamB11sh8_2 {\n" +
" public class MySubRole playedBy TeamB11sh8_1 {\n" +
" public void rm() {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
" void rm() <- before void tm()\n" +
" base when(true);\n" +
" }\n" +
"}\n" +
" \n",
"mypackage/SubTeamB11sh8_2.java",
"\n" +
"package mypackage;\n" +
"public team class SubTeamB11sh8_2 extends TeamB11sh8_2 {}\n" +
" \n"
},
"OK",
null/*classLibraries*/,
false/*shouldFlushOutputDirectory*/,
getTeamActivationVMArgs("mypackage/config.txt")/*vmArguments*/,
customOptions,
null/*no custom requestor*/);
}
// TPX-317 private methods accessible across extends
// B.1.1-otjld-sh-9
public void testB11_sh9() {
runNegativeTestMatching(
new String[] {
"TeamB11sh9.java",
"\n" +
"public team class TeamB11sh9 {\n" +
" public class R1 { \n" +
" private void m1() { } \n" +
" } \n" +
" \n" +
" public class R2 extends R1 { \n" +
" public void test() { \n" +
" m1(); \n" +
" } \n" +
" } \n" +
"}\n" +
" \n"
},
"1.2.1(e)");
}
// Bug reported by Karsten Meier (miniCRM): result in after binding may need lifting
// B.1.1-otjld-sh-10
public void testB11_sh10() {
runConformTest(
new String[] {
"TeamB11sh10.java",
"\n" +
"public team class TeamB11sh10 {\n" +
" @SuppressWarnings(\"decapsulation\") // get and set val\n" +
" protected class R playedBy TB11sh10 {\n" +
" void extend (R other, String s) {\n" +
" other.setVal(other.getVal()+\"K\");\n" +
" }\n" +
" protected String getVal() -> get String val;\n" +
" protected void setVal(String s) -> set String val;\n" +
" void extend(R other, String s) <- after TB11sh10 getOther(String s) \n" +
" with { other <- result, s <- s }\n" +
" }\n" +
" public static void main (String[] args) {\n" +
" (new TeamB11sh10()).activate();\n" +
" TB11sh10 b = new TB11sh10();\n" +
" b.getOther(\"O\").print();\n" +
" }\n" +
"} \n" +
" \n",
"TB11sh10.java",
"\n" +
"public class TB11sh10 {\n" +
" private String val = \"NOK\";\n" +
" public void print() { System.out.print(val); }\n" +
" public TB11sh10 getOther(String s) {\n" +
" TB11sh10 result = new TB11sh10();\n" +
" result.val = s;\n" +
" return result;\n" +
" }\n" +
"} \n" +
" \n"
},
"OK");
}
// Bug reported by Karsten Meier 1.9.2005, incomplete parameter mapping
// B.1.1-otjld-sh-11
public void testB11_sh11() {
runNegativeTestMatching(
new String[] {
"TeamB11sh11.java",
"\n" +
"public team class TeamB11sh11 {\n" +
" public class R playedBy TB11sh11 {\n" +
" private R other;\n" +
" @SuppressWarnings(\"unused\") private boolean flag;\n" +
" void setOther(R other, boolean flag) {\n" +
" this.other = other;\n" +
" this.other.flag = flag;\n" +
" }\n" +
" void setOther(R other, boolean flag) <- after void setOther(TB11sh11 other) \n" +
" with {\n" +
" other <- other,\n" +
" // flag <- true // this is the bug\n" +
" } \n" +
" String toString() <- after void setOther(TB11sh11 other); \n" +
" }\n" +
"} \n" +
" \n",
"TB11sh11.java",
"\n" +
"public class TB11sh11 {\n" +
" @SuppressWarnings(\"unused\")\n" +
" private TB11sh11 other;\n" +
" void setOther(TB11sh11 other) {\n" +
" this.other = other;\n" +
" }\n" +
"} \n" +
" \n"
},
"OTJLD 4.4(a)");
}
// Bug reported by Karsten Meier 1.9.2005, incomplete parameter mapping - two errors corrected
// B.1.1-otjld-sh-11b
public void testB11_sh11b() {
runNegativeTest(
new String[] {
"TeamB11sh11b.java",
"\n" +
"public team class TeamB11sh11b {\n" +
" public class R playedBy TB11sh11b {\n" +
" private R other;\n" +
" protected boolean flag;\n" +
" void setOther(R other, boolean flag) {\n" +
" this.other = other;\n" +
" this.other.flag = flag;\n" +
" }\n" +
" setOther:\n" +
" @SuppressWarnings(\"hiding\")\n" +
" void setOther(R other, boolean flag) <- after void setOther(TB11sh11b other) \n" +
" with {\n" +
" other <- other,\n" +
" // flag <- true // this is the bug\n" +
" } \n" +
" toString:\n" +
" @SuppressWarnings(\"hiding\")\n" +
" String toString() <- after void setOther(TB11sh11b other); \n" +
" precedence after toString, setOther;\n" +
" }\n" +
"} \n" +
" \n",
"TB11sh11b.java",
"\n" +
"public class TB11sh11b {\n" +
" @SuppressWarnings(\"unused\")\n" +
" private TB11sh11b other;\n" +
" void setOther(TB11sh11b other) {\n" +
" this.other = other;\n" +
" }\n" +
"} \n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh11b.java (at line 12)\n" +
" void setOther(R other, boolean flag) <- after void setOther(TB11sh11b other) \n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Incomplete parameter mapping: argument flag of role method void setOther(R other, boolean flag) is not mapped (OTJLD 4.4(a)).\n" +
"----------\n");
}
// TPX-329 abstract method in non-abstract role
// B.1.1-otjld-sh-12
public void testB11_sh12() {
runNegativeTestMatching(
new String[] {
"TeamB11sh12.java",
"\n" +
"public team class TeamB11sh12 {\n" +
" public class R {\n" +
" public void test() {}\n" +
" public abstract void foo() {\n" +
" test();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"abstract");
}
// detected while creating an example for discussion with Erik Ernst
// B.1.1-otjld-sh-13
public void testB11_sh13() {
runConformTest(
new String[] {
"TeamB11sh13_2.java",
"\n" +
"public team class TeamB11sh13_2 {\n" +
" protected class R2 playedBy TB11sh13 {\n" +
" callin int log (int l1, int l2) {\n" +
" System.out.print(l1+\"&\"+l2);\n" +
" return 3 * base.log(l1, l2);\n" +
" }\n" +
" int log(int l1, int l2) <- replace int sum(int i1, int i2);\n" +
" }\n" +
" TeamB11sh13_2() { activate(); }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh13_1();\n" +
" new TeamB11sh13_2();\n" +
" System.out.print(\"=\"+(new TB11sh13()).sum(3,7));\n" +
" }\n" +
"} \n" +
" \n",
"TB11sh13.java",
"\n" +
"public class TB11sh13 {\n" +
" public int sum(int i1, int i2) {\n" +
" return i1 + i2;\n" +
" }\n" +
"\n" +
"} \n" +
" \n",
"TeamB11sh13_1.java",
"\n" +
"public team class TeamB11sh13_1 {\n" +
" public class R1 playedBy TB11sh13 {\n" +
" callin void twice(int j) {\n" +
" base.twice(2*j);\n" +
" }\n" +
" void twice(int j) <- replace int sum(int i1, int i2) \n" +
" with { j <- i1 }; // base call will tunnel the provided i2 unchanged\n" +
" }\n" +
" public TeamB11sh13_1() { activate(); }\n" +
"} \n" +
" \n"
},
"3&7=39");
}
// TPX-320 nested copy of callout
// B.1.1-otjld-sh-14
public void testB11_sh14() {
runConformTest(
new String[] {
"TeamB11sh14.java",
"\n" +
"public team class TeamB11sh14 {\n" +
" public team class NestedTeam1\n" +
" {\n" +
" public class InnerRole playedBy TB11sh14\n" +
" {\n" +
" public void foo()\n" +
" {\n" +
" System.out.print(\"N\");\n" +
" bar();\n" +
" }\n" +
" public abstract void bar();\n" +
"\n" +
" bar -> extracted;\n" +
" }\n" +
" }\n" +
"\n" +
" public team class NestedTeam2 extends NestedTeam1\n" +
" {\n" +
" public class InnerRole \n" +
" {\n" +
" foo => extracted;\n" +
" }\n" +
" protected NestedTeam2() {\n" +
" InnerRole r = new InnerRole(new TB11sh14());\n" +
" r.foo();\n" +
" }\n" +
" }\n" +
" TeamB11sh14() {\n" +
" new NestedTeam2();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh14();\n" +
" }\n" +
"} \n" +
" \n",
"TB11sh14.java",
"\n" +
"public class TB11sh14 {\n" +
" public void extracted() {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
"} \n" +
" \n"
},
"OK");
}
// TPX-366 renamed nested team
// B.1.1-otjld-sh-15
public void testB11_sh15() {
runNegativeTestMatching(
new String[] {
"TeamB11sh15.java",
"\n" +
"public team class TeamB11sh15 {\n" +
" public team class TeamB11sh15 {}\n" +
"} \n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh15.java (at line 3)\n" +
" public team class TeamB11sh15 {}\n" +
" ^^^^^^^^^^^\n" +
"The nested type TeamB11sh15 cannot hide an enclosing type\n" +
"----------\n");
}
// white box: breaking MessageSend.resolve by externally invoking a shorthand callout
// B.1.1-otjld-sh-16
public void testB11_sh16() {
runConformTest(
new String[] {
"TB11sh16Main.java",
"\n" +
"public class TB11sh16Main {\n" +
" public static void main(String[] args) {\n" +
" final TeamB11sh16_1 t = new TeamB11sh16_1();\n" +
" t.new R().bar();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh16.java",
"\n" +
"public class TB11sh16 {\n" +
" void foo() {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh16_1.java",
"\n" +
"public team class TeamB11sh16_1 {\n" +
" public class R playedBy TB11sh16 {\n" +
" public abstract void bar();\n" +
" void bar() -> void foo();\n" +
" public R() {\n" +
" base();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// local class in parameter mapping - reported by hsudhof, see SessionDeployment
// B.1.1-otjld-sh-17
public void testB11_sh17() {
runConformTest(
new String[] {
"TeamB11sh17.java",
" \n" +
"public team class TeamB11sh17 {\n" +
" protected class R playedBy TB11sh17 {\n" +
" void rm (IB11sh17 delegate) {\n" +
" delegate.print('K');\n" +
" } \n" +
" void rm(IB11sh17 delegate) <- after void test(final char c) \n" +
" with {\n" +
" delegate <- new IB11sh17() {\n" +
" public void print(char cp) {\n" +
" System.out.print(cp);\n" +
" System.out.print(c);\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh17().activate();\n" +
" new TB11sh17().test('!');\n" +
" }\n" +
"} \n" +
" \n",
"TB11sh17.java",
"\n" +
"public class TB11sh17 {\n" +
" void test(char c) {\n" +
" System.out.print(\"O\");\n" +
" }\n" +
"} \n" +
" \n",
"IB11sh17.java",
"\n" +
"public interface IB11sh17 {\n" +
" void print(char c);\n" +
"} \n" +
" \n"
},
"OK!");
}
// TPX-397: conflict between resolution of anchored types and sorting of field bindings
// B.1.1-otjld-sh-18
public void testB11_sh18() {
runConformTest(
new String[] {
"p2/C3.java",
"\n" +
"package p2;\n" +
"import p1.C1;\n" +
"public class C3 extends C1.C2 {\n" +
" public String c = \"K\";\n" +
" public String a = \"O\";\n" +
" public static void main(String[] args) {\n" +
" C3 c3 = new C3();\n" +
" System.out.print(c3.a+c3.c);\n" +
" }\n" +
"} \n" +
" \n",
"p1/C1.java",
"\n" +
"package p1;\n" +
"public class C1 {\n" +
" public static class C2 { }\n" +
"} \n" +
" \n"
},
"OK");
}
// copy inheritance for role with broken playedBy etc.
// B.1.1-otjld-sh-19
public void testB11_sh19() {
runNegativeTest(
new String[] {
"TeamB11sh19_2.java",
"\n" +
"public team class TeamB11sh19_2 extends TeamB11sh19_1 {\n" +
" protected class Role playedBy TB11sh19 {\n" +
" void bar() {}\n" +
" bar <- after m;\n" +
" void n() -> void n();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh19.java",
"\n" +
"public class TB11sh19 {\n" +
" void m() {}\n" +
" void n() {}\n" +
"}\n" +
" \n",
"TeamB11sh19_3.java",
"\n" +
"public team class TeamB11sh19_3 extends TeamB11sh19_2 {\n" +
" protected class Role {\n" +
" Role(TB11sh19 o) {\n" +
" tsuper(o);\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh19_1.java",
"\n" +
"public team class TeamB11sh19_1 {\n" +
" protected class Role playedBy Inexistent {\n" +
" void foo() {}\n" +
" foo <- after what;\n" +
" }\n" +
" protected class R2 {\n" +
" Inexistent ie = new Inexistent();\n" +
" }\n" +
"}\n" +
" \n"
},
null);
}
// from Dehla's error log: enum fields have no declared type
// B.1.1-otjld-sh-20
public void testB11_sh20() {
runConformTest(
new String[] {
"TeamB11sh20.java",
"\n" +
"public team class TeamB11sh20 {\n" +
" protected enum Weekday { MO, DI, MI } \n" +
" void print(Weekday w) {\n" +
" switch (w) {\n" +
" case MO: System.out.print(\"MO\");break;\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh20().print(Weekday.MO);\n" +
" }\n" +
"}\n" +
" \n"
},
"MO");
}
// conflict between weakening of a team's field's type and interface implementation - occurred in hierarchy:ColumnTree.<init>(MyTreeNode)
// B.1.1-otjld-sh-21
public void testB11_sh21() {
runConformTest(
new String[] {
"TeamB11sh21_2.java",
"\n" +
"public team class TeamB11sh21_2 extends TeamB11sh21_1 {\n" +
" protected class R implements IB11sh21 playedBy TB11sh21 {\n" +
" boolean check() { return true; }\n" +
" }\n" +
" protected class R2 { \n" +
" protected R2(IB11sh21 checkable) {\n" +
" System.out.print(\"check:\");\n" +
" System.out.print((checkable.check()) ? \"OK\" : \"NOK\");\n" +
" }\n" +
" }\n" +
" TeamB11sh21_2(TB11sh21 as R r) {\n" +
" super(r);\n" +
" new R2(this.r);\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh21_2(new TB11sh21());\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh21_1.java",
"\n" +
"public team class TeamB11sh21_1 {\n" +
" R r;\n" +
" protected class R {}\n" +
" TeamB11sh21_1(R r) {\n" +
" this.r = r;\n" +
" System.out.print(\"ctor1:\");\n" +
" }\n" +
"}\n" +
" \n",
"IB11sh21.java",
"\n" +
"public interface IB11sh21 {\n" +
" boolean check();\n" +
"}\n" +
" \n",
"TB11sh21.java",
"\n" +
"public class TB11sh21 {}\n" +
" \n"
},
"ctor1:check:OK");
}
// conflict between weakening of a team's field's type and interface implementation - same as above but method instead of ctor
// B.1.1-otjld-sh-22
public void testB11_sh22() {
runConformTest(
new String[] {
"TeamB11sh22_2.java",
"\n" +
"public team class TeamB11sh22_2 extends TeamB11sh22_1 {\n" +
" protected class R implements IB11sh22 playedBy TB11sh22 {\n" +
" boolean check() { return true; }\n" +
" }\n" +
" public void checkR(IB11sh22 checkable) {\n" +
" System.out.print(\"check:\");\n" +
" System.out.print((checkable.check()) ? \"OK\" : \"NOK\");\n" +
" }\n" +
" TeamB11sh22_2(TB11sh22 as R r) {\n" +
" super(r);\n" +
" checkR(this.r);\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh22_2(new TB11sh22());\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh22_1.java",
"\n" +
"public team class TeamB11sh22_1 {\n" +
" R r;\n" +
" protected class R {}\n" +
" TeamB11sh22_1(R r) {\n" +
" this.r = r;\n" +
" System.out.print(\"ctor1:\");\n" +
" }\n" +
"}\n" +
" \n",
"IB11sh22.java",
"\n" +
"public interface IB11sh22 {\n" +
" boolean check();\n" +
"}\n" +
" \n",
"TB11sh22.java",
"\n" +
"public class TB11sh22 {}\n" +
" \n"
},
"ctor1:check:OK");
}
// TPX-422
// B.1.1-otjld-sh-23
public void testB11_sh23() {
runConformTest(
new String[] {
"TeamB11sh23.java",
"\n" +
"import base org.objectteams.TeamThreadManager;\n" +
"public team class TeamB11sh23 {\n" +
" protected class R playedBy TeamThreadManager {\n" +
" R(String[] args) {\n" +
" base();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
});
}
// occurred in Disposition on 07.07.2006
// B.1.1-otjld-sh-24
public void testB11_sh24() {
runNegativeTestMatching(
new String[] {
"TeamB11sh24.java",
"\n" +
"public team class TeamB11sh24 {\n" +
" protected class R {\n" +
" callin void m () {\n" +
" return null;\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"cannot return");
}
// reported by Bj�rn Lohrmann (OOSE group 06#G2)
// B.1.1-otjld-sh-25
public void testB11_sh25() {
runTestExpectingWarnings(
new String[] {
"TeamB11sh25_2.java",
"\n" +
"public team class TeamB11sh25_2 {\n" +
" public class R2 playedBy TeamB11sh25_1 {}\n" +
"}\n" +
" \n",
"TeamB11sh25_1.java",
"\n" +
"public team class TeamB11sh25_1 {\n" +
" public class R1 playedBy TeamB11sh25_2 {\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. WARNING in TeamB11sh25_2.java (at line 3)\n" +
" public class R2 playedBy TeamB11sh25_1 {}\n" +
" ^^^^^^^^^^^^^\n" +
"Base class/member type circularity via chain TeamB11sh25_2.R2->TeamB11sh25_1->TeamB11sh25_1.R1->TeamB11sh25_2;\n" +
"please read the hints in the OT/J Language Definition (OTJLD 2.1.2(b)).\n" +
"----------\n" +
"----------\n" +
"1. WARNING in TeamB11sh25_1.java (at line 3)\n" +
" public class R1 playedBy TeamB11sh25_2 {\n" +
" ^^^^^^^^^^^^^\n" +
"Base class/member type circularity via chain TeamB11sh25_1.R1->TeamB11sh25_2->TeamB11sh25_2.R2->TeamB11sh25_1;\n" +
"please read the hints in the OT/J Language Definition (OTJLD 2.1.2(b)).\n" +
"----------\n");
}
// base predicate in team with syntax errors, TPX-448
// B.1.1-otjld-sh-26
public void testB11_sh26() {
runNegativeTest(
new String[] {
"TeamB11sh26.java",
"\n" +
"public team class TeamB11sh26 {\n" +
" protected class // unfinished\n" +
" \n" +
" protected class R playedBy TB11sh26 {\n" +
" callin void foo() {}\n" +
" void foo() <- replace String toUpperCase() \n" +
" base when (\"a\".equals(\"b\"));\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh26.java",
"public class TB11sh26 {\n" +
" String toUpperCase() { return \"\"; }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in TeamB11sh26.java (at line 3)\n" +
" protected class // unfinished\n" +
" ^^^^^\n" +
"Syntax error on token \"class\", callin expected\n" +
"----------\n");
}
// predicate in team with syntax errors, similar to previous but not "base"
// B.1.1-otjld-sh-27
public void testB11_sh27() {
runNegativeTest(
new String[] {
"TeamB11sh27.java",
"\n" +
"public team class TeamB11sh27 {\n" +
" protected class // unfinished\n" +
" \n" +
" protected class R playedBy TB11sh27 {\n" +
" callin void foo() {}\n" +
" void foo() <- replace String toUpperCase() \n" +
" when (\"a\".equals(\"b\"));\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh27.java",
"public class TB11sh27 {\n" +
" String toUpperCase() { return \"\"; }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in TeamB11sh27.java (at line 3)\n" +
" protected class // unfinished\n" +
" ^^^^^\n" +
"Syntax error on token \"class\", callin expected\n" +
"----------\n");
}
// TPX-451
// B.1.1-otjld-sh-28
public void testB11_sh28() {
runConformTest(
new String[] {
"TeamB11sh28.java",
"\n" +
"public team class TeamB11sh28 {\n" +
" public class R {}\n" +
"} \n" +
" \n",
"TB11sh28.java",
"\n" +
"public class TB11sh28 {\n" +
" final TeamB11sh28 _tm; \n" +
" R<@_tm> _rl;\n" +
" \n" +
" TB11sh28(final TeamB11sh28 tm, R<@tm> rl) {\n" +
" _tm = tm; \n" +
" _rl = rl; \n" +
" } \n" +
"}\n" +
" \n"
});
}
// A callin method has a name that is misinterpreted as a creator method - reported by kmeier on 07/12/06
// B.1.1-otjld-sh-29
public void testB11_sh29() {
runConformTest(
new String[] {
"TeamB11sh29.java",
"\n" +
"public team class TeamB11sh29 {\n" +
" protected class R playedBy TB11sh29 {\n" +
" callin void createOutput () {\n" +
" System.out.print(\"O\");\n" +
" base.createOutput();\n" +
" System.out.print(\"!\");\n" +
" }\n" +
" createOutput <- replace test;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh29().activate();\n" +
" new TB11sh29().test();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh29.java",
"\n" +
"public class TB11sh29 {\n" +
" void test() {\n" +
" System.out.print(\"K\");\n" +
" }\n" +
"}\n" +
" \n"
},
"OK!");
}
// TPX-26, carp's comment 03/Aug/06
// B.1.1-otjld-sh-30
public void testB11_sh30() {
runConformTest(
new String[] {
"TeamB11sh30_1.java",
"\n" +
"public team class TeamB11sh30_1 extends TeamB11sh30_2 {\n" +
" protected class R1 {\n" +
" int i;\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh30_2.java",
"\n" +
"public team class TeamB11sh30_2 {\n" +
" protected class R1 {\n" +
" void foo() {}\n" +
" }\n" +
"}\n" +
" \n"
});
}
// TPX-458
// B.1.1-otjld-sh-31
public void testB11_sh31() {
runConformTest(
new String[] {
"TeamB11sh31_3.java",
"\n" +
"public team class TeamB11sh31_3 extends TeamB11sh31_2 {\n" +
" protected class R2 {\n" +
" protected int getID() { return 7; }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh31_3();\n" +
" }\n" +
" TeamB11sh31_3() {\n" +
" final TeamB11sh31_1 theTeam = new TeamB11sh31_1();\n" +
" R<@theTeam> r = theTeam.getR(((R2)theRole).getID());\n" +
" System.out.print(r.getV());\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh31_1.java",
"\n" +
"public team class TeamB11sh31_1 {\n" +
" public class R {\n" +
" int val;\n" +
" protected R(int i) {\n" +
" this.val = i;\n" +
" }\n" +
" public int getV() { return val; }\n" +
" }\n" +
" public R getR(int v) {\n" +
" return new R(v);\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh31_2.java",
"\n" +
"public team class TeamB11sh31_2 {\n" +
" R2 theRole = new R2();\n" +
" protected class R2 {\n" +
" }\n" +
"}\n" +
" \n"
},
"7");
}
// The bug leading to the workaround leading to TPX-458
// B.1.1-otjld-sh-32
public void testB11_sh32() {
runConformTest(
new String[] {
"TeamB11sh32_3.java",
"\n" +
"public team class TeamB11sh32_3 extends TeamB11sh32_2 {\n" +
" protected class R2 {\n" +
" public int getID() { return 7; }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh32_3();\n" +
" }\n" +
" TeamB11sh32_3() {\n" +
" final TeamB11sh32_1 theTeam = new TeamB11sh32_1();\n" +
" R<@theTeam> r = theTeam.getR(theRole.getID()); // no cast here, at some time caused a compile error?\n" +
" System.out.print(r.getV());\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh32_1.java",
"\n" +
"public team class TeamB11sh32_1 {\n" +
" public class R {\n" +
" int val;\n" +
" protected R(int i) {\n" +
" this.val = i;\n" +
" }\n" +
" public int getV() { return val; }\n" +
" }\n" +
" public R getR(int v) {\n" +
" return new R(v);\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh32_2.java",
"\n" +
"public team class TeamB11sh32_2 {\n" +
" R2 theRole = new R2();\n" +
" protected class R2 {\n" +
" }\n" +
"}\n" +
" \n"
},
"7");
}
// broken control flow in woven base, observed in CompletionAdaptor
// B.1.1-otjld-sh-34
public void testB11_sh34() {
runConformTest(
new String[] {
"TeamB11sh34.java",
"\n" +
"public team class TeamB11sh34 {\n" +
" protected class R playedBy TB11sh34 {\n" +
" callin void realTest(int j) {\n" +
" System.out.print(base.realTest(j));\n" +
" }\n" +
" realTest <- replace test;\n" +
" }\n" +
" public static void main(String[] args) { TeamB11sh34 t = new TeamB11sh34();\n" +
" t.activate();\n" +
" new TB11sh34().test(3);\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh34.java",
"\n" +
"public class TB11sh34 {\n" +
" String test(int i) {\n" +
" switch (i) {\n" +
" case 1:\n" +
" case 3:\n" +
" case 5:\n" +
" case 7:\n" +
" case 15:\n" +
" case 13:\n" +
" case 6:\n" +
" if (i == 3)\n" +
" return \"OK\";\n" +
" return \"NQOK\";\n" +
" case 2:\n" +
" case 18:\n" +
" case 8:\n" +
" return \"WRONG\";\n" +
" default:\n" +
" return \"NOK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// broken anonymous class
// B.1.1-otjld-sh-35
public void testB11_sh35() {
runNegativeTest(
new String[] {
"TeamB11sh35.java",
"\n" +
"public team class TeamB11sh35 {\n" +
" protected class R playedBy TB11sh35 {\n" +
" callin void bar() { \n" +
" Object o = new Missing() {\n" +
" void action() {\n" +
" new R(new TB11sh35());\n" +
" }\n" +
" };\n" +
" }\n" +
" bar <- replace foo;\n" +
" int mumble() -> int mumble();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh35.java",
"\n" +
"public class TB11sh35 {\n" +
" void foo() {}\n" +
" int mumble() { return 32; }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh35.java (at line 5)\n" +
" Object o = new Missing() {\n" +
" ^^^^^^^\n" +
"Missing cannot be resolved to a type\n" +
"----------\n");
}
// callin method after broken callout
// B.1.1-otjld-sh-36
public void testB11_sh36() {
runNegativeTestMatching(
new String[] {
"TB11sh36.java",
"public class TB11sh36 {}\n",
"TeamB11sh36.java",
"\n" +
"public team class TeamB11sh36 {\n" +
" protected class R playedBy TB11sh36 {\n" +
" toString => // incomplete\n" +
" R() {}\n" +
" @SuppressWarnings(\"basecall\")\n" +
" callin void foo() { \n" +
" // empty\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh36.java (at line 4)\n" +
" toString => // incomplete\n" +
" ^^\n" +
"Syntax error on token \"=>\", delete this token\n" +
"----------\n" +
"2. ERROR in TeamB11sh36.java (at line 5)\n" +
" R() {}\n" +
" ^\n" +
"No method R found in type TB11sh36 to resolve method designator (OTJLD 3.1(c)).\n" +
"----------\n");
}
// A lifted return of a callout is a role of a wrong team
// B.1.1-otjld-sh-37
public void testB11_sh37() {
runNegativeTestMatching(
new String[] {
"TeamB11sh37_2.java",
"\n" +
"import p1.TeamB11sh37_1;\n" +
"public team class TeamB11sh37_2 {\n" +
" protected class R2 playedBy TB11sh37 {\n" +
" TeamB11sh37_1.R1 getVal() -> get String val;\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh37.java",
"\n" +
"public class TB11sh37 {\n" +
" String val;\n" +
"}\n" +
" \n",
"p1/TeamB11sh37_1.java",
"\n" +
"package p1;\n" +
"public team class TeamB11sh37_1 {\n" +
" public class R1 playedBy String {}\n" +
"}\n" +
" \n"
},
"1.2.2(b)");
}
// lowering-confusion reported by mehner in SportCourseManagement: tried to lower an exception, but only its ctor-arg should be lowered
// B.1.1-otjld-sh-38
public void testB11_sh38() {
runConformTest(
new String[] {
"TeamB11sh38.java",
"\n" +
"public team class TeamB11sh38 {\n" +
" protected class R playedBy B11sh38 {\n" +
" }\n" +
" TeamB11sh38 () {\n" +
" R r = new R(new B11sh38());\n" +
" try {\n" +
" throw new EB11sh38(r); // lowers the argument\n" +
" } catch (EB11sh38 ex) {\n" +
" ex.print();\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh38();\n" +
" }\n" +
"}\n" +
" \n",
"B11sh38.java",
"\n" +
"public class B11sh38 {\n" +
" public void print() {\n" +
" System.out.print(\"O\");\n" +
" }\n" +
"}\n" +
" \n",
"EB11sh38.java",
"\n" +
"@SuppressWarnings(\"serial\")\n" +
"public class EB11sh38 extends Exception {\n" +
" EB11sh38 (B11sh38 o) {\n" +
" o.print();\n" +
" }\n" +
" void print() {\n" +
" System.out.print(\"K\");\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// copy inheritance for subclass of JFrame: coulnd't deal with type variables in signatures to copy
// B.1.1-otjld-sh-39
public void testB11_sh39() {
runConformTest(
new String[] {
"TeamB11sh39_2.java",
"\n" +
"public team class TeamB11sh39_2 extends TeamB11sh39_1 {\n" +
" @SuppressWarnings(\"serial\")\n" +
" protected class R {\n" +
" protected void print() {\n" +
" tsuper.print();\n" +
" System.out.print(\"K\");\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh39_2().new R().print();\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh39_1.java",
"\n" +
"import javax.swing.JFrame;\n" +
"public team class TeamB11sh39_1 {\n" +
" @SuppressWarnings(\"serial\")\n" +
" protected class R extends JFrame {\n" +
" void print() {\n" +
" System.out.print(\"O\");\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// multiple anonymous classes, implicitely inherited
// B.1.1-otjld-sh-40
public void testB11_sh40() {
runConformTest(
new String[] {
"TeamB11sh40_2.java",
"\n" +
"public team class TeamB11sh40_2 extends TeamB11sh40_1 {\n" +
" protected class R {\n" +
" String getO() { return \"O\"; }\n" +
" String getK() {\n" +
" return new IB11sh40() {\n" +
" public String getStr() { return \"K\"; }\n" +
" }.getStr();\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh40_2().new R().test();\n" +
" }\n" +
"}\n" +
" \n",
"IB11sh40.java",
"\n" +
"public interface IB11sh40 {\n" +
" String getStr();\n" +
"}\n" +
" \n",
"TeamB11sh40_1.java",
"\n" +
"public team class TeamB11sh40_1 {\n" +
" abstract protected class R {\n" +
" protected void test() {\n" +
" IB11sh40 i1 = new IB11sh40() {\n" +
" public String getStr() { return getO(); }\n" +
" };\n" +
" IB11sh40 i2 = new IB11sh40() {\n" +
" public String getStr() { return getK(); }\n" +
" };\n" +
" System.out.print(i1.getStr()+i2.getStr());\n" +
" }\n" +
" abstract String getO();\n" +
" abstract String getK();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// multiple anonymous classes, implicitely inherited - reuse binary of local
// B.1.1-otjld-sh-40f
public void testB11_sh40f() {
runConformTest(
new String[] {
"TeamB11sh40f_2.java",
"\n" +
"public team class TeamB11sh40f_2 extends TeamB11sh40f_1 {\n" +
" protected class R {\n" +
" String getO() { return \"O\"; }\n" +
" String getK() {\n" +
" return new IB11sh40f() {\n" +
" public String getStr() { return \"K\"; }\n" +
" }.getStr();\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh40f_2().new R().test();\n" +
" }\n" +
"}\n" +
" \n",
"IB11sh40f.java",
"\n" +
"public interface IB11sh40f {\n" +
" String getStr();\n" +
"}\n" +
" \n",
"TeamB11sh40f_1.java",
"\n" +
"public team class TeamB11sh40f_1 {\n" +
" abstract protected class R {\n" +
" protected void test() {\n" +
" IB11sh40f i1 = new IB11sh40f() {\n" +
" public String getStr() { return getO(); }\n" +
" };\n" +
" IB11sh40f i2 = new IB11sh40f() {\n" +
" public String getStr() { return getK(); }\n" +
" };\n" +
" System.out.print(i1.getStr()+i2.getStr());\n" +
" }\n" +
" abstract String getO();\n" +
" abstract String getK();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// reported by kmeier
// B.1.1-otjld-sh-41
public void testB11_sh41() {
runConformTest(
new String[] {
"TeamB11sh41_3.java",
"\n" +
"public team class TeamB11sh41_3 {\n" +
" final TeamB11sh41_1 t;\n" +
"\n" +
" TeamB11sh41_3(TeamB11sh41_1 t) {\n" +
" this.t = t;\n" +
" activate();\n" +
" }\n" +
" protected class TheRole playedBy MyRole<@t> {\n" +
" void afterTest() {\n" +
" System.out.print(\"K\");\n" +
" }\n" +
" afterTest <- after test;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" TeamB11sh41_2 target = new TeamB11sh41_2();\n" +
" TeamB11sh41_3 thisTeam = new TeamB11sh41_3(target);\n" +
" target.test();\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh41_1.java",
"\n" +
"public team class TeamB11sh41_1 {\n" +
" public class MyRole {\n" +
" protected void test() {\n" +
" System.out.print(\"O\");\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh41_2.java",
"\n" +
"public team class TeamB11sh41_2 extends TeamB11sh41_1 {\n" +
" public void test() {\n" +
" new MyRole().test();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// check added by resix
// B.1.1-otjld-sh-41a
public void testB11_sh41a() {
runConformTest(
new String[] {
"TeamB11sh41a_3.java",
"\n" +
"public team class TeamB11sh41a_3 {\n" +
" final TeamB11sh41a_1 t;\n" +
"\n" +
" TeamB11sh41a_3(TeamB11sh41a_1 t) {\n" +
" this.t = t;\n" +
" activate();\n" +
" }\n" +
" protected class TheRole playedBy MyRole<@t> {\n" +
" void afterTest() {\n" +
" System.out.print(\"K\");\n" +
" }\n" +
" afterTest <- after test;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" TeamB11sh41a_2 target = new TeamB11sh41a_2();\n" +
" TeamB11sh41a_3 thisTeam = new TeamB11sh41a_3(target);\n" +
" target.test();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh41a.java",
"\n" +
"public class TB11sh41a {}\n" +
" \n",
"TeamB11sh41a_1.java",
"\n" +
"public team class TeamB11sh41a_1 {\n" +
" public class MyRole playedBy TB11sh41a {\n" +
" protected void test() {\n" +
" System.out.print(\"O\");\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh41a_2.java",
"\n" +
"public team class TeamB11sh41a_2 extends TeamB11sh41a_1 {\n" +
" public void test() {\n" +
" new MyRole(new TB11sh41a()).test();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// reported by mehner in sport course management example
// B.1.1-otjld-sh-42
public void testB11_sh42() {
Map customOptions = getCompilerOptions();
runConformTest(
new String[] {
"TB11sh42Main.java",
"\n" +
"public class TB11sh42Main {\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh42_2().activate();\n" +
" TB11sh42_1 o1 = new TB11sh42_1();\n" +
" TB11sh42_2 o2 = new TB11sh42_2();\n" +
" o2.test(o1);\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh42_1.java",
"\n" +
"public class TB11sh42_1 {\n" +
" void test() {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh42_2.java",
"\n" +
"public class TB11sh42_2 {\n" +
" void test(TB11sh42_1 other) {\n" +
" other.test();\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh42_1.java",
"\n" +
"public team class TeamB11sh42_1 {\n" +
" TeamB11sh42_1() {\n" +
" this.activate();\n" +
" }\n" +
" public class R1 playedBy TB11sh42_1 {\n" +
" }\n" +
" protected class R2 playedBy TB11sh42_2 {\n" +
" callin void doA(R1 other) {\n" +
" System.out.print(\">\");\n" +
" base.doA(other);\n" +
" }\n" +
" doA <- replace test;\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh42_2.java",
"\n" +
"public team class TeamB11sh42_2 {\n" +
" final TeamB11sh42_1 that = new TeamB11sh42_1();\n" +
" @SuppressWarnings(\"decapsulation\") // baseclass and callin-to-callin\n" +
" protected class R playedBy R2<@that> {\n" +
" callin void doB(R1<@that> other) {\n" +
" base.doB(other);\n" +
" System.out.print(\"!\");\n" +
" }\n" +
" doB <- replace doA;\n" +
" }\n" +
"}\n" +
" \n"
},
">OK!",
null/*classLibraries*/,
true/*shouldFlushOutputDirectory*/,
null/*vmArguments*/,
customOptions,
null/*no custom requestor*/);
}
// saw an NPE while editing , fix is in rev 14985
// B.1.1-otjld-sh-43
public void testB11_sh43() {
runNegativeTestMatching(
new String[] {
"TeamB11sh43.java",
"\n" +
"public team class TeamB11sh43 {\n" +
" protected class R playedBy Wrong { }\n" +
" public TeamB11sh43 (String as R arg) {\n" +
" System.out.print(arg);\n" +
" }\n" +
"}\n" +
" \n"
},
"cannot be resolved");
}
// nested role shadows outer role - this rule is difficult to enforce since Confined et al actually violate it in every nested team
// B.1.1-otjld_sh-44
public void _sh_testB11_44() {
runNegativeTestMatching(
new String[] {
"TeamB11sh44.java",
"\n" +
"public team class TeamB11sh44 {\n" +
" protected team class R1 {\n" +
" protected class R11 {}\n" +
" protected class R12 extends R11 {}\n" +
" }\n" +
" protected team class R2 extends R1 {\n" +
" protected class R1 {}\n" +
" }\n" +
"}\n" +
" \n"
},
"1.4(a)");
}
// role shadows imported type
// B.1.1-otjld-sh-44a
public void testB11_sh44a() {
runNegativeTestMatching(
new String[] {
"TeamB11sh44a.java",
"\n" +
"import p1.TB11sh44a;\n" +
"public team class TeamB11sh44a {\n" +
" protected class TB11sh44a {\n" +
" }\n" +
"}\n" +
" \n",
"p1/TB11sh44a.java",
"\n" +
"package p1;\n" +
"public class TB11sh44a {\n" +
"}\n" +
" \n"
},
"1.4(a)");
}
// conflicting package and field
// B.1.1-otjld-sh-45
public void testB11_sh45() {
runConformTest(
new String[] {
"p2/TeamB11sh45_2.java",
"\n" +
"package p2;\n" +
"import p1.TeamB11sh45_1;\n" +
"public team class TeamB11sh45_2 {\n" +
" final TeamB11sh45_1 p1;\n" +
" @SuppressWarnings(\"bindingconventions\")\n" +
" protected class R2 playedBy TeamB11sh45_1 {}\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh45_2();\n" +
" }\n" +
" TeamB11sh45_2() {\n" +
" p1 = new TeamB11sh45_1();\n" +
" R<@p1> r = p1.new R();\n" +
" r.test();\n" +
" }\n" +
"}\n" +
" \n",
"p1/TB11sh45.java",
"\n" +
"package p1;\n" +
"public class TB11sh45 {\n" +
" public void test() {\n" +
" System.out.print(\"O\");\n" +
" }\n" +
"}\n" +
" \n",
"p1/TeamB11sh45_1.java",
"\n" +
"package p1;\n" +
"public team class TeamB11sh45_1 {\n" +
" public class R playedBy TB11sh45 {\n" +
" public R () {\n" +
" base();\n" +
" }\n" +
" public void test() {\n" +
" testBase();\n" +
" System.out.print(\"K\");\n" +
" }\n" +
" void testBase() -> void test();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// load order problem with callout to field : ReferenceTeams forces to load TeamB11sh46_1 before TeamB11sh46_2 can be consulted regarding required decapsulation; occurred in OTPong
// B.1.1-otjld-sh-46
public void testB11_sh46() {
myWriteFiles(
new String[] {
"B11sh46teamconfig.txt",
"\n" +
"TeamB11sh46_2\n" +
" \n"
});
Map customOptions = getCompilerOptions();
runConformTest(
new String[] {
"TB11sh46Main.java",
"\n" +
"public class TB11sh46Main {\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh46_1().test();\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh46_1.java",
"\n" +
"public team class TeamB11sh46_1 {\n" +
" @SuppressWarnings(\"unused\")\n" +
" private char getValue() { return 'K'; }\n" +
" void test() {\n" +
" System.out.print(\"O\");\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh46_2.java",
"\n" +
"public team class TeamB11sh46_2 {\n" +
" public TeamB11sh46_2() {\n" +
" this.activate();\n" +
" }\n" +
" protected class R playedBy TeamB11sh46_1 {\n" +
" void test() {\n" +
" System.out.print(getValue());\n" +
" }\n" +
" test <- after test;\n" +
" @SuppressWarnings(\"decapsulation\")\n" +
" char getValue() -> char getValue();\n" +
" void test() <- after char getValue() when (!isExecutingCallin());\n" +
" }\n" +
"}\n" +
" \n"
},
"OK",
null/*classLibraries*/,
false/*shouldFlushOutputDirectory*/,
getTeamActivationVMArgs("B11sh46teamconfig.txt")/*vmArguments*/,
customOptions,
null/*no custom requestor*/);
}
// while preparing the previous test: guard was called with wrong parameters
// B.1.1-otjld-sh-46f
public void testB11_sh46f() {
myWriteFiles(
new String[] {
"B11sh46fteamconfig.txt",
"\n" +
"TeamB11sh46f\n" +
" \n"
});
Map customOptions = getCompilerOptions();
runConformTest(
new String[] {
"TB11sh46fMain.java",
"\n" +
"public class TB11sh46fMain {\n" +
" public static void main(String[] args) {\n" +
" new TB11sh46f().test();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh46f.java",
"\n" +
"public class TB11sh46f {\n" +
" @SuppressWarnings(\"unused\")\n" +
" private char getValue() { return 'K'; }\n" +
" void test() {\n" +
" System.out.print(\"O\");\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh46f.java",
"\n" +
"public team class TeamB11sh46f {\n" +
" public TeamB11sh46f() {\n" +
" this.activate();\n" +
" }\n" +
" protected class R playedBy TB11sh46f {\n" +
" void test() {\n" +
" System.out.print(getValue());\n" +
" }\n" +
" test <- after test;\n" +
" @SuppressWarnings(\"decapsulation\")\n" +
" char getValue() -> char getValue();\n" +
" test <- after getValue when (!isExecutingCallin());\n" +
" }\n" +
"}\n" +
" \n"
},
"OK",
null/*classLibraries*/,
false/*shouldFlushOutputDirectory*/,
getTeamActivationVMArgs("B11sh46fteamconfig.txt")/*vmArguments*/,
customOptions,
null/*no custom requestor*/);
}
// syntax error and local type in a role method - (note that exception was observed during UI operations only: reconsile or hovering the local type)
// B.1.1-otjld-sh-47
public void testB11_sh47() {
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, CompilerOptions.DISABLED);
runNegativeTest(
new String[] {
"TeamB11sh47.java",
"\n" +
"import base javax.swing.JFrame;\n" +
"import base java.lang.String;\n" +
"@SuppressWarnings(\"bindingtosystemclass\")\n" +
"public team class TeamB11sh47 {\n" +
" protected class R1 playedBy JFrame {\n" +
" callin void correct(int i) {\n" +
" System.out.print(i);\n" +
" base.correct(i);\n" +
" }\n" +
" correct <- replace show;\n" +
" void unshow() -> void hide();\n" +
" }\n" +
" protected class Unfinished playedBy\n" +
" protected class R3 playedBy String {\n" +
" callin void shouldBeOK() {\n" +
" class Runner implements Runnable {\n" +
" public void run() {\n" +
" System.out.print(\"running\");\n" +
" }\n" +
" }\n" +
" new Thread(new Runner()).run();\n" +
" }\n" +
" shouldBeOK <- replace length;\n" +
" }\n" +
"}\n" +
" \n"
},
(this.weavingScheme == WeavingScheme.OTRE && IS_JRE_8
?
"----------\n" +
"1. WARNING in TeamB11sh47.java (at line 6)\n" +
" protected class R1 playedBy JFrame {\n" +
" ^^^^^^\n" +
"Base class javax.swing.JFrame has class file version 52 which cannot be handled by the traditional OTRE based on BCEL. Please consider using the ASM based OTDRE instead.\n" +
"----------\n" +
"2. ERROR in TeamB11sh47.java (at line 11)\n" +
" correct <- replace show;\n" +
" ^^^^\n" +
"Method specifier \"show\" is ambiguous for the type javax.swing.JFrame. Please use the exact method signature to disambiguate (OTJLD 4.1(c)).\n" +
"----------\n" +
"3. ERROR in TeamB11sh47.java (at line 14)\n" +
" protected class Unfinished playedBy\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Syntax error on token(s), misplaced construct(s)\n" +
"----------\n" +
"4. ERROR in TeamB11sh47.java (at line 15)\n" +
" protected class R3 playedBy String {\n" +
" ^^\n" +
"Member types not allowed in regular roles. Mark class TeamB11sh47.Unfinished as a team if R3 should be its role (OTJLD 1.5(a,b)). \n" +
"----------\n" +
"5. WARNING in TeamB11sh47.java (at line 15)\n" +
" protected class R3 playedBy String {\n" +
" ^^^^^^\n" +
"PlayedBy binding overrides finalness of base class java.lang.String (OTJLD 2.1.2(c)).\n" +
"----------\n" +
"6. WARNING in TeamB11sh47.java (at line 15)\n" +
" protected class R3 playedBy String {\n" +
" ^^^^^^\n" +
"Base class java.lang.String has class file version 52 which cannot be handled by the traditional OTRE based on BCEL. Please consider using the ASM based OTDRE instead.\n" +
"----------\n"
:
"----------\n" +
"1. ERROR in TeamB11sh47.java (at line 11)\n" +
" correct <- replace show;\n" +
" ^^^^\n" +
"Method specifier \"show\" is ambiguous for the type javax.swing.JFrame. Please use the exact method signature to disambiguate (OTJLD 4.1(c)).\n" +
"----------\n" +
"2. ERROR in TeamB11sh47.java (at line 14)\n" +
" protected class Unfinished playedBy\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Syntax error on token(s), misplaced construct(s)\n" +
"----------\n" +
"3. ERROR in TeamB11sh47.java (at line 15)\n" +
" protected class R3 playedBy String {\n" +
" ^^\n" +
"Member types not allowed in regular roles. Mark class TeamB11sh47.Unfinished as a team if R3 should be its role (OTJLD 1.5(a,b)). \n" +
"----------\n"+
"4. WARNING in TeamB11sh47.java (at line 15)\n" +
" protected class R3 playedBy String {\n" +
" ^^^^^^\n" +
"PlayedBy binding overrides finalness of base class java.lang.String (OTJLD 2.1.2(c)).\n" +
"----------\n"
),
null/*classLibraries*/,
true/*shouldFlushOutputDirectory*/,
customOptions);
}
// team extends missing super team, stacked teams
// B.1.1-otjld-sh-48
public void testB11_sh48() {
runNegativeTest(
new String[] {
"TeamB11sh48_2.java",
"\n" +
"public team class TeamB11sh48_2 {\n" +
" protected team class Mid playedBy TeamB11sh48_1 {\n" +
" protected class R2 playedBy R1<@base> {\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh48_1.java",
"\n" +
"import base java.util.Arrays;\n" +
"public team class TeamB11sh48_1 extends MissingTeam {\n" +
" @SuppressWarnings(\"bindingtosystemclass\")\n" +
" protected class R1 playedBy Arrays {\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. WARNING in TeamB11sh48_2.java (at line 4)\n" +
" protected class R2 playedBy R1<@base> {\n" +
" ^^\n" +
"Overriding access restriction of base class R1<@base> (OTJLD 2.1.2(c)).\n" +
"----------\n" +
"----------\n" +
"1. ERROR in TeamB11sh48_1.java (at line 3)\n" +
" public team class TeamB11sh48_1 extends MissingTeam {\n" +
" ^^^^^^^^^^^\n" +
"MissingTeam cannot be resolved to a type\n" +
"----------\n" +
"2. ERROR in TeamB11sh48_1.java (at line 5)\n" +
" protected class R1 playedBy Arrays {\n" +
" ^^\n" +
"The hierarchy of the type R1 is inconsistent\n" +
"----------\n");
}
// cast method of buggy binary team requested - wittness for "Required cast method not found in Team."
// B.1.1-otjld-sh-49
public void testB11_sh49() {
runNegativeTest(
new String[] {
"TeamB11sh49.java",
"\n" +
"public team class TeamB11sh49 {\n" +
" public class R {\n" +
" void getString() -> toString;\n" +
" }\n" +
"}\n" +
" \n"},
"----------\n" +
"1. ERROR in TeamB11sh49.java (at line 4)\n" +
" void getString() -> toString;\n" +
" ^^^^^^^^^\n" +
"Method binding not allowed here, role R is not played by a base class (OTJLD 3.1(a)).\n" +
"----------\n" +
"2. ERROR in TeamB11sh49.java (at line 4)\n" +
" void getString() -> toString;\n" +
" ^^^^^^^^\n" +
"Syntax error, insert \"Identifier (\" to complete MethodHeaderName\n" +
"----------\n" +
"3. ERROR in TeamB11sh49.java (at line 4)\n" +
" void getString() -> toString;\n" +
" ^^^^^^^^\n" +
"Syntax error, insert \")\" to complete MethodSpecLong\n" +
"----------\n",
null/*classLibraries*/,
false/*shouldFlushOutputDirectory*/,
null/*customOptions*/,
true/*generateOutput*/,
false/*showCategory*/,
false/*showWarningToken*/);
runConformTest(
new String[] {
"TB11sh49Main.java",
"\n" +
"public class TB11sh49Main {\n" +
" void foo() {\n" +
" final TeamB11sh49 t = new TeamB11sh49();\n" +
" Object o = t.new R();\n" +
" R<@t> r = (R<@t>)o;\n" +
" }\n" +
"}\n" +
" \n"
},
""/*expectedOutputString*/,
null/*classLibraries*/,
false/*shouldFlushOutputDirectory*/,
null/*vmArguments*/);
}
// a role field access to a broken role - saw ICE("not exactly one getTeam method")
// B.1.1-otjld-sh-50
public void testB11_sh50() {
runNegativeTestMatching(
new String[] {
"TeamB11sh50.java",
"\n" +
"public team class TeamB11sh50 {\n" +
" protected class R1 playedBy Missing {\n" +
" public String val;\n" +
" }\n" +
" protected class R2 {\n" +
" void foo(R1 other) {\n" +
" other.val = \"OK\";\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh50.java (at line 3)\n" +
" protected class R1 playedBy Missing {\n" +
" ^^^^^^^\n" +
"Missing cannot be resolved to a type\n" +
"----------\n");
}
// tiny exercise towards sh51: OTDRE could not weave into abstract base method.
public void testB11_sh51_0() {
runConformTest(
new String[] {
"TeamB11sh51_0.java",
"public team class TeamB11sh51_0 {\n" +
" protected class R playedBy TB11sh51_0_1 {\n" +
" void print() { System.out.print('p'); }\n" +
" print <- after test;\n" +
" }\n" +
" public static void main(String... args) {\n" +
" within (new TeamB11sh51_0()) {\n" +
" new TB11sh51_0_2().test();\n" +
" }\n" +
" }\n" +
"}\n",
"TB11sh51_0_1.java",
"public abstract class TB11sh51_0_1 {\n" +
" abstract void test();\n" +
"}\n",
"TB11sh51_0_2.java",
"public class TB11sh51_0_2 extends TB11sh51_0_1 {\n" +
" void test() { System.out.print('t'); }\n" +
"}\n",
},
"tp");
}
// curiosities if bound base method is covariantly redefined, reported by hsudof, base version: OK
// B.1.1-otjld-sh-51
public void testB11_sh51() {
runConformTest(
new String[] {
"TB11sh51_1.java",
"\n" +
"public abstract class TB11sh51_1 {\n" +
" abstract Object test();\n" +
"\n" +
" public static void main(String[] args) {\n" +
" TeamB11sh51_1 tt = new TeamB11sh51_1();\n" +
" tt.activate();\n" +
" TB11sh51_2 t = new TB11sh51_2();\n" +
" tt.m(t);\n" +
" System.out.print(t.test());\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh51_1.java",
"\n" +
"public team class TeamB11sh51_1 {\n" +
" void m(TB11sh51_1 as Role r) {\n" +
" System.out.print(\"DeclaredLifting \");\n" +
" }\n" +
" public class Role playedBy TB11sh51_1 {\n" +
" void sayHi() {\n" +
" System.out.print(\"before \");\n" +
" }\n" +
" // should not be called because binding to TB11sh51_2 is not type-safe:\n" +
" callin Object test() { \n" +
" System.out.print(\"replace \"); \n" +
" base.test();\n" +
" return new Object() { public String toString() {return \"AnonObject\"; } };\n" +
" }\n" +
" test <- replace test; // implicitly locks the binding to \"Object test()\"\n" +
" sayHi <- before test; // same as above\n" +
" }\n" +
"\n" +
"}\n" +
" \n",
"TB11sh51_2.java",
"\n" +
"public class TB11sh51_2 extends TB11sh51_1 {\n" +
" @Override\n" +
" public String test() {\n" +
" return \"String\";\n" +
" }\n" +
"}\n" +
" \n"
},
"DeclaredLifting String");
}
// curiosities if bound base method is covariantly redefined, reported by hsudof, bound with "+", replace callin not compilable
// B.1.1-otjld-sh-51p
public void testB11_sh51p() {
runNegativeTestMatching(
new String[] {
"TB11sh51p_1.java",
"\n" +
"public abstract class TB11sh51p_1 {\n" +
" abstract Object test();\n" +
"\n" +
" public static void main(String[] args) {\n" +
" TeamB11sh51p_1 tt = new TeamB11sh51p_1();\n" +
" tt.activate();\n" +
" TB11sh51p_2 t = new TB11sh51p_2();\n" +
" tt.m(t);\n" +
" System.out.print(t.test());\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh51p_1.java",
"\n" +
"public team class TeamB11sh51p_1 {\n" +
" void m(TB11sh51p_1 as Role r) {\n" +
" System.out.print(\"DeclaredLifting \");\n" +
" }\n" +
" public class Role playedBy TB11sh51p_1 {\n" +
" void sayHi() {\n" +
" System.out.print(\"before \");\n" +
" }\n" +
" callin Object test() { \n" +
" System.out.print(\"replace \"); \n" +
" base.test();\n" +
" return new Object() { public String toString() {return \"AnonObject\"; } };\n" +
" }\n" +
" // incompatible: Object+ must be mapped to a type variable:\n" +
" Object test() <- replace Object+ test();\n" +
" void sayHi() <- before Object+ test();\n" +
" }\n" +
"\n" +
"}\n" +
" \n",
"TB11sh51p_2.java",
"\n" +
"public class TB11sh51p_2 extends TB11sh51p_1 {\n" +
" @Override\n" +
" public String test() {\n" +
" return \"String\";\n" +
" }\n" +
"}\n" +
" \n"
},
"4.9.3(c)");
}
// curiosities if bound base method is covariantly redefined, reported by hsudof, static type changed the behaviour
// B.1.1-otjld-sh-52
public void testB11_sh52() {
runConformTest(
new String[] {
"TB11sh52_1.java",
"\n" +
"public abstract class TB11sh52_1 {\n" +
" abstract Object test();\n" +
"\n" +
" public static void main(String[] args) {\n" +
" TeamB11sh52_1 tt = new TeamB11sh52_1();\n" +
" tt.activate();\n" +
" // using the super class, a generated method is called\n" +
" // that is not overridden by TB11sh52_2.test().\n" +
" TB11sh52_1 t = new TB11sh52_2();\n" +
" tt.m(t);\n" +
" System.out.print(t.test());\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh52_1.java",
"\n" +
"public team class TeamB11sh52_1 {\n" +
" void m(TB11sh52_1 as Role r) {\n" +
" System.out.print(\"DeclaredLifting \");\n" +
" }\n" +
" public class Role playedBy TB11sh52_1 {\n" +
" void sayHi() {\n" +
" System.out.print(\"before \");\n" +
" }\n" +
" // should not be called because binding to TB11sh52_2 is not type-safe:\n" +
" callin Object test() {\n" +
" System.out.print(\"replace \");\n" +
" base.test();\n" +
" return new Object() { public String toString() {return \"AnonObject\"; } };\n" +
" }\n" +
" test <- replace test;\n" +
" sayHi <- before test;\n" +
" }\n" +
"\n" +
"}\n" +
" \n",
"TB11sh52_2.java",
"\n" +
"public class TB11sh52_2 extends TB11sh52_1 {\n" +
" @Override\n" +
" public String test() {\n" +
" return \"String\";\n" +
" }\n" +
"}\n" +
" \n"
},
"DeclaredLifting String");
}
// curiosities if bound base method is covariantly redefined, reported by hsudof, referencing sub team changed behavior
// B.1.1-otjld-sh-53
public void testB11_sh53() {
runConformTest(
new String[] {
"TB11sh53_1.java",
"\n" +
"public abstract class TB11sh53_1 {\n" +
" abstract Object test();\n" +
"\n" +
" public static void main(String[] args) {\n" +
" TeamB11sh53_1 tt = new TeamB11sh53_2();\n" +
" tt.activate();\n" +
" // Just referencing this team instance previously broke even the before binding\n" +
" TeamB11sh53_2 tt2 = null;\n" +
" TB11sh53_1 t = new TB11sh53_2();\n" +
" tt.m(t);\n" +
" System.out.print(t.test());\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh53_2.java",
"\n" +
"public class TB11sh53_2 extends TB11sh53_1 {\n" +
" @Override\n" +
" public String test() {\n" +
" return \"String\";\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh53_1.java",
"\n" +
"public team class TeamB11sh53_1 {\n" +
" void m(TB11sh53_1 as Role r) {\n" +
" System.out.print(\"DeclaredLifting \");\n" +
" }\n" +
" public class Role playedBy TB11sh53_1 {\n" +
" void sayHi() {\n" +
" System.out.print(\"before \");\n" +
" }\n" +
" // should not be called because binding to TB11sh53_2 is not type-safe:\n" +
" callin Object test() {\n" +
" System.out.print(\"replace \");\n" +
" base.test();\n" +
" return new Object() { @Override public String toString() {return \"AnonObject\"; } };\n" +
" }\n" +
" test <- replace test;\n" +
" void sayHi() <- before Object+ test(); // can capture covariance with no harm\n" +
" }\n" +
"\n" +
"}\n" +
" \n",
"TeamB11sh53_2.java",
"\n" +
"public team class TeamB11sh53_2 extends TeamB11sh53_1 {\n" +
" protected class R playedBy TB11sh53_2 {\n" +
" // should be called, because this binding matches the precise base type:\n" +
" callin String test() {\n" +
" return base.test() + \">SubTeam\";\n" +
" }\n" +
" test <- replace test;\n" +
" }\n" +
"}\n" +
" \n"
},
"DeclaredLifting before String>SubTeam");
}
// syntax error in plain java should not trigger OT error message - witness for Trac ticket 28
// B.1.1-otjld-sh-54
public void testB11_sh54() {
runNegativeTestMatching(
new String[] {
"TB11sh54.java",
"\n" +
"public class TB11sh54 {\n" +
" void foo() {\n" +
" String s = new // unfinished\n" +
" s.substring(1,2);\n" +
" }\n" +
"}\n" +
" \n"
},
"resolved to a type");
}
// similar to previous but indeed an OT-specific problem
// B.1.1-otjld-sh-55
public void testB11_sh55() {
runNegativeTestMatching(
new String[] {
"TB11sh55.java",
"\n" +
"import org.objectteams.Team;\n" +
"public class TB11sh55 {\n" +
" final Team t= new Team();\n" +
" void foo() {\n" +
" TB11sh55 me= this;\n" +
" String s = new // need to analyze up-to the end, error is on 1st segment though:\n" +
" me.t.ILowerable();\n" +
" }\n" +
"}\n" +
" \n"
},
"1.2.2(c)");
}
// very similar to previous but again not an OT-specific problem
// B.1.1-otjld-sh-56
public void testB11_sh56() {
runNegativeTestMatching(
new String[] {
"TB11sh56.java",
"\n" +
"public class TB11sh56 {\n" +
" final TB11sh56 t= new TB11sh56();\n" +
" void foo() {\n" +
" TB11sh56 me= this;\n" +
" String s = new // cannot interpret as RoleType since last segment is not a type!\n" +
" me.t.foo();\n" +
" }\n" +
"}\n" +
" \n"
},
"resolved to a type");
}
// very similar to previous but again an OT-specific problem
// B.1.1-otjld-sh-57
public void testB11_sh57() {
runNegativeTestMatching(
new String[] {
"TB11sh57.java",
"\n" +
"import org.objectteams.Team;\n" +
"public class TB11sh57 {\n" +
" class Inner {}\n" +
" final TB11sh57 t= new TB11sh57();\n" +
" void foo() {\n" +
" TB11sh57 me= this;\n" +
" String s = new // last element is a type, but anchor is not a team\n" +
" me.t.Inner();\n" +
" }\n" +
"}\n" +
" \n"
},
"1.2.2(b)");
}
// partial recompile after removing bound base methods throws ICE (see Trac #89)
// B.1.1-otjld-sh-58
public void testB11_sh58() {
runConformTest(
new String[] {
"TeamB11sh58_1.java",
"\n" +
"public team class TeamB11sh58_1 {\n" +
" protected class R playedBy TB11sh58 {\n" +
" void bar() {}\n" +
" bar <- after foo;\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh58.java",
"\n" +
"public class TB11sh58 { \n" +
" public void foo () {}\n" +
"}\n" +
" \n"});
runConformTest(
new String[] {
"TB11sh58.java",
"\n" +
"public class TB11sh58 { }\n" +
" \n",
"TeamB11sh58_2.java",
"\n" +
"public team class TeamB11sh58_2 extends TeamB11sh58_1 {}\n" +
" \n"
},
null/*expectedOutput*/,
null/*classLibraries*/,
false/*shouldFlushOutputDirectory*/,
null/*vmArguments*/);
}
// generated methods should not complain about missing @Override - reported by Jan Marc Hoffmann
// B.1.1-otjld-sh-59
public void testB11_sh59() {
runConformTest(
new String[] {
"TeamB11sh59.java",
"\n" +
"public team class TeamB11sh59 {}\n" +
" \n"
});
}
// constructor in a team with missing super class - after an example by Miguel Monteiro (errors incurred by missing super team)
// B.1.1-otjld-sh-60
public void testB11_sh60() {
runNegativeTestMatching(
new String[] {
"TeamB11sh60.java",
" // FIXME: -referenceInfo\n" +
"public team class TeamB11sh60 extends MissingTeam {\n" +
" public class Role extends MissingSuperRole playedBy TB11sh60 { }\n" +
" // implicit constructor\n" +
"}\n" +
" \n",
"TB11sh60.java",
"\n" +
"public class TB11sh60 {}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh60.java (at line 2)\n" +
" public team class TeamB11sh60 extends MissingTeam {\n" +
" ^^^^^^^^^^^\n" +
"MissingTeam cannot be resolved to a type\n" +
"----------\n" +
"2. ERROR in TeamB11sh60.java (at line 3)\n" +
" public class Role extends MissingSuperRole playedBy TB11sh60 { }\n" +
" ^^^^\n" +
"The hierarchy of the type Role is inconsistent\n" +
"----------\n" +
"3. ERROR in TeamB11sh60.java (at line 3)\n" +
" public class Role extends MissingSuperRole playedBy TB11sh60 { }\n" +
" ^^^^^^^^^^^^^^^^\n" +
"MissingSuperRole cannot be resolved to a type\n" +
"----------\n");
}
// witness for problem with precedence in deeply nested team
// B.1.1-otjld-sh-61
public void testB11_sh61() {
runNegativeTest(
new String[] {
"TeamB11sh61.java",
"\n" +
"public team class TeamB11sh61 {\n" +
" protected team class Level1 playedBy TB11sh61\n" +
" {\n" +
" protected Level1(TB11sh61 e) { System.out.print(\"[I]\"); }\n" +
" init <- after init;\n" +
" void init() {\n" +
" }\n" +
" protected class Closed playedBy TB11sh61\n" +
" base when (Level1.this.hasRole(base, Closed.class))\n" +
" {\n" +
" protected Closed(TB11sh61 e) { System.out.print(\"[Clo]\"); }\n" +
" }\n" +
" protected team class Dirty playedBy TB11sh61\n" +
" base when (Level1.this.hasRole(base, Dirty.class))\n" +
" {\n" +
" protected Dirty(TB11sh61 e) { System.out.println(\"[D]\"); }\n" +
"\n" +
" askClose <- replace close;\n" +
" callin void askClose() {\n" +
" }\n" +
"\n" +
" save <- after save;\n" +
" @SuppressWarnings(\"roleinstantiation\") void save() {\n" +
" unregisterRole(this, Dirty.class);\n" +
" new Clean(this);\n" +
" }\n" +
" protected class ClosePending playedBy TB11sh61 {\n" +
" Runnable closer;\n" +
" ClosePending(TB11sh61 ed, Runnable closer) {\n" +
" this(ed);\n" +
" this.closer = closer;\n" +
" }\n" +
" doClose <- replace close;\n" +
" callin void doClose() {\n" +
" closer.run();\n" +
" }\n" +
" }\n" +
" }\n" +
" protected class Clean playedBy TB11sh61\n" +
" base when (Level1.this.hasRole(base, Clean.class))\n" +
" {\n" +
" protected Clean(TB11sh61 e) { System.out.println(\"[Cle]\"); }\n" +
" }\n" +
"\n" +
" boolean getAnswer() {\n" +
" return false;\n" +
" }\n" +
" \n" +
" precedence Clean, Closed;\n" +
" precedence Dirty, ClosePending;\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh61.java",
"\n" +
"public class TB11sh61 {\n" +
" void init() { System.out.print(\"i\"); }\n" +
" void open() { System.out.print(\"o\"); }\n" +
" void edit() { System.out.print(\"e\"); }\n" +
" void save() { System.out.print(\"s\"); }\n" +
" void close() { System.out.print(\"c\"); }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh61.java (at line 51)\n" +
" precedence Dirty, ClosePending;\n" +
" ^^^^^^^^^^^^\n" +
"Callin binding ClosePending not found in type TeamB11sh61.Level1 (OTJLD 4.8(b)).\n" +
"----------\n");
}
// witness for NPE in CallinBindingManager
// B.1.1-otjld-sh-62
public void testB11_sh62() {
runConformTest(
new String[] {
"TeamB11sh62.java",
"\n" +
"@SuppressWarnings(\"roleinstantiation\")\n" +
"public team class TeamB11sh62 {\n" +
" protected team class Level1 playedBy TB11sh62\n" +
" {\n" +
" protected Level1(TB11sh62 e) { System.out.print(\"[I]\"); }\n" +
"\n" +
" // initial transition: after init go to state Closed.\n" +
" init <- after init;\n" +
" void init() {\n" +
" // switch activation from outer team to this team:\n" +
" TeamB11sh62.this.deactivate();\n" +
" this.activate();\n" +
" // next state:\n" +
" new Closed(this);\n" +
" }\n" +
"\n" +
" /** State Closed, accepts event open, rejects event close (warning). */\n" +
" protected class Closed playedBy TB11sh62\n" +
" base when (Level1.this.hasRole(base, Closed.class))\n" +
" {\n" +
" protected Closed(TB11sh62 e) { System.out.print(\"[Clo]\"); }\n" +
"\n" +
" open <- after open;\n" +
" void open() {\n" +
" unregisterRole(this, Closed.class);\n" +
" new Clean(this);\n" +
" }\n" +
"\n" +
" warn <- after close;\n" +
" void warn() {\n" +
" System.out.print(\"[!c]\");\n" +
" }\n" +
" }\n" +
"\n" +
" /** State Dirty, accepts events close (conditionally) and save. */\n" +
" @SuppressWarnings(\"basecall\")\n" +
" protected team class Dirty playedBy TB11sh62\n" +
" base when (Level1.this.hasRole(base, Dirty.class))\n" +
" {\n" +
" protected Dirty(TB11sh62 e) { System.out.print(\"[D]\"); }\n" +
"\n" +
" ask:\n" +
" askClose <- replace close;\n" +
" callin void askClose() {\n" +
" if (getAnswer()) {\n" +
" base.askClose();\n" +
" Level1.this.unregisterRole(this, Dirty.class);\n" +
" new Closed(this);\n" +
" } else {\n" +
" System.out.print(\"[!c2]\");\n" +
" }\n" +
" }\n" +
"\n" +
" save <- after save;\n" +
" void save() {\n" +
" Level1.this.unregisterRole(this, Dirty.class);\n" +
" new Clean(this);\n" +
" }\n" +
" protected class ClosePending playedBy TB11sh62 {\n" +
" Runnable closer;\n" +
" ClosePending(TB11sh62 ed, Runnable closer) {\n" +
" this(ed);\n" +
" this.closer = closer;\n" +
" }\n" +
" really:\n" +
" doClose <- replace close;\n" +
" callin void doClose() {\n" +
" closer.run();\n" +
" }\n" +
" }\n" +
" precedence ask, ClosePending.really;\n" +
" }\n" +
"\n" +
" /** State Clean, accepts events edit and close, rejects event init (blocked). */\n" +
" protected class Clean playedBy TB11sh62\n" +
" base when (Level1.this.hasRole(base, Clean.class))\n" +
" {\n" +
" protected Clean(TB11sh62 e) { System.out.print(\"[Cle]\"); }\n" +
"\n" +
" edit <- after edit;\n" +
" void edit() {\n" +
" unregisterRole(this, Clean.class);\n" +
" new Dirty(this);\n" +
" }\n" +
"\n" +
" close <- after close;\n" +
" void close() {\n" +
" unregisterRole(this, Clean.class);\n" +
" new Closed(this);\n" +
" }\n" +
"\n" +
" nop <- replace init;\n" +
" @SuppressWarnings(\"basecall\")\n" +
" callin void nop() {\n" +
" System.out.print(\"[!i]\");\n" +
" }\n" +
" }\n" +
"\n" +
" boolean getAnswer() {\n" +
" return false;\n" +
" }\n" +
"\n" +
" // class Clean and Closed both intercept 'close' => need to define precedence.\n" +
" // Note: during transition Clean-close->Closed we don't want both roles to fire," +
" // by giving Clean higher precedence its after-callin will trigger after Closed has checked its guard.\n" +
" precedence Clean, Closed;\n" +
"\n" +
" }\n" +
" TeamB11sh62 (TB11sh62 b) {\n" +
" new Level1(b);\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" TB11sh62 b = new TB11sh62();\n" +
" new TeamB11sh62(b).activate();\n" +
" b.init();\n" +
" b.open();\n" +
" b.edit();\n" +
" b.close();\n" +
" b.save();\n" +
" b.close();\n" +
" System.out.print(\"Fin\");\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh62.java",
"\n" +
"public class TB11sh62 {\n" +
" void init() { System.out.print(\"i\"); }\n" +
" void open() { System.out.print(\"o\"); }\n" +
" void edit() { System.out.print(\"e\"); }\n" +
" void save() { System.out.print(\"s\"); }\n" +
" void close() { System.out.print(\"c\"); }\n" +
"}\n" +
" \n"
},
"[I]i[Clo]o[Cle]e[D][!c2]s[Cle]c[Clo]Fin");
}
// witness for base method tag overflow, old result was: "0190290390467nullnull"
// B.1.1-otjld-sh-64
public void testB11_sh64() {
runConformTest(
new String[] {
"TeamB11sh64.java",
"\n" +
"public team class TeamB11sh64 {\n" +
" public class R playedBy TB11sh64 {\n" +
" callin String ci () {\n" +
" String result = base.ci();\n" +
" System.out.print(result);\n" +
" return result;\n" +
" }\n" +
" ci <- replace m00, m01, m02, m03, m04, m05, m06, m07, m08, m09, \n" +
" m10, m11, m12, m13, m14, m15, m16, m17, m18, m19, \n" +
" m20, m21, m22, m23, m24, m25, m26, m27, m28, m29, \n" +
" m30, m31, m32, m33, m34, m35, m36, m37, m38, m39, \n" +
" m40, m41, m42, m43, m44, m45, m46, m47, m48, m49, \n" +
" m50, m51, m52, m53, m54, m55, m56, m57, m58, m59, \n" +
" m60, m61, m62, m63, m64, m65, m66, m67, m68, m69, \n" +
" m70, m71, m72, m73, m74, m75, m76, m77, m78, m79, \n" +
" m80, m81, m82, m83, m84, m85, m86, m87, m88, m89, \n" +
" m90, m91, m92, m93, m94, m95, m96, m97, m98, m99, \n" +
" m100, m101, m102, m103, m104, m105, m106, m107, m108, m109, \n" +
" m110, m111, m112, m113, m114, m115, m116, m117, m118, m119, \n" +
" m120, m121, m122, m123, m124, m125, m126, m127, m128, m129;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh64().activate();\n" +
" TB11sh64 b = new TB11sh64();\n" +
" b.m00(); b.m01(); b.m09();\n" +
" b.m100(); b.m102(); b.m109();\n" +
" b.m110(); b.m103(); b.m109();\n" +
" b.m120(); b.m104(); b.m126(); b.m127(); b.m128(); b.m129();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh64.java",
"\n" +
"public class TB11sh64 {\n" +
" String m00() { return \"0\"; } String m01() { return \"1\"; } String m02() { return \"2\"; } String m03 () { return \"3\"; } String m04() { return \"4\"; } String m05() { return \"5\"; } String m06 () { return \"6\"; } String m07() { return \"7\"; } String m08() { return \"8\"; } String m09 () { return \"9\"; }\n" +
" String m10() { return \"0\"; } String m11() { return \"1\"; } String m12() { return \"2\"; } String m13 () { return \"3\"; } String m14() { return \"4\"; } String m15() { return \"5\"; } String m16 () { return \"6\"; } String m17() { return \"7\"; } String m18() { return \"8\"; } String m19 () { return \"9\"; }\n" +
" String m20() { return \"0\"; } String m21() { return \"1\"; } String m22() { return \"2\"; } String m23 () { return \"3\"; } String m24() { return \"4\"; } String m25() { return \"5\"; } String m26 () { return \"6\"; } String m27() { return \"7\"; } String m28() { return \"8\"; } String m29 () { return \"9\"; }\n" +
" String m30() { return \"0\"; } String m31() { return \"1\"; } String m32() { return \"2\"; } String m33 () { return \"3\"; } String m34() { return \"4\"; } String m35() { return \"5\"; } String m36 () { return \"6\"; } String m37() { return \"7\"; } String m38() { return \"8\"; } String m39 () { return \"9\"; }\n" +
" String m40() { return \"0\"; } String m41() { return \"1\"; } String m42() { return \"2\"; } String m43 () { return \"3\"; } String m44() { return \"4\"; } String m45() { return \"5\"; } String m46 () { return \"6\"; } String m47() { return \"7\"; } String m48() { return \"8\"; } String m49 () { return \"9\"; }\n" +
" String m50() { return \"0\"; } String m51() { return \"1\"; } String m52() { return \"2\"; } String m53 () { return \"3\"; } String m54() { return \"4\"; } String m55() { return \"5\"; } String m56 () { return \"6\"; } String m57() { return \"7\"; } String m58() { return \"8\"; } String m59 () { return \"9\"; }\n" +
" String m60() { return \"0\"; } String m61() { return \"1\"; } String m62() { return \"2\"; } String m63 () { return \"3\"; } String m64() { return \"4\"; } String m65() { return \"5\"; } String m66 () { return \"6\"; } String m67() { return \"7\"; } String m68() { return \"8\"; } String m69 () { return \"9\"; }\n" +
" String m70() { return \"0\"; } String m71() { return \"1\"; } String m72() { return \"2\"; } String m73 () { return \"3\"; } String m74() { return \"4\"; } String m75() { return \"5\"; } String m76 () { return \"6\"; } String m77() { return \"7\"; } String m78() { return \"8\"; } String m79 () { return \"9\"; }\n" +
" String m80() { return \"0\"; } String m81() { return \"1\"; } String m82() { return \"2\"; } String m83 () { return \"3\"; } String m84() { return \"4\"; } String m85() { return \"5\"; } String m86 () { return \"6\"; } String m87() { return \"7\"; } String m88() { return \"8\"; } String m89 () { return \"9\"; }\n" +
" String m90() { return \"0\"; } String m91() { return \"1\"; } String m92() { return \"2\"; } String m93 () { return \"3\"; } String m94() { return \"4\"; } String m95() { return \"5\"; } String m96 () { return \"6\"; } String m97() { return \"7\"; } String m98() { return \"8\"; } String m99 () { return \"9\"; }\n" +
"String m100() { return \"0\"; } String m101() { return \"1\"; } String m102() { return \"2\"; } String m103 () { return \"3\"; } String m104() { return \"4\"; } String m105() { return \"5\"; } String m106 () { return \"6\"; } String m107() { return \"7\"; } String m108() { return \"8\"; } String m109 () { return \"9\"; }\n" +
" String m110() { return \"0\"; } String m111() { return \"1\"; } String m112() { return \"2\"; } String m113 () { return \"3\"; } String m114() { return \"4\"; } String m115() { return \"5\"; } String m116 () { return \"6\"; } String m117() { return \"7\"; } String m118() { return \"8\"; } String m119 () { return \"9\"; }\n" +
" String m120() { return \"0\"; } String m121() { return \"1\"; } String m122() { return \"2\"; } String m123 () { return \"3\"; } String m124() { return \"4\"; } String m125() { return \"5\"; } String m126 () { return \"6\"; } String m127() { return \"7\"; } String m128() { return \"8\"; } String m129 () { return \"9\"; }\n" +
"}\n" +
" \n"
},
"019029039046789");
}
// anonymous type in callin method - witness for scoping problem
// B.1.1-otjld-sh-65
public void testB11_sh65() {
runConformTest(
new String[] {
"TeamB11sh65.java",
"\n" +
"public team class TeamB11sh65 {\n" +
" protected class R playedBy B11sh65 {\n" +
" test <- replace test;\n" +
" callin void test(final IB11sh65 i) {\n" +
" base.test(new IB11sh65() {\n" +
" public String getOK() {\n" +
" return i.getOK();\n" +
" }\n" +
" });\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh65().activate();\n" +
" new B11sh65().test(new IB11sh65() {\n" +
" public String getOK() { return \"OK\"; }\n" +
" });\n" +
" }\n" +
"}\n" +
" \n",
"IB11sh65.java",
"\n" +
"public interface IB11sh65 {\n" +
" String getOK();\n" +
"}\n" +
" \n",
"B11sh65.java",
"\n" +
"public class B11sh65 {\n" +
" void test(IB11sh65 i) {\n" +
" System.out.print(i.getOK());\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// initializer in a role class
// B.1.1-otjld-sh-66
public void testB11_sh66() {
runConformTest(
new String[] {
"TeamB11sh66.java",
"\n" +
"import java.util.HashMap;\n" +
"public team class TeamB11sh66 {\n" +
" public class R {\n" +
" HashMap<String,String> o2n = new HashMap<String,String>();\n" +
" {\n" +
" o2n.put(\"O\",\"N\");\n" +
" }\n" +
" protected void test(String o) {\n" +
" System.out.print(o2n.get(o));\n" +
" }\n" +
" }\n" +
" void test() {\n" +
" new R().test(\"O\");\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh66().test();\n" +
" }\n" +
"}\n" +
" \n"
},
"N");
}
// warning irritant bit conflict - hint by Philippe Mulet
// B.1.1-otjld-sh-67
public void testB11_sh67() {
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_ReportUnusedParameter, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedDeclaredThrownException, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedTypeArgumentsForMethodInvocation, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedLabel, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedImport, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.WARNING);
runTestExpectingWarnings(
new String[] {
"TB11sh67.java",
"\n" +
"public class TB11sh67 {\n" +
" @SuppressWarnings(\"unused\")\n" +
" private int secret;\n" +
"}\n" +
" \n",
"TeamB11sh67.java",
"\n" +
"@SuppressWarnings({\"unused\",\"basecall\"})\n" +
"public team class TeamB11sh67 {\n" +
" void bar(int unused) {}\n" +
" protected class R playedBy TB11sh67 {\n" +
" int getSecret() -> get int secret; // <- decapsulation warning was masked by above @SuppressWarnings\n" +
" callin void noBaseCall() {\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. WARNING in TeamB11sh67.java (at line 6)\n" +
" int getSecret() -> get int secret; // <- decapsulation warning was masked by above @SuppressWarnings\n" +
" ^^^^^^\n" +
"Access restriction of private field secret in type TB11sh67 is overridden by this binding (OTJLD 3.5(e)).\n" +
"----------\n",
customOptions);
}
// warning irritant bit conflict - hint by Philippe Mulet
// B.1.1-otjld-sh-68
public void testB11_sh68() {
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_ReportUnusedParameter, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedDeclaredThrownException, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedTypeArgumentsForMethodInvocation, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedLabel, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedImport, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.WARNING);
customOptions.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.WARNING);
runTestExpectingWarnings(
new String[] {
"TB11sh68.java",
"\n" +
"public class TB11sh68 {\n" +
" @SuppressWarnings(\"unused\")\n" +
" private int secret;\n" +
"}\n" +
" \n",
"TeamB11sh68.java",
"\n" +
"@SuppressWarnings({\"unused\",\"basecall\",\"restriction\"}) // last one is unnecessary\n" +
"public team class TeamB11sh68 {\n" +
" void bar(int unused) {}\n" +
" @SuppressWarnings(\"basecall\") // unnesserary\n" +
" protected class R playedBy TB11sh68 {\n" +
" int getSecret() -> get int secret; // <- decapsulation warning was masked by above @SuppressWarnings\n" +
" callin void noBaseCall() {\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. WARNING in TeamB11sh68.java (at line 2)\n" +
" @SuppressWarnings({\"unused\",\"basecall\",\"restriction\"}) // last one is unnecessary\n" +
" ^^^^^^^^^^\n" +
"Unnecessary @SuppressWarnings(\"basecall\")\n" +
"----------\n" +
"2. WARNING in TeamB11sh68.java (at line 2)\n" +
" @SuppressWarnings({\"unused\",\"basecall\",\"restriction\"}) // last one is unnecessary\n" +
" ^^^^^^^^^^^^^\n" +
"Unnecessary @SuppressWarnings(\"restriction\")\n" +
"----------\n" +
"3. WARNING in TeamB11sh68.java (at line 7)\n" +
" int getSecret() -> get int secret; // <- decapsulation warning was masked by above @SuppressWarnings\n" +
" ^^^^^^\n" +
"Access restriction of private field secret in type TB11sh68 is overridden by this binding (OTJLD 3.5(e)).\n" +
"----------\n",
customOptions);
}
// issue with static initialization - user and generated conflicting, reported by Miguel Monteiro
// B.1.1-otjld-sh-69
public void testB11_sh69() {
runConformTest(
new String[] {
"TB11sh69Main.java",
"\n" +
"public class TB11sh69Main {\n" +
" public static void main(String[] args) {\n" +
" TeamB11sh69 t = new TeamB11sh69();\n" +
" TB11sh69 b = new TB11sh69();\n" +
" t.activate();\n" +
" b.yes();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh69.java",
"\n" +
"public class TB11sh69 {\n" +
" static {\n" +
" print(\"O\");\n" +
" }\n" +
" public static void print(String s) {\n" +
" System.out.print(s);\n" +
" }\n" +
" public void yes() { print(\"!\"); }\n" +
"}\n" +
" \n",
"TeamB11sh69.java",
"\n" +
"public team class TeamB11sh69 {\n" +
" protected class R playedBy TB11sh69 {\n" +
" static void printK() { System.out.print(\"K\"); }\n" +
" printK <- before print;\n" +
" }\n" +
"}\n" +
" \n"
},
"OK!");
}
// internal call should use custom ctor
// B.1.1-otjld-sh-70
public void testB11_sh70() {
runConformTest(
new String[] {
"TeamB11sh70.java",
"\n" +
"public team class TeamB11sh70 {\n" +
" protected class R playedBy TB11sh70 {\n" +
"\n" +
" R(R other) { // this constructor is hidden by the more visible dflt lifting ctor!\n" +
" base(\"K\");\n" +
" }\n" +
" protected R createOther() {\n" +
" return new R(this); // within the role the better fitting ctor should be used\n" +
" }\n" +
" }\n" +
" TeamB11sh70() {\n" +
" new R(new TB11sh70(\"O\")).createOther();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh70();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh70.java",
"\n" +
"public class TB11sh70 {\n" +
" TB11sh70(String s) { System.out.print(s); }\n" +
"}\n" +
" \n"
},
"OK");
}
// witness for ArrayStoreException found in the logs - custom ctor is never used
// B.1.1-otjld-sh-70f
public void testB11_sh70f() {
runConformTest(
new String[] {
"TeamB11sh70f.java",
"\n" +
"public team class TeamB11sh70f {\n" +
" protected class R playedBy TB11sh70f {\n" +
"\n" +
" R(R other) { // this constructor is hidden by the more visible dflt lifting ctor!\n" +
" base(\"K\");\n" +
" } \n" +
" }\n" +
" TeamB11sh70f() {\n" +
" new R(new R(new TB11sh70f(\"O\")));\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" try {\n" +
" new TeamB11sh70f();\n" +
" } catch (org.objectteams.DuplicateRoleException e) {\n" +
" System.out.print(\"caught\");\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh70f.java",
"\n" +
"public class TB11sh70f {\n" +
" TB11sh70f(String s) { System.out.print(s); }\n" +
"}\n" +
" \n"
},
"Ocaught");
}
// variant of above, right ctor resolved
// B.1.1-otjld-sh-71
public void testB11_sh71() {
runConformTest(
new String[] {
"TeamB11sh71.java",
"\n" +
"public team class TeamB11sh71 {\n" +
" protected class R playedBy TB11sh71 {\n" +
" protected R(R other) {\n" +
" base(\"K\");\n" +
" }\n" +
" }\n" +
" TeamB11sh71() {\n" +
" new R(new R(new TB11sh71(\"O\")));\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh71();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh71.java",
"\n" +
"public class TB11sh71 {\n" +
" TB11sh71(String s) { System.out.print(s); }\n" +
"}\n" +
" \n"
},
"OK");
}
// witness for NegativeArraySizeException in StackMapFrame.duplicate (pre r19271
// B.1.1-otjld-sh-72
public void testB11_sh72() {
runConformTest(
new String[] {
"TeamB11sh72.java",
"\n" +
"public team class TeamB11sh72 {\n" +
" protected class MyRole playedBy B11sh72 {\n" +
" @SuppressWarnings(\"basecall\")\n" +
" static callin void foo() {}\n" +
" foo <- replace foo\n" +
" when (true);\n" +
" }\n" +
" void test() {\n" +
" if (new MyRole(new B11sh72()) instanceof MyRole) // force loading\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
" public static void main (String[] args) {\n" +
" new TeamB11sh72().test();\n" +
" }\n" +
"}\n" +
" \n",
"B11sh72.java",
"\n" +
"public class B11sh72 {\n" +
" public static void foo() {}\n" +
"}\n" +
" \n"
},
"OK");
}
// witness for NPE in MethodModel.getReturnType from TSuperMessageSend.resolveType
// B.1.1-otjld-sh-73
public void testB11_sh73() {
runNegativeTest(
new String[] {
"TeamB11sh73.java",
"\n" +
"public team class TeamB11sh73 {\n" +
" protected class R {\n" +
" callin void doit() {\n" +
" tsuper.doit(); // no tsuper available\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh73.java (at line 5)\n" +
" tsuper.doit(); // no tsuper available\n" +
" ^^^^^^^^^^^^^\n" +
"Illegal tsuper call: role TeamB11sh73.R has no implicit super class (OTJLD 1.3.1(f)).\n" +
"----------\n");
}
// Witness for ICE reported by MWSE0809 group
// B.1.1-otjld-sh-74
public void testB11_sh74() {
runNegativeTest(
new String[] {
"TeamB11sh74_2.java",
"\n" +
"public team class TeamB11sh74_2 extends TeamB11sh74_1 {\n" +
"}\n" +
" \n",
"TB11sh74.java",
"\n" +
"public class TB11sh74 {\n" +
" int id;\n" +
"}\n" +
" \n",
"TeamB11sh74_1.java",
"\n" +
"public team class TeamB11sh74_1 {\n" +
" protected class R playedBy TB11sh74 {\n" +
" String getId() -> get int id; // bug\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh74_1.java (at line 4)\n" +
" String getId() -> get int id; // bug\n" +
" ^^^^^^^^^^^^^^\n" +
"When binding field id via callout to role method getId():\n" +
"Incompatible types: can\'t convert int to java.lang.String (OTJLD 3.5(b)).\n" +
"----------\n");
}
// buggy callout should not create a CalloutMappingsAttribute-part - witness for ICE in CalloutMappingsAttribute.evaluateLateAttribute
// B.1.1-otjld-sh-75
public void testB11_sh75() {
Map customOptions = getCompilerOptions();
runTest(
new String[] {
"TeamB11sh75_2.java",
"\n" +
"public team class TeamB11sh75_2 extends TeamB11sh75_1 {\n" +
" public static void main(String[] args) {\n" +
" final TeamB11sh75_1 t = new TeamB11sh75_1();\n" +
" R<@t> r = t.getR();\n" +
" r.test();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh75.java",
"\n" +
"public class TB11sh75 {\n" +
" int id;\n" +
"}\n" +
" \n",
"TeamB11sh75_1.java",
"\n" +
"public team class TeamB11sh75_1 {\n" +
" public class R playedBy TB11sh75 {\n" +
" String mismatch() -> get String id;\n" +
" toString => toString;\n" +
" public void test() {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
" }\n" +
" public R getR() {\n" +
" return new R(new TB11sh75());\n" +
" }\n" +
"}\n" +
" \n"
},
true/*expectingCompilerErrors*/,
"----------\n" +
"1. ERROR in TeamB11sh75_1.java (at line 4)\n" +
" String mismatch() -> get String id;\n" +
" ^^^^^^\n" +
"Field specifier \'id\' resolves to type int whereas type java.lang.String is specified (OTJLD 3.5(a)).\n" +
"----------\n",
"OK",
""/*expectedErrorOutput*/,
true/*forceExecution*/,
null/*classLibraries*/,
true/*shouldFlushOutputDirectory*/,
null/*vmArguments*/,
customOptions,
null/*no custom requestor*/,
true/*skipJavac*/);
}
// buggy callout should not create a CalloutMappingsAttribute-part - witness for ICE in CalloutMappingsAttribute.evaluateLateAttribute
// B.1.1-otjld-sh-75
public void testB11_sh75a() {
Map customOptions = getCompilerOptions();
runTest(
new String[] {
"TeamB11sh75a_2.java",
"\n" +
"public team class TeamB11sh75a_2 extends TeamB11sh75a_1 {\n" +
" public static void main(String[] args) {\n" +
" final TeamB11sh75a_1 t = new TeamB11sh75a_1();\n" +
" R<@t> r = t.getR();\n" +
" r.test();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh75a.java",
"\n" +
"public class TB11sh75a {\n" +
" int id;\n" +
"}\n" +
" \n",
"TeamB11sh75a_1.java",
"\n" +
"public team class TeamB11sh75a_1 {\n" +
" public class R playedBy TB11sh75a {\n" +
" String mismatch() -> get int id;\n" +
" toString => toString;\n" +
" public void test() {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
" }\n" +
" public R getR() {\n" +
" return new R(new TB11sh75a());\n" +
" }\n" +
"}\n" +
" \n"
},
true/*expectingCompilerErrors*/,
"----------\n" +
"1. ERROR in TeamB11sh75a_1.java (at line 4)\n" +
" String mismatch() -> get int id;\n" +
" ^^^^^^^^^^^^^^^^^\n" +
"When binding field id via callout to role method mismatch():\n" +
"Incompatible types: can\'t convert int to java.lang.String (OTJLD 3.5(b)).\n" +
"----------\n",
"OK",
""/*expectedErrorOutput*/,
true/*forceExecution*/,
null/*classLibraries*/,
true/*shouldFlushOutputDirectory*/,
null/*vmArguments*/,
customOptions,
null/*no custom requestor*/,
true/*skipJavac*/);
}
// illegal qualified use of role in array type ref - witness for NPE in Scope.createArrayType
// B.1.1-otjld-sh-76
public void testB11_sh76() {
runNegativeTestMatching(
new String[] {
"p1/TeamB11sh76.java",
"\n" +
"package p1;\n" +
"public team class TeamB11sh76 {\n" +
" protected class R { }\n" +
" void foo (p1.TeamB11sh76.R[] roles) {}\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in p1\\TeamB11sh76.java (at line 5)\n" +
" void foo (p1.TeamB11sh76.R[] roles) {}\n" +
" ^^^^^^^^^^^^^^^^^^\n" +
"Illegal qualified use of non-public role R (OTJLD 1.2.3(b)).\n" +
"----------\n");
}
// attempted callout to constructor, CCE reported by Fabian Maack
// B.1.1-otjld-sh-77
public void testB11_sh77() {
runNegativeTestMatching(
new String[] {
"TeamB11sh77.java",
"\n" +
"public team class TeamB11sh77 {\n" +
" protected class R playedBy TB11sh77 {\n" +
" R getNew(String a) -> TB11sh77(String a);\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh77.java",
"\n" +
"public class TB11sh77 {\n" +
" public TB11sh77(String a) { }\n" +
"}\n" +
" \n"
},
"A.3.2");
}
// NPE was thrown by LiftingEnvironment if late role was unbound after inline roles are bound
// B.1.1-otjld-sh-78
public void testB11_sh78() {
runConformTest(
new String[] {
"TeamB11sh78.java",
"\n" +
"public team class TeamB11sh78 {\n" +
" \n" +
" protected class R2 playedBy TB11sh78 {\n" +
" protected void test2() {\n" +
" R1 r = new R1();\n" +
" r.test();\n" +
" }\n" +
" }\n" +
" void testt(TB11sh78 as R2 o) {\n" +
" o.test2();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" TeamB11sh78 t = new TeamB11sh78();\n" +
" t.testt(new TB11sh78());\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh78.java",
"\n" +
"public class TB11sh78 { }\n" +
" \n",
"TeamB11sh78/R1.java",
"\n" +
"team package TeamB11sh78;\n" +
"protected class R1 {\n" +
" protected void test() {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// wrong team package leaves role unresolved, NPE in RoleModel.hasBaseclassProblem() seen
// B.1.1-otjld-sh-78f
public void testB11_sh78f() {
runNegativeTest(
new String[] {
"TeamB11sh78f.java",
"\n" +
"public team class TeamB11sh78f {\n" +
"\n" +
" protected class R2 playedBy TB11sh78f {\n" +
" protected void test2() {\n" +
" R1 r = new R1();\n" +
" r.test();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh78f.java",
"\n" +
"public class TB11sh78f { }\n" +
" \n",
"TeamB11sh78f/R1.java",
"\n" +
"team package Wrong;\n" +
"protected class R1 {\n" +
" protected void test() {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh78f.java (at line 6)\n" +
" R1 r = new R1();\n" +
" ^^\n" +
"R1 cannot be resolved to a type\n" +
"----------\n" +
"2. ERROR in TeamB11sh78f.java (at line 6)\n" +
" R1 r = new R1();\n" +
" ^^\n" +
"R1 cannot be resolved to a type\n" +
"----------\n" +
"----------\n" +
"1. ERROR in TeamB11sh78f\\R1.java (at line 2)\n" +
" team package Wrong;\n" +
" ^^^^^\n" +
"Enclosing team Wrong not found for role file R1 (OTJLD 1.2.5(c)).\n" +
"----------\n" +
"2. ERROR in TeamB11sh78f\\R1.java (at line 3)\n" +
" protected class R1 {\n" +
" ^^\n" +
"Illegal modifier for the class R1; only public, abstract & final are permitted\n" +
"----------\n");
}
// a callout tries to override a callin method - witness for AIOOBE in MethodMappingImplementaor.copyArguments
// B.1.1-otjld-sh-79
public void testB11_sh79() {
runNegativeTestMatching(
new String[] {
"TeamB11sh79.java",
"\n" +
"public team class TeamB11sh79 {\n" +
" protected class R0 {\n" +
" callin void simple(int j) {}\n" +
" }\n" +
" protected class R1 extends R0 playedBy TB11sh79 {\n" +
" void simple(int k) => void simple(int j);\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh79.java",
"\n" +
"public class TB11sh79 {\n" +
" void simple(int j) {}\n" +
"}\n" +
" \n"
},
"callin");
}
// NPE observed while preparing ECOOP slides
// B.1.1-otjld-sh-80
public void testB11_sh80() {
runNegativeTest(
new String[] {
"TeamB11sh80_2.java",
"\n" +
"import p1.TeamB11sh80_1;\n" +
"import p1.TeamB11sh80_1.R_1;\n" +
"public team class TeamB11sh80_2 {\n" +
" @SuppressWarnings(\"bindingconventions\")\n" +
" protected class R_2 playedBy R_1 {\n" +
" }\n" +
"}\n" +
" \n",
"p1/TeamB11sh80_1.java",
"\n" +
"package p1;\n" +
"public team class TeamB11sh80_1 {\n" +
" public class R_1 {}\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh80_2.java (at line 3)\n" +
" import p1.TeamB11sh80_1.R_1;\n" +
" ^^^^^^^^^^^^^^^^^^^^\n" +
"Illegal import for role type p1.TeamB11sh80_1.R_1: roles cannot be imported (OTJLD 1.2.2(i)).\n" +
"----------\n" +
"2. ERROR in TeamB11sh80_2.java (at line 6)\n" +
" protected class R_2 playedBy R_1 {\n" +
" ^^^\n" +
"Missing anchor (team instance) for role type p1.TeamB11sh80_1.R_1 outside its team context (OTJLD 1.2.2(b)).\n" +
"----------\n" +
"3. ERROR in TeamB11sh80_2.java (at line 6)\n" +
" protected class R_2 playedBy R_1 {\n" +
" ^^^\n" +
"Missing anchor (team instance) for role type p1.TeamB11sh80_1.R_1 outside its team context (OTJLD 1.2.2(b)).\n" +
"----------\n" +
"4. ERROR in TeamB11sh80_2.java (at line 6)\n" +
" protected class R_2 playedBy R_1 {\n" +
" ^^^\n" +
"Missing anchor (team instance) for role type p1.TeamB11sh80_1.R_1 outside its team context (OTJLD 1.2.2(b)).\n" +
"----------\n");
}
// Various problems caused by unbalanced braces
// B.1.1-otjld-sh-81
public void testB11_sh81() {
runNegativeTest(
new String[] {
"TeamB11sh81.java",
"\n" +
"public team class TeamB11sh81 {\n" +
" protected class R1 {\n" +
" void m1() { // unfinished }\n" +
" }\n" +
" protected class R2 {\n" +
" callin void ci (Object arg) {\n" +
" }\n" +
" }\n" +
" protected class R3 implements ILowerable playedBy TB11sh81 {\n" +
" void t() {\n" +
" this.lower().bm();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh81.java",
"\n" +
"public class TB11sh81 { public void bm() {} }\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh81.java (at line 6)\n" +
" protected class R2 {\n" +
" ^^\n" +
"Member types not allowed in regular roles. Mark class TeamB11sh81.R1 as a team if R2 should be its role (OTJLD 1.5(a,b)). \n" +
"----------\n" +
"2. ERROR in TeamB11sh81.java (at line 15)\n" +
" }\n" +
" ^\n" +
"Syntax error, insert \"}\" to complete ClassBody\n" +
"----------\n");
}
// method in a nested team needs both a private-accessor and type wrapping
// B.1.1-otjld-sh-82
public void testB11_sh82() {
runConformTest(
new String[] {
"TeamB11sh82.java",
"\n" +
"public team class TeamB11sh82 {\n" +
" protected team class Mid {\n" +
" public class Role1 {\n" +
" protected void sayOK() {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
" }\n" +
" public class Role2 {\n" +
" protected void go() {\n" +
" getRole1(this).sayOK();\n" +
" }\n" +
" }\n" +
" private Role1 getRole1(Role2 r2) {\n" +
" return new Role1();\n" +
" }\n" +
" protected void test() {\n" +
" new Role2().go();\n" +
" }\n" +
" }\n" +
" protected void test() {\n" +
" new Mid().test();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh82().test();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// public field caused ctor with declared lifting to produce illegal byte code
// B.1.1-otjld-sh-83
public void testB11_sh83() {
runConformTest(
new String[] {
"TeamB11sh83_2.java",
"\n" +
"public team class TeamB11sh83_2 extends TeamB11sh83_1 {\n" +
" String s;\n" +
" protected class R playedBy TB11sh83 {\n" +
" protected void test() {\n" +
" System.out.print(getVal());\n" +
" }\n" +
" String getVal() -> get String val;\n" +
" }\n" +
" public TeamB11sh83_2(TB11sh83 as R r) { // ctor requesting copying of tsuper version\n" +
" super(r);\n" +
" s = TB11sh83.getString();\n" +
" }\n" +
" public void test() {\n" +
" this.theR.test();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh83_2(new TB11sh83()).test();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh83.java",
"\n" +
"public class TB11sh83 {\n" +
" String val = \"OK\";\n" +
" public static String getString() { return \"dontcare\"; }\n" +
"}\n" +
" \n",
"TeamB11sh83_1.java",
"\n" +
"public abstract team class TeamB11sh83_1 {\n" +
" R theR;\n" +
" int status;\n" +
" protected abstract class R {\n" +
" public int id; // offending field\n" +
" abstract protected void test();\n" +
" }\n" +
" public TeamB11sh83_1(R r) { // ctor needing copying\n" +
" this.theR = r;\n" +
" this.status = 1;\n" +
" activate(ALL_THREADS);\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// challenge copy inheritance of local type in buggy role method
// B.1.1-otjld-sh-84
public void testB11_sh84() {
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, CompilerOptions.DISABLED);
runNegativeTest(
new String[] {
"TeamB11sh84_2.java",
"\n" +
"public team class TeamB11sh84_2 extends TeamB11sh84_1 {\n" +
" \n" +
"}\n" +
" \n",
"TeamB11sh84_1.java",
"\n" +
"public team class TeamB11sh84_1 {\n" +
" protected class R {\n" +
" void test() {\n" +
" unresolved();\n" +
" new Runnable() { public void run() { System.out.println(\"would be ok\"); } }.run();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh84_1.java (at line 5)\n" +
" unresolved();\n" +
" ^^^^^^^^^^\n" +
"The method unresolved() is undefined for the type TeamB11sh84_1.R\n" +
"----------\n",
null/*classLibraries*/,
true/*shouldFlushOutputDirectory*/,
customOptions);
}
// challenge copy inheritance of local type in role method of buggy team
// B.1.1-otjld-sh-85
public void testB11_sh85() {
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, CompilerOptions.DISABLED);
runNegativeTest(
new String[] {
"TeamB11sh85_2.java",
"\n" +
"public team class TeamB11sh85_2 extends TeamB11sh85_1 {\n" +
"\n" +
"}\n" +
" \n",
"TeamB11sh85_1.java",
"\n" +
"import not.existing.Import;\n" +
"public team class TeamB11sh85_1 {\n" +
" protected class R {\n" +
" void test() {\n" +
" new Runnable() { public void run() { System.out.println(\"would be ok\"); } }.run();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh85_1.java (at line 2)\n" +
" import not.existing.Import;\n" +
" ^^^\n" +
"The import not cannot be resolved\n" +
"----------\n",
null/*classLibraries*/,
true/*shouldFlushOutputDirectory*/,
customOptions);
}
// callout refers to missing type - example thanks to Eugene Hutorny
// B.1.1-otjld-sh-86
public void testB11_sh86() {
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, CompilerOptions.DISABLED);
runConformTest(
new String[] {
"TeamB11sh86_3.java",
"\n" +
"public team class TeamB11sh86_3 extends TeamB11sh86_2 { }\n" +
" \n",
"p1/TB11sh86_1.java",
"\n" +
"package p1;\n" +
"public class TB11sh86_1 {\n" +
"}\n" +
" \n",
"TB11sh86_2.java",
"\n" +
"public class TB11sh86_2 {\n" +
" public p1.TB11sh86_1 bm(Object o) { return null; }\n" +
"}\n" +
" \n",
"TeamB11sh86_1.java",
"\n" +
"import p1.TB11sh86_1; // the BUG\n" +
"public team class TeamB11sh86_1 {\n" +
" abstract protected class R {\n" +
" public abstract TB11sh86_1 getBase(Object o);\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11sh86_2.java",
"\n" +
"import p1.TB11sh86_1;\n" +
"public team class TeamB11sh86_2 extends TeamB11sh86_1 {\n" +
" @Override\n" +
" protected class R playedBy TB11sh86_2 {\n" +
" getBase -> bm;\n" +
" }\n" +
"}\n" +
" \n"},
null,
null/*classLibraries*/,
false/*shouldFlushOutputDirectory*/,
null/*vmArguments*/,
customOptions,
null/*requestor*/);
runNegativeTest(
new String[] {
"TeamB11sh86_1.java",
"\n" +
"//import p1.TB11sh86_1; // the BUG\n" +
"public team class TeamB11sh86_1 {\n" +
" abstract protected class R {\n" +
" public abstract TB11sh86_1 getBase(Object o);\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh86_1.java (at line 5)\n" +
" public abstract TB11sh86_1 getBase(Object o);\n" +
" ^^^^^^^^^^\n" +
"TB11sh86_1 cannot be resolved to a type\n" +
"----------\n",
null/*classLibraries*/,
false/*shouldFlushOutputDirectory*/,
customOptions,
true/*generateOutput*/,
false/*showCategory*/,
false/*showWarningToken*/);
runNegativeTest(
new String[] {
// same as above
"TeamB11sh86_2.java",
"\n" +
"import p1.TB11sh86_1;\n" +
"public team class TeamB11sh86_2 extends TeamB11sh86_1 {\n" +
" @Override\n" +
" protected class R playedBy TB11sh86_2 {\n" +
" getBase -> bm;\n" +
" }\n" +
"}\n" +
" \n"
},
// FIXME(SH): why these errors:?
(this.weavingScheme == WeavingScheme.OTRE && this.complianceLevel >= ClassFileConstants.JDK1_8
?
"----------\n" +
"1. WARNING in TeamB11sh86_2.java (at line 5)\n" +
" protected class R playedBy TB11sh86_2 {\n" +
" ^^^^^^^^^^\n" +
"Base class TB11sh86_2 has class file version 52 which cannot be handled by the traditional OTRE based on BCEL. Please consider using the ASM based OTDRE instead.\n" +
"----------\n" +
"2. ERROR in TeamB11sh86_2.java (at line 6)\n" +
" getBase -> bm;\n" +
" ^^^^^^^\n" +
"A non-abstract role method exists for this callout-binding. Use callout-override (\'=>\') if you want to override it (OTJLD 3.1(e)).\n" +
"----------\n" +
"3. ERROR in TeamB11sh86_2.java (at line 6)\n" +
" getBase -> bm;\n" +
" ^^^^^^^\n" +
"The return type is incompatible with TeamB11sh86_1.R.getBase(Object)\n" +
"----------\n"
:
"----------\n" +
"1. ERROR in TeamB11sh86_2.java (at line 6)\n" +
" getBase -> bm;\n" +
" ^^^^^^^\n" +
"A non-abstract role method exists for this callout-binding. Use callout-override (\'=>\') if you want to override it (OTJLD 3.1(e)).\n" +
"----------\n" +
"2. ERROR in TeamB11sh86_2.java (at line 6)\n" +
" getBase -> bm;\n" +
" ^^^^^^^\n" +
"The return type is incompatible with TeamB11sh86_1.R.getBase(Object)\n" +
"----------\n"
),
null/*classLibraries*/,
false/*shouldFlushOutputDirectory*/,
customOptions,
true/*generateOutput*/,
false/*showCategory*/,
false/*showWarningToken*/);
runNegativeTest(
new String[] {
// same as above
"TeamB11sh86_3.java",
"\n" +
"public team class TeamB11sh86_3 extends TeamB11sh86_2 { }\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh86_3.java (at line 1)\n" +
" \n" +
"public team class TeamB11sh86_3 extends TeamB11sh86_2 { }\n" +
" ^\n" +
"The type TB11sh86_1 cannot be resolved. It is indirectly referenced from required .class files\n" +
"----------\n",
null/*classLibraries*/,
false/*shouldFlushOutputDirectory*/,
customOptions);
}
// challenging decapsulation an inherited method - exception reported by Eugene Hutorny
// B.1.1-otjld-sh-87
public void testB11_sh87() {
runConformTest(
new String[] {
"pb/TB11sh87Main.java",
"\n" +
"package pb;\n" +
"public class TB11sh87Main {\n" +
" public static void main(String[] args) {\n" +
" pb.TB11sh87.InnerBase o = new pb.TB11sh87().new InnerBase();\n" +
" new TeamB11sh87_3().test(o);\n" +
" System.out.print(o.toString());\n" +
" }\n" +
"}\n" +
" \n",
"pt/TB11sh87_0.java",
"\n" +
"package pt;\n" +
"import java.math.BigDecimal;\n" +
"public abstract class TB11sh87_0 {\n" +
" protected BigDecimal amount;\n" +
" protected void setAmount(BigDecimal amount) {\n" +
" this.amount = amount;\n" +
" }\n" +
"}\n" +
" \n",
"pb/TB11sh87.java",
"\n" +
"package pb;\n" +
"public class TB11sh87 {\n" +
" protected class InnerBase extends pt.TB11sh87_0 {\n" +
" public String toString() {\n" +
" return amount.toString();\n" +
" }\n" +
" }\n" +
"}\n" +
" \n",
"pt/TeamB11sh87_1.java",
"\n" +
"package pt;\n" +
"import java.math.BigDecimal;\n" +
"public team class TeamB11sh87_1 {\n" +
" abstract protected class R {\n" +
" abstract protected void setAmount(BigDecimal amount);\n" +
" }\n" +
" public void test(R o) {\n" +
" o.setAmount(new BigDecimal(42));\n" +
" }\n" +
"}\n" +
" \n",
"pb/TeamB11sh87_2.java",
"\n" +
"package pb;\n" +
"public team class TeamB11sh87_2 extends pt.TeamB11sh87_1 {\n" +
" protected class R playedBy TB11sh87.InnerBase {\n" +
" @SuppressWarnings(\"decapsulation\")\n" +
" setAmount -> setAmount;\n" +
" }\n" +
"}\n" +
" \n",
"pb/TeamB11sh87_3.java",
"\n" +
"package pb;\n" +
"public team class TeamB11sh87_3 extends TeamB11sh87_2 {\n" +
" public void test(TB11sh87.InnerBase as R o) {\n" +
" super.test(o);\n" +
" }\n" +
"}\n" +
" \n"
},
"42");
}
// Precedence declaration with unqualified names on team level (reported in TPX-315).
// B.1.1-otjld-ph-1
public void testB11_sh88() {
runNegativeTest(
new String[] {
"TB11sh88.java",
"\n" +
"public class TB11sh88 {\n" +
" void foo() {}\n" +
"}\n" +
" \n",
"TeamB11sh88.java",
"\n" +
"public team class TeamB11sh88 {\n" +
" public class RB11sh881 playedBy TB11sh88 {\n" +
" callin1: bar <- after foo;\n" +
" void bar() {}\n" +
" }\n" +
" public class RB11sh882 playedBy TB11sh88 {\n" +
" callin2: bar <- after foo;\n" +
" void bar() {}\n" +
" }\n" +
" precedence callin1, callin2;\n" +
"}\n" +
" \n"
},
null);
}
// Callin binding w/ static base method (reported in TPX-318).
// B.1.1-otjld-sh-89
public void testB11_sh89() {
runConformTest(
new String[] {
"TeamB11sh89Main.java",
"\n" +
"public team class TeamB11sh89Main {\n" +
" public class RB11sh89 playedBy TB11sh89 {\n" +
" foo <- after bar; \n" +
" static void foo() {System.out.print(\"OK\");}\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" TeamB11sh89Main t = new TeamB11sh89Main();\n" +
" t.activate();\n" +
" TB11sh89.bar();\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh89.java",
"\n" +
"public class TB11sh89 {\n" +
" static void bar() {}\n" +
"}\n" +
"\n"
},
"OK");
}
// TPX-321: Duplicate role causes InternalCompilerError
// B.1.1-otjld-sh-90
public void testB11_sh90() {
String convertedOutputPath = new String(OUTPUT_DIR+'/').replace('/', '\\');
myWriteFiles(
new String[] {
"TeamB11sh90.java",
"\n" +
" public team class TeamB11sh90 {\n" +
" public class RB11sh90 {}\n" +
" void foo() { new RB11sh90(); }\n" +
" }\n" +
" \n",
"TB11sh90.java",
"\n" +
"public class TB11sh90 {}\n",
"TeamB11sh90/.stamp","" // force directory created
});
runNegativeTest(
new String[] {
"TeamB11sh90/RB11sh90.java",
"\n" +
"team package TeamB11sh90;\n" +
"public class RB11sh90 playedBy TB11sh90 {}\n"
},
"----------\n" +
"1. ERROR in "+convertedOutputPath+"TeamB11sh90.java (at line 3)\n" +
" public class RB11sh90 {}\n" +
" ^^^^^^^^\n" +
"The method put(TB11sh90, TeamB11sh90.RB11sh90) in the type DoublyWeakHashMap<TB11sh90,RB11sh90<@tthis[TeamB11sh90]>> is not applicable for the arguments (TB11sh90, TeamB11sh90.RB11sh90)\n" +
"----------\n" +
"----------\n" +
"1. ERROR in TeamB11sh90\\RB11sh90.java (at line 3)\n" +
" public class RB11sh90 playedBy TB11sh90 {}\n" +
" ^^^^^^^^\n" +
"Duplicate nested type RB11sh90\n" +
"----------\n",
null/*classLibraries*/,
false/*shouldFlushOutputDirectory*/,
null/*customOptions*/);
}
// Incorrect precedence declaration causes NPE (reported in TPX-324).
// B.1.1-otjld-sh-91
public void testB11_sh91() {
runNegativeTestMatching(
new String[] {
"TeamB11sh91.java",
"\n" +
"public team class TeamB11sh91 {\n" +
" public class RB11sh911 playedBy TB11sh91 {\n" +
" callin1: bar <- after foo;\n" +
" void bar() {}\n" +
" }\n" +
" public class RB11sh912 playedBy TB11sh91 {\n" +
" callin2: bar <- after foo;\n" +
" void bar() {}\n" +
" }\n" +
" precedence RB11sh911.callin2, RB11sh912.callin2;\n" +
"}\n" +
" \n",
"TB11sh91.java",
"\n" +
"public class TB11sh91 {\n" +
" void foo() {}\n" +
"}\n" +
" \n"
},
"4.8(b)");
}
// this produces an NPE in Expression.computeConversion
// B.1.1-otjld-sh-92
public void testB11_sh92() {
runNegativeTestMatching(
new String[] {
"TeamB11sh92.java",
"\n" +
"import java.util.*;\n" +
"import base p.IB11sh92;\n" +
"import base p.B11sh92_2;\n" +
"public team class TeamB11sh92 {\n" +
" protected class RBroken implements IB11sh92 playedBy IB11sh92 {\n" +
" \n" +
" }\n" +
" public class ROK playedBy B11sh92_2 {\n" +
" private Collection<RBroken> roles = new LinkedList<RBroken>();\n" +
" void addRole(RBroken r) {\n" +
" roles.add(r);\n" +
" }\n" +
" addRole <- after addBase;\n" +
" }\n" +
"}\n" +
" \n",
"p/IB11sh92.java",
"\n" +
"package p;\n" +
"public interface IB11sh92 {\n" +
"}\n" +
" \n",
"p/B11sh92_1.java",
"\n" +
"package p;\n" +
"public class B11sh92_1 implements IB11sh92 {\n" +
"}\n" +
" \n",
"p/B11sh92_2.java",
"\n" +
"package p;\n" +
"public class B11sh92_2 { \n" +
" void addBase(B11sh92_1 b) {\n" +
" }\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh92.java (at line 6)\n" +
" protected class RBroken implements IB11sh92 playedBy IB11sh92 {\n" +
" ^^^^^^^^\n" +
"IB11sh92 cannot be resolved to a type\n" +
"----------\n" +
"2. WARNING in TeamB11sh92.java (at line 6)\n" +
" protected class RBroken implements IB11sh92 playedBy IB11sh92 {\n" +
" ^^^^^^^^\n" +
"When binding interface IB11sh92 as base of RBroken:\n" +
"Note that some features like callin bindings are not yet supported in this situation (OTJLD 2.1.1).\n" +
"----------\n");
}
// callin w/ one-way parameter mapping
// B.1.1-otjld-sh-93
public void testB11_sh93() {
runConformTest(
new String[] {
"TeamB11sh93.java",
"\n" +
"public team class TeamB11sh93 {\n" +
" protected class R0 playedBy B11sh93 {\n" +
" @SuppressWarnings(\"basecall\")\n" +
" callin int rm(String s, int iR) {\n" +
" System.out.print(s);\n" +
" return iR*2;\n" +
" }\n" +
" int rm(String s, int iR) <- replace int bm0(int iB) with {\n" +
" s <- \"test\",\n" +
" iR <- iB\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11sh93().activate();\n" +
" System.out.print(new B11sh93().bm0(3));\n" +
" }\n" +
"}\n" +
" \n",
"B11sh93.java",
"\n" +
"public class B11sh93 {\n" +
" public int bm0(int iB) {\n" +
" return 0;\n" +
" }\n" +
"}\n" +
" \n"
},
"test6");
}
// syntax error caused ICE in PredicateGenerator.linkPredicates
// B.1.1-otjld-sh-94
public void testB11_sh94() {
runNegativeTest(
new String[] {
"TeamB11sh94.java",
"\n" +
"public team class TeamB11sh94 {\n" +
" protected class R playedBy TB11sh94 \n" +
" base when activated // bug\n" +
" {\n" +
" callin void olleh() {\n" +
" base.olleh();\n" +
" }\n" +
" olleh <- replace hello;\n" +
" }\n" +
"}\n" +
" \n",
"TB11sh94.java",
"\n" +
"public class TB11sh94 {\n" +
" void hello() {}\n" +
"}\n" +
" \n"
},
"----------\n" +
"1. ERROR in TeamB11sh94.java (at line 4)\n" +
" base when activated // bug\n" +
" ^^^^^^^^^^^^^^^^^^^\n" +
"Syntax error on tokens, delete these tokens\n" +
"----------\n");
}
// Bug 350318 - [compiler] Erroneous name clash error in @Override methods
// originally reported by André Lehmann
public void testB11_sh95() {
compileOrder = new String[][] { {"Visitor.java"}, {"Caller.java"}};
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, CompilerOptions.DISABLED);
runTestExpectingWarnings(
new String[] {
"Caller.java",
"\n" +
"public class Caller {\n" +
" private static class VisitorImpl extends VisitorAdapter<Object> {\n" +
" \n" +
" @Override\n" +
" public Parameter1 visit(Long r, Object a) {\n" +
" return null;\n" +
" }\n" +
" \n" +
" @Override\n" +
" public Parameter1 visit(Integer r, Object a) {\n" +
" return null;\n" +
" }\n" +
" \n" +
" @Override\n" +
" public Parameter1 visit(Number r, Object a) {\n" +
" return null;\n" +
" }\n" +
" }\n" +
"\n" +
" private void accept(Visitor<Parameter1, Parameter2> v) {\n" +
" v.visit(1, new Parameter2());\n" +
" }\n" +
" \n" +
" public void start() {\n" +
" }\n" +
"}\n",
"Visitor.java",
"public interface Visitor<R, A> {\n" +
"\n" +
" R visit(Long r, A a);\n" +
"\n" +
" R visit(Integer r, A a);\n" +
"\n" +
" R visit(Number r, A a);\n" +
"}\n" +
"class Parameter1 {\n" +
" \n" +
"}\n" +
"class Parameter2 {\n" +
" \n" +
"}\n" +
"abstract class VisitorAdapter<A> implements Visitor<Parameter1, A> {\n" +
"\n" +
" public Parameter1 visit(Long r, A a) {\n" +
" return null;\n" +
" }\n" +
"\n" +
" public Parameter1 visit(Integer r, A a) {\n" +
" return null;\n" +
" }\n" +
"\n" +
" public Parameter1 visit(Number r, A a) {\n" +
" return null;\n" +
" }\n" +
" \n" +
"}\n"
},
"----------\n" +
"1. WARNING in Caller.java (at line 3)\n" +
" private static class VisitorImpl extends VisitorAdapter<Object> {\n" +
" ^^^^^^^^^^^\n" +
"The type Caller.VisitorImpl is never used locally\n" +
"----------\n" +
"2. WARNING in Caller.java (at line 21)\n" +
" private void accept(Visitor<Parameter1, Parameter2> v) {\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"The method accept(Visitor<Parameter1,Parameter2>) from the type Caller is never used locally\n" +
"----------\n",
options);
}
// witness for NPE in AstGenerator.baseclassReference(TypeBinding, boolean) from SerializationGenerator.fillRestoreRole(TypeDeclaration, FieldDeclaration[])
public void testB11_sh96() {
Map customOptions = getCompilerOptions();
customOptions.put(JavaCore.COMPILER_COMPLIANCE, "1.3");
customOptions.put(JavaCore.COMPILER_SOURCE, "1.3");
customOptions.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, "1.3");
runNegativeTest(
new String[] {
"TB11sh4.java",
"\n" +
"public class TB11sh4 {} \n" +
" \n",
"TeamB11sh4_1.java",
"\n" +
"public team class TeamB11sh4_1 implements java.io.Serializable {\n" +
" protected TeamB11sh4_1 (Role1 r) { \n" +
" } \n" +
" public class Role1 playedBy TB11sh4 {} \n" +
"}\n"
},
"----------\n" +
"1. ERROR in TeamB11sh4_1.java (at line 2)\n" +
" public team class TeamB11sh4_1 implements java.io.Serializable {\n" +
" ^^^^^^^^^^^\n" +
"Name clash: The method restoreRole(Class<?>, Object) of type TeamB11sh4_1 has the same erasure as restoreRole(Class, Object) of type Team but does not override it\n" +
"----------\n" +
"2. WARNING in TeamB11sh4_1.java (at line 2)\n" +
" public team class TeamB11sh4_1 implements java.io.Serializable {\n" +
" ^^^^^^^^^^^^\n" +
"The serializable class TeamB11sh4_1 does not declare a static final serialVersionUID field of type long\n" +
"----------\n",
null/*classLibraries*/,
true/*shouldFlushOutputDirectory*/,
customOptions,
true/*generateOutput*/,
false/*showCategory*/,
false/*showWarningToken*/);
}
// Bug 366597 - [compiler] NPE with role ifc wrongly interpreted as a team
public void testB11_sh97() {
runNegativeTest(new String[] {
"t/T1.java",
"package t;\n" +
"import base b.Base;\n" +
"public team class T1 {\n" +
" protected interface IR\n" +
" public class R2 playedBy Base {\n" +
" void bar() {\n" +
" this.foo();\n" +
" }\n" +
" }\n" +
"}\n",
"b/Base.java",
"package b;\n" +
"public class Base { void foo() {} }\n"
},
"----------\n" +
"1. ERROR in t\\T1.java (at line 4)\n" +
" protected interface IR\n" +
" ^^\n" +
"Syntax error, insert \"InterfaceBody\" to complete ClassBodyDeclarations\n" +
"----------\n" +
"2. ERROR in t\\T1.java (at line 5)\n" +
" public class R2 playedBy Base {\n" +
" ^^\n" +
"Member types not allowed in regular roles. Mark class t.T1.IR as a team if R2 should be its role (OTJLD 1.5(a,b)). \n" +
"----------\n" +
"3. ERROR in t\\T1.java (at line 7)\n" +
" this.foo();\n" +
" ^^^^\n" +
"Missing anchor (team instance) for role type t.T1.IR.R2 outside its team context (OTJLD 1.2.2(b)).\n" +
"----------\n" +
"4. WARNING in t\\T1.java (at line 7)\n" +
" this.foo();\n" +
" ^^^^^^^^^^\n" +
"Access restriction of method foo() in type b.Base is overridden by this method binding (OTJLD 3.4(a)).\n" +
"----------\n" +
"5. ERROR in t\\T1.java (at line 7)\n" +
" this.foo();\n" +
" ^^^^^^^^^^\n" +
"Unresolved self call foo() is implicitly bound by an inferred callout (OTJLD 3.1(j)).\n" +
"----------\n");
}
// Bug 366597 - [compiler] NPE with role ifc wrongly interpreted as a team
public void testB11_sh98() {
runNegativeTest(new String[] {
"t/T1.java",
"package t;\n" +
"import base b.Base;\n" +
"public team class T1 extends T0 {\n" +
" protected team interface IR {}\n" +
" @Override\n" +
" protected class R2 playedBy Base {\n" +
" void bar() {\n" +
" this.foo();\n" +
" }\n" +
" }\n" +
"}\n",
"t/T0.java",
"package t;\n" +
"public team class T0 {\n" +
" protected class R2 {}" +
"}\n",
"b/Base.java",
"package b;\n" +
"public class Base { void foo() {} }\n"
},
"----------\n" +
"1. ERROR in t\\T1.java (at line 4)\n" +
" protected team interface IR {}\n" +
" ^^\n" +
"Illegal modifier for the member interface IR; only public, protected, private, abstract & static are permitted\n" +
"----------\n" +
"2. WARNING in t\\T1.java (at line 8)\n" +
" this.foo();\n" +
" ^^^^^^^^^^\n" +
"Access restriction of method foo() in type b.Base is overridden by this method binding (OTJLD 3.4(a)).\n" +
"----------\n" +
"3. ERROR in t\\T1.java (at line 8)\n" +
" this.foo();\n" +
" ^^^^^^^^^^\n" +
"Unresolved self call foo() is implicitly bound by an inferred callout (OTJLD 3.1(j)).\n" +
"----------\n");
}
// reported by Christine Hundt
// B.1.1-otjld-ju-1
public void testB11_ju1() {
runConformTest(
new String[] {
"TB11ju1Main.java",
"\n" +
"public class TB11ju1Main {\n" +
" public static void main(String[] args) {\n" +
" TB11ju1 b = new TB11ju1();\n" +
" TeamB11ju1 t = new TeamB11ju1();\n" +
" t.activate();\n" +
" System.out.println(b.bm());\n" +
" }\n" +
"\n" +
"}\n" +
" \n",
"TB11ju1.java",
"\n" +
"public class TB11ju1 {\n" +
" public int bm() {\n" +
" System.out.println(\"TB11ju1.bm()\"); \n" +
" return 8;\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11ju1.java",
"\n" +
"public team class TeamB11ju1 {\n" +
" public class RB11ju1 playedBy TB11ju1 {\n" +
" @SuppressWarnings(\"basecall\")\n" +
" callin void rm() {\n" +
" if (false)\n" +
" base.rm();\n" +
" System.out.println(\"MyTeam.MyRole.rm()\");\n" +
" }\n" +
" \n" +
" void rm() <- replace int bm() with {\n" +
" 7 -> result\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
},
"MyTeam.MyRole.rm()\n" +
"7");
}
// TPX-318: Callin binding doesn't work with static base method. Callin-binding (after) w/ static method.
// B.1.1-otjld-ju-2
public void testB11_ju2() {
runConformTest(
new String[] {
"TB11ju2Main.java",
"\n" +
" public class TB11ju2Main {\n" +
" public static void main(String[] args) {\n" +
" TeamB11ju2 t = new TeamB11ju2();\n" +
" t.activate();\n" +
" //TB11ju2 b = new TB11ju2();\n" +
" TB11ju2.sm();\n" +
" }\n" +
" }\n" +
" \n",
"TB11ju2.java",
"\n" +
" public class TB11ju2 {\n" +
" public static void sm(){} \n" +
" }\n" +
" \n",
"TeamB11ju2.java",
"\n" +
" public team class TeamB11ju2 {\n" +
" public class RB11ju2 playedBy TB11ju2 {\n" +
" public static void srm() {\n" +
" System.out.print(\"OK\");\n" +
" } \n" +
" srm <- after sm;\n" +
" }\n" +
" }\n" +
" \n"
},
"OK");
}
// TPX-318: Callin binding doesn't work with static base method. Callin-binding (before) w/ static method.
// B.1.1-otjld-ju-3
public void testB11_ju3() {
runConformTest(
new String[] {
"TB11ju3Main.java",
"\n" +
" public class TB11ju3Main {\n" +
" public static void main(String[] args) {\n" +
" TeamB11ju3 t = new TeamB11ju3();\n" +
" t.activate();\n" +
" TB11ju3 b = new TB11ju3();\n" +
" TB11ju3.sm();\n" +
" }\n" +
" }\n" +
" \n",
"TB11ju3.java",
"\n" +
" public class TB11ju3 {\n" +
" public static void sm(){} \n" +
" }\n" +
" \n",
"TeamB11ju3.java",
"\n" +
" public team class TeamB11ju3 {\n" +
" public class RB11ju3 playedBy TB11ju3 {\n" +
" public static void srm() {\n" +
" System.out.print(\"OK\");\n" +
" } \n" +
" srm <- before sm;\n" +
" }\n" +
" }\n" +
" \n"
},
"OK");
}
// TPX-318: Callin binding doesn't work with static base method. Callin binding w/ static method with an argument.
// B.1.1-otjld-ju-4
public void testB11_ju4() {
runConformTest(
new String[] {
"TB11ju4Main.java",
"\n" +
" public class TB11ju4Main {\n" +
" public static void main(String[] args) {\n" +
" TeamB11ju4 t = new TeamB11ju4();\n" +
" t.activate();\n" +
" TB11ju4 b = new TB11ju4();\n" +
" TB11ju4.sm(0);\n" +
" }\n" +
" }\n" +
" \n",
"TB11ju4.java",
"\n" +
" public class TB11ju4 {\n" +
" public static void sm(int a){} \n" +
" }\n" +
" \n",
"TeamB11ju4.java",
"\n" +
" public team class TeamB11ju4 {\n" +
" public class RB11ju4 playedBy TB11ju4 {\n" +
" public static void srm(int b) {\n" +
" System.out.print(\"OK\");\n" +
" } \n" +
" srm <- after sm;\n" +
" }\n" +
" }\n" +
" \n"
},
"OK");
}
// TPX-318: Callin binding doesn't work with static base method. Callin binding (replace) w/ static method with an argument.
// B.1.1-otjld-ju-5
public void testB11_ju5() {
runConformTest(
new String[] {
"TB11ju5Main.java",
"\n" +
" public class TB11ju5Main {\n" +
" public static void main(String[] args) {\n" +
" TeamB11ju5 t = new TeamB11ju5();\n" +
" t.activate();\n" +
" TB11ju5 b = new TB11ju5();\n" +
" TB11ju5.sm(0);\n" +
" }\n" +
" }\n" +
" \n",
"TB11ju5.java",
"\n" +
" public class TB11ju5 {\n" +
" public static void sm(int a){} \n" +
" }\n" +
" \n",
"TeamB11ju5.java",
"\n" +
" public team class TeamB11ju5 {\n" +
" public class RB11ju5 playedBy TB11ju5 {\n" +
" static callin void srm(int b) {\n" +
" System.out.print(\"OK\");\n" +
" base.srm(b);\n" +
" } \n" +
" srm <- replace sm;\n" +
" }\n" +
" }\n" +
" \n"
},
"OK");
}
// Generic type in the base method signature causes a ClassFormatError. (reported in TPX-476)
// B.1.1-otjld-ju-6
public void testB11_ju6() {
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_LocalVariableAttribute, CompilerOptions.GENERATE);
customOptions.put(CompilerOptions.OPTION_LineNumberAttribute, CompilerOptions.GENERATE);
customOptions.put(CompilerOptions.OPTION_SourceFileAttribute, CompilerOptions.GENERATE);
runConformTest(
new String[] {
"TB11ju6Main.java",
"\n" +
" public class TB11ju6Main {\n" +
" public static void main(String[] args) {\n" +
" TeamB11ju6 t = new TeamB11ju6();\n" +
" t.activate();\n" +
" TB11ju6<String> b = new TB11ju6<String>();\n" +
" b.baseMethod(\"nothing\");\n" +
" }\n" +
" }\n" +
" \n",
"TB11ju6.java",
"\n" +
" public class TB11ju6<G> {\n" +
" public void baseMethod(G param){\n" +
" return;\n" +
" }\n" +
" }\n" +
" \n",
"TeamB11ju6.java",
"\n" +
" public team class TeamB11ju6 {\n" +
" @SuppressWarnings(\"rawtypes\")\n" +
" public class RB11ju6 playedBy TB11ju6 {\n" +
" void roleMethod(){\n" +
" System.out.print(\"OK\");\n" +
" } \n" +
" roleMethod <- after baseMethod;\n" +
" }\n" +
" }\n" +
" \n"
},
"OK",
null/*classLibraries*/,
true/*shouldFlushOutputDirectory*/,
null/*vmArguments*/,
customOptions,
null/*no custom requestor*/);
}
// Wrong calculation of base field type
// B.1.1-otjld-ch-1
public void testB11_ch1() {
runConformTest(
new String[] {
"TB11ch1Main.java",
"\n" +
"public class TB11ch1Main {\n" +
" public static void main(String[] args) {\n" +
" new TeamB11ch1SuperAdapt().activate();\n" +
" new TeamB11ch1SubAdapt().activate();\n" +
" \n" +
" TB11ch1Sub b = new TB11ch1Sub();\n" +
" b.bm();\n" +
" }\n" +
"}\n" +
" \n",
"TB11ch1Super.java",
"\n" +
"public class TB11ch1Super {\n" +
" void bm() {\n" +
" System.out.print(\"K\");\n" +
" }\n" +
"}\n" +
" \n",
"TB11ch1Sub.java",
"\n" +
"public class TB11ch1Sub extends TB11ch1Super {}\n" +
" \n",
"TeamB11ch1SuperAdapt.java",
"\n" +
"public team class TeamB11ch1SuperAdapt {\n" +
" public class RB11ch11 playedBy TB11ch1Super {}\n" +
"}\n" +
" \n",
"TeamB11ch1SubAdapt.java",
"\n" +
"public team class TeamB11ch1SubAdapt {\n" +
" public class RB11ch11 playedBy TB11ch1Sub {\n" +
" callin void rm() {\n" +
" System.out.print(\"O\");\n" +
" base.rm();\n" +
" \n" +
" }\n" +
" rm <- replace bm;\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// Wrong calculation of base field type
// B.1.1-otjld-ch-2
public void testB11_ch2() {
runConformTest(
new String[] {
"TB11ch2Main.java",
"\n" +
"public class TB11ch2Main {\n" +
" public static void main(String[] args) {\n" +
" new TeamB11ch2SuperAdapt().activate();\n" +
" new TeamB11ch2SubAdapt().activate();\n" +
" \n" +
" TB11ch2Sub b = new TB11ch2Sub();\n" +
" b.bm();\n" +
" }\n" +
"}\n" +
" \n",
"TB11ch2Super.java",
"\n" +
"public class TB11ch2Super {\n" +
" void bm() {\n" +
" System.out.print(\"K\");\n" +
" }\n" +
"}\n" +
" \n",
"TB11ch2.java",
"\n" +
"public class TB11ch2 extends TB11ch2Super {}\n" +
" \n",
"TB11ch2Sub.java",
"\n" +
"public class TB11ch2Sub extends TB11ch2 {}\n" +
" \n",
"TeamB11ch2SuperAdapt.java",
"\n" +
"public team class TeamB11ch2SuperAdapt {\n" +
" public class RB11ch21 playedBy TB11ch2Super {}\n" +
"}\n" +
" \n",
"TeamB11ch2SubAdapt.java",
"\n" +
"public team class TeamB11ch2SubAdapt {\n" +
" public class RB11ch21Super playedBy TB11ch2 {}\n" +
" public class RB11ch21 extends RB11ch21Super playedBy TB11ch2Sub {\n" +
" callin void rm() {\n" +
" System.out.print(\"O\");\n" +
" base.rm();\n" +
" \n" +
" }\n" +
" rm <- replace bm;\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// Shorthand notation of callin binding fails
// B.1.1-otjld-ch-3
public void testB11_ch3() {
runConformTest(
new String[] {
"TB11ch3_2.java",
"\n" +
"public class TB11ch3_2 {}\n" +
" \n",
"TeamB11ch3_1.java",
"\n" +
"public team class TeamB11ch3_1 {\n" +
" public class RB11ch3_1 {\n" +
" callin void rm(RB11ch3_2 r2) {\n" +
" base.rm(r2);\n" +
" }\n" +
" }\n" +
" public class RB11ch3_2 {}\n" +
"}\n" +
" \n",
"TeamB11ch3_2.java",
"\n" +
"public team class TeamB11ch3_2 extends TeamB11ch3_1 {\n" +
" public class RB11ch3_1 playedBy TB11ch3_1 {\n" +
" rm <- replace bm;\n" +
" }\n" +
" public class RB11ch3_2 playedBy TB11ch3_2 {}\n" +
"}\n" +
" \n",
"TB11ch3_1.java",
"\n" +
"public class TB11ch3_1 {\n" +
" void bm(TB11ch3_2 b2) {}\n" +
"}\n" +
" \n"
});
}
// Same as B.1.1-otjld-ch-3, but with detailed notation
// B.1.1-otjld-ch-3a
public void testB11_ch3a() {
runConformTest(
new String[] {
"TB11ch3a_2.java",
"\n" +
"public class TB11ch3a_2 {}\n" +
" \n",
"TeamB11ch3a_1.java",
"\n" +
"public team class TeamB11ch3a_1 {\n" +
" public class RB11ch3a_1 {\n" +
" callin void rm(RB11ch3a_2 r2) {\n" +
" base.rm(r2);\n" +
" }\n" +
" }\n" +
" public class RB11ch3a_2 {}\n" +
"}\n" +
" \n",
"TeamB11ch3a_2.java",
"\n" +
"public team class TeamB11ch3a_2 extends TeamB11ch3a_1 {\n" +
" public class RB11ch3a_1 playedBy TB11ch3a_1 {\n" +
" void rm(RB11ch3a_2 r2) <- replace void bm(TB11ch3a_2 b2);\n" +
" }\n" +
" public class RB11ch3a_2 playedBy TB11ch3a_2 {}\n" +
"}\n" +
" \n",
"TB11ch3a_1.java",
"\n" +
"public class TB11ch3a_1 {\n" +
" void bm(TB11ch3a_2 b2) {}\n" +
"}\n" +
" \n"
});
}
// Problem with a static field in a role an inheritance
// B.1.1-otjld-ch-4
public void testB11_ch4() {
runConformTest(
new String[] {
"TeamB11ch4_2.java",
"\n" +
"public team class TeamB11ch4_2 extends TeamB11ch4_1 {\n" +
" public static void main(String[] args) {\n" +
" new TeamB11ch4_2().test();\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11ch4_1.java",
"\n" +
"public team class TeamB11ch4_1 {\n" +
" public class RB11ch4_1 {\n" +
" private static final int MY_STATIC = 0;\n" +
" protected void rm(int i) {\n" +
" if (MY_STATIC > i) {\n" +
" System.out.print(\"Problem!\");\n" +
" } else {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
" }\n" +
" }\n" +
" void test() {\n" +
" new RB11ch4_1().rm(0);\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// No problem with a static field in a role without inheritance
// B.1.1-otjld-ch-4a
public void testB11_ch4a() {
runConformTest(
new String[] {
"TeamB11ch4a_1.java",
"\n" +
"public team class TeamB11ch4a_1 {\n" +
" public class RB11ch4a_1 {\n" +
" private static final int MY_STATIC = 0;\n" +
" // method just added to avoid unused warning:\n" +
" void rm(int i) {\n" +
" if (MY_STATIC > i) {\n" +
" System.out.print(\"Problem!\");\n" +
" }\n" +
" }\n" +
" }\n" +
"}\n" +
" \n"
});
}
// Problem with a static field in a role an inheritance - additional static field in the subrole
// B.1.1-otjld-ch-5
public void testB11_ch5() {
runConformTest(
new String[] {
"TeamB11ch5_2.java",
"\n" +
"public team class TeamB11ch5_2 extends TeamB11ch5_1 {\n" +
" public class RB11ch5_1 {\n" +
" final static String ERROR_VALUE = \"\";\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new TeamB11ch5_2().test();\n" +
" }\n" +
"}\n" +
" \n",
"TeamB11ch5_1.java",
"\n" +
"public team class TeamB11ch5_1 {\n" +
" public class RB11ch5_1 {\n" +
" private static final int MY_STATIC = 0;\n" +
" protected void rm() {\n" +
" if (MY_STATIC > 0) {\n" +
" System.out.print(\"Problem!\");\n" +
" } else {\n" +
" System.out.print(\"OK\");\n" +
" }\n" +
" }\n" +
" }\n" +
" void test() {\n" +
" new RB11ch5_1().rm();\n" +
" }\n" +
"}\n" +
" \n"
},
"OK");
}
// Problem with a static field in a role and inheritance - non-constant initialization of static field
// B.1.1-otjld-ch-5a
public void testB11_ch5a() {
runNegativeTestMatching(
new String[] {
"TeamB11ch5a.java",
"\n" +
"public team class TeamB11ch5a {\n" +
" public class RB11ch5a {\n" +
" private static final int MY_STATIC = gv();\n" +
" private static int gv() { return 3; }\n" +
" static int access() { return MY_STATIC; }\n" +
" }\n" +
"}\n" +
" \n"
},
"1.2.1(g)");
}
// Problem with a static field in a role and inheritance - static initializer
// B.1.1-otjld-ch-5b
public void testB11_ch5b() {
runNegativeTestMatching(
new String[] {
"TeamB11ch5b.java",
"\n" +
"public team class TeamB11ch5b {\n" +
" public class RB11ch5b {\n" +
" private static final int MY_STATIC;\n" +
" static {\n" +
" MY_STATIC = gv();\n" +
" }\n" +
" private static int gv() { return 3; }\n" +
" }\n" +
"}\n" +
" \n"
},
"static initializer");
}
// variant reported by Andreas Werner: public fields
// B.1.1-otjld-ch-5c
public void testB11_ch5c() {
runNegativeTestMatching(
new String[] {
"test/TeamB11ch5c.java",
"\n" +
"package test;\n" +
"public team class TeamB11ch5c {\n" +
" public class RoleClass playedBy TB11ch5c {\n" +
" /*\n" +
" * string is initialized either by \n" +
" * getLocalString() - is a role member\n" +
" * or by\n" +
" * getBaseString() - is a base member\n" +
" */\n" +
" public static final String string = getLocalString();\n" +
"// public static final String string = getBaseString();\n" +
" \n" +
" callin static String getOriginal(){ \n" +
" return string;\n" +
" }\n" +
" getOriginal <- replace getOriginal;\n" +
" \n" +
" abstract static String getBaseString();\n" +
" getBaseString -> getAdaptation;\n" +
" \n" +
" private static String getLocalString(){\n" +
" return \"Adaptation\";\n" +
" }\n" +
" }\n" +
" \n" +
" public TeamB11ch5c () {\n" +
" activate(ALL_THREADS); \n" +
" }\n" +
"}\n" +
" \n",
"test/TB11ch5c.java",
"\n" +
"package test;\n" +
"public class TB11ch5c {\n" +
" public static void print(){\n" +
" System.out.println(getOriginal());\n" +
" }\n" +
" \n" +
" private static String getOriginal(){\n" +
" return \"Original\";\n" +
" }\n" +
" @SuppressWarnings(\"unused\")\n" +
" private static String getAdaptation(){\n" +
" return \"Adaptation\";\n" +
" }\n" +
"}\n" +
" \n"
},
"1.2.1(g)");
}
// variant reported by Andreas Werner, correct by using a team field
// B.1.1-otjld-ch-5d
public void testB11_ch5d() {
runConformTest(
new String[] {
"TB11ch5dMain.java",
"\n" +
"public class TB11ch5dMain {\n" +
" public static void main(String[] args) {\n" +
" new test.TeamB11ch5d();\n" +
" test.TB11ch5d.print();\n" +
" }\n" +
"}\n" +
" \n",
"test/TB11ch5d.java",
"\n" +
"package test;\n" +
"public class TB11ch5d {\n" +
" public static void print(){\n" +
" System.out.print(getOriginal());\n" +
" }\n" +
" \n" +
" private static String getOriginal(){\n" +
" return \"Original\";\n" +
" }\n" +
" @SuppressWarnings(\"unused\")\n" +
" private static String getAdaptation(){\n" +
" return \"Adaptation\";\n" +
" }\n" +
"}\n" +
" \n",
"test/TeamB11ch5d.java",
"\n" +
"package test;\n" +
"public team class TeamB11ch5d {\n" +
"// public final String string = RoleClass.getLocalString();\n" +
" public final String string = RoleClass.getBaseString();\n" +
" public class RoleClass playedBy TB11ch5d {\n" +
" /*\n" +
" * string is initialized either by \n" +
" * getLocalString() - is a role member\n" +
" * or by\n" +
" * getBaseString() - is a base member\n" +
" */\n" +
" \n" +
" callin static String getOriginal(){ \n" +
" return string;\n" +
" }\n" +
" getOriginal <- replace getOriginal;\n" +
" \n" +
" protected abstract static String getBaseString();\n" +
" getBaseString -> getAdaptation;\n" +
" \n" +
" private static String getLocalString(){\n" +
" return \"Adaptation\";\n" +
" }\n" +
" }\n" +
" \n" +
" public TeamB11ch5d () {\n" +
" activate(ALL_THREADS); \n" +
" }\n" +
"}\n" +
" \n"
},
"Adaptation");
}
public void testBug372786() {
String jarFilename = this.weavingScheme == WeavingScheme.OTRE ? "bug372786.jar" : "bug372786otdre.jar";
runNegativeTest(
new String[] {
"TBug372786.java",
"import jarred.TeamBug372786;\n" +
"public class TBug372786 {\n" +
" TeamBug372786 t;\n" +
" void test() {\n" +
" t.run();\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in TBug372786.java (at line 1)\n" +
" import jarred.TeamBug372786;\n" +
" ^\n" +
"The type notjarred.Missing cannot be resolved. It is indirectly referenced from required .class files\n" +
"----------\n",
getClassLibraries(jarFilename),
false);
}
// Bug 391876 - false-report (nested class): interface cannot be implemented more than once
// bogus error seen: the interface NonUniqueIndex cannot be implemented more than once[...]
public void testBug391876() {
runConformTest(
new String[] {
"p/Entity.java",
"package p;\n" +
"public interface Entity{}\n",
"p/Index.java",
"package p;\n" +
"public interface Index<T extends Entity> {}\n",
"p/NonUniqueIndex.java",
"package p;\n" +
"public interface NonUniqueIndex<V extends Entity, T> extends Index<V> {}\n",
"p/User.java",
"package p;\n" +
"public interface User extends Entity {}",
"p/UserByCustomerIndex.java",
"package p;\n" +
"public interface UserByCustomerIndex extends NonUniqueIndex<User, UserByCustomerIndex.UserByCustomerKey> {\n" +
" class UserByCustomerKey {}\n" +
"}",
"p3/NonUniqueIndexImpl.java",
"package p3;\n" +
"import p.*;\n" +
"public class NonUniqueIndexImpl<V extends Entity, T> implements NonUniqueIndex<V, T> {}\n",
},
"");
runConformTest(
new String[] {
"p2/UserByCustomerIndexImpl.java",
"package p2;\n" +
"import p.*;\n" +
"import p3.NonUniqueIndexImpl;\n" +
"public class UserByCustomerIndexImpl \n" +
" extends NonUniqueIndexImpl<User, UserByCustomerIndex.UserByCustomerKey>\n" +
" implements UserByCustomerIndex {}\n",
},
"", null, false/*flush*/, null);
}
public void testBug433146() {
runConformTest(
new String[] {
"T433146.java",
"public class T433146 {\n" +
" void m(String s) {}\n" +
"}\n",
"Team433146.java",
"public team class Team433146 {\n" +
" protected class R playedBy T433146 {\n" +
" boolean should() { return false; }\n" +
" callin void doit() {}\n" +
" void doit() <- replace void m(String s)\n" +
" when (should());\n" +
" }\n" +
"}\n"
});
}
public void testBug448378() {
runNegativeTest(
new String[] {
"C.java",
"public class C {\n" +
" \n" +
" void test() {\n" +
" try {\n" +
" final C c = missing().v;\n" +
" } finally {\n" +
" System.out.println(0); \n" +
" }\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in C.java (at line 5)\n" +
" final C c = missing().v;\n" +
" ^^^^^^^\n" +
"The method missing() is undefined for the type C\n" +
"----------\n");
}
public void testBug448298() {
runNegativeTest(
new String[] {
"Test.java",
"public class Test {\n" +
" Test(Test other) {}\n" +
" \n" +
" Test(final int arg, Object o) { \n" +
" this((arg.nothing)o); \n" +
" }\n" +
"}"
},
"----------\n" +
"1. ERROR in Test.java (at line 5)\n" +
" this((arg.nothing)o); \n" +
" ^^^^^^^^^^^^^^^^^^^^^\n" +
"The constructor Test(nothing) is undefined\n" +
"----------\n" +
"2. ERROR in Test.java (at line 5)\n" +
" this((arg.nothing)o); \n" +
" ^^^\n" +
"arg cannot be resolved to a type\n" +
"----------\n");
}
}