001    /*
002     * Copyright 2002-2005 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.binding.form.support;
017    
018    import java.util.HashMap;
019    import java.util.Map;
020    
021    import org.springframework.binding.form.FieldMetadata;
022    import org.springframework.binding.support.TestPropertyChangeListener;
023    import org.springframework.binding.value.support.ValueHolder;
024    import org.springframework.richclient.test.SpringRichTestCase;
025    
026    /**
027     * 
028     * @author  Oliver Hutchison
029     */
030    public class DefaultFieldMetadataTests extends SpringRichTestCase {
031    
032        public void testDirtyChangeTrackingOnValueChange() {
033            FormModelMediatingValueModel vm = new FormModelMediatingValueModel(new ValueHolder("v1"));
034            DefaultFormModel fm = new DefaultFormModel(new Object());
035            DefaultFieldMetadata m = new DefaultFieldMetadata(fm, vm, Object.class, false, null);
036            TestPropertyChangeListener pcl = new TestPropertyChangeListener(FieldMetadata.DIRTY_PROPERTY);
037            m.addPropertyChangeListener(FieldMetadata.DIRTY_PROPERTY, pcl);        
038            assertTrue(!m.isDirty());
039            assertEquals(0, pcl.eventCount());
040            
041            vm.setValue("v1");
042            assertEquals(0, pcl.eventCount());
043            assertTrue(!m.isDirty());
044            
045            vm.setValue("v2");
046            assertEquals(1, pcl.eventCount());
047            assertTrue(m.isDirty());
048            
049            vm.setValue("v3");
050            assertEquals(1, pcl.eventCount());
051            assertTrue(m.isDirty());
052            
053            vm.setValue("v1");
054            assertEquals(2, pcl.eventCount());
055            assertTrue(!m.isDirty());
056            
057            vm.setValue(null);
058            assertEquals(3, pcl.eventCount());
059            assertTrue(m.isDirty());        
060            
061            vm.clearDirty();
062            assertEquals(4, pcl.eventCount());
063            assertTrue(!m.isDirty());
064            
065            vm.setValue(null);
066            assertEquals(4, pcl.eventCount());
067            assertTrue(!m.isDirty());    
068        }
069        
070        public void testEnabledChange() {
071            FormModelMediatingValueModel vm = new FormModelMediatingValueModel(new ValueHolder("v1"));
072            DefaultFormModel fm = new DefaultFormModel(new Object());
073            DefaultFieldMetadata m = new DefaultFieldMetadata(fm, vm, Object.class, false, null);
074            TestPropertyChangeListener pcl = new TestPropertyChangeListener(FieldMetadata.ENABLED_PROPERTY);
075            m.addPropertyChangeListener(FieldMetadata.ENABLED_PROPERTY, pcl);
076            assertEquals(0, pcl.eventCount());
077            assertTrue(m.isEnabled());        
078            
079            m.setEnabled(true);
080            assertEquals(0, pcl.eventCount());
081            assertTrue(m.isEnabled());
082            
083            m.setEnabled(false);
084            assertEquals(1, pcl.eventCount());
085            assertTrue(!m.isEnabled());
086            
087            fm.setEnabled(false);
088            assertEquals(1, pcl.eventCount());
089            assertTrue(!m.isEnabled());
090            
091            m.setEnabled(true);
092            assertEquals(1, pcl.eventCount());
093            assertTrue(!m.isEnabled());
094            
095            fm.setEnabled(true);
096            assertEquals(2, pcl.eventCount());
097            assertTrue(m.isEnabled());        
098        }
099      
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    }