googletest/matchers/
contains_regex_matcher.rs1use crate::description::Description;
16use crate::matcher::{Matcher, MatcherBase, MatcherResult};
17use regex::Regex;
18use std::fmt::Debug;
19use std::ops::Deref;
20
21#[track_caller]
50pub fn contains_regex<PatternT: Deref<Target = str>>(pattern: PatternT) -> ContainsRegexMatcher {
51 ContainsRegexMatcher { regex: Regex::new(pattern.deref()).unwrap() }
52}
53
54#[derive(MatcherBase)]
60pub struct ContainsRegexMatcher {
61 regex: Regex,
62}
63
64impl<ActualT: AsRef<str> + Debug + Copy> Matcher<ActualT> for ContainsRegexMatcher {
65 fn matches(&self, actual: ActualT) -> MatcherResult {
66 self.regex.is_match(actual.as_ref()).into()
67 }
68
69 fn describe(&self, matcher_result: MatcherResult) -> Description {
70 match matcher_result {
71 MatcherResult::Match => {
72 format!("contains the regular expression {:#?}", self.regex.as_str()).into()
73 }
74 MatcherResult::NoMatch => {
75 format!("doesn't contain the regular expression {:#?}", self.regex.as_str()).into()
76 }
77 }
78 }
79}
80
81#[cfg(test)]
82mod tests {
83 use crate::matcher::MatcherResult;
84 use crate::prelude::*;
85 use crate::Result;
86
87 #[test]
88 fn contains_regex_matches_string_reference_with_pattern() -> Result<()> {
89 let matcher = contains_regex("S.*val");
90
91 let result = matcher.matches("Some value");
92
93 verify_that!(result, eq(MatcherResult::Match))
94 }
95
96 #[test]
97 fn contains_regex_does_not_match_string_without_pattern() -> Result<()> {
98 let matcher = contains_regex("Another");
99
100 let result = matcher.matches("Some value");
101
102 verify_that!(result, eq(MatcherResult::NoMatch))
103 }
104
105 #[test]
106 fn contains_regex_matches_owned_string_with_pattern() -> Result<()> {
107 let matcher = contains_regex("value");
108
109 let result = matcher.matches(&"Some value".to_string());
110
111 verify_that!(result, eq(MatcherResult::Match))
112 }
113
114 #[test]
115 fn contains_regex_matches_string_reference_with_owned_string() -> Result<()> {
116 let matcher = contains_regex("value");
117
118 let result = matcher.matches("Some value");
119
120 verify_that!(result, eq(MatcherResult::Match))
121 }
122
123 #[test]
124 fn verify_that_works_with_owned_string() -> Result<()> {
125 verify_that!("Some value".to_string(), contains_regex("value"))
126 }
127
128 #[test]
129 fn contains_regex_displays_quoted_debug_of_pattern() -> Result<()> {
130 let matcher = contains_regex("\n");
131
132 verify_that!(
133 Matcher::<&str>::describe(&matcher, MatcherResult::Match),
134 displays_as(eq("contains the regular expression \"\\n\""))
135 )
136 }
137}