package org.geoserver.wms.featureinfo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.awt.Color;
import java.util.List;
import org.geotools.styling.ExternalGraphic;
import org.geotools.styling.FeatureTypeStyle;
import org.geotools.styling.Graphic;
import org.geotools.styling.LineSymbolizer;
import org.geotools.styling.Mark;
import org.geotools.styling.PolygonSymbolizer;
import org.geotools.styling.Rule;
import org.geotools.styling.Stroke;
import org.geotools.styling.Style;
import org.geotools.styling.StyleBuilder;
import org.geotools.styling.Symbolizer;
import org.junit.Before;
import org.junit.Test;
public class DynamicSizeStyleExtractorTest {
StyleBuilder sb = new StyleBuilder();
private Rule staticPolygonRule;
private Rule staticLineRule;
private DynamicSizeStyleExtractor visitor;
@Before
public void setup() {
staticPolygonRule = sb.createRule(sb.createPolygonSymbolizer(Color.RED));
staticLineRule = sb.createRule(sb.createLineSymbolizer(Color.BLUE, 1d));
visitor = new DynamicSizeStyleExtractor();
}
@Test
public void testOneFtsFullyStatic() {
Style style = sb.createStyle();
FeatureTypeStyle fts = sb.createFeatureTypeStyle("Feature", staticPolygonRule);
fts.rules().add(staticLineRule);
style.featureTypeStyles().add(fts);
style.accept(visitor);
Style copy = (Style) visitor.getCopy();
assertNull(copy);
}
@Test
public void testTwoFtsFullyStatic() {
Style style = sb.createStyle();
FeatureTypeStyle fts1 = sb.createFeatureTypeStyle("Feature", staticPolygonRule);
FeatureTypeStyle fts2 = sb.createFeatureTypeStyle("Feature", staticLineRule);
style.featureTypeStyles().add(fts1);
style.featureTypeStyles().add(fts2);
style.accept(visitor);
Style copy = (Style) visitor.getCopy();
assertNull(copy);
}
@Test
public void testMixDynamicStroke() {
Style style = sb.createStyle();
FeatureTypeStyle fts1 = sb.createFeatureTypeStyle("Feature", staticPolygonRule);
LineSymbolizer ls = sb.createLineSymbolizer();
ls.getStroke().setWidth(sb.getFilterFactory().property("myAttribute"));
FeatureTypeStyle fts2 = sb.createFeatureTypeStyle(ls);
style.featureTypeStyles().add(fts1);
style.featureTypeStyles().add(fts2);
checkSingleSymbolizer(style, ls);
}
@Test
public void testMultipleSymbolizers() {
Style style = sb.createStyle();
LineSymbolizer ls = sb.createLineSymbolizer();
ls.getStroke().setWidth(sb.getFilterFactory().property("myAttribute"));
FeatureTypeStyle fts = sb.createFeatureTypeStyle(sb.createPolygonSymbolizer());
style.featureTypeStyles().add(fts);
fts.rules().get(0).symbolizers().add(ls);
fts.rules().get(0).symbolizers().add(sb.createLineSymbolizer());
checkSingleSymbolizer(style, ls);
}
private void checkSingleSymbolizer(Style style, LineSymbolizer ls) {
// we should get back only the dynamic one
style.accept(visitor);
Style copy = (Style) visitor.getCopy();
assertNotNull(copy);
List<FeatureTypeStyle> featureTypeStyles = copy.featureTypeStyles();
assertEquals(1, featureTypeStyles.size());
List<Rule> rules = featureTypeStyles.get(0).rules();
assertEquals(1, rules.size());
List<Symbolizer> symbolizers = rules.get(0).symbolizers();
assertEquals(1, symbolizers.size());
assertEquals(ls, symbolizers.get(0));
}
@Test
public void testMixDynamicGraphicStroke() {
Style style = sb.createStyle();
FeatureTypeStyle fts1 = sb.createFeatureTypeStyle("Feature", staticPolygonRule);
Graphic graphic = sb.createGraphic(null, sb.createMark("square"), null);
graphic.setSize(sb.getFilterFactory().property("myAttribute"));
LineSymbolizer ls = sb.createLineSymbolizer();
ls.getStroke().setGraphicStroke(graphic);
FeatureTypeStyle fts2 = sb.createFeatureTypeStyle(ls);
style.featureTypeStyles().add(fts1);
style.featureTypeStyles().add(fts2);
checkSingleSymbolizer(style, ls);
}
@Test
public void testDynamicSymbolizerStrokeLineSymbolizer() {
ExternalGraphic dynamicSymbolizer = sb.createExternalGraphic("file://./${myAttribute}.jpeg", "image/jpeg");
Graphic graphic = sb.createGraphic(dynamicSymbolizer, null, null);
LineSymbolizer ls = sb.createLineSymbolizer();
ls.getStroke().setGraphicStroke(graphic);
Style style = sb.createStyle(ls);
checkSingleSymbolizer(style, ls);
}
@Test
public void testStaticGraphicLineSymbolizer() {
ExternalGraphic dynamicSymbolizer = sb.createExternalGraphic("file://./hello.jpeg", "image/jpeg");
Graphic graphic = sb.createGraphic(dynamicSymbolizer, null, null);
LineSymbolizer ls = sb.createLineSymbolizer();
ls.getStroke().setGraphicStroke(graphic);
Style style = sb.createStyle(ls);
style.accept(visitor);
Style copy = (Style) visitor.getCopy();
assertNull(copy);
}
@Test
public void testDynamicStrokeInGraphicMark() {
Stroke markStroke = sb.createStroke();
markStroke.setWidth(sb.getFilterFactory().property("myAttribute"));
Mark mark = sb.createMark("square");
mark.setStroke(markStroke);
Graphic graphic = sb.createGraphic(null, mark, null);
LineSymbolizer ls = sb.createLineSymbolizer();
ls.getStroke().setGraphicStroke(graphic);
Style style = sb.createStyle(ls);
checkSingleSymbolizer(style, ls);
}
@Test // this one should fail now??
public void testDynamicStrokeInGraphicFill() {
Stroke markStroke = sb.createStroke();
markStroke.setWidth(sb.getFilterFactory().property("myAttribute"));
Mark mark = sb.createMark("square");
mark.setStroke(markStroke);
Graphic graphic = sb.createGraphic(null, mark, null);
PolygonSymbolizer ps = sb.createPolygonSymbolizer();
ps.getFill().setGraphicFill(graphic);
Style style = sb.createStyle(ps);
style.accept(visitor);
Style copy = (Style) visitor.getCopy();
assertNull(copy);
}
}