diff options
Diffstat (limited to 'misc/openlayers/tests/Geometry/Collection.html')
-rw-r--r-- | misc/openlayers/tests/Geometry/Collection.html | 431 |
1 files changed, 431 insertions, 0 deletions
diff --git a/misc/openlayers/tests/Geometry/Collection.html b/misc/openlayers/tests/Geometry/Collection.html new file mode 100644 index 0000000..7c9fd62 --- /dev/null +++ b/misc/openlayers/tests/Geometry/Collection.html @@ -0,0 +1,431 @@ +<html> +<head> + <script src="../OLLoader.js"></script> + <script type="text/javascript"> + var coll; + + function test_Collection_constructor (t) { + t.plan( 4 ); + + //null param + coll = new OpenLayers.Geometry.Collection(); + t.ok( coll instanceof OpenLayers.Geometry.Collection, "new OpenLayers.Geometry.Collection returns coll object" ); + t.eq( coll.CLASS_NAME, "OpenLayers.Geometry.Collection", "coll.CLASS_NAME is set correctly"); + t.eq( coll.components.length, 0, "coll.components is set correctly"); + + OpenLayers.Geometry.Collection.prototype._addComponents = + OpenLayers.Geometry.Collection.prototype.addComponents; + OpenLayers.Geometry.Collection.prototype.addComponents = + function(comps) { g_addcomponents = comps; }; + + //valid param + g_addcomponents = null; + var components = {}; + coll = new OpenLayers.Geometry.Collection(components); + t.ok(g_addcomponents, components, "addcomponents called on non-null param") + + OpenLayers.Geometry.Collection.prototype.addComponents = + OpenLayers.Geometry.Collection.prototype._addComponents; + } + + function test_Collection_addComponents (t) { + t.plan( 10 ); + + coll = new OpenLayers.Geometry.Collection(); + + //null + coll.addComponents(null); + t.ok(true, "doesn't break on add null components"); + + OpenLayers.Geometry.Collection.prototype._addComponent = + OpenLayers.Geometry.Collection.prototype.addComponent; + + OpenLayers.Geometry.Collection.prototype.addComponent = + function(comp) { g_addComp = comp; g_added++}; + + + //nonarray argument + var g_added = 0; + var g_addComp = 0; + var component = {}; + coll.addComponents(component); + t.eq(g_added, 1, "added once"); + t.eq(g_addComp, component, "added component"); + + //array arg + var g_added = 0; + var g_addComp = 0; + var component1 = {}; + var component2 = {}; + coll.addComponents([component1, component2]); + t.eq(g_added, 2, "added twice"); + t.eq(g_addComp, component2, "added component"); + + OpenLayers.Geometry.Collection.prototype.addComponent = + OpenLayers.Geometry.Collection.prototype._addComponent; + + + + coll.addComponents(new OpenLayers.Geometry.Point(0,0)); + coll.addComponents(new OpenLayers.Geometry.Point(10,10)); + t.eq( coll.components.length, 2, "added two components to collection" ); + bounds = coll.getBounds(); + t.eq( bounds.left, 0, "left bound is 0" ); + t.eq( bounds.bottom, 0, "bottom bound is 0" ); + t.eq( bounds.right, 10, "right bound is 10" ); + t.eq( bounds.top, 10, "top bound is 10" ); + } + + function test_Collection_clone (t) { + t.plan( 3 ); + coll = new OpenLayers.Geometry.Collection(); + coll.addComponents(new OpenLayers.Geometry.Point(0,0)); + coll.addComponents(new OpenLayers.Geometry.Point(10,10)); + coll2 = coll.clone(); + t.ok( coll2 instanceof OpenLayers.Geometry.Collection, "coll.clone() returns collection object" ); + t.eq( coll2.components.length, 2, "coll2.components.length is set correctly"); + t.ok( coll2.components[0] instanceof OpenLayers.Geometry.Point, + "coll2.components.length is set correctly"); + } + + function test_Collection_removeComponents (t) { + t.plan( 5 ); + coll = new OpenLayers.Geometry.Collection(); + point = new OpenLayers.Geometry.Point(0,0); + coll.addComponents(point); + coll.addComponents(new OpenLayers.Geometry.Point(10,10)); + coll.removeComponents(coll.components[0]); + t.eq( coll.components.length, 1, "coll.components.length is smaller after removeComponent" ); + t.ok( coll.bounds == null, "bounds are nullified after call to remove (to trigger recalc on getBounds()"); + bounds = coll.getBounds(); + t.eq( bounds.left, 10, "left bound is 10 after removeComponent" ); + t.eq( bounds.bottom, 10, "bottom bound is 10 after removeComponent" ); + + coll = new OpenLayers.Geometry.Collection(); + for(var i=0; i<5; ++i) { + coll.addComponents( + new OpenLayers.Geometry.Point(Math.random(), Math.random()) + ); + } + coll.removeComponents(coll.components); + t.eq(coll.components.length, 0, + "remove components even works with multiple components"); + + } + + function test_Collection_calculateBounds(t) { + t.plan( 9 ); + + var coll = new OpenLayers.Geometry.Collection(); + coll.calculateBounds(); + t.eq(coll.bounds, null, "null components list gives null bounds on calculation()"); + + var p1 = new OpenLayers.Geometry.Point(10,20); + var p2 = new OpenLayers.Geometry.Point(30,40); + + var components = [p1, p2]; + coll = new OpenLayers.Geometry.Collection(components); + + coll.calculateBounds(); + + t.eq(coll.bounds.left, 10, "good left bounds"); + t.eq(coll.bounds.bottom, 20, "good bottom bounds"); + t.eq(coll.bounds.right, 30, "good right bounds"); + t.eq(coll.bounds.top, 40, "good top bounds"); + + var newPoint = new OpenLayers.Geometry.Point(60,70); + coll.addComponent(newPoint); + coll.calculateBounds(); + + t.eq(coll.bounds.left, 10, "good left bounds"); + t.eq(coll.bounds.bottom, 20, "good bottom bounds"); + t.eq(coll.bounds.right, 60, "good right bounds"); + t.eq(coll.bounds.top, 70, "good top bounds"); + } + + function test_Collection_equals(t) { + t.plan(1); + var geom = new OpenLayers.Geometry.Collection(); + t.ok(!geom.equals(), "collection.equals() returns false for undefined"); + } + + function test_Collection_addComponent(t) { + t.plan(10); + + var coll = new OpenLayers.Geometry.Collection(); + + //null + coll.addComponent(null); + t.ok(!coll.addComponent(null), + "addComponent returns false for bad component") + + //good component + var component = new OpenLayers.Geometry.Point(3,4); + t.ok(coll.addComponent(component), + "addComponent returns true for good component"); + t.ok(coll.bounds == null, "bounds cache correctly cleared"); + + var foundComponent = false; + for(var i=0; i< coll.components.length; i++) { + if (coll.components[i].equals(component)) { + foundComponent = true; + } + } + t.ok(foundComponent, "component added to internal array"); + + // restricted components + coll.componentTypes = ["OpenLayers.Geometry.Point", + "OpenLayers.Geometry.LineString"]; + var point1 = new OpenLayers.Geometry.Point(0,0); + var point2 = new OpenLayers.Geometry.Point(1,1); + var line = new OpenLayers.Geometry.LineString([point1, point2]); + var multipoint = new OpenLayers.Geometry.MultiPoint([point1, point2]); + + t.ok(coll.addComponent(point1), + "addComponent returns true for 1st geometry type in componentTypes"); + t.ok(OpenLayers.Util.indexOf(coll.components, point1) > -1, + "addComponent adds 1st restricted type to components array"); + t.ok(coll.addComponent(line), + "addComponent returns true for 2nd geometry type in componentTypes"); + t.ok(OpenLayers.Util.indexOf(coll.components, point1) > -1, + "addComponent adds 2nd restricted type to components array"); + t.ok(!coll.addComponent(multipoint), + "addComponent returns false for geometry type not in componentTypes"); + t.ok(OpenLayers.Util.indexOf(coll.components, multipoint) == -1, + "addComponent doesn't add restricted type to component array"); + + } + + function test_collection_getLength(t) { + t.plan(2); + + //null + var coll = new OpenLayers.Geometry.Collection(); + t.eq( coll.getLength(), 0, "null coll has 0 getlength"); + + //valid + coll.components = [ + { 'getLength': function() { return 50; } }, + { 'getLength': function() { return 15; } } + ]; + t.eq( coll.getLength(), 65, "coll with valid components correctly sums getlength"); + } + + function test_collection_getArea(t) { + t.plan(2); + + //null + var coll = new OpenLayers.Geometry.Collection(); + t.eq( coll.getArea(), 0, "null coll has 0 getArea"); + + //valid + coll.components = [ + { 'getArea': function() { return 50; } }, + { 'getArea': function() { return 15; } } + ]; + t.eq( coll.getArea(), 65, "coll with valid components correctly sums getArea"); + } + + function test_transform(t) { + t.plan(5); + var p1 = new OpenLayers.Geometry.Point(0,0); + p1.bounds = "foo"; + var p2 = new OpenLayers.Geometry.Point(1,1); + p2.bounds = "foo"; + var line = new OpenLayers.Geometry.LineString([p1, p2]); + var multipoint = new OpenLayers.Geometry.MultiPoint([p1, p2]); + var coll = new OpenLayers.Geometry.Collection([ + p1, p2, line, multipoint + ]); + coll.bounds = "foo"; + + var wgs84 = new OpenLayers.Projection("EPSG:4326"); + var sm = new OpenLayers.Projection("EPSG:900913"); + coll.transform(wgs84, sm); + + t.eq(coll.bounds, null, "coll bounds cleared"); + t.eq(p1.bounds, null, "p1 component bounds cleared"); + t.eq(p2.bounds, null, "p2 component bounds cleared"); + t.eq(line.bounds, null, "line component bounds cleared"); + t.eq(multipoint.bounds, null, "multipoint component bounds cleared"); + + } + + function test_getCentroid_pts_only(t) { + t.plan(3); + + coll = new OpenLayers.Geometry.Collection(); + coll.addComponent(new OpenLayers.Geometry.Point(0,0)); + coll.addComponent(new OpenLayers.Geometry.Point(1,1)); + + centroid = coll.getCentroid(true); + t.ok(centroid != null, 'The centroid is not null.'); + t.eq(centroid.x, 0.5, 'The centroid x coordinate is good.'); + t.eq(centroid.y, 0.5, 'The centroid y coordinate is good.'); + + coll.destroy(); + } + + function test_getCentroid_poly_nonrecursive(t) { + t.plan(3); + + coll = new OpenLayers.Geometry.Collection(); + coll.addComponent( + new OpenLayers.Geometry.Polygon([ + new OpenLayers.Geometry.LinearRing([ + new OpenLayers.Geometry.Point(0,0), + new OpenLayers.Geometry.Point(0,1), + new OpenLayers.Geometry.Point(1,1), + new OpenLayers.Geometry.Point(1,0) + ]) + ]) + ); + // performing non-recursive getCentroid means this next polygon + // is excluded from the centroid computation + coll.addComponent( + new OpenLayers.Geometry.Polygon([ + new OpenLayers.Geometry.LinearRing([ + new OpenLayers.Geometry.Point(2,2), + new OpenLayers.Geometry.Point(2,3), + new OpenLayers.Geometry.Point(3,3), + new OpenLayers.Geometry.Point(3,2) + ]) + ]) + ); + + centroid = coll.getCentroid(); + t.ok(centroid != null, 'The centroid is not null.'); + t.eq(centroid.x, 0.5, 'The centroid x coordinate is good.'); + t.eq(centroid.y, 0.5, 'The centroid y coordinate is good.'); + + coll.destroy(); + } + + function test_getCentroid_poly_only(t) { + t.plan(3); + + coll = new OpenLayers.Geometry.Collection(); + coll.addComponent( + new OpenLayers.Geometry.Polygon([ + new OpenLayers.Geometry.LinearRing([ + new OpenLayers.Geometry.Point(0,0), + new OpenLayers.Geometry.Point(0,1), + new OpenLayers.Geometry.Point(1,1), + new OpenLayers.Geometry.Point(1,0) + ]) + ]) + ); + + centroid = coll.getCentroid(true); + t.ok(centroid != null, 'The centroid is not null.'); + t.eq(centroid.x, 0.5, 'The centroid x coordinate is good.'); + t.eq(centroid.y, 0.5, 'The centroid y coordinate is good.'); + + coll.destroy(); + } + + function test_getCentroid_poly_and_pts(t) { + t.plan(3); + + coll = new OpenLayers.Geometry.Collection(); + coll.addComponent( + new OpenLayers.Geometry.Polygon([ + new OpenLayers.Geometry.LinearRing([ + new OpenLayers.Geometry.Point(0,0), + new OpenLayers.Geometry.Point(0,1), + new OpenLayers.Geometry.Point(1,1), + new OpenLayers.Geometry.Point(1,0) + ]) + ]) + ); + + // since the polygon above has an area of 1 and these + // points have an area of 0, they should not change the centroid + coll.addComponent( new OpenLayers.Geometry.Point(2,2) ); + coll.addComponent( new OpenLayers.Geometry.Point(4,4) ); + + centroid = coll.getCentroid(true); + t.ok(centroid != null, 'The centroid is not null.'); + t.eq(centroid.x, 0.5, 'The centroid x coordinate is good.'); + t.eq(centroid.y, 0.5, 'The centroid y coordinate is good.'); + + coll.destroy(); + } + + function test_getCentroid_poly_big_and_small(t) { + t.plan(3); + + coll = new OpenLayers.Geometry.Collection(); + // polygon w/area=1, centroid=0.5,0.5 + coll.addComponent( + new OpenLayers.Geometry.Polygon([ + new OpenLayers.Geometry.LinearRing([ + new OpenLayers.Geometry.Point(0,0), + new OpenLayers.Geometry.Point(0,1), + new OpenLayers.Geometry.Point(1,1), + new OpenLayers.Geometry.Point(1,0) + ]) + ]) + ); + + // since the polygon above has an area of 1 and this + // polygon has an area of 4, the center is weighted 20% toward + // the first polygon + + // polygon w/area=4, centroid=5.5,5.5 + coll.addComponent( + new OpenLayers.Geometry.Polygon([ + new OpenLayers.Geometry.LinearRing([ + new OpenLayers.Geometry.Point(4.5,-0.5), + new OpenLayers.Geometry.Point(4.5,1.5), + new OpenLayers.Geometry.Point(6.5,1.5), + new OpenLayers.Geometry.Point(6.5,-0.5) + ]) + ]) + ); + + centroid = coll.getCentroid(true); + t.ok(centroid != null, 'The centroid is not null.'); + t.eq(centroid.x, 4.5, 'The centroid x coordinate is good.'); + t.eq(centroid.y, 0.5, 'The centroid y coordinate is good.'); + + coll.destroy(); + } + + function test_avoid_infinite_recursion(t) { + t.plan(1); + + var g = new OpenLayers.Geometry.Polygon([ + new OpenLayers.Geometry.LinearRing(), + new OpenLayers.Geometry.LinearRing() + ]); + var bounds; + try { + bounds = g.getBounds(); + t.eq(bounds, null, "Polygon with empty linear ring has null bounds"); + } catch (err) { + t.fail("Failed to get bounds of polygon with empty linear ring: " + err.message); + } + + } + + + function test_Collection_destroy(t) { + t.plan( 3 ); + coll = new OpenLayers.Geometry.Collection(); + coll.addComponents(new OpenLayers.Geometry.Point(0,0)); + coll.addComponents(new OpenLayers.Geometry.Point(10,10)); + coll.getBounds(); + coll.destroy(); + + t.ok(coll.components == null, "components array cleared"); + t.ok(coll.getBounds() == null, "bounds is cleared"); + t.ok(coll.id == null, "id is cleared"); + + } + + </script> +</head> +<body> +</body> +</html> |