package org.projectusus.core.filerelations.model.test;
import static org.mockito.Mockito.mock;
import org.eclipse.core.resources.IFile;
import org.hamcrest.Matcher;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.projectusus.core.filerelations.model.ClassDescriptor;
import org.projectusus.core.filerelations.model.Classname;
import org.projectusus.core.filerelations.model.IntraPackageComponents;
import org.projectusus.core.filerelations.model.Packagename;
public class IntraPackageComponentsTest {
private Packagename pkg1 = Packagename.of( "pkg1", null );
private Packagename pkg2 = Packagename.of( "pkg2", null );
@Before
public void setup() {
ClassDescriptor.clear();
}
@Test
public void emptyPackageYieldsNoComponents() {
assertThat( new IntraPackageComponents().getComponents().size(), is( 0 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().keySet().size(), is( 0 ) );
}
@Test
public void packageWithOneClassYieldsOneComponent() {
addDescriptor( "pkg" );
assertThat( new IntraPackageComponents().getComponents().size(), is( 1 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().keySet().size(), is( 1 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().values().iterator().next().size(), is( 1 ) );
}
@Test
public void packageWithTwoUnconnectedClassesInSamePackageYieldsTwoComponents() {
addDescriptor( "pkg" );
addDescriptor( "pkg" );
assertThat( new IntraPackageComponents().getComponents().size(), is( 2 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().keySet().size(), is( 1 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().values().iterator().next().size(), is( 2 ) );
}
@Test
public void packageWithTwoConnectedClassesInSamePackageYieldsOneComponent() {
ClassDescriptor parent = addDescriptor( "pkg" );
ClassDescriptor child = addDescriptor( "pkg" );
parent.addChild( child );
assertThat( new IntraPackageComponents().getComponents().size(), is( 1 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().keySet().size(), is( 1 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().values().iterator().next().size(), is( 1 ) );
}
@Test
public void twoPackagesWithTwoUnconnectedClassesInDifferentPackagesYieldsTwoComponents() {
addDescriptor( pkg1 );
addDescriptor( pkg2 );
assertThat( new IntraPackageComponents().getComponents().size(), is( 2 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().keySet().size(), is( 2 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().get( pkg1 ).size(), is( 1 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().get( pkg2 ).size(), is( 1 ) );
}
@Test
public void twoPackagesWithTwoConnectedClassesInDifferentPackagesYieldsTwoComponents() {
ClassDescriptor parent = addDescriptor( pkg1 );
ClassDescriptor child = addDescriptor( pkg2 );
parent.addChild( child );
assertThat( new IntraPackageComponents().getComponents().size(), is( 2 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().keySet().size(), is( 2 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().get( pkg1 ).size(), is( 1 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().get( pkg2 ).size(), is( 1 ) );
}
@Test
public void twoPackagesWithFourClassesConnectedOnlyWithinEachPackageYieldsTwoComponents() {
ClassDescriptor p1c1 = addDescriptor( pkg1 );
ClassDescriptor p1c2 = addDescriptor( pkg1 );
p1c1.addChild( p1c2 );
ClassDescriptor p2c1 = addDescriptor( pkg2 );
ClassDescriptor p2c2 = addDescriptor( pkg2 );
p2c1.addChild( p2c2 );
assertThat( new IntraPackageComponents().getComponents().size(), is( 2 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().keySet().size(), is( 2 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().get( pkg1 ).size(), is( 1 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().get( pkg2 ).size(), is( 1 ) );
}
@Test
public void twoPackagesWithFourClassesConnectedOnlyAcrossPackagesYieldsFourComponents() {
ClassDescriptor p1c1 = addDescriptor( pkg1 );
ClassDescriptor p1c2 = addDescriptor( pkg1 );
ClassDescriptor p2c1 = addDescriptor( pkg2 );
ClassDescriptor p2c2 = addDescriptor( pkg2 );
p1c1.addChild( p2c1 );
p1c2.addChild( p2c2 );
assertThat( new IntraPackageComponents().getComponents().size(), is( 4 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().keySet().size(), is( 2 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().get( pkg1 ).size(), is( 2 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().get( pkg2 ).size(), is( 2 ) );
}
@Test
public void twoPackagesWithFourClassesFullyConnectedYieldsTwoComponents() {
ClassDescriptor p1c1 = addDescriptor( pkg1 );
ClassDescriptor p1c2 = addDescriptor( pkg1 );
ClassDescriptor p2c1 = addDescriptor( pkg2 );
ClassDescriptor p2c2 = addDescriptor( pkg2 );
p1c1.addChild( p2c1 );
p1c1.addChild( p1c2 );
p1c2.addChild( p2c2 );
p2c1.addChild( p2c2 );
assertThat( new IntraPackageComponents().getComponents().size(), is( 2 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().keySet().size(), is( 2 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().get( pkg1 ).size(), is( 1 ) );
assertThat( new IntraPackageComponents().getSetsPerPackage().get( pkg2 ).size(), is( 1 ) );
}
private ClassDescriptor addDescriptor( String packagename ) {
return addDescriptor( Packagename.of( packagename, null ) );
}
private ClassDescriptor addDescriptor( Packagename pkg ) {
IFile file = mock( IFile.class );
Classname classname = mock( Classname.class );
return ClassDescriptor.of( file, classname, pkg );
}
private Matcher<Integer> is( int i ) {
return Matchers.is( Integer.valueOf( i ) );
}
private void assertThat( int size, Matcher<Integer> matcher ) {
Assert.assertThat( Integer.valueOf( size ), matcher );
}
}