/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-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;
import java.util.Arrays;
import java.util.Collections;
import java.util.Set;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.feature.SchemaException;
import org.opengis.filter.Id;
import org.opengis.filter.Or;
import org.opengis.filter.PropertyIsEqualTo;
import org.opengis.filter.PropertyIsLike;
import org.opengis.filter.PropertyIsNull;
import org.opengis.filter.expression.Literal;
import org.opengis.filter.expression.PropertyName;
import org.opengis.filter.spatial.DWithin;
import org.opengis.filter.spatial.Equals;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.PrecisionModel;
/**
* Unit test for filters. Note that this unit test does not encompass all of filter package, just
* the filters themselves. There is a seperate unit test for expressions.
*
* @author Andrea Aime, SATA
* @source $URL$
*/
public class FilterAttributeExtractorTest extends TestCase {
boolean set = false;
FilterAttributeExtractor fae;
org.opengis.filter.FilterFactory2 fac;
/** Test suite for this test case */
TestSuite suite = null;
/**
* Constructor with test name.
*
* @param testName DOCUMENT ME!
*/
public FilterAttributeExtractorTest(String testName) {
super(testName);
}
/**
* Main for test runner.
*
* @param args DOCUMENT ME!
*/
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
/**
* Required suite builder.
*
* @return A test suite for this unit test.
*/
public static Test suite() {
TestSuite suite = new TestSuite(FilterAttributeExtractorTest.class);
return suite;
}
/**
* Sets up a schema and a test feature.
*
* @throws SchemaException If there is a problem setting up the schema.
*/
protected void setUp() throws SchemaException {
if (set) {
return;
}
set = true;
fae = new FilterAttributeExtractor();
fac = CommonFactoryFinder.getFilterFactory2(null);
}
/**
* Sets up a schema and a test feature.
*
* @throws IllegalFilterException If the constructed filter is not valid.
*/
public void testCompare() throws IllegalFilterException {
PropertyIsEqualTo filter = fac.equals(fac.property("testString"), fac.literal("test string data"));
assertAttributeName(filter, "testString");
}
private void assertAttributeName(org.opengis.filter.Filter filter, String name) {
assertAttributeName(filter, new String[] { name });
}
private void assertAttributeName(org.opengis.filter.Filter filter, String[] names) {
fae.clear();
filter.accept(fae, null);
Set attNames = fae.getAttributeNameSet();
assertNotNull(attNames);
assertEquals(attNames.size(), names.length);
for (int i = 0; i < names.length; i++) {
assertTrue(attNames.contains(names[i]));
}
}
/**
* Tests the like operator.
*
* @throws IllegalFilterException If the constructed filter is not valid.
*/
public void testLike() throws IllegalFilterException {
PropertyIsLike filter = fac.like(fac.property("testString"), "abc");
assertAttributeName(filter, "testString");
}
/**
* Test the null operator.
*
* @throws IllegalFilterException If the constructed filter is not valid.
*/
public void testNull() throws IllegalFilterException {
PropertyIsNull filter = fac.isNull(fac.property("foo"));
assertAttributeName( filter, new String[]{"foo"} );
}
/**
* Test the between operator.
*
* @throws IllegalFilterException If the constructed filter is not valid.
*/
public void testBetween() throws IllegalFilterException {
// Set up the integer
Literal lower = fac.literal(1001);
Literal upper = fac.literal(1003);
PropertyName pint = fac.property("testInteger");
PropertyName plong = fac.property("testLong");
PropertyName pfloat = fac.property("testFloat");
assertAttributeName(fac.between(lower, lower, upper), new String[0]);
assertAttributeName(fac.between(pint, lower, upper), "testInteger");
assertAttributeName(fac.between(pint, pint, pint), "testInteger");
assertAttributeName(fac.between(pint, plong, pfloat),
new String[] { "testInteger", "testLong", "testFloat" });
}
/**
* Test the geometry operators.
*
* @throws IllegalFilterException If the constructed filter is not valid.
*/
public void testGeometry() throws IllegalFilterException {
Coordinate[] coords = new Coordinate[3];
coords[0] = new Coordinate(1, 2);
coords[1] = new Coordinate(3, 4);
coords[2] = new Coordinate(5, 6);
// Test Equals
PropertyName att = fac.property("testGeometry");
GeometryFactory gf = new GeometryFactory(new PrecisionModel());
Literal geom = fac.literal(gf.createLineString(coords));
Equals filter = fac.equal(att, geom);
assertAttributeName(filter, "testGeometry");
filter = fac.equal(att, att);
assertAttributeName(filter, "testGeometry");
filter = fac.equal(geom, att);
assertAttributeName(filter, "testGeometry");
}
public void testDistanceGeometry() throws Exception {
Coordinate[] coords2 = new Coordinate[5];
coords2[0] = new Coordinate(10, 10);
coords2[1] = new Coordinate(15, 10);
coords2[2] = new Coordinate(15, 15);
coords2[3] = new Coordinate(10, 15);
coords2[4] = new Coordinate(10, 10);
GeometryFactory gf = new GeometryFactory(new PrecisionModel());
Literal right = fac.literal(gf.createPolygon(
gf.createLinearRing(coords2), null));
DWithin filter = fac.dwithin(fac.property("testGeometry"), right, 10, "m");
assertAttributeName(filter, "testGeometry");
}
public void testFid() {
Id filter = fac.id(Collections.singleton(fac.featureId("fakeId")));
assertAttributeName(filter, new String[0]);
}
/**
* Test the logic operators.
*
* @throws IllegalFilterException If the constructed filter is not valid.
*/
public void testLogic() throws IllegalFilterException {
PropertyName testAttribute = fac.property("testString");
// Set up true sub filter
PropertyIsEqualTo filterTrue = fac.equals(testAttribute, fac.literal("test string data"));
// Set up false sub filter
PropertyIsEqualTo filterFalse = fac.equals(testAttribute, fac.literal("incorrect test string data"));
// Test OR for false negatives
Or filter = fac.or(Arrays.asList((org.opengis.filter.Filter) filterFalse,
(org.opengis.filter.Filter) filterTrue));
assertAttributeName(filter, "testString");
}
}