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.validation;
017    
018    import junit.framework.TestCase;
019    
020    import org.springframework.binding.support.TestPropertyChangeListener;
021    import org.springframework.binding.validation.support.DefaultValidationMessage;
022    import org.springframework.binding.validation.support.DefaultValidationResults;
023    import org.springframework.binding.validation.support.DefaultValidationResultsModel;
024    import org.springframework.richclient.core.Severity;
025    
026    /**
027     * Tests for @link DefaultValidationResultsModel
028     * 
029     * @author  Oliver Hutchison
030     */
031    public class DefaultValidationResultsModelTests extends TestCase {
032        private DefaultValidationResultsModel vrm;
033    
034        private TestPropertyChangeListener warnListener;
035    
036        private TestPropertyChangeListener infoListener;
037    
038        private TestPropertyChangeListener errorsListener;
039    
040        private TestValidationListener listener;
041        
042        private TestValidationListener field1Listener;
043    
044        private TestValidationListener nullListener;
045    
046        public void setUp() {
047            vrm = new DefaultValidationResultsModel();
048            errorsListener = new TestPropertyChangeListener(ValidationResultsModel.HAS_ERRORS_PROPERTY);
049            vrm.addPropertyChangeListener(ValidationResultsModel.HAS_ERRORS_PROPERTY, errorsListener);
050            warnListener = new TestPropertyChangeListener(ValidationResultsModel.HAS_WARNINGS_PROPERTY);
051            vrm.addPropertyChangeListener(ValidationResultsModel.HAS_WARNINGS_PROPERTY, warnListener);
052            infoListener = new TestPropertyChangeListener(ValidationResultsModel.HAS_INFO_PROPERTY);
053            vrm.addPropertyChangeListener(ValidationResultsModel.HAS_INFO_PROPERTY, infoListener);
054            listener = new TestValidationListener();
055            vrm.addValidationListener(listener);
056            field1Listener = new TestValidationListener();
057            vrm.addValidationListener("field1", field1Listener);
058            nullListener = new TestValidationListener();
059            vrm.addValidationListener(ValidationMessage.GLOBAL_PROPERTY, nullListener);
060        }
061    
062        public void testUpdatesFirePropertyChangeEvents() {
063            vrm.updateValidationResults(getResults("field1", Severity.INFO));
064            assertEquals(1, infoListener.eventCount());
065            assertEquals(Boolean.FALSE, infoListener.lastEvent().getOldValue());
066            assertEquals(Boolean.TRUE, infoListener.lastEvent().getNewValue());
067            vrm.updateValidationResults(getResults("field1", Severity.INFO));
068            assertEquals(1, infoListener.eventCount());
069    
070            vrm.updateValidationResults(getResults("field1", Severity.WARNING));
071            assertEquals(1, warnListener.eventCount());
072            assertEquals(Boolean.FALSE, warnListener.lastEvent().getOldValue());
073            assertEquals(Boolean.TRUE, warnListener.lastEvent().getNewValue());
074            assertEquals(2, infoListener.eventCount());
075            assertEquals(Boolean.TRUE, infoListener.lastEvent().getOldValue());
076            assertEquals(Boolean.FALSE, infoListener.lastEvent().getNewValue());
077            vrm.updateValidationResults(getResults("field1", Severity.WARNING));
078            assertEquals(1, warnListener.eventCount());
079    
080            vrm.updateValidationResults(getResults("field1", Severity.ERROR));
081            assertEquals(1, errorsListener.eventCount());
082            assertEquals(Boolean.FALSE, errorsListener.lastEvent().getOldValue());
083            assertEquals(Boolean.TRUE, errorsListener.lastEvent().getNewValue());
084            assertEquals(2, warnListener.eventCount());
085            assertEquals(Boolean.TRUE, warnListener.lastEvent().getOldValue());
086            assertEquals(Boolean.FALSE, warnListener.lastEvent().getNewValue());
087            vrm.updateValidationResults(getResults("field1", Severity.ERROR));
088            assertEquals(1, errorsListener.eventCount());
089    
090            vrm.clearAllValidationResults();
091            assertEquals(2, infoListener.eventCount());
092            assertEquals(Boolean.TRUE, infoListener.lastEvent().getOldValue());
093            assertEquals(Boolean.FALSE, infoListener.lastEvent().getNewValue());
094            assertEquals(2, warnListener.eventCount());
095            assertEquals(Boolean.TRUE, warnListener.lastEvent().getOldValue());
096            assertEquals(Boolean.FALSE, warnListener.lastEvent().getNewValue());
097            assertEquals(2, errorsListener.eventCount());
098            assertEquals(Boolean.TRUE, errorsListener.lastEvent().getOldValue());
099            assertEquals(Boolean.FALSE, errorsListener.lastEvent().getNewValue());
100        }
101        
102        public void testEventsHaveCorectSource() {
103            vrm.updateValidationResults(getResults("field1", Severity.ERROR));
104            assertEquals(vrm, errorsListener.lastEvent().getSource());
105            assertEquals(vrm, listener.lastResults());
106            
107            ValidationResultsModel delegateFor = new DefaultValidationResultsModel();
108            vrm = new DefaultValidationResultsModel(delegateFor);
109            vrm.addValidationListener(listener);
110            vrm.addPropertyChangeListener(ValidationResultsModel.HAS_ERRORS_PROPERTY, errorsListener);        
111            vrm.updateValidationResults(getResults("field1", Severity.ERROR));
112            assertEquals(delegateFor, errorsListener.lastEvent().getSource());
113            assertEquals(delegateFor, listener.lastResults());
114        }
115    
116        public void testUpdatesFireValidationEvents() {
117            vrm.updateValidationResults(getResults("field1", Severity.INFO));
118            assertEquals(1, listener.eventCount());
119            assertEquals(1, field1Listener.eventCount());
120            assertEquals(0, nullListener.eventCount());
121            assertEquals(vrm, listener.lastResults());
122            assertEquals(vrm, field1Listener.lastResults());
123            assertEquals(null, nullListener.lastResults());
124            
125            vrm.updateValidationResults(getResults("field1", Severity.INFO, ValidationMessage.GLOBAL_PROPERTY, Severity.ERROR));
126            assertEquals(2, listener.eventCount());
127            assertEquals(2, field1Listener.eventCount());
128            assertEquals(1, nullListener.eventCount());
129            assertEquals(vrm, nullListener.lastResults());
130            
131            vrm.clearAllValidationResults();
132            assertEquals(3, listener.eventCount());
133            assertEquals(3, field1Listener.eventCount());
134            assertEquals(2, nullListener.eventCount());
135            
136            vrm.clearAllValidationResults();
137            assertEquals(3, listener.eventCount());
138            assertEquals(3, field1Listener.eventCount());
139            assertEquals(2, nullListener.eventCount());
140            
141            vrm.updateValidationResults(getResults(ValidationMessage.GLOBAL_PROPERTY, Severity.INFO));
142            assertEquals(4, listener.eventCount());
143            assertEquals(3, field1Listener.eventCount());
144            assertEquals(3, nullListener.eventCount());
145        }
146        
147        /**
148         * Simply check if {@link DefaultValidationResultsModel} counts its messages correctly.
149         */
150        public void testMessageCount() {
151            DefaultValidationResultsModel resultsModel = new DefaultValidationResultsModel();
152            resultsModel.addMessage(new DefaultValidationMessage("property1", Severity.ERROR, "message1"));
153            resultsModel.addMessage(new DefaultValidationMessage("property1", Severity.INFO, "message2"));
154            resultsModel.addMessage(new DefaultValidationMessage("property2", Severity.ERROR, "message3"));
155            assertEquals("Number of messages should be 3", 3, resultsModel.getMessageCount());
156            assertEquals("Number of messages registered for property1 should be 2", 2, resultsModel.getMessageCount("property1"));
157            assertEquals("Number of messages flagged as INFO should be 1", 1, resultsModel.getMessageCount(Severity.INFO));
158        }
159    
160        /**
161         * Check if adding a child triggers the parent to fire appropriate events.
162         */
163        public void testAddChildEvents() {
164            DefaultValidationResultsModel childModel = new DefaultValidationResultsModel();
165            
166            childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.ERROR, "childErrorMessage1"));
167            childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.WARNING, "childWarningMessage1"));
168            childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.INFO, "childInfoMessage1"));
169            vrm.add(childModel);
170            assertEquals("ParentModel adds child with Error.", 1, listener.eventCount());
171            assertEquals("ChildModel has ErrorMessage.", 1, errorsListener.eventCount());
172            assertEquals("ChildModel has WarningMessage.", 1, warnListener.eventCount());
173            assertEquals("ChildModel has InfoMessage.", 1, infoListener.eventCount());
174            assertEquals("ChildModel has ErrorMessage.", Boolean.TRUE, errorsListener.lastEvent().getNewValue());
175            assertEquals("ChildModel has WarningMessage.", Boolean.TRUE, warnListener.lastEvent().getNewValue());
176            assertEquals("ChildModel has InfoMessage.", Boolean.TRUE, infoListener.lastEvent().getNewValue());
177        }
178            
179        /**
180         * Check if adding a child triggers the parent to fire appropriate events.
181         */
182        public void testChildEvents() {
183            DefaultValidationResultsModel childModel = new DefaultValidationResultsModel();
184            
185            vrm.add(childModel);
186            childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.ERROR, "childErrorMessage1"));
187            childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.WARNING, "childWarningMessage1"));
188            childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.INFO, "childInfoMessage1"));
189            assertEquals("Child added errorMessage, warningMessage and InfoMessage.", 3, listener.eventCount());
190            assertEquals("ChildModel added ErrorMessage.", 1, errorsListener.eventCount());
191            assertEquals("ChildModel added WarningMessage.", 1, warnListener.eventCount());
192            assertEquals("ChildModel added InfoMessage.", 1, infoListener.eventCount());
193            assertEquals("ChildModel added ErrorMessage.", Boolean.TRUE, errorsListener.lastEvent().getNewValue());
194            assertEquals("ChildModel added WarningMessage.", Boolean.TRUE, warnListener.lastEvent().getNewValue());
195            assertEquals("ChildModel added InfoMessage.", Boolean.TRUE, infoListener.lastEvent().getNewValue());
196        }
197        
198        /**
199         * Check if adding a child triggers the parent to fire appropriate events.
200         */
201        public void testRemoveChildEvents() {
202            DefaultValidationResultsModel childModel = new DefaultValidationResultsModel();
203            
204            childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.ERROR, "childErrorMessage1"));
205            childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.WARNING, "childWarningMessage1"));
206            childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.INFO, "childInfoMessage1"));
207            vrm.add(childModel);
208            vrm.remove(childModel);
209            assertEquals("Child removed, revalidate.", 2, listener.eventCount());           
210            assertEquals("Child removed, revalidate ErrorMessages.", 2, errorsListener.eventCount());
211            assertEquals("Child removed, revalidate WarningMessages.", 2, warnListener.eventCount());
212            assertEquals("Child removed, revalidate InfoMessages.", 2, infoListener.eventCount());
213            assertEquals("Child removed, revalidate ErrorMessages.", Boolean.FALSE, errorsListener.lastEvent().getNewValue());
214            assertEquals("Child removed, revalidate WarningMessages.", Boolean.FALSE, warnListener.lastEvent().getNewValue());
215            assertEquals("Child removed, revalidate InfoMessages.", Boolean.FALSE, infoListener.lastEvent().getNewValue());
216        }
217    
218        private ValidationResults getResults(String field, Severity severity) {
219            DefaultValidationResults vr = new DefaultValidationResults();
220            vr.addMessage(field, severity, "");
221            return vr;
222        }
223    
224        private ValidationResults getResults(String field1, Severity severity1, String field2, Severity severity2) {
225            DefaultValidationResults vr = new DefaultValidationResults();
226            vr.addMessage(field1, severity1, "");
227            vr.addMessage(field2, severity2, "");
228            return vr;
229        }
230    
231        public static class TestValidationListener implements ValidationListener {
232    
233            private ValidationResults lastResults;
234    
235            private int eventCount = 0;
236    
237            public void validationResultsChanged(ValidationResults results) {
238                lastResults = results;
239                eventCount++;
240            }
241    
242            public int eventCount() {
243                return eventCount;
244            }
245    
246            public ValidationResults lastResults() {
247                return lastResults;
248            }
249        }
250    }