/* (c) 2014 - 2016 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.wms.wms_1_1_1;
import static org.junit.Assert.*;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import org.custommonkey.xmlunit.XMLUnit;
import org.custommonkey.xmlunit.XpathEngine;
import org.geoserver.catalog.DimensionDefaultValueSetting;
import org.geoserver.catalog.DimensionPresentation;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.DimensionDefaultValueSetting.Strategy;
import org.geoserver.wms.WMSDimensionsTestSupport;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.w3c.dom.Document;
import org.springframework.mock.web.MockHttpServletResponse;
public class DimensionsVectorGetFeatureInfoTest extends WMSDimensionsTestSupport {
String baseFeatureInfo;
XpathEngine xpath;
@Before
public void setXpahEngine() throws Exception {
baseFeatureInfo = "wms?service=WMS&version=1.1.1&request=GetFeatureInfo&bbox=-180,-90,180,90"
+ "&styles=&Format=image/png&width=80&height=40&srs=EPSG:4326&layers="
+ getLayerId(V_TIME_ELEVATION)
+ "&query_layers="
+ getLayerId(V_TIME_ELEVATION)
+ "&feature_count=50";
xpath = XMLUnit.newXpathEngine();
}
/**
* Ensures there is at most one feature at the specified location, and returns its feature id
*
* @param baseFeatureInfo The GetFeatureInfo request, minus x and y
* @param x
* @param y
*
*/
String getFeatureAt(String baseFeatureInfo, int x, int y) throws Exception {
MockHttpServletResponse response = getAsServletResponse(baseFeatureInfo
+ "&info_format=application/vnd.ogc.gml&x=" + x + "&y=" + y);
assertEquals("application/vnd.ogc.gml", response.getContentType());
Document doc = dom(new ByteArrayInputStream(response.getContentAsString().getBytes()));
String sCount = xpath.evaluate("count(//sf:TimeElevation)", doc);
int count = Integer.valueOf(sCount);
if (count == 0) {
return null;
} else if (count == 1) {
return xpath.evaluate("//sf:TimeElevation/@fid", doc);
} else {
fail("Found more than one feature: " + count);
return null; // just to make the compiler happy, fail throws an unchecked exception
}
}
@Test
public void testNoDimension() throws Exception {
assertEquals("TimeElevation.0", getFeatureAt(baseFeatureInfo, 20, 10));
assertEquals("TimeElevation.1", getFeatureAt(baseFeatureInfo, 60, 10));
assertEquals("TimeElevation.2", getFeatureAt(baseFeatureInfo, 20, 30));
assertEquals("TimeElevation.3", getFeatureAt(baseFeatureInfo, 60, 30));
}
@Test
public void testElevationDefault() throws Exception {
setupVectorDimension(ResourceInfo.ELEVATION, "elevation", DimensionPresentation.LIST,
null, UNITS, UNIT_SYMBOL);
// we should get only one square
assertEquals("TimeElevation.0", getFeatureAt(baseFeatureInfo, 20, 10));
assertNull(getFeatureAt(baseFeatureInfo, 60, 10));
assertNull(getFeatureAt(baseFeatureInfo, 20, 30));
assertNull(getFeatureAt(baseFeatureInfo, 60, 30));
}
@Test
public void testElevationSingle() throws Exception {
setupVectorDimension(ResourceInfo.ELEVATION, "elevation", DimensionPresentation.LIST,
null, UNITS, UNIT_SYMBOL);
String base = baseFeatureInfo + "&elevation=1.0";
// we should get only one square
assertNull(getFeatureAt(base, 20, 10));
assertEquals("TimeElevation.1", getFeatureAt(base, 60, 10));
assertNull(getFeatureAt(base, 20, 30));
assertNull(getFeatureAt(base, 60, 30));
}
@Test
public void testElevationListMulti() throws Exception {
setupVectorDimension(ResourceInfo.ELEVATION, "elevation", DimensionPresentation.LIST,
null, UNITS, UNIT_SYMBOL);
String base = baseFeatureInfo + "&elevation=1.0,3.0";
// we should get second and last
assertNull(getFeatureAt(base, 20, 10));
assertEquals("TimeElevation.1", getFeatureAt(base, 60, 10));
assertNull(getFeatureAt(base, 20, 30));
assertEquals("TimeElevation.3", getFeatureAt(base, 60, 30));
}
@Test
public void testElevationListExtra() throws Exception {
// adding a extra elevation that is simply not there, should not break
setupVectorDimension(ResourceInfo.ELEVATION, "elevation", DimensionPresentation.LIST,
null, UNITS, UNIT_SYMBOL);
String base = baseFeatureInfo + "&elevation=1.0,3.0,5.0";
// we should get second and last
assertNull(getFeatureAt(base, 20, 10));
assertEquals("TimeElevation.1", getFeatureAt(base, 60, 10));
assertNull(getFeatureAt(base, 20, 30));
assertEquals("TimeElevation.3", getFeatureAt(base, 60, 30));
}
@Test
public void testElevationInterval() throws Exception {
// adding a extra elevation that is simply not there, should not break
setupVectorDimension(ResourceInfo.ELEVATION, "elevation", DimensionPresentation.LIST,
null, UNITS, UNIT_SYMBOL);
String base = baseFeatureInfo + "&elevation=1.0/3.0";
// we should get all but the first
assertNull(getFeatureAt(base, 20, 10));
assertEquals("TimeElevation.1", getFeatureAt(base, 60, 10));
assertEquals("TimeElevation.2", getFeatureAt(base, 20, 30));
assertEquals("TimeElevation.3", getFeatureAt(base, 60, 30));
}
@Test
public void testElevationIntervalResolution() throws Exception {
// adding a extra elevation that is simply not there, should not break
setupVectorDimension(ResourceInfo.ELEVATION, "elevation", DimensionPresentation.LIST,
null, UNITS, UNIT_SYMBOL);
String base = baseFeatureInfo + "&elevation=1.0/4.0/2.0";
// we should get only one square
assertNull(getFeatureAt(base, 20, 10));
assertEquals("TimeElevation.1", getFeatureAt(base, 60, 10));
assertNull(getFeatureAt(base, 20, 30));
assertEquals("TimeElevation.3", getFeatureAt(base, 60, 30));
}
@Test
public void testTimeDefault() throws Exception {
setupVectorDimension(ResourceInfo.TIME, "time", DimensionPresentation.LIST, null, null, null);
// we should get only one square
assertNull(getFeatureAt(baseFeatureInfo, 20, 10));
assertNull(getFeatureAt(baseFeatureInfo, 60, 10));
assertNull(getFeatureAt(baseFeatureInfo, 20, 30));
assertEquals("TimeElevation.3", getFeatureAt(baseFeatureInfo, 60, 30));
}
@Test
public void testTimeCurrent() throws Exception {
setupVectorDimension(ResourceInfo.TIME, "time", DimensionPresentation.LIST, null, null, null);
String base = baseFeatureInfo + "&time=CURRENT";
// we should get only one square
assertNull(getFeatureAt(base, 20, 10));
assertNull(getFeatureAt(base, 60, 10));
assertNull(getFeatureAt(base, 20, 30));
assertEquals("TimeElevation.3", getFeatureAt(baseFeatureInfo, 60, 30));
}
@Test
public void testTimeSingle() throws Exception {
setupVectorDimension(ResourceInfo.TIME, "time", DimensionPresentation.LIST, null, null, null);
String base = baseFeatureInfo + "&time=2011-05-02";
// we should get the second
assertNull(getFeatureAt(base, 20, 10));
assertEquals("TimeElevation.1", getFeatureAt(base, 60, 10));
assertNull(getFeatureAt(base, 20, 30));
assertNull(getFeatureAt(base, 60, 30));
}
@Test
public void testTimeListMulti() throws Exception {
setupVectorDimension(ResourceInfo.TIME, "time", DimensionPresentation.LIST, null, null, null);
String base = baseFeatureInfo + "&time=2011-05-02,2011-05-04";
// we should get the second and fourth
assertNull(getFeatureAt(base, 20, 10));
assertEquals("TimeElevation.1", getFeatureAt(base, 60, 10));
assertNull(getFeatureAt(base, 20, 30));
assertEquals("TimeElevation.3", getFeatureAt(base, 60, 30));
}
@Test
public void testTimeListExtra() throws Exception {
setupVectorDimension(ResourceInfo.TIME, "time", DimensionPresentation.LIST, null, null, null);
// adding a extra elevation that is simply not there, should not break
String base = baseFeatureInfo + "&time=2011-05-02,2011-05-04,2011-05-10";
// we should get the second and fourth
assertNull(getFeatureAt(base, 20, 10));
assertEquals("TimeElevation.1", getFeatureAt(base, 60, 10));
assertNull(getFeatureAt(base, 20, 30));
assertEquals("TimeElevation.3", getFeatureAt(base, 60, 30));
}
@Test
public void testTimeInterval() throws Exception {
// adding a extra elevation that is simply not there, should not break
setupVectorDimension(ResourceInfo.TIME, "time", DimensionPresentation.LIST, null, null, null);
String base = baseFeatureInfo + "&time=2011-05-02/2011-05-05";
// last three squares
assertNull(getFeatureAt(base, 20, 10));
assertEquals("TimeElevation.1", getFeatureAt(base, 60, 10));
assertEquals("TimeElevation.2", getFeatureAt(base, 20, 30));
assertEquals("TimeElevation.3", getFeatureAt(base, 60, 30));
}
@Ignore
public void testTimeIntervalResolution() throws Exception {
// adding a extra elevation that is simply not there, should not break
setupVectorDimension(ResourceInfo.TIME, "time", DimensionPresentation.LIST, null, null, null);
String base = baseFeatureInfo + "&time=2011-05-01/2011-05-04/P2D";
// first and third
assertEquals("TimeElevation.0", getFeatureAt(base, 20, 10));
assertNull(getFeatureAt(base, 60, 10));
assertEquals("TimeElevation.2", getFeatureAt(base, 20, 30));
assertNull(getFeatureAt(base, 60, 30));
}
@Test
public void testElevationDefaultAsRange() throws Exception {
// setup a default
DimensionDefaultValueSetting defaultValueSetting = new DimensionDefaultValueSetting();
defaultValueSetting.setStrategyType(Strategy.FIXED);
defaultValueSetting.setReferenceValue("1/3");
setupResourceDimensionDefaultValue(V_TIME_ELEVATION, ResourceInfo.ELEVATION, defaultValueSetting, "elevation");
// the last three show up, the first does not
assertNull(getFeatureAt(baseFeatureInfo, 20, 10));
assertEquals("TimeElevation.1", getFeatureAt(baseFeatureInfo, 60, 10));
assertEquals("TimeElevation.2", getFeatureAt(baseFeatureInfo, 20, 30));
assertEquals("TimeElevation.3", getFeatureAt(baseFeatureInfo, 60, 30));
}
@Test
public void testTimeDefaultAsRange() throws Exception {
// setup a default
DimensionDefaultValueSetting defaultValueSetting = new DimensionDefaultValueSetting();
defaultValueSetting.setStrategyType(Strategy.FIXED);
defaultValueSetting.setReferenceValue("2011-05-02/2011-05-03");
setupResourceDimensionDefaultValue(V_TIME_ELEVATION, ResourceInfo.TIME, defaultValueSetting, "time");
// the last three show up, the first does not
assertNull(getFeatureAt(baseFeatureInfo, 20, 10));
assertEquals("TimeElevation.1", getFeatureAt(baseFeatureInfo, 60, 10));
assertEquals("TimeElevation.2", getFeatureAt(baseFeatureInfo, 20, 30));
assertNull(getFeatureAt(baseFeatureInfo, 60, 30));
}
}