| // RUN: %check_clang_tidy %s bugprone-argument-comment %t |
| |
| namespace testing { |
| namespace internal { |
| |
| template <typename F> |
| struct Function; |
| |
| template <typename R> |
| struct Function<R()> { |
| typedef R Result; |
| }; |
| |
| template <typename R, typename A1> |
| struct Function<R(A1)> |
| : Function<R()> { |
| typedef A1 Argument1; |
| }; |
| |
| template <typename R, typename A1, typename A2> |
| struct Function<R(A1, A2)> |
| : Function<R(A1)> { |
| typedef A2 Argument2; |
| }; |
| |
| } // namespace internal |
| |
| template <typename F> |
| class MockSpec { |
| public: |
| void f(); |
| }; |
| |
| template <typename T> |
| class Matcher { |
| public: |
| explicit Matcher(); |
| Matcher(T value); |
| }; |
| |
| } // namespace testing |
| |
| #define GMOCK_RESULT_(tn, ...) \ |
| tn ::testing::internal::Function<__VA_ARGS__>::Result |
| #define GMOCK_ARG_(tn, N, ...) \ |
| tn ::testing::internal::Function<__VA_ARGS__>::Argument##N |
| #define GMOCK_MATCHER_(tn, N, ...) \ |
| const ::testing::Matcher<GMOCK_ARG_(tn, N, __VA_ARGS__)>& |
| #define GMOCK_METHOD2_(tn, constness, ct, Method, ...) \ |
| GMOCK_RESULT_(tn, __VA_ARGS__) \ |
| ct Method( \ |
| GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ |
| GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2) constness; \ |
| ::testing::MockSpec<__VA_ARGS__> \ |
| gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ |
| GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness |
| #define MOCK_METHOD2(m, ...) GMOCK_METHOD2_(, , , m, __VA_ARGS__) |
| #define MOCK_CONST_METHOD2(m, ...) GMOCK_METHOD2_(, const, , m, __VA_ARGS__) |
| #define GMOCK_EXPECT_CALL_IMPL_(obj, call) \ |
| ((obj).gmock_##call).f() |
| #define EXPECT_CALL(obj, call) GMOCK_EXPECT_CALL_IMPL_(obj, call) |
| |
| class Base { |
| public: |
| virtual void Method(int param_one_base, int param_two_base); |
| }; |
| class Derived : public Base { |
| public: |
| virtual void Method(int param_one, int param_two); |
| virtual void Method2(int p_one, int p_two) const; |
| }; |
| class MockDerived : public Derived { |
| public: |
| MOCK_METHOD2(Method, void(int a, int b)); |
| MOCK_CONST_METHOD2(Method2, void(int c, int d)); |
| }; |
| |
| class MockStandalone { |
| public: |
| MOCK_METHOD2(Method, void(int aaa, int bbb)); |
| }; |
| |
| void test_gmock_expectations() { |
| MockDerived m; |
| EXPECT_CALL(m, Method(/*param_one=*/1, /*param_tw=*/2)); |
| // CHECK-MESSAGES: [[@LINE-1]]:42: warning: argument name 'param_tw' in comment does not match parameter name 'param_two' |
| // CHECK-FIXES: EXPECT_CALL(m, Method(/*param_one=*/1, /*param_two=*/2)); |
| EXPECT_CALL(m, Method2(/*p_on=*/3, /*p_two=*/4)); |
| // CHECK-MESSAGES: [[@LINE-1]]:26: warning: argument name 'p_on' in comment does not match parameter name 'p_one' |
| // CHECK-FIXES: EXPECT_CALL(m, Method2(/*p_one=*/3, /*p_two=*/4)); |
| |
| #define PARAM1 11 |
| #define PARAM2 22 |
| EXPECT_CALL(m, Method2(/*p_on1=*/PARAM1, /*p_tw2=*/PARAM2)); |
| // CHECK-MESSAGES: [[@LINE-1]]:26: warning: argument name 'p_on1' in comment does not match parameter name 'p_one' |
| // CHECK-MESSAGES: [[@LINE-2]]:44: warning: argument name 'p_tw2' in comment does not match parameter name 'p_two' |
| // CHECK-FIXES: EXPECT_CALL(m, Method2(/*p_one=*/PARAM1, /*p_two=*/PARAM2)); |
| |
| MockStandalone m2; |
| EXPECT_CALL(m2, Method(/*aaa=*/5, /*bbc=*/6)); |
| } |
| |
| void test_gmock_direct_calls() { |
| MockDerived m; |
| m.Method(/*param_one=*/1, /*param_tw=*/2); |
| // CHECK-MESSAGES: [[@LINE-1]]:29: warning: argument name 'param_tw' in comment does not match parameter name 'param_two' |
| // CHECK-FIXES: m.Method(/*param_one=*/1, /*param_two=*/2); |
| } |