la_rete/json/js_value_heq/
js_value_eq.rs1use 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}