diff --git a/src/animation.rs b/src/animation.rs index 92cbfa74..2f62d5ab 100644 --- a/src/animation.rs +++ b/src/animation.rs @@ -642,6 +642,27 @@ fn cubic_bezier_point(x1: f32, y1: f32, x2: f32, y2: f32, t: f32) -> CurvePoint mod tests { use super::*; + use crate::cmm::cmm_manager::ColorManager; + + fn retained_for_tests() -> Rc { + let color_manager = ColorManager::new(); + Rc::new(RetainedToplevel { + offset: (0, 0), + surface: RetainedSurface { + offset: (0, 0), + size: (100, 100), + content: RetainedContent::Color { + color: Color::SOLID_BLACK, + alpha: None, + color_description: color_manager.srgb_gamma22().clone(), + render_intent: RenderIntent::Perceptual, + }, + below: vec![], + above: vec![], + }, + }) + } + #[test] fn linear_rect_interpolation_is_symmetric() { let a = Rect::new_sized_saturating(0, 0, 100, 100); @@ -669,6 +690,36 @@ mod tests { assert!(AnimationCurve::from_cubic_bezier(0.0, f32::NAN, 0.58, 1.0).is_none()); } + #[test] + fn spawn_out_frames_shrink_linearly_and_expire() { + let state = AnimationState::default(); + let retained = retained_for_tests(); + let from = Rect::new_sized_saturating(10, 20, 100, 80); + let to = spawn_in_start_rect(from); + assert!(state.set_spawn_out( + from, + 2, + retained.clone(), + true, + RetainedExitLayer::Floating, + 0, + 160 + )); + + let start = state.exit_frames(0); + assert_eq!(start.len(), 1); + assert_eq!(start[0].rect, from); + assert_eq!(start[0].source_body_size, (96, 76)); + assert!(start[0].active); + assert_eq!(start[0].layer, RetainedExitLayer::Floating); + assert!(Rc::ptr_eq(&start[0].retained, &retained)); + + let middle = state.exit_frames(80_000_000); + assert_eq!(middle.len(), 1); + assert_eq!(middle[0].rect, lerp_rect(from, to, 0.5)); + assert!(state.exit_frames(160_000_000).is_empty()); + } + #[test] fn unchanged_target_does_not_restart() { let state = AnimationState::default();