/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5820.1.3 by INADA Naoki
Move tests for utextwrap from the module to bzrlib.tests.
1
# Copyright (C) 2011 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
#
17
18
"""Tests of the bzrlib.utextwrap."""
19
5920.1.1 by Vincent Ladeuil
Skip tests broken by sphinx monkeypatching
20
from bzrlib import (
21
    tests,
22
    utextwrap,
23
    )
24
from bzrlib.tests import features
25
5820.1.3 by INADA Naoki
Move tests for utextwrap from the module to bzrlib.tests.
26
27
# Japanese "Good morning".
28
# Each character have double width. So total 8 width on console.
29
_str_D = u'\u304a\u306f\u3088\u3046'
30
31
_str_S = u"hello"
32
33
# Combine single width characters and double width characters.
34
_str_SD = _str_S + _str_D
35
_str_DS = _str_D + _str_S
36
37
class TestUTextWrap(tests.TestCase):
38
5820.1.10 by INADA Naoki
utextwrap: Change a way to split between CJK characters.
39
    def check_width(self, text, expected_width):
5820.1.19 by INADA Naoki
Add keyword parameter 'ambiguous_width' that specifies width for character
40
        w = utextwrap.UTextWrapper()
5820.1.3 by INADA Naoki
Move tests for utextwrap from the module to bzrlib.tests.
41
        self.assertEqual(
5820.1.19 by INADA Naoki
Add keyword parameter 'ambiguous_width' that specifies width for character
42
                w._width(text),
5820.1.3 by INADA Naoki
Move tests for utextwrap from the module to bzrlib.tests.
43
                expected_width,
44
                "Width of %r should be %d" % (text, expected_width))
45
5820.1.19 by INADA Naoki
Add keyword parameter 'ambiguous_width' that specifies width for character
46
    def test_width(self):
5820.1.10 by INADA Naoki
utextwrap: Change a way to split between CJK characters.
47
        self.check_width(_str_D, 8)
48
        self.check_width(_str_SD, 13)
49
50
    def check_cut(self, text, width, pos):
5820.1.19 by INADA Naoki
Add keyword parameter 'ambiguous_width' that specifies width for character
51
        w = utextwrap.UTextWrapper()
52
        self.assertEqual((text[:pos], text[pos:]), w._cut(text, width))
5820.1.10 by INADA Naoki
utextwrap: Change a way to split between CJK characters.
53
54
    def test_cut(self):
55
        s = _str_SD
56
        self.check_cut(s, 0, 0)
57
        self.check_cut(s, 1, 1)
58
        self.check_cut(s, 5, 5)
59
        self.check_cut(s, 6, 5)
60
        self.check_cut(s, 7, 6)
61
        self.check_cut(s, 12, 8)
62
        self.check_cut(s, 13, 9)
63
        self.check_cut(s, 14, 9)
5820.1.17 by INADA Naoki
Drop supporting byte string in private functions.
64
        self.check_cut(u'A'*5, 3, 3)
5820.1.10 by INADA Naoki
utextwrap: Change a way to split between CJK characters.
65
66
    def test_split(self):
67
        w = utextwrap.UTextWrapper()
5820.1.12 by Vincent Ladeuil
Use assert(expected, actual) style and split some tests.
68
        self.assertEqual(list(_str_D), w._split(_str_D))
69
        self.assertEqual([_str_S]+list(_str_D), w._split(_str_SD))
70
        self.assertEqual(list(_str_D)+[_str_S], w._split(_str_DS))
5820.1.5 by INADA Naoki
Make UTextWrapper support byte string and add tests including Python's
71
5820.1.3 by INADA Naoki
Move tests for utextwrap from the module to bzrlib.tests.
72
    def test_wrap(self):
5820.1.12 by Vincent Ladeuil
Use assert(expected, actual) style and split some tests.
73
        self.assertEqual(list(_str_D), utextwrap.wrap(_str_D, 1))
74
        self.assertEqual(list(_str_D), utextwrap.wrap(_str_D, 2))
75
        self.assertEqual(list(_str_D), utextwrap.wrap(_str_D, 3))
76
        self.assertEqual(list(_str_D),
77
                         utextwrap.wrap(_str_D, 3, break_long_words=False))
5820.1.5 by INADA Naoki
Make UTextWrapper support byte string and add tests including Python's
78
5820.1.13 by Vincent Ladeuil
Use a dedicated class for 'fill' tests.
79
class TestUTextFill(tests.TestCase):
80
5820.1.12 by Vincent Ladeuil
Use assert(expected, actual) style and split some tests.
81
    def test_fill_simple(self):
5820.1.7 by INADA Naoki
Add test for fill.
82
        # Test only can call fill() because it's just '\n'.join(wrap(text)).
5820.1.12 by Vincent Ladeuil
Use assert(expected, actual) style and split some tests.
83
        self.assertEqual("%s\n%s" % (_str_D[:2], _str_D[2:]),
84
                         utextwrap.fill(_str_D, 4))
5820.1.5 by INADA Naoki
Make UTextWrapper support byte string and add tests including Python's
85
5820.1.12 by Vincent Ladeuil
Use assert(expected, actual) style and split some tests.
86
    def test_fill_with_breaks(self):
5820.1.8 by INADA Naoki
Add two tests for fill demonstrates complicated cases. The second test fails
87
        # Demonstrate complicated case.
88
        text = u"spam ham egg spamhamegg" + _str_D + u" spam" + _str_D*2
5820.1.12 by Vincent Ladeuil
Use assert(expected, actual) style and split some tests.
89
        self.assertEqual(u'\n'.join(["spam ham",
90
                                     "egg spam",
91
                                     "hamegg" + _str_D[0],
92
                                     _str_D[1:],
93
                                     "spam" + _str_D[:2],
94
                                     _str_D[2:]+_str_D[:2],
95
                                     _str_D[2:]]),
96
                         utextwrap.fill(text, 8))
97
98
    def test_fill_without_breaks(self):
99
        text = u"spam ham egg spamhamegg" + _str_D + u" spam" + _str_D*2
100
        self.assertEqual(u'\n'.join(["spam ham",
101
                                     "egg",
102
                                     "spamhamegg", 
103
                                     # border between single width and double
104
                                     # width.
105
                                     _str_D,
106
                                     "spam" + _str_D[:2],
107
                                     _str_D[2:]+_str_D[:2],
108
                                     _str_D[2:]]),
5820.1.19 by INADA Naoki
Add keyword parameter 'ambiguous_width' that specifies width for character
109
                         utextwrap.fill(text, 8, break_long_words=False))
5820.1.12 by Vincent Ladeuil
Use assert(expected, actual) style and split some tests.
110
111
    def test_fill_indent_with_breaks(self):
112
        w = utextwrap.UTextWrapper(8, initial_indent=' '*4,
113
                                   subsequent_indent=' '*4)
114
        self.assertEqual(u'\n'.join(["    hell",
115
                                     "    o" + _str_D[0],
116
                                     "    " + _str_D[1:3],
117
                                     "    " + _str_D[3]
118
                                     ]),
119
                         w.fill(_str_SD))
120
121
    def test_fill_indent_without_breaks(self):
122
        w = utextwrap.UTextWrapper(8, initial_indent=' '*4,
123
                                   subsequent_indent=' '*4)
124
        w.break_long_words = False
125
        self.assertEqual(u'\n'.join(["    hello",
126
                                     "    " + _str_D[:2],
127
                                     "    " + _str_D[2:],
128
                                     ]),
129
                         w.fill(_str_SD))
130
131
    def test_fill_indent_without_breaks_with_fixed_width(self):
132
        w = utextwrap.UTextWrapper(8, initial_indent=' '*4,
133
                                   subsequent_indent=' '*4)
134
        w.break_long_words = False
5820.1.11 by INADA Naoki
Add some test cases.
135
        w.width = 3
5820.1.12 by Vincent Ladeuil
Use assert(expected, actual) style and split some tests.
136
        self.assertEqual(u'\n'.join(["    hello",
137
                                     "    " + _str_D[0],
138
                                     "    " + _str_D[1],
139
                                     "    " + _str_D[2],
140
                                     "    " + _str_D[3],
141
                                     ]),
142
                         w.fill(_str_SD))
5820.1.11 by INADA Naoki
Add some test cases.
143
5820.1.19 by INADA Naoki
Add keyword parameter 'ambiguous_width' that specifies width for character
144
class TestUTextWrapAmbiWidth(tests.TestCase):
145
    _cyrill_char = u"\u0410" # east_asian_width() == 'A'
146
147
    def test_ambiwidth1(self):
148
        w = utextwrap.UTextWrapper(4, ambiguous_width=1)
149
        s = self._cyrill_char*8
150
        self.assertEqual([self._cyrill_char*4]*2, w.wrap(s))
151
152
    def test_ambiwidth2(self):
153
        w = utextwrap.UTextWrapper(4, ambiguous_width=2)
154
        s = self._cyrill_char*8
155
        self.assertEqual([self._cyrill_char*2]*4, w.wrap(s))
156
5820.1.8 by INADA Naoki
Add two tests for fill demonstrates complicated cases. The second test fails
157
5820.1.5 by INADA Naoki
Make UTextWrapper support byte string and add tests including Python's
158
# Regression test with Python's test_textwrap
159
# Note that some distribution including Ubuntu doesn't install
160
# Python's test suite.
161
try:
5820.1.14 by Vincent Ladeuil
Properly override test symbols in the imported test module so they are restored after the tests are run.
162
    from test import test_textwrap
163
164
    def override_textwrap_symbols(testcase):
165
        # Override the symbols imported by test_textwrap so it uses our own
166
        # replacements.
167
        testcase.overrideAttr(test_textwrap, 'TextWrapper',
168
                              utextwrap.UTextWrapper)
169
        testcase.overrideAttr(test_textwrap, 'wrap', utextwrap.wrap)
170
        testcase.overrideAttr(test_textwrap, 'fill', utextwrap.fill)
171
172
173
    def setup_both(testcase, base_class, reused_class):
5920.1.1 by Vincent Ladeuil
Skip tests broken by sphinx monkeypatching
174
        
175
        if (features.sphinx.available()):
176
            # Until https://bitbucket.org/birkenfeld/sphinx/issue/706 is fixed,
177
            # we can't run these tests when sphinx <= 1.0.1
178
            version = tuple(map(int,
179
                                features.sphinx.module.__version__.split('.')))
180
            if version <= (1, 0, 1):
181
                raise tests.TestSkipped('sphinx monkeypatch textwrap')
182
        testcase.debug()
5820.1.14 by Vincent Ladeuil
Properly override test symbols in the imported test module so they are restored after the tests are run.
183
        super(base_class, testcase).setUp()
184
        override_textwrap_symbols(testcase)
185
        reused_class.setUp(testcase)
186
187
188
    class TestWrap(tests.TestCase, test_textwrap.WrapTestCase):
189
190
        def setUp(self):
191
            setup_both(self, TestWrap, test_textwrap.WrapTestCase)
192
193
194
    class TestLongWord(tests.TestCase, test_textwrap.LongWordTestCase):
195
196
        def setUp(self):
197
            setup_both(self, TestLongWord, test_textwrap.LongWordTestCase)
198
199
200
    class TestIndent(tests.TestCase, test_textwrap.IndentTestCases):
201
202
        def setUp(self):
203
            setup_both(self, TestIndent, test_textwrap.IndentTestCases)
204
5820.1.5 by INADA Naoki
Make UTextWrapper support byte string and add tests including Python's
205
except ImportError:
5820.1.28 by INADA Naoki
Notify when test_textwrap is skipped.
206
207
    class TestWrap(tests.TestCase):
208
209
        def test_wrap(self):
5920.1.1 by Vincent Ladeuil
Skip tests broken by sphinx monkeypatching
210
            raise tests.TestSkipped("test.test_textwrap is not available.")
5820.1.28 by INADA Naoki
Notify when test_textwrap is skipped.
211
212
    class TestLongWord(tests.TestCase):
213
214
        def test_longword(self):
5920.1.1 by Vincent Ladeuil
Skip tests broken by sphinx monkeypatching
215
            raise tests.TestSkipped("test.test_textwrap is not available.")
5820.1.28 by INADA Naoki
Notify when test_textwrap is skipped.
216
217
    class TestIndent(tests.TestCase):
218
219
        def test_indent(self):
5920.1.1 by Vincent Ladeuil
Skip tests broken by sphinx monkeypatching
220
            raise tests.TestSkipped("test.test_textwrap is not available.")