86 lines
2.3 KiB
Rust
86 lines
2.3 KiB
Rust
#![allow(unused)]
|
|
|
|
use crate::Device;
|
|
|
|
pub struct Room {
|
|
name: String,
|
|
devices: Box<[Device]>,
|
|
}
|
|
|
|
impl Room {
|
|
pub fn new(name: impl AsRef<str>, 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);
|
|
}
|
|
}
|