use revue::utils::animation::Interpolatable;
use revue::utils::animation::{Keyframe, Keyframes};
use revue::utils::easing::Easing;
#[derive(Clone, Debug, PartialEq)]
struct TestValue(f64);
impl Interpolatable for TestValue {
fn lerp(&self, other: &Self, t: f64) -> Self {
TestValue(self.0 + (other.0 - self.0) * t)
}
}
#[test]
fn test_keyframe_new() {
let kf = Keyframe::new(0.5, TestValue(10.0));
assert_eq!(kf.time, 0.5);
assert_eq!(kf.value.0, 10.0);
assert_eq!(kf.easing, Easing::Linear);
}
#[test]
fn test_keyframe_new_clamps_time_low() {
let kf = Keyframe::new(-0.5, TestValue(5.0));
assert_eq!(kf.time, 0.0); }
#[test]
fn test_keyframe_new_clamps_time_high() {
let kf = Keyframe::new(1.5, TestValue(15.0));
assert_eq!(kf.time, 1.0); }
#[test]
fn test_keyframe_easing() {
let kf = Keyframe::new(0.5, TestValue(10.0)).easing(Easing::InQuad);
assert_eq!(kf.easing, Easing::InQuad);
}
#[test]
fn test_keyframe_easing_chainable() {
let kf = Keyframe::new(0.5, TestValue(10.0))
.easing(Easing::OutQuad)
.easing(Easing::InElastic);
assert_eq!(kf.easing, Easing::InElastic);
}
#[test]
fn test_keyframes_new() {
let kfs: Keyframes<TestValue> = Keyframes::new();
assert!(kfs.is_empty());
assert_eq!(kfs.len(), 0);
}
#[test]
fn test_keyframes_default() {
let kfs: Keyframes<TestValue> = Keyframes::default();
assert!(kfs.is_empty());
}
#[test]
fn test_keyframes_add() {
let kfs = Keyframes::new()
.add(0.0, TestValue(0.0))
.add(0.5, TestValue(50.0))
.add(1.0, TestValue(100.0));
assert_eq!(kfs.len(), 3);
}
#[test]
fn test_keyframes_add_duplicate_time() {
let kfs = Keyframes::new()
.add(0.5, TestValue(10.0))
.add(0.5, TestValue(20.0));
assert_eq!(kfs.len(), 2); }
#[test]
fn test_keyframes_len_empty() {
let kfs: Keyframes<TestValue> = Keyframes::new();
assert_eq!(kfs.len(), 0);
assert!(kfs.is_empty());
}
#[test]
fn test_keyframes_len_non_empty() {
let kfs = Keyframes::new().add(0.5, TestValue(10.0));
assert_eq!(kfs.len(), 1);
assert!(!kfs.is_empty());
}
#[test]
fn test_keyframes_at_empty() {
let kfs: Keyframes<TestValue> = Keyframes::new();
assert_eq!(kfs.at(0.5), None);
}
#[test]
fn test_keyframes_at_start() {
let kfs = Keyframes::new()
.add(0.0, TestValue(0.0))
.add(1.0, TestValue(100.0));
let result = kfs.at(0.0);
assert!(result.is_some());
assert_eq!(result.unwrap().0, 0.0);
}
#[test]
fn test_keyframes_at_end() {
let kfs = Keyframes::new()
.add(0.0, TestValue(0.0))
.add(1.0, TestValue(100.0));
let result = kfs.at(1.0);
assert!(result.is_some());
assert_eq!(result.unwrap().0, 100.0);
}
#[test]
fn test_keyframes_at_middle() {
let kfs = Keyframes::new()
.add(0.0, TestValue(0.0))
.add(1.0, TestValue(100.0));
let result = kfs.at(0.5);
assert!(result.is_some());
assert_eq!(result.unwrap().0, 50.0); }
#[test]
fn test_keyframes_at_before_start() {
let kfs = Keyframes::new()
.add(0.5, TestValue(50.0))
.add(1.0, TestValue(100.0));
let result = kfs.at(0.0);
assert!(result.is_some());
assert_eq!(result.unwrap().0, 50.0);
}
#[test]
fn test_keyframes_at_after_end() {
let kfs = Keyframes::new()
.add(0.0, TestValue(0.0))
.add(0.5, TestValue(50.0));
let result = kfs.at(1.0);
assert!(result.is_some());
assert_eq!(result.unwrap().0, 50.0);
}
#[test]
fn test_keyframes_at_with_easing() {
let kfs = Keyframes::new()
.add_eased(0.0, TestValue(0.0), Easing::Linear)
.add_eased(1.0, TestValue(100.0), Easing::InQuad);
let result = kfs.at(0.5);
assert!(result.is_some());
assert!((result.unwrap().0 - 25.0).abs() < 0.001);
}
#[test]
fn test_keyframes_at_three_keyframes() {
let kfs = Keyframes::new()
.add(0.0, TestValue(0.0))
.add(0.5, TestValue(50.0))
.add(1.0, TestValue(100.0));
let result = kfs.at(0.75);
assert!(result.is_some());
assert_eq!(result.unwrap().0, 75.0);
}
#[test]
fn test_keyframes_clone() {
let kfs1 = Keyframes::new()
.add(0.0, TestValue(0.0))
.add(1.0, TestValue(100.0));
let kfs2 = kfs1.clone();
assert_eq!(kfs1.len(), kfs2.len());
}