/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2005-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.styling.visitor; import java.awt.Color; import java.net.URL; import java.util.Collections; import javax.xml.transform.TransformerException; import junit.framework.TestCase; import org.geotools.factory.CommonFactoryFinder; import org.geotools.filter.IllegalFilterException; import org.geotools.styling.AnchorPoint; import org.geotools.styling.ColorMapEntry; import org.geotools.styling.ContrastEnhancement; import org.geotools.styling.Displacement; import org.geotools.styling.ExternalGraphic; import org.geotools.styling.FeatureTypeConstraint; import org.geotools.styling.FeatureTypeStyle; import org.geotools.styling.Fill; import org.geotools.styling.Font; import org.geotools.styling.Graphic; import org.geotools.styling.GraphicImpl; import org.geotools.styling.Halo; import org.geotools.styling.LabelPlacement; import org.geotools.styling.LinePlacement; import org.geotools.styling.LineSymbolizer; import org.geotools.styling.Mark; import org.geotools.styling.OtherTextImpl; import org.geotools.styling.PointPlacement; import org.geotools.styling.PointSymbolizer; import org.geotools.styling.PolygonSymbolizer; import org.geotools.styling.RasterSymbolizer; import org.geotools.styling.Rule; import org.geotools.styling.SLDTransformer; import org.geotools.styling.Stroke; import org.geotools.styling.Style; import org.geotools.styling.StyleBuilder; import org.geotools.styling.StyleFactory; import org.geotools.styling.StyledLayerDescriptor; import org.geotools.styling.Symbolizer; import org.geotools.styling.TextSymbolizer; import org.geotools.styling.TextSymbolizer2; import org.geotools.styling.UomOgcMapping; import org.geotools.styling.UserLayer; import org.geotools.util.Utilities; import org.opengis.filter.FilterFactory2; import org.opengis.filter.expression.Expression; import org.opengis.filter.expression.Function; import org.opengis.filter.expression.Literal; import org.opengis.style.ContrastMethod; import org.opengis.util.Cloneable; /** * Unit test for DuplicatorStyleVisitor. * * @author Cory Horner, Refractions Research Inc. * * @source $URL$ */ public class DuplicatorStyleVisitorTest extends TestCase { StyleBuilder sb; StyleFactory sf; FilterFactory2 ff; DuplicatingStyleVisitor visitor; public DuplicatorStyleVisitorTest(String testName) { super(testName); } protected void setUp() throws Exception { sf = CommonFactoryFinder.getStyleFactory(null); ff = CommonFactoryFinder.getFilterFactory2(null); sb = new StyleBuilder(sf, ff); visitor = new DuplicatingStyleVisitor( sf, ff ); } public void testRasterSymbolizerDuplication() { // create a default RasterSymbolizer RasterSymbolizer original = sb.createRasterSymbolizer(); // duplicate it original.accept(visitor); RasterSymbolizer copy = (RasterSymbolizer) visitor.getCopy(); // compare it assertNotNull(copy); assertEquals(original, copy); } 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); assertEquals(2, newStyle.getFeatureTypeStyles()[0].getSemanticTypeIdentifiers().length); //TODO: actually compare it assertTrue(areStylesEqualByXml(oldStyle, newStyle)); } /** * Produces an XML representation of a Style. * @param style * @return * @throws TransformerException */ private String styleToXML(final Style style) throws TransformerException { StyledLayerDescriptor sld = sf.createStyledLayerDescriptor(); UserLayer layer = sf.createUserLayer(); layer.setLayerFeatureConstraints(new FeatureTypeConstraint[]{null}); sld.addStyledLayer(layer); layer.addUserStyle(style); SLDTransformer styleTransform = new SLDTransformer(); String xml = styleTransform.transform(sld); return xml; } /** * Returns whether two Styles have equal XML representations. * @param s1 * @param s2 * @return */ private boolean areStylesEqualByXml(final Style s1, final Style s2) { try { String xmlS1 = styleToXML(s1); String xmlS2 = styleToXML(s2); return xmlS1.equals(xmlS2); } catch (TransformerException te) { te.printStackTrace(); return false; } } 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(); //assertClone(style, clone); assertEqualsContract( style, copy ); Style notEq = sf.getDefaultStyle(); fts2 = fts2(); notEq.addFeatureTypeStyle(fts2); assertEqualsContract(copy, notEq, style); } private FeatureTypeStyle fts2() { FeatureTypeStyle fts2 = sf.createFeatureTypeStyle(); Rule rule = sf.createRule(); fts2.addRule(rule); fts2.setFeatureTypeName("feature-type-2"); return fts2; } public void testFeatureTypeStyle() throws Exception { FeatureTypeStyle fts = sf.createFeatureTypeStyle(); fts.setFeatureTypeName("feature-type"); Rule rule1; rule1 = sf.createRule(); rule1.setName("rule1"); rule1.setFilter(ff.id(Collections.singleton(ff.featureId("FID")))); Rule rule2 = sf.createRule(); rule2.setIsElseFilter(true); rule2.setName("rule2"); fts.addRule(rule1); fts.addRule(rule2); fts.accept( visitor ); FeatureTypeStyle clone = (FeatureTypeStyle) visitor.getCopy(); //assertClone(fts, clone); assertEqualsContract( fts, clone ); rule1 = sf.createRule(); rule1.setName("rule1"); rule1.setFilter(ff.id(Collections.singleton(ff.featureId("FID")))); FeatureTypeStyle notEq = sf.createFeatureTypeStyle(); notEq.setName("fts-not-equal"); notEq.addRule(rule1); assertEqualsContract(clone, notEq, fts); } public void testRule() throws Exception { Symbolizer symb1 = sf.createLineSymbolizer(sf .getDefaultStroke(), "geometry"); Symbolizer symb2 = sf.createPolygonSymbolizer(sf .getDefaultStroke(), sf.getDefaultFill(), "shape"); Rule rule = sf.createRule(); rule.setSymbolizers(new Symbolizer[] { symb1, symb2 }); rule.accept(visitor); Rule clone = (Rule) visitor.getCopy(); assertCopy(rule, clone); assertEqualsContract(rule, clone); symb2 = sf.createPolygonSymbolizer(sf .getDefaultStroke(), sf.getDefaultFill(), "shape"); Rule notEq = sf.createRule(); notEq.setSymbolizers(new Symbolizer[] { symb2 }); assertEqualsContract(clone, notEq, rule); symb1 = sf.createLineSymbolizer(sf.getDefaultStroke(), "geometry"); clone.setSymbolizers(new Symbolizer[] { symb1 }); assertTrue(!rule.equals(clone)); } public void testPointSymbolizer() throws Exception { URL urlExternal = getClass().getResource("/data/sld/blob.gif"); ExternalGraphic extg = sb.createExternalGraphic(urlExternal, "image/svg+xml"); Graphic graphic = sb.createGraphic(extg, null, null); PointSymbolizer pointSymb = sb.createPointSymbolizer(graphic); pointSymb.accept(visitor); PointSymbolizer clone = (PointSymbolizer) visitor.getCopy(); assertCopy(pointSymb, clone); assertEqualsContract(pointSymb, clone); PointSymbolizer notEq = sf.getDefaultPointSymbolizer(); notEq.setGeometryPropertyName("something_else"); assertEqualsContract(clone, notEq, pointSymb); } public void testRasterSymbolizerWithUOM() throws Exception { RasterSymbolizer rasterSymb = sf.createRasterSymbolizer(); rasterSymb.setUnitOfMeasure(UomOgcMapping.FOOT.getUnit()); rasterSymb.accept(visitor); RasterSymbolizer clone = (RasterSymbolizer) visitor.getCopy(); assertEquals(clone.getUnitOfMeasure(), rasterSymb.getUnitOfMeasure()); RasterSymbolizer notEq = sf.createRasterSymbolizer(); assertFalse(Utilities.equals(notEq.getUnitOfMeasure(), rasterSymb.getUnitOfMeasure())); } public void testPointSymbolizerWithUOM() throws Exception { PointSymbolizer pointSymb = sf.createPointSymbolizer(); pointSymb.setUnitOfMeasure(UomOgcMapping.FOOT.getUnit()); pointSymb.accept(visitor); PointSymbolizer clone = (PointSymbolizer) visitor.getCopy(); assertCopy(pointSymb, clone); assertEqualsContract(pointSymb, clone); PointSymbolizer notEq = sf.getDefaultPointSymbolizer(); assertEqualsContract(clone, notEq, pointSymb); } public void testTextSymbolizer() { TextSymbolizer textSymb = sf.createTextSymbolizer(); Expression offset = ff.literal(10); textSymb.setLabelPlacement(sf.createLinePlacement(offset)); textSymb.accept(visitor); TextSymbolizer clone = (TextSymbolizer) visitor.getCopy(); assertCopy(textSymb, clone); assertEqualsContract(textSymb, clone); TextSymbolizer notEq = sf.getDefaultTextSymbolizer(); Expression ancX = ff.literal(10); Expression ancY = ff.literal(10); AnchorPoint ancPoint = sf.createAnchorPoint(ancX, ancY); LabelPlacement placement = sf.createPointPlacement(ancPoint, null, null); notEq.setLabelPlacement(placement); assertEqualsContract(clone, notEq, textSymb); } public void testTextSymbolizerVendorParams() { TextSymbolizer textSymb = sf.createTextSymbolizer(); textSymb.getOptions().put("autoWrap", "100"); textSymb.accept(visitor); TextSymbolizer clone = (TextSymbolizer) visitor.getCopy(); assertCopy(textSymb, clone); assertEqualsContract(textSymb, clone); assertEquals(1, clone.getOptions().size()); assertEquals("100", clone.getOptions().get("autoWrap")); } public void testTextSymbolizerVendorOptions() { TextSymbolizer textSymb = sf.createTextSymbolizer(); textSymb.getOptions().put("autoWrap", "100"); textSymb.accept(visitor); TextSymbolizer clone = (TextSymbolizer) visitor.getCopy(); assertCopy(textSymb, clone); assertEqualsContract(textSymb, clone); } public void testTextSymbolizerWithUOM() { TextSymbolizer textSymb = sf.createTextSymbolizer(); textSymb.setUnitOfMeasure(UomOgcMapping.METRE.getUnit()); Expression offset = ff.literal(10); textSymb.setLabelPlacement(sf.createLinePlacement(offset)); textSymb.accept(visitor); TextSymbolizer clone = (TextSymbolizer) visitor.getCopy(); assertCopy(textSymb, clone); assertEqualsContract(textSymb, clone); TextSymbolizer notEq = sf.getDefaultTextSymbolizer(); Expression ancX = ff.literal(10); Expression ancY = ff.literal(10); AnchorPoint ancPoint = sf.createAnchorPoint(ancX, ancY); LabelPlacement placement = sf.createPointPlacement(ancPoint, null, null); notEq.setLabelPlacement(placement); assertEqualsContract(clone, notEq, textSymb); } public void testFont() { Font font = sf.getDefaultFont(); Font clone = visitor.copy(font); assertCopy(font, clone); assertEqualsContract(font, clone); Font other = sf.createFont(ff.literal("other"), ff.literal("normal"), ff.literal("BOLD"), ff.literal(12)); assertEqualsContract(clone, other, font); } public void testHalo() { Halo halo = sf.createHalo(sf.getDefaultFill(), ff.literal(10)); halo.accept(visitor); Halo clone = (Halo) visitor.getCopy(); assertCopy(halo, clone); Halo other = sf.createHalo(sf.getDefaultFill(), ff.literal(12)); assertEqualsContract(clone, other, halo); } public void testLinePlacement() throws Exception { LinePlacement linePlacement = sf.createLinePlacement(ff.literal(12)); linePlacement.accept(visitor); LinePlacement clone = (LinePlacement) visitor.getCopy();; assertCopy(linePlacement, clone); LinePlacement other = sf.createLinePlacement(ff.property("NAME")); assertEqualsContract(clone, other, linePlacement); } public void testAnchorPoint() { AnchorPoint anchorPoint = sf.createAnchorPoint(ff.literal(1), ff.literal(2)); anchorPoint.accept(visitor); AnchorPoint clone = (AnchorPoint) visitor.getCopy(); assertCopy(anchorPoint, clone); AnchorPoint other = sf.createAnchorPoint(ff.literal(3), ff .literal(4)); assertEqualsContract(clone, other, anchorPoint); } public void testDisplacement() { Displacement displacement = sf.createDisplacement(ff.literal(1), ff.literal(2)); displacement.accept(visitor); Displacement clone = (Displacement) visitor.getCopy(); assertCopy(displacement, clone); Displacement other = sf.createDisplacement(ff.literal(3), ff.literal(4)); assertEqualsContract(clone, other, displacement); } public void testPointPlacement() { PointPlacement pointPl = sf.getDefaultPointPlacement(); PointPlacement clone = (PointPlacement) visitor.copy( pointPl ); assertCopy(pointPl, clone); PointPlacement other = (PointPlacement) ((Cloneable) pointPl).clone(); other.setRotation(ff.literal(274.0)); assertEqualsContract(clone, other, pointPl); } public void testPolygonSymbolizer() { try { //visitor.setStrict(true); PolygonSymbolizer polygonSymb = sf.createPolygonSymbolizer(); PolygonSymbolizer clone = (PolygonSymbolizer) visitor .copy(polygonSymb); assertCopy(polygonSymb, clone); PolygonSymbolizer notEq = sf.getDefaultPolygonSymbolizer(); notEq.setGeometryPropertyName("something_else"); assertEqualsContract(clone, notEq, polygonSymb); } finally { visitor.setStrict(false); } } public void testPolygonSymbolizerWithUOM() { try { //visitor.setStrict(true); PolygonSymbolizer polygonSymb = sf.createPolygonSymbolizer(); polygonSymb.setUnitOfMeasure(UomOgcMapping.FOOT.getUnit()); PolygonSymbolizer clone = (PolygonSymbolizer) visitor .copy(polygonSymb); assertCopy(polygonSymb, clone); PolygonSymbolizer notEq = sf.getDefaultPolygonSymbolizer(); notEq.setUnitOfMeasure(UomOgcMapping.PIXEL.getUnit()); assertEqualsContract(clone, notEq, polygonSymb); } finally { visitor.setStrict(false); } } public void testLineSymbolizer() { LineSymbolizer lineSymb = sf.createLineSymbolizer(); LineSymbolizer clone = (LineSymbolizer) visitor.copy( lineSymb); assertCopy(lineSymb, clone); LineSymbolizer notEq = sf.getDefaultLineSymbolizer(); notEq.setGeometryPropertyName("something_else"); assertEqualsContract(clone, notEq, lineSymb); } public void testLineSymbolizerWithUOM() { LineSymbolizer lineSymb = sf.createLineSymbolizer(); LineSymbolizer clone = (LineSymbolizer) visitor.copy( lineSymb); assertCopy(lineSymb, clone); LineSymbolizer notEq = sf.getDefaultLineSymbolizer(); notEq.setUnitOfMeasure(UomOgcMapping.METRE.getUnit()); assertEqualsContract(clone, notEq, lineSymb); } public void testGraphic() { Graphic graphic = sf.getDefaultGraphic(); graphic.addMark(sf.getDefaultMark()); Graphic clone = (Graphic) visitor.copy( graphic); assertCopy(graphic, clone); assertEqualsContract(clone, graphic); assertEquals(clone.getSymbols().length, graphic.getSymbols().length); Graphic notEq = sf.getDefaultGraphic(); assertEqualsContract(clone, notEq, graphic); } public void testExternalGraphic() { ExternalGraphic exGraphic = sf.createExternalGraphic("http://somewhere", "image/png"); ExternalGraphic clone = visitor.copy( exGraphic); assertCopy(exGraphic, clone); ExternalGraphic notEq = sf.createExternalGraphic("http://somewhereelse", "image/jpeg"); assertEqualsContract(clone, notEq, exGraphic); // make sure it works for different format, same url ExternalGraphic notEq2 = visitor.copy( clone); notEq2.setFormat("image/jpeg"); assertEqualsContract(clone, notEq2, exGraphic); } public void testMark() { Mark mark = sf.getCircleMark(); Mark clone = visitor.copy( mark); assertCopy(mark, clone); Mark notEq = sf.getStarMark(); assertEqualsContract(clone, notEq, mark); } public void testFill() { Fill fill = sf.getDefaultFill(); Fill clone = visitor.copy( fill); assertCopy(fill, clone); Fill notEq = sf.createFill(ff.literal("#FF0000")); assertEqualsContract(clone, notEq, fill); } public void testStroke() { Stroke stroke = sf.getDefaultStroke(); Stroke clone = visitor.copy( stroke ); assertCopy(stroke, clone); Stroke notEq = sf.createStroke(ff.literal("#FF0000"), ff .literal(10)); assertEqualsContract(clone, notEq, stroke); // a stroke is a complex object with lots of properties, // need more extensive tests here. Stroke dashArray = sf.getDefaultStroke(); dashArray.setDashArray(new float[] { 1.0f, 2.0f, 3.0f }); Stroke dashArray2 = (Stroke) ((Cloneable)dashArray).clone(); assertEqualsContract(dashArray, dashArray2); } private static void assertCopy(Object real, Object clone) { assertNotNull("Real was null", real); assertNotNull("Clone was null", clone); assertTrue("" + real.getClass().getName() + " was not cloned", real != clone); } private static void assertEqualsContract(Object controlEqual, Object controlNe, Object test) { assertNotNull(controlEqual); assertNotNull(controlNe); assertNotNull(test); // check reflexivity assertTrue("Reflexivity test failed", test.equals(test)); // check symmetric assertTrue("Symmetry test failed", controlEqual.equals(test)); assertTrue("Symmetry test failed", test.equals(controlEqual)); assertTrue("Symmetry test failed", !test.equals(controlNe)); assertTrue("Symmetry test failed", !controlNe.equals(test)); // check transitivity assertTrue("Transitivity test failed", !controlEqual.equals(controlNe)); assertTrue("Transitivity test failed", !test.equals(controlNe)); assertTrue("Transitivity test failed", !controlNe.equals(controlEqual)); assertTrue("Transitivity test failed", !controlNe.equals(test)); // check non-null assertTrue("Non-null test failed", !test.equals(null)); // assertHashcode equality int controlEqHash = controlEqual.hashCode(); int testHash = test.hashCode(); if( controlEqHash != testHash ){ System.out.println( "Warning - Equal objects should return equal hashcodes"); } } private static void assertEqualsContract(Object controlEqual, Object test) { assertNotNull(controlEqual); assertNotNull(test); // check reflexivity assertTrue("Reflexivity test failed", test.equals(test)); // check symmetric assertTrue("Symmetry test failed", controlEqual.equals(test)); assertTrue("Symmetry test failed", test.equals(controlEqual)); // check non-null assertTrue("Non-null test failed", !test.equals(null)); // assertHashcode equality int controlEqHash = controlEqual.hashCode(); int testHash = test.hashCode(); assertTrue("Equal objects should return equal hashcodes",controlEqHash == testHash); } public void testContrastEnhancementDuplication() throws Exception { ContrastEnhancement ce = sf.createContrastEnhancement(); ce.setGammaValue(sb.literalExpression(0.5)); ce.setMethod(ContrastMethod.HISTOGRAM); ce.setHistogram(); ce.accept(visitor); ContrastEnhancement ce2 = (ContrastEnhancement) visitor.getCopy(); assertEquals("Gamma value incorrest after duplication", ((Literal)ce.getGammaValue()).getValue(), ((Literal)ce2.getGammaValue()).getValue()); assertEquals("ContrastMethod must be equal after duplication ", ce.getMethod(), ce2.getMethod()); assertEquals("Contrast Type must be equal after duplication ", ((Literal)ce.getType()).getValue(), ((Literal)ce2.getType()).getValue()); } public void testColorMapEntryDuplication() throws Exception { ColorMapEntry cme = sf.createColorMapEntry(); cme.setColor(sb.colorExpression(Color.YELLOW)); cme.setLabel("thelabel"); cme.setQuantity(sb.literalExpression(66.66)); cme.setOpacity(sb.literalExpression(0.77)); cme.accept(visitor); ColorMapEntry cme2 = (ColorMapEntry) visitor.getCopy(); assertEquals("Colormaps LABEL must be equal after duplication ", cme.getLabel(), cme2 .getLabel()); assertEquals("Colormaps QUANTITY must be equal after duplication ", cme.getQuantity(), cme2 .getQuantity()); assertEquals("Colormaps COLOR must be equal after duplication ", cme.getColor(), cme2 .getColor()); assertEquals("Colormaps OPACITY must be equal after duplication ", cme.getOpacity(), cme2 .getOpacity()); } public void testPointSymbolizerWithGeomFunction() throws Exception { URL urlExternal = getClass().getResource("/data/sld/blob.gif"); ExternalGraphic extg = sb.createExternalGraphic(urlExternal, "image/svg+xml"); Graphic graphic = sb.createGraphic(extg, null, null); PointSymbolizer pointSymb = sb.createPointSymbolizer(graphic); // Set a function as geometry Function geomFunc = ff.function("centroid", ff.property("thr_geom")); pointSymb.setGeometry(geomFunc); pointSymb.accept(visitor); PointSymbolizer copy = (PointSymbolizer) visitor.getCopy(); assertEquals("Any Expression set as Geometry must be correctly replicated",geomFunc, copy.getGeometry()); } public void testRasterSymbolizerDuplicationWithGeometryFunction() { // create a default RasterSymbolizer RasterSymbolizer original = sb.createRasterSymbolizer(); // Set a function as geometry Function geomFunc = ff.function("centroid", ff.property("thr_geom")); original.setGeometry(geomFunc); // duplicate it original.accept(visitor); RasterSymbolizer copy = (RasterSymbolizer) visitor.getCopy(); // compare it assertEquals("Any Expression set as Geometry must be correctly replicated", geomFunc, copy .getGeometry()); } public void testLineSymbolizerWithGeometryFunction() { LineSymbolizer lineSymb = sf.createLineSymbolizer(); // Set a function as geometry Function geomFunc = ff.function("centroid", ff.property("thr_geom")); lineSymb.setGeometry(geomFunc); LineSymbolizer copy = (LineSymbolizer) visitor.copy(lineSymb); // compare it assertEquals("Any Expression set as Geometry must be correctly replicated", geomFunc, copy .getGeometry()); } public void testPolygonSymbolizerWithGeometryFunction() { PolygonSymbolizer symb = sf.createPolygonSymbolizer(); // Set a function as geometry Function geomFunc = ff.function("centroid", ff.property("thr_geom")); symb.setGeometry(geomFunc); PolygonSymbolizer copy = (PolygonSymbolizer) visitor.copy(symb); // compare it assertEquals("Any Expression set as Geometry must be correctly replicated", geomFunc, copy .getGeometry()); } public void testTextSymbolizerWithGeometryFunction() { TextSymbolizer symb = sf.createTextSymbolizer(); // Set a function as geometry Function geomFunc = ff.function("centroid", ff.property("the_geom")); symb.setGeometry(geomFunc); TextSymbolizer copy = (TextSymbolizer) visitor.copy(symb); // compare it assertEquals("Any Expression set as Geometry must be correctly replicated", geomFunc, copy .getGeometry()); } /** * Test that {@link TextSymbolizer2} is correctly duplicated. * @author Stefan Tzeggai, June 29th 2010 */ public void testTextSymbolizer2() { TextSymbolizer2 symb = (TextSymbolizer2) sf.createTextSymbolizer(); // Create a Graphic with two recognizable values GraphicImpl gr = new GraphicImpl(ff); gr.setOpacity(ff.literal(0.77)); gr.setSize(ff.literal(77)); symb.setGraphic(gr); Literal snippet = ff.literal("no idea what a snipet is good for"); symb.setSnippet(snippet); Literal fD = ff.literal("some description"); symb.setFeatureDescription(fD); OtherTextImpl otherText = new OtherTextImpl(); otherText.setTarget("otherTextTarget"); otherText.setText(ff.literal("otherTextText")); symb.setOtherText(otherText); // copy it TextSymbolizer2 copy = (TextSymbolizer2) visitor.copy(symb); // compare it assertEquals("Graphic of TextSymbolizer2 has not been correctly duplicated", gr, copy .getGraphic()); assertEquals("Graphic of TextSymbolizer2 has not been correctly duplicated", gr.getOpacity(), copy .getGraphic().getOpacity()); assertEquals("Graphic of TextSymbolizer2 has not been correctly duplicated", gr.getSize(), copy .getGraphic().getSize()); assertEquals("Snippet of TextSymbolizer2 has not been correctly duplicated", snippet, copy .getSnippet()); assertEquals("FeatureDescription of TextSymbolizer2 has not been correctly duplicated", fD, copy .getFeatureDescription()); assertEquals("OtherText of TextSymbolizer2 has not been correctly duplicated", otherText.getTarget(), copy .getOtherText().getTarget()); assertEquals("OtherText of TextSymbolizer2 has not been correctly duplicated", otherText.getText(), copy .getOtherText().getText()); } }