fn main() {
println!("๐งช Testing CLI Example Components");
println!("=================================");
test_operation_registry();
test_parameter_validation();
test_menu_display();
println!("\nโ
All CLI component tests passed!");
println!(" The CLI example is ready for use with actual Sonos devices.");
}
fn test_operation_registry() {
println!("\n๐ง Testing Operation Registry...");
let operations = vec![
("Play", "AVTransport", "Start playback"),
("Pause", "AVTransport", "Pause playback"),
("GetVolume", "RenderingControl", "Get current volume"),
("SetVolume", "RenderingControl", "Set volume level"),
];
println!(" โ Registry contains {} operations", operations.len());
let mut services = std::collections::HashMap::new();
for (name, service, _desc) in &operations {
services.entry(service).or_insert_with(Vec::new).push(name);
}
println!(" โ Operations grouped into {} services", services.len());
assert!(services.contains_key(&"AVTransport"));
assert!(services.contains_key(&"RenderingControl"));
println!(" โ Operation registry test passed");
}
fn test_parameter_validation() {
println!("\n๐ง Testing Parameter Validation...");
assert!(validate_u8("50").is_ok());
assert!(validate_u8("0").is_ok());
assert!(validate_u8("100").is_ok());
assert!(validate_u8("255").is_ok());
assert!(validate_u8("256").is_err());
assert!(validate_u8("-1").is_err());
assert!(validate_u8("abc").is_err());
println!(" โ u8 validation works correctly");
assert!(validate_i8("10").is_ok());
assert!(validate_i8("-10").is_ok());
assert!(validate_i8("127").is_ok());
assert!(validate_i8("-128").is_ok());
assert!(validate_i8("128").is_err());
assert!(validate_i8("-129").is_err());
assert!(validate_i8("abc").is_err());
println!(" โ i8 validation works correctly");
assert!(validate_string("Master").is_ok());
assert!(validate_string("").is_ok());
assert!(validate_string("Any text here").is_ok());
println!(" โ String validation works correctly");
println!(" โ Parameter validation test passed");
}
fn test_menu_display() {
println!("\n๐ง Testing Menu Display...");
let items = ["Item 1", "Item 2", "Item 3"];
let formatted: Vec<String> = items
.iter()
.enumerate()
.map(|(i, item)| format!("{}. {}", i + 1, item))
.collect();
assert_eq!(formatted.len(), 3);
assert_eq!(formatted[0], "1. Item 1");
assert_eq!(formatted[1], "2. Item 2");
assert_eq!(formatted[2], "3. Item 3");
println!(" โ Menu formatting works correctly");
assert!(validate_menu_selection(1, 3).is_ok());
assert!(validate_menu_selection(3, 3).is_ok());
assert!(validate_menu_selection(0, 3).is_err()); assert!(validate_menu_selection(4, 3).is_err());
println!(" โ Menu selection validation works correctly");
println!(" โ Menu display test passed");
}
fn validate_u8(value: &str) -> Result<u8, String> {
value
.parse::<u8>()
.map_err(|_| format!("'{value}' is not a valid u8 value"))
}
fn validate_i8(value: &str) -> Result<i8, String> {
value
.parse::<i8>()
.map_err(|_| format!("'{value}' is not a valid i8 value"))
}
fn validate_string(value: &str) -> Result<String, String> {
Ok(value.to_string())
}
fn validate_menu_selection(selection: usize, max: usize) -> Result<usize, String> {
if selection == 0 {
return Err("Selection 0 means exit".to_string());
}
if selection > max {
return Err(format!("Selection {selection} is out of range (1-{max})"));
}
Ok(selection)
}