// Copyright (c) 2018 The predicates-rs Project Developers. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. use std::fmt; use crate::reflection; use crate::utils; use crate::Predicate; /// Predicate that checks for empty strings. /// /// This is created by `predicates::str::is_empty`. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct IsEmptyPredicate {} impl Predicate for IsEmptyPredicate { fn eval(&self, variable: &str) -> bool { variable.is_empty() } fn find_case<'a>(&'a self, expected: bool, variable: &str) -> Option> { utils::default_find_case(self, expected, variable) .map(|case| case.add_product(reflection::Product::new("var", variable.to_owned()))) } } impl reflection::PredicateReflection for IsEmptyPredicate {} impl fmt::Display for IsEmptyPredicate { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let palette = crate::Palette::new(f.alternate()); write!( f, "{}.{}()", palette.var("var"), palette.description("is_empty"), ) } } /// Creates a new `Predicate` that ensures a str is empty /// /// # Examples /// /// ``` /// use predicates::prelude::*; /// /// let predicate_fn = predicate::str::is_empty(); /// assert_eq!(true, predicate_fn.eval("")); /// assert_eq!(false, predicate_fn.eval("Food World")); /// ``` pub fn is_empty() -> IsEmptyPredicate { IsEmptyPredicate {} } /// Predicate checks start of str /// /// This is created by `predicates::str::starts_with`. #[derive(Debug, Clone, PartialEq, Eq)] pub struct StartsWithPredicate { pattern: String, } impl Predicate for StartsWithPredicate { fn eval(&self, variable: &str) -> bool { variable.starts_with(&self.pattern) } fn find_case<'a>(&'a self, expected: bool, variable: &str) -> Option> { utils::default_find_case(self, expected, variable) .map(|case| case.add_product(reflection::Product::new("var", variable.to_owned()))) } } impl reflection::PredicateReflection for StartsWithPredicate {} impl fmt::Display for StartsWithPredicate { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let palette = crate::Palette::new(f.alternate()); write!( f, "{}.{}({:?})", palette.var("var"), palette.description("starts_with"), self.pattern ) } } /// Creates a new `Predicate` that ensures a str starts with `pattern` /// /// # Examples /// /// ``` /// use predicates::prelude::*; /// /// let predicate_fn = predicate::str::starts_with("Hello"); /// assert_eq!(true, predicate_fn.eval("Hello World")); /// assert_eq!(false, predicate_fn.eval("Goodbye World")); /// ``` pub fn starts_with

(pattern: P) -> StartsWithPredicate where P: Into, { StartsWithPredicate { pattern: pattern.into(), } } /// Predicate checks end of str /// /// This is created by `predicates::str::ends_with`. #[derive(Debug, Clone, PartialEq, Eq)] pub struct EndsWithPredicate { pattern: String, } impl Predicate for EndsWithPredicate { fn eval(&self, variable: &str) -> bool { variable.ends_with(&self.pattern) } fn find_case<'a>(&'a self, expected: bool, variable: &str) -> Option> { utils::default_find_case(self, expected, variable) .map(|case| case.add_product(reflection::Product::new("var", variable.to_owned()))) } } impl reflection::PredicateReflection for EndsWithPredicate {} impl fmt::Display for EndsWithPredicate { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let palette = crate::Palette::new(f.alternate()); write!( f, "{}.{}({:?})", palette.var("var"), palette.description("ends_with"), self.pattern ) } } /// Creates a new `Predicate` that ensures a str ends with `pattern` /// /// # Examples /// /// ``` /// use predicates::prelude::*; /// /// let predicate_fn = predicate::str::ends_with("World"); /// assert_eq!(true, predicate_fn.eval("Hello World")); /// assert_eq!(false, predicate_fn.eval("Hello Moon")); /// ``` pub fn ends_with

(pattern: P) -> EndsWithPredicate where P: Into, { EndsWithPredicate { pattern: pattern.into(), } } /// Predicate that checks for patterns. /// /// This is created by `predicates::str:contains`. #[derive(Debug, Clone, PartialEq, Eq)] pub struct ContainsPredicate { pattern: String, } impl ContainsPredicate { /// Require a specific count of matches. /// /// # Examples /// /// ``` /// use predicates::prelude::*; /// /// let predicate_fn = predicate::str::contains("Two").count(2); /// assert_eq!(true, predicate_fn.eval("One Two Three Two One")); /// assert_eq!(false, predicate_fn.eval("One Two Three")); /// ``` pub fn count(self, count: usize) -> MatchesPredicate { MatchesPredicate { pattern: self.pattern, count, } } } impl Predicate for ContainsPredicate { fn eval(&self, variable: &str) -> bool { variable.contains(&self.pattern) } fn find_case<'a>(&'a self, expected: bool, variable: &str) -> Option> { utils::default_find_case(self, expected, variable) .map(|case| case.add_product(reflection::Product::new("var", variable.to_owned()))) } } impl reflection::PredicateReflection for ContainsPredicate {} impl fmt::Display for ContainsPredicate { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let palette = crate::Palette::new(f.alternate()); write!( f, "{}.{}({})", palette.var("var"), palette.description("contains"), palette.expected(&self.pattern), ) } } /// Predicate that checks for repeated patterns. /// /// This is created by `predicates::str::contains(...).count`. #[derive(Debug, Clone, PartialEq, Eq)] pub struct MatchesPredicate { pattern: String, count: usize, } impl Predicate for MatchesPredicate { fn eval(&self, variable: &str) -> bool { variable.matches(&self.pattern).count() == self.count } fn find_case<'a>(&'a self, expected: bool, variable: &str) -> Option> { let actual_count = variable.matches(&self.pattern).count(); let result = self.count == actual_count; if result == expected { Some( reflection::Case::new(Some(self), result) .add_product(reflection::Product::new("var", variable.to_owned())) .add_product(reflection::Product::new("actual count", actual_count)), ) } else { None } } } impl reflection::PredicateReflection for MatchesPredicate { fn parameters<'a>(&'a self) -> Box> + 'a> { let params = vec![reflection::Parameter::new("count", &self.count)]; Box::new(params.into_iter()) } } impl fmt::Display for MatchesPredicate { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let palette = crate::Palette::new(f.alternate()); write!( f, "{}.{}({})", palette.var("var"), palette.description("contains"), palette.expected(&self.pattern), ) } } /// Creates a new `Predicate` that ensures a str contains `pattern` /// /// # Examples /// /// ``` /// use predicates::prelude::*; /// /// let predicate_fn = predicate::str::contains("Two"); /// assert_eq!(true, predicate_fn.eval("One Two Three")); /// assert_eq!(false, predicate_fn.eval("Four Five Six")); /// ``` pub fn contains

(pattern: P) -> ContainsPredicate where P: Into, { ContainsPredicate { pattern: pattern.into(), } }