BragiResponse-Felder korrekt zugeordnet (endpoint=raw[1], command=raw[2], status=raw[3]) gemäß Protokoll-Doku. PropertyNotSupported durch DeviceError ersetzt, parse_response_validated in device.rs aktiviert, flush() mit Iterationslimit gegen Endlosschleifen, Sidetone-Range per clap validiert statt clamp, JSON-Escaping im hidpp-battery-waybar.sh, udev auf uaccess umgestellt. 52 Tests grün.
100 lines
3.5 KiB
Rust
100 lines
3.5 KiB
Rust
// ABOUTME: Unit-Tests für Bragi Property-Enums und Battery-Level-Konvertierung.
|
|
// ABOUTME: Testet BatteryStatus-Konvertierung und Promille-zu-Prozent-Umrechnung.
|
|
|
|
use corsairctl::bragi::properties::{battery_promille_to_percent, BatteryStatus, Property};
|
|
|
|
#[test]
|
|
fn battery_status_from_byte_charging() {
|
|
assert_eq!(BatteryStatus::from_byte(0x01), BatteryStatus::Charging);
|
|
}
|
|
|
|
#[test]
|
|
fn battery_status_from_byte_discharging() {
|
|
assert_eq!(BatteryStatus::from_byte(0x02), BatteryStatus::Discharging);
|
|
}
|
|
|
|
#[test]
|
|
fn battery_status_from_byte_all_known_values() {
|
|
// Empirisch ermittelt am HS80 RGB Wireless
|
|
assert_eq!(BatteryStatus::from_byte(0x00), BatteryStatus::Offline);
|
|
assert_eq!(BatteryStatus::from_byte(0x01), BatteryStatus::Charging);
|
|
assert_eq!(BatteryStatus::from_byte(0x02), BatteryStatus::Discharging);
|
|
assert_eq!(BatteryStatus::from_byte(0x03), BatteryStatus::Low);
|
|
assert_eq!(BatteryStatus::from_byte(0x04), BatteryStatus::FullyCharged);
|
|
}
|
|
|
|
#[test]
|
|
fn battery_status_unknown_value() {
|
|
let status = BatteryStatus::from_byte(0xFF);
|
|
assert!(matches!(status, BatteryStatus::Unknown(0xFF)));
|
|
}
|
|
|
|
#[test]
|
|
fn battery_status_labels() {
|
|
assert_eq!(BatteryStatus::Offline.label(), "Offline");
|
|
assert_eq!(BatteryStatus::Discharging.label(), "Discharging");
|
|
assert_eq!(BatteryStatus::Low.label(), "Low");
|
|
assert_eq!(BatteryStatus::Charging.label(), "Charging");
|
|
assert_eq!(BatteryStatus::FullyCharged.label(), "Full");
|
|
assert_eq!(BatteryStatus::Unknown(0xFF).label(), "Unknown");
|
|
}
|
|
|
|
#[test]
|
|
fn battery_status_is_charging() {
|
|
assert!(BatteryStatus::Charging.is_charging());
|
|
assert!(!BatteryStatus::Discharging.is_charging());
|
|
assert!(!BatteryStatus::FullyCharged.is_charging());
|
|
assert!(!BatteryStatus::Offline.is_charging());
|
|
}
|
|
|
|
#[test]
|
|
fn battery_promille_to_percent_full() {
|
|
assert!((battery_promille_to_percent(1000) - 100.0).abs() < f32::EPSILON);
|
|
}
|
|
|
|
#[test]
|
|
fn battery_promille_to_percent_half() {
|
|
assert!((battery_promille_to_percent(500) - 50.0).abs() < f32::EPSILON);
|
|
}
|
|
|
|
#[test]
|
|
fn battery_promille_to_percent_empty() {
|
|
assert!((battery_promille_to_percent(0) - 0.0).abs() < f32::EPSILON);
|
|
}
|
|
|
|
#[test]
|
|
fn battery_promille_to_percent_fractional() {
|
|
// 735 Promille = 73.5%
|
|
assert!((battery_promille_to_percent(735) - 73.5).abs() < f32::EPSILON);
|
|
}
|
|
|
|
#[test]
|
|
fn battery_status_icons() {
|
|
// Jede Variante muss ein nicht-leeres Icon liefern
|
|
assert!(!BatteryStatus::Offline.icon().is_empty());
|
|
assert!(!BatteryStatus::Discharging.icon().is_empty());
|
|
assert!(!BatteryStatus::Low.icon().is_empty());
|
|
assert!(!BatteryStatus::Charging.icon().is_empty());
|
|
assert!(!BatteryStatus::FullyCharged.icon().is_empty());
|
|
assert!(!BatteryStatus::Unknown(0xFF).icon().is_empty());
|
|
|
|
// Discharging und Low teilen das gleiche Icon
|
|
assert_eq!(BatteryStatus::Discharging.icon(), BatteryStatus::Low.icon());
|
|
|
|
// Charging und FullyCharged haben unterschiedliche Icons
|
|
assert_ne!(BatteryStatus::Charging.icon(), BatteryStatus::FullyCharged.icon());
|
|
}
|
|
|
|
#[test]
|
|
fn property_ids_match_protocol() {
|
|
assert_eq!(Property::BatteryLevel.id(), 0x0F);
|
|
assert_eq!(Property::BatteryStatus.id(), 0x10);
|
|
assert_eq!(Property::Brightness.id(), 0x02);
|
|
assert_eq!(Property::Mode.id(), 0x03);
|
|
assert_eq!(Property::VendorId.id(), 0x11);
|
|
assert_eq!(Property::ProductId.id(), 0x12);
|
|
assert_eq!(Property::AppFirmware.id(), 0x13);
|
|
assert_eq!(Property::BuildFirmware.id(), 0x14);
|
|
assert_eq!(Property::Sidetone.id(), 0x09);
|
|
}
|