rust_dynamic 0.49.0

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

    #[test]
    fn test_conv_float_float() {
        let val = Value::from(42.0 as f64).unwrap().conv(FLOAT).unwrap();
        assert_eq!(val.cast_float().unwrap(), 42.0 as f64);
    }
    #[test]
    fn test_conv_float_int() {
        let val = Value::from(42.0 as f64).unwrap().conv(INTEGER).unwrap();
        assert_eq!(val.cast_int().unwrap(), 42 as i64);
    }
    #[test]
    fn test_conv_float_bool() {
        let val = Value::from(42.0 as f64).unwrap().conv(BOOL).unwrap();
        assert_eq!(val.cast_bool().unwrap(), true);
    }
    #[test]
    fn test_conv_float_string() {
        let val = Value::from(42.0 as f64).unwrap().conv(STRING).unwrap();
        assert_eq!(val.cast_string().unwrap(), "42.0");
    }
    #[test]
    fn test_conv_float_textbuffer() {
        let val = Value::from(42.0 as f64).unwrap().conv(TEXTBUFFER).unwrap();
        assert_eq!(val.cast_string().unwrap(), "42.0");
    }
    #[test]
    fn test_conv_float_list_check_len() {
        let val = Value::from(42.0 as f64).unwrap().conv(LIST).unwrap();
        assert_eq!(val.len(), 1);
    }
    #[test]
    fn test_conv_float_list() {
        let val = Value::from(42.0 as f64).unwrap().conv(LIST).unwrap();
        assert_eq!(val.cast_list().unwrap()[0].cast_float().unwrap(), 42.0 as f64);
    }

    #[test]
    fn test_conv_int_float() {
        let val = Value::from(42 as i64).unwrap().conv(FLOAT).unwrap();
        assert_eq!(val.cast_float().unwrap(), 42.0 as f64);
    }
    #[test]
    fn test_conv_int_int() {
        let val = Value::from(42 as i64).unwrap().conv(INTEGER).unwrap();
        assert_eq!(val.cast_int().unwrap(), 42 as i64);
    }
    #[test]
    fn test_conv_int_bool() {
        let val = Value::from(42 as i64).unwrap().conv(BOOL).unwrap();
        assert_eq!(val.cast_bool().unwrap(), true);
    }
    #[test]
    fn test_conv_int_string() {
        let val = Value::from(42 as i64).unwrap().conv(STRING).unwrap();
        assert_eq!(val.cast_string().unwrap(), "42");
    }
    #[test]
    fn test_conv_int_list_check_len() {
        let val = Value::from(42 as i64).unwrap().conv(LIST).unwrap();
        assert_eq!(val.len(), 1);
    }
    #[test]
    fn test_conv_int_list() {
        let val = Value::from(42 as i64).unwrap().conv(LIST).unwrap();
        assert_eq!(val.cast_list().unwrap()[0].cast_int().unwrap(), 42 as i64);
    }
    #[test]
    fn test_conv_string_bool() {
        let val = Value::from("true").unwrap().conv(BOOL).unwrap();
        assert_eq!(val.cast_bool().unwrap(), true);
    }
    #[test]
    fn test_conv_string_float() {
        let val = Value::from("42.0").unwrap().conv(FLOAT).unwrap();
        assert_eq!(val.cast_float().unwrap(), 42.0 as f64);
    }
    #[test]
    fn test_conv_string_int() {
        let val = Value::from("42").unwrap().conv(INTEGER).unwrap();
        assert_eq!(val.cast_int().unwrap(), 42 as i64);
    }
    #[test]
    fn test_conv_textbuffer_string() {
        let val = Value::text_buffer("42".to_string()).conv(STRING).unwrap();
        assert_eq!(val.cast_string().unwrap(), "42");
    }
    #[test]
    fn test_conv_bool_list_check_len() {
        let val = Value::from(true).unwrap().conv(LIST).unwrap();
        assert_eq!(val.len(), 1);
    }
    #[test]
    fn test_conv_bool_list() {
        let val = Value::from(true).unwrap().conv(LIST).unwrap();
        assert!(val.cast_list().unwrap()[0].cast_bool().unwrap());
    }
    #[test]
    fn test_conv_bool_float() {
        let val = Value::from(true).unwrap().conv(FLOAT).unwrap();
        assert_eq!(val.cast_float().unwrap(), 1.0 as f64);
    }
    #[test]
    fn test_conv_list_string() {
        let val = Value::from(vec![Value::from_int(42)]).unwrap().conv(STRING).unwrap();
        assert_eq!(val.cast_string().unwrap(), "[ 42 :: ]");
    }
    #[test]
    fn test_conv_list_string_with_call() {
        let val = Value::from(vec![Value::from_int(42), Value::call(".".to_string(), Vec::new())]).unwrap().conv(STRING).unwrap();
        assert_eq!(val.cast_string().unwrap(), "[ 42 ::  F(.) :: ]");
    }
    #[test]
    fn test_conv_list_bool() {
        let val = Value::from(vec![Value::from_int(42)]).unwrap().conv(BOOL).unwrap();
        assert!(val.cast_bool().unwrap());
    }
    #[test]
    fn test_conv_map_string() {
        let val = Value::dict()
            .set("answer".to_string(), Value::from(42 as i64).unwrap())
            .conv(STRING).unwrap();
        assert_eq!(val.cast_string().unwrap(), "{ answer=42 :: }");
    }
    #[test]
    fn test_conv_map_textbuffer() {
        let val = Value::dict()
            .set("answer".to_string(), Value::from(42 as i64).unwrap())
            .conv(TEXTBUFFER).unwrap();
        assert_eq!(val.cast_string().unwrap(), "{ answer=42 :: }");
    }
    #[test]
    fn test_conv_map_list() {
        let val = Value::dict()
            .set("answer".to_string(), Value::from(42 as i64).unwrap())
            .conv(LIST).unwrap();
        assert_eq!(val.cast_list().unwrap()[0].cast_list().unwrap()[1].cast_int().unwrap(), 42 as i64);
    }
    #[test]
    fn test_conv_list_map() {
        let val = Value::from(vec![Value::from_int(42)]).unwrap().conv(MAP).unwrap();
        let val2 = val.get("0".to_string()).unwrap();
        assert_eq!(val2.cast_int().unwrap(), 42 as i64);
    }
    #[test]
    fn test_conv_matrix_list() {
        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 val = m1.conv(LIST).unwrap();
        let list_val = val.cast_list().unwrap();
        let row = list_val[0].cast_list().unwrap();
        assert_eq!(row[0].cast_float().unwrap(), 42.0 as f64);
    }
    #[test]
    fn test_conv_list_matrix() {
        let mut m1 = Value::list();
        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 val = m1.conv(MATRIX).unwrap();
        let mat_val = val.cast_matrix().unwrap();
        assert_eq!(mat_val[0][0].cast_float().unwrap(), 42.0 as f64);
    }
    #[test]
    fn test_conv_lambda_string() {
        let val = Value::to_lambda(vec![Value::from_int(42)]).conv(STRING).unwrap();
        assert_eq!(val.cast_string().unwrap(), "lambda[ 42 :: ]");
    }
    #[test]
    fn test_conv_bin_string() {
        let mut v = Value::binary();
        v = v.push(Value::from_string("Hello"));
        let sv = v.conv(STRING).unwrap();
        assert_eq!(sv.cast_string().unwrap(),  "Hello");
    }
}