36
47
def test_silent_factory(self):
37
48
ui = SilentUIFactory()
38
pb = ui.nested_progress_bar()
40
# TODO: Test that there is no output from SilentUIFactory
42
self.assertEquals(ui.get_password(), None)
43
self.assertEquals(ui.get_password(u'Hello There \u1234 %(user)s',
49
def test_text_factory(self):
51
pb = ui.nested_progress_bar()
53
# TODO: Test the output from TextUIFactory, perhaps by overriding sys.stdout
55
# Unfortunately we can't actually test the ui.get_password() because
56
# that would actually prompt the user for a password during the test suite
57
# This has been tested manually with both LANG=en_US.utf-8 and LANG=C
59
# self.assertEquals(ui.get_password(u"%(user)s please type 'bogus'",
50
self.assertEqual(None,
51
self.apply_redirected(None, stdout, stdout,
53
self.assertEqual('', stdout.getvalue())
54
self.assertEqual(None,
55
self.apply_redirected(None, stdout, stdout,
57
u'Hello\u1234 %(user)s',
59
self.assertEqual('', stdout.getvalue())
61
def test_text_factory_ascii_password(self):
62
ui = TestUIFactory(stdin='secret\n', stdout=StringIOWrapper())
63
pb = ui.nested_progress_bar()
65
self.assertEqual('secret',
66
self.apply_redirected(ui.stdin, ui.stdout,
69
# ': ' is appended to prompt
70
self.assertEqual(': ', ui.stdout.getvalue())
71
# stdin should be empty
72
self.assertEqual('', ui.stdin.readline())
76
def test_text_factory_utf8_password(self):
77
"""Test an utf8 password.
79
We can't predict what encoding users will have for stdin, so we force
80
it to utf8 to test that we transport the password correctly.
82
ui = TestUIFactory(stdin=u'baz\u1234'.encode('utf8'),
83
stdout=StringIOWrapper())
84
ui.stdin.encoding = 'utf8'
85
ui.stdout.encoding = ui.stdin.encoding
86
pb = ui.nested_progress_bar()
88
password = self.apply_redirected(ui.stdin, ui.stdout, ui.stdout,
90
u'Hello \u1234 %(user)s',
92
# We use StringIO objects, we need to decode them
93
self.assertEqual(u'baz\u1234', password.decode('utf8'))
94
self.assertEqual(u'Hello \u1234 some\u1234: ',
95
ui.stdout.getvalue().decode('utf8'))
96
# stdin should be empty
97
self.assertEqual('', ui.stdin.readline())
64
101
def test_progress_note(self):
65
102
stderr = StringIO()
73
110
self.assertEqual(None, result)
74
111
self.assertEqual("t\n", stdout.getvalue())
75
112
# Since there was no update() call, there should be no clear() call
76
self.failIf(re.search(r'^\r {10,}\r$', stderr.getvalue()) is not None,
113
self.failIf(re.search(r'^\r {10,}\r$',
114
stderr.getvalue()) is not None,
77
115
'We cleared the stderr without anything to put there')
136
174
def test_text_factory_setting_progress_bar(self):
137
175
# we should be able to choose the progress bar type used.
138
factory = bzrlib.ui.text.TextUIFactory(
139
bar_type=bzrlib.progress.DotsProgressBar)
176
factory = TextUIFactory(bar_type=DotsProgressBar)
140
177
bar = factory.nested_progress_bar()
142
self.assertIsInstance(bar, bzrlib.progress.DotsProgressBar)
179
self.assertIsInstance(bar, DotsProgressBar)
144
181
def test_cli_stdin_is_default_stdin(self):
145
factory = bzrlib.ui.CLIUIFactory()
182
factory = CLIUIFactory()
146
183
self.assertEqual(sys.stdin, factory.stdin)
148
185
def assert_get_bool_acceptance_of_user_input(self, factory):
149
factory.stdin = StringIO("y\nyes with garbage\nyes\nn\nnot an answer\nno\nfoo\n")
186
factory.stdin = StringIO("y\nyes with garbage\n"
187
"yes\nn\nnot an answer\n"
150
189
factory.stdout = StringIO()
151
190
# there is no output from the base factory
152
191
self.assertEqual(True, factory.get_boolean(""))
154
193
self.assertEqual(False, factory.get_boolean(""))
155
194
self.assertEqual(False, factory.get_boolean(""))
156
195
self.assertEqual("foo\n", factory.stdin.read())
196
# stdin should be empty
197
self.assertEqual('', factory.stdin.readline())
158
199
def test_silent_ui_getbool(self):
159
factory = bzrlib.ui.SilentUIFactory()
200
factory = SilentUIFactory()
160
201
self.assert_get_bool_acceptance_of_user_input(factory)
162
203
def test_silent_factory_prompts_silently(self):
163
factory = bzrlib.ui.SilentUIFactory()
204
factory = SilentUIFactory()
164
205
stdout = StringIO()
165
206
factory.stdin = StringIO("y\n")
168
self.apply_redirected(
169
None, stdout, stdout, factory.get_boolean, "foo")
207
self.assertEqual(True,
208
self.apply_redirected(None, stdout, stdout,
209
factory.get_boolean, "foo"))
171
210
self.assertEqual("", stdout.getvalue())
211
# stdin should be empty
212
self.assertEqual('', factory.stdin.readline())
173
214
def test_text_ui_getbool(self):
174
factory = bzrlib.ui.text.TextUIFactory()
215
factory = TextUIFactory()
175
216
self.assert_get_bool_acceptance_of_user_input(factory)
177
218
def test_text_factory_prompts_and_clears(self):
178
219
# a get_boolean call should clear the pb before prompting
179
factory = bzrlib.ui.text.TextUIFactory()
220
factory = TextUIFactory(bar_type=DotsProgressBar)
180
221
factory.stdout = _TTYStringIO()
181
222
factory.stdin = StringIO("yada\ny\n")
182
pb = self.apply_redirected(
183
factory.stdin, factory.stdout, factory.stdout, factory.nested_progress_bar)
223
pb = self.apply_redirected(factory.stdin, factory.stdout,
224
factory.stdout, factory.nested_progress_bar)
184
225
pb.start_time = None
185
self.apply_redirected(
186
factory.stdin, factory.stdout, factory.stdout, pb.update, "foo", 0, 1)
189
self.apply_redirected(
190
None, factory.stdout, factory.stdout, factory.get_boolean, "what do you want")
192
# use a regular expression so that we don't depend on the particular
193
# screen width - could also set and restore $COLUMN if that has
194
# priority on all platforms, but it doesn't at present.
226
self.apply_redirected(factory.stdin, factory.stdout,
227
factory.stdout, pb.update, "foo", 0, 1)
228
self.assertEqual(True,
229
self.apply_redirected(None, factory.stdout,
195
233
output = factory.stdout.getvalue()
197
"\r/ \\[ *\\] foo 0/1"
199
"\rwhat do you want\\? \\[y/n\\]:what do you want\\? \\[y/n\\]:",
201
self.fail("didn't match factory output %r, %s" % (factory, output))
234
self.assertEqual("foo: .\n"
235
"what do you want? [y/n]: what do you want? [y/n]: ",
236
factory.stdout.getvalue())
237
# stdin should be empty
238
self.assertEqual('', factory.stdin.readline())