corsairctl/tests/output_test.rs
nevaforget a9d526023d fix: Audit-Findings behoben (Perf, Security, Quality)
- Sleep vor HID-Reads entfernt — read_timeout reicht als
  Synchronisation, spart ~300ms pro Aufruf
- udev-Regel: MODE 0660 + GROUP plugdev statt world-writable 0666
- Eigener CorsairError::SidetoneNotFound für fehlende ALSA-Controls
- Response-Validierung vorbereitet (parse_response_validated),
  Korrelation noch deaktiviert da Response-Format andere Endpoint-IDs
  nutzt als das Request-Format (0x00/0x01 vs 0x08/0x09)
- Protokoll-Doku zum Response-Format korrigiert
- 18 neue Tests für output.rs (Waybar-JSON Formatierung + Grenzwerte)
2026-03-27 23:11:50 +01:00

135 lines
4.5 KiB
Rust

// ABOUTME: Unit-Tests für Output-Formatierung (Plain-Text und Waybar-JSON).
// ABOUTME: Testet alle BatteryStatus-Varianten und Grenzwerte in der Waybar-Ausgabe.
use corsairctl::bragi::properties::BatteryStatus;
use corsairctl::output;
#[test]
fn format_battery_discharging() {
let result = output::format_battery(75.0, &BatteryStatus::Discharging);
assert_eq!(result, "Battery: 75% (Discharging)");
}
#[test]
fn format_battery_charging() {
let result = output::format_battery(50.0, &BatteryStatus::Charging);
assert_eq!(result, "Battery: 50% (Charging)");
}
#[test]
fn format_brightness_value() {
let result = output::format_brightness(330);
assert_eq!(result, "LED Brightness: 330/1000 (33%)");
}
#[test]
fn format_brightness_zero() {
let result = output::format_brightness(0);
assert_eq!(result, "LED Brightness: 0/1000 (0%)");
}
#[test]
fn format_sidetone_value() {
let result = output::format_sidetone(3);
assert_eq!(result, "Sidetone: 3/23");
}
#[test]
fn format_info_values() {
let result = output::format_info(0x1B1C, 0x0A69, 1797, 0);
assert!(result.contains("0x1B1C"));
assert!(result.contains("0x0A69"));
assert!(result.contains("1797.0"));
}
// Waybar-JSON Tests
#[test]
fn waybar_json_is_valid_json() {
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Discharging);
let parsed: serde_json::Value = serde_json::from_str(&json_str).expect("muss valides JSON sein");
assert!(parsed.is_object());
}
#[test]
fn waybar_json_has_required_fields() {
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Discharging);
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
assert!(parsed["text"].is_string(), "text fehlt");
assert!(parsed["tooltip"].is_string(), "tooltip fehlt");
assert!(parsed["class"].is_string(), "class fehlt");
assert!(parsed["percentage"].is_number(), "percentage fehlt");
}
#[test]
fn waybar_json_percentage_matches_level() {
let json_str = output::format_waybar_json(73.5, &BatteryStatus::Discharging);
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
assert_eq!(parsed["percentage"], 74); // 73.5 rounded
}
#[test]
fn waybar_json_class_charging() {
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Charging);
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
assert_eq!(parsed["class"], "charging");
}
#[test]
fn waybar_json_class_fully_charged() {
let json_str = output::format_waybar_json(100.0, &BatteryStatus::FullyCharged);
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
assert_eq!(parsed["class"], "charging");
}
#[test]
fn waybar_json_class_low() {
let json_str = output::format_waybar_json(20.0, &BatteryStatus::Low);
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
assert_eq!(parsed["class"], "low");
}
#[test]
fn waybar_json_class_critical_when_discharging_below_15() {
let json_str = output::format_waybar_json(10.0, &BatteryStatus::Discharging);
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
assert_eq!(parsed["class"], "critical");
}
#[test]
fn waybar_json_class_warning_when_discharging_below_30() {
let json_str = output::format_waybar_json(25.0, &BatteryStatus::Discharging);
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
assert_eq!(parsed["class"], "warning");
}
#[test]
fn waybar_json_class_normal_when_discharging_above_30() {
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Discharging);
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
assert_eq!(parsed["class"], "normal");
}
#[test]
fn waybar_json_class_at_boundary_15() {
let json_str = output::format_waybar_json(15.0, &BatteryStatus::Discharging);
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
// 15.0 ist <= 15.0 → critical
assert_eq!(parsed["class"], "critical");
}
#[test]
fn waybar_json_class_at_boundary_30() {
let json_str = output::format_waybar_json(30.0, &BatteryStatus::Discharging);
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
// 30.0 ist <= 30.0 → warning
assert_eq!(parsed["class"], "warning");
}
#[test]
fn waybar_json_offline() {
let json_str = output::format_waybar_json(0.0, &BatteryStatus::Offline);
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
assert_eq!(parsed["class"], "offline");
}