use turkos_os_shell_dispatch::{decide, Builtin, Error, Route}; use turkos_os_shell_words::Words; #[test] fn os_shell_dispatch_exact_builtin_names_and_external_prefixes() { let cd = Words::<32, 3>::parse("cd /tmp").unwrap(); assert_eq!(decide(&cd).unwrap().route, Route::Builtin(Builtin::Cd)); let exit = Words::<32, 3>::parse("exit 0").unwrap(); assert_eq!(decide(&exit).unwrap().route, Route::Builtin(Builtin::Exit)); let help = Words::<32, 3>::parse("help").unwrap(); assert_eq!(decide(&help).unwrap().route, Route::Builtin(Builtin::Help)); let helpful = Words::<32, 3>::parse("helpful arg").unwrap(); assert_eq!(decide(&helpful).unwrap().route, Route::External("helpful")); let path = Words::<32, 3>::parse("/bin/echo hi").unwrap(); assert_eq!(decide(&path).unwrap().route, Route::External("/bin/echo")); } #[test] fn os_shell_dispatch_rejects_missing_and_invalid_names() { let empty = Words::<8, 2>::parse(" \t ").unwrap(); assert_eq!(decide(&empty), Err(Error::MissingCommand)); let quoted_empty = Words::<8, 2>::parse("''").unwrap(); assert_eq!(decide("ed_empty), Err(Error::InvalidName)); } #[test] fn os_shell_dispatch_enforces_builtin_arity() { for input in ["cd", "cd a b", "exit 0 1", "help extra"] { let words = Words::<32, 4>::parse(input).unwrap(); assert_eq!(decide(&words), Err(Error::BuiltinArity), "{input}"); } }