1
# Copyright (C) 2005-2011 Canonical Ltd
1
# Copyright (C) 2005-2010 Canonical Ltd
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
17
17
"""Tests for the bzrlib ui
22
24
from StringIO import StringIO
24
from testtools.matchers import *
26
26
from bzrlib import (
34
from bzrlib.symbol_versioning import (
32
37
from bzrlib.tests import (
48
53
ui = tests.TestUIFactory(stdin=None,
49
54
stdout=tests.StringIOWrapper(),
50
55
stderr=tests.StringIOWrapper())
51
output = ui.make_output_stream()
52
self.assertEquals(output.encoding, enc)
56
os = ui.make_output_stream()
57
self.assertEquals(os.encoding, enc)
55
60
class TestTextUIFactory(tests.TestCase):
57
def make_test_ui_factory(self, stdin_contents):
58
ui = tests.TestUIFactory(stdin=stdin_contents,
59
stdout=tests.StringIOWrapper(),
60
stderr=tests.StringIOWrapper())
63
def test_text_factory_confirm(self):
64
# turns into reading a regular boolean
65
ui = self.make_test_ui_factory('n\n')
66
self.assertEquals(ui.confirm_action('Should %(thing)s pass?',
67
'bzrlib.tests.test_ui.confirmation',
71
62
def test_text_factory_ascii_password(self):
72
ui = self.make_test_ui_factory('secret\n')
63
ui = tests.TestUIFactory(stdin='secret\n',
64
stdout=tests.StringIOWrapper(),
65
stderr=tests.StringIOWrapper())
73
66
pb = ui.nested_progress_bar()
75
68
self.assertEqual('secret',
90
83
We can't predict what encoding users will have for stdin, so we force
91
84
it to utf8 to test that we transport the password correctly.
93
ui = self.make_test_ui_factory(u'baz\u1234'.encode('utf8'))
86
ui = tests.TestUIFactory(stdin=u'baz\u1234'.encode('utf8'),
87
stdout=tests.StringIOWrapper(),
88
stderr=tests.StringIOWrapper())
94
89
ui.stderr.encoding = ui.stdout.encoding = ui.stdin.encoding = 'utf8'
95
90
pb = ui.nested_progress_bar()
152
147
def test_text_factory_prompts_and_clears(self):
153
148
# a get_boolean call should clear the pb before prompting
154
149
out = test_progress._TTYStringIO()
155
self.overrideEnv('TERM', 'xterm')
150
os.environ['TERM'] = 'xterm'
156
151
factory = _mod_ui_text.TextUIFactory(
157
152
stdin=tests.StringIOWrapper("yada\ny\n"),
158
153
stdout=out, stderr=out)
222
217
def test_quietness(self):
223
self.overrideEnv('BZR_PROGRESS_BAR', 'text')
218
os.environ['BZR_PROGRESS_BAR'] = 'text'
224
219
ui_factory = _mod_ui_text.TextUIFactory(None,
225
220
test_progress._TTYStringIO(),
226
221
test_progress._TTYStringIO())
233
228
def test_text_ui_show_user_warning(self):
234
229
from bzrlib.repofmt.groupcompress_repo import RepositoryFormat2a
235
from bzrlib.repofmt.knitpack_repo import RepositoryFormatKnitPack5
230
from bzrlib.repofmt.pack_repo import RepositoryFormatKnitPack5
238
233
ui = tests.TextUIFactory(stdin=None, stdout=out, stderr=err)
307
302
# however, it can still be forced on
308
303
(FileStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
310
self.overrideEnv('TERM', term)
311
self.overrideEnv('BZR_PROGRESS_BAR', pb)
305
os.environ['TERM'] = term
307
if 'BZR_PROGRESS_BAR' in os.environ:
308
del os.environ['BZR_PROGRESS_BAR']
310
os.environ['BZR_PROGRESS_BAR'] = pb
312
311
stdin = file_class('')
313
312
stderr = file_class()
314
313
stdout = file_class()
325
324
stderr = test_progress._NonTTYStringIO()
326
325
stdout = test_progress._NonTTYStringIO()
327
326
for term_type in ['dumb', None, 'xterm']:
328
self.overrideEnv('TERM', term_type)
327
if term_type is None:
328
del os.environ['TERM']
330
os.environ['TERM'] = term_type
329
331
uif = _mod_ui.make_ui_for_terminal(stdin, stdout, stderr)
330
332
self.assertIsInstance(uif, _mod_ui_text.TextUIFactory,
331
333
'TERM=%r' % (term_type,))
435
437
self.assertIsNone('off', av)
438
class TestConfirmationUserInterfacePolicy(tests.TestCase):
440
def test_confirm_action_default(self):
441
base_ui = _mod_ui.NoninteractiveUIFactory()
442
for answer in [True, False]:
444
_mod_ui.ConfirmationUserInterfacePolicy(base_ui, answer, {})
445
.confirm_action("Do something?",
446
"bzrlib.tests.do_something", {}),
449
def test_confirm_action_specific(self):
450
base_ui = _mod_ui.NoninteractiveUIFactory()
451
for default_answer in [True, False]:
452
for specific_answer in [True, False]:
453
for conf_id in ['given_id', 'other_id']:
454
wrapper = _mod_ui.ConfirmationUserInterfacePolicy(
455
base_ui, default_answer, dict(given_id=specific_answer))
456
result = wrapper.confirm_action("Do something?", conf_id, {})
457
if conf_id == 'given_id':
458
self.assertEquals(result, specific_answer)
460
self.assertEquals(result, default_answer)
463
base_ui = _mod_ui.NoninteractiveUIFactory()
464
wrapper = _mod_ui.ConfirmationUserInterfacePolicy(
465
base_ui, True, dict(a=2))
466
self.assertThat(repr(wrapper),
467
Equals("ConfirmationUserInterfacePolicy("
468
"NoninteractiveUIFactory(), True, {'a': 2})"))
471
440
class TestProgressRecordingUI(tests.TestCase):
472
441
"""Test test-oriented UIFactory that records progress updates"""