package org.geotools.filter; import static org.junit.Assert.*; import static org.junit.Assert.assertEquals; import java.awt.Color; import java.util.Arrays; import java.util.List; import org.geotools.factory.CommonFactoryFinder; import org.geotools.filter.visitor.AbstractFilterVisitor; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.opengis.filter.And; import org.opengis.filter.BinaryLogicOperator; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory2; import org.opengis.filter.Or; import org.opengis.filter.PropertyIsGreaterThan; import org.opengis.filter.PropertyIsLike; @SuppressWarnings("deprecation") public class FiltersTest { private static final double DELTA = 0.0000001; private static Filters filters; private static FilterFactory2 ff; private static Filter a; private static Filter b; private static Filter c; private static Filter d; @BeforeClass public static void setUpBeforeClass() throws Exception { ff = CommonFactoryFinder.getFilterFactory2(null); filters = new Filters(ff); a = ff.greater(ff.property("zone"), ff.literal(7)); b = ff.like(ff.property("suburb"), "N%"); c = ff.equals(ff.property("Subject"), ff.literal("foo")); d = ff.equals(ff.property("Subject"), ff.literal("bar")); } @AfterClass public static void tearDownAfterClass() throws Exception { ff = null; filters = null; } @Test public void testAnd() { Filter result = filters.and(ff, a, b); assertEquals(ff.and(a, b), result); } @Test public void testOr() { Filter result = filters.or(ff, a, b); assertEquals(ff.or(a, b), result); } @Test public void testAccept() { Filter filter = ff.and(a, b); final int count[] = new int[1]; filters.accept(filter, new FilterVisitor() { public void visit(org.geotools.filter.Filter filter) { count[0]++; } public void visit(BetweenFilter filter) { count[0]++; } public void visit(CompareFilter filter) { count[0]++; } public void visit(GeometryFilter filter) { count[0]++; } public void visit(LikeFilter filter) { count[0]++; } public void visit(LogicFilter filter) { count[0]++; } public void visit(NullFilter filter) { count[0]++; } public void visit(FidFilter filter) { count[0]++; } public void visit(AttributeExpression expression) { count[0]++; } public void visit(Expression expression) { count[0]++; } public void visit(LiteralExpression expression) { count[0]++; } public void visit(MathExpression expression) { count[0]++; } public void visit(FunctionExpression expression) { count[0]++; } }); assertEquals(1, count[0]); } @Test public void testDuplicate() { Filter copy = filters.duplicate(a); assertNotSame(copy, a); assertEquals(copy, a); } @Test public void testGetFilterType() { assertEquals(FilterType.COMPARE_GREATER_THAN, Filters.getFilterType(a)); } @Test public void testAsInt() { assertEquals(1, filters.asInt(ff.literal(1))); assertEquals(1, filters.asInt(ff.literal("1"))); assertEquals(Filters.NOTFOUND, filters.asInt(ff.property("fred"))); } @Test public void testAsString() { assertEquals("1", Filters.asString(ff.literal("1"))); assertEquals("1", Filters.asString(ff.literal(1))); assertEquals("1.0", Filters.asString(ff.literal(1.0))); assertEquals("3.14", Filters.asString(ff.literal(3.14))); assertEquals("#000000", Filters.asString(ff.literal(Color.BLACK))); } @Test public void testAsDouble() { assertEquals(1.0, Filters.asInt(ff.literal(1)), DELTA); assertEquals(1, Filters.asInt(ff.literal("1")), DELTA); } @Test public void testAsType() { assertEquals(1.0, Filters.asType(ff.literal("1"), double.class), DELTA); assertEquals(Color.BLUE, Filters.asType(ff.literal("#0000FF"), Color.class)); } @Test public void testNumber() { assertEquals(1.0, Filters.number("1.0"), DELTA); assertEquals(1, Filters.number("1"), DELTA); } @Test public void testGets() throws Throwable { assertEquals(new Long(1l), Filters.gets("1.0", Long.class)); } @Test public void testPutsDouble() { assertEquals("1", Filters.puts(1.0)); assertEquals("3.14", Filters.puts(3.14)); } @Test public void testPutsObject() { assertEquals("42", Filters.puts(42)); } @Test public void testPutsColor() { assertEquals("#0000ff", Filters.puts(Color.BLUE)); } private int count( Filter filter ){ if( filter instanceof BinaryLogicOperator ){ BinaryLogicOperator logic = (BinaryLogicOperator) filter; return logic.getChildren() != null ? logic.getChildren().size() : -1; } return -1; } @Test public void testRemoveFilter() { Filter results = Filters.removeFilter(null, a); assertNull("Start with nothing should end with nothing", results); results = Filters.removeFilter(a, null); assertSame("Existing should be returned with null target", a, results); And base = ff.and(Arrays.asList(new Filter[]{a,b,c})); results = Filters.removeFilter(base, d); assertEquals("Should not change when target not a child", base, results); results = Filters.removeFilter(base, b); And expected = ff.and(a, c); assertEquals(expected, results); //now remove another. it should be collapsed and only c returned results = Filters.removeFilter(results, a); assertEquals(results, c); //test the last ill-formed bit results = Filters.removeFilter(results, c); assertSame("Include should be returned when same filter", Filter.INCLUDE, results); } @Test public void testRemoveFilterCompound() { Or childOr = ff.or(Arrays.asList(new Filter[]{b, c, d})); And base = ff.and(a, childOr); Filter results = Filters.removeFilter(base, d, false); assertEquals("Filter should not be removed because it should not recurse", base, results); results = Filters.removeFilter(base, d); assertFalse("Results should be a new object with different children", base.equals(results)); childOr = ff.or(b,c); And expected = ff.and(a, childOr); assertEquals(expected, results); //again results = Filters.removeFilter(results, c); expected = ff.and(a, b); assertEquals(expected, results); //again results = Filters.removeFilter(results, a); assertEquals(b, results); //again results = Filters.removeFilter(results, b); assertEquals(Filter.INCLUDE, results); } @Test public void testFindPropertyName() { String results = Filters.findPropertyName(b); assertEquals("suburb", results); Filter f = ff.equals(ff.literal("bar"), ff.literal("foo")); } @Test public void testFindPropertyNameEmpty() { assertNull(Filters.findPropertyName(null)); Filter f = ff.equals(ff.literal("bar"), ff.literal("foo")); String results = Filters.findPropertyName(b); assertNull(Filters.findPropertyName(f)); } }