/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_ui.py

  • Committer: Andrew Bennetts
  • Date: 2009-01-27 05:04:43 UTC
  • mfrom: (3960 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3981.
  • Revision ID: andrew.bennetts@canonical.com-20090127050443-3yw5hhk10ss23hzu
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 Canonical Ltd
 
1
# Copyright (C) 2005, 2008, 2009 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
29
29
    ProgressBarStack,
30
30
    TTYProgressBar,
31
31
    )
 
32
from bzrlib.symbol_versioning import (
 
33
    deprecated_in,
 
34
    )
32
35
from bzrlib.tests import (
33
36
    TestCase,
34
37
    TestUIFactory,
101
104
    def test_progress_note(self):
102
105
        stderr = StringIO()
103
106
        stdout = StringIO()
104
 
        ui_factory = TextUIFactory(bar_type=TTYProgressBar)
 
107
        ui_factory = TextUIFactory(stdin=StringIO(''),
 
108
            stderr=stderr,
 
109
            stdout=stdout)
105
110
        pb = ui_factory.nested_progress_bar()
106
111
        try:
107
 
            pb.to_messages_file = stdout
108
 
            ui_factory._progress_bar_stack.bottom().to_file = stderr
109
112
            result = pb.note('t')
110
113
            self.assertEqual(None, result)
111
114
            self.assertEqual("t\n", stdout.getvalue())
122
125
        # The PQM redirects the output to a file, so it
123
126
        # defaults to creating a Dots progress bar. we
124
127
        # need to force it to believe we are a TTY
125
 
        ui_factory = TextUIFactory(bar_type=TTYProgressBar)
 
128
        ui_factory = TextUIFactory(
 
129
            stdin=StringIO(''),
 
130
            stdout=stdout, stderr=stderr)
126
131
        pb = ui_factory.nested_progress_bar()
127
132
        try:
128
 
            pb.to_messages_file = stdout
129
 
            ui_factory._progress_bar_stack.bottom().to_file = stderr
130
133
            # Create a progress update that isn't throttled
131
 
            pb.start_time -= 10
132
134
            pb.update('x', 1, 1)
133
135
            result = pb.note('t')
134
136
            self.assertEqual(None, result)
142
144
 
143
145
    def test_progress_nested(self):
144
146
        # test factory based nested and popping.
145
 
        ui = TextUIFactory()
 
147
        ui = TextUIFactory(None, None, None)
146
148
        pb1 = ui.nested_progress_bar()
147
149
        pb2 = ui.nested_progress_bar()
148
 
        self.assertRaises(errors.MissingProgressBarFinish, pb1.finished)
 
150
        # You do get a warning if the outermost progress bar wasn't finished
 
151
        # first - it's not clear if this is really useful or if it should just
 
152
        # become orphaned -- mbp 20090120
 
153
        warnings, _ = self.callCatchWarnings(pb1.finished)
 
154
        if len(warnings) != 1:
 
155
            self.fail("unexpected warnings: %r" % (warnings,))
149
156
        pb2.finished()
150
157
        pb1.finished()
151
158
 
155
162
        stderr = StringIO()
156
163
        stdout = StringIO()
157
164
        # make a stack, which accepts parameters like a pb.
158
 
        stack = ProgressBarStack(to_file=stderr, to_messages_file=stdout)
 
165
        stack = self.applyDeprecated(
 
166
            deprecated_in((1, 12, 0)),
 
167
            ProgressBarStack,
 
168
            to_file=stderr, to_messages_file=stdout)
159
169
        # but is not one
160
170
        self.assertFalse(getattr(stack, 'note', False))
161
171
        pb1 = stack.get_nested()
162
172
        pb2 = stack.get_nested()
163
 
        self.assertRaises(errors.MissingProgressBarFinish, pb1.finished)
 
173
        warnings, _ = self.callCatchWarnings(pb1.finished)
 
174
        self.assertEqual(len(warnings), 1)
164
175
        pb2.finished()
165
176
        pb1.finished()
166
177
        # the text ui factory never actually removes the stack once its setup.
167
178
        # we need to be able to nest again correctly from here.
168
179
        pb1 = stack.get_nested()
169
180
        pb2 = stack.get_nested()
170
 
        self.assertRaises(errors.MissingProgressBarFinish, pb1.finished)
 
181
        warnings, _ = self.callCatchWarnings(pb1.finished)
 
182
        self.assertEqual(len(warnings), 1)
171
183
        pb2.finished()
172
184
        pb1.finished()
173
185
 
174
 
    def test_text_factory_setting_progress_bar(self):
175
 
        # we should be able to choose the progress bar type used.
176
 
        factory = TextUIFactory(bar_type=DotsProgressBar)
177
 
        bar = factory.nested_progress_bar()
178
 
        bar.finished()
179
 
        self.assertIsInstance(bar, DotsProgressBar)
180
 
 
181
 
    def test_cli_stdin_is_default_stdin(self):
182
 
        factory = CLIUIFactory()
183
 
        self.assertEqual(sys.stdin, factory.stdin)
184
 
 
185
186
    def assert_get_bool_acceptance_of_user_input(self, factory):
186
187
        factory.stdin = StringIO("y\nyes with garbage\n"
187
188
                                 "yes\nn\nnot an answer\n"
212
213
        self.assertEqual('', factory.stdin.readline())
213
214
 
214
215
    def test_text_ui_getbool(self):
215
 
        factory = TextUIFactory()
 
216
        factory = TextUIFactory(None, None, None)
216
217
        self.assert_get_bool_acceptance_of_user_input(factory)
217
218
 
218
219
    def test_text_factory_prompts_and_clears(self):
219
220
        # a get_boolean call should clear the pb before prompting
220
 
        factory = TextUIFactory(bar_type=DotsProgressBar)
221
 
        factory.stdout = _TTYStringIO()
222
 
        factory.stdin = StringIO("yada\ny\n")
223
 
        pb = self.apply_redirected(factory.stdin, factory.stdout,
224
 
                                   factory.stdout, factory.nested_progress_bar)
225
 
        pb.start_time = None
226
 
        self.apply_redirected(factory.stdin, factory.stdout,
227
 
                              factory.stdout, pb.update, "foo", 0, 1)
 
221
        out = _TTYStringIO()
 
222
        factory = TextUIFactory(stdin=StringIO("yada\ny\n"), stdout=out, stderr=out)
 
223
        pb = factory.nested_progress_bar()
 
224
        pb.show_bar = False
 
225
        pb.show_spinner = False
 
226
        pb.show_count = False
 
227
        pb.update("foo", 0, 1)
228
228
        self.assertEqual(True,
229
229
                         self.apply_redirected(None, factory.stdout,
230
230
                                               factory.stdout,
231
231
                                               factory.get_boolean,
232
232
                                               "what do you want"))
233
 
        output = factory.stdout.getvalue()
234
 
        self.assertEqual("foo: .\n"
235
 
                         "what do you want? [y/n]: what do you want? [y/n]: ",
236
 
                         factory.stdout.getvalue())
237
 
        # stdin should be empty
 
233
        output = out.getvalue()
 
234
        self.assertContainsRe(factory.stdout.getvalue(),
 
235
            "foo *\r\r  *\r*")
 
236
        self.assertContainsRe(factory.stdout.getvalue(),
 
237
            r"what do you want\? \[y/n\]: what do you want\? \[y/n\]: ")
 
238
        # stdin should have been totally consumed
238
239
        self.assertEqual('', factory.stdin.readline())
239