use crate::protocol::{DisplayRequest, DisplayResponse}; use crate::server::DisplayServer; use driver_framebuffer_mock::MockFramebuffer; use server_framework::Server; use types::display::{Color, Dimension, ScreenCoord}; fn test_server() -> DisplayServer { DisplayServer::new(MockFramebuffer::new( Dimension::new(320), Dimension::new(240), )) } #[test] fn draw_rect_writes_pixels() { let mut server = test_server(); let resp = server.handle(DisplayRequest::DrawRect { x: ScreenCoord::new(0), y: ScreenCoord::new(0), w: Dimension::new(4), h: Dimension::new(3), color: Color::from_raw(0xFF), }); assert_eq!(resp, DisplayResponse::Ok); assert_eq!(server.framebuffer().pixel_count(), 12); } #[test] fn clear_resets_pixels() { let mut server = test_server(); server.handle(DisplayRequest::DrawRect { x: ScreenCoord::new(0), y: ScreenCoord::new(0), w: Dimension::new(10), h: Dimension::new(10), color: Color::from_raw(0xFF), }); server.handle(DisplayRequest::Clear { color: Color::from_raw(0), }); assert_eq!(server.framebuffer().pixel_count(), 0); } #[test] fn flush_sets_flag() { let mut server = test_server(); assert!(!server.framebuffer().was_flushed()); server.handle(DisplayRequest::Flush); assert!(server.framebuffer().was_flushed()); } #[test] fn get_dimensions_returns_size() { let mut server = test_server(); let resp = server.handle(DisplayRequest::GetDimensions); assert_eq!( resp, DisplayResponse::Dimensions { width: Dimension::new(320), height: Dimension::new(240), } ); } #[test] fn draw_rect_correct_pixel_positions() { let mut server = test_server(); server.handle(DisplayRequest::DrawRect { x: ScreenCoord::new(5), y: ScreenCoord::new(10), w: Dimension::new(2), h: Dimension::new(2), color: Color::from_raw(0xAB), }); let fb = server.framebuffer(); assert_eq!(fb.pixel_count(), 4); assert_eq!( fb.pixel_at(0), ( ScreenCoord::new(5), ScreenCoord::new(10), Color::from_raw(0xAB) ) ); assert_eq!( fb.pixel_at(1), ( ScreenCoord::new(6), ScreenCoord::new(10), Color::from_raw(0xAB) ) ); assert_eq!( fb.pixel_at(2), ( ScreenCoord::new(5), ScreenCoord::new(11), Color::from_raw(0xAB) ) ); assert_eq!( fb.pixel_at(3), ( ScreenCoord::new(6), ScreenCoord::new(11), Color::from_raw(0xAB) ) ); } #[test] fn a_huge_rect_is_clipped_to_the_screen() { let mut server = test_server(); let resp = server.handle(DisplayRequest::DrawRect { x: ScreenCoord::new(310), y: ScreenCoord::new(230), w: Dimension::new(u16::MAX), h: Dimension::new(u16::MAX), color: Color::from_raw(0xFF), }); assert_eq!(resp, DisplayResponse::Ok); assert_eq!(server.framebuffer().pixel_count(), 10 * 10); let (x, y, _) = server.framebuffer().pixel_at(99); assert_eq!((x.raw(), y.raw()), (319, 239)); } #[test] fn an_off_screen_rect_draws_nothing() { let mut server = test_server(); for (x, y) in [(320, 0), (0, 240), (u16::MAX, u16::MAX)] { server.handle(DisplayRequest::DrawRect { x: ScreenCoord::new(x), y: ScreenCoord::new(y), w: Dimension::new(u16::MAX), h: Dimension::new(u16::MAX), color: Color::from_raw(0xFF), }); } assert_eq!(server.framebuffer().pixel_count(), 0); }