103
def test_progress_construction(self):
104
"""TextUIFactory constructs the right progress view.
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),
123
os.environ['TERM'] = term
125
if 'BZR_PROGRESS_BAR' in os.environ:
126
del os.environ['BZR_PROGRESS_BAR']
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(),
137
"TERM=%s BZR_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))
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']
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,))
153
103
def test_progress_note(self):
156
ui_factory = TextUIFactory(stdin=StringIO(''),
104
stderr = tests.StringIOWrapper()
105
stdout = tests.StringIOWrapper()
106
ui_factory = _mod_ui_text.TextUIFactory(stdin=tests.StringIOWrapper(''),
159
109
pb = ui_factory.nested_progress_bar()
161
result = pb.note('t')
111
result = self.applyDeprecated(deprecated_in((2, 1, 0)),
162
114
self.assertEqual(None, result)
163
115
self.assertEqual("t\n", stdout.getvalue())
164
116
# Since there was no update() call, there should be no clear() call
195
def test_progress_nested(self):
196
# test factory based nested and popping.
197
ui = TextUIFactory(None, None, None)
198
pb1 = ui.nested_progress_bar()
199
pb2 = ui.nested_progress_bar()
200
# You do get a warning if the outermost progress bar wasn't finished
201
# first - it's not clear if this is really useful or if it should just
202
# become orphaned -- mbp 20090120
203
warnings, _ = self.callCatchWarnings(pb1.finished)
204
if len(warnings) != 1:
205
self.fail("unexpected warnings: %r" % (warnings,))
209
148
def test_text_ui_get_boolean(self):
210
stdin = StringIO("y\n" # True
212
"yes with garbage\nY\n" # True
213
"not an answer\nno\n" # False
214
"I'm sure!\nyes\n" # True
219
factory = TextUIFactory(stdin, stdout, stderr)
149
stdin = tests.StringIOWrapper("y\n" # True
151
"yes with garbage\nY\n" # True
152
"not an answer\nno\n" # False
153
"I'm sure!\nyes\n" # True
156
stdout = tests.StringIOWrapper()
157
stderr = tests.StringIOWrapper()
158
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
220
159
self.assertEqual(True, factory.get_boolean(""))
221
160
self.assertEqual(False, factory.get_boolean(""))
222
161
self.assertEqual(True, factory.get_boolean(""))
227
166
# stdin should be empty
228
167
self.assertEqual('', factory.stdin.readline())
169
def test_text_ui_get_integer(self):
170
stdin = tests.StringIOWrapper(
173
"hmmm\nwhat else ?\nCome on\nok 42\n4.24\n42\n")
174
stdout = tests.StringIOWrapper()
175
stderr = tests.StringIOWrapper()
176
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
177
self.assertEqual(1, factory.get_integer(""))
178
self.assertEqual(-2, factory.get_integer(""))
179
self.assertEqual(42, factory.get_integer(""))
230
181
def test_text_factory_prompt(self):
231
182
# see <https://launchpad.net/bugs/365891>
232
factory = TextUIFactory(StringIO(), StringIO(), StringIO())
183
StringIO = tests.StringIOWrapper
184
factory = _mod_ui_text.TextUIFactory(StringIO(), StringIO(), StringIO())
233
185
factory.prompt('foo %2e')
234
186
self.assertEqual('', factory.stdout.getvalue())
235
187
self.assertEqual('foo %2e', factory.stderr.getvalue())
237
189
def test_text_factory_prompts_and_clears(self):
238
190
# a get_boolean call should clear the pb before prompting
191
out = test_progress._TTYStringIO()
240
192
os.environ['TERM'] = 'xterm'
241
factory = TextUIFactory(stdin=StringIO("yada\ny\n"), stdout=out, stderr=out)
193
factory = _mod_ui_text.TextUIFactory(
194
stdin=tests.StringIOWrapper("yada\ny\n"),
195
stdout=out, stderr=out)
242
196
pb = factory.nested_progress_bar()
243
197
pb.show_bar = False
244
198
pb.show_spinner = False
304
class CLIUITests(TestCase):
306
def test_cli_factory_deprecated(self):
307
uif = self.applyDeprecated(deprecated_in((1, 18, 0)),
309
StringIO(), StringIO(), StringIO())
310
self.assertIsInstance(uif, UIFactory)
313
class SilentUITests(TestCase):
258
def test_quietness(self):
259
os.environ['BZR_PROGRESS_BAR'] = 'text'
260
ui_factory = _mod_ui_text.TextUIFactory(None,
261
test_progress._TTYStringIO(),
262
test_progress._TTYStringIO())
263
self.assertIsInstance(ui_factory._progress_view,
264
_mod_ui_text.TextProgressView)
265
ui_factory.be_quiet(True)
266
self.assertIsInstance(ui_factory._progress_view,
267
_mod_ui_text.NullProgressView)
269
def test_text_ui_show_user_warning(self):
270
from bzrlib.repofmt.groupcompress_repo import RepositoryFormat2a
271
from bzrlib.repofmt.pack_repo import RepositoryFormatKnitPack5
274
ui = tests.TextUIFactory(stdin=None, stdout=out, stderr=err)
275
remote_fmt = remote.RemoteRepositoryFormat()
276
remote_fmt._network_name = RepositoryFormatKnitPack5().network_name()
277
ui.show_user_warning('cross_format_fetch', from_format=RepositoryFormat2a(),
278
to_format=remote_fmt)
279
self.assertEquals('', out.getvalue())
280
self.assertEquals("Doing on-the-fly conversion from RepositoryFormat2a() to "
281
"RemoteRepositoryFormat(_network_name='Bazaar RepositoryFormatKnitPack5 "
282
"(bzr 1.6)\\n').\nThis may take some time. Upgrade the repositories to "
283
"the same format for better performance.\n",
285
# and now with it suppressed please
288
ui = tests.TextUIFactory(stdin=None, stdout=out, stderr=err)
289
ui.suppressed_warnings.add('cross_format_fetch')
290
ui.show_user_warning('cross_format_fetch', from_format=RepositoryFormat2a(),
291
to_format=remote_fmt)
292
self.assertEquals('', out.getvalue())
293
self.assertEquals('', err.getvalue())
296
class TestTextUIOutputStream(tests.TestCase):
297
"""Tests for output stream that synchronizes with progress bar."""
299
def test_output_clears_terminal(self):
300
stdout = tests.StringIOWrapper()
301
stderr = tests.StringIOWrapper()
304
uif = _mod_ui_text.TextUIFactory(None, stdout, stderr)
305
uif.clear_term = lambda: clear_calls.append('clear')
307
stream = _mod_ui_text.TextUIOutputStream(uif, uif.stdout)
308
stream.write("Hello world!\n")
309
stream.write("there's more...\n")
310
stream.writelines(["1\n", "2\n", "3\n"])
312
self.assertEqual(stdout.getvalue(),
316
self.assertEqual(['clear', 'clear', 'clear'],
322
class UITests(tests.TestCase):
324
def test_progress_construction(self):
325
"""TextUIFactory constructs the right progress view.
327
TTYStringIO = test_progress._TTYStringIO
328
FileStringIO = tests.StringIOWrapper
329
for (file_class, term, pb, expected_pb_class) in (
330
# on an xterm, either use them or not as the user requests,
331
# otherwise default on
332
(TTYStringIO, 'xterm', 'none', _mod_ui_text.NullProgressView),
333
(TTYStringIO, 'xterm', 'text', _mod_ui_text.TextProgressView),
334
(TTYStringIO, 'xterm', None, _mod_ui_text.TextProgressView),
335
# on a dumb terminal, again if there's explicit configuration do
336
# it, otherwise default off
337
(TTYStringIO, 'dumb', 'none', _mod_ui_text.NullProgressView),
338
(TTYStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
339
(TTYStringIO, 'dumb', None, _mod_ui_text.NullProgressView),
340
# on a non-tty terminal, it's null regardless of $TERM
341
(FileStringIO, 'xterm', None, _mod_ui_text.NullProgressView),
342
(FileStringIO, 'dumb', None, _mod_ui_text.NullProgressView),
343
# however, it can still be forced on
344
(FileStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
346
os.environ['TERM'] = term
348
if 'BZR_PROGRESS_BAR' in os.environ:
349
del os.environ['BZR_PROGRESS_BAR']
351
os.environ['BZR_PROGRESS_BAR'] = pb
352
stdin = file_class('')
353
stderr = file_class()
354
stdout = file_class()
355
uif = _mod_ui.make_ui_for_terminal(stdin, stdout, stderr)
356
self.assertIsInstance(uif, _mod_ui_text.TextUIFactory,
357
"TERM=%s BZR_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))
358
self.assertIsInstance(uif.make_progress_view(),
360
"TERM=%s BZR_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))
362
def test_text_ui_non_terminal(self):
363
"""Even on non-ttys, make_ui_for_terminal gives a text ui."""
364
stdin = test_progress._NonTTYStringIO('')
365
stderr = test_progress._NonTTYStringIO()
366
stdout = test_progress._NonTTYStringIO()
367
for term_type in ['dumb', None, 'xterm']:
368
if term_type is None:
369
del os.environ['TERM']
371
os.environ['TERM'] = term_type
372
uif = _mod_ui.make_ui_for_terminal(stdin, stdout, stderr)
373
self.assertIsInstance(uif, _mod_ui_text.TextUIFactory,
374
'TERM=%r' % (term_type,))
377
class SilentUITests(tests.TestCase):
315
379
def test_silent_factory_get_password(self):
316
380
# A silent factory that can't do user interaction can't get a
317
381
# password. Possibly it should raise a more specific error but it
319
ui = SilentUIFactory()
383
ui = _mod_ui.SilentUIFactory()
384
stdout = tests.StringIOWrapper()
321
385
self.assertRaises(
322
386
NotImplementedError,
323
387
self.apply_redirected,
326
390
self.assertEqual('', stdout.getvalue())
328
392
def test_silent_ui_getbool(self):
329
factory = SilentUIFactory()
393
factory = _mod_ui.SilentUIFactory()
394
stdout = tests.StringIOWrapper()
331
395
self.assertRaises(
332
396
NotImplementedError,
333
397
self.apply_redirected,
334
398
None, stdout, stdout, factory.get_boolean, "foo")
337
class CannedInputUIFactoryTests(TestCase):
401
class TestUIFactoryTests(tests.TestCase):
403
def test_test_ui_factory_progress(self):
404
# there's no output; we just want to make sure this doesn't crash -
405
# see https://bugs.launchpad.net/bzr/+bug/408201
406
ui = tests.TestUIFactory()
407
pb = ui.nested_progress_bar()
413
class CannedInputUIFactoryTests(tests.TestCase):
339
415
def test_canned_input_get_input(self):
340
uif = CannedInputUIFactory([True, 'mbp', 'password'])
341
self.assertEqual(uif.get_boolean('Extra cheese?'), True)
342
self.assertEqual(uif.get_username('Enter your user name'), 'mbp')
343
self.assertEqual(uif.get_password('Password for %(host)s', host='example.com'),
416
uif = _mod_ui.CannedInputUIFactory([True, 'mbp', 'password', 42])
417
self.assertEqual(True, uif.get_boolean('Extra cheese?'))
418
self.assertEqual('mbp', uif.get_username('Enter your user name'))
419
self.assertEqual('password',
420
uif.get_password('Password for %(host)s',
422
self.assertEqual(42, uif.get_integer('And all that jazz ?'))
347
425
class TestBoolFromString(tests.TestCase):