package org.tessell.tests.model.properties;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.tessell.model.properties.NewProperty.integerProperty;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.tessell.model.events.PropertyChangedEvent;
import org.tessell.model.events.PropertyChangedHandler;
import org.tessell.model.properties.IntegerProperty;
import org.tessell.model.properties.Property;
import org.tessell.model.properties.PropertyConverter;
import org.tessell.tests.model.validation.rules.AbstractRuleTest;
public class ConvertedPropertyTest extends AbstractRuleTest {
@Test
public void get() {
Property<String> p = integerProperty("i", 1).as(c);
assertThat(p.get(), is("1-1"));
}
@Test
public void testToString() {
assertThat(integerProperty("i", 1).as(c).toString(), is("i 1-1"));
}
@Test
public void testLambda() {
assertThat(integerProperty("i", 1).as(i -> i + "-" + i).get(), is("1-1"));
}
@Test
public void sourceChangingMakesTheAsValueChange() {
IntegerProperty i = integerProperty("i", 1);
Property<String> p = i.as(c);
ChangeTracker tracker = new ChangeTracker();
p.addPropertyChangedHandler(tracker);
i.set(2);
assertThat(tracker.values, contains("2-2"));
}
@Test
public void touchSetsTouchOnTheOriginalProperty() {
IntegerProperty i = integerProperty("i", 1);
Property<String> p = i.as(c);
p.touch();
assertThat(i.isTouched(), is(true));
}
@Test(expected = IllegalStateException.class)
public void setFails() {
IntegerProperty i = integerProperty("i", 1);
Property<String> p = i.as(c);
assertThat(p.isReadOnly(), is(true));
p.set("2");
}
@Test(expected = IllegalStateException.class)
public void setInitialFails() {
IntegerProperty i = integerProperty("i", 1);
Property<String> p = i.as(c);
p.setInitialValue("2");
assertThat(i.getValue(), is(2));
assertThat(i.isTouched(), is(false));
}
@Test
public void testRecursion() {
IntegerProperty i = integerProperty("i", 1);
Property<String> p1 = i.as(c);
Property<String> p2 = p1.as(new PropertyConverter<String, String>() {
public String to(String a) {
return a + "-" + a;
}
});
assertThat(p1.get(), is("1-1"));
assertThat(p2.get(), is("1-1-1-1"));
}
@Test
public void testCustomNullValue() {
IntegerProperty i = integerProperty("i", 1);
Property<String> p = i.as(new PropertyConverter<Integer, String>() {
public String to(Integer a) {
return a.toString();
}
public String nullValue() {
return "NULL";
}
});
assertThat(p.get(), is("1"));
i.set(null);
assertThat(p.get(), is("NULL"));
}
private final PropertyConverter<Integer, String> c = new PropertyConverter<Integer, String>() {
public String to(Integer a) {
return a + "-" + a;
}
};
private class ChangeTracker implements PropertyChangedHandler<String> {
private final List<String> values = new ArrayList<String>();
@Override
public void onPropertyChanged(PropertyChangedEvent<String> event) {
values.add(event.getProperty().get());
}
}
}