summaryrefslogtreecommitdiff
path: root/misc/openlayers/tests/Layer.html
diff options
context:
space:
mode:
Diffstat (limited to 'misc/openlayers/tests/Layer.html')
-rw-r--r--misc/openlayers/tests/Layer.html910
1 files changed, 910 insertions, 0 deletions
diff --git a/misc/openlayers/tests/Layer.html b/misc/openlayers/tests/Layer.html
new file mode 100644
index 0000000..954a363
--- /dev/null
+++ b/misc/openlayers/tests/Layer.html
@@ -0,0 +1,910 @@
+<html>
+<head>
+ <script src="OLLoader.js"></script>
+ <script type="text/javascript">
+ var layer;
+
+ function test_Layer_constructor (t) {
+ t.plan( 15 );
+
+ var options = { chicken: 151, foo: "bar", projection: "none" };
+ var layer = new OpenLayers.Layer('Test Layer', options);
+
+ t.ok( layer instanceof OpenLayers.Layer, "new OpenLayers.Layer returns object" );
+ t.eq( layer.CLASS_NAME, "OpenLayers.Layer", "CLASS_NAME variable set correctly");
+
+ t.eq( layer.name, "Test Layer", "layer.name is correct" );
+ t.ok( layer.id != null, "Layer is given an id");
+ t.ok( layer.projection, "none", "default layer projection correctly set");
+ t.ok( ((layer.chicken == 151) && (layer.foo == "bar")), "layer.options correctly set to Layer Object" );
+ t.ok( ((layer.options["chicken"] == 151) && (layer.options["foo"] == "bar")), "layer.options correctly backed up" );
+
+ t.ok( typeof layer.div == "object" , "layer.div is created" );
+ t.eq( layer.div.id, layer.id, "layer.div.id is correct" );
+
+ options.chicken = 552;
+
+ t.eq( layer.options["chicken"], 151 , "layer.options correctly made fresh copy" );
+
+ t.eq( layer.isBaseLayer, false, "Default layer is not base layer" );
+
+ layer = new OpenLayers.Layer('Test Layer');
+ t.ok( layer instanceof OpenLayers.Layer, "new OpenLayers.Layer returns object" );
+ t.eq( layer.name, "Test Layer", "layer.name is correct" );
+ t.ok( layer.projection == null, "default layer projection correctly set");
+ t.ok( layer.options instanceof Object, "layer.options correctly initialized as a non-null Object" );
+ }
+
+
+ function test_Layer_clone (t) {
+ t.plan( 7 );
+
+ var mapone = new OpenLayers.Map('map');
+ var options = { chicken: 151, foo: "bar", maxResolution: "auto", visibility: false };
+ var layer = new OpenLayers.Layer('Test Layer', options);
+ mapone.addLayer(layer);
+ layer.setVisibility(true);
+
+ // randomly assigned property
+ layer.chocolate = 5;
+
+ var clone = layer.clone();
+
+ t.ok( clone.map == null, "cloned layer has map property set to null")
+
+ var maptwo = new OpenLayers.Map('map2');
+ maptwo.addLayer(clone);
+
+ t.ok( clone instanceof OpenLayers.Layer, "new OpenLayers.Layer returns object" );
+ t.eq( clone.name, "Test Layer", "default clone.name is correct" );
+ t.ok( ((clone.options["chicken"] == 151) && (clone.options["foo"] == "bar")), "clone.options correctly set" );
+ t.eq(clone.chocolate, 5, "correctly copied randomly assigned property");
+
+ t.eq(clone.visibility, true, "visibility correctly cloned");
+
+ layer.addOptions({chicken:152});
+ t.eq(clone.options["chicken"], 151, "made a clean copy of options");
+
+ mapone.destroy();
+ maptwo.destroy();
+ }
+
+ function test_Layer_setName (t) {
+
+ t.plan( 1 );
+
+ layer = new OpenLayers.Layer('Test Layer');
+ layer.setName("chicken");
+
+ t.eq(layer.name, "chicken", "setName() works")
+
+ }
+
+ function test_Layer_addOptions (t) {
+
+ t.plan( 20 );
+
+ var map = new OpenLayers.Map("map", {allOverlays: true});
+ var options = { chicken: 151, foo: "bar" };
+ var layer = new OpenLayers.Layer('Test Layer', options);
+ map.addLayer(layer);
+
+ layer.addOptions({bark:55, chicken: 171});
+ t.eq(layer.bark, 55, "addOptions() assigns new option correctly to Layer");
+ t.eq(layer.options.bark, 55, "addOptions() adds new option correctly to backup");
+
+ t.eq(layer.chicken, 171, "addOptions() overwrites option correctly to Layer");
+ t.eq(layer.options.chicken, 171, "addOptions() overwrites option correctly to backup");
+
+ var log;
+ layer.initResolutions = function() {
+ log++;
+ };
+ log = 0;
+ layer.addOptions({bark: 56});
+ t.eq(log, 0, "addOptions doesn't call initResolutions when not given a resolution option");
+
+ log = 0;
+ layer.addOptions({scales: [1, 2]});
+ t.eq(log, 1, "addOptions calls initResolutions when given scales");
+
+ log = 0;
+ layer.addOptions({resolutions: [1, 2]});
+ t.eq(log, 1, "addOptions calls initResolutions when given resolutions");
+
+ log = 0;
+ layer.addOptions({minScale: 4});
+ t.eq(log, 1, "addOptions calls initResolutions when given minScale");
+
+ log = 0;
+ layer.addOptions({maxScale: 4});
+ t.eq(log, 1, "addOptions calls initResolutions when given maxScale");
+
+ log = 0;
+ layer.addOptions({minResolution: 4});
+ t.eq(log, 1, "addOptions calls initResolutions when given minResolution");
+
+ log = 0;
+ layer.addOptions({maxResolution: 4});
+ t.eq(log, 1, "addOptions calls initResolutions when given maxResolution");
+
+ log = 0;
+ layer.addOptions({numZoomLevels: 4});
+ t.eq(log, 1, "addOptions calls initResolutions when given numZoomLevels");
+
+ log = 0;
+ layer.addOptions({maxZoomLevel: 4});
+ t.eq(log, 1, "addOptions calls initResolutions when given maxZoomLevel");
+
+ log = 0;
+ layer.addOptions({projection: new OpenLayers.Projection("EPSG:900913")});
+ t.eq(log, 1, "addOptions calls initResolutions when given projection");
+
+ log = 0;
+ layer.addOptions({units: "m"});
+ t.eq(log, 1, "addOptions calls initResolutions when given units");
+
+ log = 0;
+ layer.addOptions({minExtent: new OpenLayers.Bounds(0, 0, 0, 0)});
+ t.eq(log, 1, "addOptions calls initResolutions when given minExtent");
+
+ log = 0;
+ layer.addOptions({maxExtent: new OpenLayers.Bounds(0, 0, 0, 0)});
+ t.eq(log, 1, "addOptions calls initResolutions when given maxExtent");
+
+ layer.projection = null;
+ layer.addOptions({projection: "EPSG:900913"});
+ t.ok(layer.projection instanceof OpenLayers.Projection,
+ "addOptions creates a Projection object when given a projection string");
+
+ log = null;
+ // adding a 2nd layer to see if it gets reinitialized properly
+ var layer2 = new OpenLayers.Layer(null, {
+ moveTo: function(bounds) {
+ log = bounds;
+ }
+ });
+ map.addLayer(layer2);
+ layer.addOptions({maxResolution: 0.00034332275390625}, true);
+ t.eq(log.toBBOX(), map.getExtent().toBBOX(), "when reinitialize is set to true, changing base layer's resolution property reinitializes all layers.");
+
+ map.removeLayer(layer);
+ log = 0;
+ layer.addOptions({minExtent: new OpenLayers.Bounds(0, 0, 0, 0)});
+ t.eq(log, 0, "addOptions doesn't call initResolutions when layer is not in map");
+ }
+
+ function test_addOptionsScale(t) {
+ t.plan(1);
+ var map = new OpenLayers.Map("map");
+ var layer = new OpenLayers.Layer.WMS();
+ map.addLayer(layer);
+ map.zoomToMaxExtent();
+ layer.addOptions({maxResolution: 0.5, numZoomLevels: 15});
+ t.eq(layer.alwaysInRange, false, "alwaysInRange should not be true anymore");
+ }
+
+ function test_Layer_StandardOptionsAccessors (t) {
+
+ t.plan( 4 );
+
+ var projection = "EPSG:4326";
+ var maxExtent = new OpenLayers.Bounds(50,50,100,100);
+ var maxResolution = 1.5726;
+ var numZoomLevels = 11;
+
+ var options = { projection: projection,
+ maxExtent: maxExtent,
+ maxResolution: maxResolution,
+ numZoomLevels: numZoomLevels
+ };
+
+ var layer = new OpenLayers.Layer('Test Layer', options);
+
+ t.eq(layer.projection.getCode(), projection, "projection set correctly");
+ t.ok(layer.maxExtent.equals(maxExtent), "maxExtent set correctly");
+ t.eq(layer.maxResolution, maxResolution, "maxResolution set correctly");
+ t.eq(layer.numZoomLevels, numZoomLevels, "numZoomLevels set correctly");
+ }
+
+ function test_maxExtent(t) {
+ t.plan(5);
+
+ var layer = new OpenLayers.Layer(
+ null, {maxExtent: [-180, 0, 0, 90]}
+ );
+
+ t.ok(layer.maxExtent instanceof OpenLayers.Bounds, "(array) bounds instance");
+ t.eq(layer.maxExtent.left, -180, "(array) bounds left");
+ t.eq(layer.maxExtent.bottom, 0, "(array) bounds left");
+ t.eq(layer.maxExtent.right, 0, "(array) bounds right");
+ t.eq(layer.maxExtent.top, 90, "(array) bounds top");
+
+ layer.destroy();
+ }
+
+ function test_minExtent(t) {
+ t.plan(5);
+
+ var layer = new OpenLayers.Layer(
+ null, {minExtent: [-180, 0, 0, 90]}
+ );
+
+ t.ok(layer.minExtent instanceof OpenLayers.Bounds, "(array) bounds instance");
+ t.eq(layer.minExtent.left, -180, "(array) bounds left");
+ t.eq(layer.minExtent.bottom, 0, "(array) bounds left");
+ t.eq(layer.minExtent.right, 0, "(array) bounds right");
+ t.eq(layer.minExtent.top, 90, "(array) bounds top");
+
+ layer.destroy();
+ }
+
+
+ function test_eventListeners(t) {
+ t.plan(1);
+
+ var method = OpenLayers.Events.prototype.on;
+ // test that events.on is called at layer construction
+ var options = {
+ eventListeners: {foo: "bar"}
+ };
+ OpenLayers.Events.prototype.on = function(obj) {
+ t.eq(obj, options.eventListeners, "events.on called with eventListeners");
+ }
+ var layer = new OpenLayers.Layer("test", options);
+ OpenLayers.Events.prototype.on = method;
+ layer.destroy();
+
+ // if events.on is called again, this will fail due to an extra test
+ // test layer without eventListeners
+ OpenLayers.Events.prototype.on = function(obj) {
+ t.fail("events.on called without eventListeners");
+ }
+ var layer2 = new OpenLayers.Layer("test");
+ OpenLayers.Events.prototype.on = method;
+ layer2.destroy();
+ }
+
+ function test_initResolutions_alwaysInRange(t) {
+ t.plan(3);
+
+ var map, layer;
+
+ map = new OpenLayers.Map("map");
+ layer = new OpenLayers.Layer("test", {maxResolution: 80, minResolution: 10});
+ map.addLayer(layer);
+ t.eq(layer.alwaysInRange, false,
+ "alwaysInRange set to false due to passed options");
+ map.destroy();
+
+ map = new OpenLayers.Map("map");
+ layer = new OpenLayers.Layer("test", {projection: "unknown"});
+ map.addLayer(layer);
+ t.eq(layer.alwaysInRange, true,
+ "alwaysInRange true if unknown projection is set.");
+ map.destroy();
+
+ map = new OpenLayers.Map("map");
+ OpenLayers.Layer.prototype.alwaysInRange = false;
+ layer = new OpenLayers.Layer("test", {'projection': 'EPSG:4326'});
+ map.addLayer(layer);
+ t.eq(layer.alwaysInRange, false,
+ "alwaysInRange true if overridden on prototype.");
+ OpenLayers.Layer.prototype.alwaysInRange = null;
+ map.destroy();
+ }
+
+ function test_initResolutions_resolutions(t) {
+
+ function initResolutionsTest(
+ id, mapOptions, layerOptions,
+ expectedResolutions, expectedMinResolution, expectedMaxResolution) {
+
+ // setup
+ var map = new OpenLayers.Map("map", mapOptions);
+ var layer = new OpenLayers.Layer(null, layerOptions);
+ map.addLayer(layer);
+
+ // make resolution assertions
+ t.eq(
+ layer.resolutions.length, expectedResolutions.length,
+ id + ": correct resolutions length"
+ );
+ // allow for floating point imprecision
+ var got, exp, same = true;
+ for (var i=0; i<expectedResolutions.length; ++i) {
+ got = layer.resolutions[i];
+ exp = expectedResolutions[i];
+ if (got.toFixed(10) !== exp.toFixed(10)) {
+ t.fail(id + ": bad resolutions - index " + i + " got " + got + " but expected " + exp);
+ same = false;
+ break;
+ }
+ }
+ if (same) {
+ t.ok(true, id + ": correct resolutions");
+ }
+ t.eq(
+ layer.maxResolution, expectedMaxResolution,
+ id + ": maxResolution set"
+ );
+ t.eq(
+ layer.minResolution, expectedMinResolution,
+ id + ": minResolution set"
+ );
+
+ // teardown
+ map.destroy();
+ }
+
+ // each case is an array of id, map options, layer options, expected resolutions,
+ // expected min resolution, and expected max resolution
+ var cases = [[
+
+ /*
+ * Batch 1: map defaults and sensible layer options
+ */
+
+ "1.0", null, {resolutions: [400, 200, 100]},
+ [400, 200, 100], 100, 400
+ ], [
+ "1.1", null, {resolutions: [400, 200, 100], minResolution: 150, maxResolution: 300},
+ [400, 200, 100], 150, 300
+ ], [
+ "1.2", null, {maxResolution: 4000, numZoomLevels: 3},
+ [4000, 2000, 1000], 1000, 4000
+ ], [
+ "1.3", null, {maxResolution: 4000, maxZoomLevel: 2},
+ [4000, 2000, 1000], 1000, 4000
+ ], [
+ "1.4", null, {minResolution: 40, numZoomLevels: 3},
+ [160, 80, 40], 40, 160
+ ], [
+ "1.5", null, {minResolution: 40, maxZoomLevel: 2},
+ [160, 80, 40], 40, 160
+ ], [
+ "1.6", null, {minResolution: 10, maxResolution: 40},
+ [40, 20, 10], 10, 40
+ ], [
+ "1.7", null, {minResolution: 10, maxResolution: 40, numZoomLevels: 3},
+ [40, 20, 10], 10, 40
+ ], [
+ "1.8", null, {minResolution: 10, maxResolution: 40, maxZoomLevel: 2},
+ [40, 20, 10], 10, 40
+ ], [
+ "1.9", null, {scales: [400000, 200000, 100000]},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "1.10", null, {scales: [400000, 200000, 100000], minScale: 400000, maxScale: 100000},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "1.11", null, {minScale: 400000, numZoomLevels: 3},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "1.12", null, {minScale: 400000, maxZoomLevel: 2},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "1.13", null, {maxScale: 100000, numZoomLevels: 3},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "1.14", null, {maxScale: 100000, maxZoomLevel: 2},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "1.15", null, {maxScale: 100000, minScale: 400000},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "1.16", null, {maxScale: 100000, minScale: 400000, numZoomLevels: 3},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "1.17", null, {maxScale: 100000, minScale: 400000, maxZoomLevel: 2},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "1.18", null, {scales: [400000, 200000, 100000], units: "m"},
+ [141.11139333389778, 70.55569666694889, 35.277848333474445], 35.277848333474445, 141.11139333389778
+ ], [
+ "1.19", null, {minScale: 400000, numZoomLevels: 3, units: "m"},
+ [141.11139333389778, 70.55569666694889, 35.277848333474445], 35.277848333474445, 141.11139333389778
+ ], [
+ "1.20", null, {maxScale: 100000, numZoomLevels: 3, units: "m"},
+ [141.11139333389778, 70.55569666694889, 35.277848333474445], 35.277848333474445, 141.11139333389778
+ ], [
+ "1.21", null, {numZoomLevels: 2}, // maxResolution calculated based on the projection's maxExtent here
+ [1.40625, 0.703125], 0.703125, 1.40625
+ ], [
+
+ /*
+ * Batch 2: custom map options map and sensible layer options
+ */
+
+ /*
+ * Batch 2.1: resolutions set in the layer options
+ */
+ "2.1.0", {resolutions: [300, 150]}, {resolutions: [400, 200, 100]},
+ [400, 200, 100], 100, 400
+ ], [
+ "2.1.1", {numZoomLevels: 4}, {resolutions: [400, 200, 100]},
+ [400, 200, 100], 100, 400
+ ], [
+ "2.1.2", {maxResolution: 300}, {resolutions: [400, 200, 100]},
+ [400, 200, 100], 100, 400
+ ], [
+ "2.1.3", {minResolution: 300}, {resolutions: [400, 200, 100]},
+ [400, 200, 100], 100, 400
+ ], [
+ "2.1.4", {scales: [4, 2, 1]}, {resolutions: [400, 200, 100]},
+ [400, 200, 100], 100, 400
+ ], [
+ "2.1.5", {minScale: 4}, {resolutions: [400, 200, 100]},
+ [400, 200, 100], 100, 400
+ ], [
+ "2.1.6", {maxScale: 4}, {resolutions: [400, 200, 100]},
+ [400, 200, 100], 100, 400
+ ], [
+ /*
+ * Batch 2.2: minResolution and maxResolution set in the layer options
+ */
+ "2.2.0", {resolutions: [80, 40, 20, 10]}, {minResolution: 12, maxResolution: 48, numZoomLevels: 0},
+ [80, 40, 20, 10], 12, 48
+ ], [
+ "2.2.1", {resolutions: [80, 40, 20, 10]}, {minResolution: 12, maxResolution: 48, numZoomLevels: -1},
+ [80, 40, 20, 10], 12, 48
+ ], [
+ "2.2.2", {resolutions: [80, 40, 20, 10]}, {minResolution: 12, maxResolution: 48, numZoomLevels: null},
+ [80, 40, 20, 10], 12, 48
+ ], [
+ "2.2.3", {resolutions: [80, 40, 20, 10]}, {minResolution: 12, maxResolution: 48, numZoomLevels: undefined},
+ [48, 24, 12], 12, 48
+ ], [
+ "2.2.4", {resolutions: [80, 40, 20, 10]}, {minResolution: 12, maxResolution: 48, numZoomLevels: 3},
+ [48, 24, 12], 12, 48
+ ], [
+ "2.2.5", {resolutions: [80, 40, 20, 10]}, {minResolution: 12, maxResolution: 48},
+ [48, 24, 12], 12, 48
+ ], [
+ /*
+ * Batch 2.3: maxResolution set in the layer options
+ */
+ "2.3.0", {resolutions: [300, 150]}, {maxResolution: 4000, numZoomLevels: 3},
+ [4000, 2000, 1000], 1000, 4000
+ ], [
+ "2.3.1", {numZoomLevels: 2}, {maxResolution: 4000, numZoomLevels: 3},
+ [4000, 2000, 1000], 1000, 4000
+ ], [
+ "2.3.2", {maxResolution: 50}, {maxResolution: 4000, numZoomLevels: 3},
+ [4000, 2000, 1000], 1000, 4000
+ ], [
+ "2.3.3", {scales: [4, 2, 1]}, {maxResolution: 4000, numZoomLevels: 3},
+ [4000, 2000, 1000], 1000, 4000
+ ], [
+ "2.3.4", {minScale: 4}, {maxResolution: 4000, numZoomLevels: 3},
+ [4000, 2000, 1000], 1000, 4000
+ ], [
+ "2.3.5", {resolutions: [300, 150]}, {maxResolution: 250},
+ [300, 150], 150, 250
+ ], [
+ /*
+ * Batch 2.4: minResolution set in the layer options
+ */
+ "2.4.0", {resolutions: [300, 150]}, {minResolution: 40, numZoomLevels: 3},
+ [160, 80, 40], 40, 160
+ ], [
+ "2.4.1", {numZoomLevels: 2}, {minResolution: 40, numZoomLevels: 3},
+ [160, 80, 40], 40, 160
+ ], [
+ "2.4.2", {minResolution: 50}, {minResolution: 40, numZoomLevels: 3},
+ [160, 80, 40], 40, 160
+ ], [
+ "2.4.3", {scales: [4, 2, 1]}, {minResolution: 40, numZoomLevels: 3},
+ [160, 80, 40], 40, 160
+ ], [
+ "2.4.4", {maxScale: 1}, {minResolution: 40, numZoomLevels: 3},
+ [160, 80, 40], 40, 160
+ ], [
+ "2.4.5", {resolutions: [300, 150]}, {minResolution: 250},
+ [300, 150], 250, 300
+ ], [
+ /*
+ * Batch 2.5: scales set in the layer options
+ */
+ "2.5.0", {resolutions: [4, 2, 1]}, {scales: [400000, 200000, 100000]},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "2.5.1", {numZoomLevels: 2}, {scales: [400000, 200000, 100000]},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "2.5.2", {maxResolution: 4}, {scales: [400000, 200000, 100000]},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "2.5.3", {minResolution: 1}, {scales: [400000, 200000, 100000]},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "2.5.4", {units: "m"}, {scales: [400000, 200000, 100000]},
+ [141.11139333389778, 70.55569666694889, 35.277848333474445], 35.277848333474445, 141.11139333389778
+ ], [
+ /*
+ * Batch 2.6: minScale set in the layer options
+ */
+ "2.6.0", {resolutions: [4, 2, 1]}, {minScale: 400000, numZoomLevels: 3},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "2.6.1", {numZoomLevels: 2}, {minScale: 400000, numZoomLevels: 3},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "2.6.2", {maxResolution: 4}, {minScale: 400000, numZoomLevels: 3},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "2.6.3", {scales: [400000, 200000, 100000]}, {minScale: 200000},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0006349563376084181
+ ], [
+ /*
+ * Batch 2.7: maxScale set in the layer options
+ */
+ "2.7.0", {resolutions: [4, 2, 1]}, {maxScale: 100000, numZoomLevels: 3},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "2.7.1", {numZoomLevels: 2}, {maxScale: 100000, numZoomLevels: 3},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "2.7.2", {minResolution: 1}, {maxScale: 100000, numZoomLevels: 3},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+ ], [
+ "2.7.3", {scales: [400000, 200000, 100000]}, {maxScale: 200000},
+ [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.0006349563376084181, 0.0012699126752168362
+ ], [
+ /*
+ * Batch 2.8: numZoomLevels set in the layer options
+ */
+ "2.8.0", {maxResolution: 80}, {numZoomLevels: 4}, // maxResolution calculated based on the projection's maxExtent here
+ [1.40625, 0.703125, 0.3515625, 0.17578125], 0.17578125, 1.40625
+ ], [
+ "2.8.1", {maxResolution: 80, numZoomLevels: 4}, {numZoomLevels: null},
+ [80, 40, 20, 10], 10, 80
+ ], [
+ "2.8.2", {maxResolution: 80, numZoomLevels: 4}, {numZoomLevels: undefined},
+ [80, 40, 20, 10], 10, 80
+ ]];
+
+ // run all cases (4 tests each)
+ var i, num = cases.length, c;
+ t.plan(num * 4);
+ for (i=0; i<num; ++i) {
+ c = cases[i];
+ initResolutionsTest(c[0], c[1], c[2], c[3], c[4], c[5]);
+ }
+
+ }
+
+ function test_Layer_visibility(t) {
+
+ t.plan(7);
+
+ var layer = new OpenLayers.Layer('Test Layer');
+
+ t.eq(layer.getVisibility(), true, "default for layer creation is visible");
+
+ layer.setVisibility(false);
+ t.eq(layer.getVisibility(), false, "setVisibility false works");
+
+ layer.setVisibility(true);
+ t.eq(layer.getVisibility(), true, "setVisibility true works");
+
+ // Need a map in order to have moveTo called.
+ // Tests added for #654.
+ var layer = new OpenLayers.Layer.WMS('Test Layer','http://example.com');
+ var m = new OpenLayers.Map('map');
+ m.addLayer(layer);
+ m.zoomToMaxExtent();
+
+ layermoved = false;
+ layer.moveTo = function() { layermoved = true; }
+
+ layer.events.register('visibilitychanged', t, function() {
+ this.ok(true, "Visibility changed calls layer event.");
+ });
+
+ layer.setVisibility(false);
+ t.eq(layermoved, false, "Layer didn't move when calling setvis false");
+
+ layer.setVisibility(true);
+ t.eq(layermoved, true, "Layer moved when calling setvis true.");
+
+ }
+
+
+ function test_Layer_getZoomForResolution(t) {
+
+ t.plan(12);
+
+ var layer = new OpenLayers.Layer('Test Layer');
+ layer.map = {};
+
+ //make some dummy resolutions
+ layer.resolutions = [128, 64, 32, 16, 8, 4, 2];
+
+ t.eq(layer.getZoomForResolution(200), 0, "zoom all the way out");
+ t.eq(layer.getZoomForResolution(25), 2, "zoom in middle");
+ t.eq(layer.getZoomForResolution(3), 5, "zoom allmost all the way in");
+ t.eq(layer.getZoomForResolution(1), 6, "zoom all the way in");
+
+ t.eq(layer.getZoomForResolution(65), 0, "smallest containing res");
+ t.eq(layer.getZoomForResolution(63), 1, "smallest containing res");
+
+ t.eq(layer.getZoomForResolution(65, true), 1, "closest res");
+ t.eq(layer.getZoomForResolution(63, true), 1, "closest res");
+
+ layer.map.fractionalZoom = true;
+ t.eq(layer.getZoomForResolution(64), 1,
+ "(fractionalZoom) correct zoom for res in array");
+ t.eq(layer.getZoomForResolution(48).toPrecision(6), (1.5).toPrecision(6),
+ "(fractionalZoom) linear scaling for res between entries");
+ t.eq(layer.getZoomForResolution(200).toPrecision(6), (0).toPrecision(6),
+ "(fractionalZoom) doesn't return zoom below zero");
+ t.eq(layer.getZoomForResolution(1).toPrecision(6), (layer.resolutions.length - 1).toPrecision(6),
+ "(fractionalZoom) doesn't return zoom above highest index");
+ }
+
+ function test_Layer_redraw(t) {
+ t.plan(11)
+
+ var name = 'Test Layer';
+ var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+ var params = { map: '/mapdata/vmap_wms.map',
+ layers: 'basic',
+ format: 'image/jpeg'};
+
+ var layer = new OpenLayers.Layer.WMS(name, url, params);
+
+ t.ok(!layer.redraw(),
+ "redraw on an orphan layer returns false");
+
+ var map = new OpenLayers.Map('map');
+ map.addLayer(layer);
+
+ t.ok(!layer.redraw(),
+ "redraw returns false if map does not yet have a center");
+ map.zoomToMaxExtent();
+
+ t.ok(layer.redraw(),
+ "redraw returns true after map has a center");
+
+ layer.setVisibility(false);
+ t.ok(!layer.redraw(),
+ "redraw returns false if a layer is not visible");
+
+ layer.setVisibility(true);
+ t.ok(layer.redraw(),
+ "redraw returns true even if extent has not changed");
+
+ var log = {};
+ var onMoveend = function(e) {
+ log.event = e;
+ };
+ layer.events.on({"moveend": onMoveend});
+ layer.redraw();
+ layer.events.un({"moveend": onMoveend});
+ // test that the moveend event was triggered
+ t.ok(log.event, "an event was logged");
+ t.eq(log.event.type, "moveend", "moveend was triggered");
+ t.eq(log.event.zoomChanged, true, "event says zoomChanged true - poor name");
+
+ layer.moveTo = function(bounds, zoomChanged, dragging) {
+ var extent = layer.map.getExtent();
+ t.ok(bounds.equals(extent),
+ "redraw calls moveTo with the map extent");
+ t.ok(zoomChanged,
+ "redraw calls moveTo with zoomChanged true");
+ t.ok(!dragging,
+ "redraw calls moveTo with dragging false");
+ }
+ layer.redraw();
+ }
+
+ function test_layer_setIsBaseLayer(t) {
+ t.plan(2);
+ var map = new OpenLayers.Map('map');
+ layer = new OpenLayers.Layer();
+
+ map.events.register("changebaselayer", t, function() {
+ this.ok(true, "setIsBaseLayer() trig changebaselayer event.")
+ });
+
+ map.addLayer(layer);
+ layer.setIsBaseLayer(true);
+ t.ok(layer.isBaseLayer, "setIsBaseLayer() change isBaseLayer property.");
+ }
+
+ function test_layer_setTileSize(t) {
+ t.plan(4);
+
+ layer = new OpenLayers.Layer();
+
+ g_MapTileSize = new OpenLayers.Size(25,67);
+ layer.map = {
+ getTileSize: function() {
+ return g_MapTileSize;
+ }
+ };
+
+ var layerTileSize = new OpenLayers.Size(1,1);
+
+ //TILE SIZE
+ layer.tileSize = layerTileSize;
+
+ //parameter
+ var size = new OpenLayers.Size(2,2);
+ layer.setTileSize(size);
+ t.ok(layer.tileSize.equals(size), "size paramater set correctly to layer's tile size");
+
+ //set on layer
+ layer.tileSize = layerTileSize;
+ layer.setTileSize();
+ t.ok(layer.tileSize.equals(layerTileSize), "layer's tileSize property preserved if no parameter sent in");
+
+ //take it from map
+ layer.tileSize = null;
+ layer.setTileSize();
+ t.ok(layer.tileSize.equals(g_MapTileSize), "layer's tileSize property is null and so correctly taken from the map");
+
+
+
+ //GUTTERS
+ layer.gutter = 15;
+ size = new OpenLayers.Size(10,100);
+ layer.setTileSize(size);
+
+ var desiredImageSize = new OpenLayers.Size(40, 130);
+
+ t.ok(layer.imageSize.equals(desiredImageSize), "image size correctly calculated");
+ }
+
+ function test_Layer_getResolution(t) {
+ t.plan(1);
+ var layer = new OpenLayers.Layer("test");
+ layer.map = {
+ getZoom: function() {return "foo";}
+ };
+ layer.getResolutionForZoom = function(zoom) {
+ t.eq(zoom, "foo", "getResolution calls getResolutionForZoom");
+ }
+ layer.getResolution();
+ layer.map = null;
+ layer.destroy();
+ }
+
+ function test_Layer_getResolutionForZoom(t) {
+ t.plan(8);
+ var layer = new OpenLayers.Layer("test");
+ layer.map = {fractionalZoom: false};
+ layer.resolutions = ["zero", "one", "two"];
+ t.eq(layer.getResolutionForZoom(0), "zero",
+ "(fractionalZoom false) returns resolution for given index");
+ t.eq(layer.getResolutionForZoom(0.9), "one",
+ "(fractionalZoom false) returns resolution for float index");
+
+ layer.resolutions = [2, 4, 6, 8];
+ layer.map.fractionalZoom = true;
+ t.eq(layer.getResolutionForZoom(1).toPrecision(6), (4).toPrecision(6),
+ "(fractionalZoom true) returns resolution for integer zoom");
+
+ t.eq(layer.getResolutionForZoom(1.3).toPrecision(6), (4.6).toPrecision(6),
+ "(fractionalZoom true) for zoom 1.3 should be 4.6");
+
+ t.eq(layer.getResolutionForZoom(1.6).toPrecision(6), (5.2).toPrecision(6),
+ "(fractionalZoom true) for zoom 1.6 should be 5.2");
+
+ t.eq(layer.getResolutionForZoom(1.8).toPrecision(6), (5.6).toPrecision(6),
+ "(fractionalZoom true) for zoom 1.8 should be 5.6");
+
+ t.eq(layer.getResolutionForZoom(1.5).toPrecision(6), (5).toPrecision(6),
+ "(fractionalZoom true) returns resolution for float zoom");
+ t.eq(layer.getResolutionForZoom(3.5).toPrecision(6), (8).toPrecision(6),
+ "(fractionalZoom true) returns resolution for zoom beyond res length - 1");
+
+ }
+
+ function test_afterAdd(t) {
+
+ t.plan(4);
+
+ var log = [];
+ var map = new OpenLayers.Map("map");
+ var layer = new OpenLayers.Layer(null, {
+ isBaseLayer: true,
+ eventListeners: {
+ "added": function(evt) {
+ log.push(evt);
+ }
+ }
+ });
+ var hasBase = false;
+ layer.afterAdd = function() {
+ hasBase = !!(layer.map && layer.map.baseLayer);
+ }
+ map.addLayer(layer);
+ t.eq(hasBase, true, "when afterAdd is called, map has a base layer");
+ t.eq(log.length, 1, "added event triggered");
+ t.eq(log[0].map.id, map.id, "added listener argument with correct map");
+ t.eq(log[0].layer.id, layer.id, "added listener argument with correct layer");
+
+ }
+
+ function test_setOpacity(t) {
+ t.plan(5);
+
+ var map, layer, log;
+
+ map = new OpenLayers.Map("map");
+ layer = new OpenLayers.Layer("");
+ map.addLayer(layer);
+
+ log = [];
+ map.events.register('changelayer', t, function(event) {
+ log.push({layer: event.layer, property: event.property});
+ });
+ layer.setOpacity(0.42);
+ t.eq(layer.opacity, 0.42,
+ "setOpacity() set layer.opacity to correct value");
+ t.eq(log.length, 1,
+ "setOpacity() triggers changelayer once");
+ t.ok(log[0].layer == layer,
+ "changelayer listener called with expected layer");
+ t.eq(log[0].property, "opacity",
+ "changelayer listener called with expected property");
+
+ // This call must not trig the event because the opacity value is the same.
+ log = [];
+ layer.setOpacity(0.42);
+ t.eq(log.length, 0,
+ "setOpacity() does not trigger changelayer if the opacity value is the same");
+ }
+
+
+/******
+ *
+ *
+ * HERE IS WHERE SOME TESTS SHOULD BE PUT TO CHECK ON THE LONLAT-PX TRANSLATION
+ * FUNCTIONS AND RESOLUTION AND GETEXTENT GETZOOMLEVEL, ETC
+ *
+ *
+ */
+
+
+ function test_Layer_destroy (t) {
+ t.plan( 8 );
+
+ var log = [];
+ var map = new OpenLayers.Map('map');
+
+ layer = new OpenLayers.Layer('Test Layer', {
+ eventListeners: {
+ "removed": function(evt) {
+ log.push(evt);
+ }
+ }
+ });
+
+ map.addLayer(layer);
+
+ layer.destroy();
+
+ t.eq( layer.name, null, "layer.name is null after destroy" );
+ t.eq( layer.div, null, "layer.div is null after destroy" );
+ t.eq( layer.map, null, "layer.map is null after destroy" );
+ t.eq( layer.options, null, "layer.options is null after destroy" );
+
+ t.eq(map.layers.length, 0, "layer removed from map");
+ t.eq(log.length, 1, "removed event triggered");
+ t.eq(log[0].map.id, map.id, "removed listener argument with correct map");
+ t.eq(log[0].layer.id, layer.id, "removed listener argument with correct layer");
+
+ map.destroy();
+
+ }
+
+ </script>
+</head>
+<body>
+ <div id="map" style="width:500px;height:500px"></div>
+ <div id="map2" style="width:100px;height:100px"></div>
+</body>
+</html>