diff --git a/src/render.rs b/src/render.rs index 6e7ae9b..b6b35b1 100644 --- a/src/render.rs +++ b/src/render.rs @@ -3,6 +3,9 @@ use crate::sampler::{Sample, Sampler}; use crate::surface::Surface; use crate::Vector; +use mockall::automock; + +#[automock] pub trait Renderer { fn render(&mut self, step: f32); fn present(&mut self) -> Result<(), Error>; diff --git a/src/runner.rs b/src/runner.rs index 6ff01be..217a7cc 100644 --- a/src/runner.rs +++ b/src/runner.rs @@ -19,7 +19,7 @@ impl Runner { } pub fn run(mut self) -> Result<(), Error> { - for i in 0..self.ticks { + for i in 0..=self.ticks { let step = i as f32 / self.ticks as f32; self.renderer.render(step); @@ -28,4 +28,41 @@ impl Runner { } self.renderer.finish() } +} + +#[cfg(test)] +mod test { + use std::time::Duration; + use mockall::predicate::*; + use mockall::Sequence; + use crate::timer::MockTimer; + use crate::render::MockRenderer; + use super::*; + + #[test] + fn run() { + let mut timer = MockTimer::new(); + let mut renderer = MockRenderer::new(); + let seq = &mut Sequence::new(); + + timer.expect_delay().return_const(Duration::from_secs(2)); + + renderer.expect_render().once().with(eq(0.0)).in_sequence(seq).return_const(()); + renderer.expect_present().once().in_sequence(seq).returning(|| Ok(())); + timer.expect_sleep().once().in_sequence(seq).return_const(()); + + renderer.expect_render().once().with(eq(0.5)).in_sequence(seq).return_const(()); + renderer.expect_present().once().in_sequence(seq).returning(|| Ok(())); + timer.expect_sleep().once().in_sequence(seq).return_const(()); + + renderer.expect_render().once().with(eq(1.0)).in_sequence(seq).return_const(()); + renderer.expect_present().once().in_sequence(seq).returning(|| Ok(())); + timer.expect_sleep().once().in_sequence(seq).return_const(()); + + renderer.expect_finish().once().in_sequence(seq).returning(|| Ok(())); + + let runner = Runner::new(Duration::from_secs(4), timer, renderer); + + runner.run().unwrap(); + } } \ No newline at end of file