summaryrefslogtreecommitdiff
path: root/misc/openlayers/tests/Strategy/BBOX.html
diff options
context:
space:
mode:
Diffstat (limited to 'misc/openlayers/tests/Strategy/BBOX.html')
-rw-r--r--misc/openlayers/tests/Strategy/BBOX.html361
1 files changed, 361 insertions, 0 deletions
diff --git a/misc/openlayers/tests/Strategy/BBOX.html b/misc/openlayers/tests/Strategy/BBOX.html
new file mode 100644
index 0000000..6e409e6
--- /dev/null
+++ b/misc/openlayers/tests/Strategy/BBOX.html
@@ -0,0 +1,361 @@
+<html>
+<head>
+ <script src="../OLLoader.js"></script>
+ <script type="text/javascript">
+
+ function test_initialize(t) {
+ t.plan(1);
+
+ var ratio = 4;
+
+ var s = new OpenLayers.Strategy.BBOX({ratio: ratio});
+ t.eq(s.ratio, ratio, "ctor sets ratio");
+ }
+
+ function test_activate(t) {
+ t.plan(5);
+
+ var l = new OpenLayers.Layer.Vector();
+ var s = new OpenLayers.Strategy.BBOX();
+ s.setLayer(l);
+
+ t.eq(s.active, false, "not active after construction");
+
+ var activated = s.activate();
+ t.eq(activated, true, "activate returns true");
+ t.eq(s.active, true, "activated after activate");
+ t.ok(l.events.listeners["moveend"][0].obj == s &&
+ l.events.listeners["moveend"][0].func == s.update,
+ "activates registers moveend listener");
+ t.ok(l.events.listeners["refresh"][0].obj == s &&
+ l.events.listeners["refresh"][0].func == s.update,
+ "activates registers refresh listener");
+ }
+
+ function test_update(t) {
+ t.plan(7);
+
+ // Create a dummy layer that can act as the map base layer.
+ // This will be unnecessary if #1921 is addressed (allowing
+ // map to have different projection than base layer).
+ var dummy = new OpenLayers.Layer(null, {isBaseLayer: true});
+
+ var strategy = new OpenLayers.Strategy.BBOX({
+ ratio: 1 // makes for easier comparison to map bounds
+ });
+ var log = [];
+ var layer = new OpenLayers.Layer.Vector(null, {
+ isBaseLayer: true,
+ protocol: new OpenLayers.Protocol({abort: function(response) { log.push(response); }}),
+ strategies: [strategy]
+ });
+
+ // create a map with the layers and a center
+ var map = new OpenLayers.Map("map", {zoomMethod: null});
+ map.addLayers([dummy, layer]);
+ map.zoomToMaxExtent();
+
+ /**
+ * The setCenter call above should set strategy bounds. I *think* this
+ * issue is captured in http://trac.openlayers.org/ticket/1835.
+ * For now, I'm going to force an update on the strategy. This line
+ * should be removed when the issue(s) described in #1835 are addressed.
+ */
+ strategy.update({force: true});
+ strategy.response = {};
+ strategy.update({force: true});
+ t.eq(log.length, 1, "Response aborted");
+ log = [];
+ strategy.update({force: true});
+ strategy.update({force: true, noAbort: true});
+ t.eq(log.length, 0, "Response not aborted when noAbort is true");
+
+ // test that the strategy bounds were set
+ t.ok(map.getExtent().equals(strategy.bounds), "[set center] bounds set to map extent");
+
+ // zoom and test that bounds are not reset
+ var old = strategy.bounds.clone();
+ map.zoomIn();
+ t.ok(strategy.bounds.equals(old), "[zoom in] bounds not reset");
+
+ // force update and check that bounds change
+ strategy.update({force: true});
+ t.ok(!strategy.bounds.equals(old), "[force update] bounds changed");
+ t.ok(strategy.bounds.equals(map.getExtent()), "[force update] bounds set to map extent");
+
+ // change the layer projection to confirm strategy uses same
+ layer.projection = new OpenLayers.Projection("EPSG:900913");
+ strategy.update({force: true});
+ var from = map.getProjectionObject();
+ var to = layer.projection;
+
+ var strategyBounds = strategy.bounds,
+ mapExtent = map.getExtent().transform(from, to),
+ // we don't use bounds::toString because we might run into
+ // precision issues
+ precision = 7,
+ strategyBoundsGot = [
+ strategyBounds.left.toFixed( precision ),
+ strategyBounds.bottom.toFixed( precision ),
+ strategyBounds.right.toFixed( precision ),
+ strategyBounds.top.toFixed( precision )
+ ].join(','),
+ mapExtentExpected = [
+ mapExtent.left.toFixed( precision ),
+ mapExtent.bottom.toFixed( precision ),
+ mapExtent.right.toFixed( precision ),
+ mapExtent.top.toFixed( precision )
+ ].join(',');
+ t.eq(strategyBoundsGot, mapExtentExpected,
+ "[force update different proj] bounds transformed");
+ }
+
+ function test_events(t) {
+
+ t.plan(7);
+
+ var log = [];
+
+ var response = new OpenLayers.Protocol.Response();
+
+ var map = new OpenLayers.Map("map");
+ var layer = new OpenLayers.Layer.Vector(null, {
+ strategies: [new OpenLayers.Strategy.BBOX()],
+ protocol: new OpenLayers.Protocol({
+ read: function(config) {
+ config.callback.call(config.scope, response);
+ }
+ }),
+ isBaseLayer: true,
+ eventListeners: {
+ loadstart: function(event) {
+ log.push(event);
+ },
+ loadend: function(event) {
+ log.push(event);
+ }
+ }
+ });
+ map.addLayer(layer);
+ map.zoomToMaxExtent();
+
+ t.eq(log.length, 2, "2 events logged");
+ t.eq(log[0].type, "loadstart", "loadstart first");
+ t.ok(log[0].filter.type === OpenLayers.Filter.Spatial.BBOX, "loadstart includes filter used");
+ t.eq(log[1].type, "loadend", "loadend second");
+ t.ok(log[1].response == response, "loadend includes response");
+
+ var calls = [];
+ layer.protocol.read = function(obj) {
+ calls.push(obj);
+ }
+ layer.refresh({force: true, whee: 'chicken'});
+
+ t.eq(calls.length, 1, "1 call to read");
+ t.eq(calls[0].whee, "chicken", "properties passed to read");
+
+ map.destroy();
+
+ }
+
+ function test_triggerRead(t) {
+ t.plan(4);
+
+ var s = new OpenLayers.Strategy.BBOX();
+
+ var filter = {"fake": "filter"};
+
+ s.createFilter = function() {
+ return filter;
+ };
+ s.response = {"fake": "response"};
+
+ var log = {};
+
+ var protocol = new OpenLayers.Protocol({
+ read: function(options) {
+ log.options = options;
+ },
+ abort: function(response) {
+ log.abort = response.fake;
+ }
+ });
+
+ var layer = new OpenLayers.Layer.Vector(null, {
+ strategies: [s],
+ protocol: protocol,
+ isBaseLayer: true
+ });
+ var map = new OpenLayers.Map("map");
+ map.addLayer(layer);
+ map.zoomToMaxExtent();
+
+ t.ok(log.options.filter == filter,
+ "protocol read called with correct filter");
+ t.ok(log.options.callback == s.merge,
+ "protocol read called with correct callback");
+ t.ok(log.options.scope == s,
+ "protocol read called with correct scope");
+ t.eq(log.abort, "response",
+ "protocol abort called with correct response");
+
+ map.destroy();
+
+ }
+
+ function test_resFactor(t) {
+ t.plan(2);
+
+ var map = new OpenLayers.Map("map", {zoomMethod: null});
+ var bbox = new OpenLayers.Strategy.BBOX();
+ var fakeProtocol = new OpenLayers.Protocol({
+ 'read': function() {
+ t.ok(true, "read called once without resfactor");
+ }
+ });
+ var layer = new OpenLayers.Layer.Vector("test", {
+ strategies: [bbox],
+ protocol: fakeProtocol,
+ isBaseLayer: true
+ });
+ map.addLayer(layer);
+ map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+ map.zoomIn();
+
+ fakeProtocol.read = function() {
+ t.ok("read called again on zooming with resFactor: 1");
+ }
+ bbox.resFactor = 1;
+ map.zoomIn();
+
+ }
+
+ function test_createFilter(t) {
+ t.plan(3);
+
+ var s = new OpenLayers.Strategy.BBOX();
+
+ var f;
+
+ // 2 test
+ s.setLayer({});
+ f = s.createFilter();
+ t.ok(f.CLASS_NAME.search(/^OpenLayers.Filter.Spatial/) != -1,
+ "createFilter returns a spatial filter object");
+ t.eq(f.type, OpenLayers.Filter.Spatial.BBOX,
+ "createFilter returns a BBOX-typed filter");
+
+ // 1 test
+ s.setLayer({filter: {fake: "filter"}});
+ f = s.createFilter();
+ t.ok(f.CLASS_NAME.search(/^OpenLayers.Filter.Logical/) != -1,
+ "createFilter returns a logical filter object");
+ }
+
+ function test_merge(t) {
+ t.plan(4);
+
+ var strategy = new OpenLayers.Strategy.BBOX();
+
+ // create map with default projection
+ var map = new OpenLayers.Map("map");
+
+ // create layer with custom projection
+ var layer = new OpenLayers.Layer.Vector(null, {
+ isBaseLayer: true,
+ strategies: [strategy],
+ protocol: new OpenLayers.Protocol(),
+ projection: new OpenLayers.Projection("EPSG:900913")
+ });
+ map.addLayer(layer);
+ map.zoomToMaxExtent();
+
+ // create some features
+ var geometries = [
+ new OpenLayers.Geometry.Point(100, 200),
+ new OpenLayers.Geometry.Point(1000, 2000)
+ ];
+ var features = [
+ new OpenLayers.Feature.Vector(geometries[0].clone()),
+ new OpenLayers.Feature.Vector(geometries[1].clone())
+ ];
+
+ // call merge with a mocked up response
+ strategy.merge({features: features, success: OpenLayers.Function.True});
+
+ // test that feature geometries have been transformed to map projection
+ var from = layer.projection;
+ var to = map.getProjectionObject();
+ t.geom_eq(layer.features[0].geometry, features[0].geometry.transform(from, to), "[different proj] feature 0 geometry transformed");
+ t.geom_eq(layer.features[1].geometry, features[1].geometry.transform(from, to), "[different proj] feature 1 geometry transformed");
+
+ // same as above but with same map/layer projection
+ layer.destroyFeatures();
+ layer.projection = map.getProjectionObject();
+
+ features = [
+ new OpenLayers.Feature.Vector(geometries[0].clone()),
+ new OpenLayers.Feature.Vector(geometries[1].clone())
+ ];
+
+ // call merge again with mocked up response
+ strategy.merge({features: features, success: OpenLayers.Function.True});
+
+ // test that feature geometries have not been transformed
+ t.geom_eq(layer.features[0].geometry, features[0].geometry, "[same proj] feature 0 geometry not transformed");
+ t.geom_eq(layer.features[1].geometry, features[1].geometry, "[same proj] feature 1 geometry not transformed");
+
+ }
+
+ // Test fix for Ticket #3142
+ function test_layerLoadedAfterBeingAdded(t) {
+ t.plan(3);
+
+ var dummy = new OpenLayers.Layer(null, {isBaseLayer: true});
+
+ var strategy = new OpenLayers.Strategy.BBOX({
+ ratio: 1 // makes for easier comparison to map bounds
+ });
+ var layer = new OpenLayers.Layer.Vector(null, {
+ protocol: new OpenLayers.Protocol(),
+ strategies: [strategy]
+ });
+
+ // Make sure to test the case of a vector layer needing to be
+ // reprojected while the map is not yet centered
+ var layerReproject = new OpenLayers.Layer.Vector(null, {
+ protocol: new OpenLayers.Protocol(),
+ strategies: [new OpenLayers.Strategy.BBOX()],
+ projection: 'EPSG:900913'
+ });
+
+ // Make sure that layers that are not in range don't request data
+ var layerOutOfRange = new OpenLayers.Layer.Vector(null, {
+ maxResolution: 1,
+ protocol: new OpenLayers.Protocol(),
+ strategies: [new OpenLayers.Strategy.BBOX()]
+ });
+
+ var map = new OpenLayers.Map("map");
+ map.addLayer(dummy);
+ map.addLayer(layerReproject);
+ map.setCenter(new OpenLayers.LonLat(0, 0));
+ map.addLayer(layer);
+ map.addLayer(layerOutOfRange);
+ // test that the strategy bounds were set
+ t.ok(map.getExtent().equals(strategy.bounds), "[set center] bounds set to map extent");
+ t.eq(layerOutOfRange.strategies[0].bounds, null, "Data not requested if layer is out of range");
+
+ layerOutOfRange.setVisibility(false);
+ layerOutOfRange.setVisibility(true);
+ t.eq(layerOutOfRange.strategies[0].bounds, null, "Data not requested if layer is out of range when switching visibility");
+
+ map.destroy();
+ }
+
+ </script>
+</head>
+<body>
+ <div id="map" style="width: 400px; height: 200px" />
+</body>
+</html>