package org.tessell.tests.model.validation.rules; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.tessell.model.properties.NewProperty.booleanProperty; import static org.tessell.model.properties.NewProperty.listProperty; import static org.tessell.model.properties.NewProperty.stringProperty; import org.junit.Before; import org.junit.Test; import org.tessell.model.properties.BooleanProperty; import org.tessell.model.properties.ListProperty; import org.tessell.model.properties.StringProperty; import org.tessell.model.validation.rules.Required; public class RequiredTest extends AbstractRuleTest { // model class just for this test private class Foo { private final StringProperty name = stringProperty("name"); private final BooleanProperty condition = booleanProperty("condition", true); private final ListProperty<String> colors = listProperty("colors"); } private final Foo f = new Foo(); @Before public void listenToName() { listenTo(f.name); listenTo(f.condition); listenTo(f.colors); } @Test public void ruleDoesNotFireIfPropertyUntouched() { assertThat(f.name.isTouched(), is(false)); final Required r = new Required("name invalid"); f.name.addRule(r); r.validate(); assertMessages(""); } @Test public void testTickedDoesFire() { Required r = new Required("name invalid"); f.name.addRule(r); f.name.set(null); assertMessages("name invalid"); } @Test public void testTickedUnfiresAfterValid() { Required r = new Required("name invalid"); f.name.addRule(r); f.name.set(null); assertMessages("name invalid"); f.name.set("asdf"); assertMessages(""); } @Test public void testUnfireIfSkippedLaterIsNotDoneAutomatically() { Required r = new Required("name invalid"); r.onlyIf(f.condition); f.name.addRule(r); f.name.set(null); assertMessages("name invalid"); // Just setting the onlyIf percolates down to our Required rule f.condition.set(false); assertMessages(""); // was left touched, e.g. even if onlyIf=true, requires Force.YES f.condition.set(true); // reassessing f.name is required for now f.name.reassess(); assertMessages("name invalid"); } @Test public void requiredListsMustBeNonEmpty() { f.colors.addRule(new Required("colors required")); f.colors.touch(); assertMessages("colors required"); f.colors.add("Blue"); assertNoMessages(); } @Test public void requiredMarksPropertyRequired() { f.colors.addRule(new Required("colors required")); assertThat(f.colors.isRequired(), is(true)); } }