""" Test script for the 'cmd' module Original by Michael Schneider """ import cmd import sys import doctest import unittest import io from test import support class samplecmdclass(cmd.Cmd): """ Instance the sampleclass: >>> mycmd = samplecmdclass() Test for the function parseline(): >>> mycmd.parseline("") (None, None, '') >>> mycmd.parseline("?") ('help', '', 'help ') >>> mycmd.parseline("?help") ('help', 'help', 'help help') >>> mycmd.parseline("!") ('shell', '', 'shell ') >>> mycmd.parseline("!command") ('shell', 'command', 'shell command') >>> mycmd.parseline("func") ('func', '', 'func') >>> mycmd.parseline("func arg1") ('func', 'arg1', 'func arg1') Test for the function onecmd(): >>> mycmd.onecmd("") >>> mycmd.onecmd("add 4 5") 9 >>> mycmd.onecmd("") 9 >>> mycmd.onecmd("test") *** Unknown syntax: test Test for the function emptyline(): >>> mycmd.emptyline() *** Unknown syntax: test Test for the function default(): >>> mycmd.default("default") *** Unknown syntax: default Test for the function completedefault(): >>> mycmd.completedefault() This is the completedefault method >>> mycmd.completenames("a") ['add'] Test for the function completenames(): >>> mycmd.completenames("12") [] >>> mycmd.completenames("help") ['help'] Test for the function complete_help(): >>> mycmd.complete_help("a") ['add'] >>> mycmd.complete_help("he") ['help'] >>> mycmd.complete_help("12") [] >>> sorted(mycmd.complete_help("")) ['add', 'exit', 'help', 'life', 'meaning', 'shell'] Test for the function do_help(): >>> mycmd.do_help("testet") *** No help on testet >>> mycmd.do_help("add") help text for add >>> mycmd.onecmd("help add") help text for add >>> mycmd.onecmd("help meaning") # doctest: +NORMALIZE_WHITESPACE Try and be nice to people, avoid eating fat, read a good book every now and then, get some walking in, and try to live together in peace and harmony with people of all creeds and nations. >>> mycmd.do_help("") Documented commands (type help ): ======================================== add help Miscellaneous help topics: ========================== life meaning Undocumented commands: ====================== exit shell Test for the function print_topics(): >>> mycmd.print_topics("header", ["command1", "command2"], 2 ,10) header ====== command1 command2 Test for the function columnize(): >>> mycmd.columnize([str(i) for i in range(20)]) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 >>> mycmd.columnize([str(i) for i in range(20)], 10) 0 7 14 1 8 15 2 9 16 3 10 17 4 11 18 5 12 19 6 13 This is an interactive test, put some commands in the cmdqueue attribute and let it execute This test includes the preloop(), postloop(), default(), emptyline(), parseline(), do_help() functions >>> mycmd.use_rawinput=0 >>> mycmd.cmdqueue=["add", "add 4 5", "", "help", "help add", "exit"] >>> mycmd.cmdloop() # doctest: +REPORT_NDIFF Hello from preloop *** invalid number of arguments 9 9 Documented commands (type help ): ======================================== add help Miscellaneous help topics: ========================== life meaning Undocumented commands: ====================== exit shell help text for add Hello from postloop """ def preloop(self): print("Hello from preloop") def postloop(self): print("Hello from postloop") def completedefault(self, *ignored): print("This is the completedefault method") def complete_command(self): print("complete command") def do_shell(self, s): pass def do_add(self, s): l = s.split() if len(l) != 2: print("*** invalid number of arguments") return try: l = [int(i) for i in l] except ValueError: print("*** arguments should be numbers") return print(l[0]+l[1]) def help_add(self): print("help text for add") return def help_meaning(self): print("Try and be nice to people, avoid eating fat, read a " "good book every now and then, get some walking in, " "and try to live together in peace and harmony with " "people of all creeds and nations.") return def help_life(self): print("Always look on the bright side of life") return def do_exit(self, arg): return True class TestAlternateInput(unittest.TestCase): class simplecmd(cmd.Cmd): def do_print(self, args): print(args, file=self.stdout) def do_EOF(self, args): return True class simplecmd2(simplecmd): def do_EOF(self, args): print('*** Unknown syntax: EOF', file=self.stdout) return True def test_file_with_missing_final_nl(self): input = io.StringIO("print test\nprint test2") output = io.StringIO() cmd = self.simplecmd(stdin=input, stdout=output) cmd.use_rawinput = False cmd.cmdloop() self.assertMultiLineEqual(output.getvalue(), ("(Cmd) test\n" "(Cmd) test2\n" "(Cmd) ")) def test_input_reset_at_EOF(self): input = io.StringIO("print test\nprint test2") output = io.StringIO() cmd = self.simplecmd2(stdin=input, stdout=output) cmd.use_rawinput = False cmd.cmdloop() self.assertMultiLineEqual(output.getvalue(), ("(Cmd) test\n" "(Cmd) test2\n" "(Cmd) *** Unknown syntax: EOF\n")) input = io.StringIO("print \n\n") output = io.StringIO() cmd.stdin = input cmd.stdout = output cmd.cmdloop() self.assertMultiLineEqual(output.getvalue(), ("(Cmd) \n" "(Cmd) \n" "(Cmd) *** Unknown syntax: EOF\n")) class CmdPrintExceptionClass(cmd.Cmd): """ GH-80731 cmd.Cmd should print the correct exception in default() >>> mycmd = CmdPrintExceptionClass() >>> try: ... raise ValueError("test") ... except ValueError: ... mycmd.onecmd("not important") (, ValueError('test')) """ def default(self, line): print(sys.exc_info()[:2]) def load_tests(loader, tests, pattern): tests.addTest(doctest.DocTestSuite()) return tests if __name__ == "__main__": if "-i" in sys.argv: samplecmdclass().cmdloop() else: unittest.main()