3
<script src="../../lib/OpenLayers.js"></script>
4
<script type="text/javascript">
6
var name = "Vector Layer";
8
function test_Layer_Vector_constructor(t) {
11
var options = {protocol: new OpenLayers.Protocol(),
12
strategies: [new OpenLayers.Strategy(), new OpenLayers.Strategy()]}
13
var layer = new OpenLayers.Layer.Vector(name, options);
15
t.ok(layer instanceof OpenLayers.Layer.Vector, "new OpenLayers.Layer.Vector returns correct object" );
16
t.eq(layer.name, name, "layer name is correctly set");
17
t.ok(layer.renderer.CLASS_NAME, "layer has a renderer");
19
t.ok((layer.name == layer.strategies[0].layer.name) &&
20
(layer.strategies[0].layer.name == layer.strategies[1].layer.name),
21
"setLayer was called on strategies");
24
function test_Layer_Vector_refresh(t) {
27
var obj = {"an": "object"};
29
var layer = new OpenLayers.Layer.Vector(name, {
31
refresh: function(o) {
33
"refresh listener called with correct arg");
39
layer.inRange = false;
40
layer.visibility = false;
45
layer.visibility = false;
49
layer.inRange = false;
50
layer.visibility = true;
55
layer.visibility = true;
59
function test_Layer_Vector_addFeatures(t) {
62
var layer = new OpenLayers.Layer.Vector(name);
64
var point = new OpenLayers.Geometry.Point(-111.04, 45.68);
65
var pointFeature = new OpenLayers.Feature.Vector(point);
67
layer.preFeatureInsert = function(feature) {
68
t.ok(feature == pointFeature, "OpenLayers.Layer.Vector.addFeatures calls preFeatureInsert with the right arg");
70
layer.onFeatureInsert = function(feature) {
71
t.ok(feature == pointFeature, "OpenLayers.Layer.Vector.addFeatures calls onFeatureInsert with the right arg");
73
layer.events.register('beforefeatureadded', null, function(obj) {
74
t.ok(pointFeature == obj.feature, "OpenLayers.Layer.Vector.addFeatures triggers beforefeatureadded with correct feature passed to callback");
76
layer.events.register('featureadded', null, function(obj) {
77
t.ok(pointFeature == obj.feature, "OpenLayers.Layer.Vector.addFeatures triggers featureadded with correct feature passed to callback");
79
layer.events.register('featuresadded', null, function(obj) {
80
t.ok(pointFeature == obj.features[0], "OpenLayers.Layer.Vector.addFeatures triggers featuresadded with correct features passed to callback");
83
layer.addFeatures([pointFeature]);
85
t.eq(layer.features.length, 1, "OpenLayers.Layer.Vector.addFeatures adds something to the array");
86
t.ok(layer.features[0] == pointFeature, "OpenLayers.Layer.Vector.addFeatures returns an array of features");
88
layer.preFeatureInsert = function(feature) {
89
t.fail("OpenLayers.Layer.Vector.addFeatures calls preFeatureInsert while it must not");
91
layer.onFeatureInsert = function(feature) {
92
t.fail("OpenLayers.Layer.Vector.addFeatures calls onFeatureInsert while it must not");
94
layer.events.register('beforefeatureadded', null, function(obj) {
95
t.fail("OpenLayers.Layer.Vector.addFeatures triggers beforefeatureadded while it must not");
97
layer.events.register('featureadded', null, function(obj) {
98
t.fail("OpenLayers.Layer.Vector.addFeatures triggers featureadded while it must not");
100
layer.events.register('featuresadded', null, function(obj) {
101
t.fail("OpenLayers.Layer.Vector.addFeatures triggers featuresadded while it must not");
104
layer.addFeatures([pointFeature], {silent: true});
106
var extent = layer.getDataExtent();
107
t.eq(extent.toBBOX(), "-111.04,45.68,-111.04,45.68", "extent from getDataExtent is correct");
110
function test_Layer_Vector_removeFeatures(t) {
113
var layer = new OpenLayers.Layer.Vector(name);
115
var point1 = new OpenLayers.Geometry.Point(-111.04, 45.68);
116
var pointFeature1 = new OpenLayers.Feature.Vector(layer, point1);
117
var point2 = new OpenLayers.Geometry.Point(-111.14, 45.78);
118
var pointFeature2 = new OpenLayers.Feature.Vector(layer, point2);
120
layer.addFeatures([pointFeature1, pointFeature2]);
121
var features = layer.removeFeatures([pointFeature1]);
123
t.ok(layer.features.length == 1, "OpenLayers.Layer.Vector.removeFeatures removes a feature from the features array");
124
layer.addFeatures([pointFeature1.clone(), pointFeature2.clone()]);
125
layer.selectedFeatures.push(layer.features[0]);
126
layer.removeFeatures(layer.features[0]);
127
t.eq(layer.selectedFeatures, [], "Remove features removes selected features");
128
var features = layer.removeFeatures(layer.features);
130
t.ok(layer.features.length == 0,
131
"OpenLayers.Layer.Vector.removeFeatures(layer.features) removes all feature from the features array");
134
layer.events.register('beforefeatureremoved', null, function(obj) {
135
t.ok(pointFeature1 == obj.feature,
136
"OpenLayers.Layer.Vector.removeFeatures triggers beforefeatureremoved with correct feature passed to callback");
138
layer.events.register('featureremoved', null, function(obj) {
139
t.ok(pointFeature1 == obj.feature,
140
"OpenLayers.Layer.Vector.removeFeatures triggers featureremoved with correct feature passed to callback");
142
layer.events.register('featuresremoved', null, function(obj) {
143
t.ok(pointFeature1 == obj.features[0],
144
"OpenLayers.Layer.Vector.removeFeatures triggers featuresremoved with correct features passed to callback");
146
layer.addFeatures([pointFeature1]);
147
layer.removeFeatures([pointFeature1]);
150
layer.events.register('beforefeatureremoved', null, function(obj) {
151
t.fail("OpenLayers.Layer.Vector.removeFeatures triggers beforefeatureremoved while it must not");
153
layer.events.register('featureremoved', null, function(obj) {
154
t.fail("OpenLayers.Layer.Vector.removeFeatures triggers featureremoved while it must not");
156
layer.events.register('featuresremoved', null, function(obj) {
157
t.fail("OpenLayers.Layer.Vector.removeFeatures triggers featuresremoved while it must not");
159
layer.addFeatures([pointFeature1]);
160
layer.removeFeatures([pointFeature1], {silent: true});
163
function test_Layer_Vector_drawFeature(t) {
165
var layer = new OpenLayers.Layer.Vector("Test Layer", {isBaseLayer: true});
166
var map = new OpenLayers.Map('map', {
167
maxExtent: new OpenLayers.Bounds(-100, -100, 100, 100)
170
var geometry = new OpenLayers.Geometry.Point(10, 10);
171
var feature = new OpenLayers.Feature.Vector(geometry);
175
// Bogus layer renderer needs some methods
176
// for functional tests.
179
drawFeature: function(feature, style) {
183
root: document.createElement("div"),
184
destroy: function() { },
185
eraseFeatures: function() {},
186
setExtent: function() {}
190
layer.drawFeature(feature);
191
t.ok(geometry.equals(f.geometry),
192
"calls layer.renderer.drawFeature() with feature.geometry");
194
feature.style = {foo: "bar"};
195
layer.drawFeature(feature);
196
t.eq(feature.style, s,
197
"calls layer.renderer.drawFeature() with feature.style");
199
feature.style = null;
200
layer.style = {foo: "bar"};
201
layer.drawFeature(feature);
202
t.eq(layer.style.foo, s.foo,
203
"given null feature style, uses layer style");
205
feature.style = {foo1: "bar1"};
206
layer.style = {foo2: "bar2"};
207
var customStyle = {foo: "bar"};
208
layer.drawFeature(feature, customStyle);
209
t.eq(customStyle.foo, s.foo,
210
"given a custom style, renders with that");
212
// the real renderer's drawFeature method is tested in Renderer.html
213
layer.renderer.drawFeature = function(feature) {
214
return(feature.geometry.getBounds().intersectsBounds(map.getExtent()));
216
// reset the drawn to null as if the layer had never been rendered
219
layer.drawFeature(feature);
220
t.ok(true, "Trying to draw a feature on an not drawn layer doesn't throw any error.");
222
layer.addFeatures([feature]);
224
map.setCenter(new OpenLayers.Bounds(0, 0, 0, 0), 6);
225
t.ok(layer.unrenderedFeatures[feature.id], "Did not render feature outside the viewport.");
226
map.panTo(new OpenLayers.LonLat(10, 10));
227
t.ok(!layer.unrenderedFeatures[feature.id], "Rendered feature inside the viewport.");
232
function test_Layer_Vector_eraseFeatures(t) {
234
var layer = new OpenLayers.Layer.Vector("Test Layer");
235
var map = new OpenLayers.Map('map');
237
var geometry = new OpenLayers.Geometry.Point(10, 10);
238
var feature = new OpenLayers.Feature.Vector(geometry);
242
eraseFeatures: function(features) {
245
destroy: function() { }
248
layer.eraseFeatures([feature]);
249
t.ok(f, "calls layer.renderer.eraseFeatures");
250
t.ok(geometry.equals(f.geometry),
251
"calls layer.renderer.eraseFeatures() given an array of features");
254
function test_Layer_Vector_destroyFeatures (t) {
256
layer = new OpenLayers.Layer.Vector(name);
257
var map = new OpenLayers.Map('map');
260
for (var i = 0; i < 5; i++) {
261
features.push(new OpenLayers.Feature.Vector(
262
new OpenLayers.Geometry.Point(0,0)));
264
layer.addFeatures(features);
265
t.eq(layer.features.length, 5, "addFeatures adds 5 features");
266
layer.selectedFeatures.push(features[0]);
267
layer.destroyFeatures();
268
t.eq(layer.features.length, 0, "destroyFeatures triggers removal");
269
t.eq(layer.selectedFeatures, [], "Destroy features removes selected features");
271
for (var i = 0; i < 5; i++) {
272
features.push(new OpenLayers.Feature.Vector(
273
new OpenLayers.Geometry.Point(0,0)));
275
layer.addFeatures(features);
276
layer.selectedFeatures.push(features[0]);
277
layer.selectedFeatures.push(features[1]);
278
layer.destroyFeatures([features[0], features[1]]);
279
t.eq(layer.features.length, 3, "destroyFeatures removes appropriate features");
280
t.eq(layer.selectedFeatures, [], "destroyFeatures removes appropriate selected features");
283
function test_Layer_Vector_destroy (t) {
286
var options = {protocol: new OpenLayers.Protocol(),
287
strategies: [new OpenLayers.Strategy(), new OpenLayers.Strategy()]}
288
var layer = new OpenLayers.Layer.Vector(name, options);
289
var map = new OpenLayers.Map('map');
292
t.eq(layer.map, null, "layer.map is null after destroy");
293
t.eq(layer.getFeatureFromEvent({'target':'map'}), null,
294
"getFeatureIdFromEvent doesn't cause an error when called on layer which has been destroyed.");
296
t.eq(layer.protocol, null, "layer.protocol is null after destroy");
297
t.eq(layer.strategies, null, "layer.strategies is null after destroy");
299
// test that we can call layer.destroy a second time without trouble
303
t.ok(true, "layer.destroy called twice without any issues");
305
t.fail("calling layer.destroy twice triggers exception: " + err + " in " + err.fileName + " line " + err.lineNumber);
310
function test_Layer_Vector_externalGraphic(t) {
312
var layer = new OpenLayers.Layer.Vector("Test Layer", {isBaseLayer: true});
313
var renderer = layer.renderer;
314
var map = new OpenLayers.Map('map');
315
map.addLayers([layer]);
319
var geometry = new OpenLayers.Geometry.Point(geometryX, geometryY);
320
var feature = new OpenLayers.Feature.Vector(geometry);
322
map.zoomToMaxExtent();
324
var customStyle1 = new Object({
325
externalGraphic: 'test.png',
328
var customStyle2 = new Object({
329
externalGraphic: 'test.png',
332
var customStyle3 = new Object({
333
externalGraphic: 'test.png',
336
var customStyle4 = new Object({
337
externalGraphic: 'test.png',
341
var customStyle5 = new Object({
342
externalGraphic: 'test.png',
346
var customStyle6 = new Object({
347
externalGraphic: 'test.png',
354
var root = renderer.root;
355
if (layer.renderer.CLASS_NAME == 'OpenLayers.Renderer.SVG') {
356
feature.style = customStyle1;
357
layer.drawFeature(feature);
358
t.eq(root.firstChild.getAttributeNS(null, 'width'),
359
(2*customStyle1.pointRadius).toString(),
360
"given a pointRadius, width equals 2*pointRadius");
361
t.eq(root.firstChild.getAttributeNS(null, 'height'),
362
(2*customStyle1.pointRadius).toString(),
363
"given a pointRadius, height equals 2*pointRadius");
364
feature.style = customStyle2;
365
layer.drawFeature(feature);
366
t.eq(root.firstChild.getAttributeNS(null, 'width'),
367
root.firstChild.getAttributeNS(null, 'height'),
368
"given a graphicWidth, width equals height");
369
t.eq(root.firstChild.getAttributeNS(null, 'width'),
370
customStyle2.graphicWidth.toString(),
371
"width is set correctly");
372
feature.style = customStyle3;
373
layer.drawFeature(feature);
374
t.eq(root.firstChild.getAttributeNS(null, 'height'),
375
root.firstChild.getAttributeNS(null, 'width'),
376
"given a graphicHeight, height equals width");
377
t.eq(root.firstChild.getAttributeNS(null, 'height'),
378
customStyle3.graphicHeight.toString(),
379
"height is set correctly");
380
feature.style = customStyle4;
381
layer.drawFeature(feature);
382
t.eq(root.firstChild.getAttributeNS(null, 'height'),
383
customStyle4.graphicHeight.toString(),
384
"given graphicHeight and graphicWidth, both are set: height");
385
t.eq(root.firstChild.getAttributeNS(null, 'width'),
386
customStyle4.graphicWidth.toString(),
387
"given graphicHeight and graphicWidth, both are set: width");
388
feature.style = customStyle5;
389
layer.drawFeature(feature);
390
t.eq(root.firstChild.getAttributeNS(null, 'style'),
391
'opacity: '+customStyle5.graphicOpacity.toString()+((OpenLayers.Util.getBrowserName() == "opera" || OpenLayers.Util.getBrowserName() == "safari") ? "" : ';'),
392
"graphicOpacity correctly set");
393
feature.style = customStyle6;
394
layer.drawFeature(feature);
395
var x = geometryX / renderer.getResolution() + renderer.left;
396
var y = geometryY / renderer.getResolution() - renderer.top;
397
// SVG setStyle() gets x and y using getAttributeNS(), which returns
398
// a value with only 3 decimal digits. To mimic this we use toFixed(3) here
401
// toFixed() returns a string
404
t.eq(root.firstChild.getAttributeNS(null, 'x'),
405
(x + customStyle6.graphicXOffset).toFixed().toString(),
406
"graphicXOffset correctly set");
407
t.eq(root.firstChild.getAttributeNS(null, 'y'),
408
(-y + customStyle6.graphicYOffset).toFixed().toString(),
409
"graphicYOffset correctly set");
411
if (layer.renderer.CLASS_NAME == 'OpenLayers.Renderer.VML') {
412
feature.style = customStyle1;
413
layer.drawFeature(feature);
414
t.eq(root.firstChild.style.width,
415
(2*customStyle1.pointRadius).toString()+'px',
416
"given a pointRadius, width equals 2*pointRadius");
417
t.eq(root.firstChild.style.height,
418
(2*customStyle1.pointRadius).toString()+'px',
419
"given a pointRadius, height equals 2*pointRadius");
420
feature.style = customStyle2;
421
layer.drawFeature(feature);
422
t.eq(root.firstChild.style.width,
423
root.firstChild.style.height,
424
"given a graphicWidth, width equals height");
425
t.eq(root.firstChild.style.width,
426
customStyle2.graphicWidth.toString()+'px',
427
"width is set correctly");
428
feature.style = customStyle3;
429
layer.drawFeature(feature);
430
t.eq(root.firstChild.style.height,
431
root.firstChild.style.width,
432
"given a graphicHeight, height equals width");
433
t.eq(root.firstChild.style.height,
434
customStyle3.graphicHeight.toString()+'px',
435
"height is set correctly");
436
feature.style = customStyle4;
437
layer.drawFeature(feature);
438
t.eq(root.firstChild.style.height,
439
customStyle4.graphicHeight.toString()+'px',
440
"given graphicHeight and graphicWidth, both are set: height");
441
t.eq(root.firstChild.style.width,
442
customStyle4.graphicWidth.toString()+'px',
443
"given graphicHeight and graphicWidth, both are set: width");
444
feature.style = customStyle5;
445
layer.renderer.clear();
446
layer.drawFeature(feature);
447
var fill = root.firstChild.getElementsByTagName("v:fill")[0];
450
opacity = fill.getAttribute('opacity');
452
if(opacity === undefined) {
453
fill = root.firstChild.getElementsByTagName("fill")[0];
454
opacity = fill.getAttribute('opacity');
457
customStyle5.graphicOpacity,
458
"graphicOpacity correctly set");
459
feature.style = customStyle6;
460
layer.drawFeature(feature);
461
var x = geometryX / renderer.getResolution();
462
var y = geometryY / renderer.getResolution();
463
t.eq(root.firstChild.style.left,
464
(x + customStyle6.graphicXOffset).toFixed().toString()+'px',
465
"graphicXOffset correctly set");
467
t.eq(root.firstChild.style.top,
468
(y - (customStyle6.graphicYOffset+parseInt(root.firstChild.style.height))).toFixed().toString()+'px',
469
"graphicYOffset correctly set");
477
<div id="map" style="width:500px;height:550px"></div>