roplat 0.2.2

roplat: just a robot operation system
Documentation
// 滤波器节点测试
use roplat::node::*;

#[cfg(test)]
mod tests {
    use super::*;

    #[tokio::test]
    async fn test_moving_average() {
        let mut filter = filter::MovingAverage::<f64>::new(3);

        // 第一个值
        let result = filter.process(10.0).await.unwrap();
        assert_eq!(result, 10.0);

        // 第二个值
        let result = filter.process(20.0).await.unwrap();
        assert_eq!(result, 15.0);

        // 第三个值
        let result = filter.process(30.0).await.unwrap();
        assert_eq!(result, 20.0);

        // 第四个值(窗口满了,会丢弃第一个)
        let result = filter.process(40.0).await.unwrap();
        assert_eq!(result, 30.0); // (20+30+40)/3
    }

    #[tokio::test]
    async fn test_exponential_moving_average() {
        let mut filter = filter::ExponentialMovingAverage::<f64>::new(0.5);

        let result = filter.process(10.0).await.unwrap();
        assert_eq!(result, 10.0);

        let result = filter.process(20.0).await.unwrap();
        assert_eq!(result, 15.0); // 0.5*20 + 0.5*10

        let result = filter.process(30.0).await.unwrap();
        assert_eq!(result, 22.5); // 0.5*30 + 0.5*15
    }

    #[tokio::test]
    async fn test_median_filter() {
        let mut filter = filter::MedianFilter::<f64>::new(3);

        let _ = filter.process(10.0).await.unwrap();
        let _ = filter.process(20.0).await.unwrap();
        let result = filter.process(30.0).await.unwrap();
        assert_eq!(result, 20.0);

        // 添加脉冲噪声
        let result = filter.process(1000.0).await.unwrap(); // [20, 30, 1000] -> 中值 30
        assert_eq!(result, 30.0);
    }

    #[tokio::test]
    async fn test_rate_limiter() {
        let mut limiter = filter::RateLimiter::<f64>::new(5.0);

        let result = limiter.process(10.0).await.unwrap();
        assert_eq!(result, 10.0);

        // 变化在限制内
        let result = limiter.process(14.0).await.unwrap();
        assert_eq!(result, 14.0);

        // 变化超过限制
        let result = limiter.process(25.0).await.unwrap();
        assert_eq!(result, 19.0); // 14 + 5
    }

    #[tokio::test]
    async fn test_deadzone_filter() {
        let mut filter = filter::DeadzoneFilter::<f64>::new(2.0);

        let result = filter.process(10.0).await.unwrap();
        assert_eq!(result, 10.0);

        // 变化在死区内
        let result = filter.process(11.0).await.unwrap();
        assert_eq!(result, 10.0); // 保持不变

        // 变化超过死区
        let result = filter.process(15.0).await.unwrap();
        assert_eq!(result, 15.0);
    }

    #[tokio::test]
    async fn test_low_pass_filter() {
        let mut filter = filter::LowPassFilter::<f64>::new(1.0);

        let result = filter.process(10.0).await.unwrap();
        assert_eq!(result, 10.0);

        let result = filter.process(20.0).await.unwrap();
        assert_eq!(result, 15.0); // 10 + (20-10)/2
    }

    #[tokio::test]
    async fn test_filter_chain() {
        // 测试滤波器链
        let mut ma = filter::MovingAverage::<f64>::new(3);
        let mut limiter = filter::RateLimiter::<f64>::new(5.0);

        // 输入数据
        let inputs = vec![10.0, 20.0, 30.0, 100.0];

        for input in inputs {
            let filtered = ma.process(input).await.unwrap();
            let _ = limiter.process(filtered).await.unwrap();
        }

        // 验证最终输出在限制内
        let result = limiter.process(50.0).await.unwrap();
        assert!(result <= 55.0); // 上一个输出 + 5
    }
}