Fixed conversion errors in inn_to_gasthausbox.
[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     def test_inn_to_gasthausbox(self):
174         class Inn:
175             pass
176         inn = Inn()
177         inn.position_latitude = 9.876000
178         inn.position_longitude = 11.015883
179         inn.position_elevation = 2145
180         inn.operator = 'Max Mustermann'
181         inn.seats = 30
182         inn.overnight = False
183         inn.overnight_comment = None
184         inn.smoker_area = True
185         inn.nonsmoker_area = True
186         inn.sled_rental = True
187         inn.sled_rental_comment = '6 Euro'
188         inn.mobile_provider = 'Nein'
189         inn.homepage = 'http://www.graf-ferdinand.at/'
190         inn.email_list = 'max.mustermann@graf-ferdinand.at'
191         inn.phone_list = '+43-5039-21666; +43-686-4134880 (Sommer)'
192         inn.image = 'Gasthaus_Graf_Ferdinand_Haus_01.jpg'
193         inn.sledding_list = '[[Finstertaler Speicher]]'
194         gasthausbox = inn_to_gasthausbox(inn)
195         self.assertEqual(gasthausbox['Position'], LonLat(11.015883, 9.876000))
196         self.assertEqual(gasthausbox['Höhe'], 2145)
197         self.assertEqual(gasthausbox['Betreiber'], 'Max Mustermann')
198         self.assertEqual(gasthausbox['Sitzplätze'], 30)
199         self.assertEqual(gasthausbox['Übernachtung'], (False, None))
200         self.assertEqual(gasthausbox['Rauchfrei'], 0.5)
201         self.assertEqual(gasthausbox['Rodelverleih'], (True, '6 Euro'))
202         self.assertEqual(gasthausbox['Handyempfang'], [])
203         self.assertEqual(gasthausbox['Homepage'], (True, 'http://www.graf-ferdinand.at/'))
204         self.assertEqual(gasthausbox['E-Mail'], [(('max.mustermann@graf-ferdinand.at', False), None)])
205         self.assertEqual(gasthausbox['Telefon'], [('+43-5039-21666', None), ('+43-686-4134880', 'Sommer')])
206         self.assertEqual(gasthausbox['Bild'], 'Gasthaus_Graf_Ferdinand_Haus_01.jpg')
207         self.assertEqual(gasthausbox['Rodelbahnen'], ['[[Finstertaler Speicher]]'])
208
209     def test_inn_from_gasthausbox_none(self):
210         class Inn:
211             pass
212         gasthausbox = collections.OrderedDict()
213         gasthausbox['Position'] = LonLat(None, None)
214         gasthausbox['Höhe'] = None
215         gasthausbox['Betreiber'] = None
216         gasthausbox['Sitzplätze'] = None
217         gasthausbox['Übernachtung'] = (None, None)
218         gasthausbox['Rauchfrei'] = None
219         gasthausbox['Rodelverleih'] = (None, None)
220         gasthausbox['Handyempfang'] = None
221         gasthausbox['Homepage'] = (None, None)
222         gasthausbox['E-Mail'] = None
223         gasthausbox['Telefon'] = None
224         gasthausbox['Bild'] = None
225         gasthausbox['Rodelbahnen'] = None
226         inn = Inn()
227         inn_from_gasthausbox(gasthausbox, inn)
228         self.assertEqual(inn.position_latitude, None)
229         self.assertEqual(inn.position_longitude, None)
230         self.assertEqual(inn.position_elevation, None)
231         self.assertEqual(inn.operator, None)
232         self.assertEqual(inn.seats, None)
233         self.assertEqual(inn.overnight, None)
234         self.assertEqual(inn.overnight_comment, None)
235         self.assertEqual(inn.smoker_area, None)
236         self.assertEqual(inn.nonsmoker_area, None)
237         self.assertEqual(inn.sled_rental, None)
238         self.assertEqual(inn.sled_rental_comment, None)
239         self.assertEqual(inn.mobile_provider, None)
240         self.assertEqual(inn.homepage, None)
241         self.assertEqual(inn.email_list, None)
242         self.assertEqual(inn.phone_list, None)
243         self.assertEqual(inn.image, None)
244         self.assertEqual(inn.sledding_list, None)
245
246     def test_inn_to_gasthausbox_none(self):
247         class Inn:
248             pass
249         inn = Inn()
250         inn.position_latitude = None
251         inn.position_longitude = None
252         inn.position_elevation = None
253         inn.operator = None
254         inn.seats = None
255         inn.overnight = None
256         inn.overnight_comment = None
257         inn.smoker_area = None
258         inn.nonsmoker_area = None
259         inn.sled_rental = None
260         inn.sled_rental_comment = None
261         inn.mobile_provider = None
262         inn.homepage = None
263         inn.email_list = None
264         inn.phone_list = None
265         inn.image = None
266         inn.sledding_list = None
267         gasthausbox = inn_to_gasthausbox(inn)
268         self.assertEqual(gasthausbox['Position'], LonLat(None, None))
269         self.assertEqual(gasthausbox['Höhe'], None)
270         self.assertEqual(gasthausbox['Betreiber'], None)
271         self.assertEqual(gasthausbox['Sitzplätze'], None)
272         self.assertEqual(gasthausbox['Übernachtung'], (None, None))
273         self.assertEqual(gasthausbox['Rauchfrei'], None)
274         self.assertEqual(gasthausbox['Rodelverleih'], (None, None))
275         self.assertEqual(gasthausbox['Handyempfang'], None)
276         self.assertEqual(gasthausbox['Homepage'], (None, None))
277         self.assertEqual(gasthausbox['E-Mail'], None)
278         self.assertEqual(gasthausbox['Telefon'], None)
279         self.assertEqual(gasthausbox['Bild'], None)
280         self.assertEqual(gasthausbox['Rodelbahnen'], None)
281
282
283 class TestLonlatEle(unittest.TestCase):
284     def test_lonlat_ele_from_template(self):
285         template = mwparserfromhell.parse('{{Position oben|46.942239 N 11.468819 E|1866}}').filter_templates()[0]
286         lonlat, ele = lonlat_ele_from_template(template)
287         self.assertEqual(LonLat(11.468819, 46.942239), lonlat)
288         self.assertEqual(1866, ele)
289
290     def test_latlon_ele_to_template(self):
291         template = latlon_ele_to_template((LonLat(11.468819, 46.942239), 1866), 'Position oben')
292         self.assertEqual('{{Position oben|46.942239 N 11.468819 E|1866}}', template)
293
294
295 class TestWrMap(unittest.TestCase):
296     def test_parse_wrmap(self):
297         wikitext = '''
298         <wrmap lat="47.2417134" lon="11.21408895" zoom="14" width="700" height="400">
299         <gasthaus name="Rosskogelhütte" wiki="Rosskogelhütte">47.240689 11.190454</gasthaus>
300         <parkplatz>47.245789 11.238971</parkplatz>
301         <haltestelle name="Oberperfuss Rangger Köpfl Lift">47.245711 11.238283</haltestelle>
302         <rodelbahn>
303             47.238587 11.203360
304             47.244951 11.230868
305             47.245470 11.237853
306         </rodelbahn>
307         </wrmap>
308         '''
309         json = wrpylib.wrmwmarkup.parse_wrmap(wikitext)
310         assert json['properties']['lon'] == 11.21408895
311         assert json['properties']['lat'] == 47.2417134
312         assert json['properties']['zoom'] == 14
313         assert json['properties']['width'] == 700
314         assert json['properties']['height'] == 400
315         assert json['features'][0]['properties']['type'] == 'gasthaus'
316         assert json['features'][0]['properties']['name'] == 'Rosskogelhütte'
317         assert json['features'][0]['properties']['wiki'] == 'Rosskogelhütte'
318         assert json['features'][0]['geometry']['coordinates'] == [11.190454, 47.240689]
319         assert json['features'][1]['properties']['type'] == 'parkplatz'
320         assert json['features'][1]['geometry']['coordinates'] == [11.238971, 47.245789]
321         assert json['features'][2]['properties']['type'] == 'haltestelle'
322         assert json['features'][2]['properties']['name'] == 'Oberperfuss Rangger Köpfl Lift'
323         assert json['features'][2]['geometry']['coordinates'] == [11.238283, 47.245711]
324         assert json['features'][3]['properties']['type'] == 'rodelbahn'
325         assert json['features'][3]['geometry']['coordinates'] == [
326             [11.203360, 47.238587],
327             [11.230868, 47.244951],
328             [11.237853, 47.245470]]
329
330     def test_create_wrmap(self):
331         geojson = {
332             'type': 'FeatureCollection',
333             'features':
334                 [{
335                     'type': 'Feature',
336                     'geometry': {
337                         'type': 'Point',
338                         'coordinates': [11.190454, 47.240689]},
339                     'properties': {'type': 'gasthaus', 'name': 'Rosskogelhütte', 'wiki': 'Rosskogelhütte'}
340                 }, {
341                     'type': 'Feature',
342                     'geometry': {
343                         'type': 'Point',
344                         'coordinates': [11.238971, 47.245789]},
345                     'properties': {'type': 'parkplatz'}
346                 }, {
347                     'type': 'Feature',
348                     'geometry': {
349                         'type': 'Point',
350                         'coordinates': [11.238283, 47.245711]},
351                     'properties': {'type': 'haltestelle', 'name': 'Oberperfuss Rangger Köpfl Lift'}
352                 }, {
353                     'type': 'Feature',
354                     'geometry': {
355                         'type': 'LineString',
356                         'coordinates': [
357                             [11.203360, 47.238587],
358                             [11.230868, 47.244951],
359                             [11.237853, 47.245470]]},
360                     'properties': {'type': 'rodelbahn'}
361                 }],
362             'properties': {
363                 'lon': 11.21408895,
364                 'lat': 47.2417134,
365                 'zoom': 14,
366                 'width': 700,
367                 'height': 400}
368         }
369
370         wikitext = wrpylib.wrmwmarkup.create_wrmap(geojson)
371         assert wikitext == textwrap.dedent('''\
372         <wrmap height="400" lat="47.241713" lon="11.214089" width="700" zoom="14">
373
374         <gasthaus name="Rosskogelhütte" wiki="Rosskogelhütte">47.240689 N 11.190454 E</gasthaus>
375         <parkplatz>47.245789 N 11.238971 E</parkplatz>
376         <haltestelle name="Oberperfuss Rangger Köpfl Lift">47.245711 N 11.238283 E</haltestelle>
377
378         <rodelbahn>
379         47.238587 N 11.203360 E
380         47.244951 N 11.230868 E
381         47.245470 N 11.237853 E
382         </rodelbahn>
383
384         </wrmap>''')