/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_ui.py

  • Committer: Robert Collins
  • Date: 2009-05-23 20:57:12 UTC
  • mfrom: (4371 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4441.
  • Revision ID: robertc@robertcollins.net-20090523205712-lcwbfqk6vwavinuv
MergeĀ .dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""Tests for the bzrlib ui
18
18
"""
28
28
from bzrlib.progress import (
29
29
    DotsProgressBar,
30
30
    ProgressBarStack,
 
31
    ProgressTask,
31
32
    TTYProgressBar,
32
33
    )
33
34
from bzrlib.symbol_versioning import (
43
44
    CLIUIFactory,
44
45
    SilentUIFactory,
45
46
    )
46
 
from bzrlib.ui.text import TextUIFactory
 
47
from bzrlib.ui.text import (
 
48
    TextProgressView,
 
49
    TextUIFactory,
 
50
    )
47
51
 
48
52
 
49
53
class UITests(TestCase):
217
221
        factory = TextUIFactory(None, None, None)
218
222
        self.assert_get_bool_acceptance_of_user_input(factory)
219
223
 
 
224
    def test_text_factory_prompt(self):
 
225
        # see <https://launchpad.net/bugs/365891>
 
226
        factory = TextUIFactory(None, StringIO(), StringIO())
 
227
        factory.prompt('foo %2e')
 
228
 
220
229
    def test_text_factory_prompts_and_clears(self):
221
230
        # a get_boolean call should clear the pb before prompting
222
231
        out = _TTYStringIO()
249
258
            pb.tick()
250
259
        finally:
251
260
            pb.finished()
 
261
 
 
262
    def test_silent_ui_getusername(self):
 
263
        factory = SilentUIFactory()
 
264
        factory.stdin = StringIO("someuser\n\n")
 
265
        factory.stdout = StringIO()
 
266
        self.assertEquals(None, 
 
267
            factory.get_username(u'Hello\u1234 %(host)s', host=u'some\u1234'))
 
268
        self.assertEquals("", factory.stdout.getvalue())
 
269
        self.assertEquals("someuser\n\n", factory.stdin.getvalue())
 
270
 
 
271
    def test_text_ui_getusername(self):
 
272
        factory = TextUIFactory(None, None, None)
 
273
        factory.stdin = StringIO("someuser\n\n")
 
274
        factory.stdout = StringIO()
 
275
        factory.stdout.encoding = "utf8"
 
276
        # there is no output from the base factory
 
277
        self.assertEqual("someuser", 
 
278
            factory.get_username('Hello %(host)s', host='some'))
 
279
        self.assertEquals("Hello some: ", factory.stdout.getvalue())
 
280
        self.assertEqual("", factory.get_username("Gebruiker"))
 
281
        # stdin should be empty
 
282
        self.assertEqual('', factory.stdin.readline())
 
283
 
 
284
    def test_text_ui_getusername_utf8(self):
 
285
        ui = TestUIFactory(stdin=u'someuser\u1234'.encode('utf8'),
 
286
                           stdout=StringIOWrapper())
 
287
        ui.stdin.encoding = "utf8"
 
288
        ui.stdout.encoding = ui.stdin.encoding
 
289
        pb = ui.nested_progress_bar()
 
290
        try:
 
291
            # there is no output from the base factory
 
292
            username = self.apply_redirected(ui.stdin, ui.stdout, ui.stdout,
 
293
                ui.get_username, u'Hello\u1234 %(host)s', host=u'some\u1234')
 
294
            self.assertEquals(u"someuser\u1234", username.decode('utf8'))
 
295
            self.assertEquals(u"Hello\u1234 some\u1234: ", 
 
296
                ui.stdout.getvalue().decode("utf8"))
 
297
        finally:
 
298
            pb.finished()
 
299
 
 
300
 
 
301
class TestTextProgressView(TestCase):
 
302
    """Tests for text display of progress bars.
 
303
    """
 
304
    # XXX: These might be a bit easier to write if the rendering and
 
305
    # state-maintaining parts of TextProgressView were more separate, and if
 
306
    # the progress task called back directly to its own view not to the ui
 
307
    # factory. -- mbp 20090312
 
308
    
 
309
    def _make_factory(self):
 
310
        out = StringIO()
 
311
        uif = TextUIFactory(stderr=out)
 
312
        uif._progress_view._width = 80
 
313
        return out, uif
 
314
 
 
315
    def test_render_progress_easy(self):
 
316
        """Just one task and one quarter done"""
 
317
        out, uif = self._make_factory()
 
318
        task = uif.nested_progress_bar()
 
319
        task.update('reticulating splines', 5, 20)
 
320
        self.assertEqual(
 
321
'\r[####/               ] reticulating splines 5/20                               \r'
 
322
            , out.getvalue())
 
323
 
 
324
    def test_render_progress_nested(self):
 
325
        """Tasks proportionally contribute to overall progress"""
 
326
        out, uif = self._make_factory()
 
327
        task = uif.nested_progress_bar()
 
328
        task.update('reticulating splines', 0, 2)
 
329
        task2 = uif.nested_progress_bar()
 
330
        task2.update('stage2', 1, 2)
 
331
        # so we're in the first half of the main task, and half way through
 
332
        # that
 
333
        self.assertEqual(
 
334
r'[####\               ] reticulating splines:stage2 1/2'
 
335
            , uif._progress_view._render_line())
 
336
        # if the nested task is complete, then we're all the way through the
 
337
        # first half of the overall work
 
338
        task2.update('stage2', 2, 2)
 
339
        self.assertEqual(
 
340
r'[#########|          ] reticulating splines:stage2 2/2'
 
341
            , uif._progress_view._render_line())
 
342
 
 
343
    def test_render_progress_sub_nested(self):
 
344
        """Intermediate tasks don't mess up calculation."""
 
345
        out, uif = self._make_factory()
 
346
        task_a = uif.nested_progress_bar()
 
347
        task_a.update('a', 0, 2)
 
348
        task_b = uif.nested_progress_bar()
 
349
        task_b.update('b')
 
350
        task_c = uif.nested_progress_bar()
 
351
        task_c.update('c', 1, 2)
 
352
        # the top-level task is in its first half; the middle one has no
 
353
        # progress indication, just a label; and the bottom one is half done,
 
354
        # so the overall fraction is 1/4
 
355
        self.assertEqual(
 
356
            r'[####|               ] a:b:c 1/2'
 
357
            , uif._progress_view._render_line())
 
358