typebox 0.1.0

JSON Schema type construction with validation, code generation, and binary layout
Documentation
//! Structural equality comparison.

use crate::value::Value;

/// Check if two values are structurally equal.
pub fn equal(a: &Value, b: &Value) -> bool {
    a == b
}

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

    #[test]
    fn test_equal_primitives() {
        assert!(equal(&Value::Null, &Value::Null));
        assert!(equal(&Value::Bool(true), &Value::Bool(true)));
        assert!(!equal(&Value::Bool(true), &Value::Bool(false)));
        assert!(equal(&Value::Int64(42), &Value::Int64(42)));
        assert!(!equal(&Value::Int64(42), &Value::Int64(43)));
        assert!(equal(&Value::Float64(3.14), &Value::Float64(3.14)));
        assert!(equal(
            &Value::String("hello".to_string()),
            &Value::String("hello".to_string())
        ));
        assert!(!equal(
            &Value::String("hello".to_string()),
            &Value::String("world".to_string())
        ));
    }

    #[test]
    fn test_equal_type_mismatch() {
        assert!(!equal(&Value::Int64(1), &Value::Float64(1.0)));
        assert!(!equal(&Value::Int64(1), &Value::String("1".to_string())));
        assert!(!equal(&Value::Bool(true), &Value::Int64(1)));
    }

    #[test]
    fn test_equal_arrays() {
        let a = Value::Array(vec![Value::Int64(1), Value::Int64(2), Value::Int64(3)]);
        let b = Value::Array(vec![Value::Int64(1), Value::Int64(2), Value::Int64(3)]);
        assert!(equal(&a, &b));

        let c = Value::Array(vec![Value::Int64(1), Value::Int64(2)]);
        assert!(!equal(&a, &c));

        let d = Value::Array(vec![Value::Int64(1), Value::Int64(2), Value::Int64(4)]);
        assert!(!equal(&a, &d));
    }

    #[test]
    fn test_equal_objects() {
        let mut map_a = IndexMap::new();
        map_a.insert("id".to_string(), Value::Int64(1));
        map_a.insert("name".to_string(), Value::String("test".to_string()));
        let a = Value::Object(map_a);

        let mut map_b = IndexMap::new();
        map_b.insert("id".to_string(), Value::Int64(1));
        map_b.insert("name".to_string(), Value::String("test".to_string()));
        let b = Value::Object(map_b);

        assert!(equal(&a, &b));

        let mut map_c = IndexMap::new();
        map_c.insert("id".to_string(), Value::Int64(2));
        let c = Value::Object(map_c);
        assert!(!equal(&a, &c));
    }

    #[test]
    fn test_equal_typed_arrays() {
        assert!(equal(
            &Value::Float32Array(vec![1.0, 2.0, 3.0]),
            &Value::Float32Array(vec![1.0, 2.0, 3.0])
        ));
        assert!(!equal(
            &Value::Float32Array(vec![1.0, 2.0, 3.0]),
            &Value::Float64Array(vec![1.0, 2.0, 3.0])
        ));
        assert!(equal(
            &Value::Bytes(vec![1, 2, 3]),
            &Value::Bytes(vec![1, 2, 3])
        ));
        assert!(!equal(
            &Value::Bytes(vec![1, 2, 3]),
            &Value::Bytes(vec![1, 2])
        ));
    }

    #[test]
    fn test_equal_nested() {
        let mut inner = IndexMap::new();
        inner.insert("nested".to_string(), Value::Int64(42));

        let mut outer_a = IndexMap::new();
        outer_a.insert("inner".to_string(), Value::Object(inner.clone()));
        let a = Value::Object(outer_a);

        let mut outer_b = IndexMap::new();
        outer_b.insert("inner".to_string(), Value::Object(inner));
        let b = Value::Object(outer_b);

        assert!(equal(&a, &b));
    }
}