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 }