aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorzhanyong.wan <zhanyong.wan@8415998a-534a-0410-bf83-d39667b30386>2009-05-11 18:54:08 +0000
committerzhanyong.wan <zhanyong.wan@8415998a-534a-0410-bf83-d39667b30386>2009-05-11 18:54:08 +0000
commit18490653e80d484b4650d8799184fd1e021efc7b (patch)
tree5015a00fc62e203acc763fee9ac97ccfb087ef2c /test
parentd955e83bee3919b871616223b777bab2f04942d9 (diff)
downloadgoogletest-18490653e80d484b4650d8799184fd1e021efc7b.tar.gz
googletest-18490653e80d484b4650d8799184fd1e021efc7b.tar.bz2
googletest-18490653e80d484b4650d8799184fd1e021efc7b.zip
Partially implemented SafeMatcherCast (by Vlad Losev); updated the implementation of Not, AnyOf, and AllOf to use SafeMatcherCast (by Vlad Losev); implemented ACTION_TEMPLATE (by Zhanyong Wan); worked around bugs on Symbian (by Zhanyong Wan).
Diffstat (limited to 'test')
-rw-r--r--test/gmock-generated-actions_test.cc152
-rw-r--r--test/gmock-matchers_test.cc113
2 files changed, 262 insertions, 3 deletions
diff --git a/test/gmock-generated-actions_test.cc b/test/gmock-generated-actions_test.cc
index 922efca9..84e5a413 100644
--- a/test/gmock-generated-actions_test.cc
+++ b/test/gmock-generated-actions_test.cc
@@ -1495,5 +1495,157 @@ TEST(ThrowActionTest, ThrowsGivenExceptionInNullaryFunction) {
#endif // GTEST_HAS_EXCEPTIONS
+// Tests that ACTION_TEMPLATE works when there is no value parameter.
+ACTION_TEMPLATE(CreateNew,
+ HAS_1_TEMPLATE_PARAMS(typename, T),
+ AND_0_VALUE_PARAMS()) {
+ return new T;
+}
+
+TEST(ActionTemplateTest, WorksWithoutValueParam) {
+ const Action<int*()> a = CreateNew<int>();
+ int* p = a.Perform(make_tuple());
+ delete p;
+}
+
+// Tests that ACTION_TEMPLATE works when there are value parameters.
+ACTION_TEMPLATE(CreateNew,
+ HAS_1_TEMPLATE_PARAMS(typename, T),
+ AND_1_VALUE_PARAMS(a0)) {
+ return new T(a0);
+}
+
+TEST(ActionTemplateTest, WorksWithValueParams) {
+ const Action<int*()> a = CreateNew<int>(42);
+ int* p = a.Perform(make_tuple());
+ EXPECT_EQ(42, *p);
+ delete p;
+}
+
+// Tests that ACTION_TEMPLATE works for integral template parameters.
+ACTION_TEMPLATE(MyDeleteArg,
+ HAS_1_TEMPLATE_PARAMS(int, k),
+ AND_0_VALUE_PARAMS()) {
+ delete std::tr1::get<k>(args);
+}
+
+// Resets a bool variable in the destructor.
+class BoolResetter {
+ public:
+ explicit BoolResetter(bool* value) : value_(value) {}
+ ~BoolResetter() { *value_ = false; }
+ private:
+ bool* const value_;
+};
+
+TEST(ActionTemplateTest, WorksForIntegralTemplateParams) {
+ const Action<void(int*, BoolResetter*)> a = MyDeleteArg<1>();
+ int n = 0;
+ bool b = true;
+ BoolResetter* resetter = new BoolResetter(&b);
+ a.Perform(make_tuple(&n, resetter));
+ EXPECT_FALSE(b); // Verifies that resetter is deleted.
+}
+
+// Tests that ACTION_TEMPLATES works for template template parameters.
+ACTION_TEMPLATE(ReturnSmartPointer,
+ HAS_1_TEMPLATE_PARAMS(template <typename Pointee> class,
+ Pointer),
+ AND_1_VALUE_PARAMS(pointee)) {
+ return Pointer<pointee_type>(new pointee_type(pointee));
+}
+
+TEST(ActionTemplateTest, WorksForTemplateTemplateParameters) {
+ using ::testing::internal::linked_ptr;
+ const Action<linked_ptr<int>()> a = ReturnSmartPointer<linked_ptr>(42);
+ linked_ptr<int> p = a.Perform(make_tuple());
+ EXPECT_EQ(42, *p);
+}
+
+// Tests that ACTION_TEMPLATE works for 10 template parameters.
+template <typename T1, typename T2, typename T3, int k4, bool k5,
+ unsigned int k6, typename T7, typename T8, typename T9>
+struct GiantTemplate {
+ public:
+ explicit GiantTemplate(int a_value) : value(a_value) {}
+ int value;
+};
+
+ACTION_TEMPLATE(ReturnGiant,
+ HAS_10_TEMPLATE_PARAMS(
+ typename, T1,
+ typename, T2,
+ typename, T3,
+ int, k4,
+ bool, k5,
+ unsigned int, k6,
+ class, T7,
+ class, T8,
+ class, T9,
+ template <typename T> class, T10),
+ AND_1_VALUE_PARAMS(value)) {
+ return GiantTemplate<T10<T1>, T2, T3, k4, k5, k6, T7, T8, T9>(value);
+}
+
+TEST(ActionTemplateTest, WorksFor10TemplateParameters) {
+ using ::testing::internal::linked_ptr;
+ typedef GiantTemplate<linked_ptr<int>, bool, double, 5,
+ true, 6, char, unsigned, int> Giant;
+ const Action<Giant()> a = ReturnGiant<
+ int, bool, double, 5, true, 6, char, unsigned, int, linked_ptr>(42);
+ Giant giant = a.Perform(make_tuple());
+ EXPECT_EQ(42, giant.value);
+}
+
+// Tests that ACTION_TEMPLATE works for 10 value parameters.
+ACTION_TEMPLATE(ReturnSum,
+ HAS_1_TEMPLATE_PARAMS(typename, Number),
+ AND_10_VALUE_PARAMS(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)) {
+ return static_cast<Number>(v1) + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10;
+}
+
+TEST(ActionTemplateTest, WorksFor10ValueParameters) {
+ const Action<int()> a = ReturnSum<int>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+ EXPECT_EQ(55, a.Perform(make_tuple()));
+}
+
+// Tests that ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded
+// on the number of value parameters.
+
+ACTION(ReturnSum) { return 0; }
+
+ACTION_P(ReturnSum, x) { return x; }
+
+ACTION_TEMPLATE(ReturnSum,
+ HAS_1_TEMPLATE_PARAMS(typename, Number),
+ AND_2_VALUE_PARAMS(v1, v2)) {
+ return static_cast<Number>(v1) + v2;
+}
+
+ACTION_TEMPLATE(ReturnSum,
+ HAS_1_TEMPLATE_PARAMS(typename, Number),
+ AND_3_VALUE_PARAMS(v1, v2, v3)) {
+ return static_cast<Number>(v1) + v2 + v3;
+}
+
+ACTION_TEMPLATE(ReturnSum,
+ HAS_2_TEMPLATE_PARAMS(typename, Number, int, k),
+ AND_4_VALUE_PARAMS(v1, v2, v3, v4)) {
+ return static_cast<Number>(v1) + v2 + v3 + v4 + k;
+}
+
+TEST(ActionTemplateTest, CanBeOverloadedOnNumberOfValueParameters) {
+ const Action<int()> a0 = ReturnSum();
+ const Action<int()> a1 = ReturnSum(1);
+ const Action<int()> a2 = ReturnSum<int>(1, 2);
+ const Action<int()> a3 = ReturnSum<int>(1, 2, 3);
+ const Action<int()> a4 = ReturnSum<int, 10000>(2000, 300, 40, 5);
+ EXPECT_EQ(0, a0.Perform(make_tuple()));
+ EXPECT_EQ(1, a1.Perform(make_tuple()));
+ EXPECT_EQ(3, a2.Perform(make_tuple()));
+ EXPECT_EQ(6, a3.Perform(make_tuple()));
+ EXPECT_EQ(12345, a4.Perform(make_tuple()));
+}
+
} // namespace gmock_generated_actions_test
} // namespace testing
diff --git a/test/gmock-matchers_test.cc b/test/gmock-matchers_test.cc
index 82820fe0..ab5ca35c 100644
--- a/test/gmock-matchers_test.cc
+++ b/test/gmock-matchers_test.cc
@@ -366,6 +366,76 @@ TEST(MatcherCastTest, FromSameType) {
EXPECT_FALSE(m2.Matches(1));
}
+class Base {};
+class Derived : public Base {};
+
+// Tests that SafeMatcherCast<T>(m) works when m is a polymorphic matcher.
+TEST(SafeMatcherCastTest, FromPolymorphicMatcher) {
+ Matcher<char> m2 = SafeMatcherCast<char>(Eq(32));
+ EXPECT_TRUE(m2.Matches(' '));
+ EXPECT_FALSE(m2.Matches('\n'));
+}
+
+// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where T
+// can be implicitly converted to U.
+TEST(SafeMatcherCastTest, FromImplicitlyConvertibleType) {
+ Matcher<double> m1 = DoubleEq(1.0);
+ Matcher<int> m2 = SafeMatcherCast<int>(m1);
+ EXPECT_TRUE(m2.Matches(1));
+ EXPECT_FALSE(m2.Matches(2));
+}
+
+// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where T and U
+// are pointers or references to a derived and a base class, correspondingly.
+TEST(SafeMatcherCastTest, FromBaseClass) {
+ Derived d, d2;
+ Matcher<Base*> m1 = Eq(&d);
+ Matcher<Derived*> m2 = SafeMatcherCast<Derived*>(m1);
+ EXPECT_TRUE(m2.Matches(&d));
+ EXPECT_FALSE(m2.Matches(&d2));
+
+ Matcher<Base&> m3 = Ref(d);
+ Matcher<Derived&> m4 = SafeMatcherCast<Derived&>(m3);
+ EXPECT_TRUE(m4.Matches(d));
+ EXPECT_FALSE(m4.Matches(d2));
+}
+
+// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<const T&>.
+TEST(SafeMatcherCastTest, FromConstReferenceToReference) {
+ int n = 0;
+ Matcher<const int&> m1 = Ref(n);
+ Matcher<int&> m2 = SafeMatcherCast<int&>(m1);
+ int n1 = 0;
+ EXPECT_TRUE(m2.Matches(n));
+ EXPECT_FALSE(m2.Matches(n1));
+}
+
+// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>.
+TEST(SafeMatcherCastTest, FromNonReferenceToConstReference) {
+ Matcher<int> m1 = Eq(0);
+ Matcher<const int&> m2 = SafeMatcherCast<const int&>(m1);
+ EXPECT_TRUE(m2.Matches(0));
+ EXPECT_FALSE(m2.Matches(1));
+}
+
+// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<T>.
+TEST(SafeMatcherCastTest, FromNonReferenceToReference) {
+ Matcher<int> m1 = Eq(0);
+ Matcher<int&> m2 = SafeMatcherCast<int&>(m1);
+ int n = 0;
+ EXPECT_TRUE(m2.Matches(n));
+ n = 1;
+ EXPECT_FALSE(m2.Matches(n));
+}
+
+// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<T>.
+TEST(SafeMatcherCastTest, FromSameType) {
+ Matcher<int> m1 = Eq(0);
+ Matcher<int> m2 = SafeMatcherCast<int>(m1);
+ EXPECT_TRUE(m2.Matches(0));
+ EXPECT_FALSE(m2.Matches(1));
+}
+
// Tests that A<T>() matches any value of type T.
TEST(ATest, MatchesAnyValue) {
// Tests a matcher for a value type.
@@ -626,9 +696,6 @@ TEST(RefTest, CanBeUsedAsMatcherForConstReference) {
// used wherever Ref(base) can be used (Ref(derived) is a sub-type
// of Ref(base), but not vice versa.
-class Base {};
-class Derived : public Base {};
-
TEST(RefTest, IsCovariant) {
Base base, base2;
Derived derived;
@@ -1355,6 +1422,16 @@ TEST(NotTest, CanDescribeSelf) {
EXPECT_EQ("is not equal to 5", Describe(m));
}
+// Tests that monomorphic matchers are safely cast by the Not matcher.
+TEST(NotTest, NotMatcherSafelyCastsMonomorphicMatchers) {
+ // greater_than_5 is a monomorphic matcher.
+ Matcher<int> greater_than_5 = Gt(5);
+
+ Matcher<const int&> m = Not(greater_than_5);
+ Matcher<int&> m2 = Not(greater_than_5);
+ Matcher<int&> m3 = Not(m);
+}
+
// Tests that AllOf(m1, ..., mn) matches any value that matches all of
// the given matchers.
TEST(AllOfTest, MatchesWhenAllMatch) {
@@ -1415,6 +1492,21 @@ TEST(AllOfTest, CanDescribeSelf) {
"(is not equal to 7))))", Describe(m));
}
+// Tests that monomorphic matchers are safely cast by the AllOf matcher.
+TEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) {
+ // greater_than_5 and less_than_10 are monomorphic matchers.
+ Matcher<int> greater_than_5 = Gt(5);
+ Matcher<int> less_than_10 = Lt(10);
+
+ Matcher<const int&> m = AllOf(greater_than_5, less_than_10);
+ Matcher<int&> m2 = AllOf(greater_than_5, less_than_10);
+ Matcher<int&> m3 = AllOf(greater_than_5, m2);
+
+ // Tests that BothOf works when composing itself.
+ Matcher<const int&> m4 = AllOf(greater_than_5, less_than_10, less_than_10);
+ Matcher<int&> m5 = AllOf(greater_than_5, less_than_10, less_than_10);
+}
+
// Tests that AnyOf(m1, ..., mn) matches any value that matches at
// least one of the given matchers.
TEST(AnyOfTest, MatchesWhenAnyMatches) {
@@ -1473,6 +1565,21 @@ TEST(AnyOfTest, CanDescribeSelf) {
Describe(m));
}
+// Tests that monomorphic matchers are safely cast by the AnyOf matcher.
+TEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) {
+ // greater_than_5 and less_than_10 are monomorphic matchers.
+ Matcher<int> greater_than_5 = Gt(5);
+ Matcher<int> less_than_10 = Lt(10);
+
+ Matcher<const int&> m = AnyOf(greater_than_5, less_than_10);
+ Matcher<int&> m2 = AnyOf(greater_than_5, less_than_10);
+ Matcher<int&> m3 = AnyOf(greater_than_5, m2);
+
+ // Tests that EitherOf works when composing itself.
+ Matcher<const int&> m4 = AnyOf(greater_than_5, less_than_10, less_than_10);
+ Matcher<int&> m5 = AnyOf(greater_than_5, less_than_10, less_than_10);
+}
+
// The following predicate function and predicate functor are for
// testing the Truly(predicate) matcher.