1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/django/contrib/gis/geos/tests/test_mutability.py Sat Jan 31 15:18:50 2009 -0600
1.3 @@ -0,0 +1,206 @@
1.4 +import unittest
1.5 +from pymutable_geometries import *
1.6 +from django.contrib.gis.geos.error import GEOSIndexError
1.7 +
1.8 +class GEOSPyMutableTest(unittest.TestCase):
1.9 + '''
1.10 + Tests Pythonic Mutability of Python GEOS geometry wrappers
1.11 + get/set/delitem on a slice, normal list methods
1.12 + '''
1.13 +
1.14 + def test01_getitem(self):
1.15 + 'Test getting a single item from a geometry'
1.16 + for g in slice_geometries():
1.17 + for i in seqrange():
1.18 + self.assertEqual(g.coords[i], getcoords(g.geom[i]))
1.19 +
1.20 + def test02_getslice(self):
1.21 + 'Test getting a slice from a geometry'
1.22 + for f in getslice_functions():
1.23 + for g in slice_geometries():
1.24 + msg = "fcn %s, geom %s" % (f.__name__, str(g.geom_type))
1.25 + self.assertEqual(f(g.coords), getcoords(f(g.geom)), msg)
1.26 +
1.27 + def test03_getitem_indexException(self):
1.28 + 'Test get single item with out-of-bounds index'
1.29 + for g in slice_geometries():
1.30 + for i in SEQ_OUT_OF_BOUNDS:
1.31 + self.assertRaises(GEOSIndexError, lambda: g.geom[i])
1.32 +
1.33 + def test04_delitem_single(self):
1.34 + 'Test delete single item from a geometry'
1.35 + for i in seqrange():
1.36 + for g in slice_geometries():
1.37 + if g.geom.ring and i in SEQ_BOUNDS: continue
1.38 + del g.coords[i]
1.39 + del g.geom[i]
1.40 + self.assertEqual(g.tuple_coords, g.geom.coords)
1.41 +
1.42 + def test05_delitem_slice(self):
1.43 + 'Test delete slice from a geometry'
1.44 + for f in delslice_functions():
1.45 + for g in slice_geometries():
1.46 + if g.geom.ring and not f.ring: continue
1.47 + f(g.coords)
1.48 + f(g.geom)
1.49 + msg = "fcn %s, geom %s" % (f.__name__, str(g.geom_type))
1.50 + self.assertEqual(g.tuple_coords, g.geom.coords, msg)
1.51 +
1.52 + def test06_delitem_single_indexException(self):
1.53 + 'Test delete single item with out-of-bounds index'
1.54 + def func(x, i): del x[i]
1.55 + for g in slice_geometries():
1.56 + for i in SEQ_OUT_OF_BOUNDS:
1.57 + self.assertRaises(GEOSIndexError, func, g.geom, i)
1.58 +
1.59 + def test07_setitem_single(self):
1.60 + "Test set single item (make sure we didn't break this)"
1.61 + for i in seqrange():
1.62 + for g in slice_geometries():
1.63 + if g.geom.ring and i in SEQ_BOUNDS: continue
1.64 + ag, ac = g.newitem(rng=(400,410))
1.65 + g.coords[i] = ac
1.66 + g.geom[i] = ag
1.67 + self.assertEqual(g.tuple_coords, g.geom.coords)
1.68 +
1.69 + def test08_setslice_simple(self):
1.70 + 'Test setting a simple slice of a geometry'
1.71 + for g in slice_geometries():
1.72 + for f in setslice_simple_functions(g):
1.73 + if g.geom.ring and not f.ring: continue
1.74 + f(g.coords)
1.75 + f(g.geom)
1.76 + msg = "fcn %s, geom %s" % (f.__name__, str(g.geom_type))
1.77 + self.assertEqual(g.tuple_coords, g.geom.coords, msg)
1.78 +
1.79 + def test09_setslice_extended(self):
1.80 + 'Test setting an extended slice of a geometry'
1.81 + for g in slice_geometries():
1.82 + for f in setslice_extended_functions(g):
1.83 + if g.geom.ring and not f.ring: continue
1.84 + f(g.coords)
1.85 + f(g.geom)
1.86 + msg = "fcn %s, geom %s" % (f.__name__, str(g.geom_type))
1.87 + self.assertEqual(g.tuple_coords, g.geom.coords, msg)
1.88 +
1.89 + def test10_setslice_extended_mismatched(self):
1.90 + 'Test setting extended slice with array of mismatched length'
1.91 + for g in slice_geometries():
1.92 + ag, ac = g.newitem(rng=(400,410))
1.93 + def func(): g.geom[2:8:2] = [ ag, ]
1.94 + self.assertRaises(ValueError, func)
1.95 +
1.96 + def test11_setitem_single_indexException(self):
1.97 + 'Test set single item with out-of-bounds index'
1.98 + for g in slice_geometries():
1.99 + ag, ac = g.newitem(rng=(400,410))
1.100 + def func(i): g.geom[i] = ag
1.101 + for i in SEQ_OUT_OF_BOUNDS:
1.102 + self.assertRaises(GEOSIndexError, func, i)
1.103 +
1.104 + def test12_append(self):
1.105 + 'Test list method append'
1.106 + for g in slice_geometries(ring=False):
1.107 + ag, ac = g.newitem(rng=(400,410))
1.108 + g.geom.append(ag)
1.109 + g.coords.append(ac)
1.110 + self.assertEqual(g.tuple_coords, g.geom.coords)
1.111 +
1.112 + def test13_extend(self):
1.113 + 'Test list method extend'
1.114 + for g in slice_geometries():
1.115 + items = g.coords_fcn(5)
1.116 + if g.geom.ring: items[-1] = g.coords[0]
1.117 + g.geom.extend(map(g.subtype,items))
1.118 + g.coords.extend(items)
1.119 + self.assertEqual(g.tuple_coords, g.geom.coords)
1.120 +
1.121 + def test14_insert(self):
1.122 + 'Test list method insert'
1.123 + for i in xrange(*SEQ_OUT_OF_BOUNDS):
1.124 + for g in slice_geometries():
1.125 + if g.geom.ring and i in SEQ_BOUNDS + SEQ_OUT_OF_BOUNDS:
1.126 + continue
1.127 + ag, ac = g.newitem(rng=(200,250))
1.128 + g.geom.insert(i, ag)
1.129 + g.coords.insert(i, ac)
1.130 + self.assertEqual(g.tuple_coords, g.geom.coords)
1.131 +
1.132 + def test15_insert_typeError(self):
1.133 + 'Test list method insert raises error on invalid index'
1.134 + for g in slice_geometries():
1.135 + ag, ac = g.newitem(rng=(200,250))
1.136 + self.assertRaises(TypeError, g.geom.insert, 'hi', ag)
1.137 +
1.138 + def test16_pop(self):
1.139 + 'Test list method pop'
1.140 + for i in seqrange():
1.141 + for g in slice_geometries():
1.142 + if g.geom.ring and i in SEQ_BOUNDS + SEQ_OUT_OF_BOUNDS:
1.143 + continue
1.144 + self.assertEqual(g.coords.pop(i), getcoords(g.geom.pop(i)))
1.145 +
1.146 + def test16_index(self):
1.147 + 'Test list method index'
1.148 + for i in xrange(0, SEQ_LENGTH):
1.149 + for g in slice_geometries():
1.150 + if g.geom.ring and i in SEQ_BOUNDS: continue
1.151 + ag, ac = g.newitem(rng=(400,410))
1.152 + g.geom[i] = ag
1.153 + self.assertEqual(i, g.geom.index(ag))
1.154 +
1.155 + def test17_index_ValueError(self):
1.156 + 'Test list method raises ValueError if value not found'
1.157 + for g in slice_geometries():
1.158 + ag, ac = g.newitem(rng=(400,410))
1.159 + self.assertRaises(ValueError, g.geom.index, ag)
1.160 +
1.161 + def test18_remove(self):
1.162 + 'Test list method remove'
1.163 + for i in xrange(0, SEQ_LENGTH):
1.164 + for g in slice_geometries():
1.165 + if g.geom.ring and i in SEQ_BOUNDS: continue
1.166 + ag, ac = g.newitem(rng=(400,410))
1.167 + g.geom[i] = ag
1.168 + g.coords[i] = ac
1.169 + g.geom.remove(ag)
1.170 + g.coords.remove(ac)
1.171 + self.assertEqual(g.tuple_coords, g.geom.coords)
1.172 +
1.173 + def test19_count(self):
1.174 + 'Test list method count'
1.175 + for g in slice_geometries():
1.176 + self.assertEqual(SEQ_LENGTH, g.geom.count())
1.177 +
1.178 + def test20_setslice_geos_fcns(self):
1.179 + 'Test geos properties after setting a simple slice of a geometry'
1.180 + for g in slice_geometries(ring=False):
1.181 + for f in setslice_simple_functions(g):
1.182 + f(g.coords)
1.183 + f(g.geom)
1.184 + if not len(g.coords): continue
1.185 + for tf in test_geos_functions():
1.186 + cg = g.make_geom()
1.187 + self.assertEqual(tf(cg) , tf(g.geom))
1.188 +
1.189 + def test21_delslice_geos_fcns(self):
1.190 + 'Test geos properties after deleting a slice of a geometry'
1.191 + for f in delslice_functions():
1.192 + for g in slice_geometries(ring=False):
1.193 + f(g.coords)
1.194 + f(g.geom)
1.195 + if not len(g.coords): continue
1.196 + for tf in test_geos_functions():
1.197 + cg = g.make_geom()
1.198 + self.assertEqual(tf(cg) , tf(g.geom))
1.199 +
1.200 +def suite():
1.201 + s = unittest.TestSuite()
1.202 + s.addTest(unittest.makeSuite(GEOSPyMutableTest))
1.203 + return s
1.204 +
1.205 +def run(verbosity=2):
1.206 + unittest.TextTestRunner(verbosity=verbosity).run(suite())
1.207 +
1.208 +if __name__ == '__main__':
1.209 + run()