package org.objectstyle.wolips.ruleeditor.model; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; import java.util.Collection; import java.util.Map; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; public class TestLeftHandSideParser { protected LeftHandSideParser parser; @Test public void parseComposedNullValue() throws Exception { String conditions = "attribute = null"; Map<String, Object> result = parser.parse(conditions); assertThat((String) result.get(AbstractRuleElement.CLASS_KEY), is(Qualifier.KEY_VALUE.getClassName())); assertThat((String) result.get(AbstractQualifierElement.KEY_KEY), is("attribute")); assertThat((String) result.get(AbstractQualifierElement.SELECTOR_NAME_KEY), is(Selector.EQUAL.getSelectorName())); assertThat(result.get(AbstractQualifierElement.QUALIFIERS_KEY), nullValue()); assertThat(result.get(AbstractQualifierElement.QUALIFIER_KEY), nullValue()); Object value = result.get(AbstractQualifierElement.VALUE_KEY); assertThat(value, instanceOf(Map.class)); Map map = (Map) value; assertThat((String) map.get("class"), is(LhsValue.NULL_VALUE_CLASS)); assertThat(map.get("value"), nullValue()); } @Test public void parseEmptyQualifier() { Map<String, Object> result = parser.parse(""); assertThat(result.isEmpty(), is(true)); result = parser.parse(" "); assertThat(result.isEmpty(), is(true)); } @Test public void parseNotQualifier() { String conditions = "not (task = 'edit')"; Map<String, Object> result = parser.parse(conditions); assertThat((String) result.get(AbstractRuleElement.CLASS_KEY), is(Qualifier.NOT.getClassName())); assertThat(result.get(AbstractQualifierElement.KEY_KEY), nullValue()); assertThat(result.get(AbstractQualifierElement.SELECTOR_NAME_KEY), nullValue()); assertThat(result.get(AbstractQualifierElement.VALUE_KEY), nullValue()); Map<String, String> qualifier = (Map<String, String>) result.get(AbstractQualifierElement.QUALIFIER_KEY); assertThat(qualifier.get(AbstractQualifierElement.CLASS_KEY), is(Qualifier.KEY_VALUE.getClassName())); assertThat(qualifier.get(AbstractQualifierElement.KEY_KEY), is("task")); assertThat(qualifier.get(AbstractQualifierElement.SELECTOR_NAME_KEY), is(Selector.EQUAL.getSelectorName())); assertThat(qualifier.get(AbstractQualifierElement.VALUE_KEY), is("edit")); } @Test public void parseNullQualifier() { Map<String, Object> result = parser.parse(null); assertThat(result.isEmpty(), is(true)); } @Test @Ignore(value = "No differece if return only a Number as String") public void parseNumber() throws Exception { String conditions = "(relationship.isToMany = 1)"; Map<String, Object> result = parser.parse(conditions); Map<String, Object> valueMap = (Map<String, Object>) result.get(AbstractQualifierElement.VALUE_KEY); assertThat(valueMap.get("value"), is((Object) 1)); assertThat(valueMap.get("class"), is((Object) Number.class.getName())); } @Test public void parseOneQualifier() { String conditions = "(task = 'edit')"; Map<String, Object> result = parser.parse(conditions); 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")); assertThat(result.get(AbstractQualifierElement.QUALIFIERS_KEY), nullValue()); } @Test public void parseOneQualifierWithoutParenthesis() { String conditions = "task = 'edit'"; Map<String, Object> result = parser.parse(conditions); 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")); assertThat(result.get(AbstractQualifierElement.QUALIFIERS_KEY), nullValue()); } @Test @Ignore(value = "Known bug. It's better to rewrite the left hand side parser using a Parser Generator like ANTLR") public void parserNotQualifierFollowedByAndQualifier() throws Exception { // TODO: Make this test pass String conditions = "(not (attribute = null) and attribute.className = 'java.lang.String')"; Map<String, Object> result = parser.parse(conditions); assertThat((String) result.get(AbstractRuleElement.CLASS_KEY), is(Qualifier.AND.getClassName())); assertThat(result.get(AbstractQualifierElement.KEY_KEY), nullValue()); assertThat(result.get(AbstractQualifierElement.SELECTOR_NAME_KEY), nullValue()); assertThat(result.get(AbstractQualifierElement.VALUE_KEY), nullValue()); Map<String, Object> qualifiers = (Map<String, Object>) result.get(AbstractQualifierElement.QUALIFIERS_KEY); assertThat(qualifiers.size(), is(2)); } @Test public void parseThreeQualifiers() { String conditions = "(task = query and (entity.name = Action or propertyKey = status))"; Map<String, Object> result = parser.parse(conditions); Collection<QualifierElement> qualifiers = (Collection<QualifierElement>) result.get(AbstractQualifierElement.QUALIFIERS_KEY); 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()); assertThat(qualifiers.size(), is(2)); for (QualifierElement qualifierElement : qualifiers) { if (qualifierElement.getQualifiers() != null) { assertThat(qualifierElement.getQualifiers().size(), is(2)); } } } @Test public void parseThreeQualifiersInferringThePrecedence() throws Exception { String conditions = "task = query and entity.name = Action or propertyKey = status"; Map<String, Object> result = parser.parse(conditions); Collection<QualifierElement> qualifiers = (Collection<QualifierElement>) result.get(AbstractQualifierElement.QUALIFIERS_KEY); assertThat((String) result.get(AbstractRuleElement.CLASS_KEY), is("com.webobjects.eocontrol.EOOrQualifier")); assertThat(result.get(AbstractQualifierElement.KEY_KEY), nullValue()); assertThat(result.get(AbstractQualifierElement.SELECTOR_NAME_KEY), nullValue()); assertThat(result.get(AbstractQualifierElement.VALUE_KEY), nullValue()); assertThat(qualifiers.size(), is(2)); QualifierElement qualifier = (QualifierElement) qualifiers.toArray()[0]; assertThat(qualifier.getAssignmentClassName(), is("com.webobjects.eocontrol.EOAndQualifier")); assertThat(qualifier.getQualifiers().size(), is(2)); } @Test public void parseThreeQualifiersWithoutParenthesis() { String conditions = "task = query and entity.name = Action and propertyKey = status"; Map<String, Object> result = parser.parse(conditions); Collection<QualifierElement> qualifiers = (Collection<QualifierElement>) result.get(AbstractQualifierElement.QUALIFIERS_KEY); 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()); assertThat(qualifiers.size(), is(3)); } @Test public void parseTwoQualifiers() { String conditions = "(task = 'edit' or task = 'delete')"; Map<String, Object> result = parser.parse(conditions); assertThat((String) result.get(AbstractRuleElement.CLASS_KEY), is("com.webobjects.eocontrol.EOOrQualifier")); assertThat(result.get(AbstractQualifierElement.KEY_KEY), nullValue()); assertThat(result.get(AbstractQualifierElement.SELECTOR_NAME_KEY), nullValue()); assertThat(result.get(AbstractQualifierElement.VALUE_KEY), nullValue()); Collection<QualifierElement> qualifiers = (Collection<QualifierElement>) result.get(AbstractQualifierElement.QUALIFIERS_KEY); assertThat(qualifiers.size(), is(2)); } @Before public void setUp() { parser = new LeftHandSideParser(); } }