subcommand_test.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #!/usr/bin/env vpython3
  2. # Copyright (c) 2012 The Chromium Authors. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. import os
  6. import sys
  7. import unittest
  8. from unittest import mock
  9. _ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  10. sys.path.insert(0, _ROOT)
  11. import subcommand
  12. class SubcommandTest(unittest.TestCase):
  13. def setUp(self):
  14. super(SubcommandTest, self).setUp()
  15. self.module = mock.Mock(__doc__='Module documentation')
  16. self.parser = mock.Mock()
  17. self.sc = subcommand.CommandDispatcher(__name__)
  18. self.sc.module = self.module
  19. def testEnumerateCommands(self):
  20. self.module.CMDfoo_bar = object()
  21. self.module.CMDbaz = object()
  22. self.module.CMDaBcDeF_0123 = object()
  23. expected = {
  24. 'foo-bar': self.module.CMDfoo_bar,
  25. 'baz': self.module.CMDbaz,
  26. 'aBcDeF-0123': self.module.CMDaBcDeF_0123,
  27. 'help': subcommand.CMDhelp,
  28. }
  29. self.assertEqual(expected, self.sc.enumerate_commands())
  30. def testEnumerateCommands_CustomHelp(self):
  31. self.module.CMDhelp = object()
  32. self.assertEqual({'help': self.module.CMDhelp},
  33. self.sc.enumerate_commands())
  34. def testFindNearestCommand_ExactMatch(self):
  35. self.module.CMDfoo = object()
  36. self.assertEqual(self.module.CMDfoo,
  37. self.sc.find_nearest_command('foo'))
  38. def testFindNearestCommand_UniquePrefix(self):
  39. self.module.CMDfoo = object()
  40. self.module.CMDbar = object()
  41. self.module.CMDunique_prefix = object()
  42. self.assertEqual(self.module.CMDunique_prefix,
  43. self.sc.find_nearest_command('unique-pre'))
  44. def testFindNearestCommand_NonUniquePrefix(self):
  45. self.module.CMDprefix1 = object()
  46. self.module.CMDprefix2 = object()
  47. self.assertIsNone(self.sc.find_nearest_command('prefix'))
  48. def testFindNearestCommand_CloseEnough(self):
  49. self.module.CMDfoo = object()
  50. self.module.CMDbar = object()
  51. self.module.CMDclose_enough = object()
  52. self.assertEqual(self.module.CMDclose_enough,
  53. self.sc.find_nearest_command('clos-enough'))
  54. def testFindNearestCommand_TooManyCloseEnough(self):
  55. self.module.CMDcase_enough = object()
  56. self.module.CMDclose_enough = object()
  57. self.assertIsNone(self.sc.find_nearest_command('clase-enough'))
  58. def testFindNearestCommand_ClosestIsNotCloseEnough(self):
  59. self.module.CMDfoo = object()
  60. self.module.CMDbar = object()
  61. self.module.CMDnot_close_enough = object()
  62. self.assertIsNone(self.sc.find_nearest_command('clos-enof'))
  63. def _setUpTestCommands(self):
  64. self.module.CMDhelp = mock.Mock(__name__='CMDhelp',
  65. __doc__='help documentation',
  66. usage_more=None,
  67. return_value=0)
  68. self.module.CMDfoo = mock.Mock(__name__='CMDfoo',
  69. __doc__='foo documentation',
  70. usage_more='usage more',
  71. epilog='epilog',
  72. return_value=123)
  73. self.module.CMDbar_baz = mock.Mock(__name__='CMDbar_baz',
  74. __doc__='bar-baz documentation',
  75. usage_more=None,
  76. epilog=None,
  77. return_value=0)
  78. def testExecute(self):
  79. self._setUpTestCommands()
  80. self.assertEqual(
  81. 123, self.sc.execute(self.parser, ['foo', '--bar', '--baz']))
  82. self.module.CMDfoo.assert_called_once_with(self.parser,
  83. ['--bar', '--baz'])
  84. self.assertEqual('foo documentation\n\n', self.parser.description)
  85. self.assertEqual('\nepilog\n', self.parser.epilog)
  86. self.parser.set_usage.assert_called_once_with(
  87. 'usage: %prog foo [options] usage more')
  88. def testExecute_Help(self):
  89. self._setUpTestCommands()
  90. self.assertEqual(0, self.sc.execute(self.parser, ['--help']))
  91. self.module.CMDhelp.assert_called_once_with(self.parser, [])
  92. self.assertEqual(
  93. 'Module documentation\n\n'
  94. 'Commands are:\n'
  95. ' bar-baz bar-baz documentation\n'
  96. ' foo foo documentation\n'
  97. ' help help documentation\n', self.parser.description)
  98. self.parser.set_usage.assert_called_once_with(
  99. 'usage: %prog <command> [options]')
  100. def testExecute_CommandHelp(self):
  101. self._setUpTestCommands()
  102. self.assertEqual(0, self.sc.execute(self.parser, ['help', 'bar-baz']))
  103. self.module.CMDbar_baz.assert_called_once_with(self.parser, ['--help'])
  104. self.assertEqual('bar-baz documentation\n\n', self.parser.description)
  105. self.parser.set_usage.assert_called_once_with(
  106. 'usage: %prog bar-baz [options]')
  107. def testExecute_CommandNotFound(self):
  108. self._setUpTestCommands()
  109. self.assertEqual(0, self.sc.execute(self.parser, ['not-found']))
  110. self.module.CMDhelp.assert_called_once_with(self.parser, [])
  111. self.assertEqual(
  112. 'Module documentation\n\n'
  113. 'Commands are:\n'
  114. ' bar-baz bar-baz documentation\n'
  115. ' foo foo documentation\n'
  116. ' help help documentation\n', self.parser.description)
  117. self.parser.set_usage.assert_called_once_with(
  118. 'usage: %prog <command> [options]')
  119. def testExecute_CommandNotFoundAndHelpDisabled(self):
  120. self._setUpTestCommands()
  121. self.module.CMDhelp = None
  122. self.assertEqual(2, self.sc.execute(self.parser, ['not-found']))
  123. if __name__ == '__main__':
  124. unittest.main()