~bzr-pqm/bzr/bzr.dev

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):
5933.1.2 by Vincent Ladeuil
sphinx-1.0.7 still has bug #785098
174
5920.1.1 by Vincent Ladeuil
Skip tests broken by sphinx monkeypatching
175
        if (features.sphinx.available()):
176
            # Until https://bitbucket.org/birkenfeld/sphinx/issue/706 is fixed,
5920.1.2 by Vincent Ladeuil
Fixed as per poolie's review.
177
            # we can't run these tests when sphinx <= 1.0.1 as it breaks
178
            # textwrap.TextWrapper.wordsep_re
5920.1.1 by Vincent Ladeuil
Skip tests broken by sphinx monkeypatching
179
            version = tuple(map(int,
180
                                features.sphinx.module.__version__.split('.')))
5933.1.2 by Vincent Ladeuil
sphinx-1.0.7 still has bug #785098
181
            if version <= (1, 0, 7):
5920.1.2 by Vincent Ladeuil
Fixed as per poolie's review.
182
                raise tests.TestSkipped(
183
                    'sphinx textwrap monkeypatch breaks utextwrap')
5820.1.14 by Vincent Ladeuil
Properly override test symbols in the imported test module so they are restored after the tests are run.
184
        super(base_class, testcase).setUp()
185
        override_textwrap_symbols(testcase)
186
        reused_class.setUp(testcase)
187
188
189
    class TestWrap(tests.TestCase, test_textwrap.WrapTestCase):
190
191
        def setUp(self):
192
            setup_both(self, TestWrap, test_textwrap.WrapTestCase)
193
194
195
    class TestLongWord(tests.TestCase, test_textwrap.LongWordTestCase):
196
197
        def setUp(self):
198
            setup_both(self, TestLongWord, test_textwrap.LongWordTestCase)
199
200
201
    class TestIndent(tests.TestCase, test_textwrap.IndentTestCases):
202
203
        def setUp(self):
204
            setup_both(self, TestIndent, test_textwrap.IndentTestCases)
205
5820.1.5 by INADA Naoki
Make UTextWrapper support byte string and add tests including Python's
206
except ImportError:
5820.1.28 by INADA Naoki
Notify when test_textwrap is skipped.
207
208
    class TestWrap(tests.TestCase):
209
210
        def test_wrap(self):
5920.1.1 by Vincent Ladeuil
Skip tests broken by sphinx monkeypatching
211
            raise tests.TestSkipped("test.test_textwrap is not available.")
5820.1.28 by INADA Naoki
Notify when test_textwrap is skipped.
212
213
    class TestLongWord(tests.TestCase):
214
215
        def test_longword(self):
5920.1.1 by Vincent Ladeuil
Skip tests broken by sphinx monkeypatching
216
            raise tests.TestSkipped("test.test_textwrap is not available.")
5820.1.28 by INADA Naoki
Notify when test_textwrap is skipped.
217
218
    class TestIndent(tests.TestCase):
219
220
        def test_indent(self):
5920.1.1 by Vincent Ladeuil
Skip tests broken by sphinx monkeypatching
221
            raise tests.TestSkipped("test.test_textwrap is not available.")