/*
* Beanfabrics Framework Copyright (C) by Michael Karneim, beanfabrics.org
* Use is subject to license terms. See license.txt.
*/
package org.beanfabrics.model;
import static org.junit.Assert.assertEquals;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import junit.framework.JUnit4TestAdapter;
import org.beanfabrics.validation.ValidationRule;
import org.beanfabrics.validation.ValidationState;
import org.junit.Test;
/**
* @author Michael Karneim
*/
public class TextPMTest {
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(TextPMTest.class);
}
public TextPMTest() {
//
}
@Test
public void create() {
new TextPM();
}
@Test
public void setText() {
TextPM pModel = new TextPM();
Counter l = new Counter();
pModel.addPropertyChangeListener(l);
pModel.setText("hello, world!");
assertEquals("l.eventCount", 2, l.eventCount);
pModel.setText("hello, moon!");
assertEquals("l.eventCount", 3, l.eventCount);
pModel.setText("hello, moon!");
assertEquals("l.eventCount", 3, l.eventCount);
}
@Test
public void setMandatory() {
TextPM pModel = new TextPM();
Counter l = new Counter();
pModel.addPropertyChangeListener("mandatory", l);
pModel.setMandatory(true);
assertEquals("l.eventCount", 1, l.eventCount);
pModel.setMandatory(false);
assertEquals("l.eventCount", 2, l.eventCount);
pModel.setMandatory(false);
assertEquals("l.eventCount", 2, l.eventCount);
}
@Test
public void setEditable() {
TextPM pModel = new TextPM();
Counter l = new Counter();
pModel.addPropertyChangeListener("editable", l);
pModel.setEditable(true); // this is the default
assertEquals("l.eventCount", 0, l.eventCount);
pModel.setEditable(false);
assertEquals("l.eventCount", 1, l.eventCount);
pModel.setEditable(false);
assertEquals("l.eventCount", 1, l.eventCount);
}
@Test
public void validate() {
final TextPM pModel = new TextPM();
pModel.getValidator().add(new ValidationRule() {
public ValidationState validate() {
if (pModel.getText().startsWith("wrong")) {
return new ValidationState("This is wrong!");
}
return null;
}
});
Counter l = new Counter();
pModel.addPropertyChangeListener(l);
pModel.setText("Hello, world!");
assertEquals("pModel.isValid()", true, pModel.isValid());
pModel.setText("wrong");
assertEquals("pModel.isValid()", false, pModel.isValid());
}
@Test
public void changeSomethingDuringEventCycle() {
final TextPM pModel = new TextPM();
PropertyChangeListener l = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
pModel.setText("bla");
}
};
pModel.addPropertyChangeListener(l);
Counter counter = new Counter();
pModel.addPropertyChangeListener(counter);
pModel.setText("hello");
assertEquals("pModel.getText()", "bla", pModel.getText());
assertEquals("l.eventCount", 3, counter.eventCount);
}
@Test
public void isModified() {
ITextPM pModel = new TextPM();
pModel.setText("hello, world!");
pModel.preset();
assertEquals("pModel.isModified()", false, pModel.isModified());
pModel.setText("hello");
assertEquals("pModel.isModified()", true, pModel.isModified());
pModel.reset();
assertEquals("pModel.isModified()", false, pModel.isModified());
}
@Test
public void setOptions() {
ITextPM pModel = new TextPM();
Options<Integer> opt = new Options<Integer>();
opt.put(1, "one");
opt.put(2, "two");
opt.put(3, "three");
Counter counter = new Counter();
pModel.addPropertyChangeListener(counter);
pModel.setOptions(opt);
assertEquals("eventCount", 1, counter.eventCount);
opt.put(4, "four");
assertEquals("eventCount", 2, counter.eventCount);
}
@Test
public void removeOptions() {
ITextPM pModel = new TextPM();
Options<Integer> opt = new Options<Integer>();
pModel.setOptions(opt);
Counter counter = new Counter();
pModel.addPropertyChangeListener(counter);
assertEquals("counter.eventCount", 0, counter.eventCount);
pModel.setOptions(null);
assertEquals("counter.eventCount", 1, counter.eventCount);
opt.put(1, "one"); // no event should be forwarded to pM
assertEquals("counter.eventCount", 1, counter.eventCount);
}
@Test
public void setRestrictedToOptions() {
TextPM pModel = new TextPM();
pModel.setRestrictedToOptions(true);
Options<Integer> opt = new Options<Integer>();
opt.put(1, "one");
opt.put(2, "two");
opt.put(3, "three");
pModel.setOptions(opt);
pModel.setText("one");
assertEquals("pModel.isValid()", true, pModel.isValid());
pModel.setText("blah");
assertEquals("pModel.isValid()", false, pModel.isValid());
pModel.setRestrictedToOptions(false);
assertEquals("pModel.isValid()", true, pModel.isValid());
}
@Test
public void isValidWhenEmptyAndOptional() {
TextPM pModel = new TextPM();
pModel.setMandatory(false);
pModel.setText(null);
assertEquals("pModel.isValid()", true, pModel.isValid());
pModel.getValidator().add(new ValidationRule() {
public ValidationState validate() {
return new ValidationState("baeh!");
}
});
assertEquals("pModel.isValid()", true, pModel.isValid());
}
private static class Counter implements PropertyChangeListener {
private int eventCount = 0;
public void propertyChange(PropertyChangeEvent evt) {
eventCount++;
}
}
}