~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_help.py

  • Committer: Patch Queue Manager
  • Date: 2011-09-22 14:12:18 UTC
  • mfrom: (6155.3.1 jam)
  • Revision ID: pqm@pqm.ubuntu.com-20110922141218-86s4uu6nqvourw4f
(jameinel) Cleanup comments bzrlib/smart/__init__.py (John A Meinel)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007-2010 Canonical Ltd
 
1
# Copyright (C) 2007-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
16
16
 
17
17
"""Unit tests for the bzrlib.help module."""
18
18
 
19
 
from cStringIO import StringIO
 
19
import textwrap
20
20
 
21
21
from bzrlib import (
22
22
    builtins,
23
23
    commands,
 
24
    config,
24
25
    errors,
25
26
    help,
26
27
    help_topics,
 
28
    i18n,
27
29
    plugin,
28
30
    tests,
29
31
    )
30
32
 
31
 
 
32
 
class TestHelp(tests.TestCase):
33
 
 
34
 
    def setUp(self):
35
 
        tests.TestCase.setUp(self)
36
 
        commands.install_bzr_command_hooks()
 
33
from bzrlib.tests.test_i18n import ZzzTranslations
 
34
import re
37
35
 
38
36
 
39
37
class TestCommandHelp(tests.TestCase):
40
38
    """Tests for help on commands."""
41
39
 
 
40
    def assertCmdHelp(self, expected, cmd):
 
41
        self.assertEqualDiff(textwrap.dedent(expected), cmd.get_help_text())
 
42
 
42
43
    def test_command_help_includes_see_also(self):
43
44
        class cmd_WithSeeAlso(commands.Command):
44
45
            __doc__ = """A sample command."""
45
46
            _see_also = ['foo', 'bar']
46
 
        cmd = cmd_WithSeeAlso()
47
 
        helptext = cmd.get_help_text()
48
 
        self.assertEndsWith(
49
 
            helptext,
50
 
            '  -v, --verbose  Display more information.\n'
51
 
            '  -q, --quiet    Only display errors and warnings.\n'
52
 
            '  -h, --help     Show help message.\n'
53
 
            '\n'
54
 
            'See also: bar, foo\n')
 
47
        self.assertCmdHelp('''\
 
48
            Purpose: A sample command.
 
49
            Usage:   bzr WithSeeAlso
 
50
            
 
51
            Options:
 
52
              --usage        Show usage message and options.
 
53
              -v, --verbose  Display more information.
 
54
              -q, --quiet    Only display errors and warnings.
 
55
              -h, --help     Show help message.
 
56
            
 
57
            See also: bar, foo
 
58
            ''',
 
59
                           cmd_WithSeeAlso())
55
60
 
56
61
    def test_get_help_text(self):
57
62
        """Commands have a get_help_text method which returns their help."""
58
63
        class cmd_Demo(commands.Command):
59
64
            __doc__ = """A sample command."""
 
65
        self.assertCmdHelp('''\
 
66
            Purpose: A sample command.
 
67
            Usage:   bzr Demo
 
68
            
 
69
            Options:
 
70
              --usage        Show usage message and options.
 
71
              -v, --verbose  Display more information.
 
72
              -q, --quiet    Only display errors and warnings.
 
73
              -h, --help     Show help message.
 
74
 
 
75
            ''',
 
76
                           cmd_Demo())
60
77
        cmd = cmd_Demo()
61
78
        helptext = cmd.get_help_text()
62
79
        self.assertStartsWith(helptext,
297
314
            '  Blah blah blah.\n\n')
298
315
 
299
316
 
 
317
class ZzzTranslationsForDoc(ZzzTranslations):
 
318
 
 
319
    _section_pat = re.compile(':\w+:\\n\\s+')
 
320
    _indent_pat = re.compile('\\s+')
 
321
 
 
322
    def zzz(self, s):
 
323
        m = self._section_pat.match(s)
 
324
        if m is None:
 
325
            m = self._indent_pat.match(s)
 
326
        if m:
 
327
            return u'%szz{{%s}}' % (m.group(0), s[m.end():])
 
328
        return u'zz{{%s}}' % s
 
329
 
 
330
 
 
331
class TestCommandHelpI18n(tests.TestCase):
 
332
    """Tests for help on translated commands."""
 
333
 
 
334
    def setUp(self):
 
335
        super(TestCommandHelpI18n, self).setUp()
 
336
        self.overrideAttr(i18n, '_translations', ZzzTranslationsForDoc())
 
337
 
 
338
    def assertCmdHelp(self, expected, cmd):
 
339
        self.assertEqualDiff(textwrap.dedent(expected), cmd.get_help_text())
 
340
 
 
341
    def test_command_help_includes_see_also(self):
 
342
        class cmd_WithSeeAlso(commands.Command):
 
343
            __doc__ = """A sample command."""
 
344
            _see_also = ['foo', 'bar']
 
345
        self.assertCmdHelp('''\
 
346
            zz{{:Purpose: zz{{A sample command.}}
 
347
            }}zz{{:Usage:   bzr WithSeeAlso
 
348
            }}
 
349
            zz{{:Options:
 
350
              --usage        zz{{Show usage message and options.}}
 
351
              -v, --verbose  zz{{Display more information.}}
 
352
              -q, --quiet    zz{{Only display errors and warnings.}}
 
353
              -h, --help     zz{{Show help message.}}
 
354
            }}
 
355
            zz{{:See also: bar, foo}}
 
356
            ''',
 
357
                           cmd_WithSeeAlso())
 
358
 
 
359
    def test_get_help_text(self):
 
360
        """Commands have a get_help_text method which returns their help."""
 
361
        class cmd_Demo(commands.Command):
 
362
            __doc__ = """A sample command."""
 
363
        self.assertCmdHelp('''\
 
364
            zz{{:Purpose: zz{{A sample command.}}
 
365
            }}zz{{:Usage:   bzr Demo
 
366
            }}
 
367
            zz{{:Options:
 
368
              --usage        zz{{Show usage message and options.}}
 
369
              -v, --verbose  zz{{Display more information.}}
 
370
              -q, --quiet    zz{{Only display errors and warnings.}}
 
371
              -h, --help     zz{{Show help message.}}
 
372
            }}
 
373
            ''',
 
374
                           cmd_Demo())
 
375
 
 
376
    def test_command_with_additional_see_also(self):
 
377
        class cmd_WithSeeAlso(commands.Command):
 
378
            __doc__ = """A sample command."""
 
379
            _see_also = ['foo', 'bar']
 
380
        cmd = cmd_WithSeeAlso()
 
381
        helptext = cmd.get_help_text(['gam'])
 
382
        self.assertEndsWith(
 
383
            helptext,
 
384
            '  -v, --verbose  zz{{Display more information.}}\n'
 
385
            '  -q, --quiet    zz{{Only display errors and warnings.}}\n'
 
386
            '  -h, --help     zz{{Show help message.}}\n'
 
387
            '}}\n'
 
388
            'zz{{:See also: bar, foo, gam}}\n')
 
389
 
 
390
    def test_command_only_additional_see_also(self):
 
391
        class cmd_WithSeeAlso(commands.Command):
 
392
            __doc__ = """A sample command."""
 
393
        cmd = cmd_WithSeeAlso()
 
394
        helptext = cmd.get_help_text(['gam'])
 
395
        self.assertEndsWith(
 
396
            helptext,
 
397
            'zz{{:Options:\n'
 
398
            '  --usage        zz{{Show usage message and options.}}\n'
 
399
            '  -v, --verbose  zz{{Display more information.}}\n'
 
400
            '  -q, --quiet    zz{{Only display errors and warnings.}}\n'
 
401
            '  -h, --help     zz{{Show help message.}}\n'
 
402
            '}}\n'
 
403
            'zz{{:See also: gam}}\n')
 
404
 
 
405
 
 
406
    def test_help_custom_section_ordering(self):
 
407
        """Custom descriptive sections should remain in the order given."""
 
408
        # The help formatter expect the class name to start with 'cmd_'
 
409
        class cmd_Demo(commands.Command):
 
410
            __doc__ = """A sample command.
 
411
 
 
412
            Blah blah blah.
 
413
 
 
414
            :Formats:
 
415
              Interesting stuff about formats.
 
416
 
 
417
            :Examples:
 
418
              Example 1::
 
419
 
 
420
                cmd arg1
 
421
 
 
422
            :Tips:
 
423
              Clever things to keep in mind.
 
424
            """
 
425
        self.assertCmdHelp('''\
 
426
            zz{{:Purpose: zz{{A sample command.}}
 
427
            }}zz{{:Usage:   bzr Demo
 
428
            }}
 
429
            zz{{:Options:
 
430
              --usage        zz{{Show usage message and options.}}
 
431
              -v, --verbose  zz{{Display more information.}}
 
432
              -q, --quiet    zz{{Only display errors and warnings.}}
 
433
              -h, --help     zz{{Show help message.}}
 
434
            }}
 
435
            Description:
 
436
              zz{{zz{{Blah blah blah.}}
 
437
            
 
438
            }}:Formats:
 
439
              zz{{Interesting stuff about formats.}}
 
440
            
 
441
            Examples:
 
442
              zz{{Example 1::}}
 
443
            
 
444
                zz{{cmd arg1}}
 
445
            
 
446
            Tips:
 
447
              zz{{Clever things to keep in mind.}}
 
448
 
 
449
            ''',
 
450
                           cmd_Demo())
 
451
 
 
452
    def test_help_text_custom_usage(self):
 
453
        """Help text may contain a custom usage section."""
 
454
        class cmd_Demo(commands.Command):
 
455
            __doc__ = """A sample command.
 
456
 
 
457
            :Usage:
 
458
                cmd Demo [opts] args
 
459
 
 
460
                cmd Demo -h
 
461
 
 
462
            Blah blah blah.
 
463
            """
 
464
        self.assertCmdHelp('''\
 
465
            zz{{:Purpose: zz{{A sample command.}}
 
466
            }}zz{{:Usage:
 
467
                zz{{cmd Demo [opts] args}}
 
468
            
 
469
                zz{{cmd Demo -h}}
 
470
 
 
471
            }}
 
472
            zz{{:Options:
 
473
              --usage        zz{{Show usage message and options.}}
 
474
              -v, --verbose  zz{{Display more information.}}
 
475
              -q, --quiet    zz{{Only display errors and warnings.}}
 
476
              -h, --help     zz{{Show help message.}}
 
477
            }}
 
478
            Description:
 
479
              zz{{zz{{Blah blah blah.}}
 
480
 
 
481
            }}
 
482
            ''',
 
483
                           cmd_Demo())
 
484
 
 
485
 
 
486
class TestHelp(tests.TestCase):
 
487
 
 
488
    def setUp(self):
 
489
        tests.TestCase.setUp(self)
 
490
        commands.install_bzr_command_hooks()
 
491
 
 
492
 
300
493
class TestRegisteredTopic(TestHelp):
301
494
    """Tests for the RegisteredTopic class."""
302
495
 
308
501
        self.assertEqual('basic', topic.topic)
309
502
 
310
503
    def test_get_help_text(self):
311
 
        """A RegisteredTopic returns the get_detail results for get_help_text."""
 
504
        """RegisteredTopic returns the get_detail results for get_help_text."""
312
505
        topic = help_topics.RegisteredTopic('commands')
313
506
        self.assertEqual(help_topics.topic_registry.get_detail('commands'),
314
 
            topic.get_help_text())
 
507
                         topic.get_help_text())
315
508
 
316
509
    def test_get_help_text_with_additional_see_also(self):
317
510
        topic = help_topics.RegisteredTopic('commands')
329
522
            '\n')
330
523
 
331
524
    def test_get_help_topic(self):
332
 
        """The help topic for a RegisteredTopic is its topic from construction."""
 
525
        """The help topic for RegisteredTopic is its topic from construction."""
333
526
        topic = help_topics.RegisteredTopic('foobar')
334
527
        self.assertEqual('foobar', topic.get_help_topic())
335
528
        topic = help_topics.RegisteredTopic('baz')
369
562
        self.assertEqual('', index.prefix)
370
563
 
371
564
 
 
565
class TestConfigOptionIndex(TestHelp):
 
566
    """Tests for the HelpCommandIndex class."""
 
567
 
 
568
    def setUp(self):
 
569
        super(TestConfigOptionIndex, self).setUp()
 
570
        self.index = help_topics.ConfigOptionHelpIndex()
 
571
 
 
572
    def test_get_topics_None(self):
 
573
        """Searching for None returns an empty list."""
 
574
        self.assertEqual([], self.index.get_topics(None))
 
575
 
 
576
    def test_get_topics_no_topic(self):
 
577
        self.assertEqual([], self.index.get_topics('nothing by this name'))
 
578
 
 
579
    def test_prefix(self):
 
580
        self.assertEqual('configuration/', self.index.prefix)
 
581
 
 
582
    def test_get_topic_with_prefix(self):
 
583
        topics = self.index.get_topics('configuration/default_format')
 
584
        self.assertLength(1, topics)
 
585
        opt = topics[0]
 
586
        self.assertIsInstance(opt, config.Option)
 
587
        self.assertEquals('default_format', opt.name)
 
588
 
 
589
 
372
590
class TestCommandIndex(TestHelp):
373
591
    """Tests for the HelpCommandIndex class."""
374
592
 
411
629
    def test_default_search_path(self):
412
630
        """The default search path should include internal indexs."""
413
631
        indices = help.HelpIndices()
414
 
        self.assertEqual(3, len(indices.search_path))
 
632
        self.assertEqual(4, len(indices.search_path))
415
633
        # help topics should be searched in first.
416
634
        self.assertIsInstance(indices.search_path[0],
417
 
            help_topics.HelpTopicIndex)
 
635
                              help_topics.HelpTopicIndex)
418
636
        # with commands being search second.
419
637
        self.assertIsInstance(indices.search_path[1],
420
 
            commands.HelpCommandIndex)
421
 
        # and plugins are a third index.
 
638
                              commands.HelpCommandIndex)
 
639
        # plugins are a third index.
422
640
        self.assertIsInstance(indices.search_path[2],
423
 
            plugin.PluginsHelpIndex)
 
641
                              plugin.PluginsHelpIndex)
 
642
        # config options are a fourth index
 
643
        self.assertIsInstance(indices.search_path[3],
 
644
                              help_topics.ConfigOptionHelpIndex)
424
645
 
425
646
    def test_search_for_unknown_topic_raises(self):
426
647
        """Searching for an unknown topic should raise NoHelpTopic."""