la_rete/json/js_value_heq/
js_value_eq.rs

1use json_utils::json::JsMap;
2use json_utils::json::JsValue;
3
4pub fn js_value_eq(left: &JsValue, right: &JsValue) -> bool {
5    match (left, right) {
6        (JsValue::Null, JsValue::Null) => true,
7        (JsValue::Bool(left), JsValue::Bool(right)) => left == right,
8        (JsValue::String(left), JsValue::String(right)) => left == right,
9        (JsValue::Number(left), JsValue::Number(right)) => left == right,
10        (JsValue::Array(left), JsValue::Array(right)) => js_array_eq(left, right),
11        (JsValue::Object(left), JsValue::Object(right)) => js_object_eq(left, right),
12        (_, _) => false,
13    }
14}
15
16fn js_array_eq(left: &Vec<JsValue>, right: &Vec<JsValue>) -> bool {
17    if left.len() == right.len() {
18        left.iter()
19            .zip(right.iter())
20            .all(|(left, right)| js_value_eq(left, right))
21    } else {
22        false
23    }
24}
25
26fn js_object_eq(left: &JsMap<String, JsValue>, right: &JsMap<String, JsValue>) -> bool {
27    if left.len() == right.len() {
28        left.keys().all(|key| {
29            if let (Some(left), Some(right)) = (left.get(key), right.get(key)) {
30                js_value_eq(left, right)
31            } else {
32                false
33            }
34        })
35    } else {
36        false
37    }
38}
39
40#[test]
41fn test_01_eq_neq() {
42    assert!(js_value_eq(&json!(null), &json!(null)));
43    assert!(!js_value_eq(&json!(null), &json!(false)));
44    assert!(!js_value_eq(&json!(null), &json!(true)));
45
46    assert!(js_value_eq(&json!(true), &json!(true)));
47    assert!(js_value_eq(&json!(false), &json!(false)));
48    assert!(!js_value_eq(&json!(true), &json!(false)));
49
50    assert!(js_value_eq(&json!("a string"), &json!("a string")));
51    assert!(!js_value_eq(&json!("a string"), &json!("another one")));
52
53    assert!(js_value_eq(&json!(1), &json!(1)));
54    assert!(!js_value_eq(&json!(1), &json!(2)));
55
56    assert!(js_value_eq(&json!(-1), &json!(-1)));
57    assert!(!js_value_eq(&json!(-1), &json!(1)));
58    assert!(!js_value_eq(&json!(-1), &json!(-2)));
59
60    assert!(js_value_eq(&json!(1.0), &json!(1.0)));
61    assert!(js_value_eq(&json!(1.1), &json!(1.1)));
62    assert!(!js_value_eq(&json!(1), &json!(1.1)));
63    assert!(!js_value_eq(&json!(1.2), &json!(1.1)));
64
65    assert!(js_value_eq(&json!([]), &json!([])));
66    assert!(js_value_eq(&json!([1]), &json!([1])));
67    assert!(js_value_eq(&json!([1, 2]), &json!([1, 2])));
68    assert!(js_value_eq(&json!([1, 2, 3]), &json!([1, 2, 3])));
69
70    assert!(!js_value_eq(&json!([]), &json!([0])));
71    assert!(!js_value_eq(&json!([1]), &json!([1, 0])));
72    assert!(!js_value_eq(&json!([1, 2]), &json!([1, 2, 0])));
73    assert!(!js_value_eq(&json!([1, 2, 3]), &json!([1, 2, 3, 0])));
74
75    assert!(!js_value_eq(&json!([1, 2]), &json!([2, 1])));
76    assert!(!js_value_eq(&json!([1, 2, 3]), &json!([1, 3, 2])));
77
78    assert!(js_value_eq(&json!({}), &json!({})));
79    assert!(js_value_eq(&json!({"a": 1}), &json!({"a": 1})));
80    assert!(js_value_eq(
81        &json!({"a": 1, "b": 2}),
82        &json!({"a": 1, "b": 2})
83    ));
84    assert!(js_value_eq(
85        &json!({"a": 1, "b": 2}),
86        &json!({"b": 2, "a": 1})
87    ));
88
89    assert!(!js_value_eq(&json!({"a": "1"}), &json!({"a": 1})));
90    assert!(!js_value_eq(
91        &json!({"a": 1, "b": "2"}),
92        &json!({"a": 1, "b": 2})
93    ));
94    assert!(!js_value_eq(
95        &json!({"a": 1, "b": "2"}),
96        &json!({"b": 2, "a": 1})
97    ));
98
99    assert!(!js_value_eq(&json!({}), &json!({"_": 0})));
100    assert!(!js_value_eq(&json!({"a": 1}), &json!({"a": 1, "_": 0})));
101    assert!(!js_value_eq(
102        &json!({"a": 1, "b": 2}),
103        &json!({"a": 1, "b": 2, "_": 0})
104    ));
105    assert!(!js_value_eq(
106        &json!({"a": 1, "b": 2}),
107        &json!({"b": 2, "a": 1, "_": 0})
108    ));
109    assert!(!js_value_eq(
110        &json!({"b": 2, "c": 1}),
111        &json!({"a": 1, "b": 2})
112    ));
113}