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