001    /*
002     * Copyright 2002-2004 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 org.springframework.binding.support.TestPropertyChangeListener;
019    import org.springframework.binding.value.ValueModel;
020    import org.springframework.binding.value.support.DirtyTrackingValueModel;
021    import org.springframework.binding.value.support.ValueHolder;
022    import org.springframework.richclient.test.SpringRichTestCase;
023    
024    /**
025     * Tests for @link FormModelMediatingValueModel
026     * 
027     * @author  Oliver Hutchison
028     */
029    public class FormModelMediatingValueModelTests extends SpringRichTestCase {
030        
031        private FormModelMediatingValueModel mvm;
032        
033        private ValueModel pvm;
034        
035        private TestPropertyChangeListener vcl;
036        
037        private TestPropertyChangeListener dcl;
038        
039        protected void doSetUp() throws Exception {
040            pvm = new ValueHolder();
041            mvm = new FormModelMediatingValueModel(pvm, true);
042            vcl = new TestPropertyChangeListener(ValueModel.VALUE_PROPERTY);
043            dcl = new TestPropertyChangeListener(DirtyTrackingValueModel.DIRTY_PROPERTY);
044            mvm.addValueChangeListener(vcl);
045            mvm.addPropertyChangeListener(DirtyTrackingValueModel.DIRTY_PROPERTY, dcl);
046        }
047        
048        public void testSetGet() {
049            mvm.setValue("1");
050            vcl.assertLastEvent(1, null, "1");
051            assertEquals("1", mvm.getValue());
052            assertEquals("1", pvm.getValue());
053            
054            mvm.setValue("2");
055            vcl.assertLastEvent(2, "1", "2");
056            assertEquals("2", mvm.getValue());
057            assertEquals("2", pvm.getValue());
058            
059            mvm.setValue("2");
060            vcl.assertEventCount(2);
061            
062            mvm.setValue(null);
063            vcl.assertLastEvent(3, "2", null);
064            assertEquals(null, mvm.getValue());
065            assertEquals(null, pvm.getValue());
066            
067            mvm.setValue(null);
068            vcl.assertEventCount(3);
069        }
070        
071        public void testDirtyTracking() {
072            assertTrue(!mvm.isDirty());
073            dcl.assertEventCount(0);
074            
075            mvm.setValue("1");
076            assertTrue(mvm.isDirty());
077            dcl.assertLastEvent(1, false, true);
078            
079            mvm.setValue(null);
080            assertTrue(!mvm.isDirty());
081            dcl.assertLastEvent(2, true, false);
082                    
083            mvm.setValue("2");
084            assertTrue(mvm.isDirty());
085            dcl.assertLastEvent(3, false, true);
086            
087            mvm.setValue("3");
088            dcl.assertEventCount(3);
089            
090            mvm.clearDirty();
091            assertTrue(!mvm.isDirty());
092            dcl.assertLastEvent(4, true, false);
093        }
094        
095        public void testValueUpFromPropertyValueModelClearsDirty() {        
096            pvm.setValue("1");
097            assertTrue(!mvm.isDirty());
098            dcl.assertEventCount(0);
099            
100            mvm.setValue("1");
101            assertTrue(!mvm.isDirty());
102            dcl.assertEventCount(0);
103            
104            mvm.setValue("2");
105            assertTrue(mvm.isDirty());
106            dcl.assertLastEvent(1, false, true);
107            
108            // XXX Is this failing test important? Fixing this behavior would be fairly complex.     
109            // pvm.setValue("2");
110            // assertTrue(!mvm.isDirty());
111            // dcl.assertLastEvent(2, true, false);        
112        }
113        
114        public void testTurningOnAndOffDeliverValueChangeEvents() {
115            mvm.setDeliverValueChangeEvents(false);
116            mvm.setValue("1");
117            vcl.assertEventCount(0);
118            dcl.assertEventCount(0);        
119            assertEquals("1", mvm.getValue());
120            assertEquals("1", pvm.getValue());
121            assertEquals(true, mvm.isDirty());
122            
123            mvm.setValue("2");
124            
125            mvm.setDeliverValueChangeEvents(true);
126            vcl.assertLastEvent(1, null, "2");
127            dcl.assertLastEvent(1, false, true);        
128            
129            mvm.setDeliverValueChangeEvents(false);
130            pvm.setValue("1");
131            vcl.assertEventCount(1);
132            dcl.assertEventCount(1);        
133            assertEquals("1", mvm.getValue());
134            assertEquals("1", pvm.getValue());
135            assertEquals(false, mvm.isDirty());
136            
137            mvm.setDeliverValueChangeEvents(true);
138            vcl.assertLastEvent(2, "2", "1");
139            dcl.assertLastEvent(2, true, false);         
140        }
141    }