use unilang_parser :: { Parser, UnilangParserOptions };
fn parse_and_assert( input: &str, expected_path: &[ &str ], expected_args: &[ &str ] )
{
let options = UnilangParserOptions ::default();
let parser = Parser ::new( options ); let instruction = parser.parse_repl_input( input ).unwrap(); assert_eq!( instruction.command_path_slices, expected_path );
assert_eq!( instruction.positional_arguments.len(), expected_args.len() );
for ( i, expected_arg ) in expected_args.iter().enumerate()
{
assert_eq!( instruction.positional_arguments[ i ].value, (*expected_arg).to_string() );
}
}
#[ test ]
fn parses_dotted_prefix_command_path_correctly()
{
parse_and_assert( ".test.command arg1", &[ "test", "command" ], &[ "arg1" ] );
}
#[ test ]
fn parses_simple_command_path_correctly()
{
parse_and_assert( "command arg1", &[ "command" ], &[ "arg1" ] );
}
#[ test ]
fn parses_leading_dot_command_path_correctly()
{
parse_and_assert( ".command arg1", &[ "command" ], &[ "arg1" ] );
}
#[ test ]
fn parses_infix_dot_command_path_correctly()
{
parse_and_assert( "command.sub arg1", &[ "command", "sub" ], &[ "arg1" ] );
}
#[ test ]
fn parses_command_only_correctly()
{
parse_and_assert( "command", &[ "command" ], &[ ] );
}
#[ test ]
fn rejects_kebab_case_in_command_path()
{
let parser = Parser ::new( UnilangParserOptions ::default() );
let input = "cmd.my-sub.command arg1";
let result = parser.parse_repl_input( input );
assert!( result.is_err(), "Expected error for kebab-case in command path" );
if let Err( e ) = result
{
assert!( matches!( e.kind, ErrorKind ::Syntax( _ ) ) );
assert!( e
.to_string()
.contains( "Invalid character '-' in command path segment 'my-sub'" ) );
}
}
use unilang_parser ::error ::ErrorKind;