50
48
ui = tests.TestUIFactory(stdin=None,
51
49
stdout=tests.StringIOWrapper(),
52
50
stderr=tests.StringIOWrapper())
53
os = ui.make_output_stream()
54
self.assertEquals(os.encoding, enc)
51
output = ui.make_output_stream()
52
self.assertEquals(output.encoding, enc)
57
55
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(u'Should %(thing)s pass?',
67
'bzrlib.tests.test_ui.confirmation',
59
71
def test_text_factory_ascii_password(self):
60
ui = tests.TestUIFactory(stdin='secret\n',
61
stdout=tests.StringIOWrapper(),
62
stderr=tests.StringIOWrapper())
72
ui = self.make_test_ui_factory('secret\n')
63
73
pb = ui.nested_progress_bar()
65
75
self.assertEqual('secret',
111
121
stdout = tests.StringIOWrapper()
112
122
stderr = tests.StringIOWrapper()
113
123
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
114
self.assertEqual(True, factory.get_boolean(""))
115
self.assertEqual(False, factory.get_boolean(""))
116
self.assertEqual(True, factory.get_boolean(""))
117
self.assertEqual(False, factory.get_boolean(""))
118
self.assertEqual(True, factory.get_boolean(""))
119
self.assertEqual(False, factory.get_boolean(""))
120
self.assertEqual("foo\n", factory.stdin.read())
121
# stdin should be empty
122
self.assertEqual('', factory.stdin.readline())
124
self.assertEqual(True, factory.get_boolean(u""))
125
self.assertEqual(False, factory.get_boolean(u""))
126
self.assertEqual(True, factory.get_boolean(u""))
127
self.assertEqual(False, factory.get_boolean(u""))
128
self.assertEqual(True, factory.get_boolean(u""))
129
self.assertEqual(False, factory.get_boolean(u""))
130
self.assertEqual(True, factory.get_boolean(u""))
131
self.assertEqual(False, factory.get_boolean(u""))
132
self.assertEqual("foo\n", factory.stdin.read())
133
# stdin should be empty
134
self.assertEqual('', factory.stdin.readline())
135
# return false on EOF
136
self.assertEqual(False, factory.get_boolean(u""))
138
def test_text_ui_choose_bad_parameters(self):
139
stdin = tests.StringIOWrapper()
140
stdout = tests.StringIOWrapper()
141
stderr = tests.StringIOWrapper()
142
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
143
# invalid default index
144
self.assertRaises(ValueError, factory.choose, u"", u"&Yes\n&No", 3)
146
self.assertRaises(ValueError, factory.choose, u"", u"&choice\n&ChOiCe")
147
# duplicated shortcut
148
self.assertRaises(ValueError, factory.choose, u"", u"&choice1\nchoi&ce2")
150
def test_text_ui_choose_prompt(self):
151
stdin = tests.StringIOWrapper()
152
stdout = tests.StringIOWrapper()
153
stderr = tests.StringIOWrapper()
154
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
155
# choices with explicit shortcuts
156
factory.choose(u"prompt", u"&yes\n&No\nmore &info")
157
self.assertEqual("prompt ([y]es, [N]o, more [i]nfo): \n", factory.stderr.getvalue())
158
# automatic shortcuts
159
factory.stderr.truncate(0)
160
factory.choose(u"prompt", u"yes\nNo\nmore info")
161
self.assertEqual("prompt ([y]es, [N]o, [m]ore info): \n", factory.stderr.getvalue())
163
def test_text_ui_choose_return_values(self):
164
choose = lambda: factory.choose(u"", u"&Yes\n&No\nMaybe\nmore &info", 3)
165
stdin = tests.StringIOWrapper("y\n" # 0
169
"b\na\nd \n" # bad shortcuts, all ignored
170
"yes with garbage\nY\n" # 0
171
"not an answer\nno\n" # 1
172
"info\nmore info\n" # 3
175
stdout = tests.StringIOWrapper()
176
stderr = tests.StringIOWrapper()
177
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
178
self.assertEqual(0, choose())
179
self.assertEqual(1, choose())
180
self.assertEqual(3, choose())
181
self.assertEqual(1, choose())
182
self.assertEqual(0, choose())
183
self.assertEqual(1, choose())
184
self.assertEqual(3, choose())
185
self.assertEqual(2, choose())
186
self.assertEqual("foo\n", factory.stdin.read())
187
# stdin should be empty
188
self.assertEqual('', factory.stdin.readline())
190
self.assertEqual(None, choose())
192
def test_text_ui_choose_no_default(self):
193
stdin = tests.StringIOWrapper(" \n" # no default, invalid!
196
stdout = tests.StringIOWrapper()
197
stderr = tests.StringIOWrapper()
198
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
199
self.assertEqual(0, factory.choose(u"", u"&Yes\n&No"))
200
self.assertEqual("foo\n", factory.stdin.read())
124
202
def test_text_ui_get_integer(self):
125
203
stdin = tests.StringIOWrapper(
129
207
stdout = tests.StringIOWrapper()
130
208
stderr = tests.StringIOWrapper()
131
209
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
132
self.assertEqual(1, factory.get_integer(""))
133
self.assertEqual(-2, factory.get_integer(""))
134
self.assertEqual(42, factory.get_integer(""))
210
self.assertEqual(1, factory.get_integer(u""))
211
self.assertEqual(-2, factory.get_integer(u""))
212
self.assertEqual(42, factory.get_integer(u""))
136
214
def test_text_factory_prompt(self):
137
215
# see <https://launchpad.net/bugs/365891>
138
216
StringIO = tests.StringIOWrapper
139
217
factory = _mod_ui_text.TextUIFactory(StringIO(), StringIO(), StringIO())
140
factory.prompt('foo %2e')
218
factory.prompt(u'foo %2e')
141
219
self.assertEqual('', factory.stdout.getvalue())
142
220
self.assertEqual('foo %2e', factory.stderr.getvalue())
144
222
def test_text_factory_prompts_and_clears(self):
145
223
# a get_boolean call should clear the pb before prompting
146
224
out = test_progress._TTYStringIO()
147
os.environ['TERM'] = 'xterm'
225
self.overrideEnv('TERM', 'xterm')
148
226
factory = _mod_ui_text.TextUIFactory(
149
227
stdin=tests.StringIOWrapper("yada\ny\n"),
150
228
stdout=out, stderr=out)
371
442
def test_canned_input_get_input(self):
372
443
uif = _mod_ui.CannedInputUIFactory([True, 'mbp', 'password', 42])
373
self.assertEqual(True, uif.get_boolean('Extra cheese?'))
374
self.assertEqual('mbp', uif.get_username('Enter your user name'))
444
self.assertEqual(True, uif.get_boolean(u'Extra cheese?'))
445
self.assertEqual('mbp', uif.get_username(u'Enter your user name'))
375
446
self.assertEqual('password',
376
uif.get_password('Password for %(host)s',
447
uif.get_password(u'Password for %(host)s',
377
448
host='example.com'))
378
self.assertEqual(42, uif.get_integer('And all that jazz ?'))
449
self.assertEqual(42, uif.get_integer(u'And all that jazz ?'))
381
452
class TestBoolFromString(tests.TestCase):
432
503
self.assertIsNone('0', av)
433
504
self.assertIsNone('on', av)
434
505
self.assertIsNone('off', av)
508
class TestConfirmationUserInterfacePolicy(tests.TestCase):
510
def test_confirm_action_default(self):
511
base_ui = _mod_ui.NoninteractiveUIFactory()
512
for answer in [True, False]:
514
_mod_ui.ConfirmationUserInterfacePolicy(base_ui, answer, {})
515
.confirm_action("Do something?",
516
"bzrlib.tests.do_something", {}),
519
def test_confirm_action_specific(self):
520
base_ui = _mod_ui.NoninteractiveUIFactory()
521
for default_answer in [True, False]:
522
for specific_answer in [True, False]:
523
for conf_id in ['given_id', 'other_id']:
524
wrapper = _mod_ui.ConfirmationUserInterfacePolicy(
525
base_ui, default_answer, dict(given_id=specific_answer))
526
result = wrapper.confirm_action("Do something?", conf_id, {})
527
if conf_id == 'given_id':
528
self.assertEquals(result, specific_answer)
530
self.assertEquals(result, default_answer)
533
base_ui = _mod_ui.NoninteractiveUIFactory()
534
wrapper = _mod_ui.ConfirmationUserInterfacePolicy(
535
base_ui, True, dict(a=2))
536
self.assertThat(repr(wrapper),
537
Equals("ConfirmationUserInterfacePolicy("
538
"NoninteractiveUIFactory(), True, {'a': 2})"))
541
class TestProgressRecordingUI(tests.TestCase):
542
"""Test test-oriented UIFactory that records progress updates"""
544
def test_nested_ignore_depth_beyond_one(self):
545
# we only want to capture the first level out progress, not
546
# want sub-components might do. So we have nested bars ignored.
547
factory = ProgressRecordingUIFactory()
548
pb1 = factory.nested_progress_bar()
549
pb1.update('foo', 0, 1)
550
pb2 = factory.nested_progress_bar()
551
pb2.update('foo', 0, 1)
554
self.assertEqual([("update", 0, 1, 'foo')], factory._calls)