Skip to content

Commit f99635d

Browse files
Merge pull request google#430 from google:extending_specialization_
PiperOrigin-RevId: 654084631
2 parents d5fb77f + 37621c6 commit f99635d

File tree

6 files changed

+104
-10
lines changed

6 files changed

+104
-10
lines changed

googletest/src/matchers/all_matcher.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,21 +50,33 @@
5050
/// ```
5151
///
5252
/// Assertion failure messages are not guaranteed to be identical, however.
53+
///
54+
/// If an inner matcher is `eq(...)`, it can be omitted:
55+
///
56+
/// ```
57+
/// # use googletest::prelude::*;
58+
///
59+
/// verify_that!(123, all![123, lt(1000), gt(100)])
60+
/// # .unwrap();
61+
/// ```
5362
#[macro_export]
5463
#[doc(hidden)]
5564
macro_rules! __all {
5665
($(,)?) => {{
5766
$crate::matchers::anything()
5867
}} ;
5968
($matcher:expr $(,)?) => {{
60-
$matcher
69+
use $crate::matcher_support::__internal_unstable_do_not_depend_on_these::auto_eq;
70+
auto_eq!($matcher)
6171
}};
6272
($head:expr, $head2:expr $(,)?) => {{
63-
$crate::matchers::__internal_unstable_do_not_depend_on_these::ConjunctionMatcher::new($head, $head2)
73+
use $crate::matcher_support::__internal_unstable_do_not_depend_on_these::auto_eq;
74+
$crate::matchers::__internal_unstable_do_not_depend_on_these::ConjunctionMatcher::new(auto_eq!($head), auto_eq!($head2))
6475
}};
6576
($head:expr, $head2:expr, $($tail:expr),+ $(,)?) => {{
77+
use $crate::matcher_support::__internal_unstable_do_not_depend_on_these::auto_eq;
6678
$crate::__all![
67-
$crate::matchers::__internal_unstable_do_not_depend_on_these::ConjunctionMatcher::new($head, $head2),
79+
$crate::matchers::__internal_unstable_do_not_depend_on_these::ConjunctionMatcher::new(auto_eq!($head), auto_eq!($head2)),
6880
$($tail),+
6981
]
7082
}}
@@ -127,4 +139,9 @@ mod tests {
127139
displays_as(eq("which does not start with \"Another\""))
128140
)
129141
}
142+
143+
#[test]
144+
fn all_with_auto_eq() -> Result<()> {
145+
verify_that!(42, all![eq(42), 42, lt(100)])
146+
}
130147
}

googletest/src/matchers/any_matcher.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,21 +52,33 @@
5252
/// ```
5353
///
5454
/// Assertion failure messages are not guaranteed to be identical, however.
55+
///
56+
/// If an inner matcher is `eq(...)`, it can be omitted:
57+
///
58+
/// ```
59+
/// # use googletest::prelude::*;
60+
///
61+
/// verify_that!(123, any![lt(1), 123, gt(1000)])
62+
/// # .unwrap();
63+
/// ```
5564
#[macro_export]
5665
#[doc(hidden)]
5766
macro_rules! __any {
5867
($(,)?) => {{
5968
$crate::matchers::not($crate::matchers::anything())
6069
}} ;
6170
($matcher:expr $(,)?) => {{
62-
$matcher
71+
use $crate::matcher_support::__internal_unstable_do_not_depend_on_these::auto_eq;
72+
auto_eq!($matcher)
6373
}};
6474
($head:expr, $head2:expr $(,)?) => {{
65-
$crate::matchers::__internal_unstable_do_not_depend_on_these::DisjunctionMatcher::new($head, $head2)
75+
use $crate::matcher_support::__internal_unstable_do_not_depend_on_these::auto_eq;
76+
$crate::matchers::__internal_unstable_do_not_depend_on_these::DisjunctionMatcher::new(auto_eq!($head), auto_eq!($head2))
6677
}};
6778
($head:expr, $head2:expr, $($tail:expr),+ $(,)?) => {{
79+
use $crate::matcher_support::__internal_unstable_do_not_depend_on_these::auto_eq;
6880
$crate::__any![
69-
$crate::matchers::__internal_unstable_do_not_depend_on_these::DisjunctionMatcher::new($head, $head2),
81+
$crate::matchers::__internal_unstable_do_not_depend_on_these::DisjunctionMatcher::new(auto_eq!($head), auto_eq!($head2)),
7082
$($tail),+
7183
]
7284
}}
@@ -134,4 +146,9 @@ mod tests {
134146
fn empty_any_matcher_never_matches() -> Result<()> {
135147
verify_that!(123, not(any![]))
136148
}
149+
150+
#[test]
151+
fn any_with_auto_eq() -> Result<()> {
152+
verify_that!(42, any![1, 2, 42, gt(123)])
153+
}
137154
}

googletest/src/matchers/elements_are_matcher.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@
6565
/// # .unwrap();
6666
/// ```
6767
///
68+
/// If an inner matcher is `eq(...)`, it can be omitted:
69+
///
70+
/// ```
71+
/// # use googletest::prelude::*;
72+
///
73+
/// verify_that!(vec![1,2,3], elements_are![&1, lt(&1000), gt(&1)])
74+
/// # .unwrap();
75+
/// ```
76+
///
6877
/// Do not use this with unordered containers, since that will lead to flaky
6978
/// tests. Use
7079
/// [`unordered_elements_are!`][crate::matchers::unordered_elements_are]
@@ -79,7 +88,8 @@
7988
macro_rules! __elements_are {
8089
($($matcher:expr),* $(,)?) => {{
8190
use $crate::matchers::__internal_unstable_do_not_depend_on_these::ElementsAre;
82-
ElementsAre::new(vec![$(Box::new($matcher)),*])
91+
use $crate::matcher_support::__internal_unstable_do_not_depend_on_these::auto_eq;
92+
ElementsAre::new(vec![$(Box::new(auto_eq!($matcher))),*])
8393
}}
8494
}
8595

googletest/src/matchers/unordered_elements_are_matcher.rs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,15 @@
7373
/// # .unwrap();
7474
/// ```
7575
///
76+
/// If an inner matcher is `eq(...)`, it can be omitted:
77+
///
78+
/// ```
79+
/// # use googletest::prelude::*;
80+
///
81+
/// verify_that!(vec![1,2,3], unordered_elements_are![lt(&2), gt(&1), &3])
82+
/// # .unwrap();
83+
/// ```
84+
///
7685
/// The matcher proceeds in three stages:
7786
///
7887
/// 1. It first checks whether the actual value is of the right size to possibly
@@ -109,7 +118,8 @@ macro_rules! __unordered_elements_are {
109118
use $crate::matchers::__internal_unstable_do_not_depend_on_these::{
110119
UnorderedElementsAreMatcher, Requirements
111120
};
112-
UnorderedElementsAreMatcher::new([$(Box::new($matcher)),*], Requirements::PerfectMatch)
121+
use $crate::matcher_support::__internal_unstable_do_not_depend_on_these::auto_eq;
122+
UnorderedElementsAreMatcher::new([$(Box::new(auto_eq!($matcher))),*], Requirements::PerfectMatch)
113123
}};
114124
}
115125

@@ -153,6 +163,15 @@ macro_rules! __unordered_elements_are {
153163
/// The actual value must be a container such as a `&Vec`, an array, or a
154164
/// slice. More precisely, the actual value must implement [`IntoIterator`].
155165
///
166+
/// If an inner matcher is `eq(...)`, it can be omitted:
167+
///
168+
/// ```
169+
/// # use googletest::prelude::*;
170+
///
171+
/// verify_that!(vec![1,2,3], contains_each![lt(&2), &3])
172+
/// # .unwrap();
173+
/// ```
174+
///
156175
/// The matcher proceeds in three stages:
157176
///
158177
/// 1. It first checks whether the actual value is large enough to possibly be
@@ -183,10 +202,11 @@ macro_rules! __contains_each {
183202
}};
184203

185204
($($matcher:expr),* $(,)?) => {{
205+
use $crate::matcher_support::__internal_unstable_do_not_depend_on_these::auto_eq;
186206
use $crate::matchers::__internal_unstable_do_not_depend_on_these::{
187207
UnorderedElementsAreMatcher, Requirements
188208
};
189-
UnorderedElementsAreMatcher::new([$(Box::new($matcher)),*], Requirements::Superset)
209+
UnorderedElementsAreMatcher::new([$(Box::new(auto_eq!($matcher))),*], Requirements::Superset)
190210
}}
191211
}
192212

@@ -231,6 +251,15 @@ macro_rules! __contains_each {
231251
/// The actual value must be a container such as a `&Vec`, an array, or a slice.
232252
/// More precisely, the actual value must implement [`IntoIterator`].
233253
///
254+
/// If an inner matcher is `eq(...)`, it can be omitted:
255+
///
256+
/// ```
257+
/// # use googletest::prelude::*;
258+
///
259+
/// verify_that!(vec![1,2,3], is_contained_in![lt(&2), &3, &4, gt(&0)])
260+
/// # .unwrap();
261+
/// ```
262+
///
234263
/// The matcher proceeds in three stages:
235264
///
236265
/// 1. It first checks whether the actual value is too large to possibly be
@@ -264,7 +293,8 @@ macro_rules! __is_contained_in {
264293
use $crate::matchers::__internal_unstable_do_not_depend_on_these::{
265294
UnorderedElementsAreMatcher, Requirements
266295
};
267-
UnorderedElementsAreMatcher::new([$(Box::new($matcher)),*], Requirements::Subset)
296+
use $crate::matcher_support::__internal_unstable_do_not_depend_on_these::auto_eq;
297+
UnorderedElementsAreMatcher::new([$(Box::new(auto_eq!($matcher))),*], Requirements::Subset)
268298
}}
269299
}
270300

googletest/tests/elements_are_matcher_test.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,8 @@ fn elements_are_works_when_matcher_is_created_in_subroutine() -> Result<()> {
139139
fn elements_are_implicitly_called() -> Result<()> {
140140
verify_that!(vec![1, 2, 3], [eq(&1), eq(&2), eq(&3)])
141141
}
142+
143+
#[test]
144+
fn elements_are_with_auto_eq() -> Result<()> {
145+
verify_that!(vec![1, 2, 3], [&1, &2, lt(&43)])
146+
}

googletest/tests/unordered_elements_are_matcher_test.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,3 +448,18 @@ fn is_contained_in_explains_mismatch_due_to_no_graph_matching_found() -> Result<
448448
Expected element `is greater than or equal to 3` at index 1 did not match any remaining actual element."))
449449
))
450450
}
451+
452+
#[test]
453+
fn unordered_elements_are_with_auto_eq() -> Result<()> {
454+
verify_that!(vec![3, 4, 2], unordered_elements_are![&2, &3, &4])
455+
}
456+
457+
#[test]
458+
fn contains_each_with_auto_eq() -> Result<()> {
459+
verify_that!(vec![3, 4, 2], contains_each![&2, &4])
460+
}
461+
462+
#[test]
463+
fn is_contained_in_with_auto_eq() -> Result<()> {
464+
verify_that!(vec![3, 4, 2], is_contained_in![&1, &2, &3, &4])
465+
}

0 commit comments

Comments
 (0)