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 help 88 <BLANKLINE> 89 Undocumented commands: 90 ====================== 91 exit 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 help 129 <BLANKLINE> 130 Undocumented commands: 131 ====================== 132 exit 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 186 class simplecmd2(simplecmd): 187 188 def do_EOF(self, args): 189 print >>self.stdout, '*** Unknown syntax: EOF' 190 return True 191 192 193 def test_file_with_missing_final_nl(self): 194 input = StringIO.StringIO("print test\nprint test2") 195 output = StringIO.StringIO() 196 cmd = self.simplecmd(stdin=input, stdout=output) 197 cmd.use_rawinput = False 198 cmd.cmdloop() 199 self.assertMultiLineEqual(output.getvalue(), 200 ("(Cmd) test\n" 201 "(Cmd) test2\n" 202 "(Cmd) ")) 203 204 205 def test_input_reset_at_EOF(self): 206 input = StringIO.StringIO("print test\nprint test2") 207 output = StringIO.StringIO() 208 cmd = self.simplecmd2(stdin=input, stdout=output) 209 cmd.use_rawinput = False 210 cmd.cmdloop() 211 self.assertMultiLineEqual(output.getvalue(), 212 ("(Cmd) test\n" 213 "(Cmd) test2\n" 214 "(Cmd) *** Unknown syntax: EOF\n")) 215 input = StringIO.StringIO("print \n\n") 216 output = StringIO.StringIO() 217 cmd.stdin = input 218 cmd.stdout = output 219 cmd.cmdloop() 220 self.assertMultiLineEqual(output.getvalue(), 221 ("(Cmd) \n" 222 "(Cmd) \n" 223 "(Cmd) *** Unknown syntax: EOF\n")) 224 225 226def test_main(verbose=None): 227 from test import test_cmd 228 test_support.run_doctest(test_cmd, verbose) 229 test_support.run_unittest(TestAlternateInput) 230 231def test_coverage(coverdir): 232 trace = test_support.import_module('trace') 233 tracer=trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,], 234 trace=0, count=1) 235 tracer.run('reload(cmd);test_main()') 236 r=tracer.results() 237 print "Writing coverage results..." 238 r.write_results(show_missing=True, summary=True, coverdir=coverdir) 239 240if __name__ == "__main__": 241 if "-c" in sys.argv: 242 test_coverage('/tmp/cmd.cover') 243 elif "-i" in sys.argv: 244 samplecmdclass().cmdloop() 245 else: 246 test_main() 247