package org.projectusus.ui.dependencygraph.sourcefolder; import static org.eclipse.jdt.core.IPackageFragmentRoot.K_BINARY; import static org.eclipse.jdt.core.IPackageFragmentRoot.K_SOURCE; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.empty; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.Set; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaModelException; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; import org.junit.Test; public class SourceFolderScannerTest { private final SourceFolderScanner sourceFolderScanner = new SourceFolderScanner(); @Test public void scanSingleProject() throws Exception { IPackageFragmentRoot root = packageFragmentRoot( new Path( "Bla/src/main/java" ), K_SOURCE ); IJavaProject project = javaProject( new Path( "Bla" ), root ); Set<IPath> sourceFolders = sourceFolderScanner.scan( project ); assertThat( sourceFolders, contains( path( "src/main/java" ) ) ); } @Test public void scanEmptyProject() throws Exception { IJavaProject project = javaProject( new Path( "Bla" ) ); Set<IPath> sourceFolders = sourceFolderScanner.scan( project ); assertThat( sourceFolders, is( empty() ) ); } @SuppressWarnings( "unchecked" ) @Test public void scanSingleProjectWithMultipleFragmentRoots() throws Exception { IPackageFragmentRoot mainRoot = packageFragmentRoot( new Path( "Bla/src/main/java" ), K_SOURCE ); IPackageFragmentRoot testRoot = packageFragmentRoot( new Path( "Bla/src/test/java" ), K_SOURCE ); IJavaProject project = javaProject( new Path( "Bla" ), mainRoot, testRoot ); Set<IPath> sourceFolders = sourceFolderScanner.scan( project ); assertThat( sourceFolders, contains( path( "src/main/java" ), path( "src/test/java" ) ) ); } @SuppressWarnings( "unchecked" ) @Test public void scanMultipleProjects() throws Exception { IPackageFragmentRoot mainRoot = packageFragmentRoot( new Path( "Bla/src/main/java" ), K_SOURCE ); IJavaProject project1 = javaProject( new Path( "Bla" ), mainRoot ); IPackageFragmentRoot testRoot = packageFragmentRoot( new Path( "Foo/src/test/java" ), K_SOURCE ); IJavaProject project2 = javaProject( new Path( "Foo" ), testRoot ); Set<IPath> sourceFolders = sourceFolderScanner.scan( project1, project2 ); assertThat( sourceFolders, contains( path( "src/main/java" ), path( "src/test/java" ) ) ); } @Test public void testSetWithIPaths() throws Exception { IPackageFragmentRoot mainRoot = packageFragmentRoot( new Path( "Bla/src/main/java" ), K_SOURCE ); IPackageFragmentRoot secondMainRoot = packageFragmentRoot( new Path( "Bla/src/main/java" ), K_SOURCE ); IJavaProject project = javaProject( new Path( "Bla" ), mainRoot, secondMainRoot ); Set<IPath> sourceFolders = sourceFolderScanner.scan( project ); assertThat( sourceFolders, contains( path( "src/main/java" ) ) ); } @Test public void ignoresBinaryPackageFragmentRoots() throws Exception { IPackageFragmentRoot mainRoot = packageFragmentRoot( new Path( "Bla/src/main/java" ), K_SOURCE ); IPackageFragmentRoot secondMainRoot = packageFragmentRoot( new Path( "Bla/lib/some.jar" ), K_BINARY ); IJavaProject project = javaProject( new Path( "Bla" ), mainRoot, secondMainRoot ); Set<IPath> sourceFolders = sourceFolderScanner.scan( project ); assertThat( sourceFolders, contains( path( "src/main/java" ) ) ); } private Matcher<IPath> path( final String pathAsString ) { return new TypeSafeMatcher<IPath>() { public void describeTo( Description description ) { description.appendText( "path " + pathAsString ); } @Override protected boolean matchesSafely( IPath path ) { return pathAsString.equals( path.toPortableString() ); } }; } private static IJavaProject javaProject( Path path, IPackageFragmentRoot... roots ) throws Exception { IJavaProject javaProject = mock( IJavaProject.class ); when( javaProject.getPath() ).thenReturn( path ); when( javaProject.getPackageFragmentRoots() ).thenReturn( roots ); return javaProject; } private static IPackageFragmentRoot packageFragmentRoot( IPath path, int kind ) throws JavaModelException { IPackageFragmentRoot packageFragmentRoot = mock( IPackageFragmentRoot.class ); when( packageFragmentRoot.getPath() ).thenReturn( path ); when( Integer.valueOf( packageFragmentRoot.getKind() ) ).thenReturn( Integer.valueOf( kind ) ); return packageFragmentRoot; } }