mod cli_binary_test_helpers;
use cli_binary_test_helpers::run_cli;
#[ test ]
fn it1_tools_exits_zero()
{
let out = run_cli( &[ "tools" ] );
assert!(
out.status.success(),
"`clr tools` must exit 0. Got: {:?}",
out.status.code()
);
}
#[ test ]
fn it2_tools_lists_core_tools()
{
let out = run_cli( &[ "tools" ] );
assert!( out.status.success(), "`clr tools` must exit 0: {out:?}" );
let stdout = String::from_utf8_lossy( &out.stdout );
for tool in &[ "Read", "Write", "Edit", "Bash", "Agent" ]
{
assert!(
stdout.contains( tool ),
"`clr tools` stdout must contain '{tool}'. Got:\n{stdout}"
);
}
}
#[ test ]
fn it3_tools_lists_categories()
{
let out = run_cli( &[ "tools" ] );
assert!( out.status.success(), "`clr tools` must exit 0: {out:?}" );
let stdout = String::from_utf8_lossy( &out.stdout );
for cat in &[ "File Operations", "Shell", "Search", "Web" ]
{
assert!(
stdout.contains( cat ),
"`clr tools` stdout must contain category '{cat}'. Got:\n{stdout}"
);
}
}
#[ test ]
fn it4_tools_caption_present()
{
let out = run_cli( &[ "tools" ] );
assert!( out.status.success(), "`clr tools` must exit 0: {out:?}" );
let stdout = String::from_utf8_lossy( &out.stdout );
assert!(
stdout.contains( "Claude Code Tools" ),
"`clr tools` stdout must contain table caption 'Claude Code Tools'. Got:\n{stdout}"
);
assert!(
stdout.contains( "26" ),
"`clr tools` stdout must reference 26 tools. Got:\n{stdout}"
);
}
#[ test ]
fn it5_tools_help_exits_zero()
{
let out = run_cli( &[ "tools", "--help" ] );
assert!(
out.status.success(),
"`clr tools --help` must exit 0. Got: {:?}",
out.status.code()
);
let stdout = String::from_utf8_lossy( &out.stdout );
assert!(
stdout.contains( "tools" ),
"`clr tools --help` stdout must contain 'tools'. Got:\n{stdout}"
);
}
#[ test ]
fn it6_tools_lists_scheduling_and_mode_tools()
{
let out = run_cli( &[ "tools" ] );
assert!( out.status.success(), "`clr tools` must exit 0: {out:?}" );
let stdout = String::from_utf8_lossy( &out.stdout );
for tool in &[ "CronCreate", "CronDelete", "CronList", "EnterPlanMode", "ExitPlanMode" ]
{
assert!(
stdout.contains( tool ),
"`clr tools` stdout must contain '{tool}'. Got:\n{stdout}"
);
}
}
#[ test ]
fn it7_tools_listed_in_main_help()
{
let out = run_cli( &[ "--help" ] );
assert!( out.status.success(), "`clr --help` must exit 0: {out:?}" );
let stdout = String::from_utf8_lossy( &out.stdout );
assert!(
stdout.contains( "tools" ),
"`clr --help` stdout must mention 'tools' command. Got:\n{stdout}"
);
}
#[ test ]
fn it8_tools_short_help_flag()
{
let out = run_cli( &[ "tools", "-h" ] );
assert!(
out.status.success(),
"`clr tools -h` must exit 0. Got: {:?}",
out.status.code()
);
let stdout = String::from_utf8_lossy( &out.stdout );
assert!(
stdout.contains( "tools" ),
"`clr tools -h` stdout must contain 'tools'. Got:\n{stdout}"
);
}
#[ test ]
fn it9_tools_rejects_unknown_arg()
{
let out = run_cli( &[ "tools", "some-unknown-arg" ] );
assert!(
!out.status.success(),
"`clr tools some-unknown-arg` must exit non-zero. Got exit 0"
);
assert_eq!(
out.status.code(),
Some( 1 ),
"`clr tools some-unknown-arg` must exit 1. Got: {:?}",
out.status.code()
);
let stderr = String::from_utf8_lossy( &out.stderr );
assert!(
stderr.contains( "does not accept arguments" ),
"`clr tools some-unknown-arg` stderr must contain 'does not accept arguments'. Got:\n{stderr}"
);
}