/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2005-2015, 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.styling.visitor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.awt.Color; import java.util.Arrays; import javax.measure.unit.SI; import org.geotools.factory.CommonFactoryFinder; import org.geotools.filter.IllegalFilterException; import org.geotools.styling.AnchorPoint; import org.geotools.styling.FeatureTypeStyle; import org.geotools.styling.Fill; import org.geotools.styling.Font; import org.geotools.styling.Graphic; import org.geotools.styling.LineSymbolizer; import org.geotools.styling.Mark; import org.geotools.styling.PolygonSymbolizer; import org.geotools.styling.RasterSymbolizer; import org.geotools.styling.Rule; import org.geotools.styling.Stroke; import org.geotools.styling.Style; import org.geotools.styling.StyleBuilder; import org.geotools.styling.StyleFactory; import org.geotools.styling.Symbolizer; import org.geotools.styling.TextSymbolizer; import org.junit.Before; import org.junit.Test; import org.opengis.filter.FilterFactory2; import org.opengis.filter.expression.Expression; /** * Unit test for RescaleStyleVisitor. * * @author Jody Garnett (Refractions Research Inc) * * * @source $URL$ */ public class RescaleStyleVisitorTest { StyleBuilder sb; StyleFactory sf; FilterFactory2 ff; RescaleStyleVisitor visitor; double scale; @Before public void setUp() throws Exception { sf = CommonFactoryFinder.getStyleFactory(null); ff = CommonFactoryFinder.getFilterFactory2(null); sb = new StyleBuilder(sf, ff); scale = 2.0; visitor = new RescaleStyleVisitor( scale ); } @Test public void testStyleDuplication() throws IllegalFilterException { //create a style Style oldStyle = sb.createStyle("FTSName", sf.createPolygonSymbolizer()); oldStyle.getFeatureTypeStyles()[0].setSemanticTypeIdentifiers(new String[] {"simple", "generic:geometry"}); //duplicate it oldStyle.accept(visitor); Style newStyle = (Style) visitor.getCopy(); //compare it assertNotNull(newStyle); } @Test public void testStyle() throws Exception { FeatureTypeStyle fts = sf.createFeatureTypeStyle(); fts.setFeatureTypeName("feature-type-1"); FeatureTypeStyle fts2 = fts2(); Style style = sf.getDefaultStyle(); style.addFeatureTypeStyle(fts); style.addFeatureTypeStyle(fts2); style.accept( visitor ); Style copy = (Style) visitor.getCopy(); Style notEq = sf.getDefaultStyle(); fts2 = fts2(); notEq.addFeatureTypeStyle(fts2); } private FeatureTypeStyle fts2() { FeatureTypeStyle fts2 = sf.createFeatureTypeStyle(); Rule rule = sf.createRule(); fts2.addRule(rule); fts2.setFeatureTypeName("feature-type-2"); return fts2; } @Test public void testRule() throws Exception { Symbolizer symb1 = sf.createLineSymbolizer(sf .getDefaultStroke(), "geometry"); Symbolizer symb2 = sf.createPolygonSymbolizer(sf .getDefaultStroke(), sf.getDefaultFill(), "shape"); RasterSymbolizer symb3 = sf.createRasterSymbolizer(); Rule rule = sf.createRule(); rule.setSymbolizers(new Symbolizer[] { symb1, symb2, symb3 }); rule.accept(visitor); Rule clone = (Rule) visitor.getCopy(); assertNotNull( clone ); } @Test public void testStroke() throws Exception { Stroke original = sb.createStroke(Color.RED, 2, new float[] {5, 10}); original.accept(visitor); Stroke clone = (Stroke) visitor.getCopy(); assertEquals(4.0d, clone.getWidth().evaluate(null, Double.class), 0d); assertEquals(10.0f, clone.getDashArray()[0], 0d); assertEquals(20.0f, clone.getDashArray()[1], 0d); } @Test public void testDynamicStroke() throws Exception { Stroke original = sb.createStroke(Color.RED, 2); original.setDashArray(Arrays.asList((Expression)ff.literal("5 10"))); original.accept(visitor); Stroke clone = (Stroke) visitor.getCopy(); assertEquals(4.0d, Double.valueOf((String)clone.getWidth().evaluate(null)), 0.001); assertNotNull(original.dashArray()); assertEquals(1, original.dashArray().size()); assertEquals("10.0 20.0", ((Expression) clone.dashArray().get(0)).evaluate(null)); } @Test public void testTextSymbolizer() throws Exception { TextSymbolizer ts = sb.createTextSymbolizer(Color.BLACK, (Font) null, "label"); ts.getOptions().put(TextSymbolizer.MAX_DISPLACEMENT_KEY, "10"); ts.getOptions().put(TextSymbolizer.GRAPHIC_MARGIN_KEY, "10 20"); ts.accept(visitor); TextSymbolizer clone = (TextSymbolizer) visitor.getCopy(); assertEquals("20", clone.getOptions().get(TextSymbolizer.MAX_DISPLACEMENT_KEY)); assertEquals("20 40", clone.getOptions().get(TextSymbolizer.GRAPHIC_MARGIN_KEY)); } @Test public void testTextSymbolizerArraySingleValue() throws Exception { TextSymbolizer ts = sb.createTextSymbolizer(Color.BLACK, (Font) null, "label"); ts.getOptions().put(TextSymbolizer.GRAPHIC_MARGIN_KEY, "10"); ts.accept(visitor); TextSymbolizer clone = (TextSymbolizer) visitor.getCopy(); assertEquals("20", clone.getOptions().get(TextSymbolizer.GRAPHIC_MARGIN_KEY)); } @Test public void testRescaleGraphicFillStrokes() { // create a graphic that needs rescaling StyleBuilder sb = new StyleBuilder(); // a graphic stroke Stroke stroke = sb.createStroke(); stroke.setColor(null); Graphic graphic = sb.createGraphic(null, sb.createMark("square", null, sb.createStroke(1)), null); double expectedAnchorPointX = 0.25; double expectedAnchorPointY = 0.75; graphic.setAnchorPoint(sb.createAnchorPoint(expectedAnchorPointX, expectedAnchorPointY)); stroke.setGraphicStroke(graphic); // a graphic fill Fill fill = sb.createFill(); fill.setColor(null); fill.setGraphicFill(sb.createGraphic(null, sb.createMark("square", null, sb.createStroke(2)), null)); // a polygon and line symbolizer using them PolygonSymbolizer ps = sb.createPolygonSymbolizer(stroke, fill); // rescale it ps.accept(visitor); PolygonSymbolizer rps = (PolygonSymbolizer) visitor.getCopy(); Mark rm = (Mark) rps.getStroke().getGraphicStroke().graphicalSymbols().get(0); assertEquals(2.0, rm.getStroke().getWidth().evaluate(null, Double.class), 0d); rm = (Mark) rps.getFill().getGraphicFill().graphicalSymbols().get(0); assertEquals(4.0, rm.getStroke().getWidth().evaluate(null, Double.class), 0d); AnchorPoint actualAnchorPoint = rps.getStroke().getGraphicStroke().getAnchorPoint(); assertNotNull(actualAnchorPoint); assertEquals(expectedAnchorPointX, actualAnchorPoint.getAnchorPointX().evaluate(null, Double.class), 0d); assertEquals(expectedAnchorPointY, actualAnchorPoint.getAnchorPointY().evaluate(null, Double.class), 0d); // a line symbolizer that uses a graphic stroke LineSymbolizer ls = sb.createLineSymbolizer(stroke); // rescale it ls.accept(visitor); LineSymbolizer lps = (LineSymbolizer) visitor.getCopy(); rm = (Mark) lps.getStroke().getGraphicStroke().graphicalSymbols().get(0); assertEquals(2.0, rm.getStroke().getWidth().evaluate(null, Double.class), 0d); } @Test public void testRescaleLocalUOM() throws Exception { Stroke original = sb.createStroke(Color.RED, 2, new float[] {5, 10}); original.setWidth(ff.literal("2m")); original.accept(visitor); Stroke clone = (Stroke) visitor.getCopy(); assertEquals("4m", clone.getWidth().evaluate(null, String.class)); } @Test public void testRescaleLocalPixelInMetersSymbolizer() throws Exception { Stroke stroke = sb.createStroke(Color.RED, 2, new float[] {5, 10}); stroke.setWidth(ff.literal("2px")); LineSymbolizer ls = sb.createLineSymbolizer(stroke); ls.setUnitOfMeasure(SI.METER); ls.accept(visitor); LineSymbolizer clone = (LineSymbolizer) visitor.getCopy(); assertEquals("4px", clone.getStroke().getWidth().evaluate(null, String.class)); } @Test public void testRescaleLocalPixelInPixelSymbolizer() throws Exception { Stroke stroke = sb.createStroke(Color.RED, 2, new float[] {5, 10}); stroke.setWidth(ff.literal("2px")); LineSymbolizer ls = sb.createLineSymbolizer(stroke); ls.accept(visitor); LineSymbolizer clone = (LineSymbolizer) visitor.getCopy(); assertEquals("4", clone.getStroke().getWidth().evaluate(null, String.class)); } @Test public void testRescalePerpendicularOffset() throws Exception { Stroke stroke = sb.createStroke(Color.RED, 2, new float[] {5, 10}); LineSymbolizer ls = sb.createLineSymbolizer(stroke); ls.setPerpendicularOffset(ff.literal(2)); ls.accept(visitor); LineSymbolizer clone = (LineSymbolizer) visitor.getCopy(); assertEquals("4", clone.getPerpendicularOffset().evaluate(null, String.class)); } }