| /********************************************************************** |
| * This file is part of "Object Teams Development Tooling"-Software |
| * |
| * Copyright 2005-2016 Berlin Institute of Technology, Germany. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * $Id$ |
| * |
| * Please visit http://www.eclipse.org/objectteams for updates and contact. |
| * |
| * Contributors: |
| * 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.tests.util.Util; |
| 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 |
| */ |
| @SuppressWarnings("unchecked") |
| public class DevelopmentExamples extends AbstractOTJLDTest { |
| |
| public DevelopmentExamples(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[] { "testX12_resultLifting2"}; |
| // TESTS_NUMBERS = new int[] { 1459 }; |
| // TESTS_RANGE = new int[] { 1097, -1 }; |
| } |
| |
| public static Test suite() { |
| return buildComparableTestSuite(testClass()); |
| } |
| |
| public static Class testClass() { |
| return DevelopmentExamples.class; |
| } |
| |
| // corner cases for callin with inheritance |
| // X.1.1-otjld-binding-inheritance-1 |
| public void testX11_bindingInheritance1() { |
| |
| runConformTest( |
| new String[] { |
| "test1/X11bi1Main.java", |
| "\n" + |
| "package test1;\n" + |
| "public class X11bi1Main {\n" + |
| " public static void main (String[] args) {\n" + |
| " new SubSubTeam().activate();\n" + |
| " //new CallinSuper().activate();\n" + |
| " //new CallinSub(\"t1\").activate();\n" + |
| " //new CallinSub(\"t2\").activate();\n" + |
| " //new ExtremeSub().activate(); // runntime-error: what is wrong with this??\n" + |
| " System.out.println((new B1(3)).getInt());\n" + |
| " B1 b = new B1(0);\n" + |
| " b.setPublicInt(1);\n" + |
| " System.out.println(\"--------------------------------------\");\n" + |
| " b.nop();\n" + |
| " System.out.println(\"--------------------------------------\");\n" + |
| " b.nop(1);\n" + |
| " System.out.println(\"--------------------------------------\");\n" + |
| " B2 b2 = new B2(\"Heiligabend\");\n" + |
| " //SubOfB2 b2 = new SubOfB2(\"Heiligabend\");\n" + |
| " b2.print(\"Geschenk\");\n" + |
| " //new CallinSuper().activate();\n" + |
| " //b.setInt(1);\n" + |
| " System.out.println(\"-------------------- Test for Base-Subclassing ---------------\");\n" + |
| " Person p = new Person(\"Ishi\");\n" + |
| " p.goToWork();\n" + |
| " System.out.println(\"---- just one sub base (Man) is effected by a callin ------\");\n" + |
| " System.out.println(\"---- defined in a sub role (BWLStudent):-----------------------\");\n" + |
| " Woman w = new Woman(\"Yukiko\");\n" + |
| " Man m = new Man(\"Tanaka\");\n" + |
| " w.goToWork();\n" + |
| " m.goToWork();\n" + |
| " System.out.println(\"----- callins are effective even for inherited base methods in sub bases: ------\");\n" + |
| " p.haveFun();\n" + |
| " w.haveFun();\n" + |
| " System.out.println(\"----- callins are inherited to neither redefinded nor rebound base methods: --\");\n" + |
| " p.performWorkstep();\n" + |
| " w.performWorkstep();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test1/B1.java", |
| "\n" + |
| "package test1;\n" + |
| "public class B1 {\n" + |
| " private int _value;\n" + |
| " public B1(int i) {\n" + |
| " _value = i;\n" + |
| " }\n" + |
| " public int getInt() {\n" + |
| " System.out.println(\"B1.getInt() called!\");\n" + |
| " return _value;\n" + |
| " }\n" + |
| " private void setInt(int i) {\n" + |
| " System.out.println(\"B1.setInt(\"+i+\") called!\");\n" + |
| " _value = i;\n" + |
| " }\n" + |
| " public void setPublicInt(int i) {\n" + |
| " setInt(i);\n" + |
| " }\n" + |
| " public void nop() {\n" + |
| " System.out.println(\"B1.nop() called!\");\n" + |
| " }\n" + |
| " public void nop(int i) {\n" + |
| " System.out.println(\"B1.nop(int) called!\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test1/B2.java", |
| "\n" + |
| "package test1;\n" + |
| "import java.util.Date;\n" + |
| "public class B2 {\n" + |
| " private Date _date;\n" + |
| " @SuppressWarnings(\"unused\")\n" + |
| " private String _name;\n" + |
| " public B2(String name) {\n" + |
| " _date = new Date();\n" + |
| " _name = name;\n" + |
| " }\n" + |
| " public Date getDate(boolean update) {\n" + |
| " if (update)\n" + |
| " return new Date();\n" + |
| " return _date; // date of creation\n" + |
| " }\n" + |
| " public void print(String s) {\n" + |
| " System.out.print(\"B2.print: \" + s + \"\\n\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test1/Person.java", |
| "\n" + |
| "package test1;\n" + |
| "public class Person {\n" + |
| " private String _name;\n" + |
| " public Person(String name) {\n" + |
| " _name = name;\n" + |
| " }\n" + |
| " public void goToWork() {\n" + |
| " System.out.println(\"Person.goToWork()\");\n" + |
| " }\n" + |
| " public void performWorkstep() {\n" + |
| " System.out.println(\"Person.performWorkstep()\");\n" + |
| " }\n" + |
| " public void haveFun() {\n" + |
| " System.out.println(\"Person.haveFun()\");\n" + |
| " }\n" + |
| " public String getName() {\n" + |
| " return _name;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test1/Woman.java", |
| "\n" + |
| "package test1;\n" + |
| "public class Woman extends Person {\n" + |
| " public Woman(String name) {\n" + |
| " super(name);\n" + |
| " }\n" + |
| " @Override\n" + |
| " public void goToWork() {\n" + |
| " System.out.println(\"She (\"+getName()+\") gose to work.\");\n" + |
| " }\n" + |
| " /*\n" + |
| " public void haveFun() {\n" + |
| " super.haveFun();\n" + |
| " }*/\n" + |
| " /*\n" + |
| " public void performWorkstep() {\n" + |
| " System.out.println(\"Woman.performWorkstep\");\n" + |
| " }*/\n" + |
| "}\n" + |
| " \n", |
| "test1/Man.java", |
| "\n" + |
| "package test1;\n" + |
| "public class Man extends Person {\n" + |
| " public Man(String name) {\n" + |
| " super(name);\n" + |
| " }\n" + |
| " @Override\n" + |
| " public void goToWork() {\n" + |
| " System.out.println(\"He (\"+getName()+\") gose to work.\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test1/CallinSuper.java", |
| "\n" + |
| "package test1;\n" + |
| "public team class CallinSuper {\n" + |
| " public void superTeamMethod() {\n" + |
| " }\n" + |
| " public class Role playedBy B1 {\n" + |
| " callin void hook () {\n" + |
| " System.out.println(/*getName()+\": \"+*/\"CallinSuper.Role.hook()\");\n" + |
| " base.hook();\n" + |
| " }\n" + |
| " //hook <- replace getInt;\n" + |
| " //void hook() <- replace int getInt() with {}\n" + |
| " callin void check(int i) {\n" + |
| " System.out.println(\"CallinSuper.Role.check(\"+i+\")\");\n" + |
| " if (i<0)\n" + |
| " throw new Error(\"only positive numbers allowed!!\");\n" + |
| " base.check(i);\n" + |
| " }\n" + |
| " @SuppressWarnings(\"decapsulation\")\n" + |
| " check <- replace setInt;\n" + |
| " }\n" + |
| " public class Role3 {//playedBy B2 \n" + |
| " callin void format(String s) {\n" + |
| " System.out.println(\"CallinSuper.Role3.format: \" + s.toUpperCase());\n" + |
| " base.format(\"von CallinSuper.Role3\");\n" + |
| " }\n" + |
| " //format <- replace print;\n" + |
| " }\n" + |
| " public class Student playedBy Person {\n" + |
| " callin void doHomework() {\n" + |
| " System.out.println(\"Stundent.doHomework()\");\n" + |
| " base.doHomework();\n" + |
| " }\n" + |
| " void doHomework() <- replace void performWorkstep();\n" + |
| " callin void enterClassroom() {\n" + |
| " System.out.println(\"Stundent.enterClassroom()\");\n" + |
| " base.enterClassroom();\n" + |
| " }\n" + |
| " }\n" + |
| " public class BWLStudent extends Student playedBy Man {\n" + |
| " void enterClassroom() <- replace void goToWork();\n" + |
| " }\n" + |
| " // -> Binding-Error: base-call impossible!\n" + |
| " public class JugglingStudent extends Student playedBy Woman {\n" + |
| " void enterClassroom() <- replace void haveFun();\n" + |
| " } //\n" + |
| "}\n" + |
| " \n", |
| "test1/CallinSub.java", |
| "\n" + |
| "package test1;\n" + |
| "public team class CallinSub extends CallinSuper {\n" + |
| "/*\n" + |
| " public CallinSub(String name) {\n" + |
| " super(name);\n" + |
| " }\n" + |
| "*/\n" + |
| " public class Role2 extends Role {\n" + |
| " @Override\n" + |
| " callin void hook () {\n" + |
| " System.out.println(/*getName()+\": \"+*/ \"CallinSub.Role2.hook()\");\n" + |
| " base.hook();\n" + |
| " //tsuper.hook(); // compiler: cannot resolve symbol <- okay\n" + |
| " super.hook();\n" + |
| " }\n" + |
| " // this works well:\n" + |
| " //void hook() <- replace void nop();\n" + |
| "// hook <- getInt;\n" + |
| " @Override\n" + |
| " void hook() <- replace int getInt();\n" + |
| " //void hook() <- void nop() with {}\n" + |
| " @Override\n" + |
| " callin void check(int i) {\n" + |
| " System.out.println(\"CallinSub.Role2.check(\"+i+\")\");\n" + |
| " base.check(i);\n" + |
| " super.check(i);\n" + |
| " }\n" + |
| " //check <- setInt;\n" + |
| " /*/ compiler-error:\n" + |
| " void check(int i) <- void nop() with {\n" + |
| " i <- 0\n" + |
| " }//*/\n" + |
| " }\n" + |
| " @Override\n" + |
| " public class Role3 playedBy B2 {\n" + |
| " @Override @SuppressWarnings(\"basecall\")\n" + // two basecalls (one is indirect) |
| " callin void format(String s) {\n" + |
| " System.out.println(\"CallinSub.Role3.format: \" + insertChars(\" \", s));\n" + |
| " base.format(\"von CallinSub.Role3\");\n" + |
| " tsuper.format(s);\n" + |
| " }\n" + |
| " //format <- replace print;\n" + |
| " String insertChars(String insert, String s) {\n" + |
| " char[] chrs = s.toCharArray();\n" + |
| " String result =\"\";\n" + |
| " for (int i=0; i<chrs.length; i++) {\n" + |
| " String tmp = chrs[i]+insert;\n" + |
| " result = result.concat(tmp);\n" + |
| " }\n" + |
| " return result;\n" + |
| " }\n" + |
| " }\n" + |
| "/*\n" + |
| " public class Role4 extends Role3 {\n" + |
| " callin void format(String s) {\n" + |
| " System.out.println(\"CallinSub.Role4.format: \" + s);\n" + |
| " base.format(\"von CallinSub.Role4\");\n" + |
| " super.format(s);\n" + |
| " }\n" + |
| " //format <- replace print;\n" + |
| " }*/\n" + |
| "}\n" + |
| " \n", |
| "test1/SubSubTeam.java", |
| "\n" + |
| "package test1;\n" + |
| "public team class SubSubTeam extends CallinSub {\n" + |
| " @Override\n" + |
| " public class Role3 {\n" + |
| " @Override @SuppressWarnings(\"basecall\")\n" + // two basecalls (one is indirect) |
| " callin void format(String s) {\n" + |
| " System.out.println(\"SubSubTeam.Role3.format: \" + s);\n" + |
| " base.format(\"von SubSubTeam.Role3\");\n" + |
| " tsuper.format(s);\n" + |
| " }\n" + |
| " void format(String s) <- replace void print(String s);\n" + |
| " }\n" + |
| " public class RoleX extends Role3 {\n" + |
| " @Override\n" + |
| " callin void format(String s) {\n" + |
| " System.out.println(\"SubSubTeam.RoleX.format: \" + super.insertChars(\"X\", s));\n" + |
| " base.format(\"von SubSubTeam.RoleX\");\n" + |
| " super.format(s);\n" + |
| " }\n" + |
| " //format <- replace print;\n" + |
| " }\n" + |
| " public class RoleNOP extends Role2 {\n" + |
| " callin void nop() {\n" + |
| " System.out.println(\"SubSubTeam.RoleNOP.nop() called!\");\n" + |
| " base.nop();\n" + |
| " }\n" + |
| " //nop <- after nop; // okay\n" + |
| " //hook <- nop //-> compiler error!\n" + |
| " //void hook() <- void nop(); //-> compiler error!\n" + |
| "/*\n" + |
| " callin void hook () {\n" + |
| " System.out.println(\"SubSubTeam.RoleNOP.hook\");\n" + |
| " base.hook();\n" + |
| " //tsuper.hook(); // compiler: cannot resolve symbol <- okay\n" + |
| " super.hook();\n" + |
| " }\n" + |
| "*/\n" + |
| " void hook() <- replace void nop();\n" + |
| " //void hook() <- replace void nop(int i) with {}\n" + |
| " void nop() <- replace void nop(int i); \n" + |
| " }\n" + |
| " @Override\n" + |
| " public class Role2 {\n" + |
| " @Override\n" + |
| " callin void hook () {\n" + |
| " System.out.println(\"SubSub.Role2.hook()\");\n" + |
| " base.hook();\n" + |
| " //tsuper.hook();\n" + |
| " }\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "SubSub.Role2.hook()\n" + |
| "B1.getInt() called!\n" + |
| "3\n" + |
| "CallinSub.Role2.check(1)\n" + |
| "B1.setInt(1) called!\n" + |
| "CallinSuper.Role.check(1)\n" + |
| "B1.setInt(1) called!\n" + |
| "--------------------------------------\n" + |
| "SubSub.Role2.hook()\n" + |
| "B1.nop() called!\n" + |
| "--------------------------------------\n" + |
| "SubSubTeam.RoleNOP.nop() called!\n" + |
| "B1.nop(int) called!\n" + |
| "--------------------------------------\n" + |
| "SubSubTeam.RoleX.format: GXeXsXcXhXeXnXkX\n" + |
| "B2.print: von SubSubTeam.RoleX\n" + |
| "SubSubTeam.Role3.format: Geschenk\n" + |
| "B2.print: von SubSubTeam.Role3\n" + |
| "CallinSub.Role3.format: G e s c h e n k \n" + |
| "B2.print: von CallinSub.Role3\n" + |
| "CallinSuper.Role3.format: GESCHENK\n" + |
| "B2.print: von CallinSuper.Role3\n" + |
| "-------------------- Test for Base-Subclassing ---------------\n" + |
| "Person.goToWork()\n" + |
| "---- just one sub base (Man) is effected by a callin ------\n" + |
| "---- defined in a sub role (BWLStudent):-----------------------\n" + |
| "She (Yukiko) gose to work.\n" + |
| "Stundent.enterClassroom()\n" + |
| "He (Tanaka) gose to work.\n" + |
| "----- callins are effective even for inherited base methods in sub bases: ------\n" + |
| "Person.haveFun()\n" + |
| "Stundent.enterClassroom()\n" + |
| "Person.haveFun()\n" + |
| "----- callins are inherited to neither redefinded nor rebound base methods: --\n" + |
| "Stundent.doHomework()\n" + |
| "Person.performWorkstep()\n" + |
| "Stundent.doHomework()\n" + |
| "Person.performWorkstep()"); |
| } |
| |
| // inherit a role method binding declared in the the super-super role of the super-super team |
| // X.1.1-otjld-binding-inheritance-2 |
| public void testX11_bindingInheritance2() { |
| |
| runConformTest( |
| new String[] { |
| "test1/MainX112.java", |
| "\n" + |
| "package test1;\n" + |
| "public class MainX112 {\n" + |
| " public static void main (String[] args) {\n" + |
| " MyBaseX112 b = new MyBaseX112();\n" + |
| " MySubTeamX112 mst = new MySubTeamX112();\n" + |
| " mst.activate();\n" + |
| " b.bm1();\n" + |
| " b.bm2();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test1/MyBaseX112.java", |
| "\n" + |
| "package test1;\n" + |
| "public class MyBaseX112 {\n" + |
| " public void bm1() {\n" + |
| " System.out.println(\"MyBase.bm1()\");\n" + |
| " }\n" + |
| " public void bm2() {\n" + |
| " System.out.println(\"MyBase.bm2()\");\n" + |
| " } \n" + |
| "}\n" + |
| " \n", |
| "test1/MySuperTeamX112.java", |
| "\n" + |
| "package test1;\n" + |
| "public team class MySuperTeamX112 {\n" + |
| " public class MyRole1X112 playedBy MyBaseX112 {\n" + |
| " callin void rm() {\n" + |
| " System.out.println(\"MySuperTeam.MyRole1.rm()\");\n" + |
| " base.rm();\n" + |
| " }\n" + |
| " rm <- replace bm1; \n" + |
| " } \n" + |
| "}\n" + |
| " \n", |
| "test1/MyTeamX112.java", |
| "\n" + |
| "package test1;\n" + |
| "public team class MyTeamX112 extends MySuperTeamX112 {\n" + |
| "}\n" + |
| " \n", |
| "test1/MySubTeamX112.java", |
| "\n" + |
| "package test1;\n" + |
| "public team class MySubTeamX112 extends MyTeamX112 {\n" + |
| " public class MyRole2X112 extends MyRole1X112 {\n" + |
| " }\n" + |
| " \n" + |
| " public class MyRole3X112 extends MyRole2X112 {\n" + |
| " rm <- replace bm2;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MySuperTeam.MyRole1.rm()\n" + |
| "MyBase.bm1()\n" + |
| "MySuperTeam.MyRole1.rm()\n" + |
| "MyBase.bm2()"); |
| } |
| |
| // redefine a role method in a sub role in a sub team |
| // X.1.1-otjld-binding-inheritance-3 |
| public void testX11_bindingInheritance3() { |
| |
| runConformTest( |
| new String[] { |
| "test1/MainX113.java", |
| "\n" + |
| "package test1;\n" + |
| "public class MainX113 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX113 b = new MyBaseX113();\n" + |
| " MySubTeamX113 st = new MySubTeamX113();\n" + |
| " st.activate();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| "} \n", |
| "test1/MyBaseX113.java", |
| "\n" + |
| "package test1;\n" + |
| "public class MyBaseX113 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test1/MyTeamX113.java", |
| "\n" + |
| "package test1;\n" + |
| "public team class MyTeamX113 {\n" + |
| " public class MyRoleX113 playedBy MyBaseX113 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test1/MySubTeamX113.java", |
| "\n" + |
| "package test1;\n" + |
| "public team class MySubTeamX113 extends MyTeamX113 {\n" + |
| " //public class MyRoleX113 {}\n" + |
| " public class MySubRoleX113 extends MyRoleX113 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MySubTeam.MySubRole.rm()\");\n" + |
| " }\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyBase.bm()\n" + |
| "MySubTeam.MySubRole.rm()"); |
| } |
| |
| // redefine a role method in a sub role in a sub team (start compile at Main) |
| // X.1.1-otjld-binding-inheritance-3a |
| public void testX11_bindingInheritance3a() { |
| |
| runConformTest( |
| new String[] { |
| "test1/MainX113a.java", |
| "\n" + |
| "package test1;\n" + |
| "public class MainX113a {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX113a b = new MyBaseX113a();\n" + |
| " MySubTeamX113a st = new MySubTeamX113a();\n" + |
| " st.activate();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| "} \n", |
| "test1/MySubTeamX113a.java", |
| "\n" + |
| "package test1;\n" + |
| "public team class MySubTeamX113a extends MyTeamX113a {\n" + |
| " //public class MyRoleX113a {}\n" + |
| " public class MySubRoleX113a extends MyRoleX113a {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MySubTeam.MySubRole.rm()\");\n" + |
| " }\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n", |
| "test1/MyTeamX113a.java", |
| "\n" + |
| "package test1;\n" + |
| "public team class MyTeamX113a {\n" + |
| " public class MyRoleX113a playedBy MyBaseX113a {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test1/MyBaseX113a.java", |
| "\n" + |
| "package test1;\n" + |
| "public class MyBaseX113a {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyBase.bm()\n" + |
| "MySubTeam.MySubRole.rm()"); |
| } |
| |
| |
| // redefine a role method in a sub role in a sub team (default package) |
| // X.1.1-otjld-binding-inheritance-3b |
| public void testX11_bindingInheritance3b() { |
| |
| runConformTest( |
| new String[] { |
| "MainX113b.java", |
| "\n" + |
| "public class MainX113b {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX113b b = new MyBaseX113b();\n" + |
| " MySubTeamX113b st = new MySubTeamX113b();\n" + |
| " st.activate();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| "} \n", |
| "MyBaseX113b.java", |
| "\n" + |
| "public class MyBaseX113b {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyTeamX113b.java", |
| "\n" + |
| "public team class MyTeamX113b {\n" + |
| " public class MyRoleX113b playedBy MyBaseX113b {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MySubTeamX113b.java", |
| "\n" + |
| "public team class MySubTeamX113b extends MyTeamX113b {\n" + |
| " //public class MyRoleX113b {}\n" + |
| " public class MySubRoleX113b extends MyRoleX113b {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MySubTeam.MySubRole.rm()\");\n" + |
| " }\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyBase.bm()\n" + |
| "MySubTeam.MySubRole.rm()"); |
| } |
| |
| // super call in base method - super-super method is adapted too |
| // X.1.1-otjld-binding-inheritance-4 |
| public void testX11_bindingInheritance4() { |
| |
| runConformTest( |
| new String[] { |
| "MainX114.java", |
| "\n" + |
| "public class MainX114 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX114 b = new MyBaseX114();\n" + |
| " MyTeamX114 t = new MyTeamX114();\n" + |
| " t.activate();\n" + |
| " b.bm();\n" + |
| " System.out.println(\"----------------\");\n" + |
| " MySubSubBaseX114 ssb = new MySubSubBaseX114();\n" + |
| " ssb.bm();\n" + |
| " }\n" + |
| "} \n" + |
| " \n", |
| "MyBaseX114.java", |
| "\n" + |
| "public class MyBaseX114 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MySubBaseX114.java", |
| "\n" + |
| "public class MySubBaseX114 extends MyBaseX114 {}\n" + |
| " \n", |
| "MySubSubBaseX114.java", |
| "\n" + |
| "public class MySubSubBaseX114 extends MySubBaseX114 {\n" + |
| " public void bm() {\n" + |
| " super.bm();\n" + |
| " System.out.println(\"MySubSubBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyTeamX114.java", |
| "\n" + |
| "public team class MyTeamX114 {\n" + |
| " public class MyRoleX114 playedBy MyBaseX114 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "\n" + |
| " public class MySubRoleX114 extends MyRoleX114 playedBy MySubSubBaseX114 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MySubRole.rm()\");\n" + |
| " }\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "MyBase.bm()\n" + |
| "MyTeam.MyRole.rm()\n" + |
| "----------------\n" + |
| "MyBase.bm()\n" + |
| "MySubSubBase.bm()\n" + |
| "MyTeam.MySubRole.rm()"); |
| } |
| |
| // super call in base method - only super-super method is adapted |
| // X.1.1-otjld-binding-inheritance-4a |
| public void testX11_bindingInheritance4a() { |
| |
| runConformTest( |
| new String[] { |
| "MainX114a.java", |
| "\n" + |
| "public class MainX114a {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX114a b = new MyBaseX114a();\n" + |
| " MyTeamX114a t = new MyTeamX114a();\n" + |
| " t.activate();\n" + |
| " b.bm();\n" + |
| " System.out.println(\"----------------\");\n" + |
| " MySubSubBaseX114a ssb = new MySubSubBaseX114a();\n" + |
| " ssb.bm();\n" + |
| " }\n" + |
| "} \n" + |
| " \n", |
| "MyBaseX114a.java", |
| "\n" + |
| "public class MyBaseX114a {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MySubBaseX114a.java", |
| "\n" + |
| "public class MySubBaseX114a extends MyBaseX114a {}\n" + |
| " \n", |
| "MySubSubBaseX114a.java", |
| "\n" + |
| "public class MySubSubBaseX114a extends MySubBaseX114a {\n" + |
| " public void bm() {\n" + |
| " super.bm();\n" + |
| " System.out.println(\"MySubSubBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyTeamX114a.java", |
| "\n" + |
| "public team class MyTeamX114a {\n" + |
| " public class MyRoleX114a playedBy MyBaseX114a {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyBase.bm()\n" + |
| "MyTeam.MyRole.rm()\n" + |
| "----------------\n" + |
| "MyBase.bm()\n" + |
| "MySubSubBase.bm()\n" + |
| "MyTeam.MyRole.rm()"); |
| } |
| |
| // super call in base method - only super-super method is adapted, complete explicit super-chain , replace binding |
| // X.1.1-otjld-binding-inheritance-4b |
| public void testX11_bindingInheritance4b() { |
| |
| runConformTest( |
| new String[] { |
| "MainX114b.java", |
| "\n" + |
| "public class MainX114b {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX114b b = new MyBaseX114b();\n" + |
| " MyTeamX114b t = new MyTeamX114b();\n" + |
| " t.activate();\n" + |
| " b.bm();\n" + |
| " System.out.println(\"----------------\");\n" + |
| " MySubSubBaseX114b ssb = new MySubSubBaseX114b();\n" + |
| " ssb.bm();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyBaseX114b.java", |
| "\n" + |
| "public class MyBaseX114b {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MySubBaseX114b.java", |
| "\n" + |
| "public class MySubBaseX114b extends MyBaseX114b {\n" + |
| " public void bm() {\n" + |
| " super.bm();\n" + |
| " System.out.println(\"MySubBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MySubSubBaseX114b.java", |
| "\n" + |
| "public class MySubSubBaseX114b extends MySubBaseX114b {\n" + |
| " public void bm() {\n" + |
| " super.bm();\n" + |
| " System.out.println(\"MySubSubBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyTeamX114b.java", |
| "\n" + |
| "public team class MyTeamX114b {\n" + |
| " public class MyRoleX114b playedBy MyBaseX114b {\n" + |
| " callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyBase.bm()\n" + |
| "MyTeam.MyRole.rm()\n" + |
| "----------------\n" + |
| "MyBase.bm()\n" + |
| "MySubBase.bm()\n" + |
| "MySubSubBase.bm()\n" + |
| "MyTeam.MyRole.rm()"); |
| } |
| |
| // wicked super call interferes with callin binding |
| // X.1.1-otjld-binding-inheritance-4c |
| public void testX11_bindingInheritance4c() { |
| |
| runConformTest( |
| new String[] { |
| "TeamX114c.java", |
| "\n" + |
| "public team class TeamX114c {\n" + |
| " protected class R playedBy MyBaseX114c {\n" + |
| " callin void rm() { base.rm(); }\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " // not even instantiating the team!\n" + |
| " new MySubBaseX114c().bm();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyBaseX114c.java", |
| "\n" + |
| "public class MyBaseX114c {\n" + |
| " void bm() { System.out.print(\"MyBase.bm\"); }\n" + |
| "}\n" + |
| " \n", |
| "MySubBaseX114c.java", |
| "\n" + |
| "public class MySubBaseX114c extends MyBaseX114c {\n" + |
| " void bm2() {\n" + |
| " super.bm();\n" + |
| " }\n" + |
| " void bm() {\n" + |
| " System.out.println(\"MySubBase.bm\");\n" + |
| " bm2();\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MySubBase.bm\n" + |
| "MyBase.bm"); |
| } |
| |
| // super call in base method - like 4a but with relevant signature |
| public void testX11_bindingInheritance4d() { |
| |
| runConformTest( |
| new String[] { |
| "MainX114d.java", |
| "\n" + |
| "public class MainX114d {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX114d b = new MyBaseX114d();\n" + |
| " MyTeamX114d t = new MyTeamX114d();\n" + |
| " t.activate();\n" + |
| " System.out.println(b.bm(\"OK\"));\n" + |
| " System.out.println(\"----------------\");\n" + |
| " MySubSubBaseX114d ssb = new MySubSubBaseX114d();\n" + |
| " System.out.println(ssb.bm(\"Hoki\"));\n" + |
| " }\n" + |
| "} \n" + |
| " \n", |
| "MyBaseX114d.java", |
| "\n" + |
| "public class MyBaseX114d {\n" + |
| " public String bm(String in) {\n" + |
| " System.out.println(\"MyBase.bm(\"+in+\")\");\n" + |
| " return \"retBase\";\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MySubBaseX114d.java", |
| "\n" + |
| "public class MySubBaseX114d extends MyBaseX114d {}\n" + |
| " \n", |
| "MySubSubBaseX114d.java", |
| "\n" + |
| "public class MySubSubBaseX114d extends MySubBaseX114d {\n" + |
| " public String bm(String in) {\n" + |
| " String res = super.bm(in);\n" + |
| " System.out.println(\"MySubSubBase.bm(\"+in+\")\");\n" + |
| " return res;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyTeamX114d.java", |
| "\n" + |
| "public team class MyTeamX114d {\n" + |
| " public class MyRoleX114d playedBy MyBaseX114d {\n" + |
| " public void rm(String in) {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm(\"+in+\")\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyBase.bm(OK)\n" + |
| "MyTeam.MyRole.rm(OK)\n" + |
| "retBase\n" + |
| "----------------\n" + |
| "MyBase.bm(Hoki)\n" + |
| "MySubSubBase.bm(Hoki)\n" + |
| "MyTeam.MyRole.rm(Hoki)\n" + |
| "retBase"); |
| } |
| |
| // wicked super call interferes with callin binding |
| // Bug 468712: [otdre] stack overflow at callin-bound base method involving wicked super call |
| public void testX11_bindingInheritance4e() { |
| |
| runConformTest( |
| new String[] { |
| "TeamX114e.java", |
| "\n" + |
| "public team class TeamX114e {\n" + |
| " protected class R playedBy MyBaseX114e {\n" + |
| " callin int rm() {\n" + |
| " System.out.println(\"> R.rm\");\n" + |
| " int res = base.rm();\n" + |
| " System.out.println(\"< R.rm\");\n" + |
| " return res+1;\n" + |
| " }\n" + |
| " rm <- replace bmA, bmB;\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " new TeamX114e().activate();\n" + |
| " MySub2BaseX114e b = new MySub2BaseX114e();\n" + |
| " int res = b.bmA();\n" + |
| " res = b.bmB(res);\n" + |
| " System.out.println(res);\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyBaseX114e.java", |
| "\n" + |
| "public class MyBaseX114e {\n" + |
| " protected int bmA() { System.out.println(\"MyBase.bmA\"); return 1; }\n" + |
| " protected int bmB(int in) { System.out.println(\"MyBase.bmB\"); return in+2; }\n" + // 2 methods to challenge reuse of existing ReplaceWickedSuperCallsAdapter (OTDRE) |
| "}\n" + |
| " \n", |
| "MySubBaseX114e.java", |
| "\n" + |
| "public class MySubBaseX114e extends MyBaseX114e {\n" + |
| " protected int bmA2() {\n" + |
| " System.out.println(\"MySubBase.bmA2\");\n" + |
| " return super.bmA() + 4;\n" + |
| " }\n" + |
| " protected int bmA() {\n" + |
| " System.out.println(\"MySubBase.bmA\");\n" + |
| " return bmA2() + 8;\n" + |
| " }\n" + |
| " protected int bmB2(int in) {\n" + |
| " System.out.println(\"MySubBase.bmB2\");\n" + |
| " return super.bmB(in+16);\n" + // invoke is last before return |
| " }\n" + |
| " protected int bmB(int in) {\n" + |
| " System.out.println(\"MySubBase.bmB\");\n" + |
| " return bmB2(in+32) + 64;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MySub2BaseX114e.java", |
| "\n" + |
| "public class MySub2BaseX114e extends MySubBaseX114e {\n" + |
| " protected int bmA() {\n" + |
| " System.out.println(\"MySub2Base.bmA\");\n" + |
| " return super.bmA() + 128;\n" + |
| " }\n" + |
| " protected int bmB(int in) {\n" + |
| " System.out.println(\"MySub2Base.bmB\");\n" + |
| " return super.bmB(in+256) + 512;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "> R.rm\n" + |
| "MySub2Base.bmA\n" + |
| "MySubBase.bmA\n" + |
| "MySubBase.bmA2\n" + |
| "MyBase.bmA\n" + |
| "< R.rm\n" + |
| "> R.rm\n" + |
| "MySub2Base.bmB\n" + |
| "MySubBase.bmB\n" + |
| "MySubBase.bmB2\n" + |
| "MyBase.bmB\n" + |
| "< R.rm\n" + |
| "1025"); |
| } |
| |
| // after callin inherited from super role, before callin to the same base method added |
| // X.1.1-otjld-binding-inheritance-5 |
| public void testX11_bindingInheritance5() { |
| |
| runConformTest( |
| new String[] { |
| "MainX115.java", |
| "\n" + |
| "public class MainX115 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX115 b = new MyBaseX115();\n" + |
| " MySubTeamX115 t = new MySubTeamX115();\n" + |
| " t.activate();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "} \n" + |
| " \n", |
| "MyBaseX115.java", |
| "\n" + |
| "public class MyBaseX115 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyTeamX115.java", |
| "\n" + |
| "public team class MyTeamX115 {\n" + |
| " public class MyRoleX115 playedBy MyBaseX115 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MySubTeamX115.java", |
| "\n" + |
| "public team class MySubTeamX115 extends MyTeamX115 {\n" + |
| " public class MyRoleX115 {\n" + |
| " rm <- before bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeam.MyRole.rm()\n" + |
| "MyBase.bm()\n" + |
| "MyTeam.MyRole.rm()"); |
| } |
| |
| // after callin inherited from super base, before callin added to the same (inherited) base method in sub base |
| // X.1.1-otjld-binding-inheritance-6 |
| public void testX11_bindingInheritance6() { |
| |
| runConformTest( |
| new String[] { |
| "MainX116.java", |
| "\n" + |
| "public class MainX116 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MySubBaseX116 sb = new MySubBaseX116();\n" + |
| " MyTeamX116 t = new MyTeamX116();\n" + |
| " t.activate();\n" + |
| " sb.bm();\n" + |
| " }\n" + |
| "} \n" + |
| " \n", |
| "MyBaseX116.java", |
| "\n" + |
| "public class MyBaseX116 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MySubBaseX116.java", |
| "\n" + |
| "public class MySubBaseX116 extends MyBaseX116 {}\n" + |
| " \n", |
| "MyTeamX116.java", |
| "\n" + |
| "public team class MyTeamX116 {\n" + |
| " public class MyRoleX116 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " }\n" + |
| " public class MyRoleAX116 extends MyRoleX116 playedBy MyBaseX116 {\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| " public class MyRoleBX116 extends MyRoleX116 playedBy MySubBaseX116 {\n" + |
| " rm <- before bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeam.MyRole.rm()\n" + |
| "MyBase.bm()\n" + |
| "MyTeam.MyRole.rm()"); |
| } |
| |
| // callin inherited from a super base, another callin to a different team is added to the same base method in the sub base |
| // X.1.1-otjld-binding-inheritance-7 |
| public void testX11_bindingInheritance7() { |
| |
| runConformTest( |
| new String[] { |
| "MainX117.java", |
| "\n" + |
| "public class MainX117 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyTeamXX117 tX = new MyTeamXX117();\n" + |
| " tX.activate();\n" + |
| " MyTeamYX117 tY = new MyTeamYX117();\n" + |
| " tY.activate();\n" + |
| " MyBaseAX117 myClassA = new MyBaseAX117();\n" + |
| " myClassA.method1();\n" + |
| " MyBaseBX117 myClassB = new MyBaseBX117();\n" + |
| " myClassB.method1();\n" + |
| "\n" + |
| " MyBaseAX117 myClassC = new MyBaseCX117();\n" + |
| " myClassC.method1(); \n" + |
| "\n" + |
| " }\n" + |
| "} \n" + |
| " \n", |
| "MyBaseAX117.java", |
| "\n" + |
| "public class MyBaseAX117 {\n" + |
| " public void method1()\n" + |
| " {\n" + |
| " System.out.println(\"MyBaseA.method1()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyBaseBX117.java", |
| "\n" + |
| "public class MyBaseBX117 extends MyBaseAX117 {\n" + |
| " public void method1()\n" + |
| " {\n" + |
| " System.out.println(\"MyBaseB.method1()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyBaseCX117.java", |
| "\n" + |
| "public class MyBaseCX117 extends MyBaseBX117 {\n" + |
| " public void method1()\n" + |
| " {\n" + |
| " System.out.println(\"MyBaseC.method1()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyTeamXX117.java", |
| "\n" + |
| "public team class MyTeamXX117 {\n" + |
| " public class MyRole playedBy MyBaseAX117 \n" + |
| " {\n" + |
| " public void m1()\n" + |
| " {\n" + |
| " System.out.println(\"MyTeamX.MyRole.m1()\");\n" + |
| " }\n" + |
| "\n" + |
| " m1 <- after method1;\n" + |
| " } \n" + |
| "}\n" + |
| " \n", |
| "MyTeamYX117.java", |
| "\n" + |
| "public team class MyTeamYX117 {\n" + |
| " public class MyRole playedBy MyBaseBX117 \n" + |
| " {\n" + |
| " public void m1()\n" + |
| " {\n" + |
| " System.out.println(\"MyTeamY.MyRole.m1()\");\n" + |
| " }\n" + |
| "\n" + |
| " m1 <- after method1;\n" + |
| " } \n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyBaseA.method1()\n" + |
| "MyTeamX.MyRole.m1()\n" + |
| "MyBaseB.method1()\n" + |
| "MyTeamX.MyRole.m1()\n" + |
| "MyTeamY.MyRole.m1()\n" + |
| "MyBaseC.method1()\n" + |
| "MyTeamX.MyRole.m1()\n" + |
| "MyTeamY.MyRole.m1()"); |
| } |
| |
| // overridden callin method with non-void return type calls 'tsuper' |
| // X.1.1-otjld-binding-inheritance-8 |
| public void testX11_bindingInheritance8() { |
| |
| runConformTest( |
| new String[] { |
| "MainX118.java", |
| "\n" + |
| "public class MainX118 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MySubTeamX118 t = new MySubTeamX118();\n" + |
| " t.activate();\n" + |
| " MyBaseX118 b = new MyBaseX118();\n" + |
| " System.out.print(b.bm());\n" + |
| " }\n" + |
| "} \n" + |
| " \n", |
| "MyBaseX118.java", |
| "\n" + |
| "public class MyBaseX118 {\n" + |
| " public String bm()\n" + |
| " {\n" + |
| " return \"K\";\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyTeamX118.java", |
| "\n" + |
| "public team class MyTeamX118 {\n" + |
| " public class MyRole playedBy MyBaseX118 \n" + |
| " {\n" + |
| " callin String rm()\n" + |
| " {\n" + |
| " return base.rm();\n" + |
| " }\n" + |
| "\n" + |
| " rm <- replace bm;\n" + |
| " } \n" + |
| "}\n" + |
| " \n", |
| "MySubTeamX118.java", |
| "\n" + |
| "public team class MySubTeamX118 extends MyTeamX118 {\n" + |
| " public class MyRole \n" + |
| " {\n" + |
| " callin String rm()\n" + |
| " {\n" + |
| " return \"O\" + tsuper.rm();\n" + |
| " }\n" + |
| " } \n" + |
| "}\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // overridden callin method with non-void basic return type calls 'tsuper' |
| // X.1.1-otjld-binding-inheritance-8a |
| public void testX11_bindingInheritance8a() { |
| |
| runConformTest( |
| new String[] { |
| "MainX118a.java", |
| "\n" + |
| "public class MainX118a {\n" + |
| " public static void main(String[] args) {\n" + |
| " MySubTeamX118a t = new MySubTeamX118a();\n" + |
| " t.activate();\n" + |
| " MyBaseX118a b = new MyBaseX118a();\n" + |
| " System.out.print(b.bm());\n" + |
| " }\n" + |
| "} \n" + |
| " \n", |
| "MyBaseX118a.java", |
| "\n" + |
| "public class MyBaseX118a {\n" + |
| " public int bm()\n" + |
| " {\n" + |
| " return 2;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "MyTeamX118a.java", |
| "\n" + |
| "public team class MyTeamX118a {\n" + |
| " public class MyRole playedBy MyBaseX118a \n" + |
| " {\n" + |
| " callin int rm()\n" + |
| " {\n" + |
| " return base.rm();\n" + |
| " }\n" + |
| "\n" + |
| " rm <- replace bm;\n" + |
| " } \n" + |
| "}\n" + |
| " \n", |
| "MySubTeamX118a.java", |
| "\n" + |
| "public team class MySubTeamX118a extends MyTeamX118a {\n" + |
| " public class MyRole \n" + |
| " {\n" + |
| " callin int rm()\n" + |
| " {\n" + |
| " return 40 + tsuper.rm();\n" + |
| " }\n" + |
| " } \n" + |
| "}\n" + |
| " \n" |
| }, |
| "42"); |
| } |
| |
| // a base class which is a role at the same time inherits a binding form its implicit super (role) class |
| // X.1.1-otjld-binding-inheritance-9 |
| public void testX11_bindingInheritance9() { |
| |
| runConformTest( |
| new String[] { |
| "TX11bi9Main.java", |
| "\n" + |
| " public class TX11bi9Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TX11bi9 b= new TX11bi9();\n" + |
| " TeamX11bi9 pt = new TeamX11bi9();\n" + |
| " TeamX11bi9_3 ot = new TeamX11bi9_3(pt);\n" + |
| " pt.activate();\n" + |
| " ot.activate();\n" + |
| " b.foo();\n" + |
| " \n" + |
| " //cleaning up a little.\n" + |
| " pt.deactivate();\n" + |
| " ot.deactivate();\n" + |
| " \n" + |
| " //Now the same thing again - with a Subteam.\n" + |
| " TX11bi9 b2= new TX11bi9();\n" + |
| " TeamX11bi9_2 pt2 = new TeamX11bi9_2(); //TeamX11bi9_2 \"is a\" TeamX11bi9\n" + |
| " TeamX11bi9_3 ot2 = new TeamX11bi9_3(pt2);\n" + |
| " pt2.activate();\n" + |
| " ot2.activate();\n" + |
| " b2.foo();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX11bi9.java", |
| "\n" + |
| " public class TX11bi9 {\n" + |
| " public void foo(){\n" + |
| " System.out.println(\"bar\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX11bi9.java", |
| "\n" + |
| " public team class TeamX11bi9 { \n" + |
| " public class RX11bi9 playedBy TX11bi9 { \n" + |
| " public void bar(){\n" + |
| " System.out.println(\"Aspect woven\");\n" + |
| " //nothing here, except a JoinPoint\n" + |
| " } \n" + |
| " \n" + |
| " bar <- before foo;\n" + |
| " } \n" + |
| " }\n" + |
| " \n", |
| "TeamX11bi9_2.java", |
| "\n" + |
| " public team class TeamX11bi9_2 extends TeamX11bi9 { \n" + |
| " public class RX11bi9_2 extends RX11bi9 { \n" + |
| " } \n" + |
| " }\n" + |
| " \n", |
| "TeamX11bi9_3.java", |
| "\n" + |
| " public team class TeamX11bi9_3 { \n" + |
| " final TeamX11bi9 otherTeam;\n" + |
| " \n" + |
| " public TeamX11bi9_3(TeamX11bi9 other){\n" + |
| " otherTeam = other;\n" + |
| " }\n" + |
| "\n" + |
| " protected class RX11bi9_3 playedBy RX11bi9<@otherTeam> {\n" + |
| " public void foobar() {\n" + |
| " System.out.println(\"Aspect on Aspect woven\");\n" + |
| " }\n" + |
| " foobar <- before bar;\n" + |
| " } \n" + |
| " }\n" + |
| " \n" |
| }, |
| "Aspect on Aspect woven\n" + |
| "Aspect woven\n" + |
| "bar\n" + |
| "Aspect on Aspect woven\n" + |
| "Aspect woven\n" + |
| "bar"); |
| } |
| |
| // a base class which is a role at the same time inherits a binding form its implicit super-super (role) class |
| // X.1.1-otjld-binding-inheritance-10 |
| public void testX11_bindingInheritance10() { |
| |
| runConformTest( |
| new String[] { |
| "TX11bi10Main.java", |
| "\n" + |
| " public class TX11bi10Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TX11bi10 b= new TX11bi10();\n" + |
| " TeamX11bi10 pt = new TeamX11bi10();\n" + |
| " TeamX11bi10_3 ot = new TeamX11bi10_3(pt);\n" + |
| " pt.activate();\n" + |
| " ot.activate();\n" + |
| " b.foo();\n" + |
| " \n" + |
| " //cleaning up a little.\n" + |
| " pt.deactivate();\n" + |
| " ot.deactivate();\n" + |
| " \n" + |
| " //Now the same thing again - with a Subteam.\n" + |
| " TX11bi10 b2= new TX11bi10();\n" + |
| " TeamX11bi10_2 pt2 = new TeamX11bi10_2(); //TeamX11bi10_2 \"is a\" TeamX11bi10\n" + |
| " TeamX11bi10_3 ot2 = new TeamX11bi10_3(pt2);\n" + |
| " pt2.activate();\n" + |
| " ot2.activate();\n" + |
| " b2.foo();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX11bi10.java", |
| "\n" + |
| " public class TX11bi10 {\n" + |
| " public void foo(){\n" + |
| " System.out.println(\"bar\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX11bi10.java", |
| "\n" + |
| " public team class TeamX11bi10 { \n" + |
| " public class RX11bi10 playedBy TX11bi10 { \n" + |
| " public void bar(){\n" + |
| " System.out.println(\"Aspect woven\");\n" + |
| " //nothing here, except a JoinPoint\n" + |
| " } \n" + |
| " \n" + |
| " bar <- before foo;\n" + |
| " } \n" + |
| " }\n" + |
| " \n", |
| "TeamX11bi10_1.java", |
| "\n" + |
| " public team class TeamX11bi10_1 extends TeamX11bi10 { \n" + |
| " }\n" + |
| " \n", |
| "TeamX11bi10_2.java", |
| "\n" + |
| " public team class TeamX11bi10_2 extends TeamX11bi10_1 { \n" + |
| " public class RX11bi10_2 extends RX11bi10 { \n" + |
| " } \n" + |
| " }\n" + |
| " \n", |
| "TeamX11bi10_3.java", |
| "\n" + |
| " public team class TeamX11bi10_3 { \n" + |
| " final TeamX11bi10 otherTeam;\n" + |
| " \n" + |
| " public TeamX11bi10_3(TeamX11bi10 other){\n" + |
| " otherTeam = other;\n" + |
| " }\n" + |
| "\n" + |
| " protected class RX11bi10_3 playedBy RX11bi10<@otherTeam> {\n" + |
| " public void foobar() {\n" + |
| " System.out.println(\"Aspect on Aspect woven\");\n" + |
| " }\n" + |
| " foobar <- before bar;\n" + |
| " } \n" + |
| " }\n" + |
| " \n" |
| }, |
| "Aspect on Aspect woven\n" + |
| "Aspect woven\n" + |
| "bar\n" + |
| "Aspect on Aspect woven\n" + |
| "Aspect woven\n" + |
| "bar"); |
| } |
| |
| // A role inherits a replace binding, sub-base is bound to an unrelated role (reported by Marco Mosconi) |
| // X.1.1-otjld-binding-inheritance-11 |
| public void testX11_bindingInheritance11() { |
| |
| runConformTest( |
| new String[] { |
| "TeamX11bi11.java", |
| "\n" + |
| "public team class TeamX11bi11 {\n" + |
| " protected class R1 playedBy TX11bi11_1 {\n" + |
| " callin void rm() {\n" + |
| " System.out.print(\"R1<-\");\n" + |
| " base.rm();\n" + |
| " }\n" + |
| " rm <- replace test;\n" + |
| " }\n" + |
| " protected class R2 extends R1 playedBy TX11bi11_2 {\n" + |
| " callin void rm() {\n" + |
| " System.out.print(\"R2<-\");\n" + |
| " base.rm();\n" + |
| " }\n" + |
| " }\n" + |
| " protected class R3 /*no extends*/ playedBy TX11bi11_3 {}\n" + |
| " public static void main(String[] args) {\n" + |
| " new TeamX11bi11().activate();\n" + |
| " new TX11bi11_1().test();\n" + |
| " new TX11bi11_2().test();\n" + |
| " new TX11bi11_3().test();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "TX11bi11_1.java", |
| "\n" + |
| "public class TX11bi11_1 {\n" + |
| " void test() { \n" + |
| " System.out.print(\"B1.\");\n" + |
| " } \n" + |
| "}\n" + |
| " \n", |
| "TX11bi11_2.java", |
| "\n" + |
| "public class TX11bi11_2 extends TX11bi11_1 {\n" + |
| " void test() { \n" + |
| " System.out.print(\"B2.\");\n" + |
| " } \n" + |
| "}\n" + |
| " \n", |
| "TX11bi11_3.java", |
| "\n" + |
| "public class TX11bi11_3 extends TX11bi11_2 {\n" + |
| " void test() { \n" + |
| " System.out.print(\"B3.\");\n" + |
| " } \n" + |
| "}\n" + |
| " \n" |
| }, |
| "R1<-B1.R2<-B2.R2<-B3."); |
| } |
| |
| // a super-call bypasses a callin binding |
| // X.1.1-otjld-binding-inheritance-12 |
| public void testX11_bindingInheritance12() { |
| |
| runConformTest( |
| new String[] { |
| "TeamX11bi12.java", |
| "\n" + |
| "public team class TeamX11bi12 {\n" + |
| " protected class R playedBy TX11bi12_2 {\n" + |
| " void rm() {\n" + |
| " System.out.print(\"WRONG\");\n" + |
| " }\n" + |
| " rm <- after m;\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " new TeamX11bi12().activate();\n" + |
| " new TX11bi12_2().m2();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "TX11bi12_1.java", |
| "\n" + |
| "public class TX11bi12_1 {\n" + |
| " public void m() {\n" + |
| " System.out.print(\"K\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "TX11bi12_2.java", |
| "\n" + |
| "public class TX11bi12_2 extends TX11bi12_1 {\n" + |
| " public void m2() {\n" + |
| " System.out.print(\"O\");\n" + |
| " super.m();\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // a super-call bypasses a callin binding - other team binds super version |
| // X.1.1-otjld-binding-inheritance-13 |
| public void testX11_bindingInheritance13() { |
| |
| runConformTest( |
| new String[] { |
| "TeamX11bi13_2.java", |
| "\n" + |
| "public team class TeamX11bi13_2 {\n" + |
| " protected class R playedBy TX11bi13_2 {\n" + |
| " void rm() {\n" + |
| " System.out.print(\"WRONG\");\n" + |
| " }\n" + |
| " rm <- after m;\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " Class<?> tc = TeamX11bi13_1.class;\n" + |
| " new TeamX11bi13_2().activate();\n" + |
| " new TX11bi13_2().m2();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "TX11bi13_1.java", |
| "\n" + |
| "public class TX11bi13_1 {\n" + |
| " public void m() {\n" + |
| " System.out.print(\"K\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "TX11bi13_2.java", |
| "\n" + |
| "public class TX11bi13_2 extends TX11bi13_1 {\n" + |
| " public void m2() {\n" + |
| " System.out.print(\"O\");\n" + |
| " super.m();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "TeamX11bi13_1.java", |
| "\n" + |
| "public team class TeamX11bi13_1 {\n" + |
| " protected class R1 playedBy TX11bi13_1 {\n" + |
| " void snafu() {}\n" + |
| " snafu <- after m;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // a callin to a private base method does not affect the unrelated version in a sub-base (reported by Oliver Frank) |
| // X.1.1-otjld-binding-inheritance-14 |
| public void testX11_bindingInheritance14() { |
| |
| runConformTest( |
| new String[] { |
| "TeamX11bi14.java", |
| "\n" + |
| "public team class TeamX11bi14 {\n" + |
| " protected class R playedBy X11bi14_1 {\n" + |
| " void no() { System.out.print(\"NO\"); }\n" + |
| " no <- before test;\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " new TeamX11bi14().activate();\n" + |
| " new X11bi14_2().callTest();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "X11bi14_1.java", |
| "\n" + |
| "public class X11bi14_1 {\n" + |
| " @SuppressWarnings(\"unused\")\n" + |
| " private void test() {}\n" + |
| "}\n" + |
| " \n", |
| "X11bi14_2.java", |
| "\n" + |
| "public class X11bi14_2 extends X11bi14_1 {\n" + |
| " private void test() { System.out.print(\"OK\"); }\n" + |
| " public void callTest() {\n" + |
| " test();\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // modeled after a situation in PullUpAdaptor, that could cause StackOverflowError |
| // (bug not reproduced, though, due to different loading sequence). |
| public void testX11_bindingInheritance15() { |
| |
| runConformTest( |
| new String[] { |
| "TeamX11bi15.java", |
| "import base b.X11bi15_1;\n" + |
| "import base b.X11bi15_2;\n" + |
| "public team class TeamX11bi15 {\n" + |
| " protected class R1 playedBy X11bi15_1 {\n" + |
| " void no() { System.out.print(\"NO\"); }\n" + |
| " no <- before test;\n" + |
| " }\n" + |
| " protected class R2 playedBy X11bi15_2 {\n" + |
| " callin void ask() {\n" + |
| " System.out.print(\"?\");\n" + |
| " base.ask();\n" + |
| " }\n" + |
| " ask <- replace callTest;\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " new TeamX11bi15().activate();\n" + |
| " new b.X11bi15_2().callTest();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "b/X11bi15_1.java", |
| "package b;\n" + |
| "public class X11bi15_1 {\n" + |
| " void test() { System.out.print('!'); }\n" + |
| "}\n" + |
| " \n", |
| "b/X11bi15_2.java", |
| "package b;\n" + |
| "public class X11bi15_2 extends X11bi15_1 {\n" + |
| " public void callTest() {\n" + |
| " test();\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "?NO!"); |
| } |
| |
| public void testBug480257() { |
| runConformTest( |
| new String[] { |
| "MT.java", |
| "public team class MT {\n" + |
| " public class R playedBy C1A {\n" + |
| " void bm() <- replace void bm();\n" + |
| " callin void bm() {\n" + |
| " System.out.print(\"R\");\n" + |
| " base.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " new MT().activate();\n" + |
| " new C1B().bm();\n" + |
| " }\n" + |
| "}\n", |
| "C0.java", |
| "public class C0 {\n" + |
| " public void bm() {\n" + |
| " System.out.print(\"C0\");\n" + |
| " }\n" + |
| "}\n", |
| "C1A.java", |
| "public class C1A extends C0 {\n" + |
| "}\n", |
| "C1B.java", |
| "public class C1B extends C0 {\n" + |
| " @Override\n" + |
| " public void bm() {\n" + |
| " System.out.print(\"C1B-\");\n" + |
| " super.bm();\n" + // this super call was confused by the (unrelated) callin binding |
| " System.out.print('!');\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "C1B-C0!"); |
| } |
| |
| // base call requires a result lifting |
| // X.1.2-otjld-result-lifting-1 |
| public void testX12_resultLifting1() { |
| |
| runConformTest( |
| new String[] { |
| "test2/X12rl1Main.java", |
| "\n" + |
| "package test2;\n" + |
| "public class X12rl1Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX121 b = new MyBaseX121();\n" + |
| " MyTeamX121 t = new MyTeamX121();\n" + |
| " t.activate();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| "\n" + |
| " \n", |
| "test2/MyBaseX121.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MyBaseX121 {\n" + |
| " public MyBaseX121 bm() {\n" + |
| " System.out.println(\"MyBaseX121.bm()\");\n" + |
| " return this;\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| " \n", |
| "test2/MyTeamX121.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MyTeamX121 {\n" + |
| " public class MyRoleX121 playedBy MyBaseX121 {\n" + |
| " callin MyRoleX121 rm() {\n" + |
| " System.out.println(\"MyTeamX121.MyRoleX121.rm()\");\n" + |
| " return base.rm();\n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeamX121.MyRoleX121.rm()\n" + |
| "MyBaseX121.bm()"); |
| } |
| |
| // base call requires a result lifting - 'replace' modifier missing |
| // X.1.2-otjld-result-lifting-1a |
| public void testX12_resultLifting1a() { |
| runNegativeTest( |
| new String[] { |
| "test2/MyTeamX121a.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MyTeamX121a {\n" + |
| " public class MyRoleX121a playedBy MyBaseX121a {\n" + |
| " callin MyRoleX121a rm() {\n" + |
| " System.out.println(\"MyTeamX121a.MyRoleX121a.rm()\");\n" + |
| " return base.rm();\n" + |
| " }\n" + |
| " rm <- bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MyBaseX121a.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MyBaseX121a {\n" + |
| " public MyBaseX121a bm() {\n" + |
| " System.out.println(\"MyBaseX121a.bm()\");\n" + |
| " return this;\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| " \n" |
| }, |
| "----------\n" + |
| "1. ERROR in test2\\MyTeamX121a.java (at line 9)\n" + |
| " rm <- bm;\n" + |
| " ^^\n" + |
| "Callin modifier (before, after or replace) missing for callin-binding rm (OTJLD A.3.3).\n" + |
| "----------\n"); |
| } |
| |
| // base call requires a result lifting - 'replace' modifier missing (different compiler invocation) |
| // X.1.2-otjld-result-lifting-1b |
| public void testX12_resultLifting1b() { |
| runNegativeTest( |
| new String[] { |
| "test2/X12rl1bMain.java", |
| "\n" + |
| "package test2;\n" + |
| "public class X12rl1bMain {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX121b b = new MyBaseX121b();\n" + |
| " MyTeamX121b t = new MyTeamX121b();\n" + |
| " t.activate();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| "\n" + |
| " \n", |
| "test2/MyTeamX121b.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MyTeamX121b {\n" + |
| " public class MyRoleX121b playedBy MyBaseX121b {\n" + |
| " callin MyRoleX121b rm() {\n" + |
| " System.out.println(\"MyTeamX121b.MyRoleX121b.rm()\");\n" + |
| " return base.rm();\n" + |
| " }\n" + |
| " rm <- bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MyBaseX121b.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MyBaseX121b {\n" + |
| " public MyBaseX121b bm() {\n" + |
| " System.out.println(\"MyBaseX121b.bm()\");\n" + |
| " return this;\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| " \n" |
| }, |
| "----------\n" + |
| "1. ERROR in test2\\MyTeamX121b.java (at line 9)\n" + |
| " rm <- bm;\n" + |
| " ^^\n" + |
| "Callin modifier (before, after or replace) missing for callin-binding rm (OTJLD A.3.3).\n" + |
| "----------\n"); |
| } |
| |
| // base call requires a result lifting |
| // X.1.2-otjld-result-lifting-1c |
| public void testX12_resultLifting1c() { |
| |
| runConformTest( |
| new String[] { |
| "test2/X12rl1cMain.java", |
| "\n" + |
| "package test2;\n" + |
| "public class X12rl1cMain {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX121 b = new MyBaseX121();\n" + |
| " MyTeamX121 t = new MyTeamX121();\n" + |
| " t.activate();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| "\n" + |
| " \n", |
| "test2/MyBaseX121.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MyBaseX121 {\n" + |
| " public MyBaseX121 bm() {\n" + |
| " System.out.println(\"MyBaseX121.bm()\");\n" + |
| " return this;\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| " \n", |
| "test2/MyTeamX121.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MyTeamX121 {\n" + |
| " public class MyRoleX121 playedBy MyBaseX121 {\n" + |
| " callin MyRoleX121 rm() {\n" + |
| " System.out.println(\"MyTeamX121.MyRoleX121.rm()\");\n" + |
| " return base.rm();\n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeamX121.MyRoleX121.rm()\n" + |
| "MyBaseX121.bm()"); |
| } |
| |
| // base call requires a result lifting - team hierarchy -- wrong base call |
| // X.1.2-otjld-result-lifting-2a |
| public void testX12_resultLifting2a() { |
| runNegativeTest( |
| new String[] { |
| "test2/MySuperTeamX122a.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MySuperTeamX122a {\n" + |
| " public class MyRole1X122a /*playedBy MyBase1X122a*/ {\n" + |
| " callin MyRole2X122a rm() {\n" + |
| " System.out.println(\"MySuperTeamX122a.MyRole1X122a.rm()\");\n" + |
| " return base.m1();\n" + |
| " }\n" + |
| " }\n" + |
| " public class MyRole2X122a {}\n" + |
| "}\n" + |
| " \n", |
| "test2/MyBase2X122a.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MyBase2X122a {\n" + |
| "}\n" + |
| " \n", |
| "test2/MyBase1X122a.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MyBase1X122a {\n" + |
| " public MyBase2X122a bm() {\n" + |
| " System.out.println(\"MyBase1X122a.bm()\");\n" + |
| " return new MyBase2X122a();\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "----------\n" + |
| "1. ERROR in test2\\MySuperTeamX122a.java (at line 7)\n" + |
| " return base.m1();\n" + |
| " ^^^^^^^^^\n" + |
| "Illegal method in base call, can only call base version of the enclosing method rm() (OTJLD 4.3(a)).\n" + |
| "----------\n"); |
| } |
| |
| // base call requires a result lifting - team hierarchy |
| // X.1.2-otjld-result-lifting-2 |
| public void testX12_resultLifting2() { |
| |
| runConformTest( |
| new String[] { |
| "test2/MainX122.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MainX122 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBase1X122 b = new MyBase1X122();\n" + |
| " MyTeamX122 t = new MyTeamX122();\n" + |
| " t.activate();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| " \n", |
| "test2/MyBase2X122.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MyBase2X122 {\n" + |
| "}\n" + |
| " \n", |
| "test2/MyBase1X122.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MyBase1X122 {\n" + |
| " public MyBase2X122 bm() {\n" + |
| " System.out.println(\"MyBase1X122.bm()\");\n" + |
| " return new MyBase2X122();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MySuperTeamX122.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MySuperTeamX122 {\n" + |
| " public class MyRole1X122 /*playedBy MyBase1X122*/ {\n" + |
| " callin MyRole2X122 rm() {\n" + |
| " System.out.println(\"MySuperTeamX122.MyRole1X122.rm()\");\n" + |
| " return base.rm();\n" + |
| " }\n" + |
| " }\n" + |
| " public class MyRole2X122 {}\n" + |
| "}\n" + |
| " \n", |
| "test2/MyTeamX122.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MyTeamX122 extends MySuperTeamX122 {\n" + |
| " @Override\n" + |
| " public class MyRole1X122 playedBy MyBase1X122 {\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " @Override\n" + |
| " public class MyRole2X122 playedBy MyBase2X122 {}\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MySuperTeamX122.MyRole1X122.rm()\n" + |
| "MyBase1X122.bm()"); |
| } |
| |
| // team hierarchy - creating empty subsub team with empty superteam |
| // X.1.2-otjld-result-lifting-3 |
| public void testX12_resultLifting3() { |
| |
| runConformTest( |
| new String[] { |
| "test2/MainX123.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MainX123 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX123 b = new MyBaseX123();\n" + |
| " MySubTeamX123 t = new MySubTeamX123();\n" + |
| " t.go(b);\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MyBaseX123.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MyBaseX123 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBaseX123.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MySuperTeamX123.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MySuperTeamX123 {}\n" + |
| " \n", |
| "test2/MyTeamX123.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MyTeamX123 extends MySuperTeamX123 {\n" + |
| " @org.objectteams.ImplicitTeamActivation\n" + |
| " public void go(MyBaseX123 b) {\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| " public class MyRoleX123 playedBy MyBaseX123 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeamX123.MyRoleX123.rm()\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MySubTeamX123.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MySubTeamX123 extends MyTeamX123 {}\n" + |
| " \n" |
| }, |
| "MyBaseX123.bm()\n" + |
| "MyTeamX123.MyRoleX123.rm()"); |
| } |
| |
| // team hierarchy - creating empty subsub team with empty superteam (different compiler invocation) |
| // X.1.2-otjld-result-lifting-3a |
| public void testX12_resultLifting3a() { |
| |
| runConformTest( |
| new String[] { |
| "test2/MainX123a.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MainX123a {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX123a b = new MyBaseX123a();\n" + |
| " MySubTeamX123a t = new MySubTeamX123a();\n" + |
| " t.go(b);\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MySuperTeamX123a.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MySuperTeamX123a {}\n" + |
| " \n", |
| "test2/MyTeamX123a.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MyTeamX123a extends MySuperTeamX123a {\n" + |
| " @org.objectteams.ImplicitTeamActivation\n" + |
| " public void go(MyBaseX123a b) {\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| " public class MyRoleX123a playedBy MyBaseX123a {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeamX123a.MyRoleX123a.rm()\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MyBaseX123a.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MyBaseX123a {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBaseX123a.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MySubTeamX123a.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MySubTeamX123a extends MyTeamX123a {}\n" + |
| " \n" |
| }, |
| "MyBaseX123a.bm()\n" + |
| "MyTeamX123a.MyRoleX123a.rm()"); |
| } |
| |
| // desc??? |
| // X.1.2-otjld-result-lifting-4 |
| public void testX12_resultLifting4() { |
| |
| runConformTest( |
| new String[] { |
| "test2/Main4.java", |
| "\n" + |
| "package test2;\n" + |
| "public class Main4 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX124 b = new MyBaseX124();\n" + |
| " //MyTeamX124 t = new MyTeamX124();\n" + |
| " MySubTeamX124 t = new MySubTeamX124();\n" + |
| "\n" + |
| " t.go(b);\n" + |
| "\n" + |
| " //System.out.println(\"---- Team is NOT active ---------\");\n" + |
| " //b.bm();\n" + |
| " //t.activate();\n" + |
| " //b.bm();\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n", |
| "test2/MySuperTeamX124.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MySuperTeamX124 {\n" + |
| " /*\n" + |
| " public void go(MyBaseX124 b) {\n" + |
| " b.bm();\n" + |
| " }*/\n" + |
| "}\n" + |
| " \n", |
| "test2/MyTeamX124.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MyTeamX124 extends MySuperTeamX124 {\n" + |
| " @org.objectteams.ImplicitTeamActivation\n" + |
| " public void go(MyBaseX124 b) {\n" + |
| "/*\n" + |
| " if (b.equals(\"test\")) {\n" + |
| " return;\n" + |
| " }\n" + |
| " \n" + |
| " if (b==null) {\n" + |
| " System.out.println(\"b was null\");\n" + |
| " b.bm();\n" + |
| " return;\n" + |
| " }\n" + |
| " b.bm();\n" + |
| " return;\n" + |
| "*/\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| " public class MyRoleX124 playedBy MyBaseX124 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeamX124.MyRoleX124.rm()\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MyBaseX124.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MyBaseX124 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBaseX124.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MySubTeamX124.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MySubTeamX124 extends MyTeamX124 {}\n" + |
| " \n" |
| }, |
| "MyBaseX124.bm()\n" + |
| "MyTeamX124.MyRoleX124.rm()"); |
| } |
| |
| // base call result lifting for role in nested team |
| // X.1.2-otjld-result-lifting-5 |
| public void testX12_resultLifting5() { |
| |
| runConformTest( |
| new String[] { |
| "test2/MainX125.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MainX125 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX125 b = new MyBaseX125();\n" + |
| " MyOuterTeamX125 t = new MyOuterTeamX125();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MyBaseX125.java", |
| "\n" + |
| "package test2;\n" + |
| "public class MyBaseX125 {\n" + |
| " public MyBaseX125 bm() {\n" + |
| " return this;\n" + |
| " }\n" + |
| " @Override public String toString() {\n" + |
| " return\"NOTOK!\";\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test2/MyOuterTeamX125.java", |
| "\n" + |
| "package test2;\n" + |
| "public team class MyOuterTeamX125 {\n" + |
| " MyOuterTeamX125() {\n" + |
| " activate();\n" + |
| " new MyInnerTeamX125();\n" + |
| " }\n" + |
| " \n" + |
| " public team class MyInnerTeamX125 {\n" + |
| " public MyInnerTeamX125() {\n" + |
| " activate();\n" + |
| " }\n" + |
| " public class MyRoleX125 playedBy MyBaseX125 {\n" + |
| " @Override public String toString() {\n" + |
| " return \"OK!\";\n" + |
| " }\n" + |
| " @SuppressWarnings(\"ambiguouslowering\") callin MyRoleX125 rm() {\n" + |
| " MyRoleX125 r = base.rm();\n" + |
| " System.out.print(r);\n" + |
| " return r;\n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "OK!"); |
| } |
| |
| // callin to callin to callin to base method with base calls |
| // X.1.3-otjld-callin-to-callin-1 |
| public void testX13_callinToCallin1() { |
| |
| runConformTest( |
| new String[] { |
| "test3/MainX131.java", |
| "\n" + |
| "package test3;\n" + |
| "public class MainX131 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyTeamCX131 mtc = new MyTeamCX131();\n" + |
| " mtc.activate();\n" + |
| " MyBaseX131 mb = new MyBaseX131();\n" + |
| " mb.doBase(\"test\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyBaseX131.java", |
| "\n" + |
| "package test3;\n" + |
| "\n" + |
| "public class MyBaseX131 {\n" + |
| " public void doBase(String s) {\n" + |
| " System.out.println(\"MyBase.doBase(s)\");\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamAX131.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamAX131 {\n" + |
| " public class LowerRoleX131 playedBy MyBaseX131 {\n" + |
| " callin void doA(String s) {\n" + |
| " System.out.println(\"MyTeamA.LowerRole.doA(s)\");\n" + |
| " base.doA(s);\n" + |
| " }\n" + |
| " doA <- replace doBase;\n" + |
| "\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamBX131.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamBX131 {\n" + |
| "\n" + |
| " final MyTeamAX131 thatTeam = new MyTeamAX131();\n" + |
| " public MyTeamBX131() {\n" + |
| " thatTeam.activate();\n" + |
| " }\n" + |
| " @SuppressWarnings(\"decapsulation\") // wrt base call to doA\n" + |
| " public class MyStackedRoleX131 playedBy LowerRoleX131<@thatTeam> {\n" + |
| " callin void doB() {\n" + |
| " base.doB();\n" + |
| " System.out.println(\"MyTeamB.MyStackedRole.doB()\");\n" + |
| " }\n" + |
| " doB <- replace doA;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamCX131.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamCX131 {\n" + |
| "\n" + |
| " final MyTeamBX131 thatTeam = new MyTeamBX131();\n" + |
| " public MyTeamCX131() {\n" + |
| " thatTeam.activate();\n" + |
| " }\n" + |
| " @SuppressWarnings(\"decapsulation\") // wrt base call to doB\n" + |
| " protected class MyStackedRoleX131 playedBy MyStackedRoleX131<@thatTeam> {\n" + |
| " callin void doC() {\n" + |
| " base.doC();\n" + |
| " System.out.println(\"MyTeamC.MyStackedRole.doC()\");\n" + |
| " }\n" + |
| " doC <- replace doB;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeamA.LowerRole.doA(s)\n" + |
| "MyBase.doBase(s)\n" + |
| "MyTeamB.MyStackedRole.doB()\n" + |
| "MyTeamC.MyStackedRole.doC()"); |
| } |
| |
| // one callin to a callin method and to a non-callin method |
| // X.1.3-otjld-callin-to-callin-2 |
| public void testX13_callinToCallin2() { |
| Map customOptions = getCompilerOptions(); |
| |
| runConformTest( |
| new String[] { |
| "test3/MainX132.java", |
| "\n" + |
| "package test3;\n" + |
| "public class MainX132 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyTeamCX132 mtc = new MyTeamCX132();\n" + |
| " mtc.activate();\n" + |
| " MyBaseX132 mb = new MyBaseX132();\n" + |
| " mb.doBase(\"test\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamCX132.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamCX132 {\n" + |
| "\n" + |
| " final MyTeamBX132 thatTeam = new MyTeamBX132();\n" + |
| " public MyTeamCX132() {\n" + |
| " thatTeam.activate();\n" + |
| " }\n" + |
| " \n" + |
| " protected class MyStackedRoleX132 playedBy MyStackedRoleX132<@thatTeam> {\n" + |
| " callin void doC() {\n" + |
| " base.doC();\n" + |
| " System.out.println(\"MyTeamC.MyStackedRole.doC()\");\n" + |
| " }\n" + |
| " @SuppressWarnings(\"decapsulation\") // wrt base call\n" + |
| " doC <- replace doB;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyBaseX132.java", |
| "\n" + |
| "package test3;\n" + |
| "\n" + |
| "public class MyBaseX132 {\n" + |
| " public void doBase(String s) {\n" + |
| " System.out.println(\"MyBase.doBase(s)\");\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamAX132.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamAX132 {\n" + |
| " public class LowerRoleX132 playedBy MyBaseX132 {\n" + |
| " void doA1() {\n" + |
| " System.out.println(\"MyTeamA.LowerRole.doA1()\");\n" + |
| " }\n" + |
| " void doA1() <- before void doBase(String s);\n" + |
| " \n" + |
| " callin void doA(String s) {\n" + |
| " System.out.println(\"MyTeamA.LowerRole.doA(s)\");\n" + |
| " base.doA(s);\n" + |
| " }\n" + |
| " void doA(String sa) <- replace void doBase(String sb);\n" + |
| "\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamBX132.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamBX132 {\n" + |
| "\n" + |
| " final MyTeamAX132 thatTeam = new MyTeamAX132();\n" + |
| " public MyTeamBX132() {\n" + |
| " thatTeam.activate();\n" + |
| " }\n" + |
| " public class MyStackedRoleX132 playedBy LowerRoleX132<@thatTeam> {\n" + |
| " callin void doB() {\n" + |
| " base.doB();\n" + |
| " System.out.println(\"MyTeamB.MyStackedRole.doB()\");\n" + |
| " }\n" + |
| " @SuppressWarnings(\"decapsulation\") // wrt base call\n" + |
| " void doB() <- replace void doA(String s);\n" + |
| " @SuppressWarnings(\"decapsulation\") // wrt base call\n" + |
| " void doB() <- replace void doA1();\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeamA.LowerRole.doA1()\n" + |
| "MyTeamB.MyStackedRole.doB()\n" + |
| "MyTeamC.MyStackedRole.doC()\n" + |
| "MyTeamA.LowerRole.doA(s)\n" + |
| "MyBase.doBase(s)\n" + |
| "MyTeamB.MyStackedRole.doB()\n" + |
| "MyTeamC.MyStackedRole.doC()", |
| null/*classLibraries*/, |
| true/*shouldFlushOutputDirectory*/, |
| null/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/); |
| } |
| |
| // one callin to a callin method and to a non-callin method - compress to one binding |
| // X.1.3-otjld-callin-to-callin-2a |
| public void testX13_callinToCallin2a() { |
| Map customOptions = getCompilerOptions(); |
| |
| runConformTest( |
| new String[] { |
| "test3/MainX132a.java", |
| "\n" + |
| "package test3;\n" + |
| "public class MainX132a {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyTeamCX132a mtc = new MyTeamCX132a();\n" + |
| " mtc.activate();\n" + |
| " MyBaseX132a mb = new MyBaseX132a();\n" + |
| " mb.doBase(\"test\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamBX132a.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamBX132a {\n" + |
| "\n" + |
| " final MyTeamAX132a thatTeam = new MyTeamAX132a();\n" + |
| " public MyTeamBX132a() {\n" + |
| " thatTeam.activate();\n" + |
| " }\n" + |
| " public class MyStackedRoleX132a playedBy LowerRoleX132a<@thatTeam> {\n" + |
| " callin void doB() {\n" + |
| " base.doB();\n" + |
| " System.out.println(\"MyTeamB.MyStackedRole.doB()\");\n" + |
| " }\n" + |
| " @SuppressWarnings(\"decapsulation\") // wrt base call\n" + |
| " void doB() <- replace void doA(String s);\n" + |
| " @SuppressWarnings(\"decapsulation\") // wrt base call\n" + |
| " void doB() <- replace void doA1();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamCX132a.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamCX132a {\n" + |
| "\n" + |
| " final MyTeamBX132a thatTeam = new MyTeamBX132a();\n" + |
| " public MyTeamCX132a() {\n" + |
| " thatTeam.activate();\n" + |
| " }\n" + |
| " \n" + |
| " protected class MyStackedRoleX132a playedBy MyStackedRoleX132a<@thatTeam> {\n" + |
| " callin void doC() {\n" + |
| " base.doC();\n" + |
| " System.out.println(\"MyTeamC.MyStackedRole.doC()\");\n" + |
| " }\n" + |
| " @SuppressWarnings(\"decapsulation\") // wrt base call\n" + |
| " doC <- replace doB;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyBaseX132a.java", |
| "\n" + |
| "package test3;\n" + |
| "\n" + |
| "public class MyBaseX132a {\n" + |
| " public void doBase(String s) {\n" + |
| " System.out.println(\"MyBase.doBase(s)\");\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamAX132a.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamAX132a {\n" + |
| " public class LowerRoleX132a playedBy MyBaseX132a {\n" + |
| " void doA1() {\n" + |
| " System.out.println(\"MyTeamA.LowerRole.doA1()\");\n" + |
| " }\n" + |
| " void doA1() <- before void doBase(String s);\n" + |
| " \n" + |
| " callin void doA(String s) {\n" + |
| " System.out.println(\"MyTeamA.LowerRole.doA(s)\");\n" + |
| " base.doA(s);\n" + |
| " }\n" + |
| " void doA(String sa) <- replace void doBase(String sb);\n" + |
| "\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeamA.LowerRole.doA1()\n" + |
| "MyTeamB.MyStackedRole.doB()\n" + |
| "MyTeamC.MyStackedRole.doC()\n" + |
| "MyTeamA.LowerRole.doA(s)\n" + |
| "MyBase.doBase(s)\n" + |
| "MyTeamB.MyStackedRole.doB()\n" + |
| "MyTeamC.MyStackedRole.doC()", |
| null/*classLibraries*/, |
| true/*shouldFlushOutputDirectory*/, |
| null/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/); |
| } |
| |
| // callin from a nested team to a callin method |
| // X.1.3-otjld-callin-to-callin-3 |
| public void testX13_callinToCallin3() { |
| Map customOptions = getCompilerOptions(); |
| |
| runConformTest( |
| new String[] { |
| "test3/MainX133.java", |
| "\n" + |
| "package test3;\n" + |
| "public class MainX133 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyTeamBX133 mtb = new MyTeamBX133();\n" + |
| " mtb.activate();\n" + |
| " MyBaseX133 mb = new MyBaseX133();\n" + |
| " mb.doBase();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamBX133.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamBX133 {\n" + |
| " public MyTeamBX133() {\n" + |
| " new MyInnerTeamX133(new MyTeamAX133());\n" + |
| " }\n" + |
| "\n" + |
| " protected team class MyInnerTeamX133 playedBy MyTeamAX133 {\n" + |
| "\n" + |
| " public final MyTeamAX133 base_ref;\n" + |
| "\n" + |
| " public MyInnerTeamX133(final MyTeamAX133 br) {\n" + |
| " base_ref = br;\n" + |
| " activate();\n" + |
| " }\n" + |
| "\n" + |
| " protected class MyStackedRoleX133 playedBy LowerRoleX133<@base_ref> {\n" + |
| " void printMessage() {\n" + |
| " System.out.println(\"MyTeamB.MyInnerTeam.MyStackedRole.printMessage()\");\n" + |
| " }\n" + |
| " printMessage <- after doA;\n" + |
| " }\n" + |
| "\n" + |
| "\n" + |
| "\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyBaseX133.java", |
| "\n" + |
| "package test3;\n" + |
| "\n" + |
| "public class MyBaseX133 {\n" + |
| " public void doBase() {\n" + |
| " System.out.println(\"MyBase.doBase()\");\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamAX133.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamAX133 {\n" + |
| " public class LowerRoleX133 playedBy MyBaseX133 {\n" + |
| " callin void doA() {\n" + |
| " base.doA();\n" + |
| " System.out.println(\"MyTeamA.LowerRole.doA()\");\n" + |
| " }\n" + |
| " void doA() <- replace void doBase();\n" + |
| " }\n" + |
| " MyTeamAX133 () {\n" + |
| " activate();\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyBase.doBase()\n" + |
| "MyTeamA.LowerRole.doA()\n" + |
| "MyTeamB.MyInnerTeam.MyStackedRole.printMessage()", |
| null/*classLibraries*/, |
| true/*shouldFlushOutputDirectory*/, |
| null/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/); |
| } |
| |
| // static callin to callin to callin to base method with base calls |
| // X.1.3-otjld-static-callin-to-callin-1 |
| public void testX13_staticCallinToCallin1() { |
| Map customOptions = getCompilerOptions(); |
| |
| runConformTest( |
| new String[] { |
| "test3/MainX13sctc1.java", |
| "\n" + |
| "package test3;\n" + |
| "public class MainX13sctc1 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyTeamCX13sctc1 mtc = new MyTeamCX13sctc1();\n" + |
| " mtc.activate();\n" + |
| " MyBaseX13sctc1.doBase(\"test\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamCX13sctc1.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamCX13sctc1 {\n" + |
| "\n" + |
| " final MyTeamBX13sctc1 thatTeam = new MyTeamBX13sctc1();\n" + |
| " public MyTeamCX13sctc1() {\n" + |
| " thatTeam.activate();\n" + |
| " }\n" + |
| " \n" + |
| " protected class MyStackedRoleX13sctc1 playedBy MyStackedRoleX13sctc1<@thatTeam> {\n" + |
| " static callin void doC() {\n" + |
| " base.doC();\n" + |
| " System.out.println(\"MyTeamC.MyStackedRole.doC()\");\n" + |
| " }\n" + |
| " @SuppressWarnings(\"decapsulation\") // wrt base call\n" + |
| " doC <- replace doB;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyBaseX13sctc1.java", |
| "\n" + |
| "package test3;\n" + |
| "\n" + |
| "public class MyBaseX13sctc1 {\n" + |
| " public static void doBase(String s) {\n" + |
| " System.out.println(\"MyBase.doBase(s)\");\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamAX13sctc1.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamAX13sctc1 {\n" + |
| " public class LowerRoleX13sctc1 playedBy MyBaseX13sctc1 {\n" + |
| " static callin void doA(String s) {\n" + |
| " System.out.println(\"MyTeamA.LowerRole.doA(s)\");\n" + |
| " base.doA(s);\n" + |
| " }\n" + |
| " doA <- replace doBase;\n" + |
| "\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test3/MyTeamBX13sctc1.java", |
| "\n" + |
| "package test3;\n" + |
| "public team class MyTeamBX13sctc1 {\n" + |
| "\n" + |
| " final MyTeamAX13sctc1 thatTeam = new MyTeamAX13sctc1();\n" + |
| " public MyTeamBX13sctc1() {\n" + |
| " thatTeam.activate();\n" + |
| " }\n" + |
| " public class MyStackedRoleX13sctc1 playedBy LowerRoleX13sctc1<@thatTeam> {\n" + |
| " static callin void doB() {\n" + |
| " base.doB();\n" + |
| " System.out.println(\"MyTeamB.MyStackedRole.doB()\");\n" + |
| " }\n" + |
| " @SuppressWarnings(\"decapsulation\") // wrt base call\n" + |
| " doB <- replace doA;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeamA.LowerRole.doA(s)\n" + |
| "MyBase.doBase(s)\n" + |
| "MyTeamB.MyStackedRole.doB()\n" + |
| "MyTeamC.MyStackedRole.doC()", |
| null/*classLibraries*/, |
| true/*shouldFlushOutputDirectory*/, |
| null/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/); |
| } |
| |
| // (replace) callin from one role method to two base methods with the same name but different signatures |
| // X.1.4-otjld-multiple-signatures-1 |
| public void testX14_multipleSignatures1() { |
| |
| runConformTest( |
| new String[] { |
| "test4/MainX141.java", |
| "\n" + |
| "package test4;\n" + |
| "public class MainX141 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyTeamAX141 mta = new MyTeamAX141();\n" + |
| " mta.activate();\n" + |
| " MyBaseX141 mb = new MyBaseX141();\n" + |
| " mb.doBase(\"test\");\n" + |
| " mb.doBase();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test4/MyBaseX141.java", |
| "\n" + |
| "package test4;\n" + |
| "\n" + |
| "public class MyBaseX141 {\n" + |
| " public void doBase() {\n" + |
| " System.out.println(\"MyBase.doBase()\");\n" + |
| " }\n" + |
| " \n" + |
| " public void doBase(String s) {\n" + |
| " System.out.println(\"MyBase.doBase(s)\");\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n", |
| "test4/MyTeamAX141.java", |
| "\n" + |
| "package test4;\n" + |
| "public team class MyTeamAX141 {\n" + |
| " public class LowerRoleX141 playedBy MyBaseX141 {\n" + |
| " callin void doA() {\n" + |
| " System.out.println(\"MyTeamA.LowerRole.doA()\");\n" + |
| " base.doA();\n" + |
| " }\n" + |
| " void doA() <- replace void doBase(String sb);\n" + |
| " void doA() <- replace void doBase();\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeamA.LowerRole.doA()\n" + |
| "MyBase.doBase(s)\n" + |
| "MyTeamA.LowerRole.doA()\n" + |
| "MyBase.doBase()"); |
| } |
| |
| // after and before callin to a static role method |
| // X.1.5-otjld-callin-to-static-role-method-1 |
| public void testX15_callinToStaticRoleMethod1() { |
| |
| runConformTest( |
| new String[] { |
| "test5/MainX151.java", |
| "\n" + |
| "package test5;\n" + |
| "public class MainX151 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX151 b = new MyBaseX151();\n" + |
| " MyTeamX151 t = new MyTeamX151();\n" + |
| " t.activate();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n", |
| "test5/MyTeamX151.java", |
| "\n" + |
| "package test5;\n" + |
| "public team class MyTeamX151 {\n" + |
| " public class MyRoleX151 playedBy MyBaseX151 {\n" + |
| " public static void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " rm <- before bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test5/MyBaseX151.java", |
| "\n" + |
| "package test5;\n" + |
| "\n" + |
| "public class MyBaseX151 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeam.MyRole.rm()\n" + |
| "MyBase.bm()\n" + |
| "MyTeam.MyRole.rm()"); |
| } |
| |
| // after and before callin to the same role method |
| // X.1.5-otjld-after-and-before-callin-1a |
| public void testX15_afterAndBeforeCallin1a() { |
| |
| runConformTest( |
| new String[] { |
| "test5/MainX151a.java", |
| "\n" + |
| "package test5;\n" + |
| "public class MainX151a {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX151a b = new MyBaseX151a();\n" + |
| " MyTeamX151a t = new MyTeamX151a();\n" + |
| " t.activate();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n", |
| "test5/MyTeamX151a.java", |
| "\n" + |
| "package test5;\n" + |
| "public team class MyTeamX151a {\n" + |
| " public class MyRoleX151a playedBy MyBaseX151a {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " rm <- before bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test5/MyBaseX151a.java", |
| "\n" + |
| "package test5;\n" + |
| "\n" + |
| "public class MyBaseX151a {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeam.MyRole.rm()\n" + |
| "MyBase.bm()\n" + |
| "MyTeam.MyRole.rm()"); |
| } |
| |
| // replace callin to a static (callin) role method |
| // X.1.5-otjld-callin-to-static-role-method-2 |
| public void testX15_callinToStaticRoleMethod2() { |
| runNegativeTestMatching( |
| new String[] { |
| "test5/MyTeamX152.java", |
| "\n" + |
| "package test5;\n" + |
| "public team class MyTeamX152 {\n" + |
| " public class MyRoleX152 playedBy MyBaseX152 {\n" + |
| " static callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test5/MyBaseX152.java", |
| "\n" + |
| "package test5;\n" + |
| "\n" + |
| "public class MyBaseX152 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "4.7(d)"); |
| } |
| |
| // after callin to a static role method |
| // X.1.5-otjld-callin-to-static-role-method-3 |
| public void testX15_callinToStaticRoleMethod3() { |
| |
| runConformTest( |
| new String[] { |
| "test5/MainX153.java", |
| "\n" + |
| "package test5;\n" + |
| "public class MainX153 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX153 b = new MyBaseX153();\n" + |
| " MyTeamX153 t = new MyTeamX153();\n" + |
| " t.activate();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n", |
| "test5/MyTeamX153.java", |
| "\n" + |
| "package test5;\n" + |
| "public team class MyTeamX153 {\n" + |
| " public class MyRoleX153 playedBy MyBaseX153 {\n" + |
| " public static void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test5/MyBaseX153.java", |
| "\n" + |
| "package test5;\n" + |
| "\n" + |
| "public class MyBaseX153 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyBase.bm()\n" + |
| "MyTeam.MyRole.rm()"); |
| } |
| |
| // after callin from a static base method to a non-static role method |
| // X.1.5-otjld-callin-from-static-base-method-4 |
| public void testX15_callinFromStaticBaseMethod4() { |
| runNegativeTest( |
| new String[] { |
| "test5/TeamX15cfsbm4.java", |
| "\n" + |
| "package test5;\n" + |
| "public team class TeamX15cfsbm4 {\n" + |
| " public class MyRole playedBy TX15cfsbm4 {\n" + |
| " public void rm() { }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "test5/TX15cfsbm4.java", |
| "\n" + |
| "package test5;\n" + |
| "\n" + |
| "public class TX15cfsbm4 {\n" + |
| " public static void bm() { }\n" + |
| "}\n" + |
| " \n", |
| "test5/TX15cfsbm4Main.java", |
| "\n" + |
| "package test5;\n" + |
| "public class TX15cfsbm4Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm4 t = new TeamX15cfsbm4();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm4.bm();\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n" |
| }, |
| null); |
| } |
| |
| // a replace-callin binds a static base method to a static role method without arguments |
| // X.1.5-otjld-callin-from-static-base-method-5 |
| public void testX15_callinFromStaticBaseMethod5() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm5Main.java", |
| "\n" + |
| " public class TX15cfsbm5Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm5 t = new TeamX15cfsbm5();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm5.sm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm5.java", |
| "\n" + |
| " public class TX15cfsbm5 {\n" + |
| " public static void sm(){}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm5.java", |
| "\n" + |
| " public team class TeamX15cfsbm5 {\n" + |
| " public class RX15cfsbm5 playedBy TX15cfsbm5{\n" + |
| " static callin void srm(){\n" + |
| " base.srm();\n" + |
| " System.out.print(\"OK\");\n" + |
| " }\n" + |
| " srm <- replace sm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // a replace-callin binds a static base method with a declared result to a static role method that does not declare a result |
| // X.1.5-otjld-callin-from-static-base-method-6 |
| public void testX15_callinFromStaticBaseMethod6() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm6Main.java", |
| "\n" + |
| " public class TX15cfsbm6Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm6 t = new TeamX15cfsbm6();\n" + |
| " t.activate();\n" + |
| " System.out.print(TX15cfsbm6.bm());\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm6.java", |
| "\n" + |
| " public class TX15cfsbm6 {\n" + |
| " public static int bm(){\n" + |
| " return 7;\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm6.java", |
| "\n" + |
| " public team class TeamX15cfsbm6 {\n" + |
| " public class RX15cfsbm6 playedBy TX15cfsbm6{\n" + |
| " static callin void srm(){\n" + |
| " base.srm();\n" + |
| " }\n" + |
| " void srm() <- replace int bm() with { \n" + |
| " 3 -> result\n" + |
| " }\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "3"); |
| } |
| |
| // replace-callin binding to a static role method with argument mapping |
| // X.1.5-otjld-callin-from-static-base-method-7 |
| public void testX15_callinFromStaticBaseMethod7() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm7Main.java", |
| "\n" + |
| " public class TX15cfsbm7Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm7 t = new TeamX15cfsbm7();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm7.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm7.java", |
| "\n" + |
| " public class TX15cfsbm7 {\n" + |
| " public static void bm(){}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm7.java", |
| "\n" + |
| " public team class TeamX15cfsbm7 {\n" + |
| " public class RX15cfsbm7 playedBy TX15cfsbm7{\n" + |
| " static callin void srm(String arg){\n" + |
| " base.srm(arg);\n" + |
| " System.out.print(arg);\n" + |
| " }\n" + |
| " void srm(String arg) <- replace void bm() with { \n" + |
| " arg <- \"OK\"\n" + |
| " }\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // a replace-callin binding cannot bind a non-static base method to a static role method |
| // X.1.5-otjld-callin-from-static-base-method-8 |
| public void testX15_callinFromStaticBaseMethod8() { |
| runNegativeTestMatching( |
| new String[] { |
| "TeamX15cfsbm8.java", |
| "\n" + |
| " public team class TeamX15cfsbm8 {\n" + |
| " public class RX15cfsbm8 playedBy TX15cfsbm8{\n" + |
| " static callin void srm(){\n" + |
| " base.srm();\n" + |
| " }\n" + |
| " srm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm8.java", |
| "\n" + |
| " public class TX15cfsbm8 {\n" + |
| " public void bm(){}\n" + |
| " }\n" + |
| " \n" |
| }, |
| "4.7(d)"); |
| } |
| |
| // a replace-callin binding of a static base method to a non-static role method is illegal |
| // X.1.5-otjld-callin-from-static-base-method-9 |
| public void testX15_callinFromStaticBaseMethod9() { |
| runNegativeTestMatching( |
| new String[] { |
| "TeamX15cfsbm9.java", |
| "\n" + |
| " public team class TeamX15cfsbm9 {\n" + |
| " public class RX15cfsbm9 playedBy TX15cfsbm9{\n" + |
| " callin void srm(){\n" + |
| " base.srm();\n" + |
| " }\n" + |
| " srm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm9.java", |
| "\n" + |
| " public class TX15cfsbm9 {\n" + |
| " public static void bm(){}\n" + |
| " }\n" + |
| " \n" |
| }, |
| "4.7(b)"); |
| } |
| |
| // a before-callin binding of a static base method to a non-static role method is illegal |
| // X.1.5-otjld-callin-from-static-base-method-10 |
| public void testX15_callinFromStaticBaseMethod10() { |
| runNegativeTestMatching( |
| new String[] { |
| "TeamX15cfsbm10.java", |
| "\n" + |
| " public team class TeamX15cfsbm10 {\n" + |
| " public class RX15cfsbm10 playedBy TX15cfsbm10{\n" + |
| " public void srm(){}\n" + |
| " srm <- before bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm10.java", |
| "\n" + |
| " public class TX15cfsbm10 {\n" + |
| " public static void bm(){}\n" + |
| " }\n" + |
| " \n" |
| }, |
| "4.7(b)"); |
| } |
| |
| // an after-callin binding of a static base method to a non-static role method is illegal |
| // X.1.5-otjld-callin-from-static-base-method-11 |
| public void testX15_callinFromStaticBaseMethod11() { |
| runNegativeTestMatching( |
| new String[] { |
| "TeamX15cfsbm11.java", |
| "\n" + |
| " public team class TeamX15cfsbm11 {\n" + |
| " public class RX15cfsbm11 playedBy TX15cfsbm11{\n" + |
| " public void srm(){}\n" + |
| " srm <- after bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm11.java", |
| "\n" + |
| " public class TX15cfsbm11 {\n" + |
| " public static void bm(){}\n" + |
| " }\n" + |
| " \n" |
| }, |
| "4.7(b)"); |
| } |
| |
| // a replace-callin binds an inherited static role method to a static base method |
| // X.1.5-otjld-callin-from-static-base-method-12 |
| public void testX15_callinFromStaticBaseMethod12() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm12Main.java", |
| "\n" + |
| " public class TX15cfsbm12Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm12_2 t = new TeamX15cfsbm12_2();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm12.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm12.java", |
| "\n" + |
| " public class TX15cfsbm12 {\n" + |
| " public static void bm(){}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm12_1.java", |
| "\n" + |
| " public team class TeamX15cfsbm12_1 {\n" + |
| " public class RX15cfsbm12_1 {\n" + |
| " static callin void srm() {\n" + |
| " base.srm();\n" + |
| " System.out.print(\"OK\");\n" + |
| " }\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm12_2.java", |
| "\n" + |
| " public team class TeamX15cfsbm12_2 extends TeamX15cfsbm12_1{\n" + |
| " public class RX15cfsbm12_2 extends RX15cfsbm12_1 playedBy TX15cfsbm12{\n" + |
| " srm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // a replace-callin binds an inherited static role method to a static base method - same team |
| // X.1.5-otjld-callin-from-static-base-method-12a |
| public void testX15_callinFromStaticBaseMethod12a() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm12aMain.java", |
| "\n" + |
| " public class TX15cfsbm12aMain {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm12a_1 t = new TeamX15cfsbm12a_1();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm12a.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm12a.java", |
| "\n" + |
| " public class TX15cfsbm12a {\n" + |
| " public static void bm(){}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm12a_1.java", |
| "\n" + |
| " public team class TeamX15cfsbm12a_1 {\n" + |
| " public class RX15cfsbm12a_1 {\n" + |
| " static callin void srm() {\n" + |
| " base.srm();\n" + |
| " System.out.print(\"OK\");\n" + |
| " }\n" + |
| " }\n" + |
| " public class RX15cfsbm12a_2 extends RX15cfsbm12a_1 playedBy TX15cfsbm12a {\n" + |
| " srm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // a replace-callin binds an inherited static role method to a static base method - method has a role type parameter |
| // X.1.5-otjld-callin-from-static-base-method-12b |
| public void testX15_callinFromStaticBaseMethod12b() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm12bMain.java", |
| "\n" + |
| " public class TX15cfsbm12bMain {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm12b_2 t = new TeamX15cfsbm12b_2();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm12b.bm(new TX15cfsbm12b(\"!\"));\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm12b.java", |
| "\n" + |
| " public class TX15cfsbm12b {\n" + |
| " String v;\n" + |
| " public void k() { \n" + |
| " System.out.print(v);\n" + |
| " }\n" + |
| " public TX15cfsbm12b(String v) { this.v = v; }\n" + |
| " public static void bm(TX15cfsbm12b b){ System.out.print(\"O\");}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm12b_1.java", |
| "\n" + |
| " public abstract team class TeamX15cfsbm12b_1 {\n" + |
| " public abstract class RX15cfsbm12b_1 {\n" + |
| " static callin void srm(RX15cfsbm12b_2 r) {\n" + |
| " base.srm(r);\n" + |
| " System.out.print(\"K\");\n" + |
| " r.co();\n" + |
| " }\n" + |
| " abstract void co();\n" + |
| " }\n" + |
| " public abstract class RX15cfsbm12b_2 extends RX15cfsbm12b_1 playedBy TX15cfsbm12b {}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm12b_2.java", |
| "\n" + |
| " public team class TeamX15cfsbm12b_2 extends TeamX15cfsbm12b_1{\n" + |
| " public class RX15cfsbm12b_2 {\n" + |
| " void srm(RX15cfsbm12b_2 r) <- replace void bm(TX15cfsbm12b b);\n" + |
| " co -> k;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK!"); |
| } |
| |
| // a replace-callin binds an inherited static role method to a static base method - method has a role type parameter -- double compile |
| // X.1.5-otjld-callin-from-static-base-method-12c |
| public void testX15_callinFromStaticBaseMethod12c() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm12cMain.java", |
| "\n" + |
| " public class TX15cfsbm12cMain {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm12c_2 t = new TeamX15cfsbm12c_2();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm12c.bm(new TX15cfsbm12c(\"!\"));\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm12c.java", |
| "\n" + |
| " public class TX15cfsbm12c {\n" + |
| " String v;\n" + |
| " public void k() {\n" + |
| " System.out.print(v);\n" + |
| " }\n" + |
| " public TX15cfsbm12c(String v) { this.v = v; }\n" + |
| " public static void bm(TX15cfsbm12c b){ System.out.print(\"O\");}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm12c_1.java", |
| "\n" + |
| " public abstract team class TeamX15cfsbm12c_1 {\n" + |
| " public abstract class RX15cfsbm12c_1 {\n" + |
| " static callin void srm(RX15cfsbm12c_2 r) {\n" + |
| " base.srm(r);\n" + |
| " System.out.print(\"K\");\n" + |
| " r.co();\n" + |
| " }\n" + |
| " abstract void co();\n" + |
| " }\n" + |
| " public abstract class RX15cfsbm12c_2 extends RX15cfsbm12c_1 playedBy TX15cfsbm12c {}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm12c_2.java", |
| "\n" + |
| " public team class TeamX15cfsbm12c_2 extends TeamX15cfsbm12c_1{\n" + |
| " public class RX15cfsbm12c_2 {\n" + |
| " void srm(RX15cfsbm12c_2 r) <- replace void bm(TX15cfsbm12c b);\n" + |
| " co -> k;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK!"); |
| } |
| |
| // an after-callin binds an inherited static role method to a static base method |
| // X.1.5-otjld-callin-from-static-base-method-13 |
| public void testX15_callinFromStaticBaseMethod13() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm13Main.java", |
| "\n" + |
| " public class TX15cfsbm13Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm13_2 t = new TeamX15cfsbm13_2();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm13.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm13.java", |
| "\n" + |
| " public class TX15cfsbm13 {\n" + |
| " public static void bm(){}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm13_1.java", |
| "\n" + |
| " public team class TeamX15cfsbm13_1 {\n" + |
| " public class RX15cfsbm13_1{\n" + |
| " public static void srm() {\n" + |
| " System.out.print(\"OK\");\n" + |
| " }\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm13_2.java", |
| "\n" + |
| " public team class TeamX15cfsbm13_2 extends TeamX15cfsbm13_1{\n" + |
| " public class RX15cfsbm13_2 extends RX15cfsbm13_1 playedBy TX15cfsbm13{\n" + |
| " srm <- after bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // a before-callin binds an inherited static role method to a static base method |
| // X.1.5-otjld-callin-from-static-base-method-14 |
| public void testX15_callinFromStaticBaseMethod14() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm14Main.java", |
| "\n" + |
| " public class TX15cfsbm14Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm14_2 t = new TeamX15cfsbm14_2();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm14.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm14.java", |
| "\n" + |
| " public class TX15cfsbm14 {\n" + |
| " public static void bm(){}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm14_1.java", |
| "\n" + |
| " public team class TeamX15cfsbm14_1 {\n" + |
| " public class RX15cfsbm14_1{\n" + |
| " public static void srm() {\n" + |
| " System.out.print(\"OK\");\n" + |
| " }\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm14_2.java", |
| "\n" + |
| " public team class TeamX15cfsbm14_2 extends TeamX15cfsbm14_1{\n" + |
| " public class RX15cfsbm14_2 extends RX15cfsbm14_1 playedBy TX15cfsbm14{\n" + |
| " srm <- after bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // a replace-callin binds an inherited method (implemented within the super-super team) to a static base method |
| // X.1.5-otjld-callin-from-static-base-method-15 |
| public void testX15_callinFromStaticBaseMethod15() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm15Main.java", |
| "\n" + |
| " public class TX15cfsbm15Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm15_3 t = new TeamX15cfsbm15_3();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm15_2.bm2(); \n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm15_1.java", |
| "\n" + |
| " public class TX15cfsbm15_1 {\n" + |
| " public static void bm1() {}\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm15_2.java", |
| "\n" + |
| " public class TX15cfsbm15_2 {\n" + |
| " public static void bm2() {}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm15_1.java", |
| "\n" + |
| " public team class TeamX15cfsbm15_1 {\n" + |
| " public class RX15cfsbm15_1 {\n" + |
| " static callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"OK\");\n" + |
| " }\n" + |
| " } \n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm15_2.java", |
| "\n" + |
| " public team class TeamX15cfsbm15_2 extends TeamX15cfsbm15_1{\n" + |
| " public class RX15cfsbm15_2_1 extends RX15cfsbm15_1 playedBy TX15cfsbm15_1{\n" + |
| " rm <- replace bm1;\n" + |
| " }\n" + |
| " \n" + |
| " public class RX15cfsbm15_2_2 extends RX15cfsbm15_1 playedBy TX15cfsbm15_2{\n" + |
| " rm <- replace bm2;\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm15_3.java", |
| "\n" + |
| " public team class TeamX15cfsbm15_3 extends TeamX15cfsbm15_2{\n" + |
| " public class RX15cfsbm15_3 extends RX15cfsbm15_1 playedBy TX15cfsbm15_2{\n" + |
| " rm <- replace bm2;\n" + |
| " }\n" + |
| " precedence RX15cfsbm15_2_2, RX15cfsbm15_3;\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OKOK"); |
| } |
| |
| // static base call requires a result lifting |
| // X.1.5-otjld-callin-from-static-base-method-16 |
| public void testX15_callinFromStaticBaseMethod16() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm16Main.java", |
| "\n" + |
| " public class TX15cfsbm16Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm16 t = new TeamX15cfsbm16();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm16.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm16.java", |
| "\n" + |
| " public class TX15cfsbm16 { \n" + |
| " public static TX15cfsbm16 bm() {\n" + |
| " System.out.println(\"TX15cfsbm16.bm()\");\n" + |
| " return new TX15cfsbm16(); \n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm16.java", |
| "\n" + |
| " public team class TeamX15cfsbm16 {\n" + |
| " public class RX15cfsbm16 playedBy TX15cfsbm16 {\n" + |
| " static callin RX15cfsbm16 rm() {\n" + |
| " System.out.println(\"TeamX15cfsbm16.RX15cfsbm16.rm()\");\n" + |
| " return base.rm();\n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "TeamX15cfsbm16.RX15cfsbm16.rm()\n" + |
| "TX15cfsbm16.bm()"); |
| } |
| |
| // static base call requires a result lifting; parameter involved |
| // X.1.5-otjld-callin-from-static-base-method-16a |
| public void testX15_callinFromStaticBaseMethod16a() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm16aMain.java", |
| "\n" + |
| " public class TX15cfsbm16aMain {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm16a t = new TeamX15cfsbm16a();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm16a.bm(\"\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm16a.java", |
| "\n" + |
| " public class TX15cfsbm16a { \n" + |
| " public static TX15cfsbm16a bm(String s) {\n" + |
| " System.out.println(\"TX15cfsbm16a.bm()\");\n" + |
| " return new TX15cfsbm16a(); \n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm16a.java", |
| "\n" + |
| " public team class TeamX15cfsbm16a {\n" + |
| " public class RX15cfsbm16a playedBy TX15cfsbm16a {\n" + |
| " static callin RX15cfsbm16a rm(String s) {\n" + |
| " System.out.println(\"TeamX15cfsbm16a.RX15cfsbm16a.rm()\");\n" + |
| " return base.rm(s);\n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "TeamX15cfsbm16a.RX15cfsbm16a.rm()\n" + |
| "TX15cfsbm16a.bm()"); |
| } |
| |
| // replace-callin-binding with parameter mapping (constant value) |
| // X.1.5-otjld-callin-from-static-base-method-17 |
| public void testX15_callinFromStaticBaseMethod17() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm17Main.java", |
| "\n" + |
| " public class TX15cfsbm17Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm17 t = new TeamX15cfsbm17();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm17.bm(42);\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm17.java", |
| "\n" + |
| " public class TX15cfsbm17 {\n" + |
| " static void bm(int a) {}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm17.java", |
| "\n" + |
| " public team class TeamX15cfsbm17 {\n" + |
| " public class RX15cfsbm17 playedBy TX15cfsbm17{\n" + |
| " static callin void rm(int b) {\n" + |
| " base.rm(b);\n" + |
| " System.out.print(b);\n" + |
| " }\n" + |
| " \n" + |
| " void rm(int b) <- replace void bm(int a) with {\n" + |
| " b <- 7\n" + |
| " }\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "7"); |
| } |
| |
| // an inherited static role method is bound in different roles to different static base methods |
| // X.1.5-otjld-callin-from-static-base-method-18 |
| public void testX15_callinFromStaticBaseMethod18() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm18Main.java", |
| "\n" + |
| " public class TX15cfsbm18Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm18_2 t = new TeamX15cfsbm18_2();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm18_1.bm();\n" + |
| " TX15cfsbm18_2.bm();\n" + |
| " \n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm18_1.java", |
| "\n" + |
| " public class TX15cfsbm18_1 {\n" + |
| " public static void bm() {\n" + |
| " System.out.println(\"OK1\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm18_2.java", |
| "\n" + |
| " public class TX15cfsbm18_2 {\n" + |
| " public static void bm() {\n" + |
| " System.out.println(\"OK2\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm18_1.java", |
| "\n" + |
| " public team class TeamX15cfsbm18_1 {\n" + |
| " public class RX15cfsbm18_1 {\n" + |
| " static callin void rm() {\n" + |
| " base.rm();\n" + |
| " }\n" + |
| " } \n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm18_2.java", |
| "\n" + |
| " public team class TeamX15cfsbm18_2 extends TeamX15cfsbm18_1{\n" + |
| " public class RX15cfsbm18_2_1 extends RX15cfsbm18_1 playedBy TX15cfsbm18_1{\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " \n" + |
| " public class RX15cfsbm18_2_2 extends RX15cfsbm18_1 playedBy TX15cfsbm18_2{\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK1\n" + |
| "OK2"); |
| } |
| |
| // static role methods are bound to same base method |
| // X.1.5-otjld-callin-from-static-base-method-19 |
| public void testX15_callinFromStaticBaseMethod19() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm19Main.java", |
| "\n" + |
| " public class TX15cfsbm19Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm19 t = new TeamX15cfsbm19();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm19.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm19.java", |
| "\n" + |
| " public class TX15cfsbm19 {\n" + |
| " public static void bm() {}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm19.java", |
| "\n" + |
| " public team class TeamX15cfsbm19 { \n" + |
| " public class RX15cfsbm19 playedBy TX15cfsbm19 { \n" + |
| " static callin void rm1() {\n" + |
| " System.out.println(\"rm1()\");\n" + |
| " base.rm1();\n" + |
| " }\n" + |
| " \n" + |
| " static callin void rm2() {\n" + |
| " System.out.println(\"rm2()\");\n" + |
| " base.rm2();\n" + |
| " }\n" + |
| " \n" + |
| " c1: rm1 <- replace bm;\n" + |
| " c2: rm2 <- replace bm;\n" + |
| " precedence c1,c2;\n" + |
| " } \n" + |
| " }\n" + |
| " \n" |
| }, |
| "rm1()\n" + |
| "rm2()"); |
| } |
| |
| // static role methods of different roles are bound to same base method - no precedence needed due to different static base classes |
| // X.1.5-otjld-callin-from-static-base-method-19r |
| public void testX15_callinFromStaticBaseMethod19r() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm19rMain.java", |
| "\n" + |
| " public class TX15cfsbm19rMain {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm19r t = new TeamX15cfsbm19r();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm19r_2.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm19r_1.java", |
| "\n" + |
| " public class TX15cfsbm19r_1 {\n" + |
| " public static void bm() {}\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm19r_2.java", |
| "\n" + |
| " public class TX15cfsbm19r_2 extends TX15cfsbm19r_1 {}\n" + |
| " \n", |
| "TeamX15cfsbm19r.java", |
| "\n" + |
| " public team class TeamX15cfsbm19r {\n" + |
| " public class RX15cfsbm19r1 playedBy TX15cfsbm19r_1 {\n" + |
| " static callin void rm1() {\n" + |
| " System.out.println(\"rm1()\");\n" + |
| " base.rm1();\n" + |
| " }\n" + |
| " c1: rm1 <- replace bm;\n" + |
| " }\n" + |
| " public class RX15cfsbm19r2 playedBy TX15cfsbm19r_2 {\n" + |
| " static callin void rm2() {\n" + |
| " System.out.println(\"rm2()\");\n" + |
| " base.rm2();\n" + |
| " }\n" + |
| " c2: rm2 <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "rm2()\n" + |
| "rm1()"); |
| } |
| |
| // static replace binding to a base method, base- and team classes are placed in a package |
| // X.1.5-otjld-callin-from-static-base-method-20 |
| public void testX15_callinFromStaticBaseMethod20() { |
| |
| runConformTest( |
| new String[] { |
| "cfsbm20/TX15cfsbm20Main.java", |
| "\n" + |
| " package cfsbm20;\n" + |
| " public class TX15cfsbm20Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm20 t = new TeamX15cfsbm20();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm20.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "cfsbm20/TX15cfsbm20.java", |
| "\n" + |
| " package cfsbm20;\n" + |
| " public class TX15cfsbm20 {\n" + |
| " public static void bm() {\n" + |
| " System.out.print(\"OK\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "cfsbm20/TeamX15cfsbm20.java", |
| "\n" + |
| " package cfsbm20;\n" + |
| " public team class TeamX15cfsbm20 { \n" + |
| " public class RX15cfsbm20 playedBy TX15cfsbm20 { \n" + |
| " static callin void rm() {\n" + |
| " base.rm();\n" + |
| " } \n" + |
| " rm <- replace bm;\n" + |
| " } \n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // a static and a non-static role methods are bound to same base method |
| // X.1.5-otjld-callin-from-static-base-method-21 |
| public void testX15_callinFromStaticBaseMethod21() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm21Main.java", |
| "\n" + |
| " public class TX15cfsbm21Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm21 t = new TeamX15cfsbm21();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm21 b = new TX15cfsbm21();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm21.java", |
| "\n" + |
| " public class TX15cfsbm21 {\n" + |
| " public void bm() {}\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm21.java", |
| "\n" + |
| " public team class TeamX15cfsbm21 { \n" + |
| " public class RX15cfsbm21 playedBy TX15cfsbm21 { \n" + |
| " static void rm1() {\n" + |
| " System.out.println(\"OK1\"); \n" + |
| " }\n" + |
| " void rm2() {\n" + |
| " System.out.println(\"OK2\"); \n" + |
| " }\n" + |
| " c1: rm1 <- after bm;\n" + |
| " c2: rm2 <- after bm;\n" + |
| " precedence after c2, c1;\n" + |
| " } \n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK1\n" + |
| "OK2"); |
| } |
| |
| // an overridden static base method is bound to methods of different role classes |
| // X.1.5-otjld-callin-from-static-base-method-22 |
| public void testX15_callinFromStaticBaseMethod22() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm22Main.java", |
| "\n" + |
| " public class TX15cfsbm22Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm22 t = new TeamX15cfsbm22();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm22_2.bm(); \n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm22_1.java", |
| "\n" + |
| " public class TX15cfsbm22_1 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"NOTO\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm22_2.java", |
| "\n" + |
| " public class TX15cfsbm22_2 extends TX15cfsbm22_1 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"O\");\n" + |
| " } \n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm22.java", |
| "\n" + |
| " public team class TeamX15cfsbm22 {\n" + |
| " public class RX15cfsbm22_1 playedBy TX15cfsbm22_1 {\n" + |
| " static callin void rm(){\n" + |
| " base.rm();\n" + |
| " System.out.print(\"X\");\n" + |
| " } \n" + |
| " c1: rm <- replace bm;\n" + |
| " }\n" + |
| " \n" + |
| " public class RX15cfsbm22_2 playedBy TX15cfsbm22_2 {\n" + |
| " static callin void rm(){\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\");\n" + |
| " } \n" + |
| " c2: rm <- replace bm;\n" + |
| " } \n" + |
| " precedence RX15cfsbm22_2.c2, RX15cfsbm22_1.c1;\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // an inherited static base method is bound (after) in a sub base class |
| // X.1.5-otjld-callin-from-static-base-method-23 |
| public void testX15_callinFromStaticBaseMethod23() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm23Main.java", |
| "\n" + |
| " public class TX15cfsbm23Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm23 t = new TeamX15cfsbm23();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm23_1.bm();\n" + |
| " TX15cfsbm23_2.bm(); \n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm23_1.java", |
| "\n" + |
| " public class TX15cfsbm23_1 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm23_2.java", |
| "\n" + |
| " public class TX15cfsbm23_2 extends TX15cfsbm23_1 { \n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm23.java", |
| "\n" + |
| " public team class TeamX15cfsbm23 {\n" + |
| " public class RX15cfsbm23_1 playedBy TX15cfsbm23_2 {\n" + |
| " static void rm(){\n" + |
| " System.out.print(\"K\");\n" + |
| " } \n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| (this.weavingScheme == WeavingScheme.OTRE |
| ? "OOK" |
| : "KK")); // see restriction https://bugs.eclipse.org/435136#c1 |
| } |
| |
| // an inherited static base method is bound (replace) in a sub base class |
| // X.1.5-otjld-callin-from-static-base-method-23a |
| public void testX15_callinFromStaticBaseMethod23a() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm23aMain.java", |
| "\n" + |
| " public class TX15cfsbm23aMain {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm23a t = new TeamX15cfsbm23a();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm23a_1.bm();\n" + |
| " TX15cfsbm23a_2.bm(); \n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm23a_1.java", |
| "\n" + |
| " public class TX15cfsbm23a_1 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm23a_2.java", |
| "\n" + |
| " public class TX15cfsbm23a_2 extends TX15cfsbm23a_1 { \n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm23a.java", |
| "\n" + |
| " public team class TeamX15cfsbm23a {\n" + |
| " public class RX15cfsbm23a_1 playedBy TX15cfsbm23a_2 {\n" + |
| " static callin void rm(){\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\");\n" + |
| " } \n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| (this.weavingScheme == WeavingScheme.OTRE |
| ? "OOK" |
| : "KK")); // see restriction https://bugs.eclipse.org/435136#c1 |
| } |
| |
| // a static base method is redefined and rebound (after) to a static (also redefined) role method |
| // X.1.5-otjld-callin-from-static-base-method-24 |
| public void testX15_callinFromStaticBaseMethod24() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm24Main.java", |
| "\n" + |
| " public class TX15cfsbm24Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm24 t = new TeamX15cfsbm24();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm24_1.bm();\n" + |
| " System.out.print(\"|\");\n" + |
| " TX15cfsbm24_2.bm(); \n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm24_1.java", |
| "\n" + |
| " public class TX15cfsbm24_1 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"NOTO\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm24_2.java", |
| "\n" + |
| " public class TX15cfsbm24_2 extends TX15cfsbm24_1 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm24.java", |
| "\n" + |
| " public team class TeamX15cfsbm24 {\n" + |
| " public class RX15cfsbm24_1 playedBy TX15cfsbm24_1 {\n" + |
| " static void rm(){\n" + |
| " System.out.print(\"X\");\n" + |
| " } \n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "\n" + |
| " public class RX15cfsbm24_2 extends RX15cfsbm24_1 playedBy TX15cfsbm24_2 {\n" + |
| " static void rm(){\n" + |
| " System.out.print(\"K\");\n" + |
| " } \n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "NOTOX|OK"); |
| } |
| |
| // a static base method is redefined and rebound (replace) to a static (also redefined) role method |
| // X.1.5-otjld-callin-from-static-base-method-24a |
| public void testX15_callinFromStaticBaseMethod24a() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm24aMain.java", |
| "\n" + |
| " public class TX15cfsbm24aMain {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm24a t = new TeamX15cfsbm24a();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm24a_1.bm();\n" + |
| " System.out.print(\"|\");\n" + |
| " TX15cfsbm24a_2.bm(); \n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm24a_1.java", |
| "\n" + |
| " public class TX15cfsbm24a_1 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"NOTO\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm24a_2.java", |
| "\n" + |
| " public class TX15cfsbm24a_2 extends TX15cfsbm24a_1 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm24a.java", |
| "\n" + |
| " public team class TeamX15cfsbm24a {\n" + |
| " public class RX15cfsbm24a_1 playedBy TX15cfsbm24a_1 {\n" + |
| " static callin void rm(){\n" + |
| " base.rm();\n" + |
| " System.out.print(\"X\");\n" + |
| " } \n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| "\n" + |
| " public class RX15cfsbm24a_2 extends RX15cfsbm24a_1 playedBy TX15cfsbm24a_2 {\n" + |
| " static callin void rm(){\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\");\n" + |
| " } \n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "NOTOX|OK"); |
| } |
| |
| // if a static base method is bound in a super base class, a call to this (not redefined!) method at the subclass 'inherits' the callin |
| // X.1.5-otjld-callin-from-static-base-method-25 |
| public void testX15_callinFromStaticBaseMethod25() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm25Main.java", |
| "\n" + |
| " public class TX15cfsbm25Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm25 t = new TeamX15cfsbm25();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm25_1.bm();\n" + |
| " TX15cfsbm25_2.bm(); \n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm25_1.java", |
| "\n" + |
| " public class TX15cfsbm25_1 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm25_2.java", |
| "\n" + |
| " public class TX15cfsbm25_2 extends TX15cfsbm25_1 { \n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm25.java", |
| "\n" + |
| " public team class TeamX15cfsbm25 {\n" + |
| " public class RX15cfsbm25_1 playedBy TX15cfsbm25_1 {\n" + |
| " static void rm(){\n" + |
| " System.out.print(\"K\");\n" + |
| " } \n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OKOK"); |
| } |
| |
| // replace binding of static methods - additional binding to the same role method in a sub role |
| // X.1.5-otjld-callin-from-static-base-method-26 |
| public void testX15_callinFromStaticBaseMethod26() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm26Main.java", |
| "\n" + |
| " public class TX15cfsbm26Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm26_1 t = new TeamX15cfsbm26_1();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm26.bm1();\n" + |
| " System.out.print(\"|\");\n" + |
| " TX15cfsbm26.bm2();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm26.java", |
| "\n" + |
| " public class TX15cfsbm26 {\n" + |
| " public static void bm1(){\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " \n" + |
| " public static void bm2() {\n" + |
| " System.out.print(\"OKA\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm26_1.java", |
| "\n" + |
| " public team class TeamX15cfsbm26_1 {\n" + |
| " public class RX15cfsbm26_1 playedBy TX15cfsbm26 {\n" + |
| " static callin void srm() {\n" + |
| " base.srm();\n" + |
| " System.out.print(\"K\");\n" + |
| " }\n" + |
| " srm <- replace bm1;\n" + |
| " }\n" + |
| " public class RX15cfsbm26_2 extends RX15cfsbm26_1 {\n" + |
| " srm <- replace bm2;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK|OKAK"); |
| } |
| |
| // replace binding of static methods - additional binding to the same base method in a sub role |
| // X.1.5-otjld-callin-from-static-base-method-27 |
| public void testX15_callinFromStaticBaseMethod27() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm27Main.java", |
| "\n" + |
| " public class TX15cfsbm27Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm27_1 t = new TeamX15cfsbm27_1();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm27.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm27.java", |
| "\n" + |
| " public class TX15cfsbm27 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm27_1.java", |
| "\n" + |
| " public team class TeamX15cfsbm27_1 {\n" + |
| " precedence RX15cfsbm27_1.b1, RX15cfsbm27_2.b2;\n" + |
| " public class RX15cfsbm27_1 playedBy TX15cfsbm27 {\n" + |
| " static callin void srm1() {\n" + |
| " base.srm1();\n" + |
| " System.out.print(\"Y\");\n" + |
| " }\n" + |
| " b1: srm1 <- replace bm;\n" + |
| "\n" + |
| " static callin void srm2() {\n" + |
| " base.srm2();\n" + |
| " System.out.print(\"KA\");\n" + |
| " }\n" + |
| " }\n" + |
| " public class RX15cfsbm27_2 extends RX15cfsbm27_1 {\n" + |
| " b2: srm2 <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OKAY"); |
| } |
| |
| // replace binding of static methods - redefined role method in a sub role |
| // X.1.5-otjld-callin-from-static-base-method-28 |
| public void testX15_callinFromStaticBaseMethod28() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm28Main.java", |
| "\n" + |
| " public class TX15cfsbm28Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm28_1 t = new TeamX15cfsbm28_1();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm28.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm28.java", |
| "\n" + |
| " public class TX15cfsbm28 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm28_1.java", |
| "\n" + |
| " public team class TeamX15cfsbm28_1 {\n" + |
| " public class RX15cfsbm28_1 playedBy TX15cfsbm28 {\n" + |
| " static callin void srm() {\n" + |
| " base.srm();\n" + |
| " System.out.print(\"K\");\n" + |
| " }\n" + |
| " srm <- replace bm;\n" + |
| " }\n" + |
| " public class RX15cfsbm28_2 extends RX15cfsbm28_1 {\n" + |
| " static callin void srm() {\n" + |
| " base.srm();\n" + |
| " System.out.print(\"X\");\n" + |
| " }\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // a redefined static base method does not inherit a callin binding from its version of the super class |
| // X.1.5-otjld-callin-from-static-base-method-29 |
| public void testX15_callinFromStaticBaseMethod29() { |
| |
| runConformTest( |
| new String[] { |
| "TX15cfsbm29Main.java", |
| "\n" + |
| " public class TX15cfsbm29Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX15cfsbm29_1 t = new TeamX15cfsbm29_1();\n" + |
| " t.activate();\n" + |
| " TX15cfsbm29_2.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm29.java", |
| "\n" + |
| " public class TX15cfsbm29 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"X\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX15cfsbm29_2.java", |
| "\n" + |
| " public class TX15cfsbm29_2 extends TX15cfsbm29 {\n" + |
| " public static void bm(){\n" + |
| " System.out.print(\"OK\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX15cfsbm29_1.java", |
| "\n" + |
| " public team class TeamX15cfsbm29_1 {\n" + |
| " public class RX15cfsbm29_1 playedBy TX15cfsbm29 {\n" + |
| " static callin void srm() {\n" + |
| " System.out.print(\"NOT\");\n" + |
| " base.srm(); \n" + |
| " }\n" + |
| " srm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // we had a problem with signature weakening in team methods across several levels of inheritance, resulting in an "abstract method" error at run-time |
| // X.1.6-otjld-abstract-team-method-1 |
| public void testX16_abstractTeamMethod1() { |
| |
| runConformTest( |
| new String[] { |
| "X16atmMain1.java", |
| "\n" + |
| "import p16.*;\n" + |
| "public class X16atmMain1 {\n" + |
| " public static void main(String[] args) {\n" + |
| " X16atm1 b = new X16atm1();\n" + |
| " TeamX16atm1_2 t = new TeamX16atm1_3();\n" + |
| " t.activate();\n" + |
| " b.bm();\n" + |
| " t.doIt();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p16/X16atm1.java", |
| "\n" + |
| "package p16; \n" + |
| "public class X16atm1 {\n" + |
| " public void bm() {\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p16/TeamX16atm1_1.java", |
| "\n" + |
| "package p16;\n" + |
| "public abstract team class TeamX16atm1_1 {\n" + |
| " abstract MyRole getRole();\n" + |
| " abstract protected class MyRole {}\n" + |
| " public void doIt() {\n" + |
| " MyRole mr = getRole();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p16/TeamX16atm1_2.java", |
| "\n" + |
| "package p16;\n" + |
| "public abstract team class TeamX16atm1_2 extends TeamX16atm1_1 {\n" + |
| " @Override\n" + |
| " public void doIt() {\n" + |
| " MyRole mr = getRole();\n" + |
| " }\n" + |
| " @Override\n" + |
| " public class MyRole playedBy X16atm1 {\n" + |
| " public void rm() {\n" + |
| " System.out.print(\"K\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p16/TeamX16atm1_3.java", |
| " \n" + |
| "package p16;\n" + |
| "public team class TeamX16atm1_3 extends TeamX16atm1_2 {\n" + |
| " @Override\n" + |
| " public MyRole getRole() {\n" + |
| " return null;\n" + |
| " }\n" + |
| "} \n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // if a team is referenced only indirect it has to be loaded before its bases too |
| // X.1.7-otjld-referenced-teams-1 |
| public void testX17_referencedTeams1() { |
| |
| runConformTest( |
| new String[] { |
| "X17rtMain1.java", |
| "\n" + |
| "import p17.*;\n" + |
| "public class X17rtMain1 {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamReferencerX17rt1 tr = null;\n" + |
| " MyBaseX17rt1 b = new MyBaseX17rt1();\n" + |
| " tr = new TeamReferencerX17rt1();\n" + |
| " tr.doIt();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "\n" + |
| "}\n" + |
| " \n", |
| "p17/MyBaseX17rt1.java", |
| "\n" + |
| "package p17;\n" + |
| "public class MyBaseX17rt1 {\n" + |
| " public void bm() {\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p17/TeamReferencerX17rt1.java", |
| "\n" + |
| "package p17;\n" + |
| "public class TeamReferencerX17rt1 {\n" + |
| " public void doIt() {\n" + |
| " TeamX17rt1 mt = new TeamX17rt1();\n" + |
| " try {\n" + |
| " mt.activate();\n" + |
| " } catch (org.objectteams.UnsupportedFeatureException ufe) {\n" + |
| " System.out.print(\"N\");\n" + |
| " }\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p17/TeamX17rt1.java", |
| "\n" + |
| "package p17; \n" + |
| "public team class TeamX17rt1 {\n" + |
| " public class MyRole playedBy MyBaseX17rt1 {\n" + |
| " public void rm() {\n" + |
| " System.out.print(\"K\");\n" + |
| " }\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| (this.weavingScheme == WeavingScheme.OTDRE ? "OK" : "NO")); |
| } |
| |
| // an after callin passes the base result to the team |
| // X.1.8-otjld-after-result-passing-1 |
| public void testX18_afterResultPassing1() { |
| |
| runConformTest( |
| new String[] { |
| "X18arpMain1.java", |
| "\n" + |
| "import p18.*;\n" + |
| "public class X18arpMain1 {\n" + |
| "\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX18arp1 b = new MyBaseX18arp1();\n" + |
| " TeamX18arp1 t = new TeamX18arp1();\n" + |
| " t.activate();\n" + |
| " b.bm(\"seven\", \"unused\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p18/MyBaseX18arp1.java", |
| "\n" + |
| "package p18;\n" + |
| "public class MyBaseX18arp1 {\n" + |
| " public int bm(String arg, String arg2) {\n" + |
| " System.out.println(\"MyBase.bm(\"+arg+\")\");\n" + |
| " return 77;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p18/TeamX18arp1.java", |
| "\n" + |
| "package p18; \n" + |
| "public team class TeamX18arp1 {\n" + |
| " public class MyRole playedBy MyBaseX18arp1 {\n" + |
| " public void rm(int i) {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm(\"+i+\")\");\n" + |
| " }\n" + |
| "\n" + |
| " void rm(int i) <- after int bm(String s, String s2) with {\n" + |
| " i <- result\n" + |
| " }\n" + |
| "\n" + |
| " void rm(int i) <- before int bm(String s, String s2) with {\n" + |
| " i <- s.length()\n" + |
| " }\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeam.MyRole.rm(5)\n" + |
| "MyBase.bm(seven)\n" + |
| "MyTeam.MyRole.rm(77)"); |
| } |
| |
| // a team is instantiated and activated via a teamconfig file |
| // X.1.9-otjld-teamconfig-file-1 |
| public void testX19_teamconfigFile1() { |
| myWriteFiles( |
| new String[] { |
| "p19/config1.txt", |
| "\n" + |
| "p19.TeamX19tcf1\n"}); |
| Map customOptions = getCompilerOptions(); |
| runConformTest( |
| new String[] { |
| "X19tcfMain1.java", |
| "\n" + |
| "import p19.*;\n" + |
| "public class X19tcfMain1 {\n" + |
| "\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX19tcf1 b = new MyBaseX19tcf1();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/MyBaseX19tcf1.java", |
| "\n" + |
| "package p19;\n" + |
| "public class MyBaseX19tcf1 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/TeamX19tcf1.java", |
| "\n" + |
| "package p19; \n" + |
| "public team class TeamX19tcf1 {\n" + |
| " public class MyRole playedBy MyBaseX19tcf1 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- before bm;\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeam.MyRole.rm()\n" + |
| "MyBase.bm()\n" + |
| "MyTeam.MyRole.rm()", |
| null/*classLibraries*/, |
| false/*shouldFlushOutputDirectory*/, |
| getTeamActivationVMArgs("p19/config1.txt")/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/); |
| } |
| |
| // a team is instantiated and activated via a teamconfig file - the main method contains an exception handler |
| // X.1.9-otjld-teamconfig-file-2 |
| public void testX19_teamconfigFile2() { |
| myWriteFiles( |
| new String[] { |
| "p19/config2.txt", |
| "\n" + |
| "p19.TeamX19tcf2\n" + |
| "\n" |
| }); |
| Map customOptions = getCompilerOptions(); |
| runConformTest( |
| new String[] { |
| "X19tcfMain2.java", |
| "\n" + |
| "import p19.*;\n" + |
| "public class X19tcfMain2 {\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX19tcf2 b = new MyBaseX19tcf2();\n" + |
| " b.bm(true);\n" + |
| " try {\n" + |
| " b.bm(false);\n" + |
| " } catch (NullPointerException npe) {\n" + |
| " System.out.println(\"NullPointerException caught!\");\n" + |
| " }\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/MyBaseX19tcf2.java", |
| "\n" + |
| "package p19;\n" + |
| "public class MyBaseX19tcf2 {\n" + |
| " public void bm(boolean ok) {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " if (!ok)\n" + |
| " throw new NullPointerException();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/TeamX19tcf2.java", |
| "\n" + |
| "package p19; \n" + |
| "public team class TeamX19tcf2 {\n" + |
| " public class MyRole playedBy MyBaseX19tcf2 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- before bm;\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeam.MyRole.rm()\n" + |
| "MyBase.bm()\n" + |
| "MyTeam.MyRole.rm()\n" + |
| "MyTeam.MyRole.rm()\n" + |
| "MyBase.bm()\n" + |
| "NullPointerException caught!", |
| null/*classLibraries*/, |
| false/*shouldFlushOutputDirectory*/, |
| getTeamActivationVMArgs("p19/config2.txt")/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/); |
| } |
| |
| // a team is instantiated and activated via a teamconfig file, bindings are in the super team |
| // X.1.9-otjld-teamconfig-file-3 |
| public void testX19_teamconfigFile3() { |
| myWriteFiles(new String[] { |
| "configX19tcf3.txt", |
| "\n" + |
| "TeamX19tcf3_2 \n" + |
| " \n"}); |
| Map customOptions = getCompilerOptions(); |
| runConformTest( |
| new String[] { |
| "TX19tcf3Main.java", |
| "\n" + |
| "public class TX19tcf3Main {\n" + |
| " static TX19tcf3 b;\n" + |
| " public static void main(String[] args) {\n" + |
| " b = new TX19tcf3();\n" + |
| " b.nop();\n" + |
| " }\n" + |
| "} \n" + |
| " \n", |
| "TX19tcf3.java", |
| "\n" + |
| "public team class TX19tcf3 {\n" + |
| " void nop() {}\n" + |
| "} \n" + |
| " \n", |
| "TeamX19tcf3_1.java", |
| "\n" + |
| "public team class TeamX19tcf3_1 {\n" + |
| " protected class RX19tcf3_1 {\n" + |
| " void out() {}\n" + |
| " }\n" + |
| " protected class RX19tcf3_2 extends RX19tcf3_1 playedBy TX19tcf3 {\n" + |
| " out <- after nop;\n" + |
| " }\n" + |
| "} \n" + |
| " \n", |
| "TeamX19tcf3_2.java", |
| "\n" + |
| "public team class TeamX19tcf3_2 extends TeamX19tcf3_1 {\n" + |
| " protected class RX19tcf3_1 {\n" + |
| " void out() { System.out.print(\"OK\"); }\n" + |
| " } \n" + |
| "} \n" + |
| " \n" |
| }, |
| "OK", |
| null/*classLibraries*/, |
| false/*shouldFlushOutputDirectory*/, |
| getTeamActivationVMArgs("configX19tcf3.txt")/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/); |
| } |
| |
| // trying to instantiate and activate a team without a default constructor via a teamconfig file |
| // X.1.9-otjld-teamconfig-file-4 |
| public void testX19_teamconfigFile4() { |
| Map customOptions = getCompilerOptions(); |
| myWriteFiles(new String[] { |
| "p19/config4.txt", |
| "\n" + |
| "p19.TeamX19tcf4\n" + |
| "\n" |
| }); |
| runTest( |
| new String[] { |
| "X19tcfMain4.java", |
| "\n" + |
| "import p19.*;\n" + |
| "public class X19tcfMain4 {\n" + |
| "\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX19tcf4 b = new MyBaseX19tcf4();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/MyBaseX19tcf4.java", |
| "\n" + |
| "package p19;\n" + |
| "public class MyBaseX19tcf4 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/TeamX19tcf4.java", |
| "\n" + |
| "package p19; \n" + |
| "public team class TeamX19tcf4 {\n" + |
| " public TeamX19tcf4(String anArg) {\n" + |
| " }\n" + |
| "\n" + |
| " public class MyRole playedBy MyBaseX19tcf4 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- before bm;\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| false/*expectingCompileErrors*/, |
| null/*expectedCompilerLog*/, |
| "MyBase.bm()"/*expectedOutputString*/, |
| "Activation failed: Team class 'p19.TeamX19tcf4' has no default constuctor!", |
| false/*forceExecution*/, |
| null/*classLibraries*/, |
| false/*shouldFlushOutputDirectory*/, |
| getTeamActivationVMArgs("p19/config4.txt")/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/, |
| true/*skipJavac*/); |
| } |
| |
| // trying to add a nonexisting team via a teamconfig file |
| // X.1.9-otjld-teamconfig-file-5 |
| public void testX19_teamconfigFile5() { |
| Map customOptions = getCompilerOptions(); |
| myWriteFiles(new String[] { |
| "p19/config5.txt", |
| "\n" + |
| "p19.TeamX19tcf5NOTEXISTING\n" + |
| "\n"}); |
| runTest( |
| new String[] { |
| "X19tcfMain5.java", |
| "\n" + |
| "import p19.*;\n" + |
| "public class X19tcfMain5 {\n" + |
| "\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX19tcf5 b = new MyBaseX19tcf5();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/MyBaseX19tcf5.java", |
| "\n" + |
| "package p19;\n" + |
| "public class MyBaseX19tcf5 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/TeamX19tcf5.java", |
| "\n" + |
| "package p19; \n" + |
| "public team class TeamX19tcf5 {\n" + |
| " public class MyRole playedBy MyBaseX19tcf5 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- before bm;\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| false/*expectingCompileErrors*/, |
| null/*expectedCompilerLog*/, |
| "MyBase.bm()"/*expectedOutputString*/, |
| "Config error: Team class \'p19.TeamX19tcf5NOTEXISTING\' in config file \'"+OUTPUT_DIR+"/p19/config5.txt\' can not be found!" /*exepectedErrorString*/, |
| false/*forceExecution*/, |
| null/*classLibraries*/, |
| false/*shouldFlushOutputDirectory*/, |
| getTeamActivationVMArgs("p19/config5.txt")/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/, |
| true/*skipJavac*/); |
| } |
| |
| // trying to add a nonexisting team via a teamconfig file, also adding an existing team |
| // X.1.9-otjld-teamconfig-file-5a |
| public void testX19_teamconfigFile5a() { |
| Map customOptions = getCompilerOptions(); |
| myWriteFiles(new String[] { |
| "p19/config5a.txt", |
| "\n" + |
| "p19.TeamX19tcf5aNOTEXISTING\n" + |
| "p19.TeamX19tcf5a\n" + |
| "\n"}); |
| runTest( |
| new String[] { |
| "X19tcfMain5a.java", |
| "\n" + |
| "import p19.*;\n" + |
| "public class X19tcfMain5a {\n" + |
| "\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX19tcf5a b = new MyBaseX19tcf5a();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/MyBaseX19tcf5a.java", |
| "\n" + |
| "package p19;\n" + |
| "public class MyBaseX19tcf5a {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/TeamX19tcf5a.java", |
| "\n" + |
| "package p19; \n" + |
| "public team class TeamX19tcf5a {\n" + |
| " public class MyRole playedBy MyBaseX19tcf5a {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- before bm;\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| false/*expectingCompileErrors*/, |
| null/*expectedCompilerLog*/, |
| "MyTeam.MyRole.rm()\n" + |
| "MyBase.bm()\n" + |
| "MyTeam.MyRole.rm()"/*expectedOutputString*/, |
| "Config error: Team class 'p19.TeamX19tcf5aNOTEXISTING' in config file '"+OUTPUT_DIR+"/p19/config5a.txt' can not be found!", |
| false/*forceExecution*/, |
| null/*classLibraries*/, |
| false/*shouldFlushOutputDirectory*/, |
| getTeamActivationVMArgs("p19/config5a.txt")/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/, |
| true/*skipJavac*/); |
| } |
| |
| // trying to use a nonexisting teamconfig file |
| // X.1.9-otjld-teamconfig-file-6 |
| public void testX19_teamconfigFile6() { |
| Map customOptions = getCompilerOptions(); |
| runTest( |
| new String[] { |
| "X19tcfMain6.java", |
| "\n" + |
| "import p19.*;\n" + |
| "public class X19tcfMain6 {\n" + |
| "\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX19tcf6 b = new MyBaseX19tcf6();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/MyBaseX19tcf6.java", |
| "\n" + |
| "package p19;\n" + |
| "public class MyBaseX19tcf6 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| false/*expectingCompileErrors*/, |
| null/*expectedCompilerLog*/, |
| "MyBase.bm()"/*expectedOutputString*/, |
| "File input error: config file '"+OUTPUT_DIR+"/p19/config6.txt' can not be found!"/*expectedErrorString*/, |
| false/*forceExecution*/, |
| null/*classLibraries*/, |
| false/*shouldFlushOutputDirectory*/, |
| getTeamActivationVMArgs("p19/config6.txt")/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/, |
| true/*skipJavac*/); |
| } |
| |
| // using comments in a teamconfig file |
| // X.1.9-otjld-teamconfig-file-7 |
| public void testX19_teamconfigFile7() { |
| Map customOptions = getCompilerOptions(); |
| myWriteFiles(new String[] { |
| "p19/config7.txt", |
| "\n" + |
| "# this is a comment \n" + |
| "p19.TeamX19tcf7\n" + |
| "# here is another comment\n" + |
| "\n"}); |
| runConformTest( |
| new String[] { |
| "X19tcfMain7.java", |
| "\n" + |
| "import p19.*;\n" + |
| "public class X19tcfMain7 {\n" + |
| "\n" + |
| " public static void main(String[] args) {\n" + |
| " MyBaseX19tcf7 b = new MyBaseX19tcf7();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/MyBaseX19tcf7.java", |
| "\n" + |
| "package p19;\n" + |
| "public class MyBaseX19tcf7 {\n" + |
| " public void bm() {\n" + |
| " System.out.println(\"MyBase.bm()\");\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "p19/TeamX19tcf7.java", |
| "\n" + |
| "package p19; \n" + |
| "public team class TeamX19tcf7 {\n" + |
| " public class MyRole playedBy MyBaseX19tcf7 {\n" + |
| " public void rm() {\n" + |
| " System.out.println(\"MyTeam.MyRole.rm()\");\n" + |
| " }\n" + |
| " rm <- before bm;\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "MyTeam.MyRole.rm()\n" + |
| "MyBase.bm()\n" + |
| "MyTeam.MyRole.rm()", |
| null/*classLibraries*/, |
| false/*shouldFlushOutputDirectory*/, |
| getTeamActivationVMArgs("p19/config7.txt")/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/); |
| } |
| |
| // a sub base is bound to another team |
| // X.2.1-otjld-callin-with-base-inheritance-1 |
| public void testX21_callinWithBaseInheritance1() { |
| |
| runConformTest( |
| new String[] { |
| "TX21cwbi1Main.java", |
| "\n" + |
| " public class TX21cwbi1Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX21cwbi1_1 t1 = new TeamX21cwbi1_1();\n" + |
| " TeamX21cwbi1_2 t2 = new TeamX21cwbi1_2();\n" + |
| " t1.activate();\n" + |
| " t2.activate();\n" + |
| " TX21cwbi1_2 b = new TX21cwbi1_2();\n" + |
| " b.bm2();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX21cwbi1.java", |
| "\n" + |
| " public class TX21cwbi1 {\n" + |
| " public void bm(){}\n" + |
| " }\n" + |
| " \n", |
| "TX21cwbi1_2.java", |
| "\n" + |
| " public class TX21cwbi1_2 extends TX21cwbi1 {\n" + |
| " public void bm2(){}\n" + |
| " }\n" + |
| " \n", |
| "TeamX21cwbi1_1.java", |
| "\n" + |
| " public team class TeamX21cwbi1_1 {\n" + |
| " public class RX21cwbi1_1 playedBy TX21cwbi1 {\n" + |
| " callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\");\n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX21cwbi1_2.java", |
| "\n" + |
| " public team class TeamX21cwbi1_2 {\n" + |
| " public class RX21cwbi1_2 playedBy TX21cwbi1_2 {\n" + |
| " public void rm() {\n" + |
| " System.out.print(\"O\");\n" + |
| " } \n" + |
| " rm <- before bm2;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // a sub base is bound to another role, the super base should not be affected |
| // X.2.1-otjld-callin-with-base-inheritance-2 |
| public void testX21_callinWithBaseInheritance2() { |
| |
| runConformTest( |
| new String[] { |
| "TX21cwbi2Main.java", |
| "\n" + |
| " public class TX21cwbi2Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX21cwbi2_2 t2 = new TeamX21cwbi2_2();\n" + |
| " t2.activate();\n" + |
| " TX21cwbi2 b = new TX21cwbi2();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX21cwbi2.java", |
| "\n" + |
| " public class TX21cwbi2 {\n" + |
| " public void bm(){\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX21cwbi2_2.java", |
| "\n" + |
| " public class TX21cwbi2_2 extends TX21cwbi2 {}\n" + |
| " \n", |
| "TeamX21cwbi2_1.java", |
| "\n" + |
| " public team class TeamX21cwbi2_1 {\n" + |
| " public class RX21cwbi2_1 playedBy TX21cwbi2 {\n" + |
| " callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\");\n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX21cwbi2_2.java", |
| "\n" + |
| " public team class TeamX21cwbi2_2 extends TeamX21cwbi2_1 {\n" + |
| " public class RX21cwbi2_2 extends RX21cwbi2_1 playedBy TX21cwbi2_2 {}\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // object creation (invokespecial != super) in overridden callin bound base method |
| // X.2.1-otjld-callin-with-base-inheritance-3 |
| public void testX21_callinWithBaseInheritance3() { |
| |
| runConformTest( |
| new String[] { |
| "TX21cwbi3Main.java", |
| "\n" + |
| " public class TX21cwbi3Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX21cwbi3_1 t = new TeamX21cwbi3_1();\n" + |
| " t.activate();\n" + |
| " TX21cwbi3_2 b = new TX21cwbi3_2();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX21cwbi3.java", |
| "\n" + |
| " public class TX21cwbi3 {\n" + |
| " public void bm(){\n" + |
| " System.out.print(\"NOTO\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX21cwbi3_2.java", |
| "\n" + |
| " public class TX21cwbi3_2 extends TX21cwbi3 {\n" + |
| " public void bm() {\n" + |
| " String s = new String(\"O\");\n" + |
| " System.out.print(s);\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX21cwbi3_1.java", |
| "\n" + |
| " public team class TeamX21cwbi3_1 {\n" + |
| " public class RX21cwbi3_1 playedBy TX21cwbi3 {\n" + |
| " callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\");\n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // overridden callin bound base method with arguments |
| // X.2.1-otjld-callin-with-base-inheritance-4 |
| public void testX21_callinWithBaseInheritance4() { |
| |
| runConformTest( |
| new String[] { |
| "TX21cwbi4Main.java", |
| "\n" + |
| " public class TX21cwbi4Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX21cwbi4_1 t = new TeamX21cwbi4_1();\n" + |
| " t.activate();\n" + |
| " TX21cwbi4_2 b = new TX21cwbi4_2();\n" + |
| " b.bm(\"NOTO\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX21cwbi4.java", |
| "\n" + |
| " public class TX21cwbi4 {\n" + |
| " public void bm(String s){\n" + |
| " System.out.print(s);\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX21cwbi4_2.java", |
| "\n" + |
| " public class TX21cwbi4_2 extends TX21cwbi4 {\n" + |
| " public void bm(String s) {\n" + |
| " if (s.startsWith(\"NOT\")) {\n" + |
| " s = s.substring(3, s.length());\n" + |
| " }\n" + |
| " super.bm(s);\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX21cwbi4_1.java", |
| "\n" + |
| " public team class TeamX21cwbi4_1 {\n" + |
| " public class RX21cwbi4_1 playedBy TX21cwbi4 {\n" + |
| " callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\");\n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // static replace binding with refinement of 'playedBy' in the same team + base method redefinition |
| // X.2.2-otjld-played-by-refinement-1 |
| public void testX22_playedByRefinement1() { |
| |
| runConformTest( |
| new String[] { |
| "TX22pbr1Main.java", |
| "\n" + |
| " public class TX22pbr1Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX22pbr1 t = new TeamX22pbr1();\n" + |
| " t.activate();\n" + |
| " TX22pbr1.bm();\n" + |
| " TX22pbr1_2.bm();\n" + |
| " \n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX22pbr1.java", |
| "\n" + |
| " public class TX22pbr1 {\n" + |
| " public static void bm() {\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX22pbr1_2.java", |
| "\n" + |
| " public class TX22pbr1_2 extends TX22pbr1 {\n" + |
| " public static void bm() {\n" + |
| " System.out.print(\"AY\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX22pbr1.java", |
| "\n" + |
| " public team class TeamX22pbr1 { \n" + |
| " public class RX22pbr1 playedBy TX22pbr1 { \n" + |
| " static callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\"); \n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " } \n" + |
| " public class RX122br1_2 extends RX22pbr1 playedBy TX22pbr1_2 { \n" + |
| " static callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"NOT\"); \n" + |
| " }\n" + |
| " } \n" + |
| " }\n" + |
| " \n" |
| }, |
| "OKAY"); |
| } |
| |
| // static replace binding with refinement of 'playedBy' in a subteam + base method redefinition |
| // X.2.2-otjld-played-by-refinement-2 |
| public void testX22_playedByRefinement2() { |
| |
| runConformTest( |
| new String[] { |
| "TX22pbr2Main.java", |
| "\n" + |
| " public class TX22pbr2Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX22pbr2_2 t = new TeamX22pbr2_2();\n" + |
| " t.activate();\n" + |
| " TX22pbr2.bm();\n" + |
| " TX22pbr2_2.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX22pbr2.java", |
| "\n" + |
| " public class TX22pbr2 {\n" + |
| " public static void bm() {\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX22pbr2_2.java", |
| "\n" + |
| " public class TX22pbr2_2 extends TX22pbr2 {\n" + |
| " public static void bm() {\n" + |
| " System.out.print(\"AY\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX22pbr2.java", |
| "\n" + |
| " public team class TeamX22pbr2 { \n" + |
| " public class RX22pbr2 playedBy TX22pbr2 { \n" + |
| " static callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\"); \n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " } \n" + |
| " }\n" + |
| " \n", |
| "TeamX22pbr2_2.java", |
| "\n" + |
| " public team class TeamX22pbr2_2 extends TeamX22pbr2 { \n" + |
| " public class RX22pbr2_2 extends RX22pbr2 playedBy TX22pbr2_2 { \n" + |
| " static callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"NOT\"); \n" + |
| " }\n" + |
| " } \n" + |
| " }\n" + |
| " \n" |
| }, |
| "OKAY"); |
| } |
| |
| // replace binding with refinement of 'playedBy' in the same team + base method redefinition |
| // X.2.2-otjld-played-by-refinement-3 |
| public void testX22_playedByRefinement3() { |
| |
| runConformTest( |
| new String[] { |
| "TX22pbr3Main.java", |
| "\n" + |
| " public class TX22pbr3Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX22pbr3 t = new TeamX22pbr3();\n" + |
| " t.activate();\n" + |
| " TX22pbr3_2 b = new TX22pbr3_2();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX22pbr3.java", |
| "\n" + |
| " public class TX22pbr3 {\n" + |
| " public void bm() {\n" + |
| " System.out.print(\"NOTO\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX22pbr3_2.java", |
| "\n" + |
| " public class TX22pbr3_2 extends TX22pbr3 {\n" + |
| " public void bm() {\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX22pbr3.java", |
| "\n" + |
| " public team class TeamX22pbr3 { \n" + |
| " public class RX22pbr3 playedBy TX22pbr3 { \n" + |
| " callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"X\"); \n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " } \n" + |
| " public class RX22pbr3_2 extends RX22pbr3 playedBy TX22pbr3_2 { \n" + |
| " callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\"); \n" + |
| " }\n" + |
| " } \n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // replace binding with refinement of 'playedBy' in a subteam + base method redefinition |
| // X.2.2-otjld-played-by-refinement-4 |
| public void testX22_playedByRefinement4() { |
| |
| runConformTest( |
| new String[] { |
| "TX22pbr4Main.java", |
| "\n" + |
| " public class TX22pbr4Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX22pbr4_2 t = new TeamX22pbr4_2();\n" + |
| " t.activate();\n" + |
| " TX22pbr4_2 b = new TX22pbr4_2();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX22pbr4.java", |
| "\n" + |
| " public class TX22pbr4 {\n" + |
| " public void bm() {\n" + |
| " System.out.print(\"NOTO\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX22pbr4_2.java", |
| "\n" + |
| " public class TX22pbr4_2 extends TX22pbr4 {\n" + |
| " public void bm() {\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX22pbr4.java", |
| "\n" + |
| " public team class TeamX22pbr4 { \n" + |
| " public class RX22pbr4 playedBy TX22pbr4 { \n" + |
| " callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"X\"); \n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " } \n" + |
| " }\n" + |
| " \n", |
| "TeamX22pbr4_2.java", |
| "\n" + |
| " public team class TeamX22pbr4_2 extends TeamX22pbr4 { \n" + |
| " public class RX22pbr4_2 extends RX22pbr4 playedBy TX22pbr4_2 { \n" + |
| " callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\"); \n" + |
| " }\n" + |
| " } \n" + |
| " }\n" + |
| " \n" |
| }, |
| "OK"); |
| } |
| |
| // replace binding with refinement of 'playedBy' in a subteam, in an implicit subrole + base method redefinition |
| // X.2.2-otjld-played-by-refinement-5 |
| public void testX22_playedByRefinement5() { |
| |
| runConformTest( |
| new String[] { |
| "TX22pbr5Main.java", |
| "\n" + |
| " public class TX22pbr5Main {\n" + |
| " public static void main(String[] args) {\n" + |
| " TeamX22pbr5_2 t = new TeamX22pbr5_2();\n" + |
| " t.activate();\n" + |
| " TX22pbr5_2 b = new TX22pbr5_2();\n" + |
| " b.bm();\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX22pbr5.java", |
| "\n" + |
| " public class TX22pbr5 {\n" + |
| " public void bm() {\n" + |
| " System.out.print(\"NOTO\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX22pbr5_2.java", |
| "\n" + |
| " public class TX22pbr5_2 extends TX22pbr5 {\n" + |
| " public void bm() {\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TeamX22pbr5.java", |
| "\n" + |
| " public team class TeamX22pbr5 { \n" + |
| " public class RX22pbr5 playedBy TX22pbr5 { \n" + |
| " callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"X\"); \n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " } \n" + |
| " }\n" + |
| " \n", |
| "TeamX22pbr5_2.java", |
| "\n" + |
| " public team class TeamX22pbr5_2 extends TeamX22pbr5 { \n" + |
| " public class RX22pbr5 { \n" + |
| " callin void rm() {\n" + |
| " tsuper.rm();\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\"); \n" + |
| " }\n" + |
| " } \n" + |
| " }\n" + |
| " \n" |
| }, |
| "OXOK"); |
| } |
| |
| // mulitple replace bindings from different roles in the same team to one base method -> compiler should enforce precedence declaration |
| // X.2.3-otjld-multiple-bindings-1 |
| public void testX23_multipleBindings1() { |
| runNegativeTestMatching( |
| new String[] { |
| "TeamX23mb1.java", |
| "\n" + |
| " public team class TeamX23mb1 { \n" + |
| " public class RX23mb1 playedBy TX23mb1 { \n" + |
| " callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"X\"); \n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " } \n" + |
| " public class RX23mb1_2 playedBy TX23mb1_2 { \n" + |
| " callin void rm() {\n" + |
| " base.rm();\n" + |
| " System.out.print(\"K\"); \n" + |
| " }\n" + |
| " rm <- replace bm;\n" + |
| " } \n" + |
| " }\n" + |
| " \n", |
| "TX23mb1.java", |
| "\n" + |
| " public class TX23mb1 {\n" + |
| " public void bm() {\n" + |
| " System.out.print(\"NOTO\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n", |
| "TX23mb1_2.java", |
| "\n" + |
| " public class TX23mb1_2 extends TX23mb1 {\n" + |
| " public void bm() {\n" + |
| " System.out.print(\"O\");\n" + |
| " }\n" + |
| " }\n" + |
| " \n" |
| }, |
| "4.8"); |
| } |
| |
| |
| String[] getBookingClassLibraries() { |
| if (this.verifier != null) |
| this.verifier.shutDown(); |
| this.verifier = getTestVerifier(false); |
| this.createdVerifier = true; |
| |
| String jarFilename = "booking.jar"; |
| 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; |
| } |
| |
| // the flightbonus sample as shipped with the OTDT, compilation only (interactive GUI application!) |
| // X.3.1-otjld-flightbonus-sample |
| public void testX31_flightbonusSample() { |
| runConformTest( |
| new String[] { |
| "fbapplication/DummyMain.java", |
| "package fbapplication;\n" + |
| "public class DummyMain {\n" + |
| " public static void main(String... args) {\n" + |
| " new GUIConnector().activate();\n" + |
| " System.out.print(\"OK\");\n" + |
| " }\n" + |
| "}\n", |
| "fbapplication/FlightBonus.java", |
| "\n" + |
| "package fbapplication;\n" + |
| "import bonussystem.Bonus;\n" + |
| "@SuppressWarnings(\"bindingconventions\")\n" + |
| "public team class FlightBonus extends Bonus {\n" + |
| " public FlightBonus(flightbooking.model.Passenger as Subscriber s) {\n" + |
| " activate();\n" + |
| " }\n" + |
| " @Override\n" + |
| " public class Subscriber playedBy flightbooking.model.Passenger \n" + |
| " base when (FlightBonus.this.hasRole(base)) \n" + |
| " {\n" + |
| " buy <- replace book;\n" + |
| " String getName() -> String getName();\n" + |
| " public Subscriber(flightbooking.model.Passenger p) {\n" + |
| " tsuper();\n" + |
| " }\n" + |
| " };\n" + |
| " @Override\n" + |
| " public class Item playedBy flightbooking.model.Segment {\n" + |
| " @Override\n" + |
| " public int calculateCredit () {\n" + |
| " int miles = getDistance();\n" + |
| " int credit = (((miles+999)/1000)) * 1000;\n" + |
| " return credit;\n" + |
| " };\n" + |
| " earnCredit <- after book;\n" + |
| " String getDestination() -> String getDestination();\n" + |
| " int getDistance() -> int getDistance();\n" + |
| " String getStart() -> String getStart();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "fbapplication/BonusGUI.java", |
| "\n" + |
| "package fbapplication;\n" + |
| "import java.awt.Component;\n" + |
| "import javax.swing.JOptionPane;\n" + |
| "import flightbooking.model.Passenger;\n" + |
| "public team class BonusGUI {\n" + |
| " View view = null;\n" + |
| " abstract protected class View {\n" + |
| " void registerView() {\n" + |
| " BonusGUI.this.view = this;\n" + |
| " }\n" + |
| " protected boolean queryRegisterDialog() {\n" + |
| " int choice = JOptionPane.showConfirmDialog(\n" + |
| " getComponent(), \n" + |
| " \"Register for Flight Bonus?\", \n" + |
| " \"OT Bonus System\", \n" + |
| " JOptionPane.YES_NO_OPTION);\n" + |
| " return choice == JOptionPane.YES_OPTION;\n" + |
| " }\n" + |
| " protected abstract Component getComponent();\n" + |
| " }\n" + |
| " protected class Controller \n" + |
| " when (BonusGUI.this.view != null) \n" + |
| " {\n" + |
| " void queryRegisterForBonus (Passenger p) {\n" + |
| " if (BonusGUI.this.view.queryRegisterDialog()) \n" + |
| " new FlightBonusDialog(new FlightBonus(p));\n" + |
| " };\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "bonussystem/Bonus.java", |
| "\n" + |
| "package bonussystem;\n" + |
| "public abstract team class Bonus {\n" + |
| " protected Subscriber subscriber = null;\n" + |
| " public abstract class Subscriber {\n" + |
| " private int collectedCredits = 0;\n" + |
| " protected int getCollectedCredits() {\n" + |
| " return collectedCredits;\n" + |
| " }\n" + |
| " protected void collectCredit (int credit) {\n" + |
| " collectedCredits += credit;\n" + |
| " }\n" + |
| " callin void buy ()\n" + |
| " {\n" + |
| " Bonus.this.subscriber = this;\n" + |
| " base.buy();\n" + |
| " Bonus.this.subscriber = null;\n" + |
| "\n" + |
| " log(\"Sub. has collected \"+getCollectedCredits()+\" credit points.\");\n" + |
| " }\n" + |
| " }\n" + |
| " public abstract class Item {\n" + |
| " protected abstract int calculateCredit ();\n" + |
| " protected void earnCredit () {\n" + |
| " @SuppressWarnings(\"hiding\")\n" + |
| " Subscriber subscriber = Bonus.this.subscriber;\n" + |
| " if (subscriber == null)\n" + |
| " return;\n" + |
| "\n" + |
| " int tmpCredits = calculateCredit();\n" + |
| " log(\"buying an item that yields \"+tmpCredits+\" credit points.\");\n" + |
| " subscriber.collectCredit(tmpCredits);\n" + |
| " }\n" + |
| " }\n" + |
| " protected void log (String msg) {\n" + |
| " System.out.println(\">>Bonus>> \"+msg);\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "fbapplication/GUIConnector.java", |
| "\n" + |
| "package fbapplication;\n" + |
| "import java.awt.Component;\n" + |
| "@SuppressWarnings(\"bindingconventions\")\n" + |
| "public team class GUIConnector extends BonusGUI {\n" + |
| " @Override\n" + |
| " protected class View playedBy flightbooking.gui.FlightBookingGUI {\n" + |
| " @Override\n" + |
| " protected Component getComponent () {\n" + |
| " return this;\n" + |
| " }\n" + |
| " registerView <- after initComponents;\n" + |
| " }\n" + |
| " @Override\n" + |
| " protected class Controller playedBy flightbooking.model.PassengerDB {\n" + |
| " queryRegisterForBonus <- after add;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "fbapplication/GUIConnector/FlightBonusDialog.java", |
| "\n" + |
| "team package fbapplication.GUIConnector;\n" + |
| "@SuppressWarnings(\"roletypesyntax\")\n" + |
| "protected team class FlightBonusDialog playedBy FlightBonus {\n" + |
| " protected class Collector playedBy base.Item {\n" + |
| " recordCredits <- replace calculateCredit;\n" + |
| " getDestination -> getDestination;\n" + |
| " getStart -> getStart;\n" + |
| " }\n" + |
| " @SuppressWarnings(\"decapsulation\") // getCollectedCredits\n" + |
| " protected class Message playedBy base.Subscriber {\n" + |
| " getTotalCollectedCredits -> getCollectedCredits;\n" + |
| " getName -> getName;\n" + |
| " showBonusDialog <- after buy;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "fbapplication/BonusGUI/FlightBonusDialog.java", |
| "\n" + |
| "team package fbapplication.BonusGUI;\n" + |
| "protected team class FlightBonusDialog playedBy FlightBonus {\n" + |
| " String message; \n" + |
| " public FlightBonusDialog(FlightBonus fb) {\n" + |
| " this.initializeMessage(0);\n" + |
| " this.activate();\n" + |
| " System.out.println(\"FBDialog \");\n" + |
| " }\n" + |
| " void initializeMessage(int credits) {\n" + |
| " this.message = new String(\"Collected credits in the past: \"+credits+\"\\n\");\n" + |
| " }\n" + |
| " protected abstract class Collector {\n" + |
| " public abstract String getStart();\n" + |
| " public abstract String getDestination();\n" + |
| " callin int recordCredits() {\n" + |
| " int credits = base.recordCredits();\n" + |
| " FlightBonusDialog.this.message += \"FlightSegment: \\n\";\n" + |
| " FlightBonusDialog.this.message += \" \"+this.getStart()+\"-->\"+this.getDestination()+\"\\n\";\n" + |
| " FlightBonusDialog.this.message += \" earning credit: \"+credits+\"\\n\";\n" + |
| " return credits;\n" + |
| " }\n" + |
| " }\n" + |
| " protected abstract class Message {\n" + |
| " abstract int getTotalCollectedCredits();\n" + |
| " abstract String getName();\n" + |
| " public void showBonusDialog() {\n" + |
| " int currentCredits = this.getTotalCollectedCredits();\n" + |
| " String title = \"Bonus message for Passenger \"+this.getName(); \n" + |
| " FlightBonusDialog.this.message += new String (\"Collected credits now: \"+currentCredits);\n" + |
| " JOptionPane.showMessageDialog(\n" + |
| " BonusGUI.this.view.getComponent(), \n" + |
| " FlightBonusDialog.this.message, \n" + |
| " title, \n" + |
| " JOptionPane.INFORMATION_MESSAGE);\n" + |
| " FlightBonusDialog.this.initializeMessage(currentCredits);\n" + |
| " }\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "OK", |
| getBookingClassLibraries(), |
| false/*shouldFlushOutputDirectory*/, |
| null/*vmArguments*/); |
| } |
| |
| // the flightbonus sample as shipped with the OTDT, compilation only (interactive GUI application!) - parameterized type syntax |
| // X.3.1-otjld-flightbonus-sample-2 |
| public void testX31_flightbonusSample2() { |
| runConformTest( |
| new String[] { |
| "fbapplication2/DummyMain.java", |
| "package fbapplication2;\n" + |
| "public class DummyMain {\n" + |
| " public static void main(String... args) {\n" + |
| " new GUIConnector().activate();\n" + |
| " System.out.print(\"OK\");\n" + |
| " }\n" + |
| "}\n", |
| "fbapplication2/FlightBonus.java", |
| "\n" + |
| "package fbapplication2;\n" + |
| "import bonussystem2.Bonus;\n" + |
| "import base flightbooking.model.Passenger;\n" + |
| "import base flightbooking.model.Segment;\n" + |
| "public team class FlightBonus extends Bonus {\n" + |
| " public FlightBonus(Passenger as Subscriber s) {\n" + |
| " activate();\n" + |
| " }\n" + |
| " @Override\n" + |
| " public class Subscriber playedBy Passenger \n" + |
| " base when (FlightBonus.this.hasRole(base)) \n" + |
| " {\n" + |
| " buy <- replace book;\n" + |
| " String getName() -> String getName();\n" + |
| " public Subscriber(Passenger p) {\n" + |
| " tsuper();\n" + |
| " }\n" + |
| " };\n" + |
| " @Override\n" + |
| " public class Item playedBy Segment {\n" + |
| " @Override\n" + |
| " int calculateCredit () {\n" + |
| " int miles = getDistance();\n" + |
| " int credit = (((miles+999)/1000)) * 1000;\n" + |
| " return credit;\n" + |
| " };\n" + |
| " earnCredit <- after book;\n" + |
| " String getDestination() -> String getDestination();\n" + |
| " int getDistance() -> int getDistance();\n" + |
| " String getStart() -> String getStart();\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "fbapplication2/BonusGUI.java", |
| "\n" + |
| "package fbapplication2;\n" + |
| "import java.awt.Component;\n" + |
| "import javax.swing.JOptionPane;\n" + |
| "import flightbooking.model.Passenger;\n" + |
| "public team class BonusGUI {\n" + |
| " View view = null;\n" + |
| " abstract protected class View {\n" + |
| " void registerView() {\n" + |
| " BonusGUI.this.view = this;\n" + |
| " }\n" + |
| " protected boolean queryRegisterDialog() {\n" + |
| " int choice = JOptionPane.showConfirmDialog(\n" + |
| " getComponent(), \n" + |
| " \"Register for Flight Bonus?\", \n" + |
| " \"OT Bonus System\", \n" + |
| " JOptionPane.YES_NO_OPTION);\n" + |
| " return choice == JOptionPane.YES_OPTION;\n" + |
| " }\n" + |
| " protected abstract Component getComponent();\n" + |
| " }\n" + |
| " protected class Controller \n" + |
| " when (BonusGUI.this.view != null) \n" + |
| " {\n" + |
| " void queryRegisterForBonus (Passenger p) {\n" + |
| " if (BonusGUI.this.view.queryRegisterDialog()) \n" + |
| " new FlightBonusDialog(new FlightBonus(p));\n" + |
| " };\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "bonussystem2/Bonus.java", |
| "\n" + |
| "package bonussystem2;\n" + |
| "public abstract team class Bonus {\n" + |
| " protected Subscriber subscriber = null;\n" + |
| " public abstract class Subscriber {\n" + |
| " private int collectedCredits = 0;\n" + |
| " protected int getCollectedCredits() {\n" + |
| " return collectedCredits;\n" + |
| " }\n" + |
| " protected void collectCredit (int credit) {\n" + |
| " collectedCredits += credit;\n" + |
| " }\n" + |
| " callin void buy ()\n" + |
| " {\n" + |
| " Bonus.this.subscriber = this;\n" + |
| " base.buy();\n" + |
| " Bonus.this.subscriber = null;\n" + |
| "\n" + |
| " log(\"Sub. has collected \"+getCollectedCredits()+\" credit points.\");\n" + |
| " }\n" + |
| " }\n" + |
| " public abstract class Item {\n" + |
| " abstract int calculateCredit ();\n" + |
| " protected void earnCredit () {\n" + |
| " Subscriber subscriber = Bonus.this.subscriber;\n" + |
| " if (subscriber == null)\n" + |
| " return;\n" + |
| "\n" + |
| " int tmpCredits = calculateCredit();\n" + |
| " log(\"buying an item that yields \"+tmpCredits+\" credit points.\");\n" + |
| " subscriber.collectCredit(tmpCredits);\n" + |
| " }\n" + |
| " }\n" + |
| " protected void log (String msg) {\n" + |
| " System.out.println(\">>Bonus>> \"+msg);\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "fbapplication2/GUIConnector.java", |
| "\n" + |
| "package fbapplication2;\n" + |
| "import java.awt.Component;\n" + |
| "import base flightbooking.gui.FlightBookingGUI;\n" + |
| "import base flightbooking.model.PassengerDB;\n" + |
| "public team class GUIConnector extends BonusGUI {\n" + |
| " @Override\n" + |
| " protected class View playedBy FlightBookingGUI {\n" + |
| " protected Component getComponent () {\n" + |
| " return this;\n" + |
| " }\n" + |
| " registerView <- after initComponents;\n" + |
| " }\n" + |
| " @Override\n" + |
| " protected class Controller playedBy PassengerDB {\n" + |
| " queryRegisterForBonus <- after add;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "fbapplication2/GUIConnector/FlightBonusDialog.java", |
| "\n" + |
| "team package fbapplication2.GUIConnector;\n" + |
| "@Override\n" + |
| "protected team class FlightBonusDialog playedBy FlightBonus {\n" + |
| " @Override @SuppressWarnings(\"decapsulation\") // base calls to callin\n" + |
| " protected class Collector playedBy Item<@FlightBonusDialog.base> {\n" + |
| " recordCredits <- replace calculateCredit;\n" + |
| " getDestination -> getDestination;\n" + |
| " getStart -> getStart;\n" + |
| " }\n" + |
| " @Override @SuppressWarnings(\"decapsulation\") // getCollectedCredits\n" + |
| " protected class Message playedBy Subscriber<@FlightBonusDialog.base> {\n" + |
| " getTotalCollectedCredits -> getCollectedCredits;\n" + |
| " getName -> getName;\n" + |
| " showBonusDialog <- after buy;\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "fbapplication2/BonusGUI/FlightBonusDialog.java", |
| "\n" + |
| "team package fbapplication2.BonusGUI;\n" + |
| "protected team class FlightBonusDialog playedBy FlightBonus {\n" + |
| " String message; \n" + |
| " public FlightBonusDialog(FlightBonus fb) {\n" + |
| " this.initializeMessage(0);\n" + |
| " this.activate();\n" + |
| " System.out.println(\"FBDialog \");\n" + |
| " }\n" + |
| " void initializeMessage(int credits) {\n" + |
| " this.message = new String(\"Collected credits in the past: \"+credits+\"\\n\");\n" + |
| " }\n" + |
| " protected abstract class Collector {\n" + |
| " public abstract String getStart();\n" + |
| " public abstract String getDestination();\n" + |
| " callin int recordCredits() {\n" + |
| " int credits = base.recordCredits();\n" + |
| " FlightBonusDialog.this.message += \"FlightSegment: \\n\";\n" + |
| " FlightBonusDialog.this.message += \" \"+this.getStart()+\"-->\"+this.getDestination()+\"\\n\";\n" + |
| " FlightBonusDialog.this.message += \" earning credit: \"+credits+\"\\n\";\n" + |
| " return credits;\n" + |
| " }\n" + |
| " }\n" + |
| " protected abstract class Message {\n" + |
| " abstract int getTotalCollectedCredits();\n" + |
| " abstract String getName();\n" + |
| " public void showBonusDialog() {\n" + |
| " int currentCredits = this.getTotalCollectedCredits();\n" + |
| " String title = \"Bonus message for Passenger \"+this.getName(); \n" + |
| " FlightBonusDialog.this.message += new String (\"Collected credits now: \"+currentCredits);\n" + |
| " JOptionPane.showMessageDialog(\n" + |
| " BonusGUI.this.view.getComponent(), \n" + |
| " FlightBonusDialog.this.message, \n" + |
| " title, \n" + |
| " JOptionPane.INFORMATION_MESSAGE);\n" + |
| " FlightBonusDialog.this.initializeMessage(currentCredits);\n" + |
| " }\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "OK", |
| getBookingClassLibraries(), |
| false/*shouldFlushOutputDirectory*/, |
| null/*vmArguments*/); |
| } |
| |
| // a team extends a non-team class - note: "-g" caused an overflow of non-wide constants |
| // X.4.1-otjld-team-extends-regular-1 |
| public void testX41_teamExtendsRegular1() { |
| 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[] { |
| "TeamX41ter1.java", |
| "\n" + |
| "public team class TeamX41ter1 extends TX41ter1 {\n" + |
| " public static void main(String[] args) {\n" + |
| " org.objectteams.ITeam t = new TeamX41ter1();\n" + |
| " t.activate(org.objectteams.Team.ALL_THREADS);\n" + |
| " if (t.isActive());\n" + |
| " System.out.print(t);\n" + |
| " t.deactivate();\n" + |
| " System.out.print(t.isActive());\n" + |
| " }\n" + |
| "}\n" + |
| " \n", |
| "TX41ter1.java", |
| "\n" + |
| "public class TX41ter1 {\n" + |
| " public String toString() {\n" + |
| " return \"OK\";\n" + |
| " }\n" + |
| "}\n" + |
| " \n" |
| }, |
| "OKfalse", |
| null/*classLibraries*/, |
| true/*shouldFlushOutputDirectory*/, |
| null/*vmArguments*/, |
| customOptions, |
| null/*no custom requestor*/); |
| } |
| |
| public void testBug487037() { |
| runConformTest( |
| new String[] { |
| "Main.java", |
| "public class Main {\n" + |
| " public static void main(String... args) {\n" + |
| " new TeamFoo().activate();\n" + |
| " new b.B1().test();\n" + |
| " new b.B1b();\n" + |
| " new b.B2().test();\n" + |
| " }\n" + |
| "}\n", |
| "b/B1.java", |
| "package b;\n" + |
| "public class B1 {\n" + |
| " void bm1() {}\n" + |
| " void bm2() {}\n" + |
| " void bm3() {}\n" + |
| " void bm4() {}\n" + |
| " void bm5() {}\n" + |
| " void bm6() {}\n" + |
| " void bm7() {}\n" + |
| " void bm8() {}\n" + |
| " void bm9() {}\n" + |
| " void bmA() {}\n" + |
| " private void bm() {\n" + |
| " System.out.print(\"bm\");\n" + |
| " }\n" + |
| " public void test() { bm(); }\n" + |
| "}\n", |
| "b/B1b.java", |
| "package b;\n" + |
| "public class B1b extends B1 {}\n", // stuffing to test transfer of binding tasks accross multiple anonymous sub classes |
| "b/B2.java", |
| "package b;\n" + |
| "public class B2 extends B1 {\n" + |
| " public void test() { super.test(); }\n" + |
| "}\n", |
| "TeamFoo.java", |
| "import base b.B1;\n" + |
| "public team class TeamFoo {\n" + |
| " protected class R playedBy B1 {\n" + |
| " void rm() { System.out.print(\"rm\"); }\n" + |
| " rm <- after bm1;\n" + // stuffing to create more interesting method & joinpoint ids |
| " rm <- after bm2;\n" + |
| " rm <- after bm3;\n" + |
| " rm <- after bm4;\n" + |
| " rm <- after bm5;\n" + |
| " rm <- after bm6;\n" + |
| " rm <- after bm7;\n" + |
| " rm <- after bm8;\n" + |
| " rm <- after bm;\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "bmrmbmrm"); |
| } |
| } |