cranpose-testing 0.1.164

Testing utilities and harness for Cranpose
use super::*;

#[test]
fn test_robot_creation() {
    let robot = create_headless_robot_test(800, 600, || {});

    assert_eq!(robot.viewport_size(), (800, 600));
}

#[test]
fn test_robot_click() {
    let mut robot = create_headless_robot_test(800, 600, || {});

    robot.click_at(100.0, 100.0);
}

#[test]
fn test_robot_drag() {
    let mut robot = create_headless_robot_test(800, 600, || {});

    robot.drag(0.0, 0.0, 100.0, 100.0);
}

#[test]
fn robot_advance_time_uses_supplied_frame_delta() {
    let mut robot = create_headless_robot_test(800, 600, || {});

    robot.advance_time(16_000_000);
    assert_eq!(robot.frame_time_nanos(), 16_000_000);

    robot.advance_time(8_000_000);
    assert_eq!(robot.frame_time_nanos(), 24_000_000);
}

#[test]
fn robot_idle_pump_settles_a_healthy_app_far_inside_its_budget() {
    let mut robot = create_headless_robot_test(800, 600, || {});

    for _ in 0..HEADLESS_IDLE_UPDATE_LIMIT {
        robot.wait_for_idle();
        assert!(!robot.shell_mut().needs_redraw());
    }
}

#[derive(Default)]
struct NeverWarmRenderer {
    inner: TestRenderer,
}

impl Renderer for NeverWarmRenderer {
    type Scene = Scene;
    type Error = ();

    fn attach_app_context_services(&mut self, app_context: &cranpose_ui::AppContext) {
        self.inner.attach_app_context_services(app_context);
    }

    fn scene(&self) -> &Self::Scene {
        self.inner.scene()
    }

    fn scene_mut(&mut self) -> &mut Self::Scene {
        self.inner.scene_mut()
    }

    fn rebuild_scene(
        &mut self,
        layout_tree: &LayoutTree,
        viewport: Size,
    ) -> Result<(), Self::Error> {
        self.inner.rebuild_scene(layout_tree, viewport)
    }

    fn rebuild_scene_from_applier(
        &mut self,
        applier: &mut cranpose_core::MemoryApplier,
        root: cranpose_core::NodeId,
        viewport: Size,
    ) -> Result<(), Self::Error> {
        self.inner
            .rebuild_scene_from_applier(applier, root, viewport)
    }

    fn needs_frame_warmup(&self) -> bool {
        true
    }
}

#[test]
#[should_panic(expected = "still wants a redraw after")]
fn robot_idle_pump_fails_loudly_when_the_shell_never_settles() {
    let mut robot = RobotTestRule::new(800, 600, NeverWarmRenderer::default(), || {});

    robot.wait_for_idle();
}