/*
* Beanfabrics Framework Copyright (C) by Michael Karneim, beanfabrics.org
* Use is subject to license terms. See license.txt.
*/
package org.beanfabrics;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import junit.framework.JUnit4TestAdapter;
import org.beanfabrics.event.ModelProviderEvent;
import org.beanfabrics.event.ModelProviderListener;
import org.beanfabrics.model.AbstractPM;
import org.beanfabrics.model.IntegerPM;
import org.beanfabrics.model.PMManager;
import org.beanfabrics.model.TextPM;
import org.beanfabrics.support.PropertySupport;
import org.junit.Before;
import org.junit.Test;
/**
* @author Michael Karneim
*/
public class ModelProviderTest {
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(ModelProviderTest.class);
}
private static class ProductPM extends AbstractPM {
public final TextPM name = new TextPM();
public final DimensionPM dimension = new DimensionPM();
public ProducerPM producer;
public ProductPM() {
PMManager.setup(this);
}
}
private static class ProducerPM extends AbstractPM {
public final TextPM name = new TextPM();
public ProducerPM() {
PMManager.setup(this);
}
}
private static class DimensionPM extends AbstractPM {
public final IntegerPM height = new IntegerPM();
public final IntegerPM width = new IntegerPM();
public final IntegerPM length = new IntegerPM();
public DummyPM dummy = new DummyPM();
public DimensionPM() {
PMManager.setup(this);
}
}
private static class DummyPM extends AbstractPM {
public final TextPM text = new TextPM();
public DummyPM() {
PMManager.setup(this);
text.setText("blah");
}
}
ProductPM root;
public ModelProviderTest() {
}
@Before
public void setUp()
throws Exception {
root = new ProductPM();
root.name.setText("iPod");
root.dimension.height.setText("103");
root.dimension.width.setText("61");
root.dimension.length.setText("10");
}
@Test
public void create() {
new ModelProvider();
}
@Test
public void setRoot() {
ModelProvider provider = new ModelProvider(ProductPM.class);
provider.setPresentationModel(root);
assertEquals("provider.getContent()", root, provider.getPresentationModel());
}
@Test
public void setContentType() {
ModelProvider provider = new ModelProvider(ProductPM.class);
provider.setPresentationModelType(ProductPM.class);
provider.setPresentationModel(root);
Class cls = ProducerPM.class;
try {
provider.setPresentationModelType(cls);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException ex) {
}
}
@Test
public void bind() {
ModelProvider provider = new ModelProvider();
AbstractPM cell = new AbstractPM() {
TextPM text = new TextPM();
};
PMManager.setup(cell);
Counter counter = new Counter();
provider.addModelProviderListener(new Path("this.text"), counter);
assertEquals("counter.targetGained", 0, counter.targetGained);
assertNull("counter.lastEvent", counter.lastEvent);
provider.setPresentationModel(cell); // set root late
assertEquals("counter.targetGained", 1, counter.targetGained);
assertNotNull("counter.lastEvent", counter.lastEvent);
provider.setPresentationModel(null);
assertEquals("counter.targetLost", 1, counter.targetLost);
provider.setPresentationModel(cell);
assertEquals("counter.targetGained", 2, counter.targetGained);
}
@Test
public void bind2() {
ModelProvider provider = new ModelProvider();
AbstractPM cell = new AbstractPM() {
TextPM text = new TextPM();
};
PMManager.setup(cell);
provider.setPresentationModel(cell); // set content root early
Counter counter = new Counter();
provider.addModelProviderListener(new Path("this.text"), counter);
assertEquals("counter.targetGained", 1, counter.targetGained);
assertNotNull("counter.lastEvent", counter.lastEvent);
}
@Test
public void bindLongPath() {
class BCell extends AbstractPM {
TextPM c = new TextPM();
public BCell() {
PMManager.setup(this);
}
}
class ACell extends AbstractPM {
BCell b = new BCell();
public ACell() {
PMManager.setup(this);
}
}
class RootCell extends AbstractPM {
ACell a = new ACell();
public RootCell() {
PMManager.setup(this);
}
}
RootCell cell = new RootCell();
ModelProvider provider = new ModelProvider();
provider.setPresentationModel(cell);
Path path = new Path("this.a.b.c");
assertEquals("pModel.getProperty(path)", cell.a.b.c, PropertySupport.get(cell).getProperty(path));
Counter counter = new Counter();
provider.addModelProviderListener(new Path("this.a.b.c"), counter);
assertEquals("counter.targetGained", 1, counter.targetGained);
}
@Test
public void bindRemoveProperty() {
ModelProvider provider = new ModelProvider();
Counter counter = new Counter();
provider.addModelProviderListener(new Path("this.dimension.dummy.text"), counter);
assertEquals("counter.targetGained", 0, counter.targetGained);
provider.setPresentationModel(root);
assertEquals("counter.targetGained", 1, counter.targetGained);
assertEquals("counter.targetLost", 0, counter.targetLost);
DummyPM bak = root.dimension.dummy;
root.dimension.dummy = null;
PropertySupport.get(root.dimension).refresh();
assertEquals("root.dimension.getProperty(\"dummy\")", null, root.dimension.dummy);
assertEquals("counter.targetLost", 1, counter.targetLost);
assertEquals("counter.targetGained", 1, counter.targetGained);
root.dimension.dummy = bak;
PropertySupport.get(root.dimension).refresh();
assertEquals("counter.targetGained", 2, counter.targetGained);
assertEquals("counter.targetLost", 1, counter.targetLost);
}
@Test
public void setRoot2() {
ModelProvider provider = new ModelProvider();
MockBnTextField tfHeight = new MockBnTextField();
tfHeight.setModelProvider(provider);
tfHeight.setPath(new Path("this.dimension.height"));
MockBnTextField tfWidth = new MockBnTextField();
tfWidth.setModelProvider(provider);
tfWidth.setPath(new Path("this.dimension.width"));
provider.setPresentationModel(root);
ProductPM root2 = new ProductPM();
provider.setPresentationModel(root2);
}
private static class MockBnTextField implements ModelSubscriber {
private IModelProvider modelProvider;
private Path path;
public IModelProvider getModelProvider() {
return modelProvider;
}
public void setModelProvider(IModelProvider modelProvider) {
this.modelProvider = modelProvider;
}
public Path getPath() {
return path;
}
public void setPath(Path path) {
this.path = path;
}
}
private static class Counter implements ModelProviderListener {
private int targetGained = 0;
private int targetLost = 0;
private ModelProviderEvent lastEvent;
public void modelGained(ModelProviderEvent evt) {
targetGained++;
lastEvent = evt;
}
public void modelLost(ModelProviderEvent evt) {
targetLost++;
lastEvent = evt;
}
}
}