use aws_smithy_types::{Document, Number};
use std::collections::HashMap;
fn variant_name(d: &Document) -> &'static str {
match d {
Document::Object(_) => "object",
Document::Array(_) => "array",
Document::Number(_) => "number",
Document::String(_) => "string",
Document::Bool(_) => "bool",
Document::Null => "null",
}
}
#[test]
fn exhaustive_six_arm_match_without_wildcard_compiles() {
let cases: Vec<(Document, &str)> = vec![
(Document::Object(HashMap::new()), "object"),
(Document::Array(Vec::new()), "array"),
(Document::Number(Number::PosInt(1)), "number"),
(Document::String("s".to_owned()), "string"),
(Document::Bool(true), "bool"),
(Document::Null, "null"),
];
for (doc, expected) in cases {
assert_eq!(variant_name(&doc), expected);
}
}
#[test]
fn object_variant_is_constructed_directly_from_a_hash_map() {
let mut map: HashMap<String, Document> = HashMap::new();
map.insert("k".to_owned(), Document::String("v".to_owned()));
let doc = Document::Object(map);
match doc {
Document::Object(inner) => {
let inner: HashMap<String, Document> = inner;
assert_eq!(inner.len(), 1);
assert_eq!(inner["k"], Document::String("v".to_owned()));
}
other => panic!("expected object, got {}", variant_name(&other)),
}
}
#[test]
fn as_object_returns_a_hash_map_reference() {
let mut map: HashMap<String, Document> = HashMap::new();
map.insert("a".to_owned(), Document::Bool(false));
let doc = Document::Object(map);
let got: Option<&HashMap<String, Document>> = doc.as_object();
assert_eq!(got.unwrap().len(), 1);
assert!(Document::Null.as_object().is_none());
}
#[test]
fn as_object_mut_returns_a_mutable_hash_map_reference() {
let mut doc = Document::Object(HashMap::new());
let got: Option<&mut HashMap<String, Document>> = doc.as_object_mut();
let map = got.expect("object");
map.insert("added".to_owned(), Document::Number(Number::NegInt(-1)));
map.reserve(4);
assert_eq!(
doc.as_object().unwrap()["added"],
Document::Number(Number::NegInt(-1))
);
assert!(Document::Null.as_object_mut().is_none());
}
#[test]
fn released_accessors_predicates_and_conversions_are_unchanged() {
let array = Document::Array(vec![Document::Null]);
let _: Option<&Vec<Document>> = array.as_array();
let mut array = array;
let _: Option<&mut Vec<Document>> = array.as_array_mut();
let _: Option<&Number> = Document::Number(Number::PosInt(1)).as_number();
let _: Option<&str> = Document::String("s".to_owned()).as_string();
let _: Option<bool> = Document::Bool(true).as_bool();
let _: Option<()> = Document::Null.as_null();
assert!(Document::Object(HashMap::new()).is_object());
assert!(Document::Array(Vec::new()).is_array());
assert!(Document::Number(Number::PosInt(0)).is_number());
assert!(Document::String(String::new()).is_string());
assert!(Document::Bool(false).is_bool());
assert!(Document::Null.is_null());
assert_eq!(Document::default(), Document::Null);
let mut map: HashMap<String, Document> = HashMap::new();
map.insert("x".to_owned(), 1u64.into());
let from_map: Document = map.into();
assert!(from_map.is_object());
let from_vec: Document = vec![Document::Null].into();
assert!(from_vec.is_array());
assert_eq!(Document::from("str"), Document::String("str".to_owned()));
assert_eq!(
Document::from("owned".to_owned()),
Document::String("owned".to_owned())
);
assert_eq!(Document::from(true), Document::Bool(true));
assert_eq!(Document::from(1u64), Document::Number(Number::PosInt(1)));
assert_eq!(Document::from(-1i64), Document::Number(Number::NegInt(-1)));
assert_eq!(Document::from(1.5f64), Document::Number(Number::Float(1.5)));
}