homework: power socket mock - do not fail on unknown command
This commit is contained in:
@@ -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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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 ]");
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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 ]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user