package org.projectusus.core.filerelations.model.classdescriptortest;
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.ClassDescriptorCleanup;
import org.projectusus.core.filerelations.model.Classname;
import org.projectusus.core.filerelations.model.Packagename;
import org.projectusus.core.statistics.UsusModelProvider;
public class AdditionAndRemovalOfClassDescriptorsTest {
private IFile file = mock( IFile.class );
private Packagename packagename = Packagename.of( "packagename", null ); //$NON-NLS-1$
private Classname classname1 = new Classname( "Name1" );
private Classname classname2 = new Classname( "Name2" );
private Classname classname3 = new Classname( "Name3" );
@Before
public void init() {
UsusModelProvider.clear();
}
@Test
public void oneClassDescriptorNoRelations() {
classDescriptorOf( classname1 );
assertEquals( 1, ClassDescriptor.getAll().size() );
}
@Test
public void twoClassDescriptorsOneRelation() {
ClassDescriptor source = classDescriptorOf( classname1 );
ClassDescriptor target = classDescriptorOf( classname2 );
source.addChild( target );
assertEquals( 2, ClassDescriptor.getAll().size() );
}
@Test
public void threeClassDescriptorsTwoRelations() {
ClassDescriptor source = classDescriptorOf( classname1 );
ClassDescriptor middle = classDescriptorOf( classname2 );
source.addChild( middle );
ClassDescriptor target = classDescriptorOf( classname3 );
middle.addChild( target );
assertEquals( 3, ClassDescriptor.getAll().size() );
}
@Test
public void threeClassDescriptorsTwoRelationsFirstAndSecondRemovedInBetween() {
ClassDescriptor source = classDescriptorOf( classname1 );
ClassDescriptor middle = classDescriptorOf( classname2 );
source.addChild( middle );
assertEquals( 2, ClassDescriptor.getAll().size() );
source.prepareRemoval();
cleanupDescriptors( 1 );
assertEquals( 1, ClassDescriptor.getAll().size() );
middle.prepareRemoval();
cleanupDescriptors( 1 );
assertEquals( 0, ClassDescriptor.getAll().size() );
ClassDescriptor source2 = classDescriptorOf( classname1 );
ClassDescriptor middle2 = classDescriptorOf( classname2 );
source2.addChild( middle2 );
assertEquals( 2, ClassDescriptor.getAll().size() );
ClassDescriptor target = classDescriptorOf( classname3 );
middle2.addChild( target );
assertEquals( 3, ClassDescriptor.getAll().size() );
}
@Test
public void threeClassDescriptorsTwoRelationsSecondAndFirstRemovedInBetween() {
ClassDescriptor source = classDescriptorOf( classname1 );
ClassDescriptor middle = classDescriptorOf( classname2 );
source.addChild( middle );
assertEquals( 2, ClassDescriptor.getAll().size() );
middle.prepareRemoval();
cleanupDescriptors( 1 );
assertEquals( 1, ClassDescriptor.getAll().size() );
source.prepareRemoval();
cleanupDescriptors( 1 );
assertEquals( 0, ClassDescriptor.getAll().size() );
ClassDescriptor source2 = classDescriptorOf( classname1 );
ClassDescriptor middle2 = classDescriptorOf( classname2 );
source2.addChild( middle2 );
assertEquals( 2, ClassDescriptor.getAll().size() );
ClassDescriptor target = classDescriptorOf( classname3 );
middle2.addChild( target );
assertEquals( 3, ClassDescriptor.getAll().size() );
}
@Test
public void threeClassDescriptorsTwoRelationsSecondRemovedInBetween() {
ClassDescriptor source = classDescriptorOf( classname1 );
ClassDescriptor middle = classDescriptorOf( classname2 );
source.addChild( middle );
assertEquals( 2, ClassDescriptor.getAll().size() );
middle.prepareRemoval();
cleanupDescriptors( 1 );
assertEquals( 1, ClassDescriptor.getAll().size() );
ClassDescriptor middle2 = classDescriptorOf( classname2 );
source.addChild( middle2 );
assertEquals( 2, ClassDescriptor.getAll().size() );
ClassDescriptor target = classDescriptorOf( classname3 );
middle2.addChild( target );
assertEquals( 3, ClassDescriptor.getAll().size() );
}
@Test
public void twoClassDescriptorsOneRelationRemoved() {
ClassDescriptor source = classDescriptorOf( classname1 );
ClassDescriptor target = classDescriptorOf( classname2 );
source.addChild( target );
assertEquals( 2, ClassDescriptor.getAll().size() );
target.prepareRemoval();
cleanupDescriptors( 1 );
assertEquals( 1, ClassDescriptor.getAll().size() );
}
@Test
public void twoClassDescriptorsOneRelationBothRemovedSourceFirst() {
ClassDescriptor source = classDescriptorOf( classname1 );
ClassDescriptor target = classDescriptorOf( classname2 );
source.addChild( target );
assertEquals( 2, ClassDescriptor.getAll().size() );
source.prepareRemoval();
target.prepareRemoval();
cleanupDescriptors( 2 );
assertEquals( 0, ClassDescriptor.getAll().size() );
}
@Test
public void twoClassDescriptorsOneRelationBothRemovedTargetFirst() {
ClassDescriptor source = classDescriptorOf( classname1 );
ClassDescriptor target = classDescriptorOf( classname2 );
source.addChild( target );
assertEquals( 2, ClassDescriptor.getAll().size() );
target.prepareRemoval();
source.prepareRemoval();
cleanupDescriptors( 2 );
assertEquals( 0, ClassDescriptor.getAll().size() );
}
private ClassDescriptor classDescriptorOf( Classname classname22 ) {
return ClassDescriptor.of( file, classname22, packagename );
}
private void cleanupDescriptors( int count ) {
Set<ClassDescriptor> descriptorsForCleanup = ClassDescriptorCleanup.extractDescriptorsRegisteredForCleanup();
assertEquals( count, descriptorsForCleanup.size() );
for( ClassDescriptor descriptor : descriptorsForCleanup ) {
descriptor.removeFromPool();
}
}
}