/**********************************************************************
 * This file is part of "Object Teams Development Tooling"-Software
 * 
 * Copyright 2004, 2020 IT Service Omikron GmbH and others.
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * $Id$
 * 
 * Please visit http://www.eclipse.org/objectteams for updates and contact.
 * 
 * Contributors:
 * 	  Thomas Dudziak - Initial API and implementation
 * 	  Stephan Herrmann - Initial API and implementation
 **********************************************************************/
package org.eclipse.objectteams.otdt.tests.otjld.roleplaying;

import java.util.Map;

import junit.framework.Test;

import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.objectteams.otdt.core.ext.WeavingScheme;
import org.eclipse.objectteams.otdt.tests.otjld.AbstractOTJLDTest;

@SuppressWarnings("unchecked")
public class LiftingAndLowering extends AbstractOTJLDTest {
	
	public LiftingAndLowering(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[] { "test2215_arrayLifting7"};
//		TESTS_NUMBERS = new int[] { 1459 };
//		TESTS_RANGE = new int[] { 1097, -1 };
	}
	
	public static Test suite() {
		return buildComparableTestSuite(testClass());
	}

	public static Class testClass() {
		return LiftingAndLowering.class;
	}

    // a role is lowered to the base class that it is played by
    // 2.2.1-otjld-lowering-to-baseclass-1
    public void test221_loweringToBaseclass1() {
       
       runConformTest(
            new String[] {
		"T221ltb1Main.java",
			    "\n" +
			    "public class T221ltb1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team221ltb1 t = new Team221ltb1();\n" +
			    "        T221ltb1    o = new T221ltb1();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb1.java",
			    "\n" +
			    "public class T221ltb1 {\n" +
			    "    String getValue() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team221ltb1.java",
			    "\n" +
			    "public team class Team221ltb1 {\n" +
			    "\n" +
			    "    public class Role221ltb1 playedBy T221ltb1 {\n" +
			    "        protected abstract String getValue();\n" +
			    "        String getValue() -> String getValue() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public String getValue(T221ltb1 as Role221ltb1 obj) {\n" +
			    "        T221ltb1 o = obj;\n" +
			    "\n" +
			    "        return o.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role is lowered to the base class that it is played by
    // 2.2.1-otjld-lowering-to-baseclass-2
    public void test221_loweringToBaseclass2() {
       
       runConformTest(
            new String[] {
		"T221ltb2Main.java",
			    "\n" +
			    "public class T221ltb2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team221ltb2 t = new Team221ltb2();\n" +
			    "        T221ltb2    o = new T221ltb2();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb2.java",
			    "\n" +
			    "public class T221ltb2 {\n" +
			    "    protected String getValue() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team221ltb2.java",
			    "\n" +
			    "public team class Team221ltb2 {\n" +
			    "\n" +
			    "    public class Role221ltb2 playedBy T221ltb2 {\n" +
			    "        protected abstract String getValue();\n" +
			    "        String getValue() -> String getValue() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public String getValue(T221ltb2 as Role221ltb2 obj) {\n" +
			    "        final T221ltb2 o = obj;\n" +
			    "\n" +
			    "        return o.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role is lowered to the base class that it is played by
    // 2.2.1-otjld-lowering-to-baseclass-3
    public void test221_loweringToBaseclass3() {
       
       runConformTest(
            new String[] {
		"T221ltb3Main.java",
			    "\n" +
			    "public class T221ltb3Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team221ltb3 t = new Team221ltb3();\n" +
			    "        T221ltb3    o = new T221ltb3();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb3.java",
			    "\n" +
			    "public class T221ltb3 {\n" +
			    "    protected String getValue() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team221ltb3.java",
			    "\n" +
			    "public team class Team221ltb3 {\n" +
			    "\n" +
			    "    public class Role221ltb3 playedBy T221ltb3 {\n" +
			    "        protected abstract String getValue();\n" +
			    "        String getValue() -> String getValue() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public String getValue(T221ltb3 as Role221ltb3 obj) {\n" +
			    "        return getValueInternal(obj);\n" +
			    "    }\n" +
			    "\n" +
			    "    private String getValueInternal(T221ltb3 obj) {\n" +
			    "        return obj.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role is lowered to the base class that it is played by
    // 2.2.1-otjld-lowering-to-baseclass-4
    public void test221_loweringToBaseclass4() {
       
       runConformTest(
            new String[] {
		"T221ltb4Main.java",
			    "\n" +
			    "public class T221ltb4Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team221ltb4_2 t = new Team221ltb4_2();\n" +
			    "        T221ltb4      o = new T221ltb4();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb4.java",
			    "\n" +
			    "public class T221ltb4 {\n" +
			    "    protected String getValue() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team221ltb4_1.java",
			    "\n" +
			    "public team class Team221ltb4_1 {\n" +
			    "\n" +
			    "    public class Role221ltb4 playedBy T221ltb4 {}\n" +
			    "\n" +
			    "    public String getValue(T221ltb4 as Role221ltb4 obj) {\n" +
			    "        return getValueInternal(obj);\n" +
			    "    }\n" +
			    "\n" +
			    "    private String getValueInternal(final T221ltb4 obj) {\n" +
			    "        return obj.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team221ltb4_2.java",
			    "\n" +
			    "public team class Team221ltb4_2 extends Team221ltb4_1 {\n" +
			    "\n" +
			    "    public class Role221ltb4 {\n" +
			    "        protected abstract String getValue();\n" +
			    "        String getValue() -> String getValue() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role is lowered via a field to the base class of its explicit superrole
    // 2.2.1-otjld-lowering-to-baseclass-5
    public void test221_loweringToBaseclass5() {
       
       runConformTest(
            new String[] {
		"T221ltb5Main.java",
			    "\n" +
			    "public class T221ltb5Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team221ltb5 t = new Team221ltb5();\n" +
			    "        T221ltb5    o = new T221ltb5();\n" +
			    "\n" +
			    "        t.setValue(o);\n" +
			    "        System.out.print(t.getAttr());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb5.java",
			    "\n" +
			    "public class T221ltb5 {\n" +
			    "    protected String getValue() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team221ltb5.java",
			    "\n" +
			    "public team class Team221ltb5 {\n" +
			    "    private T221ltb5 attr;\n" +
			    "\n" +
			    "    public class Role221ltb5_1 playedBy T221ltb5 {}\n" +
			    "\n" +
			    "    public class Role221ltb5_2 extends Role221ltb5_1 {\n" +
			    "        protected abstract String getValue();\n" +
			    "        String getValue() -> String getValue() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public void setValue(T221ltb5 as Role221ltb5_2 obj) {\n" +
			    "        attr = obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String getAttr() {\n" +
			    "        return attr.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role is lowered in a return statement to the base class that it is played by
    // 2.2.1-otjld-lowering-to-baseclass-6
    public void test221_loweringToBaseclass6() {
       
       runConformTest(
            new String[] {
		"T221ltb6Main.java",
			    "\n" +
			    "public class T221ltb6Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team221ltb6 t = new Team221ltb6();\n" +
			    "        T221ltb6_2  o = new T221ltb6_2();\n" +
			    "\n" +
			    "        System.out.print(t.getBase(o).getValue());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb6_1.java",
			    "\n" +
			    "public class T221ltb6_1 {\n" +
			    "    protected String getValue() {\n" +
			    "        return \"NOTOK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb6_2.java",
			    "\n" +
			    "public class T221ltb6_2 extends T221ltb6_1 {\n" +
			    "    protected String getValue() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team221ltb6.java",
			    "\n" +
			    "public team class Team221ltb6 {\n" +
			    "    public class Role221ltb6 playedBy T221ltb6_1 {\n" +
			    "        protected abstract String getValue();\n" +
			    "        String getValue() -> String getValue() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public T221ltb6_1 getBase(T221ltb6_2 as Role221ltb6 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role is lowered in a return statement to the base class that it is played by - call returns null!
    // 2.2.1-otjld-lowering-to-baseclass-7
    public void test221_loweringToBaseclass7() {
       
       runConformTest(
            new String[] {
		"T221ltb7Main.java",
			    "\n" +
			    "public class T221ltb7Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team221ltb7 t = new Team221ltb7();\n" +
			    "        if (t.getBase() == null)\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        else \n" +
			    "            System.out.print(\"NOTOK\");\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb7_1.java",
			    "\n" +
			    "public class T221ltb7_1 {}\n" +
			    "    \n",
		"Team221ltb7.java",
			    "\n" +
			    "public team class Team221ltb7 {\n" +
			    "    public class Role221ltb7 playedBy T221ltb7_1 {}\n" +
			    "    \n" +
			    "    private Role221ltb7 theRole = null;\n" +
			    "    public T221ltb7_1 getBase() {\n" +
			    "        return theRole;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role is lowered in a return statement to the base class that it is played by - call returns null!
    // 2.2.1-otjld-lowering-to-baseclass-8
    public void test221_loweringToBaseclass8() {
       
       runConformTest(
            new String[] {
		"T221ltb8Main.java",
			    "\n" +
			    "public class T221ltb8Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        final Team221ltb8 t = new Team221ltb8();\n" +
			    "        if (t.getR().getBase() == null)\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        else \n" +
			    "            System.out.print(\"NOTOK\");\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb8_1.java",
			    "\n" +
			    "public class T221ltb8_1 {}\n" +
			    "    \n",
		"Team221ltb8.java",
			    "\n" +
			    "public team class Team221ltb8 {\n" +
			    "    public class Role221ltb8 playedBy T221ltb8_1 {\n" +
			    "        private Role221ltb8 theRole = null;\n" +
			    "        public T221ltb8_1 getBase() {\n" +
			    "            return theRole;\n" +
			    "        }\n" +
			    "    }    \n" +
			    "    public Role221ltb8 getR() { \n" +
			    "        return new Role221ltb8(new T221ltb8_1());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role is lowered in a return statement to the base class that it is played by - call returns null!
    // 2.2.1-otjld-lowering-to-baseclass-9
    public void test221_loweringToBaseclass9() {
       
       runConformTest(
            new String[] {
		"T221ltb9Main.java",
			    "\n" +
			    "public class T221ltb9Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        final Team221ltb9 t = new Team221ltb9();\n" +
			    "        if (t.getR().getBases() == null)\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        else \n" +
			    "            System.out.print(\"NOTOK\");\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb9_1.java",
			    "\n" +
			    "public class T221ltb9_1 {}\n" +
			    "    \n",
		"Team221ltb9.java",
			    "\n" +
			    "public team class Team221ltb9 {\n" +
			    "    public class Role221ltb9 playedBy T221ltb9_1 {\n" +
			    "        private Role221ltb9[] theRoles = null;\n" +
			    "        public T221ltb9_1[] getBases() {\n" +
			    "            return theRoles;\n" +
			    "        }\n" +
			    "    }    \n" +
			    "    public Role221ltb9 getR() { \n" +
			    "        return new Role221ltb9(new T221ltb9_1());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role is lowered in a return statement to the base class that it is played by - call returns null!
    // 2.2.1-otjld-lowering-to-baseclass-10
    public void test221_loweringToBaseclass10() {
       
       runConformTest(
            new String[] {
		"T221ltb10Main.java",
			    "\n" +
			    "public class T221ltb10Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        final Team221ltb10 t = new Team221ltb10();\n" +
			    "        if (t.getR().getBases()[0] == null)\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        else \n" +
			    "            System.out.print(\"NOTOK\");\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb10_1.java",
			    "\n" +
			    "public class T221ltb10_1 {}\n" +
			    "    \n",
		"Team221ltb10.java",
			    "\n" +
			    "public team class Team221ltb10 {\n" +
			    "    public class Role221ltb10 playedBy T221ltb10_1 {\n" +
			    "        private Role221ltb10[] theRoles = new Role221ltb10[]{null};\n" +
			    "        public T221ltb10_1[] getBases() {\n" +
			    "            return theRoles;\n" +
			    "        }\n" +
			    "    }    \n" +
			    "    public Role221ltb10 getR() { \n" +
			    "        return new Role221ltb10(new T221ltb10_1());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role is lowered in a return statement to the base class that it is played by - bound super-role exists
    // 2.2.1-otjld-lowering-to-baseclass-11
    public void test221_loweringToBaseclass11() {
       
       runConformTest(
            new String[] {
		"T221ltb11Main.java",
			    "\n" +
			    "public class T221ltb11Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team221ltb11 t = new Team221ltb11();\n" +
			    "        T221ltb11_2  o = new T221ltb11_2();\n" +
			    "\n" +
			    "        System.out.print(t.getBase(o).getValue());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb11_1.java",
			    "\n" +
			    "public class T221ltb11_1 {\n" +
			    "    protected String getValue() {\n" +
			    "        return \"NOTOK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb11_2.java",
			    "\n" +
			    "public class T221ltb11_2 extends T221ltb11_1 {\n" +
			    "    protected String getValue() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team221ltb11.java",
			    "\n" +
			    "public team class Team221ltb11 {\n" +
			    "    public class Role221ltb11_1 playedBy T221ltb11_1 {\n" +
			    "    }\n" +
			    "    public class Role221ltb11_2 extends Role221ltb11_1 playedBy T221ltb11_2 {\n" +
			    "        protected abstract String getValue();\n" +
			    "        String getValue() -> String getValue() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "    public class Role221ltb11_3  {\n" +
			    "        protected T221ltb11_2 getBase(Role221ltb11_2 role) {\n" +
			    "            return role;\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public T221ltb11_1 getBase(T221ltb11_2 as Role221ltb11_2 obj) {\n" +
			    "        Role221ltb11_3 r = new Role221ltb11_3();\n" +
			    "        return r.getBase(obj);\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // the enclosing nested team is lowered
    // 2.2.1-otjld-lowering-to-baseclass-12
    public void test221_loweringToBaseclass12() {
       
       runConformTest(
            new String[] {
		"Team221ltb12.java",
			    "\n" +
			    "public team class Team221ltb12 {\n" +
			    "    protected team class Mid playedBy T221ltb12 {\n" +
			    "        protected class Inner {\n" +
			    "            protected void test() {\n" +
			    "                doTest(Mid.this);\n" +
			    "            }\n" +
			    "            void doTest(T221ltb12 t) {\n" +
			    "                t.print();\n" +
			    "            }\n" +
			    "        }\n" +
			    "        protected void test() {\n" +
			    "            new Inner().test();\n" +
			    "        }\n" +
			    "    }\n" +
			    "    void test() {\n" +
			    "        new Mid(new T221ltb12()).test();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team221ltb12().test();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb12.java",
			    "\n" +
			    "public class T221ltb12 {\n" +
			    "    void print() { System.out.print(\"OK\"); }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // the enclosing nested team is lowered - via assignment
    // 2.2.1-otjld-lowering-to-baseclass-13
    public void test221_loweringToBaseclass13() {
       
       runConformTest(
            new String[] {
		"Team221ltb13.java",
			    "\n" +
			    "public team class Team221ltb13 {\n" +
			    "    protected team class Mid playedBy T221ltb13 {\n" +
			    "        protected class Inner {\n" +
			    "            protected void test() {\n" +
			    "                T221ltb13 that = Mid.this;\n" +
			    "                doTest(that);\n" +
			    "            }\n" +
			    "            void doTest(T221ltb13 t) {\n" +
			    "                t.print();\n" +
			    "            }\n" +
			    "        }\n" +
			    "        protected void test() {\n" +
			    "            new Inner().test();\n" +
			    "        }\n" +
			    "    }\n" +
			    "    void test() {\n" +
			    "        new Mid(new T221ltb13()).test();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team221ltb13().test();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T221ltb13.java",
			    "\n" +
			    "public class T221ltb13 {\n" +
			    "    void print() { System.out.print(\"OK\"); }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }
    
    // a foreach loop over an iterable needs to lower elements
    public void test221_loweringToBaseclass14() {
    	runConformTest(
    		new String[] {
    	"Team221ltb14.java",
    			"import java.util.*;\n" +
    			"public team class Team221ltb14 {\n" +
    			"	protected class R playedBy T221ltb14 {\n" +
    			"		protected R() { base(); }\n" +
    			"	}\n" +
    			"	void test() {\n" +
    			"		List<R> roles = new ArrayList<R>();\n" +
    			"		roles.add(new R());\n" +
    			"		for (T221ltb14 b : roles)\n" +
    			"			b.foo();\n" +
    			"	}\n" +
    			"	public static void main(String... args) {\n" +
    			"		new Team221ltb14().test();\n" +
    			"	}\n" +
    			"}\n",
    	"T221ltb14.java",
    			"public class T221ltb14 {\n" +
    			"	void foo() {\n" +
    			"		System.out.println(\"OK\");\n" +
    			"	}\n" +
    			"}\n",
    		},
    		"OK");
    }
    
    // a foreach loop over an array needs to lower elements
    public void test221_loweringToBaseclass15() {
    	runConformTest(
    		new String[] {
    	"Team221ltb15.java",
    			"import java.util.*;\n" +
    			"public team class Team221ltb15 {\n" +
    			"	protected class R playedBy T221ltb15 {\n" +
    			"		protected R() { base(); }\n" +
    			"	}\n" +
    			"	void test() {\n" +
    			"		R[] roles = new R[] {new R()};\n" +
    			"		for (T221ltb15 b : roles)\n" +
    			"			b.foo();\n" +
    			"	}\n" +
    			"	public static void main(String... args) {\n" +
    			"		new Team221ltb15().test();\n" +
    			"	}\n" +
    			"}\n",
    	"T221ltb15.java",
    			"public class T221ltb15 {\n" +
    			"	void foo() {\n" +
    			"		System.out.println(\"OK\");\n" +
    			"	}\n" +
    			"}\n",
    		},
    		"OK");
    }
    
    // a foreach loop over an iterable needs to lower elements (role-of-role)
    public void test221_loweringToBaseclass16() {
    	runConformTest(
    		new String[] {
    	"Team221ltb16_2.java",
    			"import java.util.*;\n" +
    			"public team class Team221ltb16_2 {\n" +
    			"	final Team221ltb16_1 t = new Team221ltb16_1();\n" +
    			"	protected class R playedBy R1<@t> {\n" +
    			"		protected R() { base(); }\n" +
    			"	}\n" +
    			"	void test1() {\n" +
    			"		R r = new R();\n" +
    			"		test2(r);\n" +
    			"	}\n" +
    			"	void test2(R1<@t> b) {\n" +
    			"		b.foo();\n" +
    			"	}\n" +
    			"	public static void main(String... args) {\n" +
    			"		new Team221ltb16_2().test1();\n" +
    			"	}\n" +
    			"}\n",
    	"Team221ltb16_1.java",
    			"public team class Team221ltb16_1 {\n" +
    			"	public class R1 {\n" +
    			"		public void foo() {\n" +
    			"			System.out.println(\"OK\");\n" +
    			"		}\n" +
    			"	}\n" +
    			"}\n",
    		},
    		"OK");
    }
    
    // Bug 335628 - [compiler] lowering in array initializer
    public void test221_loweringToBaseclass17 () {
    	runConformTest(
    		new String[] {
    	"Team221ltb17.java",
    			"public team class Team221ltb17 {\n" + 
    			"	protected class R playedBy T221ltb17 {\n" + 
    			"		protected R() { base(); }\n" + 
    			"	}\n" + 
    			"	void test() {\n" + 
    			"		R r = new R();\n" + 
    			"		T221ltb17[] bases = new T221ltb17[] { r };\n" + 
    			"		for (int i = 0; i < bases.length; i++) {\n" + 
    			"			bases[i].print();\n" + 
    			"		}\n" + 
    			"	}\n" + 
    			"	public static void main(String[] args) {\n" + 
    			"		new Team221ltb17().test();\n" + 
    			"	}\n" + 
    			"}\n",
    	"T221ltb17.java",
		    	"public class T221ltb17 {\n" + 
		    	"	public void print() {\n" + 
		    	"		System.out.println(\"OK\");\n" + 
		    	"	}\n" +
		    	"}\n"
    		},
    		"OK");
    }
    
    // Bug 335628 - [compiler] lowering in array initializer
    public void test221_loweringToBaseclass18 () {
    	runConformTest(
    		new String[] {
    	"Team221ltb18.java",
    			"public team class Team221ltb18 {\n" + 
    			"	protected class R playedBy T221ltb18 {\n" + 
    			"		protected R() { base(); }\n" + 
    			"	}\n" + 
    			"	void test() {\n" + 
    			"		R r = new R();\n" + 
    			"		T221ltb18[][] bases = new T221ltb18[][] { { r } };\n" + 
    			"		for (int i = 0; i < bases.length; i++)\n" + 
    			"			for (int k = 0; k < bases[i].length; k++)\n" + 
    			"				bases[i][k].print();\n" + 
    			"	}\n" + 
    			"	public static void main(String[] args) {\n" + 
    			"		new Team221ltb18().test();\n" + 
    			"	}\n" + 
    			"}\n",
    	"T221ltb18.java",
		    	"public class T221ltb18 {\n" + 
		    	"	public void print() {\n" + 
		    	"		System.out.println(\"OK\");\n" + 
		    	"	}\n" +
		    	"}\n"
    		},
    		"OK");
    }

    // Bug 355253 - warnings regarding synthetic variables _OT$unlowerd$123
    // syntactically known to be non-null
    public void test221_loweringToBaseclass19 () {
    	Map options = getCompilerOptions();
    	options.put(CompilerOptions.OPTION_ReportRedundantNullCheck, CompilerOptions.ERROR);
    	runConformTest(
    		true /* flushOutputDir*/,
    		new String[] {
    	"Team221ltb19.java",
    			"public team class Team221ltb19 {\n" + 
    			"	protected class R playedBy T221ltb19 {\n" + 
    			"		protected R() { base(); }\n" +
    			"       protected void test() {\n" +
    			"           T221ltb19.accept(this);\n" +
    			"       }\n" + 
    			"	}\n" + 
    			"	T221ltb19 aBase;\n" + 
    			"	void test() {\n" + 
    			"		new R().test();\n" + 
    			"	}\n" + 
    			"	public static void main(String[] args) {\n" + 
    			"		new Team221ltb19().test();\n" + 
    			"	}\n" + 
    			"}\n",
    	"T221ltb19.java",
		    	"public class T221ltb19 {\n" + 
		    	"	public static void accept(T221ltb19 inst) {\n" + 
		    	"		System.out.println(\"OK\");\n" + 
		    	"	}\n" +
		    	"}\n"
    		},
    		null, // libs
    		options,
    		"", // compiler log
    		"OK",
    		"",
    		JavacTestOptions.EclipseJustification.EclipseWarningConfiguredAsError);
    }

    // Bug 355253 - warnings regarding synthetic variables _OT$unlowerd$123
    // known to be non-null by analysis
    public void test221_loweringToBaseclass20 () {
    	Map options = getCompilerOptions();
    	options.put(CompilerOptions.OPTION_ReportRedundantNullCheck, CompilerOptions.ERROR);
    	runConformTest(
    		true /* flushOutputDir*/,
    		new String[] {
    	"Team221ltb20.java",
    			"public team class Team221ltb20 {\n" + 
    			"	protected class R playedBy T221ltb20 {\n" + 
    			"		protected R() { base(); }\n" +
    			"       protected void test() {\n" +
    			"           R r = this;" +
    			"           T221ltb20.accept(r);\n" +
    			"       }\n" + 
    			"	}\n" + 
    			"	T221ltb20 aBase;\n" + 
    			"	void test() {\n" + 
    			"		new R().test();\n" + 
    			"	}\n" + 
    			"	public static void main(String[] args) {\n" + 
    			"		new Team221ltb20().test();\n" + 
    			"	}\n" + 
    			"}\n",
    	"T221ltb20.java",
		    	"public class T221ltb20 {\n" + 
		    	"	public static void accept(T221ltb20 inst) {\n" + 
		    	"		System.out.println(\"OK\");\n" + 
		    	"	}\n" +
		    	"}\n"
    		},
    		null, // libs
    		options,
    		"", // compiler log
    		"OK",
    		"",
    		JavacTestOptions.EclipseJustification.EclipseWarningConfiguredAsError);
    }

    // a role is lowered to a class that is not its base class
    // 2.2.2-otjld-lowering-to-non-baseclass-1
    public void test222_loweringToNonBaseclass1() {
        runNegativeTest(
            new String[] {
		"T222ltnb1_1.java",
			    "\n" +
			    "public class T222ltnb1_1 {}\n" +
			    "    \n",
		"T222ltnb1_2.java",
			    "\n" +
			    "public class T222ltnb1_2 {}\n" +
			    "    \n",
		"Team222ltnb1.java",
			    "\n" +
			    "public team class Team222ltnb1 {\n" +
			    "\n" +
			    "    public class Role222ltnb1 playedBy T222ltnb1_1 {}\n" +
			    "\n" +
			    "    public String getValue(T222ltnb1_1 as Role222ltnb1 obj) {\n" +
			    "        T222ltnb1_2 o = obj;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // a role is lowered to a class that is a subclass of its base class
    // 2.2.2-otjld-lowering-to-non-baseclass-2
    public void test222_loweringToNonBaseclass2() {
        runNegativeTest(
            new String[] {
		"T222ltnb2_1.java",
			    "\n" +
			    "public class T222ltnb2_1 {}\n" +
			    "    \n",
		"T222ltnb2_2.java",
			    "\n" +
			    "public class T222ltnb2_2 extends T222ltnb2_1 {}\n" +
			    "    \n",
		"Team222ltnb2.java",
			    "\n" +
			    "public team class Team222ltnb2 {\n" +
			    "\n" +
			    "    public class Role222ltnb2 playedBy T222ltnb2_1 {}\n" +
			    "\n" +
			    "    public T222ltnb2_2 getBase(T222ltnb2_1 as Role222ltnb2 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // lowering of a role object for the same base object produces the same base class object
    // 2.2.3-otjld-lowering-produces-same-object-1
    public void test223_loweringProducesSameObject1() {
       
       runConformTest(
            new String[] {
		"T223lpso1Main.java",
			    "\n" +
			    "public class T223lpso1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team223lpso1 t = new Team223lpso1();\n" +
			    "        T223lpso1_2  o = new T223lpso1_2();\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T223lpso1_1.java",
			    "\n" +
			    "public interface T223lpso1_1 {}\n" +
			    "    \n",
		"T223lpso1_2.java",
			    "\n" +
			    "public class T223lpso1_2 implements T223lpso1_1 {}\n" +
			    "    \n",
		"Team223lpso1.java",
			    "\n" +
			    "public team class Team223lpso1 {\n" +
			    "\n" +
			    "    public class Role223lpso1 playedBy T223lpso1_2 {}\n" +
			    "\n" +
			    "    public String test(T223lpso1_2 as Role223lpso1 obj) {\n" +
			    "        T223lpso1_1 loweredA = obj;\n" +
			    "        T223lpso1_2 loweredB = obj;\n" +
			    "\n" +
			    "        if ((loweredA == loweredB) &&\n" +
			    "            loweredA.equals(loweredB) &&\n" +
			    "            (loweredA.hashCode() == loweredB.hashCode())) {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // lowering of a role object for the same base object produces the same base class object
    // 2.2.3-otjld-lowering-produces-same-object-2
    public void test223_loweringProducesSameObject2() {
       
       runConformTest(
            new String[] {
		"T223lpso2Main.java",
			    "\n" +
			    "public class T223lpso2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team223lpso2 t = new Team223lpso2();\n" +
			    "        T223lpso2_2  o = new T223lpso2_2();\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T223lpso2_1.java",
			    "\n" +
			    "public class T223lpso2_1 {}\n" +
			    "    \n",
		"T223lpso2_2.java",
			    "\n" +
			    "public class T223lpso2_2 extends T223lpso2_1 {}\n" +
			    "    \n",
		"Team223lpso2.java",
			    "\n" +
			    "public team class Team223lpso2 {\n" +
			    "\n" +
			    "    public class Role223lpso2_1 playedBy T223lpso2_1 {}\n" +
			    "    public class Role223lpso2_2 extends Role223lpso2_1 playedBy T223lpso2_2 {}\n" +
			    "\n" +
			    "    private T223lpso2_1 liftAndLower1(T223lpso2_1 as Role223lpso2_1 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    private T223lpso2_1 liftAndLower2(T223lpso2_2 as Role223lpso2_2 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test(T223lpso2_2 obj) {\n" +
			    "        T223lpso2_1 loweredA = liftAndLower1(obj);\n" +
			    "        T223lpso2_1 loweredB = liftAndLower2(obj);\n" +
			    "\n" +
			    "        if ((loweredA == loweredB) &&\n" +
			    "            loweredA.equals(loweredB) &&\n" +
			    "            (loweredA.hashCode() == loweredB.hashCode())) {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role cannot be compared to its lowered self
    // 2.2.4-otjld-role-not-equal-to-baseobject-1
    public void test224_roleNotEqualToBaseobject1() {
        runNegativeTest(
            new String[] {
		"T224rnetb1.java",
			    "\n" +
			    "public class T224rnetb1 {}\n" +
			    "    \n",
		"Team224rnetb1.java",
			    "\n" +
			    "public team class Team224rnetb1 {\n" +
			    "\n" +
			    "    public class Role224rnetb1 playedBy T224rnetb1 {}\n" +
			    "\n" +
			    "    public boolean test(T224rnetb1 as Role224rnetb1 obj) {\n" +
			    "        T224rnetb1 lowered = obj;\n" +
			    "\n" +
			    "        return lowered == obj;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // a role cannot be compared to its lowered self (instanceof)
    // 2.2.4-otjld-role-not-equal-to-baseobject-1a
    public void test224_roleNotEqualToBaseobject1a() {
        runNegativeTest(
            new String[] {
		"T224rnetb1a.java",
			    "\n" +
			    "public class T224rnetb1a {}\n" +
			    "    \n",
		"Team224rnetb1a.java",
			    "\n" +
			    "public team class Team224rnetb1a {\n" +
			    "\n" +
			    "    public class Role224rnetb1a playedBy T224rnetb1a {}\n" +
			    "\n" +
			    "    public boolean test(T224rnetb1a as Role224rnetb1a obj) {\n" +
			    "        return obj instanceof T224rnetb1a;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // a role cannot be casted to its lowered self
    // 2.2.4-otjld-role-not-equal-to-baseobject-1b
    public void test224_roleNotEqualToBaseobject1b() {
        runNegativeTest(
            new String[] {
		"T224rnetb1b.java",
			    "\n" +
			    "public class T224rnetb1b {}\n" +
			    "    \n",
		"Team224rnetb1b.java",
			    "\n" +
			    "public team class Team224rnetb1b {\n" +
			    "\n" +
			    "    public class Role224rnetb1b playedBy T224rnetb1b {}\n" +
			    "\n" +
			    "    public T224rnetb1b test(T224rnetb1b as Role224rnetb1b obj) {\n" +
			    "         return (T224rnetb1b)obj;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // a role is not equal to its lowered self
    // 2.2.4-otjld-role-not-equal-to-baseobject-2
    public void test224_roleNotEqualToBaseobject2() {
       
       runConformTest(
            new String[] {
		"T224rnetb2Main.java",
			    "\n" +
			    "public class T224rnetb2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team224rnetb2 t = new Team224rnetb2();\n" +
			    "        T224rnetb2    o = new T224rnetb2();\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T224rnetb2.java",
			    "\n" +
			    "public class T224rnetb2 {}\n" +
			    "    \n",
		"Team224rnetb2.java",
			    "\n" +
			    "public team class Team224rnetb2 {\n" +
			    "\n" +
			    "    public class Role224rnetb2 playedBy T224rnetb2 {}\n" +
			    "\n" +
			    "    public String test(T224rnetb2 as Role224rnetb2 obj) {\n" +
			    "        T224rnetb2 lowered = obj;\n" +
			    "\n" +
			    "        if (lowered.equals(obj) ||\n" +
			    "            (lowered.hashCode() == obj.hashCode())) {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role is not equal to its lowered self
    // 2.2.4-otjld-role-not-equal-to-baseobject-3
    public void test224_roleNotEqualToBaseobject3() {
       
       runConformTest(
            new String[] {
		"T224rnetb3Main.java",
			    "\n" +
			    "public class T224rnetb3Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team224rnetb3_2 t = new Team224rnetb3_2();\n" +
			    "        T224rnetb3_2    o = new T224rnetb3_2();\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T224rnetb3_1.java",
			    "\n" +
			    "public class T224rnetb3_1 {}\n" +
			    "    \n",
		"T224rnetb3_2.java",
			    "\n" +
			    "public class T224rnetb3_2 extends T224rnetb3_1 {}\n" +
			    "    \n",
		"Team224rnetb3_1.java",
			    "\n" +
			    "public team class Team224rnetb3_1 {\n" +
			    "\n" +
			    "    protected class Role224rnetb3_1 playedBy T224rnetb3_1 {}\n" +
			    "}\n" +
			    "    \n",
		"Team224rnetb3_2.java",
			    "\n" +
			    "public team class Team224rnetb3_2 extends Team224rnetb3_1 {\n" +
			    "\n" +
			    "    public class Role224rnetb3_2 extends Role224rnetb3_1 playedBy T224rnetb3_2 {}\n" +
			    "\n" +
			    "    public String test(T224rnetb3_2 as Role224rnetb3_2 obj) {\n" +
			    "        T224rnetb3_1 lowered = obj;\n" +
			    "\n" +
			    "        if (lowered.equals(obj) ||\n" +
			    "            (lowered.hashCode() == obj.hashCode())) {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // the type of a lowering assignment expression is the base class
    // 2.2.5-otjld-type-of-lowering-assignment-1
    public void test225_typeOfLoweringAssignment1() {
       
       runConformTest(
            new String[] {
		"T225tola1Main.java",
			    "\n" +
			    "public class T225tola1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team225tola1 t = new Team225tola1();\n" +
			    "        T225tola1    o = new T225tola1();\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T225tola1.java",
			    "\n" +
			    "public class T225tola1 {}\n" +
			    "    \n",
		"Team225tola1.java",
			    "\n" +
			    "public team class Team225tola1 {\n" +
			    "\n" +
			    "    public class Role225tola1 playedBy T225tola1 {}\n" +
			    "\n" +
			    "    public String test(T225tola1 as Role225tola1 obj) {\n" +
			    "        T225tola1 lowered;\n" +
			    "\n" +
			    "        if ((lowered = obj).getClass() == T225tola1.class) {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // the type of a lowering assignment expression is the base class
    // 2.2.5-otjld-type-of-lowering-assignment-2
    public void test225_typeOfLoweringAssignment2() {
       
       runConformTest(
            new String[] {
		"T225tola2Main.java",
			    "\n" +
			    "public class T225tola2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team225tola2_2 t = new Team225tola2_2();\n" +
			    "        T225tola2_2    o = new T225tola2_2();\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T225tola2_1.java",
			    "\n" +
			    "public abstract class T225tola2_1 {}\n" +
			    "    \n",
		"T225tola2_2.java",
			    "\n" +
			    "public class T225tola2_2 extends T225tola2_1 {}\n" +
			    "    \n",
		"Team225tola2_1.java",
			    "\n" +
			    "public team class Team225tola2_1 {\n" +
			    "\n" +
			    "    public class Role225tola2_1 playedBy T225tola2_1 {}\n" +
			    "}\n" +
			    "    \n",
		"Team225tola2_2.java",
			    "\n" +
			    "public team class Team225tola2_2 extends Team225tola2_1 {\n" +
			    "\n" +
			    "    public class Role225tola2_2 extends Role225tola2_1 playedBy T225tola2_2 {}\n" +
			    "\n" +
			    "    public String test(T225tola2_2 as Role225tola2_2 obj) {\n" +
			    "        Role225tola2_1 r = obj;\n" +
			    "        T225tola2_1    lowered;\n" +
			    "\n" +
			    "        if ((lowered = r).getClass() == T225tola2_2.class) {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a base class object is lifted to a role via a method parameter
    // 2.2.6-otjld-lifting-1
    public void test226_lifting1() {
       
       runConformTest(
            new String[] {
		"T226l1Main.java",
			    "\n" +
			    "public class T226l1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team226l1 t = new Team226l1();\n" +
			    "        T226l1    o = new T226l1();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T226l1.java",
			    "\n" +
			    "public class T226l1 {\n" +
			    "    public String getValue() {\n" +
			    "        return \"NOTOK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team226l1.java",
			    "\n" +
			    "public team class Team226l1 {\n" +
			    "\n" +
			    "    public class Role226l1 playedBy T226l1 {\n" +
			    "        public abstract String getValue();\n" +
			    "        String getValue() -> String getValue() with {\n" +
			    "            result <- \"OK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public String getValue(T226l1 as Role226l1 obj) {\n" +
			    "        return obj.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a base class object is lifted to a role via a final method parameter
    // 2.2.6-otjld-lifting-2
    public void test226_lifting2() {
       
       runConformTest(
            new String[] {
		"T226l2Main.java",
			    "\n" +
			    "public class T226l2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team226l2 t = new Team226l2();\n" +
			    "        T226l2_1  o = new T226l2_2();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T226l2_1.java",
			    "\n" +
			    "public abstract class T226l2_1 {\n" +
			    "    public abstract String getValue();\n" +
			    "}\n" +
			    "    \n",
		"T226l2_2.java",
			    "\n" +
			    "public class T226l2_2 extends T226l2_1 {\n" +
			    "    public String getValue() {\n" +
			    "        return \"NOTOK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team226l2.java",
			    "\n" +
			    "public team class Team226l2 {\n" +
			    "\n" +
			    "    public class Role226l2_1 playedBy T226l2_1 {\n" +
			    "        public abstract String getValue();\n" +
			    "        String getValue() -> String getValue() with {\n" +
			    "            result <- \"OK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public class Role226l2_2 extends Role226l2_1 {}\n" +
			    "\n" +
			    "    public String getValue(final T226l2_1 as Role226l2_2 obj) {\n" +
			    "        return obj.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a base class object is lifted to a role via a return statement
    // 2.2.6-otjld-lifting-3
    public void test226_lifting3() {
       
       runConformTest(
            new String[] {
		"T226l3Main.java",
			    "\n" +
			    "public class T226l3Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team226l3_2 t = new Team226l3_2();\n" +
			    "        T226l3      o = new T226l3();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T226l3.java",
			    "\n" +
			    "public class T226l3 {\n" +
			    "    public T226l3 getInstance() {\n" +
			    "        return new T226l3();\n" +
			    "    }\n" +
			    "    public String getValue() {\n" +
			    "        return \"NOTOK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team226l3_1.java",
			    "\n" +
			    "public team class Team226l3_1 {\n" +
			    "\n" +
			    "    public class Role226l3 playedBy T226l3 {\n" +
			    "        public abstract String getValue();\n" +
			    "        public abstract Role226l3 getInstance();\n" +
			    "\n" +
			    "        String getValue() -> String getValue() with {\n" +
			    "            result <- \"OK\"\n" +
			    "        }\n" +
			    "        Role226l3 getInstance() -> T226l3 getInstance();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team226l3_2.java",
			    "\n" +
			    "public team class Team226l3_2 extends Team226l3_1 {\n" +
			    "    public String getValue(T226l3 as Role226l3 obj) {\n" +
			    "        return obj.getInstance().getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a base class object is lifted to a role that it does not play
    // 2.2.7-otjld-lifting-to-unplaying-role-1
    public void test227_liftingToUnplayingRole1() {
        runNegativeTest(
            new String[] {
		"T227ltur1_1.java",
			    "\n" +
			    "public class T227ltur1_1 {}\n" +
			    "    \n",
		"T227ltur1_2.java",
			    "\n" +
			    "public class T227ltur1_2 {}\n" +
			    "    \n",
		"Team227ltur1.java",
			    "\n" +
			    "public team class Team227ltur1 {\n" +
			    "\n" +
			    "    public class Role227ltur1 playedBy T227ltur1_1 {}\n" +
			    "\n" +
			    "    public void test (T227ltur1_2 as Role227ltur1 obj) {}\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // a base class object is lifted to a role that it does not play
    // 2.2.7-otjld-lifting-to-unplaying-role-2
    public void test227_liftingToUnplayingRole2() {
        runNegativeTest(
            new String[] {
		"T227ltur2_1.java",
			    "\n" +
			    "public class T227ltur2_1 {}\n" +
			    "    \n",
		"T227ltur2_2.java",
			    "\n" +
			    "public class T227ltur2_2 extends T227ltur2_1 {}\n" +
			    "    \n",
		"Team227ltur2.java",
			    "\n" +
			    "public team class Team227ltur2 {\n" +
			    "\n" +
			    "    public class Role227ltur2 playedBy T227ltur2_2 {}\n" +
			    "\n" +
			    "    public void test (T227ltur2_1 as Role227ltur2 obj) {}\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // subsequent lifting of the same base class object produces the same role object
    // 2.2.8-otjld-lifting-produces-same-role-1
    public void test228_liftingProducesSameRole1() {
       
       runConformTest(
            new String[] {
		"T228lpsr1Main.java",
			    "\n" +
			    "public class T228lpsr1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team228lpsr1_2 t = new Team228lpsr1_2();\n" +
			    "        T228lpsr1_2    o = new T228lpsr1_2();\n" +
			    "\n" +
			    "        System.out.print(t.test(o, o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T228lpsr1_1.java",
			    "\n" +
			    "public class T228lpsr1_1 {}\n" +
			    "    \n",
		"T228lpsr1_2.java",
			    "\n" +
			    "public class T228lpsr1_2 extends T228lpsr1_1 {}\n" +
			    "    \n",
		"Team228lpsr1_1.java",
			    "\n" +
			    "public team class Team228lpsr1_1 {\n" +
			    "    public class Role228lpsr1_1 playedBy T228lpsr1_1 {}\n" +
			    "}\n" +
			    "    \n",
		"Team228lpsr1_2.java",
			    "\n" +
			    "public team class Team228lpsr1_2 extends Team228lpsr1_1 {\n" +
			    "\n" +
			    "    public class Role228lpsr1_2 extends Role228lpsr1_1 playedBy T228lpsr1_2 {}\n" +
			    "\n" +
			    "    public String test(T228lpsr1_1 as Role228lpsr1_1 objA, T228lpsr1_2 as Role228lpsr1_2 objB) {\n" +
			    "        if ((objA == objB) &&\n" +
			    "            objA.equals(objB) &&\n" +
			    "            (objA.hashCode() == objB.hashCode())) {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // subsequent lifting of the same base class object produces the same role object
    // 2.2.8-otjld-lifting-produces-same-role-2
    public void test228_liftingProducesSameRole2() {
       
       runConformTest(
            new String[] {
		"T228lpsr2Main.java",
			    "\n" +
			    "public class T228lpsr2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team228lpsr2 t = new Team228lpsr2();\n" +
			    "        T228lpsr2_2  o = new T228lpsr2_2();\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T228lpsr2_1.java",
			    "\n" +
			    "public abstract class T228lpsr2_1 {}\n" +
			    "    \n",
		"T228lpsr2_2.java",
			    "\n" +
			    "public class T228lpsr2_2 extends T228lpsr2_1 {\n" +
			    "    protected T228lpsr2_2 self() {\n" +
			    "        return this;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team228lpsr2.java",
			    "\n" +
			    "public team class Team228lpsr2 {\n" +
			    "\n" +
			    "    public class Role228lpsr2_1 playedBy T228lpsr2_1 {}\n" +
			    "    public class Role228lpsr2_2 playedBy T228lpsr2_2 {\n" +
			    "        public abstract Role228lpsr2_1 toRole1();\n" +
			    "        Role228lpsr2_1 toRole1() -> T228lpsr2_2 self();\n" +
			    "    }\n" +
			    "\n" +
			    "    private Role228lpsr2_1 toRole1(T228lpsr2_1 as Role228lpsr2_1 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    private Role228lpsr2_2 toRole2(T228lpsr2_2 as Role228lpsr2_2 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test(T228lpsr2_2 obj) {\n" +
			    "        Role228lpsr2_1 roleA = toRole1(obj);\n" +
			    "        Role228lpsr2_1 roleB = toRole2(obj).toRole1();\n" +
			    "\n" +
			    "        if ((roleA == roleB) &&\n" +
			    "            roleA.equals(roleB) &&\n" +
			    "            (roleA.hashCode() == roleB.hashCode())) {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // lifting of the same base class object to roles related by implicit inheritance does produce different role objcts (as of their hashCode)
    // 2.2.9-otjld-different-context-lifting-1
    public void test229_differentContextLifting1() {
       
       runConformTest(
            new String[] {
		"T229dcl1Main.java",
			    "\n" +
			    "public class T229dcl1Main {\n" +
			    "    @SuppressWarnings(\"ambiguouslowering\") // equals could eat either: role or base\n" +
			    "    public static void main(String[] args) {\n" +
			    "        final Team229dcl1_1 t1 = new Team229dcl1_1();\n" +
			    "        final Team229dcl1_2 t2 = new Team229dcl1_2();\n" +
			    "        T229dcl1            o  = new T229dcl1();\n" +
			    "        Role229dcl1<@t1>    r1 = t1.toRole(o);\n" +
			    "        Role229dcl1<@t2>    r2 = t2.toRole(o);\n" +
			    "\n" +
			    "        if (/* statically wrong; (r1 == r2) || */\n" +
			    "            r1.equals(r2) ||\n" +
			    "            (r1.hashCode() == r2.hashCode())) {\n" +
			    "            System.out.print(\"NOTOK\");\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T229dcl1.java",
			    "\n" +
			    "public class T229dcl1 {}\n" +
			    "    \n",
		"Team229dcl1_1.java",
			    "\n" +
			    "public team class Team229dcl1_1 {\n" +
			    "    public class Role229dcl1 playedBy T229dcl1 {}\n" +
			    "\n" +
			    "    public Role229dcl1 toRole(T229dcl1 as Role229dcl1 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team229dcl1_2.java",
			    "\n" +
			    "public team class Team229dcl1_2 extends Team229dcl1_1 {\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // lifting of the same base class object to unrelated roles produces different role objcts
    // 2.2.9-otjld-different-context-lifting-2
    public void test229_differentContextLifting2() {
       
       runConformTest(
            new String[] {
		"T229lpsr2Main.java",
			    "\n" +
			    "public class T229lpsr2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team229dcl2 t = new Team229dcl2();\n" +
			    "        T229dcl2    o = new T229dcl2();\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T229dcl2.java",
			    "\n" +
			    "public class T229dcl2 {}\n" +
			    "    \n",
		"Team229dcl2.java",
			    "\n" +
			    "public team class Team229dcl2 {\n" +
			    "    public class Role229dcl2_1 playedBy T229dcl2 {}\n" +
			    "    public class Role229dcl2_2 playedBy T229dcl2 {}\n" +
			    "\n" +
			    "    private Role229dcl2_1 toRole1(T229dcl2 as Role229dcl2_1 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    private Role229dcl2_2 toRole2(T229dcl2 as Role229dcl2_2 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test(T229dcl2 obj) {\n" +
			    "        Role229dcl2_1 r1 = toRole1(obj);\n" +
			    "        Role229dcl2_2 r2 = toRole2(obj);\n" +
			    "\n" +
			    "        if (r1.equals(r2) ||\n" +
			    "            (r1.hashCode() == r2.hashCode())) {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // lifting of the same base class object to related roles produces the same role objct
    // 2.2.9-otjld-different-context-lifting-3
    public void test229_differentContextLifting3() {
       
       runConformTest(
            new String[] {
		"T229lpsr3Main.java",
			    "\n" +
			    "public class T229lpsr3Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team229dcl3 t = new Team229dcl3();\n" +
			    "        T229dcl3    o = new T229dcl3();\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T229dcl3.java",
			    "\n" +
			    "public class T229dcl3 {}\n" +
			    "    \n",
		"Team229dcl3.java",
			    "\n" +
			    "public team class Team229dcl3 {\n" +
			    "    public class Role229dcl3_1 playedBy T229dcl3 {}\n" +
			    "    public class Role229dcl3_2 extends Role229dcl3_1 {}\n" +
			    "\n" +
			    "    private Role229dcl3_1 toRole1(T229dcl3 as Role229dcl3_1 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    private Role229dcl3_2 toRole2(T229dcl3 as Role229dcl3_2 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test(T229dcl3 obj) {\n" +
			    "        Role229dcl3_1 r1 = toRole1(obj);\n" +
			    "        Role229dcl3_2 r2 = toRole2(obj);\n" +
			    "\n" +
			    "        if (r1 == r2) {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }


    // compare instances of different teams
    // 2.2.9-otjld-different-context-lifting-5
    public void test229_differentContextLifting5() {
       
       runConformTest(
            new String[] {
		"T229lpsr1Main.java",
			    "\n" +
			    "public class T229lpsr1Main {\n" +
			    "    @SuppressWarnings(\"ambiguouslowering\") // equals could eat either: role or base\n" +
			    "    public static void main(String[] args) {\n" +
			    "        final Team229dcl5_1 t1 = new Team229dcl5_1();\n" +
			    "        final Team229dcl5_2 t2 = new Team229dcl5_2();\n" +
			    "        T229dcl5            o  = new T229dcl5();\n" +
			    "        Role229dcl5<@t1>    r1 = t1.toRole(o);\n" +
			    "        Role229dcl5<@t2>    r2 = t2.toRole(o);\n" +
			    "\n" +
			    "        if ((r1 == r2) || \n" +
			    "            r1.equals(r2) ||\n" +
			    "            (r1.hashCode() == r2.hashCode())) {\n" +
			    "            System.out.print(\"NOTOK\");\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T229dcl5.java",
			    "\n" +
			    "public class T229dcl5 {}\n" +
			    "    \n",
		"Team229dcl5_1.java",
			    "\n" +
			    "public team class Team229dcl5_1 {\n" +
			    "    public class Role229dcl5 playedBy T229dcl5 {}\n" +
			    "\n" +
			    "    public Role229dcl5 toRole(T229dcl5 as Role229dcl5 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team229dcl5_2.java",
			    "\n" +
			    "public team class Team229dcl5_2 extends Team229dcl5_1 {\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a base object is not equal to its lifted self
    // 2.2.10-otjld-baseobject-not-equal-to-roleobject-1
    public void test2210_baseobjectNotEqualToRoleobject1() {
       
       runConformTest(
            new String[] {
		"T2210bnetr1Main.java",
			    "\n" +
			    "public class T2210bnetr1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2210bnetr1 t = new Team2210bnetr1();\n" +
			    "        T2210bnetr1    o = new T2210bnetr1();\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2210bnetr1.java",
			    "\n" +
			    "public class T2210bnetr1 {}\n" +
			    "    \n",
		"Team2210bnetr1.java",
			    "\n" +
			    "public team class Team2210bnetr1 {\n" +
			    "    public class Role2210bnetr1 playedBy T2210bnetr1 {}\n" +
			    "\n" +
			    "    private Role2210bnetr1 toRole(T2210bnetr1 as Role2210bnetr1 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test(T2210bnetr1 obj) {\n" +
			    "        Role2210bnetr1 r = toRole(obj);\n" +
			    "\n" +
			    "        if (r.equals(obj) ||\n" +
			    "            (r.hashCode() == obj.hashCode())) {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a base object is not equal to its lifted self
    // 2.2.10-otjld-baseobject-not-equal-to-roleobject-2
    public void test2210_baseobjectNotEqualToRoleobject2() {
       
       runConformTest(
            new String[] {
		"T2210bnetr2Main.java",
			    "\n" +
			    "public class T2210bnetr2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2210bnetr2 t = new Team2210bnetr2();\n" +
			    "        T2210bnetr2    o = new T2210bnetr2();\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2210bnetr2.java",
			    "\n" +
			    "public class T2210bnetr2 {}\n" +
			    "    \n",
		"Team2210bnetr2.java",
			    "\n" +
			    "public team class Team2210bnetr2 {\n" +
			    "    public class Role2210bnetr2_1 playedBy T2210bnetr2 {}\n" +
			    "    public class Role2210bnetr2_2 extends Role2210bnetr2_1 {}\n" +
			    "\n" +
			    "    private Role2210bnetr2_2 toRole(T2210bnetr2 as Role2210bnetr2_2 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test(T2210bnetr2 obj) {\n" +
			    "        Role2210bnetr2_2 r = toRole(obj);\n" +
			    "\n" +
			    "        if (r.equals(obj) ||\n" +
			    "            (r.hashCode() == obj.hashCode())) {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a base object is not equal to its lifted self
    // 2.2.10-otjld-baseobject-not-equal-to-roleobject-3
    public void test2210_baseobjectNotEqualToRoleobject3() {
       
       runConformTest(
            new String[] {
		"T2210bnetr3Main.java",
			    "\n" +
			    "public class T2210bnetr3Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2210bnetr3_2 t = new Team2210bnetr3_2();\n" +
			    "        T2210bnetr3      o = new T2210bnetr3();\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2210bnetr3.java",
			    "\n" +
			    "public class T2210bnetr3 {}\n" +
			    "    \n",
		"Team2210bnetr3_1.java",
			    "\n" +
			    "public team class Team2210bnetr3_1 {\n" +
			    "    public class Role2210bnetr3 playedBy T2210bnetr3 {}\n" +
			    "}\n" +
			    "    \n",
		"Team2210bnetr3_2.java",
			    "\n" +
			    "public team class Team2210bnetr3_2 extends Team2210bnetr3_1 {\n" +
			    "    private Role2210bnetr3 toRole(T2210bnetr3 as Role2210bnetr3 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test(T2210bnetr3 obj) {\n" +
			    "        Role2210bnetr3 r = toRole(obj);\n" +
			    "\n" +
			    "        if (r.equals(obj) ||\n" +
			    "            (r.hashCode() == obj.hashCode())) {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a base object is tried to lift via an assignment expression
    // 2.2.11-otjld-lifting-via-assignment-1
    public void test2211_liftingViaAssignment1() {
        runNegativeTest(
            new String[] {
		"T2211lva1.java",
			    "\n" +
			    "public class T2211lva1 {}\n" +
			    "    \n",
		"Team2211lva1.java",
			    "\n" +
			    "public team class Team2211lva1 {\n" +
			    "    public class Role2211lva1 playedBy T2211lva1 {}\n" +
			    "\n" +
			    "    public void test(T2211lva1 obj) {\n" +
			    "        Role2211lva1 r = obj;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // a base object is tried to lift via an assignment expression
    // 2.2.11-otjld-lifting-via-assignment-2
    public void test2211_liftingViaAssignment2() {
        runNegativeTest(
            new String[] {
		"T2211lva2.java",
			    "\n" +
			    "public class T2211lva2 {}\n" +
			    "    \n",
		"Team2211lva2.java",
			    "\n" +
			    "public team class Team2211lva2 {\n" +
			    "    public class Role2211lva2_1 playedBy T2211lva2 {}\n" +
			    "    public class Role2211lva2_2 extends Role2211lva2_1 {}\n" +
			    "\n" +
			    "    private Role2211lva2_2 r = new T2211lva2();\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // an array of role objects is lowered to an array of the base class that it is played by
    // 2.2.12-otjld-array-lowering-to-baseclass-1a
    public void test2212_arrayLoweringToBaseclass1a() {
       
       runConformTest(
            new String[] {
		"T2212altb1aMain.java",
			    "\n" +
			    "public class T2212altb1aMain {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2212altb1a t = new Team2212altb1a();\n" +
			    "        T2212altb1a    o = new T2212altb1a();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(new T2212altb1a[]{o}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2212altb1a.java",
			    "\n" +
			    "public class T2212altb1a {\n" +
			    "    public String toString() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2212altb1a.java",
			    "\n" +
			    "public team class Team2212altb1a {\n" +
			    "\n" +
			    "    public class Role2212altb1a playedBy T2212altb1a {\n" +
			    "        public abstract String toString();\n" +
			    "        String toString() -> String toString() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    // alternate (newer) syntax\n" +
			    "    public String getValue(T2212altb1a[] as Role2212altb1a[] objs) {\n" +
			    "        T2212altb1a[] o = objs;\n" +
			    "\n" +
			    "        return o[0].toString();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of role objects is lowered to an array of the base class that it is played by
    // 2.2.12-otjld-array-lowering-to-baseclass-1
    public void test2212_arrayLoweringToBaseclass1() {
       
       runConformTest(
            new String[] {
		"T2212altb1Main.java",
			    "\n" +
			    "public class T2212altb1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2212altb1 t = new Team2212altb1();\n" +
			    "        T2212altb1    o = new T2212altb1();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(new T2212altb1[]{o}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2212altb1.java",
			    "\n" +
			    "public class T2212altb1 {\n" +
			    "    public String toString() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2212altb1.java",
			    "\n" +
			    "public team class Team2212altb1 {\n" +
			    "\n" +
			    "    public class Role2212altb1 playedBy T2212altb1 {\n" +
			    "        public abstract String toString();\n" +
			    "        String toString() -> String toString() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public String getValue(T2212altb1 as Role2212altb1 objs[]) {\n" +
			    "        T2212altb1[] o = objs;\n" +
			    "\n" +
			    "        return o[0].toString();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of role objects is lowered to an array of the base class that it is played by
    // 2.2.12-otjld-array-lowering-to-baseclass-2
    public void test2212_arrayLoweringToBaseclass2() {
       
       runConformTest(
            new String[] {
		"T2212tb2Main.java",
			    "\n" +
			    "public class T2212tb2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2212altb2 t = new Team2212altb2();\n" +
			    "        T2212altb2    o = new T2212altb2();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(new T2212altb2[]{o}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2212altb2.java",
			    "\n" +
			    "public class T2212altb2 {\n" +
			    "    public String toString() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2212altb2.java",
			    "\n" +
			    "public team class Team2212altb2 {\n" +
			    "\n" +
			    "    public class Role2212altb2 playedBy T2212altb2 {\n" +
			    "        public abstract String toString();\n" +
			    "        String toString() -> String toString() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public String getValue(T2212altb2 as Role2212altb2 objs[]) {\n" +
			    "        final T2212altb2[] o = objs;\n" +
			    "\n" +
			    "        return o[0].toString();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of role objects is lowered to an array of the base class that it is played by
    // 2.2.12-otjld-array-lowering-to-baseclass-3
    public void test2212_arrayLoweringToBaseclass3() {
       
       runConformTest(
            new String[] {
		"T2212tb3Main.java",
			    "\n" +
			    "public class T2212tb3Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2212altb3 t = new Team2212altb3();\n" +
			    "        T2212altb3_2  o = new T2212altb3_2();\n" +
			    "\n" +
			    "        t.setValues(new T2212altb3_2[]{o});\n" +
			    "        System.out.print(t);\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2212altb3_1.java",
			    "\n" +
			    "public class T2212altb3_1 {\n" +
			    "    public String toString() {\n" +
			    "        return \"NOTOK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2212altb3_2.java",
			    "\n" +
			    "public class T2212altb3_2 extends T2212altb3_1 {\n" +
			    "    public String toString() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2212altb3.java",
			    "\n" +
			    "public team class Team2212altb3 {\n" +
			    "    private T2212altb3_1[] o;\n" +
			    "\n" +
			    "    public class Role2212altb3 playedBy T2212altb3_2 {\n" +
			    "        public abstract String toString();\n" +
			    "        String toString() -> String toString() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public void setValues(T2212altb3_2 as Role2212altb3 objs[]) {\n" +
			    "        o = objs;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String toString()\n" +
			    "    {\n" +
			    "        return o[0].toString();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of role objects is lowered to an array of the base class that it is played by
    // 2.2.12-otjld-array-lowering-to-baseclass-4
    public void test2212_arrayLoweringToBaseclass4() {
       
       runConformTest(
            new String[] {
		"T2212tb4Main.java",
			    "\n" +
			    "public class T2212tb4Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2212altb4_2 t = new Team2212altb4_2();\n" +
			    "        T2212altb4      o = new T2212altb4();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(new T2212altb4[]{o}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2212altb4.java",
			    "\n" +
			    "public class T2212altb4 {\n" +
			    "    public String toString() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2212altb4_1.java",
			    "\n" +
			    "public team class Team2212altb4_1 {\n" +
			    "\n" +
			    "    public class Role2212altb4 playedBy T2212altb4 {\n" +
			    "        public abstract String toString();\n" +
			    "        String toString() -> String toString() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2212altb4_2.java",
			    "\n" +
			    "public team class Team2212altb4_2 extends Team2212altb4_1 {\n" +
			    "\n" +
			    "    public String getValue(T2212altb4 as Role2212altb4 objs[]) {\n" +
			    "        return getValueInternal(objs);\n" +
			    "    }\n" +
			    "\n" +
			    "    private String getValueInternal(T2212altb4[] objs) {\n" +
			    "        return objs[0].toString();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of role objects is lowered to an array of the base class that it is played by
    // 2.2.12-otjld-array-lowering-to-baseclass-5
    public void test2212_arrayLoweringToBaseclass5() {
       
       runConformTest(
            new String[] {
		"T2212tb5Main.java",
			    "\n" +
			    "public class T2212tb5Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2212altb5_2 t = new Team2212altb5_2();\n" +
			    "        T2212altb5      o = new T2212altb5();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(new T2212altb5[]{o}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2212altb5.java",
			    "\n" +
			    "public class T2212altb5 {\n" +
			    "    public String toString() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2212altb5_1.java",
			    "\n" +
			    "public team class Team2212altb5_1 {\n" +
			    "\n" +
			    "    public class Role2212altb5_1 playedBy T2212altb5 {\n" +
			    "        public abstract String toString();\n" +
			    "        String toString() -> String toString() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2212altb5_2.java",
			    "\n" +
			    "public team class Team2212altb5_2 extends Team2212altb5_1 {\n" +
			    "\n" +
			    "    public class Role2212altb5_2 extends Role2212altb5_1 {}\n" +
			    "\n" +
			    "    public String getValue(T2212altb5 as Role2212altb5_2 objs[]) {\n" +
			    "        return getValueInternal(objs);\n" +
			    "    }\n" +
			    "\n" +
			    "    private String getValueInternal(final T2212altb5[] objs) {\n" +
			    "        return objs[0].toString();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of role objects is lowered to an array of the base class that it is played by
    // 2.2.12-otjld-array-lowering-to-baseclass-6
    public void test2212_arrayLoweringToBaseclass6() {
       
       runConformTest(
            new String[] {
		"T2212tb6Main.java",
			    "\n" +
			    "public class T2212tb6Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2212altb6 t = new Team2212altb6();\n" +
			    "        T2212altb6    o = new T2212altb6();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(new T2212altb6[]{o}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2212altb6.java",
			    "\n" +
			    "public class T2212altb6 {\n" +
			    "    public String toString() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2212altb6.java",
			    "\n" +
			    "public team class Team2212altb6 {\n" +
			    "\n" +
			    "    public class Role2212altb6 playedBy T2212altb6 {\n" +
			    "        public abstract String toString();\n" +
			    "        String toString() -> String toString() with {\n" +
			    "            result <- \"NOTOK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public String getValue(T2212altb6 as Role2212altb6 objs[]) {\n" +
			    "        return convert(objs)[0].toString();\n" +
			    "    }\n" +
			    "\n" +
			    "    private T2212altb6[] convert(Role2212altb6[] objs) {\n" +
			    "        return objs;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of role objects is lowered to an array of the base class that it is played by -- base call
    // 2.2.12-otjld-array-lowering-to-baseclass-7
    public void test2212_arrayLoweringToBaseclass7() {
       
       runConformTest(
            new String[] {
		"Team2212altb7.java",
			    "\n" +
			    "public team class Team2212altb7 {\n" +
			    "    protected class R playedBy T2212altb7 {\n" +
			    "        callin void intercept(R[] rs) {\n" +
			    "            rs[0].print();\n" +
			    "            base.intercept(rs);\n" +
			    "        }\n" +
			    "        void intercept(R[] rs) <- replace void test(T2212altb7[] ts) \n" +
			    "            with { rs <- ts }\n" +
			    "        void print() {\n" +
			    "            System.out.print(\"O\");\n" +
			    "        }\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team2212altb7().activate();\n" +
			    "        T2212altb7 b = new T2212altb7();\n" +
			    "        b.test(new T2212altb7[]{b});\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2212altb7.java",
			    "\n" +
			    "public class T2212altb7 {\n" +
			    "    void test(T2212altb7[] ts) {\n" +
			    "        ts[0].print();\n" +
			    "    }\n" +
			    "    void print() {\n" +
			    "        System.out.print(\"K\");\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }
    // Bug 329374 -  Implicit Lowering of a Role Array as return results in compiler error
    public void test2212_arrayLoweringToBaseclass8() {
        compileOrder = new String[][] {{"T2212altb8_1.java", "T2212altb8_2.java", "Team2212altb8.java"}, {"T2212altb8Main.java"}};
        runConformTest(
                new String[] {
            "T2212altb8Main.java",
            		"public class T2212altb8Main {\n"+
            		"    public static void main(String[] args){\n"+
            		"        Team2212altb8 t = new Team2212altb8();\n"+
            		"        T2212altb8_2 b = new T2212altb8_2();\n"+
            		"        T2212altb8_1[] as = t.getAs(b);\n"+
            		"    }\n" +
            		"}\n",
            "T2212altb8_1.java",
            		"public class T2212altb8_1 {}\n",
            "T2212altb8_2.java",
                	"public class T2212altb8_2 {}\n",
            "Team2212altb8.java",
            		"public team class Team2212altb8 {\n" +
            		"	 protected class RoleA playedBy T2212altb8_1 {\n" +
            		"    }\n" +
            		"    protected class RoleB playedBy T2212altb8_2 {\n" +
            		"        protected RoleA[] getAs(){\n" +
            		"            return new RoleA[0];\n" +
            		"        }\n" +
            		"    }\n" +
            		"    public RoleA[] getAs(T2212altb8_2 as RoleB rb) {\n" +
            		"        return rb.getAs();\n" +
            		"    }\n" +
            		"}\n"
                });
    }
    
    public void test2212_arrayLoweringToBaseclass9() {
    	runConformTest(
    		new String[] {
    			"Team2214altb9.java",
    			"import java.util.*;\n" +
    			"public team class Team2214altb9 {\n" +
    			"	protected class R playedBy T2214altb9 { protected R() { base(); } }\n" +
    			"	T2214altb9[] toBaseArray(List<R> roles) {\n" +
    			"		return roles.toArray(new R[roles.size()]);\n" +
    			"	}\n" +
    			"	void test() {\n" +
    			"		List<R> roles = new ArrayList<R>();\n" +
    			"		roles.add(new R());\n" +
    			"		T2214altb9[] bases = toBaseArray(roles);\n" +
    			"		System.out.println(bases[0].getClass().getName());\n" +
    			"	}\n" +
    			"	public static void main(String[] args) {\n" +
    			"		new Team2214altb9().test();\n" +
    			"	}\n" +
    			"}\n",
    			"T2214altb9.java",
    			"public class T2214altb9 {\n" +
    			"}\n"
    		},
    		"T2214altb9");
    }
    
    public void test2212_arrayLowering_inConditionalExpression1() {
    	runConformTest(
    		new String[] {
    			"Team2214alice1.java",
    			"import java.util.*;\n" +
    			"public team class Team2214alice1 {\n" +
    			"	protected class R playedBy T2214alice1 { protected R() { base(); } }\n" +
    			"	T2214alice1[] toBaseArray(List<R> roles) {\n" +
    			"		return roles != null ? roles.toArray(new R[roles.size()]) : new R[0];\n" +
    			"	}\n" +
    			"	void test() {\n" +
    			"		List<R> roles = new ArrayList<R>();\n" +
    			"		roles.add(new R());\n" +
    			"		T2214alice1[] bases = toBaseArray(roles);\n" +
    			"		System.out.println(bases[0].getClass().getName());\n" +
    			"	}\n" +
    			"	public static void main(String[] args) {\n" +
    			"		new Team2214alice1().test();\n" +
    			"	}\n" +
    			"}\n",
    			"T2214alice1.java",
    			"public class T2214alice1 {\n" +
    			"}\n"
    		},
    		"T2214alice1");
    }
    
    // lowering of a role object array for the same base objects produces the an equal object array
    // 2.2.14-otjld-array-lowering-produces-equal-object-1
    public void test2214_arrayLoweringProducesEqualObject1() {
       
       runConformTest(
            new String[] {
		"T2214alpeo1Main.java",
			    "\n" +
			    "public class T2214alpeo1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2214alpeo1 t = new Team2214alpeo1();\n" +
			    "        T2214alpeo1    o = new T2214alpeo1();\n" +
			    "\n" +
			    "        System.out.print(t.test(new T2214alpeo1[]{o}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2214alpeo1.java",
			    "\n" +
			    "public class T2214alpeo1 {}\n" +
			    "    \n",
		"Team2214alpeo1.java",
			    "\n" +
			    "public team class Team2214alpeo1 {\n" +
			    "\n" +
			    "    public class Role2214alpeo1 playedBy T2214alpeo1 {}\n" +
			    "\n" +
			    "    public String test(T2214alpeo1 as Role2214alpeo1 obj[]) {\n" +
			    "        T2214alpeo1[] loweredA = obj;\n" +
			    "        T2214alpeo1[] loweredB = obj;\n" +
			    "\n" +
			    "        if (loweredA == loweredB) {\n" +
			    "            return \"NOTOK 1\";\n" +
			    "        }\n" +
			    "        else if (!java.util.Arrays.equals(loweredA, loweredB)) {\n" +
			    "            return \"NOTOK 1\";\n" +
			    "        }\n" +
			    "        else if (loweredA.hashCode() == loweredB.hashCode()) {\n" +
			    "            return \"NOTOK 3\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // lowering of a role object array for the same base objects produces an equal object array
    // 2.2.14-otjld-array-lowering-produces-equal-object-2
    public void test2214_arrayLoweringProducesEqualObject2() {
       
       runConformTest(
            new String[] {
		"T2214alpeo2Main.java",
			    "\n" +
			    "public class T2214alpeo2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2214alpeo2_2 t = new Team2214alpeo2_2();\n" +
			    "        T2214alpeo2_2    o = new T2214alpeo2_2();\n" +
			    "\n" +
			    "        System.out.print(t.test(new T2214alpeo2_2[]{o}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2214alpeo2_1.java",
			    "\n" +
			    "public class T2214alpeo2_1 {}\n" +
			    "    \n",
		"T2214alpeo2_2.java",
			    "\n" +
			    "public class T2214alpeo2_2 extends T2214alpeo2_1 {}\n" +
			    "    \n",
		"Team2214alpeo2_1.java",
			    "\n" +
			    "public team class Team2214alpeo2_1 {\n" +
			    "\n" +
			    "    public class Role2214alpeo2_1 playedBy T2214alpeo2_1 {}\n" +
			    "}\n" +
			    "    \n",
		"Team2214alpeo2_2.java",
			    "\n" +
			    "public team class Team2214alpeo2_2 extends Team2214alpeo2_1 {\n" +
			    "\n" +
			    "    public class Role2214alpeo2_2 extends Role2214alpeo2_1 playedBy T2214alpeo2_2 {}\n" +
			    "\n" +
			    "    public String test(T2214alpeo2_2 as Role2214alpeo2_2 obj[]) {\n" +
			    "        T2214alpeo2_1[] loweredA = obj;\n" +
			    "        T2214alpeo2_2[] loweredB = obj;\n" +
			    "\n" +
			    "        if (loweredA == loweredB) {\n" +
			    "            return \"NOTOK 1\";\n" +
			    "        }\n" +
			    "        else if (!java.util.Arrays.equals(loweredA, loweredB)) {\n" +
			    "            return \"NOTOK 1\";\n" +
			    "        }\n" +
			    "        else if (loweredA.hashCode() == loweredB.hashCode()) {\n" +
			    "            return \"NOTOK 3\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of base class objects is lifted to a role array
    // 2.2.15-otjld-array-lifting-1
    public void test2215_arrayLifting1() {
       
       runConformTest(
            new String[] {
		"T2215al1Main.java",
			    "\n" +
			    "public class T2215al1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2215al1 t = new Team2215al1();\n" +
			    "        T2215al1    o = new T2215al1();\n" +
			    "\n" +
			    "        System.out.print(t.test(new T2215al1[]{o}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2215al1.java",
			    "\n" +
			    "public class T2215al1 {\n" +
			    "    public String toString() {\n" +
			    "        return \"NOTOK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2215al1.java",
			    "\n" +
			    "public team class Team2215al1 {\n" +
			    "\n" +
			    "    public class Role2215al1 playedBy T2215al1 {\n" +
			    "        public abstract String toString();\n" +
			    "        String toString() -> String toString() with {\n" +
			    "            result <- \"OK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test(T2215al1 as Role2215al1 obj[]) {\n" +
			    "        return obj[0].toString();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of base class objects is lifted to a role array
    // 2.2.15-otjld-array-lifting-2
    public void test2215_arrayLifting2() {
       
       runConformTest(
            new String[] {
		"T2215al2Main.java",
			    "\n" +
			    "public class T2215al2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2215al2_2 t = new Team2215al2_2();\n" +
			    "        T2215al2      o = new T2215al2();\n" +
			    "\n" +
			    "        System.out.print(t.test(new T2215al2[]{o}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2215al2.java",
			    "\n" +
			    "public class T2215al2 {\n" +
			    "    public String toString() {\n" +
			    "        return \"NOTOK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2215al2_1.java",
			    "\n" +
			    "public team class Team2215al2_1 {\n" +
			    "    public class Role2215al2_1 playedBy T2215al2 {}\n" +
			    "}\n" +
			    "    \n",
		"Team2215al2_2.java",
			    "\n" +
			    "public team class Team2215al2_2 extends Team2215al2_1 {\n" +
			    "\n" +
			    "    public class Role2215al2_2 extends Role2215al2_1 {\n" +
			    "        public abstract String toString();\n" +
			    "        String toString() -> String toString() with {\n" +
			    "            result <- \"OK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test(T2215al2 as Role2215al2_2 obj[]) {\n" +
			    "        return obj[0].toString();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of base class objects is lifted to a role array
    // 2.2.15-otjld-array-lifting-3
    public void test2215_arrayLifting3() {
       
       runConformTest(
            new String[] {
		"T2215al3Main.java",
			    "\n" +
			    "public class T2215al3Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2215al3 t = new Team2215al3();\n" +
			    "        T2215al3    o = new T2215al3();\n" +
			    "\n" +
			    "        System.out.print(t.test(new T2215al3[]{o}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2215al3.java",
			    "\n" +
			    "public class T2215al3 {\n" +
			    "    public String toString() {\n" +
			    "        return \"NOTOK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2215al3.java",
			    "\n" +
			    "public team class Team2215al3 {\n" +
			    "    public class Role2215al3_1 playedBy T2215al3 {}\n" +
			    "\n" +
			    "    public class Role2215al3_2 playedBy T2215al3 {\n" +
			    "        public abstract String toString();\n" +
			    "        String toString() -> String toString() with {\n" +
			    "            result <- \"OK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test(T2215al3 as Role2215al3_1 obj[]) {\n" +
			    "        return getValue(obj);\n" +
			    "    }\n" +
			    "\n" +
			    "    private String getValue(T2215al3 as Role2215al3_2 obj[]) {\n" +
			    "        return obj[0].toString();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of base class objects (inner class) is lifted to a role array
    // 2.2.15-otjld-array-lifting-4
    public void test2215_arrayLifting4() {
       
       runConformTest(
            new String[] {
		"T2215al4Main.java",
			    "\n" +
			    "public class T2215al4Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2215al4 t = new Team2215al4();\n" +
			    "        T2215al4    o = new T2215al4();\n" +
			    "        T2215al4.Inner i= o.new Inner();\n" +
			    "\n" +
			    "        System.out.print(t.test(new T2215al4.Inner[]{i}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2215al4.java",
			    "\n" +
			    "public class T2215al4 {\n" +
			    "    public class Inner  {\n" +
			    "        public String toString() {\n" +
			    "            return \"NOTOK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2215al4.java",
			    "\n" +
			    "public team class Team2215al4 {\n" +
			    "\n" +
			    "    public class Role2215al4 playedBy T2215al4.Inner {\n" +
			    "        public abstract String toString();\n" +
			    "        String toString() -> String toString() with {\n" +
			    "            result <- \"OK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test(T2215al4.Inner as Role2215al4 obj[]) {\n" +
			    "        return obj[0].toString();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }
    

    // an array of base class objects is lifted to an array of nested roles
    public void test2215_arrayLifting5() {
       
       runConformTest(
            new String[] {
		"T2215al5Main.java",
			    "\n" +
			    "public class T2215al5Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        final Team2215al5 t = new Team2215al5();\n" +
			    "        T2215al5    o = new T2215al5();\n" +
			    "        Mid<@t> mid = new Mid<@t>();\n" +
			    "        System.out.print(mid.test(new T2215al5[]{o}));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2215al5.java",
			    "\n" +
			    "public class T2215al5 {\n" +
			    "    public String toString() {\n" +
			    "        return \"NOTOK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2215al5.java",
			    "\n" +
			    "public team class Team2215al5 {\n" +
			    "  public team class Mid {\n" +
			    "    public class Role2215al5 playedBy T2215al5 {\n" +
			    "        public abstract String toString();\n" +
			    "        String toString() -> String toString() with {\n" +
			    "            result <- \"OK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "    public String test(T2215al5 as Role2215al5 obj[]) {\n" +
			    "        return obj[0].toString();\n" +
			    "    }\n" +
			    "  }\n" +
			    "\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of base class objects is lifted to an array of nested roles - location: callout return
    // witness for broken bytecode: ifc-part of array lifter was not found, but silently generated a problem method for the caller
    public void test2215_arrayLifting6() {
       
       runConformTest(
            new String[] {
		"T2215al6Main.java",
			    "\n" +
			    "public class T2215al6Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        final Team2215al6 t = new Team2215al6();\n" +
			    "        T2215al6_2    o = new T2215al6_2();\n" +
			    "        t.test(o);\n" +
			    "    }\n" +
			    "}\n",
		"T2215al6_1.java",
			    "\n" +
			    "public class T2215al6_1 {\n" +
			    "    @Override\n" +
			    "    public String toString() {\n" +
			    "        return \"NOTOK\";\n" +
			    "    }\n" +
			    "}\n",
		"T2215al6_2.java",
			    "\n" +
			    "public class T2215al6_2 {\n" +
			    "    public T2215al6_1[] getOthers() { return new T2215al6_1[]{ new T2215al6_1()}; }\n" +
			    "}\n",
		"Team2215al6.java",
			    "\n" +
			    "public team class Team2215al6 {\n" +
			    "  public team class Mid playedBy T2215al6_2 {\n" +
			    "    public class Role2215al6 playedBy T2215al6_1 {\n" +
			    "        String toString() => String toString() with {\n" +
			    "            result <- \"OK\"\n" +
			    "        }\n" +
			    "    }\n" +
			    "    Role2215al6[] getOthers() -> T2215al6_1[] getOthers();\n" +
			    "    protected void test() {\n" +
			    "      System.out.print(getOthers()[0].toString());\n" +
			    "    }\n" +
			    "  }\n" +
			    "  public void test(T2215al6_2 as Mid m) {\n" +
			    "    m.test();\n" +
			    "  }\n" +
			    "}\n"
            },
            "OK");
    }


    // an array of base class objects is lifted to an array of nested roles - location: callin return
    public void test2215_arrayLifting7() {
       
       runConformTest(
            new String[] {
		"T2215al7Main.java",
			    "\n" +
			    "public class T2215al7Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        final Team2215al7 t = new Team2215al7();\n" +
			    "        t.activate();\n" +
			    "        T2215al7_2    o = new T2215al7_2();\n" +
			    "        System.out.print(o.getOthers()[0]);\n" +
			    "    }\n" +
			    "}\n",
		"T2215al7_1.java",
			    "\n" +
			    "public class T2215al7_1 {\n" +
			    "    @Override\n" +
			    "    public String toString() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n",
		"T2215al7_2.java",
			    "\n" +
			    "public class T2215al7_2 {\n" +
			    "    public T2215al7_1[] getOthers() { return new T2215al7_1[0]; }\n" +
			    "}\n",
		"Team2215al7.java",
			    "\n" +
			    "public team class Team2215al7 {\n" +
			    "  public team class Mid playedBy T2215al7_2 {\n" +
			    "    public class Role2215al7 playedBy T2215al7_1 {\n" +
			    "        protected Role2215al7() {\n" +
			    "            base();\n" +
			    "        }\n" +
			    "    }\n" +
			    "    Role2215al7[] getOthers() <- replace T2215al7_1[] getOthers();\n" +
			    "    callin Role2215al7[] getOthers() {\n" +
			    "      System.out.print(base.getOthers().length);\n" +
			    "      return new Role2215al7[]{ new Role2215al7() };\n" +
			    "    }\n" +
			    "  }\n" +
			    "}\n"
            },
            "0OK");
    }

    // an array of base class objects is lifted to an array of a role class that is not played by that base class
    // 2.2.16-otjld-array-lifting-to-unrelated-role-1
    public void test2216_arrayLiftingToUnrelatedRole1() {
        runNegativeTest(
            new String[] {
		"T2216altur1.java",
			    "\n" +
			    "public class T2216altur1 {}\n" +
			    "    \n",
		"Team2216altur1.java",
			    "\n" +
			    "public team class Team2216altur1 {\n" +
			    "    public class Role2216altur1 {}\n" +
			    "\n" +
			    "    public void test(T2216altur1 as Role2216altur1 obj[]) {}\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // an array of base class objects is lifted to an array of a role class that is not played by that base class
    // 2.2.16-otjld-array-lifting-to-unrelated-role-2
    public void test2216_arrayLiftingToUnrelatedRole2() {
        runNegativeTest(
            new String[] {
		"p1/T2216altur2.java",
			    "\n" +
			    "package p1;\n" +
			    "public class T2216altur2 {}\n" +
			    "    \n",
		"p1/Team2216altur2_1.java",
			    "\n" +
			    "package p1;\n" +
			    "public team class Team2216altur2_1 {\n" +
			    "    // shadows the class within this package\n" +
			    "    protected class T2216altur2 {}\n" +
			    "    public class Role2216altur2 playedBy T2216altur2 {}\n" +
			    "}\n" +
			    "    \n",
		"p2/Team2216altur2_2.java",
			    "\n" +
			    "package p2;\n" +
			    "public team class Team2216altur2_2 extends p1.Team2216altur2_1 {\n" +
			    "    public void test(T2216altur2 as Role2216altur2 obj[]) {}\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // the lifting of an array of base objects produces equal role object arrays (but not the same)
    // 2.2.17-otjld-array-lifting-produces-equal-object-1
    public void test2217_arrayLiftingProducesEqualObject1() {
       
       runConformTest(
            new String[] {
		"T2217alpeo1Main.java",
			    "\n" +
			    "public class T2217alpeo1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2217alpeo1 t = new Team2217alpeo1();\n" +
			    "        T2217alpeo1    o = new T2217alpeo1();\n" +
			    "\n" +
			    "        System.out.print(t.test(o, o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2217alpeo1.java",
			    "\n" +
			    "public class T2217alpeo1 {\n" +
			    "    public T2217alpeo1[] getObjects() {\n" +
			    "        return new T2217alpeo1[]{this};\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2217alpeo1.java",
			    "\n" +
			    "public team class Team2217alpeo1 {\n" +
			    "    public class Role2217alpeo1_1 playedBy T2217alpeo1 {}\n" +
			    "\n" +
			    "    public class Role2217alpeo1_2 playedBy T2217alpeo1 {\n" +
			    "        public abstract Role2217alpeo1_1[] getObjects();\n" +
			    "        Role2217alpeo1_1[] getObjects() -> T2217alpeo1[] getObjects();\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test(T2217alpeo1 as Role2217alpeo1_2 objA, T2217alpeo1 as Role2217alpeo1_2 objB) {\n" +
			    "        Role2217alpeo1_1[] liftedA = objA.getObjects();\n" +
			    "        Role2217alpeo1_1[] liftedB = objB.getObjects();\n" +
			    "\n" +
			    "        if (liftedA == liftedB) {\n" +
			    "            return \"NOTOK 1\";\n" +
			    "        }\n" +
			    "        else if (!liftedA.equals(liftedB)) {\n" +
			    "	    if (liftedA.length != liftedB.length)\n" +
			    "	    	return \"NOTOK 2a\";\n" +
			    "	    for (int i=0; i<liftedA.length; i++){\n" +
			    "	    	if (liftedA[i] != liftedB[i])\n" +
			    "            		return \"NOTOK 2b\";\n" +
			    "	    }\n" +
			    "	    return \"OK\";\n" +
			    "        }\n" +
			    "        else if (liftedA.hashCode() != liftedB.hashCode()) {\n" +
			    "            return \"NOTOK 3\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // the lifting of an array of base objects produces equal role object arrays (but not the same)
    // 2.2.17-otjld-array-lifting-produces-equal-object-2
    public void test2217_arrayLiftingProducesEqualObject2() {
       
       runConformTest(
            new String[] {
		"T2217alpeo2Main.java",
			    "\n" +
			    "public class T2217alpeo2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2217alpeo2  t = new Team2217alpeo2();\n" +
			    "        T2217alpeo2_2[] o = { new T2217alpeo2_2() };\n" +
			    "\n" +
			    "        System.out.print(t.test(o, o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2217alpeo2_1.java",
			    "\n" +
			    "public class T2217alpeo2_1 {}\n" +
			    "    \n",
		"T2217alpeo2_2.java",
			    "\n" +
			    "public class T2217alpeo2_2 extends T2217alpeo2_1 {}\n" +
			    "    \n",
		"Team2217alpeo2.java",
			    "\n" +
			    "public team class Team2217alpeo2 {\n" +
			    "    public class Role2217alpeo2_1 playedBy T2217alpeo2_1 {}\n" +
			    "\n" +
			    "    public class Role2217alpeo2_2 extends Role2217alpeo2_1 {}\n" +
			    "\n" +
			    "    public String test(T2217alpeo2_1 as Role2217alpeo2_2 objA[], T2217alpeo2_2 as Role2217alpeo2_2 objB[]) {\n" +
			    "\n" +
			    "        if (objA == objB) {\n" +
			    "            return \"NOTOK 1\";\n" +
			    "        }\n" +
			    "        else if (!objA.equals(objB)) {\n" +
			    "	    if (objA.length != objB.length)\n" +
			    "	    	return \"NOTOK 2a\";\n" +
			    "	    for (int i=0; i<objA.length; i++){\n" +
			    "	    	if (objA[i] != objB[i])\n" +
			    "            		return \"NOTOK 2b\";\n" +
			    "	    }\n" +
			    "	    if (java.util.Arrays.equals(objA, objB))\n" +
			    "	    	return \"OK\";\n" +
			    "	    return \"NOTOK 2c\";\n" +
			    "        }\n" +
			    "        else if (objA.hashCode() != objB.hashCode()) {\n" +
			    "            return \"NOTOK 3\";\n" +
			    "        }\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"NOTOK 4\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of base objects is not equal to its lifted self
    // 2.2.18-otjld-basearray-not-equal-to-rolearray-1
    public void test2218_basearrayNotEqualToRolearray1() {
       
       runConformTest(
            new String[] {
		"T2218bnetr1Main.java",
			    "\n" +
			    "public class T2218bnetr1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2218bnetr1 t = new Team2218bnetr1();\n" +
			    "\n" +
			    "        System.out.print(t.test());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2218bnetr1.java",
			    "\n" +
			    "public class T2218bnetr1 {}\n" +
			    "    \n",
		"Team2218bnetr1.java",
			    "\n" +
			    "public team class Team2218bnetr1 {\n" +
			    "    public class Role2218bnetr1_1 playedBy T2218bnetr1 {}\n" +
			    "\n" +
			    "    public class Role2218bnetr1_2 extends Role2218bnetr1_1 {}\n" +
			    "\n" +
			    "    private Role2218bnetr1_2[] convert(T2218bnetr1 as Role2218bnetr1_2 obj[]) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test() {\n" +
			    "        T2218bnetr1[]      obj    = { new T2218bnetr1() };\n" +
			    "        Role2218bnetr1_2[] lifted = convert(obj);\n" +
			    "\n" +
			    "        if (obj.equals(lifted)) {\n" +
			    "            return \"NOTOK 1\";\n" +
			    "        }\n" +
			    "        else if (obj.hashCode() == lifted.hashCode()) {\n" +
			    "            return \"NOTOK 2\";\n" +
			    "        }\n" +
			    "	else if (java.util.Arrays.equals(obj, lifted)) {\n" +
			    "	    return \"NOTOK 3\";\n" +
			    "	}\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of base objects is not equal to its lifted self
    // 2.2.18-otjld-basearray-not-equal-to-rolearray-2
    public void test2218_basearrayNotEqualToRolearray2() {
       
       runConformTest(
            new String[] {
		"T2218bnetr2Main.java",
			    "\n" +
			    "public class T2218bnetr2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2218bnetr2 t = new Team2218bnetr2();\n" +
			    "\n" +
			    "        System.out.print(t.test());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2218bnetr2_1.java",
			    "\n" +
			    "public class T2218bnetr2_1 {}\n" +
			    "    \n",
		"T2218bnetr2_2.java",
			    "\n" +
			    "public class T2218bnetr2_2 extends T2218bnetr2_1 {}\n" +
			    "    \n",
		"Team2218bnetr2.java",
			    "\n" +
			    "public team class Team2218bnetr2 {\n" +
			    "    public class Role2218bnetr2_1 playedBy T2218bnetr2_1 {}\n" +
			    "\n" +
			    "    public class Role2218bnetr2_2 playedBy T2218bnetr2_2 {}\n" +
			    "\n" +
			    "    private Role2218bnetr2_1[] toRole1(T2218bnetr2_1 as Role2218bnetr2_1 obj[]) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    private Role2218bnetr2_2[] toRole2(T2218bnetr2_2 as Role2218bnetr2_2 obj[]) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test() {\n" +
			    "        T2218bnetr2_1[]    obj    = toRole2(new T2218bnetr2_2[]{ new T2218bnetr2_2() });\n" +
			    "        Role2218bnetr2_1[] lifted = toRole1(obj);\n" +
			    "\n" +
			    "        if (obj.equals(lifted)) {\n" +
			    "            return \"NOTOK 1\";\n" +
			    "        }\n" +
			    "        else if (obj.hashCode() == lifted.hashCode()) {\n" +
			    "            return \"NOTOK 2\";\n" +
			    "        }\n" +
			    "	else if (java.util.Arrays.equals(obj, lifted)) {\n" +
			    "	    return \"NOTOK 3\";\n" +
			    "	}\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of role objects is not equal to its lowered self
    // 2.2.19-otjld-rolearray-equal-to-lowered-1
    public void test2219_rolearrayEqualToLowered1() {
       
       runConformTest(
            new String[] {
		"T2219bnetr1Main.java",
			    "\n" +
			    "public class T2219bnetr1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2219bnetr1 t = new Team2219bnetr1();\n" +
			    "\n" +
			    "        System.out.print(t.test());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2219bnetr1.java",
			    "\n" +
			    "public class T2219bnetr1 {}\n" +
			    "    \n",
		"Team2219bnetr1.java",
			    "\n" +
			    "public team class Team2219bnetr1 {\n" +
			    "    public class Role2219bnetr1 playedBy T2219bnetr1 {}\n" +
			    "\n" +
			    "    private Role2219bnetr1[] toRole(T2219bnetr1 as Role2219bnetr1 obj[]) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test() {\n" +
			    "        Role2219bnetr1[] obj     = toRole(new T2219bnetr1[]{ new T2219bnetr1() });\n" +
			    "        T2219bnetr1[]    lowered = obj;\n" +
			    "\n" +
			    "        if (obj.equals(lowered)) {\n" +
			    "            return \"NOTOK 1\";\n" +
			    "        }\n" +
			    "        else if (obj.hashCode() == lowered.hashCode()) {\n" +
			    "            return \"NOTOK 2\";\n" +
			    "        }\n" +
			    "	else if (java.util.Arrays.equals(obj, lowered)) {\n" +
			    "	    return \"NOTOK 3\";\n" +
			    "	}\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an array of role objects is not equal to its lowered self
    // 2.2.19-otjld-rolearray-equal-to-lowered-2
    public void test2219_rolearrayEqualToLowered2() {
       
       runConformTest(
            new String[] {
		"T2219bnetr2Main.java",
			    "\n" +
			    "public class T2219bnetr2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2219bnetr2_2 t = new Team2219bnetr2_2();\n" +
			    "\n" +
			    "        System.out.print(t.test());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2219bnetr2_1.java",
			    "\n" +
			    "public class T2219bnetr2_1 {}\n" +
			    "    \n",
		"T2219bnetr2_2.java",
			    "\n" +
			    "public class T2219bnetr2_2 extends T2219bnetr2_1 {}\n" +
			    "    \n",
		"Team2219bnetr2_1.java",
			    "\n" +
			    "public team class Team2219bnetr2_1 {\n" +
			    "    public class Role2219bnetr2 playedBy T2219bnetr2_2 {}\n" +
			    "}\n" +
			    "    \n",
		"Team2219bnetr2_2.java",
			    "\n" +
			    "public team class Team2219bnetr2_2 extends Team2219bnetr2_1 {\n" +
			    "    private Role2219bnetr2[] obj;\n" +
			    "\n" +
			    "    private void init(T2219bnetr2_2 as Role2219bnetr2 obj[]) {\n" +
			    "        this.obj = obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public String test() {\n" +
			    "        init(new T2219bnetr2_2[]{ new T2219bnetr2_2() });\n" +
			    "\n" +
			    "        T2219bnetr2_1[] lowered = obj;\n" +
			    "\n" +
			    "        if (obj.equals(lowered)) {\n" +
			    "            return \"NOTOK 1\";\n" +
			    "        }\n" +
			    "        else if (obj.hashCode() == lowered.hashCode()) {\n" +
			    "            return \"NOTOK 2\";\n" +
			    "        }\n" +
			    "	else if (java.util.Arrays.equals(obj, lowered)) {\n" +
			    "	    return \"NOTOK 3\";\n" +
			    "	}\n" +
			    "        else\n" +
			    "        {\n" +
			    "            return \"OK\";\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role class has an initializeRole method with a signature that is not as required 2.2h
    // 2.2.20-otjld_obsolete-initializeRole-with-different-signature-1
    public void _obsolete_test2220_initializeRoleWithDifferentSignature1() {
       
       runConformTest(
            new String[] {
		"T2220iwds1Main.java",
			    "\n" +
			    "public class T2220iwds1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2220iwds1 t = new Team2220iwds1();\n" +
			    "        T2220iwds1    o = new T2220iwds1();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2220iwds1.java",
			    "\n" +
			    "public class T2220iwds1 {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2220iwds1.java",
			    "\n" +
			    "public team class Team2220iwds1 {\n" +
			    "    public class Role2220iwds1 playedBy T2220iwds1 {\n" +
			    "        private int value = 0;\n" +
			    "\n" +
			    "        public void initializeRole() {\n" +
			    "            value++;\n" +
			    "        }\n" +
			    "\n" +
			    "        public abstract int getValue();\n" +
			    "        int getValue() -> int getValue() with {\n" +
			    "            result <- value\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public int getValue(T2220iwds1 as Role2220iwds1 obj) {\n" +
			    "        return obj.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "0");
    }

    // a role class has an initializeRole method with a signature that is not as required 2.2h
    // 2.2.20-otjld_obsolete-initializeRole-with-different-signature-2
    public void _obsolete_test2220_initializeRoleWithDifferentSignature2() {
       
       runConformTest(
            new String[] {
		"T2220iwds2Main.java",
			    "\n" +
			    "public class T2220iwds2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2220iwds2 t = new Team2220iwds2();\n" +
			    "        T2220iwds2    o = new T2220iwds2();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2220iwds2.java",
			    "\n" +
			    "public class T2220iwds2 {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2220iwds2.java",
			    "\n" +
			    "public team class Team2220iwds2 {\n" +
			    "    public class Role2220iwds2 playedBy T2220iwds2 {\n" +
			    "        private int value = 0;\n" +
			    "\n" +
			    "        void initializeRole() {\n" +
			    "            value++;\n" +
			    "        }\n" +
			    "\n" +
			    "        public abstract int getValue();\n" +
			    "        int getValue() -> int getValue() with {\n" +
			    "            result <- value\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public int getValue(T2220iwds2 as Role2220iwds2 obj) {\n" +
			    "        return obj.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "0");
    }

    // a role class has an initializeRole method with a signature that is not as required 2.2h
    // 2.2.20-otjld_obsolete-initializeRole-with-different-signature-3
    public void _obsolete_test2220_initializeRoleWithDifferentSignature3() {
       
       runConformTest(
            new String[] {
		"T2220iwds3Main.java",
			    "\n" +
			    "public class T2220iwds3Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2220iwds3 t = new Team2220iwds3();\n" +
			    "        T2220iwds3    o = new T2220iwds3();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2220iwds3.java",
			    "\n" +
			    "public class T2220iwds3 {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2220iwds3.java",
			    "\n" +
			    "public team class Team2220iwds3 {\n" +
			    "    public class Role2220iwds3 playedBy T2220iwds3 {\n" +
			    "        private int value = 0;\n" +
			    "\n" +
			    "        private void initializeRole() {\n" +
			    "            value++;\n" +
			    "        }\n" +
			    "\n" +
			    "        public abstract int getValue();\n" +
			    "        int getValue() -> int getValue() with {\n" +
			    "            result <- value\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public int getValue(T2220iwds3 as Role2220iwds3 obj) {\n" +
			    "        return obj.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "0");
    }

    // a role class has an initializeRole method with a signature that is not as required 2.2h
    // 2.2.20-otjld_obsolete-initializeRole-with-different-signature-4
    public void _obsolete_test2220_initializeRoleWithDifferentSignature4() {
       
       runConformTest(
            new String[] {
		"T2220iwds4Main.java",
			    "\n" +
			    "public class T2220iwds4Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2220iwds4 t = new Team2220iwds4();\n" +
			    "        T2220iwds4    o = new T2220iwds4();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2220iwds4.java",
			    "\n" +
			    "public class T2220iwds4 {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2220iwds4.java",
			    "\n" +
			    "public team class Team2220iwds4 {\n" +
			    "    public class Role2220iwds4 playedBy T2220iwds4 {\n" +
			    "        private int value = 0;\n" +
			    "\n" +
			    "        protected int initializeRole() {\n" +
			    "            value++;\n" +
			    "            return value;\n" +
			    "        }\n" +
			    "\n" +
			    "        public abstract int getValue();\n" +
			    "        int getValue() -> int getValue() with {\n" +
			    "            result <- value\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public int getValue(T2220iwds4 as Role2220iwds4 obj) {\n" +
			    "        return obj.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "0");
    }

    // a role class has an initializeRole method with a signature that is not as required 2.2h
    // 2.2.20-otjld_obsolete-initializeRole-with-different-signature-5
    public void _obsolete_test2220_initializeRoleWithDifferentSignature5() {
       
       runConformTest(
            new String[] {
		"T2220iwds5Main.java",
			    "\n" +
			    "public class T2220iwds5Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2220iwds5 t = new Team2220iwds5();\n" +
			    "        T2220iwds5    o = new T2220iwds5();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2220iwds5.java",
			    "\n" +
			    "public class T2220iwds5 {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2220iwds5.java",
			    "\n" +
			    "public team class Team2220iwds5 {\n" +
			    "    public class Role2220iwds5 playedBy T2220iwds5 {\n" +
			    "        private int value = 0;\n" +
			    "\n" +
			    "        protected void initializeRole(int arg) {\n" +
			    "            value++;\n" +
			    "        }\n" +
			    "\n" +
			    "        public abstract int getValue();\n" +
			    "        int getValue() -> int getValue() with {\n" +
			    "            result <- value\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public int getValue(T2220iwds5 as Role2220iwds5 obj) {\n" +
			    "        return obj.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "0");
    }

    // a role class has an initializeRole method that is called exactly once during subsequent lifting of the same base object in the same team
    // 2.2.22-otjld-role-with-initializeRole-method-1
    public void test2222_roleWithInitializeRoleMethod1() {
       
       runConformTest(
            new String[] {
		"T2222rwim1Main.java",
			    "\n" +
			    "public class T2222rwim1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2222rwim1 t = new Team2222rwim1();\n" +
			    "        T2222rwim1    o = new T2222rwim1();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2222rwim1.java",
			    "\n" +
			    "public class T2222rwim1 {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2222rwim1.java",
			    "\n" +
			    "public team class Team2222rwim1 {\n" +
			    "    private int value = 0;\n" +
			    "    public class Role2222rwim1 playedBy T2222rwim1 {\n" +
			    "\n" +
			    "        public Role2222rwim1(T2222rwim1 b) {\n" +
			    "            Team2222rwim1.this.value++;\n" +
			    "        }\n" +
			    "\n" +
			    "        public abstract int getValue();\n" +
			    "        int getValue() -> int getValue() with {\n" +
			    "            result <- Team2222rwim1.this.value\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    private Role2222rwim1 toRole(T2222rwim1 as Role2222rwim1 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public int getValue(T2222rwim1 obj) {\n" +
			    "        final Role2222rwim1 lifted1 = toRole(obj);\n" +
			    "        T2222rwim1          lowered = lifted1;\n" +
			    "        Role2222rwim1       lifted2 = toRole(lowered);\n" +
			    "\n" +
			    "        return lifted2.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "1");
    }

    // a role class has an initializeRole method that is called twice during subsequent lifting of the same base object to different roles in the same team
    // 2.2.22-otjld-role-with-initializeRole-method-2
    public void test2222_roleWithInitializeRoleMethod2() {
       
       runConformTest(
            new String[] {
		"T2222rwim2Main.java",
			    "\n" +
			    "public class T2222rwim2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2222rwim2 t = new Team2222rwim2();\n" +
			    "        T2222rwim2    o = new T2222rwim2();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2222rwim2.java",
			    "\n" +
			    "public class T2222rwim2 {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2222rwim2.java",
			    "\n" +
			    "public team class Team2222rwim2 {\n" +
			    "    private int value = 0;\n" +
			    "\n" +
			    "    public class Role2222rwim2_1 playedBy T2222rwim2 {\n" +
			    "\n" +
			    "        Role2222rwim2_1(T2222rwim2 b) {\n" +
			    "            Team2222rwim2.this.value++;\n" +
			    "        }\n" +
			    "\n" +
			    "        public abstract int getValue();\n" +
			    "        int getValue() -> int getValue() with {\n" +
			    "            result <- Team2222rwim2.this.value\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public class Role2222rwim2_2 playedBy T2222rwim2 {\n" +
			    "\n" +
			    "        Role2222rwim2_2(T2222rwim2 b) {\n" +
			    "            Team2222rwim2.this.value++;\n" +
			    "        }\n" +
			    "	}\n" +
			    "\n" +
			    "    private Role2222rwim2_1 role;\n" +
			    "\n" +
			    "    private Role2222rwim2_1 toRole(T2222rwim2 as Role2222rwim2_1 obj) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public int getValue(T2222rwim2 as Role2222rwim2_2 obj) {\n" +
			    "        T2222rwim2 lowered = obj;\n" +
			    "\n" +
			    "        // this should produce a different role object (of type Role2222rwim2_1) -> two calls to initializeRole\n" +
			    "        role = toRole(obj);        \n" +
			    "        return role.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "2");
    }

    // each class in a role hierarchy has its own default constructor, all of which are invoked
    // 2.2.23-otjld-role-hierarchy-with-initializeRole-methods
    public void test2223_roleHierarchyWithInitializeRoleMethods() {
       
       runConformTest(
            new String[] {
		"T2223rhwimMain.java",
			    "\n" +
			    "public class T2223rhwimMain {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2223rhwim t = new Team2223rhwim();\n" +
			    "        T2223rhwim_2  o = new T2223rhwim_2();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2223rhwim_1.java",
			    "\n" +
			    "public class T2223rhwim_1 {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2223rhwim_2.java",
			    "\n" +
			    "public class T2223rhwim_2 extends T2223rhwim_1 {}\n" +
			    "    \n",
		"Team2223rhwim.java",
			    "\n" +
			    "public team class Team2223rhwim {\n" +
			    "    protected int value = 0;\n" +
			    "\n" +
			    "    public abstract class Role2223rhwim_1  {\n" +
			    "        Role2223rhwim_1() {\n" +
			    "            Team2223rhwim.this.value++;\n" +
			    "        }\n" +
			    "\n" +
			    "        public abstract int getValue();\n" +
			    "    }\n" +
			    "\n" +
			    "    public class Role2223rhwim_2 extends Role2223rhwim_1 playedBy T2223rhwim_2 {\n" +
			    "        Role2223rhwim_2(T2223rhwim_2 b) {\n" +
			    "            Team2223rhwim.this.value++;\n" +
			    "        }\n" +
			    "        int getValue() -> int getValue() with {\n" +
			    "            result <- Team2223rhwim.this.value\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public class Role2223rhwim_3 extends Role2223rhwim_2 {\n" +
			    "        Role2223rhwim_3(T2223rhwim_2 b) {\n" +
			    "            Team2223rhwim.this.value++;\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public int getValue(T2223rhwim_2 as Role2223rhwim_3 obj) {\n" +
			    "        return obj.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "3");
    }

    // a role hierarchy with initializeRole methods containing super-calls
    // 2.2.24-otjld-role-hierarchy-with-initializeRole-methods
    public void test2224_roleHierarchyWithInitializeRoleMethods() {
       
       runConformTest(
            new String[] {
		"T2224rhwimMain.java",
			    "\n" +
			    "public class T2224rhwimMain {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2224rhwim_2 t = new Team2224rhwim_2();\n" +
			    "        T2224rhwim      o = new T2224rhwim();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2224rhwim.java",
			    "\n" +
			    "public class T2224rhwim {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2224rhwim_1.java",
			    "\n" +
			    "public team class Team2224rhwim_1 {\n" +
			    "    protected int value = 0;\n" +
			    "\n" +
			    "    public class Role2224rhwim_1 playedBy T2224rhwim {\n" +
			    "        Role2224rhwim_1(T2224rhwim b) {\n" +
			    "            Team2224rhwim_1.this.value++;\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public class Role2224rhwim_2 extends Role2224rhwim_1 {\n" +
			    "        // does not inherit lifting constructor\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2224rhwim_2.java",
			    "\n" +
			    "public team class Team2224rhwim_2 extends Team2224rhwim_1 {\n" +
			    "    public class Role2224rhwim_2 {\n" +
			    "		// overrides public default constructor\n" +
			    "        public Role2224rhwim_2(T2224rhwim b) {\n" +
			    "            tsuper(b);\n" +
			    "            Team2224rhwim_2.this.value++;\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public class Role2224rhwim_3 extends Role2224rhwim_2 {\n" +
			    "		// overrides public constructor\n" +
			    "        public Role2224rhwim_3(T2224rhwim b) {\n" +
			    "            super(b);\n" +
			    "            Team2224rhwim_2.this.value++;\n" +
			    "        }\n" +
			    "\n" +
			    "        public abstract int getValue();\n" +
			    "        int getValue() -> int getValue() with {\n" +
			    "            result <- Team2224rhwim_2.this.value\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public int getValue(T2224rhwim as Role2224rhwim_3 obj) {\n" +
			    "        return obj.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "3");
    }

    // the default lifting constructor is public so must all overrides
    // 2.2.24-otjld-restricting-constructor-visibility
    public void test2224_restrictingConstructorVisibility() {
        runNegativeTest(
            new String[] {
		"T2224rhwim2.java",
			    "\n" +
			    "public class T2224rhwim2 {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2224rhwim2_1.java",
			    "\n" +
			    "public team class Team2224rhwim2_1 {\n" +
			    "    protected int value = 0;\n" +
			    "\n" +
			    "    public class Role2224rhwim2_1 playedBy T2224rhwim2 {\n" +
			    "        Role2224rhwim2_1(T2224rhwim2 b) {\n" +
			    "            Team2224rhwim2_1.this.value++;\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public class Role2224rhwim2_2 extends Role2224rhwim2_1 {\n" +
			    "        // should inherit the initializeRole method\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2224rhwim2_2.java",
			    "\n" +
			    "public team class Team2224rhwim2_2 extends Team2224rhwim2_1 {\n" +
			    "    public class Role2224rhwim2_2 {\n" +
			    "		// try to override public default constructor\n" +
			    "        Role2224rhwim2_2(T2224rhwim2 b) {\n" +
			    "            tsuper(b);\n" +
			    "            Team2224rhwim2_2.this.value++;\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "	\n"
            },
            null);
    }

    // a role class inherited the initializeRole method which is called exactly once during lifting
    // 2.2.25-otjld-inherited-initializeRole-method
    public void test2225_inheritedInitializeRoleMethod() {
       
       runConformTest(
            new String[] {
		"T2225iimMain.java",
			    "\n" +
			    "public class T2225iimMain {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2225iim_2 t = new Team2225iim_2();\n" +
			    "        T2225iim      o = new T2225iim();\n" +
			    "\n" +
			    "        System.out.print(t.getValue(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2225iim.java",
			    "\n" +
			    "public class T2225iim {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2225iim_1.java",
			    "\n" +
			    "public team class Team2225iim_1 {\n" +
			    "    protected int value = 0;\n" +
			    "\n" +
			    "    public class Role2225iim_1 playedBy T2225iim {\n" +
			    "        Role2225iim_1(T2225iim b) {\n" +
			    "            Team2225iim_1.this.value++;\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public class Role2225iim_2 extends Role2225iim_1 {}\n" +
			    "}\n" +
			    "    \n",
		"Team2225iim_2.java",
			    "\n" +
			    "public team class Team2225iim_2 extends Team2225iim_1 {\n" +
			    "    public class Role2225iim_3 extends Role2225iim_2 {\n" +
			    "        public abstract int getValue();\n" +
			    "        int getValue() -> int getValue() with {\n" +
			    "            result <- Team2225iim_2.this.value\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public int getValue(T2225iim as Role2225iim_3 obj) {\n" +
			    "        return obj.getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "1");
    }

    // an array of base class objects is lifted to a role array, and for each lifted base object the initializeRole method is called
    // 2.2.27-otjld-array-lifting-calls-initializeRole-1
    public void test2227_arrayLiftingCallsInitializeRole1() {
       
       runConformTest(
            new String[] {
		"T2227alci1Main.java",
			    "\n" +
			    "public class T2227alci1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2227alci1 t = new Team2227alci1();\n" +
			    "        T2227alci1[]  o = { new T2227alci1(), new T2227alci1(), new T2227alci1() };\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2227alci1.java",
			    "\n" +
			    "public class T2227alci1 {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2227alci1.java",
			    "\n" +
			    "public team class Team2227alci1 {\n" +
			    "    protected int value = 0;\n" +
			    "\n" +
			    "    public class Role2227alci1_1 playedBy T2227alci1 {\n" +
			    "        Role2227alci1_1(T2227alci1 b) {\n" +
			    "            Team2227alci1.this.value++;\n" +
			    "        }\n" +
			    "    }\n" +
			    "\n" +
			    "    public class Role2227alci1_2 extends Role2227alci1_1 {}\n" +
			    "\n" +
			    "    private Role2227alci1_2[] toRoles(T2227alci1 as Role2227alci1_2 obj[]) {\n" +
			    "        return obj;\n" +
			    "    }\n" +
			    "\n" +
			    "    public int test(T2227alci1 as Role2227alci1_2 obj[]) {\n" +
			    "        T2227alci1[]      lowered = obj;\n" +
			    "        Role2227alci1_2[] lifted  = toRoles(lowered);\n" +
			    "\n" +
			    "        return value;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "3");
    }

    // an array of base class objects is lifted to a role array, and for each lifted base object the initializeRole method is called
    // 2.2.27-otjld-array-lifting-calls-initializeRole-2
    public void test2227_arrayLiftingCallsInitializeRole2() {
       
       runConformTest(
            new String[] {
		"T2227alci2Main.java",
			    "\n" +
			    "public class T2227alci2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2227alci2_2 t = new Team2227alci2_2();\n" +
			    "        T2227alci2_1[]  o = { new T2227alci2_1(), new T2227alci2_2(), new T2227alci2_1() };\n" +
			    "\n" +
			    "        System.out.print(t.test(o));\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2227alci2_1.java",
			    "\n" +
			    "public class T2227alci2_1 {\n" +
			    "    public int getValue() {\n" +
			    "        return 0;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2227alci2_2.java",
			    "\n" +
			    "public class T2227alci2_2 extends T2227alci2_1 {}\n" +
			    "    \n",
		"Team2227alci2_1.java",
			    "\n" +
			    "public team class Team2227alci2_1 {\n" +
			    "    protected int value = 0;\n" +
			    "\n" +
			    "    public class Role2227alci2_1 playedBy T2227alci2_1 {\n" +
			    "        Role2227alci2_1(T2227alci2_1 b) {\n" +
			    "            Team2227alci2_1.this.value++;\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2227alci2_2.java",
			    "\n" +
			    "public team class Team2227alci2_2 extends Team2227alci2_1 {\n" +
			    "    public class Role2227alci2_2 extends Role2227alci2_1 playedBy T2227alci2_2 {}\n" +
			    "\n" +
			    "    public int test(T2227alci2_1 as Role2227alci2_1 obj[]) {\n" +
			    "        return value;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "3");
    }

    // a constructor declares a parameter with lifting
    // 2.2.28-otjld-declared-lifting-in-construtor-1
    public void test2228_declaredLiftingInConstrutor1() {
       
       runConformTest(
            new String[] {
		"Team2228dlic1.java",
			    "\n" +
			    "public team class Team2228dlic1 {\n" +
			    "	String val=\"O\";\n" +
			    "	protected class R playedBy T2228dlic1 {\n" +
			    "		protected String getVa() {\n" +
			    "			return val;\n" +
			    "		}\n" +
			    "		protected abstract String getLue();\n" +
			    "		getLue -> getter;\n" +
			    "	}\n" +
			    "	public Team2228dlic1 (T2228dlic1 as R r) {\n" +
			    "		System.out.print(r.getVa()+r.getLue());\n" +
			    "	}\n" +
			    "	public static void main(String[] args) {\n" +
			    "		new Team2228dlic1(new T2228dlic1());\n" +
			    "	}\n" +
			    "}	\n" +
			    "	\n",
		"T2228dlic1.java",
			    "\n" +
			    "public class T2228dlic1 {\n" +
			    "	public String getter() { return \"K\"; }\n" +
			    "}\n" +
			    "	\n"
            },
            "OK");
    }

    // a constructor declares a parameter with lifting
    // 2.2.28-otjld-declared-lifting-in-construtor-2
    public void test2228_declaredLiftingInConstrutor2() {
       
       runConformTest(
            new String[] {
		"Team2228dlic2_2.java",
			    "\n" +
			    "public team class Team2228dlic2_2 extends Team2228dlic2_1 {\n" +
			    "	public Team2228dlic2_2 (T2228dlic2 as R r) {\n" +
			    "		super(r);\n" +
			    "		System.out.print(r.getLue());\n" +
			    "	}\n" +
			    "	public static void main(String[] args) {\n" +
			    "		new Team2228dlic2_2(new T2228dlic2());\n" +
			    "	}\n" +
			    "}	\n" +
			    "	\n",
		"T2228dlic2.java",
			    "\n" +
			    "public class T2228dlic2 {\n" +
			    "	public String getter() { return \"K\"; }\n" +
			    "}\n" +
			    "	\n",
		"Team2228dlic2_1.java",
			    "\n" +
			    "public team class Team2228dlic2_1 {\n" +
			    "	String val=\"O\";\n" +
			    "	protected class R playedBy T2228dlic2 {\n" +
			    "		protected String getVa() {\n" +
			    "			return val;\n" +
			    "		}\n" +
			    "		abstract public String getLue();\n" +
			    "		getLue -> getter;\n" +
			    "	}\n" +
			    "	public Team2228dlic2_1 (T2228dlic2 as R r) {\n" +
			    "		System.out.print(r.getVa());\n" +
			    "	}\n" +
			    "}\n" +
			    "	\n"
            },
            "OK");
    }

    // a constructor declares a parameter with lifting - invoking super with role type
    // 2.2.28-otjld-declared-lifting-in-construtor-3
    public void test2228_declaredLiftingInConstrutor3() {
       
       runConformTest(
            new String[] {
		"Team2228dlic3_2.java",
			    "\n" +
			    "public team class Team2228dlic3_2 extends Team2228dlic3_1 {\n" +
			    "	public Team2228dlic3_2 (T2228dlic3 as R r) {\n" +
			    "		super(r);\n" +
			    "		System.out.print(r.getLue());\n" +
			    "	}\n" +
			    "	public static void main(String[] args) {\n" +
			    "		new Team2228dlic3_2(new T2228dlic3());\n" +
			    "	}\n" +
			    "}	\n" +
			    "	\n",
		"T2228dlic3.java",
			    "\n" +
			    "public class T2228dlic3 {\n" +
			    "	public String getter() { return \"K\"; }\n" +
			    "}\n" +
			    "	\n",
		"Team2228dlic3_1.java",
			    "\n" +
			    "public team class Team2228dlic3_1 {\n" +
			    "	String val=\"O\";\n" +
			    "	protected class R playedBy T2228dlic3 {\n" +
			    "		protected String getVa() {\n" +
			    "			return val;\n" +
			    "		}\n" +
			    "		abstract public String getLue();\n" +
			    "		getLue -> getter;\n" +
			    "	}\n" +
			    "	public Team2228dlic3_1 (R r) {\n" +
			    "		System.out.print(r.getVa());\n" +
			    "	}\n" +
			    "}\n" +
			    "	\n"
            },
            "OK");
    }

    // a constructor uses a parameter with declared lifting, but the base type is invalid 
    // WITNESS for error reported in TPX-204 (fixed somewhere between 0.7.5 and 0.7.11)
    // 2.2.28-otjld-declared-lifting-in-construtor-4
    public void test2228_declaredLiftingInConstrutor4() {
        runNegativeTest(
            new String[] {
		"T2228dlic4.java",
			    " public class T2228dlic4 {} \n",
		"Team2228dlic4_2.java",
			    "\n" +
			    "public team class Team2228dlic4_2 {\n" +
			    "    protected class R playedBy T2228dlic4 {}\n" +
			    "    private Team2228dlic4_2(Erroneous as R o) { }\n" +
			    "}    \n" +
			    "    \n"
            },
            null);
    }

    // a constructor with declared lifting calls super with a role across several levels
    // 2.2.28-otjld-declared-lifting-in-constructor-5
    // Bug 326052 [compiler] problems with team ctors with declared lifting in specific inheritance situations 
    public void test2228_declaredLiftingInConstructor5() {
       
       runConformTest(
            new String[] {
		"Team2228dlic5_3.java",
			    "\n" +
			    "public team class Team2228dlic5_3 extends Team2228dlic5_2 {\n" +
			    "    public class R2 extends R playedBy T2228dlic5 {}\n" +
			    "    public Team2228dlic5_3(T2228dlic5 as R2 r) {\n" +
			    "        super(r);\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team2228dlic5_3(new T2228dlic5());\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"T2228dlic5.java",
			    "\n" +
			    "public class T2228dlic5 {}    \n" +
			    "    \n",
		"Team2228dlic5_1.java",
			    "\n" +
			    "public abstract team class Team2228dlic5_1 {\n" +
			    "    protected abstract class R {\n" +
			    "        protected abstract void test();\n" +
			    "    }\n" +
			    "    protected Team2228dlic5_1(R r) {\n" +
			    "        r.test();\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team2228dlic5_2.java",
			    "\n" +
			    "public team class Team2228dlic5_2 extends Team2228dlic5_1 {\n" +
			    "    protected class R {\n" +
			    "        protected void test() {\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        }\n" +
			    "    }\n" +
			    "    protected Team2228dlic5_2(R r) {\n" +
			    "        super(r);\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }

    // a constructor with declared lifting calls super with a role across several levels
    // witness for AssertionError during bytecode copy
    // 2.2.28-otjld-declared-lifting-in-constructor-5f
    public void test2228_declaredLiftingInConstructor5f() {
        runNegativeTest(
            new String[] {
		"Team2228dlic5f_1.java",
			    "\n" +
			    "public abstract team class Team2228dlic5f_1 {\n" +
			    "    protected abstract class R {\n" +
			    "        abstract void test();\n" +
			    "    }\n" +
			    "    protected Team2228dlic5f_1(R r) {\n" +
			    "        r.test(); // not visible, causes this ctor and all clients to fail\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2228dlic5f.java",
			    "\n" +
			    "public class T2228dlic5f {}\n" +
			    "    \n"
            },
            "----------\n" +
			"1. ERROR in Team2228dlic5f_1.java (at line 7)\n" +
			"	r.test(); // not visible, causes this ctor and all clients to fail\n" +
			"	  ^^^^\n" +
			"The method test() from the role type Team2228dlic5f_1.R is not visible (OTJLD 1.2.1(e)).\n" +
			"----------\n",
            null/*classLibs*/,
            false/*shouldFlushOutputDirectory*/,
            null/*customOptions*/,
            true/*generateOutput*/,
            false/*showCategory*/,
            false/*showWarningToken*/);
        runConformTest(
        	new String[] {
		"Team2228dlic5f_2.java",
			    "\n" +
			    "public team class Team2228dlic5f_2 extends Team2228dlic5f_1 {\n" +
			    "	 @Override\n" +
			    "    protected class R {\n" +
			    "	     @Override\n" +
			    "        void test() {\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        }\n" +
			    "    }\n" +
			    "    protected Team2228dlic5f_2(R r) {\n" +
			    "        super(r);\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2228dlic5f_3.java",
			    "\n" +
			    "public team class Team2228dlic5f_3 extends Team2228dlic5f_2 {\n" +
			    "    public class R2 extends R playedBy T2228dlic5f {}\n" +
			    "    public Team2228dlic5f_3(T2228dlic5f as R2 r) {\n" +
			    "        super(r);\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            ""/*expectedCompilerOutput*/,
            null/*classLibraries*/,
            false/*shouldFlushOutputDirectory*/,
            null/*vmArguments*/);
    }

    // a constructor with declared lifting calls super with a role across several levels - compiling in one go should not trigger compiler limitation (can't find super call)
    // 2.2.28-otjld-declared-lifting-in-constructor-5g
    public void test2228_declaredLiftingInConstructor5g() {
       
       runConformTest(
            new String[] {
		"Team2228dlic5g_3.java",
			    "\n" +
			    "public team class Team2228dlic5g_3 extends Team2228dlic5g_2 {\n" +
			    "    public class R2 extends R playedBy T2228dlic5g {}\n" +
			    "    public Team2228dlic5g_3(T2228dlic5g as R2 r) {\n" +
			    "        super(r);\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team2228dlic5g_3(new T2228dlic5g());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2228dlic5g.java",
			    "\n" +
			    "public class T2228dlic5g {}\n" +
			    "    \n",
		"Team2228dlic5g_1.java",
			    "\n" +
			    "public abstract team class Team2228dlic5g_1 {\n" +
			    "    protected abstract class R {\n" +
			    "        abstract protected void test();\n" +
			    "    }\n" +
			    "    protected Team2228dlic5g_1(R r) {\n" +
			    "        r.test();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2228dlic5g_2.java",
			    "\n" +
			    "public team class Team2228dlic5g_2 extends Team2228dlic5g_1 {\n" +
			    "    protected class R {\n" +
			    "        protected void test() {\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        }\n" +
			    "    }\n" +
			    "    protected Team2228dlic5g_2(R r) {\n" +
			    "        super(r);\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a constructor with declared lifting calls super with a role across several levels -- unsupported data flow
    // 2.2.28-otjld-declared-lifting-in-constructor-6
    // Bug 326052 [compiler] problems with team ctors with declared lifting in specific inheritance situations 
    public void _test2228_declaredLiftingInConstructor6() {
        runConformTest(
            new String[] {
		"Team2228dlic6_3.java",
			    "\n" +
			    "public team class Team2228dlic6_3 extends Team2228dlic6_2 {\n" +
			    "    public class R2 extends R playedBy T2228dlic6 {}\n" +
			    "    public Team2228dlic6_3(T2228dlic6 as R2 r) {\n" +
			    "        super(r);\n" +
			    "    }\n" +
			    "    public static void main(String... args) {\n" +
			    "		new Team2228dlic6_3(new T2228dlic6());\n" +
			    "	 }\n" +
			    "}    \n" +
			    "    \n",
		"T2228dlic6.java",
			    "\n" +
			    "public class T2228dlic6 {}    \n" +
			    "    \n",
		"Team2228dlic6_1.java",
			    "\n" +
			    "public abstract team class Team2228dlic6_1 {\n" +
			    "    protected abstract class R {\n" +
			    "        protected abstract void test();\n" +
			    "    }\n" +
			    "    protected Team2228dlic6_1(R r) {\n" +
			    "        r.test();\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team2228dlic6_2.java",
			    "\n" +
			    "public team class Team2228dlic6_2 extends Team2228dlic6_1 {\n" +
			    "    @Override\n" +
			    "    protected class R {\n" +
			    "        @Override\n" +
			    "        protected void test() {\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        }\n" +
			    "        protected R id() { return this; }\n" +
			    "    }\n" +
			    "    protected Team2228dlic6_2(R r) {\n" +
			    "        super(r.id());\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }

    // a constructor with declared lifting calls super with a role across several levels -- unsupported data flow
    // 2.2.28-otjld-declared-lifting-in-constructor-6l
    public void test2228_declaredLiftingInConstructor6l() {
        runConformTest(
                new String[] {
		"T2228dlic6l.java",
			    "\n" +
			    "public class T2228dlic6l {}    \n" +
			    "    \n",
		"Team2228dlic6l_1.java",
			    "\n" +
			    "public abstract team class Team2228dlic6l_1 {\n" +
			    "    protected abstract class R {\n" +
			    "        protected abstract void test();\n" +
			    "    }\n" +
			    "    protected Team2228dlic6l_1(R r) {\n" +
			    "        r.test();\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team2228dlic6l_2.java",
			    "\n" +
			    "public team class Team2228dlic6l_2 extends Team2228dlic6l_1 {\n" +
			    "    @Override\n" +
			    "    protected class R {\n" +
			    "        @Override\n" +
			    "        protected void test() {\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        }\n" +
			    "        protected R id() { return this; }\n" +
			    "    }\n" +
			    "    protected Team2228dlic6l_2(R r) {\n" +
			    "        super(r.id());\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n"
            });
        runNegativeTest(
            new String[] {
		"Team2228dlic6l_3.java",
			    "\n" +
			    "public team class Team2228dlic6l_3 extends Team2228dlic6l_2 {\n" +
			    "    public class R2 extends R playedBy T2228dlic6l {}\n" +
			    "    public Team2228dlic6l_3(T2228dlic6l as R2 r) {\n" +
			    "        super(r);\n" +
			    "    }\n" +
			    "}\n"
            },
            (this.weavingScheme == WeavingScheme.OTDRE || this.complianceLevel < ClassFileConstants.JDK1_8
            ?
            "----------\n" + 
    		"1. ERROR in Team2228dlic6l_3.java (at line 4)\n" + 
    		"	public Team2228dlic6l_3(T2228dlic6l as R2 r) {\n" + 
    		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
    		"Compiler limitation: This constructor seems to request lifting of an argument. However, the self call in Team2228dlic6l_2(R) of class Team2228dlic6l_2 passes its arguments in an unexpected way. Cannot perform required transitive byte-code translation.\n" + 
    		"----------\n"
    		:
            "----------\n" + 
    		"1. WARNING in Team2228dlic6l_3.java (at line 3)\n" + 
    		"	public class R2 extends R playedBy T2228dlic6l {}\n" + 
    		"	                                   ^^^^^^^^^^^\n" + 
    		"Base class T2228dlic6l has class file version 52 which cannot be handled by the traditional OTRE based on BCEL. Please consider using the ASM based OTDRE instead.\n" + 
            "----------\n" + 
    		"2. ERROR in Team2228dlic6l_3.java (at line 4)\n" + 
    		"	public Team2228dlic6l_3(T2228dlic6l as R2 r) {\n" + 
    		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
    		"Compiler limitation: This constructor seems to request lifting of an argument. However, the self call in Team2228dlic6l_2(R) of class Team2228dlic6l_2 passes its arguments in an unexpected way. Cannot perform required transitive byte-code translation.\n" + 
    		"----------\n"
            ),
        	null/*classLibraries*/,
        	false/*shouldFlushOutputDirectory*/);
    }

    // a constructor with declared lifting calls super with a role across several levels -- 
    // this version generated ICE("Binary method has no code attribute")
    // 2.2.28-otjld-declared-lifting-in-constructor-6f
    public void test2228_declaredLiftingInConstructor6f() {
        runNegativeTest(
            new String[] {
		"Team2228dlic6f_3.java",
			    "\n" +
			    "public team class Team2228dlic6f_3 extends Team2228dlic6f_2 {\n" +
			    "    public class R2 extends R playedBy T2228dlic6f {}\n" +
			    "    public Team2228dlic6f_3(T2228dlic6f as R2 r) {\n" +
			    "        super(r);\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2228dlic6f.java",
			    "\n" +
			    "public class T2228dlic6f {}\n" +
			    "    \n",
		"Team2228dlic6f_1.java",
			    "\n" +
			    "public abstract team class Team2228dlic6f_1 {\n" +
			    "    protected abstract class R {\n" +
			    "        abstract void test();\n" +
			    "    }\n" +
			    "    protected Team2228dlic6f_1(R r) {\n" +
			    "        r.test(); // not visible \n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2228dlic6f_2.java",
			    "\n" +
			    "public team class Team2228dlic6f_2 extends Team2228dlic6f_1 {\n" +
			    "    @Override\n" +
			    "    protected class R {\n" +
			    "       @Override\n" +
			    "        void test() {\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        }\n" +
			    "        R id() { return this; }\n" +
			    "    }\n" +
			    "    protected Team2228dlic6f_2(R r) {\n" +
			    "        super(r.id()); // not visible\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "----------\n" + 
    		"1. ERROR in Team2228dlic6f_1.java (at line 7)\n" + 
    		"	r.test(); // not visible \n" + 
    		"	  ^^^^\n" + 
    		"The method test() from the role type Team2228dlic6f_1.R is not visible (OTJLD 1.2.1(e)).\n" + 
    		"----------\n" + 
    		"----------\n" + 
    		"1. ERROR in Team2228dlic6f_2.java (at line 12)\n" + 
    		"	super(r.id()); // not visible\n" + 
    		"	        ^^\n" + 
    		"The method id() from the role type Team2228dlic6f_2.R is not visible (OTJLD 1.2.1(e)).\n" + 
    		"----------\n");
    }

    // a constructor with declared lifting calls super with a role across several levels  -- unsupported data flow
    // 2.2.28-otjld-declared-lifting-in-constructor-7
    // Bug 326052 [compiler] problems with team ctors with declared lifting in specific inheritance situations 
    public void _test2228_declaredLiftingInConstructor7() {
        runConformTest(
            new String[] {
		"Team2228dlic7_3.java",
			    "\n" +
			    "public team class Team2228dlic7_3 extends Team2228dlic7_2 {\n" +
			    "    public class R2 extends R playedBy T2228dlic7 {}\n" +
			    "    public Team2228dlic7_3(T2228dlic7 as R2 r) {\n" +
			    "        super(r);\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team2228dlic7_3(new T2228dlic7());\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"T2228dlic7.java",
			    "\n" +
			    "public class T2228dlic7 {}    \n" +
			    "    \n",
		"Team2228dlic7_1.java",
			    "\n" +
			    "public abstract team class Team2228dlic7_1 {\n" +
			    "    protected abstract class R {\n" +
			    "        protected abstract void test();\n" +
			    "    }\n" +
			    "    protected Team2228dlic7_1(int dummy, R r) {\n" +
			    "        r.test();\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team2228dlic7_2.java",
			    "\n" +
			    "public team class Team2228dlic7_2 extends Team2228dlic7_1 {\n" +
			    "    @Override\n" +
			    "    protected class R {\n" +
			    "    	 @Override\n" +
			    "        public void test() {\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        }\n" +
			    "    }\n" +
			    "    protected Team2228dlic7_2(R r) {\n" +
			    "        super(1, r);\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }
    
    // a constructor with declared lifting calls super with a role across several levels  -- unsupported data flow
    // 2.2.28-otjld-declared-lifting-in-constructor-7l
    public void test2228_declaredLiftingInConstructor7l() {
        runConformTest(
            new String[] {
		"T2228dlic7l.java",
			    "\n" +
			    "public class T2228dlic7l {}    \n" +
			    "    \n",
		"Team2228dlic7l_1.java",
			    "\n" +
			    "public abstract team class Team2228dlic7l_1 {\n" +
			    "    protected abstract class R {\n" +
			    "        protected abstract void test();\n" +
			    "    }\n" +
			    "    protected Team2228dlic7l_1(int dummy, R r) {\n" +
			    "        r.test();\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team2228dlic7l_2.java",
			    "\n" +
			    "public team class Team2228dlic7l_2 extends Team2228dlic7l_1 {\n" +
			    "    @Override\n" +
			    "    protected class R {\n" +
			    "    	 @Override\n" +
			    "        public void test() {\n" +
			    "            System.out.print(\"OK\");\n" +
			    "        }\n" +
			    "        R id() { return this; }\n" +
			    "    }\n" +
			    "    protected Team2228dlic7l_2(R r) {\n" +
			    "        super(1, r);\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n"
            },
            "",
            null/*classLibraries*/,
            false/*shouldFlushOutputDirectory*/,
            null/*vmArguments*/);
        
        runNegativeTest(
            new String[] {
		"Team2228dlic7l_3.java",
			    "\n" +
			    "public team class Team2228dlic7l_3 extends Team2228dlic7l_2 {\n" +
			    "    public class R2 extends R playedBy T2228dlic7l {}\n" +
			    "    public Team2228dlic7l_3(T2228dlic7l as R2 r) {\n" +
			    "        super(r);\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team2228dlic7l_3(new T2228dlic7l());\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n"
            },
            (this.weavingScheme == WeavingScheme.OTDRE || this.complianceLevel < ClassFileConstants.JDK1_8
            ?
            "----------\n" + 
    		"1. ERROR in Team2228dlic7l_3.java (at line 4)\n" + 
    		"	public Team2228dlic7l_3(T2228dlic7l as R2 r) {\n" + 
    		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
    		"Compiler limitation: This constructor seems to request lifting of an argument. However, the self call in Team2228dlic7l_2(R) of class Team2228dlic7l_2 passes its arguments in an unexpected way. Cannot perform required transitive byte-code translation.\n" + 
    		"----------\n"
    		:
    		"1. WARNING in Team2228dlic7l_3.java (at line 3)\n" + 
    		"	public class R2 extends R playedBy T2228dlic7l {}\n" + 
    		"	                                   ^^^^^^^^^^^\n" + 
    		"Base class T2228dlic7l has class file version 52 which cannot be handled by the traditional OTRE based on BCEL. Please consider using the ASM based OTDRE instead.\n" + 
            "----------\n" + 
    		"2. ERROR in Team2228dlic7l_3.java (at line 4)\n" + 
    		"	public Team2228dlic7l_3(T2228dlic7l as R2 r) {\n" + 
    		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
    		"Compiler limitation: This constructor seems to request lifting of an argument. However, the self call in Team2228dlic7l_2(R) of class Team2228dlic7l_2 passes its arguments in an unexpected way. Cannot perform required transitive byte-code translation.\n" + 
    		"----------\n"
        	),
            null/*classLibraries*/,
            false/*shouldFlushOutputDirectory*/);
    }
    // two roles are lifted, witness for a former AIOOBE in AnchorMapping
    // 2.2.28-otjld-declared-lifting-in-constructor-8
    public void test2228_declaredLiftingInConstructor8() {
       
       runConformTest(
            new String[] {
		"Team2228dlic8_2.java",
			    "\n" +
			    "public team class Team2228dlic8_2 extends Team2228dlic8_1 {\n" +
			    "    protected class R1 playedBy T2228dlic8_1 {\n" +
			    "        test1 -> test1;\n" +
			    "    }\n" +
			    "    protected class R2 playedBy T2228dlic8_2 {\n" +
			    "        test2 -> test2;\n" +
			    "    }\n" +
			    "    public Team2228dlic8_2(T2228dlic8_1 as R1 r1, T2228dlic8_2 as R2 r2) {\n" +
			    "        super(r1, r2);\n" +
			    "    }\n" +
			    "    // shorter ctor just to confuse the compiler:\n" +
			    "    public Team2228dlic8_2(T2228dlic8_1 as R1 r1) {\n" +
			    "        super(r1);\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team2228dlic8_2(new T2228dlic8_1(), new T2228dlic8_2());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2228dlic8_1.java",
			    "\n" +
			    "public class T2228dlic8_1 {\n" +
			    "    void test1() { System.out.print(\"OKI\"); }\n" +
			    "}\n" +
			    "    \n",
		"T2228dlic8_2.java",
			    "\n" +
			    "public class T2228dlic8_2 {\n" +
			    "    void test2() { System.out.print(\"DOKI\"); }\n" +
			    "}\n" +
			    "    \n",
		"Team2228dlic8_1.java",
			    "\n" +
			    "public team class Team2228dlic8_1 {\n" +
			    "    abstract protected class R1 {\n" +
			    "        abstract protected void test1();\n" +
			    "    }\n" +
			    "    abstract protected class R2 {\n" +
			    "        abstract protected void test2();\n" +
			    "    }\n" +
			    "    public Team2228dlic8_1(R1 r1, R2 r2) {\n" +
			    "        r1.test1();\n" +
			    "        r2.test2();\n" +
			    "    }\n" +
			    "    // shorter ctor just to confuse the compiler:\n" +
			    "    public Team2228dlic8_1(R1 r1) {\n" +
			    "        r1.test1();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OKIDOKI");
    }

    // a role is explicitly lowered
    // 2.2.29-otjld-explicit-lowering-1
    public void test2229_explicitLowering1() {
       
       runConformTest(
            new String[] {
		"Team2229el1.java",
			    "\n" +
			    "public team class Team2229el1 {\n" +
			    "	public class R implements ILowerable playedBy T2229el1 {\n" +
			    "	}\n" +
			    "	public Team2229el1 () {\n" +
			    "		R r = new R(new T2229el1(\"OK\"));\n" +
			    "		T2229el1 t = (T2229el1)r.lower();\n" +
			    "		System.out.print(t.getValue());\n" +
			    "	}\n" +
			    "	public static void main(String[] args) {\n" +
			    "		new Team2229el1();\n" +
			    "	}\n" +
			    "}\n" +
			    "	\n",
		"T2229el1.java",
			    "\n" +
			    "public class T2229el1 {\n" +
			    "	private String val = null;\n" +
			    "	public T2229el1(String v) { val = v; }\n" +
			    "	String getValue() { return val; }\n" +
			    "}\n" +
			    "	\n"
            },
            "OK");
    }

    // explicit lowering has the type of the bound base class
    // 2.2.29-otjld-explicit-lowering-2
    public void test2229_explicitLowering2() {
       
       runConformTest(
            new String[] {
		"Team2229el2.java",
			    "\n" +
			    "public team class Team2229el2 {\n" +
			    "    protected class R1 implements ILowerable playedBy T2229el2_1 {\n" +
			    "        protected R1(String v) {\n" +
			    "            base(v);\n" +
			    "        }\n" +
			    "    }\n" +
			    "    protected class R2 implements ILowerable playedBy T2229el2_1 {\n" +
			    "        protected R2(String v) {\n" +
			    "            base(v);\n" +
			    "        }\n" +
			    "    }\n" +
			    "    void test(T2229el2_2 target) {\n" +
			    "        R1 r1 = new R1(\"O\");\n" +
			    "        R2 r2 = new R2(\"K\");\n" +
			    "        target.test(r1.lower());\n" +
			    "        target.test(r2.lower());\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team2229el2().test(new T2229el2_2());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2229el2_1.java",
			    "\n" +
			    "public class T2229el2_1 {\n" +
			    "    String val;\n" +
			    "    public T2229el2_1(String v) { this.val = v; }\n" +
			    "    public void print() { System.out.print(this.val); }\n" +
			    "}\n" +
			    "    \n",
		"T2229el2_2.java",
			    "\n" +
			    "public class T2229el2_2 {\n" +
			    "    public void test(T2229el2_1 arg) {\n" +
			    "        arg.print();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an abstract bound role implements ILowerable
    // 2.2.29-otjld-explicit-lowering-3
    public void test2229_explicitLowering3() {
       
       runConformTest(
            new String[] {
		"Team2229el3.java",
			    "\n" +
			    "public team class Team2229el3  {\n" +
			    "    protected abstract class R0 implements ILowerable { }\n" +
			    "    protected class R1 extends R0 implements ILowerable playedBy T2229el3 {\n" +
			    "        public String toString() { return \"Wrong\"; }\n" +
			    "    }\n" +
			    "    public void test(T2229el3 as R0 r) {\n" +
			    "        System.out.print(r.lower());\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2229el3 t = new Team2229el3();\n" +
			    "        t.test(new T2229el3());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2229el3.java",
			    "\n" +
			    "public class T2229el3 {\n" +
			    "    public String toString() { return \"OK\"; }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // Bug 391290 - Internal compiler error/Corrupt byte code
    // witness for "tsuper has corrupt byte code" regarding call to _OT$getBase()
    public void test2229_explicitLowering4() {
    	runConformTest(
    		new String[] {
    			"Team2229el4_2.java",
    			"public team class Team2229el4_2 extends Team2229el4_1 {\n" +
    			"	public static void main(String[] args) {\n" +
    			"		new Team2229el4_2().test(new T2229el4());\n" +
    			"	}\n" +
    			"}\n",
    			"Team2229el4_1.java",
    			"public team class Team2229el4_1 {\n" +
    			"	protected class R implements ILowerable playedBy T2229el4 {\n" +
    			"		protected void test() {\n" +
    			"			this.lower().bar();\n" +
    			"		}\n" +
    			"	}\n" +
    			"	void test(T2229el4 as R r) { r.test(); }\n" +
    			"}\n",
    			"T2229el4.java",
    			"public class T2229el4 {\n" +
    			"	void bar() { System.out.print(\"OK\"); }\n" +
    			"}\n"
    		},
    		"OK");
    }

    // Bug 391290 - Internal compiler error/Corrupt byte code
    // positive case involving copy-inherited call to _OT$getBase()
    public void test2229_explicitLowering4b() {
    	runConformTest(
    		new String[] {
				"Team2229el4b_2.java",
				"public team class Team2229el4b_2 extends Team2229el4b_1 {\n" +
				"	public static void main(String[] args) {\n" +
				"		new Team2229el4b_2().test(new T2229el4b());\n" +
				"	}\n" +
				"}\n",
    			"Team2229el4b_1.java",
    			"public team class Team2229el4b_1 {" +
    			"	protected team class Mid {\n" +
    			"		protected class R playedBy T2229el4b {\n" +
    			"		}\n" +
    			"		protected void test(T2229el4b as R r) { " +
    			"			T2229el4b b = r;\n" +
    			"			b.bar();\n" +
    			"		}\n" +
    			"	}\n" +
    			"	public void test(T2229el4b b) {\n" +
    			"		new Mid().test(b);\n" +
    			"	}\n" +
    			"}\n",
    			"T2229el4b.java",
    			"public class T2229el4b {\n" +
    			"	void bar() { System.out.print(\"OK\"); }\n" +
    			"}\n",
    		},
    		"OK");
    }

    // a static team method tries to lift its parameter
    // 2.2.30-otjld-declared-lifting-in-static-method
    public void test2230_declaredLiftingInStaticMethod() {
        runNegativeTestMatching(
            new String[] {
		"Team2230dlism.java",
			    "\n" +
			    "public team class Team2230dlism {\n" +
			    "	protected class R playedBy T2230dlism {}\n" +
			    "	static void erroneous(T2230dlism as R o) {}\n" +
			    "}\n" +
			    "	\n",
		"T2230dlism.java",
			    "\n" +
			    "public class T2230dlism {\n" +
			    "}	\n" +
			    "	\n"
            },
            "----------\n" + 
    		"1. ERROR in Team2230dlism.java (at line 4)\n" + 
    		"	static void erroneous(T2230dlism as R o) {}\n" + 
    		"	                      ^^^^^^^^^^^^^^^\n" + 
    		"Illegal type for argument o: declared lifting not allowed in static methods (OTJLD 2.3.2(a)).\n" + 
    		"----------\n");
    }

    // a base object should be lifting before its ctor has finished (was TPX-487)
    // 2.2.31-otjld-lifting-uninitialized-object-1
    public void test2231_liftingUninitializedObject1() {
       
       runConformTest(
            new String[] {
		"Team2231luo1.java",
			    "\n" +
			    "public team class Team2231luo1 {\n" +
			    "    protected class R playedBy T2231luo1_2 {\n" +
			    "        void test() {\n" +
			    "            System.out.print(\"K\");\n" +
			    "        }\n" +
			    "        test <- after test;\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2231luo1 t = new Team2231luo1();\n" +
			    "        t.activate();\n" +
			    "        new T2231luo1_2();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2231luo1_1.java",
			    "\n" +
			    "public class T2231luo1_1 {\n" +
			    "    void test() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "    }\n" +
			    "    T2231luo1_1() {\n" +
			    "        test(); // dynamic call within ctor!\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2231luo1_2.java",
			    "\n" +
			    "public class T2231luo1_2 extends T2231luo1_1 {}\n" +
			    "    \n"
            },
            "OK");
    }

    // a base object should be lifting before its ctor has finished - replace
    // 2.2.31-otjld-lifting-uninitialized-object-2
    public void test2231_liftingUninitializedObject2() {
       
       runConformTest(
            new String[] {
		"Team2231luo2.java",
			    "\n" +
			    "public team class Team2231luo2 {\n" +
			    "    protected class R playedBy T2231luo2_2 {\n" +
			    "        callin void test() {\n" +
			    "            base.test();\n" +
			    "            System.out.print(\"K\");\n" +
			    "        }\n" +
			    "        test <- replace test;\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2231luo2 t = new Team2231luo2();\n" +
			    "        t.activate();\n" +
			    "        new T2231luo2_2().test();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2231luo2_1.java",
			    "\n" +
			    "public class T2231luo2_1 {\n" +
			    "    void test() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "    }\n" +
			    "    T2231luo2_1() {\n" +
			    "        test(); // dynamic call within ctor!\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2231luo2_2.java",
			    "\n" +
			    "public class T2231luo2_2 extends T2231luo2_1 {}\n" +
			    "    \n"
            },
            "OKOK");
    }

    // an abstract role class is bound to an abstract base class
    // 2.2.32-otjld-lifting-to-abstract-role-1
    public void test2232_liftingToAbstractRole1() {
       
       runConformTest(
            new String[] {
		"Team2232ltar1.java",
			    "import org.objectteams.LiftingFailedException;\n" +
			    "@SuppressWarnings(\"abstractrelevantrole\")\n" +
			    "public team class Team2232ltar1 {\n" +
			    "    protected abstract class R1 playedBy T2232ltar1_1 {\n" +
			    "        void test() -> void test();\n" +
			    "    }\n" +
			    "    protected class R2 extends R1 playedBy T2232ltar1_2 { }\n" +
			    "    Team2232ltar1(T2232ltar1_1 as R1 r) throws LiftingFailedException {\n" +
			    "        r.test();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) throws LiftingFailedException {\n" +
			    "        new Team2232ltar1(new T2232ltar1_2());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2232ltar1_1.java",
			    "\n" +
			    "public abstract class T2232ltar1_1 {\n" +
			    "    public abstract void test();\n" +
			    "}\n" +
			    "    \n",
		"T2232ltar1_2.java",
			    "\n" +
			    "public class T2232ltar1_2 extends T2232ltar1_1 {\n" +
			    "    public void test() {\n" +
			    "        System.out.print(\"OK\");\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role is explicitly created to a class that could not be produced by smart lifting, subsequent lifting callin fails
    // 2.2.33-otjld-explicit-creation-breaks-lifting-1
    public void test2233_explicitCreationBreaksLifting1() {
       
       runConformTest(
            new String[] {
		"Team2233ecbl1.java",
			    "\n" +
			    "public team class Team2233ecbl1 {\n" +
			    "    protected class R0 playedBy T2233ecbl1 {\n" +
			    "    }\n" +
			    "    protected class R1 extends R0 {\n" +
			    "        void rm() {\n" +
			    "            System.out.print(\"K\");\n" +
			    "        }\n" +
			    "        rm <- after bm;\n" +
			    "    }\n" +
			    "    Team2233ecbl1 (T2233ecbl1 b) {\n" +
			    "        this.activate();\n" +
			    "        new R0(b); // only effect: insert role into cache!\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        T2233ecbl1 b = new T2233ecbl1();\n" +
			    "        new Team2233ecbl1(b);\n" +
			    "        try {\n" +
			    "            b.bm();\n" +
			    "        } catch (org.objectteams.WrongRoleException wre) {\n" +
			    "            System.out.print(\"Caught\");\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2233ecbl1.java",
			    "\n" +
			    "public class T2233ecbl1 {\n" +
			    "    void bm() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OCaught");
    }

    // a nested team uses declared lifting, regular base class
    // 2.2.34-otjld-declared-lifting-in-nested-team-1
    public void test2234_declaredLiftingInNestedTeam1() {
       
       runConformTest(
            new String[] {
		"Team2234dlint1.java",
			    "\n" +
			    "public team class Team2234dlint1 {\n" +
			    "	public team class Inner {\n" +
			    "		protected class R playedBy T2234dlint1 {\n" +
			    "			void test() -> void test();\n" +
			    "		}\n" +
			    "		public void test(T2234dlint1 as R o) {\n" +
			    "			o.test();\n" +
			    "		}\n" +
			    "	}\n" +
			    "	void test() {\n" +
			    "		new Inner().test(new T2234dlint1());\n" +
			    "	}\n" +
			    "	public static void main(String[] args) {\n" +
			    "		new Team2234dlint1().test();\n" +
			    "	}\n" +
			    "}\n" +
			    "	\n",
		"T2234dlint1.java",
			    "\n" +
			    "public class T2234dlint1 {\n" +
			    "	public void test() {\n" +
			    "		System.out.print(\"OK\");\n" +
			    "	}\n" +
			    "}\n" +
			    "	\n"
            },
            "OK");
    }

    // a nested team uses declared lifting, base class is role of outer team
    // 2.2.34-otjld-declared-lifting-in-nested-team-2
    public void test2234_declaredLiftingInNestedTeam2() {
       
       runConformTest(
            new String[] {
		"Team2234dlint2.java",
			    "\n" +
			    "public team class Team2234dlint2 {\n" +
			    "	protected class OuterRole {\n" +
			    "		public void test() {\n" +
			    "			System.out.print(\"OK\");\n" +
			    "		}\n" +
			    "	}\n" +
			    "	public team class Inner {\n" +
			    "		protected class R playedBy OuterRole {\n" +
			    "			void test() -> void test();\n" +
			    "		}\n" +
			    "		public void test(OuterRole as R o) {\n" +
			    "			o.test();\n" +
			    "		}\n" +
			    "	}\n" +
			    "	void test() {\n" +
			    "		new Inner().test(new OuterRole());\n" +
			    "	}\n" +
			    "	public static void main(String[] args) {\n" +
			    "		new Team2234dlint2().test();\n" +
			    "	}\n" +
			    "}\n" +
			    "	\n"
            },
            "OK");
    }

    // a method call could be resolved both with and without lowering - role type is more specific than lowered base
    // 2.2.35-otjld-ambiguous-lowering-1
    public void test2235_ambiguousLowering1() {
       
       runConformTest(
            new String[] {
		"Team2235al1.java",
			    "\n" +
			    "public team class Team2235al1 {\n" +
			    "    protected class R playedBy T2235al1 { }\n" +
			    "    void test() {\n" +
			    "        m1(new R(new T2235al1()));\n" +
			    "    }\n" +
			    "    void m1(T2235al1 b) {\n" +
			    "        System.out.print(\"with lowering\");\n" +
			    "    }\n" +
			    "    void m1(R r) {\n" +
			    "        System.out.print(\"without lowering\");\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2235al1 t = new Team2235al1();\n" +
			    "        t.test();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2235al1.java",
			    "\n" +
			    "public class T2235al1 {}\n" +
			    "    \n"
            },
            "without lowering");
    }

    // a lifting participant creates roles using a custom constructor
    // 2.2.36-otjld-lifting-participant-1
    public void test2236_liftingParticipant1() {
       Map customOptions = getCompilerOptions();
       customOptions.put(CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, CompilerOptions.DISABLED);
       runConformTest(
            new String[] {
		"Team2236lp1.java",
			    "\n" +
			    "public team class Team2236lp1 {\n" +
			    "    protected class R playedBy T2236lp1_1 {\n" +
			    "        int n;\n" +
			    "        public R(T2236lp1_1 b, int n) {\n" +
			    "            this(b);\n" +
			    "            this.n = n;\n" +
			    "        }\n" +
			    "        public void identify() {\n" +
			    "            System.out.print(this.n);\n" +
			    "        }\n" +
			    "    }\n" +
			    "    protected class R2 extends R playedBy T2236lp1_2 {\n" +
			    "    }\n" +
			    "    void test(T2236lp1_1 as R o) {\n" +
			    "        o.identify();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team2236lp1 t = new Team2236lp1();\n" +
			    "        t.test(new T2236lp1_1());\n" +
			    "        t.test(new T2236lp1_1());\n" +
			    "        T2236lp1_1 b = new T2236lp1_1();\n" +
			    "        t.test(b);\n" +
			    "        t.test(b);\n" +
			    "        t.test(new T2236lp1_1());\n" +
			    "        t.test(new T2236lp1_2());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T2236lp1_1.java",
			    "\n" +
			    "public class T2236lp1_1 {\n" +
			    "}\n" +
			    "    \n",
		"T2236lp1_2.java",
			    "\n" +
			    "public class T2236lp1_2 extends T2236lp1_1 {\n" +
			    "}\n" +
			    "    \n",
		"lifter/T2236lp1Lifter.java",
			    "\n" +
			    "package lifter;\n" +
			    "import org.objectteams.ITeam;\n" +
			    "import java.lang.reflect.Constructor;\n" +
			    "public class T2236lp1Lifter implements org.objectteams.ILiftingParticipant {\n" +
			    "    int count = 1;\n" +
			    "    public Object createRole(ITeam teamInstance, Object base, String roleClassName) {\n" +
			    "        try {\n" +
			    "            Class<?> rc = Class.forName(roleClassName);\n" +
			    "            Constructor<?>[] ctors = rc.getDeclaredConstructors();\n" +
			    "            for (Constructor<?> ctor : ctors)\n" +
			    "                if (ctor.getParameterTypes().length == 3)\n" +
			    "                    return ctor.newInstance(new Object[]{teamInstance, base, count++});\n" +
			    "\n" +
			    "        } catch (Exception e) {\n" +
			    "            e.printStackTrace();\n" +
			    "        }\n" +
			    "        return null;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "123340",
            null/*classLibraries*/,
            true/*shouldFlushOutputDirectory*/,
            new String[] { "-Dot.lifting.participant=lifter.T2236lp1Lifter"}/*vmArguments*/,
            customOptions,
            null/*no custom requestor*/);
    }

    // a lifting participant creates a layered role using a custom constructor
    // 2.2.36-otjld-lifting-participant-2
    public void test2236_liftingParticipant2() {
       Map customOptions = getCompilerOptions();
       customOptions.put(CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, CompilerOptions.DISABLED);
       runConformTest(
            new String[] {
		"Team2236lp2_2.java",
			    "\n" +
			    "public team class Team2236lp2_2 {\n" +
			    "    final Team2236lp2_1 otherTeam = new Team2236lp2_1();\n" +
			    "    \n" +
			    "    protected class R playedBy RLower1<@otherTeam> {\n" +
			    "        int n;\n" +
			    "        public R(RLower1<@otherTeam> b, int n) {\n" +
			    "            this(b);\n" +
			    "            this.n = n;\n" +
			    "        }\n" +
			    "        public void identify() {\n" +
			    "            System.out.print(this.n);\n" +
			    "        }\n" +
			    "        identify <- after bm;\n" +
			    "    }\n" +
			    "    protected class R2 extends R playedBy RLower2<@otherTeam> {\n" +
			    "    }\n" +
			    "    protected void test(RLower1<@otherTeam> as R o) {\n" +
			    "        o.identify();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team2236lp2_2().runTests();\n" +
			    "    }\n" +
			    "    public void runTests() {\n" +
			    "        test(new RLower1<@otherTeam>());\n" +
			    "        test(new RLower1<@otherTeam>());\n" +
			    "        RLower1<@otherTeam> b = new RLower1<@otherTeam>();\n" +
			    "        test(b);\n" +
			    "        test(b);\n" +
			    "        test(new RLower1<@otherTeam>());\n" +
			    "        test(new RLower2<@otherTeam>());\n" +
			    "        this.activate();\n" +
			    "        new Team2236lp2_1().new RLower1().bm(); // LiftingVetoException prevents callin\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team2236lp2_1.java",
			    "\n" +
			    "public team class Team2236lp2_1 {\n" +
			    "    public class RLower1 { public void bm() {} }\n" +
			    "    public class RLower2 extends RLower1 {}\n" +
			    "}\n" +
			    "    \n",
		"lifter/T2236lp2Lifter.java",
			    "\n" +
			    "package lifter;\n" +
			    "import org.objectteams.ITeam;\n" +
			    "import java.lang.reflect.Constructor;\n" +
			    "public class T2236lp2Lifter implements org.objectteams.ILiftingParticipant {\n" +
			    "    int count = 1;\n" +
			    "    public Object createRole(ITeam teamInstance, Object base, String roleClassName) {\n" +
			    "        if (!roleClassName.startsWith(\"Team2236lp2_2$__OT__R\"))\n" +
			    "            System.err.println(\"wrong role class name \"+roleClassName);\n" +
			    "        try {\n" +
			    "            Class<?> rc = Class.forName(roleClassName);\n" +
			    "            Constructor<?>[] ctors = rc.getDeclaredConstructors();\n" +
			    "            for (Constructor<?> ctor : ctors)\n" +
			    "                if (ctor.getParameterTypes().length == 3)\n" +
			    "                    return ctor.newInstance(new Object[]{teamInstance, base, count++});\n" +
			    "\n" +
			    "        } catch (Exception e) {\n" +
			    "            e.printStackTrace();\n" +
			    "        }\n" +
			    "        return null;\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "123340",
            null/*classLibraries*/,
            true/*shouldFlushOutputDirectory*/,
            new String[]{ "-Dot.lifting.participant=lifter.T2236lp2Lifter" }/*vmArguments*/,
            customOptions,
            null/*no custom requestor*/);
    }
    public void test2237_instantiationPolicy1() {
    	runConformTest(
        	true/*flushOutputDir*/,
    		new String[] {
		"Team2237ip1.java",
				"import static org.objectteams.InstantiationPolicy.*;\n" +
				"import org.objectteams.Instantiation;\n" +
				"public team class Team2237ip1 {\n" +
				"    @Instantiation(ALWAYS)\n" +
				"    protected class R playedBy T2237ip1 {\n" +
				"        protected void test() -> void test();\n" +
				"		 equals => equals;\n" +
				"        hashCode => hashCode;\n" +
				"    }\n" +
				"    public void test(T2237ip1 as R o) {\n" +
				"        o.test();\n" +
				"    }\n" +
				"    public static void main(String... args) {\n" +
				"        Team2237ip1 t = new Team2237ip1();\n" +
				"        T2237ip1 b = new T2237ip1();\n" +
				"        t.test(b);\n" +
				"        t.test(b);\n" +
				"        System.out.print(t.getAllRoles().length);\n" +
				"    }\n" +
				"}\n",  
    	"T2237ip1.java",
    			"public class T2237ip1 {\n" +
    			"    void test() { System.out.print(\"OK\"); }\n" +
    			"}\n",
    		},
    		"", // explicitly check no warnings
    		"OKOK0",
    		"",
    		null/*no excuce*/);
    }
    public void test2237_instantiationPolicy2() {
    	runConformTest(
    		true/*flushOutputDir*/,
    		new String[] {
		"Team2237ip2.java",
				"import static org.objectteams.InstantiationPolicy.*;\n" +
				"import org.objectteams.Instantiation;\n" +
				"public team class Team2237ip2 {\n" +
				"    @Instantiation(ONDEMAND)\n" +
				"    protected class R playedBy T2237ip2 {\n" +
				"        protected void test() -> void test();\n" +
				"    }\n" +
				"    public void test(T2237ip2 as R o) {\n" +
				"        o.test();\n" +
				"    }\n" +
				"    public static void main(String... args) {\n" +
				"        Team2237ip2 t = new Team2237ip2();\n" +
				"        T2237ip2 b = new T2237ip2();\n" +
				"        t.test(b);\n" +
				"        t.test(b);\n" +
				"        System.out.print(t.getAllRoles().length);\n" +
				"    }\n" +
				"}\n",  
    	"T2237ip2.java",
    			"public class T2237ip2 {\n" +
    			"    void test() { System.out.print(\"OK\"); }\n" +
    			"}\n",
    		},
    		"",
    		"OKOK1",
    		"",
    		null/*no excuce*/);
    }

    public void test2237_instantiationPolicy3() {
    	runNegativeTest(
    		new String[] {
		"NotATeam2237ip3.java",
				"import static org.objectteams.InstantiationPolicy.*;\n" +
				"import org.objectteams.Instantiation;\n" +
				"public class NotATeam2237ip3 {\n" +
				"    @Instantiation(ONDEMAND)\n" +
				"    protected class R {\n" +
				"    }\n" +
				"}\n",  
    		},
    		"----------\n" + 
    		"1. ERROR in NotATeam2237ip3.java (at line 4)\n" + 
    		"	@Instantiation(ONDEMAND)\n" + 
    		"	^^^^^^^^^^^^^^\n" + 
    		"Annotation \'@Instantiation\' can only be applied to role classes (OTJLD 2.3.1(d)).\n" + 
    		"----------\n");
    }
    
    public void test2237_instantiationPolicy4() {
    	runNegativeTest(
    		new String[] {
		"Team2237ip4.java",
				"import static org.objectteams.InstantiationPolicy.*;\n" +
				"import org.objectteams.Instantiation;\n" +
				"public team class Team2237ip4 {\n" +
				"    @Instantiation(ALWAYS)\n" +
				"    protected class R {\n" +
				"        int val = 0;\n" +
				"    }\n" +
				"}\n",  
    		},
    		"----------\n" + 
    		"1. WARNING in Team2237ip4.java (at line 5)\n" + 
    		"	protected class R {\n" + 
    		"	                ^\n" + 
    		"Roles with InstantiationPolicy \'ALWAYS\' should define equals() and hashCode() methods (OTJLD 2.3.1(d)).\n" + 
    		"----------\n" + 
    		"2. WARNING in Team2237ip4.java (at line 6)\n" + 
    		"	int val = 0;\n" + 
    		"	    ^^^\n" + 
    		"Fields are discouraged in roles with InstantiationPolicy \'ALWAYS\' (OTJLD 2.3.1(d)).\n" + 
    		"----------\n");
    }

    // [compiler] resolve error re lifting constructor with implicit playedBy refinement
    public void testBug400833() {
    	runConformTest(
    		new String[] {
    			"to/TOuter.java",
    			"package to;\n" + 
    			"\n" + 
    			"\n" + 
    			"import base tb.TB1;\n" + 
    			"import base tb.TB2;\n" + 
    			"\n" + 
    			"public team class TOuter {\n" + 
    			"	public team class T1 playedBy TB1 {\n" + 
    			"		protected class R playedBy B<@base> { }\n" + 
    			"		/* added method */\n" + 
    			"		public void test() {\n" + 
    			"			new R(new B<@base>()); // works!\n" + 
    			"		}\n" + 
    			"	}\n" + 
    			"	public team class T2 extends T1  playedBy TB2 {\n" + 
    			"		@Override\n" +
    			"		protected class R playedBy B<@base> { }\n" + 
    			"		@Override\n" + 
    			"		public void test() {\n" + 
    			"			new R(new B<@base>());  // error!\n" + 
    			"		}\n" + 
    			"	}\n" +
    			"	void test(TB2 as T2 t2) {\n" +
    			"		t2.test();\n" +
    			"	}\n" +
    			"	public static void main(String... args) {\n" +
    			"		new TOuter().test(new tb.TB2());\n" +
    			"	}\n" + 
    			"}\n",
    			"tb/TB2.java",
    			"package tb;\n" +
    			"public team class TB2 extends TB1 {\n" +
    			"	@Override public class B {\n" +
    			"		public B() { System.out.print(\"OK\"); }\n" +
    			"	}\n" +
    			"}\n",
    			"tb/TB1.java",
    			"package tb;\n" +
    			"public team class TB1 {\n" +
    			"	public class B {}\n" +
    			"}\n",
    		},
    		"OK");
    }

    // [otdre] SneakyException spoils catching of LiftingVetoException
    public void testBug479687() {
    	runConformTest(
    		new String[] {
    			"MyTeam.java",
    			"import org.objectteams.LiftingVetoException;\n" +
    			"public team class MyTeam {\n" +
    			"	protected class R playedBy MyBase {\n" +
    			"		void throwingMethod() throws LiftingVetoException {\n" +
    			"			throw new LiftingVetoException();\n" +
    			"		}\n" +
    			"		throwingMethod <- before baseMethod;\n" +
    			"	}\n" +
    			"	public static void main(String... args) {\n" +
    			"		new MyTeam().activate();\n" +
    			"		new MyBase().baseMethod();\n" +
    			"	}\n" +
    			"}\n",
    			"MyBase.java",
    			"public class MyBase {\n" +
    			"	void baseMethod() {\n" +
    			"		System.out.print(\"base\");\n" +
    			"	}\n" +
    			"}\n"
    		},
    		"base");
    }
}
