source: josm/trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParserTest.groovy @ 6547

Last change on this file since 6547 was 6547, checked in by simon04, 6 years ago

MapCSS: add regular expression support for key conditions

For instance, [/^addr:/] matches any addr:* key.

File size: 4.9 KB
Line 
1package org.openstreetmap.josm.gui.mappaint.mapcss
2
3import org.junit.Before
4import org.junit.Test
5import org.openstreetmap.josm.Main
6import org.openstreetmap.josm.data.Preferences
7import org.openstreetmap.josm.data.osm.OsmPrimitive
8import org.openstreetmap.josm.data.osm.Way
9import org.openstreetmap.josm.gui.mappaint.Environment
10import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.MapCSSParser
11
12class MapCSSParserTest {
13
14    protected static OsmPrimitive getPrimitive(String key, String value) {
15        def w = new Way()
16        w.put(key, value)
17        return w
18    }
19
20    protected static Environment getEnvironment(String key, String value) {
21        return new Environment().withPrimitive(getPrimitive(key, value))
22    }
23
24    @Before
25    public void setUp() throws Exception {
26        Main.pref = new Preferences()
27    }
28
29    @Test
30    public void testEqualCondition() throws Exception {
31        def condition = (Condition.KeyValueCondition) new MapCSSParser(new StringReader("[surface=paved]")).condition(Condition.Context.PRIMITIVE)
32        assert condition instanceof Condition.KeyValueCondition
33        assert Condition.Op.EQ.equals(condition.op)
34        assert "surface".equals(condition.k)
35        assert "paved".equals(condition.v)
36        assert condition.applies(getEnvironment("surface", "paved"))
37        assert !condition.applies(getEnvironment("surface", "unpaved"))
38    }
39
40    @Test
41    public void testNotEqualCondition() throws Exception {
42        def condition = (Condition.KeyValueCondition) new MapCSSParser(new StringReader("[surface!=paved]")).condition(Condition.Context.PRIMITIVE)
43        assert Condition.Op.NEQ.equals(condition.op)
44        assert !condition.applies(getEnvironment("surface", "paved"))
45        assert condition.applies(getEnvironment("surface", "unpaved"))
46    }
47
48    @Test
49    public void testRegexCondition() throws Exception {
50        def condition = (Condition.KeyValueCondition) new MapCSSParser(new StringReader("[surface=~/paved|unpaved/]")).condition(Condition.Context.PRIMITIVE)
51        assert Condition.Op.REGEX.equals(condition.op)
52        assert condition.applies(getEnvironment("surface", "unpaved"))
53        assert !condition.applies(getEnvironment("surface", "grass"))
54    }
55
56    @Test
57    public void testNegatedRegexCondition() throws Exception {
58        def condition = (Condition.KeyValueCondition) new MapCSSParser(new StringReader("[surface!~/paved|unpaved/]")).condition(Condition.Context.PRIMITIVE)
59        assert Condition.Op.NREGEX.equals(condition.op)
60        assert !condition.applies(getEnvironment("surface", "unpaved"))
61        assert condition.applies(getEnvironment("surface", "grass"))
62    }
63
64    @Test
65    public void testStandardKeyCondition() throws Exception {
66        def c1 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[ highway ]")).condition(Condition.Context.PRIMITIVE)
67        assert c1.matchType == null
68        assert c1.applies(getEnvironment("highway", "unclassified"))
69        assert !c1.applies(getEnvironment("railway", "rail"))
70        def c2 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[\"/slash/\"]")).condition(Condition.Context.PRIMITIVE)
71        assert c2.matchType == null
72        assert c2.applies(getEnvironment("/slash/", "yes"))
73        assert !c2.applies(getEnvironment("\"slash\"", "no"))
74    }
75
76    @Test
77    public void testYesNoKeyCondition() throws Exception {
78        def c1 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[oneway?]")).condition(Condition.Context.PRIMITIVE)
79        def c2 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[oneway?!]")).condition(Condition.Context.PRIMITIVE)
80        def c3 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[!oneway?]")).condition(Condition.Context.PRIMITIVE)
81        def c4 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[!oneway?!]")).condition(Condition.Context.PRIMITIVE)
82        def yes = getEnvironment("oneway", "yes")
83        def no = getEnvironment("oneway", "no")
84        def none = getEnvironment("no-oneway", "foo")
85        assert c1.applies(yes)
86        assert !c1.applies(no)
87        assert !c1.applies(none)
88        assert !c2.applies(yes)
89        assert c2.applies(no)
90        assert !c2.applies(none)
91        assert !c3.applies(yes)
92        assert c3.applies(no)
93        assert c3.applies(none)
94        assert c4.applies(yes)
95        assert !c4.applies(no)
96        assert c4.applies(none)
97    }
98
99    @Test
100    public void testRegexKeyCondition() throws Exception {
101        def c1 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[/.*:(backward|forward)\$/]")).condition(Condition.Context.PRIMITIVE)
102        assert Condition.KeyMatchType.REGEX.equals(c1.matchType)
103        assert !c1.applies(getEnvironment("lanes", "3"))
104        assert c1.applies(getEnvironment("lanes:forward", "3"))
105        assert c1.applies(getEnvironment("lanes:backward", "3"))
106        assert !c1.applies(getEnvironment("lanes:foobar", "3"))
107    }
108}
Note: See TracBrowser for help on using the repository browser.