/*
 * Copyright 2000-2013 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jetbrains.idea.maven.execution;

import com.intellij.execution.configurations.JavaParameters;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.impl.scopes.LibraryRuntimeClasspathScope;
import com.intellij.openapi.module.impl.scopes.ModuleWithDependenciesScope;
import com.intellij.openapi.roots.CompilerModuleExtension;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.roots.OrderEnumerator;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.roots.impl.LibraryScopeCache;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.testFramework.PsiTestUtil;
import com.intellij.util.PathsList;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.MavenImportingTestCase;
import org.jetbrains.idea.maven.importing.ArtifactsDownloadingTestCase;
import org.jetbrains.idea.maven.importing.MavenModuleImporter;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class MavenClasspathsAndSearchScopesTest extends MavenImportingTestCase {
  private enum Type {PRODUCTION, TESTS}

  private enum Scope {COMPILE, RUNTIME, MODULE}

  @Override
  protected void setUpInWriteAction() throws Exception {
    super.setUpInWriteAction();
    createProjectSubDirs("m1/src/main/java",
                         "m1/src/test/java",

                         "m2/src/main/java",
                         "m2/src/test/java",

                         "m3/src/main/java",
                         "m3/src/test/java",

                         "m4/src/main/java",
                         "m4/src/test/java");
  }

  public void testConfiguringModuleDependencies() throws Exception {
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m3</artifactId>" +
                                           "    <version>1</version>" +
                                           "  </dependency>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m4</artifactId>" +
                                           "    <version>1</version>" +
                                           "    <optional>true</optional>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m3 = createModulePom("m3", "<groupId>test</groupId>" +
                                           "<artifactId>m3</artifactId>" +
                                           "<version>1</version>");

    VirtualFile m4 = createModulePom("m4", "<groupId>test</groupId>" +
                                           "<artifactId>m4</artifactId>" +
                                           "<version>1</version>");

    importProjects(m1, m2, m3, m4);
    assertModules("m1", "m2", "m3", "m4");

    assertModuleModuleDeps("m1", "m2", "m3");
    assertModuleModuleDeps("m2", "m3", "m4");

    setupJdkForModules("m1", "m2", "m3", "m4");

    assertModuleScopes("m1", "m2", "m3", "m4");

    assertAllProductionSearchScope("m1",
                                   getProjectPath() + "/m1/src/main/java",
                                   getProjectPath() + "/m2/src/main/java",
                                   getProjectPath() + "/m3/src/main/java");
    assertAllTestsSearchScope("m1",
                              getProjectPath() + "/m1/src/main/java",
                              getProjectPath() + "/m1/src/test/java",
                              getProjectPath() + "/m2/src/main/java",
                              getProjectPath() + "/m3/src/main/java");

    assertAllProductionClasspath("m1",
                                 getProjectPath() + "/m1/target/classes",
                                 getProjectPath() + "/m2/target/classes",
                                 getProjectPath() + "/m3/target/classes");
    assertAllTestsClasspath("m1",
                            getProjectPath() + "/m1/target/test-classes",
                            getProjectPath() + "/m1/target/classes",
                            getProjectPath() + "/m2/target/classes",
                            getProjectPath() + "/m3/target/classes");

    assertAllProductionSearchScope("m2",
                                   getProjectPath() + "/m2/src/main/java",
                                   getProjectPath() + "/m3/src/main/java",
                                   getProjectPath() + "/m4/src/main/java");
    assertAllTestsSearchScope("m2",
                              getProjectPath() + "/m2/src/main/java",
                              getProjectPath() + "/m2/src/test/java",
                              getProjectPath() + "/m3/src/main/java",
                              getProjectPath() + "/m4/src/main/java");

    assertAllProductionClasspath("m2",
                                 getProjectPath() + "/m2/target/classes",
                                 getProjectPath() + "/m3/target/classes",
                                 getProjectPath() + "/m4/target/classes");
    assertAllTestsClasspath("m2",
                            getProjectPath() + "/m2/target/test-classes",
                            getProjectPath() + "/m2/target/classes",
                            getProjectPath() + "/m3/target/classes",
                            getProjectPath() + "/m4/target/classes");
  }

  public void testDoNotIncludeTestClassesWhenConfiguringModuleDependenciesForProductionCode() throws Exception {
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>");

    importProjects(m1, m2);
    assertModules("m1", "m2");
    assertModuleModuleDeps("m1", "m2");

    setupJdkForModules("m1", "m2");

    assertModuleScopes("m1", "m2");

    assertAllProductionSearchScope("m1",
                                   getProjectPath() + "/m1/src/main/java",
                                   getProjectPath() + "/m2/src/main/java");
    assertAllProductionClasspath("m1",
                                 getProjectPath() + "/m1/target/classes",
                                 getProjectPath() + "/m2/target/classes");

    assertAllProductionSearchScope("m2",
                                   getProjectPath() + "/m2/src/main/java");
    assertAllProductionClasspath("m2",
                                 getProjectPath() + "/m2/target/classes");
  }

  public void testConfiguringModuleDependenciesOnTestJar() throws Exception {
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "    <type>test-jar</type>" +
                                           "  </dependency>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m3</artifactId>" +
                                           "    <version>1</version>" +
                                           "    <classifier>tests</classifier>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>");
    VirtualFile m3 = createModulePom("m3", "<groupId>test</groupId>" +
                                           "<artifactId>m3</artifactId>" +
                                           "<version>1</version>");

    importProjects(m1, m2, m3);
    assertModules("m1", "m2", "m3");

    setupJdkForModules("m1", "m2", "m3");

    assertModuleScopes("m1", "m2", "m3");

    assertAllProductionSearchScope("m1",
                                   getProjectPath() + "/m1/src/main/java",
                                   getProjectPath() + "/m2/src/test/java",
                                   getProjectPath() + "/m3/src/test/java");
    assertAllTestsSearchScope("m1",
                              getProjectPath() + "/m1/src/main/java",
                              getProjectPath() + "/m1/src/test/java",
                              getProjectPath() + "/m2/src/test/java",
                              getProjectPath() + "/m3/src/test/java");

    assertAllProductionClasspath("m1",
                                 getProjectPath() + "/m1/target/classes",
                                 getProjectPath() + "/m2/target/test-classes",
                                 getProjectPath() + "/m3/target/test-classes");
    assertAllTestsClasspath("m1",
                            getProjectPath() + "/m1/target/test-classes",
                            getProjectPath() + "/m1/target/classes",
                            getProjectPath() + "/m2/target/test-classes",
                            getProjectPath() + "/m3/target/test-classes");
  }

  public void testConfiguringModuleDependenciesOnTestJarWithTestScope() throws Exception {
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "    <type>test-jar</type>" +
                                           "    <scope>test</scope>" +
                                           "  </dependency>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m3</artifactId>" +
                                           "    <version>1</version>" +
                                           "    <classifier>tests</classifier>" +
                                           "    <scope>test</scope>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>");
    VirtualFile m3 = createModulePom("m3", "<groupId>test</groupId>" +
                                           "<artifactId>m3</artifactId>" +
                                           "<version>1</version>");

    importProjects(m1, m2, m3);
    assertModules("m1", "m2", "m3");

    setupJdkForModules("m1", "m2", "m3");

    assertModuleScopes("m1", "m2", "m3");

    assertAllProductionSearchScope("m1",
                                   getProjectPath() + "/m1/src/main/java");
    assertAllTestsSearchScope("m1",
                              getProjectPath() + "/m1/src/main/java",
                              getProjectPath() + "/m1/src/test/java",
                              getProjectPath() + "/m2/src/test/java",
                              getProjectPath() + "/m3/src/test/java");

    assertAllProductionClasspath("m1",
                                 getProjectPath() + "/m1/target/classes");
    assertAllTestsClasspath("m1",
                            getProjectPath() + "/m1/target/test-classes",
                            getProjectPath() + "/m1/target/classes",
                            getProjectPath() + "/m2/target/test-classes",
                            getProjectPath() + "/m3/target/test-classes");
  }

  public void testConfiguringModuleDependenciesOnBothNormalAndTestJar() throws Exception {
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "  </dependency>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "    <type>test-jar</type>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>");

    importProjects(m1, m2);
    assertModules("m1", "m2");

    setupJdkForModules("m1", "m2");

    assertModuleScopes("m1", "m2");

    assertAllProductionSearchScope("m1",
                                   getProjectPath() + "/m1/src/main/java",
                                   getProjectPath() + "/m2/src/main/java",
                                   getProjectPath() + "/m2/src/test/java");
    assertAllTestsSearchScope("m1",
                              getProjectPath() + "/m1/src/main/java",
                              getProjectPath() + "/m1/src/test/java",
                              getProjectPath() + "/m2/src/main/java",
                              getProjectPath() + "/m2/src/test/java");


    assertAllProductionClasspath("m1",
                                 getProjectPath() + "/m1/target/classes",
                                 getProjectPath() + "/m2/target/classes",
                                 getProjectPath() + "/m2/target/test-classes");

    assertAllTestsClasspath("m1",
                            getProjectPath() + "/m1/target/test-classes",
                            getProjectPath() + "/m1/target/classes",
                            getProjectPath() + "/m2/target/classes",
                            getProjectPath() + "/m2/target/test-classes");
  }

  public void testConfiguringModuleDependenciesOnNormalAndTestJarWithTestScope() throws Exception {
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "  </dependency>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "    <type>test-jar</type>" +
                                           "    <scope>test</scope>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>");

    importProjects(m1, m2);
    assertModules("m1", "m2");

    setupJdkForModules("m1", "m2");

    assertModuleScopes("m1", "m2");

    assertAllProductionSearchScope("m1",
                                   getProjectPath() + "/m1/src/main/java",
                                   getProjectPath() + "/m2/src/main/java");
    assertAllTestsSearchScope("m1",
                              getProjectPath() + "/m1/src/main/java",
                              getProjectPath() + "/m1/src/test/java",
                              getProjectPath() + "/m2/src/main/java",
                              getProjectPath() + "/m2/src/test/java");

    assertAllProductionClasspath("m1",
                                 getProjectPath() + "/m1/target/classes",
                                 getProjectPath() + "/m2/target/classes");

    assertAllTestsClasspath("m1",
                            getProjectPath() + "/m1/target/test-classes",
                            getProjectPath() + "/m1/target/classes",
                            getProjectPath() + "/m2/target/classes",
                            getProjectPath() + "/m2/target/test-classes");
  }

  public void testOptionalLibraryDependencies() throws Exception {
    createRepositoryFile("jmock/jmock/1.0/jmock-1.0.jar");
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>jmock</groupId>" +
                                           "    <artifactId>jmock</artifactId>" +
                                           "    <version>1.0</version>" +
                                           "  </dependency>" +
                                           "  <dependency>" +
                                           "    <groupId>junit</groupId>" +
                                           "    <artifactId>junit</artifactId>" +
                                           "    <version>4.0</version>" +
                                           "    <optional>true</optional>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    importProjects(m1, m2);
    assertModules("m1", "m2");

    assertModuleScopes("m1", "m2");

    assertModuleModuleDeps("m1", "m2");
    assertModuleLibDeps("m1", "Maven: jmock:jmock:1.0");
    assertModuleLibDeps("m2", "Maven: jmock:jmock:1.0", "Maven: junit:junit:4.0");

    setupJdkForModules("m1", "m2");

    assertAllProductionSearchScope("m1",
                                   getProjectPath() + "/m1/src/main/java",
                                   getProjectPath() + "/m2/src/main/java",
                                   getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar");
    assertAllTestsSearchScope("m1",
                              getProjectPath() + "/m1/src/main/java",
                              getProjectPath() + "/m1/src/test/java",
                              getProjectPath() + "/m2/src/main/java",
                              getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar");

    assertAllProductionClasspath("m1",
                                 getProjectPath() + "/m1/target/classes",
                                 getProjectPath() + "/m2/target/classes",
                                 getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar");
    assertAllTestsClasspath("m1",
                            getProjectPath() + "/m1/target/test-classes",
                            getProjectPath() + "/m1/target/classes",
                            getProjectPath() + "/m2/target/classes",
                            getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar");

    assertAllProductionSearchScope("m2",
                                   getProjectPath() + "/m2/src/main/java",
                                   getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar",
                                   getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
    assertAllTestsSearchScope("m2",
                              getProjectPath() + "/m2/src/main/java",
                              getProjectPath() + "/m2/src/test/java",
                              getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar",
                              getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");

    assertAllProductionClasspath("m2",
                                 getProjectPath() + "/m2/target/classes",
                                 getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar",
                                 getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
    assertAllTestsClasspath("m2",
                            getProjectPath() + "/m2/target/test-classes",
                            getProjectPath() + "/m2/target/classes",
                            getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar",
                            getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
  }

  public void testProvidedAndTestDependencies() throws Exception {
    createRepositoryFile("jmock/jmock/4.0/jmock-4.0.jar");
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "    <scope>provided</scope>" +
                                           "  </dependency>" +
                                           "  <dependency>" +
                                           "    <groupId>junit</groupId>" +
                                           "    <artifactId>junit</artifactId>" +
                                           "    <version>4.0</version>" +
                                           "    <scope>provided</scope>" +
                                           "  </dependency>" +

                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m3</artifactId>" +
                                           "    <version>1</version>" +
                                           "    <scope>test</scope>" +
                                           "  </dependency>" +
                                           "  <dependency>" +
                                           "    <groupId>jmock</groupId>" +
                                           "    <artifactId>jmock</artifactId>" +
                                           "    <version>4.0</version>" +
                                           "    <scope>test</scope>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>");

    VirtualFile m3 = createModulePom("m3", "<groupId>test</groupId>" +
                                           "<artifactId>m3</artifactId>" +
                                           "<version>1</version>");

    importProjects(m1, m2, m3);
    assertModules("m1", "m2", "m3");

    setupJdkForModules("m1", "m2", "m3");

    assertModuleScopes("m1", "m2", "m3");

    assertCompileProductionSearchScope("m1",
                                       getProjectPath() + "/m1/src/main/java",
                                       getProjectPath() + "/m2/src/main/java",
                                       getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
    assertRuntimeProductionSearchScope("m1",
                                       getProjectPath() + "/m1/src/main/java",
                                       getProjectPath() + "/m2/src/main/java",
                                       getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
    assertAllTestsSearchScope("m1",
                              getProjectPath() + "/m1/src/main/java",
                              getProjectPath() + "/m1/src/test/java",
                              getProjectPath() + "/m2/src/main/java",
                              getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar",
                              getProjectPath() + "/m3/src/main/java",
                              getRepositoryPath() + "/jmock/jmock/4.0/jmock-4.0.jar");

    assertCompileProductionClasspath("m1",
                                     getProjectPath() + "/m1/target/classes",
                                     getProjectPath() + "/m2/target/classes",
                                     getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
    assertRuntimeProductionClasspath("m1",
                                     getProjectPath() + "/m1/target/classes");
    assertAllTestsClasspath("m1",
                            getProjectPath() + "/m1/target/test-classes",
                            getProjectPath() + "/m1/target/classes",
                            getProjectPath() + "/m2/target/classes",
                            getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar",
                            getProjectPath() + "/m3/target/classes",
                            getRepositoryPath() + "/jmock/jmock/4.0/jmock-4.0.jar");
  }

  public void testRuntimeDependency() throws Exception {
    createRepositoryFile("jmock/jmock/4.0/jmock-4.0.jar");
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "    <scope>runtime</scope>" +
                                           "  </dependency>" +
                                           "  <dependency>" +
                                           "    <groupId>junit</groupId>" +
                                           "    <artifactId>junit</artifactId>" +
                                           "    <version>4.0</version>" +
                                           "    <scope>runtime</scope>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>");

    importProjects(m1, m2);
    assertModules("m1", "m2");

    setupJdkForModules("m1", "m2");

    assertModuleScopes("m1", "m2");

    assertCompileProductionSearchScope("m1",
                                       getProjectPath() + "/m1/src/main/java");
    assertRuntimeProductionSearchScope("m1",
                                       getProjectPath() + "/m1/src/main/java",
                                       getProjectPath() + "/m2/src/main/java",
                                       getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
    assertAllTestsSearchScope("m1",
                              getProjectPath() + "/m1/src/main/java",
                              getProjectPath() + "/m1/src/test/java",
                              getProjectPath() + "/m2/src/main/java",
                              getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");

    assertCompileProductionClasspath("m1",
                                     getProjectPath() + "/m1/target/classes");

    assertRuntimeProductionClasspath("m1",
                                     getProjectPath() + "/m1/target/classes",
                                     getProjectPath() + "/m2/target/classes",
                                     getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");

    assertAllTestsClasspath("m1",
                            getProjectPath() + "/m1/target/test-classes",
                            getProjectPath() + "/m1/target/classes",
                            getProjectPath() + "/m2/target/classes",
                            getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
  }

  public void testDoNotIncludeProvidedAndTestTransitiveDependencies() throws Exception {
    createRepositoryFile("jmock/jmock/1.0/jmock-1.0.jar");
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>jmock</groupId>" +
                                           "    <artifactId>jmock</artifactId>" +
                                           "    <version>1.0</version>" +
                                           "    <scope>provided</scope>" +
                                           "  </dependency>" +
                                           "  <dependency>" +
                                           "    <groupId>junit</groupId>" +
                                           "    <artifactId>junit</artifactId>" +
                                           "    <version>4.0</version>" +
                                           "    <scope>test</scope>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    importProjects(m1, m2);
    assertModules("m1", "m2");

    assertModuleModuleDeps("m1", "m2");
    assertModuleLibDeps("m1");
    assertModuleLibDeps("m2", "Maven: jmock:jmock:1.0", "Maven: junit:junit:4.0");

    setupJdkForModules("m1", "m2");

    assertModuleScopes("m1", "m2");

    assertAllProductionSearchScope("m1",
                                   getProjectPath() + "/m1/src/main/java",
                                   getProjectPath() + "/m2/src/main/java");
    assertAllTestsSearchScope("m1",
                              getProjectPath() + "/m1/src/main/java",
                              getProjectPath() + "/m1/src/test/java",
                              getProjectPath() + "/m2/src/main/java");

    assertAllProductionClasspath("m1",
                                 getProjectPath() + "/m1/target/classes",
                                 getProjectPath() + "/m2/target/classes");
    assertAllTestsClasspath("m1",
                            getProjectPath() + "/m1/target/test-classes",
                            getProjectPath() + "/m1/target/classes",
                            getProjectPath() + "/m2/target/classes");


    assertCompileProductionSearchScope("m2",
                                       getProjectPath() + "/m2/src/main/java",
                                       getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar");
    assertRuntimeProductionSearchScope("m2",
                                       getProjectPath() + "/m2/src/main/java",
                                       getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar");
    assertAllTestsSearchScope("m2",
                              getProjectPath() + "/m2/src/main/java",
                              getProjectPath() + "/m2/src/test/java",
                              getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar",
                              getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");

    assertCompileProductionClasspath("m2",
                                     getProjectPath() + "/m2/target/classes",
                                     getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar");
    assertRuntimeProductionClasspath("m2",
                                     getProjectPath() + "/m2/target/classes");
    assertAllTestsClasspath("m2",
                            getProjectPath() + "/m2/target/test-classes",
                            getProjectPath() + "/m2/target/classes",
                            getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar",
                            getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
  }

  public void testLibraryScopeForTwoDependentModules() throws IOException {
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>" +
                                           "    <dependencies>" +
                                           "        <dependency>" +
                                           "            <groupId>junit</groupId>" +
                                           "            <artifactId>junit</artifactId>" +
                                           "            <version>4.0</version>" +
                                           "            <scope>provided</scope>" +
                                           "        </dependency>" +
                                           "    </dependencies>");
    importProjects(m1, m2);
    assertModules("m1", "m2");

    List<Module> modules = Arrays.asList(getModule("m1"), getModule("m2"));
    GlobalSearchScope scope = LibraryScopeCache.getInstance(myProject).getScopeForLibraryUsedIn(modules);
    String libraryPath = getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar";
    assertSearchScope(scope,
                      getProjectPath() + "/m1/src/main/java",
                      getProjectPath() + "/m1/src/test/java",
                      getProjectPath() + "/m2/src/main/java",
                      getProjectPath() + "/m2/src/test/java",
                      libraryPath);
  }

  public void testDoNotIncludeConflictingTransitiveDependenciesInTheClasspath() throws Exception {
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "  </dependency>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m3</artifactId>" +
                                           "    <version>1</version>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>junit</groupId>" +
                                           "    <artifactId>junit</artifactId>" +
                                           "    <version>4.0</version>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m3 = createModulePom("m3", "<groupId>test</groupId>" +
                                           "<artifactId>m3</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>junit</groupId>" +
                                           "    <artifactId>junit</artifactId>" +
                                           "    <version>4.5</version>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    importProjects(m1, m2, m3);
    assertModules("m1", "m2", "m3");

    assertModuleModuleDeps("m1", "m2", "m3");
    assertModuleLibDeps("m1", "Maven: junit:junit:4.0");

    setupJdkForModules("m1", "m2", "m3");

    assertModuleScopes("m1", "m2", "m3");

    assertAllTestsSearchScope("m1",
                              getProjectPath() + "/m1/src/main/java",
                              getProjectPath() + "/m1/src/test/java",
                              getProjectPath() + "/m2/src/main/java",
                              getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar",
                              getProjectPath() + "/m3/src/main/java");

    assertAllTestsClasspath("m1",
                            getProjectPath() + "/m1/target/test-classes",
                            getProjectPath() + "/m1/target/classes",
                            getProjectPath() + "/m2/target/classes",
                            getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar",
                            getProjectPath() + "/m3/target/classes");
  }

  public void _testAdditionalClasspathElementsInTests() throws Exception {
    File iof1 = new File(myDir, "foo/bar1");
    File iof2 = new File(myDir, "foo/bar2");
    iof1.mkdirs();
    iof2.mkdirs();
    VirtualFile f1 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(iof1);
    VirtualFile f2 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(iof2);
    VirtualFile f3 = createProjectSubDir("m1/foo/bar3");

    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>junit</groupId>" +
                                           "    <artifactId>junit</artifactId>" +
                                           "    <version>4.0</version>" +
                                           "  </dependency>" +
                                           "</dependencies>" +

                                           "<build>" +
                                           "  <plugins>" +
                                           "    <plugin>" +
                                           "      <groupId>org.apache.maven.plugins</groupId>" +
                                           "      <artifactId>maven-surefire-plugin</artifactId>" +
                                           "      <version>2.5</version>" +
                                           "      <configuration>" +
                                           "        <additionalClasspathElements>" +
                                           "          <additionalClasspathElement>" + f1.getPath() + "</additionalClasspathElement>" +
                                           "          <additionalClasspathElement>" + f2.getPath() + "</additionalClasspathElement>" +
                                           "          <additionalClasspathElement>${project.basedir}/foo/bar3</additionalClasspathElement>" +
                                           "        </additionalClasspathElements>" +
                                           "      </configuration>" +
                                           "    </plugin>" +
                                           "  </plugins>" +
                                           "</build>");

    importProjects(m1);
    assertModules("m1");

    assertModuleModuleDeps("m1");
    assertModuleLibDeps("m1", "Maven: junit:junit:4.0", MavenModuleImporter.SUREFIRE_PLUGIN_LIBRARY_NAME);

    setupJdkForModules("m1");

    //assertModuleSearchScope("m1",
    //                        getProjectPath() + "/m1/src/main/java",
    //                        getProjectPath() + "/m1/src/test/java",
    //                        f1.getPath(),
    //                        f2.getPath());

    assertAllProductionSearchScope("m1",
                                   getProjectPath() + "/m1/src/main/java",
                                   getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
    assertAllTestsSearchScope("m1",
                              getProjectPath() + "/m1/src/main/java",
                              getProjectPath() + "/m1/src/test/java",
                              getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar",
                              f1.getPath(),
                              f2.getPath(),
                              f3.getPath());

    assertAllProductionClasspath("m1",
                                 getProjectPath() + "/m1/target/classes",
                                 getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
    assertAllTestsClasspath("m1",
                            getProjectPath() + "/m1/target/test-classes",
                            getProjectPath() + "/m1/target/classes",
                            getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar",
                            f1.getPath(),
                            f2.getPath(),
                            f3.getPath());
  }

  public void testDoNotChangeClasspathForRegularModules() throws Exception {
    VirtualFile m1 = createModulePom("m1", "<groupId>test</groupId>" +
                                           "<artifactId>m1</artifactId>" +
                                           "<version>1</version>" +

                                           "<dependencies>" +
                                           "  <dependency>" +
                                           "    <groupId>test</groupId>" +
                                           "    <artifactId>m2</artifactId>" +
                                           "    <version>1</version>" +
                                           "    <scope>runtime</scope>" +
                                           "    <optional>true</optional>" +
                                           "  </dependency>" +
                                           "  <dependency>" +
                                           "    <groupId>junit</groupId>" +
                                           "    <artifactId>junit</artifactId>" +
                                           "    <version>4.0</version>" +
                                           "    <scope>provided</scope>" +
                                           "    <optional>true</optional>" +
                                           "  </dependency>" +
                                           "</dependencies>");

    VirtualFile m2 = createModulePom("m2", "<groupId>test</groupId>" +
                                           "<artifactId>m2</artifactId>" +
                                           "<version>1</version>");

    importProjects(m1, m2);
    assertModules("m1", "m2");

    final Module user = createModule("user");

    new WriteCommandAction.Simple(myProject) {
      @Override
      protected void run() throws Throwable {
        ModuleRootModificationUtil.addDependency(user, getModule("m1"));
        VirtualFile out = user.getModuleFile().getParent().createChildDirectory(this, "output");
        VirtualFile testOut = user.getModuleFile().getParent().createChildDirectory(this, "test-output");
        PsiTestUtil.setCompilerOutputPath(user, out.getUrl(), false);
        PsiTestUtil.setCompilerOutputPath(user, testOut.getUrl(), true);
      }
    }.execute().throwException();


    assertModuleModuleDeps("m1", "m2");
    assertModuleLibDeps("m1", "Maven: junit:junit:4.0");

    assertModuleModuleDeps("user", "m1");
    assertModuleLibDeps("user");

    setupJdkForModules("m1", "m2", "user");

    // todo check search scopes
    assertModuleScopes("m1", "m2");

    assertCompileProductionClasspath("user",
                                     getProjectPath() + "/user/output",
                                     getProjectPath() + "/m1/target/classes",
                                     getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");

    assertRuntimeProductionClasspath("user",
                                     getProjectPath() + "/user/output",
                                     getProjectPath() + "/m1/target/classes",
                                     getProjectPath() + "/m2/target/classes");

    assertCompileTestsClasspath("user",
                                getProjectPath() + "/user/test-output",
                                getProjectPath() + "/user/output",
                                getProjectPath() + "/m1/target/test-classes",
                                getProjectPath() + "/m1/target/classes",
                                getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");

    assertRuntimeTestsClasspath("user",
                                getProjectPath() + "/user/test-output",
                                getProjectPath() + "/user/output",
                                getProjectPath() + "/m1/target/test-classes",
                                getProjectPath() + "/m1/target/classes",
                                getProjectPath() + "/m2/target/test-classes",
                                getProjectPath() + "/m2/target/classes",
                                getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");

    assertCompileProductionClasspath("m1",
                                     getProjectPath() + "/m1/target/classes",
                                     getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
    assertRuntimeProductionClasspath("m1",
                                     getProjectPath() + "/m1/target/classes",
                                     getProjectPath() + "/m2/target/classes");
    assertAllTestsClasspath("m1",
                            getProjectPath() + "/m1/target/test-classes",
                            getProjectPath() + "/m1/target/classes",
                            getProjectPath() + "/m2/target/classes",
                            getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar");
  }

  private void assertAllProductionClasspath(String moduleName, String... paths) throws Exception {
    assertCompileProductionClasspath(moduleName, paths);
    assertRuntimeProductionClasspath(moduleName, paths);
  }

  private void assertAllTestsClasspath(String moduleName, String... paths) throws Exception {
    assertCompileTestsClasspath(moduleName, paths);
    assertRuntimeTestsClasspath(moduleName, paths);
  }

  private void assertCompileProductionClasspath(String moduleName, String... paths) throws Exception {
    assertClasspath(moduleName, Scope.COMPILE, Type.PRODUCTION, paths);
  }

  private void assertCompileTestsClasspath(String moduleName, String... paths) throws Exception {
    assertClasspath(moduleName, Scope.COMPILE, Type.TESTS, paths);
  }

  private void assertRuntimeProductionClasspath(String moduleName, String... paths) throws Exception {
    assertClasspath(moduleName, Scope.RUNTIME, Type.PRODUCTION, paths);
  }

  private void assertRuntimeTestsClasspath(String moduleName, String... paths) throws Exception {
    assertClasspath(moduleName, Scope.RUNTIME, Type.TESTS, paths);
  }

  private void assertClasspath(String moduleName, Scope scope, Type type, String... expectedPaths) throws Exception {
    createOutputDirectories();

    PathsList actualPathsList;
    Module module = getModule(moduleName);

    if (scope == Scope.RUNTIME) {
      JavaParameters params = new JavaParameters();
      params.configureByModule(module, type == Type.TESTS ? JavaParameters.CLASSES_AND_TESTS : JavaParameters.CLASSES_ONLY);
      actualPathsList = params.getClassPath();
    }
    else {
      OrderEnumerator en = OrderEnumerator.orderEntries(module).recursively().withoutSdk().compileOnly();
      if (type == Type.PRODUCTION) en.productionOnly();
      actualPathsList = en.classes().getPathsList();
    }

    assertPaths(expectedPaths, actualPathsList.getPathList());
  }

  private void assertModuleScopes(String... modules) throws Exception {
    for (String each : modules) {
      assertModuleSearchScope(each,
                              getProjectPath() + "/" + each + "/src/main/java",
                              getProjectPath() + "/" + each + "/src/test/java");
    }
  }

  private void assertModuleSearchScope(String moduleName, String... paths) throws Exception {
    assertSearchScope(moduleName, Scope.MODULE, null, paths);
  }

  private void assertAllProductionSearchScope(String moduleName, String... paths) throws Exception {
    assertCompileProductionSearchScope(moduleName, paths);
    assertRuntimeProductionSearchScope(moduleName, paths);
  }

  private void assertAllTestsSearchScope(String moduleName, String... paths) throws Exception {
    assertCompileTestsSearchScope(moduleName, paths);
    assertRuntimeTestsSearchScope(moduleName, paths);
  }

  private void assertCompileProductionSearchScope(String moduleName, String... paths) throws Exception {
    assertSearchScope(moduleName, Scope.COMPILE, Type.PRODUCTION, paths);
  }

  private void assertCompileTestsSearchScope(String moduleName, String... paths) throws Exception {
    assertSearchScope(moduleName, Scope.COMPILE, Type.TESTS, paths);
  }

  private void assertRuntimeProductionSearchScope(String moduleName, String... paths) throws Exception {
    assertSearchScope(moduleName, Scope.RUNTIME, Type.PRODUCTION, paths);
  }

  private void assertRuntimeTestsSearchScope(String moduleName, String... paths) throws Exception {
    assertSearchScope(moduleName, Scope.RUNTIME, Type.TESTS, paths);
  }

  private void assertSearchScope(String moduleName, Scope scope, Type type, String... expectedPaths) {
    createOutputDirectories();
    Module module = getModule(moduleName);

    GlobalSearchScope searchScope = null;
    switch (scope) {
      case MODULE:
        searchScope = module.getModuleScope();
        break;
      case COMPILE:
        searchScope = module.getModuleWithDependenciesAndLibrariesScope(type == Type.TESTS);
        break;
      case RUNTIME:
        searchScope = module.getModuleRuntimeScope(type == Type.TESTS);
        break;
    }

    assertSearchScope(searchScope, expectedPaths);
  }

  private void assertSearchScope(GlobalSearchScope searchScope, String... expectedPaths) {
    Collection<VirtualFile> roots;
    if (searchScope instanceof ModuleWithDependenciesScope) {
      roots = ((ModuleWithDependenciesScope)searchScope).getRoots();
    }
    else {
      roots = ((LibraryRuntimeClasspathScope)searchScope).getRoots();
    }
    final List<VirtualFile> entries = new ArrayList<VirtualFile>(roots);
    entries.removeAll(Arrays.asList(ProjectRootManager.getInstance(myProject).orderEntries().sdkOnly().classes().getRoots()));

    List<String> actualPaths = new ArrayList<String>();
    for (VirtualFile each : entries) {
      actualPaths.add(each.getPresentableUrl());
    }

    assertPaths(expectedPaths, actualPaths);
  }

  private static void assertPaths(String[] expectedPaths, List<String> actualPaths) {
    List<String> normalizedActualPaths = new ArrayList<String>();
    List<String> normalizedExpectedPaths = new ArrayList<String>();

    for (String each : actualPaths) {
      normalizedActualPaths.add(FileUtil.toSystemDependentName(each));
    }
    for (String each : expectedPaths) {
      normalizedExpectedPaths.add(FileUtil.toSystemDependentName(each));
    }

    assertOrderedElementsAreEqual(normalizedActualPaths, normalizedExpectedPaths);
  }

  private void createRepositoryFile(String filePath) throws IOException {
    File f = new File(getProjectPath(), "repo/" + filePath);
    f.getParentFile().mkdirs();

    ArtifactsDownloadingTestCase.createEmptyJar(f.getParent(), f.getName());
    setRepositoryPath(createProjectSubDir("repo").getPath());
  }

  private void createOutputDirectories() {
    for (Module module : ModuleManager.getInstance(myProject).getModules()) {
      CompilerModuleExtension extension = CompilerModuleExtension.getInstance(module);
      if (extension != null) {
        createDirectoryIfDoesntExist(extension.getCompilerOutputUrl());
        createDirectoryIfDoesntExist(extension.getCompilerOutputUrlForTests());
      }
    }
  }

  private static void createDirectoryIfDoesntExist(@Nullable String url) {
    if (StringUtil.isEmpty(url)) return;

    File file = new File(FileUtil.toSystemDependentName(VfsUtil.urlToPath(url)));
    if (file.exists()) return;

    if (!file.mkdirs()) {
      fail("Cannot create directory " + file);
    }
    VirtualFileManager.getInstance().refreshAndFindFileByUrl(url);
  }
}
