django/contrib/gis/geos/tests/test_mutability.py
branchtrunk
changeset 138 466bece04a15
     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()