99 lines
2.8 KiB
Rust
99 lines
2.8 KiB
Rust
use crate::Room;
|
|
|
|
pub struct House {
|
|
address: String,
|
|
rooms: Box<[Room]>,
|
|
}
|
|
|
|
impl House {
|
|
pub fn new(address: impl AsRef<str>, rooms: Box<[Room]>) -> Self {
|
|
Self {
|
|
address: address.as_ref().to_string(),
|
|
rooms,
|
|
}
|
|
}
|
|
|
|
fn is_valid_idx(&self, idx: usize) -> bool {
|
|
idx < self.rooms.len()
|
|
}
|
|
|
|
pub fn get_room(&self, idx: usize) -> Option<&Room> {
|
|
if self.is_valid_idx(idx) { Some(&self.rooms[idx]) } else { None }
|
|
}
|
|
|
|
pub fn get_room_mut(&mut self, idx: usize) -> Option<&mut Room> {
|
|
if self.is_valid_idx(idx) { Some(&mut self.rooms[idx]) } else { None }
|
|
}
|
|
|
|
pub fn print_status(&self) {
|
|
println!("HOUSE '{}':", self.address);
|
|
println!("{}", "=".repeat(32));
|
|
for d in self.rooms.iter() {
|
|
d.print_status();
|
|
println!();
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use crate::{Device, PowerSocket, Thermometer};
|
|
|
|
fn create_test_house() -> House {
|
|
House::new(
|
|
"Best street, 777",
|
|
Box::new([
|
|
Room::new(
|
|
"main",
|
|
Box::new([
|
|
Device::Thermometer(Thermometer::new("ThermA", 20.0)),
|
|
Device::PowerSocket(PowerSocket::new(12.34, false)),
|
|
Device::PowerSocket(PowerSocket::new(10.01, true)),
|
|
]),
|
|
),
|
|
Room::new(
|
|
"bedroom",
|
|
Box::new([
|
|
Device::PowerSocket(PowerSocket::new(11.11, true)),
|
|
Device::Thermometer(Thermometer::new("ThermB", 17.99)),
|
|
]),
|
|
),
|
|
]),
|
|
)
|
|
}
|
|
|
|
#[test]
|
|
fn smoke_test() {
|
|
let mut house = create_test_house();
|
|
house.print_status();
|
|
assert_eq!(house.address, "Best street, 777");
|
|
|
|
assert_eq!(format!("{}", house.get_room(0).unwrap().get_device(0).unwrap().display()), "DEV:ThermA[ 20.0 ]");
|
|
assert_eq!(
|
|
format!("{}", house.get_room(0).unwrap().get_device(1).unwrap().display()),
|
|
"DEV:PowerSocket[ OFF : 0.0 ]"
|
|
);
|
|
assert_eq!(
|
|
format!("{}", house.get_room(1).unwrap().get_device(0).unwrap().display()),
|
|
"DEV:PowerSocket[ ON : 11.1 ]"
|
|
);
|
|
|
|
let Device::PowerSocket(powers_socket) = house.get_room_mut(0).unwrap().get_device_mut(1).unwrap() else {
|
|
unreachable!()
|
|
};
|
|
powers_socket.set_on(true);
|
|
|
|
assert_eq!(
|
|
format!("{}", house.get_room(0).unwrap().get_device(1).unwrap().display()),
|
|
"DEV:PowerSocket[ ON : 12.3 ]"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn check_out_of_bounds() {
|
|
let house = create_test_house();
|
|
assert!(house.get_room(2).is_none());
|
|
}
|
|
}
|