/**********************************************************************
 * This file is part of "Object Teams Development Tooling"-Software
 * 
 * Copyright 2004, 2015 IT Service Omikron GmbH and others.
 * 
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Please visit http://www.eclipse.org/objectteams for updates and contact.
 * 
 * Contributors:
 * 	  Thomas Dudziak - Initial API and implementation
 * 	  Stephan Herrmann - Initial API and implementation
 **********************************************************************/
package org.eclipse.objectteams.otdt.tests.otjld.rolesandteams;


import java.util.Map;

import org.eclipse.jdt.internal.compiler.Compiler;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.objectteams.otdt.tests.otjld.AbstractOTJLDTest;

import junit.framework.Test;

/**
 * Former jacks tests from section file-structure (1.5.*)
 * @author stephan 
 */
@SuppressWarnings("unchecked")
public class FileStructure extends AbstractOTJLDTest {

	public FileStructure(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[] { "test1526_rofiTeamExtendsNonTeam1" };
//		TESTS_NUMBERS = new int[] { 1459 };
//		TESTS_RANGE = new int[] { 1097, -1 };
	}
	
	public static Test suite() {
		return buildComparableTestSuite(testClass());
	}

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

	// this suite depends on finding source files on disk to fetch required types in to the compilation
	@Override
	protected void compileTestFiles(Compiler batchCompiler, String[] testFiles) {
		myWriteFiles(testFiles);
		super.compileTestFiles(batchCompiler, testFiles);
	}

	// an externally stored role class uses a feature of its team class
    // 1.5.1-otjld-access-from-external-role
    public void test151_accessFromExternalRole() {
       
       runConformTest(
            new String[] {
		"T151aferMain.java",
			    "\n" +
			    "public class T151aferMain {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team151afer t = new Team151afer();\n" +
			    "\n" +
			    "        System.out.print(t.getValue());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team151afer.java",
			    "\n" +
			    "public team class Team151afer {\n" +
			    "\n" +
			    "    private String getValueInternal() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "\n" +
			    "    public String getValue() {\n" +
			    "        return new Role151afer().getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team151afer/Role151afer.java",
			    "\n" +
			    "team package Team151afer;\n" +
			    "\n" +
			    "protected class Role151afer {\n" +
			    "    public String getValue() {\n" +
			    "        return Team151afer.this.getValueInternal();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an externally stored role class uses a 'friendly' feature of a class in the same package as its team class
    // 1.5.2-otjld-access-from-external-role-1
    public void test152_accessFromExternalRole1() {
       
       runConformTest(
            new String[] {
		"T152afer1Main.java",
			    "\n" +
			    "public class T152afer1Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team152afer1 t = new Team152afer1();\n" +
			    "\n" +
			    "        System.out.print(t.getValue());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T152afer1.java",
			    "\n" +
			    "public class T152afer1 {\n" +
			    "    static String getValueInternal() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team152afer1.java",
			    "\n" +
			    "public team class Team152afer1 {\n" +
			    "    public String getValue() {\n" +
			    "        return new Role152afer1().getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team152afer1/Role152afer1.java",
			    "\n" +
			    "team package Team152afer1;\n" +
			    "\n" +
			    "protected class Role152afer1 {\n" +
			    "    public String getValue() {\n" +
			    "        return T152afer1.getValueInternal();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // an externally stored role class uses a 'friendly' feature of a class in the same package as its team class - different compile order
    // 1.5.2-otjld-access-from-external-role-2
    public void test152_accessFromExternalRole2() {
       this.compileOrder = new String[][] {{"T152afer2.java"},{"Team152afer2.java"},{"Team152afer2/Role152afer2.java"},{"T152afer2Main.java"}};
       runConformTest(
            new String[] {
		"T152afer2Main.java",
			    "\n" +
			    "public class T152afer2Main {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team152afer2 t = new Team152afer2();\n" +
			    "\n" +
			    "        System.out.print(t.getValue());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T152afer2.java",
			    "\n" +
			    "public class T152afer2 {\n" +
			    "    static String getValueInternal() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team152afer2/Role152afer2.java",
			    "\n" +
			    "team package Team152afer2;\n" +
			    "\n" +
			    "protected class Role152afer2 {\n" +
			    "    public String getValue() {\n" +
			    "        return T152afer2.getValueInternal();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team152afer2.java",
			    "\n" +
			    "public team class Team152afer2 {\n" +
			    "    public String getValue() {\n" +
			    "        return new Role152afer2().getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // variant with packages
    public void test152_accessFromExternalRole2b() {
       this.compileOrder = new String[][] {{"p1/T152afer2b.java"},{"p2/Team152afer2b.java"},{"p2/Team152afer2b/Role152afer2b.java"},{"T152afer2bMain.java"}};
       runConformTest(
            new String[] {
		"T152afer2bMain.java",
			    "import p2.Team152afer2b;\n" +
			    "public class T152afer2bMain {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team152afer2b t = new Team152afer2b();\n" +
			    "\n" +
			    "        System.out.print(t.getValue());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"p1/T152afer2b.java",
			    "package p1;\n" +
			    "public class T152afer2b {\n" +
			    "    public static String getValueInternal() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"p2/Team152afer2b/Role152afer2b.java",
			    "\n" +
			    "team package p2.Team152afer2b;\n" +
			    "import p1.T152afer2b;\n" +
			    "protected class Role152afer2b {\n" +
			    "    public String getValue() {\n" +
			    "        return T152afer2b.getValueInternal();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"p2/Team152afer2b.java",
			    "package p2;\n" +
			    "public team class Team152afer2b {\n" +
			    "    public String getValue() {\n" +
			    "        return new Role152afer2b().getValue();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // the name of a team equals the name of a subpackage
    // 1.5.3-otjld_testbug-subpackage-name-equals-team-name
    public void _testbug_test153_subpackageNameEqualsTeamName() {
        runNegativeTest(
            new String[] {
		"Team153snetn/T153snetn.java",
			    "\n" +
			    "// not a role class !\n" +
			    "public class T153snetn {\n" +
			    "    public static String getValue() {\n" +
			    "        return \"NOTOK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team153snetn.java",
			    "\n" +
			    "public team class Team153snetn {\n" +
			    "    private String value = T153snetn.getValue();\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // a role file has a mismatching package declaration - compile the team
    // 1.5.4-otjld-invalid-file-structure-1
    public void test154_invalidFileStructure1() {
        runNegativeTest(
            new String[] {
		"Team154ifs1.java",
			    "\n" +
			    "public team class Team154ifs1 {\n" +
			    "	Role154ifs1 r;\n" +
			    "}\n" +
			    "    \n",
		"Team154ifs1/Role154ifs1.java",
			    "\n" +
			    "team package wrong;\n" +
			    "public class Role154ifs1 {}\n" +
			    "    \n"
            },
            null);
    }

    // a role file has a mismatching package declaration - compile the role
    // 1.5.4-otjld-invalid-file-structure-2
    public void test154_invalidFileStructure2() {
        runNegativeTestMatching(
            new String[] {
		"Team154ifs2/Role154ifs2.java",
			    "\n" +
			    "team package wrong;\n" +
			    "public class Role154ifs2 {}\n" +
			    "    \n",
		"Team154ifs2.java",
			    "\n" +
			    "public team class Team154ifs2 {\n" +
			    "	Role154ifs2 r;\n" +
			    "}\n" +
			    "    \n"
            },
            "1.2.5(c)");
    }

    // a role file has a package declaration without 'team' - compile the team which references the role
    // 1.5.4-otjld-invalid-file-structure-3
    public void test154_invalidFileStructure3() {
        runNegativeTest(
            new String[] {
		"Team154ifs3.java",
			    "\n" +
			    "public team class Team154ifs3 {\n" +
			    "	Role154ifs3 r;\n" +
			    "}\n" +
			    "    \n",
		"Team154ifs3/Role154ifs3.java",
			    "\n" +
			    "package Team154ifs3;\n" +
			    "public class Role154ifs3 {}\n" +
			    "    \n"
            },
            null);
    }

    // a role file has a package declaration without 'team' - compile the role, which references the team
    // 1.5.4-otjld-invalid-file-structure-4
    public void test154_invalidFileStructure4() {
        runNegativeTest(
            new String[] {
		"Team154ifs4.java",
			    "\n" +
			    "public team class Team154ifs4 {}\n" +
			    "    \n",
		"Team154ifs4/Role154ifs4.java",
			    "\n" +
			    "package Team154ifs4;\n" +
			    "public class Role154ifs4 {\n" +
			    "	org.objectteams.Team t = Team154ifs4.this;\n" +
			    "}\n" +
			    "    \n"
            },
            null);
    }

    // a role file has a team package declaration but the team is missing
    // 1.5.4-otjld-invalid-file-structure-5
    public void test154_invalidFileStructure5() {
        runNegativeTestMatching(
            new String[] {
		"Team154ifs5/Role154ifs5.java",
			    "\n" +
			    "team package Team154ifs5;\n" +
			    "public class Role154ifs5 {\n" +
			    "        org.objectteams.Team t = Team154ifs5.this;\n" +
			    "}\n" +
			    "    \n"
            },
            "1.2.5(c)");
    }

    // a role file is compiled separately after its enclosing team - no problem ;-)
    // 1.5.5-otjld-invalid-compile-order-1
    public void test155_invalidCompileOrder1() {
    	this.compileOrder = new String[][] {{"Team155ico1.java"},{"Team155ico1/Role155ico1.java"}};
        runConformTest(
            new String[] {
		"Team155ico1.java",
			    "\n" +
			    "public team class Team155ico1 {}\n" +
			    "    \n",
		"Team155ico1/Role155ico1.java",
			    "\n" +
			    "team package Team155ico1;\n" +
			    "protected class Role155ico1 {}\n" +
			    "    \n"
            });
    }

    // a role file is compiled separately after its enclosing team - reading binary team
    // 1.5.5-otjld-invalid-compile-order-2
    public void test155_invalidCompileOrder2() {
    	this.compileOrder = new String[][] {{"Team155ico2.java"}, {"Team155ico2/Role155ico2.java", "T155icoMain2.java"}};
        runConformTest(
            new String[] {
		"T155icoMain2.java",
			    "\n" +
			    "public class T155icoMain2 {\n" +
			    "	final Team155ico2 t = null;\n" +
			    "   @SuppressWarnings(\"roletypesyntax\")\n" +
			    "	t.Role155ico2 r;\n" +
			    "}    \n" +
			    "    \n",
		"Team155ico2.java",
			    "\n" +
			    "public team class Team155ico2 {}\n" +
			    "    \n",
		"Team155ico2/Role155ico2.java",
			    "\n" +
			    "team package Team155ico2;\n" +
			    "public class Role155ico2 {}\n" +
			    "    \n"
            });
    }

    // a role file is compiled explicitely instead of its team
    // 1.5.6-otjld-explicit-compile-of-rolefile-1
    public void test156_explicitCompileOfRolefile1() {
       this.compileOrder = new String[][] {{"Team156ecor1/Role156ecor1.java"}, {"T156ecor1Main.java"}};
       // compiled implicitly via role:
       myWriteFiles(new String[] {"Team156ecor1.java",
			    "public team class Team156ecor1 {\n" +
			    "    public void test() {\n" +
			    "        System.out.print(new Role156ecor1().getValue());\n" +
			    "    }\n" +
			    "}\n"});
       runConformTest(
            new String[] {
		"T156ecor1Main.java",
			    "public class T156ecor1Main {\n" +
			    "    public static void main(String[] args){ \n" +
			    "        Team156ecor1 t = new Team156ecor1();\n" +
			    "        t.test();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
	    "Team156ecor1/Role156ecor1.java",
			    "team package Team156ecor1;\n" +
			    "protected class Role156ecor1 {\n" +
			    "    protected String getValue() {\n" +
			    "        return \"OK\";\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK",
            null,/*class libraries*/
            false,/*flushOutputDirectory*/
            null/*vmarguments*/);
    }

    // a role file is empty
    // 1.5.7-otjld-empty-role-file-1
    public void test157_emptyRoleFile1() {
        runConformTest(
            new String[] {
		"Team157erf1.java",
			    "\n" +
			    "public team class Team157erf1 {\n" +
			    "}    \n" +
			    "    \n",
		"Team157erf1/Role.java",
			    ""
            });
    }

    // a role file contains an interface
    // 1.5.8-otjld-interface-role-file-1
    public void test158_interfaceRoleFile1() {
       
       runConformTest(
            new String[] {
		"Team158irf1.java",
			    "\n" +
			    "public team class Team158irf1 {\n" +
			    "	public IR158irf1 getR() {\n" +
			    "		return new R158irf1(\"OK\");\n" +
			    "	}\n" +
			    "	public static void main (String[] args) {\n" +
			    "		final Team158irf1 t = new Team158irf1();\n" +
			    "		IR158irf1<@t> r = t.getR();\n" +
			    "		r.test();\n" +
			    "	}\n" +
			    "}\n" +
			    "	\n",
		"Team158irf1/R158irf1.java",
			    "\n" +
			    "team package Team158irf1;\n" +
			    "public class R158irf1 implements IR158irf1 {\n" +
			    "	String val;\n" +
			    "	protected R158irf1 (String v) { \n" +
			    "		val = v; \n" +
			    "	}\n" +
			    "	void test() { \n" +
			    "		System.out.print(val); \n" +
			    "	}\n" +
			    "}    \n" +
			    "	\n",
		"Team158irf1/IR158irf1.java",
			    "\n" +
			    "team package Team158irf1;\n" +
			    "public interface IR158irf1 {\n" +
			    "	void test();\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }

    // a role file contains an interface - class requested before the interface it implements (witness for "searching base class to early")
    // 1.5.8-otjld-interface-role-file-1f
    public void test158_interfaceRoleFile1f() {
        runConformTest(
            new String[] {
		"Team158irf1f.java",
			    "\n" +
			    "public team class Team158irf1f {\n" +
			    "    public Object getR() {\n" +
			    "        return new R158irf1f(\"OK\"); \n" +
			    "    }\n" +
			    "    public static void main (String[] args) {\n" +
			    "        final Team158irf1f t = new Team158irf1f();\n" +
			    "        Object r = t.getR();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team158irf1f/R158irf1f.java",
			    "\n" +
			    "team package Team158irf1f;\n" +
			    "public class R158irf1f implements IR158irf1f {\n" +
			    "    String val;\n" +
			    "    protected R158irf1f (String v) { \n" +
			    "        val = v; \n" +
			    "    }\n" +
			    "    void test() { \n" +
			    "        System.out.print(val); \n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team158irf1f/IR158irf1f.java",
			    "\n" +
			    "team package Team158irf1f;\n" +
			    "public interface IR158irf1f {\n" +
			    "    void test();\n" +
			    "}    \n" +
			    "    \n"
            });
    }

    // a role file contains an interface, class is inline
    // 1.5.8-otjld-interface-role-file-2
    public void test158_interfaceRoleFile2() {
       
       runConformTest(
            new String[] {
		"Team158irf2.java",
			    "\n" +
			    "public team class Team158irf2 {\n" +
			    "	public class R implements IR158irf2 {\n" +
			    "		String val;\n" +
			    "		protected R (String v) { \n" +
			    "			val = v; \n" +
			    "		}\n" +
			    "		void test() { \n" +
			    "			System.out.print(val); \n" +
			    "		}\n" +
			    "	}    \n" +
			    "	public IR158irf2 getR() {\n" +
			    "		return new R(\"OK\");\n" +
			    "	}\n" +
			    "	public static void main (String[] args) {\n" +
			    "		final Team158irf2 t = new Team158irf2();\n" +
			    "		IR158irf2<@t> r = t.getR();\n" +
			    "		r.test();\n" +
			    "	}\n" +
			    "}\n" +
			    "    \n",
		"Team158irf2/IR158irf2.java",
			    "\n" +
			    "team package Team158irf2;\n" +
			    "public interface IR158irf2 {\n" +
			    "	void test();\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }

    // a package (not team modifier) collides with a type
    // 1.5.9-otjld-package-collides-with-type-1
    public void test159_packageCollidesWithType1() {
        runNegativeTestMatching(
            new String[] {
		"p159/T159pcwt1/T159pcwt1_2.java",
			    "\n" +
			    "package p159.T159pcwt1;\n" +
			    "public class T159pcwt1_2 {\n" +
			    "}	\n" +
			    "	\n",
		"p159/T159pcwt1.java",
			    "\n" +
			    "package p159;\n" +
			    "public class T159pcwt1 {\n" +
			    "}	\n" +
			    "	\n"
            },
            "collides");
    }

    // a package (not team modifier) collides with a type -- have syntax errors
    // 1.5.9-otjld-package-collides-with-type-2
    public void test159_packageCollidesWithType2() {
        runNegativeTestMatching(
            new String[] {
		"p159/T159pcwt2/T159pcwt2_2.java",
			    "\n" +
			    "package p159.T159pcwt2;\n" +
			    "public class T159pcwt2_2 {\n" +
			    "	void();\n" +
			    "}	\n" +
			    "	\n",
		"p159/T159pcwt2.java",
			    "\n" +
			    "package p159;\n" +
			    "public class T159pcwt2 {\n" +
			    "}	\n" +
			    "	\n"
            },
            "collides");
    }

    // a team package has to be recognized despite of syntax errors
    // 1.5.9-otjld-package-collides-with-type-3
    public void test159_packageCollidesWithType3() {
        runNegativeTestMatching(
            new String[] {
		"p159/T159pcwt3/T159pcwt3_1.java",
			    "\n" +
			    "team package p159.T159pcwt3;\n" +
			    "public class T159pcwt3_1 {\n" +
			    "	void();\n" +
			    "}	\n" +
			    "	\n",
		"p159/T159pcwt3.java",
			    "\n" +
			    "package p159;\n" +
			    "public team class T159pcwt3 {\n" +
			    "}	\n" +
			    "	\n"
            },
            "Syntax");
    }

    // a nested role file team extends its enclosing
    // 1.5.10-otjld-circular-containment-and-extends-1
    public void test1510_circularContainmentAndExtends1() {
        runNegativeTestMatching(
            new String[] {
		"p1510/Team1510ccae1_1/Team1510ccae1_2.java",
			    "\n" +
			    "team package p1510.Team1510ccae1_1;    \n" +
			    "public team class Team1510ccae1_2 extends Team1510ccae1_1 {\n" +
			    "    public class R {}\n" +
			    "}\n" +
			    "    \n",
		"p1510/Team1510ccae1_1.java",
			    "\n" +
			    "package p1510;    \n" +
			    "public team class Team1510ccae1_1 {\n" +
			    "}    \n" +
			    "    \n"
            },
            "1.5(c)");
    }

    // a role file's class name doesn't match the filename -- WITNESS for TPX-287
    // 1.5.11-otjld-wrong-classname-in-rolefile-1
    public void test1511_wrongClassnameInRolefile1() {
        runNegativeTestMatching(
            new String[] {
		"Team1511wcir1/R1511wcir1.java",
			    "\n" +
			    "team package Team1511wcir1;\n" +
			    "public class R {\n" +
			    "}	\n" +
			    "	\n",
		"Team1511wcir1.java",
			    "\n" +
			    "public team class Team1511wcir1 {\n" +
			    "	public R myRole;\n" +
			    "}	\n" +
			    "	\n"
            },
            "1.2.5(b)");
    }

    // a type is resolved via a role file's import - field declaration
    // 1.5.11-otjld-role-file-import-1
    public void test1511_roleFileImport1() {
    	myWriteFiles(
    		new String[] {
    	"Team1511rfi1.java",
    			"public team class Team1511rfi1 {}    \n"
    		});
        runConformTest(
            new String[] {
        "T1511rfi1Main.java",
				"public class T1511rfi1Main {\n" +
				"	 public static void main(String... args) {\n" +
				"		 System.out.println(\"OK\");\n" +
				"	 }\n" +
				"}\n",
		"Team1511rfi1/R1511rfi1.java",
			    "team package Team1511rfi1;\n" +
			    "import java.util.Collection;\n" +
			    "public class R1511rfi1 {\n" +
			    "    Collection<String> field;\n" +
			    "}\n"
            },
		    null, /*expectedOutput*/
            null,/*class libraries*/
            false,/*flushOutputDirectory*/
            null/*vmarguments*/
        );
    }

    // a type is resolved via a role file's import - callout binding
    // 1.5.11-otjld-role-file-import-2
    public void test1511_roleFileImport2() {
        Map customOptions = getCompilerOptions();
        customOptions.put(CompilerOptions.OPTION_ReportWeaveIntoSystemClass, CompilerOptions.WARNING);
        myWriteFiles(
        	new String[] {
        "Team1511rfi2.java",
			    "import java.util.Collection;\n" +
			    "public team class Team1511rfi2 {}\n"
			});
        runTestExpectingWarnings(
            new String[] {
        "T1511rfi2Main.java",
        		"public class T1511rfi2Main {\n" +
        		"	 public static void main(String... args) {\n" +
        		"		 System.out.println(\"OK\");\n" +
        		"	 }\n" +
        		"}\n",
		"Team1511rfi2/R1511rfi2.java",
			    "\n" +
			    "team package Team1511rfi2;\n" +
			    "import java.util.LinkedList;\n" +
			    "@SuppressWarnings({\"rawtypes\",\"unchecked\",\"bindingconventions\"})\n" +
			    "public class R1511rfi2 playedBy LinkedList {\n" +
			    "    boolean addAll(Collection c) -> boolean addAll(Collection c);\n" +
			    "}\n"
            },
            "----------\n" + 
    		"1. WARNING in Team1511rfi2\\R1511rfi2.java (at line 5)\n" + 
    		"	public class R1511rfi2 playedBy LinkedList {\n" + 
    		"	                                ^^^^^^^^^^\n" + 
    		"Base class java.util.LinkedList appears to be a system class, which means that load time weaving could possibly fail\n" + 
    		"if this class is loaded from rt.jar/the bootstrap classpath.\n" + 
    		"----------\n",
            false);
    }

    // a role file uses a static import - method
    // 1.5.11-otjld-role-file-import-3
    public void test1511_roleFileImport3() {
    	myWriteFiles(new String[] {
		"Team1511rfi3.java",
			    "public team class Team1511rfi3 {}\n"
    		});
        runConformTest(
            new String[] {
        "T1511rfi3Main.java",
        		"public class T1511rfi3Main {\n" +
        		"	 public static void main(String... args) {\n" +
        		"		 System.out.println(\"OK\");\n" +
        		"	 }\n" +
        		"}\n",
		"Team1511rfi3/Role1511rfi3.java",
			    "team package Team1511rfi3;\n" +
			    "import static java.lang.Math.abs;\n" +
			    "protected class Role1511rfi3 {\n" +
			    "    int i= abs(-1);\n" +
			    "}\n"
            },
		    null, /*expectedOutput*/
            null,/*class libraries*/
            false,/*flushOutputDirectory*/
            null/*vmarguments*/);
    }

    // a nested role file uses a static import - field
    // 1.5.11-otjld-role-file-import-4
    public void test1511_roleFileImport4() {
    	myWriteFiles(new String[] {"Team1511rfi4.java",
			    "\n" +
			    "public team class Team1511rfi4 {\n" +
			    "    protected team class Inner {}\n" +
			    "}\n"
			 });
        runConformTest(
            new String[] {
        "T1511rfi4Main.java",
        		"public class T1511rfi4Main {\n" +
        		"	 public static void main(String... args) {\n" +
        		"		 System.out.println(\"OK\");\n" +
        		"	 }\n" +
        		"}\n",
		"Team1511rfi4/Inner/Role1511rfi4.java",
			    "\n" +
			    "team package Team1511rfi4.Inner;\n" +
			    "import static java.lang.Math.PI;\n" +
			    "protected class Role1511rfi4 {\n" +
			    "    double i= PI;\n" +
			    "}\n"
            },
		    null, /*expectedOutput*/
            null,/*class libraries*/
            false,/*flushOutputDirectory*/
            null/*vmarguments*/);
    }

    // a base classes is base imported in the role file - wrong
    // 1.5.11-otjld-role-file-import-5
    public void test1511_roleFileImport5() {
        runNegativeTestMatching(
            new String[] {
		"Team1511rfi5/R1511rfi5.java",
			    "\n" +
			    "team package Team1511rfi5;\n" +
			    "import base pbase.T1511rfi5;\n" +
			    "protected class R1511rfi5 playedBy T1511rfi5 {}\n" +
			    "    \n",
		"pbase/T1511rfi5.java",
			    "\n" +
			    "package pbase;\n" +
			    "public class T1511rfi5 {}\n" +
			    "    \n",
		"Team1511rfi5.java",
			    "\n" +
			    "public team class Team1511rfi5 {\n" +
			    "}\n" +
			    "    \n"
            },
            "----------\n" + 
    		"1. ERROR in Team1511rfi5\\R1511rfi5.java (at line 3)\n" + 
    		"	import base pbase.T1511rfi5;\n" + 
    		"	            ^^^^^^^^^^^^^^^\n" + 
    		"\"base\" import is not allowed in a role file (OTJLD 2.1.2(d)).\n" + 
    		"----------\n" + 
    		"2. ERROR in Team1511rfi5\\R1511rfi5.java (at line 4)\n" + 
    		"	protected class R1511rfi5 playedBy T1511rfi5 {}\n" + 
    		"	                                   ^^^^^^^^^\n" + 
    		"T1511rfi5 cannot be resolved to a type\n" + 
    		"----------\n");
    }

    // a base classes is base imported in the team file - correct
    // 1.5.11-otjld-role-file-import-6
    public void test1511_roleFileImport6() {
    	myWriteFiles(
    		new String[] {
    	"Team1511rfi6.java",
			    "import base pbase.T1511rfi6; // base class of role file\n" +
			    "public team class Team1511rfi6 {\n" +
			    "}\n"
    		});
    	this.compileOrder = new String[][] {{"pbase/T1511rfi6.java"}, {"Team1511rfi6/R1511rfi6.java"}};
        runConformTest(
            new String[] {
		"pbase/T1511rfi6.java",
			    "\n" +
			    "package pbase;\n" +
			    "public class T1511rfi6 {}\n",
		"Team1511rfi6/R1511rfi6.java",
			    "team package Team1511rfi6;\n" +
			    "protected class R1511rfi6 playedBy T1511rfi6 {}\n"
            },
		    null, /*expectedOutput*/
            null,/*class libraries*/
            false,/*flushOutputDirectory*/
            null/*vmarguments*/);
    }

    // a team tries to exploit an import of its role file
    // 1.5.11-otjld-role-file-import-7
    public void test1511_roleFileImport7() {
        runNegativeTestMatching(
            new String[] {
		"Team1511rfi7.java",
			    "\n" +
			    "public team class Team1511rfi7 {\n" +
			    "    void foo(R1511rfi7 r) {\n" +
			    "        LinkedList<R1511rfi7> roles = new LinkedList<R1511rfi7>();\n" +
			    "        roles.append(r);\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team1511rfi7/R1511rfi7.java",
			    "\n" +
			    "team package Team1511rfi7;\n" +
			    "import java.util.LinkedList;\n" +
			    "protected class R1511rfi7 {}\n" +
			    "    \n"
            },
            "----------\n" + 
    		"1. ERROR in Team1511rfi7.java (at line 4)\n" + 
    		"	LinkedList<R1511rfi7> roles = new LinkedList<R1511rfi7>();\n" + 
    		"	^^^^^^^^^^\n" + 
    		"LinkedList cannot be resolved to a type\n" + 
    		"----------\n" + 
    		"2. ERROR in Team1511rfi7.java (at line 4)\n" + 
    		"	LinkedList<R1511rfi7> roles = new LinkedList<R1511rfi7>();\n" + 
    		"	                                  ^^^^^^^^^^\n" + 
    		"LinkedList cannot be resolved to a type\n" + 
    		"----------\n");
    }

    // role files are compiled indirectly
    // 1.5.12-otjld-role-file-compile-order-1
    public void test1512_roleFileCompileOrder1() {
       
       runConformTest(
            new String[] {
		"Team1512rfco1.java",
			    "\n" +
			    "public team class Team1512rfco1 {\n" +
			    "    Team1512rfco1() {\n" +
			    "        R1 r = new R1(new T1512rfco1());\n" +
			    "        r.test();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team1512rfco1();\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"T1512rfco1.java",
			    "\n" +
			    "public class T1512rfco1 {\n" +
			    "}    \n" +
			    "    \n",
		"Team1512rfco1/R1.java",
			    "\n" +
			    "team package Team1512rfco1;\n" +
			    "public class R1 playedBy T1512rfco1 {\n" +
			    "    public void test() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "        R2 r = new R2(new T1512rfco1());\n" +
			    "        r.test();\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team1512rfco1/R2.java",
			    "\n" +
			    "team package Team1512rfco1;\n" +
			    "public class R2 playedBy T1512rfco1 {\n" +
			    "    protected void test() {\n" +
			    "        System.out.print(\"K\");\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }

    // role files are compiled indirectly - extending each other
    // 1.5.12-otjld-role-file-compile-order-2
    public void test1512_roleFileCompileOrder2() {
       
       runConformTest(
            new String[] {
		"Team1512rfco2.java",
			    "\n" +
			    "public team class Team1512rfco2 {\n" +
			    "    Team1512rfco2() {\n" +
			    "        R2 r = new R2(new T1512rfco2());\n" +
			    "        r.test();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team1512rfco2();\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"T1512rfco2.java",
			    "\n" +
			    "public class T1512rfco2 {\n" +
			    "}    \n" +
			    "    \n",
		"Team1512rfco2/R1.java",
			    "\n" +
			    "team package Team1512rfco2;\n" +
			    "public class R1 playedBy T1512rfco2 {\n" +
			    "    void test() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team1512rfco2/R2.java",
			    "\n" +
			    "team package Team1512rfco2;\n" +
			    "public class R2 extends R1 {\n" +
			    "    protected void test() {\n" +
			    "	super.test();\n" +
			    "        System.out.print(\"K\");\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }

    // role files (unbound) are compiled indirectly - extending each other
    // 1.5.12-otjld-role-file-compile-order-3
    public void test1512_roleFileCompileOrder3() {
       
       runConformTest(
            new String[] {
		"Team1512rfco3.java",
			    "\n" +
			    "public team class Team1512rfco3 {\n" +
			    "    Team1512rfco3() {\n" +
			    "        R2 r = new R2();\n" +
			    "        r.test();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team1512rfco3();\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team1512rfco3/R2.java",
			    "\n" +
			    "team package Team1512rfco3;\n" +
			    "public class R2 extends R1 {\n" +
			    "    public void test() {\n" +
			    "	super.test();\n" +
			    "        System.out.print(\"K\");\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team1512rfco3/R1.java",
			    "\n" +
			    "team package Team1512rfco3;\n" +
			    "public class R1 {\n" +
			    "    void test() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }

    // an enum is defined in a role file
    // 1.5.13-otjld-wrong-type-in-rolefile-1
    public void test1513_wrongTypeInRolefile1() {
        runNegativeTestMatching(
            new String[] {
		"Team1513wtir1/R1513wtir1.java",
			    "\n" +
			    "team package Team1513wtir1;\n" +
			    "enum R1513wtri1 { WRONG, WORSE } \n" +
			    "    \n",
		"Team1513wtir1.java",
			    "\n" +
			    "public team class Team1513wtir1 {}\n" +
			    "    \n"
            },
            "1.2.5(e)");
    }

    // a role file imports its base class which is not visible to the team
    // 1.5.14-otjld-role-file-scope-1
    public void test1514_roleFileScope1() {
       
       runConformTest(
            new String[] {
		"p2/Team1514rfs1.java",
			    "\n" +
			    "package p2;\n" +
			    "public team class Team1514rfs1 {\n" +
			    "    Team1514rfs1() {\n" +
			    "        new R().test();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team1514rfs1();\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"p1/T1514rfs1.java",
			    "\n" +
			    "package p1;    \n" +
			    "public class T1514rfs1 {\n" +
			    "}\n" +
			    "    \n",
		"p2/Team1514rfs1/R.java",
			    "\n" +
			    "team package p2.Team1514rfs1;\n" +
			    "import p1.T1514rfs1;\n" +
			    "@SuppressWarnings(\"bindingconventions\")\n" +
			    "protected class R playedBy T1514rfs1 {\n" +
			    "    protected R() { \n" +
			    "        this(new T1514rfs1());\n" +
			    "    }\n" +
			    "    R(T1514rfs1 b) {\n" +
			    "        // nop just hand writting lifting ctor.\n" +
			    "    }\n" +
			    "    protected void test() {\n" +
			    "        System.out.print(\"OK\");\n" +
			    "    }\n" +
			    "}\n" +
			    "        \n" +
			    "    \n"
            },
            "OK");
    }

    // a role file defines a callin - one compilation
    // 1.5.15-otjld-callin-into-rolefile-1
    public void test1515_callinIntoRolefile1() {
       
       runConformTest(
            new String[] {
		"Team1515cir1.java",
			    "\n" +
			    "public team class Team1515cir1 {\n" +
			    "    R r; // yikes still needed to 'load' the role file?\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team1515cir1().activate();\n" +
			    "        new T1515cir1().o();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T1515cir1.java",
			    "\n" +
			    "public class T1515cir1 {\n" +
			    "    public void o() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team1515cir1/R.java",
			    "\n" +
			    "team package Team1515cir1;\n" +
			    "public class R playedBy T1515cir1 {\n" +
			    "    void k() {\n" +
			    "        System.out.print(\"K\");\n" +
			    "    }\n" +
			    "    k <- after o;\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }

    // a role file defines a callin - one compilation role driven
    // 1.5.15-otjld-callin-into-rolefile-2
    public void test1515_callinIntoRolefile2() {
       
       runConformTest(
            new String[] {
		"Team1515cir2.java",
			    "\n" +
			    "public team class Team1515cir2 {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team1515cir2().activate();\n" +
			    "        new T1515cir2().o();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T1515cir2.java",
			    "\n" +
			    "public class T1515cir2 {\n" +
			    "    public void o() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team1515cir2/R.java",
			    "\n" +
			    "team package Team1515cir2;\n" +
			    "public class R playedBy T1515cir2 {\n" +
			    "    void k() {\n" +
			    "        System.out.print(\"K\");\n" +
			    "    }\n" +
			    "    k <- after o;\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }

    // a role file defines a callin - separate compilation
    // 1.5.15-otjld-callin-into-rolefile-3
    public void test1515_callinIntoRolefile3() {
       
       runConformTest(
            new String[] {
		"Team1515cir3.java",
			    "\n" +
			    "public team class Team1515cir3 {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team1515cir3().activate();\n" +
			    "        new T1515cir3().o();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T1515cir3.java",
			    "\n" +
			    "public class T1515cir3 {\n" +
			    "    public void o() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team1515cir3/R.java",
			    "\n" +
			    "team package Team1515cir3;\n" +
			    "public class R playedBy T1515cir3 {\n" +
			    "    void k() {\n" +
			    "        System.out.print(\"K\");\n" +
			    "    }\n" +
			    "    k <- after o;\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }

    // a role file defines a callin and a base predicate - separate compilation - witness for TPX-428
    // 1.5.15-otjld-callin-into-rolefile-4
    public void test1515_callinIntoRolefile4() {
       
       runConformTest(
            new String[] {
		"Team1515cir4.java",
			    "\n" +
			    "public team class Team1515cir4 {\n" +
			    "    boolean frozen = false;\n" +
			    "    public static void main(String[] args) {\n" +
			    "        Team1515cir4 t = new Team1515cir4();\n" +
			    "        t.activate();\n" +
			    "        new T1515cir4().o();\n" +
			    "        t.frozen = true;\n" +
			    "        new T1515cir4().o();        \n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T1515cir4.java",
			    "\n" +
			    "public class T1515cir4 {\n" +
			    "    public void o() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team1515cir4/R.java",
			    "\n" +
			    "team package Team1515cir4;\n" +
			    "public class R playedBy T1515cir4 \n" +
			    "    base when (!frozen || hasRole(base, R.class))\n" +
			    "{\n" +
			    "    void k() {\n" +
			    "        System.out.print(\"K\");\n" +
			    "    }\n" +
			    "    k <- after o;\n" +
			    "}    \n" +
			    "    \n"
            },
            "OKO");
    }

    // two role files define a callin and a base predicate - team driven compilation - witness for TPX-428 part 2
    // 1.5.15-otjld-callin-into-rolefile-5
    public void test1515_callinIntoRolefile5() {
       
       runConformTest(
            new String[] {
		"Team1515cir5.java",
			    "\n" +
			    "public team class Team1515cir5 {\n" +
			    "    precedence R1, R2;\n" +
			    "    Team1515cir5(T1515cir5 as R2 o) {\n" +
			    "        this.activate();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        T1515cir5  b = new T1515cir5();\n" +
			    "        new Team1515cir5(b);\n" +
			    "        b.o();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T1515cir5.java",
			    "\n" +
			    "public class T1515cir5 {\n" +
			    "    public void o() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "    }\n" +
			    "}    \n" +
			    "    \n",
		"Team1515cir5/R1.java",
			    "\n" +
			    "team package Team1515cir5;\n" +
			    "public class R1 playedBy T1515cir5 \n" +
			    "    base when (hasRole(base, R1.class))\n" +
			    "{\n" +
			    "    void n() {\n" +
			    "        System.out.print(\"N\");\n" +
			    "    }\n" +
			    "    n <- after o;\n" +
			    "}    \n" +
			    "    \n",
		"Team1515cir5/R2.java",
			    "\n" +
			    "team package Team1515cir5;\n" +
			    "public class R2 playedBy T1515cir5 \n" +
			    "    base when (hasRole(base, R2.class))\n" +
			    "{\n" +
			    "    void k() {\n" +
			    "        System.out.print(\"K\");\n" +
			    "    }\n" +
			    "    k <- after o;\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }

    // a role file defines a callin - team driven compilation reusing binary role
    // 1.5.15-otjld_postponed_callin-into-rolefile-6
    public void _postponed_test1515_callinIntoRolefile6() {
       
       runConformTest(
            new String[] {
		"Team1515cir6.java",
			    "\n" +
			    "public team class Team1515cir6 {\n" +
			    "    Team1515cir6(T1515cir6 as R1 o) {\n" +
			    "        this.activate();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        T1515cir6  b = new T1515cir6();\n" +
			    "        new Team1515cir6(b);\n" +
			    "        b.o();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T1515cir6.java",
			    "\n" +
			    "public class T1515cir6 {\n" +
			    "    public void o() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team1515cir6/R1.java",
			    "\n" +
			    "team package Team1515cir6;\n" +
			    "public class R1 playedBy T1515cir6\n" +
			    "    base when (hasRole(base, R1.class))\n" +
			    "{\n" +
			    "    void n() {\n" +
			    "        System.out.print(\"N\");\n" +
			    "    }\n" +
			    "    n <- after o;\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a role file defines a static replace callin - team driven compilation reusing binary role
    // 1.5.15-otjld_postponed_callin-into-rolefile-7
    public void _postponed_test1515_callinIntoRolefile7() {
       
       runConformTest(
            new String[] {
		"Team1515cir7.java",
			    "\n" +
			    "public team class Team1515cir7 {\n" +
			    "    Team1515cir7(T1515cir7 as R1 o) {\n" +
			    "        this.activate();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        T1515cir7  b = new T1515cir7();\n" +
			    "        new Team1515cir7(b);\n" +
			    "        b.o();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T1515cir7.java",
			    "\n" +
			    "public class T1515cir7 {\n" +
			    "    public void o() {\n" +
			    "        System.out.print(\"O\");\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team1515cir7/R1.java",
			    "\n" +
			    "team package Team1515cir7;\n" +
			    "public class R1 playedBy T1515cir7\n" +
			    "    base when (hasRole(base, R1.class))\n" +
			    "{\n" +
			    "    callin void n() {\n" +
			    "        base.n();\n" +
			    "        System.out.print(\"K\");\n" +
			    "    }\n" +
			    "    n <- replace o;\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a nested team is implicitly inherited (phantom) and contains a role file
    // 1.5.16-otjld_postponed_role-file-of-phantom-nested-team-1
    public void _postponed_test1516_roleFileOfPhantomNestedTeam1() {
       
       runConformTest(
            new String[] {
		"Team1516rfopnt1_2.java",
			    "\n" +
			    "public team class Team1516rfopnt1_2 extends Team1516rfopnt1_1 {\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team1516rfopnt1_2();\n" +
			    "    } \n" +
			    "}    \n" +
			    "    \n",
		"Team1516rfopnt1_1.java",
			    "\n" +
			    "public team class Team1516rfopnt1_1 {\n" +
			    "    Team1516rfopnt1_1() {\n" +
			    "        new Inner();\n" +
			    "    }    \n" +
			    "}    \n" +
			    "    \n",
		"Team1516rfopnt1_2/Inner/R1516rfopnt1.java",
			    "\n" +
			    "team package Team1516rfopnt1_2.Inner;\n" +
			    "protected class R1516rfopnt1 {\n" +
			    "    void test() { System.out.print(\"OK\"); }\n" +
			    "}    \n" +
			    "    \n",
		"Team1516rfopnt1_1/Inner.java",
			    "\n" +
			    "team package Team1516rfopnt1_1;\n" +
			    "public team class Inner {\n" +
			    "    protected class R1516rfopnt1 {\n" +
			    "        void test() { System.out.print(\"NOK\"); }\n" +
			    "    }\n" +
			    "    public Inner() {\n" +
			    "        new R1516rfopnt1().test();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a nested role is in a role file , so is its direct enclosing
    // 1.5.17-otjld-nested-role-file-1
    public void test1517_nestedRoleFile1() {
       myWriteFiles(
    		new String[] {
    	"Team1517nrf1/Inner/R.java",
			    "team package Team1517nrf1.Inner;\n" +
			    "protected class R {\n" +
			    "    protected void test() { System.out.print(\"OK\"); }\n" +
			    "}\n",
		"Team1517nrf1/Inner.java",
			    "\n" +
			    "team package Team1517nrf1;\n" +
			    "protected team class Inner {\n" +
			    "    protected Inner() {\n" +
			    "        new R().test();\n" +
			    "    }\n" +
			    "}\n"
    		});
       runConformTest(
            new String[] {
		"Team1517nrf1.java",
			    "\n" +
			    "public team class Team1517nrf1  {\n" +
			    "    Team1517nrf1 () {\n" +
			    "        new Inner();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team1517nrf1();\n" +
			    "    }\n" +
			    "}\n"
            },
            "OK",
            null,/*class libraries*/
            false,/*flushOutputDirectory*/
            null/*vmarguments*/);
    }

    // a nested role is in a role file, direct enclosing is not
    // 1.5.17-otjld-nested-role-file-2
    public void test1517_nestedRoleFile2() {
       
       runConformTest(
            new String[] {
		"Team1517nrf2.java",
			    "\n" +
			    "public team class Team1517nrf2  {\n" +
			    "    protected team class Inner {\n" +
			    "        protected Inner() {\n" +
			    "            new R().test();\n" +
			    "        }\n" +
			    "    }\n" +
			    "    Team1517nrf2 () {\n" +
			    "        new Inner();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team1517nrf2();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team1517nrf2/Inner/R.java",
			    "\n" +
			    "team package Team1517nrf2.Inner;\n" +
			    "protected class R {\n" +
			    "    protected void test() { System.out.print(\"OK\"); }\n" +
			    "}    \n" +
			    "    \n"
            },
            "OK");
    }

    // see CVS:swtdipl/ve/test2, bug reported by kmeier
    // 1.5.17-otjld-nested-role-file-3
    public void test1517_nestedRoleFile3() {
        myWriteFiles(
            new String[] {
		"p/Team1517nrf3/Inner1_2.java",
			    "team package p.Team1517nrf3;\n" +
			    "public team class Inner1_2 extends Inner1_1 {\n" +
			    "    @Override\n" +
			    "    public class R1_1 {\n" +
			    "    }\n" +
			    "}\n",
		"p/Team1517nrf3/Inner1_1.java",
			    "team package p.Team1517nrf3;\n" +
			    "public abstract team class Inner1_1 {\n" +
			    "    public abstract class R1_1 {\n" +
			    "    }\n" +
			    "}\n",
		"p/Team1517nrf3.java",
			    "package p;\n" +
			    "public team class Team1517nrf3 {\n" +
			    "    final Inner1_1 anchor;\n" +
			    "    public Team1517nrf3() {\n" +
			    "        anchor = new Inner1_2();\n" +
			    "    }\n" +
			    "}\n"
            });
        runConformTest(
            new String[] {
        "T1517nrf3Main.java",
        		"public class T1517nrf3Main {\n" +
        		"	 public static void main(String... args) {\n" +
        		"		 System.out.println(\"OK\");\n" +
        		"	 }\n" +
        		"}\n",
		"p/Team1517nrf3/Inner2.java",
			    "team package p.Team1517nrf3;\n" +
			    "public team class Inner2 {\n" +
			    "    protected class R2 playedBy R1_1<@anchor> {\n" +
			    "        R2(R1_1<@anchor> theBase/*, int i*/) {\n" +
			    "            //base(theBase);\n" +
			    "        }\n" +
			    "    }\n" +
			    "}\n"
            },
            null,/*expectedOutput*/
            null,/*class libraries*/
            false,/*flushOutputDirectory*/
            null/*vmarguments*/);
    }

    // empty classes
    // 1.5.17-otjld-nested-role-file-4
    public void test1517_nestedRoleFile4() {
        runConformTest(
            new String[] {
		"p/Team1517nrf4.java",
			    "\n" +
			    "package p;\n" +
			    "public team class Team1517nrf4 {}\n" +
			    "    \n",
		"p/Team1517nrf4/Mid1517nrf4.java",
			    "\n" +
			    "team package p.Team1517nrf4;\n" +
			    "public team class Mid1517nrf4 {}\n" +
			    "    \n",
		"p/Team1517nrf4/Mid1517nrf4/R1517nrf4.java",
			    "\n" +
			    "team package p.Team1517nrf4.Mid1517nrf4;\n" +
			    "protected class R1517nrf4 {}\n" +
			    "    \n"
            });
    }

    // empty classes - 4 levels - missing 'team' at level 3
    // 1.5.17-otjld-nested-role-file-5
    public void test1517_nestedRoleFile5() {
    	String convertedOutputPath = new String(OUTPUT_DIR+'/').replace('/', '\\');
        runNegativeTest(
            new String[] {
		"p/Team1517nrf5/Mid1517nrf5/R1517nrf5/Deep1517nrf5.java",
			    "\n" +
			    "team package p.Team1517nrf5.Mid1517nrf5.R1517nrf5;\n" +
			    "protected class Deep1517nrf5 {}\n" +
			    "    \n",
		"p/Team1517nrf5.java",
			    "\n" +
			    "package p;\n" +
			    "public team class Team1517nrf5 {}\n" +
			    "    \n",
		"p/Team1517nrf5/Mid1517nrf5.java",
			    "\n" +
			    "team package p.Team1517nrf5;\n" +
			    "public team class Mid1517nrf5 {}\n" +
			    "    \n",
		"p/Team1517nrf5/Mid1517nrf5/R1517nrf5.java",
			    "\n" +
			    "team package p.Team1517nrf5.Mid1517nrf5;\n" +
			    "protected class R1517nrf5 {}\n" +
			    "    \n"
            },
			"----------\n" + 
			"1. ERROR in p\\Team1517nrf5\\Mid1517nrf5.java (at line 3)\n" + 
			"	public team class Mid1517nrf5 {}\n" + 
			"    \n" + 
			"	                            ^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Team1517nrf5.__OT__Mid1517nrf5.R1517nrf5 to Team1517nrf5.__OT__Mid1517nrf5.R1517nrf5\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. ERROR in "+convertedOutputPath+"p\\Team1517nrf5\\Mid1517nrf5\\R1517nrf5.java (at line 3)\n" + 
			"	protected class R1517nrf5 {}\n" + 
			"	                ^^^^^^^^^\n" + 
			"Duplicate nested type R1517nrf5\n" + 
			"----------\n" + 
            // this is the main error message, the others are mostly caused by compilation order issues:
			"----------\n" + 
			"1. ERROR in p\\Team1517nrf5\\Mid1517nrf5\\R1517nrf5\\Deep1517nrf5.java (at line 3)\n" + 
			"	protected class Deep1517nrf5 {}\n" + 
			"	                ^^^^^^^^^^^^\n" + 
			"Member types not allowed in regular roles. Mark class p.Team1517nrf5.Mid1517nrf5.R1517nrf5 as a team if Deep1517nrf5 should be its role (OTJLD 1.5(a,b)). \n" + 
			"----------\n");
    }

    // empty classes - 4 levels : OK
    // 1.5.17-otjld-nested-role-file-6
    public void test1517_nestedRoleFile6() {
    	this.compileOrder = new String[][] {
    			{"p/Team1517nrf6.java"}, 
    			{"p/Team1517nrf6/Mid1517nrf6.java"},
    			{"p/Team1517nrf6/Mid1517nrf6/R1517nrf6.java"},
    			{"p/Team1517nrf6/Mid1517nrf6/R1517nrf6/Deep1517nrf6.java"}};
        runConformTest(
            new String[] {
		"p/Team1517nrf6.java",
			    "\n" +
			    "package p;\n" +
			    "public team class Team1517nrf6 {}\n" +
			    "    \n",
		"p/Team1517nrf6/Mid1517nrf6.java",
			    "\n" +
			    "team package p.Team1517nrf6;\n" +
			    "public team class Mid1517nrf6 {}\n" +
			    "    \n",
		"p/Team1517nrf6/Mid1517nrf6/R1517nrf6.java",
			    "\n" +
			    "team package p.Team1517nrf6.Mid1517nrf6;\n" +
			    "protected team class R1517nrf6 {}\n" +
			    "    \n",
		"p/Team1517nrf6/Mid1517nrf6/R1517nrf6/Deep1517nrf6.java",
			    "\n" +
			    "team package p.Team1517nrf6.Mid1517nrf6.R1517nrf6;\n" +
			    "protected class Deep1517nrf6 {}\n" +
			    "    \n"
            });
    }

    // a phantom role is a tsub of a role file
    // 1.5.18-otjld-implicitly-inherit-role-file-1
    public void test1518_implicitlyInheritRoleFile1() {
       
       runConformTest(
            new String[] {
		"Team1518iirf1_3.java",
			    "\n" +
			    "public team class Team1518iirf1_3 extends Team1518iirf1_2 {\n" +
			    "    protected class R2 extends R {}\n" +
			    "    Team1518iirf1_3() {\n" +
			    "        new R2().test();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team1518iirf1_3();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team1518iirf1_1.java",
			    "\n" +
			    "public team class Team1518iirf1_1 {\n" +
			    "}\n" +
			    "    \n",
		"Team1518iirf1_2.java",
			    "\n" +
			    "public team class Team1518iirf1_2 extends Team1518iirf1_1 {\n" +
			    "}\n" +
			    "    \n",
		"Team1518iirf1_1/R.java",
			    "\n" +
			    "team package Team1518iirf1_1;\n" +
			    "protected class R {\n" +
			    "    protected void test() {\n" +
			    "        System.out.print(\"OK\");\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "OK");
    }

    // a phantom role is a tsub of a role file - invisible method
    // 1.5.18-otjld-implicitly-inherit-role-file-1f
    public void test1518_implicitlyInheritRoleFile1f() {
        runNegativeTestMatching(
            new String[] {
		"Team1518iirf1f_3.java",
			    "\n" +
			    "public team class Team1518iirf1f_3 extends Team1518iirf1f_2 {\n" +
			    "    protected class R2 extends R {}\n" +
			    "    Team1518iirf1f_3() {\n" +
			    "        new R2().test();\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team1518iirf1f_2.java",
			    "\n" +
			    "public team class Team1518iirf1f_2 extends Team1518iirf1f_1 {\n" +
			    "}\n" +
			    "    \n",
		"Team1518iirf1f_1/R.java",
			    "\n" +
			    "team package Team1518iirf1f_1;\n" +
			    "protected class R {\n" +
			    "    void test() {\n" +
			    "        System.out.print(\"OK\");\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team1518iirf1f_1.java",
			    "\n" +
			    "public team class Team1518iirf1f_1 {\n" +
			    "}\n" +
			    "    \n"
            },
            "not visible");
    }

    // a phantom role is a tsub of a role file - bound role
    // 1.5.18-otjld-implicitly-inherit-role-file-2
    public void test1518_implicitlyInheritRoleFile2() {
       Map customOptions = getCompilerOptions();
       
       runConformTest(
            new String[] {
		"Team1518iirf2_3.java",
			    "\n" +
			    "public team class Team1518iirf2_3 extends Team1518iirf2_2 {\n" +
			    "    protected class R2 extends R {}\n" +
			    "    Team1518iirf2_3(T1518iirf2 as R2 r) {\n" +
			    "        r.test();\n" +
			    "    }\n" +
			    "    public static void main(String[] args) {\n" +
			    "        new Team1518iirf2_3(new T1518iirf2());\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"T1518iirf2.java",
			    "\n" +
			    "public class T1518iirf2 {\n" +
			    "    void test() {\n" +
			    "        System.out.print(\"OK\");\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n",
		"Team1518iirf2_1.java",
			    "\n" +
			    "/**\n" +
			    " * @role R\n" +
			    " */\n" +
			    "public team class Team1518iirf2_1 {\n" +
			    "}\n" +
			    "    \n",
		"Team1518iirf2_2.java",
			    "\n" +
			    "public team class Team1518iirf2_2 extends Team1518iirf2_1 {\n" +
			    "}\n" +
			    "    \n",
		"Team1518iirf2_1/R.java",
			    "\n" +
			    "team package Team1518iirf2_1;\n" +
			    "protected class R playedBy T1518iirf2 {\n" +
			    "    abstract protected void test();\n" +
			    "    test -> test;\n" +
			    "}\n" +
			    "    \n"
            },
            "OK",
            null/*classLibraries*/,
            true/*shouldFlushOutputDirectory*/,
            null/*vmArguments*/,
            customOptions,
            null/*no custom requestor*/);
    }

    // a role file contains a base import
    // 1.5.19-ojtld-base-import-for-role-file-1
    public void test1519_baseImportForRoleFile1() {
        runNegativeTestMatching(
            new String[] {
		"Team1519bifrf1/R1519bifrf1.java",
			    "\n" +
			    "team package Team1519bifrf1;\n" +
			    "import base p1.T1519bifrf1;\n" +
			    "protected class R playedBy T1519bifrf1 {}\n" +
			    "    \n",
		"p1/T1519bifrf1.java",
			    "\n" +
			    "public class T1519bifrf1 {}\n" +
			    "    \n",
		"Team1519bifrf1.java",
			    "\n" +
			    "public team class Team1519bifrf1 {}\n" +
			    "    \n"
            },
            "2.1.2(d)");
    }

    // a role file finds no team
    // 1.5.20-otjld-role-file-without-team-1
    public void test1520_roleFileWithoutTeam1() {
        runNegativeTestMatching(
            new String[] {
		"Team1520rfwt1/R1520rfwt1.java",
			    "\n" +
			    "team package Team1520rfwt1;\n" +
			    "protected class R1520rfwt1 {\n" +
			    "    void foo() {\n" +
			    "        System.out.print(\"bar\");\n" +
			    "    }\n" +
			    "}\n" +
			    "    \n"
            },
            "----------\n" + 
    		"1. ERROR in Team1520rfwt1\\R1520rfwt1.java (at line 2)\n" + 
    		"	team package Team1520rfwt1;\n" + 
    		"	             ^^^^^^^^^^^^^\n" + 
    		"Enclosing team Team1520rfwt1 not found for role file R1520rfwt1 (OTJLD 1.2.5(c)).\n" + 
    		"----------\n");
    }

    // a role file imports a deprecated type, warning suppressed
    // 1.5.21-otjld-import-warning-suppressed-1
    public void test1521_importWarningSuppressed1() {
    	myWriteFiles(
    		new String[] {
    	"Team1521iws1.java",
			    "public team class Team1521iws1 {}\n"
    		});
        runConformTest(
            new String[] {
		"p1/T1521iws1.java",
			    "package p1;\n" +
			    "@Deprecated public class T1521iws1 {}\n",
		"Team1521iws1/R.java",
			    "team package Team1521iws1;\n" +
			    "import p1.T1521iws1;\n" +
			    "@SuppressWarnings(\"deprecation\")\n" +
			    "protected class R {\n" +
			    "    T1521iws1 f;\n" +
			    "}\n"
            },
            null/*expectedOutput*/,
            null/*classLibraries*/,
            false/*shouldFlushOutputDirectory*/,
            null/*vmArguments*/,
            null/*customOptions*/,
            null/*no custom requestor*/);
    }

    // a team mentions its role files in a javadoc @role tag - OK
    // 1.5.22-otjld-role-tag-in-javadoc-1
    public void test1522_roleTagInJavadoc1() {
        runConformTest(
            new String[] {
		"Team1522rtij1.java",
			    "\n" +
			    "/**\n" +
			    "  * A team with two role files.\n" +
			    "  * @role R1522rtij1_1\n" +
			    "  * @role R1522rtij1_2\n" +
			    "  */\n" +
			    "public team class Team1522rtij1 {\n" +
			    "    /** @param bar a R1522rtij1_2 */\n" +
			    "    void foo(R1522rtij1_2 bar) {}\n" +
			    "}\n" +
			    "    \n",
		"Team1522rtij1/R1522rtij1_1.java",
			    "\n" +
			    "team package Team1522rtij1;\n" +
			    "protected class R1522rtij1_1 {}\n" +
			    "    \n",
		"Team1522rtij1/R1522rtij1_2.java",
			    "\n" +
			    "team package Team1522rtij1;\n" +
			    "protected class R1522rtij1_2 {}\n" +
			    "    \n"
            });
    }

    // a team mentions its role file in a javadoc @role tag - one role file missing
    // 1.5.22-otjld-role-tag-in-javadoc-2
    public void test1522_roleTagInJavadoc2() {
       Map customOptions = getCompilerOptions();
       // -enableJavadoc
       customOptions.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
       // -warn:+javadoc
       customOptions.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.WARNING);
       customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.WARNING);
// part of +javadoc but not needed:
//       customOptions.put(CompilerOptions.OPTION_ReportInvalidJavadocTagsDeprecatedRef, CompilerOptions.ENABLED);
//       customOptions.put(CompilerOptions.OPTION_ReportInvalidJavadocTagsNotVisibleRef, CompilerOptions.ENABLED);
//       customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocTagsVisibility, CompilerOptions.PRIVATE);
        runTestExpectingWarnings(
            new String[] {
		"Team1522rtij2.java",
			    "\n" +
			    "/**\n" +
			    "  * A team with a role file.\n" +
			    "  * @role R1522rtij2_1\n" +
			    "  */\n" +
			    "public team class Team1522rtij2 {\n" +
			    "    /** @param bar a R1522rtij2_2 */\n" +
			    "    void foo(R1522rtij2_2 bar) {} // ensure it's loaded\n" +
			    "}\n" +
			    "    \n",
		"Team1522rtij2/R1522rtij2_1.java",
			    "\n" +
			    "team package Team1522rtij2;\n" +
			    "protected class R1522rtij2_1 {}\n" +
			    "    \n",
		"Team1522rtij2/R1522rtij2_2.java",
			    "\n" +
			    "team package Team1522rtij2;\n" +
			    "protected class R1522rtij2_2 {}\n" +
			    "    \n"
            },
            "----------\n" + 
    		"1. WARNING in Team1522rtij2.java (at line 6)\n" + 
    		"	public team class Team1522rtij2 {\n" + 
    		"	                  ^^^^^^^^^^^^^\n" + 
    		"Javadoc: Missing tag for role file R1522rtij2_2 (OTJLD 1.2.5(d)).\n" + 
    		"----------\n",
            customOptions);
    }

    // a team mentions its role file in a javadoc @role tag - inline role mentioned
    // 1.5.22-otjld-role-tag-in-javadoc-3
    public void test1522_roleTagInJavadoc3() {
       Map customOptions = getCompilerOptions();
       customOptions.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
       customOptions.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.WARNING);
       customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.WARNING);
        runTestExpectingWarnings(
            new String[] {
		"Team1522rtij3.java",
			    "\n" +
			    "/**\n" +
			    "  * A team with a role file.\n" +
			    "  * @role R1522rtij3_1 this is really a role file\n" +
			    "  * @role R1522rtij3_2 this role is inline\n" +
			    "  */\n" +
			    "public team class Team1522rtij3 {\n" +
			    "    protected class R1522rtij3_2 {}\n" +
			    "    \n" +
			    "    /** @param bar a R1522rtij3_2 */\n" +
			    "    void foo(R1522rtij3_2 bar) {}\n" +
			    "}\n" +
			    "    \n",
		"Team1522rtij3/R1522rtij3_1.java",
			    "\n" +
			    "team package Team1522rtij3;\n" +
			    "protected class R1522rtij3_1 {}\n" +
			    "    \n"
            },
            "----------\n" + 
    		"1. WARNING in Team1522rtij3.java (at line 5)\n" + 
    		"	* @role R1522rtij3_2 this role is inline\n" + 
    		"	        ^^^^^^^^^^^^\n" + 
    		"Javadoc: R1522rtij3_2 is an inline role, whereas the @role tag should only be used for role files (OTJLD 1.2.5(d)).\n" + 
    		"----------\n",
            customOptions);
    }

    // a team mentions its role file in a javadoc @role tag - non-role mentioned
    // 1.5.22-otjld-role-tag-in-javadoc-4
    public void test1522_roleTagInJavadoc4() {
       Map customOptions = getCompilerOptions();
       customOptions.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
       customOptions.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.WARNING);
       customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.WARNING);
        runTestExpectingWarnings(
            new String[] {
		"Team1522rtij4.java",
			    "\n" +
			    "/**\n" +
			    "  * A team with a role file.\n" +
			    "  * @role R1522rtij4_1\n" +
			    "  * @role String\n" +
			    "  */\n" +
			    "public team class Team1522rtij4 {\n" +
			    "    protected class R1522rtij4_2 {}\n" +
			    "\n" +
			    "    /** @param bar a R1522rtij4_2 */\n" +
			    "    void foo(R1522rtij4_2 bar) {}\n" +
			    "}\n" +
			    "    \n",
		"Team1522rtij4/R1522rtij4_1.java",
			    "\n" +
			    "team package Team1522rtij4;\n" +
			    "protected class R1522rtij4_1 {}\n" +
			    "    \n"
            },
            "----------\n" + 
    		"1. WARNING in Team1522rtij4.java (at line 5)\n" + 
    		"	* @role String\n" + 
    		"	        ^^^^^^\n" + 
    		"Javadoc: String cannot be resolved to a role of this team (OTJLD 1.2.5(d)).\n" + 
    		"----------\n",
            customOptions);
    }

    // a team mentions its role file in a javadoc @role tag - type name missing
    // 1.5.22-otjld-role-tag-in-javadoc-5
    public void test1522_roleTagInJavadoc5() {
       Map customOptions = getCompilerOptions();
       customOptions.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
       customOptions.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.WARNING);
       customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.WARNING);
        runTestExpectingWarnings(
            new String[] {
		"Team1522rtij5.java",
			    "\n" +
			    "/**\n" +
			    "  * A team with a role file.\n" +
			    "  * @role\n" +
			    "  * @role R1522rtij5_1\n" +
			    "  */\n" +
			    "public team class Team1522rtij5 {\n" +
			    "    protected class R1522rtij5_2 {}\n" +
			    "\n" +
			    "    /** @param bar a R1522rtij5_2 */\n" +
			    "    void foo(R1522rtij5_2 bar) {}\n" +
			    "}\n" +
			    "    \n",
		"Team1522rtij5/R1522rtij5_1.java",
			    "\n" +
			    "team package Team1522rtij5;\n" +
			    "protected class R1522rtij5_1 {}\n" +
			    "    \n"
            },
            "----------\n" + 
    		"1. WARNING in Team1522rtij5.java (at line 4)\n" + 
    		"	* @role\n" + 
    		"	   ^^^^\n" + 
    		"Javadoc: Missing identifier\n" + 
    		"----------\n",
            customOptions);
    }

    // a team mentions its role file in a javadoc @role tag - unresolvable type
    // 1.5.22-otjld-role-tag-in-javadoc-6
    public void test1522_roleTagInJavadoc6() {
       Map customOptions = getCompilerOptions();
       customOptions.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
       customOptions.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.WARNING);
       customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.WARNING);
        runTestExpectingWarnings(
            new String[] {
		"Team1522rtij6.java",
			    "\n" +
			    "/**\n" +
			    "  * A team with a role file.\n" +
			    "  * @role R1522rtij6_1\n" +
			    "  * @role Wrong\n" +
			    "  */\n" +
			    "public team class Team1522rtij6 {\n" +
			    "    protected class R1522rtij6_2 {}\n" +
			    "\n" +
			    "    /** @param bar a R1522rtij6_2 */\n" +
			    "    void foo(R1522rtij6_2 bar) {}\n" +
			    "}\n" +
			    "    \n",
		"Team1522rtij6/R1522rtij6_1.java",
			    "\n" +
			    "team package Team1522rtij6;\n" +
			    "protected class R1522rtij6_1 {}\n" +
			    "    \n"
            },
            "----------\n" + 
    		"1. WARNING in Team1522rtij6.java (at line 5)\n" + 
    		"	* @role Wrong\n" + 
    		"	        ^^^^^\n" + 
    		"Javadoc: Wrong cannot be resolved to a role of this team (OTJLD 1.2.5(d)).\n" + 
    		"----------\n",
            customOptions);
    }

    // a regular class has a role file tag
    // 1.5.22-otjld-role-tag-in-javadoc-7
    public void test1522_roleTagInJavadoc7() {
       Map customOptions = getCompilerOptions();
       customOptions.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
       customOptions.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.WARNING);
       customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.WARNING);
        runTestExpectingWarnings(
            new String[] {
		"T1522rtij7.java",
			    "\n" +
			    "/**\n" +
			    "  * A class with a role file.\n" +
			    "  * @role R1522rtij7_1\n" +
			    "  */\n" +
			    "public class T1522rtij7 {\n" +
			    "    protected class R1522rtij7_1 {}\n" +
			    "\n" +
			    "    /** @param bar a R1522rtij7_1 */\n" +
			    "    void foo(R1522rtij7_1 bar) {}\n" +
			    "}\n" +
			    "    \n"
            },
            "----------\n" + 
    		"1. WARNING in T1522rtij7.java (at line 4)\n" + 
    		"	* @role R1522rtij7_1\n" + 
    		"	        ^^^^^^^^^^^^\n" + 
    		"Javadoc: Illegal @role tag, type T1522rtij7 is not a team (OTJLD 1.2.5(d)).\n" + 
    		"----------\n",
           customOptions);
    }

    // a role file has a name that does not match the contained class
    // 1.5.23-otjld-wrong-filename-1
    public void test1523_wrongFilename1() {
        runNegativeTestMatching(
            new String[] {
		"Team1523wf1/RFile.java",
			    "\n" +
			    "team package Team1523wf1;\n" +
			    "protected class RClass {}    \n" +
			    "    \n",
		"Team1523wf1.java",
			    "\n" +
			    "public team class Team1523wf1 {}\n" +
			    "    \n"
            },
            "1.2.5(b)");
    }
    
    // a compilation unit contains a secondary toplevel team class
    public void test1524_secondaryTeam1() {
    	runConformTest(
    		new String[] {
    	"Team1524st1.java",
    		"team class T0 {\n" +
    		"    protected void test() {\n" +
    		"		System.out.print(\"OK\");\n" +
    		"    }\n" +
    		"}\n" +
    		"public class Team1524st1 {\n" +
    		"	public static void main(String... args) {\n" +
    		"		new T0().test();\n" +
    		"   }\n" +
    		"}\n"
    		}, 
    		"OK");
    }

    // a role file has a NLS warning
    public void test1525_warningInRoleFile1() {
    	Map customOptions = getCompilerOptions();
    	customOptions.put(CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, CompilerOptions.WARNING);
        runTestExpectingWarnings(
            new String[] {
		"Team1525wirf1.java",
			    "\n" +
			    "public team class Team1525wirf1 {\n" +
			    "}\n",
		"Team1525wirf1/Role.java",
			    "team package Team1525wirf1;\n" +
			    "protected class Role {\n" +
			    "    String val = \"OK\";\n" +
			    "}\n"
            },
            "----------\n" +
            "1. WARNING in Team1525wirf1\\Role.java (at line 3)\n" +
            "	String val = \"OK\";\n" +
            "	             ^^^^\n" +
            "Non-externalized string literal; it should be followed by //$NON-NLS-<n>$\n" +
            "----------\n",
            customOptions);
    }

    // a role file suppresses an NLS warning (comment style)
    public void test1525_warningInRoleFile2() {
    	Map customOptions = getCompilerOptions();
    	customOptions.put(CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, CompilerOptions.ERROR);
        myWriteFiles(
            new String[] {
		"Team1525wirf1/Role.java",
			    "team package Team1525wirf1;\n" +
			    "protected class Role {\n" +
			    "    void foo() {\n" +
			    "        String val = \"OK\"; //$NON-NLS-1$\n" +
			    "    }\n" +
			    "}\n"
            });
        runConformTest(
        	new String[] {
		"Team1525wirf1.java",
			    "\n" +
			    "public team class Team1525wirf1 {\n" +
			    "	Role r;\n" +
			    "}\n",
        	},
            "",
            null/*classLibraries*/,
            false/*shouldFlushOutputFolder*/,
            null/*vmArguments*/,
            customOptions, 
            null/*customRequestor*/);
    }
    
    // a role file holds a nested team which extends a non-team role file
    public void test1526_rofiTeamExtendsNonTeam1() {
        Map customOptions = getCompilerOptions();
        customOptions.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
        customOptions.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.WARNING);
        customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.WARNING);

        compileOrder = new String[][]{new String[]{"Team1526rtent1.java", "Team1526rtent1/Role1.java"}, new String[] {"Team1526rtent1/Role2.java"}};
    	runConformTest(
    		new String[] {
    	"Team1526rtent1.java",
    			"public team class Team1526rtent1 {}\n",
    	"Team1526rtent1/Role1.java",
    			"team package Team1526rtent1;\n" +
    			"protected class Role1 {}\n",
    	"Team1526rtent1/Role2.java",
    			"team package Team1526rtent1;\n" +
    			"protected team class Role2 extends Role1 {}\n"
    		},
            "",
            null/*classLibraries*/,
            true/*shouldFlushOutputDirectory*/,
            null/*vmArguments*/,
            customOptions,
            null/*no custom requestor*/);
    }
    
    // Bug 460525 - Evaluating PlayedBy attribute may cause bad processing order
    public void testBug460525() {
    	compileOrder = new String[][] {
			    			new String[] {"pb/BaseTeam.java", "pt/TopTeam.java", "pt/TopTeam/Mid/InnerRole.java"},
			    			new String[] {"pt/Main.java"}
    					};
    	runConformTest(
    		new String[] {
    			"pb/BaseTeam.java",
    				"package pb;\n" +
    				"public team class BaseTeam {\n" +
    				"	public class BaseRole {}\n" +
    				"}\n",
    			"pt/TopTeam.java",
    				"package pt;\n" +
    				"import base pb.BaseTeam;\n" +
    				"public team class TopTeam {\n" +
    				"	public team class Mid playedBy BaseTeam {\n" +
    				"		public void mTest(BaseRole<@base> r) {}\n" +
    				"	}\n" +
    				"}\n",
    			"pt/TopTeam/Mid/InnerRole.java",
    				"team package pt.TopTeam.Mid;\n" +
    				"public class InnerRole playedBy BaseRole<@Mid.base> {}\n",

				// Compiling this class triggered:
				// TopTeam.createFields() -> InnerRole.cachePartsFrom() -> InnerRole.evaluateOTAttributes() -> TopTeam.getField() -> NPE
    			"pt/Main.java",
    				"package pt;\n" +
    				"public class Main {\n" +
    				"	final TopTeam t = new TopTeam();\n" +
    				"	void test(final Mid<@t> m, InnerRole<@m> i) {\n" +
    				"		m.mTest(i);\n" + // need this call to force resolving of InnerRole.baseclass()
    				"	}\n" +
    				"}\n"
    		});
    }

    public void testBug492480() {
    	compileOrder = new String[][] {
							new String[] { "pt/MyTeam.java" },
							new String[] { "pt/MyTeam/Role.java" },
    						new String[] { "Test.java" }
    					};
    	runConformTest(
    		new String[] {
    			"pt/MyTeam.java",
    			"package pt;\n" +
    			"public team class MyTeam {\n" +
    			"	public static int N = 42;\n" +
    			"}\n",
    			"pt/MyTeam/Role.java",
    			"team package pt.MyTeam;\n" +
    			"protected class Role {}\n",
    			"Test.java",
    			"import pt.MyTeam;\n" +
    			"public class Test {\n" +
    			"	public static int MYN = MyTeam.N\n;" +
    			"}\n"
    		});
    }
}
