package org.projectusus.ui.internal;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.junit.Before;
import org.junit.Test;
import org.projectusus.core.basis.FileHotspot;
import org.projectusus.core.basis.Hotspot;
import org.projectusus.core.basis.SourceCodeLocation;
public class DisplayHotspotCreatorTest {
private List<Hotspot> oldHotspots;
private List<Hotspot> currentHotspots;
private final SourceCodeLocation location1 = new SourceCodeLocation( "x", 1, 1 ); //$NON-NLS-1$
private final SourceCodeLocation location2 = new SourceCodeLocation( "y", 2, 2 ); //$NON-NLS-1$
private final SourceCodeLocation location3 = new SourceCodeLocation( "z", 3, 3 ); //$NON-NLS-1$
private final IFile file1 = mock( IFile.class );
private final Hotspot hotspot1_1_1 = new FileHotspot( location1, 1, file1 );
private final Hotspot hotspot1_2_1 = new FileHotspot( location1, 2, file1 );
private final Hotspot hotspot2_1_1 = new FileHotspot( location2, 1, file1 );
private final Hotspot hotspot2_2_1 = new FileHotspot( location2, 2, file1 );
private final Hotspot hotspot3_1_1 = new FileHotspot( location3, 1, file1 );
@Before
public void setup() {
oldHotspots = new ArrayList<Hotspot>();
currentHotspots = new ArrayList<Hotspot>();
}
@Test
public void emptyLists() {
List<DisplayHotspot<?>> result = createDisplay( oldHotspots, currentHotspots );
assertEquals( 0, result.size() );
}
@Test
public void oneOld() {
oldHotspots.add( hotspot1_2_1 );
List<DisplayHotspot<?>> result = createDisplay( oldHotspots, currentHotspots );
assertEquals( 1, result.size() );
checkContains( result, hotspot1_2_1, null );
assertEquals( -2, result.get( 0 ).getTrend() );
}
@Test
public void oneNew() {
currentHotspots.add( hotspot1_2_1 );
List<DisplayHotspot<?>> result = createDisplay( oldHotspots, currentHotspots );
assertEquals( 1, result.size() );
checkContains( result, null, hotspot1_2_1 );
assertEquals( 2, result.get( 0 ).getTrend() );
}
@Test
public void oldAndNewIdentical() {
oldHotspots.add( hotspot1_1_1 );
currentHotspots.add( hotspot1_1_1 );
List<DisplayHotspot<?>> result = createDisplay( oldHotspots, currentHotspots );
assertEquals( 1, result.size() );
checkContains( result, hotspot1_1_1, hotspot1_1_1 );
assertEquals( 0, result.get( 0 ).getTrend() );
}
@Test
public void oldBetterThanNew() {
oldHotspots.add( hotspot1_1_1 );
currentHotspots.add( hotspot1_2_1 );
List<DisplayHotspot<?>> result = createDisplay( oldHotspots, currentHotspots );
assertEquals( 1, result.size() );
checkContains( result, hotspot1_1_1, hotspot1_2_1 );
assertEquals( 1, result.get( 0 ).getTrend() );
}
@Test
public void oldWorseThanNew() {
oldHotspots.add( hotspot1_2_1 );
currentHotspots.add( hotspot1_1_1 );
List<DisplayHotspot<?>> result = createDisplay( oldHotspots, currentHotspots );
assertEquals( 1, result.size() );
checkContains( result, hotspot1_2_1, hotspot1_1_1 );
assertEquals( -1, result.get( 0 ).getTrend() );
}
@Test
public void oldAndNewDifferentLocations() {
oldHotspots.add( hotspot1_1_1 );
currentHotspots.add( hotspot2_1_1 );
List<DisplayHotspot<?>> result = createDisplay( oldHotspots, currentHotspots );
assertEquals( 2, result.size() );
checkContains( result, hotspot1_1_1, null );
checkContains( result, null, hotspot2_1_1 );
assertEquals( 1, result.get( 0 ).getTrend() );
assertEquals( -1, result.get( 1 ).getTrend() );
}
@Test
public void oldAndNewOneDifferentOneSame() {
oldHotspots.add( hotspot1_1_1 );
oldHotspots.add( hotspot2_1_1 );
currentHotspots.add( hotspot2_1_1 );
currentHotspots.add( hotspot3_1_1 );
List<DisplayHotspot<?>> result = createDisplay( oldHotspots, currentHotspots );
assertEquals( 3, result.size() );
checkContains( result, hotspot1_1_1, null );
checkContains( result, hotspot2_1_1, hotspot2_1_1 );
checkContains( result, null, hotspot3_1_1 );
assertEquals( 1, result.get( 0 ).getTrend() );
assertEquals( 0, result.get( 1 ).getTrend() );
assertEquals( -1, result.get( 2 ).getTrend() );
}
@Test
public void oldAndNewOneDifferentOneDifferentValue() {
oldHotspots.add( hotspot1_1_1 );
oldHotspots.add( hotspot2_1_1 );
currentHotspots.add( hotspot2_2_1 );
currentHotspots.add( hotspot3_1_1 );
List<DisplayHotspot<?>> result = createDisplay( oldHotspots, currentHotspots );
assertEquals( 3, result.size() );
checkContains( result, hotspot1_1_1, null );
checkContains( result, hotspot2_1_1, hotspot2_2_1 );
checkContains( result, null, hotspot3_1_1 );
assertEquals( 1, result.get( 0 ).getTrend() );
assertEquals( 1, result.get( 1 ).getTrend() );
assertEquals( -1, result.get( 2 ).getTrend() );
}
@Test
public void oldAndNewOneDifferentTwoSame() {
oldHotspots.add( hotspot1_1_1 );
oldHotspots.add( hotspot2_1_1 );
oldHotspots.add( hotspot3_1_1 );
currentHotspots.add( hotspot1_1_1 );
currentHotspots.add( hotspot2_2_1 );
currentHotspots.add( hotspot3_1_1 );
List<DisplayHotspot<?>> result = createDisplay( oldHotspots, currentHotspots );
assertEquals( 3, result.size() );
checkContains( result, hotspot1_1_1, hotspot1_1_1 );
checkContains( result, hotspot2_1_1, hotspot2_2_1 );
checkContains( result, hotspot3_1_1, hotspot3_1_1 );
assertEquals( 1, result.get( 0 ).getTrend() );
assertEquals( 0, result.get( 1 ).getTrend() );
assertEquals( 0, result.get( 2 ).getTrend() );
}
private void checkContains( List<DisplayHotspot<?>> result, Hotspot oldHotspot, Hotspot newHotspot ) {
for( DisplayHotspot<?> displayHotspot : result ) {
if( compare( oldHotspot, displayHotspot.getOldHotspot() ) ) {
if( compare( newHotspot, displayHotspot.getHotspot() ) ) {
if( compareMetricsValue( newHotspot, displayHotspot ) ) {
return; // we found a matching entry
}
}
}
}
fail( "List does not contain any elements matching the conditions." ); //$NON-NLS-1$
}
private boolean compareMetricsValue( Hotspot newHotspot, DisplayHotspot<?> displayHotspot ) {
return (newHotspot == null && displayHotspot.getMetricsValue() == 0) || (newHotspot != null && newHotspot.getMetricsValue() == displayHotspot.getMetricsValue());
}
private boolean compare( Hotspot expected, Hotspot actual ) {
return (expected == null && actual == null) || (expected != null && expected.equals( actual ));
}
private List<DisplayHotspot<?>> createDisplay( List<Hotspot> oldHots, List<Hotspot> currentHots ) {
return new DisplayHotspotCreator( oldHots, currentHots ).hotspots();
}
}