from io import StringIO from contextlib import redirect_stdout, redirect_stderr import pytest from tiramisu_cmdline_parser import TiramisuCmdlineParser from tiramisu import BoolOption, OptionDescription, Config from .utils import TestHelpFormatter, to_dict def get_config(has_tree=False, default_verbosity=False): booloption = BoolOption('disabled', 'disabled', properties=('disabled',), ) booloption2 = BoolOption('verbosity', 'increase output verbosity', default=default_verbosity, ) root = OptionDescription('root', 'root', [booloption, booloption2], ) if has_tree: root = OptionDescription('root', 'root', [root], ) config = Config(root) config.property.read_write() return config def test_boolean_help_tree(): output = """usage: prog.py [-h] [--root.verbosity] [--root.no-verbosity] options: -h, --help show this help message and exit root: --root.verbosity increase output verbosity (default: False) --root.no-verbosity """ parser = TiramisuCmdlineParser(get_config(has_tree=True), 'prog.py', formatter_class=TestHelpFormatter) f = StringIO() with redirect_stdout(f): parser.print_help() assert f.getvalue() == output def test_boolean_help(): output = """usage: prog.py [-h] [--verbosity] [--no-verbosity] options: -h, --help show this help message and exit --verbosity increase output verbosity (default: False) --no-verbosity """ parser = TiramisuCmdlineParser(get_config(), 'prog.py', formatter_class=TestHelpFormatter) f = StringIO() with redirect_stdout(f): parser.print_help() assert f.getvalue() == output def test_boolean_help2(): output = """usage: prog.py [-h] [--verbosity] [--no-verbosity] options: -h, --help show this help message and exit --verbosity increase output verbosity (default: True) --no-verbosity """ parser = TiramisuCmdlineParser(get_config(default_verbosity=True), 'prog.py', formatter_class=TestHelpFormatter) f = StringIO() with redirect_stdout(f): parser.print_help() assert f.getvalue() == output def test_boolean_true(): config = get_config(default_verbosity=True) parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter) assert to_dict(config.value.get()) == {'verbosity': True} def test_boolean_false(): config = get_config() parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter) assert to_dict(config.value.get()) == {'verbosity': False} def test_boolean_true_to_false(): config = get_config(default_verbosity=True) parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter) parser.parse_args(['--no-verbosity']) assert to_dict(config.value.get()) == {'verbosity': False} def test_boolean_true_to_true(): config = get_config(default_verbosity=True) parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter) parser.parse_args(['--verbosity']) assert to_dict(config.value.get()) == {'verbosity': True} def test_boolean_false_to_true(): config = get_config() parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter) parser.parse_args(['--verbosity']) assert to_dict(config.value.get()) == {'verbosity': True} def test_boolean_false_to_false(): config = get_config() parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter) parser.parse_args(['--verbosity']) assert to_dict(config.value.get()) == {'verbosity': True} def test_boolean_disabled(): config = get_config(default_verbosity=True) parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter) f = StringIO() with redirect_stderr(f): try: parser.parse_args(['--disabled']) except SystemExit as err: assert str(err) == "2" assert f.getvalue() == """usage: prog.py [-h] [--verbosity] [--no-verbosity] prog.py: error: unrecognized arguments: --disabled (cannot access to option "disabled" because has property "disabled") """ def test_boolean_no_disabled(): config = get_config(default_verbosity=True) parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter) f = StringIO() with redirect_stderr(f): try: parser.parse_args(['--no-disabled']) except SystemExit as err: assert str(err) == "2" assert f.getvalue() == """usage: prog.py [-h] [--verbosity] [--no-verbosity] prog.py: error: unrecognized arguments: --no-disabled (cannot access to option "disabled" because has property "disabled") """