[lang-ref] ( parse_args_overview ) ( python )

def test_parse_args_overview(capsys):
    # use argparse
    import argparse

    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    # positional arguments
    parser.add_argument('FILENAME_IN', help='....')
    parser.add_argument('FILENAME_OUT')

    # optional arguments
    parser.add_argument('--verbose', '-v', action='store_true')
    parser.add_argument('--force', '-f', action='store_true')
    parser.add_argument('--prefix')

    # parse: In real app, call without arguments. Then sys.argv will be handled.
    # args = parser.parse_args()

    # parse: For test, specify arguments.  This simulates command below:
    #   ./sample.py a.txt b.txt --verbose --prefix=test
    parser.prog = './sample.py'
    args = parser.parse_args(['a.txt', 'b.txt', '--verbose', '--prefix=test.'])

    assert args.FILENAME_IN  == 'a.txt'
    assert args.FILENAME_OUT == 'b.txt'
    assert args.verbose      == True
    assert args.force        == False
    assert args.prefix       == 'test.'

    # check output: In real app, this will be printed in terminal.
    with pytest.raises(SystemExit) as e:
        parser.parse_args(['--help'])

    assert e.value.code == 0

    captured = capsys.readouterr()

    # NOTICE: This is environment dependent
    message = captured.out
    assert 'usage:'      in message
    assert './sample.py' in message
    assert '[-h]'        in message

    # sample:
    '''
    usage: ./sample.py [-h] [--verbose] [--force] [--prefix PREFIX]
                    FILENAME_IN FILENAME_OUT

    positional arguments:
    FILENAME_IN
    FILENAME_OUT

    options:
    -h, --help       show this help message and exit
    --verbose, -v
    --force, -f
    --prefix PREFIX
    '''