#[cfg(test)]
mod tests {
use serde_yml::mapping::*;
use serde_yml::value::Value;
#[test]
fn test_mapping_new() {
let map = Mapping::new();
assert!(map.map.is_empty());
}
#[test]
fn test_mapping_with_capacity() {
let capacity = 10;
let map = Mapping::with_capacity(capacity);
assert!(map.map.is_empty());
assert!(map.map.capacity() >= capacity);
}
#[test]
fn test_mapping_reserve() {
let mut map = Mapping::new();
let additional = 10;
map.reserve(additional);
assert!(map.map.capacity() >= additional);
}
#[test]
fn test_mapping_shrink_to_fit() {
let mut map = Mapping::with_capacity(100);
map.shrink_to_fit();
assert!(map.map.capacity() <= 100);
}
#[test]
fn test_mapping_insert() {
let mut map = Mapping::new();
let key = Value::String("key".to_string());
let value = Value::String("value".to_string());
assert!(map.insert(key.clone(), value.clone()).is_none());
assert_eq!(map.get(&key), Some(&value));
}
#[test]
fn test_mapping_get_mut() {
let mut map = Mapping::new();
let key = Value::String("key".to_string());
let value = Value::String("value".to_string());
map.insert(key.clone(), value);
assert!(map.get_mut(&key).is_some());
}
#[test]
fn test_mapping_capacity() {
let map = Mapping::with_capacity(10);
assert_eq!(map.capacity(), 10);
}
#[test]
fn test_mapping_len() {
let mut map = Mapping::new();
assert_eq!(map.len(), 0);
map.insert(Value::String("key".to_string()), Value::Null);
assert_eq!(map.len(), 1);
}
#[test]
fn test_mapping_is_empty() {
let map = Mapping::new();
assert!(map.is_empty());
}
#[test]
fn test_mapping_clear() {
let mut map = Mapping::new();
map.insert(Value::String("key".to_string()), Value::Null);
map.clear();
assert!(map.is_empty());
}
#[test]
fn test_mapping_iter_mut() {
let mut map = Mapping::new();
map.insert(
Value::String("key".to_string()),
Value::String("value".to_string()),
);
let mut iter = map.iter_mut();
let (key, value) = iter.next().unwrap();
assert_eq!(key, &Value::String("key".to_string()));
assert_eq!(value, &mut Value::String("value".to_string()));
}
#[test]
fn test_mapping_keys() {
let mut map = Mapping::new();
map.insert(Value::String("key".to_string()), Value::Null);
let mut keys = map.keys();
assert_eq!(
keys.next(),
Some(&Value::String("key".to_string()))
);
}
#[test]
fn test_mapping_into_keys() {
let mut map = Mapping::new();
map.insert(Value::String("key".to_string()), Value::Null);
let mut keys = map.into_keys();
assert_eq!(keys.next(), Some(Value::String("key".to_string())));
}
#[test]
fn test_mapping_into_values() {
let mut map = Mapping::new();
map.insert(Value::String("key".to_string()), Value::Null);
let mut values = map.into_values();
assert_eq!(values.next(), Some(Value::Null));
}
#[test]
fn test_swap_remove_entry_from() {
let mut map = Mapping::new();
let key = Value::String("key".to_string());
let value = Value::String("value".to_string());
map.insert(key.clone(), value.clone());
let entry = key.swap_remove_entry_from(&mut map);
assert_eq!(entry, Some((key, value)));
}
#[test]
fn test_shift_remove_from() {
let mut map = Mapping::new();
let key = Value::String("key".to_string());
let value = Value::String("value".to_string());
map.insert(key.clone(), value.clone());
let removed_value = key.shift_remove_from(&mut map);
assert_eq!(removed_value, Some(value));
}
#[test]
fn test_shift_remove_entry_from() {
let mut map = Mapping::new();
let key = Value::String("key".to_string());
let value = Value::String("value".to_string());
map.insert(key.clone(), value.clone());
let entry = key.shift_remove_entry_from(&mut map);
assert_eq!(entry, Some((key, value)));
}
#[test]
fn test_str_is_key_into() {
let mut map = Mapping::new();
let key = "key";
map.insert(Value::String(key.to_string()), Value::Null);
assert!(key.is_key_into(&map));
}
#[test]
fn test_str_index_into_mut() {
let mut map = Mapping::new();
let key = "key";
let value = Value::String("value".to_string());
map.insert(Value::String(key.to_string()), value);
assert!(key.index_into_mut(&mut map).is_some());
}
#[test]
fn test_str_swap_remove_entry_from() {
let mut map = Mapping::new();
let key = "key";
let value = Value::String("value".to_string());
map.insert(Value::String(key.to_string()), value.clone());
let entry = key.swap_remove_entry_from(&mut map);
assert_eq!(
entry,
Some((Value::String(key.to_string()), value))
);
}
#[test]
fn test_str_shift_remove_from() {
let mut map = Mapping::new();
let key = "key";
let value = Value::String("value".to_string());
map.insert(Value::String(key.to_string()), value.clone());
let removed_value = key.shift_remove_from(&mut map);
assert_eq!(removed_value, Some(value));
}
#[test]
fn test_str_shift_remove_entry_from() {
let mut map = Mapping::new();
let key = "key";
let value = Value::String("value".to_string());
map.insert(Value::String(key.to_string()), value.clone());
let entry = key.shift_remove_entry_from(&mut map);
assert_eq!(
entry,
Some((Value::String(key.to_string()), value))
);
}
#[test]
fn test_string_is_key_into() {
let mut map = Mapping::new();
let key = "key".to_string();
map.insert(Value::String(key.clone()), Value::Null);
assert!(key.is_key_into(&map));
}
#[test]
fn test_string_index_into() {
let mut map = Mapping::new();
let key = "key".to_string();
let value = Value::String("value".to_string());
map.insert(Value::String(key.clone()), value.clone());
assert_eq!(key.index_into(&map), Some(&value));
}
#[test]
fn test_string_index_into_mut() {
let mut map = Mapping::new();
let key = "key".to_string();
let value = Value::String("value".to_string());
map.insert(Value::String(key.clone()), value);
assert!(key.index_into_mut(&mut map).is_some());
}
#[test]
fn test_string_swap_remove_from() {
let mut map = Mapping::new();
let key = "key".to_string();
let value = Value::String("value".to_string());
map.insert(Value::String(key.clone()), value.clone());
let removed_value = key.swap_remove_from(&mut map);
assert_eq!(removed_value, Some(value));
}
#[test]
fn test_string_swap_remove_entry_from() {
let mut map = Mapping::new();
let key = "key".to_string();
let value = Value::String("value".to_string());
map.insert(Value::String(key.clone()), value.clone());
let entry = key.swap_remove_entry_from(&mut map);
assert_eq!(entry, Some((Value::String(key), value)));
}
#[test]
fn test_string_shift_remove_from() {
let mut map = Mapping::new();
let key = "key".to_string();
let value = Value::String("value".to_string());
map.insert(Value::String(key.clone()), value.clone());
let removed_value = key.shift_remove_from(&mut map);
assert_eq!(removed_value, Some(value));
}
#[test]
fn test_string_shift_remove_entry_from() {
let mut map = Mapping::new();
let key = "key".to_string();
let value = Value::String("value".to_string());
map.insert(Value::String(key.clone()), value.clone());
let entry = key.shift_remove_entry_from(&mut map);
assert_eq!(entry, Some((Value::String(key), value)));
}
#[test]
fn test_mapping_entry_insert() {
let mut map = Mapping::new();
let key = Value::String("key".to_string());
let value = Value::String("value".to_string());
map.entry(key.clone()).or_insert(value.clone());
assert_eq!(map.get(&key), Some(&value));
}
#[test]
fn test_mapping_entry_update() {
let mut map = Mapping::new();
let key = Value::String("key".to_string());
let value1 = Value::String("value1".to_string());
let value2 = Value::String("value2".to_string());
map.insert(key.clone(), value1.clone());
map.entry(key.clone()).and_modify(|v| *v = value2.clone());
assert_eq!(map.get(&key), Some(&value2));
}
#[test]
fn test_mapping_retain() {
let mut map = Mapping::new();
map.insert(
Value::String("key1".to_string()),
Value::Number(1.into()),
);
map.insert(
Value::String("key2".to_string()),
Value::Number(2.into()),
);
map.insert(
Value::String("key3".to_string()),
Value::Number(3.into()),
);
map.retain(|_, v| match v {
Value::Number(n) => n.as_u64().unwrap() % 2 == 0,
_ => false,
});
assert_eq!(map.len(), 1);
assert_eq!(map.get("key2"), Some(&Value::Number(2.into())));
}
#[test]
fn test_mapping_ord() {
let mut map1 = Mapping::new();
map1.insert(
Value::String("key1".to_string()),
Value::Number(1.into()),
);
map1.insert(
Value::String("key2".to_string()),
Value::Number(2.into()),
);
let mut map2 = Mapping::new();
map2.insert(
Value::String("key1".to_string()),
Value::Number(1.into()),
);
map2.insert(
Value::String("key2".to_string()),
Value::Number(3.into()),
);
assert!(map1 < map2);
}
#[test]
fn test_mapping_partial_ord() {
let mut map1 = Mapping::new();
map1.insert(
Value::String("key1".to_string()),
Value::Number(1.into()),
);
let mut map2 = Mapping::new();
map2.insert(
Value::String("key1".to_string()),
Value::Number(1.into()),
);
map2.insert(
Value::String("key2".to_string()),
Value::Number(2.into()),
);
assert!(map1 <= map2);
}
#[test]
fn test_mapping_hash() {
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
let mut map1 = Mapping::new();
map1.insert(
Value::String("key1".to_string()),
Value::Number(1.into()),
);
map1.insert(
Value::String("key2".to_string()),
Value::Number(2.into()),
);
let mut map2 = Mapping::new();
map2.insert(
Value::String("key2".to_string()),
Value::Number(2.into()),
);
map2.insert(
Value::String("key1".to_string()),
Value::Number(1.into()),
);
let mut hasher1 = DefaultHasher::new();
map1.hash(&mut hasher1);
let hash1 = hasher1.finish();
let mut hasher2 = DefaultHasher::new();
map2.hash(&mut hasher2);
let hash2 = hasher2.finish();
assert_eq!(hash1, hash2);
}
#[test]
fn test_mapping_index() {
let mut map = Mapping::new();
let key = Value::String("key".to_string());
let value = Value::String("value".to_string());
map.insert(key.clone(), value.clone());
assert_eq!(map[&key], value);
}
#[test]
fn test_mapping_index_mut() {
let mut map = Mapping::new();
let key = Value::String("key".to_string());
let value1 = Value::String("value1".to_string());
let value2 = Value::String("value2".to_string());
map.insert(key.clone(), value1.clone());
map[&key] = value2.clone();
assert_eq!(map[&key], value2);
}
#[test]
fn test_mapping_extend() {
let mut map = Mapping::new();
let key1 = Value::String("key1".to_string());
let value1 = Value::String("value1".to_string());
let key2 = Value::String("key2".to_string());
let value2 = Value::String("value2".to_string());
map.extend(vec![
(key1.clone(), value1.clone()),
(key2.clone(), value2.clone()),
]);
assert_eq!(map.len(), 2);
assert_eq!(map.get(&key1), Some(&value1));
assert_eq!(map.get(&key2), Some(&value2));
}
#[test]
fn test_mapping_from_iterator() {
let key1 = Value::String("key1".to_string());
let value1 = Value::String("value1".to_string());
let key2 = Value::String("key2".to_string());
let value2 = Value::String("value2".to_string());
let map: Mapping = vec![
(key1.clone(), value1.clone()),
(key2.clone(), value2.clone()),
]
.into_iter()
.collect();
assert_eq!(map.len(), 2);
assert_eq!(map.get(&key1), Some(&value1));
assert_eq!(map.get(&key2), Some(&value2));
}
#[test]
fn test_duplicate_key_error_debug() {
let mut map = Mapping::new();
let key = Value::String("key".to_string());
let value = Value::String("value".to_string());
map.insert(key.clone(), value.clone());
match map.entry(key.clone()) {
Entry::Occupied(entry) => {
let error = DuplicateKeyError { entry };
let debug_str = format!("{:?}", error);
assert_eq!(
debug_str,
"DuplicateKeyError { entry: OccupiedEntry { occupied: OccupiedEntry { key: String(\"key\"), value: String(\"value\") } } }"
);
}
Entry::Vacant(_) => panic!("Expected occupied entry"),
}
}
#[test]
fn test_duplicate_key_error_display() {
let mut map = Mapping::new();
let key = Value::String("key".to_string());
let value = Value::String("value".to_string());
map.insert(key.clone(), value.clone());
match map.entry(key.clone()) {
Entry::Occupied(entry) => {
let error = DuplicateKeyError { entry };
let display_str = format!("{}", error);
assert_eq!(
display_str,
"duplicate entry with key \"key\""
);
}
Entry::Vacant(_) => panic!("Expected occupied entry"),
}
}
}