diff options
author | Todd Leonhardt <todd.leonhardt@gmail.com> | 2018-02-08 20:23:43 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-08 20:23:43 -0500 |
commit | 4895d5d8db4e57e2ef9a062473a8536f4f07f213 (patch) | |
tree | fcb819a804efef573c62ccdcf46e2b8a01bac2ee /tests/test_submenu.py | |
parent | 519f4384c614d5c96d25e047ed85a16ff4bd043c (diff) | |
parent | 68326c0a5c242c22be81428c0bcd50b0cc32bf72 (diff) | |
download | cmd2-git-4895d5d8db4e57e2ef9a062473a8536f4f07f213.tar.gz |
Merge pull request #264 from lobocv/feature/submenu
added a decorator function that allows nesting of Cmd classes to create submenus
Diffstat (limited to 'tests/test_submenu.py')
-rw-r--r-- | tests/test_submenu.py | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/tests/test_submenu.py b/tests/test_submenu.py new file mode 100644 index 00000000..9b42f38f --- /dev/null +++ b/tests/test_submenu.py @@ -0,0 +1,138 @@ +# coding=utf-8 +""" +Cmd2 testing for argument parsing +""" +import pytest + +import cmd2 +from conftest import run_cmd, StdOut, normalize + + +class SecondLevel(cmd2.Cmd): + """To be used as a second level command class. """ + def __init__(self, *args, **kwargs): + cmd2.Cmd.__init__(self, *args, **kwargs) + self.prompt = '2ndLevel ' + self.top_level_attr = None + + def do_say(self, line): + self.poutput("You called a command in SecondLevel with '%s'. " % line) + + def help_say(self): + self.poutput("This is a second level menu. Options are qwe, asd, zxc") + + def complete_say(self, text, line, begidx, endidx): + return [s for s in ['qwe', 'asd', 'zxc'] if s.startswith(text)] + + def do_get_top_level_attr(self, line): + self.poutput(str(self.top_level_attr)) + + def do_get_prompt(self, line): + self.poutput(self.prompt) + + +second_level_cmd = SecondLevel() + + +@cmd2.AddSubmenu(second_level_cmd, + command='second', + aliases=('second_alias',), + shared_attributes=dict(top_level_attr='top_level_attr')) +class SubmenuApp(cmd2.Cmd): + """To be used as the main / top level command class that will contain other submenus.""" + + def __init__(self, *args, **kwargs): + cmd2.Cmd.__init__(self, *args, **kwargs) + self.prompt = 'TopLevel ' + self.top_level_attr = 123456789 + + def do_say(self, line): + self.poutput("You called a command in TopLevel with '%s'. " % line) + + def help_say(self): + self.poutput("This is a top level submenu. Options are qwe, asd, zxc") + + def complete_say(self, text, line, begidx, endidx): + return [s for s in ['qwe', 'asd', 'zxc'] if s.startswith(text)] + + +@pytest.fixture +def submenu_app(): + app = SubmenuApp() + app.stdout = StdOut() + second_level_cmd.stdout = StdOut() + return app + +@pytest.fixture +def secondlevel_app(): + app = SecondLevel() + app.stdout = StdOut() + return app + + +def run_submenu_cmd(app, cmd): + """ Clear StdOut buffers, run the command, extract the buffer contents.""" + app.stdout.clear() + second_level_cmd.stdout.clear() + app.onecmd_plus_hooks(cmd) + out1 = app.stdout.buffer + out2 = second_level_cmd.stdout.buffer + app.stdout.clear() + second_level_cmd.stdout.clear() + return normalize(out1), normalize(out2) + + +def test_submenu_say_from_top_level(submenu_app): + line = 'testing' + out1, out2 = run_submenu_cmd(submenu_app, 'say ' + line) + assert len(out1) == 1 + assert len(out2) == 0 + assert out1[0] == "You called a command in TopLevel with {!r}.".format(line) + +def test_submenu_second_say_from_top_level(submenu_app): + line = 'testing' + out1, out2 = run_submenu_cmd(submenu_app, 'second say ' + line) + + # No output expected from the top level + assert out1 == [] + + # Output expected from the second level + assert len(out2) == 1 + assert out2[0] == "You called a command in SecondLevel with {!r}.".format(line) + +def test_submenu_say_from_second_level(secondlevel_app): + line = 'testing' + out = run_cmd(secondlevel_app, 'say ' + line) + assert out == ["You called a command in SecondLevel with '%s'." % line] + + +def test_submenu_help_second_say_from_top_level(submenu_app): + out1, out2 = run_submenu_cmd(submenu_app, 'help second say') + # No output expected from the top level + assert out1 == [] + + # Output expected from the second level + assert out2 == ["This is a second level menu. Options are qwe, asd, zxc"] + + +def test_submenu_help_say_from_second_level(secondlevel_app): + out = run_cmd(secondlevel_app, 'help say') + assert out == ["This is a second level menu. Options are qwe, asd, zxc"] + + +def test_submenu_help_second(submenu_app): + out1, out2 = run_submenu_cmd(submenu_app, 'help second') + out3 = run_cmd(second_level_cmd, 'help') + assert out2 == out3 + + +def test_submenu_from_top_help_second_say(submenu_app): + out1, out2 = run_submenu_cmd(submenu_app, 'help second say') + out3 = run_cmd(second_level_cmd, 'help say') + assert out2 == out3 + + +def test_submenu_shared_attribute(submenu_app): + out1, out2 = run_submenu_cmd(submenu_app, 'second get_top_level_attr') + assert out2 == [str(submenu_app.top_level_attr)] + |