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());
+ }
+}