package org.objectstyle.wolips.ruleeditor.model;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.junit.Assume.assumeTrue;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
public class TestLeftHandSide {
protected LeftHandSide lhs;
@Test
public void createLhsForComposedNullValue() throws Exception {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("class", Qualifier.KEY_VALUE.getClassName());
Map<String, Object> mapForNull = new HashMap<String, Object>();
mapForNull.put("class", "com.webobjects.foundation.NSKeyValueCoding$Null");
properties.put("value", mapForNull);
lhs = new LeftHandSide(properties);
assertThat(lhs.getValue().value, nullValue());
}
@Test
public void createLhsForComposedNumberValue() throws Exception {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("class", Qualifier.KEY_VALUE.getClassName());
Map<String, Object> numberMap = new HashMap<String, Object>();
numberMap.put("class", "java.lang.Number");
numberMap.put("value", 1);
properties.put("value", numberMap);
lhs = new LeftHandSide(properties);
assertThat((Integer) lhs.getValue().value, is(1));
}
@Test
public void createLhsForMapWithNotQualifier() throws Exception {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("class", Qualifier.NOT.getClassName());
Map<String, Object> qualifierMap = new HashMap<String, Object>();
qualifierMap.put("class", Qualifier.KEY_VALUE.getClassName());
qualifierMap.put("key", "relationship.isToMany");
qualifierMap.put("selectorName", Selector.EQUAL.getSelectorName());
qualifierMap.put("value", "test");
// Note that EONotQualifier have only one qualifier
properties.put("qualifier", qualifierMap);
lhs = new LeftHandSide(properties);
assertThat(lhs.getKey(), nullValue());
assertThat(lhs.getSelectorName(), nullValue());
assertThat(lhs.getValue(), nullValue());
assertThat(lhs.getAssignmentClassName(), is(Qualifier.NOT.getClassName()));
QualifierElement qualifier = lhs.getQualifier();
assertThat(qualifier.getAssignmentClassName(), is(Qualifier.KEY_VALUE.getClassName()));
assertThat(qualifier.getKey(), is("relationship.isToMany"));
assertThat(qualifier.getSelectorName(), is(Selector.EQUAL.getSelectorName()));
assertThat((String) qualifier.getValue().value, is("test"));
}
private LeftHandSide createLhsWithNotQualifier() {
LeftHandSide lhs = new LeftHandSide();
lhs.setAssignmentClassName(Qualifier.NOT.getClassName());
QualifierElement qualifier = new QualifierElement();
qualifier.setAssignmentClassName(Qualifier.KEY_VALUE.getClassName());
qualifier.setKey("task");
qualifier.setSelectorName(Selector.EQUAL.getSelectorName());
qualifier.setValue("edit");
lhs.setQualifier(qualifier);
return lhs;
}
private Map<String, Object> createSimpleMap() {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("class", "com.webobjects.eocontrol.EOKeyValueQualifier");
properties.put("key", "task");
properties.put("value", "edit");
properties.put("selectorName", "isEqualTo");
return properties;
}
@Test
public void displaStringForLeftHandSideWithQualifiers() throws Exception {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("class", "com.webobjects.eocontrol.EOAndQualifier");
Collection<Map<String, Object>> qualifiers = new ArrayList<Map<String, Object>>();
Map<String, Object> qualifierMap = new HashMap<String, Object>();
qualifierMap.put("class", "com.webobjects.eocontrol.EOKeyValueQualifier");
qualifierMap.put("key", "task");
qualifierMap.put("selectorName", "isEqualTo");
qualifierMap.put("value", "edit");
qualifiers.add(qualifierMap);
qualifierMap = new HashMap<String, Object>();
qualifierMap.put("class", "com.webobjects.eocontrol.EOKeyValueQualifier");
qualifierMap.put("key", "entity.name");
qualifierMap.put("selectorName", "isEqualTo");
qualifierMap.put("value", "Entity");
qualifiers.add(qualifierMap);
properties.put("qualifiers", qualifiers);
lhs = new LeftHandSide(properties);
assertThat(lhs.toString(), is("(task = 'edit' and entity.name = 'Entity')"));
}
@Test
public void displayStringForComposedNullValue() throws Exception {
Map<String, Object> properties = createSimpleMap();
Map<String, Object> valueMap = new HashMap<String, Object>();
valueMap.put("class", "com.webobjects.foundation.NSKeyValueCoding$Null");
properties.put("value", valueMap);
lhs = new LeftHandSide(properties);
assertThat(lhs.toString(), is("task = null"));
}
@Test
public void displayStringForEmptyLeftHandSide() throws Exception {
lhs = new LeftHandSide();
assertThat(lhs.toString(), is("*true*"));
}
@Test
public void displayStringForNotQualifier() throws Exception {
lhs = createLhsWithNotQualifier();
assertThat(lhs.toString(), is("not (task = 'edit')"));
}
@Test
public void displayStringForNotQualifierWithAndQualifier() throws Exception {
lhs = new LeftHandSide();
lhs.setAssignmentClassName(Qualifier.AND.getClassName());
Collection<QualifierElement> qualifiers = new ArrayList<QualifierElement>();
QualifierElement qualifier = new QualifierElement();
qualifier.setAssignmentClassName(Qualifier.KEY_VALUE.getClassName());
qualifier.setKey("property");
qualifier.setSelectorName(Selector.EQUAL.getSelectorName());
qualifier.setValue("test");
qualifiers.add(qualifier);
qualifier = new QualifierElement();
qualifier.setAssignmentClassName(Qualifier.KEY_VALUE.getClassName());
qualifier.setKey("task");
qualifier.setSelectorName(Selector.EQUAL.getSelectorName());
qualifier.setValue("edit");
QualifierElement notQualifier = new QualifierElement();
notQualifier.setAssignmentClassName(Qualifier.NOT.getClassName());
notQualifier.setQualifier(qualifier);
qualifiers.add(notQualifier);
lhs.setQualifiers(qualifiers);
assertThat(lhs.toString(), is("(property = 'test' and not (task = 'edit'))"));
}
@Test
public void displayStringForQualifierWithNumber() throws Exception {
lhs = new LeftHandSide();
lhs.setAssignmentClassName(Qualifier.KEY_VALUE.getClassName());
lhs.setKey("relationship.isToMany");
lhs.setSelectorName(Selector.EQUAL.getSelectorName());
lhs.setValue("1");
assertThat(lhs.toString(), is("relationship.isToMany = 1"));
}
@Test
public void displayStringForSimpleLeftHandSide() throws Exception {
Map<String, Object> properties = createSimpleMap();
lhs = new LeftHandSide(properties);
assertThat(lhs.toString(), is("task = 'edit'"));
}
@Test
public void emptyLhs() throws Exception {
lhs = new LeftHandSide();
assertThat(lhs.isEmpty(), is(true));
}
@Test
public void emptyLhsToMap() throws Exception {
lhs = new LeftHandSide();
assumeTrue(lhs.isEmpty());
assertThat(lhs.toMap(), nullValue());
}
@Test
public void existingLhsInitializationWithQualifiers() throws Exception {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("class", "com.webobjects.eocontrol.EOAndQualifier");
Collection<Map<String, Object>> qualifiersArray = new ArrayList<Map<String, Object>>();
Map<String, Object> qualifierMap = new HashMap<String, Object>();
qualifierMap.put("class", "com.webobjects.eocontrol.EOKeyValueQualifier");
qualifierMap.put("key", "task");
qualifierMap.put("selectorName", "isEqualTo");
qualifierMap.put("value", "edit");
qualifiersArray.add(qualifierMap);
qualifierMap = new HashMap<String, Object>();
qualifierMap.put("class", "com.webobjects.eocontrol.EOKeyValueQualifier");
qualifierMap.put("key", "entity.name");
qualifierMap.put("selectorName", "isEqualTo");
qualifierMap.put("value", "Entity");
qualifiersArray.add(qualifierMap);
properties.put("qualifiers", qualifiersArray);
lhs = new LeftHandSide(properties);
assertThat(lhs.getKey(), nullValue());
assertThat(lhs.getSelectorName(), nullValue());
assertThat(lhs.getValue(), nullValue());
assertThat(lhs.getAssignmentClassName(), is("com.webobjects.eocontrol.EOAndQualifier"));
Collection<QualifierElement> qualifiers = lhs.getQualifiers();
assertThat(qualifiers.size(), is(2));
}
@Test
public void existingLhsSimpleInitialization() throws Exception {
Map<String, Object> properties = createSimpleMap();
lhs = new LeftHandSide(properties);
assertThat(lhs.getAssignmentClassName(), is("com.webobjects.eocontrol.EOKeyValueQualifier"));
assertThat(lhs.getKey(), is("task"));
assertThat((String) lhs.getValue().value, is("edit"));
assertThat(lhs.getSelectorName(), is("isEqualTo"));
assertThat(lhs.getQualifiers(), nullValue());
}
@Test
public void initializationWithQualifiersElements() throws Exception {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("class", "com.webobjects.eocontrol.EOAndQualifier");
Collection<QualifierElement> qualifiersArray = new ArrayList<QualifierElement>();
Map<String, Object> qualifierMap = new HashMap<String, Object>();
qualifierMap.put("class", "com.webobjects.eocontrol.EOKeyValueQualifier");
qualifierMap.put("key", "task");
qualifierMap.put("selectorName", "isEqualTo");
qualifierMap.put("value", "edit");
qualifiersArray.add(new QualifierElement(qualifierMap));
qualifierMap = new HashMap<String, Object>();
qualifierMap.put("class", "com.webobjects.eocontrol.EOKeyValueQualifier");
qualifierMap.put("key", "entity.name");
qualifierMap.put("selectorName", "isEqualTo");
qualifierMap.put("value", "Entity");
qualifiersArray.add(new QualifierElement(qualifierMap));
properties.put("qualifiers", qualifiersArray);
lhs = new LeftHandSide(properties);
assertThat(lhs.getKey(), nullValue());
assertThat(lhs.getSelectorName(), nullValue());
assertThat(lhs.getValue(), nullValue());
assertThat(lhs.getAssignmentClassName(), is("com.webobjects.eocontrol.EOAndQualifier"));
Collection<QualifierElement> qualifiers = lhs.getQualifiers();
assertThat(qualifiers.size(), is(2));
}
@Test
public void newLhsInitialization() throws Exception {
lhs = new LeftHandSide();
assertThat(lhs.getQualifiers(), nullValue());
assertThat(lhs.getAssignmentClassName(), nullValue());
assertThat(lhs.getKey(), nullValue());
assertThat(lhs.getSelectorName(), nullValue());
assertThat(lhs.getValue(), nullValue());
}
@Test
public void notEmptyLhs() throws Exception {
lhs = new LeftHandSide();
lhs.setAssignmentClassName("teste");
assertThat(lhs.isEmpty(), is(false));
lhs = new LeftHandSide();
lhs.setQualifier(new QualifierElement());
assertThat(lhs.isEmpty(), is(false));
}
@Test
public void notQualifierToMap() throws Exception {
lhs = createLhsWithNotQualifier();
Map<String, Object> result = lhs.toMap();
assertThat(result.get(AbstractQualifierElement.QUALIFIERS_KEY), nullValue());
assertThat((String) result.get(AbstractRuleElement.CLASS_KEY), is(Qualifier.NOT.getClassName()));
Map<String, Object> qualifierMap = (Map<String, Object>) result.get(AbstractQualifierElement.QUALIFIER_KEY);
assertThat((String) qualifierMap.get(AbstractRuleElement.CLASS_KEY), is(Qualifier.KEY_VALUE.getClassName()));
assertThat((String) qualifierMap.get(AbstractQualifierElement.KEY_KEY), is("task"));
assertThat((String) qualifierMap.get(AbstractQualifierElement.SELECTOR_NAME_KEY), is("isEqualTo"));
assertThat((String) qualifierMap.get(AbstractQualifierElement.VALUE_KEY), is("edit"));
}
@Test
public void numberToMap() throws Exception {
lhs = new LeftHandSide();
lhs.setValue("1");
Map<String, String> result = (Map<String, String>) lhs.toMap().get(AbstractQualifierElement.VALUE_KEY);
assertThat(result.get("class"), is(Number.class.getName()));
assertThat(result.get("value"), is("1"));
}
@Test
public void oneQualifierLhsToMap() throws Exception {
lhs = new LeftHandSide();
lhs.setConditions("(task = 'edit')");
Map<String, Object> result = lhs.toMap();
assertThat(result.get(AbstractQualifierElement.QUALIFIERS_KEY), nullValue());
assertThat((String) result.get(AbstractRuleElement.CLASS_KEY), is("com.webobjects.eocontrol.EOKeyValueQualifier"));
assertThat((String) result.get(AbstractQualifierElement.KEY_KEY), is("task"));
assertThat((String) result.get(AbstractQualifierElement.SELECTOR_NAME_KEY), is("isEqualTo"));
assertThat((String) result.get(AbstractQualifierElement.VALUE_KEY), is("edit"));
}
@Test
public void setComposedNullValueInConditions() throws Exception {
lhs = new LeftHandSide();
lhs.setConditions("(attribute = null)");
assertThat(lhs.getAssignmentClassName(), is(Qualifier.KEY_VALUE.getClassName()));
assertThat(lhs.getKey(), is("attribute"));
assertThat(lhs.getSelectorName(), is(Selector.EQUAL.getSelectorName()));
assertThat(lhs.getQualifiers(), nullValue());
assertThat(lhs.getQualifier(), nullValue());
assertThat(lhs.getValue().value, nullValue());
}
@Test
public void setNullConditions() throws Exception {
lhs = new LeftHandSide();
lhs.setKey("test");
lhs.setValue("test");
lhs.setSelectorName("test");
lhs.setAssignmentClassName("test");
lhs.setQualifiers(new ArrayList<QualifierElement>());
lhs.setConditions(null);
assertThat(lhs.isEmpty(), is(true));
}
@Test
public void setOneCondition() throws Exception {
lhs = new LeftHandSide();
lhs.setConditions("(task = 'edit')");
assertThat(lhs.getAssignmentClassName(), is("com.webobjects.eocontrol.EOKeyValueQualifier"));
assertThat(lhs.getKey(), is("task"));
assertThat((String) lhs.getValue().value, is("edit"));
assertThat(lhs.getSelectorName(), is("isEqualTo"));
assertThat(lhs.getQualifiers(), nullValue());
}
@Test
public void twoQualifiersLhsToMap() throws Exception {
lhs = new LeftHandSide();
lhs.setConditions("(task = 'edit' and entity.name = 'Entity')");
Map<String, Object> result = lhs.toMap();
assertThat((String) result.get(AbstractRuleElement.CLASS_KEY), is("com.webobjects.eocontrol.EOAndQualifier"));
assertThat(result.get(AbstractQualifierElement.KEY_KEY), nullValue());
assertThat(result.get(AbstractQualifierElement.SELECTOR_NAME_KEY), nullValue());
assertThat(result.get(AbstractQualifierElement.VALUE_KEY), nullValue());
Collection qualifiers = (Collection) result.get(AbstractQualifierElement.QUALIFIERS_KEY);
assertThat(qualifiers, notNullValue());
assertThat(qualifiers.size(), is(2));
}
}