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

View File

@@ -45,7 +45,7 @@ mod tests {
#[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));
dev_thermometer.print_status();
@@ -62,7 +62,7 @@ mod tests {
#[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));
assert_eq!(format!("{}", dev_thermometer.display()), "DEV:Thermometer[ 20.1 ]");

View File

@@ -61,7 +61,7 @@ mod tests {
"main".to_string(),
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()),
("PSocB".to_string(), PowerSocket::stub(10.01, true).into()),
]
@@ -74,7 +74,7 @@ mod tests {
Room::new(
[
("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()
.collect(),

View File

@@ -54,7 +54,7 @@ mod tests {
fn create_test_room() -> Room {
room!(
"PSoc" => PowerSocket::stub(12.34, false),
"Therm" => Thermometer::new(21.56),
"Therm" => Thermometer::stub(21.56),
)
}
@@ -85,7 +85,7 @@ mod tests {
#[test]
fn test_add_remove() {
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_eq!(room.devices.len(), 3);

View File

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