// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.graphview.core.util;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.openstreetmap.josm.plugins.graphview.core.data.MapBasedTagGroup;
import org.openstreetmap.josm.plugins.graphview.core.data.Tag;
import org.openstreetmap.josm.plugins.graphview.core.data.TagGroup;
public class TagConditionLogicTest {
TagGroup groupA;
TagGroup groupB;
@Before
public void setUp() {
Map<String, String> mapA = new HashMap<>();
mapA.put("key1", "value1");
mapA.put("key2", "value2");
mapA.put("key3", "value1");
groupA = new MapBasedTagGroup(mapA);
Map<String, String> mapB = new HashMap<>();
mapB.put("key1", "value1");
mapB.put("key4", "value4");
groupB = new MapBasedTagGroup(mapB);
}
@Test
public void testTag() {
TagCondition condition = TagConditionLogic.tag(new Tag("key3", "value1"));
assertTrue(condition.matches(groupA));
assertFalse(condition.matches(groupB));
}
@Test
public void testKey() {
TagCondition condition = TagConditionLogic.key("key3");
assertTrue(condition.matches(groupA));
assertFalse(condition.matches(groupB));
}
@Test
public void testAnd() {
TagCondition condition1 = TagConditionLogic.tag(new Tag("key2", "value2"));
TagCondition conditionAnd1a = TagConditionLogic.and(condition1);
TagCondition conditionAnd1b = TagConditionLogic.and(Arrays.asList(condition1));
assertTrue(conditionAnd1a.matches(groupA));
assertTrue(conditionAnd1b.matches(groupA));
assertFalse(conditionAnd1a.matches(groupB));
assertFalse(conditionAnd1b.matches(groupB));
TagCondition condition2 = TagConditionLogic.tag(new Tag("key1", "value1"));
TagCondition conditionAnd2a = TagConditionLogic.and(condition1, condition2);
TagCondition conditionAnd2b = TagConditionLogic.and(Arrays.asList(condition1, condition2));
assertTrue(conditionAnd2a.matches(groupA));
assertTrue(conditionAnd2b.matches(groupA));
assertFalse(conditionAnd2a.matches(groupB));
assertFalse(conditionAnd2b.matches(groupB));
TagCondition condition3 = TagConditionLogic.tag(new Tag("key4", "value4"));
TagCondition conditionAnd3a = TagConditionLogic.and(condition1, condition2, condition3);
TagCondition conditionAnd3b = TagConditionLogic.and(Arrays.asList(condition1, condition2, condition3));
assertFalse(conditionAnd3a.matches(groupA));
assertFalse(conditionAnd3b.matches(groupA));
assertFalse(conditionAnd3a.matches(groupB));
assertFalse(conditionAnd3b.matches(groupB));
}
@Test
public void testOr() {
TagCondition condition1 = TagConditionLogic.tag(new Tag("key42", "value42"));
TagCondition conditionOr1a = TagConditionLogic.or(condition1);
TagCondition conditionOr1b = TagConditionLogic.or(Arrays.asList(condition1));
assertFalse(conditionOr1a.matches(groupA));
assertFalse(conditionOr1b.matches(groupA));
assertFalse(conditionOr1a.matches(groupB));
assertFalse(conditionOr1b.matches(groupB));
TagCondition condition2 = TagConditionLogic.tag(new Tag("key3", "value1"));
TagCondition conditionOr2a = TagConditionLogic.or(condition1, condition2);
TagCondition conditionOr2b = TagConditionLogic.or(Arrays.asList(condition1, condition2));
assertTrue(conditionOr2a.matches(groupA));
assertTrue(conditionOr2b.matches(groupA));
assertFalse(conditionOr2a.matches(groupB));
assertFalse(conditionOr2b.matches(groupB));
TagCondition condition3 = TagConditionLogic.tag(new Tag("key1", "value1"));
TagCondition conditionOr3a = TagConditionLogic.or(condition1, condition2, condition3);
TagCondition conditionOr3b = TagConditionLogic.or(Arrays.asList(condition1, condition2, condition3));
assertTrue(conditionOr3a.matches(groupA));
assertTrue(conditionOr3b.matches(groupA));
assertTrue(conditionOr3a.matches(groupB));
assertTrue(conditionOr3b.matches(groupB));
}
@Test
public void testNot() {
TagCondition condition = TagConditionLogic.not(TagConditionLogic.key("key3"));
assertFalse(condition.matches(groupA));
assertTrue(condition.matches(groupB));
}
}