Add tests in espanso-detect win32
This commit is contained in:
parent
b16d1a04ae
commit
b5e2d42ec4
63
Cargo.lock
generated
63
Cargo.lock
generated
|
@ -10,6 +10,17 @@ name = "cfg-if"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "enum-as-inner"
|
||||||
|
version = "0.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"heck 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"quote 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"syn 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "espanso"
|
name = "espanso"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
|
@ -22,10 +33,19 @@ name = "espanso-detect"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"enum-as-inner 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.4.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"widestring 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"widestring 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "heck"
|
||||||
|
version = "0.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-segmentation 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.4.14"
|
version = "0.4.14"
|
||||||
|
@ -34,6 +54,42 @@ dependencies = [
|
||||||
"cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.24"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "1.0.60"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"quote 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-segmentation"
|
||||||
|
version = "1.7.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-xid"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "widestring"
|
name = "widestring"
|
||||||
version = "0.4.3"
|
version = "0.4.3"
|
||||||
|
@ -42,5 +98,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
[metadata]
|
[metadata]
|
||||||
"checksum cc 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48"
|
"checksum cc 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48"
|
||||||
"checksum cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
"checksum cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
"checksum enum-as-inner 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7c5f0096a91d210159eceb2ff5e1c4da18388a170e1e3ce948aac9c8fdbbf595"
|
||||||
|
"checksum heck 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac"
|
||||||
"checksum log 0.4.14 (registry+https://github.com/rust-lang/crates.io-index)" = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
|
"checksum log 0.4.14 (registry+https://github.com/rust-lang/crates.io-index)" = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
|
||||||
|
"checksum proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
||||||
|
"checksum quote 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"
|
||||||
|
"checksum syn 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)" = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081"
|
||||||
|
"checksum unicode-segmentation 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796"
|
||||||
|
"checksum unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||||
"checksum widestring 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c"
|
"checksum widestring 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c"
|
||||||
|
|
|
@ -12,4 +12,7 @@ log = "0.4.14"
|
||||||
widestring = "0.4.3"
|
widestring = "0.4.3"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
cc = "1.0.66"
|
cc = "1.0.66"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
enum-as-inner = "0.3.3"
|
|
@ -16,14 +16,17 @@
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with espanso. If not, see <https://www.gnu.org/licenses/>.
|
* along with espanso. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
#[cfg(test)]
|
||||||
#[derive(Debug)]
|
use enum_as_inner::EnumAsInner;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
#[cfg_attr(test, derive(EnumAsInner))]
|
||||||
pub enum InputEvent {
|
pub enum InputEvent {
|
||||||
Mouse(MouseEvent),
|
Mouse(MouseEvent),
|
||||||
Keyboard(KeyboardEvent),
|
Keyboard(KeyboardEvent),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum MouseButton {
|
pub enum MouseButton {
|
||||||
Left,
|
Left,
|
||||||
Right,
|
Right,
|
||||||
|
@ -35,25 +38,25 @@ pub enum MouseButton {
|
||||||
Button5,
|
Button5,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct MouseEvent {
|
pub struct MouseEvent {
|
||||||
pub button: MouseButton,
|
pub button: MouseButton,
|
||||||
pub status: Status,
|
pub status: Status,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum Status {
|
pub enum Status {
|
||||||
Pressed,
|
Pressed,
|
||||||
Released,
|
Released,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum Variant {
|
pub enum Variant {
|
||||||
Left,
|
Left,
|
||||||
Right,
|
Right,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct KeyboardEvent {
|
pub struct KeyboardEvent {
|
||||||
pub key: Key,
|
pub key: Key,
|
||||||
pub value: Option<String>,
|
pub value: Option<String>,
|
||||||
|
@ -62,7 +65,7 @@ pub struct KeyboardEvent {
|
||||||
}
|
}
|
||||||
|
|
||||||
// A subset of the Web's key values: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values
|
// A subset of the Web's key values: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values
|
||||||
#[derive(Debug)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum Key {
|
pub enum Key {
|
||||||
// Modifiers
|
// Modifiers
|
||||||
Alt,
|
Alt,
|
||||||
|
|
|
@ -20,12 +20,4 @@
|
||||||
pub mod event;
|
pub mod event;
|
||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
pub mod win32;
|
pub mod win32;
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
#[test]
|
|
||||||
fn it_works() {
|
|
||||||
assert_eq!(2 + 2, 5);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -25,8 +25,8 @@ use crate::event::Variant::*;
|
||||||
use crate::event::{InputEvent, Key, KeyboardEvent, Variant};
|
use crate::event::{InputEvent, Key, KeyboardEvent, Variant};
|
||||||
use crate::event::{Key::*, MouseButton, MouseEvent};
|
use crate::event::{Key::*, MouseButton, MouseEvent};
|
||||||
|
|
||||||
const LEFT_VARIANT: i32 = 1;
|
const INPUT_LEFT_VARIANT: i32 = 1;
|
||||||
const RIGHT_VARIANT: i32 = 2;
|
const INPUT_RIGHT_VARIANT: i32 = 2;
|
||||||
|
|
||||||
const INPUT_EVENT_TYPE_KEYBOARD: i32 = 1;
|
const INPUT_EVENT_TYPE_KEYBOARD: i32 = 1;
|
||||||
const INPUT_EVENT_TYPE_MOUSE: i32 = 2;
|
const INPUT_EVENT_TYPE_MOUSE: i32 = 2;
|
||||||
|
@ -72,9 +72,7 @@ pub struct Win32Source {
|
||||||
|
|
||||||
impl Win32Source {
|
impl Win32Source {
|
||||||
pub fn new(callback: Win32SourceCallback) -> Win32Source {
|
pub fn new(callback: Win32SourceCallback) -> Win32Source {
|
||||||
Self {
|
Self { callback }
|
||||||
callback
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
pub fn eventloop(&self) {
|
pub fn eventloop(&self) {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -87,10 +85,7 @@ impl Win32Source {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
raw_eventloop(
|
raw_eventloop(self as *const Win32Source, callback);
|
||||||
self as *const Win32Source,
|
|
||||||
callback,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -110,8 +105,8 @@ impl From<RawInputEvent> for Option<InputEvent> {
|
||||||
|
|
||||||
// If the raw event does not include an explicit variant, use the hint provided by the key code
|
// If the raw event does not include an explicit variant, use the hint provided by the key code
|
||||||
let variant = match raw.variant {
|
let variant = match raw.variant {
|
||||||
LEFT_VARIANT => Some(Left),
|
INPUT_LEFT_VARIANT => Some(Left),
|
||||||
RIGHT_VARIANT => Some(Right),
|
INPUT_RIGHT_VARIANT => Some(Right),
|
||||||
_ => variant_hint,
|
_ => variant_hint,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -235,3 +230,82 @@ fn raw_to_mouse_button(raw: i32) -> Option<MouseButton> {
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
fn default_raw_input_event() -> RawInputEvent {
|
||||||
|
RawInputEvent {
|
||||||
|
event_type: INPUT_EVENT_TYPE_KEYBOARD,
|
||||||
|
buffer: [0; 24],
|
||||||
|
buffer_len: 0,
|
||||||
|
key_code: 0,
|
||||||
|
variant: INPUT_LEFT_VARIANT,
|
||||||
|
status: INPUT_STATUS_PRESSED,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn raw_to_input_event_keyboard_works_correctly() {
|
||||||
|
let wide_string = widestring::WideString::from("k".to_string());
|
||||||
|
let mut buffer: [u16; 24] = [0; 24];
|
||||||
|
buffer[..1].copy_from_slice(wide_string.as_slice());
|
||||||
|
|
||||||
|
let mut raw = default_raw_input_event();
|
||||||
|
raw.buffer = buffer;
|
||||||
|
raw.buffer_len = 1;
|
||||||
|
raw.status = INPUT_STATUS_RELEASED;
|
||||||
|
raw.variant = 0;
|
||||||
|
raw.key_code = 0x4B;
|
||||||
|
|
||||||
|
let result: Option<InputEvent> = raw.into();
|
||||||
|
assert_eq!(result.unwrap(), InputEvent::Keyboard(KeyboardEvent {
|
||||||
|
key: Other(0x4B),
|
||||||
|
status: Released,
|
||||||
|
value: Some("k".to_string()),
|
||||||
|
variant: None,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn raw_to_input_event_mouse_works_correctly() {
|
||||||
|
|
||||||
|
let mut raw = default_raw_input_event();
|
||||||
|
raw.event_type = INPUT_EVENT_TYPE_MOUSE;
|
||||||
|
raw.status = INPUT_STATUS_RELEASED;
|
||||||
|
raw.variant = 0;
|
||||||
|
raw.key_code = INPUT_MOUSE_RIGHT_BUTTON;
|
||||||
|
|
||||||
|
let result: Option<InputEvent> = raw.into();
|
||||||
|
assert_eq!(result.unwrap(), InputEvent::Mouse(MouseEvent {
|
||||||
|
status: Released,
|
||||||
|
button: MouseButton::Right,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn raw_to_input_invalid_buffer() {
|
||||||
|
let buffer: [u16; 24] = [123; 24];
|
||||||
|
|
||||||
|
let mut raw = default_raw_input_event();
|
||||||
|
raw.buffer = buffer;
|
||||||
|
raw.buffer_len = 5;
|
||||||
|
|
||||||
|
let result: Option<InputEvent> = raw.into();
|
||||||
|
assert!(result.unwrap().into_keyboard().unwrap().value.is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn raw_to_input_event_returns_none_when_missing_type() {
|
||||||
|
let result: Option<InputEvent> = RawInputEvent {
|
||||||
|
event_type: 0, // Missing type
|
||||||
|
buffer: [0; 24],
|
||||||
|
buffer_len: 0,
|
||||||
|
key_code: 123,
|
||||||
|
variant: INPUT_LEFT_VARIANT,
|
||||||
|
status: INPUT_STATUS_PRESSED,
|
||||||
|
}.into();
|
||||||
|
assert!(result.is_none());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user