141 lines
3.7 KiB
Rust
141 lines
3.7 KiB
Rust
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<MockFramebuffer> {
|
|
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);
|
|
}
|