use rust_widgets::core::PlatformFamily;
use rust_widgets::platform::portable::copy_rows;
use rust_widgets::platform::profile;
use rust_widgets::platform::types::default_capabilities_for;
use rust_widgets::platform::{FrameBuffer, SurfaceGeometry};
use rust_widgets::render_engine;
#[test]
fn chapter_profile_queries_resolve_and_are_consistent() {
let name = profile::profile_name();
let has_os = profile::has_os_runtime();
let full = profile::full_widget_set();
let frugal = profile::is_alloc_frugal();
assert!(!name.is_empty(), "profile_name must report something");
if frugal {
assert_eq!(name, "mini", "only `mini` sets alloc_frugal");
assert!(!full, "a frugal profile cannot have the full widget set");
}
if !has_os {
assert!(!full, "no OS runtime implies a stripped widget set");
}
if full {
assert!(has_os, "the full widget set requires an OS runtime");
}
}
#[test]
fn chapter_supports_surfaces_matches_the_profile() {
let supported = rust_widgets::supports_surfaces();
if profile::stripped_widget_set() {
assert!(
!supported,
"the chapter states a stripped profile reports `false` rather than \
mounting a blank surface"
);
}
}
#[test]
fn chapter_frame_pacing_api_resolves() {
let applied_low = render_engine::set_embedded_target_fps(0);
let applied_high = render_engine::set_embedded_target_fps(999);
assert!((1..=240).contains(&applied_low));
assert!((1..=240).contains(&applied_high));
let applied = render_engine::set_embedded_target_fps(60);
assert_eq!(applied, 60);
assert_eq!(render_engine::embedded_target_fps(), 60);
let task_id: u64 = render_engine::submit_embedded_task("chapter-test", |_frame| {});
assert!(task_id > 0, "a queued task must get an id");
}
#[test]
fn chapter_engine_stats_resolve() {
let stats = render_engine::embedded_engine_stats();
let _: bool = stats.initialized;
let _: bool = stats.running;
let _: u64 = stats.frame_count;
let _: usize = stats.pending_task_count;
let _: usize = stats.window_count;
let _: usize = stats.button_count;
let _: u32 = stats.target_fps;
assert_eq!(stats.clone(), stats);
}
#[test]
fn chapter_surface_api_resolves_and_behaves_as_documented() {
let geometry = SurfaceGeometry { width: 320, height: 240, stride: 320 * 4 + 16 };
let mut frame = FrameBuffer::new();
assert!(frame.resize(geometry), "a padded-but-valid stride must be accepted");
assert!(
frame.frame().len() >= geometry.stride * 239 + 320 * 4,
"the frame must cover the last visible row (the chapter's `required_end` point)"
);
assert_eq!(SurfaceGeometry::tight(64, 48).stride, 64 * 4);
let bad = SurfaceGeometry { width: 8, height: 4, stride: 8 };
let mut frame2 = FrameBuffer::new();
assert!(!frame2.resize(bad), "an overlapping stride must be refused");
let padded = SurfaceGeometry { width: 2, height: 2, stride: 12 };
let src = [1u8; 24];
let mut dst = [0u8; 24];
assert!(copy_rows(&src, &mut dst, padded));
assert_eq!(&dst[8..12], &[0u8; 4], "padding must not be written");
assert!(copy_rows(&[], &mut [], SurfaceGeometry { width: 0, height: 8, stride: 0 }));
let tight = SurfaceGeometry::tight(4, 4);
assert!(!copy_rows(&[0u8; 16], &mut [0u8; 64], tight));
}
#[test]
fn chapter_portable_host_identity_resolves() {
use rust_widgets::platform::types::Platform;
let host = rust_widgets::platform::portable::instance();
assert_eq!(host.backend_name(), rust_widgets::platform::portable::BACKEND_NAME);
assert_eq!(host.backend_name(), "portable");
assert_eq!(
rust_widgets::platform::portable::FAMILY,
PlatformFamily::Embedded,
"the chapter explains why reporting Desktop would be wrong"
);
}
#[test]
fn chapter_capability_contract_resolves() {
let expected = default_capabilities_for(PlatformFamily::Embedded);
let _ = (expected.dpi_scaling, expected.ime, expected.native_menu);
}
#[cfg(not(alloc_frugal))]
#[test]
fn chapter_platform_runtime_resolves_where_it_exists() {
let _: fn() -> &'static str = rust_widgets::platform::backend_name;
let _ = rust_widgets::platform::capabilities();
let _ = rust_widgets::platform::get_platform();
let _: fn() = rust_widgets::platform::quit;
}
#[test]
fn chapter_does_not_name_a_missing_module() {
let chapter = include_str!("../cookbook/en/src/chapters/embedded.md");
let offending: Vec<&str> = chapter
.lines()
.filter(|line| line.trim_start().starts_with("use rust_widgets::embedded::"))
.collect();
assert!(
offending.is_empty(),
"the embedded chapter has code importing `rust_widgets::embedded::…`, which does not \
exist in the crate: {offending:?} — either add the module or fix the chapter"
);
for required in [
"profile::profile_name",
"set_embedded_target_fps",
"submit_embedded_task",
"embedded_engine_stats",
"SurfaceGeometry",
"copy_rows",
"FrameBuffer",
"supports_surfaces",
] {
assert!(
chapter.contains(required),
"the embedded chapter no longer teaches `{required}`, so it has lost the \
walkthrough the tripwire exists to protect"
);
}
}
#[test]
fn chapter_runnable_example_exists() {
let path = concat!(env!("CARGO_MANIFEST_DIR"), "/examples/embedded_host.rs");
assert!(
std::path::Path::new(path).is_file(),
"the embedded chapter tells readers to run `examples/embedded_host.rs`, \
which is missing"
);
}