b12962b4fe22cbef6c570d7b674393b2825f4599
[philipp/winterrodeln/wrpylib.git] / tests / test_wrvalidators.py
1 #!/usr/bin/python3.4
2 # -*- coding: iso-8859-15 -*-
3 import collections
4 import wrpylib.wrvalidators
5 import formencode
6 import unittest
7 from wrpylib.wrvalidators import *
8
9
10 class TestConverter(unittest.TestCase):
11     def test_from_str(self):
12         self.assertEqual(Converter.from_str('abc'), 'abc')
13         self.assertEqual(Converter.from_str(''), '')
14
15     def test_to_str(self):
16         self.assertEqual(Converter.to_str('abc'), 'abc')
17         self.assertEqual(Converter.to_str(''), '')
18         self.assertEqual(Converter.to_str(42), '42')
19
20
21 class TestInt(unittest.TestCase):
22     def test_from_str(self):
23         self.assertEqual(int_from_str('42'), 42)
24         self.assertEqual(int_from_str('+42'), 42)
25         self.assertEqual(int_from_str('-20'), -20)
26         self.assertEqual(int_from_str('0', min=0), 0)
27         self.assertEqual(int_from_str('10', max=10), 10)
28         with self.assertRaises(ValueError):
29             int_from_str('abc')
30         with self.assertRaises(ValueError):
31             int_from_str('')
32         with self.assertRaises(ValueError):
33             int_from_str('-1', min=0)
34         with self.assertRaises(ValueError):
35             int_from_str('11', max=10)
36         with self.assertRaises(ValueError):
37             int_from_str('10.0')
38         with self.assertRaises(ValueError):
39             int_from_str('0d')
40
41     def test_to_str(self):
42         self.assertEqual(int_to_str(20), '20')
43         self.assertEqual(int_to_str(-20), '-20')
44         self.assertEqual(int_to_str(0), '0')
45
46
47 class TestOptInt(unittest.TestCase):
48     def test_from_str(self):
49         self.assertEqual(opt_int_from_str('42'), 42)
50         self.assertEqual(opt_int_from_str('+42'), 42)
51         self.assertEqual(opt_int_from_str('-20'), -20)
52         self.assertEqual(opt_int_from_str(''), None)
53         with self.assertRaises(ValueError):
54             opt_int_from_str('abc')
55         with self.assertRaises(ValueError):
56             opt_int_from_str('10.0')
57         with self.assertRaises(ValueError):
58             opt_int_from_str('0d')
59
60     def test_to_str(self):
61         self.assertEqual(opt_int_to_str(20), '20')
62         self.assertEqual(opt_int_to_str(-20), '-20')
63         self.assertEqual(opt_int_to_str(0), '0')
64         self.assertEqual(opt_int_to_str(None), '')
65
66
67 class TestEnumConverter(unittest.TestCase):
68     def test_from_str(self):
69         self.assertEqual(enum_from_str(''), [])
70         self.assertEqual(enum_from_str('abc'), ['abc'])
71         self.assertEqual(enum_from_str('abc; def'), ['abc', 'def'])
72         self.assertEqual(enum_from_str('abc; def;ghi'), ['abc', 'def', 'ghi'])
73
74     def test_to_str(self):
75         self.assertEqual(enum_to_str(['abc', 'def', 'ghi']), 'abc; def; ghi')
76         self.assertEqual(enum_to_str(['abc']), 'abc')
77         self.assertEqual(enum_to_str(['']), '')
78         self.assertEqual(enum_to_str([]), '')
79
80
81 class TestDateTime(unittest.TestCase):
82     def test_from_str(self):
83         self.assertEqual(DateTime.from_str('2015-12-31 23:07:42'), datetime.datetime(2015, 12, 31, 23, 7, 42))
84
85     def test_to_str(self):
86         self.assertEqual(DateTime.to_str(datetime.datetime(2015, 12, 31, 23, 7, 42)), '2015-12-31 23:07:42')
87
88
89 class TestDifficultyGerman(unittest.TestCase):
90     def test_from_str(self):
91         self.assertEqual(difficulty_german_from_str('leicht'), 1)
92         self.assertEqual(difficulty_german_from_str('mittel'), 2)
93         with self.assertRaises(ValueError):
94             difficulty_german_from_str('dontknow')
95         with self.assertRaises(ValueError):
96             difficulty_german_from_str('')
97
98     def test_to_str(self):
99         self.assertEqual(difficulty_german_to_str(1), 'leicht')
100
101
102 class TestTristateGerman(unittest.TestCase):
103     def test_from_str(self):
104         self.assertEqual(tristate_german_from_str('Ja'), 1.0)
105         self.assertEqual(tristate_german_from_str('Teilweise'), 0.5)
106         self.assertEqual(tristate_german_from_str('Nein'), 0)
107         with self.assertRaises(ValueError):
108             tristate_german_from_str('')
109         with self.assertRaises(ValueError):
110             tristate_german_from_str('Vielleicht')
111
112     def test_to_str(self):
113         self.assertEqual(tristate_german_to_str(1.0), 'Ja')
114         self.assertEqual(tristate_german_to_str(0.5), 'Teilweise')
115         self.assertEqual(tristate_german_to_str(0.0), 'Nein')
116
117
118 class TestOptTristateGerman(unittest.TestCase):
119     def test_from_str(self):
120         self.assertEqual(opt_tristate_german_from_str('Ja'), 1.0)
121         self.assertEqual(opt_tristate_german_from_str('Teilweise'), 0.5)
122         self.assertEqual(opt_tristate_german_from_str('Nein'), 0)
123         self.assertEqual(opt_tristate_german_from_str(''), None)
124         with self.assertRaises(ValueError):
125             opt_tristate_german_from_str('Vielleicht')
126
127     def test_to_str(self):
128         self.assertEqual(opt_tristate_german_to_str(1.0), 'Ja')
129         self.assertEqual(opt_tristate_german_to_str(0.5), 'Teilweise')
130         self.assertEqual(opt_tristate_german_to_str(0.0), 'Nein')
131         self.assertEqual(opt_tristate_german_to_str(None), '')
132
133
134 class TestOptTristateGermanComment(unittest.TestCase):
135     def test_from_str(self):
136         self.assertEqual(opt_tristate_german_comment_from_str('Ja'), (1.0, None))
137         self.assertEqual(opt_tristate_german_comment_from_str('Teilweise'), (0.5, None))
138         self.assertEqual(opt_tristate_german_comment_from_str('Nein'), (0, None))
139         self.assertEqual(opt_tristate_german_comment_from_str('Teilweise (nur ganz oben nicht)'), (0.5, 'nur ganz oben nicht'))
140         self.assertEqual(opt_tristate_german_comment_from_str(''), (None, None))
141         with self.assertRaises(ValueError):
142             opt_tristate_german_from_str('Vielleicht')
143         with self.assertRaises(ValueError):
144             opt_tristate_german_from_str('(Ja)')
145
146     def test_to_str(self):
147         self.assertEqual(opt_tristate_german_comment_to_str((1.0, None)), 'Ja')
148         self.assertEqual(opt_tristate_german_comment_to_str((0.5, None)), 'Teilweise')
149         self.assertEqual(opt_tristate_german_comment_to_str((0.0, None)), 'Nein')
150         self.assertEqual(opt_tristate_german_comment_to_str((None, None)), '')
151
152
153 class TestLonLat(unittest.TestCase):
154     def test_from_str(self):
155         self.assertEqual(lonlat_from_str('47.076207 N 11.453553 E'), LonLat(11.453553, 47.076207))
156         with self.assertRaises(ValueError):
157             lonlat_from_str('47.076207 N 11.453553')
158
159     def test_to_str(self):
160         self.assertEqual(lonlat_to_str(LonLat(11.453553, 47.076207)), '47.076207 N 11.453553 E')
161
162
163 class TestValueCommentConverter(unittest.TestCase):
164     def test_from_str(self):
165         self.assertEqual(value_comment_from_str('abc (defg)'), ('abc', 'defg'))
166         self.assertEqual(value_comment_from_str('abc ()'), ('abc', ''))
167         self.assertEqual(value_comment_from_str('(def)'), ('', 'def'))
168         self.assertEqual(value_comment_from_str('ab((cd))'), ('ab', '(cd)'))
169         self.assertEqual(value_comment_from_str('ab((c(d)[(])))'), ('ab', '(c(d)[(]))'))
170         self.assertEqual(value_comment_from_str('ab((cd)'), ('ab(', 'cd'))
171         self.assertEqual(value_comment_from_str('abcd  (ef) '), ('abcd', 'ef'))
172         self.assertEqual(value_comment_from_str('abc', comment_optional=True), ('abc', ''))
173         with self.assertRaises(ValueError):
174             value_comment_from_str('abc (')
175         with self.assertRaises(ValueError):
176             value_comment_from_str('abc )')
177         with self.assertRaises(ValueError):
178             value_comment_from_str('abc (def)g')
179         with self.assertRaises(ValueError):
180             value_comment_from_str('abc (b))')
181         with self.assertRaises(ValueError):
182             value_comment_from_str('abc')
183
184     def test_to_str(self):
185         self.assertEqual(value_comment_to_str(('abc', 'defg')), 'abc (defg)')
186         self.assertEqual(value_comment_to_str(('abc', '')), 'abc ()')
187         self.assertEqual(value_comment_to_str(('', 'def')), '(def)')
188         self.assertEqual(value_comment_to_str(('ab', '(cd)')), 'ab ((cd))')
189         self.assertEqual(value_comment_to_str(('ab', '(c(d)[(]))')), 'ab ((c(d)[(])))')
190         self.assertEqual(value_comment_to_str(('ab(', 'cd')), 'ab( (cd)')
191         self.assertEqual(value_comment_to_str(('abcd', 'ef')), 'abcd (ef)')
192         self.assertEqual(value_comment_to_str(('abc', ''), comment_optional=True), 'abc')
193
194
195 class TestNoGermanConverter(unittest.TestCase):
196     def test_from_str(self):
197         self.assertEqual(no_german_from_str('abc'), (True, 'abc'))
198         self.assertEqual(no_german_from_str('Nein'), (False, None))
199         with self.assertRaises(ValueError):
200             no_german_from_str('')
201
202     def test_to_str(self):
203         self.assertEqual(no_german_to_str((True, 'abc')), 'abc')
204         self.assertEqual(no_german_to_str((False, None)), 'Nein')
205
206
207 class TestOptNoGerman(unittest.TestCase):
208     def test_from_str(self):
209         self.assertEqual(opt_no_german_from_str('abc'), (True, 'abc'))
210         self.assertEqual(opt_no_german_from_str('Nein'), (False, None))
211         self.assertEqual(opt_no_german_from_str(''), (None, None))
212
213     def test_to_str(self):
214         self.assertEqual(opt_no_german_to_str((True, 'abc')), 'abc')
215         self.assertEqual(opt_no_german_to_str((False, None)), 'Nein')
216         self.assertEqual(opt_no_german_to_str((None, None)), '')
217
218
219 class TestLiftGermanValidator(unittest.TestCase):
220     def test_from_str(self):
221         self.assertEqual(lift_german_from_str(''), None)
222         self.assertEqual(lift_german_from_str('Nein'), [])
223         self.assertEqual(lift_german_from_str('Sessellift'), [('Sessellift', None)])
224         self.assertEqual(lift_german_from_str('Gondel (nur bis zur Hälfte)'), [('Gondel', 'nur bis zur Hälfte')])
225         self.assertEqual(lift_german_from_str('Sessellift; Taxi'), [('Sessellift', None), ('Taxi', None)])
226         self.assertEqual(lift_german_from_str('Sessellift (Wochenende); Taxi (6 Euro)'), [('Sessellift', 'Wochenende'), ('Taxi', '6 Euro')])
227
228     def test_to_str(self):
229         self.assertEqual(lift_german_to_str(None), '')
230         self.assertEqual(lift_german_to_str([]), 'Nein')
231         self.assertEqual(lift_german_to_str([('Sessellift', None)]), 'Sessellift')
232         self.assertEqual(lift_german_to_str([('Gondel', 'nur bis zur Hälfte')]), 'Gondel (nur bis zur Hälfte)')
233         self.assertEqual(lift_german_to_str([('Sessellift', None), ('Taxi', None)]), 'Sessellift; Taxi')
234         self.assertEqual(lift_german_to_str([('Sessellift', 'Wochenende'), ('Taxi', '6 Euro')]), 'Sessellift (Wochenende); Taxi (6 Euro)')
235
236
237 class TestNightLightDays(unittest.TestCase):
238     def test_from_str(self):
239         self.assertEqual(nightlightdays_from_str(''), (None, None))
240         self.assertEqual(nightlightdays_from_str('2 (Mo, Di)'), (2, 'Mo, Di'))
241         self.assertEqual(nightlightdays_from_str('7'), (7, None))
242         self.assertEqual(nightlightdays_from_str('0'), (0, None))
243         self.assertEqual(nightlightdays_from_str('(keine Ahnung)'), (None, 'keine Ahnung'))
244         with self.assertRaises(ValueError):
245             nightlightdays_from_str('8')
246         with self.assertRaises(ValueError):
247             nightlightdays_from_str('5 (Montag')
248         with self.assertRaises(ValueError):
249             nightlightdays_from_str('5.2')
250
251     def test_to_str(self):
252         self.assertEqual(nightlightdays_to_str((None, None)), '')
253         self.assertEqual(nightlightdays_to_str((2, 'Mo, Di')), '2 (Mo, Di)')
254         self.assertEqual(nightlightdays_to_str((7, None)), '7')
255         self.assertEqual(nightlightdays_to_str((0, None)), '0')
256
257
258 class TestSledRental(unittest.TestCase):
259     def test_from_str(self):
260         self.assertEqual(sledrental_from_str(''), None)
261         self.assertEqual(sledrental_from_str('Nein'), [])
262         self.assertEqual(sledrental_from_str('Talstation'), [('Talstation', None)])
263         self.assertEqual(sledrental_from_str('Talstation (unten)'), [('Talstation', 'unten')])
264         self.assertEqual(sledrental_from_str('Talstation (unten); Mittelstation'), [('Talstation', 'unten'), ('Mittelstation', None)])
265         with self.assertRaises(ValueError):
266             sledrental_from_str('(unten)')
267         with self.assertRaises(ValueError):
268             sledrental_from_str('Talstation (unten); ; Mittelstation')
269
270     def test_to_str(self):
271         self.assertEqual(sledrental_to_str(None), '')
272         self.assertEqual(sledrental_to_str([]), 'Nein')
273         self.assertEqual(sledrental_to_str([('Talstation', None)]), 'Talstation')
274         self.assertEqual(sledrental_to_str([('Talstation', 'unten')]), 'Talstation (unten)')
275         self.assertEqual(sledrental_to_str([('Talstation', 'unten'), ('Mittelstation', None)]), 'Talstation (unten); Mittelstation')
276
277
278 class TestSingleCachet(unittest.TestCase):
279     def test_from_str(self):
280         self.assertEqual(single_cachet_german_from_str('Tiroler Naturrodelbahn-Gütesiegel 2009 mittel'), ('Tiroler Naturrodelbahn-Gütesiegel', '2009', 'mittel'))
281         self.assertEqual(single_cachet_german_from_str('Tiroler Naturrodelbahn-Gütesiegel 2013 schwer'), ('Tiroler Naturrodelbahn-Gütesiegel', '2013', 'schwer'))
282         with self.assertRaises(ValueError):
283             single_cachet_german_from_str('')
284         with self.assertRaises(ValueError):
285             single_cachet_german_from_str('Salzburger Naturrodelbahn-Gütesiegel 2013 schwer')
286         with self.assertRaises(ValueError):
287             single_cachet_german_from_str('Tiroler Naturrodelbahn-Gütesiegel 4013 schwer')
288         with self.assertRaises(ValueError):
289             single_cachet_german_from_str('Tiroler Naturrodelbahn-Gütesiegel 13 schwer')
290         with self.assertRaises(ValueError):
291             single_cachet_german_from_str('Tiroler Naturrodelbahn-Gütesiegel 2013 schwerer')
292
293     def test_to_str(self):
294         self.assertEqual(single_cachet_german_to_str(('Tiroler Naturrodelbahn-Gütesiegel', '2009', 'mittel')), 'Tiroler Naturrodelbahn-Gütesiegel 2009 mittel')
295         self.assertEqual(single_cachet_german_to_str(('Tiroler Naturrodelbahn-Gütesiegel', '2013', 'schwer')), 'Tiroler Naturrodelbahn-Gütesiegel 2013 schwer')
296
297
298 class TestCachetGerman(unittest.TestCase):
299     def test_from_str(self):
300         self.assertEqual(cachet_german_from_str(''), None)
301         self.assertEqual(cachet_german_from_str('Nein'), [])
302         self.assertEqual(cachet_german_from_str('Tiroler Naturrodelbahn-Gütesiegel 2009 mittel'), [('Tiroler Naturrodelbahn-Gütesiegel', '2009', 'mittel')])
303         self.assertEqual(cachet_german_from_str('Tiroler Naturrodelbahn-Gütesiegel 2013 schwer; Tiroler Naturrodelbahn-Gütesiegel 2009 mittel'),
304             [('Tiroler Naturrodelbahn-Gütesiegel', '2013', 'schwer'), ('Tiroler Naturrodelbahn-Gütesiegel', '2009', 'mittel')])
305         with self.assertRaises(ValueError):
306             cachet_german_from_str('Ja')
307         with self.assertRaises(ValueError):
308             cachet_german_from_str('Tiroler Naturrodelbahn-Gütesiegel 2013 schwer Tiroler Naturrodelbahn-Gütesiegel 2009 mittel')
309
310     def test_to_str(self):
311         self.assertEqual(cachet_german_to_str(None), '')
312         self.assertEqual(cachet_german_to_str([]), 'Nein')
313         self.assertEqual(cachet_german_to_str([('Tiroler Naturrodelbahn-Gütesiegel', '2009', 'mittel')]), 'Tiroler Naturrodelbahn-Gütesiegel 2009 mittel')
314         self.assertEqual(cachet_german_to_str([('Tiroler Naturrodelbahn-Gütesiegel', '2013', 'schwer'), ('Tiroler Naturrodelbahn-Gütesiegel', '2009', 'mittel')]),
315             'Tiroler Naturrodelbahn-Gütesiegel 2013 schwer; Tiroler Naturrodelbahn-Gütesiegel 2009 mittel')
316
317
318 class TestUrl(unittest.TestCase):
319     def test_from_str(self):
320         self.assertEqual(url_from_str('http://www.winterrodeln.org/wiki/Arzler_Alm/'), 'http://www.winterrodeln.org/wiki/Arzler_Alm/')
321         self.assertEqual(url_from_str('http://www.winterrodeln.org/wiki/Nösslachhütte/'), 'http://www.winterrodeln.org/wiki/Nösslachhütte/')
322         self.assertEqual(url_from_str('https://www.winterrodeln.org/wiki/Nösslachhütte/'), 'https://www.winterrodeln.org/wiki/Nösslachhütte/')
323         with self.assertRaises(ValueError):
324             url_from_str('mailto:office@example.com')
325         with self.assertRaises(ValueError):
326             url_from_str('/wiki/Arzler_Alm/')
327
328     def test_to_str(self):
329         self.assertEqual(url_to_str('http://www.winterrodeln.org/wiki/Arzler_Alm/'), 'http://www.winterrodeln.org/wiki/Arzler_Alm/')
330         self.assertEqual(url_to_str('http://www.winterrodeln.org/wiki/Nösslachhütte/'), 'http://www.winterrodeln.org/wiki/Nösslachhütte/')
331         self.assertEqual(url_to_str('https://www.winterrodeln.org/wiki/Nösslachhütte/'), 'https://www.winterrodeln.org/wiki/Nösslachhütte/')
332
333
334 class TestWebauskunft(unittest.TestCase):
335     def test_from_str(self):
336         self.assertEqual(webauskunft_from_str('http://www.example.com/current'), (True, 'http://www.example.com/current'))
337         self.assertEqual(webauskunft_from_str(''), (None, None))
338         self.assertEqual(webauskunft_from_str('Nein'), (False, None))
339
340     def test_to_str(self):
341         self.assertEqual(webauskunft_to_str((True, 'http://www.example.com/current')), 'http://www.example.com/current')
342         self.assertEqual(webauskunft_to_str((None, None)), '')
343         self.assertEqual(webauskunft_to_str((False, None)), 'Nein')
344
345
346 class TestPhoneNumber(unittest.TestCase):
347     def test_from_str(self):
348         self.assertEqual(phone_number_from_str('+43-699-123456789'), '+43-699-123456789')
349         self.assertEqual(phone_number_from_str('+43-69945'), '+43-69945')
350         self.assertEqual(phone_number_from_str('+43-512-507-6418'), '+43-512-507-6418')
351         with self.assertRaises(ValueError):
352             phone_number_from_str('+43-')
353         with self.assertRaises(ValueError):
354             phone_number_from_str('0512123456789')
355
356     def test_to_str(self):
357         self.assertEqual(phone_number_to_str('+43-699-123456789'), '+43-699-123456789')
358         self.assertEqual(phone_number_to_str('+43-69945'), '+43-69945')
359         self.assertEqual(phone_number_to_str('+43-512-507-6418'), '+43-512-507-6418')
360
361
362 class TestTelefonauskunft(unittest.TestCase):
363     def test_from_str(self):
364         self.assertEqual(telefonauskunft_from_str(''), None)
365         self.assertEqual(telefonauskunft_from_str('Nein'), [])
366         self.assertEqual(telefonauskunft_from_str('+43-512-123456 (untertags)'), [('+43-512-123456', 'untertags')])
367         self.assertEqual(telefonauskunft_from_str('+43-512-1234 (untertags); +43-664-123456 (Alm)'), [('+43-512-1234', 'untertags'), ('+43-664-123456', 'Alm')])
368         with self.assertRaises(ValueError):
369             telefonauskunft_from_str('+43-512-123456+ (untertags)')
370         with self.assertRaises(ValueError):
371             telefonauskunft_from_str('+43-512-123456')
372
373     def test_to_str(self):
374         self.assertEqual(telefonauskunft_to_str(None), '')
375         self.assertEqual(telefonauskunft_to_str([]), 'Nein')
376         self.assertEqual(telefonauskunft_to_str([('+43-512-123456', 'untertags')]), '+43-512-123456 (untertags)')
377         self.assertEqual(telefonauskunft_to_str([('+43-512-1234', 'untertags'), ('+43-664-123456', 'Alm')]), '+43-512-1234 (untertags); +43-664-123456 (Alm)')
378
379
380 class TestEmail(unittest.TestCase):
381     def setUp(self):
382         self.good_addresses = ['office@example.com', 'winter+rodeln@localhost', 'joe.doe@exämple.com']
383         self.bad_addresses = ['öffice@example.com', 'winter rodeln@localhost', 'www.winterrodeln.org', 'mailto:info@example.com', 'info@example.com.']
384
385     def test_from_str(self):
386         for value in self.good_addresses:
387             self.assertEqual(value, email_from_str(value))
388         for value in self.bad_addresses:
389             with self.assertRaises(ValueError):
390                 email_from_str(value)
391                 print(value)
392
393     def test_to_str(self):
394         for value in self.good_addresses:
395             self.assertEqual(value, email_from_str(value))
396
397
398
399 class TestBox(unittest.TestCase):
400     def test_from_str(self):
401         value = '{{MyTemplate|apple=2|banana=5}}'
402         converter_dict = OrderedDict([('apple', opt_int_converter), ('banana', opt_int_converter)])
403         result = box_from_str(value, 'MyTemplate', converter_dict)
404         self.assertEqual(result['apple'], 2)
405         self.assertEqual(result['banana'], 5)
406
407         value = '{{MyTemplate\n | apple = 2 \n| banana = 5 }}'
408         result = box_from_str(value, 'MyTemplate', converter_dict)
409         self.assertEqual(result['apple'], 2)
410         self.assertEqual(result['banana'], 5)
411
412         with self.assertRaises(ValueError):
413             box_from_str(value, 'myTemplate', converter_dict)
414         with self.assertRaises(ValueError):
415             value = '{{MyTemplate|apple=2|banana=five}}'
416             box_from_str(value, 'MyTemplate', converter_dict)
417         with self.assertRaises(ValueError):
418             value = '{{MyTemplate|apple=2}}'
419             box_from_str(value, 'MyTemplate', converter_dict)
420         with self.assertRaises(ValueError):
421             value = '{{MyTemplate|apple=2|banana=5|cherry=6}}'
422             box_from_str(value, 'MyTemplate', converter_dict)
423
424     def test_to_str(self):
425         value = OrderedDict([('apple', 2), ('banana', 5)])
426         converter_dict = OrderedDict([('apple', opt_int_converter), ('banana', opt_int_converter)])
427         result = box_to_str(value, 'MyTemplate', converter_dict)
428         self.assertEqual(result, '{{MyTemplate|apple=2|banana=5}}')
429
430
431 class TestRodelbahnbox(unittest.TestCase):
432     def setUp(self):
433         self.maxDiff = None
434         self.value = \
435 '''{{Rodelbahnbox
436 | Position             = 46.807218 N 12.806522 E
437 | Position oben        = 46.799014 N 12.818658 E
438 | Höhe oben            = 1046
439 | Position unten       =
440 | Höhe unten           =
441 | Länge                = 3500
442 | Schwierigkeit        = mittel
443 | Lawinen              = kaum
444 | Betreiber            = Bringungsgemeinschaft Kreithof-Dolomitenhütte
445 | Öffentliche Anreise  = Schlecht
446 | Aufstieg möglich     = Ja
447 | Aufstieg getrennt    = Teilweise
448 | Gehzeit              = 75
449 | Aufstiegshilfe       = Taxi; Sonstige (PKW bis Kreithof)
450 | Beleuchtungsanlage   = Ja
451 | Beleuchtungstage     = 7
452 | Rodelverleih         = Nein
453 | Gütesiegel           = Tiroler Naturrodelbahn-Gütesiegel 2009 mittel
454 | Webauskunft          = http://www.lienzerdolomiten.info/at/tobogorpt.html
455 | Telefonauskunft      = +43-664-2253782 (Dolomitenhütte)
456 | Bild                 = Dolomitenrodelbahn Tristach 2011-12-22 oberer Bereich.jpg
457 | In Übersichtskarte   = Ja
458 | Forumid              = 139
459 }}'''
460
461     def test_from_str(self):
462         value = rodelbahnbox_from_str(self.value)
463         self.assertEqual(value['Position'], LonLat(12.806522, 46.807218))
464         self.assertEqual(value['Position oben'], LonLat(12.818658, 46.799014))
465         self.assertEqual(value['Höhe oben'], 1046)
466         self.assertEqual(value['Position unten'], LonLat(None, None))
467         self.assertEqual(value['Höhe unten'], None)
468         self.assertEqual(value['Länge'], 3500)
469         self.assertEqual(value['Schwierigkeit'], 2)
470         self.assertEqual(value['Lawinen'], 1)
471         self.assertEqual(value['Betreiber'], 'Bringungsgemeinschaft Kreithof-Dolomitenhütte')
472         self.assertEqual(value['Öffentliche Anreise'], 4)
473         self.assertEqual(value['Aufstieg möglich'], True)
474         self.assertEqual(value['Aufstieg getrennt'], (0.5, None))
475         self.assertEqual(value['Gehzeit'], 75)
476         self.assertEqual(value['Aufstiegshilfe'], [('Taxi', None), ('Sonstige', 'PKW bis Kreithof')])
477         self.assertEqual(value['Beleuchtungsanlage'], (1.0, None))
478         self.assertEqual(value['Beleuchtungstage'], (7, None))
479         self.assertEqual(value['Rodelverleih'], [])
480         self.assertEqual(value['Gütesiegel'], [('Tiroler Naturrodelbahn-Gütesiegel', '2009', 'mittel')])
481         self.assertEqual(value['Webauskunft'], (True, 'http://www.lienzerdolomiten.info/at/tobogorpt.html'))
482         self.assertEqual(value['Telefonauskunft'], [('+43-664-2253782', 'Dolomitenhütte')])
483         self.assertEqual(value['Bild'], 'Dolomitenrodelbahn Tristach 2011-12-22 oberer Bereich.jpg')
484         self.assertEqual(value['In Übersichtskarte'], True)
485         self.assertEqual(value['Forumid'], 139)
486
487     def test_to_str(self):
488         value = OrderedDict([
489             ('Position', LonLat(12.806522, 46.807218)),
490             ('Position oben', LonLat(12.818658, 46.799014)),
491             ('Höhe oben', 1046),
492             ('Position unten', LonLat(None, None)),
493             ('Höhe unten', None),
494             ('Länge', 3500),
495             ('Schwierigkeit', 2),
496             ('Lawinen', 1),
497             ('Betreiber', 'Bringungsgemeinschaft Kreithof-Dolomitenhütte'),
498             ('Öffentliche Anreise', 4),
499             ('Aufstieg möglich', True),
500             ('Aufstieg getrennt', (0.5, None)),
501             ('Gehzeit', 75),
502             ('Aufstiegshilfe', [('Taxi', None), ('Sonstige', 'PKW bis Kreithof')]),
503             ('Beleuchtungsanlage', (1.0, None)),
504             ('Beleuchtungstage', (7, None)),
505             ('Rodelverleih', []),
506             ('Gütesiegel', [('Tiroler Naturrodelbahn-Gütesiegel', '2009', 'mittel')]),
507             ('Webauskunft', (True, 'http://www.lienzerdolomiten.info/at/tobogorpt.html')),
508             ('Telefonauskunft', [('+43-664-2253782', 'Dolomitenhütte')]),
509             ('Bild', 'Dolomitenrodelbahn Tristach 2011-12-22 oberer Bereich.jpg'),
510             ('In Übersichtskarte', True),
511             ('Forumid', 139)])
512         self.assertEqual(rodelbahnbox_to_str(value), self.value)
513
514
515 class TestWrValidators(unittest.TestCase):
516     def test_ValueCommentListNeinLoopNone(self):
517         v = wrpylib.wrvalidators.ValueCommentListNeinLoopNone()
518         assert v.to_python('') == None
519         assert v.to_python('Nein') == 'Nein'
520         assert v.to_python('T-Mobile (gut); A1') == 'T-Mobile (gut); A1'
521         assert v.from_python(None) == ''
522         assert v.from_python('Nein') == 'Nein'
523         assert v.from_python('T-Mobile (gut); A1') == 'T-Mobile (gut); A1'
524
525
526     def test_PhoneCommentListNeinLoopNone(self):
527         v = wrpylib.wrvalidators.PhoneCommentListNeinLoopNone(comments_are_optional=True)
528         assert v.to_python('') == None
529         assert v.to_python('Nein') == 'Nein'
530         assert v.to_python('+43-699-1234567 (nicht nach 20:00 Uhr); +43-512-123456') == '+43-699-1234567 (nicht nach 20:00 Uhr); +43-512-123456'
531         assert v.from_python(None) == ''
532         assert v.from_python('Nein') == 'Nein'
533         assert v.from_python('+43-699-1234567 (nicht nach 20:00 Uhr); +43-512-123456') == '+43-699-1234567 (nicht nach 20:00 Uhr); +43-512-123456'
534
535
536     def test_MaskedEmail(self):
537         v = wrpylib.wrvalidators.MaskedEmail()
538         assert v.to_python('') == (None, None)
539         assert v.to_python('abc.def@example.com') == ('abc.def@example.com', False)
540         assert v.to_python('abc.def(at)example.com') == ('abc.def@example.com', True)
541         assert v.from_python((None, None)) == ''
542         assert v.from_python(('abc.def@example.com', False)) == 'abc.def@example.com'
543         assert v.from_python(('abc.def@example.com', True)) == 'abc.def(at)example.com'
544
545
546     def test_EmailCommentListNeinLoopNone(self):
547         v = wrpylib.wrvalidators.EmailCommentListNeinLoopNone()
548         assert v.to_python('') == None
549         assert v.to_python('Nein') == 'Nein'
550         assert v.to_python('first@example.com') == 'first@example.com'
551         assert v.to_python('first@example.com (Nur Winter); second@example.com') == 'first@example.com (Nur Winter); second@example.com'
552         assert v.from_python(None) == ''
553         assert v.from_python('Nein') == 'Nein'
554         assert v.from_python('first@example.com') == 'first@example.com'
555         assert v.from_python('first@example.com (Nur Winter); second@example.com') == 'first@example.com (Nur Winter); second@example.com'
556         testvalue = 'abc.def(at)example.com (comment)'
557         try:
558             v.to_python(testvalue)
559             assert False
560         except formencode.Invalid:
561             pass
562         try:
563             v.from_python(testvalue)
564             assert False
565         except formencode.Invalid:
566             pass
567         v = wrpylib.wrvalidators.EmailCommentListNeinLoopNone(allow_masked_email=True)
568         assert v.to_python(testvalue) == testvalue
569         assert v.from_python(testvalue) == testvalue
570
571
572     def test_WikiPageListLoopNone(self):
573         v = wrpylib.wrvalidators.WikiPageListLoopNone()
574         assert v.to_python('') == None
575         assert v.to_python('[[Birgitzer Alm]]; [[Kemater Alm]]') == '[[Birgitzer Alm]]; [[Kemater Alm]]'
576         assert v.from_python(None) == ''
577         assert v.from_python('[[Birgitzer Alm]]; [[Kemater Alm]]') == '[[Birgitzer Alm]]; [[Kemater Alm]]'
578
579
580     def test_GasthausboxDictValidator(self):
581         v = wrpylib.wrvalidators.GasthausboxDictValidator()
582         other = collections.OrderedDict([
583             ('Position', '47.295549 N 9.986970 E'),
584             ('Höhe', '1250'),
585             ('Betreiber', ''),
586             ('Sitzplätze', ''),
587             ('Übernachtung', ''),
588             ('Rauchfrei', 'Nein'),
589             ('Rodelverleih', ''),
590             ('Handyempfang', 'A1; T-Mobile/Telering'),
591             ('Homepage', 'http://www.bergkristallhuette.com/'),
592             ('E-Mail', 'bergkristallhuette@gmx.at'),
593             ('Telefon', '+43-664-1808482'),
594             ('Bild', 'Bergkritsallhütte 2009-02-07.JPG'),
595             ('Rodelbahnen', '[[Bergkristallhütte]]')])
596         python = v.to_python(other, None)
597         other2 = v.from_python(python, None)
598         assert other == other2