1"""
2Test script for the 'cmd' module
3Original by Michael Schneider
4"""
5
6
7import cmd
8import sys
9from test import test_support
10import re
11import unittest
12import StringIO
13
14class samplecmdclass(cmd.Cmd):
15    """
16    Instance the sampleclass:
17    >>> mycmd = samplecmdclass()
18
19    Test for the function parseline():
20    >>> mycmd.parseline("")
21    (None, None, '')
22    >>> mycmd.parseline("?")
23    ('help', '', 'help ')
24    >>> mycmd.parseline("?help")
25    ('help', 'help', 'help help')
26    >>> mycmd.parseline("!")
27    ('shell', '', 'shell ')
28    >>> mycmd.parseline("!command")
29    ('shell', 'command', 'shell command')
30    >>> mycmd.parseline("func")
31    ('func', '', 'func')
32    >>> mycmd.parseline("func arg1")
33    ('func', 'arg1', 'func arg1')
34
35
36    Test for the function onecmd():
37    >>> mycmd.onecmd("")
38    >>> mycmd.onecmd("add 4 5")
39    9
40    >>> mycmd.onecmd("")
41    9
42    >>> mycmd.onecmd("test")
43    *** Unknown syntax: test
44
45    Test for the function emptyline():
46    >>> mycmd.emptyline()
47    *** Unknown syntax: test
48
49    Test for the function default():
50    >>> mycmd.default("default")
51    *** Unknown syntax: default
52
53    Test for the function completedefault():
54    >>> mycmd.completedefault()
55    This is the completedefault methode
56    >>> mycmd.completenames("a")
57    ['add']
58
59    Test for the function completenames():
60    >>> mycmd.completenames("12")
61    []
62    >>> mycmd.completenames("help")
63    ['help']
64
65    Test for the function complete_help():
66    >>> mycmd.complete_help("a")
67    ['add']
68    >>> mycmd.complete_help("he")
69    ['help']
70    >>> mycmd.complete_help("12")
71    []
72    >>> sorted(mycmd.complete_help(""))
73    ['add', 'exit', 'help', 'shell']
74
75    Test for the function do_help():
76    >>> mycmd.do_help("testet")
77    *** No help on testet
78    >>> mycmd.do_help("add")
79    help text for add
80    >>> mycmd.onecmd("help add")
81    help text for add
82    >>> mycmd.do_help("")
83    <BLANKLINE>
84    Documented commands (type help <topic>):
85    ========================================
86    add  help
87    <BLANKLINE>
88    Undocumented commands:
89    ======================
90    exit  shell
91    <BLANKLINE>
92
93    Test for the function print_topics():
94    >>> mycmd.print_topics("header", ["command1", "command2"], 2 ,10)
95    header
96    ======
97    command1
98    command2
99    <BLANKLINE>
100
101    Test for the function columnize():
102    >>> mycmd.columnize([str(i) for i in xrange(20)])
103    0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19
104    >>> mycmd.columnize([str(i) for i in xrange(20)], 10)
105    0  7   14
106    1  8   15
107    2  9   16
108    3  10  17
109    4  11  18
110    5  12  19
111    6  13
112
113    This is an interactive test, put some commands in the cmdqueue attribute
114    and let it execute
115    This test includes the preloop(), postloop(), default(), emptyline(),
116    parseline(), do_help() functions
117    >>> mycmd.use_rawinput=0
118    >>> mycmd.cmdqueue=["", "add", "add 4 5", "help", "help add","exit"]
119    >>> mycmd.cmdloop()
120    Hello from preloop
121    help text for add
122    *** invalid number of arguments
123    9
124    <BLANKLINE>
125    Documented commands (type help <topic>):
126    ========================================
127    add  help
128    <BLANKLINE>
129    Undocumented commands:
130    ======================
131    exit  shell
132    <BLANKLINE>
133    help text for add
134    Hello from postloop
135    """
136
137    def preloop(self):
138        print "Hello from preloop"
139
140    def postloop(self):
141        print "Hello from postloop"
142
143    def completedefault(self, *ignored):
144        print "This is the completedefault methode"
145        return
146
147    def complete_command(self):
148        print "complete command"
149        return
150
151    def do_shell(self, s):
152        pass
153
154    def do_add(self, s):
155        l = s.split()
156        if len(l) != 2:
157            print "*** invalid number of arguments"
158            return
159        try:
160            l = [int(i) for i in l]
161        except ValueError:
162            print "*** arguments should be numbers"
163            return
164        print l[0]+l[1]
165
166    def help_add(self):
167        print "help text for add"
168        return
169
170    def do_exit(self, arg):
171        return True
172
173
174class TestAlternateInput(unittest.TestCase):
175
176    class simplecmd(cmd.Cmd):
177
178        def do_print(self, args):
179            print >>self.stdout, args
180
181        def do_EOF(self, args):
182            return True
183
184
185    class simplecmd2(simplecmd):
186
187        def do_EOF(self, args):
188            print >>self.stdout, '*** Unknown syntax: EOF'
189            return True
190
191
192    def test_file_with_missing_final_nl(self):
193        input = StringIO.StringIO("print test\nprint test2")
194        output = StringIO.StringIO()
195        cmd = self.simplecmd(stdin=input, stdout=output)
196        cmd.use_rawinput = False
197        cmd.cmdloop()
198        self.assertMultiLineEqual(output.getvalue(),
199            ("(Cmd) test\n"
200             "(Cmd) test2\n"
201             "(Cmd) "))
202
203
204    def test_input_reset_at_EOF(self):
205        input = StringIO.StringIO("print test\nprint test2")
206        output = StringIO.StringIO()
207        cmd = self.simplecmd2(stdin=input, stdout=output)
208        cmd.use_rawinput = False
209        cmd.cmdloop()
210        self.assertMultiLineEqual(output.getvalue(),
211            ("(Cmd) test\n"
212             "(Cmd) test2\n"
213             "(Cmd) *** Unknown syntax: EOF\n"))
214        input = StringIO.StringIO("print \n\n")
215        output = StringIO.StringIO()
216        cmd.stdin = input
217        cmd.stdout = output
218        cmd.cmdloop()
219        self.assertMultiLineEqual(output.getvalue(),
220            ("(Cmd) \n"
221             "(Cmd) \n"
222             "(Cmd) *** Unknown syntax: EOF\n"))
223
224
225def test_main(verbose=None):
226    from test import test_cmd
227    test_support.run_doctest(test_cmd, verbose)
228    test_support.run_unittest(TestAlternateInput)
229
230def test_coverage(coverdir):
231    trace = test_support.import_module('trace')
232    tracer=trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,],
233                        trace=0, count=1)
234    tracer.run('reload(cmd);test_main()')
235    r=tracer.results()
236    print "Writing coverage results..."
237    r.write_results(show_missing=True, summary=True, coverdir=coverdir)
238
239if __name__ == "__main__":
240    if "-c" in sys.argv:
241        test_coverage('/tmp/cmd.cover')
242    elif "-i" in sys.argv:
243        samplecmdclass().cmdloop()
244    else:
245        test_main()
246