Changed file encoding for setup.py to UTF-8.
[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.mwmarkup
7 from wrpylib.wrmwmarkup import *
8
9
10 class TestSledrun(unittest.TestCase):
11     def test_sledrun_from_rodelbahnbox(self):
12         class Sledrun:
13             pass
14         rodelbahnbox = collections.OrderedDict([
15             ('Position', LonLat(9.986508, 47.30982)),
16             ('Position oben', LonLat(None, None)),
17             ('Höhe oben', 1244),
18             ('Position unten', LonLat(8.506047, 46.20210)),
19             ('Höhe unten', None),
20             ('Länge', 5045),
21             ('Schwierigkeit', 3),
22             ('Lawinen', 2),
23             ('Betreiber', 'SchneeFunFit'),
24             ('Öffentliche Anreise', 2),
25             ('Aufstieg möglich', True),
26             ('Aufstieg getrennt', (0.0, None)),
27             ('Gehzeit', 105),
28             ('Aufstiegshilfe', [('Sessellift', 'gratis'), ('Bus', None)]),
29             ('Beleuchtungsanlage', (0.0, 'in Planung für 2020')),
30             ('Beleuchtungstage', (None, None)),
31             ('Rodelverleih', []),
32             ('Gütesiegel', []),
33             ('Webauskunft', (True, 'http://example.com/schneelage')),
34             ('Telefonauskunft', [('+43-664-1808482', 'Bergkristallhütte')]),
35             ('Bild', 'Rodelbahn Bergkristallhütte 2009-03-03.jpg'),
36             ('In Übersichtskarte', True),
37             ('Forumid', 72)])
38         sledrun = Sledrun()
39         sledrun_from_rodelbahnbox(rodelbahnbox, sledrun)
40         self.assertEqual(47.30982, sledrun.position_latitude)
41         self.assertEqual(9.986508, sledrun.position_longitude)
42         self.assertEqual(None, sledrun.top_latitude)
43         self.assertEqual(None, sledrun.top_longitude)
44         self.assertEqual(1244, sledrun.top_elevation)
45         self.assertEqual(46.20210, sledrun.bottom_latitude)
46         self.assertEqual(8.506047, sledrun.bottom_longitude)
47         self.assertEqual(None, sledrun.bottom_elevation)
48         self.assertEqual(5045, sledrun.length)
49         self.assertEqual(3, sledrun.difficulty)
50         self.assertEqual(2, sledrun.avalanches)
51         self.assertEqual('SchneeFunFit', sledrun.operator)
52         self.assertEqual(2, sledrun.public_transport)
53         self.assertEqual(True, sledrun.walkup_possible)
54         self.assertEqual(105, sledrun.walkup_time)
55         self.assertEqual(0.0, sledrun.walkup_separate)
56         self.assertEqual(None, sledrun.walkup_separate_comment)
57         self.assertEqual(True, sledrun.lift)
58         self.assertEqual('Sessellift (gratis); Bus', sledrun.lift_details)
59         self.assertEqual(0.0, sledrun.night_light)
60         self.assertEqual('in Planung für 2020', sledrun.night_light_comment)
61         self.assertEqual(None, sledrun.night_light_days)
62         self.assertEqual(None, sledrun.night_light_days_comment)
63         self.assertEqual(False, sledrun.sled_rental)
64         self.assertEqual('Nein', sledrun.sled_rental_comment)
65         self.assertEqual('Nein', sledrun.cachet)
66         self.assertEqual('http://example.com/schneelage', sledrun.information_web)
67         self.assertEqual('+43-664-1808482 (Bergkristallhütte)', sledrun.information_phone)
68         self.assertEqual('Rodelbahn Bergkristallhütte 2009-03-03.jpg', sledrun.image)
69         self.assertEqual(True, sledrun.show_in_overview)
70         self.assertEqual(72, sledrun.forum_id)
71
72     def test_sledrun_to_rodelbahnbox(self):
73         class Sledrun:
74             pass
75         sledrun = Sledrun()
76         sledrun.position_longitude = 13.5
77         sledrun.position_latitude = 50.7
78         sledrun.top_longitude = 12.2
79         sledrun.top_latitude = 49.8
80         sledrun.top_elevation = 3456
81         sledrun.bottom_longitude = 9.89
82         sledrun.bottom_latitude = 51.2
83         sledrun.bottom_elevation = 2075
84         sledrun.length = 9644
85         sledrun.difficulty = 3
86         sledrun.avalanches = 2
87         sledrun.operator = 'McRodel'
88         sledrun.public_transport = 3
89         sledrun.walkup_possible = True
90         sledrun.walkup_time = 77
91         sledrun.walkup_separate = 0.5
92         sledrun.walkup_separate_comment = 'Nur unterer Teil'
93         sledrun.lift = True
94         sledrun.lift_details = 'Sessellift'
95         sledrun.night_light = 1.0
96         sledrun.night_light_comment = 'Schlecht beleuchtet'
97         sledrun.night_light_days = 6
98         sledrun.night_light_days_comment = 'Mo-Sa'
99         sledrun.sled_rental = True
100         sledrun.sled_rental_comment = 'In der Hütte'
101         sledrun.cachet = 'Tiroler Rodelbahngütesielgel mittelschwer 2010'
102         sledrun.information_web = 'http://example.com'
103         sledrun.information_phone = '+4364412345678'
104         sledrun.image = 'Sicht_von_unten.jpg'
105         sledrun.show_in_overview = True
106         sledrun.forum_id = 65
107         rodelbahnbox = sledrun_to_rodelbahnbox(sledrun)
108         self.assertEqual(rodelbahnbox['Position'], LonLat(lon=13.5, lat=50.7))
109         self.assertEqual(rodelbahnbox['Position oben'], LonLat(12.2, 49.8))
110         self.assertEqual(rodelbahnbox['Höhe oben'], 3456)
111         self.assertEqual(rodelbahnbox['Position unten'], LonLat(9.89, 51.2))
112         self.assertEqual(rodelbahnbox['Höhe unten'], 2075)
113         self.assertEqual(rodelbahnbox['Länge'], 9644)
114         self.assertEqual(rodelbahnbox['Schwierigkeit'], 3)
115         self.assertEqual(rodelbahnbox['Lawinen'], 2)
116         self.assertEqual(rodelbahnbox['Betreiber'], 'McRodel')
117         self.assertEqual(rodelbahnbox['Öffentliche Anreise'], 3)
118         self.assertEqual(rodelbahnbox['Aufstieg möglich'], True)
119         self.assertEqual(rodelbahnbox['Aufstieg getrennt'], (0.5, 'Nur unterer Teil'))
120         self.assertEqual(rodelbahnbox['Gehzeit'], 77)
121         self.assertEqual(rodelbahnbox['Aufstiegshilfe'], [('Sessellift', None)])
122         self.assertEqual(rodelbahnbox['Beleuchtungsanlage'], (1.0, 'Schlecht beleuchtet'))
123         self.assertEqual(rodelbahnbox['Beleuchtungstage'], (6, 'Mo-Sa'))
124         self.assertEqual(rodelbahnbox['Rodelverleih'], (True, 'In der Hütte'))
125         self.assertEqual(rodelbahnbox['Gütesiegel'], 'Tiroler Rodelbahngütesielgel mittelschwer 2010')
126         self.assertEqual(rodelbahnbox['Webauskunft'], 'http://example.com')
127         self.assertEqual(rodelbahnbox['Bild'], 'Sicht_von_unten.jpg')
128         self.assertEqual(rodelbahnbox['In Übersichtskarte'], True)
129         self.assertEqual(rodelbahnbox['Forumid'], 65)
130
131
132 class TestInn(unittest.TestCase):
133     def test_inn_from_gasthausbox(self):
134         class Inn:
135             pass
136         gasthausbox = [] # TODO: populate for test
137         inn = Inn()
138         inn_from_gasthausbox(gasthausbox, inn)
139         # TODO: check result
140
141     def test_inn_to_gasthausbox(self):
142         class Inn:
143             pass
144         inn = Inn() # TODO: populate for test
145         gasthausbox = inn_to_gasthausbox(inn)
146         # TODO: check result
147
148
149 class TestLonlatEle(unittest.TestCase):
150     def test_lonlat_ele_from_template(self):
151         template = mwparserfromhell.parse('{{Position oben|46.942239 N 11.468819 E|1866}}').filter_templates()[0]
152         lonlat, ele = lonlat_ele_from_template(template)
153         self.assertEqual(LonLat(11.468819, 46.942239), lonlat)
154         self.assertEqual(1866, ele)
155
156     def test_latlon_ele_to_template(self):
157         template = latlon_ele_to_template((LonLat(11.468819, 46.942239), 1866), 'Position oben')
158         self.assertEqual('{{Position oben|46.942239 N 11.468819 E|1866}}', template)
159
160
161 class TestWrMwMarkup(unittest.TestCase):
162     def test_rodelbahnbox_to_sledrun(self):
163         wikitext = '''== Allgemeines ==
164         {{Rodelbahnbox
165         | Position             = 47.309820 N 9.986508 E
166         | Position oben        =
167         | Höhe oben            = 1244
168         | Position unten       =
169         | Höhe unten           = 806
170         | Länge                = 5045
171         | Schwierigkeit        =
172         | Lawinen              = gelegentlich
173         | Betreiber            =
174         | Öffentliche Anreise  = Ja
175         | Gehzeit              = 105
176         | Aufstieg möglich     = Nein
177         | Aufstieg getrennt    = Nein
178         | Aufstiegshilfe       = Nein
179         | Beleuchtungsanlage   = Nein
180         | Beleuchtungstage     =
181         | Rodelverleih         = Ja
182         | Gütesiegel           =
183         | Webauskunft          =
184         | Telefonauskunft      = +43-664-1808482 (Bergkristallhütte)
185         | Bild                 = Rodelbahn Bergkristallhütte 2009-03-03.jpg
186         | In Übersichtskarte   = Ja
187         | Forumid              = 72
188         }}
189         Die Rodelbahn zur Bergkristallhütte ist durchaus abwechslungsreich.'''
190         start, end, sledrun = wrpylib.wrmwmarkup.rodelbahnbox_to_sledrun(wikitext)
191         wrpylib.wrmwmarkup.sledrun_to_rodelbahnbox(sledrun)
192
193
194     def test_RodelbahnboxDictConverter(self):
195         v = wrpylib.wrmwmarkup.RodelbahnboxDictConverter()
196
197         sledrun = v.to_python(other)
198         assert sledrun.forum_id == 72
199         other2 = v.from_python(sledrun)
200         assert other == other2
201
202
203     def test_RodelbahnboxValidator(self):
204         v = wrpylib.wrmwmarkup.RodelbahnboxValidator()
205         wikitext = textwrap.dedent('''\
206         {{Rodelbahnbox
207         | Position             = 47.309820 N 9.986508 E
208         | Position oben        =
209         | Höhe oben            = 1244
210         | Position unten       =
211         | Höhe unten           = 806
212         | Länge                = 5045
213         | Schwierigkeit        =
214         | Lawinen              = gelegentlich
215         | Betreiber            =
216         | Öffentliche Anreise  = Ja
217         | Aufstieg möglich     = Nein
218         | Aufstieg getrennt    = Nein
219         | Gehzeit              = 105
220         | Aufstiegshilfe       = Nein
221         | Beleuchtungsanlage   = Nein
222         | Beleuchtungstage     =
223         | Rodelverleih         = Ja
224         | Gütesiegel           =
225         | Webauskunft          =
226         | Telefonauskunft      = +43-664-1808482 (Bergkristallhütte)
227         | Bild                 = Rodelbahn Bergkristallhütte 2009-03-03.jpg
228         | In Übersichtskarte   = Ja
229         | Forumid              = 72
230         }}''')
231         sledrun = v.to_python(wikitext)
232         wikitext2 = v.from_python(sledrun)
233         assert wikitext == wikitext2
234         wikitext = textwrap.dedent('''\
235         {{Rodelbahnbox
236         | Position             =
237         | Position oben        =
238         | Höhe oben            =
239         | Position unten       =
240         | Höhe unten           =
241         | Länge                =
242         | Schwierigkeit        =
243         | Lawinen              =
244         | Betreiber            =
245         | Öffentliche Anreise  =
246         | Aufstieg möglich     =
247         | Aufstieg getrennt    =
248         | Gehzeit              =
249         | Aufstiegshilfe       =
250         | Beleuchtungsanlage   =
251         | Beleuchtungstage     =
252         | Rodelverleih         =
253         | Gütesiegel           =
254         | Webauskunft          =
255         | Telefonauskunft      =
256         | Bild                 =
257         | In Übersichtskarte   =
258         | Forumid              =
259         }}''')
260         sledrun = v.to_python(wikitext)
261         wikitext2 = v.from_python(sledrun)
262         assert wikitext == wikitext2
263
264
265     def test_gasthausbox_to_inn(self):
266         wikitext = '''{{Gasthausbox
267         | Position          = 47.295549 N 9.986970 E
268         | Höhe              = 1250
269         | Betreiber         =
270         | Sitzplätze        =
271         | Übernachtung      =
272         | Rauchfrei         = Nein
273         | Rodelverleih      =
274         | Handyempfang      = A1; T-Mobile/Telering
275         | Homepage          = http://www.bergkristallhuette.com/
276         | E-Mail            = bergkristallhuette@gmx.at
277         | Telefon           = +43-664-1808482
278         | Bild              = Bergkritsallhütte 2009-02-07.JPG
279         | Rodelbahnen       = [[Bergkristallhütte]]
280         }}
281         Die Bergkristallhütte ist Teil des Boden-Vorsäß.'''
282         start, end, inn = wrpylib.wrmwmarkup.gasthausbox_to_inn(wikitext)
283         wrpylib.wrmwmarkup.inn_to_gasthausbox(inn)
284
285
286     def test_GasthausboxDictConverter(self):
287         v = wrpylib.wrmwmarkup.GasthausboxDictConverter()
288         other = collections.OrderedDict([
289         ('Position', (47.295549, 9.986970)),
290         ('Höhe', 1250),
291         ('Betreiber', None),
292         ('Sitzplätze', None),
293         ('Übernachtung', (None, None)),
294         ('Rauchfrei', (True, False)),
295         ('Rodelverleih', (None, None)),
296         ('Handyempfang', 'A1; T-Mobile/Telering'),
297         ('Homepage', 'http://www.bergkristallhuette.com/'),
298         ('E-Mail', 'bergkristallhuette@gmx.at'),
299         ('Telefon', '+43-664-1808482'),
300         ('Bild', 'Bergkritsallhütte 2009-02-07.JPG'),
301         ('Rodelbahnen', '[[Bergkristallhütte]]')])
302         inn = v.to_python(other)
303         assert inn.homepage == 'http://www.bergkristallhuette.com/'
304         other2 = v.from_python(inn)
305         assert other == other2
306
307
308     def test_GasthausboxValidator(self):
309         v = wrpylib.wrmwmarkup.GasthausboxValidator()
310         wikitext = textwrap.dedent('''\
311         {{Gasthausbox
312         | Position          = 47.295549 N 9.986970 E
313         | Höhe              = 1250
314         | Betreiber         =
315         | Sitzplätze        =
316         | Übernachtung      =
317         | Rauchfrei         = Nein
318         | Rodelverleih      =
319         | Handyempfang      = A1; T-Mobile/Telering
320         | Homepage          = http://www.bergkristallhuette.com/
321         | E-Mail            = bergkristallhuette@gmx.at
322         | Telefon           = +43-664-1808482
323         | Bild              = Bergkritsallhütte 2009-02-07.JPG
324         | Rodelbahnen       = [[Bergkristallhütte]]
325         }}''')
326         inn = v.to_python(wikitext)
327         wikitext2 = v.from_python(inn)
328         assert wikitext == wikitext2
329
330
331     def test_googlemap_to_wrmap(self):
332         wikitext = '''
333         <googlemap version="0.9" lat="47.113291" lon="11.272337" zoom="15" height="450">
334         (Parkplatz)47.114958,11.266026
335         Erster Parkplatz
336
337         (Gasthaus) 47.114715, 11.266262, Alt Bärnbad (Gasthaus)
338         6#FF014E9A
339         47.114715,11.266262
340         47.114135,11.268381
341         47.113421,11.269322
342         47.11277,11.269979
343         47.112408,11.271119
344         </googlemap>
345         '''
346         attributes, coords, paths = wrpylib.mwmarkup.parse_googlemap(wikitext)
347         json = wrpylib.wrmwmarkup.googlemap_to_wrmap(attributes, coords, paths)
348         assert json['properties']['lon'] == 11.272337
349         assert json['properties']['lat'] == 47.113291
350         assert json['properties']['zoom'] == 15
351         assert json['properties']['height'] == 450
352         assert json['features'][0]['properties']['type'] == 'parkplatz'
353         assert json['features'][0]['properties']['name'] == 'Erster Parkplatz'
354         assert json['features'][0]['geometry']['coordinates'] == [11.266026, 47.114958]
355         assert json['features'][1]['properties']['type'] == 'gasthaus'
356         assert json['features'][1]['properties']['name'] == 'Alt Bärnbad (Gasthaus)'
357         assert json['features'][1]['geometry']['coordinates'] == [11.266262, 47.114715]
358         assert json['features'][2]['properties']['type'] == 'rodelbahn'
359         assert json['features'][2]['geometry']['coordinates'] == [
360             [11.266262, 47.114715],
361             [11.268381, 47.114135],
362             [11.269322, 47.113421],
363             [11.269979, 47.11277],
364             [11.271119, 47.112408]]
365
366     def test_parse_wrmap(self):
367         wikitext = '''
368         <wrmap lat="47.2417134" lon="11.21408895" zoom="14" width="700" height="400">
369         <gasthaus name="Rosskogelhütte" wiki="Rosskogelhütte">47.240689 11.190454</gasthaus>
370         <parkplatz>47.245789 11.238971</parkplatz>
371         <haltestelle name="Oberperfuss Rangger Köpfl Lift">47.245711 11.238283</haltestelle>
372         <rodelbahn>
373             47.238587 11.203360
374             47.244951 11.230868
375             47.245470 11.237853
376         </rodelbahn>
377         </wrmap>
378         '''
379         json = wrpylib.wrmwmarkup.parse_wrmap(wikitext)
380         assert json['properties']['lon'] == 11.21408895
381         assert json['properties']['lat'] == 47.2417134
382         assert json['properties']['zoom'] == 14
383         assert json['properties']['width'] == 700
384         assert json['properties']['height'] == 400
385         assert json['features'][0]['properties']['type'] == 'gasthaus'
386         assert json['features'][0]['properties']['name'] == 'Rosskogelhütte'
387         assert json['features'][0]['properties']['wiki'] == 'Rosskogelhütte'
388         assert json['features'][0]['geometry']['coordinates'] == [11.190454, 47.240689]
389         assert json['features'][1]['properties']['type'] == 'parkplatz'
390         assert json['features'][1]['geometry']['coordinates'] == [11.238971, 47.245789]
391         assert json['features'][2]['properties']['type'] == 'haltestelle'
392         assert json['features'][2]['properties']['name'] == 'Oberperfuss Rangger Köpfl Lift'
393         assert json['features'][2]['geometry']['coordinates'] == [11.238283, 47.245711]
394         assert json['features'][3]['properties']['type'] == 'rodelbahn'
395         assert json['features'][3]['geometry']['coordinates'] == [
396             [11.203360, 47.238587],
397             [11.230868, 47.244951],
398             [11.237853, 47.245470]]
399
400     def test_create_wrmap(self):
401         geojson = {
402             'type': 'FeatureCollection',
403             'features':
404                 [{
405                     'type': 'Feature',
406                     'geometry': {
407                         'type': 'Point',
408                         'coordinates': [11.190454, 47.240689]},
409                     'properties': {'type': 'gasthaus', 'name': 'Rosskogelhütte', 'wiki': 'Rosskogelhütte'}
410                 }, {
411                     'type': 'Feature',
412                     'geometry': {
413                         'type': 'Point',
414                         'coordinates': [11.238971, 47.245789]},
415                     'properties': {'type': 'parkplatz'}
416                 }, {
417                     'type': 'Feature',
418                     'geometry': {
419                         'type': 'Point',
420                         'coordinates': [11.238283, 47.245711]},
421                     'properties': {'type': 'haltestelle', 'name': 'Oberperfuss Rangger Köpfl Lift'}
422                 }, {
423                     'type': 'Feature',
424                     'geometry': {
425                         'type': 'LineString',
426                         'coordinates': [
427                             [11.203360, 47.238587],
428                             [11.230868, 47.244951],
429                             [11.237853, 47.245470]]},
430                     'properties': {'type': 'rodelbahn'}
431                 }],
432             'properties': {
433                 'lon': 11.21408895,
434                 'lat': 47.2417134,
435                 'zoom': 14,
436                 'width': 700,
437                 'height': 400}
438         }
439
440         wikitext = wrpylib.wrmwmarkup.create_wrmap(geojson)
441         assert wikitext == textwrap.dedent('''\
442         <wrmap height="400" lat="47.241713" lon="11.214089" width="700" zoom="14">
443
444         <gasthaus name="Rosskogelhütte" wiki="Rosskogelhütte">47.240689 N 11.190454 E</gasthaus>
445         <parkplatz>47.245789 N 11.238971 E</parkplatz>
446         <haltestelle name="Oberperfuss Rangger Köpfl Lift">47.245711 N 11.238283 E</haltestelle>
447
448         <rodelbahn>
449         47.238587 N 11.203360 E
450         47.244951 N 11.230868 E
451         47.245470 N 11.237853 E
452         </rodelbahn>
453
454         </wrmap>''')