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 }