json_matcher/matchers/
value.rs

1use serde_json::Value;
2
3use crate::{
4    ArrayMatcherRefs, BooleanMatcher, IntegerMatcher, JsonMatcher, JsonMatcherError, NullMatcher,
5    NumberMatcher, ObjectMatcherRefs, StrMatcher,
6};
7
8impl JsonMatcher for Value {
9    fn json_matches(&self, value: &Value) -> Vec<JsonMatcherError> {
10        match self {
11            Value::Null => NullMatcher::new().json_matches(value),
12            Value::Bool(x) => BooleanMatcher::exact(*x).json_matches(value),
13            Value::Number(number) => match number.as_i64() {
14                Some(integer) => IntegerMatcher::new(integer).json_matches(value),
15                None => NumberMatcher::new(number.as_f64().unwrap()).json_matches(value),
16            },
17            Value::String(x) => StrMatcher::new(x).json_matches(value),
18            Value::Array(vec) => {
19                ArrayMatcherRefs::new(vec.iter().map(|x| x as &dyn JsonMatcher).collect())
20                    .json_matches(value)
21            }
22            Value::Object(map) => ObjectMatcherRefs::new(
23                false,
24                map.into_iter()
25                    .map(|(k, v)| (k.as_str(), v as &dyn JsonMatcher))
26                    .collect(),
27            )
28            .json_matches(value),
29        }
30    }
31}
32
33impl JsonMatcher for &Value {
34    fn json_matches(&self, value: &Value) -> Vec<JsonMatcherError> {
35        (*self).json_matches(value)
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use serde_json::{json, Number};
42
43    use crate::{ArrayMatcher, ObjectMatcher};
44
45    use super::*;
46
47    #[test]
48    fn test_value_json_matcher_impl() {
49        // null
50        assert_eq!(
51            Value::Null.json_matches(&Value::Null),
52            NullMatcher::new().json_matches(&Value::Null)
53        );
54        assert_eq!(
55            Value::Null.json_matches(&Value::String("hello".to_owned())),
56            NullMatcher::new().json_matches(&Value::String("hello".to_owned()))
57        );
58        // bool
59        assert_eq!(
60            Value::Bool(true).json_matches(&Value::Bool(true)),
61            BooleanMatcher::exact(true).json_matches(&Value::Bool(true))
62        );
63        assert_eq!(
64            Value::Bool(true).json_matches(&Value::Bool(false)),
65            BooleanMatcher::exact(true).json_matches(&Value::Bool(false))
66        );
67        // number
68        assert_eq!(
69            Value::Number(Number::from(1)).json_matches(&Value::Number(Number::from(1))),
70            IntegerMatcher::new(1).json_matches(&Value::Number(Number::from(1)))
71        );
72        assert_eq!(
73            Value::Number(Number::from(1)).json_matches(&Value::Number(Number::from(2))),
74            IntegerMatcher::new(1).json_matches(&Value::Number(Number::from(2)))
75        );
76        // string
77        assert_eq!(
78            Value::String("hello".to_string()).json_matches(&Value::String("hello".to_string())),
79            StrMatcher::new("hello").json_matches(&Value::String("hello".to_string()))
80        );
81        assert_eq!(
82            Value::String("hello".to_string()).json_matches(&Value::String("world".to_string())),
83            StrMatcher::new("hello").json_matches(&Value::String("world".to_string()))
84        );
85        // array
86        assert_eq!(
87            json!([1, 2]).json_matches(&json!([1, 2])),
88            ArrayMatcher::new()
89                .element(1)
90                .element(2)
91                .json_matches(&json!([1, 2]))
92        );
93        assert_eq!(
94            json!([1, 2]).json_matches(&json!([1, 3])),
95            ArrayMatcher::new()
96                .element(1)
97                .element(2)
98                .json_matches(&json!([1, 3]))
99        );
100        // object
101        assert_eq!(
102            json!({"a": true}).json_matches(&json!({"a": true})),
103            ObjectMatcher::new()
104                .field("a", true)
105                .json_matches(&json!({"a": true}))
106        );
107        assert_eq!(
108            json!({"a": true}).json_matches(&json!({"a": false})),
109            ObjectMatcher::new()
110                .field("a", true)
111                .json_matches(&json!({"a": false}))
112        );
113    }
114}