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, 11 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.