package org.projectusus.core.filerelations.model.classdescriptortest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.projectusus.matchers.UsusMatchers.emptySet;
import static org.projectusus.matchers.UsusMatchers.setOf;
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;
public class FileRelationMetricsRemoveTest {
private ClassDescriptor descriptor1;
private ClassDescriptor descriptor2;
private ClassDescriptor descriptor3;
private IFile file1;
private IFile file2;
private IFile file3;
@Before
public void setupClassDescriptors() {
file1 = mock( IFile.class );
file2 = mock( IFile.class );
file3 = mock( IFile.class );
}
public static ClassDescriptor createClassDescriptor( IFile file, String name ) {
return ClassDescriptor.of( file, new Classname( name ), Packagename.of( name, null ) );
}
@Test
public void mocksAreNotEqual() {
assertFalse( file1.equals( file2 ) );
}
@Test
public void noRelations() {
setupOneWithOneFile();
descriptor1.prepareRemoval();
assertEquals( 1, ClassDescriptorCleanup.extractDescriptorsRegisteredForCleanup().size() );
}
@Test
public void oneRelationSameFile() {
setupTwoWithOneFile();
descriptor1.prepareRemoval();
descriptor2.prepareRemoval();
assertThat( descriptor1.getChildren(), emptySet() );
assertThat( descriptor2.getChildren(), emptySet() );
assertEquals( 2, ClassDescriptorCleanup.extractDescriptorsRegisteredForCleanup().size() );
}
@Test
public void oneRelationDifferentFilesRemoveSource() {
setupTwoWithTwoFiles();
descriptor1.prepareRemoval();
assertThat( descriptor1.getChildren(), emptySet() );
assertThat( descriptor2.getChildren(), emptySet() );
assertEquals( 1, ClassDescriptorCleanup.extractDescriptorsRegisteredForCleanup().size() );
}
@Test
public void oneRelationDifferentFilesRemoveTarget() {
setupTwoWithTwoFiles();
descriptor2.prepareRemoval();
assertThat( descriptor1.getChildren(), setOf( descriptor2 ) );
assertThat( descriptor2.getChildren(), emptySet() );
checkRelationsToRepair( descriptor1, descriptor2 );
}
@Test
public void twoRelationsOneFile() {
setupThreeWithOneFile();
descriptor1.prepareRemoval();
descriptor2.prepareRemoval();
descriptor3.prepareRemoval();
assertThat( descriptor1.getChildren(), emptySet() );
assertThat( descriptor2.getChildren(), emptySet() );
assertThat( descriptor3.getChildren(), emptySet() );
assertEquals( 3, ClassDescriptorCleanup.extractDescriptorsRegisteredForCleanup().size() );
}
@Test
public void twoRelationsThreeFilesRemoveFirst() {
setupThreeWithThreeFiles();
descriptor1.prepareRemoval();
assertThat( descriptor1.getChildren(), emptySet() );
assertThat( descriptor2.getChildren(), setOf( descriptor3 ) );
assertThat( descriptor3.getChildren(), emptySet() );
assertEquals( 1, ClassDescriptorCleanup.extractDescriptorsRegisteredForCleanup().size() );
}
@Test
public void twoRelationsThreeFilesRemoveSecond() {
setupThreeWithThreeFiles();
descriptor2.prepareRemoval();
assertThat( descriptor1.getChildren(), setOf( descriptor2 ) );
assertThat( descriptor2.getChildren(), emptySet() );
assertThat( descriptor3.getChildren(), emptySet() );
checkRelationsToRepair( descriptor1, descriptor2 );
}
@Test
public void twoRelationsThreeFilesRemoveThird() {
setupThreeWithThreeFiles();
descriptor3.prepareRemoval();
assertThat( descriptor1.getChildren(), setOf( descriptor2 ) );
assertThat( descriptor2.getChildren(), setOf( descriptor3 ) );
assertThat( descriptor3.getChildren(), emptySet() );
checkRelationsToRepair( descriptor2, descriptor3 );
}
private void setupOneWithOneFile() {
descriptor1 = createClassDescriptor( file1, "Descriptor1" ); //$NON-NLS-1$
}
private void setupTwoWithOneFile() {
descriptor1 = createClassDescriptor( file1, "Descriptor1" ); //$NON-NLS-1$
descriptor2 = createClassDescriptor( file1, "Descriptor2" ); //$NON-NLS-1$
descriptor1.addChild( descriptor2 );
}
private void setupTwoWithTwoFiles() {
descriptor1 = createClassDescriptor( file1, "Descriptor1" ); //$NON-NLS-1$
descriptor2 = createClassDescriptor( file2, "Descriptor2" ); //$NON-NLS-1$
descriptor1.addChild( descriptor2 );
}
private void setupThreeWithOneFile() {
descriptor1 = createClassDescriptor( file1, "Descriptor1" ); //$NON-NLS-1$
descriptor2 = createClassDescriptor( file1, "Descriptor2" ); //$NON-NLS-1$
descriptor3 = createClassDescriptor( file1, "Descriptor3" ); //$NON-NLS-1$
descriptor1.addChild( descriptor2 );
descriptor2.addChild( descriptor3 );
}
private void setupThreeWithThreeFiles() {
descriptor1 = createClassDescriptor( file1, "Descriptor1" ); //$NON-NLS-1$
descriptor2 = createClassDescriptor( file2, "Descriptor2" ); //$NON-NLS-1$
descriptor3 = createClassDescriptor( file3, "Descriptor3" ); //$NON-NLS-1$
descriptor1.addChild( descriptor2 );
descriptor2.addChild( descriptor3 );
}
private void checkRelationsToRepair( ClassDescriptor source, ClassDescriptor target ) {
Set<ClassDescriptor> descriptorsForCleanup = ClassDescriptorCleanup.extractDescriptorsRegisteredForCleanup();
assertEquals( 1, descriptorsForCleanup.size() );
for( ClassDescriptor descriptor : descriptorsForCleanup ) {
assertEquals( target, descriptor );
descriptor.removeFromPool();
}
assertThat( source.getChildren(), emptySet() );
}
}