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

Last change on this file since 12656 was 12656, checked in by Don-vip, 7 years ago

see #15182 - move SearchCompiler from actions.search to data.osm.search

  • Property svn:eol-style set to native
File size: 8.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.osm;
3
4import static org.junit.Assert.assertEquals;
5import static org.junit.Assert.assertFalse;
6import static org.junit.Assert.assertTrue;
7
8import java.io.FileInputStream;
9import java.io.InputStream;
10import java.util.Arrays;
11import java.util.Collection;
12import java.util.HashSet;
13import java.util.LinkedList;
14import java.util.List;
15
16import org.junit.Rule;
17import org.junit.Test;
18import org.openstreetmap.josm.actions.search.SearchAction.SearchMode;
19import org.openstreetmap.josm.data.coor.LatLon;
20import org.openstreetmap.josm.data.osm.Filter.FilterPreferenceEntry;
21import org.openstreetmap.josm.data.osm.search.SearchParseError;
22import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
23import org.openstreetmap.josm.io.OsmReader;
24import org.openstreetmap.josm.testutils.JOSMTestRules;
25
26import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
27import nl.jqno.equalsverifier.EqualsVerifier;
28import nl.jqno.equalsverifier.Warning;
29
30/**
31 * Unit tests for class {@link Filter}.
32 */
33public class FilterTest {
34
35 /**
36 * Setup test.
37 */
38 @Rule
39 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
40 public JOSMTestRules test = new JOSMTestRules();
41
42 @Test
43 public void testBasic() throws SearchParseError {
44 DataSet ds = new DataSet();
45 Node n1 = new Node(LatLon.ZERO);
46 n1.put("amenity", "parking");
47 Node n2 = new Node(LatLon.ZERO);
48 n2.put("fixme", "continue");
49 ds.addPrimitive(n1);
50 ds.addPrimitive(n2);
51
52 Collection<OsmPrimitive> all = new HashSet<>();
53 all.addAll(Arrays.asList(new OsmPrimitive[] {n1, n2}));
54
55 List<Filter> filters = new LinkedList<>();
56 Filter f1 = new Filter();
57 f1.text = "fixme";
58 f1.hiding = true;
59 filters.addAll(Arrays.asList(new Filter[] {f1}));
60
61 FilterMatcher filterMatcher = new FilterMatcher();
62 filterMatcher.update(filters);
63
64 FilterWorker.executeFilters(all, filterMatcher);
65
66 assertTrue(n2.isDisabledAndHidden());
67 assertFalse(n1.isDisabled());
68 }
69
70 @Test
71 public void testFilter() throws Exception {
72 for (int i : new int[] {1, 2, 3, 11, 12, 13, 14, 15}) {
73 DataSet ds;
74 try (InputStream is = new FileInputStream("data_nodist/filterTests.osm")) {
75 ds = OsmReader.parseDataSet(is, NullProgressMonitor.INSTANCE);
76 }
77
78 List<Filter> filters = new LinkedList<>();
79 switch (i) {
80 case 1: {
81 Filter f1 = new Filter();
82 f1.text = "power";
83 f1.hiding = true;
84 filters.add(f1);
85 break;
86 }
87 case 2: {
88 Filter f1 = new Filter();
89 f1.text = "highway";
90 f1.inverted = true;
91 filters.add(f1);
92 break;
93 }
94 case 3: {
95 Filter f1 = new Filter();
96 f1.text = "power";
97 f1.inverted = true;
98 f1.hiding = true;
99 Filter f2 = new Filter();
100 f2.text = "highway";
101 filters.addAll(Arrays.asList(new Filter[] {f1, f2}));
102 break;
103 }
104 case 11: {
105 Filter f1 = new Filter();
106 f1.text = "highway";
107 f1.inverted = true;
108 f1.hiding = true;
109 filters.add(f1);
110 break;
111 }
112 case 12: {
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 filters.addAll(Arrays.asList(new Filter[] {f1, f2}));
121 break;
122 }
123 case 13: {
124 Filter f1 = new Filter();
125 f1.text = "highway";
126 f1.inverted = true;
127 f1.hiding = true;
128 Filter f2 = new Filter();
129 f2.text = "water";
130 f2.mode = SearchMode.remove;
131 Filter f3 = new Filter();
132 f3.text = "natural";
133 filters.addAll(Arrays.asList(new Filter[] {f1, f2, f3}));
134 break;
135 }
136 case 14: {
137 /* show all highways and all water features, but not lakes
138 * except those that have a name */
139 Filter f1 = new Filter();
140 f1.text = "highway";
141 f1.inverted = true;
142 f1.hiding = true;
143 Filter f2 = new Filter();
144 f2.text = "water";
145 f2.mode = SearchMode.remove;
146 Filter f3 = new Filter();
147 f3.text = "natural";
148 Filter f4 = new Filter();
149 f4.text = "name";
150 f4.mode = SearchMode.remove;
151 filters.addAll(Arrays.asList(new Filter[] {f1, f2, f3, f4}));
152 break;
153 }
154 case 15: {
155 Filter f1 = new Filter();
156 f1.text = "highway";
157 f1.inverted = true;
158 f1.hiding = true;
159 Filter f2 = new Filter();
160 f2.text = "water";
161 f2.mode = SearchMode.remove;
162 f2.hiding = true; // Remove only hide flag so water should stay disabled
163 filters.addAll(Arrays.asList(new Filter[] {f1, f2}));
164 break;
165 }
166 default: throw new AssertionError();
167 }
168
169 FilterMatcher filterMatcher = new FilterMatcher();
170 filterMatcher.update(filters);
171
172 FilterWorker.executeFilters(ds.allPrimitives(), filterMatcher);
173
174 boolean foundAtLeastOne = false;
175 System.err.println("Run #"+i);
176 StringBuilder failedPrimitives = new StringBuilder();
177 for (OsmPrimitive osm : ds.allPrimitives()) {
178 String key = "source:RESULT"+i; // use key that counts as untagged
179 if (osm.hasKey(key)) {
180 foundAtLeastOne = true;
181 if (!osm.get(key).equals(filterCode(osm))) {
182 failedPrimitives.append(String.format(
183 "Object %s. Expected [%s] but was [%s]%n", osm.toString(), osm.get(key), filterCode(osm)));
184 }
185 }
186 }
187 assertTrue(foundAtLeastOne);
188 if (failedPrimitives.length() != 0)
189 throw new AssertionError(String.format("Run #%d%n%s", i, failedPrimitives.toString()));
190 }
191 }
192
193 /**
194 * Unit tests of {@link Filter.FilterPreferenceEntry} class.
195 */
196 @Test
197 public void testFilterPreferenceEntry() {
198 Filter f = new Filter();
199 FilterPreferenceEntry fpe = f.getPreferenceEntry();
200
201 assertTrue(fpe.enable);
202
203 assertFalse(fpe.case_sensitive);
204 assertFalse(fpe.hiding);
205 assertFalse(fpe.inverted);
206 assertFalse(fpe.mapCSS_search);
207 assertFalse(fpe.regex_search);
208
209 assertEquals("add", fpe.mode);
210 assertEquals("1", fpe.version);
211 assertEquals("", fpe.text);
212
213 f.allElements = !f.allElements;
214 f.caseSensitive = !f.caseSensitive;
215 f.enable = !f.enable;
216 f.hiding = !f.hiding;
217 f.inverted = !f.inverted;
218 f.mapCSSSearch = !f.mapCSSSearch;
219 f.mode = SearchMode.remove;
220 f.regexSearch = !f.regexSearch;
221 f.text = "foo";
222 fpe = f.getPreferenceEntry();
223
224 assertFalse(fpe.enable);
225
226 assertTrue(fpe.case_sensitive);
227 assertTrue(fpe.hiding);
228 assertTrue(fpe.inverted);
229 assertTrue(fpe.mapCSS_search);
230 assertTrue(fpe.regex_search);
231
232 assertEquals("remove", fpe.mode);
233 assertEquals("1", fpe.version);
234 assertEquals("foo", fpe.text);
235
236 assertEquals(fpe, new Filter(fpe).getPreferenceEntry());
237 }
238
239 /**
240 * Unit test of methods {@link FilterPreferenceEntry#equals} and {@link FilterPreferenceEntry#hashCode}.
241 */
242 @Test
243 public void testEqualsContract() {
244 EqualsVerifier.forClass(FilterPreferenceEntry.class).usingGetClass()
245 .suppress(Warning.NONFINAL_FIELDS)
246 .verify();
247 }
248
249 private static String filterCode(OsmPrimitive osm) {
250 if (!osm.isDisabled())
251 return "v";
252 if (!osm.isDisabledAndHidden())
253 return "d";
254 return "h";
255 }
256}
Note: See TracBrowser for help on using the repository browser.