source: josm/trunk/test/unit/org/openstreetmap/josm/data/osm/FilterTest.java@ 3367

Last change on this file since 3367 was 3367, checked in by jttt, 14 years ago

Fix filters

  • Property svn:eol-style set to native
File size: 6.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.osm;
3
4import static org.junit.Assert.assertNotNull;
5import static org.junit.Assert.assertTrue;
6
7import java.io.FileInputStream;
8import java.io.FileNotFoundException;
9import java.util.Arrays;
10import java.util.Collection;
11import java.util.HashSet;
12import java.util.LinkedList;
13import java.util.List;
14
15import org.junit.BeforeClass;
16import org.junit.Test;
17import org.openstreetmap.josm.Main;
18import org.openstreetmap.josm.actions.search.SearchAction.SearchMode;
19import org.openstreetmap.josm.actions.search.SearchCompiler.ParseError;
20import org.openstreetmap.josm.data.projection.Mercator;
21import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
22import org.openstreetmap.josm.io.IllegalDataException;
23import org.openstreetmap.josm.io.OsmReader;
24
25
26public class FilterTest {
27 @BeforeClass
28 public static void setUp() {
29 Main.proj = new Mercator();
30 }
31
32 @Test
33 public void basic_test() throws ParseError {
34 DataSet ds = new DataSet();
35 Node n1 = new Node(1);
36 n1.put("amenity", "parking");
37 Node n2 = new Node(2);
38 n2.put("fixme", "continue");
39 ds.addPrimitive(n1);
40 ds.addPrimitive(n2);
41 OsmPrimitive p = ds.getPrimitiveById(1,OsmPrimitiveType.NODE);
42 assertNotNull(p);
43
44 Collection<OsmPrimitive> all = new HashSet<OsmPrimitive>();
45 all.addAll(Arrays.asList(new OsmPrimitive[] {n1, n2}));
46
47 List<Filter> filters = new LinkedList<Filter>();
48 Filter f1 = new Filter();
49 f1.text = "fixme";
50 f1.hiding = true;
51 filters.addAll(Arrays.asList(new Filter[] {f1}));
52
53 FilterMatcher filterMatcher = new FilterMatcher();
54 filterMatcher.update(filters);
55
56 FilterWorker.executeFilters(all, filterMatcher);
57
58 assertTrue(n2.isDisabledAndHidden());
59 assertTrue(!n1.isDisabled());
60 }
61
62 @Test
63 public void filter_test() throws ParseError, IllegalDataException, FileNotFoundException {
64 for (int i : new int [] {1,2,3, 11,12,13,14, 15}) {
65 DataSet ds = OsmReader.parseDataSet(new FileInputStream("data_nodist/filterTests.osm"), NullProgressMonitor.INSTANCE);
66
67 List<Filter> filters = new LinkedList<Filter>();
68 switch (i) {
69 case 1: {
70 Filter f1 = new Filter();
71 f1.text = "power";
72 f1.hiding = true;
73 filters.add(f1);
74 break;
75 }
76 case 2: {
77 Filter f1 = new Filter();
78 f1.text = "highway";
79 f1.inverted = true;
80 filters.add(f1);
81 break;
82 }
83 case 3: {
84 Filter f1 = new Filter();
85 f1.text = "power";
86 f1.inverted = true;
87 f1.hiding = true;
88 Filter f2 = new Filter();
89 f2.text = "highway";
90 filters.addAll(Arrays.asList(new Filter[] {f1, f2}));
91 break;
92 }
93 case 11: {
94 Filter f1 = new Filter();
95 f1.text = "highway";
96 f1.inverted = true;
97 f1.hiding = true;
98 filters.add(f1);
99 break;
100 }
101 case 12: {
102 Filter f1 = new Filter();
103 f1.text = "highway";
104 f1.inverted = true;
105 f1.hiding = true;
106 Filter f2 = new Filter();
107 f2.text = "water";
108 f2.mode = SearchMode.remove;
109 filters.addAll(Arrays.asList(new Filter[] {f1, f2}));
110 break;
111 }
112 case 13: {
113 Filter f1 = new Filter();
114 f1.text = "highway";
115 f1.inverted = true;
116 f1.hiding = true;
117 Filter f2 = new Filter();
118 f2.text = "water";
119 f2.mode = SearchMode.remove;
120 Filter f3 = new Filter();
121 f3.text = "natural";
122 filters.addAll(Arrays.asList(new Filter[] {f1, f2, f3}));
123 break;
124 }
125 case 14: {
126 /* show all highways and all water features, but not lakes
127 * except those that have a name */
128 Filter f1 = new Filter();
129 f1.text = "highway";
130 f1.inverted = true;
131 f1.hiding = true;
132 Filter f2 = new Filter();
133 f2.text = "water";
134 f2.mode = SearchMode.remove;
135 Filter f3 = new Filter();
136 f3.text = "natural";
137 Filter f4 = new Filter();
138 f4.text = "name";
139 f4.mode = SearchMode.remove;
140 filters.addAll(Arrays.asList(new Filter[] {f1, f2, f3, f4}));
141 break;
142 }
143 case 15: {
144 Filter f1 = new Filter();
145 f1.text = "highway";
146 f1.inverted = true;
147 f1.hiding = true;
148 Filter f2 = new Filter();
149 f2.text = "water";
150 f2.mode = SearchMode.remove;
151 f2.hiding = true; // Remove only hide flag so water should stay disabled
152 filters.addAll(Arrays.asList(new Filter[] {f1, f2}));
153 break;
154 }
155 }
156
157 FilterMatcher filterMatcher = new FilterMatcher();
158 filterMatcher.update(filters);
159
160 FilterWorker.executeFilters(ds.allPrimitives(), filterMatcher);
161
162 boolean foundAtLeastOne = false;
163 System.err.println("Run #"+i);
164 StringBuilder failedPrimitives = new StringBuilder();
165 for (OsmPrimitive osm : ds.allPrimitives()) {
166 String key = "source:RESULT"+i; // use key that counts as untagged
167 if (osm.hasKey(key)) {
168 foundAtLeastOne = true;
169 if (!osm.get(key).equals(filterCode(osm))) {
170 failedPrimitives.append(String.format("Object %s. Expected [%s] but was [%s]\n", osm.toString(), osm.get(key), filterCode(osm)));
171 }
172 }
173 }
174 assertTrue(foundAtLeastOne);
175 if (failedPrimitives.length() != 0)
176 throw new AssertionError(String.format("Run #%d\n%s", i, failedPrimitives.toString()));
177 }
178 }
179
180 private String filterCode(OsmPrimitive osm) {
181 if (!osm.isDisabled())
182 return "v";
183 if (!osm.isDisabledAndHidden())
184 return "d";
185 return "h";
186 }
187}
Note: See TracBrowser for help on using the repository browser.