42
57
class UITests(tests.TestCase):
44
def test_silent_factory(self):
45
ui = _mod_ui.SilentUIFactory()
47
self.assertEqual(None,
48
self.apply_redirected(None, stdout, stdout,
50
self.assertEqual('', stdout.getvalue())
51
self.assertEqual(None,
52
self.apply_redirected(None, stdout, stdout,
54
u'Hello\u1234 %(user)s',
56
self.assertEqual('', stdout.getvalue())
58
59
def test_text_factory_ascii_password(self):
59
60
ui = tests.TestUIFactory(stdin='secret\n',
60
61
stdout=tests.StringIOWrapper(),
102
103
def test_progress_construction(self):
103
104
"""TextUIFactory constructs the right progress view.
105
os.environ['BZR_PROGRESS_BAR'] = 'none'
106
self.assertIsInstance(TextUIFactory()._progress_view,
109
os.environ['BZR_PROGRESS_BAR'] = 'text'
110
self.assertIsInstance(TextUIFactory()._progress_view,
113
os.environ['BZR_PROGRESS_BAR'] = 'text'
114
self.assertIsInstance(TextUIFactory()._progress_view,
117
del os.environ['BZR_PROGRESS_BAR']
118
self.assertIsInstance(TextUIFactory()._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,))
121
153
def test_progress_note(self):
122
154
stderr = StringIO()
176
def assert_get_bool_acceptance_of_user_input(self, factory):
177
factory.stdin = StringIO("y\n" # True
179
"yes with garbage\nY\n" # True
180
"not an answer\nno\n" # False
181
"I'm sure!\nyes\n" # True
184
factory.stdout = StringIO()
185
factory.stderr = StringIO()
186
# there is no output from the base factory
209
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)
187
220
self.assertEqual(True, factory.get_boolean(""))
188
221
self.assertEqual(False, factory.get_boolean(""))
189
222
self.assertEqual(True, factory.get_boolean(""))
194
227
# stdin should be empty
195
228
self.assertEqual('', factory.stdin.readline())
197
def test_silent_ui_getbool(self):
198
factory = _mod_ui.SilentUIFactory()
199
self.assert_get_bool_acceptance_of_user_input(factory)
201
def test_silent_factory_prompts_silently(self):
202
factory = _mod_ui.SilentUIFactory()
204
factory.stdin = StringIO("y\n")
205
self.assertEqual(True,
206
self.apply_redirected(None, stdout, stdout,
207
factory.get_boolean, "foo"))
208
self.assertEqual("", stdout.getvalue())
209
# stdin should be empty
210
self.assertEqual('', factory.stdin.readline())
212
def test_text_ui_getbool(self):
213
factory = TextUIFactory(None, None, None)
214
self.assert_get_bool_acceptance_of_user_input(factory)
216
230
def test_text_factory_prompt(self):
217
231
# see <https://launchpad.net/bugs/365891>
218
factory = TextUIFactory(None, StringIO(), StringIO(), StringIO())
232
factory = TextUIFactory(StringIO(), StringIO(), StringIO())
219
233
factory.prompt('foo %2e')
220
234
self.assertEqual('', factory.stdout.getvalue())
221
235
self.assertEqual('foo %2e', factory.stderr.getvalue())
257
def test_silent_ui_getusername(self):
258
factory = _mod_ui.SilentUIFactory()
259
factory.stdin = StringIO("someuser\n\n")
260
factory.stdout = StringIO()
261
factory.stderr = StringIO()
262
self.assertEquals(None,
263
factory.get_username(u'Hello\u1234 %(host)s', host=u'some\u1234'))
264
self.assertEquals("", factory.stdout.getvalue())
265
self.assertEquals("", factory.stderr.getvalue())
266
self.assertEquals("someuser\n\n", factory.stdin.getvalue())
268
271
def test_text_ui_getusername(self):
269
272
factory = TextUIFactory(None, None, None)
270
273
factory.stdin = StringIO("someuser\n\n")
301
class TestTextProgressView(tests.TestCase):
302
"""Tests for text display of progress bars.
304
# XXX: These might be a bit easier to write if the rendering and
305
# state-maintaining parts of TextProgressView were more separate, and if
306
# the progress task called back directly to its own view not to the ui
307
# factory. -- mbp 20090312
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):
315
def test_silent_factory_get_password(self):
316
# A silent factory that can't do user interaction can't get a
317
# password. Possibly it should raise a more specific error but it
319
ui = SilentUIFactory()
323
self.apply_redirected,
324
None, stdout, stdout, ui.get_password)
325
# and it didn't write anything out either
326
self.assertEqual('', stdout.getvalue())
328
def test_silent_ui_getbool(self):
329
factory = SilentUIFactory()
333
self.apply_redirected,
334
None, stdout, stdout, factory.get_boolean, "foo")
337
class CannedInputUIFactoryTests(TestCase):
309
def _make_factory(self):
311
uif = TextUIFactory(stderr=out)
312
uif._progress_view._width = 80
315
def test_render_progress_easy(self):
316
"""Just one task and one quarter done"""
317
out, uif = self._make_factory()
318
task = uif.nested_progress_bar()
319
task.update('reticulating splines', 5, 20)
321
'\r[####/ ] reticulating splines 5/20 \r'
324
def test_render_progress_nested(self):
325
"""Tasks proportionally contribute to overall progress"""
326
out, uif = self._make_factory()
327
task = uif.nested_progress_bar()
328
task.update('reticulating splines', 0, 2)
329
task2 = uif.nested_progress_bar()
330
task2.update('stage2', 1, 2)
331
# so we're in the first half of the main task, and half way through
334
r'[####\ ] reticulating splines:stage2 1/2'
335
, uif._progress_view._render_line())
336
# if the nested task is complete, then we're all the way through the
337
# first half of the overall work
338
task2.update('stage2', 2, 2)
340
r'[#########| ] reticulating splines:stage2 2/2'
341
, uif._progress_view._render_line())
343
def test_render_progress_sub_nested(self):
344
"""Intermediate tasks don't mess up calculation."""
345
out, uif = self._make_factory()
346
task_a = uif.nested_progress_bar()
347
task_a.update('a', 0, 2)
348
task_b = uif.nested_progress_bar()
350
task_c = uif.nested_progress_bar()
351
task_c.update('c', 1, 2)
352
# the top-level task is in its first half; the middle one has no
353
# progress indication, just a label; and the bottom one is half done,
354
# so the overall fraction is 1/4
356
r'[####| ] a:b:c 1/2'
357
, uif._progress_view._render_line())
339
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'),
360
347
class TestBoolFromString(tests.TestCase):