Skip to content

Commit 75a0506

Browse files
committed
test(wm): colocate tests with src files, add socket msg test
1 parent f40e80c commit 75a0506

File tree

6 files changed

+183
-116
lines changed

6 files changed

+183
-116
lines changed

.github/workflows/windows.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ jobs:
5555
key: ${{ matrix.platform.target }}
5656
- run: cargo +nightly fmt --check
5757
- run: cargo clippy
58-
- run: cargo test --package komorebi --test compat
58+
- run: cargo test --lib --bins --tests
5959
- uses: houseabsolute/actions-rust-cross@v1
6060
with:
6161
command: "build"

komorebi/src/process_command.rs

+71
Original file line numberDiff line numberDiff line change
@@ -2069,3 +2069,74 @@ pub fn read_commands_tcp(
20692069

20702070
Ok(())
20712071
}
2072+
2073+
#[cfg(test)]
2074+
mod tests {
2075+
use crate::monitor;
2076+
use crate::window_manager::WindowManager;
2077+
use crate::Rect;
2078+
use crate::SocketMessage;
2079+
use crate::WindowManagerEvent;
2080+
use crate::DATA_DIR;
2081+
use crossbeam_channel::bounded;
2082+
use crossbeam_channel::Receiver;
2083+
use crossbeam_channel::Sender;
2084+
use std::io::BufRead;
2085+
use std::io::BufReader;
2086+
use std::io::Write;
2087+
use std::str::FromStr;
2088+
use std::time::Duration;
2089+
use uds_windows::UnixStream;
2090+
use uuid::Uuid;
2091+
2092+
fn send_socket_message(socket: &str, message: SocketMessage) {
2093+
let socket = DATA_DIR.join(socket);
2094+
let mut stream = UnixStream::connect(socket).unwrap();
2095+
stream
2096+
.set_write_timeout(Some(Duration::from_secs(1)))
2097+
.unwrap();
2098+
stream
2099+
.write_all(serde_json::to_string(&message).unwrap().as_bytes())
2100+
.unwrap();
2101+
}
2102+
2103+
#[test]
2104+
fn test_receive_socket_message() {
2105+
let (_sender, receiver): (Sender<WindowManagerEvent>, Receiver<WindowManagerEvent>) =
2106+
bounded(1);
2107+
let socket_name = format!("komorebi-test-{}.sock", Uuid::new_v4());
2108+
let socket_path = DATA_DIR.join(&socket_name);
2109+
let mut wm = WindowManager::new(receiver, Some(socket_path.clone())).unwrap();
2110+
let m = monitor::new(
2111+
0,
2112+
Rect::default(),
2113+
Rect::default(),
2114+
"TestMonitor".to_string(),
2115+
"TestDevice".to_string(),
2116+
"TestDeviceID".to_string(),
2117+
Some("TestMonitorID".to_string()),
2118+
);
2119+
2120+
wm.monitors_mut().push_back(m);
2121+
2122+
// send a message
2123+
send_socket_message(&socket_name, SocketMessage::FocusWorkspaceNumber(5));
2124+
2125+
let (stream, _) = wm.command_listener.accept().unwrap();
2126+
let reader = BufReader::new(stream.try_clone().unwrap());
2127+
let next = reader.lines().next();
2128+
2129+
// read and deserialize the message
2130+
let message_string = next.unwrap().unwrap();
2131+
let message = SocketMessage::from_str(&message_string).unwrap();
2132+
assert!(matches!(message, SocketMessage::FocusWorkspaceNumber(5)));
2133+
2134+
// process the message
2135+
wm.process_command(message, stream).unwrap();
2136+
2137+
// check the updated window manager state
2138+
assert_eq!(wm.focused_workspace_idx().unwrap(), 5);
2139+
2140+
std::fs::remove_file(socket_path).unwrap();
2141+
}
2142+
}

komorebi/src/static_config.rs

+33
Original file line numberDiff line numberDiff line change
@@ -1721,3 +1721,36 @@ fn populate_rules(
17211721

17221722
Ok(())
17231723
}
1724+
1725+
#[cfg(test)]
1726+
mod tests {
1727+
use crate::StaticConfig;
1728+
1729+
#[test]
1730+
fn backwards_compat() {
1731+
let root = vec!["0.1.17", "0.1.18", "0.1.19"];
1732+
let docs = vec![
1733+
"0.1.20", "0.1.21", "0.1.22", "0.1.23", "0.1.24", "0.1.25", "0.1.26", "0.1.27",
1734+
"0.1.28", "0.1.29", "0.1.30", "0.1.31", "0.1.32", "0.1.33", "0.1.34",
1735+
];
1736+
1737+
let mut versions = vec![];
1738+
1739+
let client = reqwest::blocking::Client::new();
1740+
1741+
for version in root {
1742+
let request = client.get(format!("https://raw.githubusercontent.com/LGUG2Z/komorebi/refs/tags/v{version}/komorebi.example.json")).header("User-Agent", "komorebi-backwards-compat-test").build().unwrap();
1743+
versions.push((version, client.execute(request).unwrap().text().unwrap()));
1744+
}
1745+
1746+
for version in docs {
1747+
let request = client.get(format!("https://raw.githubusercontent.com/LGUG2Z/komorebi/refs/tags/v{version}/docs/komorebi.example.json")).header("User-Agent", "komorebi-backwards-compat-test").build().unwrap();
1748+
versions.push((version, client.execute(request).unwrap().text().unwrap()));
1749+
}
1750+
1751+
for (version, config) in versions {
1752+
println!("{version}");
1753+
StaticConfig::read_raw(&config).unwrap();
1754+
}
1755+
}
1756+
}

komorebi/src/window_manager.rs

+78
Original file line numberDiff line numberDiff line change
@@ -3660,3 +3660,81 @@ impl WindowManager {
36603660
}
36613661
}
36623662
}
3663+
3664+
#[cfg(test)]
3665+
mod tests {
3666+
use crate::monitor;
3667+
use crate::window_manager::WindowManager;
3668+
use crate::Rect;
3669+
use crate::WindowManagerEvent;
3670+
use crate::DATA_DIR;
3671+
use crossbeam_channel::bounded;
3672+
use crossbeam_channel::Receiver;
3673+
use crossbeam_channel::Sender;
3674+
use uuid::Uuid;
3675+
3676+
#[test]
3677+
fn test_create_window_manager() {
3678+
let (_sender, receiver): (Sender<WindowManagerEvent>, Receiver<WindowManagerEvent>) =
3679+
bounded(1);
3680+
let socket_name = format!("komorebi-test-{}.sock", Uuid::new_v4());
3681+
let socket = Some(DATA_DIR.join(socket_name));
3682+
let wm = WindowManager::new(receiver, socket.clone());
3683+
assert!(wm.is_ok());
3684+
3685+
if let Some(ref socket_path) = socket {
3686+
let _ = std::fs::remove_file(socket_path);
3687+
}
3688+
}
3689+
3690+
#[test]
3691+
fn test_focus_workspace() {
3692+
let (_sender, receiver): (Sender<WindowManagerEvent>, Receiver<WindowManagerEvent>) =
3693+
bounded(1);
3694+
let socket_name = format!("komorebi-test-{}.sock", Uuid::new_v4());
3695+
let socket_path = DATA_DIR.join(&socket_name);
3696+
let mut wm = WindowManager::new(receiver, Some(socket_path.clone())).unwrap();
3697+
let m = monitor::new(
3698+
0,
3699+
Rect::default(),
3700+
Rect::default(),
3701+
"TestMonitor".to_string(),
3702+
"TestDevice".to_string(),
3703+
"TestDeviceID".to_string(),
3704+
Some("TestMonitorID".to_string()),
3705+
);
3706+
3707+
// a new monitor should have a single workspace
3708+
assert_eq!(m.workspaces().len(), 1);
3709+
3710+
// the next index on the monitor should be the not-yet-created second workspace
3711+
let new_workspace_index = m.new_workspace_idx();
3712+
assert_eq!(new_workspace_index, 1);
3713+
3714+
// add the monitor to the window manager
3715+
wm.monitors_mut().push_back(m);
3716+
3717+
{
3718+
// focusing a workspace which doesn't yet exist should create it
3719+
let monitor = wm.focused_monitor_mut().unwrap();
3720+
monitor.focus_workspace(new_workspace_index).unwrap();
3721+
assert_eq!(monitor.workspaces().len(), 2);
3722+
}
3723+
assert_eq!(wm.focused_workspace_idx().unwrap(), 1);
3724+
3725+
{
3726+
// focusing a workspace many indices ahead should create all workspaces
3727+
// required along the way
3728+
let monitor = wm.focused_monitor_mut().unwrap();
3729+
monitor.focus_workspace(new_workspace_index + 2).unwrap();
3730+
assert_eq!(monitor.workspaces().len(), 4);
3731+
}
3732+
assert_eq!(wm.focused_workspace_idx().unwrap(), 3);
3733+
3734+
// we should be able to successfully focus an existing workspace too
3735+
wm.focus_workspace(0).unwrap();
3736+
assert_eq!(wm.focused_workspace_idx().unwrap(), 0);
3737+
3738+
std::fs::remove_file(socket_path).unwrap();
3739+
}
3740+
}

komorebi/tests/compat.rs

-29
This file was deleted.

komorebi/tests/window_manager.rs

-86
This file was deleted.

0 commit comments

Comments
 (0)