#![allow(unused)] use crate::Device; pub struct Room { name: String, devices: Box<[Device]>, } impl Room { pub fn new(name: impl AsRef, devices: Box<[Device]>) -> Self { Self { name: name.as_ref().to_string(), devices, } } fn check_bounds(&self, idx: usize) { if idx >= self.devices.len() { panic!("Index is out of bounds") } } pub fn get_device(&self, idx: usize) -> &Device { self.check_bounds(idx); &self.devices[idx] } pub fn get_device_mut(&mut self, idx: usize) -> &mut Device { self.check_bounds(idx); &mut self.devices[idx] } pub fn print_status(&self) { println!("{}", "=".repeat(16)); println!("{}:", self.name); println!("{}", "-".repeat(16)); for d in self.devices.iter() { d.print_status(); } println!("{}", "=".repeat(16)); } } #[cfg(test)] mod tests { use super::*; use crate::{PowerSocket, Thermometer}; #[test] fn smoke_test() { let devices = Box::new([ Device::PowerSocket(PowerSocket::new(12.34, false)), Device::Thermometer(Thermometer::new(21.56)), ]); let mut room = Room::new("test_room", devices); assert_eq!(room.name, "test_room"); room.print_status(); assert_eq!(format!("{}", room.get_device(0).display()), "DEV:PowerSocket[ OFF : 0.0 ]"); assert_eq!(format!("{}", room.get_device(1).display()), "DEV:Thermometer[ 21.6 ]"); let power_socket = match room.get_device_mut(0) { Device::PowerSocket(ps) => ps, _ => unreachable!(), }; power_socket.set_on(true); assert_eq!(format!("{}", room.get_device(0).display()), "DEV:PowerSocket[ ON : 12.3 ]"); assert_eq!(format!("{}", room.get_device(1).display()), "DEV:Thermometer[ 21.6 ]"); } #[test] #[should_panic(expected = "Index is out of bounds")] fn panic_test() { let room = Room::new( "test_room", Box::new([ Device::PowerSocket(PowerSocket::new(12.34, false)), Device::Thermometer(Thermometer::new(21.56)), ]), ); room.check_bounds(2); } }