/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.kml.icons; import static org.geotools.filter.text.ecql.ECQL.toExpression; import static org.geotools.filter.text.ecql.ECQL.toFilter; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.geoserver.kml.icons.IconPropertyExtractor; import org.geotools.filter.text.cql2.CQLException; import org.geotools.styling.Graphic; import org.geotools.styling.Mark; import org.geotools.styling.PointSymbolizer; import org.geotools.styling.Rule; import org.geotools.styling.Style; import org.junit.Test; import org.opengis.feature.simple.SimpleFeature; import org.opengis.filter.expression.Expression; public class IconPropertiesTest extends IconTestSupport { @Test public void testSimpleStyleEncodesNoProperties() { final Style simple = styleFromRules(catchAllRule(grayCircle())); assertEquals("0.0.0=", encode(simple, fieldIs1)); } @Test public void testWorkspacedStyleEncodesNoProperties() { final Style simple = styleFromRules(catchAllRule(grayCircle())); assertEquals("0.0.0=", encode("workspace", simple, fieldIs1)); } @Test public void testFilters() throws CQLException { final PointSymbolizer symbolizer = grayCircle(); final Rule a = rule(toFilter("field = 1"), symbolizer); final Rule b = rule(toFilter("field = 2"), symbolizer); Style style = styleFromRules(a, b); assertEquals("0.0.0=", encode(style, fieldIs1)); assertEquals("0.1.0=", encode(style, fieldIs2)); } @Test public void testMultipleSymbolizers() { final PointSymbolizer symbolizer = grayCircle(); final Rule a = catchAllRule(symbolizer, symbolizer); final Style style = styleFromRules(a); assertEquals("0.0.0=&0.0.1=", encode(style, fieldIs1)); } @Test public void testMultipleFeatureTypeStyle() { final PointSymbolizer symbolizer = grayCircle(); final Style s = style( featureTypeStyle(catchAllRule(symbolizer)), featureTypeStyle(catchAllRule(symbolizer))); assertEquals("0.0.0=&1.0.0=", encode(s, fieldIs1)); } @Test public void testElseFilter() throws CQLException { final PointSymbolizer symbolizer = grayCircle(); final Style style = styleFromRules(rule(toFilter("field = 1"), symbolizer), elseRule(symbolizer)); assertEquals("0.0.0=", encode(style, fieldIs1)); assertEquals("0.1.0=", encode(style, fieldIs2)); } @Test public void testDynamicMark() throws CQLException { final PointSymbolizer symbolizer = grayCircle(); final Mark mark = (Mark) symbolizer.getGraphic().graphicalSymbols().get(0); mark.setWellKnownName(toExpression("if_then_else(equalTo(field, 1), 'circle', 'square')")); final Style s = styleFromRules(catchAllRule(symbolizer)); assertEquals("0.0.0=&0.0.0.name=circle", encode(s, fieldIs1)); assertEquals("0.0.0=&0.0.0.name=square", encode(s, fieldIs2)); } @Test public void testDynamicOpacity() throws CQLException { final PointSymbolizer symbolizer = grayCircle(); final Graphic graphic = symbolizer.getGraphic(); graphic.setOpacity(toExpression("1 / field")); final Style s = styleFromRules(catchAllRule(symbolizer)); assertEquals("0.0.0=&0.0.0.opacity=1.0", encode(s, fieldIs1)); assertEquals("0.0.0=&0.0.0.opacity=0.5", encode(s, fieldIs2)); } @Test public void testDynamicRotation() throws CQLException { final PointSymbolizer symbolizer = grayCircle(); final Graphic graphic = symbolizer.getGraphic(); graphic.setRotation(toExpression("45 * field")); final Style s = styleFromRules(catchAllRule(symbolizer)); assertEquals("0.0.0=&0.0.0.rotation=45.0", encode(s, fieldIs1)); assertEquals("0.0.0=&0.0.0.rotation=90.0", encode(s, fieldIs2)); } @Test public void testDynamicSize() throws CQLException { final PointSymbolizer symbolizer = grayCircle(); final Graphic graphic = symbolizer.getGraphic(); graphic.setSize(toExpression("field * 16")); final Style s = styleFromRules(catchAllRule(symbolizer)); assertEquals("0.0.0=&0.0.0.size=16.0", encode(s, fieldIs1)); assertEquals("0.0.0=&0.0.0.size=32.0", encode(s, fieldIs2)); } @Test public void testDynamicURL() throws CQLException, UnsupportedEncodingException { // TODO: This test should overlay two different images final PointSymbolizer symbolizer = externalGraphic("http://example.com/foo${field}.png", "image/png"); final Style style = styleFromRules(catchAllRule(symbolizer, symbolizer)); final String url = URLEncoder.encode("http://example.com/", "UTF-8"); assertEquals("0.0.0=&0.0.0.url=" + url + "foo1.png&0.0.1=&0.0.1.url=" + url + "foo1.png", encode(style, fieldIs1)); assertEquals("0.0.0=&0.0.0.url=" + url + "foo2.png&0.0.1=&0.0.1.url=" + url + "foo2.png", encode(style, fieldIs2)); } @Test public void testPublicURL() throws CQLException { final PointSymbolizer symbolizer = externalGraphic("http://example.com/foo.png", "image/png"); final Style style = styleFromRules(catchAllRule(symbolizer)); assertEquals("http://example.com/foo.png", encode(style, fieldIs1)); } @Test public void testLocalFile() throws Exception { final PointSymbolizer symbolizer = externalGraphic("file:foo.png", "image/png"); final Style style = styleFromRules(catchAllRule(symbolizer)); assertEquals("http://example.com/styles/foo.png", encode(style, fieldIs1)); } @Test public void testLocalFileRotate() throws Exception { final PointSymbolizer symbolizer = externalGraphic("file:foo.png", "image/png"); final Graphic graphic = symbolizer.getGraphic(); graphic.setRotation(toExpression("45 * field")); final Style style = styleFromRules(catchAllRule(symbolizer)); IconProperties prop1 = IconPropertyExtractor.extractProperties(style, fieldIs1); assertEquals("http://example.com/styles/foo.png", prop1.href("http://example.com/", null, "test")); assertEquals(45.0d, prop1.getHeading(), 0.0001); IconProperties prop2 = IconPropertyExtractor.extractProperties(style, fieldIs2); assertEquals("http://example.com/styles/foo.png", prop2.href("http://example.com/", null, "test")); assertEquals(90.0d, prop2.getHeading(), 0.0001); } @Test public void testTwoLocalFilesRotate() throws Exception { final PointSymbolizer symbolizer1 = externalGraphic("file:foo.png", "image/png"); final PointSymbolizer symbolizer2 = externalGraphic("file:bar.png", "image/png"); final Graphic graphic1 = symbolizer1.getGraphic(); graphic1.setRotation(toExpression("45 * field")); final Graphic graphic2 = symbolizer2.getGraphic(); graphic2.setRotation(toExpression("22.5 * field")); final Style style = styleFromRules(catchAllRule(symbolizer1, symbolizer2)); IconProperties prop = IconPropertyExtractor.extractProperties(style, fieldIs1); assertEquals("http://example.com/kml/icon/test?0.0.0=&0.0.0.rotation=45.0&0.0.1=&0.0.1.rotation=22.5", prop.href("http://example.com/", null, "test")); assertEquals(0.0d, prop.getHeading(), 0.0001); } @Test public void testTwoLocalFilesOneRotate() throws Exception { final PointSymbolizer symbolizer1 = externalGraphic("file:foo.png", "image/png"); final PointSymbolizer symbolizer2 = externalGraphic("file:bar.png", "image/png"); final Graphic graphic1 = symbolizer1.getGraphic(); graphic1.setRotation(toExpression("45 * field")); final Graphic graphic2 = symbolizer2.getGraphic(); graphic2.setRotation(Expression.NIL); final Style style = styleFromRules(catchAllRule(symbolizer1, symbolizer2)); IconProperties prop = IconPropertyExtractor.extractProperties(style, fieldIs1); assertEquals("http://example.com/kml/icon/test?0.0.0=&0.0.0.rotation=45.0&0.0.1=", prop.href("http://example.com/", null, "test")); assertNull(prop.getHeading()); } @Test public void testMarkRotate() throws Exception { final PointSymbolizer symbolizer = grayCircle(); final Graphic graphic = symbolizer.getGraphic(); graphic.setRotation(toExpression("45 * field")); final Style s = styleFromRules(catchAllRule(symbolizer)); IconProperties prop = IconPropertyExtractor.extractProperties(s, fieldIs1); assertEquals("http://example.com/kml/icon/test?0.0.0=&0.0.0.rotation=45.0", prop.href("http://example.com/", null, "test")); assertEquals(0.0d, prop.getHeading(), 0.0001); } protected String encode(Style style, SimpleFeature feature) { return IconPropertyExtractor.extractProperties(style, feature) .href("http://example.com/", null, "test") .replace("http://example.com/kml/icon/test?", ""); } protected String encode(String workspace, Style style, SimpleFeature feature) { return IconPropertyExtractor.extractProperties(style, feature) .href("http://example.com/", workspace, "test") .replace("http://example.com/kml/icon/"+workspace+"/test?", ""); } }