// Copyright 2016 Pants project contributors (see CONTRIBUTORS.md).
// Licensed under the Apache License, Version 2.0 (see LICENSE).
package com.twitter.intellij.pants.integration;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.SourceFolder;
import com.intellij.openapi.vfs.VirtualFile;
import com.twitter.intellij.pants.testFramework.OSSPantsIntegrationTest;
import com.twitter.intellij.pants.util.PantsUtil;
import java.io.File;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
public class ResolveIntegrationTest extends OSSPantsIntegrationTest {
/**
* In the test case, `testModule` and `resourceModule` have the same content root.
* We need to make sure they are modified to have empty content roots, but both
* depends on the artificial `commonModule` created.
*/
public void testTestsResourcesCommonContentRoot() throws Throwable {
doImport("intellij-integration/extras/");
String testModuleName = "intellij-integration_extras_src_test_java_java";
String resourceModuleName = "intellij-integration_extras_src_test_java_resources";
String commonModuleName = "intellij-integration_extras_src_test_java_common_sources";
assertFirstSourcePartyModules(
testModuleName,
resourceModuleName,
commonModuleName,
"intellij-integration_extras_src_main_java_org_pantsbuild_testproject_lib",
"intellij-integration_extras_module"
);
Module testModule = getModule(testModuleName);
Module resourceModule = getModule(resourceModuleName);
Module commonModule = getModule(commonModuleName);
assertTrue(ModuleRootManager.getInstance(testModule).isDependsOn(commonModule));
assertTrue(ModuleRootManager.getInstance(resourceModule).isDependsOn(commonModule));
assertEmptyModuleContentRoot(testModule);
assertEmptyModuleContentRoot(resourceModule);
assertContainsTestSourceContentEntry(commonModule);
String buildRoot = PantsUtil.findBuildRoot(commonModule).get().getPath();
assertModuleContentRoots(
commonModule,
buildRoot + "/intellij-integration/extras/src/test/java"
);
}
private void assertEmptyModuleContentRoot(Module module) {
assertModuleContentRoots(module);
}
private void assertContainsTestSourceContentEntry(Module module) {
assertTrue(
String.format("'%s' does not contain any test source content entry.", module.getName()),
// flatten all source folders in all module's content entries, then check for test source.
Arrays.stream(ModuleRootManager.getInstance(module).getContentEntries())
.flatMap(contentEntry -> Arrays.stream(contentEntry.getSourceFolders()))
.anyMatch(SourceFolder::isTestSource)
);
}
private void assertModuleContentRoots(Module module, String... expectedRoots) {
Set<String> actualContentRootPaths =
Arrays.stream(ModuleRootManager.getInstance(module).getContentRoots())
.map(VirtualFile::getPath)
.map(File::new)
.map(File::getAbsolutePath)
.collect(Collectors.toSet());
Set<String> expectedContentRootPaths = Arrays.stream(expectedRoots)
.map(File::new)
.map(File::getAbsolutePath)
.collect(Collectors.toSet());
assertEquals(expectedContentRootPaths, actualContentRootPaths);
}
}