/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_progress.py

Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.

This is used to replace various ad hoc implementations of the same logic,
notably the version used in registry's _LazyObjectGetter which had a bug when
getting a module without also getting a member.  And of course, this new
function has unit tests, unlike the replaced code.

This also adds a KnownHooksRegistry subclass to provide a more natural home for
some other logic.

I'm not thrilled about the name of the new module or the new functions, but it's
hard to think of good names for such generic functionality.

Show diffs side-by-side

added added

removed removed

Lines of Context:
58
58
    def make_view(self):
59
59
        out = StringIO()
60
60
        view = TextProgressView(out)
61
 
        view._width = 80
 
61
        view._avail_width = lambda: 79
62
62
        return out, view
63
63
    
64
64
    def make_task(self, parent_task, view, msg, curr, total):
70
70
        task.total_cnt = total
71
71
        return task
72
72
 
 
73
    def test_clear(self):
 
74
        # <https://bugs.launchpad.net/bzr/+bug/611127> clear must actually
 
75
        # send spaces to clear the line
 
76
        out, view = self.make_view()
 
77
        task = self.make_task(None, view, 'reticulating splines', 5, 20)
 
78
        view.show_progress(task)
 
79
        self.assertEqual(
 
80
'\r/ reticulating splines 5/20                                                    \r'
 
81
            , out.getvalue())
 
82
        view.clear()
 
83
        self.assertEqual(
 
84
'\r/ reticulating splines 5/20                                                    \r'
 
85
            + '\r' + 79 * ' ' + '\r',
 
86
            out.getvalue())
 
87
 
73
88
    def test_render_progress_no_bar(self):
74
89
        """The default view now has a spinner but no bar."""
75
90
        out, view = self.make_view()
100
115
        # so we're in the first half of the main task, and half way through
101
116
        # that
102
117
        self.assertEqual(
103
 
r'[####-               ] reticulating splines:stage2 1/2'
 
118
'[####-               ] reticulating splines:stage2 1/2                         '
104
119
            , view._render_line())
105
120
        # if the nested task is complete, then we're all the way through the
106
121
        # first half of the overall work
107
122
        task2.update('stage2', 2, 2)
108
123
        self.assertEqual(
109
 
r'[#########\          ] reticulating splines:stage2 2/2'
 
124
'[#########\          ] reticulating splines:stage2 2/2                         '
110
125
            , view._render_line())
111
126
 
112
127
    def test_render_progress_sub_nested(self):
123
138
        # progress indication, just a label; and the bottom one is half done,
124
139
        # so the overall fraction is 1/4
125
140
        self.assertEqual(
126
 
            r'[####|               ] a:b:c 1/2'
 
141
'[####|               ] a:b:c 1/2                                               '
127
142
            , view._render_line())
 
143
 
 
144
    def test_render_truncated(self):
 
145
        # when the bar is too long for the terminal, we prefer not to truncate
 
146
        # the counters because they might be interesting, and because
 
147
        # truncating the numbers might be misleading
 
148
        out, view = self.make_view()
 
149
        task_a = ProgressTask(None, progress_view=view)
 
150
        task_a.update('start_' + 'a' * 200 + '_end', 2000, 5000)
 
151
        line = view._render_line()
 
152
        self.assertEqual(
 
153
'- start_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.. 2000/5000',
 
154
           line) 
 
155
        self.assertEqual(len(line), 79)
 
156
 
 
157
 
 
158
    def test_render_with_activity(self):
 
159
        # if the progress view has activity, it's shown before the spinner
 
160
        out, view = self.make_view()
 
161
        task_a = ProgressTask(None, progress_view=view)
 
162
        view._last_transport_msg = '   123kB   100kB/s '
 
163
        line = view._render_line()
 
164
        self.assertEqual(
 
165
'   123kB   100kB/s /                                                           ',
 
166
           line) 
 
167
        self.assertEqual(len(line), 79)
 
168
 
 
169
        task_a.update('start_' + 'a' * 200 + '_end', 2000, 5000)
 
170
        view._last_transport_msg = '   123kB   100kB/s '
 
171
        line = view._render_line()
 
172
        self.assertEqual(
 
173
'   123kB   100kB/s \\ start_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.. 2000/5000',
 
174
           line) 
 
175
        self.assertEqual(len(line), 79)