source: trunk/anuga_core/source/anuga/file/test_csv.py @ 7866

Last change on this file since 7866 was 7866, checked in by hudson, 14 years ago

More swb tests passing. Cleaned up some pylint errors.

File size: 13.7 KB
Line 
1import os
2import unittest
3import tempfile
4import numpy as num
5
6from csv_file import load_csv_as_array, load_csv_as_dict, store_parameters, \
7                        load_csv_as_matrix
8
9class Test_csv(unittest.TestCase):
10    def setUp(self):
11        pass
12
13    def tearDown(self):
14        pass
15
16    def _create_csv_file(self):
17        """
18            Create a dummy csv file.
19            Return its filename.
20        """     
21        filename = tempfile.mktemp(".txt")
22        file = open(filename,"w")
23        file.write("elevation, stage\n\
241.0, 3  \n\
250.0, 4 \n\
264.0, 3 \n\
271.0, 6 \n")
28        file.close()
29        return filename
30       
31    def test_get_data_from_file1(self):
32        filename = self._create_csv_file()
33
34        x = load_csv_as_array(filename) 
35       
36        os.remove(filename)
37
38        assert num.allclose(x['elevation'], [1.0, 0.0, 4.0, 1.0])
39        assert num.allclose(x['stage'], [3.0, 4.0, 3.0, 6.0])       
40
41
42    def test_get_data_from_file(self):
43        filename = self._create_csv_file()
44       
45        header,x = load_csv_as_matrix(filename)
46        os.remove(filename)
47       
48        assert num.allclose(x[:,0], [1.0, 0.0,4.0, 1.0])
49
50       
51    def test_store_parameters(self):
52        """tests store temporary file
53        """
54       
55        from os import sep, getenv
56       
57        output_dir=''
58        file_name='details.csv'
59       
60        kwargs = {'file_name':'new2.txt',
61                  'output_dir':output_dir,
62                  'file_name':file_name,
63                  'who':'me',
64                  'what':'detail',
65                  'how':2,
66                  'why':241,
67#                  'completed':345
68                  }
69        store_parameters(verbose=False,**kwargs)
70
71        temp='detail_temp.csv'
72        fid = open(temp)
73        file_header = fid.readline()
74        file_line = fid.readline()
75        fid.close()
76       
77       
78        keys = kwargs.keys()
79        keys.sort()
80        line=''
81        header=''
82        count=0
83        #used the sorted keys to create the header and line data
84        for k in keys:
85#            print "%s = %s" %(k, kwargs[k])
86            header = header+str(k)
87            line = line+str(kwargs[k])
88            count+=1
89            if count <len(kwargs):
90                header = header+','
91                line = line+','
92        header+='\n'
93        line+='\n'
94       
95       
96        #file exists
97        assert os.access(temp, os.F_OK)
98        assert header == file_header
99        assert line == file_line
100       
101        os.remove(temp)
102       
103    def test_store_parameters1(self):
104        """tests store in temporary file and other file
105        """
106       
107        from os import sep, getenv
108       
109        output_dir=''
110        file_name='details.csv'
111       
112        kwargs = {'file_name':'new2.txt',
113                  'output_dir':output_dir,
114                  'file_name':file_name,
115                  'who':'me',
116                  'what':'detail',
117                  'how':2,
118                  'why':241,
119#                  'completed':345
120                  }
121        store_parameters(verbose=False,**kwargs)
122       
123        kwargs['how']=55
124        kwargs['completed']=345
125
126        keys = kwargs.keys()
127        keys.sort()
128        line=''
129        header=''
130        count=0
131        #used the sorted keys to create the header and line data
132        for k in keys:
133#            print "%s = %s" %(k, kwargs[k])
134            header = header+str(k)
135            line = line+str(kwargs[k])
136            count+=1
137            if count <len(kwargs):
138                header = header+','
139                line = line+','
140        header+='\n'
141        line+='\n'
142       
143        kwargs['how']=55
144        kwargs['completed']=345
145       
146        store_parameters(verbose=False,**kwargs)
147       
148#        temp='detail_temp.csv'
149        fid = open(file_name)
150        file_header = fid.readline()
151        file_line1 = fid.readline()
152        file_line2 = fid.readline()
153        fid.close()
154       
155       
156        #file exists
157#        print 'header',header,'line',line
158#        print 'file_header',file_header,'file_line1',file_line1,'file_line2',file_line2
159        assert os.access(file_name, os.F_OK)
160        assert header == file_header
161        assert line == file_line1
162       
163        temp='detail_temp.csv'
164        os.remove(temp)
165        os.remove(file_name)       
166       
167    def test_store_parameters2(self):
168        """tests appending the data to the end of an existing file
169        """
170       
171        from os import sep, getenv
172       
173        output_dir=''
174        file_name='details.csv'
175       
176        kwargs = {'file_name':'new2.txt',
177                  'output_dir':output_dir,
178                  'file_name':file_name,
179                  'who':'me',
180                  'what':'detail',
181                  'how':2,
182                  'why':241,
183                  'completed':345
184                  }
185        store_parameters(verbose=False,**kwargs)
186       
187        kwargs['how']=55
188        kwargs['completed']=23.54532
189       
190        store_parameters(verbose=False,**kwargs)
191       
192        keys = kwargs.keys()
193        keys.sort()
194        line=''
195        header=''
196        count=0
197        #used the sorted keys to create the header and line data
198        for k in keys:
199#            print "%s = %s" %(k, kwargs[k])
200            header = header+str(k)
201            line = line+str(kwargs[k])
202            count+=1
203            if count <len(kwargs):
204                header = header+','
205                line = line+','
206        header+='\n'
207        line+='\n'
208       
209        fid = open(file_name)
210        file_header = fid.readline()
211        file_line1 = fid.readline()
212        file_line2 = fid.readline()
213        fid.close()
214       
215        assert os.access(file_name, os.F_OK)
216        assert header == file_header
217        assert line == file_line2
218       
219        os.remove(file_name)       
220       
221
222   
223    def test_csv2polygons(self):
224        """test loading of a csv polygon file.
225        """
226       
227        path = get_pathname_from_package('anuga.shallow_water')               
228        testfile = os.path.join(path, 'polygon_values_example.csv')               
229
230        polygons, values = load_csv_as_polygons(testfile, 
231                                        value_name='floors')
232
233        assert len(polygons) == 7, 'Must have seven polygons'
234        assert len(values) == 7, 'Must have seven values'
235           
236        # Known floor values
237        floors = {'1': 2, '2': 0, '3': 1, '4': 2, '5': 0, '8': 1, '9': 1}
238       
239        # Known polygon values
240        known_polys = {'1': [[422681.61,871117.55],
241                             [422691.02,871117.60],
242                             [422690.87,871084.23],
243                             [422649.36,871081.85],
244                             [422649.36,871080.39],
245                             [422631.86,871079.50],
246                             [422631.72,871086.75],
247                             [422636.75,871087.20],
248                             [422636.75,871091.50],
249                             [422649.66,871092.09],
250                             [422649.83,871084.91],
251                             [422652.94,871084.90],
252                             [422652.84,871092.39],
253                             [422681.83,871093.73],
254                             [422681.61,871117.55]],
255                       '2': [[422664.22,870785.46],
256                             [422672.48,870780.14],
257                             [422668.17,870772.62],
258                             [422660.35,870777.17],
259                             [422664.22,870785.46]],
260                       '3': [[422661.30,871215.06],
261                             [422667.50,871215.70],
262                             [422668.30,871204.86],
263                             [422662.21,871204.33],
264                             [422661.30,871215.06]],
265                       '4': [[422473.44,871191.22],
266                             [422478.33,871192.26],
267                             [422479.52,871186.03],
268                             [422474.78,871185.14],
269                             [422473.44,871191.22]],
270                       '5': [[422369.69,871049.29],
271                             [422378.63,871053.58],
272                             [422383.91,871044.51],
273                             [422374.97,871040.32],
274                             [422369.69,871049.29]],
275                       '8': [[422730.56,871203.13],
276                             [422734.10,871204.90],
277                             [422735.26,871202.18],
278                             [422731.87,871200.58],
279                             [422730.56,871203.13]],
280                       '9': [[422659.85,871213.80],
281                             [422660.91,871210.97],
282                             [422655.42,871208.85],
283                             [422654.36,871211.68],
284                             [422659.85,871213.80]]
285                       }       
286       
287
288       
289               
290        for id in ['1', '2', '3', '4', '5' ,'8' ,'9']:
291            assert id in polygons.keys()
292            assert id in values.keys()           
293
294            assert int(values[id]) == int(floors[id])
295            assert len(polygons[id]) == len(known_polys[id])
296            assert num.allclose(polygons[id], known_polys[id])
297
298
299    def test_csv2polygons_with_clipping(self):
300        """test_csv2polygons with optional clipping
301        """
302        #FIXME(Ole): Not Done!!
303       
304        path = get_pathname_from_package('anuga.shallow_water')               
305        testfile = os.path.join(path, 'polygon_values_example.csv')               
306
307        polygons, values = load_csv_as_polygons(testfile, 
308                                        value_name='floors',
309                                        clipping_polygons=None)
310
311        assert len(polygons) == 7, 'Must have seven polygons'
312        assert len(values) == 7, 'Must have seven values'
313           
314        # Known floor values
315        floors = {'1': 2, '2': 0, '3': 1, '4': 2, '5': 0, '8': 1, '9': 1}
316       
317        # Known polygon values
318        known_polys = {'1': [[422681.61,871117.55],
319                             [422691.02,871117.60],
320                             [422690.87,871084.23],
321                             [422649.36,871081.85],
322                             [422649.36,871080.39],
323                             [422631.86,871079.50],
324                             [422631.72,871086.75],
325                             [422636.75,871087.20],
326                             [422636.75,871091.50],
327                             [422649.66,871092.09],
328                             [422649.83,871084.91],
329                             [422652.94,871084.90],
330                             [422652.84,871092.39],
331                             [422681.83,871093.73],
332                             [422681.61,871117.55]],
333                       '2': [[422664.22,870785.46],
334                             [422672.48,870780.14],
335                             [422668.17,870772.62],
336                             [422660.35,870777.17],
337                             [422664.22,870785.46]],
338                       '3': [[422661.30,871215.06],
339                             [422667.50,871215.70],
340                             [422668.30,871204.86],
341                             [422662.21,871204.33],
342                             [422661.30,871215.06]],
343                       '4': [[422473.44,871191.22],
344                             [422478.33,871192.26],
345                             [422479.52,871186.03],
346                             [422474.78,871185.14],
347                             [422473.44,871191.22]],
348                       '5': [[422369.69,871049.29],
349                             [422378.63,871053.58],
350                             [422383.91,871044.51],
351                             [422374.97,871040.32],
352                             [422369.69,871049.29]],
353                       '8': [[422730.56,871203.13],
354                             [422734.10,871204.90],
355                             [422735.26,871202.18],
356                             [422731.87,871200.58],
357                             [422730.56,871203.13]],
358                       '9': [[422659.85,871213.80],
359                             [422660.91,871210.97],
360                             [422655.42,871208.85],
361                             [422654.36,871211.68],
362                             [422659.85,871213.80]]
363                       }       
364       
365
366       
367               
368        for id in ['1', '2', '3', '4', '5' ,'8' ,'9']:
369            assert id in polygons.keys()
370            assert id in values.keys()           
371
372            assert int(values[id]) == int(floors[id])
373            assert len(polygons[id]) == len(known_polys[id])
374            assert num.allclose(polygons[id], known_polys[id])
375
376
377
378
379   
380    def test_csv2building_polygons(self):
381        """test_csv2building_polygons
382        """
383       
384        path = get_pathname_from_package('anuga.shallow_water')               
385        testfile = os.path.join(path, 'polygon_values_example.csv')               
386
387        polygons, values = load_csv_as_building_polygons(testfile, 
388                                                 floor_height=3)
389
390        assert len(polygons) == 7, 'Must have seven polygons'
391        assert len(values) == 7, 'Must have seven values'
392           
393        # Known floor values
394        floors = {'1': 6, '2': 0, '3': 3, '4': 6, '5': 0, '8': 3, '9': 3}
395       
396               
397        for id in ['1', '2', '3', '4', '5' ,'8' ,'9']:
398            assert id in polygons.keys()
399            assert id in values.keys()           
400
401            assert float(values[id]) == float(floors[id])
402
403
404
405#################################################################################
406
407if __name__ == "__main__":
408    suite = unittest.makeSuite(Test_csv, 'test')
409    runner = unittest.TextTestRunner(verbosity=1)
410    runner.run(suite)
Note: See TracBrowser for help on using the repository browser.