use unilang_parser::cli_parser::{ parse_cli_args, CliParams, CliParseResult };
#[derive(Default, Debug, Clone, PartialEq, Eq)]
struct TestParams
{
scope: Option< String >,
format: Option< String >,
}
impl CliParams for TestParams
{
fn process_param( &mut self, key: &str, value: &str ) -> Result< bool, String >
{
match key
{
"scope" => { self.scope = Some( value.to_string() ); }
"format" => { self.format = Some( value.to_string() ); }
_ => return Ok( false ), }
Ok( true )
}
fn validate( &self ) -> Result< (), String >
{
Ok( () )
}
}
#[test]
fn malformed_scope_single_colon()
{
let args = vec![ "scope:local".to_string() ];
let result: Result< CliParseResult< TestParams >, String > = parse_cli_args( &args );
assert!( result.is_err(), "Single-colon parameter should be rejected" );
let err = result.unwrap_err();
assert!(
err.contains( "parameter" ) || err.contains( "syntax" ) || err.contains( "::" ),
"Error should mention parameter syntax or :: separator. Got: {err}"
);
}
#[test]
fn malformed_format_single_colon()
{
let args = vec![ "format:tree".to_string() ];
let result: Result< CliParseResult< TestParams >, String > = parse_cli_args( &args );
assert!( result.is_err(), "Single-colon parameter should be rejected" );
let err = result.unwrap_err();
assert!(
err.contains( "parameter" ) || err.contains( "syntax" ) || err.contains( "::" ),
"Error should mention parameter syntax or :: separator. Got: {err}"
);
}
#[test]
fn valid_scope_double_colon()
{
let args = vec![ "scope::local".to_string() ];
let result: Result< CliParseResult< TestParams >, String > = parse_cli_args( &args );
assert!( result.is_ok(), "Valid double-colon syntax should succeed" );
let parsed = result.unwrap();
assert_eq!( parsed.params.scope, Some( "local".to_string() ) );
assert_eq!( parsed.message, "" );
}
#[test]
fn valid_format_double_colon()
{
let args = vec![ "format::list".to_string() ];
let result: Result< CliParseResult< TestParams >, String > = parse_cli_args( &args );
assert!( result.is_ok(), "Valid double-colon syntax should succeed" );
let parsed = result.unwrap();
assert_eq!( parsed.params.format, Some( "list".to_string() ) );
assert_eq!( parsed.message, "" );
}
#[test]
fn mixed_valid_params_and_message()
{
let args = vec![
"scope::local".to_string(),
"format::tree".to_string(),
"this".to_string(),
"is".to_string(),
"message".to_string(),
];
let result: Result< CliParseResult< TestParams >, String > = parse_cli_args( &args );
assert!( result.is_ok(), "Valid syntax with message should succeed" );
let parsed = result.unwrap();
assert_eq!( parsed.params.scope, Some( "local".to_string() ) );
assert_eq!( parsed.params.format, Some( "tree".to_string() ) );
assert_eq!( parsed.message, "this is message" );
}
#[test]
fn malformed_before_message()
{
let args = vec![
"scope:local".to_string(),
"valid".to_string(),
"message".to_string(),
];
let result: Result< CliParseResult< TestParams >, String > = parse_cli_args( &args );
assert!( result.is_err(), "Should reject malformed parameter before message" );
let err = result.unwrap_err();
assert!(
err.contains( "parameter" ) || err.contains( "syntax" ) || err.contains( "::" ),
"Error should mention parameter syntax. Got: {err}"
);
}