1   /*
2    * Copyright 2002-2004 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.validation;
17  
18  import junit.framework.TestCase;
19  
20  import org.springframework.binding.support.TestPropertyChangeListener;
21  import org.springframework.binding.validation.support.DefaultValidationMessage;
22  import org.springframework.binding.validation.support.DefaultValidationResults;
23  import org.springframework.binding.validation.support.DefaultValidationResultsModel;
24  import org.springframework.richclient.core.Severity;
25  
26  /**
27   * Tests for @link DefaultValidationResultsModel
28   * 
29   * @author  Oliver Hutchison
30   */
31  public class DefaultValidationResultsModelTests extends TestCase {
32      private DefaultValidationResultsModel vrm;
33  
34      private TestPropertyChangeListener warnListener;
35  
36      private TestPropertyChangeListener infoListener;
37  
38      private TestPropertyChangeListener errorsListener;
39  
40      private TestValidationListener listener;
41      
42      private TestValidationListener field1Listener;
43  
44      private TestValidationListener nullListener;
45  
46      public void setUp() {
47          vrm = new DefaultValidationResultsModel();
48          errorsListener = new TestPropertyChangeListener(ValidationResultsModel.HAS_ERRORS_PROPERTY);
49          vrm.addPropertyChangeListener(ValidationResultsModel.HAS_ERRORS_PROPERTY, errorsListener);
50          warnListener = new TestPropertyChangeListener(ValidationResultsModel.HAS_WARNINGS_PROPERTY);
51          vrm.addPropertyChangeListener(ValidationResultsModel.HAS_WARNINGS_PROPERTY, warnListener);
52          infoListener = new TestPropertyChangeListener(ValidationResultsModel.HAS_INFO_PROPERTY);
53          vrm.addPropertyChangeListener(ValidationResultsModel.HAS_INFO_PROPERTY, infoListener);
54          listener = new TestValidationListener();
55          vrm.addValidationListener(listener);
56          field1Listener = new TestValidationListener();
57          vrm.addValidationListener("field1", field1Listener);
58          nullListener = new TestValidationListener();
59          vrm.addValidationListener(ValidationMessage.GLOBAL_PROPERTY, nullListener);
60      }
61  
62      public void testUpdatesFirePropertyChangeEvents() {
63          vrm.updateValidationResults(getResults("field1", Severity.INFO));
64          assertEquals(1, infoListener.eventCount());
65          assertEquals(Boolean.FALSE, infoListener.lastEvent().getOldValue());
66          assertEquals(Boolean.TRUE, infoListener.lastEvent().getNewValue());
67          vrm.updateValidationResults(getResults("field1", Severity.INFO));
68          assertEquals(1, infoListener.eventCount());
69  
70          vrm.updateValidationResults(getResults("field1", Severity.WARNING));
71          assertEquals(1, warnListener.eventCount());
72          assertEquals(Boolean.FALSE, warnListener.lastEvent().getOldValue());
73          assertEquals(Boolean.TRUE, warnListener.lastEvent().getNewValue());
74          assertEquals(2, infoListener.eventCount());
75          assertEquals(Boolean.TRUE, infoListener.lastEvent().getOldValue());
76          assertEquals(Boolean.FALSE, infoListener.lastEvent().getNewValue());
77          vrm.updateValidationResults(getResults("field1", Severity.WARNING));
78          assertEquals(1, warnListener.eventCount());
79  
80          vrm.updateValidationResults(getResults("field1", Severity.ERROR));
81          assertEquals(1, errorsListener.eventCount());
82          assertEquals(Boolean.FALSE, errorsListener.lastEvent().getOldValue());
83          assertEquals(Boolean.TRUE, errorsListener.lastEvent().getNewValue());
84          assertEquals(2, warnListener.eventCount());
85          assertEquals(Boolean.TRUE, warnListener.lastEvent().getOldValue());
86          assertEquals(Boolean.FALSE, warnListener.lastEvent().getNewValue());
87          vrm.updateValidationResults(getResults("field1", Severity.ERROR));
88          assertEquals(1, errorsListener.eventCount());
89  
90          vrm.clearAllValidationResults();
91          assertEquals(2, infoListener.eventCount());
92          assertEquals(Boolean.TRUE, infoListener.lastEvent().getOldValue());
93          assertEquals(Boolean.FALSE, infoListener.lastEvent().getNewValue());
94          assertEquals(2, warnListener.eventCount());
95          assertEquals(Boolean.TRUE, warnListener.lastEvent().getOldValue());
96          assertEquals(Boolean.FALSE, warnListener.lastEvent().getNewValue());
97          assertEquals(2, errorsListener.eventCount());
98          assertEquals(Boolean.TRUE, errorsListener.lastEvent().getOldValue());
99          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 }