blob: b48b0f11f3e10f5489f57848e922835802e79a4c [file] [log] [blame]
Georg Brandle4317fa2007-12-01 22:38:48 +00001#!/usr/bin/env python
2"""
3Test script for the 'cmd' module
4Original by Michael Schneider
5"""
6
7
Georg Brandle4317fa2007-12-01 22:38:48 +00008import cmd
9import sys
R. David Murray0d023db2010-08-01 04:11:05 +000010import re
11import unittest
12import StringIO
Georg Brandle4317fa2007-12-01 22:38:48 +000013
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', 'help']
64
65 Test for the function complete_help():
66 >>> mycmd.complete_help("a")
67 ['add']
68 >>> mycmd.complete_help("he")
69 ['help', 'help']
70 >>> mycmd.complete_help("12")
71 []
72
73 Test for the function do_help():
74 >>> mycmd.do_help("testet")
75 *** No help on testet
76 >>> mycmd.do_help("add")
77 help text for add
78 >>> mycmd.onecmd("help add")
79 help text for add
80 >>> mycmd.do_help("")
81 <BLANKLINE>
82 Documented commands (type help <topic>):
83 ========================================
84 add
85 <BLANKLINE>
86 Undocumented commands:
87 ======================
88 exit help shell
89 <BLANKLINE>
90
91 Test for the function print_topics():
92 >>> mycmd.print_topics("header", ["command1", "command2"], 2 ,10)
93 header
94 ======
95 command1
96 command2
97 <BLANKLINE>
98
99 Test for the function columnize():
100 >>> mycmd.columnize([str(i) for i in xrange(20)])
101 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
102 >>> mycmd.columnize([str(i) for i in xrange(20)], 10)
103 0 7 14
104 1 8 15
105 2 9 16
106 3 10 17
107 4 11 18
108 5 12 19
109 6 13
110
111 This is a interactive test, put some commands in the cmdqueue attribute
112 and let it execute
113 This test includes the preloop(), postloop(), default(), emptyline(),
114 parseline(), do_help() functions
115 >>> mycmd.use_rawinput=0
116 >>> mycmd.cmdqueue=["", "add", "add 4 5", "help", "help add","exit"]
117 >>> mycmd.cmdloop()
118 Hello from preloop
119 help text for add
120 *** invalid number of arguments
121 9
122 <BLANKLINE>
123 Documented commands (type help <topic>):
124 ========================================
125 add
126 <BLANKLINE>
127 Undocumented commands:
128 ======================
129 exit help shell
130 <BLANKLINE>
131 help text for add
132 Hello from postloop
133 """
134
135 def preloop(self):
136 print "Hello from preloop"
137
138 def postloop(self):
139 print "Hello from postloop"
140
141 def completedefault(self, *ignored):
142 print "This is the completedefault methode"
143 return
144
145 def complete_command(self):
146 print "complete command"
147 return
148
Georg Brandlb6453a92010-03-21 19:16:28 +0000149 def do_shell(self, s):
Georg Brandle4317fa2007-12-01 22:38:48 +0000150 pass
151
152 def do_add(self, s):
153 l = s.split()
154 if len(l) != 2:
155 print "*** invalid number of arguments"
156 return
157 try:
158 l = [int(i) for i in l]
159 except ValueError:
160 print "*** arguments should be numbers"
161 return
162 print l[0]+l[1]
163
164 def help_add(self):
165 print "help text for add"
166 return
167
168 def do_exit(self, arg):
169 return True
170
R. David Murray0d023db2010-08-01 04:11:05 +0000171
172class TestAlternateInput(unittest.TestCase):
173
174 class simplecmd(cmd.Cmd):
175
176 def do_print(self, args):
177 print >>self.stdout, args
178
179 def do_EOF(self, args):
180 return True
181
182 def test_file_with_missing_final_nl(self):
183 input = StringIO.StringIO("print test\nprint test2")
184 output = StringIO.StringIO()
185 cmd = self.simplecmd(stdin=input, stdout=output)
186 cmd.use_rawinput = False
187 cmd.cmdloop()
188 self.assertEqual(output.getvalue(),
189 ("(Cmd) test\n"
190 "(Cmd) test2\n"
191 "(Cmd) "))
192
193
Georg Brandle4317fa2007-12-01 22:38:48 +0000194def test_main(verbose=None):
195 from test import test_support, test_cmd
196 test_support.run_doctest(test_cmd, verbose)
R. David Murray0d023db2010-08-01 04:11:05 +0000197 test_support.run_unittest(TestAlternateInput)
Georg Brandle4317fa2007-12-01 22:38:48 +0000198
Georg Brandle4317fa2007-12-01 22:38:48 +0000199def test_coverage(coverdir):
Georg Brandlb6453a92010-03-21 19:16:28 +0000200 import trace
Georg Brandle4317fa2007-12-01 22:38:48 +0000201 tracer=trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,],
202 trace=0, count=1)
203 tracer.run('reload(cmd);test_main()')
204 r=tracer.results()
205 print "Writing coverage results..."
206 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
207
208if __name__ == "__main__":
209 if "-c" in sys.argv:
210 test_coverage('/tmp/cmd.cover')
Georg Brandlb6453a92010-03-21 19:16:28 +0000211 elif "-i" in sys.argv:
212 samplecmdclass().cmdloop()
Georg Brandle4317fa2007-12-01 22:38:48 +0000213 else:
214 test_main()