1   /*
2    * Copyright 2002-2005 the original author or authors.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5    * use this file except in compliance with the License. You may obtain a copy of
6    * the License at
7    * 
8    * http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations under
14   * the License.
15   */
16  package org.springframework.binding.form.support;
17  
18  import java.util.HashMap;
19  import java.util.Map;
20  
21  import org.springframework.binding.form.FieldMetadata;
22  import org.springframework.binding.support.TestPropertyChangeListener;
23  import org.springframework.binding.value.support.ValueHolder;
24  import org.springframework.richclient.test.SpringRichTestCase;
25  
26  /**
27   * 
28   * @author  Oliver Hutchison
29   */
30  public class DefaultFieldMetadataTests extends SpringRichTestCase {
31  
32      public void testDirtyChangeTrackingOnValueChange() {
33          FormModelMediatingValueModel vm = new FormModelMediatingValueModel(new ValueHolder("v1"));
34          DefaultFormModel fm = new DefaultFormModel(new Object());
35          DefaultFieldMetadata m = new DefaultFieldMetadata(fm, vm, Object.class, false, null);
36          TestPropertyChangeListener pcl = new TestPropertyChangeListener(FieldMetadata.DIRTY_PROPERTY);
37          m.addPropertyChangeListener(FieldMetadata.DIRTY_PROPERTY, pcl);        
38          assertTrue(!m.isDirty());
39          assertEquals(0, pcl.eventCount());
40          
41          vm.setValue("v1");
42          assertEquals(0, pcl.eventCount());
43          assertTrue(!m.isDirty());
44          
45          vm.setValue("v2");
46          assertEquals(1, pcl.eventCount());
47          assertTrue(m.isDirty());
48          
49          vm.setValue("v3");
50          assertEquals(1, pcl.eventCount());
51          assertTrue(m.isDirty());
52          
53          vm.setValue("v1");
54          assertEquals(2, pcl.eventCount());
55          assertTrue(!m.isDirty());
56          
57          vm.setValue(null);
58          assertEquals(3, pcl.eventCount());
59          assertTrue(m.isDirty());        
60          
61          vm.clearDirty();
62          assertEquals(4, pcl.eventCount());
63          assertTrue(!m.isDirty());
64          
65          vm.setValue(null);
66          assertEquals(4, pcl.eventCount());
67          assertTrue(!m.isDirty());    
68      }
69      
70      public void testEnabledChange() {
71          FormModelMediatingValueModel vm = new FormModelMediatingValueModel(new ValueHolder("v1"));
72          DefaultFormModel fm = new DefaultFormModel(new Object());
73          DefaultFieldMetadata m = new DefaultFieldMetadata(fm, vm, Object.class, false, null);
74          TestPropertyChangeListener pcl = new TestPropertyChangeListener(FieldMetadata.ENABLED_PROPERTY);
75          m.addPropertyChangeListener(FieldMetadata.ENABLED_PROPERTY, pcl);
76          assertEquals(0, pcl.eventCount());
77          assertTrue(m.isEnabled());        
78          
79          m.setEnabled(true);
80          assertEquals(0, pcl.eventCount());
81          assertTrue(m.isEnabled());
82          
83          m.setEnabled(false);
84          assertEquals(1, pcl.eventCount());
85          assertTrue(!m.isEnabled());
86          
87          fm.setEnabled(false);
88          assertEquals(1, pcl.eventCount());
89          assertTrue(!m.isEnabled());
90          
91          m.setEnabled(true);
92          assertEquals(1, pcl.eventCount());
93          assertTrue(!m.isEnabled());
94          
95          fm.setEnabled(true);
96          assertEquals(2, pcl.eventCount());
97          assertTrue(m.isEnabled());        
98      }
99    
100   
101     public void testCustomMetaData() {
102         final FormModelMediatingValueModel vm = new FormModelMediatingValueModel(new ValueHolder("v1"));
103         final DefaultFormModel fm = new DefaultFormModel(new Object());
104         final Map customMeta = new HashMap();
105         customMeta.put("custom1", "a");
106         customMeta.put("custom2", "b");
107         final DefaultFieldMetadata m = new DefaultFieldMetadata(fm, vm, Object.class, false, customMeta);
108   
109         assertNull(m.getUserMetadata("custom3"));
110         assertEquals("a", m.getUserMetadata("custom1"));
111         assertEquals("b", m.getUserMetadata("custom2"));
112     }
113   
114     public void testMutableCustomMetaData() {
115         final FormModelMediatingValueModel vm = new FormModelMediatingValueModel(new ValueHolder("v1"));
116         final DefaultFormModel fm = new DefaultFormModel(new Object());
117         final DefaultFieldMetadata m = new DefaultFieldMetadata(fm, vm, Object.class, false, null);
118         final String name = "customProperty";
119         final String othername = "othername";
120         final TestPropertyChangeListener pcl = new TestPropertyChangeListener(name);
121         final TestPropertyChangeListener pclOther = new TestPropertyChangeListener(othername);
122 
123         m.addPropertyChangeListener(name, pcl);
124         m.addPropertyChangeListener(othername, pclOther);
125         
126         assertNull(m.getUserMetadata(name));
127         pcl.assertEventCount(0);
128         
129         m.setUserMetadata(name, "a");
130         assertEquals("a", m.getUserMetadata(name));
131         pcl.assertEventCount(1);
132         assertNull(pcl.lastEvent().getOldValue());
133         assertEquals("a", pcl.lastEvent().getNewValue());
134       
135         m.setUserMetadata(name, "b");
136         assertEquals("b", m.getUserMetadata(name));
137         pcl.assertEventCount(2);
138         assertEquals("a", pcl.lastEvent().getOldValue());
139         assertEquals("b", pcl.lastEvent().getNewValue());
140       
141         m.setUserMetadata(name, "b");
142         pcl.assertEventCount(2);
143       
144         m.setUserMetadata(name, null);
145         assertNull(m.getUserMetadata(name));
146         pcl.assertEventCount(3);
147         assertEquals("b", pcl.lastEvent().getOldValue());
148         assertNull(pcl.lastEvent().getNewValue());
149 
150         pclOther.assertEventCount(0);
151         m.setUserMetadata(othername, "1");
152         pcl.assertEventCount(3);
153         pclOther.assertEventCount(1);
154       
155         m.clearUserMetadata();
156       
157         assertNull(m.getUserMetadata(name));
158         assertNull(m.getUserMetadata(othername));
159         pcl.assertEventCount(3);
160         pclOther.assertEventCount(2);
161         assertEquals("1", pclOther.lastEvent().getOldValue());
162         assertEquals(null, pclOther.lastEvent().getNewValue());
163     }
164 }