The order of XML attributes is now retained.
[philipp/winterrodeln/wrpylib.git] / tests / test_mwmarkup.py
1 import unittest
2 import mwparserfromhell
3 import wrpylib.mwmarkup
4
5
6 class TestMwParserFromHell(unittest.TestCase):
7     def setUp(self):
8         self.maxDiff = None
9
10     def test_find_template(self):
11         wikitext = '''== Allgemeines ==
12         {{Rodelbahnbox
13         | Position             = 47.309820 N 9.986508 E
14         | Position oben        =
15         | Höhe oben            = 1244
16         | Position unten       =
17         | Höhe unten           = 806
18         | Länge                = 5045
19         | Schwierigkeit        =
20         | Lawinen              = gelegentlich
21         | Betreiber            =
22         | Öffentliche Anreise  = Ja
23         | Gehzeit              = 105
24         | Aufstieg getrennt    = Nein
25         | Aufstiegshilfe       = Nein
26         | Beleuchtungsanlage   = Nein
27         | Beleuchtungstage     =
28         | Rodelverleih         = Ja
29         | Gütesiegel           =
30         | Webauskunft          =
31         | Telefonauskunft      = +43-664-1808482 (Bergkristallhütte)
32         | Bild                 = Rodelbahn Bergkristallhütte 2009-03-03.jpg
33         | In Übersichtskarte   = Ja
34         | Forumid              = 72
35         }}
36         Die Rodelbahn zur Bergkristallhütte ist durchaus abwechslungsreich.'''
37         wikicode = mwparserfromhell.parse(wikitext)
38         rb = list(wikicode.filter_templates())[0]
39         self.assertEqual(rb.name.strip(), 'Rodelbahnbox')
40         self.assertEqual(rb.get('Aufstiegshilfe').value.strip(), 'Nein')
41         self.assertEqual(str(rb)[:2], '{{')
42         self.assertEqual(str(rb)[-2:], '}}')
43
44     def test_template_to_table(self):
45         wikitext = '{{Rodelbahnbox | Unbenannt | Position = 47.309820 N 9.986508 E | Aufstieg möglich = Ja }}'
46         wikicode = mwparserfromhell.parse(wikitext)
47         template = list(wikicode.filter_templates())[0]
48         self.assertEqual(template.name.strip(), 'Rodelbahnbox')
49         self.assertEqual(template.params[0].strip(), 'Unbenannt')
50         self.assertEqual(template.params[1].name.strip(), 'Position')
51         self.assertEqual(template.params[1].value.strip(), '47.309820 N 9.986508 E')
52         self.assertEqual(template.params[2].name.strip(), 'Aufstieg möglich')
53         self.assertEqual(template.params[2].value.strip(), 'Ja')
54
55         template = mwparserfromhell.nodes.template.Template('Rodelbahnbox')
56         template.add(1, 'Unbenannt')
57         template.add('Position', '47.309820 N 9.986508 E')
58         template.add('Aufstieg möglich', 'Ja')
59         self.assertEqual(template, '{{Rodelbahnbox|Unbenannt|Position=47.309820 N 9.986508 E|Aufstieg möglich=Ja}}')
60
61         wrpylib.mwmarkup.format_template_table(template)
62         self.assertEqual(template,
63             '{{Rodelbahnbox\n' +
64             '| Unbenannt\n' +
65             '| Position         = 47.309820 N 9.986508 E\n' +
66             '| Aufstieg möglich = Ja\n' +
67             '}}')
68
69         wrpylib.mwmarkup.format_template_table(template, 18)
70         self.assertEqual(template,
71             '{{Rodelbahnbox\n' +
72             '| Unbenannt\n' +
73             '| Position           = 47.309820 N 9.986508 E\n' +
74             '| Aufstieg möglich   = Ja\n' +
75             '}}')
76
77     def test_split_template(self):
78         wikitext = '''== Allgemeines ==
79         {{Rodelbahnbox
80         | Position             = 47.309820 N 9.986508 E
81         | Position oben        =
82         | Höhe oben            = 1244
83         | Position unten       =
84         | Höhe unten           = 806
85         | Länge                = 5045
86         | Schwierigkeit        =
87         | Lawinen              = gelegentlich
88         | Betreiber            =
89         | Öffentliche Anreise  = Ja
90         | Gehzeit              = 105
91         | Aufstieg getrennt    = Nein
92         | Aufstiegshilfe       = Nein
93         | Beleuchtungsanlage   = Nein
94         | Beleuchtungstage     =
95         | Rodelverleih         = Ja
96         | Gütesiegel           =
97         | Webauskunft          =
98         | Telefonauskunft      = +43-664-1808482 (Bergkristallhütte)
99         | Bild                 = Rodelbahn Bergkristallhütte 2009-03-03.jpg
100         | In Übersichtskarte   = Ja
101         | Forumid              = 72
102         }}
103         Die Rodelbahn zur Bergkristallhütte ist durchaus abwechslungsreich.'''
104         wikicode = mwparserfromhell.parse(wikitext)
105         template = wikicode.filter_templates(matches='Rodelbahnbox')[0]
106         self.assertEqual(template.name.strip(), 'Rodelbahnbox')
107         self.assertEqual(len(template.params), 22)
108         self.assertEqual(template.get('Position').value.strip(), '47.309820 N 9.986508 E')
109         self.assertEqual(template.get('Telefonauskunft').value.strip(), '+43-664-1808482 (Bergkristallhütte)')
110         self.assertEqual(template.get('Schwierigkeit').value.strip(), '')
111
112     def test_create_template(self):
113         template = mwparserfromhell.nodes.template.Template('Rodelbahnbox')
114         template.add(1, 'Unbenannt')
115         template.add('Position', '47.309820 N 9.986508 E')
116         template.add('Aufstieg möglich', 'Ja')
117         self.assertEqual(template, '{{Rodelbahnbox|Unbenannt|Position=47.309820 N 9.986508 E|Aufstieg möglich=Ja}}')
118
119         wrpylib.mwmarkup.format_template_table(template)
120         self.assertEqual(template,
121             '{{Rodelbahnbox\n' +
122             '| Unbenannt\n' +
123             '| Position         = 47.309820 N 9.986508 E\n' +
124             '| Aufstieg möglich = Ja\n' +
125             '}}')
126
127     def test_find_tag(self):
128         wikitext = 'This is <tag>my first tag</tag> and <tag>my second tag</tag>.'
129         wikicode = mwparserfromhell.parse(wikitext)
130         tag_iter = wikicode.ifilter_tags()
131         tag = next(tag_iter)
132         self.assertEqual(tag.tag.strip(), 'tag')
133         self.assertEqual(tag.contents.strip(), 'my first tag')
134         tag = next(tag_iter)
135         self.assertEqual(tag.tag.strip(), 'tag')
136         self.assertEqual(tag.contents.strip(), 'my second tag')
137
138         wikitext = 'This is <tag myattrib="4"/>.'
139         wikicode = mwparserfromhell.parse(wikitext)
140         tag = next(wikicode.ifilter_tags())
141         self.assertEqual('tag', tag.tag)
142
143
144 class TestFormatTemplate(unittest.TestCase):
145     def test_format_template_oneline(self):
146         value = mwparserfromhell.parse('{{ my_template ||   | var = 7 }}').filter_templates()[0]
147         wrpylib.mwmarkup.format_template_oneline(value)
148         self.assertEqual('{{my_template| | |var=7}}', value)
149
150
151 class TestMwApi(unittest.TestCase):
152     def test_dbkey_to_title(self):
153         self.assertEqual(wrpylib.mwmarkup.dbkey_to_title('My_Title'), 'My Title')
154         self.assertEqual(wrpylib.mwmarkup.dbkey_to_title('My Title'), 'My Title') # should not happen
155         self.assertEqual(wrpylib.mwmarkup.dbkey_to_title('My_nice_Title'), 'My nice Title')