1# -*- coding: utf-8 -*-
2from grass.exceptions import OpenError
3from grass.gunittest.case import TestCase
4from grass.gunittest.main import test
5
6from grass.pygrass.raster import RasterRow
7
8
9class RasterRowTestCase(TestCase):
10
11    name = "RasterRowTestCase_map"
12
13    @classmethod
14    def setUpClass(cls):
15        """Create test raster map and region"""
16        cls.use_temp_region()
17        cls.runModule("g.region", n=40, s=0, e=40, w=0, res=10)
18        cls.runModule("r.mapcalc", expression="%s = row() + (10.0 * col())" % (cls.name),
19            overwrite=True)
20
21    @classmethod
22    def tearDownClass(cls):
23        """Remove the generated vector map, if exist"""
24        cls.runModule("g.remove", flags='f', type='raster',
25                      name=cls.name)
26        cls.del_temp_region()
27
28    def test_type(self):
29        r = RasterRow(self.name)
30        r.open(mode='r')
31        self.assertTrue(r.mtype, 'DCELL')
32        r.close()
33
34    def test_isopen(self):
35        r = RasterRow(self.name)
36        self.assertFalse(r.is_open())
37        r.open(mode='r')
38        self.assertTrue(r.is_open())
39        r.close()
40        self.assertFalse(r.is_open())
41
42    def test_name(self):
43        r = RasterRow(self.name)
44        r.open(mode='r')
45        self.assertEqual(r.name, self.name)
46        fullname = "{name}@{mapset}".format(name=r.name, mapset=r.mapset)
47        self.assertEqual(r.fullname(), fullname)
48        r.close()
49
50    def test_exist(self):
51        notexist = RasterRow(self.name + 'notexist')
52        self.assertFalse(notexist.exist())
53        exist = RasterRow(self.name)
54        self.assertTrue(exist.exist())
55
56    def test_open_r(self):
57        notexist = RasterRow(self.name + 'notexist')
58        with self.assertRaises(OpenError):
59            # raster does not exist
60            notexist.open(mode='r')
61        r = RasterRow(self.name)
62        r.open(mode='r', mtype='FCELL')
63        # ignore the mtype if is open in read mode
64        self.assertEqual(r.mtype, 'DCELL')
65        r.close()
66
67    def test_open_w(self):
68        r = RasterRow(self.name)
69        with self.assertRaises(OpenError):
70            # raster type is not defined!
71            r.open(mode='w')
72        with self.assertRaises(OpenError):
73            # raster already exist
74            r.open(mode='w', mtype='DCELL')
75        # open in write mode and overwrite
76        r.open(mode='w', mtype='DCELL', overwrite=True)
77        self.assertTrue(r.mtype, 'DCELL')
78        r.close()
79
80    def test_row_range(self):
81        r = RasterRow(self.name)
82        with self.assertRaises(IndexError):
83            # Map is not open yet
84            r[1]
85        with self.assertRaises(IndexError):
86            # Index is out of range
87            r.open()
88            r[9999]
89        r.close()
90
91
92if __name__ == '__main__':
93    test()
94