package org.tessell.tests.model.properties; import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.tessell.model.properties.NewProperty.and; import static org.tessell.model.properties.NewProperty.booleanProperty; import static org.tessell.model.properties.NewProperty.or; import org.junit.Test; import org.tessell.model.events.PropertyChangedEvent; import org.tessell.model.events.PropertyChangedHandler; import org.tessell.model.properties.BooleanProperty; import org.tessell.model.properties.Property; import org.tessell.tests.model.validation.rules.AbstractRuleTest; public class BooleanPropertyTest extends AbstractRuleTest { @Test public void toggleFromNullToTrue() { BooleanProperty p = booleanProperty("p"); p.toggle(); assertThat(p.get(), is(TRUE)); } @Test public void toggleFromFalseToTrue() { BooleanProperty p = booleanProperty("p", false); p.toggle(); assertThat(p.get(), is(TRUE)); } @Test public void toggleFromTrueToFalse() { BooleanProperty p = booleanProperty("p", true); p.toggle(); assertThat(p.get(), is(FALSE)); } @Test public void testNot() { BooleanProperty a = booleanProperty("a"); Property<Boolean> b = a.not(); assertThat(b.get(), is(nullValue())); a.set(true); assertThat(b.get(), is(false)); a.set(false); assertThat(b.get(), is(true)); b.set(false); assertThat(a.get(), is(true)); b.set(true); assertThat(a.get(), is(false)); b.set(null); assertThat(a.get(), is(nullValue())); } @Test public void testOr() { BooleanProperty a = booleanProperty("a"); BooleanProperty b = booleanProperty("b"); BooleanProperty o = or(a, b); assertThat(o.get(), is(false)); a.set(true); assertThat(o.get(), is(true)); } @Test public void testAnd() { BooleanProperty a = booleanProperty("a"); BooleanProperty b = booleanProperty("b"); BooleanProperty o = and(a, b); assertThat(o.get(), is(false)); a.set(true); assertThat(o.get(), is(false)); b.set(true); assertThat(o.get(), is(true)); } @Test public void testAbusingTheValueConstructorStillWorks() { Property<Boolean> p = booleanProperty("p", false); Property<Boolean> p1 = booleanProperty(p).not(); final int changes[] = { 0 }; p1.addPropertyChangedHandler(new PropertyChangedHandler<Boolean>() { public void onPropertyChanged(PropertyChangedEvent<Boolean> event) { changes[0] = changes[0] + 1; } }); p.set(true); assertThat(changes[0], is(1)); assertThat(p1.get(), is(false)); p.set(false); assertThat(changes[0], is(2)); assertThat(p1.get(), is(true)); // p1 is technically writeable as it will call Value.set assertThat(p1.isReadOnly(), is(false)); p1.set(false); assertThat(changes[0], is(3)); assertThat(p.get(), is(true)); } }