Name of public_transport_stop was split.
[philipp/winterrodeln/wrpylib.git] / tests / test_mwmarkup.py
index a1fa937b6d395f93e1f57f881bbfb7504a3c780f..14e0e17a65d8db76fa25d032fa1e4eabecd7cde2 100644 (file)
-#!/usr/bin/python2.7
-# -*- coding: iso-8859-15 -*-
+import unittest
+import mwparserfromhell
 import wrpylib.mwmarkup
 
 
-def test_find_template():
-    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.'''
-    start, end = wrpylib.mwmarkup.find_template(wikitext, u'Rodelbahnbox')
-    assert start == wikitext.find(u'{{')
-    assert end == wikitext.find(u'}}')+2
-
-
-def test_split_template():
-    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.'''
-    start, end = wrpylib.mwmarkup.find_template(wikitext, u'Rodelbahnbox')
-    template_title, parameters = wrpylib.mwmarkup.split_template(wikitext[start:end])
-    assert template_title == u'Rodelbahnbox'
-    assert len(parameters) == 22
-    assert parameters['Position'] == u'47.309820 N 9.986508 E'
-    assert parameters['Telefonauskunft'] == u'+43-664-1808482 (Bergkristallhütte)'
-    assert parameters['Schwierigkeit'] == u''
-
-
-def test_create_template():
-    wikitext = u'''{{Nicetemplate|Red|Bold|Position=Top|Alignment=Right}}'''
-    template_title, parameters = wrpylib.mwmarkup.split_template(wikitext)
-    print parameters
-    keys = [u'1', u'2', u'Position', u'Alignment']
-    values = [parameters[k] for k in keys]
-    wikitext_generated = wrpylib.mwmarkup.create_template(template_title, values[:2], keys[2:], values[2:])
-    wikitext_table = wrpylib.mwmarkup.create_template(template_title, values[:2], keys[2:], values[2:], True)
-    assert wikitext_generated == wikitext
+class TestMwParserFromHell(unittest.TestCase):
+    def setUp(self):
+        self.maxDiff = None
 
+    def test_find_template(self):
+        wikitext = '''== 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.'''
+        wikicode = mwparserfromhell.parse(wikitext)
+        rb = list(wikicode.filter_templates())[0]
+        self.assertEqual(rb.name.strip(), 'Rodelbahnbox')
+        self.assertEqual(rb.get('Aufstiegshilfe').value.strip(), 'Nein')
+        self.assertEqual(str(rb)[:2], '{{')
+        self.assertEqual(str(rb)[-2:], '}}')
 
+    def test_template_to_table(self):
+        wikitext = '{{Rodelbahnbox | Unbenannt | Position = 47.309820 N 9.986508 E | Aufstieg möglich = Ja }}'
+        wikicode = mwparserfromhell.parse(wikitext)
+        template = list(wikicode.filter_templates())[0]
+        self.assertEqual(template.name.strip(), 'Rodelbahnbox')
+        self.assertEqual(template.params[0].strip(), 'Unbenannt')
+        self.assertEqual(template.params[1].name.strip(), 'Position')
+        self.assertEqual(template.params[1].value.strip(), '47.309820 N 9.986508 E')
+        self.assertEqual(template.params[2].name.strip(), 'Aufstieg möglich')
+        self.assertEqual(template.params[2].value.strip(), 'Ja')
+
+        template = mwparserfromhell.nodes.template.Template('Rodelbahnbox')
+        template.add(1, 'Unbenannt')
+        template.add('Position', '47.309820 N 9.986508 E')
+        template.add('Aufstieg möglich', 'Ja')
+        self.assertEqual(template, '{{Rodelbahnbox|Unbenannt|Position=47.309820 N 9.986508 E|Aufstieg möglich=Ja}}')
+
+        wrpylib.mwmarkup.format_template_table(template)
+        self.assertEqual(template,
+            '{{Rodelbahnbox\n' +
+            '| Unbenannt\n' +
+            '| Position         = 47.309820 N 9.986508 E\n' +
+            '| Aufstieg möglich = Ja\n' +
+            '}}')
+
+        wrpylib.mwmarkup.format_template_table(template, 18)
+        self.assertEqual(template,
+            '{{Rodelbahnbox\n' +
+            '| Unbenannt\n' +
+            '| Position           = 47.309820 N 9.986508 E\n' +
+            '| Aufstieg möglich   = Ja\n' +
+            '}}')
+
+    def test_split_template(self):
+        wikitext = '''== 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.'''
+        wikicode = mwparserfromhell.parse(wikitext)
+        template = wikicode.filter_templates(matches='Rodelbahnbox')[0]
+        self.assertEqual(template.name.strip(), 'Rodelbahnbox')
+        self.assertEqual(len(template.params), 22)
+        self.assertEqual(template.get('Position').value.strip(), '47.309820 N 9.986508 E')
+        self.assertEqual(template.get('Telefonauskunft').value.strip(), '+43-664-1808482 (Bergkristallhütte)')
+        self.assertEqual(template.get('Schwierigkeit').value.strip(), '')
+
+    def test_create_template(self):
+        template = mwparserfromhell.nodes.template.Template('Rodelbahnbox')
+        template.add(1, 'Unbenannt')
+        template.add('Position', '47.309820 N 9.986508 E')
+        template.add('Aufstieg möglich', 'Ja')
+        self.assertEqual(template, '{{Rodelbahnbox|Unbenannt|Position=47.309820 N 9.986508 E|Aufstieg möglich=Ja}}')
+
+        wrpylib.mwmarkup.format_template_table(template)
+        self.assertEqual(template,
+            '{{Rodelbahnbox\n' +
+            '| Unbenannt\n' +
+            '| Position         = 47.309820 N 9.986508 E\n' +
+            '| Aufstieg möglich = Ja\n' +
+            '}}')
+
+    def test_find_tag(self):
+        wikitext = 'This is <tag>my first tag</tag> and <tag>my second tag</tag>.'
+        wikicode = mwparserfromhell.parse(wikitext)
+        tag_iter = wikicode.ifilter_tags()
+        tag = next(tag_iter)
+        self.assertEqual(tag.tag.strip(), 'tag')
+        self.assertEqual(tag.contents.strip(), 'my first tag')
+        tag = next(tag_iter)
+        self.assertEqual(tag.tag.strip(), 'tag')
+        self.assertEqual(tag.contents.strip(), 'my second tag')
+
+        wikitext = 'This is <tag myattrib="4"/>.'
+        wikicode = mwparserfromhell.parse(wikitext)
+        tag = next(wikicode.ifilter_tags())
+        self.assertEqual('tag', tag.tag)
+
+
+class TestFormatTemplate(unittest.TestCase):
+    def test_format_template_oneline(self):
+        value = mwparserfromhell.parse('{{ my_template ||   | var = 7 }}').filter_templates()[0]
+        wrpylib.mwmarkup.format_template_oneline(value)
+        self.assertEqual('{{my_template| | |var=7}}', value)
+
+
+class TestMwApi(unittest.TestCase):
+    def test_dbkey_to_title(self):
+        self.assertEqual(wrpylib.mwmarkup.dbkey_to_title('My_Title'), 'My Title')
+        self.assertEqual(wrpylib.mwmarkup.dbkey_to_title('My Title'), 'My Title') # should not happen
+        self.assertEqual(wrpylib.mwmarkup.dbkey_to_title('My_nice_Title'), 'My nice Title')