use link_cli::cli::{Cli, CliCommand};
fn parse_run(args: &[&str]) -> Cli {
match Cli::parse_from(args).expect("CLI arguments should parse") {
CliCommand::Run(cli) => cli,
other => panic!("expected run command, got {other:?}"),
}
}
#[test]
fn parses_csharp_option_aliases_without_direct_clap_dependency() {
let cli = parse_run(&[
"clink",
"--data-source",
"links.db",
"--apply",
"(1 2)",
"--links",
"--import",
"input.lino",
"--out",
"dump.lino",
"-b",
"-c",
"-t",
"--auto-create-missing-references",
"-s",
"42",
]);
assert_eq!(cli.db, "links.db");
assert_eq!(cli.query.as_deref(), Some("(1 2)"));
assert!(cli.after);
assert!(cli.before);
assert!(cli.changes);
assert!(cli.trace);
assert!(cli.auto_create_missing_references);
assert_eq!(cli.structure, Some(42));
assert_eq!(cli.lino_input.as_deref(), Some("input.lino"));
assert_eq!(cli.lino_output.as_deref(), Some("dump.lino"));
}
#[test]
fn query_option_takes_precedence_over_positional_query() {
let cli = parse_run(&["clink", "--query", "(1 2)", "(3 4)"]);
assert_eq!(cli.query.as_deref(), Some("(1 2)"));
assert_eq!(cli.query_arg.as_deref(), Some("(3 4)"));
}
#[test]
fn parses_inline_alias_values_and_boolean_values() {
let cli = parse_run(&[
"clink",
"--data=db.bin",
"--do=(5 6)",
"--trace=false",
"--auto-create-missing-references=true",
"--before=true",
"--changes=on",
"--after=0",
"--lino-input=input.lino",
"--lino-output=links.lino",
]);
assert_eq!(cli.db, "db.bin");
assert_eq!(cli.query.as_deref(), Some("(5 6)"));
assert!(!cli.trace);
assert!(cli.auto_create_missing_references);
assert!(cli.before);
assert!(cli.changes);
assert!(!cli.after);
assert_eq!(cli.lino_input.as_deref(), Some("input.lino"));
assert_eq!(cli.lino_output.as_deref(), Some("links.lino"));
}
#[test]
fn parses_export_alias_as_lino_output_path() {
let cli = parse_run(&["clink", "--export", "database.lino"]);
assert_eq!(cli.lino_output.as_deref(), Some("database.lino"));
}
#[test]
fn parses_inline_export_alias_as_lino_output_path() {
let cli = parse_run(&["clink", "--export=database.lino"]);
assert_eq!(cli.lino_output.as_deref(), Some("database.lino"));
}
#[test]
fn returns_help_and_version_commands() {
assert_eq!(
Cli::parse_from(["clink", "--help"]).expect("help should parse"),
CliCommand::Help
);
assert_eq!(
Cli::parse_from(["clink", "--version"]).expect("version should parse"),
CliCommand::Version
);
}
#[test]
fn rejects_extra_positional_queries() {
let error = Cli::parse_from(["clink", "(1 2)", "(3 4)"]).expect_err("extra query should fail");
assert!(error.to_string().contains("unexpected extra positional"));
}