use crate::commands::InitMode;
use crate::commands::parse_init_mode;
use crate::init::InitFormat;
fn args(t: &[&str]) -> Vec<String> {
t.iter().map(|s| s.to_string()).collect()
}
#[test]
fn agent_without_value_is_error() {
let err = parse_init_mode(&args(&["--agent"])).expect_err("--agent without a value must error");
assert!(
err.contains("--agent"),
"error must name the --agent flag: {err:?}"
);
assert!(
err.contains("pi, claude-code"),
"error must name the supported values: {err:?}"
);
}
#[test]
fn agent_followed_by_flag_is_error() {
let err =
parse_init_mode(&args(&["--agent", "--global"])).expect_err("flag-like value must error");
assert!(
err.contains("--agent"),
"error must name the --agent flag: {err:?}"
);
assert!(
err.contains("pi, claude-code"),
"error must name the supported values: {err:?}"
);
}
#[test]
fn format_without_value_defaults_to_claude() {
let mode = parse_init_mode(&args(&["--format"])).expect("no value must fall back to claude");
assert_eq!(mode, InitMode::Format(InitFormat::Claude));
}
#[test]
fn agent_and_format_mutually_exclusive_any_order_any_value() {
for flag_order in [
&["--agent", "pi", "--format", "bogus"][..],
&["--format", "bogus", "--agent", "pi"][..],
&["--agent", "pi", "--format", "claude"][..],
&["--format", "generic", "--agent", "pi"][..],
&["--agent", "pi", "--format"][..],
] {
let err = parse_init_mode(&args(flag_order))
.expect_err("combining --agent and --format must error: {flag_order:?}");
assert!(
err.contains("--agent and --format"),
"error must name the conflicting flags ({flag_order:?}): {err:?}"
);
}
}
#[test]
fn global_without_agent_is_error() {
let err =
parse_init_mode(&args(&["--global"])).expect_err("--global without --agent must error");
assert!(
err.contains("--global"),
"error must name the --global flag: {err:?}"
);
}
#[test]
fn global_with_format_without_agent_is_error() {
let err = parse_init_mode(&args(&["--global", "--format", "generic"]))
.expect_err("--global with --format but no --agent must error");
assert!(
err.contains("--global"),
"error must name the --global flag: {err:?}"
);
}
#[test]
fn agent_pi_global_works_both_orders() {
for flag_order in [
&["--agent", "pi", "--global"][..],
&["--global", "--agent", "pi"][..],
] {
let mode = parse_init_mode(&args(flag_order))
.expect("--agent pi --global must parse: {flag_order:?}");
assert_eq!(mode, InitMode::Pi { global: true }, "order {flag_order:?}");
}
}
#[test]
fn unknown_flags_are_ignored() {
let mode = parse_init_mode(&args(&["--agent", "pi", "--bogus"]))
.expect("unknown flags must be ignored");
assert_eq!(mode, InitMode::Pi { global: false });
}
#[test]
fn unknown_flags_with_format_preserve_format_path() {
let mode = parse_init_mode(&args(&["--format", "generic", "--bogus"])).expect("must parse");
assert_eq!(mode, InitMode::Format(InitFormat::Generic));
}
#[test]
fn plain_init_is_claude() {
let mode = parse_init_mode(&args(&[])).expect("plain init must parse");
assert_eq!(mode, InitMode::Format(InitFormat::Claude));
}
#[test]
fn format_generic_unchanged() {
let mode = parse_init_mode(&args(&["--format", "generic"])).expect("must parse");
assert_eq!(mode, InitMode::Format(InitFormat::Generic));
}
#[test]
fn format_claude_unchanged() {
let mode = parse_init_mode(&args(&["--format", "claude"])).expect("must parse");
assert_eq!(mode, InitMode::Format(InitFormat::Claude));
}
#[test]
fn format_bogus_alone_falls_back_to_claude() {
let mode = parse_init_mode(&args(&["--format", "bogus"])).expect("bogus format must parse");
assert_eq!(
mode,
InitMode::Format(InitFormat::Claude),
"unknown --format value must fall back to claude"
);
}
#[test]
fn agent_pi_selects_pi_installer() {
let mode = parse_init_mode(&args(&["--agent", "pi"])).expect("must parse");
assert_eq!(mode, InitMode::Pi { global: false });
}
#[test]
fn agent_claude_code_selects_installer() {
let mode = parse_init_mode(&args(&["--agent", "claude-code"]))
.expect("--agent claude-code must parse");
assert_eq!(mode, InitMode::ClaudeCode { global: false });
}
#[test]
fn agent_claude_code_global_works_both_orders() {
for flag_order in [
&["--agent", "claude-code", "--global"][..],
&["--global", "--agent", "claude-code"][..],
] {
let mode = parse_init_mode(&args(flag_order))
.expect("--agent claude-code --global must parse: {flag_order:?}");
assert_eq!(
mode,
InitMode::ClaudeCode { global: true },
"order {flag_order:?}"
);
}
}
#[test]
fn agent_unknown_value_errors_naming_supported() {
let err = parse_init_mode(&args(&["--agent", "cursor"])).expect_err("unknown agent must error");
assert!(
err.contains("unknown --agent value 'cursor'"),
"message: {err:?}"
);
assert!(
err.contains("pi, claude-code"),
"error must name the supported values: {err:?}"
);
}