File indexing completed on 2025-08-07 08:19:53
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_
0061 #define GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_
0062
0063 #include <map>
0064 #include <set>
0065 #include <sstream>
0066 #include <string>
0067 #include <vector>
0068
0069 #if GTEST_HAS_EXCEPTIONS
0070 # include <stdexcept> // NOLINT
0071 #endif
0072
0073 #include "gmock/gmock-actions.h"
0074 #include "gmock/gmock-cardinalities.h"
0075 #include "gmock/gmock-matchers.h"
0076 #include "gmock/internal/gmock-internal-utils.h"
0077 #include "gmock/internal/gmock-port.h"
0078 #include "gtest/gtest.h"
0079
0080 namespace testing {
0081
0082
0083 class Expectation;
0084
0085
0086 class ExpectationSet;
0087
0088
0089
0090 namespace internal {
0091
0092
0093 template <typename F> class FunctionMocker;
0094
0095
0096 class ExpectationBase;
0097
0098
0099 template <typename F> class TypedExpectation;
0100
0101
0102 class ExpectationTester;
0103
0104
0105 template <typename F> class FunctionMockerBase;
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118 GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_gmock_mutex);
0119
0120
0121 class UntypedActionResultHolderBase;
0122
0123
0124
0125
0126 class GTEST_API_ UntypedFunctionMockerBase {
0127 public:
0128 UntypedFunctionMockerBase();
0129 virtual ~UntypedFunctionMockerBase();
0130
0131
0132
0133
0134 bool VerifyAndClearExpectationsLocked()
0135 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
0136
0137
0138 virtual void ClearDefaultActionsLocked()
0139 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) = 0;
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150 virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction(
0151 const void* untyped_args,
0152 const string& call_description) const = 0;
0153
0154
0155
0156
0157 virtual UntypedActionResultHolderBase* UntypedPerformAction(
0158 const void* untyped_action,
0159 const void* untyped_args) const = 0;
0160
0161
0162
0163
0164 virtual void UntypedDescribeUninterestingCall(
0165 const void* untyped_args,
0166 ::std::ostream* os) const
0167 GTEST_LOCK_EXCLUDED_(g_gmock_mutex) = 0;
0168
0169
0170
0171
0172
0173
0174
0175 virtual const ExpectationBase* UntypedFindMatchingExpectation(
0176 const void* untyped_args,
0177 const void** untyped_action, bool* is_excessive,
0178 ::std::ostream* what, ::std::ostream* why)
0179 GTEST_LOCK_EXCLUDED_(g_gmock_mutex) = 0;
0180
0181
0182 virtual void UntypedPrintArgs(const void* untyped_args,
0183 ::std::ostream* os) const = 0;
0184
0185
0186
0187
0188
0189
0190 void RegisterOwner(const void* mock_obj)
0191 GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
0192
0193
0194
0195
0196 void SetOwnerAndName(const void* mock_obj, const char* name)
0197 GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
0198
0199
0200
0201
0202 const void* MockObject() const
0203 GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
0204
0205
0206
0207 const char* Name() const
0208 GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
0209
0210
0211
0212
0213
0214 UntypedActionResultHolderBase* UntypedInvokeWith(
0215 const void* untyped_args)
0216 GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
0217
0218 protected:
0219 typedef std::vector<const void*> UntypedOnCallSpecs;
0220
0221 typedef std::vector<internal::linked_ptr<ExpectationBase> >
0222 UntypedExpectations;
0223
0224
0225
0226 Expectation GetHandleOf(ExpectationBase* exp);
0227
0228
0229
0230
0231 const void* mock_obj_;
0232
0233
0234
0235 const char* name_;
0236
0237
0238 UntypedOnCallSpecs untyped_on_call_specs_;
0239
0240
0241 UntypedExpectations untyped_expectations_;
0242 };
0243
0244
0245 class UntypedOnCallSpecBase {
0246 public:
0247
0248 UntypedOnCallSpecBase(const char* a_file, int a_line)
0249 : file_(a_file), line_(a_line), last_clause_(kNone) {}
0250
0251
0252 const char* file() const { return file_; }
0253 int line() const { return line_; }
0254
0255 protected:
0256
0257 enum Clause {
0258
0259
0260 kNone,
0261 kWith,
0262 kWillByDefault
0263 };
0264
0265
0266 void AssertSpecProperty(bool property, const string& failure_message) const {
0267 Assert(property, file_, line_, failure_message);
0268 }
0269
0270
0271 void ExpectSpecProperty(bool property, const string& failure_message) const {
0272 Expect(property, file_, line_, failure_message);
0273 }
0274
0275 const char* file_;
0276 int line_;
0277
0278
0279
0280 Clause last_clause_;
0281 };
0282
0283
0284 template <typename F>
0285 class OnCallSpec : public UntypedOnCallSpecBase {
0286 public:
0287 typedef typename Function<F>::ArgumentTuple ArgumentTuple;
0288 typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;
0289
0290
0291
0292 OnCallSpec(const char* a_file, int a_line,
0293 const ArgumentMatcherTuple& matchers)
0294 : UntypedOnCallSpecBase(a_file, a_line),
0295 matchers_(matchers),
0296
0297
0298
0299
0300 extra_matcher_(A<const ArgumentTuple&>()) {
0301 }
0302
0303
0304 OnCallSpec& With(const Matcher<const ArgumentTuple&>& m) {
0305
0306 ExpectSpecProperty(last_clause_ < kWith,
0307 ".With() cannot appear "
0308 "more than once in an ON_CALL().");
0309 last_clause_ = kWith;
0310
0311 extra_matcher_ = m;
0312 return *this;
0313 }
0314
0315
0316 OnCallSpec& WillByDefault(const Action<F>& action) {
0317 ExpectSpecProperty(last_clause_ < kWillByDefault,
0318 ".WillByDefault() must appear "
0319 "exactly once in an ON_CALL().");
0320 last_clause_ = kWillByDefault;
0321
0322 ExpectSpecProperty(!action.IsDoDefault(),
0323 "DoDefault() cannot be used in ON_CALL().");
0324 action_ = action;
0325 return *this;
0326 }
0327
0328
0329 bool Matches(const ArgumentTuple& args) const {
0330 return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);
0331 }
0332
0333
0334 const Action<F>& GetAction() const {
0335 AssertSpecProperty(last_clause_ == kWillByDefault,
0336 ".WillByDefault() must appear exactly "
0337 "once in an ON_CALL().");
0338 return action_;
0339 }
0340
0341 private:
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355 ArgumentMatcherTuple matchers_;
0356 Matcher<const ArgumentTuple&> extra_matcher_;
0357 Action<F> action_;
0358 };
0359
0360
0361 enum CallReaction {
0362 kAllow,
0363 kWarn,
0364 kFail,
0365 kDefault = kWarn
0366 };
0367
0368 }
0369
0370
0371 class GTEST_API_ Mock {
0372 public:
0373
0374
0375
0376
0377 static void AllowLeak(const void* mock_obj)
0378 GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
0379
0380
0381
0382
0383 static bool VerifyAndClearExpectations(void* mock_obj)
0384 GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
0385
0386
0387
0388
0389 static bool VerifyAndClear(void* mock_obj)
0390 GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
0391
0392 private:
0393 friend class internal::UntypedFunctionMockerBase;
0394
0395
0396
0397 template <typename F>
0398 friend class internal::FunctionMockerBase;
0399
0400 template <typename M>
0401 friend class NiceMock;
0402
0403 template <typename M>
0404 friend class NaggyMock;
0405
0406 template <typename M>
0407 friend class StrictMock;
0408
0409
0410
0411 static void AllowUninterestingCalls(const void* mock_obj)
0412 GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
0413
0414
0415
0416 static void WarnUninterestingCalls(const void* mock_obj)
0417 GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
0418
0419
0420
0421 static void FailUninterestingCalls(const void* mock_obj)
0422 GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
0423
0424
0425
0426 static void UnregisterCallReaction(const void* mock_obj)
0427 GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
0428
0429
0430
0431 static internal::CallReaction GetReactionOnUninterestingCalls(
0432 const void* mock_obj)
0433 GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
0434
0435
0436
0437
0438 static bool VerifyAndClearExpectationsLocked(void* mock_obj)
0439 GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);
0440
0441
0442 static void ClearDefaultActionsLocked(void* mock_obj)
0443 GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);
0444
0445
0446 static void Register(
0447 const void* mock_obj,
0448 internal::UntypedFunctionMockerBase* mocker)
0449 GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
0450
0451
0452
0453
0454 static void RegisterUseByOnCallOrExpectCall(
0455 const void* mock_obj, const char* file, int line)
0456 GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
0457
0458
0459
0460
0461
0462 static void UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)
0463 GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);
0464 };
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487 class GTEST_API_ Expectation {
0488 public:
0489
0490 Expectation();
0491
0492 ~Expectation();
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503 Expectation(internal::ExpectationBase& exp);
0504
0505
0506
0507
0508
0509 bool operator==(const Expectation& rhs) const {
0510 return expectation_base_ == rhs.expectation_base_;
0511 }
0512
0513 bool operator!=(const Expectation& rhs) const { return !(*this == rhs); }
0514
0515 private:
0516 friend class ExpectationSet;
0517 friend class Sequence;
0518 friend class ::testing::internal::ExpectationBase;
0519 friend class ::testing::internal::UntypedFunctionMockerBase;
0520
0521 template <typename F>
0522 friend class ::testing::internal::FunctionMockerBase;
0523
0524 template <typename F>
0525 friend class ::testing::internal::TypedExpectation;
0526
0527
0528 class Less {
0529 public:
0530 bool operator()(const Expectation& lhs, const Expectation& rhs) const {
0531 return lhs.expectation_base_.get() < rhs.expectation_base_.get();
0532 }
0533 };
0534
0535 typedef ::std::set<Expectation, Less> Set;
0536
0537 Expectation(
0538 const internal::linked_ptr<internal::ExpectationBase>& expectation_base);
0539
0540
0541 const internal::linked_ptr<internal::ExpectationBase>&
0542 expectation_base() const {
0543 return expectation_base_;
0544 }
0545
0546
0547 internal::linked_ptr<internal::ExpectationBase> expectation_base_;
0548 };
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563 class ExpectationSet {
0564 public:
0565
0566 typedef Expectation::Set::const_iterator const_iterator;
0567
0568
0569 typedef Expectation::Set::value_type value_type;
0570
0571
0572 ExpectationSet() {}
0573
0574
0575
0576
0577 ExpectationSet(internal::ExpectationBase& exp) {
0578 *this += Expectation(exp);
0579 }
0580
0581
0582
0583
0584 ExpectationSet(const Expectation& e) {
0585 *this += e;
0586 }
0587
0588
0589
0590
0591
0592
0593 bool operator==(const ExpectationSet& rhs) const {
0594 return expectations_ == rhs.expectations_;
0595 }
0596
0597 bool operator!=(const ExpectationSet& rhs) const { return !(*this == rhs); }
0598
0599
0600
0601 ExpectationSet& operator+=(const Expectation& e) {
0602 expectations_.insert(e);
0603 return *this;
0604 }
0605
0606 int size() const { return static_cast<int>(expectations_.size()); }
0607
0608 const_iterator begin() const { return expectations_.begin(); }
0609 const_iterator end() const { return expectations_.end(); }
0610
0611 private:
0612 Expectation::Set expectations_;
0613 };
0614
0615
0616
0617
0618
0619 class GTEST_API_ Sequence {
0620 public:
0621
0622 Sequence() : last_expectation_(new Expectation) {}
0623
0624
0625
0626 void AddExpectation(const Expectation& expectation) const;
0627
0628 private:
0629
0630
0631
0632
0633 internal::linked_ptr<Expectation> last_expectation_;
0634 };
0635
0636
0637
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657
0658
0659
0660 class GTEST_API_ InSequence {
0661 public:
0662 InSequence();
0663 ~InSequence();
0664 private:
0665 bool sequence_created_;
0666
0667 GTEST_DISALLOW_COPY_AND_ASSIGN_(InSequence);
0668 } GTEST_ATTRIBUTE_UNUSED_;
0669
0670 namespace internal {
0671
0672
0673
0674 GTEST_API_ extern ThreadLocal<Sequence*> g_gmock_implicit_sequence;
0675
0676
0677
0678
0679
0680
0681
0682
0683
0684
0685
0686
0687
0688
0689
0690 class GTEST_API_ ExpectationBase {
0691 public:
0692
0693 ExpectationBase(const char* file, int line, const string& source_text);
0694
0695 virtual ~ExpectationBase();
0696
0697
0698 const char* file() const { return file_; }
0699 int line() const { return line_; }
0700 const char* source_text() const { return source_text_.c_str(); }
0701
0702 const Cardinality& cardinality() const { return cardinality_; }
0703
0704
0705 void DescribeLocationTo(::std::ostream* os) const {
0706 *os << FormatFileLocation(file(), line()) << " ";
0707 }
0708
0709
0710
0711 void DescribeCallCountTo(::std::ostream* os) const
0712 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
0713
0714
0715
0716 virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) = 0;
0717
0718 protected:
0719 friend class ::testing::Expectation;
0720 friend class UntypedFunctionMockerBase;
0721
0722 enum Clause {
0723
0724 kNone,
0725 kWith,
0726 kTimes,
0727 kInSequence,
0728 kAfter,
0729 kWillOnce,
0730 kWillRepeatedly,
0731 kRetiresOnSaturation
0732 };
0733
0734 typedef std::vector<const void*> UntypedActions;
0735
0736
0737
0738 virtual Expectation GetHandle() = 0;
0739
0740
0741 void AssertSpecProperty(bool property, const string& failure_message) const {
0742 Assert(property, file_, line_, failure_message);
0743 }
0744
0745
0746 void ExpectSpecProperty(bool property, const string& failure_message) const {
0747 Expect(property, file_, line_, failure_message);
0748 }
0749
0750
0751
0752 void SpecifyCardinality(const Cardinality& cardinality);
0753
0754
0755
0756 bool cardinality_specified() const { return cardinality_specified_; }
0757
0758
0759 void set_cardinality(const Cardinality& a_cardinality) {
0760 cardinality_ = a_cardinality;
0761 }
0762
0763
0764
0765
0766
0767
0768 void RetireAllPreRequisites()
0769 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
0770
0771
0772 bool is_retired() const
0773 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
0774 g_gmock_mutex.AssertHeld();
0775 return retired_;
0776 }
0777
0778
0779 void Retire()
0780 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
0781 g_gmock_mutex.AssertHeld();
0782 retired_ = true;
0783 }
0784
0785
0786 bool IsSatisfied() const
0787 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
0788 g_gmock_mutex.AssertHeld();
0789 return cardinality().IsSatisfiedByCallCount(call_count_);
0790 }
0791
0792
0793 bool IsSaturated() const
0794 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
0795 g_gmock_mutex.AssertHeld();
0796 return cardinality().IsSaturatedByCallCount(call_count_);
0797 }
0798
0799
0800 bool IsOverSaturated() const
0801 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
0802 g_gmock_mutex.AssertHeld();
0803 return cardinality().IsOverSaturatedByCallCount(call_count_);
0804 }
0805
0806
0807 bool AllPrerequisitesAreSatisfied() const
0808 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
0809
0810
0811 void FindUnsatisfiedPrerequisites(ExpectationSet* result) const
0812 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
0813
0814
0815 int call_count() const
0816 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
0817 g_gmock_mutex.AssertHeld();
0818 return call_count_;
0819 }
0820
0821
0822 void IncrementCallCount()
0823 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
0824 g_gmock_mutex.AssertHeld();
0825 call_count_++;
0826 }
0827
0828
0829
0830
0831
0832 void CheckActionCountIfNotDone() const
0833 GTEST_LOCK_EXCLUDED_(mutex_);
0834
0835 friend class ::testing::Sequence;
0836 friend class ::testing::internal::ExpectationTester;
0837
0838 template <typename Function>
0839 friend class TypedExpectation;
0840
0841
0842 void UntypedTimes(const Cardinality& a_cardinality);
0843
0844
0845
0846 const char* file_;
0847 int line_;
0848 const string source_text_;
0849
0850 bool cardinality_specified_;
0851 Cardinality cardinality_;
0852
0853
0854
0855
0856
0857
0858 ExpectationSet immediate_prerequisites_;
0859
0860
0861
0862 int call_count_;
0863 bool retired_;
0864 UntypedActions untyped_actions_;
0865 bool extra_matcher_specified_;
0866 bool repeated_action_specified_;
0867 bool retires_on_saturation_;
0868 Clause last_clause_;
0869 mutable bool action_count_checked_;
0870 mutable Mutex mutex_;
0871
0872 GTEST_DISALLOW_ASSIGN_(ExpectationBase);
0873 };
0874
0875
0876 template <typename F>
0877 class TypedExpectation : public ExpectationBase {
0878 public:
0879 typedef typename Function<F>::ArgumentTuple ArgumentTuple;
0880 typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;
0881 typedef typename Function<F>::Result Result;
0882
0883 TypedExpectation(FunctionMockerBase<F>* owner,
0884 const char* a_file, int a_line, const string& a_source_text,
0885 const ArgumentMatcherTuple& m)
0886 : ExpectationBase(a_file, a_line, a_source_text),
0887 owner_(owner),
0888 matchers_(m),
0889
0890
0891
0892
0893 extra_matcher_(A<const ArgumentTuple&>()),
0894 repeated_action_(DoDefault()) {}
0895
0896 virtual ~TypedExpectation() {
0897
0898
0899 CheckActionCountIfNotDone();
0900 for (UntypedActions::const_iterator it = untyped_actions_.begin();
0901 it != untyped_actions_.end(); ++it) {
0902 delete static_cast<const Action<F>*>(*it);
0903 }
0904 }
0905
0906
0907 TypedExpectation& With(const Matcher<const ArgumentTuple&>& m) {
0908 if (last_clause_ == kWith) {
0909 ExpectSpecProperty(false,
0910 ".With() cannot appear "
0911 "more than once in an EXPECT_CALL().");
0912 } else {
0913 ExpectSpecProperty(last_clause_ < kWith,
0914 ".With() must be the first "
0915 "clause in an EXPECT_CALL().");
0916 }
0917 last_clause_ = kWith;
0918
0919 extra_matcher_ = m;
0920 extra_matcher_specified_ = true;
0921 return *this;
0922 }
0923
0924
0925 TypedExpectation& Times(const Cardinality& a_cardinality) {
0926 ExpectationBase::UntypedTimes(a_cardinality);
0927 return *this;
0928 }
0929
0930
0931 TypedExpectation& Times(int n) {
0932 return Times(Exactly(n));
0933 }
0934
0935
0936 TypedExpectation& InSequence(const Sequence& s) {
0937 ExpectSpecProperty(last_clause_ <= kInSequence,
0938 ".InSequence() cannot appear after .After(),"
0939 " .WillOnce(), .WillRepeatedly(), or "
0940 ".RetiresOnSaturation().");
0941 last_clause_ = kInSequence;
0942
0943 s.AddExpectation(GetHandle());
0944 return *this;
0945 }
0946 TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2) {
0947 return InSequence(s1).InSequence(s2);
0948 }
0949 TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2,
0950 const Sequence& s3) {
0951 return InSequence(s1, s2).InSequence(s3);
0952 }
0953 TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2,
0954 const Sequence& s3, const Sequence& s4) {
0955 return InSequence(s1, s2, s3).InSequence(s4);
0956 }
0957 TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2,
0958 const Sequence& s3, const Sequence& s4,
0959 const Sequence& s5) {
0960 return InSequence(s1, s2, s3, s4).InSequence(s5);
0961 }
0962
0963
0964 TypedExpectation& After(const ExpectationSet& s) {
0965 ExpectSpecProperty(last_clause_ <= kAfter,
0966 ".After() cannot appear after .WillOnce(),"
0967 " .WillRepeatedly(), or "
0968 ".RetiresOnSaturation().");
0969 last_clause_ = kAfter;
0970
0971 for (ExpectationSet::const_iterator it = s.begin(); it != s.end(); ++it) {
0972 immediate_prerequisites_ += *it;
0973 }
0974 return *this;
0975 }
0976 TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2) {
0977 return After(s1).After(s2);
0978 }
0979 TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2,
0980 const ExpectationSet& s3) {
0981 return After(s1, s2).After(s3);
0982 }
0983 TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2,
0984 const ExpectationSet& s3, const ExpectationSet& s4) {
0985 return After(s1, s2, s3).After(s4);
0986 }
0987 TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2,
0988 const ExpectationSet& s3, const ExpectationSet& s4,
0989 const ExpectationSet& s5) {
0990 return After(s1, s2, s3, s4).After(s5);
0991 }
0992
0993
0994 TypedExpectation& WillOnce(const Action<F>& action) {
0995 ExpectSpecProperty(last_clause_ <= kWillOnce,
0996 ".WillOnce() cannot appear after "
0997 ".WillRepeatedly() or .RetiresOnSaturation().");
0998 last_clause_ = kWillOnce;
0999
1000 untyped_actions_.push_back(new Action<F>(action));
1001 if (!cardinality_specified()) {
1002 set_cardinality(Exactly(static_cast<int>(untyped_actions_.size())));
1003 }
1004 return *this;
1005 }
1006
1007
1008 TypedExpectation& WillRepeatedly(const Action<F>& action) {
1009 if (last_clause_ == kWillRepeatedly) {
1010 ExpectSpecProperty(false,
1011 ".WillRepeatedly() cannot appear "
1012 "more than once in an EXPECT_CALL().");
1013 } else {
1014 ExpectSpecProperty(last_clause_ < kWillRepeatedly,
1015 ".WillRepeatedly() cannot appear "
1016 "after .RetiresOnSaturation().");
1017 }
1018 last_clause_ = kWillRepeatedly;
1019 repeated_action_specified_ = true;
1020
1021 repeated_action_ = action;
1022 if (!cardinality_specified()) {
1023 set_cardinality(AtLeast(static_cast<int>(untyped_actions_.size())));
1024 }
1025
1026
1027
1028 CheckActionCountIfNotDone();
1029 return *this;
1030 }
1031
1032
1033 TypedExpectation& RetiresOnSaturation() {
1034 ExpectSpecProperty(last_clause_ < kRetiresOnSaturation,
1035 ".RetiresOnSaturation() cannot appear "
1036 "more than once.");
1037 last_clause_ = kRetiresOnSaturation;
1038 retires_on_saturation_ = true;
1039
1040
1041
1042 CheckActionCountIfNotDone();
1043 return *this;
1044 }
1045
1046
1047
1048 const ArgumentMatcherTuple& matchers() const {
1049 return matchers_;
1050 }
1051
1052
1053 const Matcher<const ArgumentTuple&>& extra_matcher() const {
1054 return extra_matcher_;
1055 }
1056
1057
1058 const Action<F>& repeated_action() const { return repeated_action_; }
1059
1060
1061
1062 virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) {
1063 if (extra_matcher_specified_) {
1064 *os << " Expected args: ";
1065 extra_matcher_.DescribeTo(os);
1066 *os << "\n";
1067 }
1068 }
1069
1070 private:
1071 template <typename Function>
1072 friend class FunctionMockerBase;
1073
1074
1075
1076 virtual Expectation GetHandle() {
1077 return owner_->GetHandleOf(this);
1078 }
1079
1080
1081
1082
1083
1084
1085 bool Matches(const ArgumentTuple& args) const
1086 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
1087 g_gmock_mutex.AssertHeld();
1088 return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);
1089 }
1090
1091
1092 bool ShouldHandleArguments(const ArgumentTuple& args) const
1093 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
1094 g_gmock_mutex.AssertHeld();
1095
1096
1097
1098
1099
1100 CheckActionCountIfNotDone();
1101 return !is_retired() && AllPrerequisitesAreSatisfied() && Matches(args);
1102 }
1103
1104
1105
1106 void ExplainMatchResultTo(
1107 const ArgumentTuple& args,
1108 ::std::ostream* os) const
1109 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
1110 g_gmock_mutex.AssertHeld();
1111
1112 if (is_retired()) {
1113 *os << " Expected: the expectation is active\n"
1114 << " Actual: it is retired\n";
1115 } else if (!Matches(args)) {
1116 if (!TupleMatches(matchers_, args)) {
1117 ExplainMatchFailureTupleTo(matchers_, args, os);
1118 }
1119 StringMatchResultListener listener;
1120 if (!extra_matcher_.MatchAndExplain(args, &listener)) {
1121 *os << " Expected args: ";
1122 extra_matcher_.DescribeTo(os);
1123 *os << "\n Actual: don't match";
1124
1125 internal::PrintIfNotEmpty(listener.str(), os);
1126 *os << "\n";
1127 }
1128 } else if (!AllPrerequisitesAreSatisfied()) {
1129 *os << " Expected: all pre-requisites are satisfied\n"
1130 << " Actual: the following immediate pre-requisites "
1131 << "are not satisfied:\n";
1132 ExpectationSet unsatisfied_prereqs;
1133 FindUnsatisfiedPrerequisites(&unsatisfied_prereqs);
1134 int i = 0;
1135 for (ExpectationSet::const_iterator it = unsatisfied_prereqs.begin();
1136 it != unsatisfied_prereqs.end(); ++it) {
1137 it->expectation_base()->DescribeLocationTo(os);
1138 *os << "pre-requisite #" << i++ << "\n";
1139 }
1140 *os << " (end of pre-requisites)\n";
1141 } else {
1142
1143
1144
1145
1146 *os << "The call matches the expectation.\n";
1147 }
1148 }
1149
1150
1151 const Action<F>& GetCurrentAction(
1152 const FunctionMockerBase<F>* mocker,
1153 const ArgumentTuple& args) const
1154 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
1155 g_gmock_mutex.AssertHeld();
1156 const int count = call_count();
1157 Assert(count >= 1, __FILE__, __LINE__,
1158 "call_count() is <= 0 when GetCurrentAction() is "
1159 "called - this should never happen.");
1160
1161 const int action_count = static_cast<int>(untyped_actions_.size());
1162 if (action_count > 0 && !repeated_action_specified_ &&
1163 count > action_count) {
1164
1165
1166 ::std::stringstream ss;
1167 DescribeLocationTo(&ss);
1168 ss << "Actions ran out in " << source_text() << "...\n"
1169 << "Called " << count << " times, but only "
1170 << action_count << " WillOnce()"
1171 << (action_count == 1 ? " is" : "s are") << " specified - ";
1172 mocker->DescribeDefaultActionTo(args, &ss);
1173 Log(kWarning, ss.str(), 1);
1174 }
1175
1176 return count <= action_count ?
1177 *static_cast<const Action<F>*>(untyped_actions_[count - 1]) :
1178 repeated_action();
1179 }
1180
1181
1182
1183
1184
1185
1186
1187
1188 const Action<F>* GetActionForArguments(
1189 const FunctionMockerBase<F>* mocker,
1190 const ArgumentTuple& args,
1191 ::std::ostream* what,
1192 ::std::ostream* why)
1193 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
1194 g_gmock_mutex.AssertHeld();
1195 if (IsSaturated()) {
1196
1197 IncrementCallCount();
1198 *what << "Mock function called more times than expected - ";
1199 mocker->DescribeDefaultActionTo(args, what);
1200 DescribeCallCountTo(why);
1201
1202
1203
1204
1205 return NULL;
1206 }
1207
1208 IncrementCallCount();
1209 RetireAllPreRequisites();
1210
1211 if (retires_on_saturation_ && IsSaturated()) {
1212 Retire();
1213 }
1214
1215
1216 *what << "Mock function call matches " << source_text() <<"...\n";
1217 return &(GetCurrentAction(mocker, args));
1218 }
1219
1220
1221
1222 FunctionMockerBase<F>* const owner_;
1223 ArgumentMatcherTuple matchers_;
1224 Matcher<const ArgumentTuple&> extra_matcher_;
1225 Action<F> repeated_action_;
1226
1227 GTEST_DISALLOW_COPY_AND_ASSIGN_(TypedExpectation);
1228 };
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241 GTEST_API_ void LogWithLocation(testing::internal::LogSeverity severity,
1242 const char* file, int line,
1243 const string& message);
1244
1245 template <typename F>
1246 class MockSpec {
1247 public:
1248 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
1249 typedef typename internal::Function<F>::ArgumentMatcherTuple
1250 ArgumentMatcherTuple;
1251
1252
1253
1254 explicit MockSpec(internal::FunctionMockerBase<F>* function_mocker)
1255 : function_mocker_(function_mocker) {}
1256
1257
1258
1259 internal::OnCallSpec<F>& InternalDefaultActionSetAt(
1260 const char* file, int line, const char* obj, const char* call) {
1261 LogWithLocation(internal::kInfo, file, line,
1262 string("ON_CALL(") + obj + ", " + call + ") invoked");
1263 return function_mocker_->AddNewOnCallSpec(file, line, matchers_);
1264 }
1265
1266
1267
1268 internal::TypedExpectation<F>& InternalExpectedAt(
1269 const char* file, int line, const char* obj, const char* call) {
1270 const string source_text(string("EXPECT_CALL(") + obj + ", " + call + ")");
1271 LogWithLocation(internal::kInfo, file, line, source_text + " invoked");
1272 return function_mocker_->AddNewExpectation(
1273 file, line, source_text, matchers_);
1274 }
1275
1276 private:
1277 template <typename Function>
1278 friend class internal::FunctionMocker;
1279
1280 void SetMatchers(const ArgumentMatcherTuple& matchers) {
1281 matchers_ = matchers;
1282 }
1283
1284
1285 internal::FunctionMockerBase<F>* const function_mocker_;
1286
1287 ArgumentMatcherTuple matchers_;
1288
1289 GTEST_DISALLOW_ASSIGN_(MockSpec);
1290 };
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301 template <typename T>
1302 class ReferenceOrValueWrapper {
1303 public:
1304
1305 explicit ReferenceOrValueWrapper(T value)
1306 : value_(::testing::internal::move(value)) {
1307 }
1308
1309
1310
1311
1312 T Unwrap() { return ::testing::internal::move(value_); }
1313
1314
1315
1316
1317
1318 const T& Peek() const {
1319 return value_;
1320 }
1321
1322 private:
1323 T value_;
1324 };
1325
1326
1327
1328 template <typename T>
1329 class ReferenceOrValueWrapper<T&> {
1330 public:
1331
1332
1333 typedef T& reference;
1334 explicit ReferenceOrValueWrapper(reference ref)
1335 : value_ptr_(&ref) {}
1336 T& Unwrap() { return *value_ptr_; }
1337 const T& Peek() const { return *value_ptr_; }
1338
1339 private:
1340 T* value_ptr_;
1341 };
1342
1343
1344
1345
1346
1347
1348 #ifdef _MSC_VER
1349 # pragma warning(push)
1350 # pragma warning(disable:4355)
1351 #endif
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362 class UntypedActionResultHolderBase {
1363 public:
1364 virtual ~UntypedActionResultHolderBase() {}
1365
1366
1367 virtual void PrintAsActionResult(::std::ostream* os) const = 0;
1368 };
1369
1370
1371 template <typename T>
1372 class ActionResultHolder : public UntypedActionResultHolderBase {
1373 public:
1374
1375 T Unwrap() {
1376 return result_.Unwrap();
1377 }
1378
1379
1380 virtual void PrintAsActionResult(::std::ostream* os) const {
1381 *os << "\n Returns: ";
1382
1383 UniversalPrinter<T>::Print(result_.Peek(), os);
1384 }
1385
1386
1387
1388 template <typename F>
1389 static ActionResultHolder* PerformDefaultAction(
1390 const FunctionMockerBase<F>* func_mocker,
1391 const typename Function<F>::ArgumentTuple& args,
1392 const string& call_description) {
1393 return new ActionResultHolder(Wrapper(
1394 func_mocker->PerformDefaultAction(args, call_description)));
1395 }
1396
1397
1398
1399 template <typename F>
1400 static ActionResultHolder*
1401 PerformAction(const Action<F>& action,
1402 const typename Function<F>::ArgumentTuple& args) {
1403 return new ActionResultHolder(Wrapper(action.Perform(args)));
1404 }
1405
1406 private:
1407 typedef ReferenceOrValueWrapper<T> Wrapper;
1408
1409 explicit ActionResultHolder(Wrapper result)
1410 : result_(::testing::internal::move(result)) {
1411 }
1412
1413 Wrapper result_;
1414
1415 GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionResultHolder);
1416 };
1417
1418
1419 template <>
1420 class ActionResultHolder<void> : public UntypedActionResultHolderBase {
1421 public:
1422 void Unwrap() { }
1423
1424 virtual void PrintAsActionResult(::std::ostream* ) const {}
1425
1426
1427
1428 template <typename F>
1429 static ActionResultHolder* PerformDefaultAction(
1430 const FunctionMockerBase<F>* func_mocker,
1431 const typename Function<F>::ArgumentTuple& args,
1432 const string& call_description) {
1433 func_mocker->PerformDefaultAction(args, call_description);
1434 return new ActionResultHolder;
1435 }
1436
1437
1438
1439 template <typename F>
1440 static ActionResultHolder* PerformAction(
1441 const Action<F>& action,
1442 const typename Function<F>::ArgumentTuple& args) {
1443 action.Perform(args);
1444 return new ActionResultHolder;
1445 }
1446
1447 private:
1448 ActionResultHolder() {}
1449 GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionResultHolder);
1450 };
1451
1452
1453
1454
1455 template <typename F>
1456 class FunctionMockerBase : public UntypedFunctionMockerBase {
1457 public:
1458 typedef typename Function<F>::Result Result;
1459 typedef typename Function<F>::ArgumentTuple ArgumentTuple;
1460 typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;
1461
1462 FunctionMockerBase() : current_spec_(this) {}
1463
1464
1465
1466
1467 virtual ~FunctionMockerBase()
1468 GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
1469 MutexLock l(&g_gmock_mutex);
1470 VerifyAndClearExpectationsLocked();
1471 Mock::UnregisterLocked(this);
1472 ClearDefaultActionsLocked();
1473 }
1474
1475
1476
1477
1478 const OnCallSpec<F>* FindOnCallSpec(
1479 const ArgumentTuple& args) const {
1480 for (UntypedOnCallSpecs::const_reverse_iterator it
1481 = untyped_on_call_specs_.rbegin();
1482 it != untyped_on_call_specs_.rend(); ++it) {
1483 const OnCallSpec<F>* spec = static_cast<const OnCallSpec<F>*>(*it);
1484 if (spec->Matches(args))
1485 return spec;
1486 }
1487
1488 return NULL;
1489 }
1490
1491
1492
1493
1494
1495
1496
1497
1498 Result PerformDefaultAction(const ArgumentTuple& args,
1499 const string& call_description) const {
1500 const OnCallSpec<F>* const spec =
1501 this->FindOnCallSpec(args);
1502 if (spec != NULL) {
1503 return spec->GetAction().Perform(args);
1504 }
1505 const string message = call_description +
1506 "\n The mock function has no default action "
1507 "set, and its return type has no default value set.";
1508 #if GTEST_HAS_EXCEPTIONS
1509 if (!DefaultValue<Result>::Exists()) {
1510 throw std::runtime_error(message);
1511 }
1512 #else
1513 Assert(DefaultValue<Result>::Exists(), "", -1, message);
1514 #endif
1515 return DefaultValue<Result>::Get();
1516 }
1517
1518
1519
1520
1521
1522
1523 virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction(
1524 const void* untyped_args,
1525 const string& call_description) const {
1526 const ArgumentTuple& args =
1527 *static_cast<const ArgumentTuple*>(untyped_args);
1528 return ResultHolder::PerformDefaultAction(this, args, call_description);
1529 }
1530
1531
1532
1533
1534
1535 virtual UntypedActionResultHolderBase* UntypedPerformAction(
1536 const void* untyped_action, const void* untyped_args) const {
1537
1538
1539 const Action<F> action = *static_cast<const Action<F>*>(untyped_action);
1540 const ArgumentTuple& args =
1541 *static_cast<const ArgumentTuple*>(untyped_args);
1542 return ResultHolder::PerformAction(action, args);
1543 }
1544
1545
1546
1547 virtual void ClearDefaultActionsLocked()
1548 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
1549 g_gmock_mutex.AssertHeld();
1550
1551
1552
1553
1554
1555
1556
1557
1558 UntypedOnCallSpecs specs_to_delete;
1559 untyped_on_call_specs_.swap(specs_to_delete);
1560
1561 g_gmock_mutex.Unlock();
1562 for (UntypedOnCallSpecs::const_iterator it =
1563 specs_to_delete.begin();
1564 it != specs_to_delete.end(); ++it) {
1565 delete static_cast<const OnCallSpec<F>*>(*it);
1566 }
1567
1568
1569
1570 g_gmock_mutex.Lock();
1571 }
1572
1573 protected:
1574 template <typename Function>
1575 friend class MockSpec;
1576
1577 typedef ActionResultHolder<Result> ResultHolder;
1578
1579
1580
1581
1582 Result InvokeWith(const ArgumentTuple& args)
1583 GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
1584 scoped_ptr<ResultHolder> holder(
1585 DownCast_<ResultHolder*>(this->UntypedInvokeWith(&args)));
1586 return holder->Unwrap();
1587 }
1588
1589
1590 OnCallSpec<F>& AddNewOnCallSpec(
1591 const char* file, int line,
1592 const ArgumentMatcherTuple& m)
1593 GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
1594 Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);
1595 OnCallSpec<F>* const on_call_spec = new OnCallSpec<F>(file, line, m);
1596 untyped_on_call_specs_.push_back(on_call_spec);
1597 return *on_call_spec;
1598 }
1599
1600
1601 TypedExpectation<F>& AddNewExpectation(
1602 const char* file,
1603 int line,
1604 const string& source_text,
1605 const ArgumentMatcherTuple& m)
1606 GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
1607 Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);
1608 TypedExpectation<F>* const expectation =
1609 new TypedExpectation<F>(this, file, line, source_text, m);
1610 const linked_ptr<ExpectationBase> untyped_expectation(expectation);
1611 untyped_expectations_.push_back(untyped_expectation);
1612
1613
1614 Sequence* const implicit_sequence = g_gmock_implicit_sequence.get();
1615 if (implicit_sequence != NULL) {
1616 implicit_sequence->AddExpectation(Expectation(untyped_expectation));
1617 }
1618
1619 return *expectation;
1620 }
1621
1622
1623
1624 MockSpec<F>& current_spec() { return current_spec_; }
1625
1626 private:
1627 template <typename Func> friend class TypedExpectation;
1628
1629
1630
1631
1632
1633
1634 void DescribeDefaultActionTo(const ArgumentTuple& args,
1635 ::std::ostream* os) const {
1636 const OnCallSpec<F>* const spec = FindOnCallSpec(args);
1637
1638 if (spec == NULL) {
1639 *os << (internal::type_equals<Result, void>::value ?
1640 "returning directly.\n" :
1641 "returning default value.\n");
1642 } else {
1643 *os << "taking default action specified at:\n"
1644 << FormatFileLocation(spec->file(), spec->line()) << "\n";
1645 }
1646 }
1647
1648
1649
1650
1651 virtual void UntypedDescribeUninterestingCall(
1652 const void* untyped_args,
1653 ::std::ostream* os) const
1654 GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
1655 const ArgumentTuple& args =
1656 *static_cast<const ArgumentTuple*>(untyped_args);
1657 *os << "Uninteresting mock function call - ";
1658 DescribeDefaultActionTo(args, os);
1659 *os << " Function call: " << Name();
1660 UniversalPrint(args, os);
1661 }
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679 virtual const ExpectationBase* UntypedFindMatchingExpectation(
1680 const void* untyped_args,
1681 const void** untyped_action, bool* is_excessive,
1682 ::std::ostream* what, ::std::ostream* why)
1683 GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
1684 const ArgumentTuple& args =
1685 *static_cast<const ArgumentTuple*>(untyped_args);
1686 MutexLock l(&g_gmock_mutex);
1687 TypedExpectation<F>* exp = this->FindMatchingExpectationLocked(args);
1688 if (exp == NULL) {
1689 this->FormatUnexpectedCallMessageLocked(args, what, why);
1690 return NULL;
1691 }
1692
1693
1694
1695
1696 *is_excessive = exp->IsSaturated();
1697 const Action<F>* action = exp->GetActionForArguments(this, args, what, why);
1698 if (action != NULL && action->IsDoDefault())
1699 action = NULL;
1700 *untyped_action = action;
1701 return exp;
1702 }
1703
1704
1705 virtual void UntypedPrintArgs(const void* untyped_args,
1706 ::std::ostream* os) const {
1707 const ArgumentTuple& args =
1708 *static_cast<const ArgumentTuple*>(untyped_args);
1709 UniversalPrint(args, os);
1710 }
1711
1712
1713
1714 TypedExpectation<F>* FindMatchingExpectationLocked(
1715 const ArgumentTuple& args) const
1716 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
1717 g_gmock_mutex.AssertHeld();
1718 for (typename UntypedExpectations::const_reverse_iterator it =
1719 untyped_expectations_.rbegin();
1720 it != untyped_expectations_.rend(); ++it) {
1721 TypedExpectation<F>* const exp =
1722 static_cast<TypedExpectation<F>*>(it->get());
1723 if (exp->ShouldHandleArguments(args)) {
1724 return exp;
1725 }
1726 }
1727 return NULL;
1728 }
1729
1730
1731 void FormatUnexpectedCallMessageLocked(
1732 const ArgumentTuple& args,
1733 ::std::ostream* os,
1734 ::std::ostream* why) const
1735 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
1736 g_gmock_mutex.AssertHeld();
1737 *os << "\nUnexpected mock function call - ";
1738 DescribeDefaultActionTo(args, os);
1739 PrintTriedExpectationsLocked(args, why);
1740 }
1741
1742
1743
1744 void PrintTriedExpectationsLocked(
1745 const ArgumentTuple& args,
1746 ::std::ostream* why) const
1747 GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
1748 g_gmock_mutex.AssertHeld();
1749 const int count = static_cast<int>(untyped_expectations_.size());
1750 *why << "Google Mock tried the following " << count << " "
1751 << (count == 1 ? "expectation, but it didn't match" :
1752 "expectations, but none matched")
1753 << ":\n";
1754 for (int i = 0; i < count; i++) {
1755 TypedExpectation<F>* const expectation =
1756 static_cast<TypedExpectation<F>*>(untyped_expectations_[i].get());
1757 *why << "\n";
1758 expectation->DescribeLocationTo(why);
1759 if (count > 1) {
1760 *why << "tried expectation #" << i << ": ";
1761 }
1762 *why << expectation->source_text() << "...\n";
1763 expectation->ExplainMatchResultTo(args, why);
1764 expectation->DescribeCallCountTo(why);
1765 }
1766 }
1767
1768
1769
1770 MockSpec<F> current_spec_;
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784 GTEST_DISALLOW_COPY_AND_ASSIGN_(FunctionMockerBase);
1785 };
1786
1787 #ifdef _MSC_VER
1788 # pragma warning(pop)
1789 #endif
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799 void ReportUninterestingCall(CallReaction reaction, const string& msg);
1800
1801 }
1802
1803
1804
1805
1806
1807
1808 using internal::MockSpec;
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825 template <typename T>
1826 inline const T& Const(const T& x) { return x; }
1827
1828
1829 inline Expectation::Expectation(internal::ExpectationBase& exp)
1830 : expectation_base_(exp.GetHandle().expectation_base()) {}
1831
1832 }
1833
1834
1835
1836
1837
1838 #define GMOCK_ON_CALL_IMPL_(obj, call) \
1839 ((obj).gmock_##call).InternalDefaultActionSetAt(__FILE__, __LINE__, \
1840 #obj, #call)
1841 #define ON_CALL(obj, call) GMOCK_ON_CALL_IMPL_(obj, call)
1842
1843 #define GMOCK_EXPECT_CALL_IMPL_(obj, call) \
1844 ((obj).gmock_##call).InternalExpectedAt(__FILE__, __LINE__, #obj, #call)
1845 #define EXPECT_CALL(obj, call) GMOCK_EXPECT_CALL_IMPL_(obj, call)
1846
1847 #endif