org.eclipse.objectteams.otdt.tests.otjld.rolesandteams.FileStructure.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.objectteams.otdt.tests.otjld.rolesandteams.FileStructure.java

Source

/**********************************************************************
 * This file is part of "Object Teams Development Tooling"-Software
 * 
 * Copyright 2004, 2015 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
 * 
 * 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");
    }

    // 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 " + convertedOutputPath + "p\\Team1517nrf5.java (at line 4)\n"
                        + "   \n" + "\n" + "   ^^^\n"
                        + "Type mismatch: cannot convert from Team1517nrf5.Mid1517nrf5 to Team1517nrf5.Mid1517nrf5\n"
                        + "----------\n" + "----------\n" + "1. ERROR in " + convertedOutputPath
                        + "p\\Team1517nrf5\\Mid1517nrf5.java (at line 3)\n"
                        + "   public team class Mid1517nrf5 {}\n" + "    \n"
                        + "                               ^^^^^^^^^\n"
                        + "The return type is incompatible with Team1517nrf5.Mid1517nrf5.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" + "----------\n" + "1. ERROR in p\\Team1517nrf5.java (at line 3)\n"
                        + "   public team class Team1517nrf5 {}\n" + "                     ^^^^^^^^^^^^\n"
                        + "The type Team1517nrf5 is already defined\n" + "----------\n" + "----------\n"
                        + "1. ERROR in p\\Team1517nrf5\\Mid1517nrf5.java (at line 3)\n"
                        + "   public team class Mid1517nrf5 {}\n" + "                     ^^^^^^^^^^^\n"
                        + "Duplicate nested type Mid1517nrf5\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" });
    }
}