]> source.dussan.org Git - vaadin-framework.git/commitdiff
extended test case to cover #6002
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Mon, 3 Jan 2011 12:33:05 +0000 (12:33 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Mon, 3 Jan 2011 12:33:05 +0000 (12:33 +0000)
svn changeset:16758/svn branch:6.5

tests/src/com/vaadin/tests/server/components/AbstractTestFieldValueChange.java
tests/src/com/vaadin/tests/server/components/TestTextFieldValueChange.java

index 45b5c0b0b2bd17393a442097d17a56f7dfc667aa..3aebd5bf9d2fd34263c41dcf1d9a79a49f70dc77 100644 (file)
@@ -33,6 +33,10 @@ public abstract class AbstractTestFieldValueChange extends TestCase {
 \r
     }\r
 \r
+    protected ValueChangeListener getListener() {\r
+        return listener;\r
+    }\r
+\r
     /**\r
      * Test that listeners are not called when they have been unregistered.\r
      */\r
index 9e50d983dc2cb6274ab3f95163b6ab9cf96d2f28..1144caf805b1583da70b3132c8de5425257893f4 100644 (file)
@@ -3,6 +3,12 @@ package com.vaadin.tests.server.components;
 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
@@ -36,4 +42,139 @@ public class TestTextFieldValueChange extends AbstractTestFieldValueChange {
         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