// Copyright 2022 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.

// There are no visible documentation elements in this module; the declarative
// macros are documented at the top level.
#![doc(hidden)]

/// Checks whether the `Matcher` given by the second argument matches the first
/// argument.
///
/// Evaluates to `Result::Ok(())` if the matcher matches and
/// `Result::Err(TestAssertionFailure)` if it does not. The caller must then
/// decide how to handle the `Err` variant. It has a few options:
///
///  * Abort the current function with the `?` operator. This requires that the
///    function return a suitable `Result`.
///  * Log the test failure and continue by calling the method
///    `and_log_failure`.
///
/// Of course, one can also use all other standard methods on `Result`.
///
/// **Invoking this macro by itself does not cause a test failure to be recorded
/// or output.** The resulting `Result` must be handled as described above to
/// cause the test to be recorded as a failure.
///
/// Example:
/// ```
/// # use googletest::prelude::*;
/// # fn should_pass() -> Result<()> {
/// verify_that!(42, eq(42))?; // This will pass.
/// # Ok(())
/// # }
/// # should_pass().unwrap();
/// # fn should_fail() -> Result<()> {
/// # googletest::internal::test_outcome::TestOutcome::init_current_test_outcome();
/// verify_that!(42, eq(123)).and_log_failure();
///             // This will log a test failure and allow execution to continue.
/// let _ = verify_that!(42, eq(123)); // This will do nothing.
/// verify_that!(42, eq(123))?; // This will fail, returning immediately.
/// verify_that!(42, eq(0))?; // This will not run.
/// # googletest::internal::test_outcome::TestOutcome::close_current_test_outcome::<&str>(Ok(()))
/// #     .unwrap_err();
/// # Ok(())
/// # }
/// # verify_that!(should_fail(), err(displays_as(contains_substring("Expected: is equal to 123"))))
/// #     .unwrap();
/// ```
///
/// This macro has special support for matching against container. Namely:
///   * `verify_that!(actual, [m1, m2, ...])` is equivalent to
///     `verify_that!(actual, elements_are![m1, m2, ...])`
///   * `verify_that!(actual, {m1, m2, ...})` is equivalent to
///     `verify_that!(actual, unordered_elements_are![m1, m2, ...])`
///
/// ## Matching against tuples
///
/// One can match against a tuple by constructing a tuple of matchers as
/// follows:
///
/// ```
/// # use googletest::prelude::*;
/// # fn should_pass() -> Result<()> {
/// verify_that!((123, 456), (eq(123), eq(456)))?; // Passes
/// #     Ok(())
/// # }
/// # fn should_fail() -> Result<()> {
/// verify_that!((123, 456), (eq(123), eq(0)))?; // Fails: second matcher does not match
/// #     Ok(())
/// # }
/// # should_pass().unwrap();
/// # should_fail().unwrap_err();
/// ```
///
/// This also works with composed matchers:
///
/// ```
/// # use googletest::prelude::*;
/// # fn should_pass() -> Result<()> {
/// verify_that!((123, 456), not((eq(456), eq(123))))?; // Passes
/// #     Ok(())
/// # }
/// # should_pass().unwrap();
/// ```
///
/// Matchers must correspond to the actual tuple in count and type. Otherwise
/// the test will fail to compile.
///
/// ```compile_fail
/// # use googletest::prelude::*;
/// # fn should_not_compile() -> Result<()> {
/// verify_that!((123, 456), (eq(123),))?; // Does not compile: wrong tuple size
/// verify_that!((123, "A string"), (eq(123), eq(456)))?; // Does not compile: wrong type
/// #     Ok(())
/// # }
/// ```
///
/// All fields must be covered by matchers. Use
/// [`anything`][crate::matchers::anything] for fields which are not relevant
/// for the test.
///
/// ```
/// # use googletest::prelude::*;
/// verify_that!((123, 456), (eq(123), anything()))
/// #     .unwrap();
/// ```
///
/// This supports tuples of up to 12 elements. Tuples longer than that do not
/// automatically inherit the `Debug` trait from their members, so are generally
/// not supported; see [Rust by Example](https://doc.rust-lang.org/rust-by-example/primitives/tuples.html#tuples).
#[macro_export]
macro_rules! verify_that {
    // specialized to sequences:
    ($actual:expr, [$($expecteds:expr),+ $(,)?]) => {
        {
            use $crate::assertions::internal::Subject as _;
            $actual.check(
                $crate::matchers::elements_are![$($expecteds),+],
                stringify!($actual),
            )
        }
    };

    // specialized to unordered sequences:
    ($actual:expr, {$($expecteds:expr),+ $(,)?}) => {
        {
            use $crate::assertions::internal::Subject as  _;
            $actual.check(
                $crate::matchers::unordered_elements_are![$($expecteds),+],
                stringify!($actual),
            )
        }
    };

    // general case:
    ($actual:expr, $expected:expr $(,)?) => {
        {
            use $crate::assertions::internal::Subject as  _;
            $actual.check(
                $expected,
                stringify!($actual),
            )
        }
    };
}

/// Asserts that the given predicate applied to the given arguments returns
/// true.
///
/// Similarly to [`verify_that`], this evaluates to a `Result` whose `Ok`
/// variant indicates that the given predicate returned true and whose `Err`
/// variant indicates that it returned false.
///
/// The failure message contains detailed information about the arguments. For
/// example:
///
/// ```
/// # use googletest::prelude::*;
/// fn equals_modulo(a: i32, b: i32, n: i32) -> bool { a % n == b % n }
///
/// # /* The attribute macro would prevent the function from being compiled in a doctest.
/// #[test]
/// # */
/// fn test() -> Result<()> {
///     let a = 1;
///     fn b(_x: i32) -> i32 { 7 }
///     verify_pred!(equals_modulo(a, b(b(2)), 2 + 3))?;
///     Ok(())
/// }
/// # verify_that!(
/// #     test(),
/// #     err(displays_as(contains_substring("equals_modulo(a, b(b(2)), 2 + 3) was false with")))
/// # ).unwrap();
/// ```
///
/// This results in the following message:
///
/// ```text
/// equals_modulo(a, b(b(2)), 2 + 3) was false with
///   a = 1,
///   b(b(2)) = 7,
///   2 + 3 = 5,
/// ```
///
/// The predicate can also be a method on a struct, e.g.:
///
/// ```ignore
/// struct AStruct {};
///
/// impl AStruct {
///   fn equals_modulo(...) {...}
/// }
///
/// verify_pred!((AStruct {}).equals_modulo(a, b, n))?;
/// ```
///
/// The expression passed to this macro must return `bool`. In the most general
/// case, it prints out each of the `.`-separated parts of the expression and
/// the arguments of all top-level method calls as long as they implement
/// `Debug`. It evaluates every value (including the method receivers) exactly
/// once. Effectively, for `verify_pred!((a + 1).b.c(x + y, &mut z, 2))`, it
/// generates code analogous to the following, which allows printing accurate
/// intermediate values even if they are subsequently consumed (moved out) or
/// mutated in-place by the expression:
///
/// ```ignore
/// let mut error_message = "(a + 1).b.c(x + y, 2) was false with".to_string();
/// let mut x1 = (a + 1);
/// write!(error_message, "\n  (a + 1) = {:?},", x1);
/// write!(error_message, "\n  (a + 1).b = {:?},", x1.b);
/// let mut x2 = x + y;
/// write!(error_message, "\n  x + y = {:?},", x2);
/// let mut x3 = &mut z;
/// write!(error_message, "\n  & mut z = {:?},", x3);
/// let mut x4 = x1.b.c(x2, x3, 2);
/// if (x4) {
///   Ok(())
/// } else {
///   Err(error_message)
/// }
/// ```
///
/// Wrapping the passed-in expression in parens or curly braces will prevent the
/// detailed printing of the expression.
///
/// ```ignore
/// verify_pred!((a.foo()).bar())?;
/// ```
///
/// would not print `a`, but would print `(a.foo())` and `(a.foo()).bar()` on
/// error.
#[macro_export]
macro_rules! verify_pred {
    ($expr:expr $(,)?) => {
        $crate::assertions::internal::__googletest_macro_verify_pred!($expr)
    };
}

/// Evaluates to a `Result` which contains an `Err` variant with the given test
/// failure message.
///
/// This can be used to force the test to fail if its execution reaches a
/// particular point. For example:
///
/// ```ignore
/// match some_value {
///     ExpectedVariant => {...}
///     UnwantedVaraint => {
///         fail!("This thing which should not happen happened anyway")?;
///     }
/// }
/// ```
///
/// One may include formatted arguments in the failure message:
///
/// ```ignore
/// match some_value {
///     ExpectedVariant => {...}
///     UnwantedVaraint => {
///         fail!("This thing which should not happen happened anyway: {}", some_value)?;
///     }
/// }
/// ```
///
/// One may also omit the message, in which case the test failure message will
/// be generic:
///
/// ```ignore
/// match some_value {
///     ExpectedVariant => {...}
///     UnwantedVaraint => {
///         fail!()?;
///     }
/// }
/// ```
///
/// Unlike `panic!` but analogously to [`verify_that`] and [`verify_pred`], this
/// macro has no effect on the flow of control but instead returns a `Result`
/// which must be handled by the invoking function. This can be done with the
/// question mark operator (as above) or the method
/// [`and_log_failure`](crate::GoogleTestSupport::and_log_failure).
#[macro_export]
macro_rules! fail {
    ($($message:expr),+ $(,)?) => {{
        $crate::assertions::internal::create_fail_result(
            format!($($message),*),
        )
    }};

    () => { fail!("Test failed") };
}

/// Generates a success. This **does not** make the overall test succeed. A test
/// is only considered successful if none of its assertions fail during its
/// execution.
///
/// The succeed!() assertion is purely documentary. The only user visible output
/// is a stdout with information on where the success was generated from.
///
/// ```ignore
/// fn test_to_be_implemented() {
///     succeed!();
/// }
/// ```
///
/// One may include formatted arguments in the success message:
///
/// ```ignore
/// fn test_to_be_implemented() {
///     succeed!("I am just a fake test: {}", "a fake test indeed");
/// }
/// ```
#[macro_export]
macro_rules! succeed {
    ($($message:expr),+ $(,)?) => {{
        println!(
            "{}\n at {}:{}:{}",
            format!($($message),*),
            file!(), line!(), column!()
        );
    }};

    () => {
        succeed!("Success")
    };
}

/// Generates a failure marking the test as failed but continue execution.
///
/// This is a **not-fatal** failure. The test continues execution even after the
/// macro execution.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The failure must be generated
/// in the same thread as that running the test itself.
///
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail_but_not_abort() {
///     add_failure!();
/// }
/// ```
///
/// One may include formatted arguments in the failure message:
///
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail_but_not_abort() {
///     add_failure!("I am just a fake test: {}", "a fake test indeed");
/// }
/// ```
#[macro_export]
macro_rules! add_failure {
    ($($message:expr),+ $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        $crate::assertions::internal::create_fail_result(
            format!($($message),*),
        ).and_log_failure();
    }};

    () => {
        add_failure!("Failed")
    };
}

/// Generates a failure at specified location marking the test as failed but
/// continue execution.
///
/// This is a **not-fatal** failure. The test continues execution even after the
/// macro execution.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The failure must be generated
/// in the same thread as that running the test itself.
///
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail_but_not_abort() {
///     add_failure_at!("src/my_file.rs", 32, 12);
/// }
/// ```
///
/// One may include formatted arguments in the failure message:
///
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail_but_not_abort() {
///     add_failure_at!(
///         "src/my_file.rs",
///         32,
///         12,
///         "I am just a fake test: {}", "a fake test indeed",
///     );
/// }
/// ```
#[macro_export]
macro_rules! add_failure_at {
    ($file:expr, $line:expr, $column:expr, $($message:expr),+ $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        $crate::assertions::internal::create_fail_result(
            format!($($message),*),
        ).map_err(|e| e.with_fake_location($file, $line, $column)).and_log_failure();
    }};

    ($file:expr, $line:expr, $column:expr $(,)?) => {
        add_failure_at!($file, $line, $column, "Failed")
    };
}

/// Verify if the condition evaluates to true and returns `Result`.
///
/// Evaluates to `Result::Ok(())` if the condition is true and
/// `Result::Err(TestAssertionFailure)` if it evaluates to false. The caller
/// must then decide how to handle the `Err` variant. It has a few options:
///   * Abort the current function with the `?` operator. This requires that the
///     function return a suitable `Result`.
///   * Log the failure and continue by calling the method `and_log_failure`.
///
/// Of course, one can also use all other standard methods on `Result`.
///
/// **Invoking this macro by itself does not cause a test failure to be recorded
/// or output.** The resulting `Result` must be handled as described above to
/// cause the test to be recorded as a failure.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[test]
/// fn should_fail() -> Result<()> {
///     verify_true!(2 + 2 == 5)
/// }
/// ```
#[macro_export]
macro_rules! verify_true {
    ($condition:expr) => {{
        use $crate::assertions::internal::Subject as _;
        ($condition).check($crate::matchers::eq(true), stringify!($condition))
    }};
}

/// Marks test as failed and continue execution if the expression evaluates to
/// false.
///
/// This is a **not-fatal** failure. The test continues execution even after the
/// macro execution.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The failure must be generated
/// in the same thread as that running the test itself.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     expect_true!(2 + 2 == 5);
///     println!("This will print");
/// }
/// ```
#[macro_export]
macro_rules! expect_true {
    ($condition:expr) => {{
        use $crate::GoogleTestSupport as _;
        verify_true!($condition).and_log_failure()
    }};
}

/// Verify if the condition evaluates to false and returns `Result`.
///
/// Evaluates to `Result::Ok(())` if the condition is false and
/// `Result::Err(TestAssertionFailure)` if it evaluates to true. The caller
/// must then decide how to handle the `Err` variant. It has a few options:
///   * Abort the current function with the `?` operator. This requires that the
///     function return a suitable `Result`.
///   * Log the failure and continue by calling the method `and_log_failure`.
///
/// Of course, one can also use all other standard methods on `Result`.
///
/// **Invoking this macro by itself does not cause a test failure to be recorded
/// or output.** The resulting `Result` must be handled as described above to
/// cause the test to be recorded as a failure.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[test]
/// fn should_fail() -> Result<()> {
///     verify_false!(2 + 2 == 4)
/// }
/// ```
#[macro_export]
macro_rules! verify_false {
    ($condition:expr) => {{
        use $crate::assertions::internal::Subject as _;
        ($condition).check($crate::matchers::eq(false), stringify!($condition))
    }};
}

/// Marks test as failed and continue execution if the expression evaluates to
/// true.
///
/// This is a **not-fatal** failure. The test continues execution even after the
/// macro execution.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The failure must be generated
/// in the same thread as that running the test itself.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     expect_false!(2 + 2 == 4);
///     println!("This will print");
/// }
/// ```
#[macro_export]
macro_rules! expect_false {
    ($condition:expr) => {{
        use $crate::GoogleTestSupport as _;
        verify_false!($condition).and_log_failure()
    }};
}

/// Checks whether the second argument is equal to the first argument.
///
/// Evaluates to `Result::Ok(())` if they are equal and
/// `Result::Err(TestAssertionFailure)` if they are not. The caller must then
/// decide how to handle the `Err` variant. It has a few options:
///  * Abort the current function with the `?` operator. This requires that the
///    function return a suitable `Result`.
///  * Log the test failure and continue by calling the method
///    `and_log_failure`.
///
/// Of course, one can also use all other standard methods on `Result`.
///
/// **Invoking this macro by itself does not cause a test failure to be recorded
/// or output.** The resulting `Result` must be handled as described above to
/// cause the test to be recorded as a failure.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[test]
/// fn should_fail() -> Result<()> {
///     verify_eq!(2, 1)
/// }
/// ```
///
/// This macro has special support for matching against container. Namely:
///  * `verify_eq!(actual, [e1, e2, ...])` is equivalent to
///    `verify_that!(actual, elements_are![eq(e1), eq(e2), ...])`
///  * `verify_eq!(actual, {e1, e2, ...})` is equivalent to
///    `verify_that!(actual, unordered_elements_are![eq(e1), eq(e2), ...])`
#[macro_export]
macro_rules! verify_eq {
    // Specialization for ordered sequences of tuples:
    ($actual:expr, [ $( ( $($tuple_elt:expr),* ) ),+ $(,)? ] $(,)?) => {
        verify_that!(&$actual, [
            $(
                // tuple matching
                (
                    $(
                        $crate::matchers::eq(&$tuple_elt)
                    ),*
                )
            ),*
        ])
    };

    // Specialization for unordered sequences of tuples:
    ($actual:expr, { $( ( $($tuple_elt:expr),* ) ),+ $(,)?} $(,)?) => {
        verify_that!(&$actual, {
            $(
                // tuple matching
                (
                    $(
                        $crate::matchers::eq(&$tuple_elt)
                    ),*
                )
            ),*
        })
    };

    // Ordered sequences:
    ($actual:expr, [$($expected:expr),+ $(,)?] $(,)?) => {
        verify_that!(&$actual, [$($crate::matchers::eq(&$expected)),*])
    };

    // Unordered sequences:
    ($actual:expr, {$($expected:expr),+ $(,)?} $(,)?) => {
        verify_that!(&$actual, {$($crate::matchers::eq(&$expected)),*})
    };

    // General case:
    ($actual:expr, $expected:expr $(,)?) => {
        verify_that!(&$actual, $crate::matchers::eq(&$expected))
    };
}

/// Marks test as failed and continues execution if the second argument is not
/// equal to first argument.
///
/// This is a **not-fatal** failure. The test continues execution even after the
/// macro execution.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The failure must be generated
/// in the same thread as that running the test itself.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     expect_eq!(2, 1);
///     println!("This will print!");
/// }
/// ```
///
/// This macro has special support for matching against container. Namely:
///  * `expect_eq!(actual, [e1, e2, ...])` for checking actual contains "e1, e2,
///    ..." in order.
///  * `expect_eq!(actual, {e1, e2, ...})` for checking actual contains "e1, e2,
///    ..." in any order.
///
/// One may include formatted arguments in the failure message:
///```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     let argument = "argument"
///     expect_eq!(2, 1, "custom failure message: {argument}");
///     println!("This will print!");
/// }
/// ```
#[macro_export]
macro_rules! expect_eq {
    ($actual:expr, [$($expected:expr),+ $(,)?] $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_eq!($actual, [$($expected),*]).and_log_failure();
    }};
    ($actual:expr, [$($expected:expr),+ $(,)?], $($format_args:expr),* $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_eq!($actual, [$($expected),*])
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure();
    }};
    ($actual:expr, {$($expected:expr),+ $(,)?} $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_eq!($actual, {$($expected),*}).and_log_failure();
    }};
    ($actual:expr, {$($expected:expr),+ $(,)?}, $($format_args:expr),* $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_eq!($actual, {$($expected),*})
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure();
    }};
    ($actual:expr, $expected:expr $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_eq!($actual, $expected).and_log_failure();
    }};
    ($actual:expr, $expected:expr, $($format_args:expr),* $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_eq!($actual, $expected)
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure();
    }};
}

/// Checks whether the second argument is not equal to the first argument.
///
/// Evaluates to `Result::Ok(())` if they are not equal and
/// `Result::Err(TestAssertionFailure)` if they are equal. The caller must then
/// decide how to handle the `Err` variant. It has a few options:
///  * Abort the current function with the `?` operator. This requires that the
///    function return a suitable `Result`.
///  * Log the test failure and continue by calling the method
///    `and_log_failure`.
///
/// Of course, one can also use all other standard methods on `Result`.
///
/// **Invoking this macro by itself does not cause a test failure to be recorded
/// or output.** The resulting `Result` must be handled as described above to
/// cause the test to be recorded as a failure.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[test]
/// fn should_fail() -> Result<()> {
///     verify_ne!(1, 1)
/// }
/// ```
#[macro_export]
macro_rules! verify_ne {
    ($actual:expr, $expected:expr $(,)?) => {
        verify_that!(&$actual, $crate::matchers::not($crate::matchers::eq(&$expected)))
    };
}

/// Marks test as failed and continues execution if the second argument is
/// equal to first argument.
///
/// This is a **not-fatal** failure. The test continues execution even after the
/// macro execution.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The failure must be generated
/// in the same thread as that running the test itself.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     expect_ne!(1, 1);
///     println!("This will print!");
/// }
/// ```
///
/// One may include formatted arguments in the failure message:
///```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     let argument = "argument"
///     expect_ne!(1, 1, "custom failure message: {argument}");
///     println!("This will print!");
/// }
/// ```
#[macro_export]
macro_rules! expect_ne {
    ($actual:expr, $expected:expr, $($format_args:expr),+ $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_ne!($actual, $expected)
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure();
    }};
    ($actual:expr, $expected:expr $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_ne!($actual, $expected).and_log_failure();
    }};
}

/// Checks whether the first argument is less than second argument.
///
/// Evaluates to `Result::Ok(())` if the first argument is less than the second
/// and `Result::Err(TestAssertionFailure)` if it is greater or equal. The
/// caller must then decide how to handle the `Err` variant. It has a few
/// options:
///  * Abort the current function with the `?` operator. This requires that the
///    function return a suitable `Result`.
///  * Log the test failure and continue by calling the method
///    `and_log_failure`.
///
/// Of course, one can also use all other standard methods on `Result`.
///
/// **Invoking this macro by itself does not cause a test failure to be recorded
/// or output.** The resulting `Result` must be handled as described above to
/// cause the test to be recorded as a failure.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[test]
/// fn should_fail() -> Result<()> {
///     verify_lt!(2, 1)
/// }
#[macro_export]
macro_rules! verify_lt {
    ($actual:expr, $expected:expr $(,)?) => {
        verify_that!($actual, $crate::matchers::lt($expected))
    };
}

/// Marks test as failed and continues execution if the first argument is
/// greater or equal to second argument.
///
/// This is a **not-fatal** failure. The test continues execution even after the
/// macro execution.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The failure must be generated
/// in the same thread as that running the test itself.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     expect_lt!(2, 1);
///     println!("This will print!");
/// }
/// ```
///
/// One may include formatted arguments in the failure message:
///```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     let argument = "argument"
///     expect_lt!(1, 1, "custom failure message: {argument}");
///     println!("This will print!");
/// }
/// ```
#[macro_export]
macro_rules! expect_lt {
    ($actual:expr, $expected:expr, $($format_args:expr),+ $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_lt!($actual, $expected)
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure();
    }};
    ($actual:expr, $expected:expr $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_lt!($actual, $expected).and_log_failure();
    }};
}

/// Checks whether the first argument is less than or equal to the second
/// argument.
///
/// Evaluates to `Result::Ok(())` if the first argument is less than or equal to
/// the second and `Result::Err(TestAssertionFailure)` if it is greater. The
/// caller must then decide how to handle the `Err` variant. It has a few
/// options:
///  * Abort the current function with the `?` operator. This requires that the
///    function return a suitable `Result`.
///  * Log the test failure and continue by calling the method
///    `and_log_failure`.
///
/// Of course, one can also use all other standard methods on `Result`.
///
/// **Invoking this macro by itself does not cause a test failure to be recorded
/// or output.** The resulting `Result` must be handled as described above to
/// cause the test to be recorded as a failure.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[test]
/// fn should_fail() -> Result<()> {
///     verify_le!(2, 1)
/// }
#[macro_export]
macro_rules! verify_le {
    ($actual:expr, $expected:expr $(,)?) => {
        verify_that!($actual, $crate::matchers::le($expected))
    };
}

/// Marks test as failed and continues execution if the first argument is
/// greater than the second argument.
///
/// This is a **not-fatal** failure. The test continues execution even after the
/// macro execution.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The failure must be generated
/// in the same thread as that running the test itself.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     expect_le!(2, 1);
///     println!("This will print!");
/// }
/// ```
///
/// One may include formatted arguments in the failure message:
///```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     let argument = "argument"
///     expect_le!(2, 1, "custom failure message: {argument}");
///     println!("This will print!");
/// }
/// ```
#[macro_export]
macro_rules! expect_le {
    ($actual:expr, $expected:expr, $($format_args:expr),+ $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_le!($actual, $expected)
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure();
    }};
    ($actual:expr, $expected:expr $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_le!($actual, $expected).and_log_failure();
    }};
}

/// Checks whether the first argument is greater than the second argument.
///
/// Evaluates to `Result::Ok(())` if the first argument is greater than
/// the second and `Result::Err(TestAssertionFailure)` if it is not. The
/// caller must then decide how to handle the `Err` variant. It has a few
/// options:
///  * Abort the current function with the `?` operator. This requires that the
///    function return a suitable `Result`.
///  * Log the test failure and continue by calling the method
///    `and_log_failure`.
///
/// Of course, one can also use all other standard methods on `Result`.
///
/// **Invoking this macro by itself does not cause a test failure to be recorded
/// or output.** The resulting `Result` must be handled as described above to
/// cause the test to be recorded as a failure.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[test]
/// fn should_fail() -> Result<()> {
///     verify_gt!(1, 2)
/// }
#[macro_export]
macro_rules! verify_gt {
    ($actual:expr, $expected:expr $(,)?) => {
        verify_that!($actual, $crate::matchers::gt($expected))
    };
}

/// Marks test as failed and continues execution if the first argument is
/// not greater than the second argument.
///
/// This is a **not-fatal** failure. The test continues execution even after the
/// macro execution.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The failure must be generated
/// in the same thread as that running the test itself.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     expect_gt!(1, 2);
///     println!("This will print!");
/// }
/// ```
///
/// One may include formatted arguments in the failure message:
///```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     let argument = "argument"
///     expect_gt!(1, 2, "custom failure message: {argument}");
///     println!("This will print!");
/// }
/// ```
#[macro_export]
macro_rules! expect_gt {
    ($actual:expr, $expected:expr, $($format_args:expr),+ $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_gt!($actual, $expected)
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure();
    }};
    ($actual:expr, $expected:expr $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_gt!($actual, $expected).and_log_failure();
    }};
}

/// Checks whether the first argument is greater than or equal to the second
/// argument.
///
/// Evaluates to `Result::Ok(())` if the first argument is greater than or equal
/// to the second and `Result::Err(TestAssertionFailure)` if it is not. The
/// caller must then decide how to handle the `Err` variant. It has a few
/// options:
///  * Abort the current function with the `?` operator. This requires that the
///    function return a suitable `Result`.
///  * Log the test failure and continue by calling the method
///    `and_log_failure`.
///
/// Of course, one can also use all other standard methods on `Result`.
///
/// **Invoking this macro by itself does not cause a test failure to be recorded
/// or output.** The resulting `Result` must be handled as described above to
/// cause the test to be recorded as a failure.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[test]
/// fn should_fail() -> Result<()> {
///     verify_ge!(1, 2)
/// }
/// ```
#[macro_export]
macro_rules! verify_ge {
    ($actual:expr, $expected:expr $(,)?) => {
        verify_that!($actual, $crate::matchers::ge($expected))
    };
}

/// Marks test as failed and continues execution if the first argument is
/// not greater than or equal to the second argument.
///
/// This is a **not-fatal** failure. The test continues execution even after the
/// macro execution.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The failure must be generated
/// in the same thread as that running the test itself.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     expect_ge!(1, 2);
///     println!("This will print!");
/// }
/// ```
///
/// One may include formatted arguments in the failure message:
///```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     let argument = "argument"
///     expect_ge!(1, 2, "custom failure message: {argument}");
///     println!("This will print!");
/// }
/// ```
#[macro_export]
macro_rules! expect_ge {
    ($actual:expr, $expected:expr, $($format_args:expr),+ $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_ge!($actual, $expected)
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure();
    }};
    ($actual:expr, $expected:expr $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_ge!($actual, $expected).and_log_failure();
    }};
}

/// Checks whether the float given by first argument is approximately
/// equal to second argument.
///
/// This automatically computes a tolerance from the magnitude of `expected` and
/// matches any actual value within this tolerance of the expected value. The
/// tolerance is chosen to account for the inaccuracies in most ordinary
/// floating point calculations. To see details of how the tolerance is
/// calculated look at the implementation of
/// [`googletest::approx_eq`][crate::matchers::approx_eq].
///
/// Evaluates to `Result::Ok(())` if the first argument is approximately equal
/// to the second and `Result::Err(TestAssertionFailure)` if it is not. The
/// caller must then decide how to handle the `Err` variant. It has a few
/// options:
///  * Abort the current function with the `?` operator. This requires that the
///    function return a suitable `Result`.
///  * Log the test failure and continue by calling the method
///    `and_log_failure`.
///
/// Of course, one can also use all other standard methods on `Result`.
///
/// **Invoking this macro by itself does not cause a test failure to be recorded
/// or output.** The resulting `Result` must be handled as described above to
/// cause the test to be recorded as a failure.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[test]
/// fn should_fail() -> Result<()> {
///     verify_float_eq!(1.0, 2.0)
/// }
/// ```
#[macro_export]
macro_rules! verify_float_eq {
    ($actual:expr, $expected:expr $(,)?) => {
        verify_that!($actual, $crate::matchers::approx_eq($expected))
    };
}

/// Marks test as failed and continues execution if the float given by the first
/// argument is not approximately equal to the float given by the second
/// argument.
///
/// This automatically computes a tolerance from the magnitude of `expected` and
/// matches any actual value within this tolerance of the expected value. The
/// tolerance is chosen to account for the inaccuracies in most ordinary
/// floating point calculations. To see details of how the tolerance is
/// calculated look at the implementation of
/// [`googletest::approx_eq`][crate::matchers::approx_eq].
///
/// This is a **not-fatal** failure. The test continues execution even after the
/// macro execution.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The failure must be generated
/// in the same thread as that running the test itself.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     expect_float_eq!(1.0, 2.0);
///     println!("This will print!");
/// }
/// ```
///
/// One may include formatted arguments in the failure message:
///```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     let argument = "argument"
///     expect_float_eq!(1.0, 2.0, "custom failure message: {argument}");
///     println!("This will print!");
/// }
/// ```
#[macro_export]
macro_rules! expect_float_eq {
    ($actual:expr, $expected:expr, $($format_args:expr),+ $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_float_eq!($actual, $expected)
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure();
    }};
    ($actual:expr, $expected:expr $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_float_eq!($actual, $expected).and_log_failure();
    }};
}

/// Checks whether the float given by first argument is equal to second argument
/// with error tolerance of max_abs_error.
///
/// Evaluates to `Result::Ok(())` if the first argument is approximately equal
/// to the second and `Result::Err(TestAssertionFailure)` if it is not. The
/// caller must then decide how to handle the `Err` variant. It has a few
/// options:
///  * Abort the current function with the `?` operator. This requires that the
///    function return a suitable `Result`.
///  * Log the test failure and continue by calling the method
///    `and_log_failure`.
///
/// Of course, one can also use all other standard methods on `Result`.
///
/// **Invoking this macro by itself does not cause a test failure to be recorded
/// or output.** The resulting `Result` must be handled as described above to
/// cause the test to be recorded as a failure.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[test]
/// fn should_fail() -> Result<()> {
///     verify_near!(1.12345, 1.12346, 1e-6)
/// }
/// ```
#[macro_export]
macro_rules! verify_near {
    ($actual:expr, $expected:expr, $max_abs_error:expr $(,)?) => {
        verify_that!($actual, $crate::matchers::near($expected, $max_abs_error))
    };
}

/// Marks the test as failed and continues execution if the float given by first
/// argument is not equal to second argument with error tolerance of
/// max_abs_error.
///
/// This is a **not-fatal** failure. The test continues execution even after the
/// macro execution.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The failure must be generated
/// in the same thread as that running the test itself.
///
/// Example:
/// ```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     expect_near!(1.12345, 1.12346, 1e-6);
///     println!("This will print!");
/// }
/// ```
///
/// One may include formatted arguments in the failure message:
///```ignore
/// use googletest::prelude::*;
///
/// #[gtest]
/// fn should_fail() {
///     let argument = "argument"
///     expect_near!(1.12345, 1.12346, 1e-6, "custom failure message: {argument}");
///     println!("This will print!");
/// }
/// ```
#[macro_export]
macro_rules! expect_near {
    ($actual:expr, $expected:expr, $max_abs_error:expr, $($format_args:expr),+ $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_near!($actual, $expected, $max_abs_error)
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure();
    }};
    ($actual:expr, $expected:expr, $max_abs_error:expr $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        verify_near!($actual, $expected, $max_abs_error).and_log_failure();
    }};
}

/// Matches the given value against the given matcher, panicking if it does not
/// match.
///
/// ```should_panic
/// # use googletest::prelude::*;
/// # fn should_fail() {
/// let value = 2;
/// assert_that!(value, eq(3));  // Fails and panics.
/// # }
/// # should_fail();
/// ```
///
/// This is analogous to assertions in most Rust test libraries, where a failed
/// assertion causes a panic.
///
/// One may optionally add arguments which will be formatted and appended to a
/// failure message. For example:
///
/// ```should_panic
/// # use googletest::prelude::*;
/// # fn should_fail() {
/// let value = 2;
/// let extra_information = "Some additional information";
/// assert_that!(value, eq(3), "Test failed. Extra information: {extra_information}.");
/// # }
/// # should_fail();
/// ```
///
/// This is output as follows:
///
/// ```text
/// Value of: value
/// Expected: is equal to 3
/// Actual: 2,
///   which isn't equal to 3
///   at ...
/// Test failed. Extra information: Some additional information.
/// ```
///
/// **Note for users of [GoogleTest for C++](http://google.github.io/googletest/):**
/// This differs from the `ASSERT_THAT` macro in that it panics rather
/// than triggering an early return from the invoking function. To get behaviour
/// equivalent to `ASSERT_THAT`, use [`verify_that!`] with the `?` operator.
#[macro_export]
macro_rules! assert_that {
    // specialized to sequence:
    ($actual:expr, [ $($expected:expr),* ] $(,)?) => {
        match $crate::verify_that!($actual, [ $($expected),* ]) {
            Ok(_) => {}
            Err(e) => {
                // The extra newline before the assertion failure message makes the failure a
                // bit easier to read when there's some generic boilerplate from the panic.
                panic!("\n{}", e);
            }
        }
    };

    // specialized to unordered sequence
    ($actual:expr, { $($expected:expr),* } $(,)?) => {
        match $crate::verify_that!($actual, { $($expected),* }) {
            Ok(_) => {}
            Err(e) => {
                // The extra newline before the assertion failure message makes the failure a
                // bit easier to read when there's some generic boilerplate from the panic.
                panic!("\n{}", e);
            }
        }
    };

    // w/ format args, specialized to sequence:
    ($actual:expr, [ $($expected:expr),* ], $($format_args:expr),* $(,)?) => {
        match $crate::verify_that!($actual, [ $($expected),* ])
            .with_failure_message(|| format!($($format_args),*))
        {
            Ok(_) => {}
            Err(e) => {
                // The extra newline before the assertion failure message makes the failure a
                // bit easier to read when there's some generic boilerplate from the panic.
                panic!("\n{}", e);
            }
        }
    };

    // w/ format args, specialized to unordered sequence:
    ($actual:expr, { $($expected:expr),* }, $($format_args:expr),* $(,)?) => {
        match $crate::verify_that!($actual, { $($expected),* })
            .with_failure_message(|| format!($($format_args),*))
        {
            Ok(_) => {}
            Err(e) => {
                // The extra newline before the assertion failure message makes the failure a
                // bit easier to read when there's some generic boilerplate from the panic.
                panic!("\n{}", e);
            }
        }
    };

    // general case:
    ($actual:expr, $expected:expr $(,)?) => {
        match $crate::verify_that!($actual, $expected) {
            Ok(_) => {}
            Err(e) => {
                // The extra newline before the assertion failure message makes the failure a
                // bit easier to read when there's some generic boilerplate from the panic.
                panic!("\n{}", e);
            }
        }
    };

    // w/ format args, general case:
    ($actual:expr, $expected:expr, $($format_args:expr),* $(,)?) => {
        match $crate::verify_that!($actual, $expected)
            .with_failure_message(|| format!($($format_args),*))
        {
            Ok(_) => {}
            Err(e) => {
                // The extra newline before the assertion failure message makes the failure a
                // bit easier to read when there's some generic boilerplate from the panic.
                panic!("\n{}", e);
            }
        }
    };
}

/// Asserts that the given predicate applied to the given arguments returns
/// true, panicking if it does not.
///
/// **Note for users of [GoogleTest for C++](http://google.github.io/googletest/):**
/// This differs from the `ASSERT_PRED*` family of macros in that it panics
/// rather than triggering an early return from the invoking function. To get
/// behaviour equivalent to `ASSERT_PRED*`, use [`verify_pred!`] with the `?`
/// operator.
#[macro_export]
macro_rules! assert_pred {
    ($($content:tt)*) => {
        match $crate::verify_pred!($($content)*) {
            Ok(_) => {}
            Err(e) => {
                // The extra newline before the assertion failure message makes the failure a
                // bit easier to read when there's some generic boilerplate from the panic.
                panic!("\n{}", e);
            }
        }
    };
}

/// Matches the given value against the given matcher, marking the test as
/// failed but continuing execution if it does not match.
///
/// This is a *non-fatal* assertion: the test continues
/// execution in the event of assertion failure.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The assertion must
/// occur in the same thread as that running the test itself.
///
/// Invoking this macro is equivalent to using
/// [`and_log_failure`](crate::GoogleTestSupport::and_log_failure) as follows:
///
/// ```ignore
/// verify_that!(actual, expected).and_log_failure()
/// ```
///
/// One may optionally add arguments which will be formatted and appended to a
/// failure message. For example:
///
/// ```
/// # use googletest::prelude::*;
/// # fn should_fail() -> std::result::Result<(), googletest::internal::test_outcome::TestFailure> {
/// # googletest::internal::test_outcome::TestOutcome::init_current_test_outcome();
/// let value = 2;
/// let extra_information = "Some additional information";
/// expect_that!(value, eq(3), "Test failed. Extra information: {extra_information}.");
/// # googletest::internal::test_outcome::TestOutcome::close_current_test_outcome::<&str>(Ok(()))
/// # }
/// # should_fail().unwrap_err();
/// ```
///
/// This is output as follows:
///
/// ```text
/// Value of: value
/// Expected: is equal to 3
/// Actual: 2,
///   which isn't equal to 3
///   at ...
/// Test failed. Extra information: Some additional information.
/// ```
#[macro_export]
macro_rules! expect_that {
    // specialized to sequence:
    ($actual:expr, [$($expected:expr),*] $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        $crate::verify_that!($actual, [$($expected),*]).and_log_failure();
    }};

    // specialized to unordered sequence:
    ($actual:expr, {$($expected:expr),*} $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        $crate::verify_that!($actual, {$($expected),*}).and_log_failure();
    }};

    // w/ format args, specialized to sequence:
    ($actual:expr, [$($expected:expr),*], $($format_args:expr),* $(,)?) => {
        use $crate::GoogleTestSupport as _;
        $crate::verify_that!($actual, [$($expected),*])
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure()
    };

    // w/ format args, specialized to unordered sequence:
    ($actual:expr, {$($expected:expr),*}, $($format_args:expr),* $(,)?) => {
        use $crate::GoogleTestSupport as _;
        $crate::verify_that!($actual, {$($expected),*})
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure()
    };

    // general case:
    ($actual:expr, $expected:expr $(,)?) => {{
        use $crate::GoogleTestSupport as _;
        $crate::verify_that!($actual, $expected).and_log_failure();
    }};

    // w/ format args, general case:
    ($actual:expr, $expected:expr, $($format_args:expr),* $(,)?) => {
        use $crate::GoogleTestSupport as _;
        $crate::verify_that!($actual, $expected)
            .with_failure_message(|| format!($($format_args),*))
            .and_log_failure()
    };
}

/// Asserts that the given predicate applied to the given arguments returns
/// true, failing the test but continuing execution if not.
///
/// This is a *non-fatal* predicate assertion: the test
/// continues execution in the event of assertion failure.
///
/// This can only be invoked inside tests with the
/// [`gtest`][crate::gtest] attribute. The assertion must
/// occur in the same thread as that running the test itself.
///
/// Invoking this macro is equivalent to using
/// [`and_log_failure`](crate::GoogleTestSupport::and_log_failure) as follows:
///
/// ```ignore
/// verify_pred!(predicate(...)).and_log_failure()
/// ```
#[macro_export]
macro_rules! expect_pred {
    ($($content:tt)*) => {{
        use $crate::GoogleTestSupport as _;
        $crate::verify_pred!($($content)*).and_log_failure();
    }};
}

/// Functions for use only by the procedural macros in this module.
///
/// **For internal use only. API stablility is not guaranteed!**
#[doc(hidden)]
pub mod internal {
    use crate::{
        internal::test_outcome::TestAssertionFailure,
        matcher::{create_assertion_failure, Matcher, MatcherResult},
    };
    use std::fmt::Debug;

    pub use ::googletest_macro::__googletest_macro_verify_pred;

    /// Extension trait to perform autoref through method lookup in the
    /// assertion macros. With this trait, the subject can be either a value
    /// or a reference. For example, this trait makes the following code
    /// compile and work:
    /// ```
    /// # use googletest::prelude::*;
    /// # fn would_not_compile_without_autoref() -> Result<()> {
    /// let not_copyable = vec![1,2,3];
    /// verify_that!(not_copyable, empty())?;
    /// # Ok(())
    /// # }
    /// ```
    /// See [Method Lookup](https://rustc-dev-guide.rust-lang.org/method-lookup.html)
    pub trait Subject: Copy + Debug {
        /// Checks whether the matcher `expected` matches the `Subject `self`,
        /// adding a test failure report if it does not match.
        ///
        /// Returns `Ok(())` if the value matches and `Err(_)` if it does not
        /// match.
        ///
        /// **For internal use only. API stablility is not guaranteed!**
        #[must_use = "The assertion result must be evaluated to affect the test result."]
        #[track_caller]
        fn check(
            self,
            expected: impl Matcher<Self>,
            actual_expr: &'static str,
        ) -> Result<(), TestAssertionFailure> {
            match expected.matches(self) {
                MatcherResult::Match => Ok(()),
                MatcherResult::NoMatch => {
                    Err(create_assertion_failure(&expected, self, actual_expr))
                }
            }
        }
    }

    impl<T: Copy + Debug> Subject for T {}

    /// Creates a failure at specified location.
    ///
    /// **For internal use only. API stability is not guaranteed!**
    #[must_use = "The assertion result must be evaluated to affect the test result."]
    #[track_caller]
    pub fn create_fail_result(message: String) -> crate::Result<()> {
        Err(crate::internal::test_outcome::TestAssertionFailure::create(message))
    }
}

#[cfg(test)]
mod tests {
    use crate::prelude::*;

    #[test]
    fn verify_of_hash_maps_with_str_string_matching() -> Result<()> {
        let hash_map: std::collections::HashMap<String, String> =
            std::collections::HashMap::from([("a".into(), "A".into()), ("b".into(), "B".into())]);
        verify_eq!(hash_map, {("a", "A"), ("b", "B")})
    }

    #[test]
    fn verify_of_hash_maps_with_ad_hoc_struct() -> Result<()> {
        #[derive(PartialEq, Debug)]
        struct Greek(String);

        let hash_map: std::collections::HashMap<String, Greek> = std::collections::HashMap::from([
            ("a".into(), Greek("Alpha".into())),
            ("b".into(), Greek("Beta".into())),
        ]);
        verify_eq!(hash_map, {
            ("b", Greek("Beta".into())),
            ("a", Greek("Alpha".into())),
        })
    }

    #[test]
    fn verify_of_hash_maps_with_i32s() -> Result<()> {
        let hash_map: std::collections::HashMap<i32, i32> =
            std::collections::HashMap::from([(1, 1), (2, 4), (-1, 1), (-3, 9)]);
        verify_eq!(hash_map, {
            (-3, 9),
            (-1, 1),
            (1, 1),
            (2, 4),
        })
    }

    #[test]
    fn verify_eq_of_unordered_pairs() -> Result<()> {
        verify_eq!(vec![(1, 2), (2, 3)], {(1, 2), (2, 3)})?;
        verify_eq!(vec![(1, 2), (2, 3)], {(2, 3), (1, 2)})
    }

    #[test]
    fn verify_eq_of_unordered_structs() -> Result<()> {
        #[derive(PartialEq, Debug)]
        struct P(i32, i32);

        verify_eq!(vec![P(1, 1), P(1, 2), P(3, 7)],
                  {P(1, 1), P(1, 2), P(3, 7)})?;
        verify_eq!(vec![P(1, 1), P(1, 2), P(3, 7)],
                  {P(3,7), P(1, 1), P(1, 2)})
    }

    #[test]
    fn verify_eq_of_ordered_pairs() -> Result<()> {
        verify_eq!(vec![(1, 2), (2, 3)], [(1, 2), (2, 3)])
    }

    #[test]
    fn verify_eq_of_ordered_structs() -> Result<()> {
        #[derive(PartialEq, Debug)]
        struct P(i32, i32);

        verify_eq!(vec![P(1, 1), P(1, 2), P(3, 7)], [P(1, 1), P(1, 2), P(3, 7)])
    }

    #[test]
    fn verify_eq_of_ordered_pairs_order_matters() -> Result<()> {
        let result = verify_eq!(vec![(1, 2), (2, 3)], [(2, 3), (1, 2)]);
        verify_that!(result, err(anything()))
    }

    #[test]
    fn verify_eq_of_ordered_structs_order_matters() -> Result<()> {
        #[derive(PartialEq, Debug)]
        struct P(i32, i32);

        let result = verify_eq!(vec![P(1, 1), P(1, 2), P(3, 7)], [P(3, 7), P(1, 1), P(1, 2)]);
        verify_that!(result, err(anything()))
    }
}
