feat(display-server): add DisplayServer<F: Framebuffer> with protocol, mock adapter, and tests
This commit is contained in:
2
crates/servers/display-server/src/tests/mod.rs
Normal file
2
crates/servers/display-server/src/tests/mod.rs
Normal file
@@ -0,0 +1,2 @@
|
||||
mod protocol;
|
||||
mod server;
|
||||
54
crates/servers/display-server/src/tests/protocol.rs
Normal file
54
crates/servers/display-server/src/tests/protocol.rs
Normal file
@@ -0,0 +1,54 @@
|
||||
use crate::protocol::{DisplayRequest, DisplayResponse};
|
||||
use server_framework::{Decode, Encode};
|
||||
|
||||
#[test]
|
||||
fn draw_rect_roundtrip() {
|
||||
let req = DisplayRequest::DrawRect {
|
||||
x: 10,
|
||||
y: 20,
|
||||
w: 100,
|
||||
h: 50,
|
||||
color: 0xFF0000,
|
||||
};
|
||||
let words = req.encode();
|
||||
let decoded = DisplayRequest::decode(words).unwrap();
|
||||
assert_eq!(decoded, req);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn clear_roundtrip() {
|
||||
let req = DisplayRequest::Clear { color: 0x00FF00 };
|
||||
let words = req.encode();
|
||||
let decoded = DisplayRequest::decode(words).unwrap();
|
||||
assert_eq!(decoded, req);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn flush_roundtrip() {
|
||||
let words = DisplayRequest::Flush.encode();
|
||||
let decoded = DisplayRequest::decode(words).unwrap();
|
||||
assert_eq!(decoded, DisplayRequest::Flush);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn get_dimensions_roundtrip() {
|
||||
let words = DisplayRequest::GetDimensions.encode();
|
||||
let decoded = DisplayRequest::decode(words).unwrap();
|
||||
assert_eq!(decoded, DisplayRequest::GetDimensions);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dimensions_response_roundtrip() {
|
||||
let resp = DisplayResponse::Dimensions {
|
||||
width: 320,
|
||||
height: 240,
|
||||
};
|
||||
let words = resp.encode();
|
||||
let decoded = DisplayResponse::decode(words).unwrap();
|
||||
assert_eq!(decoded, resp);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn invalid_request_returns_none() {
|
||||
assert!(DisplayRequest::decode([99, 0, 0, 0]).is_none());
|
||||
}
|
||||
75
crates/servers/display-server/src/tests/server.rs
Normal file
75
crates/servers/display-server/src/tests/server.rs
Normal file
@@ -0,0 +1,75 @@
|
||||
use crate::adapters::mock::MockFramebuffer;
|
||||
use crate::protocol::{DisplayRequest, DisplayResponse};
|
||||
use crate::server::DisplayServer;
|
||||
use server_framework::Server;
|
||||
|
||||
fn test_server() -> DisplayServer<MockFramebuffer> {
|
||||
DisplayServer::new(MockFramebuffer::new(320, 240))
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn draw_rect_writes_pixels() {
|
||||
let mut server = test_server();
|
||||
let resp = server.handle(DisplayRequest::DrawRect {
|
||||
x: 0,
|
||||
y: 0,
|
||||
w: 4,
|
||||
h: 3,
|
||||
color: 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: 0,
|
||||
y: 0,
|
||||
w: 10,
|
||||
h: 10,
|
||||
color: 0xFF,
|
||||
});
|
||||
server.handle(DisplayRequest::Clear { color: 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: 320,
|
||||
height: 240
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn draw_rect_correct_pixel_positions() {
|
||||
let mut server = test_server();
|
||||
server.handle(DisplayRequest::DrawRect {
|
||||
x: 5,
|
||||
y: 10,
|
||||
w: 2,
|
||||
h: 2,
|
||||
color: 0xAB,
|
||||
});
|
||||
let fb = server.framebuffer();
|
||||
assert_eq!(fb.pixel_count(), 4);
|
||||
assert_eq!(fb.pixel_at(0), (5, 10, 0xAB));
|
||||
assert_eq!(fb.pixel_at(1), (6, 10, 0xAB));
|
||||
assert_eq!(fb.pixel_at(2), (5, 11, 0xAB));
|
||||
assert_eq!(fb.pixel_at(3), (6, 11, 0xAB));
|
||||
}
|
||||
Reference in New Issue
Block a user