homework: power socket mock - do not fail on unknown command

This commit is contained in:
6 changed files with 61 additions and 20 deletions

View File

@@ -64,7 +64,9 @@ fn handle_connection(mut stream: TcpStream, real_power_socket: Arc<RwLock<RealPo
let data_buf = power_socket.power_rate.to_le_bytes(); let data_buf = power_socket.power_rate.to_le_bytes();
stream.write_all(&data_buf).expect("response write error"); stream.write_all(&data_buf).expect("response write error");
} }
_ => panic!("unexpected command: {}", buf[0]), _ => {
println!("unknown command {} - ignore it", buf[0]);
}
} }
} }
} }

View File

@@ -26,21 +26,21 @@ fn create_house_demo() -> House {
"Hall".to_string(), "Hall".to_string(),
room!( room!(
"PSocA" => PowerSocket::stub(9.5, true), "PSocA" => PowerSocket::stub(9.5, true),
"ThermA" => Thermometer::new(20.1), "ThermA" => Thermometer::stub(20.1),
), ),
), ),
( (
"Main".to_string(), "Main".to_string(),
room!( room!(
"PSocB" => PowerSocket::stub(11.2, true), "PSocB" => PowerSocket::stub(11.2, true),
"ThermB" => Thermometer::new(24.5), "ThermB" => Thermometer::stub(24.5),
"PSocC" => PowerSocket::stub(10.4, true), "PSocC" => PowerSocket::stub(10.4, true),
), ),
), ),
( (
"Bedroom".to_string(), "Bedroom".to_string(),
room!( room!(
"ThermC" => Thermometer::new(19.3), "ThermC" => Thermometer::stub(19.3),
"PSocD" => PowerSocket::stub(12.1, true), "PSocD" => PowerSocket::stub(12.1, true),
), ),
), ),
@@ -68,7 +68,7 @@ fn add_new_room_in_house_demo(house: &mut House) {
house.insert_room( house.insert_room(
"Closet", "Closet",
room!( room!(
"ThermD" => Thermometer::new(9.5) "ThermD" => Thermometer::stub(9.5)
), ),
); );
house.print_status(); house.print_status();

View File

@@ -45,7 +45,7 @@ mod tests {
#[test] #[test]
fn smoke_test() { fn smoke_test() {
let dev_thermometer = Device::Thermometer(Thermometer::new(20.1)); let dev_thermometer = Device::Thermometer(Thermometer::stub(20.1));
let dev_power_socket = Device::PowerSocket(PowerSocket::stub(11.2, false)); let dev_power_socket = Device::PowerSocket(PowerSocket::stub(11.2, false));
dev_thermometer.print_status(); dev_thermometer.print_status();
@@ -62,7 +62,7 @@ mod tests {
#[test] #[test]
fn display_test() { fn display_test() {
let dev_thermometer = Device::Thermometer(Thermometer::new(20.1)); let dev_thermometer = Device::Thermometer(Thermometer::stub(20.1));
let dev_power_socket = Device::PowerSocket(PowerSocket::stub(11.2, false)); let dev_power_socket = Device::PowerSocket(PowerSocket::stub(11.2, false));
assert_eq!(format!("{}", dev_thermometer.display()), "DEV:Thermometer[ 20.1 ]"); assert_eq!(format!("{}", dev_thermometer.display()), "DEV:Thermometer[ 20.1 ]");

View File

@@ -61,7 +61,7 @@ mod tests {
"main".to_string(), "main".to_string(),
Room::new( Room::new(
[ [
("ThermA".to_string(), Thermometer::new(20.0).into()), ("ThermA".to_string(), Thermometer::stub(20.0).into()),
("PSocA".to_string(), PowerSocket::stub(12.34, false).into()), ("PSocA".to_string(), PowerSocket::stub(12.34, false).into()),
("PSocB".to_string(), PowerSocket::stub(10.01, true).into()), ("PSocB".to_string(), PowerSocket::stub(10.01, true).into()),
] ]
@@ -74,7 +74,7 @@ mod tests {
Room::new( Room::new(
[ [
("PSocC".to_string(), PowerSocket::stub(11.11, true).into()), ("PSocC".to_string(), PowerSocket::stub(11.11, true).into()),
("ThermB".to_string(), Thermometer::new(17.99).into()), ("ThermB".to_string(), Thermometer::stub(17.99).into()),
] ]
.into_iter() .into_iter()
.collect(), .collect(),

View File

@@ -54,7 +54,7 @@ mod tests {
fn create_test_room() -> Room { fn create_test_room() -> Room {
room!( room!(
"PSoc" => PowerSocket::stub(12.34, false), "PSoc" => PowerSocket::stub(12.34, false),
"Therm" => Thermometer::new(21.56), "Therm" => Thermometer::stub(21.56),
) )
} }
@@ -85,7 +85,7 @@ mod tests {
#[test] #[test]
fn test_add_remove() { fn test_add_remove() {
let mut room = create_test_room(); let mut room = create_test_room();
let result = room.insert_device("NewTerm", Thermometer::new(20.0).into()); let result = room.insert_device("NewTerm", Thermometer::stub(20.0).into());
assert!(result.is_none()); assert!(result.is_none());
assert_eq!(room.devices.len(), 3); assert_eq!(room.devices.len(), 3);

View File

@@ -1,17 +1,19 @@
use std::fmt::Display; use std::fmt::{Debug, Display};
#[derive(Debug)] #[derive(Debug)]
pub struct Thermometer { pub struct Thermometer {
temperature: f32, handle: Box<dyn ThermometerHandle>,
} }
impl Thermometer { impl Thermometer {
pub fn new(temperature: f32) -> Self { pub fn stub(temperature: f32) -> Self {
Self { temperature } Self {
handle: Box::new(ThermometerHandleStub::new(temperature)),
}
} }
pub fn get_temperature(&self) -> f32 { pub fn get_temperature(&self) -> f32 {
self.temperature self.handle.get_temperature()
} }
pub fn display(&self) -> impl Display { pub fn display(&self) -> impl Display {
@@ -19,20 +21,57 @@ impl Thermometer {
} }
} }
trait ThermometerHandle: Debug {
fn get_temperature(&self) -> f32;
}
#[derive(Debug)]
struct ThermometerHandleStub {
temperature: f32,
}
impl ThermometerHandleStub {
fn new(temperature: f32) -> Self {
Self { temperature }
}
}
impl ThermometerHandle for ThermometerHandleStub {
fn get_temperature(&self) -> f32 {
self.temperature
}
}
#[derive(Debug)]
struct ThermometerClient {
value: f32,
}
impl ThermometerClient {
fn new() -> Self {
Self { value: f32::NAN }
}
}
impl ThermometerHandle for ThermometerClient {
fn get_temperature(&self) -> f32 {
self.value
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
#[test] #[test]
fn smoke_test() { fn smoke_test() {
let thermometer = Thermometer::new(20.0); let thermometer = Thermometer::stub(20.0);
assert_eq!(thermometer.temperature, 20.0);
assert_eq!(thermometer.get_temperature(), 20.0); assert_eq!(thermometer.get_temperature(), 20.0);
} }
#[test] #[test]
fn display_test() { fn display_test() {
assert_eq!(format!("{}", Thermometer::new(19.550).display()), "Thermometer[ 19.5 ]"); assert_eq!(format!("{}", Thermometer::stub(19.550).display()), "Thermometer[ 19.5 ]");
assert_eq!(format!("{}", Thermometer::new(19.551).display()), "Thermometer[ 19.6 ]"); assert_eq!(format!("{}", Thermometer::stub(19.551).display()), "Thermometer[ 19.6 ]");
} }
} }