rust_dynamic 0.48.0

Support for dynamically-typed values in run-time
Documentation
#[cfg(test)]
mod tests {
    #![allow(unused_imports)]
    use super::*;
    use rust_dynamic::value::Value;

    #[test]
    fn test_math_add() {
        let mut x = Value::from(1.0 as f64).unwrap();
        let y = Value::from(41.0 as f64).unwrap();
        x = x + y;
        assert_eq!(x.cast_float().unwrap(), 42.0);
    }
    #[test]
    fn test_math_add_with_q() {
        let mut x = Value::from(1.0 as f64).unwrap()
                    .set_q(50.0).clone();
        let y = Value::from(41.0 as f64).unwrap();
        x = x + y;
        assert_eq!(x.get_q(), 75.0);
    }
    #[test]
    fn test_math_sub() {
        let mut x = Value::from(43.0 as f64).unwrap();
        let y = Value::from(1.0 as f64).unwrap();
        x = x - y;
        assert_eq!(x.cast_float().unwrap(), 42.0);
    }
    #[test]
    fn test_math_mul() {
        let mut x = Value::from(21.0 as f64).unwrap();
        let y = Value::from(2 as i64).unwrap();
        x = x * y;
        assert_eq!(x.cast_float().unwrap(), 42.0);
    }
    #[test]
    fn test_math_div() {
        let mut x = Value::from(84 as i64).unwrap();
        let y = Value::from(2 as i64).unwrap();
        x = x / y;
        assert_eq!(x.cast_int().unwrap(), 42);
    }
    #[test]
    fn test_string_add() {
        let mut x = Value::from("Hello").unwrap();
        let y = Value::from(" world").unwrap();
        x = x + y;
        assert_eq!(x.cast_string().unwrap(), "Hello world");
    }
    #[test]
    fn test_string_mul() {
        let mut x = Value::from("Hello").unwrap();
        let y = Value::from(2 as i64).unwrap();
        x = x * y;
        assert_eq!(x.cast_string().unwrap(), "HelloHello");
    }
    #[test]
    fn test_math_add_list1() {
        let mut x = Value::list();
        x = x.push(Value::from(41.0 as f64).unwrap())
             .push(Value::from(43.0 as f64).unwrap());
        let y = Value::from(43.0 as f64).unwrap();
        x = x + y;
        assert_eq!(x.len(), 3);
    }
    #[test]
    fn test_math_add_list2() {
        let mut x = Value::list();
        x = x.push(Value::from(41.0 as f64).unwrap())
             .push(Value::from(43.0 as f64).unwrap());
        let mut y = Value::list();
        y = y.push(Value::from(43.0 as f64).unwrap());
        x = x + y;
        assert_eq!(x.len(), 3);
    }
    #[test]
    fn test_add_matrix1() {
        let mut m1 = Value::matrix();
        let mut v1 = Value::list();
        v1 = v1.push(Value::from(42.0).unwrap());
        v1 = v1.push(Value::from(41.0).unwrap());
        m1 = m1.push(v1);
        let mut m2 = Value::matrix();
        let mut v2 = Value::list();
        v2 = v2.push(Value::from(43.0).unwrap());
        v2 = v2.push(Value::from(44.0).unwrap());
        m2 = m2.push(v2);
        m1 = m1 + m2;
        assert_eq!(m1.len(), 2);
    }
    #[test]
    fn test_add_matrix3() {
        let mut m1 = Value::matrix();
        let mut v1 = Value::list();
        v1 = v1.push(Value::from(42.0).unwrap());
        v1 = v1.push(Value::from(41.0).unwrap());
        m1 = m1.push(v1);
        let mut m2 = Value::matrix();
        let mut v2 = Value::list();
        v2 = v2.push(Value::from(43.0).unwrap());
        v2 = v2.push(Value::from(44.0).unwrap());
        m2 = m2.push(v2);
        m1 = m1 + m2;
        let m1_vec = m1.cast_matrix().unwrap();
        assert_eq!(m1_vec[0][0].cast_float().unwrap(), 85.0 as f64);
    }
    #[test]
    fn test_add_matrix2() {
        let mut m1 = Value::matrix();
        let mut v1 = Value::list();
        v1 = v1.push(Value::from(42.0).unwrap());
        v1 = v1.push(Value::from(41.0).unwrap());
        m1 = m1.push(v1);
        let mut v2 = Value::list();
        v2 = v2.push(Value::from(43.0).unwrap());
        v2 = v2.push(Value::from(44.0).unwrap());
        m1 = m1 + v2;
        assert_eq!(m1.len(), 4);
    }
    #[test]
    fn test_textbuffer_add_string() {
        let mut x = Value::text_buffer("Hello".to_string());
        let y = Value::from(" world").unwrap();
        x = x + y;
        assert_eq!(x.cast_string().unwrap(), "Hello world");
    }
    #[test]
    fn test_binary_add_string() {
        use rust_dynamic::types::STRING;
        let mut x = Value::binary();
        x = x.push(Value::from_string("Hello "));
        let y = Value::from("world").unwrap();
        x = x + y;
        assert_eq!(x.conv(STRING).unwrap().cast_string().unwrap(), "Hello world");
    }

    #[test]
    fn test_textbuffer_add_float() {
        let mut x = Value::text_buffer("Hello ".to_string());
        let y = Value::from(3.14).unwrap();
        x = x + y;
        assert_eq!(x.cast_string().unwrap(), "Hello 3.14");
    }
    #[test]
    fn test_math_json_merge() {
        let mut x = Value::json(serde_json::json!([1]));
        let y = Value::json(serde_json::json!([2]));
        x = x + y;
        println!("{:?}", x.cast_json());
        assert_eq!(x.cast_json().unwrap().as_array().unwrap().len(), 2);
    }
    #[test]
    fn test_math_metrics_push_through_add() {
        let mut x = Value::metrics();
        for n in 1..129 {
            x = x + Value::from(n as f64).unwrap();
        }
        let m = x.car().expect("expecting car");
        assert_eq!(m.get("value").unwrap().cast_float().unwrap(), 1.0 as f64);
    }
}