package games.strategy.util; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import org.junit.Test; import games.strategy.triplea.attachments.RulesAttachment; /** * PropertyUtil test sets / gets variables via reflection. * * <p> * The set in PropertyUtil done through a setter method, the get is done by reading the private variable value directly. * </p> * * <p> * To test we set up some sample test objects and do read/set property operations on them. * </p> */ public class PropertyUtilTest { @Test public void testGetFieldObject() { final RulesAttachment testClass = new RulesAttachment("test", null, null); int uses = (Integer) PropertyUtil.getPropertyFieldObject("uses", testClass); // default value should be -1 assertThat(uses, is(-1)); PropertyUtil.set("uses", "3", testClass); uses = (Integer) PropertyUtil.getPropertyFieldObject("uses", testClass); assertThat(uses, is(3)); final IntegerMap<String> unitPresence = new IntegerMap<>(); unitPresence.add("Blah", 3); PropertyUtil.set("unitPresence", unitPresence, testClass); assertThat(PropertyUtil.getPropertyFieldObject("unitPresence", testClass), is(unitPresence)); } private static final String NEW_VALUE = "newValue"; private static final String BAR = "bar"; protected static final String DEFAULT = "default"; @Test public void testHappyCaseWithGetAndSetFields() { final PropertyClass testClass = new PropertyClass(); PropertyUtil.set("bar", NEW_VALUE, testClass); assertThat(testClass.bar, is(NEW_VALUE)); assertThat((String) PropertyUtil.getPropertyFieldObject(BAR, testClass), is(NEW_VALUE)); } @Test public void testGetField() { assertThat((String) PropertyUtil.getPropertyFieldObject("bar", new PropertyClass()), is(DEFAULT)); } @Test public void testGetFieldWithPrefixedPropertyNames() { assertThat((String) PropertyUtil.getPropertyFieldObject(BAR, new mUnderBarClass()), is(DEFAULT)); } @Test(expected = IllegalStateException.class) public void testErrorCaseWithNoSetterMethod() { PropertyUtil.set(BAR, NEW_VALUE, new NoSetterClass()); } @Test(expected = IllegalStateException.class) public void testErrorCaseWithInvalidSetterMethod() { PropertyUtil.set(BAR, NEW_VALUE, new InvalidSetterClass()); } @Test public void testNoOpSetterMethod() { final NoOpSetterClass testClass = new NoOpSetterClass(); PropertyUtil.set(BAR, NEW_VALUE, testClass); assertThat( "we are only really checking that the setter method was called, which did not do anything, thus we should " + "still have a default value.", testClass.bar, is("default")); } private static class NoSetterClass { @SuppressWarnings("unused") private final String bar = PropertyUtilTest.DEFAULT; } private static class InvalidSetterClass { @SuppressWarnings("unused") private final String bar = PropertyUtilTest.DEFAULT; @SuppressWarnings("unused") public void setBar() {} } private static class NoOpSetterClass { protected String bar = PropertyUtilTest.DEFAULT; @SuppressWarnings("unused") public void setBar(final String value) {} } private static class PropertyClass { protected String bar = PropertyUtilTest.DEFAULT; @SuppressWarnings("unused") public void setBar(final String newValue) { bar = newValue; } } private static class mUnderBarClass { @SuppressWarnings("unused") private String m_bar = PropertyUtilTest.DEFAULT; @SuppressWarnings("unused") public void setBar(final String newValue) { m_bar = newValue; } } }