~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_ui.py

merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
17
17
"""Tests for the bzrlib ui
18
18
"""
19
19
 
20
 
import os
21
 
import re
22
20
import time
23
21
 
24
22
from StringIO import StringIO
25
23
 
 
24
from testtools.matchers import *
 
25
 
26
26
from bzrlib import (
27
27
    config,
28
 
    errors,
29
28
    remote,
30
 
    repository,
31
29
    tests,
32
30
    ui as _mod_ui,
33
31
    )
34
 
from bzrlib.symbol_versioning import (
35
 
    deprecated_in,
36
 
    )
37
32
from bzrlib.tests import (
38
33
    fixtures,
39
34
    test_progress,
53
48
        ui = tests.TestUIFactory(stdin=None,
54
49
            stdout=tests.StringIOWrapper(),
55
50
            stderr=tests.StringIOWrapper())
56
 
        os = ui.make_output_stream()
57
 
        self.assertEquals(os.encoding, enc)
 
51
        output = ui.make_output_stream()
 
52
        self.assertEquals(output.encoding, enc)
58
53
 
59
54
 
60
55
class TestTextUIFactory(tests.TestCase):
61
56
 
 
57
    def make_test_ui_factory(self, stdin_contents):
 
58
        ui = tests.TestUIFactory(stdin=stdin_contents,
 
59
                                 stdout=tests.StringIOWrapper(),
 
60
                                 stderr=tests.StringIOWrapper())
 
61
        return ui
 
62
 
 
63
    def test_text_factory_confirm(self):
 
64
        # turns into reading a regular boolean
 
65
        ui = self.make_test_ui_factory('n\n')
 
66
        self.assertEquals(ui.confirm_action('Should %(thing)s pass?',
 
67
            'bzrlib.tests.test_ui.confirmation',
 
68
            {'thing': 'this'},),
 
69
            False)
 
70
 
62
71
    def test_text_factory_ascii_password(self):
63
 
        ui = tests.TestUIFactory(stdin='secret\n',
64
 
                                 stdout=tests.StringIOWrapper(),
65
 
                                 stderr=tests.StringIOWrapper())
 
72
        ui = self.make_test_ui_factory('secret\n')
66
73
        pb = ui.nested_progress_bar()
67
74
        try:
68
75
            self.assertEqual('secret',
83
90
        We can't predict what encoding users will have for stdin, so we force
84
91
        it to utf8 to test that we transport the password correctly.
85
92
        """
86
 
        ui = tests.TestUIFactory(stdin=u'baz\u1234'.encode('utf8'),
87
 
                                 stdout=tests.StringIOWrapper(),
88
 
                                 stderr=tests.StringIOWrapper())
 
93
        ui = self.make_test_ui_factory(u'baz\u1234'.encode('utf8'))
89
94
        ui.stderr.encoding = ui.stdout.encoding = ui.stdin.encoding = 'utf8'
90
95
        pb = ui.nested_progress_bar()
91
96
        try:
147
152
    def test_text_factory_prompts_and_clears(self):
148
153
        # a get_boolean call should clear the pb before prompting
149
154
        out = test_progress._TTYStringIO()
150
 
        os.environ['TERM'] = 'xterm'
 
155
        self.overrideEnv('TERM', 'xterm')
151
156
        factory = _mod_ui_text.TextUIFactory(
152
157
            stdin=tests.StringIOWrapper("yada\ny\n"),
153
158
            stdout=out, stderr=out)
215
220
            pb.finished()
216
221
 
217
222
    def test_quietness(self):
218
 
        os.environ['BZR_PROGRESS_BAR'] = 'text'
 
223
        self.overrideEnv('BZR_PROGRESS_BAR', 'text')
219
224
        ui_factory = _mod_ui_text.TextUIFactory(None,
220
225
            test_progress._TTYStringIO(),
221
226
            test_progress._TTYStringIO())
302
307
            # however, it can still be forced on
303
308
            (FileStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
304
309
            ):
305
 
            os.environ['TERM'] = term
306
 
            if pb is None:
307
 
                if 'BZR_PROGRESS_BAR' in os.environ:
308
 
                    del os.environ['BZR_PROGRESS_BAR']
309
 
            else:
310
 
                os.environ['BZR_PROGRESS_BAR'] = pb
 
310
            self.overrideEnv('TERM', term)
 
311
            self.overrideEnv('BZR_PROGRESS_BAR', pb)
311
312
            stdin = file_class('')
312
313
            stderr = file_class()
313
314
            stdout = file_class()
324
325
        stderr = test_progress._NonTTYStringIO()
325
326
        stdout = test_progress._NonTTYStringIO()
326
327
        for term_type in ['dumb', None, 'xterm']:
327
 
            if term_type is None:
328
 
                del os.environ['TERM']
329
 
            else:
330
 
                os.environ['TERM'] = term_type
 
328
            self.overrideEnv('TERM', term_type)
331
329
            uif = _mod_ui.make_ui_for_terminal(stdin, stdout, stderr)
332
330
            self.assertIsInstance(uif, _mod_ui_text.TextUIFactory,
333
331
                'TERM=%r' % (term_type,))
437
435
        self.assertIsNone('off', av)
438
436
 
439
437
 
 
438
class TestConfirmationUserInterfacePolicy(tests.TestCase):
 
439
 
 
440
    def test_confirm_action_default(self):
 
441
        base_ui = _mod_ui.NoninteractiveUIFactory()
 
442
        for answer in [True, False]:
 
443
            self.assertEquals(
 
444
                _mod_ui.ConfirmationUserInterfacePolicy(base_ui, answer, {})
 
445
                .confirm_action("Do something?",
 
446
                    "bzrlib.tests.do_something", {}),
 
447
                answer)
 
448
 
 
449
    def test_confirm_action_specific(self):
 
450
        base_ui = _mod_ui.NoninteractiveUIFactory()
 
451
        for default_answer in [True, False]:
 
452
            for specific_answer in [True, False]:
 
453
                for conf_id in ['given_id', 'other_id']:
 
454
                    wrapper = _mod_ui.ConfirmationUserInterfacePolicy(
 
455
                        base_ui, default_answer, dict(given_id=specific_answer))
 
456
                    result = wrapper.confirm_action("Do something?", conf_id, {})
 
457
                    if conf_id == 'given_id':
 
458
                        self.assertEquals(result, specific_answer)
 
459
                    else:
 
460
                        self.assertEquals(result, default_answer)
 
461
 
 
462
    def test_repr(self):
 
463
        base_ui = _mod_ui.NoninteractiveUIFactory()
 
464
        wrapper = _mod_ui.ConfirmationUserInterfacePolicy(
 
465
            base_ui, True, dict(a=2))
 
466
        self.assertThat(repr(wrapper),
 
467
            Equals("ConfirmationUserInterfacePolicy("
 
468
                "NoninteractiveUIFactory(), True, {'a': 2})"))
 
469
 
 
470
 
440
471
class TestProgressRecordingUI(tests.TestCase):
441
472
    """Test test-oriented UIFactory that records progress updates"""
442
473