package au.gov.ga.earthsci.common.color;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.awt.Color;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import au.gov.ga.earthsci.common.color.ColorMap.InterpolationMode;
/**
* Unit tests for the {@link MutableColorMap} class
*
* @author James Navin (james.navin@ga.gov.au)
*
*/
public class MutableColorMapTest
{
private Set<String> listenerHits;
private final PropertyChangeListener testListener = new PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent evt)
{
listenerHits.add(evt.getPropertyName());
}
};
@Before
public void setup()
{
listenerHits = new HashSet<String>();
}
@Test
public void testCopyConstructorWithNull()
{
ColorMap seed = null;
MutableColorMap classUnderTest = new MutableColorMap(seed);
assertNotNull(classUnderTest.getName());
assertNull(classUnderTest.getDescription());
assertTrue(classUnderTest.getEntries().isEmpty());
assertNull(classUnderTest.getNodataColour());
assertEquals(InterpolationMode.INTERPOLATE_RGB, classUnderTest.getMode());
}
@Test
public void testCopyContructorNonNull()
{
ColorMap seed = ColorMaps.getRGBRainbowMap();
MutableColorMap classUnderTest = new MutableColorMap(seed);
assertEquals(seed.getName(), classUnderTest.getName());
assertEquals(seed.getDescription(), classUnderTest.getDescription());
assertEquals(seed.getNodataColour(), classUnderTest.getNodataColour());
assertEquals(seed.getMode(), classUnderTest.getMode());
assertEquals(seed.getEntries(), classUnderTest.getEntries());
}
@Test
public void testChangeToPercentages()
{
Map<Double, Color> entries = new HashMap<Double, Color>();
entries.put(10.0, Color.RED);
entries.put(15.0, Color.GREEN);
entries.put(20.0, Color.BLUE);
MutableColorMap classUnderTest = new MutableColorMap(null, null, entries, null, null, false);
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.setValuesArePercentages(true, 10, 20);
assertEquals(Color.RED, classUnderTest.getEntries().get(0.0));
assertEquals(Color.GREEN, classUnderTest.getEntries().get(0.5));
assertEquals(Color.BLUE, classUnderTest.getEntries().get(1.0));
assertListenersHit(MutableColorMap.VALUE_TYPE_CHANGE_EVENT);
}
@Test
public void testChangeToPercentagesNoChange()
{
Map<Double, Color> entries = new HashMap<Double, Color>();
entries.put(0.0, Color.RED);
entries.put(0.5, Color.GREEN);
entries.put(1.0, Color.BLUE);
MutableColorMap classUnderTest = new MutableColorMap(null, null, entries, null, null, true);
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.setValuesArePercentages(true, 10, 20);
assertEquals(Color.RED, classUnderTest.getEntries().get(0.0));
assertEquals(Color.GREEN, classUnderTest.getEntries().get(0.5));
assertEquals(Color.BLUE, classUnderTest.getEntries().get(1.0));
assertListenersNotHit(MutableColorMap.VALUE_TYPE_CHANGE_EVENT);
}
@Test
public void testChangeFromPercentages()
{
Map<Double, Color> entries = new HashMap<Double, Color>();
entries.put(0.0, Color.RED);
entries.put(0.5, Color.GREEN);
entries.put(1.0, Color.BLUE);
MutableColorMap classUnderTest = new MutableColorMap(null, null, entries, null, null, true);
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.setValuesArePercentages(false, 10, 20);
assertEquals(Color.RED, classUnderTest.getEntries().get(10.0));
assertEquals(Color.GREEN, classUnderTest.getEntries().get(15.0));
assertEquals(Color.BLUE, classUnderTest.getEntries().get(20.0));
assertListenersHit(MutableColorMap.VALUE_TYPE_CHANGE_EVENT);
}
@Test
public void testChangeFromPercentagesNoChange()
{
Map<Double, Color> entries = new HashMap<Double, Color>();
entries.put(0.0, Color.RED);
entries.put(0.5, Color.GREEN);
entries.put(1.0, Color.BLUE);
MutableColorMap classUnderTest = new MutableColorMap(null, null, entries, null, null, false);
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.setValuesArePercentages(false, 10, 20);
assertEquals(Color.RED, classUnderTest.getEntries().get(0.0));
assertEquals(Color.GREEN, classUnderTest.getEntries().get(0.5));
assertEquals(Color.BLUE, classUnderTest.getEntries().get(1.0));
assertListenersNotHit(MutableColorMap.VALUE_TYPE_CHANGE_EVENT);
}
@Test
public void testSnapshot()
{
MutableColorMap classUnderTest = new MutableColorMap();
classUnderTest.addEntry(0.0, Color.RED);
classUnderTest.addEntry(0.5, Color.GREEN);
classUnderTest.addEntry(0.7, Color.ORANGE);
classUnderTest.addEntry(1.0, Color.GRAY);
classUnderTest.setName("testMap");
classUnderTest.setDescription("testDescription");
classUnderTest.setMode(InterpolationMode.EXACT_MATCH);
classUnderTest.setNodataColour(Color.BLUE);
ColorMap snapshot = classUnderTest.snapshot();
assertEquals(classUnderTest.getName(), snapshot.getName());
assertEquals(classUnderTest.getDescription(), snapshot.getDescription());
assertEquals(classUnderTest.getMode(), snapshot.getMode());
assertEquals(classUnderTest.getNodataColour(), snapshot.getNodataColour());
assertEquals(classUnderTest.isPercentageBased(), snapshot.isPercentageBased());
assertEquals(classUnderTest.getEntries(), snapshot.getEntries());
assertEquals(classUnderTest, snapshot);
}
@Test
public void testMoveWithValidValue()
{
MutableColorMap classUnderTest = new MutableColorMap();
classUnderTest.addEntry(0.0, Color.RED);
classUnderTest.addEntry(0.5, Color.GREEN);
classUnderTest.addEntry(0.7, Color.ORANGE);
classUnderTest.addEntry(1.0, Color.GRAY);
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.moveEntry(0.5, 0.8);
assertEquals(Color.GREEN, classUnderTest.getEntries().get(0.8));
assertEquals(null, classUnderTest.getEntries().get(0.5));
assertListenersHit(MutableColorMap.COLOR_MAP_ENTRY_CHANGE_EVENT);
}
@Test
public void testMoveWithInvalidValue()
{
MutableColorMap classUnderTest = new MutableColorMap();
classUnderTest.addEntry(0.0, Color.RED);
classUnderTest.addEntry(0.5, Color.GREEN);
classUnderTest.addEntry(0.7, Color.ORANGE);
classUnderTest.addEntry(1.0, Color.GRAY);
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.moveEntry(0.3, 0.5);
assertEquals(null, classUnderTest.getEntries().get(0.3));
assertEquals(Color.GREEN, classUnderTest.getEntries().get(0.5));
assertListenersNotHit(MutableColorMap.COLOR_MAP_ENTRY_CHANGE_EVENT);
}
@Test
public void testRemoveWithValidValue()
{
MutableColorMap classUnderTest = new MutableColorMap();
classUnderTest.addEntry(0.0, Color.RED);
classUnderTest.addEntry(0.5, Color.GREEN);
classUnderTest.addEntry(0.7, Color.ORANGE);
classUnderTest.addEntry(1.0, Color.GRAY);
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.removeEntry(0.5);
assertEquals(Color.RED, classUnderTest.getEntries().get(0.0));
assertEquals(null, classUnderTest.getEntries().get(0.5));
assertEquals(Color.ORANGE, classUnderTest.getEntries().get(0.7));
assertEquals(Color.GRAY, classUnderTest.getEntries().get(1.0));
assertListenersHit(MutableColorMap.COLOR_MAP_ENTRY_CHANGE_EVENT);
}
@Test
public void testSetModeWithSame()
{
MutableColorMap classUnderTest = new MutableColorMap();
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.setMode(classUnderTest.getMode());
assertListenersNotHit(MutableColorMap.MODE_CHANGE_EVENT);
}
@Test
public void testSetModeWithNull()
{
MutableColorMap classUnderTest = new MutableColorMap();
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.setMode(null);
assertEquals(InterpolationMode.INTERPOLATE_RGB, classUnderTest.getMode());
assertListenersNotHit(MutableColorMap.MODE_CHANGE_EVENT);
}
@Test
public void testSetModeWithDifferent()
{
MutableColorMap classUnderTest = new MutableColorMap();
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.setMode(InterpolationMode.NEAREST_MATCH);
assertEquals(InterpolationMode.NEAREST_MATCH, classUnderTest.getMode());
assertListenersHit(MutableColorMap.MODE_CHANGE_EVENT);
}
@Test
public void testChangeColorWithValidValue()
{
MutableColorMap classUnderTest = new MutableColorMap();
classUnderTest.addEntry(0.0, Color.RED);
classUnderTest.addEntry(0.5, Color.GREEN);
classUnderTest.addEntry(0.7, Color.ORANGE);
classUnderTest.addEntry(1.0, Color.GRAY);
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.changeColor(0.5, Color.YELLOW);
assertEquals(Color.YELLOW, classUnderTest.getEntries().get(0.5));
assertListenersHit(MutableColorMap.COLOR_MAP_ENTRY_CHANGE_EVENT);
}
@Test
public void testChangeColorWithInvalidValue()
{
MutableColorMap classUnderTest = new MutableColorMap();
classUnderTest.addEntry(0.0, Color.RED);
classUnderTest.addEntry(0.5, Color.GREEN);
classUnderTest.addEntry(0.7, Color.ORANGE);
classUnderTest.addEntry(1.0, Color.GRAY);
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.changeColor(0.4, Color.YELLOW);
assertEquals(null, classUnderTest.getEntries().get(0.4));
assertListenersNotHit(MutableColorMap.COLOR_MAP_ENTRY_CHANGE_EVENT);
}
@Test
public void testUpdateToWithNull()
{
ColorMap seed = null;
MutableColorMap classUnderTest = new MutableColorMap();
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.updateTo(seed);
assertNoListenersHit();
}
@Test
public void testUpdateToWithSelf()
{
MutableColorMap classUnderTest = new MutableColorMap();
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.updateTo(classUnderTest);
assertNoListenersHit();
}
@Test
public void testUpdateToWithAllDifferent()
{
MutableColorMap seed =
new MutableColorMap("seed", "seed", null, null, InterpolationMode.INTERPOLATE_HUE, false);
seed.addEntry(0.3, Color.PINK);
Map<Double, Color> entries = new HashMap<Double, Color>();
entries.put(0.0, Color.RED);
entries.put(0.5, Color.GREEN);
entries.put(1.0, Color.BLUE);
MutableColorMap classUnderTest =
new MutableColorMap("test", "test", entries, Color.BLACK, InterpolationMode.INTERPOLATE_RGB, true);
classUnderTest.addPropertyChangeListener(testListener);
classUnderTest.updateTo(seed);
assertListenersHit(
MutableColorMap.NAME_CHANGE_EVENT,
MutableColorMap.DESCRIPTION_CHANGE_EVENT,
MutableColorMap.MODE_CHANGE_EVENT,
MutableColorMap.NODATA_CHANGE_EVENT,
MutableColorMap.ENTRY_REMOVED_EVENT,
MutableColorMap.ENTRY_ADDED_EVENT,
MutableColorMap.COLOR_MAP_ENTRY_CHANGE_EVENT);
assertListenersNotHit(
MutableColorMap.VALUE_TYPE_CHANGE_EVENT,
MutableColorMap.ENTRY_MOVED_EVENT,
MutableColorMap.COLOR_CHANGED_EVENT);
}
private void assertNoListenersHit()
{
assertTrue(listenerHits.isEmpty());
}
private void assertListenersHit(String... events)
{
for (String s : events)
{
assertTrue("Missing event " + s, listenerHits.contains(s));
}
}
private void assertListenersNotHit(String... events)
{
for (String s : events)
{
assertFalse("Extra event " + s, listenerHits.contains(s));
}
}
}