///|
test "basic option + positional success snapshot" {
let matches = @argparse.parse(
Command("demo", options=[OptionArg("name")], positionals=[
PositionArg("target"),
]),
argv=["--name", "alice", "file.txt"],
env=Map([]),
)
@debug.debug_inspect(
matches.values,
content=(
#|{ "name": ["alice"], "target": ["file.txt"] }
),
)
}
///|
test "basic option + positional failure snapshot" {
let cmd = @argparse.Command("demo", options=[OptionArg("name")], positionals=[
PositionArg("target"),
])
try cmd.parse(argv=["--bad"], env=Map([])) catch {
err =>
inspect(
err,
content=(
#|error: unexpected argument '--bad' found
#|
#|Usage: demo [options] [target]
#|
#|Arguments:
#| target
#|
#|Options:
#| -h, --help Show help information.
#| --name <name>
#|
),
)
} noraise {
_ => panic()
}
}///|
async fn main {
let cmd = @argparse.Command("demo", options=[@argparse.OptionArg("name")], positionals=[
@argparse.PositionArg("target"),
])
let _ = cmd.parse()
}///|
test "negatable flag success snapshot" {
let cmd = @argparse.Command("demo", flags=[FlagArg("cache", negatable=true)])
inspect(
cmd.render_help(),
content=(
#|Usage: demo [options]
#|
#|Options:
#| -h, --help Show help information.
#| --[no-]cache
#|
),
)
let parsed = try! cmd.parse(argv=["--no-cache"], env=Map([]))
@debug.debug_inspect(
parsed.flags,
content=(
#|{ "cache": false }
),
)
}///|
test "global count flag success snapshot" {
let cmd = @argparse.Command(
"demo",
flags=[FlagArg("verbose", short='v', action=Count, global=true)],
subcommands=[Command("run")],
)
let parsed = try! cmd.parse(argv=["-v", "run", "-v"], env=Map([]))
@debug.debug_inspect(
parsed.flag_counts,
content=(
#|{ "verbose": 2 }
),
)
parsed.subcommand is Some(("run", child))
@debug.debug_inspect(
child.flag_counts,
content=(
#|{ "verbose": 2 }
),
)
}
///|
test "subcommand context failure snapshot" {
let cmd = @argparse.Command(
"demo",
flags=[FlagArg("verbose", short='v', action=Count, global=true)],
subcommands=[Command("run")],
)
try cmd.parse(argv=["run", "--oops"], env=Map([])) catch {
err =>
inspect(
err,
content=(
#|error: unexpected argument '--oops' found
#|
#|Usage: demo run [options]
#|
#|Options:
#| -h, --help Show help information.
#| -v, --verbose
#|
),
)
} noraise {
_ => panic()
}
}///|
test "value source precedence snapshots" {
let cmd = @argparse.Command("demo", options=[
OptionArg("level", env="LEVEL", default_values=["1"]),
])
inspect(
cmd.render_help(),
content=(
#|Usage: demo [options]
#|
#|Options:
#| -h, --help Show help information.
#| --level <level> [env: LEVEL] [default: 1]
#|
),
)
let from_default = try! cmd.parse(argv=[], env=Map([]))
@debug.debug_inspect(
from_default.values,
content=(
#|{ "level": ["1"] }
),
)
@debug.debug_inspect(
from_default.sources,
content=(
#|{ "level": Default }
),
)
let from_env = try! cmd.parse(argv=[], env={ "LEVEL": "2" })
@debug.debug_inspect(
from_env.values,
content=(
#|{ "level": ["2"] }
),
)
@debug.debug_inspect(
from_env.sources,
content=(
#|{ "level": Env }
),
)
let from_argv = try! cmd.parse(argv=["--level", "3"], env={ "LEVEL": "2" })
@debug.debug_inspect(
from_argv.values,
content=(
#|{ "level": ["3"] }
),
)
@debug.debug_inspect(
from_argv.sources,
content=(
#|{ "level": Argv }
),
)
}///|
test "option input forms snapshot" {
let cmd = @argparse.Command("demo", options=[OptionArg("count", short='c')])
inspect(
cmd.render_help(),
content=(
#|Usage: demo [options]
#|
#|Options:
#| -h, --help Show help information.
#| -c, --count <count>
#|
),
)
let long_split = try! cmd.parse(argv=["--count", "2"], env=Map([]))
@debug.debug_inspect(
long_split.values,
content=(
#|{ "count": ["2"] }
),
)
let long_inline = try! cmd.parse(argv=["--count=3"], env=Map([]))
@debug.debug_inspect(
long_inline.values,
content=(
#|{ "count": ["3"] }
),
)
let short_split = try! cmd.parse(argv=["-c", "4"], env=Map([]))
@debug.debug_inspect(
short_split.values,
content=(
#|{ "count": ["4"] }
),
)
let short_attached = try! cmd.parse(argv=["-c5"], env=Map([]))
@debug.debug_inspect(
short_attached.values,
content=(
#|{ "count": ["5"] }
),
)
}
///|
test "double-dash separator snapshot" {
let cmd = @argparse.Command("demo", positionals=[
PositionArg("tail", num_args=ValueRange(lower=0), allow_hyphen_values=true),
])
let parsed = try! cmd.parse(argv=["--", "--x", "-y"], env=Map([]))
@debug.debug_inspect(
parsed.values,
content=(
#|{ "tail": ["--x", "-y"] }
),
)
}///|
test "requires relationship success and failure snapshots" {
let cmd = @argparse.Command("demo", options=[
OptionArg("mode", requires=["config"]),
OptionArg("config"),
])
let ok = try! cmd.parse(
argv=["--mode", "fast", "--config", "cfg.toml"],
env=Map([]),
)
@debug.debug_inspect(
ok.values,
content=(
#|{ "mode": ["fast"], "config": ["cfg.toml"] }
),
)
try cmd.parse(argv=["--mode", "fast"], env=Map([])) catch {
err =>
inspect(
err,
content=(
#|error: the following required argument was not provided: 'config' (required by 'mode')
#|
#|Usage: demo [options]
#|
#|Options:
#| -h, --help Show help information.
#| --mode <mode>
#| --config <config>
#|
),
)
} noraise {
_ => panic()
}
}
///|
test "arg group required and exclusive failure snapshot" {
let cmd = @argparse.Command(
"demo",
groups=[
ArgGroup("mode", required=true, multiple=false, args=["fast", "slow"]),
],
flags=[FlagArg("fast"), FlagArg("slow")],
)
try cmd.parse(argv=[], env=Map([])) catch {
err =>
inspect(
err,
content=(
#|error: the following required arguments were not provided:
#| <--fast|--slow>
#|
#|Usage: demo [options]
#|
#|Options:
#| -h, --help Show help information.
#| --fast
#| --slow
#|
#|Groups:
#| mode [required] [exclusive] --fast, --slow
#|
),
)
} noraise {
_ => panic()
}
}
///|
test "subcommand required policy failure snapshot" {
let cmd = @argparse.Command("demo", subcommand_required=true, subcommands=[
Command("echo"),
])
try cmd.parse(argv=[], env=Map([])) catch {
err =>
inspect(
err,
content=(
#|error: the following required argument was not provided: 'subcommand'
#|
#|Usage: demo <command>
#|
#|Commands:
#| echo
#| help Print help for the subcommand(s).
#|
#|Options:
#| -h, --help Show help information.
#|
),
)
} noraise {
_ => panic()
}
}///|
test "conflicts_with success and failure snapshots" {
let cmd = @argparse.Command("demo", flags=[
FlagArg("verbose", conflicts_with=["quiet"]),
FlagArg("quiet"),
])
let ok = try! cmd.parse(argv=["--verbose"], env=Map([]))
@debug.debug_inspect(
ok.flags,
content=(
#|{ "verbose": true }
),
)
try cmd.parse(argv=["--verbose", "--quiet"], env=Map([])) catch {
err =>
inspect(
err,
content=(
#|error: conflicting arguments: verbose and quiet
#|
#|Usage: demo [options]
#|
#|Options:
#| -h, --help Show help information.
#| --verbose
#| --quiet
#|
),
)
} noraise {
_ => panic()
}
}///|
test "bounded non-last positional success snapshot" {
let cmd = @argparse.Command("demo", positionals=[
PositionArg("first", num_args=ValueRange(lower=1, upper=2)),
PositionArg("second", num_args=@argparse.ValueRange::single()),
])
let parsed = try! cmd.parse(argv=["a", "b", "c"], env=Map([]))
@debug.debug_inspect(
parsed.values,
content=(
#|{ "first": ["a", "b"], "second": ["c"] }
),
)
}
///|
test "bounded non-last positional failure snapshot" {
let cmd = @argparse.Command("demo", positionals=[
PositionArg("first", num_args=ValueRange(lower=1, upper=2)),
PositionArg("second", num_args=@argparse.ValueRange::single()),
])
try cmd.parse(argv=["a", "b", "c", "d"], env=Map([])) catch {
err =>
inspect(
err,
content=(
#|error: unexpected value 'd' for '<second>' found; no more were expected
#|
#|Usage: demo <first...> <second>
#|
#|Arguments:
#| first...
#| second
#|
#|Options:
#| -h, --help Show help information.
#|
),
)
} noraise {
_ => panic()
}
}///|
let cmd : @argparse.Command = Command(
"wrap",
options=[OptionArg("config"), OptionArg("mode")],
positionals=[
PositionArg(
"child_argv",
num_args=ValueRange(lower=0),
allow_hyphen_values=true,
),
],
)
///|
test "positional passthrough keeps child argv after double-dash snapshot" {
let parsed = try! cmd.parse(
argv=[
"--config", "cfg.toml", "--", "child", "--mode", "fast", "--", "--flag",
],
env=Map([]),
)
@debug.debug_inspect(
parsed.values,
content=(
#|{
#| "config": ["cfg.toml"],
#| "child_argv": ["child", "--mode", "fast", "--", "--flag"],
#|}
),
)
}
///|
test "without separator outer parser still consumes its own option names snapshot" {
let parsed = try! cmd.parse(
argv=["--config", "cfg.toml", "child", "--mode", "fast"],
env=Map([]),
)
@debug.debug_inspect(
parsed.values,
content=(
#|{ "config": ["cfg.toml"], "mode": ["fast"], "child_argv": ["child"] }
),
)
}#alias(new, deprecated="Use `Command()` instead")
fn Command::Command(name : StringView, flags? : ArrayView[FlagArg], options? : ArrayView[OptionArg], positionals? : ArrayView[PositionArg], subcommands? : ArrayView[Command], about? : StringView, version? : StringView, disable_help_flag? : Bool, disable_version_flag? : Bool, disable_help_subcommand? : Bool, arg_required_else_help? : Bool, subcommand_required? : Bool, hidden? : Bool, groups? : ArrayView[ArgGroup], default_subcommand? : StringView) -> Command#alias(new, deprecated="Use `FlagArg()` instead")
fn FlagArg::FlagArg(name : StringView, short? : Char, long? : StringView, about? : StringView, action? : FlagAction, env? : StringView, requires? : ArrayView[String], conflicts_with? : ArrayView[String], required? : Bool, global? : Bool, negatable? : Bool, hidden? : Bool) -> FlagArg#alias(new, deprecated="Use `OptionArg()` instead")
fn OptionArg::OptionArg(name : StringView, short? : Char, long? : StringView, about? : StringView, action? : OptionAction, env? : StringView, default_values? : ArrayView[String], allow_hyphen_values? : Bool, requires? : ArrayView[String], conflicts_with? : ArrayView[String], required? : Bool, global? : Bool, hidden? : Bool) -> OptionArg#alias(new, deprecated="Use `PositionArg()` instead")
fn PositionArg::PositionArg(name : StringView, about? : StringView, env? : StringView, default_values? : ArrayView[String], num_args? : ValueRange, allow_hyphen_values? : Bool, requires? : ArrayView[String], conflicts_with? : ArrayView[String], global? : Bool, hidden? : Bool) -> PositionArg#alias(new, deprecated="Use `ValueRange()` instead")
fn ValueRange::ValueRange(lower? : Int, upper? : Int) -> ValueRangeInstall
Installed by default