/**
* Copyright (C) 2015 Valkyrie RCP
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.valkyriercp.binding.validation;
import org.junit.Before;
import org.junit.Test;
import org.valkyriercp.AbstractValkyrieTest;
import org.valkyriercp.binding.validation.support.DefaultValidationMessage;
import org.valkyriercp.binding.validation.support.DefaultValidationResults;
import org.valkyriercp.binding.validation.support.DefaultValidationResultsModel;
import org.valkyriercp.core.Severity;
import org.valkyriercp.test.TestPropertyChangeListener;
import static org.junit.Assert.assertEquals;
/**
* Tests for @link DefaultValidationResultsModel
*
* @author Oliver Hutchison
*/
public class DefaultValidationResultsModelTests extends AbstractValkyrieTest {
private DefaultValidationResultsModel vrm;
private TestPropertyChangeListener warnListener;
private TestPropertyChangeListener infoListener;
private TestPropertyChangeListener errorsListener;
private TestValidationListener listener;
private TestValidationListener field1Listener;
private TestValidationListener nullListener;
@Before
public void setUp() {
vrm = new DefaultValidationResultsModel();
errorsListener = new TestPropertyChangeListener(ValidationResultsModel.HAS_ERRORS_PROPERTY);
vrm.addPropertyChangeListener(ValidationResultsModel.HAS_ERRORS_PROPERTY, errorsListener);
warnListener = new TestPropertyChangeListener(ValidationResultsModel.HAS_WARNINGS_PROPERTY);
vrm.addPropertyChangeListener(ValidationResultsModel.HAS_WARNINGS_PROPERTY, warnListener);
infoListener = new TestPropertyChangeListener(ValidationResultsModel.HAS_INFO_PROPERTY);
vrm.addPropertyChangeListener(ValidationResultsModel.HAS_INFO_PROPERTY, infoListener);
listener = new TestValidationListener();
vrm.addValidationListener(listener);
field1Listener = new TestValidationListener();
vrm.addValidationListener("field1", field1Listener);
nullListener = new TestValidationListener();
vrm.addValidationListener(ValidationMessage.GLOBAL_PROPERTY, nullListener);
}
@Test
public void testUpdatesFirePropertyChangeEvents() {
vrm.updateValidationResults(getResults("field1", Severity.INFO));
assertEquals(1, infoListener.eventCount());
assertEquals(Boolean.FALSE, infoListener.lastEvent().getOldValue());
assertEquals(Boolean.TRUE, infoListener.lastEvent().getNewValue());
vrm.updateValidationResults(getResults("field1", Severity.INFO));
assertEquals(1, infoListener.eventCount());
vrm.updateValidationResults(getResults("field1", Severity.WARNING));
assertEquals(1, warnListener.eventCount());
assertEquals(Boolean.FALSE, warnListener.lastEvent().getOldValue());
assertEquals(Boolean.TRUE, warnListener.lastEvent().getNewValue());
assertEquals(2, infoListener.eventCount());
assertEquals(Boolean.TRUE, infoListener.lastEvent().getOldValue());
assertEquals(Boolean.FALSE, infoListener.lastEvent().getNewValue());
vrm.updateValidationResults(getResults("field1", Severity.WARNING));
assertEquals(1, warnListener.eventCount());
vrm.updateValidationResults(getResults("field1", Severity.ERROR));
assertEquals(1, errorsListener.eventCount());
assertEquals(Boolean.FALSE, errorsListener.lastEvent().getOldValue());
assertEquals(Boolean.TRUE, errorsListener.lastEvent().getNewValue());
assertEquals(2, warnListener.eventCount());
assertEquals(Boolean.TRUE, warnListener.lastEvent().getOldValue());
assertEquals(Boolean.FALSE, warnListener.lastEvent().getNewValue());
vrm.updateValidationResults(getResults("field1", Severity.ERROR));
assertEquals(1, errorsListener.eventCount());
vrm.clearAllValidationResults();
assertEquals(2, infoListener.eventCount());
assertEquals(Boolean.TRUE, infoListener.lastEvent().getOldValue());
assertEquals(Boolean.FALSE, infoListener.lastEvent().getNewValue());
assertEquals(2, warnListener.eventCount());
assertEquals(Boolean.TRUE, warnListener.lastEvent().getOldValue());
assertEquals(Boolean.FALSE, warnListener.lastEvent().getNewValue());
assertEquals(2, errorsListener.eventCount());
assertEquals(Boolean.TRUE, errorsListener.lastEvent().getOldValue());
assertEquals(Boolean.FALSE, errorsListener.lastEvent().getNewValue());
}
@Test
public void testEventsHaveCorectSource() {
vrm.updateValidationResults(getResults("field1", Severity.ERROR));
assertEquals(vrm, errorsListener.lastEvent().getSource());
assertEquals(vrm, listener.lastResults());
ValidationResultsModel delegateFor = new DefaultValidationResultsModel();
vrm = new DefaultValidationResultsModel(delegateFor);
vrm.addValidationListener(listener);
vrm.addPropertyChangeListener(ValidationResultsModel.HAS_ERRORS_PROPERTY, errorsListener);
vrm.updateValidationResults(getResults("field1", Severity.ERROR));
assertEquals(delegateFor, errorsListener.lastEvent().getSource());
assertEquals(delegateFor, listener.lastResults());
}
@Test
public void testUpdatesFireValidationEvents() {
vrm.updateValidationResults(getResults("field1", Severity.INFO));
assertEquals(1, listener.eventCount());
assertEquals(1, field1Listener.eventCount());
assertEquals(0, nullListener.eventCount());
assertEquals(vrm, listener.lastResults());
assertEquals(vrm, field1Listener.lastResults());
assertEquals(null, nullListener.lastResults());
vrm.updateValidationResults(getResults("field1", Severity.INFO, ValidationMessage.GLOBAL_PROPERTY, Severity.ERROR));
assertEquals(2, listener.eventCount());
assertEquals(2, field1Listener.eventCount());
assertEquals(1, nullListener.eventCount());
assertEquals(vrm, nullListener.lastResults());
vrm.clearAllValidationResults();
assertEquals(3, listener.eventCount());
assertEquals(3, field1Listener.eventCount());
assertEquals(2, nullListener.eventCount());
vrm.clearAllValidationResults();
assertEquals(3, listener.eventCount());
assertEquals(3, field1Listener.eventCount());
assertEquals(2, nullListener.eventCount());
vrm.updateValidationResults(getResults(ValidationMessage.GLOBAL_PROPERTY, Severity.INFO));
assertEquals(4, listener.eventCount());
assertEquals(3, field1Listener.eventCount());
assertEquals(3, nullListener.eventCount());
}
@Test
public void testMessageCount() {
DefaultValidationResultsModel resultsModel = new DefaultValidationResultsModel();
resultsModel.addMessage(new DefaultValidationMessage("property1", Severity.ERROR, "message1"));
resultsModel.addMessage(new DefaultValidationMessage("property1", Severity.INFO, "message2"));
resultsModel.addMessage(new DefaultValidationMessage("property2", Severity.ERROR, "message3"));
assertEquals("Number of messages should be 3", 3, resultsModel.getMessageCount());
assertEquals("Number of messages registered for property1 should be 2", 2, resultsModel.getMessageCount("property1"));
assertEquals("Number of messages flagged as INFO should be 1", 1, resultsModel.getMessageCount(Severity.INFO));
}
@Test
public void testAddChildEvents() {
DefaultValidationResultsModel childModel = new DefaultValidationResultsModel();
childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.ERROR, "childErrorMessage1"));
childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.WARNING, "childWarningMessage1"));
childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.INFO, "childInfoMessage1"));
vrm.add(childModel);
assertEquals("ParentModel adds child with Error.", 1, listener.eventCount());
assertEquals("ChildModel has ErrorMessage.", 1, errorsListener.eventCount());
assertEquals("ChildModel has WarningMessage.", 1, warnListener.eventCount());
assertEquals("ChildModel has InfoMessage.", 1, infoListener.eventCount());
assertEquals("ChildModel has ErrorMessage.", Boolean.TRUE, errorsListener.lastEvent().getNewValue());
assertEquals("ChildModel has WarningMessage.", Boolean.TRUE, warnListener.lastEvent().getNewValue());
assertEquals("ChildModel has InfoMessage.", Boolean.TRUE, infoListener.lastEvent().getNewValue());
}
@Test
public void testChildEvents() {
DefaultValidationResultsModel childModel = new DefaultValidationResultsModel();
vrm.add(childModel);
childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.ERROR, "childErrorMessage1"));
childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.WARNING, "childWarningMessage1"));
childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.INFO, "childInfoMessage1"));
assertEquals("Child added errorMessage, warningMessage and InfoMessage.", 3, listener.eventCount());
assertEquals("ChildModel added ErrorMessage.", 1, errorsListener.eventCount());
assertEquals("ChildModel added WarningMessage.", 1, warnListener.eventCount());
assertEquals("ChildModel added InfoMessage.", 1, infoListener.eventCount());
assertEquals("ChildModel added ErrorMessage.", Boolean.TRUE, errorsListener.lastEvent().getNewValue());
assertEquals("ChildModel added WarningMessage.", Boolean.TRUE, warnListener.lastEvent().getNewValue());
assertEquals("ChildModel added InfoMessage.", Boolean.TRUE, infoListener.lastEvent().getNewValue());
}
@Test
public void testRemoveChildEvents() {
DefaultValidationResultsModel childModel = new DefaultValidationResultsModel();
childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.ERROR, "childErrorMessage1"));
childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.WARNING, "childWarningMessage1"));
childModel.addMessage(new DefaultValidationMessage("childProperty1", Severity.INFO, "childInfoMessage1"));
vrm.add(childModel);
vrm.remove(childModel);
assertEquals("Child removed, revalidate.", 2, listener.eventCount());
assertEquals("Child removed, revalidate ErrorMessages.", 2, errorsListener.eventCount());
assertEquals("Child removed, revalidate WarningMessages.", 2, warnListener.eventCount());
assertEquals("Child removed, revalidate InfoMessages.", 2, infoListener.eventCount());
assertEquals("Child removed, revalidate ErrorMessages.", Boolean.FALSE, errorsListener.lastEvent().getNewValue());
assertEquals("Child removed, revalidate WarningMessages.", Boolean.FALSE, warnListener.lastEvent().getNewValue());
assertEquals("Child removed, revalidate InfoMessages.", Boolean.FALSE, infoListener.lastEvent().getNewValue());
}
private ValidationResults getResults(String field, Severity severity) {
DefaultValidationResults vr = new DefaultValidationResults();
vr.addMessage(field, severity, "");
return vr;
}
private ValidationResults getResults(String field1, Severity severity1, String field2, Severity severity2) {
DefaultValidationResults vr = new DefaultValidationResults();
vr.addMessage(field1, severity1, "");
vr.addMessage(field2, severity2, "");
return vr;
}
public static class TestValidationListener implements ValidationListener {
private ValidationResults lastResults;
private int eventCount = 0;
public void validationResultsChanged(ValidationResults results) {
lastResults = results;
eventCount++;
}
public int eventCount() {
return eventCount;
}
public ValidationResults lastResults() {
return lastResults;
}
}
}