summaryrefslogtreecommitdiff
path: root/misc/openlayers/tests/Control/WMSGetFeatureInfo.html
diff options
context:
space:
mode:
Diffstat (limited to 'misc/openlayers/tests/Control/WMSGetFeatureInfo.html')
-rw-r--r--misc/openlayers/tests/Control/WMSGetFeatureInfo.html644
1 files changed, 644 insertions, 0 deletions
diff --git a/misc/openlayers/tests/Control/WMSGetFeatureInfo.html b/misc/openlayers/tests/Control/WMSGetFeatureInfo.html
new file mode 100644
index 0000000..b5e6d5d
--- /dev/null
+++ b/misc/openlayers/tests/Control/WMSGetFeatureInfo.html
@@ -0,0 +1,644 @@
+<html>
+<head>
+ <script src="../OLLoader.js"></script>
+ <script type="text/javascript">
+
+ function test_initialize(t) {
+ t.plan(5);
+
+ var options = {
+ url: 'http://localhost/wms',
+ layers: ["foo"],
+ formatOptions: {
+ foo: "bar"
+ }
+ };
+ var control = new OpenLayers.Control.WMSGetFeatureInfo(options);
+ t.ok(control instanceof OpenLayers.Control.WMSGetFeatureInfo,
+ "new OpenLayers.Control.WMSGetFeatureInfo returns an instance");
+ t.eq(control.url, 'http://localhost/wms',
+ "constructor sets url correctly");
+ t.eq(control.layers, ["foo"],
+ "constructor layers"
+ );
+ t.ok(control.format instanceof OpenLayers.Format.WMSGetFeatureInfo, "format created");
+ t.eq(control.format.foo, "bar", "format options used")
+ }
+
+ function test_clickCallBack_option(t) {
+ t.plan(9);
+
+ var control;
+
+ control = new OpenLayers.Control.WMSGetFeatureInfo({
+ hover: true
+ });
+ t.ok(control.handler instanceof OpenLayers.Handler.Hover,
+ 'constructor creates hover handler');
+ t.ok(control.handler.callbacks["move"] === control.cancelHover,
+ 'constructor registers proper "move" callback in handler');
+ t.ok(control.handler.callbacks["pause"] === control.getInfoForHover,
+ 'constructor registers proper "pause" callback in handler');
+
+ control = new OpenLayers.Control.WMSGetFeatureInfo();
+ t.ok(control.handler instanceof OpenLayers.Handler.Click,
+ 'constructor creates click handler');
+ t.ok(control.handler.callbacks["click"] === control.getInfoForClick,
+ 'constructor registers proper "click" callback in handler');
+
+ control = new OpenLayers.Control.WMSGetFeatureInfo({
+ clickCallback: "rightclick"
+ });
+ t.ok(control.handler.callbacks["rightclick"] === control.getInfoForClick,
+ 'constructor registers proper "rightclick" callback in handler');
+
+ control = new OpenLayers.Control.WMSGetFeatureInfo({
+ clickCallback: "dblclick",
+ handlerOptions: {
+ click: {
+ "single": false,
+ "double": true
+ }
+ }
+ });
+ t.ok(control.handler.callbacks["dblclick"] === control.getInfoForClick,
+ 'constructor registers proper "dblclick" callback in handler');
+ t.eq(control.handler["single"], false,
+ 'constructor sets "single" to false in handler');
+ t.eq(control.handler["double"], true,
+ 'constructor sets "double" to true in handler');
+ }
+
+ function test_destroy(t) {
+ t.plan(2);
+ var map = new OpenLayers.Map("map");
+ var click = new OpenLayers.Control.WMSGetFeatureInfo({
+ url: 'http://localhost/wms',
+ layers: ["foo"]
+ });
+
+ var hover = new OpenLayers.Control.WMSGetFeatureInfo({
+ url: 'http://localhost/wms',
+ layers: ["foo"],
+ hover: true
+ });
+
+ click.handler.deactivate = function() {
+ t.ok(true,
+ "control.deactivate calls deactivate on click handler");
+ };
+ hover.handler.deactivate = function() {
+ t.ok(true,
+ "control.deactivate calls deactivate on hover handler");
+ };
+ click.destroy();
+ hover.destroy();
+ }
+
+ function test_click(t) {
+ t.plan(4);
+ var map = new OpenLayers.Map('map');
+
+ // mock up active control
+ var control = new OpenLayers.Control.WMSGetFeatureInfo();
+ map.addControl(control);
+ control.activate();
+
+ control.request = function(position) {
+ t.eq(position.x, 50,
+ "x position is as expected");
+ t.eq(position.y, 50,
+ "y position is as expected");
+ };
+
+ control.getInfoForClick({xy: {x: 50, y: 50}});
+ control.getInfoForHover({xy: {x: 50, y: 50}});
+ }
+
+ function test_getfeatureinfo_event(t) {
+
+ t.plan(5);
+
+ var text =
+ '<?xml version="1.0" encoding="UTF-8" ?>' +
+ '<FeatureInfoResponse>' +
+ ' <FIELDS OBJECTID="1188" HECTARES="1819.734" ZONENR="5854" NULZONES=" " AREA="18197340.1426" PERIMETER="19177.4073627" SHAPE="NULL" SE_ANNO_CAD_DATA="NULL" SHAPE.AREA="0" SHAPE.LEN="0"/>' +
+ '</FeatureInfoResponse>';
+
+ var map = new OpenLayers.Map('map');
+
+ var xy;
+ var url = "http://foo";
+
+ // mock up a control with output "object" and drillDown true
+ var control = new OpenLayers.Control.WMSGetFeatureInfo({
+ output: "object",
+ drillDown: true,
+ request: function(position) {},
+ eventListeners: {
+ getfeatureinfo: function(evt) {
+ t.ok(evt.features[0].url === url, "features is an object with a property url when output is object");
+ var features = evt.features[0].features;
+ t.ok(features.length === 1, "features properties has a length of 1");
+ t.ok(features[0] instanceof OpenLayers.Feature.Vector, "Feature array contains 1 feature");
+ }
+ }
+ });
+
+ // mock up a control with output "features" and drillDown true
+ var control2 = new OpenLayers.Control.WMSGetFeatureInfo({
+ autoActivate: true,
+ drillDown: true,
+ request: function(position) {},
+ eventListeners: {
+ getfeatureinfo: function(evt) {
+ var features = evt.features;
+ t.ok(features.length === 1, "features properties has a length of 1");
+ t.ok(features[0] instanceof OpenLayers.Feature.Vector, "Feature array contains 1 feature");
+ }
+ }
+ });
+
+ map.addControls([control, control2]);
+ control.activate();
+
+ xy = {x: 50, y: 50};
+ control._requestCount = control2._requestCount = 0;
+ control._numRequests = control2._numRequests = 1;
+ control.handleResponse({xy: xy}, {responseText: text}, url);
+ control2.handleResponse({xy: xy}, {responseText: text}, url);
+ map.destroy();
+ }
+
+ function test_beforegetfeatureinfo_event(t) {
+ t.plan(2);
+ var map = new OpenLayers.Map('map');
+
+ var xy, mode;
+
+ // mock up active control
+ var control = new OpenLayers.Control.WMSGetFeatureInfo({
+ request: function(position) {},
+ eventListeners: {
+ beforegetfeatureinfo: function(evt) {
+ t.eq(evt.xy, xy,
+ "beforegetfeatureinfo listener gets " +
+ "expected xy (" + mode + ")");
+ }
+ }
+ });
+ map.addControl(control);
+ control.activate();
+
+ // 1 test
+ mode = "click";
+ xy = {x: 50, y: 50};
+ control.getInfoForClick({xy: xy});
+
+ // 1 test
+ mode = "hover";
+ xy = {x: 70, y: 70};
+ control.getInfoForHover({xy: xy});
+ }
+
+ function test_nogetfeatureinfo_event(t) {
+ t.plan(1);
+ var map = new OpenLayers.Map('map');
+ // mock up active control
+ var control = new OpenLayers.Control.WMSGetFeatureInfo({
+ eventListeners: {
+ nogetfeatureinfo: function(evt) {
+ t.ok((evt.type == "nogetfeatureinfo"), "nogetfeatureinfo listener gets called when there are no queryable layers");
+ }
+ }
+ });
+ map.addControl(control);
+ control.activate();
+
+ // 1 test
+ mode = "click";
+ xy = {x: 50, y: 50};
+ control.getInfoForClick({xy: xy});
+ }
+
+ function test_activate(t) {
+ t.plan(4);
+ var map = new OpenLayers.Map("map");
+ var click = new OpenLayers.Control.WMSGetFeatureInfo({
+ url: 'http://localhost/wms',
+ featureType: 'type',
+ featureNS: 'http://localhost/ns',
+ layers: 'ns:type'
+ });
+ var hover = new OpenLayers.Control.WMSGetFeatureInfo({
+ url: 'http://localhost/wms',
+ featureType: 'type',
+ featureNS: 'http://localhost/ns',
+ layers: 'ns:type',
+ hover: true
+ });
+ map.addControl(click);
+ map.addControl(hover);
+ t.ok(!click.handler.active,
+ "click handler is not active prior to activating control");
+ t.ok(!hover.handler.active,
+ "hover handler is not active prior to activating control");
+ click.activate();
+ hover.activate();
+ t.ok(click.handler.active,
+ "click handler is active after activating control");
+ t.ok(hover.handler.active,
+ "hover handler is active after activating control");
+ }
+
+ function test_deactivate(t) {
+ t.plan(2);
+ var map = new OpenLayers.Map("map");
+ var click = new OpenLayers.Control.WMSGetFeatureInfo({
+ url: 'http://localhost/wms',
+ featureType: 'type',
+ featureNS: 'http://localhost/ns',
+ layers: 'ns:type'
+ });
+ var hover = new OpenLayers.Control.WMSGetFeatureInfo({
+ url: 'http://localhost/wms',
+ featureType: 'type',
+ featureNS: 'http://localhost/ns',
+ layers: 'ns:type'
+ });
+ map.addControl(click);
+ map.addControl(hover);
+ click.activate();
+ hover.activate();
+
+ click.handler.deactivate = function() {
+ t.ok(true,
+ "control.deactivate calls deactivate on click handler");
+ OpenLayers.Handler.Click.prototype.deactivate.apply(this, arguments);
+ };
+ hover.handler.deactivate = function() {
+ t.ok(true,
+ "control.deactivate calls deactivate on hover handler");
+ OpenLayers.Handler.Hover.prototype.deactivate.apply(this, arguments);
+ };
+ click.deactivate();
+ hover.deactivate();
+ }
+
+ // Verify that things work all right when we combine different types for the STYLES and LAYERS
+ // params in the WMS Layers involved
+ function test_mixedParams(t) {
+ t.plan(5);
+ var map = new OpenLayers.Map("map", {
+ getExtent: function() {return(new OpenLayers.Bounds(-180,-90,180,90));}
+ });
+ var geographic = new OpenLayers.Projection("EPSG:4326");
+
+ var a = new OpenLayers.Layer.WMS("dummy","http://localhost/wms", {
+ layers: "a,b,c,d",
+ styles: "a,b,c,d"
+ }, {projection: geographic});
+
+ var b = new OpenLayers.Layer.WMS("dummy","http://localhost/wms", {
+ layers: ["a","b","c","d"],
+ styles: ["a","b","c","d"]
+ }, {projection: geographic});
+
+ var c = new OpenLayers.Layer.WMS("dummy","http://localhost/wms", {
+ layers: ["a","b","c","d"]
+ });
+
+ var d = new OpenLayers.Layer.WMS("dummy","http://localhost/wms", {
+ layers: "a,b,c,d"
+ }, {projection: geographic});
+
+ var click = new OpenLayers.Control.WMSGetFeatureInfo({
+ featureType: 'type',
+ featureNS: 'ns',
+ layers: [a, b, c, d]
+ }, {projection: geographic});
+
+ map.addControl(click);
+
+ var log = {};
+ var _request = OpenLayers.Request.GET;
+ OpenLayers.Request.GET = function(options) {
+ log.options = options;
+ };
+ click.activate();
+ click.getInfoForClick({xy: {x: 50.2, y: 50.1}});
+ OpenLayers.Request.GET = _request;
+
+ t.eq(
+ log.options && log.options.params.X,
+ 50,
+ "X should be an integer"
+ );
+
+ t.eq(
+ log.options && log.options.params.Y,
+ 50,
+ "Y should be an integer"
+ );
+
+ t.eq(
+ log.options && log.options.url,
+ "http://localhost/wms",
+ "url from first layer used"
+ );
+ t.eq(
+ log.options && log.options.params.STYLES.join(","),
+ ",,,,,,,,a,b,c,d,a,b,c,d",
+ "Styles merged correctly"
+ );
+
+ t.eq(
+ log.options && log.options.params.FORMAT,
+ "image/jpeg",
+ "Required 'format' parameter included"
+ );
+
+ }
+
+ function test_urlMatches(t) {
+
+ t.plan(5);
+
+ var control = new OpenLayers.Control.WMSGetFeatureInfo({
+ url: "http://host/wms?one=1&two=2"
+ });
+
+ t.ok(!control.urlMatches("foo"), "doesn't match garbage");
+ t.ok(control.urlMatches("http://host:80/wms?two=2&one=1"), "matches equivalent url");
+
+ // give the control more urls to match from
+ control.layerUrls = ["http://a.host/wms", "http://b.host/wms"];
+
+ t.ok(control.urlMatches("http://host:80/wms?two=2&one=1"), "still matches equivalent url");
+ t.ok(control.urlMatches("http://a.host:80/wms"), "matches equivalent of first of layerUrls");
+ t.ok(control.urlMatches("http://b.host:80/wms"), "matches equivalent of second of layerUrls");
+
+ }
+
+ function test_layerUrls(t) {
+
+ t.plan(4);
+ var map = new OpenLayers.Map({
+ div: "map",
+ getExtent: function() {
+ return new OpenLayers.Bounds(-180,-90,180,90);
+ }
+ });
+
+ var a = new OpenLayers.Layer.WMS(
+ null, "http://a.mirror/wms", {layers: "a"}
+ );
+ var b = new OpenLayers.Layer.WMS(
+ null, "http://b.mirror/wms", {layers: "b"}
+ );
+ var c = new OpenLayers.Layer.WMS(
+ null, ["http://c.mirror/wms", "http://d.mirror/wms"], {layers: "c"}
+ );
+ map.addLayers([a, b, c]);
+
+ var control = new OpenLayers.Control.WMSGetFeatureInfo({
+ url: "http://host/wms",
+ layers: [a, b, c]
+ });
+ map.addControl(control);
+ control.activate();
+
+ // log calls to GET
+ var log;
+ var _request = OpenLayers.Request.GET;
+ OpenLayers.Request.GET = function(options) {
+ log.options = options;
+ };
+
+ // control url doesn't match layer urls, no request issued
+ log = {};
+ control.getInfoForClick({xy: {x: 50, y: 50}});
+ t.ok(!log.options, "no url match, no request issued");
+
+ // give control a list of urls to match
+ log = {};
+ control.layerUrls = ["http://a.mirror/wms", "http://b.mirror/wms"];
+ control.getInfoForClick({xy: {x: 50, y: 50}});
+ t.eq(log.options && log.options.url, "http://host/wms", "some match, request issued");
+ t.eq(log.options && log.options.params["QUERY_LAYERS"].join(","), "b,a", "selected layers queried");
+
+ // show that a layer can be matched if it has a urls array itself (first needs to be matched)
+ log = {};
+ control.layerUrls = ["http://c.mirror/wms"];
+ control.getInfoForClick({xy: {x: 50, y: 50}});
+ t.eq(log.options && log.options.params["QUERY_LAYERS"].join(","), "c", "layer with urls array can be queried");
+
+ // clean up
+ OpenLayers.Request.GET = _request;
+ map.destroy();
+
+ }
+
+ function test_hover(t) {
+
+ t.plan(2);
+
+ var map = new OpenLayers.Map({
+ div: "map",
+ layers: [
+ new OpenLayers.Layer.WMS(null, "/dummywms", {layers: "one"})
+ ],
+ center: new OpenLayers.LonLat(0, 0),
+ zoom: 1
+ });
+
+ var control = new OpenLayers.Control.WMSGetFeatureInfo({
+ hover: true
+ });
+ map.addControl(control);
+ control.activate();
+
+ // mock up a mousemove
+ control.getInfoForHover({xy: new OpenLayers.Pixel(10, 10)});
+ t.ok(!!control.hoverRequest, "hoverRequest set");
+
+ // confirm that request is canceled on next move
+ var called = 0;
+ control.hoverRequest.abort = function() {
+ ++called;
+ };
+ control.handler.px = null;
+ control.handler.mousemove({xy: new OpenLayers.Pixel(20, 20)});
+ t.eq(called, 1, "hover request aborted");
+
+ map.destroy();
+
+ }
+
+ function test_exceptions(t) {
+ t.plan(1);
+ var map = new OpenLayers.Map("map", {
+ getExtent: function() {return(new OpenLayers.Bounds(-180,-90,180,90));}
+ }
+ );
+
+ var a = new OpenLayers.Layer.WMS("dummy","http://myhost/wms", {
+ layers: "x",
+ exceptions: "text/xml"
+ });
+
+ map.addLayer(a);
+
+ var click = new OpenLayers.Control.WMSGetFeatureInfo({
+ });
+
+ map.addControl(click);
+
+ var _request = OpenLayers.Request.GET;
+ OpenLayers.Request.GET = function(options) {
+ t.eq(options.params["EXCEPTIONS"], "text/xml", "Exceptions parameter taken from the WMS layer if provided");
+ };
+ click.activate();
+ click.getInfoForClick({xy: {x: 50, y: 50}});
+ OpenLayers.Request.GET = _request;
+ map.destroy();
+ }
+
+ function test_drillDown(t) {
+ t.plan(6);
+ var map = new OpenLayers.Map("map", {
+ getExtent: function() {return(new OpenLayers.Bounds(-180,-90,180,90));}
+ }
+ );
+
+ var a = new OpenLayers.Layer.WMS("dummy","http://localhost/wms", {
+ layers: "a"
+ });
+
+ var b = new OpenLayers.Layer.WMS("dummy","http://localhost/wms", {
+ layers: "c"
+ });
+
+ // this service does not support application/vnd.ogc.gml for GetFeatureInfo, only text/xml
+ var c = new OpenLayers.Layer.WMS("dummy","http://myhost/wms", {
+ layers: "x",
+ info_format: "text/xml"
+ });
+
+ map.addLayers([a, b, c]);
+
+ var click = new OpenLayers.Control.WMSGetFeatureInfo({
+ drillDown: true,
+ infoFormat: "application/vnd.ogc.gml"
+ });
+
+ map.addControl(click);
+
+ var count = 0;
+ var _request = OpenLayers.Request.GET;
+ OpenLayers.Request.GET = function(options) {
+ count++;
+ if (count == 2) {
+ t.eq(options.params["INFO_FORMAT"], "application/vnd.ogc.gml", "Default info format of the control is used");
+ t.eq(options.params["QUERY_LAYERS"].join(","), "c,a", "Layers should be grouped by service url");
+ t.eq(options.url, "http://localhost/wms", "Correct url used for second request");
+ } else if (count == 1) {
+ t.eq(options.params["INFO_FORMAT"], "text/xml", "Overridden info format is used instead of the control's infoFormat");
+ t.eq(options.url, "http://myhost/wms", "Correct url used for first request");
+ }
+ };
+ click.activate();
+ click.getInfoForClick({xy: {x: 50, y: 50}});
+ OpenLayers.Request.GET = _request;
+ t.eq(count, 2, "We expect 2 requests to go off");
+ map.destroy();
+ }
+
+ function test_GetFeatureInfo_buildWMSOptions(t) {
+ t.plan(3);
+
+ var map = new OpenLayers.Map("map", {
+ getExtent: function() {return(new OpenLayers.Bounds(-180,-90,180,90));},
+ projection: "EPSG:900913"
+ });
+ var a = new OpenLayers.Layer.WMS("dummy", "http://localhost/wms", {
+ layers: "a"
+ }, {projection: "EPSG:3857"});
+ var b = new OpenLayers.Layer.WMS("dummy", "http://localhost/wms", {
+ layers: "b"
+ });
+ var c = new OpenLayers.Layer.WMS("dummy", "http://localhost/wms", {
+ layers: "c"
+ }, {projection: "EPSG:4326"});
+ map.addLayers([a, b, c]);
+ var gfi = new OpenLayers.Control.WMSGetFeatureInfo();
+ map.addControl(gfi);
+ gfi.activate();
+
+ var options = gfi.buildWMSOptions("http://localhost/wms", [a], {xy: {x: 50, y: 50}}, "text/html");
+ t.eq(options.params.SRS, "EPSG:3857", "layer projection used if provided and equal map projection");
+
+ options = gfi.buildWMSOptions("http://localhost/wms", [b], {xy: {x: 50, y: 50}}, "text/html");
+ t.eq(options.params.SRS, "EPSG:900913", "map projection used if layer has no projection configured");
+
+ options = gfi.buildWMSOptions("http://localhost/wms", [b], {xy: {x: 50, y: 50}}, "text/html");
+ t.eq(options.params.SRS, "EPSG:900913", "map projection used if layer configured with an incompatible projection");
+ }
+
+ function test_GetFeatureInfo_WMS13(t) {
+ t.plan(4);
+ var map = new OpenLayers.Map("map", {
+ getExtent: function() {return(new OpenLayers.Bounds(-180,-90,180,90));}
+ }
+ );
+
+ var a = new OpenLayers.Layer.WMS(null, "http://localhost/wms", {
+ layers: "a",
+ version: "1.3.0"
+ });
+ map.addLayer(a);
+
+ var click = new OpenLayers.Control.WMSGetFeatureInfo({
+ });
+
+ map.addControl(click);
+ var log = {};
+ var _request = OpenLayers.Request.GET;
+ OpenLayers.Request.GET = function(options) {
+ log.options = options;
+ };
+ click.activate();
+ click.getInfoForClick({xy: {x: 50.1, y: 60.2}});
+ OpenLayers.Request.GET = _request;
+ t.eq(
+ log.options && log.options.params.CRS,
+ "EPSG:4326",
+ "Since it is WMS 1.3 use CRS parameter instead of SRS in the GetFeatureInfo request"
+ );
+
+ t.eq(
+ log.options && log.options.params.I,
+ 50,
+ "Since it is WMS 1.3 use I parameter instead of X in the GetFeatureInfo request"
+ );
+
+ t.eq(
+ log.options && log.options.params.J,
+ 60,
+ "Since it is WMS 1.3 use J parameter instead of Y in the GetFeatureInfo request"
+ );
+
+ t.eq(
+ log.options && log.options.params.BBOX,
+ "-90,-180,90,180",
+ "Since it is WMS 1.3 the BBOX should respect axis order"
+ );
+
+ }
+
+ </script>
+</head>
+<body>
+ <div id="map" style="width: 400px; height: 250px;"/>
+</body>
+</html>