package org.tessell.tests.model.properties;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
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.AbstractModel;
import org.tessell.model.properties.ListProperty;
import org.tessell.model.properties.PropertyGroup;
import org.tessell.model.properties.StringProperty;
import org.tessell.tests.model.validation.rules.AbstractRuleTest;
import org.tessell.util.PropertyUtils;
public class PropertyGroupModelTest extends AbstractRuleTest {
private final PropertyGroup all = new PropertyGroup("all");
private final ListProperty<TestModel> models = listProperty("models");
private final TestModel m1 = new TestModel();
private final TestModel m2 = new TestModel();
@Before
public void setup() {
PropertyUtils.syncModelsToGroup(all, models);
models.add(m1);
models.add(m2);
}
@Test
public void childNameInvalidatesChildAndParent() {
m1.name.touch();
// m1 is invalid
assertThat(m1.allValid().get(), is(false));
// so the group is
assertThat(all.get(), is(false));
assertThat(all.isTouched(), is(true));
// but m2 is still okay
assertThat(m2.allValid().get(), is(true));
assertThat(m2.name.isTouched(), is(false));
}
@Test
public void touchingParentAllTouchesAll() {
all.setTouched(true);
assertThat(m1.name.isTouched(), is(true));
assertThat(m2.name.isTouched(), is(true));
}
@Test
public void setTouchedFalseDoesNotBreakNesting() {
// name touched, invalid
m1.name.setTouched(true);
// but untouching all, untouches the children resets us to valid
all.setTouched(false);
assertThat(m1.name.isTouched(), is(false));
assertThat(all.get(), is(true));
// name retouched, invalid
m1.name.setTouched(true);
assertThat(all.get(), is(false));
}
@Test
public void removingModelFromListRemovesInvalidates() {
// start out invalid
m1.name.setTouched(true);
assertThat(all.get(), is(false));
// but when m1 is removed
models.remove(m1);
// we're back to valid
assertThat(all.get(), is(true));
}
@Test
public void syncAddsExistingModelsToGroup() {
PropertyGroup all = new PropertyGroup("all");
ListProperty<TestModel> models = listProperty("models");
models.add(m1);
PropertyUtils.syncModelsToGroup(all, models);
assertThat(all.getProperties().size(), is(1));
}
@Test
public void shouldNotFailWhenTheModelListIsNull() {
PropertyGroup all = new PropertyGroup("all");
ListProperty<TestModel> models = listProperty("models", null);
PropertyUtils.syncModelsToGroup(all, models);
}
private static class TestModel extends AbstractModel {
public final StringProperty name = add(stringProperty("name")).req();
}
}