98f9067fc94ed0ee1fa199f9891ca83c82a8a846
[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
248
249 class TestLonlatEle(unittest.TestCase):
250     def test_lonlat_ele_from_template(self):
251         template = mwparserfromhell.parse('{{Position oben|46.942239 N 11.468819 E|1866}}').filter_templates()[0]
252         lonlat, ele = lonlat_ele_from_template(template)
253         self.assertEqual(LonLat(11.468819, 46.942239), lonlat)
254         self.assertEqual(1866, ele)
255
256     def test_latlon_ele_to_template(self):
257         template = latlon_ele_to_template((LonLat(11.468819, 46.942239), 1866), 'Position oben')
258         self.assertEqual('{{Position oben|46.942239 N 11.468819 E|1866}}', template)
259
260
261 class TestWrMap(unittest.TestCase):
262     def test_parse_wrmap(self):
263         wikitext = '''
264         <wrmap lat="47.2417134" lon="11.21408895" zoom="14" width="700" height="400">
265         <gasthaus name="Rosskogelhütte" wiki="Rosskogelhütte">47.240689 11.190454</gasthaus>
266         <parkplatz>47.245789 11.238971</parkplatz>
267         <haltestelle name="Oberperfuss Rangger Köpfl Lift">47.245711 11.238283</haltestelle>
268         <rodelbahn>
269             47.238587 11.203360
270             47.244951 11.230868
271             47.245470 11.237853
272         </rodelbahn>
273         </wrmap>
274         '''
275         json = wrpylib.wrmwmarkup.parse_wrmap(wikitext)
276         assert json['properties']['lon'] == 11.21408895
277         assert json['properties']['lat'] == 47.2417134
278         assert json['properties']['zoom'] == 14
279         assert json['properties']['width'] == 700
280         assert json['properties']['height'] == 400
281         assert json['features'][0]['properties']['type'] == 'gasthaus'
282         assert json['features'][0]['properties']['name'] == 'Rosskogelhütte'
283         assert json['features'][0]['properties']['wiki'] == 'Rosskogelhütte'
284         assert json['features'][0]['geometry']['coordinates'] == [11.190454, 47.240689]
285         assert json['features'][1]['properties']['type'] == 'parkplatz'
286         assert json['features'][1]['geometry']['coordinates'] == [11.238971, 47.245789]
287         assert json['features'][2]['properties']['type'] == 'haltestelle'
288         assert json['features'][2]['properties']['name'] == 'Oberperfuss Rangger Köpfl Lift'
289         assert json['features'][2]['geometry']['coordinates'] == [11.238283, 47.245711]
290         assert json['features'][3]['properties']['type'] == 'rodelbahn'
291         assert json['features'][3]['geometry']['coordinates'] == [
292             [11.203360, 47.238587],
293             [11.230868, 47.244951],
294             [11.237853, 47.245470]]
295
296     def test_create_wrmap(self):
297         geojson = {
298             'type': 'FeatureCollection',
299             'features':
300                 [{
301                     'type': 'Feature',
302                     'geometry': {
303                         'type': 'Point',
304                         'coordinates': [11.190454, 47.240689]},
305                     'properties': {'type': 'gasthaus', 'name': 'Rosskogelhütte', 'wiki': 'Rosskogelhütte'}
306                 }, {
307                     'type': 'Feature',
308                     'geometry': {
309                         'type': 'Point',
310                         'coordinates': [11.238971, 47.245789]},
311                     'properties': {'type': 'parkplatz'}
312                 }, {
313                     'type': 'Feature',
314                     'geometry': {
315                         'type': 'Point',
316                         'coordinates': [11.238283, 47.245711]},
317                     'properties': {'type': 'haltestelle', 'name': 'Oberperfuss Rangger Köpfl Lift'}
318                 }, {
319                     'type': 'Feature',
320                     'geometry': {
321                         'type': 'LineString',
322                         'coordinates': [
323                             [11.203360, 47.238587],
324                             [11.230868, 47.244951],
325                             [11.237853, 47.245470]]},
326                     'properties': {'type': 'rodelbahn'}
327                 }],
328             'properties': {
329                 'lon': 11.21408895,
330                 'lat': 47.2417134,
331                 'zoom': 14,
332                 'width': 700,
333                 'height': 400}
334         }
335
336         wikitext = wrpylib.wrmwmarkup.create_wrmap(geojson)
337         assert wikitext == textwrap.dedent('''\
338         <wrmap height="400" lat="47.241713" lon="11.214089" width="700" zoom="14">
339
340         <gasthaus name="Rosskogelhütte" wiki="Rosskogelhütte">47.240689 N 11.190454 E</gasthaus>
341         <parkplatz>47.245789 N 11.238971 E</parkplatz>
342         <haltestelle name="Oberperfuss Rangger Köpfl Lift">47.245711 N 11.238283 E</haltestelle>
343
344         <rodelbahn>
345         47.238587 N 11.203360 E
346         47.244951 N 11.230868 E
347         47.245470 N 11.237853 E
348         </rodelbahn>
349
350         </wrmap>''')