diff --git a/Cargo.lock b/Cargo.lock index ec12c96..0725ab5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,6 +10,17 @@ name = "cfg-if" version = "1.0.0" 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]] name = "espanso" version = "1.0.0" @@ -22,10 +33,19 @@ name = "espanso-detect" version = "0.1.0" dependencies = [ "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)", "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]] name = "log" version = "0.4.14" @@ -34,6 +54,42 @@ dependencies = [ "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]] name = "widestring" version = "0.4.3" @@ -42,5 +98,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "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 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 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" diff --git a/espanso-detect/Cargo.toml b/espanso-detect/Cargo.toml index 3d8ae90..621e651 100644 --- a/espanso-detect/Cargo.toml +++ b/espanso-detect/Cargo.toml @@ -12,4 +12,7 @@ log = "0.4.14" widestring = "0.4.3" [build-dependencies] -cc = "1.0.66" \ No newline at end of file +cc = "1.0.66" + +[dev-dependencies] +enum-as-inner = "0.3.3" \ No newline at end of file diff --git a/espanso-detect/src/event.rs b/espanso-detect/src/event.rs index 4f0315c..c110e7a 100644 --- a/espanso-detect/src/event.rs +++ b/espanso-detect/src/event.rs @@ -16,14 +16,17 @@ * You should have received a copy of the GNU General Public License * along with espanso. If not, see . */ - -#[derive(Debug)] +#[cfg(test)] +use enum_as_inner::EnumAsInner; + +#[derive(Debug, PartialEq)] +#[cfg_attr(test, derive(EnumAsInner))] pub enum InputEvent { Mouse(MouseEvent), Keyboard(KeyboardEvent), } -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub enum MouseButton { Left, Right, @@ -35,25 +38,25 @@ pub enum MouseButton { Button5, } -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub struct MouseEvent { pub button: MouseButton, pub status: Status, } -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub enum Status { Pressed, Released, } -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub enum Variant { Left, Right, } -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub struct KeyboardEvent { pub key: Key, pub value: Option, @@ -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 -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub enum Key { // Modifiers Alt, diff --git a/espanso-detect/src/lib.rs b/espanso-detect/src/lib.rs index 9543e4d..4f50a52 100644 --- a/espanso-detect/src/lib.rs +++ b/espanso-detect/src/lib.rs @@ -20,12 +20,4 @@ pub mod event; #[cfg(target_os = "windows")] -pub mod win32; - -#[cfg(test)] -mod tests { - #[test] - fn it_works() { - assert_eq!(2 + 2, 5); - } -} +pub mod win32; \ No newline at end of file diff --git a/espanso-detect/src/win32/mod.rs b/espanso-detect/src/win32/mod.rs index f67fcf7..09d5401 100644 --- a/espanso-detect/src/win32/mod.rs +++ b/espanso-detect/src/win32/mod.rs @@ -25,8 +25,8 @@ use crate::event::Variant::*; use crate::event::{InputEvent, Key, KeyboardEvent, Variant}; use crate::event::{Key::*, MouseButton, MouseEvent}; -const LEFT_VARIANT: i32 = 1; -const RIGHT_VARIANT: i32 = 2; +const INPUT_LEFT_VARIANT: i32 = 1; +const INPUT_RIGHT_VARIANT: i32 = 2; const INPUT_EVENT_TYPE_KEYBOARD: i32 = 1; const INPUT_EVENT_TYPE_MOUSE: i32 = 2; @@ -72,9 +72,7 @@ pub struct Win32Source { impl Win32Source { pub fn new(callback: Win32SourceCallback) -> Win32Source { - Self { - callback - } + Self { callback } } pub fn eventloop(&self) { unsafe { @@ -87,10 +85,7 @@ impl Win32Source { } } - raw_eventloop( - self as *const Win32Source, - callback, - ); + raw_eventloop(self as *const Win32Source, callback); } } } @@ -110,8 +105,8 @@ impl From for Option { // If the raw event does not include an explicit variant, use the hint provided by the key code let variant = match raw.variant { - LEFT_VARIANT => Some(Left), - RIGHT_VARIANT => Some(Right), + INPUT_LEFT_VARIANT => Some(Left), + INPUT_RIGHT_VARIANT => Some(Right), _ => variant_hint, }; @@ -235,3 +230,82 @@ fn raw_to_mouse_button(raw: i32) -> Option { _ => 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 = 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 = 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 = 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 = 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()); + } +}