~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_ui.py

  • Committer: Andrew Bennetts
  • Date: 2010-10-13 00:26:41 UTC
  • mto: This revision was merged to the branch mainline in revision 5498.
  • Revision ID: andrew.bennetts@canonical.com-20101013002641-9tlh9k89mlj1666m
Keep docs-plain working.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005-2010 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
20
21
import time
21
22
 
22
23
from StringIO import StringIO
25
26
 
26
27
from bzrlib import (
27
28
    config,
 
29
    errors,
28
30
    remote,
 
31
    repository,
29
32
    tests,
30
33
    ui as _mod_ui,
31
34
    )
 
35
from bzrlib.symbol_versioning import (
 
36
    deprecated_in,
 
37
    )
32
38
from bzrlib.tests import (
33
39
    fixtures,
34
40
    test_progress,
63
69
    def test_text_factory_confirm(self):
64
70
        # turns into reading a regular boolean
65
71
        ui = self.make_test_ui_factory('n\n')
66
 
        self.assertEquals(ui.confirm_action(u'Should %(thing)s pass?',
 
72
        self.assertEquals(ui.confirm_action('Should %(thing)s pass?',
67
73
            'bzrlib.tests.test_ui.confirmation',
68
74
            {'thing': 'this'},),
69
75
            False)
111
117
    def test_text_ui_get_boolean(self):
112
118
        stdin = tests.StringIOWrapper("y\n" # True
113
119
                                      "n\n" # False
114
 
                                      " \n y \n" # True
115
 
                                      " no \n" # False
116
120
                                      "yes with garbage\nY\n" # True
117
121
                                      "not an answer\nno\n" # False
118
122
                                      "I'm sure!\nyes\n" # True
121
125
        stdout = tests.StringIOWrapper()
122
126
        stderr = tests.StringIOWrapper()
123
127
        factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
124
 
        self.assertEqual(True, factory.get_boolean(u""))
125
 
        self.assertEqual(False, factory.get_boolean(u""))
126
 
        self.assertEqual(True, factory.get_boolean(u""))
127
 
        self.assertEqual(False, factory.get_boolean(u""))
128
 
        self.assertEqual(True, factory.get_boolean(u""))
129
 
        self.assertEqual(False, factory.get_boolean(u""))
130
 
        self.assertEqual(True, factory.get_boolean(u""))
131
 
        self.assertEqual(False, factory.get_boolean(u""))
132
 
        self.assertEqual("foo\n", factory.stdin.read())
133
 
        # stdin should be empty
134
 
        self.assertEqual('', factory.stdin.readline())
135
 
        # return false on EOF
136
 
        self.assertEqual(False, factory.get_boolean(u""))
137
 
 
138
 
    def test_text_ui_choose_bad_parameters(self):
139
 
        stdin = tests.StringIOWrapper()
140
 
        stdout = tests.StringIOWrapper()
141
 
        stderr = tests.StringIOWrapper()
142
 
        factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
143
 
        # invalid default index
144
 
        self.assertRaises(ValueError, factory.choose, u"", u"&Yes\n&No", 3)
145
 
        # duplicated choice
146
 
        self.assertRaises(ValueError, factory.choose, u"", u"&choice\n&ChOiCe")
147
 
        # duplicated shortcut
148
 
        self.assertRaises(ValueError, factory.choose, u"", u"&choice1\nchoi&ce2")
149
 
 
150
 
    def test_text_ui_choose_prompt(self):
151
 
        stdin = tests.StringIOWrapper()
152
 
        stdout = tests.StringIOWrapper()
153
 
        stderr = tests.StringIOWrapper()
154
 
        factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
155
 
        # choices with explicit shortcuts
156
 
        factory.choose(u"prompt", u"&yes\n&No\nmore &info")
157
 
        self.assertEqual("prompt ([y]es, [N]o, more [i]nfo): \n", factory.stderr.getvalue())
158
 
        # automatic shortcuts
159
 
        factory.stderr.truncate(0)
160
 
        factory.choose(u"prompt", u"yes\nNo\nmore info")
161
 
        self.assertEqual("prompt ([y]es, [N]o, [m]ore info): \n", factory.stderr.getvalue())
162
 
 
163
 
    def test_text_ui_choose_return_values(self):
164
 
        choose = lambda: factory.choose(u"", u"&Yes\n&No\nMaybe\nmore &info", 3)
165
 
        stdin = tests.StringIOWrapper("y\n" # 0
166
 
                                      "n\n" # 1
167
 
                                      " \n" # default: 3
168
 
                                      " no \n" # 1
169
 
                                      "b\na\nd \n" # bad shortcuts, all ignored
170
 
                                      "yes with garbage\nY\n" # 0
171
 
                                      "not an answer\nno\n" # 1
172
 
                                      "info\nmore info\n" # 3
173
 
                                      "Maybe\n" # 2
174
 
                                      "foo\n")
175
 
        stdout = tests.StringIOWrapper()
176
 
        stderr = tests.StringIOWrapper()
177
 
        factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
178
 
        self.assertEqual(0, choose())
179
 
        self.assertEqual(1, choose())
180
 
        self.assertEqual(3, choose())
181
 
        self.assertEqual(1, choose())
182
 
        self.assertEqual(0, choose())
183
 
        self.assertEqual(1, choose())
184
 
        self.assertEqual(3, choose())
185
 
        self.assertEqual(2, choose())
186
 
        self.assertEqual("foo\n", factory.stdin.read())
187
 
        # stdin should be empty
188
 
        self.assertEqual('', factory.stdin.readline())
189
 
        # return None on EOF
190
 
        self.assertEqual(None, choose())
191
 
 
192
 
    def test_text_ui_choose_no_default(self):
193
 
        stdin = tests.StringIOWrapper(" \n" # no default, invalid!
194
 
                                      " yes \n" # 0
195
 
                                      "foo\n")
196
 
        stdout = tests.StringIOWrapper()
197
 
        stderr = tests.StringIOWrapper()
198
 
        factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
199
 
        self.assertEqual(0, factory.choose(u"", u"&Yes\n&No"))
200
 
        self.assertEqual("foo\n", factory.stdin.read())
 
128
        self.assertEqual(True, factory.get_boolean(""))
 
129
        self.assertEqual(False, factory.get_boolean(""))
 
130
        self.assertEqual(True, factory.get_boolean(""))
 
131
        self.assertEqual(False, factory.get_boolean(""))
 
132
        self.assertEqual(True, factory.get_boolean(""))
 
133
        self.assertEqual(False, factory.get_boolean(""))
 
134
        self.assertEqual("foo\n", factory.stdin.read())
 
135
        # stdin should be empty
 
136
        self.assertEqual('', factory.stdin.readline())
201
137
 
202
138
    def test_text_ui_get_integer(self):
203
139
        stdin = tests.StringIOWrapper(
207
143
        stdout = tests.StringIOWrapper()
208
144
        stderr = tests.StringIOWrapper()
209
145
        factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
210
 
        self.assertEqual(1, factory.get_integer(u""))
211
 
        self.assertEqual(-2, factory.get_integer(u""))
212
 
        self.assertEqual(42, factory.get_integer(u""))
 
146
        self.assertEqual(1, factory.get_integer(""))
 
147
        self.assertEqual(-2, factory.get_integer(""))
 
148
        self.assertEqual(42, factory.get_integer(""))
213
149
 
214
150
    def test_text_factory_prompt(self):
215
151
        # see <https://launchpad.net/bugs/365891>
216
152
        StringIO = tests.StringIOWrapper
217
153
        factory = _mod_ui_text.TextUIFactory(StringIO(), StringIO(), StringIO())
218
 
        factory.prompt(u'foo %2e')
 
154
        factory.prompt('foo %2e')
219
155
        self.assertEqual('', factory.stdout.getvalue())
220
156
        self.assertEqual('foo %2e', factory.stderr.getvalue())
221
157
 
222
158
    def test_text_factory_prompts_and_clears(self):
223
159
        # a get_boolean call should clear the pb before prompting
224
160
        out = test_progress._TTYStringIO()
225
 
        self.overrideEnv('TERM', 'xterm')
 
161
        os.environ['TERM'] = 'xterm'
226
162
        factory = _mod_ui_text.TextUIFactory(
227
163
            stdin=tests.StringIOWrapper("yada\ny\n"),
228
164
            stdout=out, stderr=out)
236
172
                         self.apply_redirected(None, factory.stdout,
237
173
                                               factory.stdout,
238
174
                                               factory.get_boolean,
239
 
                                               u"what do you want"))
 
175
                                               "what do you want"))
240
176
        output = out.getvalue()
241
177
        self.assertContainsRe(output,
242
178
            "| foo *\r\r  *\r*")
243
 
        self.assertContainsString(output,
244
 
            r"what do you want? ([y]es, [n]o): what do you want? ([y]es, [n]o): ")
 
179
        self.assertContainsRe(output,
 
180
            r"what do you want\? \[y/n\]: what do you want\? \[y/n\]: ")
245
181
        # stdin should have been totally consumed
246
182
        self.assertEqual('', factory.stdin.readline())
247
183
 
265
201
        factory.stdout.encoding = "utf8"
266
202
        # there is no output from the base factory
267
203
        self.assertEqual("someuser",
268
 
                         factory.get_username(u'Hello %(host)s', host='some'))
 
204
                         factory.get_username('Hello %(host)s', host='some'))
269
205
        self.assertEquals("Hello some: ", factory.stderr.getvalue())
270
206
        self.assertEquals('', factory.stdout.getvalue())
271
 
        self.assertEqual("", factory.get_username(u"Gebruiker"))
 
207
        self.assertEqual("", factory.get_username("Gebruiker"))
272
208
        # stdin should be empty
273
209
        self.assertEqual('', factory.stdin.readline())
274
210
 
290
226
            pb.finished()
291
227
 
292
228
    def test_quietness(self):
293
 
        self.overrideEnv('BZR_PROGRESS_BAR', 'text')
 
229
        os.environ['BZR_PROGRESS_BAR'] = 'text'
294
230
        ui_factory = _mod_ui_text.TextUIFactory(None,
295
231
            test_progress._TTYStringIO(),
296
232
            test_progress._TTYStringIO())
302
238
 
303
239
    def test_text_ui_show_user_warning(self):
304
240
        from bzrlib.repofmt.groupcompress_repo import RepositoryFormat2a
305
 
        from bzrlib.repofmt.knitpack_repo import RepositoryFormatKnitPack5
 
241
        from bzrlib.repofmt.pack_repo import RepositoryFormatKnitPack5
306
242
        err = StringIO()
307
243
        out = StringIO()
308
244
        ui = tests.TextUIFactory(stdin=None, stdout=out, stderr=err)
377
313
            # however, it can still be forced on
378
314
            (FileStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
379
315
            ):
380
 
            self.overrideEnv('TERM', term)
381
 
            self.overrideEnv('BZR_PROGRESS_BAR', pb)
 
316
            os.environ['TERM'] = term
 
317
            if pb is None:
 
318
                if 'BZR_PROGRESS_BAR' in os.environ:
 
319
                    del os.environ['BZR_PROGRESS_BAR']
 
320
            else:
 
321
                os.environ['BZR_PROGRESS_BAR'] = pb
382
322
            stdin = file_class('')
383
323
            stderr = file_class()
384
324
            stdout = file_class()
395
335
        stderr = test_progress._NonTTYStringIO()
396
336
        stdout = test_progress._NonTTYStringIO()
397
337
        for term_type in ['dumb', None, 'xterm']:
398
 
            self.overrideEnv('TERM', term_type)
 
338
            if term_type is None:
 
339
                del os.environ['TERM']
 
340
            else:
 
341
                os.environ['TERM'] = term_type
399
342
            uif = _mod_ui.make_ui_for_terminal(stdin, stdout, stderr)
400
343
            self.assertIsInstance(uif, _mod_ui_text.TextUIFactory,
401
344
                'TERM=%r' % (term_type,))
422
365
        self.assertRaises(
423
366
            NotImplementedError,
424
367
            self.apply_redirected,
425
 
            None, stdout, stdout, factory.get_boolean, u"foo")
 
368
            None, stdout, stdout, factory.get_boolean, "foo")
426
369
 
427
370
 
428
371
class TestUIFactoryTests(tests.TestCase):
441
384
 
442
385
    def test_canned_input_get_input(self):
443
386
        uif = _mod_ui.CannedInputUIFactory([True, 'mbp', 'password', 42])
444
 
        self.assertEqual(True, uif.get_boolean(u'Extra cheese?'))
445
 
        self.assertEqual('mbp', uif.get_username(u'Enter your user name'))
 
387
        self.assertEqual(True, uif.get_boolean('Extra cheese?'))
 
388
        self.assertEqual('mbp', uif.get_username('Enter your user name'))
446
389
        self.assertEqual('password',
447
 
                         uif.get_password(u'Password for %(host)s',
 
390
                         uif.get_password('Password for %(host)s',
448
391
                                          host='example.com'))
449
 
        self.assertEqual(42, uif.get_integer(u'And all that jazz ?'))
 
392
        self.assertEqual(42, uif.get_integer('And all that jazz ?'))
450
393
 
451
394
 
452
395
class TestBoolFromString(tests.TestCase):