tests.rs raw

use super::*;

fn parse(text: &str) -> Result<AccelIr, Diagnostic> {
    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
        );
    }
}