1010"""
1111import argparse
1212import os
13+ import readline
1314import sys
1415
1516import cmd2
17+ import mock
1618import pytest
1719
1820
@@ -36,6 +38,100 @@ def test_cmd2_command_completion_single_end(cmd2_app):
3638 # It is at end of line, so extra space is present
3739 assert cmd2_app .completenames (text , line , begidx , endidx ) == ['help ' ]
3840
41+ def test_complete_command_single_end (cmd2_app ):
42+ text = 'he'
43+ line = 'he'
44+ state = 0
45+ endidx = len (line )
46+ begidx = endidx - len (text )
47+
48+ def get_line ():
49+ return line
50+
51+ def get_begidx ():
52+ return begidx
53+
54+ def get_endidx ():
55+ return endidx
56+
57+ with mock .patch .object (readline , 'get_line_buffer' , get_line ):
58+ with mock .patch .object (readline , 'get_begidx' , get_begidx ):
59+ with mock .patch .object (readline , 'get_endidx' , get_endidx ):
60+ # Run the readline tab-completion function with readline mocks in place
61+ completion = cmd2_app .complete (text , state )
62+ assert completion == 'help '
63+
64+ def test_complete_command_invalid_state (cmd2_app ):
65+ text = 'he'
66+ line = 'he'
67+ state = 1
68+ endidx = len (line )
69+ begidx = endidx - len (text )
70+
71+ def get_line ():
72+ return line
73+
74+ def get_begidx ():
75+ return begidx
76+
77+ def get_endidx ():
78+ return endidx
79+
80+ with mock .patch .object (readline , 'get_line_buffer' , get_line ):
81+ with mock .patch .object (readline , 'get_begidx' , get_begidx ):
82+ with mock .patch .object (readline , 'get_endidx' , get_endidx ):
83+ with pytest .raises (AttributeError ):
84+ # Run the readline tab-completion function with readline mocks in place and cause an exception
85+ completion = cmd2_app .complete (text , state )
86+
87+ def test_complete_empty_arg (cmd2_app ):
88+ text = ''
89+ line = 'help '
90+ state = 0
91+ endidx = len (line )
92+ begidx = endidx - len (text )
93+
94+ def get_line ():
95+ return line
96+
97+ def get_begidx ():
98+ return begidx
99+
100+ def get_endidx ():
101+ return endidx
102+
103+ with mock .patch .object (readline , 'get_line_buffer' , get_line ):
104+ with mock .patch .object (readline , 'get_begidx' , get_begidx ):
105+ with mock .patch .object (readline , 'get_endidx' , get_endidx ):
106+ # Run the readline tab-completion function with readline mocks in place
107+ completion = cmd2_app .complete (text , state )
108+
109+ assert completion == cmd2_app .complete_help (text , line , begidx , endidx )[0 ]
110+
111+ def test_complete_bogus_command (cmd2_app ):
112+ text = ''
113+ line = 'fizbuzz '
114+ state = 0
115+ endidx = len (line )
116+ begidx = endidx - len (text )
117+
118+ def get_line ():
119+ return line
120+
121+ def get_begidx ():
122+ return begidx
123+
124+ def get_endidx ():
125+ return endidx
126+
127+ with mock .patch .object (readline , 'get_line_buffer' , get_line ):
128+ with mock .patch .object (readline , 'get_begidx' , get_begidx ):
129+ with mock .patch .object (readline , 'get_endidx' , get_endidx ):
130+ # Run the readline tab-completion function with readline mocks in place
131+ completion = cmd2_app .complete (text , state )
132+
133+ assert completion is None
134+
39135def test_cmd2_command_completion_is_case_insensitive_by_default (cmd2_app ):
40136 text = 'HE'
41137 line = 'HE'
@@ -420,3 +516,27 @@ def test_cmd2_subcommand_completion_after_subcommand(sc_app):
420516
421517 # It is at end of line, so extra space is present
422518 assert sc_app .complete_subcommand (text , line , begidx , endidx ) == []
519+
520+
521+ def test_complete_subcommand_single_end (sc_app ):
522+ text = 'f'
523+ line = 'base f'
524+ endidx = len (line )
525+ begidx = endidx - len (text )
526+ state = 0
527+
528+ def get_line ():
529+ return line
530+
531+ def get_begidx ():
532+ return begidx
533+
534+ def get_endidx ():
535+ return endidx
536+
537+ with mock .patch .object (readline , 'get_line_buffer' , get_line ):
538+ with mock .patch .object (readline , 'get_begidx' , get_begidx ):
539+ with mock .patch .object (readline , 'get_endidx' , get_endidx ):
540+ # Run the readline tab-completion function with readline mocks in place
541+ completion = sc_app .complete (text , state )
542+ assert completion == 'foo '
0 commit comments