Made test_wrregioncache_table independent of wrregioncache.id.
[philipp/winterrodeln/wrpylib.git] / tests / test_wrmwmarkup.py
index 18af9bcdea438f25f919d64abf573f9607ec877b..9d1a74874395f5d5d88c3d935842c34403d65495 100644 (file)
-#!/usr/bin/python2.6
-# -*- coding: iso-8859-15 -*-
+#!/usr/bin/python3.4
+import collections
+import textwrap
+import unittest
+import mwparserfromhell
+import wrpylib.wrvalidators
 import wrpylib.wrmwmarkup
-import formencode
-
-
-def test_rodelbahnbox_to_sledrun():
-    wikitext = u'''== Allgemeines ==
-    {{Rodelbahnbox
-    | Position             = 47.309820 N 9.986508 E
-    | Position oben        = 
-    | Höhe oben            = 1244
-    | Position unten       = 
-    | Höhe unten           = 806
-    | Länge                = 5045
-    | Schwierigkeit        = 
-    | Lawinen              = gelegentlich
-    | Betreiber            = 
-    | Öffentliche Anreise  = Ja
-    | Gehzeit              = 105
-    | Aufstieg getrennt    = Nein
-    | Aufstiegshilfe       = Nein
-    | Beleuchtungsanlage   = Nein
-    | Beleuchtungstage     = 
-    | Rodelverleih         = Ja
-    | Gütesiegel           = 
-    | Webauskunft          = 
-    | Telefonauskunft      = +43-664-1808482 (Bergkristallhütte)
-    | Bild                 = Rodelbahn Bergkristallhütte 2009-03-03.jpg
-    | In Übersichtskarte   = Ja
-    | Forumid              = 72
-    }}
-    Die Rodelbahn zur Bergkristallhütte ist durchaus abwechslungsreich.'''
-    class Sledrun(object): pass
-    sledrun = Sledrun()
-    wrpylib.wrmwmarkup.rodelbahnbox_to_sledrun(wikitext, sledrun)
-    wrpylib.wrmwmarkup.sledrun_to_rodelbahnbox(sledrun)
-
-
-
-def test_gasthausbox_to_inn():
-    wikitext = u'''{{Gasthausbox
-    | Position          = 47.295549 N 9.986970 E
-    | Höhe              = 1250
-    | Betreiber         = 
-    | Sitzplätze        = 
-    | Übernachtung      = 
-    | Rauchfrei         = Nein
-    | Rodelverleih      = 
-    | Handyempfang      = A1; T-Mobile/Telering
-    | Homepage          = http://www.bergkristallhuette.com/
-    | E-Mail            = bergkristallhuette@gmx.at
-    | Telefon           = +43-664-1808482
-    | Bild              = Bergkritsallhütte 2009-02-07.JPG
-    | Rodelbahnen       = [[Bergkristallhütte]]
-    }}
-    Die Bergkristallhütte ist Teil des Boden-Vorsäß.'''
-    class Inn(object): pass
-    inn = Inn()
-    wrpylib.wrmwmarkup.gasthausbox_to_inn(wikitext, inn)
-    wrpylib.wrmwmarkup.inn_to_gasthausbox(inn)
+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_no(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'] = (False, None)
+        gasthausbox['Rauchfrei'] = 0.0
+        gasthausbox['Rodelverleih'] = (False, None)
+        gasthausbox['Handyempfang'] = []
+        gasthausbox['Homepage'] = (False, None)
+        gasthausbox['E-Mail'] = []
+        gasthausbox['Telefon'] = []
+        gasthausbox['Bild'] = None
+        gasthausbox['Rodelbahnen'] = []
+        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, False)
+        self.assertEqual(inn.overnight_comment, None)
+        self.assertEqual(inn.smoker_area, True)
+        self.assertEqual(inn.nonsmoker_area, False)
+        self.assertEqual(inn.sled_rental, False)
+        self.assertEqual(inn.sled_rental_comment, None)
+        self.assertEqual(inn.mobile_provider, 'Nein')
+        self.assertEqual(inn.homepage, 'Nein')
+        self.assertEqual(inn.email_list, 'Nein')
+        self.assertEqual(inn.phone_list, 'Nein')
+        self.assertEqual(inn.image, None)
+        self.assertEqual(inn.sledding_list, 'Nein')
+
+    def test_inn_to_gasthausbox_no(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 = False
+        inn.overnight_comment = None
+        inn.smoker_area = True
+        inn.nonsmoker_area = False
+        inn.sled_rental = False
+        inn.sled_rental_comment = None
+        inn.mobile_provider = 'Nein'
+        inn.homepage = 'Nein'
+        inn.email_list = 'Nein'
+        inn.phone_list = 'Nein'
+        inn.image = None
+        inn.sledding_list = 'Nein'
+        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'], (False, None))
+        self.assertEqual(gasthausbox['Rauchfrei'], 0.0)
+        self.assertEqual(gasthausbox['Rodelverleih'], (False, None))
+        self.assertEqual(gasthausbox['Handyempfang'], [])
+        self.assertEqual(gasthausbox['Homepage'], (False, None))
+        self.assertEqual(gasthausbox['E-Mail'], [])
+        self.assertEqual(gasthausbox['Telefon'], [])
+        self.assertEqual(gasthausbox['Bild'], None)
+        self.assertEqual(gasthausbox['Rodelbahnen'], [])
+
+    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 = '''
+        <wrmap lat="47.2417134" lon="11.21408895" zoom="14" width="700" height="400">
+        <gasthaus name="Rosskogelhütte" wiki="Rosskogelhütte">47.240689 11.190454</gasthaus>
+        <parkplatz>47.245789 11.238971</parkplatz>
+        <haltestelle name="Oberperfuss Rangger Köpfl Lift">47.245711 11.238283</haltestelle>
+        <rodelbahn>
+            47.238587 11.203360
+            47.244951 11.230868
+            47.245470 11.237853
+        </rodelbahn>
+        </wrmap>
+        '''
+        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('''\
+        <wrmap height="400" lat="47.241713" lon="11.214089" width="700" zoom="14">
+
+        <gasthaus name="Rosskogelhütte" wiki="Rosskogelhütte">47.240689 N 11.190454 E</gasthaus>
+        <parkplatz>47.245789 N 11.238971 E</parkplatz>
+        <haltestelle name="Oberperfuss Rangger Köpfl Lift">47.245711 N 11.238283 E</haltestelle>
+
+        <rodelbahn>
+        47.238587 N 11.203360 E
+        47.244951 N 11.230868 E
+        47.245470 N 11.237853 E
+        </rodelbahn>
+
+        </wrmap>''')