Added further tests for test_inn_to_gasthausbox_none.
[philipp/winterrodeln/wrpylib.git] / tests / test_wrmwmarkup.py
1 #!/usr/bin/python3.4
2 import collections
3 import textwrap
4 import unittest
5 import mwparserfromhell
6 import wrpylib.wrvalidators
7 import wrpylib.wrmwmarkup
8 from wrpylib.wrvalidators import LonLat
9 from wrpylib.wrmwmarkup import sledrun_from_rodelbahnbox, sledrun_to_rodelbahnbox, \
10     inn_from_gasthausbox, inn_to_gasthausbox, lonlat_ele_from_template, latlon_ele_to_template
11
12
13 class TestSledrun(unittest.TestCase):
14     def test_sledrun_from_rodelbahnbox(self):
15         class Sledrun:
16             pass
17         rodelbahnbox = collections.OrderedDict([
18             ('Position', LonLat(9.986508, 47.30982)),
19             ('Position oben', LonLat(None, None)),
20             ('Höhe oben', 1244),
21             ('Position unten', LonLat(8.506047, 46.20210)),
22             ('Höhe unten', None),
23             ('Länge', 5045),
24             ('Schwierigkeit', 3),
25             ('Lawinen', 2),
26             ('Betreiber', 'SchneeFunFit'),
27             ('Öffentliche Anreise', 2),
28             ('Aufstieg möglich', True),
29             ('Aufstieg getrennt', (0.0, None)),
30             ('Gehzeit', 105),
31             ('Aufstiegshilfe', [('Sessellift', 'gratis'), ('Bus', None)]),
32             ('Beleuchtungsanlage', (0.0, 'in Planung für 2020')),
33             ('Beleuchtungstage', (None, None)),
34             ('Rodelverleih', []),
35             ('Gütesiegel', []),
36             ('Webauskunft', (True, 'http://example.com/schneelage')),
37             ('Telefonauskunft', [('+43-664-1808482', 'Bergkristallhütte')]),
38             ('Bild', 'Rodelbahn Bergkristallhütte 2009-03-03.jpg'),
39             ('In Übersichtskarte', True),
40             ('Forumid', 72)])
41         sledrun = Sledrun()
42         sledrun_from_rodelbahnbox(rodelbahnbox, sledrun)
43         self.assertEqual(47.30982, sledrun.position_latitude)
44         self.assertEqual(9.986508, sledrun.position_longitude)
45         self.assertEqual(None, sledrun.top_latitude)
46         self.assertEqual(None, sledrun.top_longitude)
47         self.assertEqual(1244, sledrun.top_elevation)
48         self.assertEqual(46.20210, sledrun.bottom_latitude)
49         self.assertEqual(8.506047, sledrun.bottom_longitude)
50         self.assertEqual(None, sledrun.bottom_elevation)
51         self.assertEqual(5045, sledrun.length)
52         self.assertEqual(3, sledrun.difficulty)
53         self.assertEqual(2, sledrun.avalanches)
54         self.assertEqual('SchneeFunFit', sledrun.operator)
55         self.assertEqual(2, sledrun.public_transport)
56         self.assertEqual(True, sledrun.walkup_possible)
57         self.assertEqual(105, sledrun.walkup_time)
58         self.assertEqual(0.0, sledrun.walkup_separate)
59         self.assertEqual(None, sledrun.walkup_separate_comment)
60         self.assertEqual(True, sledrun.lift)
61         self.assertEqual('Sessellift (gratis); Bus', sledrun.lift_details)
62         self.assertEqual(0.0, sledrun.night_light)
63         self.assertEqual('in Planung für 2020', sledrun.night_light_comment)
64         self.assertEqual(None, sledrun.night_light_days)
65         self.assertEqual(None, sledrun.night_light_days_comment)
66         self.assertEqual(False, sledrun.sled_rental)
67         self.assertEqual('Nein', sledrun.sled_rental_comment)
68         self.assertEqual('Nein', sledrun.cachet)
69         self.assertEqual('http://example.com/schneelage', sledrun.information_web)
70         self.assertEqual('+43-664-1808482 (Bergkristallhütte)', sledrun.information_phone)
71         self.assertEqual('Rodelbahn Bergkristallhütte 2009-03-03.jpg', sledrun.image)
72         self.assertEqual(True, sledrun.show_in_overview)
73         self.assertEqual(72, sledrun.forum_id)
74
75     def test_sledrun_to_rodelbahnbox(self):
76         class Sledrun:
77             pass
78         sledrun = Sledrun()
79         sledrun.position_longitude = 13.5
80         sledrun.position_latitude = 50.7
81         sledrun.top_longitude = 12.2
82         sledrun.top_latitude = 49.8
83         sledrun.top_elevation = 3456
84         sledrun.bottom_longitude = 9.89
85         sledrun.bottom_latitude = 51.2
86         sledrun.bottom_elevation = 2075
87         sledrun.length = 9644
88         sledrun.difficulty = 3
89         sledrun.avalanches = 2
90         sledrun.operator = 'McRodel'
91         sledrun.public_transport = 3
92         sledrun.walkup_possible = True
93         sledrun.walkup_time = 77
94         sledrun.walkup_separate = 0.5
95         sledrun.walkup_separate_comment = 'Nur unterer Teil'
96         sledrun.lift = True
97         sledrun.lift_details = 'Sessellift'
98         sledrun.night_light = 1.0
99         sledrun.night_light_comment = 'Schlecht beleuchtet'
100         sledrun.night_light_days = 6
101         sledrun.night_light_days_comment = 'Mo-Sa'
102         sledrun.sled_rental = True
103         sledrun.sled_rental_comment = 'In der Hütte'
104         sledrun.cachet = 'Tiroler Rodelbahngütesielgel mittelschwer 2010'
105         sledrun.information_web = 'http://example.com'
106         sledrun.information_phone = '+4364412345678'
107         sledrun.image = 'Sicht_von_unten.jpg'
108         sledrun.show_in_overview = True
109         sledrun.forum_id = 65
110         rodelbahnbox = sledrun_to_rodelbahnbox(sledrun)
111         self.assertEqual(rodelbahnbox['Position'], LonLat(lon=13.5, lat=50.7))
112         self.assertEqual(rodelbahnbox['Position oben'], LonLat(12.2, 49.8))
113         self.assertEqual(rodelbahnbox['Höhe oben'], 3456)
114         self.assertEqual(rodelbahnbox['Position unten'], LonLat(9.89, 51.2))
115         self.assertEqual(rodelbahnbox['Höhe unten'], 2075)
116         self.assertEqual(rodelbahnbox['Länge'], 9644)
117         self.assertEqual(rodelbahnbox['Schwierigkeit'], 3)
118         self.assertEqual(rodelbahnbox['Lawinen'], 2)
119         self.assertEqual(rodelbahnbox['Betreiber'], 'McRodel')
120         self.assertEqual(rodelbahnbox['Öffentliche Anreise'], 3)
121         self.assertEqual(rodelbahnbox['Aufstieg möglich'], True)
122         self.assertEqual(rodelbahnbox['Aufstieg getrennt'], (0.5, 'Nur unterer Teil'))
123         self.assertEqual(rodelbahnbox['Gehzeit'], 77)
124         self.assertEqual(rodelbahnbox['Aufstiegshilfe'], [('Sessellift', None)])
125         self.assertEqual(rodelbahnbox['Beleuchtungsanlage'], (1.0, 'Schlecht beleuchtet'))
126         self.assertEqual(rodelbahnbox['Beleuchtungstage'], (6, 'Mo-Sa'))
127         self.assertEqual(rodelbahnbox['Rodelverleih'], (True, 'In der Hütte'))
128         self.assertEqual(rodelbahnbox['Gütesiegel'], 'Tiroler Rodelbahngütesielgel mittelschwer 2010')
129         self.assertEqual(rodelbahnbox['Webauskunft'], 'http://example.com')
130         self.assertEqual(rodelbahnbox['Bild'], 'Sicht_von_unten.jpg')
131         self.assertEqual(rodelbahnbox['In Übersichtskarte'], True)
132         self.assertEqual(rodelbahnbox['Forumid'], 65)
133
134
135 class TestInn(unittest.TestCase):
136     def test_inn_from_gasthausbox(self):
137         class Inn:
138             pass
139         gasthausbox = collections.OrderedDict()
140         gasthausbox['Position'] = LonLat(11.015883, 9.876000)
141         gasthausbox['Höhe'] = 2145
142         gasthausbox['Betreiber'] = 'Max Mustermann'
143         gasthausbox['Sitzplätze'] = 30
144         gasthausbox['Übernachtung'] = (False, None)
145         gasthausbox['Rauchfrei'] = 0.5
146         gasthausbox['Rodelverleih'] = (True, '6 Euro')
147         gasthausbox['Handyempfang'] = []
148         gasthausbox['Homepage'] = (True, 'http://www.graf-ferdinand.at/')
149         gasthausbox['E-Mail'] = [(('max.mustermann@graf-ferdinand.at', False), None)]
150         gasthausbox['Telefon'] = [('+43-5039-21666', None), ('+43-686-4134880', 'Sommer')]
151         gasthausbox['Bild'] = 'Gasthaus_Graf_Ferdinand_Haus_01.jpg'
152         gasthausbox['Rodelbahnen'] = ['[[Finstertaler Speicher]]']
153         inn = Inn()
154         inn_from_gasthausbox(gasthausbox, inn)
155         self.assertEqual(inn.position_latitude, 9.876000)
156         self.assertEqual(inn.position_longitude, 11.015883)
157         self.assertEqual(inn.position_elevation, 2145)
158         self.assertEqual(inn.operator, 'Max Mustermann')
159         self.assertEqual(inn.seats, 30)
160         self.assertEqual(inn.overnight, False)
161         self.assertEqual(inn.overnight_comment, None)
162         self.assertEqual(inn.smoker_area, True)
163         self.assertEqual(inn.nonsmoker_area, True)
164         self.assertEqual(inn.sled_rental, True)
165         self.assertEqual(inn.sled_rental_comment, '6 Euro')
166         self.assertEqual(inn.mobile_provider, 'Nein')
167         self.assertEqual(inn.homepage, 'http://www.graf-ferdinand.at/')
168         self.assertEqual(inn.email_list, 'max.mustermann@graf-ferdinand.at')
169         self.assertEqual(inn.phone_list, '+43-5039-21666; +43-686-4134880 (Sommer)')
170         self.assertEqual(inn.image, 'Gasthaus_Graf_Ferdinand_Haus_01.jpg')
171         self.assertEqual(inn.sledding_list, '[[Finstertaler Speicher]]')
172
173
174     def test_inn_to_gasthausbox(self):
175         class Inn:
176             pass
177         inn = Inn()
178         inn.position_latitude = 9.876000
179         inn.position_longitude = 11.015883
180         inn.position_elevation = 2145
181         inn.operator = 'Max Mustermann'
182         inn.seats = 30
183         inn.overnight = False
184         inn.overnight_comment = None
185         inn.smoker_area = True
186         inn.nonsmoker_area = True
187         inn.sled_rental = True
188         inn.sled_rental_comment = '6 Euro'
189         inn.mobile_provider = 'Nein'
190         inn.homepage = 'http://www.graf-ferdinand.at/'
191         inn.email_list = 'max.mustermann@graf-ferdinand.at'
192         inn.phone_list = '+43-5039-21666; +43-686-4134880 (Sommer)'
193         inn.image = 'Gasthaus_Graf_Ferdinand_Haus_01.jpg'
194         inn.sledding_list = '[[Finstertaler Speicher]]'
195         gasthausbox = inn_to_gasthausbox(inn)
196         self.assertEqual(gasthausbox['Position'], LonLat(11.015883, 9.876000))
197         self.assertEqual(gasthausbox['Höhe'], 2145)
198         self.assertEqual(gasthausbox['Betreiber'], 'Max Mustermann')
199         self.assertEqual(gasthausbox['Sitzplätze'], 30)
200         self.assertEqual(gasthausbox['Übernachtung'], (False, None))
201         self.assertEqual(gasthausbox['Rauchfrei'], 0.5)
202         self.assertEqual(gasthausbox['Rodelverleih'], (True, '6 Euro'))
203         self.assertEqual(gasthausbox['Handyempfang'], [])
204         self.assertEqual(gasthausbox['Homepage'], (True, 'http://www.graf-ferdinand.at/'))
205         self.assertEqual(gasthausbox['E-Mail'], [(('max.mustermann@graf-ferdinand.at', False), None)])
206         self.assertEqual(gasthausbox['Telefon'], [('+43-5039-21666', None), ('+43-686-4134880', 'Sommer')])
207         self.assertEqual(gasthausbox['Bild'], 'Gasthaus_Graf_Ferdinand_Haus_01.jpg')
208         self.assertEqual(gasthausbox['Rodelbahnen'], ['[[Finstertaler Speicher]]'])
209
210     def test_inn_from_gasthausbox_none(self):
211         class Inn:
212             pass
213         gasthausbox = collections.OrderedDict()
214         gasthausbox['Position'] = LonLat(None, None)
215         gasthausbox['Höhe'] = None
216         gasthausbox['Betreiber'] = None
217         gasthausbox['Sitzplätze'] = None
218         gasthausbox['Übernachtung'] = (None, None)
219         gasthausbox['Rauchfrei'] = None
220         gasthausbox['Rodelverleih'] = (None, None)
221         gasthausbox['Handyempfang'] = None
222         gasthausbox['Homepage'] = (None, None)
223         gasthausbox['E-Mail'] = None
224         gasthausbox['Telefon'] = None
225         gasthausbox['Bild'] = None
226         gasthausbox['Rodelbahnen'] = None
227         inn = Inn()
228         inn_from_gasthausbox(gasthausbox, inn)
229         self.assertEqual(inn.position_latitude, None)
230         self.assertEqual(inn.position_longitude, None)
231         self.assertEqual(inn.position_elevation, None)
232         self.assertEqual(inn.operator, None)
233         self.assertEqual(inn.seats, None)
234         self.assertEqual(inn.overnight, None)
235         self.assertEqual(inn.overnight_comment, None)
236         self.assertEqual(inn.smoker_area, None)
237         self.assertEqual(inn.nonsmoker_area, None)
238         self.assertEqual(inn.sled_rental, None)
239         self.assertEqual(inn.sled_rental_comment, None)
240         self.assertEqual(inn.mobile_provider, None)
241         self.assertEqual(inn.homepage, None)
242         self.assertEqual(inn.email_list, None)
243         self.assertEqual(inn.phone_list, None)
244         self.assertEqual(inn.image, None)
245         self.assertEqual(inn.sledding_list, None)
246
247     def test_inn_to_gasthausbox_none(self):
248         class Inn:
249             pass
250         inn = Inn()
251         inn.position_latitude = None
252         inn.position_longitude = None
253         inn.position_elevation = None
254         inn.operator = None
255         inn.seats = None
256         inn.overnight = None
257         inn.overnight_comment = None
258         inn.smoker_area = None
259         inn.nonsmoker_area = None
260         inn.sled_rental = None
261         inn.sled_rental_comment = None
262         inn.mobile_provider = None
263         inn.homepage = None
264         inn.email_list = None
265         inn.phone_list = None
266         inn.image = None
267         inn.sledding_list = None
268         gasthausbox = inn_to_gasthausbox(inn)
269         self.assertEqual(gasthausbox['Position'], LonLat(None, None))
270         self.assertEqual(gasthausbox['Höhe'], None)
271         self.assertEqual(gasthausbox['Betreiber'], None)
272         self.assertEqual(gasthausbox['Sitzplätze'], None)
273         self.assertEqual(gasthausbox['Übernachtung'], (None, None))
274         self.assertEqual(gasthausbox['Rauchfrei'], None)
275         self.assertEqual(gasthausbox['Rodelverleih'], (None, None))
276         self.assertEqual(gasthausbox['Handyempfang'], None)
277         self.assertEqual(gasthausbox['Homepage'], (None, None))
278         self.assertEqual(gasthausbox['E-Mail'], None)
279         self.assertEqual(gasthausbox['Telefon'], None)
280         self.assertEqual(gasthausbox['Bild'], None)
281         self.assertEqual(gasthausbox['Rodelbahnen'], None)
282
283
284 class TestLonlatEle(unittest.TestCase):
285     def test_lonlat_ele_from_template(self):
286         template = mwparserfromhell.parse('{{Position oben|46.942239 N 11.468819 E|1866}}').filter_templates()[0]
287         lonlat, ele = lonlat_ele_from_template(template)
288         self.assertEqual(LonLat(11.468819, 46.942239), lonlat)
289         self.assertEqual(1866, ele)
290
291     def test_latlon_ele_to_template(self):
292         template = latlon_ele_to_template((LonLat(11.468819, 46.942239), 1866), 'Position oben')
293         self.assertEqual('{{Position oben|46.942239 N 11.468819 E|1866}}', template)
294
295
296 class TestWrMap(unittest.TestCase):
297     def test_parse_wrmap(self):
298         wikitext = '''
299         <wrmap lat="47.2417134" lon="11.21408895" zoom="14" width="700" height="400">
300         <gasthaus name="Rosskogelhütte" wiki="Rosskogelhütte">47.240689 11.190454</gasthaus>
301         <parkplatz>47.245789 11.238971</parkplatz>
302         <haltestelle name="Oberperfuss Rangger Köpfl Lift">47.245711 11.238283</haltestelle>
303         <rodelbahn>
304             47.238587 11.203360
305             47.244951 11.230868
306             47.245470 11.237853
307         </rodelbahn>
308         </wrmap>
309         '''
310         json = wrpylib.wrmwmarkup.parse_wrmap(wikitext)
311         assert json['properties']['lon'] == 11.21408895
312         assert json['properties']['lat'] == 47.2417134
313         assert json['properties']['zoom'] == 14
314         assert json['properties']['width'] == 700
315         assert json['properties']['height'] == 400
316         assert json['features'][0]['properties']['type'] == 'gasthaus'
317         assert json['features'][0]['properties']['name'] == 'Rosskogelhütte'
318         assert json['features'][0]['properties']['wiki'] == 'Rosskogelhütte'
319         assert json['features'][0]['geometry']['coordinates'] == [11.190454, 47.240689]
320         assert json['features'][1]['properties']['type'] == 'parkplatz'
321         assert json['features'][1]['geometry']['coordinates'] == [11.238971, 47.245789]
322         assert json['features'][2]['properties']['type'] == 'haltestelle'
323         assert json['features'][2]['properties']['name'] == 'Oberperfuss Rangger Köpfl Lift'
324         assert json['features'][2]['geometry']['coordinates'] == [11.238283, 47.245711]
325         assert json['features'][3]['properties']['type'] == 'rodelbahn'
326         assert json['features'][3]['geometry']['coordinates'] == [
327             [11.203360, 47.238587],
328             [11.230868, 47.244951],
329             [11.237853, 47.245470]]
330
331     def test_create_wrmap(self):
332         geojson = {
333             'type': 'FeatureCollection',
334             'features':
335                 [{
336                     'type': 'Feature',
337                     'geometry': {
338                         'type': 'Point',
339                         'coordinates': [11.190454, 47.240689]},
340                     'properties': {'type': 'gasthaus', 'name': 'Rosskogelhütte', 'wiki': 'Rosskogelhütte'}
341                 }, {
342                     'type': 'Feature',
343                     'geometry': {
344                         'type': 'Point',
345                         'coordinates': [11.238971, 47.245789]},
346                     'properties': {'type': 'parkplatz'}
347                 }, {
348                     'type': 'Feature',
349                     'geometry': {
350                         'type': 'Point',
351                         'coordinates': [11.238283, 47.245711]},
352                     'properties': {'type': 'haltestelle', 'name': 'Oberperfuss Rangger Köpfl Lift'}
353                 }, {
354                     'type': 'Feature',
355                     'geometry': {
356                         'type': 'LineString',
357                         'coordinates': [
358                             [11.203360, 47.238587],
359                             [11.230868, 47.244951],
360                             [11.237853, 47.245470]]},
361                     'properties': {'type': 'rodelbahn'}
362                 }],
363             'properties': {
364                 'lon': 11.21408895,
365                 'lat': 47.2417134,
366                 'zoom': 14,
367                 'width': 700,
368                 'height': 400}
369         }
370
371         wikitext = wrpylib.wrmwmarkup.create_wrmap(geojson)
372         assert wikitext == textwrap.dedent('''\
373         <wrmap height="400" lat="47.241713" lon="11.214089" width="700" zoom="14">
374
375         <gasthaus name="Rosskogelhütte" wiki="Rosskogelhütte">47.240689 N 11.190454 E</gasthaus>
376         <parkplatz>47.245789 N 11.238971 E</parkplatz>
377         <haltestelle name="Oberperfuss Rangger Köpfl Lift">47.245711 N 11.238283 E</haltestelle>
378
379         <rodelbahn>
380         47.238587 N 11.203360 E
381         47.244951 N 11.230868 E
382         47.245470 N 11.237853 E
383         </rodelbahn>
384
385         </wrmap>''')