Pārlūkot izejas kodu

subcommand: Add tests.

Change-Id: I730f364f30b0d211c2db6da0d6bb4f5ff3c948da
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/1999280
Reviewed-by: Anthony Polito <apolito@google.com>
Commit-Queue: Edward Lesmes <ehmaldonado@chromium.org>
Edward Lemur 5 gadi atpakaļ
vecāks
revīzija
1c3b4bec47
2 mainītis faili ar 162 papildinājumiem un 1 dzēšanām
  1. 1 1
      subcommand.py
  2. 161 0
      tests/subcommand_test.py

+ 1 - 1
subcommand.py

@@ -70,7 +70,7 @@ def CMDhelp(parser, args):
   # wanted.
   # wanted.
   if not any(i in ('-h', '--help') for i in args):
   if not any(i in ('-h', '--help') for i in args):
     args = args + ['--help']
     args = args + ['--help']
-  _, args = parser.parse_args(args)
+  parser.parse_args(args)
   # Never gets there.
   # Never gets there.
   assert False
   assert False
 
 

+ 161 - 0
tests/subcommand_test.py

@@ -0,0 +1,161 @@
+#!/usr/bin/env vpython
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import sys
+import unittest
+
+if sys.version_info.major == 2:
+  import mock
+else:
+  from unittest import mock
+
+_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+sys.path.insert(0, _ROOT)
+
+import subcommand
+
+
+class SubcommandTest(unittest.TestCase):
+  def setUp(self):
+    super(SubcommandTest, self).setUp()
+    self.module = mock.Mock(__doc__='Module documentation')
+    self.parser = mock.Mock()
+    self.sc = subcommand.CommandDispatcher(__name__)
+    self.sc.module = self.module
+
+  def testEnumerateCommands(self):
+    self.module.CMDfoo_bar = object()
+    self.module.CMDbaz = object()
+    self.module.CMDaBcDeF_0123 = object()
+
+    expected = {
+      'foo-bar': self.module.CMDfoo_bar,
+      'baz': self.module.CMDbaz,
+      'aBcDeF-0123': self.module.CMDaBcDeF_0123,
+      'help': subcommand.CMDhelp,
+    }
+    self.assertEqual(expected, self.sc.enumerate_commands())
+
+  def testEnumerateCommands_CustomHelp(self):
+    self.module.CMDhelp = object()
+    self.assertEqual(
+        {'help': self.module.CMDhelp}, self.sc.enumerate_commands())
+
+  def testFindNearestCommand_ExactMatch(self):
+    self.module.CMDfoo = object()
+    self.assertEqual(
+        self.module.CMDfoo, self.sc.find_nearest_command('foo'))
+
+  def testFindNearestCommand_UniquePrefix(self):
+    self.module.CMDfoo = object()
+    self.module.CMDbar = object()
+    self.module.CMDunique_prefix = object()
+    self.assertEqual(
+        self.module.CMDunique_prefix,
+        self.sc.find_nearest_command('unique-pre'))
+
+  def testFindNearestCommand_NonUniquePrefix(self):
+    self.module.CMDprefix1 = object()
+    self.module.CMDprefix2 = object()
+    self.assertIsNone(self.sc.find_nearest_command('prefix'))
+
+  def testFindNearestCommand_CloseEnough(self):
+    self.module.CMDfoo = object()
+    self.module.CMDbar = object()
+    self.module.CMDclose_enough = object()
+    self.assertEqual(
+        self.module.CMDclose_enough,
+        self.sc.find_nearest_command('clos-enough'))
+
+  def testFindNearestCommand_TooManyCloseEnough(self):
+    self.module.CMDcase_enough = object()
+    self.module.CMDclose_enough = object()
+    self.assertIsNone(self.sc.find_nearest_command('clase-enough'))
+
+  def testFindNearestCommand_ClosestIsNotCloseEnough(self):
+    self.module.CMDfoo = object()
+    self.module.CMDbar = object()
+    self.module.CMDnot_close_enough = object()
+    self.assertIsNone(self.sc.find_nearest_command('clos-enof'))
+
+  def _setUpTestCommands(self):
+    self.module.CMDhelp = mock.Mock(
+        __name__='CMDhelp',
+        __doc__='help documentation',
+        usage_more=None,
+        return_value=0)
+    self.module.CMDfoo = mock.Mock(
+        __name__='CMDfoo',
+        __doc__='foo documentation',
+        usage_more='usage more',
+        epilog='epilog',
+        return_value=123)
+    self.module.CMDbar_baz = mock.Mock(
+        __name__='CMDbar_baz',
+        __doc__='bar-baz documentation',
+        usage_more=None,
+        epilog=None,
+        return_value=0)
+
+  def testExecute(self):
+    self._setUpTestCommands()
+
+    self.assertEqual(
+        123, self.sc.execute(self.parser, ['foo', '--bar', '--baz']))
+    self.module.CMDfoo.assert_called_once_with(self.parser, ['--bar', '--baz'])
+    self.assertEqual('foo documentation\n\n', self.parser.description)
+    self.assertEqual('\nepilog\n', self.parser.epilog)
+    self.parser.set_usage.assert_called_once_with(
+        'usage: %prog foo [options] usage more')
+
+  def testExecute_Help(self):
+    self._setUpTestCommands()
+
+    self.assertEqual(0, self.sc.execute(self.parser, ['--help']))
+    self.module.CMDhelp.assert_called_once_with(self.parser, [])
+    self.assertEqual(
+        'Module documentation\n\n'
+        'Commands are:\n'
+        '  bar-baz bar-baz documentation\n'
+        '  foo     foo documentation\n'
+        '  help    help documentation\n',
+        self.parser.description)
+    self.parser.set_usage.assert_called_once_with(
+        'usage: %prog <command> [options]')
+
+  def testExecute_CommandHelp(self):
+    self._setUpTestCommands()
+
+    self.assertEqual(0, self.sc.execute(self.parser, ['help', 'bar-baz']))
+    self.module.CMDbar_baz.assert_called_once_with(self.parser, ['--help'])
+    self.assertEqual('bar-baz documentation\n\n', self.parser.description)
+    self.parser.set_usage.assert_called_once_with(
+        'usage: %prog bar-baz [options]')
+
+  def testExecute_CommandNotFound(self):
+    self._setUpTestCommands()
+
+    self.assertEqual(0, self.sc.execute(self.parser, ['not-found']))
+    self.module.CMDhelp.assert_called_once_with(self.parser, ['not-found'])
+    self.assertEqual(
+        'Module documentation\n\n'
+        'Commands are:\n'
+        '  bar-baz bar-baz documentation\n'
+        '  foo     foo documentation\n'
+        '  help    help documentation\n',
+        self.parser.description)
+    self.parser.set_usage.assert_called_once_with(
+        'usage: %prog <command> [options]')
+
+  def testExecute_CommandNotFoundAndHelpDisabled(self):
+    self._setUpTestCommands()
+    self.module.CMDhelp = None
+
+    self.assertEqual(2, self.sc.execute(self.parser, ['not-found']))
+
+
+if __name__ == '__main__':
+  unittest.main()