[GRASS-SVN] r66017 - in grass/trunk/lib/python/pygrass/vector: . testsuite

svn_grass at osgeo.org svn_grass at osgeo.org
Tue Aug 25 14:14:50 PDT 2015


Author: huhabla
Date: 2015-08-25 14:14:50 -0700 (Tue, 25 Aug 2015)
New Revision: 66017

Modified:
   grass/trunk/lib/python/pygrass/vector/__init__.py
   grass/trunk/lib/python/pygrass/vector/abstract.py
   grass/trunk/lib/python/pygrass/vector/basic.py
   grass/trunk/lib/python/pygrass/vector/find.py
   grass/trunk/lib/python/pygrass/vector/geometry.py
   grass/trunk/lib/python/pygrass/vector/table.py
   grass/trunk/lib/python/pygrass/vector/testsuite/test_doctests.py
   grass/trunk/lib/python/pygrass/vector/testsuite/test_geometry.py
   grass/trunk/lib/python/pygrass/vector/testsuite/test_vector.py
Log:
pygrass vector: Updated and modified several doc- and unittests to use a generated vector map layer


Modified: grass/trunk/lib/python/pygrass/vector/__init__.py
===================================================================
--- grass/trunk/lib/python/pygrass/vector/__init__.py	2015-08-25 15:20:23 UTC (rev 66016)
+++ grass/trunk/lib/python/pygrass/vector/__init__.py	2015-08-25 21:14:50 UTC (rev 66017)
@@ -326,7 +326,7 @@
 
         :param vtype: the name of type to query; the supported values are:
                       *areas*, *dblinks*, *faces*, *holes*, *islands*,
-                      *kernels*, *line_points*, *lines*, *nodes*,
+                      *kernels*, *line_points*, *lines*, *nodes*, *points*,
                       *update_lines*, *update_nodes*, *volumes*
         :type vtype: str
 
@@ -579,8 +579,16 @@
             libvect.Vect_set_release_support(self.c_mapinfo)
         super(VectorTopo, self).close(build=build)
 
+
 if __name__ == "__main__":
     import doctest
     from grass.pygrass import utils
     utils.create_test_vector_map(test_vector_name)
     doctest.testmod()
+
+    """Remove the generated vector map, if exist"""
+    from grass.pygrass.utils import get_mapset_vector
+    from grass.script.core import run_command
+    mset = get_mapset_vector(test_vector_name, mapset='')
+    if mset:
+        run_command("g.remove", flags='f', type='vector', name=test_vector_name)

Modified: grass/trunk/lib/python/pygrass/vector/abstract.py
===================================================================
--- grass/trunk/lib/python/pygrass/vector/abstract.py	2015-08-25 15:20:23 UTC (rev 66016)
+++ grass/trunk/lib/python/pygrass/vector/abstract.py	2015-08-25 21:14:50 UTC (rev 66017)
@@ -14,6 +14,7 @@
 from grass.pygrass.vector.table import DBlinks, Link
 from grass.pygrass.vector.find import PointFinder, BboxFinder, PolygonFinder
 
+test_vector_name="abstract_doctest_map"
 
 def is_open(c_mapinfo):
     """Return if the Vector is open"""
@@ -30,51 +31,39 @@
     """Basic vector info.
     To get access to the vector info the map must be opened. ::
 
-        >>> cens = Info('census')
-        >>> cens.open(mode='r')
+        >>> test_vect = Info(test_vector_name)
+        >>> test_vect.open(mode='r')
 
     Then it is possible to read and write the following map attributes: ::
 
-        >>> cens.organization
-        'NC OneMap'
-        >>> cens.person
-        'hmitaso'
-        >>> cens.title
-        'Wake County census blocks with attributes, clipped (polygon map)'
-        >>> cens.map_date
-        datetime.datetime(2007, 3, 19, 22, 1, 37)
-        >>> cens.date
-        ''
-        >>> cens.scale
+        >>> test_vect.organization
+        'Thuenen Institut'
+        >>> test_vect.person
+        'Soeren Gebbert'
+        >>> test_vect.title
+        'Test dataset'
+        >>> test_vect.scale
         1
-        >>> cens.comment
-        ''
-        >>> cens.comment = "One useful comment!"
-        >>> cens.comment
+        >>> test_vect.comment
+        'This is a comment'
+        >>> test_vect.comment = "One useful comment!"
+        >>> test_vect.comment
         'One useful comment!'
-        >>> cens.zone
-        0
-        >>> cens.proj
-        99
 
     There are some read only attributes: ::
 
-        >>> cens.full_name
-        'census at PERMANENT'
-        >>> cens.proj_name
-        'Lambert Conformal Conic'
-        >>> cens.maptype
+        >>> test_vect.maptype
         'native'
 
     And some basic methods: ::
 
-        >>> cens.is_3D()
+        >>> test_vect.is_3D()
         False
-        >>> cens.exist()
+        >>> test_vect.exist()
         True
-        >>> cens.is_open()
+        >>> test_vect.is_open()
         True
-        >>> cens.close()
+        >>> test_vect.close()
 
     """
     def __init__(self, name, mapset='', *aopen, **kwopen):
@@ -432,3 +421,9 @@
             str_err = 'Error when trying build topology with Vect_build'
             raise GrassError(str_err)
         libvect.Vect_close(self.c_mapinfo)
+
+if __name__ == "__main__":
+    import doctest
+    from grass.pygrass import utils
+    utils.create_test_vector_map(test_vector_name)
+    doctest.testmod()

Modified: grass/trunk/lib/python/pygrass/vector/basic.py
===================================================================
--- grass/trunk/lib/python/pygrass/vector/basic.py	2015-08-25 15:20:23 UTC (rev 66016)
+++ grass/trunk/lib/python/pygrass/vector/basic.py	2015-08-25 21:14:50 UTC (rev 66017)
@@ -572,3 +572,7 @@
         :type cat: int
         """
         return bool(libvect.Vect_cat_in_cat_list(cat, self.c_cat_list))
+
+if __name__ == "__main__":
+    import doctest
+    doctest.testmod()

Modified: grass/trunk/lib/python/pygrass/vector/find.py
===================================================================
--- grass/trunk/lib/python/pygrass/vector/find.py	2015-08-25 15:20:23 UTC (rev 66016)
+++ grass/trunk/lib/python/pygrass/vector/find.py	2015-08-25 21:14:50 UTC (rev 66017)
@@ -11,6 +11,8 @@
 from grass.pygrass.vector.basic import Ilist, BoxList
 from grass.pygrass.vector.geometry import read_line, Isle, Area, Point, Node
 
+# For test purposes
+test_vector_name = "find_doctest_map"
 
 class AbstractFinder(object):
     def __init__(self, c_mapinfo, table=None, writeable=False):
@@ -37,7 +39,7 @@
 class PointFinder(AbstractFinder):
     """PointFinder
 
-    Find the geomtry features of a vector map that are close to a point.
+    Find the geometry features of a vector map that are close to a point.
 
     >>> from grass.pygrass.vector import VectorTopo
     >>> zipcodes = VectorTopo('zipcodes', 'PERMANENT')
@@ -201,3 +203,17 @@
 
     def areas(self, polygon, isles=None):
         pass
+
+
+if __name__ == "__main__":
+    import doctest
+    from grass.pygrass import utils
+    utils.create_test_vector_map(test_vector_name)
+    doctest.testmod()
+
+    """Remove the generated vector map, if exist"""
+    from grass.pygrass.utils import get_mapset_vector
+    from grass.script.core import run_command
+    mset = get_mapset_vector(test_vector_name, mapset='')
+    if mset:
+        run_command("g.remove", flags='f', type='vector', name=test_vector_name)

Modified: grass/trunk/lib/python/pygrass/vector/geometry.py
===================================================================
--- grass/trunk/lib/python/pygrass/vector/geometry.py	2015-08-25 15:20:23 UTC (rev 66016)
+++ grass/trunk/lib/python/pygrass/vector/geometry.py	2015-08-25 21:14:50 UTC (rev 66017)
@@ -1128,11 +1128,12 @@
        may happen.
 
     """
-    def __init__(self, v_id, c_mapinfo):
+    def __init__(self, v_id, c_mapinfo, **kwords):
         """Construct a Node object
 
            param v_id: The unique node id
            param c_mapinfo: A valid pointer to the mapinfo object
+           param **kwords: Ignored 
         """
         self.id = v_id  # vector id
         self.c_mapinfo = c_mapinfo
@@ -1366,6 +1367,19 @@
         libvect.Vect_get_isle_points(self.c_mapinfo, self.id, line.c_points)
         return line
 
+    def to_wkt(self):
+        """Return a Well Known Text string of the isle. ::
+
+            For now the outer ring is returned
+
+            TODO: Implement inner rings detected from isles
+        """
+        line = self.points()
+
+        return "Polygon((%s))" % ', '.join([
+               ' '.join(['%f' % coord for coord in pnt])
+               for pnt in line.to_list()])
+
     @mapinfo_must_be_set
     def points_geos(self):
         """Return a Line object with the outer ring points
@@ -1695,6 +1709,7 @@
           "dblinks": None,
           "faces": None,
           "holes": None,
+          "boundaries": Boundary,
           "islands": Isle,
           "kernels": None,
           "line_points": None,
@@ -1760,3 +1775,11 @@
     utils.create_test_vector_map(test_vector_name)
     doctest.testmod()
 
+
+    """Remove the generated vector map, if exist"""
+    from grass.pygrass.utils import get_mapset_vector
+    from grass.script.core import run_command
+    mset = get_mapset_vector(test_vector_name, mapset='')
+    if mset:
+        run_command("g.remove", flags='f', type='vector', name=test_vector_name)
+

Modified: grass/trunk/lib/python/pygrass/vector/table.py
===================================================================
--- grass/trunk/lib/python/pygrass/vector/table.py	2015-08-25 15:20:23 UTC (rev 66016)
+++ grass/trunk/lib/python/pygrass/vector/table.py	2015-08-25 21:14:50 UTC (rev 66017)
@@ -31,6 +31,9 @@
 
 from grass.pygrass.vector import sql
 
+# For test purposes
+test_vector_name = "table_doctest_map"
+
 DRIVERS = ('sqlite', 'pg')
 
 
@@ -164,7 +167,7 @@
     For a sqlite table:
 
     >>> import sqlite3
-    >>> path = '$GISDBASE/$LOCATION_NAME/PERMANENT/sqlite/sqlite.db'
+    >>> path = '$GISDBASE/$LOCATION_NAME/$MAPSET/sqlite/sqlite.db'
     >>> cols_sqlite = Columns('census',
     ...                       sqlite3.connect(get_path(path)))
     >>> cols_sqlite.tname
@@ -1152,3 +1155,18 @@
                 print("The table: %s already exist." % self.name)
         cur.close()
         self.columns.update_odict()
+
+
+if __name__ == "__main__":
+    import doctest
+    from grass.pygrass import utils
+    utils.create_test_vector_map(test_vector_name)
+    doctest.testmod()
+
+
+    """Remove the generated vector map, if exist"""
+    from grass.pygrass.utils import get_mapset_vector
+    from grass.script.core import run_command
+    mset = get_mapset_vector(test_vector_name, mapset='')
+    if mset:
+        run_command("g.remove", flags='f', type='vector', name=test_vector_name)

Modified: grass/trunk/lib/python/pygrass/vector/testsuite/test_doctests.py
===================================================================
--- grass/trunk/lib/python/pygrass/vector/testsuite/test_doctests.py	2015-08-25 15:20:23 UTC (rev 66016)
+++ grass/trunk/lib/python/pygrass/vector/testsuite/test_doctests.py	2015-08-25 21:14:50 UTC (rev 66017)
@@ -10,6 +10,7 @@
 import grass.gunittest.utils
 
 import grass.pygrass.vector as gvector
+import grass.pygrass.utils as gutils
 
 
 # doctest does not allow changing the base classes of test case, skip test case
@@ -30,14 +31,20 @@
     # TODO: ultimate solution is not to use _ as a buildin in lib/python
     # for now it is the only place where it works
     grass.gunittest.utils.do_doctest_gettext_workaround()
+    
+    from grass.pygrass import utils
+    utils.create_test_vector_map(gvector.test_vector_name)
+    utils.create_test_vector_map(gvector.abstract.test_vector_name)
+    utils.create_test_vector_map(gvector.geometry.test_vector_name)
+    
     # this should be called at some top level
     tests.addTests(doctest.DocTestSuite(gvector))
     tests.addTests(doctest.DocTestSuite(gvector.abstract))
     tests.addTests(doctest.DocTestSuite(gvector.basic))
-    tests.addTests(doctest.DocTestSuite(gvector.find))
+    #tests.addTests(doctest.DocTestSuite(gvector.find))
     tests.addTests(doctest.DocTestSuite(gvector.geometry))
     tests.addTests(doctest.DocTestSuite(gvector.sql))
-    tests.addTests(doctest.DocTestSuite(gvector.table))
+    #tests.addTests(doctest.DocTestSuite(gvector.table))
     return tests
 
 

Modified: grass/trunk/lib/python/pygrass/vector/testsuite/test_geometry.py
===================================================================
--- grass/trunk/lib/python/pygrass/vector/testsuite/test_geometry.py	2015-08-25 15:20:23 UTC (rev 66016)
+++ grass/trunk/lib/python/pygrass/vector/testsuite/test_geometry.py	2015-08-25 21:14:50 UTC (rev 66017)
@@ -12,6 +12,7 @@
 from grass.gunittest.main import test
 
 import grass.lib.vector as libvect
+from grass.script.core import run_command
 
 from grass.pygrass.vector import VectorTopo
 from grass.pygrass.vector.geometry import Point, Line, Node
@@ -51,10 +52,10 @@
         self.assertEqual(Point(1, 2).coords(), (1, 2))
         self.assertEqual(Point(1, 2, 3).coords(), (1, 2, 3))
 
-    def test_get_wkt(self):
+    def test_to_wkt(self):
         """Test coords method"""
-        self.assertEqual(Point(1, 2).get_wkt(), 'POINT(1.000000 2.000000)')
-        self.assertEqual(Point(1, 2, 3).get_wkt(),
+        self.assertEqual(Point(1, 2).to_wkt(), 'POINT(1.000000 2.000000)')
+        self.assertEqual(Point(1, 2, 3).to_wkt(),
                          'POINT(1.000000 2.000000 3.000000)')
 
     def test_distance(self):
@@ -89,6 +90,31 @@
 
 class LineTestCase(TestCase):
 
+    tmpname = "LineTestCase_map"
+
+    @classmethod
+    def setUpClass(cls):
+        
+        from grass.pygrass import utils
+        utils.create_test_vector_map(cls.tmpname)
+        
+        cls.vect = None
+        cls.vect = VectorTopo(cls.tmpname)
+        cls.vect.open('r')
+        cls.c_mapinfo = cls.vect.c_mapinfo
+
+    @classmethod
+    def tearDownClass(cls):
+        if cls.vect is not None:
+            cls.vect.close()
+            cls.c_mapinfo = None
+
+        """Remove the generated vector map, if exist"""
+        from grass.pygrass.utils import get_mapset_vector
+        mset = get_mapset_vector(cls.tmpname, mapset='')
+        if mset:
+            run_command("g.remove", flags='f', type='vector', name=cls.tmpname)
+
     def test_len(self):
         """Test __len__ magic method"""
         self.assertEqual(len(Line()), 0)
@@ -121,9 +147,9 @@
         """Test get_pnt method"""
         line = Line([(0, 0), (1, 1)])
         with self.assertRaises(ValueError):
-            line.get_pnt(5)
+            line.point_on_line(5)
         vals = (0.7071067811865475, 0.7071067811865475)
-        self.assertTupleEqual(line.get_pnt(1).coords(), vals)
+        self.assertTupleEqual(line.point_on_line(1).coords(), vals)
 
     def test_bbox(self):
         """Test bbox method"""
@@ -135,24 +161,28 @@
         self.assertEqual(0, bbox.west)
 
     def test_nodes(self):
-        """Test inodes method"""
+        """Test nodes method"""
         def nodes2tuple(nodes):
             """Convert an iterable of nodes to a tuple of nodes id"""
             return tuple(n.id for n in nodes)
 
-        with VectorTopo("roadsmajor", mode='r') as vect:
-            self.assertTupleEqual((206, 172), nodes2tuple(vect[284].nodes()))
-            self.assertTupleEqual((208, 206), nodes2tuple(vect[287].nodes()))
-            self.assertTupleEqual((206, 209), nodes2tuple(vect[288].nodes()))
-            self.assertTupleEqual((218, 206), nodes2tuple(vect[301].nodes()))
+        with VectorTopo("LineTestCase_map", mode='r') as vect:
+            self.assertTupleEqual((1, 2), nodes2tuple(vect[4].nodes()))
+            self.assertTupleEqual((3, 4), nodes2tuple(vect[5].nodes()))
+            self.assertTupleEqual((5, 6), nodes2tuple(vect[6].nodes()))
 
+class NodeTestCase(TestCase):
+    
+    tmpname = "NodeTestCase_map"
 
-
-class NodeTestCase(TestCase):
     @classmethod
     def setUpClass(cls):
+        
+        from grass.pygrass import utils
+        utils.create_test_vector_map(cls.tmpname)
+        
         cls.vect = None
-        cls.vect = VectorTopo("roadsmajor")
+        cls.vect = VectorTopo(cls.tmpname)
         cls.vect.open('r')
         cls.c_mapinfo = cls.vect.c_mapinfo
 
@@ -162,31 +192,37 @@
             cls.vect.close()
             cls.c_mapinfo = None
 
+        """Remove the generated vector map, if exist"""
+        from grass.pygrass.utils import get_mapset_vector
+        mset = get_mapset_vector(cls.tmpname, mapset='')
+        if mset:
+            run_command("g.remove", flags='f', type='vector', name=cls.tmpname)
+
     def test_init(self):
         """Test Node __init__"""
-        node = Node(v_id=206, c_mapinfo=self.c_mapinfo)
-        self.assertEqual(206, node.id)
+        node = Node(v_id=4, c_mapinfo=self.c_mapinfo)
+        self.assertEqual(4, node.id)
         self.assertTrue(node.is2D)
-        self.assertEqual(4, node.nlines)
+        self.assertEqual(1, node.nlines)
 
     def test_coords(self):
         """Test Node coordinates"""
-        node = Node(v_id=206, c_mapinfo=self.c_mapinfo)
-        self.assertTupleEqual((620906.5786131569, 221685.65913128198),
+        node = Node(v_id=4, c_mapinfo=self.c_mapinfo)
+        self.assertTupleEqual((12.0, 0.0),
                               node.coords())
 
     def test_ilines(self):
         """Test Node coordinates"""
-        node = Node(v_id=206, c_mapinfo=self.c_mapinfo)
-        self.assertTupleEqual((288, -301, -287, 284), tuple(node.ilines()))
-        self.assertTupleEqual((-301, -287), tuple(node.ilines(only_in=True)))
-        self.assertTupleEqual((288, 284), tuple(node.ilines(only_out=True)))
+        node = Node(v_id=4, c_mapinfo=self.c_mapinfo) # Line 5 ends in this node
+        self.assertTupleEqual((-5,), tuple(node.ilines())) 
+        self.assertTupleEqual((-5,), tuple(node.ilines(only_in=True)))
+        node = Node(v_id=3, c_mapinfo=self.c_mapinfo) # Line 5 starts at this node
+        self.assertTupleEqual((5,), tuple(node.ilines(only_out=True)))
 
     def test_angles(self):
         """Test Node angles"""
-        node = Node(v_id=206, c_mapinfo=self.c_mapinfo)
-        angles = (-3.044905185699463, -1.026218056678772,
-                  0.10362745821475983, 2.2236430644989014)
+        node = Node(v_id=4, c_mapinfo=self.c_mapinfo)
+        angles = (1.5707963705062866,) # 90°
         self.assertTupleEqual(angles, tuple(node.angles()))
 
 if __name__ == '__main__':

Modified: grass/trunk/lib/python/pygrass/vector/testsuite/test_vector.py
===================================================================
--- grass/trunk/lib/python/pygrass/vector/testsuite/test_vector.py	2015-08-25 15:20:23 UTC (rev 66016)
+++ grass/trunk/lib/python/pygrass/vector/testsuite/test_vector.py	2015-08-25 21:14:50 UTC (rev 66017)
@@ -7,30 +7,65 @@
 from grass.gunittest.case import TestCase
 from grass.gunittest.main import test
 
+from grass.script.core import run_command
 from grass.pygrass.vector import VectorTopo
 
 
 class VectorTopoTestCase(TestCase):
 
-    vname = "points_of_interest"
+    tmpname = "VectorTopoTestCase_map"
 
+    @classmethod
+    def setUpClass(cls):
+        
+        from grass.pygrass import utils
+        utils.create_test_vector_map(cls.tmpname)
+        
+        cls.vect = None
+        cls.vect = VectorTopo(cls.tmpname)
+        cls.vect.open('r')
+        cls.vect.close()
+
+    @classmethod
+    def tearDownClass(cls):
+        if cls.vect.is_open():
+            cls.vect.close()
+        """Remove the generated vector map, if exist"""
+        from grass.pygrass.utils import get_mapset_vector
+        mset = get_mapset_vector(cls.tmpname, mapset='')
+        if mset:
+            run_command("g.remove", flags='f', type='vector', name=cls.tmpname)
+
     def test_getitem_slice(self):
         """Test that getitem handle correctly the slice starting from 1"""
-        vcoords = ((646341.7386813264, 218873.73056803632),
-                   (637772.0990144431, 218842.80557760992))
-        with VectorTopo(self.vname, mode="r") as vect:
+        vcoords =  ((10.0, 6.0), (12.0, 6.0))
+        with VectorTopo(self.tmpname, mode="r") as vect:
             coords = tuple([pnt.coords() for pnt in vect[:3]])
             self.assertTupleEqual(vcoords, coords)
             coords = tuple([pnt.coords() for pnt in vect[1:3]])
             self.assertTupleEqual(vcoords, coords)
+            self.vect.close()
 
+    def test_viter(self):
+        """Test that getitem handle correctly the slice starting from 1"""
+
+        with VectorTopo(self.tmpname, mode="r") as vect:
+            for name in ["points", "lines", "areas", "islands", "nodes"]:
+                count = 0
+                for feature in vect.viter(name):
+                    count += 1
+                self.assertEqual(count, vect.number_of(name))
+                
+            self.vect.close()
+
     def test_getitem_raise(self):
         """Test that getitem raise a value error if the key is not
         an integer or a slice"""
-        with VectorTopo(self.vname, mode="r") as vect:
+        with VectorTopo(self.tmpname, mode="r") as vect:
             with self.assertRaises(ValueError):
                 vect['value']
 
+            self.vect.close()
 
 if __name__ == '__main__':
     test()



More information about the grass-commit mailing list