| // Copyright 2023 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| use googletest::matcher::Matcher; |
| use googletest::prelude::*; |
| use indoc::indoc; |
| |
| #[test] |
| fn does_not_match_value_when_list_is_empty() -> Result<()> { |
| verify_that!((), not(any!())) |
| } |
| |
| #[test] |
| fn matches_value_with_single_matching_component() -> Result<()> { |
| verify_that!(123, any!(eq(123))) |
| } |
| |
| #[test] |
| fn does_not_match_value_with_single_non_matching_component() -> Result<()> { |
| verify_that!(123, not(any!(eq(456)))) |
| } |
| |
| #[test] |
| fn matches_value_with_first_of_two_matching_components() -> Result<()> { |
| verify_that!("A string", any!(starts_with("A"), starts_with("string"))) |
| } |
| |
| #[test] |
| fn matches_value_with_second_of_two_matching_components() -> Result<()> { |
| verify_that!("A string", any!(starts_with("string"), starts_with("A"))) |
| } |
| |
| #[test] |
| fn supports_trailing_comma() -> Result<()> { |
| verify_that!( |
| "An important string", |
| any!(starts_with("An"), contains_substring("important"), ends_with("string"),) |
| ) |
| } |
| |
| #[test] |
| fn admits_matchers_without_static_lifetime() -> Result<()> { |
| #[derive(Debug, PartialEq)] |
| struct AStruct(i32); |
| let expected_value = AStruct(123); |
| verify_that!(AStruct(123), any![eq_deref_of(&expected_value)]) |
| } |
| |
| #[test] |
| fn mismatch_description_two_failed_matchers() -> Result<()> { |
| verify_that!( |
| any!(starts_with("One"), starts_with("Two")).explain_match("Three"), |
| displays_as(eq("* which does not start with \"One\"\n* which does not start with \"Two\"")) |
| ) |
| } |
| |
| #[test] |
| fn mismatch_description_empty_matcher() -> Result<()> { |
| verify_that!(any!().explain_match("Three"), displays_as(eq("which never matches"))) |
| } |
| |
| #[test] |
| fn all_multiple_failed_assertions() -> Result<()> { |
| let result = verify_that!(4, any![eq(1), eq(2), eq(3)]); |
| verify_that!( |
| result, |
| err(displays_as(contains_substring(indoc!( |
| " |
| Value of: 4 |
| Expected: has at least one of the following properties: |
| * is equal to 1 |
| * is equal to 2 |
| * is equal to 3 |
| Actual: 4, |
| * which isn't equal to 1 |
| * which isn't equal to 2 |
| * which isn't equal to 3" |
| )))) |
| ) |
| } |
| |
| #[test] |
| fn formats_error_message_correctly_when_any_is_inside_some() -> Result<()> { |
| let value = Some(4); |
| let result = verify_that!(value, some(any![eq(1), eq(2), eq(3)])); |
| verify_that!( |
| result, |
| err(displays_as(contains_substring(indoc!( |
| " |
| Value of: value |
| Expected: has a value which has at least one of the following properties: |
| * is equal to 1 |
| * is equal to 2 |
| * is equal to 3 |
| Actual: Some(4), |
| which has a value |
| * which isn't equal to 1 |
| * which isn't equal to 2 |
| * which isn't equal to 3" |
| )))) |
| ) |
| } |
| |
| #[test] |
| fn formats_error_message_correctly_when_any_is_inside_ok() -> Result<()> { |
| let value: std::result::Result<i32, std::io::Error> = Ok(4); |
| let result = verify_that!(value, ok(any![eq(1), eq(2), eq(3)])); |
| verify_that!( |
| result, |
| err(displays_as(contains_substring(indoc!( |
| " |
| Value of: value |
| Expected: is a success containing a value, which has at least one of the following properties: |
| * is equal to 1 |
| * is equal to 2 |
| * is equal to 3 |
| Actual: Ok(4), |
| which is a success |
| * which isn't equal to 1 |
| * which isn't equal to 2 |
| * which isn't equal to 3" |
| )))) |
| ) |
| } |
| |
| #[test] |
| fn formats_error_message_correctly_when_any_is_inside_err() -> Result<()> { |
| let value: std::result::Result<(), &'static str> = Err("An error"); |
| let result = verify_that!(value, err(any![starts_with("Not"), ends_with("problem")])); |
| verify_that!( |
| result, |
| err(displays_as(contains_substring(indoc!( |
| r#" |
| Value of: value |
| Expected: is an error which has at least one of the following properties: |
| * starts with prefix "Not" |
| * ends with suffix "problem" |
| Actual: Err("An error"), |
| which is an error |
| * which does not start with "Not" |
| * which does not end with "problem""# |
| )))) |
| ) |
| } |