import java.util.HashMap;\r
import java.util.Map;\r
\r
+import junit.framework.Assert;\r
+\r
+import org.easymock.EasyMock;\r
+\r
+import com.vaadin.data.Property.ValueChangeEvent;\r
+import com.vaadin.data.util.ObjectProperty;\r
import com.vaadin.ui.AbstractField;\r
import com.vaadin.ui.TextField;\r
\r
field.changeVariables(field, variables);\r
}\r
\r
+ /**\r
+ * Test that field propagates value change events originating from property,\r
+ * but don't fire value change events twice if value has only changed once.\r
+ * \r
+ * \r
+ * TODO make test field type agnostic (eg. combobox)\r
+ */\r
+ public void testValueChangeEventPropagationWithReadThrough() {\r
+ ObjectProperty<String> property = new ObjectProperty<String>("");\r
+ getField().setPropertyDataSource(property);\r
+\r
+ // defaults, buffering off\r
+ getField().setWriteThrough(true);\r
+ getField().setReadThrough(true);\r
+\r
+ // Expectations and start test\r
+ getListener().valueChange(EasyMock.isA(ValueChangeEvent.class));\r
+ EasyMock.replay(getListener());\r
+\r
+ // Add listener and set the value -> should end up in listener once\r
+ getField().addListener(getListener());\r
+\r
+ property.setValue("Foo");\r
+\r
+ // Ensure listener was called once\r
+ EasyMock.verify(getListener());\r
+\r
+ // get value should not fire value change again\r
+ Object value = getField().getValue();\r
+ Assert.assertEquals("Foo", value);\r
+\r
+ // Ensure listener still has been called only once\r
+ EasyMock.verify(getListener());\r
+ }\r
+\r
+ /**\r
+ * If read through is on and value has been modified, but not committed, the\r
+ * value should not propagate similar to\r
+ * {@link #testValueChangeEventPropagationWithReadThrough()}\r
+ * \r
+ * TODO make test field type agnostic (eg. combobox)\r
+ */\r
+ public void testValueChangePropagationWithReadThroughWithModifiedValue() {\r
+ final String initialValue = "initial";\r
+ ObjectProperty<String> property = new ObjectProperty<String>(\r
+ initialValue);\r
+ getField().setPropertyDataSource(property);\r
+\r
+ // write buffering on, read buffering off\r
+ getField().setWriteThrough(false);\r
+ getField().setReadThrough(true);\r
+\r
+ // Expect no value changes calls to listener\r
+ EasyMock.replay(getListener());\r
+\r
+ // first set the value (note, write through false -> not forwarded to\r
+ // property)\r
+ setValue(getField());\r
+\r
+ Assert.assertTrue(getField().isModified());\r
+\r
+ // Add listener and set the value -> should end up in listener once\r
+ getField().addListener(getListener());\r
+\r
+ // modify property value, should not fire value change in field as the\r
+ // field has uncommitted value (aka isModified() == true)\r
+ property.setValue("Foo");\r
+\r
+ // Ensure listener was called once\r
+ EasyMock.verify(getListener());\r
+\r
+ // get value should not fire value change again\r
+ Object value = getField().getValue();\r
+ // Ensure listener still has been called only once\r
+ EasyMock.verify(getListener());\r
+\r
+ // field value should be different from the original value and current\r
+ // proeprty value\r
+ boolean isValueEqualToInitial = value.equals(initialValue);\r
+ Assert.assertFalse(isValueEqualToInitial);\r
+ boolean isValueEqualToPropertyValue = value.equals(property.getValue());\r
+ Assert.assertFalse(isValueEqualToPropertyValue);\r
+\r
+ // Ensure listener has not been called\r
+ EasyMock.verify(getListener());\r
+\r
+ }\r
+\r
+ /**\r
+ * Value change events from property should not propagate if read through is\r
+ * false. Execpt when the property is being set.\r
+ * \r
+ * TODO make test field type agnostic (eg. combobox)\r
+ */\r
+ public void testValueChangePropagationWithReadThroughOff() {\r
+ final String initialValue = "initial";\r
+ ObjectProperty<String> property = new ObjectProperty<String>(\r
+ initialValue);\r
+\r
+ // set buffering\r
+ getField().setWriteThrough(false);\r
+ getField().setReadThrough(false);\r
+\r
+ // Value change should only happen once, when setting the property,\r
+ // further changes via property should not cause value change listener\r
+ // in field to be notified\r
+ getListener().valueChange(EasyMock.isA(ValueChangeEvent.class));\r
+ EasyMock.replay(getListener());\r
+\r
+ getField().addListener(getListener());\r
+ getField().setPropertyDataSource(property);\r
+\r
+ // Ensure listener was called once\r
+ EasyMock.verify(getListener());\r
+\r
+ // modify property value, should not fire value change in field as the\r
+ // read buffering is on (read through == false)\r
+ property.setValue("Foo");\r
+\r
+ // Ensure listener still has been called only once\r
+ EasyMock.verify(getListener());\r
+\r
+ // get value should not fire value change again\r
+ Object value = getField().getValue();\r
+\r
+ // field value should be different from the original value and current\r
+ // proeprty value\r
+ boolean isValueEqualToInitial = value.equals(initialValue);\r
+ Assert.assertTrue(isValueEqualToInitial);\r
+\r
+ // Ensure listener still has been called only once\r
+ EasyMock.verify(getListener());\r
+\r
+ }\r
+\r
}\r