import static org.hamcrest.CoreMatchers.hasItems; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import io.pivotal.tooling.model.eclipse.StsEclipseProject; import io.pivotal.tooling.model.eclipse.StsEclipseProjectDependency; import java.io.File; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.publish.maven.plugins.MavenPublishPlugin; import org.gradle.tooling.GradleConnector; import org.gradle.tooling.ModelBuilder; import org.gradle.tooling.ProjectConnection; import org.gradle.tooling.internal.consumer.DefaultGradleConnector; import org.gradle.tooling.model.DomainObjectSet; import org.gradle.tooling.model.ExternalDependency; import org.gradle.tooling.model.eclipse.EclipseProject; import org.junit.BeforeClass; import org.junit.Test; public class StsEclipseProjectTest { static StsEclipseProject root; static ProjectConnection connection; @BeforeClass public static void beforeClass() throws URISyntaxException { GradleConnector connector = GradleConnector.newConnector(); connector.forProjectDirectory(file("projects/multiproject")); connection = connector.connect(); ModelBuilder<StsEclipseProject> customModelBuilder = connection.model(StsEclipseProject.class); customModelBuilder.setJvmArguments( "-Dorg.springsource.ide.eclipse.gradle.toolingApiRepo=" + file("../../org.springsource.ide.eclipse.gradle.toolingapi/lib").getAbsolutePath(), "-Dorg.springsource.ide.eclipse.gradle.toolingApiEquivalentBinaryVersion=latest.integration" ); customModelBuilder.withArguments("--init-script", file("projects/init.gradle").getAbsolutePath()); root = customModelBuilder.get(); } @Test public void eachProjectContainsAPointerToTheRoot() { assertEquals(root, project("a").getRoot()); assertEquals(root, project("b").getRoot()); assertEquals(root, root.getRoot()); } @Test public void projectWithNoJavaPluginHasEmptyClasspath() { assertTrue(root.getClasspath().isEmpty()); } @Test public void rootProjectContainsResolvedHierarchyOfAllChildProjects() { List<String> projectNames = new ArrayList<String>(); for (StsEclipseProject project : root.getChildren()) projectNames.add(project.getGradleProject().getName()); assertThat(projectNames, hasItems("a", "b", "minus", "plus")); } @Test public void allBinaryTransitivesAreDiscovered() { StsEclipseProject a = project("a"); StsEclipseProject b = project("b"); assertEquals(0, a.getChildren().size()); assertEquals(7, a.getClasspath().size()); List<String> moduleNames = new ArrayList<String>(); for (ExternalDependency dependency : a.getClasspath()) moduleNames.add(dependency.getGradleModuleVersion().getName()); assertThat(moduleNames, hasItems("guava")); assertEquals(0, b.getChildren().size()); moduleNames.clear(); for (ExternalDependency dependency : b.getClasspath()) moduleNames.add(dependency.getGradleModuleVersion().getName()); assertEquals(0, b.getChildren().size()); assertEquals(8, b.getClasspath().size()); assertThat(moduleNames, hasItems("jackson-dataformat-xml")); } @Test public void externalEquivalentsOfProjectReferencesAreDiscoverable() { // Publish a binary form of both 'a' and 'b' to Maven Local connection.newBuild().forTasks("publish").run(); StsEclipseProject a = project("a"); ExternalDependency depWithExternalEquivalent = a.getProjectDependencies().iterator().next().getExternalEquivalent(); assertEquals("b-1.0.jar", depWithExternalEquivalent.getFile().getName()); assertEquals("b-1.0-sources.jar", depWithExternalEquivalent.getSource().getName()); } @Test public void projectDependenciesContainReferenceToTheirProjectsGradleModuleVersion() { assertEquals("b", project("a").getProjectDependencies().iterator().next().getGradleModuleVersion().getName()); } @Test public void canDetermineIfProjectHasPluginApplied() { StsEclipseProject a = project("a"); StsEclipseProject b = project("b"); assertTrue(a.hasPlugin(JavaPlugin.class)); assertTrue(a.hasPlugin(MavenPublishPlugin.class)); assertTrue(b.hasPlugin(JavaPlugin.class)); assertTrue(b.hasPlugin(MavenPublishPlugin.class)); assertFalse(root.hasPlugin(JavaPlugin.class)); } @Test public void minusConfigurationsResultsInResolutionOfAllConfigurationsExceptForThoseSpecified() { StsEclipseProject minus = project("minus"); assertEquals(2, minus.getClasspath().size()); List<String> moduleNames = new ArrayList<String>(); for (ExternalDependency dep : minus.getClasspath()) moduleNames.add(dep.getGradleModuleVersion().getName()); assertThat(moduleNames, hasItems("hamcrest-core", "junit")); } @Test public void plusConfigurationsResultsInResolutionOfAdditionalConfigurations() { assertEquals(2, project("plus").getClasspath().size()); } @Test public void projectHasListOfPublications() { assertEquals("a", project("a").getPublications().getAt(0).getName()); } @Test public void projectHasName() { assertEquals("a", project("a").getName()); } @Test public void projectDependencyCyclesAreResolvable() throws URISyntaxException { GradleConnector connector = GradleConnector.newConnector(); connector.forProjectDirectory(file("projects/multiproject-cycle")); ModelBuilder<StsEclipseProject> customModelBuilder = connector.connect().model(StsEclipseProject.class); customModelBuilder.setJvmArguments( "-Dorg.springsource.ide.eclipse.gradle.toolingApiRepo=" + file("../../org.springsource.ide.eclipse.gradle.toolingapi/lib").getAbsolutePath(), "-Dorg.springsource.ide.eclipse.gradle.toolingApiEquivalentBinaryVersion=latest.integration" ); customModelBuilder.withArguments("--init-script", file("projects/init.gradle").getAbsolutePath()); StsEclipseProject project = customModelBuilder.get().getChildren().iterator().next(); System.out.println("name: " + project.getName()); System.out.println("path: " + project.getPath()); for (StsEclipseProjectDependency dependency : project.getProjectDependencies()) { System.out.println(dependency.getTargetProject().getName()); } assertEquals(1, project.getProjectDependencies().size()); } @Test public void gradleApiDependencyAddsMoreThanOneJarToClasspath() { DefaultGradleConnector connector = (DefaultGradleConnector) GradleConnector.newConnector(); connector.embedded(true); connector.forProjectDirectory(file("projects/pluginproject")); EclipseProject eclipseProject = connector.connect().model(EclipseProject.class).get(); assertTrue(eclipseProject.getClasspath().size() > 1); System.setProperty("org.springsource.ide.eclipse.gradle.toolingApiRepo", file("../../org.springsource.ide.eclipse.gradle.toolingapi/lib").getAbsolutePath()); System.setProperty("org.springsource.ide.eclipse.gradle.toolingApiEquivalentBinaryVersion", "latest.integration"); ModelBuilder<StsEclipseProject> customModelBuilder = connector.connect().model(StsEclipseProject.class); customModelBuilder.withArguments("--init-script", file("projects/init.gradle").getAbsolutePath()); assertEquals(eclipseProject.getClasspath().size(), customModelBuilder.get().getClasspath().size()); } StsEclipseProject project(String name) { for (StsEclipseProject project : root.getChildren()) if(project.getGradleProject().getName().equals(name)) return project; return null; } static File file(String path) { return new File(System.getProperty("user.dir"), path); } }