Files
gree-controller/src/protocol/gree/tests.rs
T
2026-09-17 08:52:02 +02:00

122 lines
3.5 KiB
Rust

#[cfg(test)]
mod tests {
use super::*;
#[test]
fn invalid_status_frame_does_not_partially_mutate_device() {
let client = GreeClient::new(
"test-controller".into(),
None,
None,
Arc::new(AtomicBool::new(false)),
);
let mut device = Device::simulated_default();
device.power = true;
device.mode = "heat".into();
device.target_temperature = 24.0;
let before = device.clone();
let response = json!({
"cols": ["Pow", "Mod", "SetTem"],
"dat": [0, null, "not-a-number"]
});
assert!(client.apply_status(&mut device, &response).is_err());
assert_eq!(device.power, before.power);
assert_eq!(device.mode, before.mode);
assert_eq!(device.target_temperature, before.target_temperature);
}
#[test]
fn thermostat_standby_setpoint_low_fan_quiet_and_sleep_share_one_frame() {
let payload = GreeClient::command_payload(
&DeviceCommand {
target_temperature: Some(19.0),
fan_speed: Some(1),
quiet: Some(true),
sleep: Some(true),
..DeviceCommand::default()
},
false,
1,
)
.expect("thermostat command payload");
assert_eq!(
payload.get("opt").cloned(),
Some(serde_json::json!(["SetTem", "WdSpd", "Quiet", "SwhSlp"]))
);
assert_eq!(
payload.get("p").cloned(),
Some(serde_json::json!([19, 1, 1, 1]))
);
}
#[test]
fn quiet_status_accepts_multistate_value_and_remembers_wire_mode() {
let client = GreeClient::new(
"test-controller".into(),
None,
None,
Arc::new(AtomicBool::new(false)),
);
let mut device = Device::simulated_default();
device.quiet = false;
device.quiet_wire_value = None;
let response = json!({
"cols": ["Pow", "Quiet"],
"dat": [1, 2]
});
client
.apply_status(&mut device, &response)
.expect("Quiet=2 status");
assert!(device.power);
assert!(device.quiet);
assert_eq!(device.quiet_wire_value, Some(2));
assert_eq!(device.supports_quiet, Some(true));
}
#[test]
fn quiet_command_can_preserve_learned_wire_mode() {
let payload = GreeClient::command_payload(
&DeviceCommand {
quiet: Some(true),
..DeviceCommand::default()
},
false,
2,
)
.expect("quiet command payload");
assert_eq!(
payload.get("opt").cloned(),
Some(serde_json::json!(["Quiet"]))
);
assert_eq!(payload.get("p").cloned(), Some(serde_json::json!([2])));
}
#[test]
fn optional_multistate_feature_does_not_reject_whole_status() {
let client = GreeClient::new(
"test-controller".into(),
None,
None,
Arc::new(AtomicBool::new(false)),
);
let mut device = Device::simulated_default();
let response = json!({
"cols": ["Pow", "Air"],
"dat": [1, 3]
});
client
.apply_status(&mut device, &response)
.expect("Air=3 status");
assert!(device.power);
assert!(device.air);
assert_eq!(device.supports_air, Some(true));
}
}