~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_ui.py

Rework test_script a little bit.


Don't allow someone to request a stdin request to echo.
Echo never reads from stdin, it just echos its arguments.
You use 'cat' if you want to read from stdin.

A few other fixes because the tests were using filenames
that are actually illegal on Windows, rather than just
nonexistant.


Change the exception handling for commands so that
unknown errors don't get silently squashed and then
turn into hard-to-debug errors later.

test_script now passes on Windows.

Show diffs side-by-side

added added

removed removed

Lines of Context:
42
42
    )
43
43
from bzrlib.ui import (
44
44
    CannedInputUIFactory,
45
 
    CLIUIFactory,
46
45
    SilentUIFactory,
47
46
    UIFactory,
48
47
    make_ui_for_terminal,
54
53
    )
55
54
 
56
55
 
57
 
class UITests(tests.TestCase):
 
56
class TestTextUIFactory(tests.TestCase):
58
57
 
59
58
    def test_text_factory_ascii_password(self):
60
59
        ui = tests.TestUIFactory(stdin='secret\n',
100
99
        finally:
101
100
            pb.finished()
102
101
 
103
 
    def test_progress_construction(self):
104
 
        """TextUIFactory constructs the right progress view.
105
 
        """
106
 
        for (file_class, term, pb, expected_pb_class) in (
107
 
            # on an xterm, either use them or not as the user requests,
108
 
            # otherwise default on
109
 
            (_TTYStringIO, 'xterm', 'none', NullProgressView),
110
 
            (_TTYStringIO, 'xterm', 'text', TextProgressView),
111
 
            (_TTYStringIO, 'xterm', None, TextProgressView),
112
 
            # on a dumb terminal, again if there's explicit configuration do
113
 
            # it, otherwise default off
114
 
            (_TTYStringIO, 'dumb', 'none', NullProgressView),
115
 
            (_TTYStringIO, 'dumb', 'text', TextProgressView),
116
 
            (_TTYStringIO, 'dumb', None, NullProgressView),
117
 
            # on a non-tty terminal, it's null regardless of $TERM
118
 
            (StringIO, 'xterm', None, NullProgressView),
119
 
            (StringIO, 'dumb', None, NullProgressView),
120
 
            # however, it can still be forced on
121
 
            (StringIO, 'dumb', 'text', TextProgressView),
122
 
            ):
123
 
            os.environ['TERM'] = term
124
 
            if pb is None:
125
 
                if 'BZR_PROGRESS_BAR' in os.environ:
126
 
                    del os.environ['BZR_PROGRESS_BAR']
127
 
            else:
128
 
                os.environ['BZR_PROGRESS_BAR'] = pb
129
 
            stdin = file_class('')
130
 
            stderr = file_class()
131
 
            stdout = file_class()
132
 
            uif = make_ui_for_terminal(stdin, stdout, stderr)
133
 
            self.assertIsInstance(uif, TextUIFactory,
134
 
                "TERM=%s BZR_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))
135
 
            self.assertIsInstance(uif.make_progress_view(),
136
 
                expected_pb_class,
137
 
                "TERM=%s BZR_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))
138
 
 
139
 
    def test_text_ui_non_terminal(self):
140
 
        """Even on non-ttys, make_ui_for_terminal gives a text ui."""
141
 
        stdin = _NonTTYStringIO('')
142
 
        stderr = _NonTTYStringIO()
143
 
        stdout = _NonTTYStringIO()
144
 
        for term_type in ['dumb', None, 'xterm']:
145
 
            if term_type is None:
146
 
                del os.environ['TERM']
147
 
            else:
148
 
                os.environ['TERM'] = term_type
149
 
            uif = make_ui_for_terminal(stdin, stdout, stderr)
150
 
            self.assertIsInstance(uif, TextUIFactory,
151
 
                'TERM=%r' % (term_type,))
152
 
 
153
102
    def test_progress_note(self):
154
103
        stderr = StringIO()
155
104
        stdout = StringIO()
158
107
            stdout=stdout)
159
108
        pb = ui_factory.nested_progress_bar()
160
109
        try:
161
 
            result = pb.note('t')
 
110
            result = self.applyDeprecated(deprecated_in((2, 1, 0)),
 
111
                pb.note,
 
112
                't')
162
113
            self.assertEqual(None, result)
163
114
            self.assertEqual("t\n", stdout.getvalue())
164
115
            # Since there was no update() call, there should be no clear() call
182
133
        try:
183
134
            # Create a progress update that isn't throttled
184
135
            pb.update('x', 1, 1)
185
 
            result = pb.note('t')
 
136
            result = self.applyDeprecated(deprecated_in((2, 1, 0)),
 
137
                pb.note, 't')
186
138
            self.assertEqual(None, result)
187
139
            self.assertEqual("t\n", stdout.getvalue())
188
140
            # the exact contents will depend on the terminal width and we don't
301
253
            pb.finished()
302
254
 
303
255
 
304
 
class CLIUITests(TestCase):
305
 
 
306
 
    def test_cli_factory_deprecated(self):
307
 
        uif = self.applyDeprecated(deprecated_in((1, 18, 0)),
308
 
            CLIUIFactory,
309
 
            StringIO(), StringIO(), StringIO())
310
 
        self.assertIsInstance(uif, UIFactory)
 
256
class UITests(tests.TestCase):
 
257
 
 
258
    def test_progress_construction(self):
 
259
        """TextUIFactory constructs the right progress view.
 
260
        """
 
261
        for (file_class, term, pb, expected_pb_class) in (
 
262
            # on an xterm, either use them or not as the user requests,
 
263
            # otherwise default on
 
264
            (_TTYStringIO, 'xterm', 'none', NullProgressView),
 
265
            (_TTYStringIO, 'xterm', 'text', TextProgressView),
 
266
            (_TTYStringIO, 'xterm', None, TextProgressView),
 
267
            # on a dumb terminal, again if there's explicit configuration do
 
268
            # it, otherwise default off
 
269
            (_TTYStringIO, 'dumb', 'none', NullProgressView),
 
270
            (_TTYStringIO, 'dumb', 'text', TextProgressView),
 
271
            (_TTYStringIO, 'dumb', None, NullProgressView),
 
272
            # on a non-tty terminal, it's null regardless of $TERM
 
273
            (StringIO, 'xterm', None, NullProgressView),
 
274
            (StringIO, 'dumb', None, NullProgressView),
 
275
            # however, it can still be forced on
 
276
            (StringIO, 'dumb', 'text', TextProgressView),
 
277
            ):
 
278
            os.environ['TERM'] = term
 
279
            if pb is None:
 
280
                if 'BZR_PROGRESS_BAR' in os.environ:
 
281
                    del os.environ['BZR_PROGRESS_BAR']
 
282
            else:
 
283
                os.environ['BZR_PROGRESS_BAR'] = pb
 
284
            stdin = file_class('')
 
285
            stderr = file_class()
 
286
            stdout = file_class()
 
287
            uif = make_ui_for_terminal(stdin, stdout, stderr)
 
288
            self.assertIsInstance(uif, TextUIFactory,
 
289
                "TERM=%s BZR_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))
 
290
            self.assertIsInstance(uif.make_progress_view(),
 
291
                expected_pb_class,
 
292
                "TERM=%s BZR_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))
 
293
 
 
294
    def test_text_ui_non_terminal(self):
 
295
        """Even on non-ttys, make_ui_for_terminal gives a text ui."""
 
296
        stdin = _NonTTYStringIO('')
 
297
        stderr = _NonTTYStringIO()
 
298
        stdout = _NonTTYStringIO()
 
299
        for term_type in ['dumb', None, 'xterm']:
 
300
            if term_type is None:
 
301
                del os.environ['TERM']
 
302
            else:
 
303
                os.environ['TERM'] = term_type
 
304
            uif = make_ui_for_terminal(stdin, stdout, stderr)
 
305
            self.assertIsInstance(uif, TextUIFactory,
 
306
                'TERM=%r' % (term_type,))
311
307
 
312
308
 
313
309
class SilentUITests(TestCase):