/* * Copyright (c) 2014 Eran Pe'er. * * This program is made available under the terms of the MIT License. * * Created on Mar 10, 2014 */ #include #include #include #include #include "tpunit++.hpp" #include "fakeit.hpp" #include "mockutils/Formatter.hpp" using namespace fakeit; struct A { int state; A() : state(0) { } bool operator==(const A& other) const { return other.state == state; } }; namespace fakeit { template<> struct Formatter { static std::string format(const A&) { return {"a"}; } }; } struct BasicVerification: tpunit::TestFixture { BasicVerification() : tpunit::TestFixture( // TEST(BasicVerification::verificationProgressShouldBeConvertibleToBool), // TEST(BasicVerification::verifyWithUnverifiedFunctor), // TEST(BasicVerification::verifyWithUnverifiedFunctorWithUsing), // TEST(BasicVerification::verify_with_matcher), // TEST(BasicVerification::verify_should_not_throw_exception_if_method_was_called), // TEST(BasicVerification::verify_should_throw_VerificationException_if_method_was_not_called), // TEST(BasicVerification::verify_should_throw_VerificationException_if_method_was_not_stubbed), // TEST(BasicVerification::verify_method_was_called_at_least_once), // TEST(BasicVerification::verify_method_was_called_at_least_twice), // TEST(BasicVerification::verify_method_was_called_at_least_X_with_quantifier), // TEST(BasicVerification::verify_method_was_called_exactly_once), // TEST(BasicVerification::verify_method_was_never_called), // TEST(BasicVerification::verify_method_was_called_exactly_x_times), // TEST(BasicVerification::verify_method_was_called_exactly_x_times_with_quantifier), // TEST(BasicVerification::should_throw_IllegalArgumentException_on_negative_times_argument), // TEST(BasicVerification::verify_with_filter), // TEST(BasicVerification::verify_no_other_invocations_for_mock), // TEST(BasicVerification::verify_no_other_invocations_for_method_filter), // TEST(BasicVerification::exception_while_verifying_no_more_interactions_should_cancel_verification), // TEST(BasicVerification::exception_while_verifying_should_cancel_verification), // TEST(BasicVerification::use_same_filter_for_both_stubbing_and_verification), // TEST(BasicVerification::verify_after_paramter_was_changed__with_Matching), // TEST(BasicVerification::verify_after_paramter_was_changed_with_argument_matcher), // TEST(BasicVerification::verify_after_paramter_was_changed_with_Using)) // { } struct SomeInterface { virtual int func(int) = 0; virtual void proc(int) = 0; virtual void proc2(const A&) = 0; virtual void proc3(const A*) = 0; }; void verify_with_matcher() { Mock mock; When(Method(mock, func).Matching([](...)->bool{return true;})).Return(0); SomeInterface &i = mock.get(); i.func(1); ASSERT_THROW(Verify(Method(mock, func).Matching([](...)->bool{return true;}) * 2), fakeit::VerificationException); } void verify_should_throw_VerificationException_if_method_was_not_called() { Mock mock; Fake(Method(mock,func), Method(mock,proc)); ASSERT_THROW(Verify(Method(mock,func)), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)), fakeit::VerificationException); } void verify_should_throw_VerificationException_if_method_was_not_stubbed() { Mock mock; ASSERT_THROW(Verify(Method(mock,func)), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)), fakeit::VerificationException); } void verify_should_not_throw_exception_if_method_was_called() { Mock mock; Fake(Method(mock,func), Method(mock,proc)); SomeInterface &i = mock.get(); i.func(1); i.proc(1); Verify(Method(mock,func)); Verify(Method(mock,proc)); } void verify_method_was_called_at_least_once() { Mock mock; ASSERT_THROW(Verify(Method(mock,func)), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)), fakeit::VerificationException); Fake(Method(mock,func), Method(mock,proc)); SomeInterface &i = mock.get(); i.func(1); i.proc(2); Verify(Method(mock,func)); Verify(Method(mock,proc)); i.func(1); i.proc(2); Verify(Method(mock,func)); Verify(Method(mock,proc)); } void verify_method_was_called_at_least_twice() { Mock mock; ASSERT_THROW(Verify(Method(mock,func)).AtLeast(2), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).AtLeast(2), fakeit::VerificationException); Fake(Method(mock,func), Method(mock,proc)); SomeInterface &i = mock.get(); i.func(1); i.proc(2); ASSERT_THROW(Verify(Method(mock,func)).AtLeast(2), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).AtLeast(2), fakeit::VerificationException); i.func(1); i.proc(2); Verify(Method(mock,func)).AtLeast(2); Verify(Method(mock,proc)).AtLeast(2); i.func(1); i.proc(2); Verify(Method(mock,func)).AtLeast(2); Verify(Method(mock,proc)).AtLeast(2); } void verify_method_was_called_at_least_X_with_quantifier() { Mock mock; #if defined (__GNUG__) || (_MSC_VER >= 1900) ASSERT_THROW(Verify(Method(mock,func)).AtLeast(2_Times), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).AtLeast(2_Times), fakeit::VerificationException); #endif Fake(Method(mock,func), Method(mock,proc)); SomeInterface &i = mock.get(); i.func(1); i.proc(2); #if defined (__GNUG__) || (_MSC_VER >= 1900) ASSERT_THROW(Verify(Method(mock,func)).AtLeast(2_Times), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).AtLeast(2), fakeit::VerificationException); #endif ASSERT_THROW(Verify(Method(mock,func)).AtLeast(Times<2>()), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).AtLeast(Times<2>()), fakeit::VerificationException); i.func(1); i.proc(2); #if defined (__GNUG__) || (_MSC_VER >= 1900) Verify(Method(mock,func)).AtLeast(2_Times); Verify(Method(mock,proc)).AtLeast(2_Times); #endif Verify(Method(mock,func)).AtLeast(Times<2>()); Verify(Method(mock,proc)).AtLeast(Times<2>()); i.func(1); i.proc(2); #if defined (__GNUG__) || (_MSC_VER >= 1900) Verify(Method(mock,func)).AtLeast(2_Times); Verify(Method(mock,proc)).AtLeast(2_Times); #endif Verify(Method(mock,func)).AtLeast(Times<2>()); Verify(Method(mock,proc)).AtLeast(Times<2>()); } void verify_method_was_called_exactly_once() { Mock mock; ASSERT_THROW(Verify(Method(mock,func)).Once(), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).Once(), fakeit::VerificationException); Fake(Method(mock,func), Method(mock,proc)); SomeInterface &i = mock.get(); ASSERT_THROW(Verify(Method(mock,func)).Once(), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).Once(), fakeit::VerificationException); i.func(1); i.proc(1); Verify(Method(mock,func)).Once(); Verify(Method(mock,proc)).Once(); i.func(1); i.proc(1); ASSERT_THROW(Verify(Method(mock,func)).Once(), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).Once(), fakeit::VerificationException); } void verify_method_was_never_called() { Mock mock; Verify(Method(mock,func)).Never(); Verify(Method(mock,proc)).Never(); Fake(Method(mock,func), Method(mock,proc)); SomeInterface &i = mock.get(); Verify(Method(mock,func)).Never(); Verify(Method(mock,proc)).Never(); i.func(1); i.proc(1); ASSERT_THROW(Verify(Method(mock,func)).Never(), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).Never(), fakeit::VerificationException); } void verify_method_was_called_exactly_x_times_with_quantifier() { Mock mock; Fake(Method(mock,func), Method(mock,proc)); #if defined (__GNUG__) || (_MSC_VER >= 1900) // Only supported by GCC ASSERT_THROW(Verify(Method(mock,func)).Exactly(2_Time), std::invalid_argument); ASSERT_THROW(Verify(Method(mock,func)).Exactly(1_Time), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).Exactly(1_Time), fakeit::VerificationException); #endif ASSERT_THROW(Verify(Method(mock,func)).Exactly(Times<1>()), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).Exactly(Times<1>()), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).Exactly(Once), fakeit::VerificationException); SomeInterface &i = mock.get(); i.func(1); i.proc(1); #if defined (__GNUG__) || (_MSC_VER >= 1900) Verify(Method(mock,func)).Exactly(1_Time); Verify(Method(mock,proc)).Exactly(1_Time); #endif Verify(Method(mock,func)).Exactly(Times<1>()); Verify(Method(mock,proc)).Exactly(Times<1>()); Verify(Method(mock,proc)).Exactly(Once); i.func(1); i.proc(1); #if defined (__GNUG__) || (_MSC_VER >= 1900) Verify(Method(mock,func)).Exactly(2_Times); Verify(Method(mock,proc)).Exactly(2_Times); #endif Verify(Method(mock,func)).Exactly(Times<2>()); Verify(Method(mock,proc)).Exactly(Times<2>()); } void verify_method_was_called_exactly_x_times() { Mock mock; ASSERT_THROW(Verify(Method(mock,func)).Exactly(2), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).Exactly(2), fakeit::VerificationException); Fake(Method(mock,func), Method(mock,proc)); SomeInterface &i = mock.get(); ASSERT_THROW(Verify(Method(mock,func)).Exactly(2), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).Exactly(2), fakeit::VerificationException); i.func(1); i.func(1); i.proc(1); i.proc(1); Verify(Method(mock,func)).Exactly(2); Verify(Method(mock,proc)).Exactly(2); i.func(1); i.proc(1); ASSERT_THROW(Verify(Method(mock,func)).Exactly(2), fakeit::VerificationException); ASSERT_THROW(Verify(Method(mock,proc)).Exactly(2), fakeit::VerificationException); } void should_throw_IllegalArgumentException_on_negative_times_argument() { Mock mock; ASSERT_THROW(Verify(Method(mock,func)).Exactly(-1), std::invalid_argument); ASSERT_THROW(Verify(Method(mock,proc)).Exactly(-1), std::invalid_argument); ASSERT_THROW(Verify(Method(mock,proc)).AtLeast(-1), std::invalid_argument); } void verify_with_filter() { Mock mock; Fake(Method(mock,func), Method(mock,proc)); SomeInterface &i = mock.get(); i.func(1); Verify(Method(mock,func).Using(1)); ASSERT_THROW(Verify(Method(mock,func).Using(2)), fakeit::VerificationException); } void verify_no_other_invocations_for_mock() { Mock mock; Fake(Method(mock,func), Method(mock,proc2)); SomeInterface &i = mock.get(); VerifyNoOtherInvocations(mock); i.func(1); i.func(1); ASSERT_THROW(VerifyNoOtherInvocations(mock), fakeit::VerificationException); Verify(Method(mock,func)).AtLeastOnce(); VerifyNoOtherInvocations(mock); i.func(1); i.func(1); ASSERT_THROW(VerifyNoOtherInvocations(mock), fakeit::VerificationException); Verify(Method(mock,func) * 3); ASSERT_THROW(VerifyNoOtherInvocations(mock), fakeit::VerificationException); Verify(Method(mock,func) * 4); VerifyNoOtherInvocations(mock); } void verify_no_other_invocations_for_method_filter() { Mock mock; Fake(Method(mock,func), Method(mock,proc2)); SomeInterface &i = mock.get(); VerifyNoOtherInvocations(Method(mock,func)); i.func(1); i.func(1); ASSERT_THROW(VerifyNoOtherInvocations(Method(mock,func), Method(mock,proc2)), fakeit::VerificationException); Verify(Method(mock,func)).AtLeastOnce(); VerifyNoOtherInvocations(Method(mock,func)); i.func(1); i.func(1); ASSERT_THROW(VerifyNoOtherInvocations(Method(mock,func)), fakeit::VerificationException); Verify(Method(mock,func) * 3); ASSERT_THROW(VerifyNoOtherInvocations(Method(mock,func)), fakeit::VerificationException); Verify(Method(mock,func) * 4); VerifyNoOtherInvocations(Method(mock,func).Using(1)); } void exception_while_verifying_no_more_interactions_should_cancel_verification() { Mock mock; Fake(Method(mock,func)); mock.get().func(1); { try { const auto a = VerifyNoOtherInvocations(Method(mock,func)); if (&a == &a) // use a to avoid unused variable compilation warning. throw std::runtime_error("some exception"); } catch (std::runtime_error &) { } } } void exception_while_verifying_should_cancel_verification() { Mock mock; Fake(Method(mock,func)); { try { const auto a = Verify(Method(mock,func)); //const auto b = Verify(Method(mock, func)).Exactly(1); if (&a == &a) // use a to avoid unused variable compilation warning. throw std::runtime_error("some exception"); } catch (std::runtime_error &) { } } } void use_same_filter_for_both_stubbing_and_verification() { Mock mock; auto any_func_invocation = Method(mock,func); auto any_proc_invocation = Method(mock,proc); When(any_func_invocation).AlwaysReturn(1); When(any_proc_invocation).AlwaysReturn(); SomeInterface &i = mock.get(); i.func(1); i.func(1); i.proc(1); i.proc(1); Verify(any_func_invocation); Verify(any_proc_invocation); Verify(2 * any_func_invocation); Verify(2 * any_proc_invocation); Verify(2 * any_func_invocation + 2 * any_proc_invocation); } void verify_after_paramter_was_changed__with_Matching() { Mock mock; auto any_A_with_state_1 = Method(mock,proc2).Matching([](const A& a)->bool { return a.state == 1; }); Fake(any_A_with_state_1); SomeInterface &i = mock.get(); { A a; a.state = 1; i.proc2(a); i.proc2(a); a.state = 2; } Verify(2 * any_A_with_state_1); } void verify_after_paramter_was_changed_with_Using() { Mock mock; A a1; a1.state = 1; auto call_to_proc2_with_state_1 = Method(mock,proc2).Using(a1); Fake(call_to_proc2_with_state_1); SomeInterface &i = mock.get(); A a2; a2.state = 1; i.proc2(a2); i.proc2(a2); a2.state = 2; Verify(2 * call_to_proc2_with_state_1); } void verify_after_paramter_was_changed_with_argument_matcher() { Mock mock; A a1; a1.state = 1; auto call_to_proc2_with_state_1 = Method(mock,proc2).Using(Eq(a1)); Fake(call_to_proc2_with_state_1); SomeInterface &i = mock.get(); A a2; a2.state = 1; i.proc2(a2); i.proc2(a2); a2.state = 2; Verify(2 * call_to_proc2_with_state_1); } void verifyWithUnverifiedFunctor(){ struct AnInterface { virtual int func(int) = 0; }; Mock mock; When(Method(mock, func)).AlwaysReturn(0); AnInterface& obj = mock.get(); obj.func(1); Unverified.Verify(Method(mock, func)).Once(); ASSERT_THROW(Unverified.Verify(Method(mock, func)).Once(), fakeit::VerificationException); obj.func(1); obj.func(1); Verify(Method(mock, func) * 3); ASSERT_THROW(Unverified.Verify(Method(mock, func)), fakeit::VerificationException); obj.func(1); obj.func(1); Verify(Method(mock, func)); ASSERT_THROW(Unverified.Verify(Method(mock, func)), fakeit::VerificationException); } void verifyWithUnverifiedFunctorWithUsing() { struct AnInterface { virtual int func(int) = 0; }; Mock mock; When(Method(mock, func)).AlwaysReturn(0); AnInterface &obj = mock.get(); obj.func(1); Using(Unverified(mock)).Verify(Method(mock, func)).Once(); ASSERT_THROW(Using(Unverified(mock)).Verify(Method(mock, func)).Once(), fakeit::VerificationException); } void verificationProgressShouldBeConvertibleToBool(){ struct AnInterface { virtual int func(int) = 0; }; Mock mock; When(Method(mock, func)).AlwaysReturn(0); AnInterface &obj = mock.get(); obj.func(1); ASSERT_FALSE(VerifyNoOtherInvocations(Method(mock, func))); ASSERT_TRUE(Verify(Method(mock, func))); ASSERT_TRUE(Verify(Method(mock, func).Using(1))); ASSERT_FALSE(Verify(Method(mock, func).Using(2))); ASSERT_TRUE(Verify(Method(mock, func).Using(1)).AtLeast(1)); ASSERT_TRUE(Verify(Method(mock, func).Using(1)).AtLeastOnce()); ASSERT_TRUE(Verify(Method(mock, func).Using(1)).Exactly(1)); ASSERT_TRUE(Verify(Method(mock, func).Using(1)).Once()); ASSERT_FALSE(Verify(Method(mock, func).Using(1)).Twice()); ASSERT_FALSE(Verify(Method(mock, func).Using(1)).Never()); ASSERT_TRUE(VerifyNoOtherInvocations(Method(mock, func))); ASSERT_FALSE(!Verify(Method(mock, func))); ASSERT_FALSE(!Verify(Method(mock, func).Using(1))); ASSERT_TRUE(!Verify(Method(mock, func).Using(2))); ASSERT_FALSE(!Verify(Method(mock, func).Using(1)).AtLeast(1)); ASSERT_FALSE(!Verify(Method(mock, func).Using(1)).AtLeastOnce()); ASSERT_FALSE(!Verify(Method(mock, func).Using(1)).Exactly(1)); ASSERT_FALSE(!Verify(Method(mock, func).Using(1)).Once()); ASSERT_TRUE(!Verify(Method(mock, func).Using(1)).Twice()); ASSERT_TRUE(!Verify(Method(mock, func).Using(1)).Never()); ASSERT_FALSE(!VerifyNoOtherInvocations(Method(mock, func))); } } __BasicVerification;