/* (c) 2015 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wms.utfgrid; import static org.hamcrest.CoreMatchers.instanceOf; import static org.junit.Assert.*; import java.awt.Color; import java.util.Map; import org.geotools.renderer.composite.BlendComposite.BlendingMode; import org.geotools.styling.FeatureTypeStyle; import org.geotools.styling.Fill; import org.geotools.styling.Graphic; import org.geotools.styling.LineSymbolizer; import org.geotools.styling.PolygonSymbolizer; import org.geotools.styling.Stroke; import org.geotools.styling.Style; import org.geotools.styling.StyleBuilder; import org.junit.Before; import org.junit.Test; import org.opengis.filter.FilterFactory2; import org.opengis.filter.expression.Function; public class UTFGridStyleVisitorTest { UTFGridStyleVisitor visitor; StyleBuilder sb = new StyleBuilder(); FilterFactory2 ff = sb.getFilterFactory(); private UTFGridColorFunction colorFunction; @Before public void setupVisitor() { UTFGridEntries entries = new UTFGridEntries(); colorFunction = new UTFGridColorFunction(entries); visitor = new UTFGridStyleVisitor(colorFunction); } @Test public void testOnlyTextSymbolizer() { Style style = sb.createStyle(sb.createTextSymbolizer(Color.BLACK, sb.createFont("Serif", 12), "name")); style.accept(visitor); Style copy = (Style) visitor.getCopy(); assertEquals(0, copy.featureTypeStyles().size()); } @Test public void testFill() { PolygonSymbolizer polygonSymbolizer = sb.createPolygonSymbolizer(Color.BLACK, Color.BLACK, 3); polygonSymbolizer.getFill().setOpacity(ff.literal(0.5)); polygonSymbolizer.getStroke().setOpacity(ff.literal(0.5)); Style style = sb.createStyle(polygonSymbolizer); style.accept(visitor); Style copy = (Style) visitor.getCopy(); PolygonSymbolizer ls = (PolygonSymbolizer) copy.featureTypeStyles().get(0).rules().get(0).symbolizers().get(0); Stroke stroke = ls.getStroke(); assertEquals(colorFunction, stroke.getColor()); assertEquals(Integer.valueOf(3), stroke.getWidth().evaluate(null, Integer.class)); assertNull(stroke.dashArray()); assertEquals(Integer.valueOf(1), stroke.getOpacity().evaluate(null, Integer.class)); Fill fill = ls.getFill(); assertEquals(colorFunction, fill.getColor()); assertEquals(Integer.valueOf(1), fill.getOpacity().evaluate(null, Integer.class)); } @Test public void testGraphicStrokeFill() { Graphic graphic = sb.createGraphic(null, sb.createMark("square"), null); graphic.setSize(ff.literal(8)); Stroke stroke = sb.createStroke(); stroke.setGraphicStroke(graphic); stroke.setOpacity(ff.literal(0.5)); Fill fill = sb.createFill(null, null, 0.5, graphic); PolygonSymbolizer polygonSymbolizer = sb.createPolygonSymbolizer(stroke, fill); Style style = sb.createStyle(polygonSymbolizer); style.accept(visitor); Style copy = (Style) visitor.getCopy(); PolygonSymbolizer ls = (PolygonSymbolizer) copy.featureTypeStyles().get(0).rules().get(0).symbolizers().get(0); Stroke strokeCopy = ls.getStroke(); assertEquals(colorFunction, strokeCopy.getColor()); assertEquals(Integer.valueOf(8), strokeCopy.getWidth().evaluate(null, Integer.class)); assertNull(strokeCopy.dashArray()); assertEquals(Integer.valueOf(1), strokeCopy.getOpacity().evaluate(null, Integer.class)); Fill fillCopy = ls.getFill(); assertEquals(colorFunction, fillCopy.getColor()); assertEquals(Integer.valueOf(1), fillCopy.getOpacity().evaluate(null, Integer.class)); } @Test public void testLine() { Style style = sb.createStyle(sb.createLineSymbolizer(sb.createStroke(Color.BLACK, 3))); style.accept(visitor); Style copy = (Style) visitor.getCopy(); LineSymbolizer ls = (LineSymbolizer) copy.featureTypeStyles().get(0).rules().get(0).symbolizers().get(0); Stroke stroke = ls.getStroke(); assertEquals(colorFunction, stroke.getColor()); assertEquals(Integer.valueOf(3), stroke.getWidth().evaluate(null, Integer.class)); assertNull(stroke.dashArray()); } @Test public void testStrokedLine() { Style style = sb.createStyle(sb.createLineSymbolizer(sb.createStroke(Color.BLACK, 1, new float[] {8, 8}))); style.accept(visitor); Style copy = (Style) visitor.getCopy(); LineSymbolizer ls = (LineSymbolizer) copy.featureTypeStyles().get(0).rules().get(0).symbolizers().get(0); Stroke stroke = ls.getStroke(); assertEquals(colorFunction, stroke.getColor()); assertEquals(Integer.valueOf(1), stroke.getWidth().evaluate(null, Integer.class)); assertEquals(0, stroke.dashArray().size()); } @Test public void testGraphicStroke() { Graphic graphic = sb.createGraphic(null, sb.createMark("square"), null); graphic.setSize(ff.literal(8)); Stroke stroke = sb.createStroke(); stroke.setGraphicStroke(graphic); Style style = sb.createStyle(sb.createLineSymbolizer(stroke)); style.accept(visitor); Style copy = (Style) visitor.getCopy(); LineSymbolizer ls = (LineSymbolizer) copy.featureTypeStyles().get(0).rules().get(0).symbolizers().get(0); stroke = ls.getStroke(); assertEquals(colorFunction, stroke.getColor()); assertEquals(Integer.valueOf(8), stroke.getWidth().evaluate(null, Integer.class)); assertNull(stroke.dashArray()); } /** * Blending alters colors (which are ids for UTFGrid), remove it */ @Test public void testBlendingRemoval() { FeatureTypeStyle fts = sb.createFeatureTypeStyle(sb.createLineSymbolizer()); fts.getOptions().put(FeatureTypeStyle.COMPOSITE, BlendingMode.MULTIPLY.getName()); fts.getOptions().put(FeatureTypeStyle.COMPOSITE_BASE, "true"); Style style = sb.createStyle(); style.featureTypeStyles().add(fts); style.accept(visitor); Style copy = (Style) visitor.getCopy(); Map<String, String> options = copy.featureTypeStyles().get(0).getOptions(); assertNull(options.get(FeatureTypeStyle.COMPOSITE)); assertNull(options.get(FeatureTypeStyle.COMPOSITE_BASE)); } /** * Alpha composite does not alter colors (which are ids for UTFGrid), we can preserve it */ @Test public void testAlphaCompositePreserved() { FeatureTypeStyle fts = sb.createFeatureTypeStyle(sb.createLineSymbolizer()); fts.getOptions().put(FeatureTypeStyle.COMPOSITE, "source-over"); fts.getOptions().put(FeatureTypeStyle.COMPOSITE_BASE, "true"); Style style = sb.createStyle(); style.featureTypeStyles().add(fts); style.accept(visitor); Style copy = (Style) visitor.getCopy(); Map<String, String> options = copy.featureTypeStyles().get(0).getOptions(); assertEquals("source-over", options.get(FeatureTypeStyle.COMPOSITE)); assertEquals("true", options.get(FeatureTypeStyle.COMPOSITE_BASE)); } @Test public void testRasterToVectorTransform() { FeatureTypeStyle fts = sb.createFeatureTypeStyle(sb.createLineSymbolizer()); Function data = ff.function("parameter", ff.literal("data")); Function levels = ff.function("parameter", ff.literal("levels"), ff.literal("1100"), ff.literal("1200")); Function tx = ff.function("ras:Contour", data, levels); fts.setTransformation(tx); fts.getOptions().put(FeatureTypeStyle.COMPOSITE_BASE, "true"); Style style = sb.createStyle(); style.featureTypeStyles().add(fts); style.accept(visitor); Style copy = (Style) visitor.getCopy(); assertTrue(visitor.hasTransformations()); assertTrue(visitor.hasVectorTransformations()); assertThat(copy.featureTypeStyles().get(0).getTransformation(), instanceOf(Function.class)); Function txCopy = (Function) copy.featureTypeStyles().get(0).getTransformation(); assertEquals("ras:Contour", txCopy.getName()); } @Test public void testVectorToRasterTransform() { FeatureTypeStyle fts = sb.createFeatureTypeStyle(sb.createLineSymbolizer()); Function data = ff.function("parameter", ff.literal("data")); Function tx = ff.function("vec:Heatmap", data); fts.setTransformation(tx); fts.getOptions().put(FeatureTypeStyle.COMPOSITE_BASE, "true"); Style style = sb.createStyle(); style.featureTypeStyles().add(fts); style.accept(visitor); Style copy = (Style) visitor.getCopy(); assertTrue(visitor.hasTransformations()); assertFalse(visitor.hasVectorTransformations()); assertEquals(0, copy.featureTypeStyles().size()); } }