// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.osm; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.FileInputStream; import java.io.InputStream; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import org.junit.Rule; import org.junit.Test; import org.openstreetmap.josm.actions.search.SearchAction.SearchMode; import org.openstreetmap.josm.actions.search.SearchCompiler.ParseError; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.gui.progress.NullProgressMonitor; import org.openstreetmap.josm.io.OsmReader; import org.openstreetmap.josm.testutils.JOSMTestRules; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; /** * Unit tests for class {@link Filter}. */ public class FilterTest { /** * Setup test. */ @Rule @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public JOSMTestRules test = new JOSMTestRules(); @Test public void testBasic() throws ParseError { DataSet ds = new DataSet(); Node n1 = new Node(LatLon.ZERO); n1.put("amenity", "parking"); Node n2 = new Node(LatLon.ZERO); n2.put("fixme", "continue"); ds.addPrimitive(n1); ds.addPrimitive(n2); Collection<OsmPrimitive> all = new HashSet<>(); all.addAll(Arrays.asList(new OsmPrimitive[] {n1, n2})); List<Filter> filters = new LinkedList<>(); Filter f1 = new Filter(); f1.text = "fixme"; f1.hiding = true; filters.addAll(Arrays.asList(new Filter[] {f1})); FilterMatcher filterMatcher = new FilterMatcher(); filterMatcher.update(filters); FilterWorker.executeFilters(all, filterMatcher); assertTrue(n2.isDisabledAndHidden()); assertFalse(n1.isDisabled()); } @Test public void testFilter() throws Exception { for (int i : new int[] {1, 2, 3, 11, 12, 13, 14, 15}) { DataSet ds; try (InputStream is = new FileInputStream("data_nodist/filterTests.osm")) { ds = OsmReader.parseDataSet(is, NullProgressMonitor.INSTANCE); } List<Filter> filters = new LinkedList<>(); switch (i) { case 1: { Filter f1 = new Filter(); f1.text = "power"; f1.hiding = true; filters.add(f1); break; } case 2: { Filter f1 = new Filter(); f1.text = "highway"; f1.inverted = true; filters.add(f1); break; } case 3: { Filter f1 = new Filter(); f1.text = "power"; f1.inverted = true; f1.hiding = true; Filter f2 = new Filter(); f2.text = "highway"; filters.addAll(Arrays.asList(new Filter[] {f1, f2})); break; } case 11: { Filter f1 = new Filter(); f1.text = "highway"; f1.inverted = true; f1.hiding = true; filters.add(f1); break; } case 12: { Filter f1 = new Filter(); f1.text = "highway"; f1.inverted = true; f1.hiding = true; Filter f2 = new Filter(); f2.text = "water"; f2.mode = SearchMode.remove; filters.addAll(Arrays.asList(new Filter[] {f1, f2})); break; } case 13: { Filter f1 = new Filter(); f1.text = "highway"; f1.inverted = true; f1.hiding = true; Filter f2 = new Filter(); f2.text = "water"; f2.mode = SearchMode.remove; Filter f3 = new Filter(); f3.text = "natural"; filters.addAll(Arrays.asList(new Filter[] {f1, f2, f3})); break; } case 14: { /* show all highways and all water features, but not lakes * except those that have a name */ Filter f1 = new Filter(); f1.text = "highway"; f1.inverted = true; f1.hiding = true; Filter f2 = new Filter(); f2.text = "water"; f2.mode = SearchMode.remove; Filter f3 = new Filter(); f3.text = "natural"; Filter f4 = new Filter(); f4.text = "name"; f4.mode = SearchMode.remove; filters.addAll(Arrays.asList(new Filter[] {f1, f2, f3, f4})); break; } case 15: { Filter f1 = new Filter(); f1.text = "highway"; f1.inverted = true; f1.hiding = true; Filter f2 = new Filter(); f2.text = "water"; f2.mode = SearchMode.remove; f2.hiding = true; // Remove only hide flag so water should stay disabled filters.addAll(Arrays.asList(new Filter[] {f1, f2})); break; } default: throw new AssertionError(); } FilterMatcher filterMatcher = new FilterMatcher(); filterMatcher.update(filters); FilterWorker.executeFilters(ds.allPrimitives(), filterMatcher); boolean foundAtLeastOne = false; System.err.println("Run #"+i); StringBuilder failedPrimitives = new StringBuilder(); for (OsmPrimitive osm : ds.allPrimitives()) { String key = "source:RESULT"+i; // use key that counts as untagged if (osm.hasKey(key)) { foundAtLeastOne = true; if (!osm.get(key).equals(filterCode(osm))) { failedPrimitives.append(String.format( "Object %s. Expected [%s] but was [%s]%n", osm.toString(), osm.get(key), filterCode(osm))); } } } assertTrue(foundAtLeastOne); if (failedPrimitives.length() != 0) throw new AssertionError(String.format("Run #%d%n%s", i, failedPrimitives.toString())); } } private String filterCode(OsmPrimitive osm) { if (!osm.isDisabled()) return "v"; if (!osm.isDisabledAndHidden()) return "d"; return "h"; } }