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