194 lines
6.3 KiB
Python
194 lines
6.3 KiB
Python
# Copyright (C) 2018 Google Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""Tests for the completion module."""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
|
|
from fire import completion
|
|
from fire import test_components as tc
|
|
from fire import testutils
|
|
|
|
|
|
class TabCompletionTest(testutils.BaseTestCase):
|
|
|
|
def testCompletionBashScript(self):
|
|
# A sanity check test to make sure the bash completion script satisfies
|
|
# some basic assumptions.
|
|
commands = [
|
|
['run'],
|
|
['halt'],
|
|
['halt', '--now'],
|
|
]
|
|
script = completion._BashScript(name='command', commands=commands) # pylint: disable=protected-access
|
|
self.assertIn('command', script)
|
|
self.assertIn('halt', script)
|
|
|
|
assert_template = '{command})'
|
|
for last_command in ['command', 'halt']:
|
|
self.assertIn(assert_template.format(command=last_command), script)
|
|
|
|
def testCompletionFishScript(self):
|
|
# A sanity check test to make sure the fish completion script satisfies
|
|
# some basic assumptions.
|
|
commands = [
|
|
['run'],
|
|
['halt'],
|
|
['halt', '--now'],
|
|
]
|
|
script = completion._FishScript(name='command', commands=commands) # pylint: disable=protected-access
|
|
self.assertIn('command', script)
|
|
self.assertIn('halt', script)
|
|
self.assertIn('-l now', script)
|
|
|
|
def testFnCompletions(self):
|
|
def example(one, two, three):
|
|
return one, two, three
|
|
|
|
completions = completion.Completions(example)
|
|
self.assertIn('--one', completions)
|
|
self.assertIn('--two', completions)
|
|
self.assertIn('--three', completions)
|
|
|
|
def testListCompletions(self):
|
|
completions = completion.Completions(['red', 'green', 'blue'])
|
|
self.assertIn('0', completions)
|
|
self.assertIn('1', completions)
|
|
self.assertIn('2', completions)
|
|
self.assertNotIn('3', completions)
|
|
|
|
def testDictCompletions(self):
|
|
colors = {
|
|
'red': 'green',
|
|
'blue': 'yellow',
|
|
'_rainbow': True,
|
|
}
|
|
completions = completion.Completions(colors)
|
|
self.assertIn('red', completions)
|
|
self.assertIn('blue', completions)
|
|
self.assertNotIn('green', completions)
|
|
self.assertNotIn('yellow', completions)
|
|
self.assertNotIn('_rainbow', completions)
|
|
self.assertNotIn('True', completions)
|
|
self.assertNotIn(True, completions)
|
|
|
|
def testDictCompletionsVerbose(self):
|
|
colors = {
|
|
'red': 'green',
|
|
'blue': 'yellow',
|
|
'_rainbow': True,
|
|
}
|
|
completions = completion.Completions(colors, verbose=True)
|
|
self.assertIn('red', completions)
|
|
self.assertIn('blue', completions)
|
|
self.assertNotIn('green', completions)
|
|
self.assertNotIn('yellow', completions)
|
|
self.assertIn('_rainbow', completions)
|
|
self.assertNotIn('True', completions)
|
|
self.assertNotIn(True, completions)
|
|
|
|
def testDeepDictCompletions(self):
|
|
deepdict = {'level1': {'level2': {'level3': {'level4': {}}}}}
|
|
completions = completion.Completions(deepdict)
|
|
self.assertIn('level1', completions)
|
|
self.assertNotIn('level2', completions)
|
|
|
|
def testDeepDictScript(self):
|
|
deepdict = {'level1': {'level2': {'level3': {'level4': {}}}}}
|
|
script = completion.Script('deepdict', deepdict)
|
|
self.assertIn('level1', script)
|
|
self.assertIn('level2', script)
|
|
self.assertIn('level3', script)
|
|
self.assertNotIn('level4', script) # The default depth is 3.
|
|
|
|
def testFnScript(self):
|
|
script = completion.Script('identity', tc.identity)
|
|
self.assertIn('--arg1', script)
|
|
self.assertIn('--arg2', script)
|
|
self.assertIn('--arg3', script)
|
|
self.assertIn('--arg4', script)
|
|
|
|
def testClassScript(self):
|
|
script = completion.Script('', tc.MixedDefaults)
|
|
self.assertIn('ten', script)
|
|
self.assertIn('sum', script)
|
|
self.assertIn('identity', script)
|
|
self.assertIn('--alpha', script)
|
|
self.assertIn('--beta', script)
|
|
|
|
def testDeepDictFishScript(self):
|
|
deepdict = {'level1': {'level2': {'level3': {'level4': {}}}}}
|
|
script = completion.Script('deepdict', deepdict, shell='fish')
|
|
self.assertIn('level1', script)
|
|
self.assertIn('level2', script)
|
|
self.assertIn('level3', script)
|
|
self.assertNotIn('level4', script) # The default depth is 3.
|
|
|
|
def testFnFishScript(self):
|
|
script = completion.Script('identity', tc.identity, shell='fish')
|
|
self.assertIn('arg1', script)
|
|
self.assertIn('arg2', script)
|
|
self.assertIn('arg3', script)
|
|
self.assertIn('arg4', script)
|
|
|
|
def testClassFishScript(self):
|
|
script = completion.Script('', tc.MixedDefaults, shell='fish')
|
|
self.assertIn('ten', script)
|
|
self.assertIn('sum', script)
|
|
self.assertIn('identity', script)
|
|
self.assertIn('alpha', script)
|
|
self.assertIn('beta', script)
|
|
|
|
def testNonStringDictCompletions(self):
|
|
completions = completion.Completions({
|
|
10: 'green',
|
|
3.14: 'yellow',
|
|
('t1', 't2'): 'pink',
|
|
})
|
|
self.assertIn('10', completions)
|
|
self.assertIn('3.14', completions)
|
|
self.assertIn("('t1', 't2')", completions)
|
|
self.assertNotIn('green', completions)
|
|
self.assertNotIn('yellow', completions)
|
|
self.assertNotIn('pink', completions)
|
|
|
|
def testGeneratorCompletions(self):
|
|
def generator():
|
|
x = 0
|
|
while True:
|
|
yield x
|
|
x += 1
|
|
completions = completion.Completions(generator())
|
|
self.assertEqual(completions, [])
|
|
|
|
def testClassCompletions(self):
|
|
completions = completion.Completions(tc.NoDefaults)
|
|
self.assertEqual(completions, [])
|
|
|
|
def testObjectCompletions(self):
|
|
completions = completion.Completions(tc.NoDefaults())
|
|
self.assertIn('double', completions)
|
|
self.assertIn('triple', completions)
|
|
|
|
def testMethodCompletions(self):
|
|
completions = completion.Completions(tc.NoDefaults().double)
|
|
self.assertNotIn('--self', completions)
|
|
self.assertIn('--count', completions)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
testutils.main()
|