41
class TTYStringIO(StringIO):
42
"""A helper class which makes a StringIO look like a terminal"""
48
class NonTTYStringIO(StringIO):
49
"""Helper that implements isatty() but returns False"""
42
55
class TestUIConfiguration(tests.TestCaseWithTransport):
44
57
def test_output_encoding_configuration(self):
45
58
enc = fixtures.generate_unicode_encodings().next()
46
config.GlobalConfig().set_user_option('output_encoding',
59
config.GlobalStack().set('output_encoding', enc)
48
60
ui = tests.TestUIFactory(stdin=None,
49
61
stdout=tests.StringIOWrapper(),
50
62
stderr=tests.StringIOWrapper())
87
99
def test_text_factory_utf8_password(self):
88
"""Test an utf8 password.
90
We can't predict what encoding users will have for stdin, so we force
91
it to utf8 to test that we transport the password correctly.
93
ui = self.make_test_ui_factory(u'baz\u1234'.encode('utf8'))
100
"""Test an utf8 password."""
101
ui = _mod_ui_text.TextUIFactory(None, None, None)
102
ui.stdin = tests.StringIOWrapper(u'baz\u1234'.encode('utf8'))
103
ui.stdout = tests.StringIOWrapper()
104
ui.stderr = tests.StringIOWrapper()
94
105
ui.stderr.encoding = ui.stdout.encoding = ui.stdin.encoding = 'utf8'
95
106
pb = ui.nested_progress_bar()
97
password = self.apply_redirected(ui.stdin, ui.stdout, ui.stderr,
99
u'Hello \u1234 %(user)s',
101
# We use StringIO objects, we need to decode them
102
self.assertEqual(u'baz\u1234', password.decode('utf8'))
103
self.assertEqual(u'Hello \u1234 some\u1234: ',
104
ui.stderr.getvalue().decode('utf8'))
105
# stdin and stdout should be empty
106
self.assertEqual('', ui.stdin.readline())
107
self.assertEqual('', ui.stdout.readline())
107
password = ui.get_password(u'Hello \u1234 %(user)s', user=u'some\u1234')
108
self.assertEqual(u'baz\u1234', password)
109
self.assertEqual(u'Hello \u1234 some\u1234: ',
110
ui.stderr.getvalue().decode('utf8'))
111
# stdin and stdout should be empty
112
self.assertEqual('', ui.stdin.readline())
113
self.assertEqual('', ui.stdout.getvalue())
111
115
def test_text_ui_get_boolean(self):
112
116
stdin = tests.StringIOWrapper("y\n" # True
114
120
"yes with garbage\nY\n" # True
115
121
"not an answer\nno\n" # False
116
122
"I'm sure!\nyes\n" # True
125
131
self.assertEqual(False, factory.get_boolean(u""))
126
132
self.assertEqual(True, factory.get_boolean(u""))
127
133
self.assertEqual(False, factory.get_boolean(u""))
128
self.assertEqual("foo\n", factory.stdin.read())
129
# stdin should be empty
130
self.assertEqual('', factory.stdin.readline())
134
self.assertEqual(True, factory.get_boolean(u""))
135
self.assertEqual(False, factory.get_boolean(u""))
136
self.assertEqual("foo\n", factory.stdin.read())
137
# stdin should be empty
138
self.assertEqual('', factory.stdin.readline())
139
# return false on EOF
140
self.assertEqual(False, factory.get_boolean(u""))
142
def test_text_ui_choose_bad_parameters(self):
143
stdin = tests.StringIOWrapper()
144
stdout = tests.StringIOWrapper()
145
stderr = tests.StringIOWrapper()
146
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
147
# invalid default index
148
self.assertRaises(ValueError, factory.choose, u"", u"&Yes\n&No", 3)
150
self.assertRaises(ValueError, factory.choose, u"", u"&choice\n&ChOiCe")
151
# duplicated shortcut
152
self.assertRaises(ValueError, factory.choose, u"", u"&choice1\nchoi&ce2")
154
def test_text_ui_choose_prompt(self):
155
stdin = tests.StringIOWrapper()
156
stdout = tests.StringIOWrapper()
157
stderr = tests.StringIOWrapper()
158
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
159
# choices with explicit shortcuts
160
factory.choose(u"prompt", u"&yes\n&No\nmore &info")
161
self.assertEqual("prompt ([y]es, [N]o, more [i]nfo): \n", factory.stderr.getvalue())
162
# automatic shortcuts
163
factory.stderr.truncate(0)
164
factory.choose(u"prompt", u"yes\nNo\nmore info")
165
self.assertEqual("prompt ([y]es, [N]o, [m]ore info): \n", factory.stderr.getvalue())
167
def test_text_ui_choose_return_values(self):
168
choose = lambda: factory.choose(u"", u"&Yes\n&No\nMaybe\nmore &info", 3)
169
stdin = tests.StringIOWrapper("y\n" # 0
173
"b\na\nd \n" # bad shortcuts, all ignored
174
"yes with garbage\nY\n" # 0
175
"not an answer\nno\n" # 1
176
"info\nmore info\n" # 3
179
stdout = tests.StringIOWrapper()
180
stderr = tests.StringIOWrapper()
181
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
182
self.assertEqual(0, choose())
183
self.assertEqual(1, choose())
184
self.assertEqual(3, choose())
185
self.assertEqual(1, choose())
186
self.assertEqual(0, choose())
187
self.assertEqual(1, choose())
188
self.assertEqual(3, choose())
189
self.assertEqual(2, choose())
190
self.assertEqual("foo\n", factory.stdin.read())
191
# stdin should be empty
192
self.assertEqual('', factory.stdin.readline())
194
self.assertEqual(None, choose())
196
def test_text_ui_choose_no_default(self):
197
stdin = tests.StringIOWrapper(" \n" # no default, invalid!
200
stdout = tests.StringIOWrapper()
201
stderr = tests.StringIOWrapper()
202
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
203
self.assertEqual(0, factory.choose(u"", u"&Yes\n&No"))
204
self.assertEqual("foo\n", factory.stdin.read())
132
206
def test_text_ui_get_integer(self):
133
207
stdin = tests.StringIOWrapper(
190
264
def test_text_ui_getusername(self):
191
factory = _mod_ui_text.TextUIFactory(None, None, None)
192
factory.stdin = tests.StringIOWrapper("someuser\n\n")
193
factory.stdout = tests.StringIOWrapper()
194
factory.stderr = tests.StringIOWrapper()
195
factory.stdout.encoding = "utf8"
196
# there is no output from the base factory
197
self.assertEqual("someuser",
198
factory.get_username(u'Hello %(host)s', host='some'))
199
self.assertEquals("Hello some: ", factory.stderr.getvalue())
200
self.assertEquals('', factory.stdout.getvalue())
201
self.assertEqual("", factory.get_username(u"Gebruiker"))
265
ui = _mod_ui_text.TextUIFactory(None, None, None)
266
ui.stdin = tests.StringIOWrapper('someuser\n\n')
267
ui.stdout = tests.StringIOWrapper()
268
ui.stderr = tests.StringIOWrapper()
269
ui.stdout.encoding = 'utf8'
270
self.assertEqual('someuser',
271
ui.get_username(u'Hello %(host)s', host='some'))
272
self.assertEquals('Hello some: ', ui.stderr.getvalue())
273
self.assertEquals('', ui.stdout.getvalue())
274
self.assertEqual('', ui.get_username(u"Gebruiker"))
202
275
# stdin should be empty
203
self.assertEqual('', factory.stdin.readline())
276
self.assertEqual('', ui.stdin.readline())
205
278
def test_text_ui_getusername_utf8(self):
206
ui = tests.TestUIFactory(stdin=u'someuser\u1234'.encode('utf8'),
207
stdout=tests.StringIOWrapper(),
208
stderr=tests.StringIOWrapper())
279
ui = _mod_ui_text.TextUIFactory(None, None, None)
280
ui.stdin = tests.StringIOWrapper(u'someuser\u1234'.encode('utf8'))
281
ui.stdout = tests.StringIOWrapper()
282
ui.stderr = tests.StringIOWrapper()
209
283
ui.stderr.encoding = ui.stdout.encoding = ui.stdin.encoding = "utf8"
210
pb = ui.nested_progress_bar()
212
# there is no output from the base factory
213
username = self.apply_redirected(ui.stdin, ui.stdout, ui.stderr,
214
ui.get_username, u'Hello\u1234 %(host)s', host=u'some\u1234')
215
self.assertEquals(u"someuser\u1234", username.decode('utf8'))
216
self.assertEquals(u"Hello\u1234 some\u1234: ",
217
ui.stderr.getvalue().decode("utf8"))
218
self.assertEquals('', ui.stdout.getvalue())
284
username = ui.get_username(u'Hello %(host)s', host=u'some\u1234')
285
self.assertEquals(u"someuser\u1234", username)
286
self.assertEquals(u"Hello some\u1234: ",
287
ui.stderr.getvalue().decode("utf8"))
288
self.assertEquals('', ui.stdout.getvalue())
222
290
def test_quietness(self):
223
291
self.overrideEnv('BZR_PROGRESS_BAR', 'text')
224
292
ui_factory = _mod_ui_text.TextUIFactory(None,
225
test_progress._TTYStringIO(),
226
test_progress._TTYStringIO())
227
295
self.assertIsInstance(ui_factory._progress_view,
228
296
_mod_ui_text.TextProgressView)
229
297
ui_factory.be_quiet(True)
322
389
def test_text_ui_non_terminal(self):
323
390
"""Even on non-ttys, make_ui_for_terminal gives a text ui."""
324
stdin = test_progress._NonTTYStringIO('')
325
stderr = test_progress._NonTTYStringIO()
326
stdout = test_progress._NonTTYStringIO()
391
stdin = NonTTYStringIO('')
392
stderr = NonTTYStringIO()
393
stdout = NonTTYStringIO()
327
394
for term_type in ['dumb', None, 'xterm']:
328
395
self.overrideEnv('TERM', term_type)
329
396
uif = _mod_ui.make_ui_for_terminal(stdin, stdout, stderr)