From d6cbf0f4aef0d5bc7428f261673d61068e642c96 Mon Sep 17 00:00:00 2001 From: Lucien Cartier-Tilet Date: Sat, 3 Jan 2026 22:41:28 +0100 Subject: [PATCH] test(domain/relay): write failing tests for RelayState serialization Tests verify serialization and deserialization of RelayState enum with "on" and "off" states. Red phase of TDD - tests define expected behavior before implementation. Ref: T019 (specs/001-modbus-relay-control/tasks.md) --- backend/src/domain/relay/types/mod.rs | 3 ++ backend/src/domain/relay/types/relaystate.rs | 52 ++++++++++++++++++++ specs/001-modbus-relay-control/tasks.md | 2 +- 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 backend/src/domain/relay/types/relaystate.rs diff --git a/backend/src/domain/relay/types/mod.rs b/backend/src/domain/relay/types/mod.rs index d5467b3..2edc683 100644 --- a/backend/src/domain/relay/types/mod.rs +++ b/backend/src/domain/relay/types/mod.rs @@ -1,2 +1,5 @@ mod relayid; +mod relaystate; + pub use relayid::RelayId; +pub use relaystate::RelayState; diff --git a/backend/src/domain/relay/types/relaystate.rs b/backend/src/domain/relay/types/relaystate.rs new file mode 100644 index 0000000..e651d27 --- /dev/null +++ b/backend/src/domain/relay/types/relaystate.rs @@ -0,0 +1,52 @@ +/// State of a relay (on or off). +/// +/// Represents the binary state of a relay channel in the Modbus controller. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum RelayState { + /// Relay is energized (circuit closed). + On, + /// Relay is de-energized (circuit open). + Off, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_relay_state_on_serializes_to_on() { + // Test: RelayState::On → serializes to "on" + let state = RelayState::On; + let json = serde_json::to_string(&state).unwrap(); + assert_eq!(json, r#""on""#); + } + + #[test] + fn test_relay_state_off_serializes_to_off() { + // Test: RelayState::Off → serializes to "off" + let state = RelayState::Off; + let json = serde_json::to_string(&state).unwrap(); + assert_eq!(json, r#""off""#); + } + + #[test] + fn test_parse_on_from_string() { + // Test: Parse "on" from string + let state: RelayState = serde_json::from_str(r#""on""#).unwrap(); + assert_eq!(state, RelayState::On); + } + + #[test] + fn test_parse_off_from_string() { + // Test: Parse "off" from string + let state: RelayState = serde_json::from_str(r#""off""#).unwrap(); + assert_eq!(state, RelayState::Off); + } + + #[test] + fn test_parse_invalid_string_fails() { + // Test: Parse invalid string fails + let result: Result = serde_json::from_str(r#""invalid""#); + assert!(result.is_err()); + } +} diff --git a/specs/001-modbus-relay-control/tasks.md b/specs/001-modbus-relay-control/tasks.md index bddaa4c..ae5f6aa 100644 --- a/specs/001-modbus-relay-control/tasks.md +++ b/specs/001-modbus-relay-control/tasks.md @@ -218,7 +218,7 @@ - **File**: src/domain/relay.rs - **Complexity**: Low | **Uncertainty**: Low -- [ ] **T019** [P] [US1] [TDD] Write tests for RelayState enum +- [x] **T019** [P] [US1] [TDD] Write tests for RelayState enum - Test: RelayState::On → serializes to "on" - Test: RelayState::Off → serializes to "off" - Test: Parse "on"/"off" from strings