// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.tagfilter.v0_6;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openstreetmap.osmosis.core.container.v0_6.EntityContainer;
import org.openstreetmap.osmosis.core.container.v0_6.NodeContainer;
import org.openstreetmap.osmosis.core.container.v0_6.RelationContainer;
import org.openstreetmap.osmosis.core.container.v0_6.WayContainer;
import org.openstreetmap.osmosis.core.domain.v0_6.CommonEntityData;
import org.openstreetmap.osmosis.core.domain.v0_6.Node;
import org.openstreetmap.osmosis.core.domain.v0_6.OsmUser;
import org.openstreetmap.osmosis.core.domain.v0_6.Relation;
import org.openstreetmap.osmosis.core.domain.v0_6.RelationMember;
import org.openstreetmap.osmosis.core.domain.v0_6.Tag;
import org.openstreetmap.osmosis.core.domain.v0_6.Way;
import org.openstreetmap.osmosis.core.domain.v0_6.WayNode;
import org.openstreetmap.osmosis.testutil.v0_6.SinkEntityInspector;
/**
* Tests the TagFilter implementation.
*
* @author Andrew Byrd
* Based on tests written by Karl Newman
*/
public class TagFilterTest {
private SinkEntityInspector entityInspector;
private TagFilter tagFilter;
private Node amenityNode;
private NodeContainer amenityNodeContainer;
private Node taglessNode;
private NodeContainer taglessNodeContainer;
private Way motorwayWay;
private WayContainer motorwayWayContainer;
private Way residentialWay;
private WayContainer residentialWayContainer;
private Relation testRelation;
private RelationContainer testRelationContainer;
/**
* Performs pre-test activities.
*/
@Before
public void setUp() {
OsmUser user;
List<Tag> tags;
user = new OsmUser(12, "OsmosisTest");
tags = Arrays.asList(new Tag("amenity", "bank"), new Tag("Akey", "Avalue"));
amenityNode = new Node(new CommonEntityData(1101, 0, new Date(), user, 0, tags), 1, 2);
amenityNodeContainer = new NodeContainer(amenityNode);
tags = new ArrayList<Tag>();
taglessNode = new Node(new CommonEntityData(1102, 0, new Date(), user, 0, tags), 3, 4);
taglessNodeContainer = new NodeContainer(taglessNode);
tags = Arrays.asList(new Tag("highway", "motorway"), new Tag("Bkey", "Bvalue"));
motorwayWay = new Way(new CommonEntityData(2201, 0, new Date(), user, 0, tags), new ArrayList<WayNode>());
motorwayWayContainer = new WayContainer(motorwayWay);
tags = Arrays.asList(new Tag("highway", "residential"), new Tag("Ckey", "Cvalue"));
residentialWay =
new Way(new CommonEntityData(2202, 0, new Date(), user, 0, tags), new ArrayList<WayNode>());
residentialWayContainer = new WayContainer(residentialWay);
tags = Arrays.asList(new Tag("Dkey", "Dvalue"));
testRelation =
new Relation(new CommonEntityData(3301, 0, new Date(), user, 0, tags), new ArrayList<RelationMember>());
testRelationContainer = new RelationContainer(testRelation);
}
/**
* Performs post-test activities.
*/
@After
public void tearDown() {
// nothing to do here.
}
/**
* Test passing a node which matches the filter.
*/
@Test
public final void testAcceptNode() {
Set<String> keys = new HashSet<String>(Arrays.asList("amenity"));
Map<String, Set<String>> keyValues = new HashMap<String, Set<String>>();
keyValues.put("key", new HashSet<String>(Arrays.asList("valone", "valtwo")));
tagFilter = new TagFilter("accept-nodes", keys, keyValues);
entityInspector = new SinkEntityInspector();
tagFilter.setSink(entityInspector);
tagFilter.process(amenityNodeContainer);
tagFilter.process(taglessNodeContainer);
tagFilter.process(residentialWayContainer);
tagFilter.complete();
List<EntityContainer> expectedResult = Arrays.asList(amenityNodeContainer, residentialWayContainer);
assertTrue(entityInspector.getProcessedEntities().equals(expectedResult));
tagFilter.close();
}
/**
* Test rejecting a way which matches the filter.
*/
@Test
public final void testRejectWay() {
Set<String> keys = new HashSet<String>();
Map<String, Set<String>> keyValues = new HashMap<String, Set<String>>();
keyValues.put("highway", new HashSet<String>(Arrays.asList("motorway", "motorway_link")));
tagFilter = new TagFilter("reject-ways", keys, keyValues);
entityInspector = new SinkEntityInspector();
tagFilter.setSink(entityInspector);
tagFilter.process(amenityNodeContainer);
tagFilter.process(residentialWayContainer);
tagFilter.process(motorwayWayContainer);
tagFilter.complete();
List<EntityContainer> expectedResult = Arrays.asList(amenityNodeContainer, residentialWayContainer);
assertTrue(entityInspector.getProcessedEntities().equals(expectedResult));
tagFilter.close();
}
/**
* Test rejecting a relation without tag-based filtering.
*/
@Test
public final void testRejectRelation() {
Set<String> keys = new HashSet<String>();
Map<String, Set<String>> keyValues = new HashMap<String, Set<String>>();
tagFilter = new TagFilter("reject-relations", keys, keyValues);
entityInspector = new SinkEntityInspector();
tagFilter.setSink(entityInspector);
tagFilter.process(amenityNodeContainer);
tagFilter.process(residentialWayContainer);
tagFilter.process(testRelationContainer);
tagFilter.complete();
List<EntityContainer> expectedResult = Arrays.asList(amenityNodeContainer, residentialWayContainer);
assertTrue(entityInspector.getProcessedEntities().equals(expectedResult));
tagFilter.close();
}
}