You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			162 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			162 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
#!/usr/bin/env vpython3
 | 
						|
# 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()
 |