package gov.nasa.arc.mct.fastplot.settings.controls;
import gov.nasa.arc.mct.fastplot.settings.PlotConfiguration;
import gov.nasa.arc.mct.fastplot.settings.PlotSettings;
import javax.swing.JRadioButton;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class TestPlotSettingsRadioButtonGroup {
private static final String[] STRING_CHOICES = {
"Thing one", "thing two", "thing three"
};
private static final Integer[] INTEGER_CHOICES = {
1, 2, 3
};
private PlotConfiguration settings;
@BeforeMethod
public void setup() {
settings = new PlotSettings();
}
@Test
public void testHardAndSoftReset() {
for (Object[] choices : new Object[][]{STRING_CHOICES, INTEGER_CHOICES}) {
for (int i = 0; i < 3; i++) {
@SuppressWarnings({ "rawtypes", "unchecked" })
Tester<?> t = new Tester(choices, choices[i].getClass());
if (choices[i] instanceof Integer) {
settings.setMinTime((Integer) choices[i]);
} else if (choices[i] instanceof String) {
settings.setTimeSystemSetting((String) choices[i]);
}
t.reset(settings, true);
Assert.assertEquals(t.getSelection(), choices[i]);
if (choices[i] instanceof Integer) {
settings.setMinTime((Integer) choices[(i+1)%3]);
} else if (choices[i] instanceof String) {
settings.setTimeSystemSetting((String) choices[(i+1)%3]);
}
t.reset(settings, false);
Assert.assertEquals(t.getSelection(), choices[i]);
if (choices[i] instanceof Integer) {
settings.setMinTime((Integer) choices[(i+2)%3]);
} else if (choices[i] instanceof String) {
settings.setTimeSystemSetting((String) choices[(i+2)%3]);
}
t.reset(settings, true);
Assert.assertEquals(t.getSelection(), choices[(i+2)%3]);
}
}
}
@Test
public void testPopulate() {
for (Object[] choices : new Object[][]{STRING_CHOICES, INTEGER_CHOICES}) {
for (int i = 0; i < 3; i++) {
@SuppressWarnings({ "rawtypes", "unchecked" })
Tester<?> t = new Tester(choices, choices[i].getClass());
if (choices[i] instanceof Integer) {
settings.setMinTime((Integer) choices[i]);
} else if (choices[i] instanceof String) {
settings.setTimeSystemSetting((String) choices[i]);
}
t.reset(settings, true);
Assert.assertEquals(t.getSelection(), choices[i]);
t.setSelection(choices[(i+1)%3]);
t.populate(settings);
if (choices[i] instanceof Integer) {
Assert.assertEquals((Integer) (int) settings.getMinTime(), choices[(i+1)%3]);
} else if (choices[i] instanceof String) {
Assert.assertEquals(settings.getTimeSystemSetting(), choices[(i+1)%3]);
}
}
}
}
@Test
public void testDirty() {
for (Object[] choices : new Object[][]{STRING_CHOICES, INTEGER_CHOICES}) {
for (int i = 0; i < 3; i++) {
@SuppressWarnings({ "rawtypes", "unchecked" })
Tester<?> t = new Tester(choices, choices[i].getClass());
if (choices[i] instanceof Integer) {
settings.setMinTime((Integer) choices[i]);
} else if (choices[i] instanceof String) {
settings.setTimeSystemSetting((String) choices[i]);
}
// Reset - should not be dirty
t.reset(settings, true);
Assert.assertFalse(t.isDirty());
Assert.assertTrue(t.isValidated()); // Can't be invalid
// Find a combo box to test with
JRadioButton b1 = t.getButton(choices[i]);
JRadioButton b2 = t.getButton(choices[(i+1)%3]);
Assert.assertTrue(b1.isSelected());
Assert.assertFalse(b2.isSelected());
// Select a different item
b2.doClick();
Assert.assertFalse(b1.isSelected());
Assert.assertTrue(b2.isSelected());
Assert.assertTrue(t.isDirty());
Assert.assertTrue(t.isValidated()); // Can't be invalid
// Restore the original item
b1.doClick();
Assert.assertTrue(b1.isSelected());
Assert.assertFalse(b2.isSelected());
Assert.assertFalse(t.isDirty());
Assert.assertTrue(t.isValidated()); // Can't be invalid
}
}
}
@Test
public void testSetText() {
@SuppressWarnings({ "rawtypes", "unchecked" })
Tester<Integer> t = new Tester(INTEGER_CHOICES, Integer.class);
// By default, should appear as toString
for (int i = 0; i < 3; i++) {
Assert.assertEquals(t.getButton(INTEGER_CHOICES[i]).getText(),
INTEGER_CHOICES[i].toString());
}
// Set choices to alternate text
for (int i = 0; i < 3; i++) {
t.setText(INTEGER_CHOICES[i], STRING_CHOICES[i]);
}
// Now, alternate text sahould appear in buttons
for (int i = 0; i < 3; i++) {
Assert.assertEquals(t.getButton(INTEGER_CHOICES[i]).getText(),
STRING_CHOICES[i].toString());
}
}
private static class Tester<T> extends PlotSettingsRadioButtonGroup<T> {
private static final long serialVersionUID = 2491883458409785019L;
private Class<T> c;
public Tester (T[] choices, Class<T> cls) {
super(choices);
c = cls;
}
@SuppressWarnings("unchecked")
public JRadioButton getButton(Object object) {
return super.getButton((T) object);
}
@SuppressWarnings("unchecked")
public void setSelection(Object object) {
super.setSelection((T) object);
}
@Override
public void populate(PlotConfiguration settings) {
if (Integer.class.isAssignableFrom(c)) {
settings.setMinTime((Integer) getSelection());
} else {
settings.setTimeSystemSetting((String) getSelection());
}
}
@SuppressWarnings("unchecked")
@Override
public void reset(PlotConfiguration settings, boolean hard) {
if (hard) setSelection((T) (Integer.class.isAssignableFrom(c) ?
(int) settings.getMinTime() : settings.getTimeSystemSetting()));
}
}
}