Another project
1use bone_render::{ClearColor, PixelDiff, PixelDiffThreshold, Style, ViewportExtent, ViewportPx};
2
3mod common;
4
5use common::{extent_square as extent, make_context};
6
7fn expected_rgba(extent: ViewportExtent, color: ClearColor) -> Vec<u8> {
8 let pixel = color.to_rgba8();
9 let count = usize::try_from(extent.pixel_count()).unwrap_or(0);
10 (0..count).flat_map(|_| pixel.into_iter()).collect()
11}
12
13#[test]
14fn offscreen_clear_matches_style_background_exactly() {
15 let size = extent(64);
16 let ctx = make_context(size);
17 let style = Style::default();
18
19 let Ok(frame) = ctx.render_clear(&style) else {
20 panic!("render_clear failed");
21 };
22
23 assert_eq!(frame.extent(), size);
24 let expected = expected_rgba(size, style.background());
25 assert_eq!(frame.rgba().len(), expected.len());
26
27 let Ok(report) = PixelDiff::compare(&frame, &expected, PixelDiffThreshold::EXACT) else {
28 panic!("pixel diff rejected inputs");
29 };
30 assert!(
31 report.is_clean(),
32 "clear frame diverged from expected bytes: {} mismatches, worst {:?}",
33 report.over_threshold(),
34 report.worst(),
35 );
36}
37
38#[test]
39fn offscreen_clear_honours_custom_background() {
40 let size = extent(32);
41 let ctx = make_context(size);
42 let background = ClearColor::opaque(0.25, 0.50, 0.75);
43 let style = Style::new(background);
44
45 let Ok(frame) = ctx.render_clear(&style) else {
46 panic!("render_clear failed");
47 };
48
49 let expected = expected_rgba(size, background);
50 let Ok(report) = PixelDiff::compare(&frame, &expected, PixelDiffThreshold::EXACT) else {
51 panic!("pixel diff rejected inputs");
52 };
53 assert!(
54 report.is_clean(),
55 "custom clear diverged: {} mismatches",
56 report.over_threshold(),
57 );
58}
59
60#[test]
61fn offscreen_extent_with_non_aligned_width_reads_back_packed_rgba() {
62 let size = ViewportExtent::new(ViewportPx::new(63), ViewportPx::new(16));
63 let ctx = make_context(size);
64 let style = Style::new(ClearColor::opaque(1.0, 0.0, 0.0));
65
66 let Ok(frame) = ctx.render_clear(&style) else {
67 panic!("render_clear failed");
68 };
69
70 let expected = expected_rgba(size, style.background());
71 assert_eq!(frame.rgba().len(), expected.len());
72 let Ok(report) = PixelDiff::compare(&frame, &expected, PixelDiffThreshold::EXACT) else {
73 panic!("pixel diff rejected inputs");
74 };
75 assert!(report.is_clean(), "unaligned width readback diverged");
76}