package org.geotools.styling; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.Set; import org.geotools.factory.CommonFactoryFinder; import org.geotools.filter.function.EnvFunction; import org.junit.Test; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory; import org.opengis.filter.PropertyIsEqualTo; import org.opengis.filter.expression.Expression; import org.opengis.filter.expression.Function; import org.opengis.filter.expression.PropertyName; public class StyleAttributeExtractorTest { FilterFactory ff = CommonFactoryFinder.getFilterFactory(null); StyleBuilder sb = new StyleBuilder(ff); @Test public void testPlainFilter() { Filter f = ff.greater(ff.property("attribute"), ff.literal(10)); Rule r = sb.createRule(sb.createPointSymbolizer()); r.setFilter(f); StyleAttributeExtractor extractor = new StyleAttributeExtractor(); r.accept(extractor); Set<String> atts = extractor.getAttributeNameSet(); assertTrue(atts.contains("attribute")); assertEquals(1, atts.size()); assertTrue(extractor.getDefaultGeometryUsed()); } @Test public void testGeometryTransformation() { PointSymbolizer ps = sb.createPointSymbolizer(); ps.setGeometry(ff.function("offset", ff.property("the_geom"), ff.property("offx"), ff.property("offy"))); Rule r = sb.createRule(ps); StyleAttributeExtractor extractor = new StyleAttributeExtractor(); r.accept(extractor); Set<String> atts = extractor.getAttributeNameSet(); assertEquals(3, atts.size()); assertTrue(atts.contains("the_geom")); assertTrue(atts.contains("offx")); assertTrue(atts.contains("offy")); assertFalse(extractor.getDefaultGeometryUsed()); } @Test public void testPropertyFucntion() { PointSymbolizer ps = sb.createPointSymbolizer(); ps.setGeometry(ff.function("offset", ff.property("the_geom"), ff.property("offx"), ff.property("offy"))); Function func = ff.function("property", ff.function("env", ff.literal("pname"))); PropertyIsEqualTo filter = ff.equals(func, ff.literal("test")); Rule r = sb.createRule(ps); r.setFilter(filter); try { EnvFunction.setLocalValue("pname", "name"); StyleAttributeExtractor extractor = new StyleAttributeExtractor(); r.accept(extractor); // check the plain names Set<String> atts = extractor.getAttributeNameSet(); assertEquals(4, atts.size()); assertTrue(atts.contains("the_geom")); assertTrue(atts.contains("offx")); assertTrue(atts.contains("offy")); assertTrue(atts.contains("name")); assertFalse(extractor.getDefaultGeometryUsed()); // checks also the property names, see they are consistent Set<PropertyName> propNames = extractor.getAttributes(); assertNotNull(propNames); assertEquals(atts.size(), propNames.size()); for (PropertyName pn : propNames) { assertTrue(atts.contains(pn.getPropertyName())); } } finally { EnvFunction.clearLocalValues(); } } public void testGraphicAnchor() { Graphic g = sb.createGraphic(); g.setAnchorPoint(sb.createAnchorPoint(ff.property("ax"), ff.property("ay"))); StyleAttributeExtractor extractor = new StyleAttributeExtractor(); g.accept(extractor); // check the plain names Set<String> atts = extractor.getAttributeNameSet(); assertEquals(2, atts.size()); assertTrue(atts.contains("ax")); assertTrue(atts.contains("ay")); } @Test public void testLineSymbolizer() { // Try with property Expression expression = ff.property("attribute"); LineSymbolizer lineSymbolizer = sb.createLineSymbolizer(); lineSymbolizer.setPerpendicularOffset(expression); Rule r = sb.createRule(lineSymbolizer); StyleAttributeExtractor extractor = new StyleAttributeExtractor(); r.accept(extractor); Set<String> atts = extractor.getAttributeNameSet(); assertTrue(atts.contains("attribute")); assertEquals(1, atts.size()); // Try without property but with a literal value lineSymbolizer.setPerpendicularOffset(ff.literal(34.12)); extractor = new StyleAttributeExtractor(); r.accept(extractor); atts = extractor.getAttributeNameSet(); assertEquals(0, atts.size()); } }