json_matcher/matchers/
value.rs1use 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 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 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 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 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 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 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}