@Test // Can't be shared; there is no such thing as a read-only field public void setReadOnlyMapProperty() { TypedReadOnlyMap map = new TypedReadOnlyMap(Collections.singletonMap("key", new TestBean())); TypedReadOnlyMapClient target = new TypedReadOnlyMapClient(); BeanWrapper accessor = createAccessor(target); accessor.setPropertyValue("map", map); }
@Test public void incompletelyQuotedKeyLeadsToPropertyException() { TestBean target = new TestBean(); try { BeanWrapper accessor = createAccessor(target); accessor.setPropertyValue("[']", "foobar"); fail("Should throw exception on invalid property"); } catch (NotWritablePropertyException ex) { assertNull(ex.getPossibleMatches()); } }
@Test public void setValidAndInvalidPropertyValuesShouldContainExceptionDetails() { TestBean target = new TestBean(); String newName = "tony"; String invalidTouchy = ".valid"; try { BeanWrapper accessor = createAccessor(target); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.addPropertyValue(new PropertyValue("age", "foobar")); pvs.addPropertyValue(new PropertyValue("name", newName)); pvs.addPropertyValue(new PropertyValue("touchy", invalidTouchy)); accessor.setPropertyValues(pvs); fail("Should throw exception when everything is valid"); } catch (PropertyBatchUpdateException ex) { assertTrue("Must contain 2 exceptions", ex.getExceptionCount() == 2); // Test validly set property matches assertTrue("Valid set property must stick", target.getName().equals(newName)); assertTrue("Invalid set property must retain old value", target.getAge() == 0); assertTrue("New value of dodgy setter must be available through exception", ex.getPropertyAccessException("touchy").getPropertyChangeEvent().getNewValue().equals(invalidTouchy)); } }
@Test public void notWritablePropertyExceptionContainsAlternativeMatch() { IntelliBean target = new IntelliBean(); BeanWrapper bw = createAccessor(target); try { bw.setPropertyValue("names", "Alef"); } catch (NotWritablePropertyException ex) { assertNotNull("Possible matches not determined", ex.getPossibleMatches()); assertEquals("Invalid amount of alternatives", 1, ex.getPossibleMatches().length); } }
@Test public void notWritablePropertyExceptionContainsAlternativeMatches() { IntelliBean target = new IntelliBean(); BeanWrapper bw = createAccessor(target); try { bw.setPropertyValue("mystring", "Arjen"); } catch (NotWritablePropertyException ex) { assertNotNull("Possible matches not determined", ex.getPossibleMatches()); assertEquals("Invalid amount of alternatives", 3, ex.getPossibleMatches().length); } }
@Test public void aliasedSetterThroughDefaultMethod() { GetterBean target = new GetterBean(); BeanWrapper accessor = createAccessor(target); accessor.setPropertyValue("aliasedName", "tom"); assertEquals("tom", target.getAliasedName()); assertEquals("tom", accessor.getPropertyValue("aliasedName")); }
@Test public void setterDoesNotCallGetter() { GetterBean target = new GetterBean(); BeanWrapper accessor = createAccessor(target); accessor.setPropertyValue("name", "tom"); assertEquals("tom", target.getAliasedName()); assertEquals("tom", accessor.getPropertyValue("aliasedName")); }
@Test public void getPropertyWithOptionalAndAutoGrow() { GetterWithOptional target = new GetterWithOptional(); BeanWrapper accessor = createAccessor(target); accessor.setAutoGrowNestedPaths(true); accessor.setPropertyValue("object.name", "x"); assertEquals("x", target.value.getName()); assertEquals("x", target.getObject().get().getName()); assertEquals("x", accessor.getPropertyValue("object.name")); }
@Test // Can't be shared: no type mismatch with a field public void setPropertyTypeMismatch() { PropertyTypeMismatch target = new PropertyTypeMismatch(); BeanWrapper accessor = createAccessor(target); accessor.setPropertyValue("object", "a String"); assertEquals("a String", target.value); assertTrue(target.getObject() == 8); assertEquals(8, accessor.getPropertyValue("object")); }
@Test public void getterSilentlyFailWithOldValueExtraction() { GetterBean target = new GetterBean(); BeanWrapper accessor = createAccessor(target); accessor.setExtractOldValueForEditor(true); // This will call the getter accessor.setPropertyValue("name", "tom"); assertEquals("tom", target.getAliasedName()); assertEquals("tom", accessor.getPropertyValue("aliasedName")); }
@Test public void checkNotWritablePropertyHoldPossibleMatches() { TestBean target = new TestBean(); try { BeanWrapper accessor = createAccessor(target); accessor.setPropertyValue("ag", "foobar"); fail("Should throw exception on invalid property"); } catch (NotWritablePropertyException ex) { // expected assertEquals(1, ex.getPossibleMatches().length); assertEquals("age", ex.getPossibleMatches()[0]); } }
@Test public void getPropertyWithOptional() { GetterWithOptional target = new GetterWithOptional(); TestBean tb = new TestBean("x"); BeanWrapper accessor = createAccessor(target); accessor.setPropertyValue("object", tb); assertSame(tb, target.value); assertSame(tb, target.getObject().get()); assertSame(tb, ((Optional<String>) accessor.getPropertyValue("object")).get()); assertEquals("x", target.value.getName()); assertEquals("x", target.getObject().get().getName()); assertEquals("x", accessor.getPropertyValue("object.name")); accessor.setPropertyValue("object.name", "y"); assertSame(tb, target.value); assertSame(tb, target.getObject().get()); assertSame(tb, ((Optional<String>) accessor.getPropertyValue("object")).get()); assertEquals("y", target.value.getName()); assertEquals("y", target.getObject().get().getName()); assertEquals("y", accessor.getPropertyValue("object.name")); }
@Test public void propertyDescriptors() { TestBean target = new TestBean(); target.setSpouse(new TestBean()); BeanWrapper accessor = createAccessor(target); accessor.setPropertyValue("name", "a"); accessor.setPropertyValue("spouse.name", "b"); assertEquals("a", target.getName()); assertEquals("b", target.getSpouse().getName()); assertEquals("a", accessor.getPropertyValue("name")); assertEquals("b", accessor.getPropertyValue("spouse.name")); assertEquals(String.class, accessor.getPropertyDescriptor("name").getPropertyType()); assertEquals(String.class, accessor.getPropertyDescriptor("spouse.name").getPropertyType()); }