package org.projectusus.core.filerelations.model.test;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import java.util.Set;
import org.eclipse.core.resources.IFile;
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.CrossPackageClassRelations;
import org.projectusus.core.filerelations.model.Packagename;
import org.projectusus.core.statistics.UsusModelProvider;
public class CrossPackageClassRelationsTest {
@Before
public void setup() {
UsusModelProvider.clear();
}
@Test
public void emptyProject_NoCrossPackageRelations() {
assertEquals( 0, new CrossPackageClassRelations().getAllDirectRelations().size() );
}
@Test
public void oneClassInOneFile_NoCrossPackageRelations() {
createClassDescriptor( "Descriptor1" );
assertEquals( 0, new CrossPackageClassRelations().getAllDirectRelations().size() );
}
@Test
public void twoClassesInOnePackageKnowEachOther_NoCrossPackageRelations() {
ClassDescriptor descriptor1 = createClassDescriptorWithSamePackage( "Descriptor2" );
ClassDescriptor descriptor2 = createClassDescriptorWithSamePackage( "Descriptor3" );
descriptor1.addChild( descriptor2 );
descriptor2.addChild( descriptor1 );
checkTwoNodesWithOneChildEach( ClassDescriptor.getAll() );
assertEquals( 0, new CrossPackageClassRelations().getAllDirectRelations().size() );
}
@Test
public void twoClassesInTwoPackagesOneKnowsTheOther_OneCrossPackageRelation() {
ClassDescriptor descriptor1 = createClassDescriptor( "Descriptor4" );
ClassDescriptor descriptor2 = createClassDescriptor( "Descriptor5" );
descriptor1.addChild( descriptor2 );
Set<ClassDescriptor> descriptors = ClassDescriptor.getAll();
assertEquals( 2, descriptors.size() );
assertEquals( 1, descriptor1.getChildren().size() );
assertEquals( 0, descriptor2.getChildren().size() );
assertEquals( 1, new CrossPackageClassRelations().getAllDirectRelations().size() );
}
@Test
public void twoClassesInTwoPackagesKnowEachOther_TwoCrossPackageRelations() {
ClassDescriptor descriptor1 = createClassDescriptor( "Descriptor6" );
ClassDescriptor descriptor2 = createClassDescriptor( "Descriptor7" );
descriptor1.addChild( descriptor2 );
descriptor2.addChild( descriptor1 );
checkTwoNodesWithOneChildEach( ClassDescriptor.getAll() );
assertEquals( 2, new CrossPackageClassRelations().getAllDirectRelations().size() );
}
private static ClassDescriptor createClassDescriptor( String name ) {
IFile file = mock( IFile.class );
return ClassDescriptor.of( file, new Classname( name ), Packagename.of( name, null ) );
}
private static ClassDescriptor createClassDescriptorWithSamePackage( String name ) {
IFile file = mock( IFile.class );
return ClassDescriptor.of( file, new Classname( name ), Packagename.of( "packagename", null ) );
}
private void checkTwoNodesWithOneChildEach( Set<ClassDescriptor> descriptors ) {
assertEquals( 2, descriptors.size() );
ClassDescriptor node = descriptors.iterator().next();
assertEquals( 1, node.getChildren().size() );
node = descriptors.iterator().next();
assertEquals( 1, node.getChildren().size() );
}
}