rktk-keymanager 0.2.0

Keymap/state manager for self-made keyboard firmware
Documentation
use super::super::prelude::*;
use pretty_assertions::assert_eq;

#[test]
fn tap_dance_tap1() {
    let mut keymap = EMPTY_KEYMAP;
    keymap.layers[0].keymap[0][0] = KeyAction::TapDance(0);

    let mut state = new_state(keymap);
    let _ = update!(state, time(0));

    let report = update!(state, time(0), (0, 0, true));
    let expected = NONE_REPORT;
    assert_eq!(
        report, expected,
        "TapDance key pressed. nothing happens yet"
    );
    let report = update!(state, time(0), (0, 0, false));
    let expected = NONE_REPORT;
    assert_eq!(
        report, expected,
        "TapDance key released. nothing happens yet"
    );

    let report = update!(state, time(50));
    let expected = NONE_REPORT;
    assert_eq!(
        report, expected,
        "TapDance key released but dance tapping term not exceeded. nothing happens yet."
    );

    let report = state.update(InputEvent::None, time(150));
    let mut expected = KEYBOARD_ONLY_REPORT;
    expected.keyboard_report.as_mut().unwrap().keycodes = [0x04, 0, 0, 0, 0, 0];
    assert_eq!(
        report, expected,
        "tap dance term exceeded. tap key should be sent"
    );
}

#[test]
fn tap_dance_hold1() {
    let mut keymap = EMPTY_KEYMAP;
    keymap.layers[0].keymap[0][0] = KeyAction::TapDance(0);

    let mut state = new_state(keymap);
    let _ = update!(state, time(0));

    let report = update!(state, time(0), (0, 0, true));
    let expected = NONE_REPORT;
    assert_eq!(
        report, expected,
        "TapDance key pressed. nothing happens yet"
    );

    let report = state.update(InputEvent::None, time(600));
    let mut expected = KEYBOARD_ONLY_REPORT;
    expected.keyboard_report.as_mut().unwrap().modifier = 0x01;
    assert_eq!(
        report, expected,
        "tapping term exceeded. hold key should be sent"
    );

    let report = update!(state, time(0), (0, 0, false));
    let expected = KEYBOARD_ONLY_REPORT;
    assert_eq!(report, expected, "key released");
}

#[test]
fn tap_dance_tap2() {
    let mut keymap = EMPTY_KEYMAP;
    keymap.layers[0].keymap[0][0] = KeyAction::TapDance(0);

    let mut state = new_state(keymap);
    let _ = update!(state, time(0));

    let report = update!(state, time(0), (0, 0, true));
    let expected = NONE_REPORT;
    assert_eq!(
        report, expected,
        "TapDance key pressed for the first time. nothing happens yet"
    );
    let report = update!(state, time(0), (0, 0, false));
    let expected = NONE_REPORT;
    assert_eq!(
        report, expected,
        "TapDance key released for the first time. nothing happens yet"
    );

    let report = update!(state, time(50), (0, 0, true));
    let expected = NONE_REPORT;
    assert_eq!(
        report, expected,
        "TapDance key pressed one more. nothing happens yet"
    );

    let report = update!(state, time(50), (0, 0, false));
    let expected = NONE_REPORT;
    assert_eq!(
        report, expected,
        "TapDance key released one more. nothing happens yet"
    );

    let report = state.update(InputEvent::None, time(250));
    let mut expected = KEYBOARD_ONLY_REPORT;
    expected.keyboard_report.as_mut().unwrap().keycodes = [0x05, 0, 0, 0, 0, 0];
    assert_eq!(
        report, expected,
        "tap dance term exceeded. tap key should be sent"
    );
}

#[test]
fn tap_dance_hold2() {
    let mut keymap = EMPTY_KEYMAP;
    keymap.layers[0].keymap[0][0] = KeyAction::TapDance(0);

    let mut state = new_state(keymap);
    let _ = update!(state, time(0));

    let _ = update!(state, time(0), (0, 0, true));
    let _ = update!(state, time(0), (0, 0, false));

    let _ = update!(state, time(50), (0, 0, true));

    let report = state.update(InputEvent::None, time(600));
    assert_eq!(report.highest_layer, 1, "hold2");
}

#[test]
fn tap_dance_tap3() {
    let mut keymap = EMPTY_KEYMAP;
    keymap.layers[0].keymap[0][0] = KeyAction::TapDance(0);

    let mut state = new_state(keymap);
    let _ = update!(state, time(0));

    let _ = update!(state, time(0), (0, 0, true));
    let _ = update!(state, time(0), (0, 0, false));

    let _ = update!(state, time(50), (0, 0, true));
    let _ = update!(state, time(50), (0, 0, false));

    let _ = update!(state, time(100), (0, 0, true));
    let _ = update!(state, time(100), (0, 0, false));

    let report = state.update(InputEvent::None, time(700));
    assert_eq!(report.highest_layer, 2, "tap3");
}