Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1. use std::io::prelude::*;
  2.  
  3. trait Interface {
  4. fn message(&mut self, message: &str);
  5. }
  6.  
  7. struct Console {
  8. write: Box<dyn Write>,
  9. }
  10.  
  11. impl Console {
  12. fn new(write: Box<dyn Write>) -> Self {
  13. Self { write }
  14. }
  15. }
  16.  
  17. impl Interface for Console {
  18. fn message(&mut self, message: &str) {
  19. write!(self.write, "{}", message).expect("Welp 🤷‍♂️")
  20. }
  21. }
  22.  
  23. fn main() {
  24. let mut console: Box<dyn Interface> = Box::new(Console::new(Box::new(std::io::stdout())));
  25. console.message("Hello World");
  26. }
  27.  
  28. #[cfg(test)]
  29. mod test {
  30. use std::cell::RefCell;
  31. use std::io::prelude::*;
  32. use std::rc::Rc;
  33.  
  34. use super::{Console, Interface};
  35.  
  36. struct MockStorage {
  37. written: Vec<Vec<u8>>,
  38. }
  39.  
  40. struct MockWriter {
  41. storage: Rc<RefCell<MockStorage>>,
  42. }
  43.  
  44. impl MockWriter {
  45. fn new() -> Self {
  46. Self {
  47. storage: Rc::new(RefCell::new(MockStorage { written: vec![] })),
  48. }
  49. }
  50. }
  51.  
  52. impl Write for MockWriter {
  53. fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
  54. self.storage.borrow_mut().written.push(buf.to_vec());
  55.  
  56. Ok(buf.len())
  57. }
  58.  
  59. fn flush(&mut self) -> std::io::Result<()> {
  60. Ok(())
  61. }
  62. }
  63.  
  64. fn make_test_console() -> (Console, Rc<RefCell<MockStorage>>) {
  65. let mock_writer = MockWriter::new();
  66. let storage = Rc::clone(&mock_writer.storage);
  67.  
  68. (Console::new(Box::new(mock_writer)), storage)
  69. }
  70.  
  71. #[test]
  72. fn test_message() {
  73. // Arrange
  74. let (mut console, storage) = make_test_console();
  75.  
  76. // Act
  77. console.message("Hello World");
  78.  
  79. // Assert
  80. assert_eq!(vec![b"Hello World".to_vec()], storage.borrow().written);
  81. }
  82.  
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement