/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2005-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.filter.visitor; import java.util.Collections; import java.util.HashSet; import java.util.Set; import junit.framework.TestCase; import org.geotools.factory.CommonFactoryFinder; import org.geotools.filter.visitor.SimplifyingFilterVisitor.FIDValidator; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory; import org.opengis.filter.Id; import org.opengis.filter.PropertyIsEqualTo; import org.opengis.filter.identity.Identifier; public class SimplifyingFilterVisitorTest extends TestCase { FilterFactory ff = CommonFactoryFinder.getFilterFactory(null); Id emptyFid; SimplifyingFilterVisitor visitor; PropertyIsEqualTo property; @Override protected void setUp() throws Exception { emptyFid = ff.id(new HashSet<Identifier>()); property = ff.equal(ff.property("test"), ff.literal("oneTwoThree"), false); visitor = new SimplifyingFilterVisitor(); } public void testIncludeAndInclude() { Filter result = (Filter) ff.and(Filter.INCLUDE, Filter.INCLUDE).accept(visitor, null); assertEquals(Filter.INCLUDE, result); } public void testIncludeAndExclude() { Filter result = (Filter) ff.and(Filter.INCLUDE, Filter.EXCLUDE).accept(visitor, null); assertEquals(Filter.EXCLUDE, result); } public void testExcludeAndExclude() { Filter result = (Filter) ff.and(Filter.EXCLUDE, Filter.EXCLUDE).accept(visitor, null); assertEquals(Filter.EXCLUDE, result); } public void testIncludeAndProperty() { Filter result = (Filter) ff.and(Filter.INCLUDE, property).accept(visitor, null); assertEquals(property, result); } public void testExcludeAndProperty() { Filter result = (Filter) ff.or(Filter.EXCLUDE, property).accept(visitor, null); assertEquals(property, result); } public void testIncludeOrInclude() { Filter result = (Filter) ff.or(Filter.INCLUDE, Filter.INCLUDE).accept(visitor, null); assertEquals(Filter.INCLUDE, result); } public void testIncludeOrExclude() { Filter result = (Filter) ff.or(Filter.INCLUDE, Filter.EXCLUDE).accept(visitor, null); assertEquals(Filter.INCLUDE, result); } public void testExcludeOrExclude() { Filter result = (Filter) ff.or(Filter.EXCLUDE, Filter.EXCLUDE).accept(visitor, null); assertEquals(Filter.EXCLUDE, result); } public void testIncludeOrProperty() { Filter result = (Filter) ff.or(Filter.INCLUDE, property).accept(visitor, null); assertEquals(Filter.INCLUDE, result); } public void testExcludeOrProperty() { Filter result = (Filter) ff.or(Filter.EXCLUDE, property).accept(visitor, null); assertEquals(property, result); } public void testEmptyFid() { Filter result = (Filter) emptyFid.accept(visitor, null); assertEquals(Filter.EXCLUDE, result); } public void testRecurseAnd() { Filter test = ff.and(Filter.INCLUDE, ff.or(property, Filter.EXCLUDE)); assertEquals(property, test.accept(visitor, null)); } public void testRecurseOr() { Filter test = ff.or(Filter.EXCLUDE, ff.and(property, Filter.INCLUDE)); assertEquals(property, test.accept(visitor, null)); } public void testFidValidity() { visitor.setFIDValidator(new SimplifyingFilterVisitor.FIDValidator() { public boolean isValid(String fid) { return fid.startsWith("pass"); } }); Set<Identifier> ids = new HashSet<Identifier>(); ids.add(ff.featureId("notPass")); Id filter = ff.id(ids); assertEquals(Filter.EXCLUDE, filter.accept(visitor, null)); ids.add(ff.featureId("pass1")); ids.add(ff.featureId("pass2")); filter = ff.id(ids); Set<Identifier> validIds = new HashSet<Identifier>(); validIds.add(ff.featureId("pass2")); validIds.add(ff.featureId("pass1")); Filter expected = ff.id(validIds); assertEquals(expected, filter.accept(visitor, null)); } public void testRegExFIDValidator() { FIDValidator validator = new SimplifyingFilterVisitor.RegExFIDValidator("abc\\.\\d+"); visitor.setFIDValidator(validator); Set<Identifier> ids = new HashSet<Identifier>(); ids.add(ff.featureId("abc..")); ids.add(ff.featureId(".abc.1")); ids.add(ff.featureId("abc.123")); ids.add(ff.featureId("abc.ax")); Id filter = ff.id(ids); Filter result = (Filter) filter.accept(visitor, null); Filter expected = ff.id(Collections.singleton(ff.featureId("abc.123"))); assertEquals(expected, result); } public void testTypeNameDotNumberValidator() { final String typeName = "states"; FIDValidator validator; validator = new SimplifyingFilterVisitor.TypeNameDotNumberFidValidator(typeName); visitor.setFIDValidator(validator); Set<Identifier> ids = new HashSet<Identifier>(); ids.add(ff.featureId("_states")); ids.add(ff.featureId("states.abc")); ids.add(ff.featureId("states..")); ids.add(ff.featureId("states.123")); Id filter = ff.id(ids); Filter result = (Filter) filter.accept(visitor, null); Filter expected = ff.id(Collections.singleton(ff.featureId("states.123"))); assertEquals(expected, result); } public void testSingleNegation() { Filter f = ff.not(ff.equals(ff.property("prop"), ff.literal(10))); Filter result = (Filter) f.accept(visitor, null); assertEquals(f, result); } public void testDoubleNegation() { PropertyIsEqualTo equal = ff.equals(ff.property("prop"), ff.literal(10)); Filter f = ff.not(ff.not(equal)); Filter result = (Filter) f.accept(visitor, null); assertEquals(equal, result); } public void testTripleNegation() { PropertyIsEqualTo equal = ff.equals(ff.property("prop"), ff.literal(10)); Filter f = ff.not(ff.not(ff.not(equal))); Filter result = (Filter) f.accept(visitor, null); assertEquals(ff.not(equal), result); } }