88
88
def test_text_ui_get_boolean(self):
94
"yes with garbage\nY\n" # True
95
"not an answer\nno\n" # False
96
"I'm sure!\nyes\n" # True
94
"yes with garbage\nY\n" # True
95
"not an answer\nno\n" # False
96
"I'm sure!\nyes\n" # True
99
factory = ui_testing.TextUIFactory(stdin_text)
100
self.assertEqual(True, factory.get_boolean(u""))
101
self.assertEqual(False, factory.get_boolean(u""))
102
self.assertEqual(True, factory.get_boolean(u""))
103
self.assertEqual(False, factory.get_boolean(u""))
104
self.assertEqual(True, factory.get_boolean(u""))
105
self.assertEqual(False, factory.get_boolean(u""))
106
self.assertEqual(True, factory.get_boolean(u""))
107
self.assertEqual(False, factory.get_boolean(u""))
108
self.assertEqual("foo\n", factory.stdin.read())
109
# stdin should be empty
110
self.assertEqual('', factory.stdin.readline())
111
# return false on EOF
112
self.assertEqual(False, factory.get_boolean(u""))
99
with ui_testing.TextUIFactory(stdin_text) as factory:
100
self.assertEqual(True, factory.get_boolean(u""))
101
self.assertEqual(False, factory.get_boolean(u""))
102
self.assertEqual(True, factory.get_boolean(u""))
103
self.assertEqual(False, factory.get_boolean(u""))
104
self.assertEqual(True, factory.get_boolean(u""))
105
self.assertEqual(False, factory.get_boolean(u""))
106
self.assertEqual(True, factory.get_boolean(u""))
107
self.assertEqual(False, factory.get_boolean(u""))
108
self.assertEqual("foo\n", factory.stdin.read())
109
# stdin should be empty
110
self.assertEqual('', factory.stdin.readline())
111
# return false on EOF
112
self.assertEqual(False, factory.get_boolean(u""))
114
114
def test_text_ui_choose_bad_parameters(self):
115
factory = ui_testing.TextUIFactory(u"")
116
# invalid default index
117
self.assertRaises(ValueError, factory.choose, u"", u"&Yes\n&No", 3)
119
self.assertRaises(ValueError, factory.choose, u"", u"&choice\n&ChOiCe")
120
# duplicated shortcut
121
self.assertRaises(ValueError, factory.choose, u"", u"&choice1\nchoi&ce2")
115
with ui_testing.TextUIFactory(u"") as factory:
116
# invalid default index
117
self.assertRaises(ValueError, factory.choose, u"", u"&Yes\n&No", 3)
120
ValueError, factory.choose, u"", u"&choice\n&ChOiCe")
121
# duplicated shortcut
123
ValueError, factory.choose, u"", u"&choice1\nchoi&ce2")
123
125
def test_text_ui_choose_prompt_explicit(self):
124
126
# choices with explicit shortcuts
125
factory = ui_testing.TextUIFactory(u"")
126
factory.choose(u"prompt", u"&yes\n&No\nmore &info")
127
self.assertEqual("prompt ([y]es, [N]o, more [i]nfo): \n", factory.stderr.getvalue())
127
with ui_testing.TextUIFactory(u"") as factory:
128
factory.choose(u"prompt", u"&yes\n&No\nmore &info")
130
"prompt ([y]es, [N]o, more [i]nfo): \n",
131
factory.stderr.getvalue())
129
133
def test_text_ui_choose_prompt_automatic(self):
130
134
# automatic shortcuts
131
factory = ui_testing.TextUIFactory(u"")
132
factory.choose(u"prompt", u"yes\nNo\nmore info")
133
self.assertEqual("prompt ([y]es, [N]o, [m]ore info): \n", factory.stderr.getvalue())
135
with ui_testing.TextUIFactory(u"") as factory:
136
factory.choose(u"prompt", u"yes\nNo\nmore info")
138
"prompt ([y]es, [N]o, [m]ore info): \n",
139
factory.stderr.getvalue())
135
141
def test_text_ui_choose_return_values(self):
136
choose = lambda: factory.choose(u"", u"&Yes\n&No\nMaybe\nmore &info", 3)
143
return factory.choose(u"", u"&Yes\n&No\nMaybe\nmore &info", 3)
142
"b\na\nd \n" # bad shortcuts, all ignored
143
"yes with garbage\nY\n" # 0
144
"not an answer\nno\n" # 1
145
"info\nmore info\n" # 3
149
"b\na\nd \n" # bad shortcuts, all ignored
150
"yes with garbage\nY\n" # 0
151
"not an answer\nno\n" # 1
152
"info\nmore info\n" # 3
148
factory = ui_testing.TextUIFactory(stdin_text)
149
self.assertEqual(0, choose())
150
self.assertEqual(1, choose())
151
self.assertEqual(3, choose())
152
self.assertEqual(1, choose())
153
self.assertEqual(0, choose())
154
self.assertEqual(1, choose())
155
self.assertEqual(3, choose())
156
self.assertEqual(2, choose())
157
self.assertEqual("foo\n", factory.stdin.read())
158
# stdin should be empty
159
self.assertEqual('', factory.stdin.readline())
161
self.assertEqual(None, choose())
155
with ui_testing.TextUIFactory(stdin_text) as factory:
156
self.assertEqual(0, choose())
157
self.assertEqual(1, choose())
158
self.assertEqual(3, choose())
159
self.assertEqual(1, choose())
160
self.assertEqual(0, choose())
161
self.assertEqual(1, choose())
162
self.assertEqual(3, choose())
163
self.assertEqual(2, choose())
164
self.assertEqual("foo\n", factory.stdin.read())
165
# stdin should be empty
166
self.assertEqual('', factory.stdin.readline())
168
self.assertEqual(None, choose())
163
170
def test_text_ui_choose_no_default(self):
165
" \n" # no default, invalid!
172
" \n" # no default, invalid!
168
factory = ui_testing.TextUIFactory(stdin_text)
169
self.assertEqual(0, factory.choose(u"", u"&Yes\n&No"))
170
self.assertEqual("foo\n", factory.stdin.read())
175
with ui_testing.TextUIFactory(stdin_text) as factory:
176
self.assertEqual(0, factory.choose(u"", u"&Yes\n&No"))
177
self.assertEqual("foo\n", factory.stdin.read())
172
179
def test_text_ui_get_integer(self):
176
183
"hmmm\nwhat else ?\nCome on\nok 42\n4.24\n42\n")
177
factory = ui_testing.TextUIFactory(stdin_text)
178
self.assertEqual(1, factory.get_integer(u""))
179
self.assertEqual(-2, factory.get_integer(u""))
180
self.assertEqual(42, factory.get_integer(u""))
184
with ui_testing.TextUIFactory(stdin_text) as factory:
185
self.assertEqual(1, factory.get_integer(u""))
186
self.assertEqual(-2, factory.get_integer(u""))
187
self.assertEqual(42, factory.get_integer(u""))
182
189
def test_text_factory_prompt(self):
183
190
# see <https://launchpad.net/bugs/365891>
184
factory = ui_testing.TextUIFactory()
185
factory.prompt(u'foo %2e')
186
self.assertEqual('', factory.stdout.getvalue())
187
self.assertEqual('foo %2e', factory.stderr.getvalue())
191
with ui_testing.TextUIFactory() as factory:
192
factory.prompt(u'foo %2e')
193
self.assertEqual('', factory.stdout.getvalue())
194
self.assertEqual('foo %2e', factory.stderr.getvalue())
189
196
def test_text_factory_prompts_and_clears(self):
190
197
# a get_boolean call should clear the pb before prompting
191
198
out = ui_testing.StringIOAsTTY()
192
199
self.overrideEnv('TERM', 'xterm')
193
200
factory = ui_testing.TextUIFactory("yada\ny\n", stdout=out, stderr=out)
194
pb = factory.nested_progress_bar()
195
pb._avail_width = lambda: 79
197
pb.show_spinner = False
198
pb.show_count = False
199
pb.update("foo", 0, 1)
200
self.assertEqual(True,
201
self.apply_redirected(None, factory.stdout,
204
u"what do you want"))
205
output = out.getvalue()
206
self.assertContainsRe(output,
208
self.assertContainsString(output,
209
r"what do you want? ([y]es, [n]o): what do you want? ([y]es, [n]o): ")
210
# stdin should have been totally consumed
211
self.assertEqual('', factory.stdin.readline())
202
pb = factory.nested_progress_bar()
203
pb._avail_width = lambda: 79
205
pb.show_spinner = False
206
pb.show_count = False
207
pb.update("foo", 0, 1)
210
self.apply_redirected(
211
None, factory.stdout, factory.stdout, factory.get_boolean,
212
u"what do you want"))
213
output = out.getvalue()
214
self.assertContainsRe(output,
216
self.assertContainsString(
218
r"what do you want? ([y]es, [n]o): what do you want? "
220
# stdin should have been totally consumed
221
self.assertEqual('', factory.stdin.readline())
213
223
def test_text_tick_after_update(self):
214
224
ui_factory = ui_testing.TextUIFactory()
215
pb = ui_factory.nested_progress_bar()
225
with ui_factory.nested_progress_bar() as pb:
217
226
pb.update('task', 0, 3)
218
227
# Reset the clock, so that it actually tries to repaint itself
219
228
ui_factory._progress_view._last_repaint = time.time() - 1.0
224
231
def test_text_ui_getusername(self):
225
232
ui = ui_testing.TextUIFactory('someuser\n\n')
305
316
FileStringIO = ui_testing.StringIOWithEncoding
306
317
TTYStringIO = ui_testing.StringIOAsTTY
307
318
for (file_class, term, pb, expected_pb_class) in (
308
# on an xterm, either use them or not as the user requests,
309
# otherwise default on
310
(TTYStringIO, 'xterm', 'none', _mod_ui_text.NullProgressView),
311
(TTYStringIO, 'xterm', 'text', _mod_ui_text.TextProgressView),
312
(TTYStringIO, 'xterm', None, _mod_ui_text.TextProgressView),
313
# on a dumb terminal, again if there's explicit configuration do
314
# it, otherwise default off
315
(TTYStringIO, 'dumb', 'none', _mod_ui_text.NullProgressView),
316
(TTYStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
317
(TTYStringIO, 'dumb', None, _mod_ui_text.NullProgressView),
318
# on a non-tty terminal, it's null regardless of $TERM
319
(FileStringIO, 'xterm', None, _mod_ui_text.NullProgressView),
320
(FileStringIO, 'dumb', None, _mod_ui_text.NullProgressView),
321
# however, it can still be forced on
322
(FileStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
319
# on an xterm, either use them or not as the user requests,
320
# otherwise default on
321
(TTYStringIO, 'xterm', 'none', _mod_ui_text.NullProgressView),
322
(TTYStringIO, 'xterm', 'text', _mod_ui_text.TextProgressView),
323
(TTYStringIO, 'xterm', None, _mod_ui_text.TextProgressView),
324
# on a dumb terminal, again if there's explicit configuration
325
# do it, otherwise default off
326
(TTYStringIO, 'dumb', 'none', _mod_ui_text.NullProgressView),
327
(TTYStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
328
(TTYStringIO, 'dumb', None, _mod_ui_text.NullProgressView),
329
# on a non-tty terminal, it's null regardless of $TERM
330
(FileStringIO, 'xterm', None, _mod_ui_text.NullProgressView),
331
(FileStringIO, 'dumb', None, _mod_ui_text.NullProgressView),
332
# however, it can still be forced on
333
(FileStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
324
335
self.overrideEnv('TERM', term)
325
336
self.overrideEnv('BRZ_PROGRESS_BAR', pb)
326
337
stdin = file_class(u'')
327
338
stderr = file_class()
328
339
stdout = file_class()
329
340
uif = _mod_ui.make_ui_for_terminal(stdin, stdout, stderr)
330
self.assertIsInstance(uif, _mod_ui_text.TextUIFactory,
341
self.assertIsInstance(
342
uif, _mod_ui_text.TextUIFactory,
331
343
"TERM=%s BRZ_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))
332
self.assertIsInstance(uif.make_progress_view(),
344
self.assertIsInstance(
345
uif.make_progress_view(),
333
346
expected_pb_class,
334
347
"TERM=%s BRZ_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))