MoinMoin/_tests/test_wikiutil.py
author Thomas Waldmann <tw AT waldmann-edv DOT de>
Wed, 11 Feb 2009 02:34:33 +0100
changeset 4569 3caaa8c74c41
parent 4566 2eaf4b42b400
child 4607 d8e5e9cfadf1
permissions -rw-r--r--
wikiutil: replace moin's cgi/urllib wrappers by calls to werkzeug.utils code
tw-public@0
     1
# -*- coding: iso-8859-1 -*-
tw-public@0
     2
"""
tw-public@0
     3
    MoinMoin - MoinMoin.wikiutil Tests
tw-public@0
     4
tw@2454
     5
    @copyright: 2003-2004 by Juergen Hermann <jh@web.de>,
tw@2454
     6
                2007 by MoinMoin:ThomasWaldmann
tw-public@0
     7
    @license: GNU GPL, see COPYING for details.
tw-public@0
     8
"""
tw-public@0
     9
tw@2172
    10
import py
tw@2454
    11
florian@4199
    12
from MoinMoin import config, wikiutil
tw-public@0
    13
tw@4569
    14
from werkzeug.utils import MultiDict
tw@4569
    15
tw-public@0
    16
tw@2265
    17
class TestQueryStringSupport:
tw@2265
    18
    tests = [
tw@2265
    19
        ('', {}, {}),
tw@2265
    20
        ('key1=value1', {'key1': 'value1'}, {'key1': u'value1'}),
tw@2265
    21
        ('key1=value1&key2=value2', {'key1': 'value1', 'key2': 'value2'}, {'key1': u'value1', 'key2': u'value2'}),
tw@2265
    22
        ('rc_de=Aktuelle%C3%84nderungen', {'rc_de': 'Aktuelle\xc3\x84nderungen'}, {'rc_de': u'Aktuelle\xc4nderungen'}),
tw@2265
    23
    ]
tw@2265
    24
    def testParseQueryString(self):
tw@2265
    25
        for qstr, expected_str, expected_unicode in self.tests:
tw@4569
    26
            assert wikiutil.parseQueryString(qstr) == MultiDict(expected_unicode)
tw@4569
    27
            assert wikiutil.parseQueryString(unicode(qstr)) == MultiDict(expected_unicode)
tw@2265
    28
tw@2265
    29
    def testMakeQueryString(self):
tw@2265
    30
        for qstr, in_str, in_unicode in self.tests:
tw@4569
    31
            assert wikiutil.parseQueryString(wikiutil.makeQueryString(in_unicode)) == MultiDict(in_unicode)
tw@4569
    32
            assert wikiutil.parseQueryString(wikiutil.makeQueryString(in_str)) == MultiDict(in_unicode)
tw@2265
    33
tw@2267
    34
tw@2266
    35
class TestTickets:
tw@2266
    36
    def testTickets(self):
tw@2266
    37
        from MoinMoin.Page import Page
tw@2266
    38
        # page name with double quotes
tw@2266
    39
        self.request.page = Page(self.request, u'bla"bla')
tw@2266
    40
        ticket1 = wikiutil.createTicket(self.request)
tw@2266
    41
        assert wikiutil.checkTicket(self.request, ticket1)
tw@2266
    42
        # page name with non-ASCII chars
tw@2266
    43
        self.request.page = Page(self.request, u'\xc4rger')
tw@2266
    44
        ticket2 = wikiutil.createTicket(self.request)
tw@2266
    45
        assert wikiutil.checkTicket(self.request, ticket2)
tw@2266
    46
        # same page with another action
tw@2266
    47
        self.request.page = Page(self.request, u'\xc4rger')
tw@2266
    48
        self.request.action = 'another'
tw@2266
    49
        ticket3 = wikiutil.createTicket(self.request)
tw@2266
    50
        assert wikiutil.checkTicket(self.request, ticket3)
tw@2266
    51
tw@2266
    52
        assert ticket1 != ticket2
tw@2266
    53
        assert ticket2 != ticket3
tw@2266
    54
tw@2266
    55
tw@2267
    56
class TestCleanInput:
tw@2267
    57
    def testCleanInput(self):
tw@2267
    58
        tests = [(u"", u""), # empty
tw@2267
    59
                 (u"aaa\r\n\tbbb", u"aaa   bbb"), # ws chars -> blanks
tw@2267
    60
                 (u"aaa\x00\x01bbb", u"aaabbb"), # strip weird chars
tw@2267
    61
                 (u"a"*500, u""), # too long
tw@2267
    62
                ]
tw@2267
    63
        for instr, outstr in tests:
tw@2267
    64
            assert wikiutil.clean_input(instr) == outstr
tw@2267
    65
tw@2267
    66
tw@2267
    67
class TestInterWiki:
tw@2267
    68
    def testSplitWiki(self):
tw@2730
    69
        tests = [('SomePage', ('Self', 'SomePage')),
tw@2730
    70
                 ('OtherWiki:OtherPage', ('OtherWiki', 'OtherPage')),
tw@2730
    71
                 (':OtherPage', ('', 'OtherPage')),
tw@2730
    72
                 # broken ('/OtherPage', ('Self', '/OtherPage')),
tw@2730
    73
                 # wrong interpretation ('MainPage/OtherPage', ('Self', 'MainPage/OtherPage')),
tw@2267
    74
                ]
tw@2730
    75
        for markup, (wikiname, pagename) in tests:
tw@2730
    76
            assert wikiutil.split_wiki(markup) == (wikiname, pagename)
tw@2267
    77
tw@2267
    78
    def testJoinWiki(self):
tw@2267
    79
        tests = [(('http://example.org/', u'SomePage'), 'http://example.org/SomePage'),
tw@2267
    80
                 (('http://example.org/?page=$PAGE&action=show', u'SomePage'), 'http://example.org/?page=SomePage&action=show'),
tw@2267
    81
                 (('http://example.org/', u'Aktuelle\xc4nderungen'), 'http://example.org/Aktuelle%C3%84nderungen'),
tw@2267
    82
                 (('http://example.org/$PAGE/show', u'Aktuelle\xc4nderungen'), 'http://example.org/Aktuelle%C3%84nderungen/show'),
tw@2267
    83
                ]
tw@2267
    84
        for (baseurl, pagename), url in tests:
tw@2267
    85
            assert wikiutil.join_wiki(baseurl, pagename) == url
tw@2267
    86
tw@2267
    87
tw@2173
    88
class TestSystemPagesGroup:
tw@2173
    89
    def testSystemPagesGroupNotEmpty(self):
tw@2173
    90
        assert self.request.dicts.members('SystemPagesGroup')
tw@2173
    91
tw@2454
    92
class TestSystemPage:
tw-public@0
    93
    systemPages = (
tw-public@0
    94
        # First level, on SystemPagesGroup
tw-public@0
    95
        'SystemPagesInEnglishGroup',
tw-public@0
    96
        # Second level, on one of the pages above
tw-public@0
    97
        'RecentChanges',
tw-public@0
    98
        'TitleIndex',
tw-public@0
    99
        )
tw-public@0
   100
    notSystemPages = (
tw-public@0
   101
        'NoSuchPageYetAndWillNeverBe',
tw-public@0
   102
        )
tw-public@0
   103
tw-public@0
   104
    def testSystemPage(self):
tw-public@0
   105
        """wikiutil: good system page names accepted, bad rejected"""
tw-public@0
   106
        for name in self.systemPages:
tw@2454
   107
            assert wikiutil.isSystemPage(self.request, name)
tw-public@0
   108
        for name in self.notSystemPages:
tw@2454
   109
            assert not  wikiutil.isSystemPage(self.request, name)
tw-public@0
   110
tw-public@0
   111
tw@2454
   112
class TestTemplatePage:
tw-public@0
   113
    good = (
tw-public@0
   114
        'aTemplate',
tw-public@0
   115
        'MyTemplate',
tw-public@0
   116
    )
tw-public@0
   117
    bad = (
tw-public@0
   118
        'Template',
tw@3573
   119
        'I want a Template',
tw-public@0
   120
        'TemplateInFront',
tw-public@0
   121
        'xTemplateInFront',
tw-public@0
   122
        'XTemplateInFront',
tw-public@0
   123
    )
tw-public@0
   124
tw-public@0
   125
    def testTemplatePage(self):
tw-public@0
   126
        """wikiutil: good template names accepted, bad rejected"""
tw-public@0
   127
        for name in self.good:
tw@2454
   128
            assert  wikiutil.isTemplatePage(self.request, name)
tw-public@0
   129
        for name in self.bad:
tw@2454
   130
            assert not wikiutil.isTemplatePage(self.request, name)
tw-public@0
   131
tw-public@0
   132
tw@2453
   133
class TestParmeterParser:
tw@2164
   134
tw@2453
   135
    def testParameterParser(self):
tw@2453
   136
        tests = [
tw@2453
   137
            # trivial
tw@2455
   138
            ('', '', 0, {}),
tw@2455
   139
tw@2455
   140
            # fixed
tw@2455
   141
            ('%s%i%f%b', '"test",42,23.0,True', 4, {0: 'test', 1: 42, 2: 23.0, 3: True}),
tw@2455
   142
tw@2455
   143
            # fixed and named
tw@2455
   144
            ('%s%(x)i%(y)i', '"test"', 1, {0: 'test', 'x': None, 'y': None}),
tw@2455
   145
            ('%s%(x)i%(y)i', '"test",1', 1, {0: 'test', 'x': 1, 'y': None}),
tw@2455
   146
            ('%s%(x)i%(y)i', '"test",1,2', 1, {0: 'test', 'x': 1, 'y': 2}),
tw@2455
   147
            ('%s%(x)i%(y)i', '"test",x=1', 1, {0: 'test', 'x': 1, 'y': None}),
tw@2455
   148
            ('%s%(x)i%(y)i', '"test",x=1,y=2', 1, {0: 'test', 'x': 1, 'y': 2}),
tw@2455
   149
            ('%s%(x)i%(y)i', '"test",y=2', 1, {0: 'test', 'x': None, 'y': 2}),
tw@2455
   150
tw@2455
   151
            # test mixed acceptance
tw@2455
   152
            ("%ifs", '100', 1, {0: 100}),
tw@2455
   153
            ("%ifs", '100.0', 1, {0: 100.0}),
tw@2455
   154
            ("%ifs", '"100"', 1, {0: "100"}),
rb@2052
   155
tw@2453
   156
            # boolean
tw@2455
   157
            ("%(t)b%(f)b", '', 0, {'t': None, 'f': None}),
tw@2455
   158
            ("%(t)b%(f)b", 't=1', 0, {'t': True, 'f': None}),
tw@2455
   159
            ("%(t)b%(f)b", 'f=False', 0, {'t': None, 'f': False}),
tw@2455
   160
            ("%(t)b%(f)b", 't=True, f=0', 0, {'t': True, 'f': False}),
tw@2164
   161
tw@2453
   162
            # integer
tw@2455
   163
            ("%(width)i%(height)i", '', 0, {'width': None, 'height': None}),
tw@2455
   164
            ("%(width)i%(height)i", 'width=100', 0, {'width': 100, 'height': None}),
tw@2455
   165
            ("%(width)i%(height)i", 'height=200', 0, {'width': None, 'height': 200}),
tw@2455
   166
            ("%(width)i%(height)i", 'width=100, height=200', 0, {'width': 100, 'height': 200}),
tw@2453
   167
tw@2453
   168
            # float
tw@2455
   169
            ("%(width)f%(height)f", '', 0, {'width': None, 'height': None}),
tw@2455
   170
            ("%(width)f%(height)f", 'width=100.0', 0, {'width': 100.0, 'height': None}),
tw@2455
   171
            ("%(width)f%(height)f", 'height=2.0E2', 0, {'width': None, 'height': 200.0}),
tw@2455
   172
            ("%(width)f%(height)f", 'width=1000.0E-1, height=200.0', 0, {'width': 100.0, 'height': 200.0}),
tw@2453
   173
tw@2453
   174
            # string
tw@2455
   175
            ("%(width)s%(height)s", '', 0, {'width': None, 'height': None}),
tw@2455
   176
            ("%(width)s%(height)s", 'width="really wide"', 0, {'width': 'really wide', 'height': None}),
tw@2455
   177
            ("%(width)s%(height)s", 'height="not too high"', 0, {'width': None, 'height': 'not too high'}),
tw@2455
   178
            ("%(width)s%(height)s", 'width="really wide", height="not too high"', 0, {'width': 'really wide', 'height': 'not too high'}),
tw@2456
   179
            # conversion from given type to expected type
tw@2456
   180
            ("%(width)s%(height)s", 'width=100', 0, {'width': '100', 'height': None}),
tw@2456
   181
            ("%(width)s%(height)s", 'width=100, height=200', 0, {'width': '100', 'height': '200'}),
tw@2455
   182
tw@2455
   183
            # complex test
tw@2455
   184
            ("%i%sf%s%ifs%(a)s|%(b)s", ' 4,"DI\'NG", b=retry, a="DING"', 2, {0: 4, 1: "DI'NG", 'a': 'DING', 'b': 'retry'}),
tw@2455
   185
tw@2455
   186
            ]
tw@2455
   187
        for format, args, expected_fixed_count, expected_dict in tests:
tw@2453
   188
            argParser = wikiutil.ParameterParser(format)
tw@2455
   189
            fixed_count, arg_dict = argParser.parse_parameters(args)
tw@2455
   190
            assert (fixed_count, arg_dict) == (expected_fixed_count, expected_dict)
tw@2164
   191
rb@2052
   192
    def testTooMuchWantedArguments(self):
rb@2052
   193
        args = 'width=100, height=200, alt=Example'
rb@2052
   194
        argParser = wikiutil.ParameterParser("%(width)s%(height)s")
tw@2453
   195
        py.test.raises(ValueError, argParser.parse_parameters, args)
tw@2453
   196
tw@2453
   197
    def testMalformedArguments(self):
tw@2453
   198
        args = '='
tw@2453
   199
        argParser = wikiutil.ParameterParser("%(width)s%(height)s")
tw@2453
   200
        py.test.raises(ValueError, argParser.parse_parameters, args)
tw@2453
   201
tw@2456
   202
    def testWrongTypeFixedPosArgument(self):
tw@2456
   203
        args = '0.0'
tw@2456
   204
        argParser = wikiutil.ParameterParser("%b")
tw@2456
   205
        py.test.raises(ValueError, argParser.parse_parameters, args)
tw@2456
   206
tw@2456
   207
    def testWrongTypeNamedArgument(self):
tw@2456
   208
        args = 'flag=0.0'
tw@2456
   209
        argParser = wikiutil.ParameterParser("%(flag)b")
tw@2456
   210
        py.test.raises(ValueError, argParser.parse_parameters, args)
tw@2456
   211
tw@2164
   212
johannes@2507
   213
class TestParamParsing:
johannes@2507
   214
    def testMacroArgs(self):
johannes@2507
   215
        abcd = [u'a', u'b', u'c', u'd']
johannes@2507
   216
        abcd_dict = {u'a': u'1', u'b': u'2', u'c': u'3', u'd': u'4'}
johannes@2507
   217
        tests = [
johannes@2507
   218
                  # regular and quoting tests
johannes@2507
   219
                  (u'd = 4,c=3,b=2,a= 1 ',    ([], abcd_dict, [])),
johannes@2507
   220
                  (u'a,b,c,d',                (abcd, {}, [])),
johannes@2507
   221
                  (u' a , b , c , d ',        (abcd, {}, [])),
johannes@2507
   222
                  (u'   a   ',                ([u'a'], {}, [])),
johannes@2507
   223
                  (u'"  a  "',                ([u'  a  '], {}, [])),
johannes@2507
   224
                  (u'a,b,c,d, "a,b,c,d"',     (abcd+[u'a,b,c,d'], {}, [])),
johannes@2507
   225
                  (u'quote " :), b',          ([u'quote " :)', u'b'], {}, [])),
johannes@2507
   226
                  (u'"quote "" :)", b',       ([u'quote " :)', u'b'], {}, [])),
johannes@2507
   227
                  (u'=7',                     ([], {u'': u'7'}, [])),
johannes@2507
   228
                  (u',,',                     ([None, None, None], {}, [])),
johannes@2507
   229
                  (u',"",',                   ([None, u'', None], {}, [])),
johannes@2507
   230
                  (u',"", ""',                ([None, u'', u''], {}, [])),
johannes@2507
   231
                  (u'  ""  ,"", ""',          ([u'', u'', u''], {}, [])),
johannes@2507
   232
                  # some name=value test
johannes@2507
   233
                  (u'd = 4,c=3,b=2,a= 1 ',    ([], abcd_dict, [])),
johannes@2510
   234
                  (u'd=d,e="a,b,c,d"',        ([], {u'd': u'd',
johannes@2510
   235
                                                    u'e': u'a,b,c,d'}, [])),
johannes@2510
   236
                  (u'd = d,e = "a,b,c,d"',    ([], {u'd': u'd',
johannes@2510
   237
                                                    u'e': u'a,b,c,d'}, [])),
johannes@2510
   238
                  (u'd = d, e = "a,b,c,d"',   ([], {u'd': u'd',
johannes@2510
   239
                                                    u'e': u'a,b,c,d'}, [])),
johannes@2510
   240
                  (u'd = , e = "a,b,c,d"',    ([], {u'd': None,
johannes@2510
   241
                                                    u'e': u'a,b,c,d'}, [])),
johannes@2510
   242
                  (u'd = "", e = "a,b,c,d"',  ([], {u'd': u'',
johannes@2510
   243
                                                    u'e': u'a,b,c,d'}, [])),
johannes@2510
   244
                  (u'd = "", e = ',           ([], {u'd': u'', u'e': None},
johannes@2510
   245
                                               [])),
johannes@2528
   246
                  (u'd=""',                   ([], {u'd': u''}, [])),
johannes@2510
   247
                  (u'd = "", e = ""',         ([], {u'd': u'', u'e': u''},
johannes@2510
   248
                                               [])),
johannes@2510
   249
                  # no, None as key isn't accepted
johannes@2510
   250
                  (u' = "",  e = ""',         ([], {u'': u'', u'e': u''},
johannes@2510
   251
                                               [])),
johannes@2507
   252
                  # can quote both name and value:
johannes@2510
   253
                  (u'd = d," e "= "a,b,c,d"', ([], {u'd': u'd',
johannes@2510
   254
                                                    u' e ': u'a,b,c,d'}, [])),
johannes@2507
   255
                  # trailing args
johannes@2507
   256
                  (u'1,2,a=b,3,4',            ([u'1', u'2'], {u'a': u'b'},
johannes@2507
   257
                                               [u'3', u'4'])),
johannes@2544
   258
                  # can quote quotes:
johannes@2544
   259
                  (u'd = """d"',              ([], {u'd': u'"d'}, [])),
johannes@2544
   260
                  (u'd = """d"""',            ([], {u'd': u'"d"'}, [])),
johannes@2544
   261
                  (u'd = "d"" ", e=7',        ([], {u'd': u'd" ', u'e': u'7'},
johannes@2544
   262
                                               [])),
johannes@2544
   263
                  (u'd = "d""", e=8',         ([], {u'd': u'd"', u'e': u'8'},
johannes@2544
   264
                                               [])),
johannes@2507
   265
                ]
johannes@2507
   266
        for args, expected in tests:
johannes@2507
   267
            result = wikiutil.parse_quoted_separated(args)
johannes@2507
   268
            assert expected == result
johannes@2528
   269
            for val in result[0]:
johannes@2528
   270
                assert val is None or isinstance(val, unicode)
johannes@2528
   271
            for val in result[1].keys():
johannes@2528
   272
                assert val is None or isinstance(val, unicode)
johannes@2528
   273
            for val in result[1].values():
johannes@2528
   274
                assert val is None or isinstance(val, unicode)
johannes@2528
   275
            for val in result[2]:
johannes@2528
   276
                assert val is None or isinstance(val, unicode)
johannes@2507
   277
johannes@2507
   278
    def testLimited(self):
johannes@2507
   279
        tests = [
johannes@2507
   280
                  # regular and quoting tests
johannes@2507
   281
                  (u'd = 4,c=3,b=2,a= 1 ',    ([], {u'd': u'4',
johannes@2507
   282
                                                    u'c': u'3,b=2,a= 1'}, [])),
johannes@2507
   283
                  (u'a,b,c,d',                ([u'a', u'b,c,d'], {}, [])),
johannes@2507
   284
                  (u'a=b,b,c,d',              ([], {u'a': u'b'}, [u'b,c,d'])),
johannes@2507
   285
                ]
johannes@2507
   286
        for args, expected in tests:
johannes@2507
   287
            result = wikiutil.parse_quoted_separated(args, seplimit=1)
johannes@2507
   288
            assert expected == result
johannes@2528
   289
            for val in result[0]:
johannes@2528
   290
                assert val is None or isinstance(val, unicode)
johannes@2528
   291
            for val in result[1].keys():
johannes@2528
   292
                assert val is None or isinstance(val, unicode)
johannes@2528
   293
            for val in result[1].values():
johannes@2528
   294
                assert val is None or isinstance(val, unicode)
johannes@2528
   295
            for val in result[2]:
johannes@2528
   296
                assert val is None or isinstance(val, unicode)
johannes@2507
   297
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   298
    def testDoubleNameValueSeparator(self):
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   299
        tests = [
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   300
                  # regular and quoting tests
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   301
                  (u'd==4,=3 ',    ([], {u'd': u'=4', u'': u'3'}, [])),
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   302
                  (u'===a,b,c,d',  ([], {u'': u'==a'}, [u'b', u'c', u'd'])),
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   303
                  (u'a,b,===,c,d', ([u'a', u'b'], {u'': u'=='}, [u'c', u'd'])),
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   304
                ]
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   305
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   306
        def _check(a, e):
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   307
            r = wikiutil.parse_quoted_separated(a)
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   308
            assert r == e
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   309
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   310
        for args, expected in tests:
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   311
            yield _check, args, expected
MoinMoinBugs/TypeErrorInWikiutils">johannes@3815
   312
johannes@2507
   313
    def testNoNameValue(self):
johannes@2507
   314
        abcd = [u'a', u'b', u'c', u'd']
johannes@2507
   315
        tests = [
johannes@2507
   316
                  # regular and quoting tests
johannes@2507
   317
                  (u'd = 4,c=3,b=2,a= 1 ',    [u'd = 4', u'c=3',
johannes@2507
   318
                                               u'b=2', u'a= 1']),
johannes@2507
   319
                  (u'a,b,c,d',                abcd),
johannes@2507
   320
                  (u' a , b , c , d ',        abcd),
johannes@2507
   321
                  (u'   a   ',                [u'a']),
johannes@2507
   322
                  (u'"  a  "',                [u'  a  ']),
johannes@2510
   323
                  (u'a,b,c,d, "a,b,c,d"',     abcd + [u'a,b,c,d']),
johannes@2507
   324
                  (u'quote " :), b',          [u'quote " :)', u'b']),
johannes@2507
   325
                  (u'"quote "" :)", b',       [u'quote " :)', u'b']),
johannes@3404
   326
                  (u'"unended quote',         [u'"unended quote']),
johannes@3404
   327
                  (u'"',                      [u'"']),
johannes@2507
   328
                  (u'd=d,e="a,b,c,d"',        [u'd=d', u'e="a', u'b',
johannes@2507
   329
                                               u'c', u'd"']),
johannes@2507
   330
                ]
johannes@2507
   331
        for args, expected in tests:
johannes@2507
   332
            result = wikiutil.parse_quoted_separated(args, name_value=False)
johannes@2507
   333
            assert expected == result
johannes@2528
   334
            for val in result:
johannes@2528
   335
                assert val is None or isinstance(val, unicode)
johannes@2507
   336
rb@3259
   337
    def testUnitArgument(self):
rb@3259
   338
        result = wikiutil.UnitArgument('7mm', float, ['%', 'mm'])
rb@3259
   339
        assert result.get_default() ==  (7.0, 'mm')
rb@3259
   340
        assert result.parse_argument('8%') == (8.0, '%')
rb@3259
   341
        py.test.raises(ValueError, result.parse_argument,  u'7m')
rb@3259
   342
        py.test.raises(ValueError, result.parse_argument,  u'7')
rb@3259
   343
        py.test.raises(ValueError, result.parse_argument,  u'mm')
johannes@2507
   344
johannes@3399
   345
    def testExtendedParser(self):
johannes@3399
   346
        tests = [
johannes@3399
   347
            (u'"a", "b", "c"', u',', None, [u'a', u'b', u'c']),
johannes@3399
   348
            (u'a:b, b:c, c:d', u',', u':', [(u'a', u'b'), (u'b', u'c'), (u'c', u'd')]),
johannes@3399
   349
            (u'a:b, b:c, c:d', u',', None, [u'a:b', u'b:c', u'c:d']),
johannes@3399
   350
            (u'a=b, b=c, c=d', u',', None, [u'a=b', u'b=c', u'c=d']),
johannes@3399
   351
            (u'a=b, b=c, c=d', u',', u'=', [(u'a', u'b'), (u'b', u'c'), (u'c', u'd')]),
johannes@3399
   352
            (u'"a"; "b"; "c"', u';', None, [u'a', u'b', u'c']),
johannes@3399
   353
            (u'a:b; b:c; c:d', u';', u':', [(u'a', u'b'), (u'b', u'c'), (u'c', u'd')]),
johannes@3399
   354
            (u'a:b; b:c; c:d', u';', None, [u'a:b', u'b:c', u'c:d']),
johannes@3399
   355
            (u'a=b; b=c; c=d', u';', None, [u'a=b', u'b=c', u'c=d']),
johannes@3399
   356
            (u'a=b; b=c; c=d', u';', u'=', [(u'a', u'b'), (u'b', u'c'), (u'c', u'd')]),
johannes@3399
   357
            (u'"a" "b" "c"', None, None, [u'a', u'b', u'c']),
johannes@3399
   358
            (u'" a " "b" "c"', None, None, [u' a ', u'b', u'c']),
johannes@3399
   359
            (u'"a  " "b" "c"', None, None, [u'a  ', u'b', u'c']),
johannes@3399
   360
            (u'"  a" "b" "c"', None, None, [u'  a', u'b', u'c']),
johannes@3399
   361
            (u'"  a" "b" "c"', None, u':', [u'  a', u'b', u'c']),
johannes@3399
   362
            (u'"a:a" "b:b" "c:b"', None, u':', [u'a:a', u'b:b', u'c:b']),
johannes@3399
   363
            (u'   a:a  ', None, u':', [None, None, None, (u'a', u'a'), None, None]),
johannes@3399
   364
            (u'a a: a', None, u':', [u'a', (u'a', None), u'a']),
johannes@3399
   365
            (u'a a:"b c d" a', None, u':', [u'a', (u'a', u'b c d'), u'a']),
johannes@3399
   366
            (u'a a:"b "" d" a', None, u':', [u'a', (u'a', u'b " d'), u'a']),
johannes@3399
   367
            (u'title:Help* dog cat', None, u':', [(u'title', u'Help*'), u'dog', u'cat']),
johannes@3399
   368
            (u'title:Help* "dog cat"', None, u':', [(u'title', u'Help*'), u'dog cat']),
johannes@3400
   369
            (u'a:b:c d:e:f', None, u':', [(u'a', u'b:c'), (u'd', 'e:f')]),
johannes@3400
   370
            (u'a:b:c:d', None, u':', [(u'a', u'b:c:d')]),
johannes@3399
   371
        ]
johannes@3399
   372
johannes@3399
   373
        def _check(args, sep, kwsep, expected):
johannes@3399
   374
            res = wikiutil.parse_quoted_separated_ext(args, sep, kwsep)
johannes@3399
   375
            assert res == expected
johannes@3399
   376
johannes@3399
   377
        for test in tests:
johannes@3401
   378
            yield [_check] + list(test)
johannes@3399
   379
johannes@3399
   380
    def testExtendedParserBracketing(self):
johannes@3399
   381
        tests = [
johannes@3399
   382
            (u'"a", "b", "c"', u',', None, [u'a', u'b', u'c']),
johannes@3402
   383
            (u'("a", "b", "c")', u',', None, [[u'(', u'a', u'b', u'c']]),
johannes@3402
   384
            (u'("a"("b", "c"))', u',', None, [[u'(', u'a', [u'(', u'b', u'c']]]),
johannes@3402
   385
            (u'("a"("b)))", "c"))', u',', None, [[u'(', u'a', [u'(', u'b)))', u'c']]]),
johannes@3402
   386
            (u'("a"("b>>> ( ab )>", "c"))', u',', None, [[u'(', u'a', [u'(', u'b>>> ( ab )>', u'c']]]),
johannes@3402
   387
            (u'("a" ("b" "c"))', None, None, [[u'(', u'a', [u'(', u'b', u'c']]]),
johannes@3402
   388
            (u'("a"("b", "c") ) ', u',', None, [[u'(', u'a', [u'(', u'b', u'c']]]),
johannes@3402
   389
            (u'("a", <"b", ("c")>)', u',', None, [[u'(', u'a', [u'<', u'b', [u'(', u'c']]]]),
johannes@3407
   390
            (u',,,(a, b, c)', u',', None, [None, None, None, [u'(', u'a', u'b', u'c']]),
johannes@3399
   391
        ]
johannes@3399
   392
johannes@3399
   393
        def _check(args, sep, kwsep, expected):
johannes@3399
   394
            res = wikiutil.parse_quoted_separated_ext(args, sep, kwsep, brackets=(u'<>', u'()'))
johannes@3399
   395
            assert res == expected
johannes@3399
   396
johannes@3399
   397
        for test in tests:
johannes@3401
   398
            yield [_check] + list(test)
johannes@3401
   399
johannes@3405
   400
    def testExtendedParserQuoting(self):
johannes@3405
   401
        tests = [
johannes@3405
   402
            (u'"a b" -a b-', u'"', [u'a b', u'-a', u'b-']),
johannes@3405
   403
            (u'"a b" -a b-', u"-", [u'"a', u'b"', u'a b']),
johannes@3405
   404
            (u'"a b" -a b-', u'"-', [u'a b', u'a b']),
johannes@3405
   405
            (u'"a- b" -a b-', u'"-', [u'a- b', u'a b']),
johannes@3405
   406
            (u'"a- b" -a" b-', u'"-', [u'a- b', u'a" b']),
johannes@3405
   407
        ]
johannes@3405
   408
johannes@3405
   409
        def _check(args, quotes, expected):
johannes@3405
   410
            res = wikiutil.parse_quoted_separated_ext(args, quotes=quotes)
johannes@3405
   411
            assert res == expected
johannes@3405
   412
johannes@3405
   413
        for test in tests:
johannes@3405
   414
            yield [_check] + list(test)
johannes@3405
   415
johannes@3401
   416
    def testExtendedParserMultikey(self):
johannes@3401
   417
        tests = [
johannes@3401
   418
            (u'"a", "b", "c"', u',', None, [u'a', u'b', u'c']),
johannes@3401
   419
            (u'a:b, b:c, c:d', u',', u':', [(u'a', u'b'), (u'b', u'c'), (u'c', u'd')]),
johannes@3401
   420
            (u'a:b, b:c, c:d', u',', None, [u'a:b', u'b:c', u'c:d']),
johannes@3401
   421
            (u'a=b, b=c, c=d', u',', None, [u'a=b', u'b=c', u'c=d']),
johannes@3401
   422
            (u'a=b, b=c, c=d', u',', u'=', [(u'a', u'b'), (u'b', u'c'), (u'c', u'd')]),
johannes@3401
   423
            (u'"a"; "b"; "c"', u';', None, [u'a', u'b', u'c']),
johannes@3401
   424
            (u'a:b; b:c; c:d', u';', u':', [(u'a', u'b'), (u'b', u'c'), (u'c', u'd')]),
johannes@3401
   425
            (u'a:b; b:c; c:d', u';', None, [u'a:b', u'b:c', u'c:d']),
johannes@3401
   426
            (u'a=b; b=c; c=d', u';', None, [u'a=b', u'b=c', u'c=d']),
johannes@3401
   427
            (u'a=b; b=c; c=d', u';', u'=', [(u'a', u'b'), (u'b', u'c'), (u'c', u'd')]),
johannes@3401
   428
            (u'"a" "b" "c"', None, None, [u'a', u'b', u'c']),
johannes@3401
   429
            (u'" a " "b" "c"', None, None, [u' a ', u'b', u'c']),
johannes@3401
   430
            (u'"a  " "b" "c"', None, None, [u'a  ', u'b', u'c']),
johannes@3401
   431
            (u'"  a" "b" "c"', None, None, [u'  a', u'b', u'c']),
johannes@3401
   432
            (u'"  a" "b" "c"', None, u':', [u'  a', u'b', u'c']),
johannes@3401
   433
            (u'"a:a" "b:b" "c:b"', None, u':', [u'a:a', u'b:b', u'c:b']),
johannes@3401
   434
            (u'   a:a  ', None, u':', [None, None, None, (u'a', u'a'), None, None]),
johannes@3401
   435
            (u'a a: a', None, u':', [u'a', (u'a', None), u'a']),
johannes@3401
   436
            (u'a a:"b c d" a', None, u':', [u'a', (u'a', u'b c d'), u'a']),
johannes@3401
   437
            (u'a a:"b "" d" a', None, u':', [u'a', (u'a', u'b " d'), u'a']),
johannes@3401
   438
            (u'title:Help* dog cat', None, u':', [(u'title', u'Help*'), u'dog', u'cat']),
johannes@3401
   439
            (u'title:Help* "dog cat"', None, u':', [(u'title', u'Help*'), u'dog cat']),
johannes@3401
   440
            (u'a:b:c d:e:f', None, u':', [(u'a', u'b', u'c'), (u'd', 'e', u'f')]),
johannes@3401
   441
            (u'a:b:c:d', None, u':', [(u'a', u'b', u'c', u'd')]),
johannes@3401
   442
            (u'a:"b:c":d', None, u':', [(u'a', u'b:c', u'd')]),
johannes@3401
   443
        ]
johannes@3401
   444
johannes@3401
   445
        def _check(args, sep, kwsep, expected):
johannes@3401
   446
            res = wikiutil.parse_quoted_separated_ext(args, sep, kwsep, multikey=True)
johannes@3401
   447
            assert res == expected
johannes@3401
   448
johannes@3401
   449
        for test in tests:
johannes@3401
   450
            yield [_check] + list(test)
johannes@3399
   451
johannes@3403
   452
    def testExtendedParserPrefix(self):
johannes@3403
   453
        P = wikiutil.ParserPrefix('+')
johannes@3403
   454
        M = wikiutil.ParserPrefix('-')
johannes@3403
   455
        tests = [
johannes@3403
   456
            (u'"a", "b", "c"', u',', None, [u'a', u'b', u'c']),
johannes@3403
   457
            (u'a:b, b:c, c:d', u',', u':', [(u'a', u'b'), (u'b', u'c'), (u'c', u'd')]),
johannes@3403
   458
            (u'a:b, b:c, c:d', u',', None, [u'a:b', u'b:c', u'c:d']),
johannes@3403
   459
            (u'a=b, b=c, c=d', u',', None, [u'a=b', u'b=c', u'c=d']),
johannes@3403
   460
            (u'a=b, b=c, c=d', u',', u'=', [(u'a', u'b'), (u'b', u'c'), (u'c', u'd')]),
johannes@3403
   461
            (u'"a"; "b"; "c"', u';', None, [u'a', u'b', u'c']),
johannes@3403
   462
            (u'a:b; b:c; c:d', u';', u':', [(u'a', u'b'), (u'b', u'c'), (u'c', u'd')]),
johannes@3403
   463
            (u'a:b; b:c; c:d', u';', None, [u'a:b', u'b:c', u'c:d']),
johannes@3403
   464
            (u'a=b; b=c; c=d', u';', None, [u'a=b', u'b=c', u'c=d']),
johannes@3403
   465
            (u'a=b; b=c; c=d', u';', u'=', [(u'a', u'b'), (u'b', u'c'), (u'c', u'd')]),
johannes@3403
   466
            (u'"a" "b" "c"', None, None, [u'a', u'b', u'c']),
johannes@3403
   467
            (u'" a " "b" "c"', None, None, [u' a ', u'b', u'c']),
johannes@3403
   468
            (u'"a  " "b" "c"', None, None, [u'a  ', u'b', u'c']),
johannes@3403
   469
            (u'"  a" "b" "c"', None, None, [u'  a', u'b', u'c']),
johannes@3403
   470
            (u'"  a" "b" "c"', None, u':', [u'  a', u'b', u'c']),
johannes@3403
   471
            (u'"a:a" "b:b" "c:b"', None, u':', [u'a:a', u'b:b', u'c:b']),
johannes@3403
   472
            (u'   a:a  ', None, u':', [None, None, None, (u'a', u'a'), None, None]),
johannes@3403
   473
            (u'a a: a', None, u':', [u'a', (u'a', None), u'a']),
johannes@3403
   474
            (u'a a:"b c d" a', None, u':', [u'a', (u'a', u'b c d'), u'a']),
johannes@3403
   475
            (u'a a:"b "" d" a', None, u':', [u'a', (u'a', u'b " d'), u'a']),
johannes@3403
   476
            (u'title:Help* dog cat', None, u':', [(u'title', u'Help*'), u'dog', u'cat']),
johannes@3403
   477
            (u'title:Help* "dog cat"', None, u':', [(u'title', u'Help*'), u'dog cat']),
johannes@3403
   478
            (u'a:b:c d:e:f', None, u':', [(u'a', u'b', u'c'), (u'd', 'e', u'f')]),
johannes@3403
   479
            (u'a:b:c:d', None, u':', [(u'a', u'b', u'c', u'd')]),
johannes@3403
   480
            (u'a:"b:c":d', None, u':', [(u'a', u'b:c', u'd')]),
johannes@3403
   481
johannes@3403
   482
            (u'-a:b:d', None, u':', [(M, u'a', u'b', u'd')]),
johannes@3403
   483
            (u'"-a:b:d"', None, u':', [(u'-a:b:d')]),
johannes@3403
   484
            (u'-"a:b:d"', None, u':', [(M, u'a:b:d')]),
johannes@3403
   485
            (u'-a:"b:c":"d e f g"', None, u':', [(M, u'a', u'b:c', u'd e f g')]),
johannes@3403
   486
            (u'+-a:b:d', None, u':', [(P, u'-a', u'b', u'd')]),
johannes@3403
   487
            (u'-"+a:b:d"', None, u':', [(M, u'+a:b:d')]),
johannes@3403
   488
            # bit of a weird case...
johannes@3403
   489
            (u'-+"a:b:d"', None, u':', [(M, u'+"a', u'b', u'd"')]),
johannes@3403
   490
            (u'-a:"b:c" a +b', None, u':', [(M, u'a', u'b:c'), u'a', (P, u'b')]),
johannes@3403
   491
        ]
johannes@3403
   492
johannes@3403
   493
        def _check(args, sep, kwsep, expected):
johannes@3403
   494
            res = wikiutil.parse_quoted_separated_ext(args, sep, kwsep, multikey=True, prefixes='-+')
johannes@3403
   495
            assert res == expected
johannes@3403
   496
johannes@3403
   497
        for test in tests:
johannes@3403
   498
            yield [_check] + list(test)
johannes@3403
   499
johannes@3399
   500
    def testExtendedParserBracketingErrors(self):
johannes@3399
   501
        UCE = wikiutil.BracketUnexpectedCloseError
johannes@3399
   502
        MCE = wikiutil.BracketMissingCloseError
johannes@3399
   503
        tests = [
johannes@3399
   504
            (u'("a", "b", "c"', u',', None, MCE),
johannes@3399
   505
            (u'("a"("b", "c")', u',', None, MCE),
johannes@3399
   506
            (u'("a"<"b", "c")>', u',', None, UCE),
johannes@3399
   507
            (u')("a" ("b" "c"))', None, None, UCE),
johannes@3399
   508
            (u'("a", ("b", "c">))', u',', None, UCE),
johannes@3399
   509
            (u'("a", ("b", <"c">>))', u',', None, UCE),
johannes@3399
   510
            (u'(<(<)>)>', u',', None, UCE),
johannes@3399
   511
        ]
johannes@3399
   512
johannes@3399
   513
        def _check(args, sep, kwsep, err):
johannes@3399
   514
            py.test.raises(err,
johannes@3399
   515
                           wikiutil.parse_quoted_separated_ext,
johannes@3399
   516
                           args, sep, kwsep,
johannes@3399
   517
                           brackets=(u'<>', u'()'))
johannes@3399
   518
johannes@3399
   519
        for test in tests:
johannes@3401
   520
            yield [_check] + list(test)
johannes@3399
   521
tw@2512
   522
class TestArgGetters:
tw@2512
   523
    def testGetBoolean(self):
tw@2512
   524
        tests = [
tw@2512
   525
            # default testing for None value
tw@2512
   526
            (None, None, None, None),
tw@2512
   527
            (None, None, False, False),
tw@2512
   528
            (None, None, True, True),
tw@2512
   529
tw@2512
   530
            # some real values
tw@2512
   531
            (u'0', None, None, False),
tw@2512
   532
            (u'1', None, None, True),
tw@2512
   533
            (u'false', None, None, False),
tw@2512
   534
            (u'true', None, None, True),
tw@2512
   535
            (u'FALSE', None, None, False),
tw@2512
   536
            (u'TRUE', None, None, True),
tw@2512
   537
            (u'no', None, None, False),
tw@2512
   538
            (u'yes', None, None, True),
tw@2512
   539
            (u'NO', None, None, False),
tw@2512
   540
            (u'YES', None, None, True),
tw@2512
   541
        ]
tw@2512
   542
        for arg, name, default, expected in tests:
tw@2512
   543
            assert wikiutil.get_bool(self.request, arg, name, default) == expected
tw@2512
   544
tw@2512
   545
    def testGetBooleanRaising(self):
tw@2512
   546
        # wrong default type
tw@2512
   547
        py.test.raises(AssertionError, wikiutil.get_bool, self.request, None, None, 42)
tw@2512
   548
tw@2512
   549
        # anything except None or unicode raises TypeError
tw@2512
   550
        py.test.raises(TypeError, wikiutil.get_bool, self.request, True)
tw@2512
   551
        py.test.raises(TypeError, wikiutil.get_bool, self.request, 42)
tw@2512
   552
        py.test.raises(TypeError, wikiutil.get_bool, self.request, 42.0)
tw@2512
   553
        py.test.raises(TypeError, wikiutil.get_bool, self.request, '')
tw@2512
   554
        py.test.raises(TypeError, wikiutil.get_bool, self.request, tuple())
tw@2512
   555
        py.test.raises(TypeError, wikiutil.get_bool, self.request, [])
tw@2512
   556
        py.test.raises(TypeError, wikiutil.get_bool, self.request, {})
tw@2512
   557
tw@2512
   558
        # any value not convertable to boolean raises ValueError
tw@2512
   559
        py.test.raises(ValueError, wikiutil.get_bool, self.request, u'')
tw@2512
   560
        py.test.raises(ValueError, wikiutil.get_bool, self.request, u'42')
tw@2512
   561
        py.test.raises(ValueError, wikiutil.get_bool, self.request, u'wrong')
tw@2512
   562
        py.test.raises(ValueError, wikiutil.get_bool, self.request, u'"True"') # must not be quoted!
tw@2512
   563
tw@2512
   564
    def testGetInt(self):
tw@2512
   565
        tests = [
tw@2512
   566
            # default testing for None value
tw@2512
   567
            (None, None, None, None),
tw@2512
   568
            (None, None, -23, -23),
tw@2512
   569
            (None, None, 42, 42),
tw@2512
   570
tw@2512
   571
            # some real values
tw@2512
   572
            (u'0', None, None, 0),
tw@2512
   573
            (u'42', None, None, 42),
tw@2512
   574
            (u'-23', None, None, -23),
tw@2512
   575
        ]
tw@2512
   576
        for arg, name, default, expected in tests:
tw@2512
   577
            assert wikiutil.get_int(self.request, arg, name, default) == expected
tw@2512
   578
tw@2512
   579
    def testGetIntRaising(self):
tw@2512
   580
        # wrong default type
tw@2512
   581
        py.test.raises(AssertionError, wikiutil.get_int, self.request, None, None, 42.23)
tw@2512
   582
tw@2512
   583
        # anything except None or unicode raises TypeError
tw@2512
   584
        py.test.raises(TypeError, wikiutil.get_int, self.request, True)
tw@2512
   585
        py.test.raises(TypeError, wikiutil.get_int, self.request, 42)
tw@2512
   586
        py.test.raises(TypeError, wikiutil.get_int, self.request, 42.0)
tw@2512
   587
        py.test.raises(TypeError, wikiutil.get_int, self.request, '')
tw@2512
   588
        py.test.raises(TypeError, wikiutil.get_int, self.request, tuple())
tw@2512
   589
        py.test.raises(TypeError, wikiutil.get_int, self.request, [])
tw@2512
   590
        py.test.raises(TypeError, wikiutil.get_int, self.request, {})
tw@2512
   591
tw@2512
   592
        # any value not convertable to int raises ValueError
tw@2512
   593
        py.test.raises(ValueError, wikiutil.get_int, self.request, u'')
tw@2512
   594
        py.test.raises(ValueError, wikiutil.get_int, self.request, u'23.42')
tw@2512
   595
        py.test.raises(ValueError, wikiutil.get_int, self.request, u'wrong')
tw@2512
   596
        py.test.raises(ValueError, wikiutil.get_int, self.request, u'"4711"') # must not be quoted!
tw@2512
   597
tw@2512
   598
    def testGetFloat(self):
tw@2512
   599
        tests = [
tw@2512
   600
            # default testing for None value
tw@2512
   601
            (None, None, None, None),
tw@2512
   602
            (None, None, -23.42, -23.42),
tw@2512
   603
            (None, None, 42.23, 42.23),
tw@2512
   604
tw@2512
   605
            # some real values
tw@2512
   606
            (u'0', None, None, 0),
tw@2512
   607
            (u'42.23', None, None, 42.23),
tw@2512
   608
            (u'-23.42', None, None, -23.42),
tw@2512
   609
            (u'-23.42E3', None, None, -23.42E3),
tw@2512
   610
            (u'23.42E-3', None, None, 23.42E-3),
tw@2512
   611
        ]
tw@2512
   612
        for arg, name, default, expected in tests:
tw@2512
   613
            assert wikiutil.get_float(self.request, arg, name, default) == expected
tw@2512
   614
tw@2512
   615
    def testGetFloatRaising(self):
tw@2512
   616
        # wrong default type
tw@2512
   617
        py.test.raises(AssertionError, wikiutil.get_float, self.request, None, None, u'42')
tw@2512
   618
tw@2512
   619
        # anything except None or unicode raises TypeError
tw@2512
   620
        py.test.raises(TypeError, wikiutil.get_float, self.request, True)
tw@2512
   621
        py.test.raises(TypeError, wikiutil.get_float, self.request, 42)
tw@2512
   622
        py.test.raises(TypeError, wikiutil.get_float, self.request, 42.0)
tw@2512
   623
        py.test.raises(TypeError, wikiutil.get_float, self.request, '')
tw@2512
   624
        py.test.raises(TypeError, wikiutil.get_float, self.request, tuple())
tw@2512
   625
        py.test.raises(TypeError, wikiutil.get_float, self.request, [])
tw@2512
   626
        py.test.raises(TypeError, wikiutil.get_float, self.request, {})
tw@2512
   627
tw@2512
   628
        # any value not convertable to int raises ValueError
tw@2512
   629
        py.test.raises(ValueError, wikiutil.get_float, self.request, u'')
tw@2512
   630
        py.test.raises(ValueError, wikiutil.get_float, self.request, u'wrong')
tw@2512
   631
        py.test.raises(ValueError, wikiutil.get_float, self.request, u'"47.11"') # must not be quoted!
tw@2512
   632
johannes@2558
   633
    def testGetComplex(self):
johannes@2558
   634
        tests = [
johannes@2558
   635
            # default testing for None value
johannes@2558
   636
            (None, None, None, None),
johannes@2558
   637
            (None, None, -23.42, -23.42),
johannes@2558
   638
            (None, None, 42.23, 42.23),
johannes@2558
   639
johannes@2558
   640
            # some real values
johannes@2558
   641
            (u'0', None, None, 0),
johannes@2558
   642
            (u'42.23', None, None, 42.23),
johannes@2558
   643
            (u'-23.42', None, None, -23.42),
johannes@2558
   644
            (u'-23.42E3', None, None, -23.42E3),
johannes@2558
   645
            (u'23.42E-3', None, None, 23.42E-3),
johannes@2558
   646
            (u'23.42E-3+3.04j', None, None, 23.42E-3+3.04j),
johannes@2558
   647
            (u'3.04j', None, None, 3.04j),
johannes@2558
   648
            (u'-3.04j', None, None, -3.04j),
johannes@2558
   649
            (u'23.42E-3+3.04i', None, None, 23.42E-3+3.04j),
johannes@2558
   650
            (u'3.04i', None, None, 3.04j),
johannes@2558
   651
            (u'-3.04i', None, None, -3.04j),
johannes@2558
   652
            (u'-3', None, None, -3L),
johannes@2558
   653
            (u'-300000000000000000000', None, None, -300000000000000000000L),
johannes@2558
   654
        ]
johannes@2558
   655
        for arg, name, default, expected in tests:
johannes@2558
   656
            assert wikiutil.get_complex(self.request, arg, name, default) == expected
johannes@2558
   657
johannes@2558
   658
    def testGetComplexRaising(self):
johannes@2558
   659
        # wrong default type
johannes@2558
   660
        py.test.raises(AssertionError, wikiutil.get_complex, self.request, None, None, u'42')
johannes@2558
   661
johannes@2558
   662
        # anything except None or unicode raises TypeError
johannes@2558
   663
        py.test.raises(TypeError, wikiutil.get_complex, self.request, True)
johannes@2558
   664
        py.test.raises(TypeError, wikiutil.get_complex, self.request, 42)
johannes@2558
   665
        py.test.raises(TypeError, wikiutil.get_complex, self.request, 42.0)
johannes@2558
   666
        py.test.raises(TypeError, wikiutil.get_complex, self.request, 3j)
johannes@2558
   667
        py.test.raises(TypeError, wikiutil.get_complex, self.request, '')
johannes@2558
   668
        py.test.raises(TypeError, wikiutil.get_complex, self.request, tuple())
johannes@2558
   669
        py.test.raises(TypeError, wikiutil.get_complex, self.request, [])
johannes@2558
   670
        py.test.raises(TypeError, wikiutil.get_complex, self.request, {})
johannes@2558
   671
johannes@2558
   672
        # any value not convertable to int raises ValueError
johannes@2558
   673
        py.test.raises(ValueError, wikiutil.get_complex, self.request, u'')
johannes@2558
   674
        py.test.raises(ValueError, wikiutil.get_complex, self.request, u'3jj')
johannes@2558
   675
        py.test.raises(ValueError, wikiutil.get_complex, self.request, u'3Ij')
johannes@2558
   676
        py.test.raises(ValueError, wikiutil.get_complex, self.request, u'3i-3i')
johannes@2558
   677
        py.test.raises(ValueError, wikiutil.get_complex, self.request, u'wrong')
johannes@2558
   678
        py.test.raises(ValueError, wikiutil.get_complex, self.request, u'"47.11"') # must not be quoted!
johannes@2558
   679
tw@2512
   680
    def testGetUnicode(self):
tw@2512
   681
        tests = [
tw@2512
   682
            # default testing for None value
tw@2512
   683
            (None, None, None, None),
tw@2512
   684
            (None, None, u'', u''),
tw@2512
   685
            (None, None, u'abc', u'abc'),
tw@2512
   686
tw@2512
   687
            # some real values
tw@2512
   688
            (u'', None, None, u''),
tw@2512
   689
            (u'abc', None, None, u'abc'),
tw@2512
   690
            (u'"abc"', None, None, u'"abc"'),
tw@2512
   691
        ]
tw@2512
   692
        for arg, name, default, expected in tests:
tw@2512
   693
            assert wikiutil.get_unicode(self.request, arg, name, default) == expected
tw@2512
   694
tw@2512
   695
    def testGetUnicodeRaising(self):
tw@2512
   696
        # wrong default type
tw@2512
   697
        py.test.raises(AssertionError, wikiutil.get_unicode, self.request, None, None, 42)
tw@2512
   698
tw@2512
   699
        # anything except None or unicode raises TypeError
tw@2512
   700
        py.test.raises(TypeError, wikiutil.get_unicode, self.request, True)
tw@2512
   701
        py.test.raises(TypeError, wikiutil.get_unicode, self.request, 42)
tw@2512
   702
        py.test.raises(TypeError, wikiutil.get_unicode, self.request, 42.0)
tw@2512
   703
        py.test.raises(TypeError, wikiutil.get_unicode, self.request, '')
tw@2512
   704
        py.test.raises(TypeError, wikiutil.get_unicode, self.request, tuple())
tw@2512
   705
        py.test.raises(TypeError, wikiutil.get_unicode, self.request, [])
tw@2512
   706
        py.test.raises(TypeError, wikiutil.get_unicode, self.request, {})
tw@2512
   707
tw@2512
   708
johannes@2543
   709
class TestExtensionInvoking:
johannes@2543
   710
    def _test_invoke_bool(self, b=bool):
johannes@2551
   711
        assert b is False
johannes@2543
   712
johannes@2543
   713
    def _test_invoke_bool_def(self, v=bool, b=False):
johannes@2543
   714
        assert b == v
johannes@2543
   715
        assert isinstance(b, bool)
johannes@2543
   716
        assert isinstance(v, bool)
johannes@2543
   717
johannes@2543
   718
    def _test_invoke_int_None(self, i=int):
johannes@2543
   719
        assert i == 1 or i is None
johannes@2543
   720
johannes@2543
   721
    def _test_invoke_float_None(self, i=float):
johannes@2543
   722
        assert i == 1.4 or i is None
johannes@2543
   723
johannes@2548
   724
    def _test_invoke_float_required(self, i=wikiutil.required_arg(float)):
johannes@2548
   725
        assert i == 1.4
johannes@2548
   726
johannes@2543
   727
    def _test_invoke_choice(self, a, choice=[u'a', u'b', u'c']):
johannes@2543
   728
        assert a == 7
johannes@2543
   729
        assert choice == u'a'
johannes@2543
   730
johannes@2543
   731
    def _test_invoke_choicet(self, a, choice=(u'a', u'b', u'c')):
johannes@2543
   732
        assert a == 7
johannes@2543
   733
        assert choice == u'a'
johannes@2543
   734
johannes@3371
   735
    def _test_invoke_choice_required(self, i=wikiutil.required_arg((u'b', u'a'))):
johannes@3371
   736
        assert i == u'a'
johannes@3371
   737
johannes@2543
   738
    def _test_trailing(self, a, _trailing_args=[]):
johannes@2543
   739
        assert _trailing_args == [u'a']
johannes@2543
   740
johannes@2547
   741
    def _test_arbitrary_kw(self, expect, _kwargs={}):
johannes@2547
   742
        assert _kwargs == expect
johannes@2543
   743
johannes@2543
   744
    def testInvoke(self):
johannes@2557
   745
        def _test_invoke_int(i=int):
johannes@2557
   746
            assert i == 1
johannes@2557
   747
johannes@2557
   748
        def _test_invoke_int_fixed(a, b, i=int):
johannes@2557
   749
            assert a == 7
johannes@2557
   750
            assert b == 8
johannes@2557
   751
            assert i == 1 or i is None
johannes@2557
   752
johannes@2543
   753
        ief = wikiutil.invoke_extension_function
johannes@2543
   754
        ief(self.request, self._test_invoke_bool, u'False')
johannes@2543
   755
        ief(self.request, self._test_invoke_bool, u'b=False')
johannes@2543
   756
        ief(self.request, _test_invoke_int, u'1')
johannes@2543
   757
        ief(self.request, _test_invoke_int, u'i=1')
johannes@2543
   758
        ief(self.request, self._test_invoke_bool_def, u'False, False')
johannes@2543
   759
        ief(self.request, self._test_invoke_bool_def, u'b=False, v=False')
johannes@2543
   760
        ief(self.request, self._test_invoke_bool_def, u'False')
johannes@2543
   761
        ief(self.request, self._test_invoke_int_None, u'i=1')
johannes@2543
   762
        ief(self.request, self._test_invoke_int_None, u'i=')
johannes@2543
   763
        ief(self.request, self._test_invoke_int_None, u'')
johannes@2543
   764
        py.test.raises(ValueError, ief, self.request,
johannes@2543
   765
                       self._test_invoke_int_None, u'x')
johannes@2543
   766
        py.test.raises(ValueError, ief, self.request,
johannes@2543
   767
                       self._test_invoke_int_None, u'""')
johannes@2543
   768
        py.test.raises(ValueError, ief, self.request,
johannes@2543
   769
                       self._test_invoke_int_None, u'i=""')
johannes@2546
   770
        py.test.raises(ValueError, ief, self.request,
johannes@2543
   771
                       _test_invoke_int_fixed, u'a=7', [7, 8])
johannes@2543
   772
        ief(self.request, _test_invoke_int_fixed, u'i=1', [7, 8])
johannes@2543
   773
        py.test.raises(ValueError, ief, self.request,
johannes@2543
   774
                       _test_invoke_int_fixed, u'i=""', [7, 8])
johannes@2543
   775
        ief(self.request, _test_invoke_int_fixed, u'i=', [7, 8])
johannes@2543
   776
johannes@2543
   777
        for choicefn in (self._test_invoke_choice, self._test_invoke_choicet):
johannes@2543
   778
            ief(self.request, choicefn, u'', [7])
johannes@2543
   779
            ief(self.request, choicefn, u'choice=a', [7])
johannes@2543
   780
            ief(self.request, choicefn, u'choice=', [7])
johannes@2543
   781
            ief(self.request, choicefn, u'choice="a"', [7])
johannes@2543
   782
            py.test.raises(ValueError, ief, self.request,
johannes@2543
   783
                           choicefn, u'x', [7])
johannes@2543
   784
            py.test.raises(ValueError, ief, self.request,
johannes@2543
   785
                           choicefn, u'choice=x', [7])
johannes@2543
   786
johannes@2543
   787
        ief(self.request, self._test_invoke_float_None, u'i=1.4')
johannes@2543
   788
        ief(self.request, self._test_invoke_float_None, u'i=')
johannes@2543
   789
        ief(self.request, self._test_invoke_float_None, u'')
johannes@2543
   790
        ief(self.request, self._test_invoke_float_None, u'1.4')
johannes@2543
   791
        py.test.raises(ValueError, ief, self.request,
johannes@2543
   792
                       self._test_invoke_float_None, u'x')
johannes@2543
   793
        py.test.raises(ValueError, ief, self.request,
johannes@2543
   794
                       self._test_invoke_float_None, u'""')
johannes@2543
   795
        py.test.raises(ValueError, ief, self.request,
johannes@2543
   796
                       self._test_invoke_float_None, u'i=""')
johannes@2543
   797
        ief(self.request, self._test_trailing, u'a=7, a')
johannes@2550
   798
        ief(self.request, self._test_trailing, u'7, a')
johannes@2543
   799
        ief(self.request, self._test_arbitrary_kw, u'test=x, \xc3=test',
johannes@2547
   800
            [{u'\xc3': 'test', 'test': u'x'}])
johannes@2543
   801
        ief(self.request, self._test_arbitrary_kw, u'test=x, "\xc3"=test',
johannes@2547
   802
            [{u'\xc3': 'test', 'test': u'x'}])
johannes@2543
   803
        ief(self.request, self._test_arbitrary_kw, u'test=x, "7 \xc3"=test',
johannes@2547
   804
            [{u'7 \xc3': 'test', 'test': u'x'}])
johannes@2543
   805
        ief(self.request, self._test_arbitrary_kw, u'test=x, 7 \xc3=test',
johannes@2547
   806
            [{u'7 \xc3': 'test', 'test': u'x'}])
johannes@2543
   807
        ief(self.request, self._test_arbitrary_kw, u'7 \xc3=test, test= x ',
johannes@2547
   808
            [{u'7 \xc3': 'test', 'test': u'x'}])
johannes@2548
   809
        py.test.raises(ValueError, ief, self.request,
johannes@2548
   810
                       self._test_invoke_float_required, u'')
johannes@2548
   811
        ief(self.request, self._test_invoke_float_required, u'1.4')
johannes@2548
   812
        ief(self.request, self._test_invoke_float_required, u'i=1.4')
johannes@2548
   813
        py.test.raises(ValueError, ief, self.request,
johannes@3371
   814
                       self._test_invoke_choice_required, u'')
johannes@3371
   815
        ief(self.request, self._test_invoke_choice_required, u'a')
johannes@3371
   816
        ief(self.request, self._test_invoke_choice_required, u'i=a')
johannes@3371
   817
        py.test.raises(ValueError, ief, self.request,
johannes@2548
   818
                       self._test_invoke_float_required, u',')
johannes@2543
   819
johannes@2557
   820
    def testConstructors(self):
johannes@2557
   821
        ief = wikiutil.invoke_extension_function
johannes@2557
   822
johannes@2557
   823
        # new style class
johannes@2557
   824
        class TEST1(object):
johannes@2557
   825
            def __init__(self, a=int):
johannes@2557
   826
                self.constructed = True
johannes@2557
   827
                assert a == 7
johannes@2557
   828
johannes@2557
   829
        class TEST2(TEST1):
johannes@2557
   830
            pass
johannes@2557
   831
johannes@2557
   832
        obj = ief(self.request, TEST1, u'a=7')
johannes@2557
   833
        assert isinstance(obj, TEST1)
johannes@2557
   834
        assert obj.constructed
johannes@2557
   835
        py.test.raises(ValueError, ief, self.request, TEST1, u'b')
johannes@2557
   836
johannes@2557
   837
        obj = ief(self.request, TEST2, u'a=7')
johannes@2557
   838
        assert isinstance(obj, TEST1)
johannes@2557
   839
        assert isinstance(obj, TEST2)
johannes@2557
   840
        assert obj.constructed
johannes@2557
   841
        py.test.raises(ValueError, ief, self.request, TEST2, u'b')
johannes@2557
   842
johannes@2557
   843
        # old style class
johannes@2557
   844
        class TEST3:
johannes@2557
   845
            def __init__(self, a=int):
johannes@2557
   846
                self.constructed = True
johannes@2557
   847
                assert a == 7
johannes@2557
   848
johannes@2557
   849
        class TEST4(TEST3):
johannes@2557
   850
            pass
johannes@2557
   851
johannes@2557
   852
        obj = ief(self.request, TEST3, u'a=7')
johannes@2557
   853
        assert isinstance(obj, TEST3)
johannes@2557
   854
        assert obj.constructed
johannes@2557
   855
        py.test.raises(ValueError, ief, self.request, TEST3, u'b')
johannes@2557
   856
johannes@2557
   857
        obj = ief(self.request, TEST4, u'a=7')
johannes@2557
   858
        assert isinstance(obj, TEST3)
johannes@2557
   859
        assert isinstance(obj, TEST4)
johannes@2557
   860
        assert obj.constructed
johannes@2557
   861
        py.test.raises(ValueError, ief, self.request, TEST4, u'b')
johannes@2557
   862
johannes@2557
   863
    def testFailing(self):
johannes@2557
   864
        ief = wikiutil.invoke_extension_function
johannes@2557
   865
johannes@2557
   866
        py.test.raises(TypeError, ief, self.request, hex, u'15')
johannes@2557
   867
        py.test.raises(TypeError, ief, self.request, cmp, u'15')
johannes@2557
   868
        py.test.raises(AttributeError, ief, self.request, unicode, u'15')
johannes@2557
   869
johannes@2557
   870
    def testAllDefault(self):
johannes@2557
   871
        ief = wikiutil.invoke_extension_function
johannes@2557
   872
johannes@2557
   873
        def has_many_defaults(a=1, b=2, c=3, d=4):
johannes@2557
   874
            assert a == 1
johannes@2557
   875
            assert b == 2
johannes@2557
   876
            assert c == 3
johannes@2557
   877
            assert d == 4
johannes@2557
   878
            return True
johannes@2557
   879
johannes@2557
   880
        assert ief(self.request, has_many_defaults, u'1, 2, 3, 4')
johannes@2557
   881
        assert ief(self.request, has_many_defaults, u'2, 3, 4', [1])
johannes@2557
   882
        assert ief(self.request, has_many_defaults, u'3, 4', [1, 2])
johannes@2557
   883
        assert ief(self.request, has_many_defaults, u'4', [1, 2, 3])
johannes@2557
   884
        assert ief(self.request, has_many_defaults, u'', [1, 2, 3, 4])
johannes@2557
   885
        assert ief(self.request, has_many_defaults, u'd=4,c=3,b=2,a=1')
johannes@2557
   886
        assert ief(self.request, has_many_defaults, u'd=4,c=3,b=2', [1])
johannes@2557
   887
        assert ief(self.request, has_many_defaults, u'd=4,c=3', [1, 2])
johannes@2557
   888
        assert ief(self.request, has_many_defaults, u'd=4', [1, 2, 3])
johannes@2557
   889
johannes@2558
   890
    def testInvokeComplex(self):
johannes@2558
   891
        ief = wikiutil.invoke_extension_function
johannes@2558
   892
johannes@2558
   893
        def has_complex(a=complex, b=complex):
johannes@2558
   894
            assert a == b
johannes@2558
   895
            return True
johannes@2558
   896
johannes@2558
   897
        assert ief(self.request, has_complex, u'3-3i, 3-3j')
johannes@2558
   898
        assert ief(self.request, has_complex, u'2i, 2j')
johannes@2558
   899
        assert ief(self.request, has_complex, u'b=2i, a=2j')
johannes@2558
   900
        assert ief(self.request, has_complex, u'2.007, 2.007')
johannes@2558
   901
        assert ief(self.request, has_complex, u'2.007', [2.007])
johannes@2558
   902
        assert ief(self.request, has_complex, u'b=2.007', [2.007])
johannes@2558
   903
johannes@2557
   904
johannes@2567
   905
class TestAnchorNames:
johannes@2567
   906
    def test_anchor_name_encoding(self):
johannes@2567
   907
        tests = [
johannes@2567
   908
            # text                    expected output
johannes@2568
   909
            (u'\xf6\xf6ll\xdf\xdf',   'A.2BAPYA9g-ll.2BAN8A3w-'),
tw@4555
   910
            (u'level 2',              'level_2'),
tw@4555
   911
            (u'level_2',              'level_2'),
johannes@2568
   912
            (u'',                     'A'),
johannes@2568
   913
            (u'123',                  'A123'),
tw@4559
   914
            # make sure that a valid anchor is not modified:
tw@4559
   915
            (u'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789:_.-',
tw@4559
   916
             u'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789:_.-')
johannes@2567
   917
        ]
johannes@2567
   918
        for text, expected in tests:
johannes@2567
   919
            yield self._check, text, expected
johannes@2567
   920
johannes@2567
   921
    def _check(self, text, expected):
johannes@2567
   922
        encoded = wikiutil.anchor_name_from_text(text)
johannes@2567
   923
        assert expected == encoded
johannes@2567
   924
tw@2771
   925
class TestPageLinkMarkup:
tw@2771
   926
    def test_pagelinkmarkup(self):
tw@2771
   927
        tests = [
tw@2773
   928
            # pagename (no link text), expected markup
tw@2773
   929
            (('SomePage', ), 'SomePage'),
tw@2773
   930
            (('Somepage', ), '[[Somepage]]'),
tw@2773
   931
            (('somepage', ), '[[somepage]]'),
tw@2773
   932
            (('Some Page', ), '[[Some Page]]'),
tw@2773
   933
            # with link text
tw@2773
   934
            (('SomePage', 'SomePage'), 'SomePage'),
tw@2773
   935
            (('SomePage', 'some page'), '[[SomePage|some page]]'),
tw@2773
   936
            (('Some Page', 'Some Page'), '[[Some Page]]'),
tw@2773
   937
            (('Some Page', 'some Page'), '[[Some Page|some Page]]'),
tw@2771
   938
        ]
tw@2773
   939
        for params, expected in tests:
tw@2773
   940
            yield self._check, params, expected
tw@2771
   941
tw@2773
   942
    def _check(self, params, expected):
tw@2773
   943
        assert expected == wikiutil.pagelinkmarkup(*params)
tw@2771
   944
tw@2704
   945
class TestRelativeTools:
tw@2705
   946
    tests = [
tw@2705
   947
        # test                      expected output
tw@2705
   948
        # CHILD_PREFIX
tw@2705
   949
        (('MainPage', '/SubPage1'), 'MainPage/SubPage1'),
tw@2705
   950
        (('MainPage', '/SubPage1/SubPage2'), 'MainPage/SubPage1/SubPage2'),
tw@2705
   951
        (('MainPage/SubPage1', '/SubPage2/SubPage3'), 'MainPage/SubPage1/SubPage2/SubPage3'),
tw@2705
   952
        (('', '/OtherMainPage'), 'OtherMainPage'), # strange
tw@2705
   953
        # PARENT_PREFIX
tw@2705
   954
        (('MainPage/SubPage', '../SisterPage'), 'MainPage/SisterPage'),
tw@2705
   955
        (('MainPage/SubPage1/SubPage2', '../SisterPage'), 'MainPage/SubPage1/SisterPage'),
tw@2705
   956
        (('MainPage/SubPage1/SubPage2', '../../SisterPage'), 'MainPage/SisterPage'),
tw@2705
   957
        (('MainPage', '../SisterPage'), 'SisterPage'), # strange
tw@2705
   958
    ]
tw@2704
   959
    def test_abs_pagename(self):
tw@2705
   960
        for (current_page, relative_page), absolute_page in self.tests:
tw@2705
   961
            yield self._check_abs_pagename, current_page, relative_page, absolute_page
tw@2704
   962
tw@2705
   963
    def _check_abs_pagename(self, current_page, relative_page, absolute_page):
tw@2706
   964
        assert absolute_page == wikiutil.AbsPageName(current_page, relative_page)
tw@2705
   965
tw@2705
   966
    def test_rel_pagename(self):
tw@2705
   967
        for (current_page, relative_page), absolute_page in self.tests:
tw@2705
   968
            yield self._check_rel_pagename, current_page, absolute_page, relative_page
tw@2705
   969
tw@2705
   970
    def _check_rel_pagename(self, current_page, absolute_page, relative_page):
tw@2706
   971
        assert relative_page == wikiutil.RelPageName(current_page, absolute_page)
tw@2705
   972
tw@2704
   973
florian@4146
   974
class TestNormalizePagename(object):
florian@4146
   975
florian@4146
   976
    def testPageInvalidChars(self):
florian@4146
   977
        """ request: normalize pagename: remove invalid unicode chars
florian@4146
   978
florian@4146
   979
        Assume the default setting
florian@4146
   980
        """
florian@4146
   981
        test = u'\u0000\u202a\u202b\u202c\u202d\u202e'
florian@4146
   982
        expected = u''
florian@4199
   983
        result = wikiutil.normalize_pagename(test, self.request.cfg)
florian@4146
   984
        assert result == expected
florian@4146
   985
florian@4146
   986
    def testNormalizeSlashes(self):
florian@4146
   987
        """ request: normalize pagename: normalize slashes """
florian@4146
   988
        cases = (
florian@4146
   989
            (u'/////', u''),
florian@4146
   990
            (u'/a', u'a'),
florian@4146
   991
            (u'a/', u'a'),
florian@4146
   992
            (u'a/////b/////c', u'a/b/c'),
florian@4146
   993
            (u'a b/////c d/////e f', u'a b/c d/e f'),
florian@4146
   994
            )
florian@4146
   995
        for test, expected in cases:
florian@4199
   996
            result = wikiutil.normalize_pagename(test, self.request.cfg)
florian@4146
   997
            assert result == expected
florian@4146
   998
florian@4146
   999
    def testNormalizeWhitespace(self):
florian@4146
  1000
        """ request: normalize pagename: normalize whitespace """
florian@4146
  1001
        cases = (
florian@4146
  1002
            (u'         ', u''),
florian@4146
  1003
            (u'    a', u'a'),
florian@4146
  1004
            (u'a    ', u'a'),
florian@4146
  1005
            (u'a     b     c', u'a b c'),
florian@4146
  1006
            (u'a   b  /  c    d  /  e   f', u'a b/c d/e f'),
florian@4146
  1007
            # All 30 unicode spaces
florian@4146
  1008
            (config.chars_spaces, u''),
florian@4146
  1009
            )
florian@4146
  1010
        for test, expected in cases:
florian@4199
  1011
            result = wikiutil.normalize_pagename(test, self.request.cfg)
florian@4146
  1012
            assert result == expected
florian@4146
  1013
florian@4146
  1014
    def testUnderscoreTestCase(self):
florian@4146
  1015
        """ request: normalize pagename: underscore convert to spaces and normalized
florian@4146
  1016
florian@4146
  1017
        Underscores should convert to spaces, then spaces should be
florian@4146
  1018
        normalized, order is important!
florian@4146
  1019
        """
florian@4146
  1020
        cases = (
florian@4146
  1021
            (u'         ', u''),
florian@4146
  1022
            (u'  a', u'a'),
florian@4146
  1023
            (u'a  ', u'a'),
florian@4146
  1024
            (u'a  b  c', u'a b c'),
florian@4146
  1025
            (u'a  b  /  c  d  /  e  f', u'a b/c d/e f'),
florian@4146
  1026
            )
florian@4146
  1027
        for test, expected in cases:
florian@4199
  1028
            result = wikiutil.normalize_pagename(test, self.request.cfg)
florian@4146
  1029
            assert result == expected
florian@4146
  1030
florian@4146
  1031
class TestGroupPages(object):
florian@4146
  1032
florian@4146
  1033
    def testNormalizeGroupName(self):
florian@4146
  1034
        """ request: normalize pagename: restrict groups to alpha numeric Unicode
florian@4146
  1035
florian@4146
  1036
        Spaces should normalize after invalid chars removed!
florian@4146
  1037
        """
florian@4146
  1038
        cases = (
florian@4146
  1039
            # current acl chars
florian@4146
  1040
            (u'Name,:Group', u'NameGroup'),
florian@4146
  1041
            # remove than normalize spaces
florian@4146
  1042
            (u'Name ! @ # $ % ^ & * ( ) + Group', u'Name Group'),
florian@4146
  1043
            )
florian@4146
  1044
        for test, expected in cases:
florian@4146
  1045
            # validate we are testing valid group names
florian@4146
  1046
            if wikiutil.isGroupPage(test, self.request.cfg):
florian@4199
  1047
                result = wikiutil.normalize_pagename(test, self.request.cfg)
florian@4146
  1048
                assert result == expected
florian@4146
  1049
tw@2448
  1050
coverage_modules = ['MoinMoin.wikiutil']