package org.objectstyle.wolips.ruleeditor.model;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.containsString;
import java.io.File;
import java.net.URL;
import java.util.Collection;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.SystemUtils;
import org.junit.After;
import org.junit.Test;
public class TestD2WModel {
protected D2WModel model;
protected File tempFile;
@Test
public void copyNullRuleDoNothing() throws Exception {
createTempFile();
model = new D2WModel(tempFile);
model.copyRule(null);
assertThat(model.getRules().size(), is(0));
}
@Test
public void copyRule() throws Exception {
createTempFile();
model = new D2WModel(tempFile);
Rule ruleToCopy = new Rule();
model.copyRule(ruleToCopy);
assertThat(model.getRules().size(), is(1));
for (Rule rule : model.getRules()) {
assertThat(rule == ruleToCopy, is(false));
}
}
@Test
public void createD2WModelWithExistingFile() throws Exception {
loadModelWithFile("empty-file.d2wmodel");
assertThat(model.getModelPath(), containsString("/resources/empty-file.d2wmodel"));
}
@Test(expected = IllegalArgumentException.class)
public void createD2WModelWithNullFile() throws Exception {
new D2WModel(null);
}
private void createTempFile() throws Exception {
File tempFolder = SystemUtils.getJavaIoTmpDir();
tempFile = new File(tempFolder, "temp.d2wmodel");
tempFile.createNewFile();
}
@Test
public void firePropertyChangeEventAfterSaveChanges() throws Exception {
loadModelWithFile("empty-file.d2wmodel");
MockPropertyChangeListener listener = new MockPropertyChangeListener();
model.addPropertyChangeListener(listener);
// Assume it is a modified model
model.hasUnsavedChanges = true;
model.saveChanges();
assertThat(listener.firedEventsCount(), is(1));
}
@Test
public void firePropertyChangeEventOnChange() throws Exception {
loadModelWithFile("empty-file.d2wmodel");
MockPropertyChangeListener listener = new MockPropertyChangeListener();
model.addPropertyChangeListener(listener);
assertThat(listener.firedEventsCount(), is(0));
MockRule rule = new MockRule();
model.addRule(rule);
assertThat(listener.firedEventsCount(), is(1));
// Assume it is a not changed model
model.hasUnsavedChanges = false;
model.removeRule(rule);
assertThat(listener.firedEventsCount(), is(2));
}
@Test
public void firePropertyChangeEventOnExistingRulesChange() throws Exception {
loadModelWithFile("one-rule.d2wmodel");
MockPropertyChangeListener listener = new MockPropertyChangeListener();
model.addPropertyChangeListener(listener);
assertThat(listener.firedEventsCount(), is(0));
Rule rule = (Rule) model.getRules().toArray()[0];
rule.setAuthor("200");
assertThat(listener.firedEventsCount(), is(1));
}
private File getFile(String filename) throws Exception {
URL fileURL = getClass().getResource("/resources/" + filename);
return new File(fileURL.toURI());
}
@Test
public void hasUnsavedChangesAfterRuleChange() throws Exception {
createTempFile();
model = new D2WModel(tempFile);
Rule rule = new Rule();
model.addRule(rule);
// Assume it is a model without changes
model.hasUnsavedChanges = false;
rule.setAuthor("200");
assertThat(model.hasUnsavedChanges(), is(true));
}
@Test
public void hasUnsavedChangesFalseAfterSaveChanges() throws Exception {
createTempFile();
model = new D2WModel(tempFile);
// Assume it is a model with changes
model.hasUnsavedChanges = true;
model.saveChanges();
assertThat(model.hasUnsavedChanges(), is(false));
}
@Test
public void loadEmptyRuleFile() throws Exception {
loadModelWithFile("empty-file.d2wmodel");
Collection<Rule> rules = model.getRules();
assertThat(rules.size(), is(0));
}
private void loadModelWithFile(String filename) throws Exception {
model = new D2WModel(getFile(filename));
}
@Test
public void loadNotQualifierRuleFile() throws Exception {
loadModelWithFile("rule-with-not-qualifier.d2wmodel");
Collection<Rule> rules = model.getRules();
assertThat(rules.size(), is(1));
}
@Test
public void loadOneRuleFile() throws Exception {
loadModelWithFile("one-rule.d2wmodel");
Collection<Rule> rules = model.getRules();
assertThat(rules.size(), is(1));
}
@Test
public void loadTwentyRuleFile() throws Exception {
loadModelWithFile("twenty-rule.d2wmodel");
Collection<Rule> rules = model.getRules();
assertThat(rules.size(), is(20));
}
@Test
public void saveEmptyModel() throws Exception {
createTempFile();
model = new D2WModel(tempFile);
model.saveChanges();
File expectedFile = getFile("no-rules.d2wmodel");
assertThat(FileUtils.readFileToString(tempFile), is(FileUtils.readFileToString(expectedFile)));
}
@Test
public void saveModelWithComplexQualifiers() throws Exception {
createTempFile();
model = new D2WModel(tempFile);
Rule rule = model.createEmptyRule();
LeftHandSide lhs = rule.getLeftHandSide();
lhs.setConditions("(task = 'edit' and (entity.name = 'Entity1' or entity.name = 'Entity2') and propertyKey = 'property')");
RightHandSide rhs = rule.getRightHandSide();
rhs.setKeyPath("key");
rhs.setValue("value");
model.saveChanges();
File expectedFile = getFile("lhs-example.d2wmodel");
assertThat(FileUtils.readFileToString(tempFile), is(FileUtils.readFileToString(expectedFile)));
}
@Test
public void saveModelWithOneRule() throws Exception {
createTempFile();
model = new D2WModel(tempFile);
Rule rule = model.createEmptyRule();
LeftHandSide lhs = rule.getLeftHandSide();
lhs.setConditions("(task = 'edit')");
RightHandSide rhs = rule.getRightHandSide();
rhs.setKeyPath("key");
rhs.setValue("value");
model.saveChanges();
File expectedFile = getFile("one-rule.d2wmodel");
assertThat(FileUtils.readFileToString(tempFile), is(FileUtils.readFileToString(expectedFile)));
}
@After
public void tearDown() {
if (tempFile != null) {
tempFile.delete();
}
}
}