serde_args 0.2.0

Command line argument parsing with serde.
Documentation
mod command;

use command::Command;

#[test]
fn empty() {
    assert_run_ok!(Command::new("tests/from_env/empty"));
    assert_run_ok!(Command::new("tests/from_env/empty").args(["--"]));

    assert_run_err!(Command::new("tests/from_env/empty").args(["foo"]), "ERROR: unexpected positional argument: foo\n\nUSAGE: {name} \n\nFor more information, use --help.\n");
    assert_run_err!(Command::new("tests/from_env/empty").args(["--foo"]), "ERROR: unrecognized optional flag: --foo\n\n  tip: a similar option exists: --help\n\nUSAGE: {name} \n\nFor more information, use --help.\n");
    assert_run_err!(Command::new("tests/from_env/empty").args(["--", "--"]), "ERROR: unexpected positional argument: --\n\nUSAGE: {name} \n\nFor more information, use --help.\n");
    assert_run_err!(
        Command::new("tests/from_env/empty").args(["-h"]),
        "unit\n\nUSAGE: {name} \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/empty").args(["--help"]),
        "unit\n\nUSAGE: {name} \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(Command::new("tests/from_env/empty").args(["--", "-h"]), "ERROR: unexpected positional argument: -h\n\nUSAGE: {name} \n\nFor more information, use --help.\n");
    assert_run_err!(Command::new("tests/from_env/empty").args(["--", "--help"]), "ERROR: unexpected positional argument: --help\n\nUSAGE: {name} \n\nFor more information, use --help.\n");
}

#[test]
fn primitive() {
    assert_run_ok!(Command::new("tests/from_env/primitive").args(["42"]));
    assert_run_ok!(Command::new("tests/from_env/primitive").args(["--", "42"]));
    assert_run_ok!(Command::new("tests/from_env/primitive").args(["42", "--"]));

    assert_run_err!(Command::new("tests/from_env/primitive").args(["foo"]), "ERROR: invalid type: expected u64, found foo\n\nUSAGE: {name} <u64>\n\nFor more information, use --help.\n");
    assert_run_err!(Command::new("tests/from_env/primitive").args(["-42"]), "ERROR: invalid type: expected u64, found -42\n\nUSAGE: {name} <u64>\n\nFor more information, use --help.\n");
    assert_run_err!(
        Command::new("tests/from_env/primitive").args(["-h"]),
        "u64\n\nUSAGE: {name} <u64>\n\nRequired Arguments:\n  <u64>  u64\n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/primitive").args(["--help"]),
        "u64\n\nUSAGE: {name} <u64>\n\nRequired Arguments:\n  <u64>  u64\n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/primitive").args(["42", "--help"]),
        "u64\n\nUSAGE: {name} <u64>\n\nRequired Arguments:\n  <u64>  u64\n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/primitive").args(["--", "-h"]),
        "ERROR: invalid type: expected u64, found -h\n\nUSAGE: {name} <u64>\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/primitive").args(["--", "--help"]),
        "ERROR: invalid type: expected u64, found --help\n\nUSAGE: {name} <u64>\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/primitive").args(["--", "42", "-h"]),
        "ERROR: unexpected positional argument: -h\n\nUSAGE: {name} <u64>\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/primitive").args(["--", "42", "--help"]),
        "ERROR: unexpected positional argument: --help\n\nUSAGE: {name} <u64>\n\nFor more information, use --help.\n"
    );
}

#[test]
fn boolean() {
    assert_run_ok!(Command::new("tests/from_env/boolean").args(["true"]));
    assert_run_ok!(Command::new("tests/from_env/boolean").args(["false"]));
    assert_run_ok!(Command::new("tests/from_env/boolean").args(["--", "true"]));
    assert_run_ok!(Command::new("tests/from_env/boolean").args(["--", "false"]));
    assert_run_ok!(Command::new("tests/from_env/boolean").args(["true", "--"]));
    assert_run_ok!(Command::new("tests/from_env/boolean").args(["false", "--"]));

    assert_run_err!(Command::new("tests/from_env/boolean").args(["foo"]), "ERROR: invalid type: expected a boolean, found foo\n\nUSAGE: {name} <a boolean>\n\nFor more information, use --help.\n");
    assert_run_err!(Command::new("tests/from_env/boolean").args(["0"]), "ERROR: invalid type: expected a boolean, found 0\n\nUSAGE: {name} <a boolean>\n\nFor more information, use --help.\n");
    assert_run_err!(Command::new("tests/from_env/boolean").args(["1"]), "ERROR: invalid type: expected a boolean, found 1\n\nUSAGE: {name} <a boolean>\n\nFor more information, use --help.\n");
    assert_run_err!(Command::new("tests/from_env/boolean").args(["TRUE"]), "ERROR: invalid type: expected a boolean, found TRUE\n\nUSAGE: {name} <a boolean>\n\nFor more information, use --help.\n");
    assert_run_err!(Command::new("tests/from_env/boolean").args(["FALSE"]), "ERROR: invalid type: expected a boolean, found FALSE\n\nUSAGE: {name} <a boolean>\n\nFor more information, use --help.\n");
    assert_run_err!(Command::new("tests/from_env/boolean"), "a boolean\n\nUSAGE: {name} <a boolean>\n\nRequired Arguments:\n  <a boolean>  a boolean\n\nOverride Options:\n  -h --help  Display this message.\n");
    assert_run_err!(Command::new("tests/from_env/boolean").args(["-h"]), "a boolean\n\nUSAGE: {name} <a boolean>\n\nRequired Arguments:\n  <a boolean>  a boolean\n\nOverride Options:\n  -h --help  Display this message.\n");
    assert_run_err!(Command::new("tests/from_env/boolean").args(["--help"]), "a boolean\n\nUSAGE: {name} <a boolean>\n\nRequired Arguments:\n  <a boolean>  a boolean\n\nOverride Options:\n  -h --help  Display this message.\n");
}

#[test]
fn option() {
    assert_run_ok!(Command::new("tests/from_env/option"));
    assert_run_ok!(Command::new("tests/from_env/option").args(["--"]));
    assert_run_ok!(Command::new("tests/from_env/option").args(["--foo"]));
    assert_run_ok!(Command::new("tests/from_env/option").args(["-"]));
    assert_run_ok!(Command::new("tests/from_env/option").args(["-", "--"]));
    assert_run_ok!(Command::new("tests/from_env/option").args(["-h"]));
    assert_run_ok!(Command::new("tests/from_env/option").args(["--help"]));

    assert_run_err!(
        Command::new("tests/from_env/option").args(["--", "--foo"]),
        "ERROR: unrecognized optional flag: --foo\n\n  tip: a similar option exists: --help\n\nUSAGE: {name} [--<a string>]\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/option").args(["--", "-"]),
        "ERROR: unrecognized optional flag: -\n\n  tip: a similar option exists: -h\n\nUSAGE: {name} [--<a string>]\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/option").args(["--", "-h"]),
        "a string\n\nUSAGE: {name} [--<a string>]\n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/option").args(["--", "--help"]),
        "a string\n\nUSAGE: {name} [--<a string>]\n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/option").args(["--foo", "-h"]),
        "a string\n\nUSAGE: {name} [--<a string>]\n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/option").args(["--foo", "--help"]),
        "a string\n\nUSAGE: {name} [--<a string>]\n\nOverride Options:\n  -h --help  Display this message.\n"
    );
}

#[test]
fn required_fields() {
    assert_run_ok!(Command::new("tests/from_env/required_fields").args(["hello", "42"]));
    assert_run_ok!(Command::new("tests/from_env/required_fields").args(["hello", "-42"]));
    assert_run_ok!(Command::new("tests/from_env/required_fields").args(["--", "--hello", "42"]));
    assert_run_ok!(Command::new("tests/from_env/required_fields").args(["--", "--help", "42"]));
    assert_run_ok!(Command::new("tests/from_env/required_fields").args(["hello", "--", "-42"]));
    assert_run_ok!(Command::new("tests/from_env/required_fields").args(["hello", "--", "-3"]));
    assert_run_ok!(Command::new("tests/from_env/required_fields").args(["hello", "42", "--"]));

    assert_run_err!(
        Command::new("tests/from_env/required_fields").args(["--"]),
        "ERROR: missing required positional arguments: <foo> <baz>\n\nUSAGE: {name} <foo> <baz>\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/required_fields").args(["hello"]),
        "ERROR: missing required positional argument: <baz>\n\nUSAGE: {name} <foo> <baz>\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/required_fields"),
        "struct Args\n\nUSAGE: {name} <foo> <baz>\n\nRequired Arguments:\n  <foo>  \n  <baz>  \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/required_fields").args(["-h"]),
        "struct Args\n\nUSAGE: {name} <foo> <baz>\n\nRequired Arguments:\n  <foo>  \n  <baz>  \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/required_fields").args(["--help"]),
        "struct Args\n\nUSAGE: {name} <foo> <baz>\n\nRequired Arguments:\n  <foo>  \n  <baz>  \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/required_fields").args(["hello", "42", "--help"]),
        "struct Args\n\nUSAGE: {name} <foo> <baz>\n\nRequired Arguments:\n  <foo>  \n  <baz>  \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/required_fields").args(["--help", "hello", "42"]),
        "struct Args\n\nUSAGE: {name} <foo> <baz>\n\nRequired Arguments:\n  <foo>  \n  <baz>  \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/required_fields").args(["hello", "--help", "42"]),
        "struct Args\n\nUSAGE: {name} <foo> <baz>\n\nRequired Arguments:\n  <foo>  \n  <baz>  \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/required_fields").args(["hello", "42", "hello"]),
        "ERROR: unexpected positional argument: hello\n\nUSAGE: {name} <foo> <baz>\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/required_fields").args(["hello", "42", "--hello"]),
        "ERROR: unrecognized optional flag: --hello\n\n  tip: a similar option exists: --help\n\nUSAGE: {name} <foo> <baz>\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/required_fields").args(["hello", "--", "--help"]),
        "ERROR: invalid type: expected i64, found --help\n\nUSAGE: {name} <foo> <baz>\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/required_fields").args(["hello", "-3"]),
        "ERROR: unrecognized optional flag: -3\n\n  tip: a similar option exists: -h\n\nUSAGE: {name} <foo> <baz>\n\nFor more information, use --help.\n"
    );
}

#[test]
fn optional_fields() {
    assert_run_ok!(Command::new("tests/from_env/optional_fields"));
    assert_run_ok!(Command::new("tests/from_env/optional_fields").args(["--foo", "hello"]));
    assert_run_ok!(Command::new("tests/from_env/optional_fields").args(["--bar"]));
    assert_run_ok!(Command::new("tests/from_env/optional_fields").args(["--baz", "42"]));
    assert_run_ok!(Command::new("tests/from_env/optional_fields")
        .args(["--foo", "hello", "--baz", "42", "--bar"]));
    assert_run_ok!(Command::new("tests/from_env/optional_fields")
        .args(["--foo", "hello", "--baz", "--", "-3",]));

    assert_run_err!(
        Command::new("tests/from_env/optional_fields").args(["--qux"]),
        "ERROR: unrecognized optional flag: --qux\n\n  tip: a similar option exists: --foo\n\nUSAGE: {name} [options]\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/optional_fields").args(["--foo"]),
        "ERROR: missing required positional argument: <a string>\n\nUSAGE: {name} [options]\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/optional_fields").args(["--baz"]),
        "ERROR: missing required positional argument: <i64>\n\nUSAGE: {name} [options]\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/optional_fields").args(["--bar", "--", "--foo"]),
        "ERROR: unexpected positional argument: --foo\n\nUSAGE: {name} [options]\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/optional_fields").args(["--foo", "hello", "--baz", "42", "--bar", "--help"]),
        "struct Args\n\nUSAGE: {name} [options]\n\nGlobal Options:\n  --foo <a string>  \n  --bar             \n  --baz <i64>       \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/optional_fields").args(["--foo", "hello", "--baz", "-h", "42", "--bar"]),
        "struct Args\n\nUSAGE: {name} [options]\n\nGlobal Options:\n  --foo <a string>  \n  --bar             \n  --baz <i64>       \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/optional_fields").args(["foo"]),
        "ERROR: unexpected positional argument: foo\n\nUSAGE: {name} [options]\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/optional_fields").args(["--", "--foo"]),
        "ERROR: unexpected positional argument: --foo\n\nUSAGE: {name} [options]\n\nFor more information, use --help.\n"
    );
}

#[test]
fn boolean_fields() {
    assert_run_ok!(Command::new("tests/from_env/boolean_fields"));
    assert_run_ok!(Command::new("tests/from_env/boolean_fields").args(["--foo"]));
    assert_run_ok!(Command::new("tests/from_env/boolean_fields").args(["--bar"]));
    assert_run_ok!(Command::new("tests/from_env/boolean_fields").args(["--baz"]));
    assert_run_ok!(Command::new("tests/from_env/boolean_fields").args(["--bar", "--foo"]));
    assert_run_ok!(Command::new("tests/from_env/boolean_fields").args(["--bar", "--baz"]));
    assert_run_ok!(Command::new("tests/from_env/boolean_fields").args(["--baz", "--bar", "--foo"]));

    assert_run_err!(
        Command::new("tests/from_env/boolean_fields").args(["--qux"]),
        "ERROR: unrecognized optional flag: --qux\n\n  tip: a similar option exists: --foo\n\nUSAGE: {name} [options]\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/boolean_fields").args(["--foo", "--foo"]),
        "ERROR: the argument --foo cannot be used multiple times\n\nUSAGE: {name} [options]\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/boolean_fields").args(["--foo", "true"]),
        "ERROR: unexpected positional argument: true\n\nUSAGE: {name} [options]\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/boolean_fields").args(["--", "--foo"]),
        "ERROR: unexpected positional argument: --foo\n\nUSAGE: {name} [options]\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/boolean_fields").args(["--help"]),
        "struct Args\n\nUSAGE: {name} [options]\n\nGlobal Options:\n  --foo   \n  --bar   \n  --baz   \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/boolean_fields").args(["--baz", "--help"]),
        "struct Args\n\nUSAGE: {name} [options]\n\nGlobal Options:\n  --foo   \n  --bar   \n  --baz   \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/boolean_fields").args(["--help", "--bar"]),
        "struct Args\n\nUSAGE: {name} [options]\n\nGlobal Options:\n  --foo   \n  --bar   \n  --baz   \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
}

#[test]
fn r#enum() {
    assert_run_ok!(Command::new("tests/from_env/enum").args(["foo"]));
    assert_run_ok!(Command::new("tests/from_env/enum").args(["bar", "42"]));
    assert_run_ok!(Command::new("tests/from_env/enum").args(["baz"]));
    assert_run_ok!(Command::new("tests/from_env/enum").args(["baz", "--"]));
    assert_run_ok!(Command::new("tests/from_env/enum").args(["baz", "-"]));
    assert_run_ok!(Command::new("tests/from_env/enum").args(["baz", "--foo"]));
    assert_run_ok!(Command::new("tests/from_env/enum").args(["qux", "hello"]));
    assert_run_ok!(Command::new("tests/from_env/enum").args(["qux", "--optional", "hi", "hello"]));
    assert_run_ok!(Command::new("tests/from_env/enum").args(["qux", "hello", "--optional", "hi"]));
    assert_run_ok!(Command::new("tests/from_env/enum").args([
        "qux",
        "--optional",
        "hi",
        "--",
        "--help"
    ]));

    assert_run_err!(
        Command::new("tests/from_env/enum").args(["--"]),
        "ERROR: missing required positional argument: <Command>\n\nUSAGE: {name} <Command>\n\nFor more information, use --help.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/enum"),
        "enum Command\n\nUSAGE: {name} <Command>\n\nRequired Arguments:\n  <Command>  enum Command\n\nOverride Options:\n  -h --help  Display this message.\n\nCommand Variants:\n  foo                       \n  bar <u8>                  \n  baz [--<a string>]        \n  qux [options] <required>  \n"
    );
    assert_run_err!(
        Command::new("tests/from_env/enum").args(["-h"]),
        "enum Command\n\nUSAGE: {name} <Command>\n\nRequired Arguments:\n  <Command>  enum Command\n\nOverride Options:\n  -h --help  Display this message.\n\nCommand Variants:\n  foo                       \n  bar <u8>                  \n  baz [--<a string>]        \n  qux [options] <required>  \n"
    );
    assert_run_err!(
        Command::new("tests/from_env/enum").args(["--help"]),
        "enum Command\n\nUSAGE: {name} <Command>\n\nRequired Arguments:\n  <Command>  enum Command\n\nOverride Options:\n  -h --help  Display this message.\n\nCommand Variants:\n  foo                       \n  bar <u8>                  \n  baz [--<a string>]        \n  qux [options] <required>  \n"
    );
    assert_run_err!(
        Command::new("tests/from_env/enum").args(["--help", "foo"]),
        "USAGE: {name} foo \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/enum").args(["bar", "--help"]),
        "USAGE: {name} bar <u8>\n\nRequired Arguments:\n  <u8>  u8\n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/enum").args(["baz", "--", "--help"]),
        "USAGE: {name} baz [--<a string>]\n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/enum").args(["qux", "--help", "foo"]),
        "USAGE: {name} qux [qux options] <required>\n\nRequired Arguments:\n  <required>  \n\nqux Options:\n  --optional <a string>  \n\nOverride Options:\n  -h --help  Display this message.\n"
    );
    assert_run_err!(
        Command::new("tests/from_env/enum").args(["quux"]),
        "ERROR: unrecognized command: quux\n\n  tip: a similar command exists: qux\n\nUSAGE: {name} <Command>\n\nFor more information, use --help.\n"
    );
}

#[test]
fn struct_help() {
    assert_run_err!(
        Command::new("tests/from_env/struct_help").args(["--help"]),
        "This is a description of my program.\n\nUSAGE: {name} [options] <foo> <baz>\n\nRequired Arguments:\n  <foo>  Not just any string, but your favorite string.\n  <baz>  Any number other than 9.\n\nGlobal Options:\n  -q --qux <u8>  Determines the quxiness of the program.\n\nOverride Options:\n  -h --help  Display this message.\n"
    );
}

#[test]
fn enum_help() {
    assert_run_err!(
        Command::new("tests/from_env/enum_help").args(["--help"]),
        "This is a description of my program.\n\nUSAGE: {name} <Command>\n\nRequired Arguments:\n  <Command>  This is a description of my program.\n\nOverride Options:\n  -h --help  Display this message.\n\nCommand Variants:\n  foo                       Don't provide any arguments to this command.\n  bar <u8>                  Provide one argument to this command.\n  baz [--<a string>]        You can do zero or one arguments for this command.\n  qux [options] <required>  This command takes a required argument and an optional flag.\n"
    );
}

#[test]
fn struct_help_color() {
    assert_run_err!(
        Command::new("tests/from_env/struct_help_color").args(["--help"]),
        "This is a description of my program.\n\n\x1b[97mUSAGE\x1b[0m: \x1b[96m{name}\x1b[0m \x1b[36m[options] <foo> <baz>\x1b[0m\n\n\x1b[97mRequired Arguments:\x1b[0m\n  \x1b[96m<foo>\x1b[0m  Not just any string, but your favorite string.\n  \x1b[96m<baz>\x1b[0m  Any number other than 9.\n\n\x1b[97mGlobal Options:\x1b[0m\n  \x1b[96m-q\x1b[0m \x1b[96m--qux\x1b[0m \x1b[36m<u8>\x1b[0m  Determines the quxiness of the program.\n\n\x1b[97mOverride Options:\x1b[0m\n  \x1b[96m-h --help\x1b[0m  Display this message.\n"
    );
}

#[test]
fn enum_help_color() {
    assert_run_err!(
        Command::new("tests/from_env/enum_help_color").args(["--help"]),
        "This is a description of my program.\n\n\x1b[97mUSAGE\x1b[0m: \x1b[96m{name}\x1b[0m \x1b[36m<Command>\x1b[0m\n\n\x1b[97mRequired Arguments:\x1b[0m\n  \x1b[96m<Command>\x1b[0m  This is a description of my program.\n\n\x1b[97mOverride Options:\x1b[0m\n  \x1b[96m-h --help\x1b[0m  Display this message.\n\n\x1b[97mCommand Variants:\x1b[0m\n  \x1b[96mfoo \x1b[0m\x1b[36m\x1b[0m                      Don't provide any arguments to this command.\n  \x1b[96mbar \x1b[0m\x1b[36m<u8>\x1b[0m                  Provide one argument to this command.\n  \x1b[96mbaz \x1b[0m\x1b[36m[--<a string>]\x1b[0m        You can do zero or one arguments for this command.\n  \x1b[96mqux \x1b[0m\x1b[36m[options] <required>\x1b[0m  This command takes a required argument and an optional flag.\n"
    );
}

#[test]
fn struct_version() {
    assert_run_err_literal!(
        Command::new("tests/from_env/struct_version").args(["--version"]),
        "0.0.0\n"
    );
}

#[test]
fn enum_version() {
    assert_run_err_literal!(
        Command::new("tests/from_env/enum_version").args(["--version"]),
        "0.0.0\n"
    );
}

#[test]
fn struct_version_help() {
    assert_run_err_literal!(
        Command::new("tests/from_env/struct_version_help").args(["--version"]),
        "0.0.0\n"
    );
}

#[test]
fn struct_deserialize_with() {
    assert_run_ok!(Command::new("tests/from_env/struct_deserialize_with").args(["foo"]));
    assert_run_ok!(
        Command::new("tests/from_env/struct_deserialize_with").args(["foo", "--directory", "bar"])
    );
}

#[test]
fn enum_version_help() {
    assert_run_err_literal!(
        Command::new("tests/from_env/enum_version_help").args(["--version"]),
        "0.0.0\n"
    );
}

#[test]
fn enum_alias() {
    assert_run_err!(
        Command::new("tests/from_env/enum_alias"),
        "enum Command\n\nUSAGE: {name} <Command>\n\nRequired Arguments:\n  <Command>  enum Command\n\nOverride Options:\n  -h --help  Display this message.\n\nCommand Variants:\n  f foo                       \n  bar <u8>                    \n  b baz [--<a string>]        \n  q qux [options] <required>  \n"
    );
}