101
105
def test_progress_note(self):
102
106
stderr = StringIO()
103
107
stdout = StringIO()
104
ui_factory = TextUIFactory(bar_type=TTYProgressBar)
108
ui_factory = TextUIFactory(stdin=StringIO(''),
105
111
pb = ui_factory.nested_progress_bar()
107
pb.to_messages_file = stdout
108
ui_factory._progress_bar_stack.bottom().to_file = stderr
109
113
result = pb.note('t')
110
114
self.assertEqual(None, result)
111
115
self.assertEqual("t\n", stdout.getvalue())
122
126
# The PQM redirects the output to a file, so it
123
127
# defaults to creating a Dots progress bar. we
124
128
# need to force it to believe we are a TTY
125
ui_factory = TextUIFactory(bar_type=TTYProgressBar)
129
ui_factory = TextUIFactory(
131
stdout=stdout, stderr=stderr)
126
132
pb = ui_factory.nested_progress_bar()
128
pb.to_messages_file = stdout
129
ui_factory._progress_bar_stack.bottom().to_file = stderr
130
134
# Create a progress update that isn't throttled
132
135
pb.update('x', 1, 1)
133
136
result = pb.note('t')
134
137
self.assertEqual(None, result)
143
146
def test_progress_nested(self):
144
147
# test factory based nested and popping.
148
ui = TextUIFactory(None, None, None)
146
149
pb1 = ui.nested_progress_bar()
147
150
pb2 = ui.nested_progress_bar()
148
self.assertRaises(errors.MissingProgressBarFinish, pb1.finished)
151
# You do get a warning if the outermost progress bar wasn't finished
152
# first - it's not clear if this is really useful or if it should just
153
# become orphaned -- mbp 20090120
154
warnings, _ = self.callCatchWarnings(pb1.finished)
155
if len(warnings) != 1:
156
self.fail("unexpected warnings: %r" % (warnings,))
152
160
def test_progress_stack(self):
153
# test the progress bar stack which the default text factory
161
# test the progress bar stack which the default text factory
155
163
stderr = StringIO()
156
164
stdout = StringIO()
157
165
# make a stack, which accepts parameters like a pb.
158
stack = ProgressBarStack(to_file=stderr, to_messages_file=stdout)
166
stack = self.applyDeprecated(
167
deprecated_in((1, 12, 0)),
169
to_file=stderr, to_messages_file=stdout)
160
171
self.assertFalse(getattr(stack, 'note', False))
161
172
pb1 = stack.get_nested()
162
173
pb2 = stack.get_nested()
163
self.assertRaises(errors.MissingProgressBarFinish, pb1.finished)
174
warnings, _ = self.callCatchWarnings(pb1.finished)
175
self.assertEqual(len(warnings), 1)
166
178
# the text ui factory never actually removes the stack once its setup.
167
179
# we need to be able to nest again correctly from here.
168
180
pb1 = stack.get_nested()
169
181
pb2 = stack.get_nested()
170
self.assertRaises(errors.MissingProgressBarFinish, pb1.finished)
182
warnings, _ = self.callCatchWarnings(pb1.finished)
183
self.assertEqual(len(warnings), 1)
174
def test_text_factory_setting_progress_bar(self):
175
# we should be able to choose the progress bar type used.
176
factory = TextUIFactory(bar_type=DotsProgressBar)
177
bar = factory.nested_progress_bar()
179
self.assertIsInstance(bar, DotsProgressBar)
181
def test_cli_stdin_is_default_stdin(self):
182
factory = CLIUIFactory()
183
self.assertEqual(sys.stdin, factory.stdin)
185
187
def assert_get_bool_acceptance_of_user_input(self, factory):
186
188
factory.stdin = StringIO("y\nyes with garbage\n"
187
189
"yes\nn\nnot an answer\n"
212
214
self.assertEqual('', factory.stdin.readline())
214
216
def test_text_ui_getbool(self):
215
factory = TextUIFactory()
217
factory = TextUIFactory(None, None, None)
216
218
self.assert_get_bool_acceptance_of_user_input(factory)
218
220
def test_text_factory_prompts_and_clears(self):
219
221
# a get_boolean call should clear the pb before prompting
220
factory = TextUIFactory(bar_type=DotsProgressBar)
221
factory.stdout = _TTYStringIO()
222
factory.stdin = StringIO("yada\ny\n")
223
pb = self.apply_redirected(factory.stdin, factory.stdout,
224
factory.stdout, factory.nested_progress_bar)
226
self.apply_redirected(factory.stdin, factory.stdout,
227
factory.stdout, pb.update, "foo", 0, 1)
223
factory = TextUIFactory(stdin=StringIO("yada\ny\n"), stdout=out, stderr=out)
224
pb = factory.nested_progress_bar()
226
pb.show_spinner = False
227
pb.show_count = False
228
pb.update("foo", 0, 1)
228
229
self.assertEqual(True,
229
230
self.apply_redirected(None, factory.stdout,
231
232
factory.get_boolean,
232
233
"what do you want"))
233
output = factory.stdout.getvalue()
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
234
output = out.getvalue()
235
self.assertContainsRe(factory.stdout.getvalue(),
237
self.assertContainsRe(factory.stdout.getvalue(),
238
r"what do you want\? \[y/n\]: what do you want\? \[y/n\]: ")
239
# stdin should have been totally consumed
238
240
self.assertEqual('', factory.stdin.readline())
242
def test_text_tick_after_update(self):
243
ui_factory = TextUIFactory(stdout=StringIO(), stderr=StringIO())
244
pb = ui_factory.nested_progress_bar()
246
pb.update('task', 0, 3)
247
# Reset the clock, so that it actually tries to repaint itself
248
ui_factory._progress_view._last_repaint = time.time() - 1.0