django/contrib/gis/geos/tests/test_mutability.py
author Justin Bronn <jbronn@geodjango.org>
Sat Jan 31 15:18:50 2009 -0600 (3 years ago)
branchtrunk
changeset 138 466bece04a15
permissions -rw-r--r--
Merged in patch from Aryeh Leib Taurog for #9877, adapting as necessary.
     1 import unittest
     2 from pymutable_geometries import *
     3 from django.contrib.gis.geos.error import GEOSIndexError
     4     
     5 class GEOSPyMutableTest(unittest.TestCase):
     6     '''
     7     Tests Pythonic Mutability of Python GEOS geometry wrappers
     8     get/set/delitem on a slice, normal list methods
     9     '''
    10 
    11     def test01_getitem(self):
    12         'Test getting a single item from a geometry'
    13         for g in slice_geometries():
    14             for i in seqrange():
    15                 self.assertEqual(g.coords[i], getcoords(g.geom[i]))
    16 
    17     def test02_getslice(self):
    18         'Test getting a slice from a geometry'
    19         for f in getslice_functions():
    20             for g in slice_geometries():
    21                 msg = "fcn %s, geom %s" % (f.__name__, str(g.geom_type))
    22                 self.assertEqual(f(g.coords), getcoords(f(g.geom)), msg)
    23 
    24     def test03_getitem_indexException(self):
    25         'Test get single item with out-of-bounds index'
    26         for g in slice_geometries():
    27             for i in SEQ_OUT_OF_BOUNDS:
    28                 self.assertRaises(GEOSIndexError, lambda: g.geom[i])
    29 
    30     def test04_delitem_single(self):
    31         'Test delete single item from a geometry'
    32         for i in seqrange():
    33             for g in slice_geometries():
    34                 if g.geom.ring and i in SEQ_BOUNDS: continue
    35                 del g.coords[i]
    36                 del g.geom[i]
    37                 self.assertEqual(g.tuple_coords, g.geom.coords)
    38 
    39     def test05_delitem_slice(self):
    40         'Test delete slice from a geometry'
    41         for f in delslice_functions():
    42             for g in slice_geometries():
    43                 if g.geom.ring and not f.ring: continue
    44                 f(g.coords)
    45                 f(g.geom)
    46                 msg = "fcn %s, geom %s" % (f.__name__, str(g.geom_type))
    47                 self.assertEqual(g.tuple_coords, g.geom.coords, msg)
    48 
    49     def test06_delitem_single_indexException(self):
    50         'Test delete single item with out-of-bounds index'
    51         def func(x, i): del x[i]
    52         for g in slice_geometries():
    53             for i in SEQ_OUT_OF_BOUNDS:
    54                 self.assertRaises(GEOSIndexError, func, g.geom, i)
    55 
    56     def test07_setitem_single(self):
    57         "Test set single item (make sure we didn't break this)"
    58         for i in seqrange():
    59             for g in slice_geometries():
    60                 if g.geom.ring and i in SEQ_BOUNDS: continue
    61                 ag, ac = g.newitem(rng=(400,410))
    62                 g.coords[i] = ac
    63                 g.geom[i] = ag
    64                 self.assertEqual(g.tuple_coords, g.geom.coords)
    65 
    66     def test08_setslice_simple(self):
    67         'Test setting a simple slice of a geometry'
    68         for g in slice_geometries():
    69             for f in setslice_simple_functions(g):
    70                 if g.geom.ring and not f.ring: continue
    71                 f(g.coords)
    72                 f(g.geom)
    73                 msg = "fcn %s, geom %s" % (f.__name__, str(g.geom_type))
    74                 self.assertEqual(g.tuple_coords, g.geom.coords, msg)
    75 
    76     def test09_setslice_extended(self):
    77         'Test setting an extended slice of a geometry'
    78         for g in slice_geometries():
    79             for f in setslice_extended_functions(g):
    80                 if g.geom.ring and not f.ring: continue
    81                 f(g.coords)
    82                 f(g.geom)
    83                 msg = "fcn %s, geom %s" % (f.__name__, str(g.geom_type))
    84                 self.assertEqual(g.tuple_coords, g.geom.coords, msg)
    85                 
    86     def test10_setslice_extended_mismatched(self):
    87         'Test setting extended slice with array of mismatched length'
    88         for g in slice_geometries():
    89             ag, ac = g.newitem(rng=(400,410))
    90             def func(): g.geom[2:8:2] = [ ag, ]
    91             self.assertRaises(ValueError, func)
    92 
    93     def test11_setitem_single_indexException(self):
    94         'Test set single item with out-of-bounds index'
    95         for g in slice_geometries():
    96             ag, ac = g.newitem(rng=(400,410))
    97             def func(i): g.geom[i] = ag
    98             for i in SEQ_OUT_OF_BOUNDS:
    99                 self.assertRaises(GEOSIndexError, func, i)
   100 
   101     def test12_append(self):
   102         'Test list method append'
   103         for g in slice_geometries(ring=False):
   104             ag, ac = g.newitem(rng=(400,410))
   105             g.geom.append(ag)
   106             g.coords.append(ac)
   107             self.assertEqual(g.tuple_coords, g.geom.coords)
   108 
   109     def test13_extend(self):
   110         'Test list method extend'
   111         for g in slice_geometries():
   112             items = g.coords_fcn(5)
   113             if g.geom.ring: items[-1] = g.coords[0]
   114             g.geom.extend(map(g.subtype,items))
   115             g.coords.extend(items)
   116             self.assertEqual(g.tuple_coords, g.geom.coords)
   117 
   118     def test14_insert(self):
   119         'Test list method insert'
   120         for i in xrange(*SEQ_OUT_OF_BOUNDS):
   121             for g in slice_geometries():
   122                 if g.geom.ring and i in SEQ_BOUNDS + SEQ_OUT_OF_BOUNDS:
   123                     continue
   124                 ag, ac = g.newitem(rng=(200,250))
   125                 g.geom.insert(i, ag)
   126                 g.coords.insert(i, ac)
   127                 self.assertEqual(g.tuple_coords, g.geom.coords)
   128 
   129     def test15_insert_typeError(self):
   130         'Test list method insert raises error on invalid index'
   131         for g in slice_geometries():
   132             ag, ac = g.newitem(rng=(200,250))
   133             self.assertRaises(TypeError, g.geom.insert, 'hi', ag)
   134 
   135     def test16_pop(self):
   136         'Test list method pop'
   137         for i in seqrange():
   138             for g in slice_geometries():
   139                 if g.geom.ring and i in SEQ_BOUNDS + SEQ_OUT_OF_BOUNDS:
   140                     continue
   141                 self.assertEqual(g.coords.pop(i), getcoords(g.geom.pop(i)))
   142 
   143     def test16_index(self):
   144         'Test list method index'
   145         for i in xrange(0, SEQ_LENGTH):
   146             for g in slice_geometries():
   147                 if g.geom.ring and i in SEQ_BOUNDS: continue
   148                 ag, ac = g.newitem(rng=(400,410))
   149                 g.geom[i] = ag
   150                 self.assertEqual(i, g.geom.index(ag))
   151 
   152     def test17_index_ValueError(self):
   153         'Test list method raises ValueError if value not found'
   154         for g in slice_geometries():
   155             ag, ac = g.newitem(rng=(400,410))
   156             self.assertRaises(ValueError, g.geom.index, ag)
   157 
   158     def test18_remove(self):
   159         'Test list method remove'
   160         for i in xrange(0, SEQ_LENGTH):
   161             for g in slice_geometries():
   162                 if g.geom.ring and i in SEQ_BOUNDS: continue
   163                 ag, ac = g.newitem(rng=(400,410))
   164                 g.geom[i] = ag
   165                 g.coords[i] = ac
   166                 g.geom.remove(ag)
   167                 g.coords.remove(ac)
   168                 self.assertEqual(g.tuple_coords, g.geom.coords)
   169 
   170     def test19_count(self):
   171         'Test list method count'
   172         for g in slice_geometries():
   173             self.assertEqual(SEQ_LENGTH, g.geom.count())
   174 
   175     def test20_setslice_geos_fcns(self):
   176         'Test geos properties after setting a simple slice of a geometry'
   177         for g in slice_geometries(ring=False):
   178             for f in setslice_simple_functions(g):
   179                 f(g.coords)
   180                 f(g.geom)
   181                 if not len(g.coords): continue
   182                 for tf in test_geos_functions():
   183                     cg = g.make_geom()
   184                     self.assertEqual(tf(cg) , tf(g.geom))
   185 
   186     def test21_delslice_geos_fcns(self):
   187         'Test geos properties after deleting a slice of a geometry'
   188         for f in delslice_functions():
   189             for g in slice_geometries(ring=False):
   190                 f(g.coords)
   191                 f(g.geom)
   192                 if not len(g.coords): continue
   193                 for tf in test_geos_functions():
   194                     cg = g.make_geom()
   195                     self.assertEqual(tf(cg) , tf(g.geom))
   196 
   197 def suite():
   198     s = unittest.TestSuite()
   199     s.addTest(unittest.makeSuite(GEOSPyMutableTest))
   200     return s
   201 
   202 def run(verbosity=2):
   203     unittest.TextTestRunner(verbosity=verbosity).run(suite())
   204 
   205 if __name__ == '__main__':
   206     run()