testtools/micromock/unittests/micromocktest/timediscretemicromockwithreturnandparameters.cpp (104 lines of code) (raw):

// Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. #include "stdafx.h" int c(int a, int b); int d(int a, int b); #ifdef _MSC_VER TD_MOCK_CLASS(MyMocks2) { public: MOCK_STATIC_TD_METHOD_2(, int, c, int, a, int, b) MOCK_METHOD_END(int, 42) MOCK_STATIC_TD_METHOD_2(, int, d, int, a, int, b) MOCK_METHOD_END(int, 43) }; DECLARE_GLOBAL_MOCK_METHOD_2(MyMocks2, , int, c, int, a, int, b) DECLARE_GLOBAL_MOCK_METHOD_2(MyMocks2, , int, d, int, a, int, b) static int iCall=0; static void theTask(void) { if(iCall==1) { c(2,3); } if(iCall==10) { d(1,1); c(1,1); c(1,1); } iCall++; } static HANDLE g_hMutex=NULL; #endif BEGIN_TEST_SUITE(MicroMockTestWithReturnAndParameters) #ifdef _MSC_VER TEST_SUITE_INITIALIZE(a) { g_hMutex = CreateMutex(NULL, FALSE, _T("onlyOneTestAtATime")); ASSERT_ARE_NOT_EQUAL_WITH_MSG(void*, (HANDLE)NULL, g_hMutex, _T("Failed to create mutex for test by test")); } TEST_SUITE_CLEANUP(b) { (void)CloseHandle(g_hMutex); } /*missing lock doesn't work with CppUnitTests TEST_FUNCTION_CLEANUP/ TEST_FUNCTION_INITIALIZE*/ #pragma warning(disable: 26135) TEST_FUNCTION_INITIALIZE(c) { if (WAIT_OBJECT_0 != WaitForSingleObject(g_hMutex, INFINITE)) { ASSERT_FAIL(_T("Failed acquiring mutex for test by test.")); } iCall = 0; } TEST_FUNCTION_CLEANUP(d) { if (ReleaseMutex(g_hMutex) == 0) { ASSERT_FAIL(_T("failure in test framework at ReleaseMutex")); } } TEST_FUNCTION(DiscreteMicroMockWithReturnAndParameters_ThereIsNothingCalledAtTimeZero) { // arrange MyMocks2 mocks(theTask); // act mocks.RunUntilTick(0); // assert } TEST_FUNCTION(DiscreteMicroMockWithReturnAndParameters_c_isCalledAtTimeOne) { // arrange MyMocks2 mocks(theTask); STRICT_EXPECTED_CALL_AT(mocks, 1, c(2,3)); // act mocks.RunUntilTick(1); // assert } TEST_FUNCTION(DiscreteMicroMockWithReturnAndParameters_c_isNotCalledAtTimeTwo) { // arrange MyMocks2 mocks(theTask); STRICT_EXPECTED_CALL_AT(mocks, 1, c(2,3)); // act mocks.RunUntilTick(2); // assert } TEST_FUNCTION(DiscreteMicroMockWithReturnAndParameters_InTheSameTickOrderOfCallsIsDisregarded_1) { ///arrange MyMocks2 mocks(theTask); STRICT_EXPECTED_CALL_AT(mocks, 1, c(2,3)); STRICT_EXPECTED_CALL_AT(mocks, 10, c(1,1)); STRICT_EXPECTED_CALL_AT(mocks, 10, c(1,1)); STRICT_EXPECTED_CALL_AT(mocks, 10, d(1,1)); ///act mocks.RunUntilTick(20); ///assert - left to uM_TD } TEST_FUNCTION(DiscreteMicroMockWithReturnAndParameters_InTheSameTickOrderOfCallsIsDisregarded_2) { ///arrange MyMocks2 mocks(theTask); STRICT_EXPECTED_CALL_AT(mocks, 1, c(2,3)); STRICT_EXPECTED_CALL_AT(mocks, 10, d(1,1)); STRICT_EXPECTED_CALL_AT(mocks, 10, c(1,1)); STRICT_EXPECTED_CALL_AT(mocks, 10, c(1,1)); ///act mocks.RunUntilTick(20); ///assert - left to uM_TD } TEST_FUNCTION(DiscreteMicroMockWithReturnAndParameters_WithoutStrictExpectedCallOnlyValidatesTheCall) { ///arrange MyMocks2 mocks(theTask); EXPECTED_CALL_AT(mocks, 1, c(72,73)); EXPECTED_CALL_AT(mocks, 10, d(1234,14324)); EXPECTED_CALL_AT(mocks, 10, c(1236,1234)); EXPECTED_CALL_AT(mocks, 10, c(1235,61)); ///act mocks.RunUntilTick(20); ///assert - left to uM_TD } #endif END_TEST_SUITE(MicroMockTestWithReturnAndParameters)