3 <script src="../../lib/OpenLayers.js"></script>
4 <script type="text/javascript">
7 // Stub out functions that are meant to be overridden by
9 OpenLayers.Renderer.Elements.prototype._createRenderRoot =
10 OpenLayers.Renderer.Elements.prototype.createRenderRoot;
12 var rendererRoot = document.createElement("div");
13 OpenLayers.Renderer.Elements.prototype.createRenderRoot = function() {
17 OpenLayers.Renderer.Elements.prototype._createRoot =
18 OpenLayers.Renderer.Elements.prototype.createRoot;
20 OpenLayers.Renderer.Elements.prototype.createRoot = function() {
21 return document.createElement("div");
24 OpenLayers.Renderer.Elements.prototype._createNode =
25 OpenLayers.Renderer.Elements.prototype.createNode;
27 OpenLayers.Renderer.Elements.prototype.createNode = function() {
28 return document.createElement("div");
32 // Create a new Elements renderer based on an id and an ordering
33 // type. For these tests, both of these parameters are optional.
34 function create_renderer(id, options) {
39 var el = document.createElement('div');
40 document.body.appendChild(el);
41 el.id = OpenLayers.Util.createUniqueID();
45 return new OpenLayers.Renderer.Elements(id, options);
48 // Cleanup stubs made in the function above.
50 OpenLayers.Renderer.Elements.prototype.createRenderRoot =
51 OpenLayers.Renderer.Elements.prototype._createRenderRoot;
52 OpenLayers.Renderer.Elements.prototype.createRoot =
53 OpenLayers.Renderer.Elements.prototype._createRoot;
54 OpenLayers.Renderer.Elements.prototype.createNode =
55 OpenLayers.Renderer.Elements.prototype._createNode;
58 function test_Elements_constructor(t) {
63 var r = create_renderer();
65 t.ok(r instanceof OpenLayers.Renderer.Elements, "new OpenLayers.Renderer.Elements returns Elements object" );
66 t.ok(r.rendererRoot != null, "elements rendererRoot is not null");
67 t.ok(r.root != null, "elements root is not null");
68 t.ok(r.indexer == null, "indexer is null if unused.");
70 t.ok(r.root.parentNode == r.rendererRoot, "elements root is correctly appended to rendererRoot");
71 t.ok(r.rendererRoot.parentNode == r.container, "elements rendererRoot is correctly appended to container");
76 function test_Elements_destroy(t) {
81 t.ok(true, "clear called");
88 OpenLayers.Renderer.prototype._destroy =
89 OpenLayers.Renderer.prototype.destroy;
91 var args = [{}, {}, {}];
92 OpenLayers.Renderer.prototype.destroy = function() {
93 t.ok((arguments[0] == args[0]) &&
94 (arguments[1] == args[1]) &&
95 (arguments[2] == args[2]), "correct arguments passed to OpenLayers.Renderer.destroy()");
98 OpenLayers.Renderer.Elements.prototype.destroy.apply(elems, args);
100 t.ok(elems.rendererRoot == null, "rendererRoot nullified");
101 t.ok(elems.root == null, "root nullified");
102 t.ok(elems.xmlns == null, "xmlns nullified");
104 OpenLayers.Renderer.prototype.destroy =
105 OpenLayers.Renderer.prototype._destroy;
109 function test_Elements_clear(t) {
114 var r = create_renderer();
115 var element = document.createElement("div");
118 var node = document.createElement("div");
119 element.appendChild(node);
123 t.ok(r.vectorRoot.childNodes.length == 0, "vector root is correctly cleared");
124 t.ok(r.textRoot.childNodes.length == 0, "text root is correctly cleared");
129 function test_Elements_drawGeometry(t) {
134 var r = create_renderer();
136 var element = document.createElement("div");
137 r.vectorRoot = element;
139 r.nodeFactory = function(id, type) {
140 var element = document.createElement("div");
145 r.drawGeometryNode = function(node, geometry, style) {
147 return {node: node, complete: true};
149 r.redrawBackgroundNode = function(id, geometry, style, featureId) {
150 b_Node = r.nodeFactory();
151 b_Node.id = "foo_background";
152 element.appendChild(b_Node);
155 r.getNodeType = function(geometry, style) {
162 var style = {'backgroundGraphic': 'foo'};
163 var featureId = 'dude';
164 r.drawGeometry(geometry, style, featureId);
165 t.ok(g_Node.parentNode == element, "node is correctly appended to root");
166 t.ok(b_Node.parentNode == element, "redrawBackgroundNode appended background node");
167 t.eq(g_Node._featureId, 'dude', "_featureId is correct");
168 t.eq(g_Node._style.backgroundGraphic, "foo", "_style is correct");
169 t.eq(g_Node._geometryClass, 'bar', "_geometryClass is correct");
171 var returnNode = function(id) {
172 return id == "foo_background" ? b_Node : g_Node;
175 var _getElement = document.getElementById;
176 document.getElementById = returnNode;
177 OpenLayers.Util.getElement = returnNode;
179 style = {'display':'none'};
180 r.drawGeometry(geometry, style, featureId);
181 t.ok(g_Node.parentNode != element, "node is correctly removed");
182 t.ok(b_Node.parentNode != element, "background node correctly removed")
184 document.getElementById = _getElement;
189 function test_Elements_drawGeometry_2(t) {
194 var r = create_renderer();
196 var element = document.createElement("div");
199 r.nodeFactory = function(id, type) {
200 var element = document.createElement("div");
203 r.setStyle = function(node, style, options, geometry) {
208 var properDraw = false;
209 r.drawPoint = function(node, geometry) {
213 geometry = {CLASS_NAME: 'OpenLayers.Geometry.Point'};
215 r.drawGeometry(geometry, style);
216 t.ok(properDraw, "drawGeometry called drawPoint when passed a point");
219 var properDraw = false;
220 r.drawLineString = function(g) {
224 geometry = {id: "foo", CLASS_NAME: 'OpenLayers.Geometry.LineString'};
226 r.drawGeometry(geometry, style);
227 t.ok(properDraw, "drawGeometry called drawLineString when passed a line string");
230 var properDraw = false;
231 r.drawLinearRing = function(g) {
235 geometry = {CLASS_NAME: 'OpenLayers.Geometry.LinearRing'};
237 r.drawGeometry(geometry, style);
238 t.ok(properDraw, "drawGeometry called drawLinearRing when passed a linear ring");
241 var properDraw = false;
242 r.drawPolygon = function(g) {
246 geometry = {CLASS_NAME: 'OpenLayers.Geometry.Polygon'};
248 r.drawGeometry(geometry, style);
249 t.ok(properDraw, "drawGeometry called drawPolygon when passed a polygon");
252 var properDraw = false;
253 r.drawSurface = function(g) {
257 geometry = {CLASS_NAME: 'OpenLayers.Geometry.Surface'};
259 r.drawGeometry(geometry, style);
260 t.ok(properDraw, "drawGeometry called drawSurface when passed a surface");
263 var properDraw = false;
264 r.drawRectangle = function(g) {
268 geometry = {CLASS_NAME: 'OpenLayers.Geometry.Rectangle'};
270 r.drawGeometry(geometry, style);
271 t.ok(properDraw, "drawGeometry called drawRectangle when passed a rectangle");
274 var properDraw = false;
275 r.drawPoint = function(g) {
280 CLASS_NAME: 'OpenLayers.Geometry.MultiPoint',
281 components: [{CLASS_NAME: 'OpenLayers.Geometry.Point'}]
284 r.drawGeometry(geometry, style);
285 t.ok(properDraw, "drawGeometry called drawPoint when passed a multi-point");
288 var properDraw = false;
289 r.drawLineString = function(g) {
294 CLASS_NAME: 'OpenLayers.Geometry.MultiLineString',
295 components: [{CLASS_NAME: 'OpenLayers.Geometry.LineString'}]
298 r.drawGeometry(geometry, style);
299 t.ok(properDraw, "drawGeometry called drawLineString when passed a multi-linestring");
302 var properDraw = false;
303 r.drawPolygon = function(g) {
308 CLASS_NAME: 'OpenLayers.Geometry.MultiPolygon',
309 components: [{CLASS_NAME: 'OpenLayers.Geometry.Polygon'}]
312 r.drawGeometry(geometry, style);
313 t.ok(properDraw, "drawGeometry called drawPolygon when passed a multi-polygon");
318 function test_Elements_getfeatureidfromevent(t) {
328 var id = OpenLayers.Renderer.Elements.prototype.getFeatureIdFromEvent(event);
329 t.eq(id, 'foo', "returned id is correct when event with target is passed");
335 var id = OpenLayers.Renderer.Elements.prototype.getFeatureIdFromEvent(event);
336 t.eq(id, 'foo', "returned id is correct when event with srcElement is passed");
339 function test_Elements_erasegeometry(t) {
343 'eraseGeometry': function(geometry) {
344 gErased.push(geometry);
349 'components': [{}, {}, {}]
353 geometry.CLASS_NAME = "OpenLayers.Geometry.MultiPoint";
355 OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
356 t.ok( (gErased[0] == geometry.components[0]) &&
357 (gErased[1] == geometry.components[1]) &&
358 (gErased[2] == geometry.components[2]), "multipoint all components of geometry correctly erased.");
361 geometry.CLASS_NAME = "OpenLayers.Geometry.MultiLineString";
363 OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
364 t.ok( (gErased[0] == geometry.components[0]) &&
365 (gErased[1] == geometry.components[1]) &&
366 (gErased[2] == geometry.components[2]), "multilinestring all components of geometry correctly erased.");
369 geometry.CLASS_NAME = "OpenLayers.Geometry.MultiPolygon";
371 OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
372 t.ok( (gErased[0] == geometry.components[0]) &&
373 (gErased[1] == geometry.components[1]) &&
374 (gErased[2] == geometry.components[2]), "multipolygon all components of geometry correctly erased.");
377 geometry.CLASS_NAME = "OpenLayers.Geometry.Collection";
379 OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
380 t.ok( (gErased[0] == geometry.components[0]) &&
381 (gErased[1] == geometry.components[1]) &&
382 (gErased[2] == geometry.components[2]), "collection all components of geometry correctly erased.");
387 geometry.CLASS_NAME = {};
392 OpenLayers.Util._getElement = OpenLayers.Util.getElement;
393 OpenLayers.Util.getElement = function(id) {
396 var hasBack = (id.indexOf(elements.BACKGROUND_ID_SUFFIX) != -1);
397 retVal = hasBack ? gBackElement : gElement;
404 OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
405 // (no tests here, just make sure it doesn't bomb)
407 //element.parentNode null
408 elements.BACKGROUND_ID_SUFFIX = 'BLAHBLAHBLAH';
411 OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
412 // (no tests here, just make sure it doesn't bomb)
414 //valid element.parentNode, element.geometry
416 'remove': function(elem) {
417 gIndexerRemoved = elem;
423 'destroy': function() {
424 t.ok(true, "geometry destroyed");
428 'removeChild': function(elem) {
432 '_style' : {backgroundGraphic: "foo"}
436 'removeChild': function(elem) {
442 gElemRemoved = gBackRemoved = gIndexerRemoved = null;
443 OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
444 t.ok( (gElement.geometry == null), "all normal: element's 'geometry' property nullified");
445 t.ok( (gElemRemoved == gElement), "all normal: main element properly removed from parent node");
446 t.ok( (gBackRemoved == gBackElement), "all normal: back element properly removed from parent node");
447 t.ok( (gIndexerRemoved == gElement), "all normal: main element properly removed from the indexer");
449 //valid element.parentNode, no element.geometry, no bElem
451 gElement.geometry = null;
452 gElemRemoved = gBackRemoved = gIndexerRemoved = null;
453 OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
454 t.ok( (gElemRemoved == gElement), "no bElem: main element properly removed from parent node");
455 t.ok( (gBackRemoved == null), "no bElem: back element not tried to remove from parent node when it doesn't exist");
456 t.ok( (gIndexerRemoved == gElement), "no bElem: main element properly removed from the indexer");
458 //valid element.parentNode, no element.geometry, valid bElem, no bElem.parentNode
460 gElemRemoved = gBackRemoved = gIndexerRemoved = null;
461 OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
462 t.ok( (gElemRemoved == gElement), "no bElem.parentNode: main element properly removed from parent node");
463 t.ok( (gBackRemoved == null), "no bElem.parentNode: back element not tried to remove from parent node when it has no parent node");
464 t.ok( (gIndexerRemoved == gElement), "no bElem.parentNode: main element properly removed from the indexer");
467 OpenLayers.Util.getElement = OpenLayers.Util._getElement;
470 function test_Elements_drawAndErase(t) {
475 var r = create_renderer(null, {zIndexing: true});
476 var element = document.createElement("div");
477 r.vectorRoot = element;
478 document.body.appendChild(element);
480 r.createNode = function(type, id) {
481 var element = document.createElement("div");
485 r.nodeTypeCompare = function() {return true};
486 r.setStyle = function(node, style, options, geometry) {
497 var featureId = 'foo';
498 r.drawGeometry(geometry, style, featureId);
500 function count(obj) {
508 t.eq(element.childNodes.length, 1, "root is correctly filled");
509 t.eq(r.indexer.maxZIndex, 10, "indexer.maxZIndex is correctly filled");
510 t.eq(r.indexer.order.length, 1, "indexer.order is correctly filled");
511 t.eq(count(r.indexer.indices), 1, "indexer.indices is correctly filled");
513 r.eraseGeometry(geometry);
515 t.eq(element.childNodes.length, 0, "root is correctly cleared");
516 t.eq(r.indexer.maxZIndex, 0, "indexer.maxZIndex is correctly reset");
517 t.eq(r.indexer.order.length, 0, "indexer.order is correctly reset");
518 t.eq(count(r.indexer.indices), 0, "indexer.indices is correctly reset");
520 delete(style.graphicZIndex);
521 r.drawGeometry(geometry, style, featureId);
523 t.eq(element.childNodes.length, 1, "root is correctly filled");
524 t.eq(r.indexer.maxZIndex, 0, "indexer.maxZIndex is correctly filled");
525 t.eq(r.indexer.order.length, 1, "indexer.order is correctly filled");
526 t.eq(count(r.indexer.indices), 1, "indexer.indices is correctly filled");
530 t.eq(element.childNodes.length, 0, "root is correctly cleared");
531 t.eq(r.indexer.maxZIndex, 0, "indexer.maxZIndex is correctly reset");
532 t.eq(r.indexer.order.length, 0, "indexer.order is correctly reset");
533 t.eq(count(r.indexer.indices), 0, "indexer.indices is correctly reset");
535 style.graphicZIndex = 12;
536 r.drawGeometry(geometry, style, featureId);
538 t.eq(element.childNodes.length, 1, "root is correctly filled");
539 t.eq(r.indexer.maxZIndex, 12, "indexer.maxZIndex is correctly filled");
540 t.eq(r.indexer.order.length, 1, "indexer.order is correctly filled");
541 t.eq(count(r.indexer.indices), 1, "indexer.indices is correctly filled");
546 function test_Elements_moveRoot(t) {
549 var r1 = create_renderer();
550 var r2 = create_renderer();
552 t.xml_eq(r1.root.parentNode, r2.root.parentNode, "root moved successfully");
554 t.xml_eq(r1.root.parentNode, r1.rendererRoot, "root moved back successfully");
563 <div id="map" style="width:500px;height:550px"></div>