use crate::helpers::{ assert_exit, run_clm, run_clm_with_env, stderr };
#[ test ]
fn tc311_unknown_command_error_mentions_available()
{
let out = run_clm( &[ ".nonexistent" ] );
assert_exit( &out, 1 );
let err = stderr( &out );
assert!(
err.contains( "unknown command" ) || err.contains( "Error" ),
"unknown command error must be informative: {err}"
);
}
#[ test ]
fn tc312_unknown_param_error()
{
let out = run_clm( &[ ".status", "bogus::1" ] );
assert_exit( &out, 1 );
let err = stderr( &out );
assert!(
err.to_lowercase().contains( "unknown parameter" ),
"unknown param error must mention unknown parameter: {err}"
);
}
#[ test ]
fn tc313_unknown_param_exits_1()
{
let out = run_clm( &[ ".status", "bogus::x" ] );
assert_exit( &out, 1 );
}
#[ test ]
fn tc314_verbosity_out_of_range_error_message()
{
let out = run_clm( &[ ".status", "v::3" ] );
assert_exit( &out, 1 );
let err = stderr( &out );
assert!(
err.contains( "0, 1, or 2" ) || err.contains( "out of range" ),
"verbosity error must mention range: {err}"
);
}
#[ test ]
fn tc316_format_unknown_error_mentions_valid()
{
let out = run_clm( &[ ".status", "format::xml" ] );
assert_exit( &out, 1 );
let err = stderr( &out );
assert!(
err.contains( "text" ) && err.contains( "json" ),
"format error must mention text/json: {err}"
);
}
#[ test ]
fn tc317_settings_get_missing_key_error_contains_key()
{
let out = run_clm( &[ ".settings.get" ] );
assert_exit( &out, 1 );
let err = stderr( &out );
assert!( err.contains( "key" ), "error must mention key: {err}" );
}
#[ test ]
fn tc318_settings_set_missing_value_error_contains_value()
{
let out = run_clm( &[ ".settings.set", "key::k" ] );
assert_exit( &out, 1 );
let err = stderr( &out );
assert!( err.contains( "value" ), "error must mention value: {err}" );
}
#[ test ]
fn tc320a_settings_show_no_home_error_mentions_home()
{
let out = run_clm_with_env( &[ ".settings.show" ], &[ ( "HOME", "" ) ] );
assert_exit( &out, 2 );
let err = stderr( &out );
assert!( err.contains( "HOME" ), "error must mention HOME: {err}" );
}
#[ test ]
fn tc320b_settings_show_home_unset_error_mentions_home()
{
let out = run_clm_with_env( &[ ".settings.show" ], &[ ( "HOME", "" ) ] );
assert_exit( &out, 2 );
let err = stderr( &out );
assert!( err.contains( "HOME" ), "HOME-absent error must mention HOME: {err}" );
assert!(
!err.contains( "path resolution failed" ),
"HOME-absent error must not mention path resolution: {err}",
);
}
#[ test ]
fn tc322_version_show_no_claude_error()
{
let dir = tempfile::TempDir::new().unwrap();
let fake_home = dir.path().to_str().unwrap();
let out = run_clm_with_env(
&[ ".version.show" ],
&[ ( "PATH", "" ), ( "HOME", fake_home ) ],
);
assert_exit( &out, 2 );
let err = stderr( &out );
assert!(
err.contains( "PATH" ) || err.contains( "not found" ),
"error must mention PATH or not found: {err}"
);
}
#[ test ]
fn tc323_version_install_wrong_case_error()
{
let out = run_clm( &[ ".version.install", "version::STABLE" ] );
assert_exit( &out, 1 );
let err = stderr( &out );
assert!(
err.contains( "STABLE" ) || err.contains( "version" ),
"error must mention the invalid version: {err}"
);
}
#[ test ]
fn tc324_settings_get_absent_key_error_mentions_key()
{
let dir = tempfile::TempDir::new().unwrap();
let claude_dir = dir.path().join( ".claude" );
std::fs::create_dir_all( &claude_dir ).unwrap();
std::fs::write( claude_dir.join( "settings.json" ), "{}" ).unwrap();
let out = run_clm_with_env(
&[ ".settings.get", "key::absent_key" ],
&[ ( "HOME", dir.path().to_str().unwrap() ) ],
);
assert_exit( &out, 2 );
let err = stderr( &out );
assert!( err.contains( "absent_key" ), "error must mention the key name: {err}" );
}
#[ test ]
fn tc326_first_arg_param_syntax_exits_1()
{
let out = run_clm( &[ "::value" ] );
assert_exit( &out, 1 );
}