// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.mappaint.mapcss;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.OsmUtils;
import org.openstreetmap.josm.gui.mappaint.Environment;
import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.Context;
import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.ToTagConvertable;
import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.Op;
import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.SimpleKeyValueCondition;
import org.openstreetmap.josm.testutils.JOSMTestRules;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
/**
* This test universally tests all {@link Condition}s.
* @author Michael Zangl
*/
public class ConditionTest {
/**
* We need prefs for nodes.
*/
@Rule
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
public JOSMTestRules test = new JOSMTestRules().preferences();
private OsmPrimitive node0;
private OsmPrimitive node1;
private OsmPrimitive node2;
private OsmPrimitive node3;
private OsmPrimitive node4;
/**
* Set up some useful test data.
*/
@Before
public void setUp() {
node0 = OsmUtils.createPrimitive("n");
node1 = OsmUtils.createPrimitive("n k1=v1 k2=v1 f1=0.2 r1=ababx c1=xya one=a;b");
node2 = OsmUtils.createPrimitive("n k1=v1 k2=v1a f1=0.8 r1=abxabxab c1=xy one=a;;x");
node3 = OsmUtils.createPrimitive("n k1=v1 f1=-100 c1=axy one=x;y;z");
node4 = OsmUtils.createPrimitive("n k1=v2a k2=v3 f1=x r1=abab c1=axya one=x;a;y");
}
/**
* Test {@link Op#EQ}.
*/
@Test
public void testKeyValueEq() {
Condition op = ConditionFactory.createKeyValueCondition("k1", "v1", Op.EQ, Context.PRIMITIVE, false);
assertFalse(op.applies(genEnv(node0)));
assertTrue(op.applies(genEnv(node1)));
assertTrue(op.applies(genEnv(node2)));
assertTrue(op.applies(genEnv(node3)));
assertFalse(op.applies(genEnv(node4)));
assertTrue(op instanceof SimpleKeyValueCondition);
assertEquals("[k1=v1]", op.toString());
assertEquals("k1", ((ToTagConvertable) op).asTag(null).getKey());
assertEquals("v1", ((ToTagConvertable) op).asTag(null).getValue());
}
/**
* Test {@link Op#EQ} and interpetation as key
*/
@Test
public void testKeyValueEqAsKey() {
Condition op = ConditionFactory.createKeyValueCondition("k1", "k2", Op.EQ, Context.PRIMITIVE, true);
assertFalse(op.applies(genEnv(node0)));
assertTrue(op.applies(genEnv(node1)));
assertFalse(op.applies(genEnv(node2)));
assertFalse(op.applies(genEnv(node3)));
assertFalse(op.applies(genEnv(node4)));
assertEquals("k1", ((ToTagConvertable) op).asTag(null).getKey());
assertEquals("k2", ((ToTagConvertable) op).asTag(null).getValue());
}
/**
* Test {@link Op#NEQ}
*/
@Test
public void testKeyValueNeq() {
Condition op = ConditionFactory.createKeyValueCondition("k1", "v1", Op.NEQ, Context.PRIMITIVE, false);
assertTrue(op.applies(genEnv(node0)));
assertFalse(op.applies(genEnv(node1)));
assertFalse(op.applies(genEnv(node2)));
assertFalse(op.applies(genEnv(node3)));
assertTrue(op.applies(genEnv(node4)));
}
/**
* Test {@link Op#GREATER_OR_EQUAL}
*/
@Test
public void testKeyValueGreatherEq() {
Condition op = ConditionFactory.createKeyValueCondition("f1", "0.2", Op.GREATER_OR_EQUAL, Context.PRIMITIVE, false);
assertFalse(op.applies(genEnv(node0)));
assertTrue(op.applies(genEnv(node1)));
assertTrue(op.applies(genEnv(node2)));
assertFalse(op.applies(genEnv(node3)));
assertFalse(op.applies(genEnv(node4)));
}
/**
* Test {@link Op#GREATER}
*/
@Test
public void testKeyValueGreather() {
Condition op = ConditionFactory.createKeyValueCondition("f1", "0.2", Op.GREATER, Context.PRIMITIVE, false);
assertFalse(op.applies(genEnv(node0)));
assertFalse(op.applies(genEnv(node1)));
assertTrue(op.applies(genEnv(node2)));
assertFalse(op.applies(genEnv(node3)));
assertFalse(op.applies(genEnv(node4)));
}
/**
* Test {@link Op#LESS_OR_EQUAL}
*/
@Test
public void testKeyValueLessEq() {
Condition op = ConditionFactory.createKeyValueCondition("f1", "0.2", Op.LESS_OR_EQUAL, Context.PRIMITIVE, false);
assertFalse(op.applies(genEnv(node0)));
assertTrue(op.applies(genEnv(node1)));
assertFalse(op.applies(genEnv(node2)));
assertTrue(op.applies(genEnv(node3)));
assertFalse(op.applies(genEnv(node4)));
}
/**
* Test {@link Op#LESS}
*/
@Test
public void testKeyValueLess() {
Condition op = ConditionFactory.createKeyValueCondition("f1", "0.2", Op.LESS, Context.PRIMITIVE, false);
assertFalse(op.applies(genEnv(node0)));
assertFalse(op.applies(genEnv(node1)));
assertFalse(op.applies(genEnv(node2)));
assertTrue(op.applies(genEnv(node3)));
assertFalse(op.applies(genEnv(node4)));
}
/**
* Test {@link Op#REGEX}
*/
@Test
public void testKeyValueRegex() {
Condition op = ConditionFactory.createKeyValueCondition("r1", "(ab){2}", Op.REGEX, Context.PRIMITIVE, false);
assertFalse(op.applies(genEnv(node0)));
assertTrue(op.applies(genEnv(node1)));
assertFalse(op.applies(genEnv(node2)));
assertFalse(op.applies(genEnv(node3)));
assertTrue(op.applies(genEnv(node4)));
}
/**
* Test {@link Op#NREGEX}
*/
@Test
public void testKeyValueNregex() {
Condition op = ConditionFactory.createKeyValueCondition("r1", "(ab){2}", Op.NREGEX, Context.PRIMITIVE, false);
assertTrue(op.applies(genEnv(node0)));
assertFalse(op.applies(genEnv(node1)));
assertTrue(op.applies(genEnv(node2)));
assertTrue(op.applies(genEnv(node3)));
assertFalse(op.applies(genEnv(node4)));
}
/**
* Test {@link Op#ONE_OF}
*/
@Test
public void testKeyValueOneOf() {
Condition op = ConditionFactory.createKeyValueCondition("one", "a", Op.ONE_OF, Context.PRIMITIVE, false);
assertFalse(op.applies(genEnv(node0)));
assertTrue(op.applies(genEnv(node1)));
assertTrue(op.applies(genEnv(node2)));
assertFalse(op.applies(genEnv(node3)));
assertTrue(op.applies(genEnv(node4)));
}
/**
* Test {@link Op#BEGINS_WITH}
*/
@Test
public void testKeyValueBeginsWith() {
Condition op = ConditionFactory.createKeyValueCondition("c1", "xy", Op.BEGINS_WITH, Context.PRIMITIVE, false);
assertFalse(op.applies(genEnv(node0)));
assertTrue(op.applies(genEnv(node1)));
assertTrue(op.applies(genEnv(node2)));
assertFalse(op.applies(genEnv(node3)));
assertFalse(op.applies(genEnv(node4)));
}
/**
* Test {@link Op#ENDS_WITH}
*/
@Test
public void testKeyValueEndsWith() {
Condition op = ConditionFactory.createKeyValueCondition("c1", "xy", Op.ENDS_WITH, Context.PRIMITIVE, false);
assertFalse(op.applies(genEnv(node0)));
assertFalse(op.applies(genEnv(node1)));
assertTrue(op.applies(genEnv(node2)));
assertTrue(op.applies(genEnv(node3)));
assertFalse(op.applies(genEnv(node4)));
}
/**
* Test {@link Op#CONTAINS}
*/
@Test
public void testKeyValueContains() {
Condition op = ConditionFactory.createKeyValueCondition("c1", "xy", Op.CONTAINS, Context.PRIMITIVE, false);
assertFalse(op.applies(genEnv(node0)));
assertTrue(op.applies(genEnv(node1)));
assertTrue(op.applies(genEnv(node2)));
assertTrue(op.applies(genEnv(node3)));
assertTrue(op.applies(genEnv(node4)));
}
/**
* Test of {@link ConditionFactory#createRegexpKeyRegexpValueCondition(String, String, Op)}
*/
@Test
public void testRegexpKeyValueRegexpCondition() {
Condition op = ConditionFactory.createRegexpKeyRegexpValueCondition("^k", "\\da", Op.REGEX);
assertFalse(op.applies(genEnv(node0)));
assertFalse(op.applies(genEnv(node1)));
assertTrue(op.applies(genEnv(node2)));
assertFalse(op.applies(genEnv(node3)));
assertTrue(op.applies(genEnv(node4)));
Condition notOp = ConditionFactory.createRegexpKeyRegexpValueCondition("^k", "\\da", Op.NREGEX);
assertTrue(notOp.applies(genEnv(node0)));
assertTrue(notOp.applies(genEnv(node1)));
assertFalse(notOp.applies(genEnv(node2)));
assertTrue(notOp.applies(genEnv(node3)));
assertFalse(notOp.applies(genEnv(node4)));
}
private Environment genEnv(OsmPrimitive primitive) {
return new Environment(primitive);
}
}