clearcheck 0.0.2

Elegant and extensible assertions in rust.
Documentation
//! SizeAssertion enables assertions about the size of the HashMap.
//!
//! It offers a fluent interface for chaining multiple assertions.
//!
//! # Example
//! ```rust
//! use std::collections::HashMap;
//! use clearcheck::assertions::collection::size::SizeAssertion;
//!
//! let mut key_value = HashMap::new();
//! key_value.insert("rust", "assert");
//!
//! key_value.should_have_at_least_size(1)
//!          .should_have_size_in_inclusive_range(1..=5);
//! ```
//!
//! Refer to the trait [SizeAssertion].

use std::collections::HashMap;
use std::hash::Hash;
use std::ops::{Range, RangeInclusive};

use crate::assertions::collection::size::SizeAssertion;
use crate::matchers::{Should, ShouldNot};
use crate::matchers::map::length::{
    have_atleast_same_length, have_atmost_same_length, have_same_length,
};
use crate::matchers::range::{have_length_in_exclusive_range, have_length_in_inclusive_range};

impl<K, V> SizeAssertion for HashMap<K, V>
    where
        K: Hash + Eq
{
    fn should_have_size(&self, size: usize) -> &Self {
        self.should(&have_same_length(size));
        self
    }

    fn should_not_have_size(&self, size: usize) -> &Self {
        self.should_not(&have_same_length(size));
        self
    }

    fn should_have_at_least_size(&self, size: usize) -> &Self {
        self.should(&have_atleast_same_length(size));
        self
    }

    fn should_have_at_most_size(&self, size: usize) -> &Self {
        self.should(&have_atmost_same_length(size));
        self
    }

    fn should_be_same_size_as<U>(&self, other: &[U]) -> &Self {
        self.should_have_size(other.len());
        self
    }

    fn should_have_size_in_inclusive_range(&self, range: RangeInclusive<usize>) -> &Self {
        self.len().should(&have_length_in_inclusive_range(range));
        self
    }

    fn should_not_have_size_in_inclusive_range(&self, range: RangeInclusive<usize>) -> &Self {
        self.len()
            .should_not(&have_length_in_inclusive_range(range));
        self
    }

    fn should_have_size_in_exclusive_range(&self, range: Range<usize>) -> &Self {
        self.len().should(&have_length_in_exclusive_range(range));
        self
    }

    fn should_not_have_size_in_exclusive_range(&self, range: Range<usize>) -> &Self {
        self.len()
            .should_not(&have_length_in_exclusive_range(range));
        self
    }
}

#[cfg(test)]
mod tests {
    use std::collections::HashMap;

    use crate::assertions::collection::size::SizeAssertion;

    #[test]
    fn should_have_size_as_1() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_have_size(1);
    }

    #[test]
    #[should_panic]
    fn should_have_size_3_but_was_not() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_have_size(3);
    }

    #[test]
    fn should_not_have_size_3() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_not_have_size(3);
    }

    #[test]
    #[should_panic]
    fn should_not_have_size_1_but_was() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_not_have_size(1);
    }

    #[test]
    fn should_have_at_least_size_1() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_have_at_least_size(1);
    }

    #[test]
    #[should_panic]
    fn should_have_at_least_size_2_but_was_not() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_have_at_least_size(2);
    }

    #[test]
    fn should_have_at_most_size_1() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_have_at_most_size(1);
    }

    #[test]
    #[should_panic]
    fn should_have_at_most_size_1_but_was_not() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.insert("java", "assert4j");
        key_value.should_have_at_most_size(1);
    }

    #[test]
    fn should_be_same_size_as_other() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_be_same_size_as(&[1]);
    }

    #[test]
    #[should_panic]
    fn should_be_same_size_as_other_but_was_not() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_be_same_size_as(&[1, 2, 3]);
    }

    #[test]
    fn should_have_size_in_the_inclusive_range() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_have_size_in_inclusive_range(1..=8);
    }

    #[test]
    #[should_panic]
    fn should_have_size_in_the_inclusive_range_but_was_not() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_have_size_in_inclusive_range(3..=4);
    }

    #[test]
    fn should_not_have_size_in_the_inclusive_range() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_not_have_size_in_inclusive_range(3..=4);
    }

    #[test]
    #[should_panic]
    fn should_not_have_size_in_the_inclusive_range_but_was() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_not_have_size_in_inclusive_range(1..=2);
    }

    #[test]
    fn should_have_size_in_the_exclusive_range() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_have_size_in_exclusive_range(1..3);
    }

    #[test]
    #[should_panic]
    fn should_have_size_in_the_range_but_was_not() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_have_size_in_exclusive_range(3..8);
    }

    #[test]
    fn should_not_have_size_in_the_exclusive_range() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_not_have_size_in_exclusive_range(3..4);
    }

    #[test]
    #[should_panic]
    fn should_not_have_size_in_the_exclusive_range_but_was() {
        let mut key_value = HashMap::new();
        key_value.insert("rust", "assert");
        key_value.should_not_have_size_in_exclusive_range(1..9);
    }
}