use super::*; fn parse(text: &str) -> Result { parse_accel(text, Span::new(0, text.len())) } #[test] fn modifiers_and_a_key() { let accel = parse("Ctrl+S").expect("valid"); assert_eq!(accel.key, AccelKey::Character("S".to_owned())); assert!(accel.ctrl && !accel.shift && !accel.alt && !accel.logo); let accel = parse("Ctrl+Shift+P").expect("valid"); assert!(accel.ctrl && accel.shift); assert_eq!(accel.key, AccelKey::Character("P".to_owned())); } #[test] fn a_bare_key_needs_no_modifiers() { assert_eq!(parse("Delete").expect("valid").key, AccelKey::Delete); assert_eq!( parse("F").expect("valid").key, AccelKey::Character("F".to_owned()) ); } #[test] fn spelling_is_normalized_not_preserved() { // However it was written, the item renders one canonical form, and two // spellings of the same accelerator are the same accelerator. assert_eq!(parse("ctrl+s").unwrap(), parse("Ctrl+S").unwrap()); assert_eq!(parse("CONTROL + s").unwrap(), parse("Ctrl+S").unwrap()); assert_eq!(parse("shift+ctrl+s").unwrap().display(), "Ctrl+Shift+S"); assert_eq!(parse("cmd+Left").unwrap().display(), "Super+Left"); assert_eq!(parse("Return").unwrap().display(), "Enter"); } #[test] fn malformed_accelerators_are_pointed() { for (text, want) in [ ("Ctrl", "only modifiers"), ("Ctrl+", "empty part"), ("Ctrl+S+P", "more than one key"), ("Ctrl+Ctrl+S", "appears twice"), ("Ctrl+Nope", "neither a modifier nor a key name"), ] { let error = parse(text).expect_err(text); assert!( error.message.contains(want), "`{text}`: wanted {want:?}, got: {}", error.message ); } }