#![allow(unused)] use std::fmt::Display; pub struct PowerSocket { power_rate: f32, on: bool, } impl PowerSocket { pub fn new(power_rate: f32, on: bool) -> Self { Self { power_rate, on } } pub fn is_on(&self) -> bool { self.on } pub fn set_on(&mut self, on: bool) { self.on = on } pub fn get_power(&self) -> f32 { if self.on { self.power_rate } else { 0.0 } } pub fn display(&self) -> impl Display { let state = if self.is_on() { "ON" } else { "OFF" }; format!("PowerSocket[ {} : {:02.1} ]", state, self.get_power()) } } #[cfg(test)] mod tests { use super::*; #[test] fn smoke_test() { let mut power_socket = PowerSocket::new(12.4, false); assert_eq!(power_socket.power_rate, 12.4); assert!(!power_socket.on); assert!(!power_socket.is_on()); assert_eq!(power_socket.get_power(), 0.0); power_socket.set_on(true); assert!(power_socket.is_on()); assert_eq!(power_socket.get_power(), 12.4); } #[test] fn display_test() { assert_eq!(format!("{}", PowerSocket::new(11.549, false).display()), "PowerSocket[ OFF : 0.0 ]"); assert_eq!(format!("{}", PowerSocket::new(11.549, true).display()), "PowerSocket[ ON : 11.5 ]"); assert_eq!(format!("{}", PowerSocket::new(11.550, true).display()), "PowerSocket[ ON : 11.6 ]"); } }