#!/usr/bin/python3.4
import collections
import textwrap
import unittest
import mwparserfromhell
import wrpylib.wrvalidators
import wrpylib.wrmwmarkup
from wrpylib.wrvalidators import LonLat
from wrpylib.wrmwmarkup import sledrun_from_rodelbahnbox, sledrun_to_rodelbahnbox, \
inn_from_gasthausbox, inn_to_gasthausbox, lonlat_ele_from_template, latlon_ele_to_template
class TestSledrun(unittest.TestCase):
def test_sledrun_from_rodelbahnbox(self):
class Sledrun:
pass
rodelbahnbox = collections.OrderedDict([
('Position', LonLat(9.986508, 47.30982)),
('Position oben', LonLat(None, None)),
('Höhe oben', 1244),
('Position unten', LonLat(8.506047, 46.20210)),
('Höhe unten', None),
('Länge', 5045),
('Schwierigkeit', 3),
('Lawinen', 2),
('Betreiber', 'SchneeFunFit'),
('Öffentliche Anreise', 2),
('Aufstieg möglich', True),
('Aufstieg getrennt', (0.0, None)),
('Gehzeit', 105),
('Aufstiegshilfe', [('Sessellift', 'gratis'), ('Bus', None)]),
('Beleuchtungsanlage', (0.0, 'in Planung für 2020')),
('Beleuchtungstage', (None, None)),
('Rodelverleih', []),
('Gütesiegel', []),
('Webauskunft', (True, 'http://example.com/schneelage')),
('Telefonauskunft', [('+43-664-1808482', 'Bergkristallhütte')]),
('Bild', 'Rodelbahn Bergkristallhütte 2009-03-03.jpg'),
('In Übersichtskarte', True),
('Forumid', 72)])
sledrun = Sledrun()
sledrun_from_rodelbahnbox(rodelbahnbox, sledrun)
self.assertEqual(47.30982, sledrun.position_latitude)
self.assertEqual(9.986508, sledrun.position_longitude)
self.assertEqual(None, sledrun.top_latitude)
self.assertEqual(None, sledrun.top_longitude)
self.assertEqual(1244, sledrun.top_elevation)
self.assertEqual(46.20210, sledrun.bottom_latitude)
self.assertEqual(8.506047, sledrun.bottom_longitude)
self.assertEqual(None, sledrun.bottom_elevation)
self.assertEqual(5045, sledrun.length)
self.assertEqual(3, sledrun.difficulty)
self.assertEqual(2, sledrun.avalanches)
self.assertEqual('SchneeFunFit', sledrun.operator)
self.assertEqual(2, sledrun.public_transport)
self.assertEqual(True, sledrun.walkup_possible)
self.assertEqual(105, sledrun.walkup_time)
self.assertEqual(0.0, sledrun.walkup_separate)
self.assertEqual(None, sledrun.walkup_separate_comment)
self.assertEqual(True, sledrun.lift)
self.assertEqual('Sessellift (gratis); Bus', sledrun.lift_details)
self.assertEqual(0.0, sledrun.night_light)
self.assertEqual('in Planung für 2020', sledrun.night_light_comment)
self.assertEqual(None, sledrun.night_light_days)
self.assertEqual(None, sledrun.night_light_days_comment)
self.assertEqual(False, sledrun.sled_rental)
self.assertEqual('Nein', sledrun.sled_rental_comment)
self.assertEqual('Nein', sledrun.cachet)
self.assertEqual('http://example.com/schneelage', sledrun.information_web)
self.assertEqual('+43-664-1808482 (Bergkristallhütte)', sledrun.information_phone)
self.assertEqual('Rodelbahn Bergkristallhütte 2009-03-03.jpg', sledrun.image)
self.assertEqual(True, sledrun.show_in_overview)
self.assertEqual(72, sledrun.forum_id)
def test_sledrun_to_rodelbahnbox(self):
class Sledrun:
pass
sledrun = Sledrun()
sledrun.position_longitude = 13.5
sledrun.position_latitude = 50.7
sledrun.top_longitude = 12.2
sledrun.top_latitude = 49.8
sledrun.top_elevation = 3456
sledrun.bottom_longitude = 9.89
sledrun.bottom_latitude = 51.2
sledrun.bottom_elevation = 2075
sledrun.length = 9644
sledrun.difficulty = 3
sledrun.avalanches = 2
sledrun.operator = 'McRodel'
sledrun.public_transport = 3
sledrun.walkup_possible = True
sledrun.walkup_time = 77
sledrun.walkup_separate = 0.5
sledrun.walkup_separate_comment = 'Nur unterer Teil'
sledrun.lift = True
sledrun.lift_details = 'Sessellift'
sledrun.night_light = 1.0
sledrun.night_light_comment = 'Schlecht beleuchtet'
sledrun.night_light_days = 6
sledrun.night_light_days_comment = 'Mo-Sa'
sledrun.sled_rental = True
sledrun.sled_rental_comment = 'In der Hütte'
sledrun.cachet = 'Tiroler Rodelbahngütesielgel mittelschwer 2010'
sledrun.information_web = 'http://example.com'
sledrun.information_phone = '+4364412345678'
sledrun.image = 'Sicht_von_unten.jpg'
sledrun.show_in_overview = True
sledrun.forum_id = 65
rodelbahnbox = sledrun_to_rodelbahnbox(sledrun)
self.assertEqual(rodelbahnbox['Position'], LonLat(lon=13.5, lat=50.7))
self.assertEqual(rodelbahnbox['Position oben'], LonLat(12.2, 49.8))
self.assertEqual(rodelbahnbox['Höhe oben'], 3456)
self.assertEqual(rodelbahnbox['Position unten'], LonLat(9.89, 51.2))
self.assertEqual(rodelbahnbox['Höhe unten'], 2075)
self.assertEqual(rodelbahnbox['Länge'], 9644)
self.assertEqual(rodelbahnbox['Schwierigkeit'], 3)
self.assertEqual(rodelbahnbox['Lawinen'], 2)
self.assertEqual(rodelbahnbox['Betreiber'], 'McRodel')
self.assertEqual(rodelbahnbox['Öffentliche Anreise'], 3)
self.assertEqual(rodelbahnbox['Aufstieg möglich'], True)
self.assertEqual(rodelbahnbox['Aufstieg getrennt'], (0.5, 'Nur unterer Teil'))
self.assertEqual(rodelbahnbox['Gehzeit'], 77)
self.assertEqual(rodelbahnbox['Aufstiegshilfe'], [('Sessellift', None)])
self.assertEqual(rodelbahnbox['Beleuchtungsanlage'], (1.0, 'Schlecht beleuchtet'))
self.assertEqual(rodelbahnbox['Beleuchtungstage'], (6, 'Mo-Sa'))
self.assertEqual(rodelbahnbox['Rodelverleih'], (True, 'In der Hütte'))
self.assertEqual(rodelbahnbox['Gütesiegel'], 'Tiroler Rodelbahngütesielgel mittelschwer 2010')
self.assertEqual(rodelbahnbox['Webauskunft'], 'http://example.com')
self.assertEqual(rodelbahnbox['Bild'], 'Sicht_von_unten.jpg')
self.assertEqual(rodelbahnbox['In Übersichtskarte'], True)
self.assertEqual(rodelbahnbox['Forumid'], 65)
class TestInn(unittest.TestCase):
def test_inn_from_gasthausbox(self):
class Inn:
pass
gasthausbox = collections.OrderedDict()
gasthausbox['Position'] = LonLat(11.015883, 9.876000)
gasthausbox['Höhe'] = 2145
gasthausbox['Betreiber'] = 'Max Mustermann'
gasthausbox['Sitzplätze'] = 30
gasthausbox['Übernachtung'] = (True, '2 Zimmer')
gasthausbox['Rauchfrei'] = 0.5
gasthausbox['Rodelverleih'] = (True, '6 Euro')
gasthausbox['Handyempfang'] = [('A1', None), ('Drei', 'schlecht')]
gasthausbox['Homepage'] = (True, 'http://www.graf-ferdinand.at/')
gasthausbox['E-Mail'] = [(('max.mustermann@graf-ferdinand.at', False), None), (('ich@example.com', True), 'privat')]
gasthausbox['Telefon'] = [('+43-5039-21666', None), ('+43-686-4134880', 'Sommer')]
gasthausbox['Bild'] = 'Gasthaus_Graf_Ferdinand_Haus_01.jpg'
gasthausbox['Rodelbahnen'] = ['[[Finstertaler Speicher]]', '[[Birgitzer Alm]]']
inn = Inn()
inn_from_gasthausbox(gasthausbox, inn)
self.assertEqual(inn.position_latitude, 9.876000)
self.assertEqual(inn.position_longitude, 11.015883)
self.assertEqual(inn.position_elevation, 2145)
self.assertEqual(inn.operator, 'Max Mustermann')
self.assertEqual(inn.seats, 30)
self.assertEqual(inn.overnight, True)
self.assertEqual(inn.overnight_comment, '2 Zimmer')
self.assertEqual(inn.smoker_area, True)
self.assertEqual(inn.nonsmoker_area, True)
self.assertEqual(inn.sled_rental, True)
self.assertEqual(inn.sled_rental_comment, '6 Euro')
self.assertEqual(inn.mobile_provider, 'A1; Drei (schlecht)')
self.assertEqual(inn.homepage, 'http://www.graf-ferdinand.at/')
self.assertEqual(inn.email_list, 'max.mustermann@graf-ferdinand.at; ich(at)example.com (privat)')
self.assertEqual(inn.phone_list, '+43-5039-21666; +43-686-4134880 (Sommer)')
self.assertEqual(inn.image, 'Gasthaus_Graf_Ferdinand_Haus_01.jpg')
self.assertEqual(inn.sledding_list, '[[Finstertaler Speicher]]; [[Birgitzer Alm]]')
def test_inn_to_gasthausbox(self):
class Inn:
pass
inn = Inn()
inn.position_latitude = 9.876000
inn.position_longitude = 11.015883
inn.position_elevation = 2145
inn.operator = 'Max Mustermann'
inn.seats = 30
inn.overnight = True
inn.overnight_comment = '2 Zimmer'
inn.smoker_area = True
inn.nonsmoker_area = True
inn.sled_rental = True
inn.sled_rental_comment = '6 Euro'
inn.mobile_provider = 'A1; Drei (schlecht)'
inn.homepage = 'http://www.graf-ferdinand.at/'
inn.email_list = 'max.mustermann@graf-ferdinand.at; ich(at)example.com (privat)'
inn.phone_list = '+43-5039-21666; +43-686-4134880 (Sommer)'
inn.image = 'Gasthaus_Graf_Ferdinand_Haus_01.jpg'
inn.sledding_list = '[[Finstertaler Speicher]]; [[Birgitzer Alm]]'
gasthausbox = inn_to_gasthausbox(inn)
self.assertEqual(gasthausbox['Position'], LonLat(11.015883, 9.876000))
self.assertEqual(gasthausbox['Höhe'], 2145)
self.assertEqual(gasthausbox['Betreiber'], 'Max Mustermann')
self.assertEqual(gasthausbox['Sitzplätze'], 30)
self.assertEqual(gasthausbox['Übernachtung'], (True, '2 Zimmer'))
self.assertEqual(gasthausbox['Rauchfrei'], 0.5)
self.assertEqual(gasthausbox['Rodelverleih'], (True, '6 Euro'))
self.assertEqual(gasthausbox['Handyempfang'], [('A1', None), ('Drei', 'schlecht')])
self.assertEqual(gasthausbox['Homepage'], (True, 'http://www.graf-ferdinand.at/'))
self.assertEqual(gasthausbox['E-Mail'], [(('max.mustermann@graf-ferdinand.at', False), None), (('ich@example.com', True), 'privat')])
self.assertEqual(gasthausbox['Telefon'], [('+43-5039-21666', None), ('+43-686-4134880', 'Sommer')])
self.assertEqual(gasthausbox['Bild'], 'Gasthaus_Graf_Ferdinand_Haus_01.jpg')
self.assertEqual(gasthausbox['Rodelbahnen'], ['[[Finstertaler Speicher]]', '[[Birgitzer Alm]]'])
def test_inn_from_gasthausbox_none(self):
class Inn:
pass
gasthausbox = collections.OrderedDict()
gasthausbox['Position'] = LonLat(None, None)
gasthausbox['Höhe'] = None
gasthausbox['Betreiber'] = None
gasthausbox['Sitzplätze'] = None
gasthausbox['Übernachtung'] = (None, None)
gasthausbox['Rauchfrei'] = None
gasthausbox['Rodelverleih'] = (None, None)
gasthausbox['Handyempfang'] = None
gasthausbox['Homepage'] = (None, None)
gasthausbox['E-Mail'] = None
gasthausbox['Telefon'] = None
gasthausbox['Bild'] = None
gasthausbox['Rodelbahnen'] = None
inn = Inn()
inn_from_gasthausbox(gasthausbox, inn)
self.assertEqual(inn.position_latitude, None)
self.assertEqual(inn.position_longitude, None)
self.assertEqual(inn.position_elevation, None)
self.assertEqual(inn.operator, None)
self.assertEqual(inn.seats, None)
self.assertEqual(inn.overnight, None)
self.assertEqual(inn.overnight_comment, None)
self.assertEqual(inn.smoker_area, None)
self.assertEqual(inn.nonsmoker_area, None)
self.assertEqual(inn.sled_rental, None)
self.assertEqual(inn.sled_rental_comment, None)
self.assertEqual(inn.mobile_provider, None)
self.assertEqual(inn.homepage, None)
self.assertEqual(inn.email_list, None)
self.assertEqual(inn.phone_list, None)
self.assertEqual(inn.image, None)
self.assertEqual(inn.sledding_list, None)
def test_inn_to_gasthausbox_none(self):
class Inn:
pass
inn = Inn()
inn.position_latitude = None
inn.position_longitude = None
inn.position_elevation = None
inn.operator = None
inn.seats = None
inn.overnight = None
inn.overnight_comment = None
inn.smoker_area = None
inn.nonsmoker_area = None
inn.sled_rental = None
inn.sled_rental_comment = None
inn.mobile_provider = None
inn.homepage = None
inn.email_list = None
inn.phone_list = None
inn.image = None
inn.sledding_list = None
gasthausbox = inn_to_gasthausbox(inn)
self.assertEqual(gasthausbox['Position'], LonLat(None, None))
self.assertEqual(gasthausbox['Höhe'], None)
self.assertEqual(gasthausbox['Betreiber'], None)
self.assertEqual(gasthausbox['Sitzplätze'], None)
self.assertEqual(gasthausbox['Übernachtung'], (None, None))
self.assertEqual(gasthausbox['Rauchfrei'], None)
self.assertEqual(gasthausbox['Rodelverleih'], (None, None))
self.assertEqual(gasthausbox['Handyempfang'], None)
self.assertEqual(gasthausbox['Homepage'], (None, None))
self.assertEqual(gasthausbox['E-Mail'], None)
self.assertEqual(gasthausbox['Telefon'], None)
self.assertEqual(gasthausbox['Bild'], None)
self.assertEqual(gasthausbox['Rodelbahnen'], None)
class TestLonlatEle(unittest.TestCase):
def test_lonlat_ele_from_template(self):
template = mwparserfromhell.parse('{{Position oben|46.942239 N 11.468819 E|1866}}').filter_templates()[0]
lonlat, ele = lonlat_ele_from_template(template)
self.assertEqual(LonLat(11.468819, 46.942239), lonlat)
self.assertEqual(1866, ele)
def test_latlon_ele_to_template(self):
template = latlon_ele_to_template((LonLat(11.468819, 46.942239), 1866), 'Position oben')
self.assertEqual('{{Position oben|46.942239 N 11.468819 E|1866}}', template)
class TestWrMap(unittest.TestCase):
def test_parse_wrmap(self):
wikitext = '''
47.240689 11.190454
47.245789 11.238971
47.245711 11.238283
47.238587 11.203360
47.244951 11.230868
47.245470 11.237853
'''
json = wrpylib.wrmwmarkup.parse_wrmap(wikitext)
assert json['properties']['lon'] == 11.21408895
assert json['properties']['lat'] == 47.2417134
assert json['properties']['zoom'] == 14
assert json['properties']['width'] == 700
assert json['properties']['height'] == 400
assert json['features'][0]['properties']['type'] == 'gasthaus'
assert json['features'][0]['properties']['name'] == 'Rosskogelhütte'
assert json['features'][0]['properties']['wiki'] == 'Rosskogelhütte'
assert json['features'][0]['geometry']['coordinates'] == [11.190454, 47.240689]
assert json['features'][1]['properties']['type'] == 'parkplatz'
assert json['features'][1]['geometry']['coordinates'] == [11.238971, 47.245789]
assert json['features'][2]['properties']['type'] == 'haltestelle'
assert json['features'][2]['properties']['name'] == 'Oberperfuss Rangger Köpfl Lift'
assert json['features'][2]['geometry']['coordinates'] == [11.238283, 47.245711]
assert json['features'][3]['properties']['type'] == 'rodelbahn'
assert json['features'][3]['geometry']['coordinates'] == [
[11.203360, 47.238587],
[11.230868, 47.244951],
[11.237853, 47.245470]]
def test_create_wrmap(self):
geojson = {
'type': 'FeatureCollection',
'features':
[{
'type': 'Feature',
'geometry': {
'type': 'Point',
'coordinates': [11.190454, 47.240689]},
'properties': {'type': 'gasthaus', 'name': 'Rosskogelhütte', 'wiki': 'Rosskogelhütte'}
}, {
'type': 'Feature',
'geometry': {
'type': 'Point',
'coordinates': [11.238971, 47.245789]},
'properties': {'type': 'parkplatz'}
}, {
'type': 'Feature',
'geometry': {
'type': 'Point',
'coordinates': [11.238283, 47.245711]},
'properties': {'type': 'haltestelle', 'name': 'Oberperfuss Rangger Köpfl Lift'}
}, {
'type': 'Feature',
'geometry': {
'type': 'LineString',
'coordinates': [
[11.203360, 47.238587],
[11.230868, 47.244951],
[11.237853, 47.245470]]},
'properties': {'type': 'rodelbahn'}
}],
'properties': {
'lon': 11.21408895,
'lat': 47.2417134,
'zoom': 14,
'width': 700,
'height': 400}
}
wikitext = wrpylib.wrmwmarkup.create_wrmap(geojson)
assert wikitext == textwrap.dedent('''\
47.240689 N 11.190454 E
47.245789 N 11.238971 E
47.245711 N 11.238283 E
47.238587 N 11.203360 E
47.244951 N 11.230868 E
47.245470 N 11.237853 E
''')