Files
2026-08-13 16:50:52 +08:00

514 lines
16 KiB
C++

/*
* Copyright (c) 2007, Michael Feathers, James Grenning and Bas Vodde
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the <organization> nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE EARLIER MENTIONED AUTHORS ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "CppUTest/TestHarness.h"
#include "CppUTest/TestTestingFixture.h"
#include "MockFailureReporterForTest.h"
TEST_GROUP(MockCallTest)
{
void teardown() CPPUTEST_OVERRIDE
{
mock().checkExpectations();
mock().clear();
}
};
TEST(MockCallTest, clear)
{
mock().expectOneCall("func");
mock().clear();
CHECK(! mock().expectedCallsLeft());
}
TEST(MockCallTest, checkExpectationsDoesntFail)
{
mock().checkExpectations();
}
TEST(MockCallTest, expectASingleCallThatHappens)
{
mock().expectOneCall("func");
MockCheckedActualCall& actualCall = (MockCheckedActualCall&) mock().actualCall("func");
actualCall.checkExpectations();
CHECK(! mock().expectedCallsLeft());
}
TEST(MockCallTest, expectASingleCallThatDoesntHappen)
{
mock().expectOneCall("func");
CHECK(mock().expectedCallsLeft());
mock().clear();
}
TEST(MockCallTest, expectAMultiCallThatHappensTheExpectedTimes)
{
mock().expectNCalls(2, "func");
mock().actualCall("func");
MockCheckedActualCall& actualCall = (MockCheckedActualCall&) mock().actualCall("func");
actualCall.checkExpectations();
CHECK(! mock().expectedCallsLeft());
}
TEST(MockCallTest, expectAMultiCallThatDoesntHappenTheExpectedTimes)
{
mock().expectNCalls(2, "func");
MockCheckedActualCall& actualCall = (MockCheckedActualCall&) mock().actualCall("func");
actualCall.checkExpectations();
CHECK(mock().expectedCallsLeft());
mock().clear();
}
TEST(MockCallTest, checkExpectationsClearsTheExpectations)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
expectations.addFunction("foobar");
MockExpectedCallsDidntHappenFailure expectedFailure(mockFailureTest(), expectations);
mock().expectOneCall("foobar");
mock().checkExpectations();
CHECK(! mock().expectedCallsLeft());
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, expectOneCallInScopeButNotHappen)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
expectations.addFunction("scope::foobar");
MockExpectedCallsDidntHappenFailure expectedFailure(mockFailureTest(), expectations);
mock("scope").expectOneCall("foobar");
mock().checkExpectations();
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, unexpectedCallHappened)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest emptyExpectations;
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "func", emptyExpectations);
mock().actualCall("func");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, unexpectedScopeCallHappened)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest emptyExpectations;
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "scope::func", emptyExpectations);
mock("scope").actualCall("func");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, expectOneCallInOneScopeButActualCallInAnotherScope)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest emptyExpectations;
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "class::foo", emptyExpectations);
mock("scope").expectOneCall("foo");
mock("class").actualCall("foo");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
mock().clear();
}
TEST(MockCallTest, expectOneCallInScopeButActualCallInGlobal)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest emptyExpectations;
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "foo", emptyExpectations);
mock("scope").expectOneCall("foo");
mock().actualCall("foo");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
mock().clear();
}
TEST(MockCallTest, expectMultipleSingleCallsThatHappen)
{
mock().expectOneCall("foo");
mock().expectOneCall("foo");
mock().actualCall("foo");
mock().actualCall("foo");
mock().checkExpectations();
}
TEST(MockCallTest, expectOneCallHoweverMultipleHappened)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
expectations.addFunction("foo")->callWasMade(1);
expectations.addFunction("foo")->callWasMade(2);
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "foo", expectations);
mock().expectOneCall("foo");
mock().expectOneCall("foo");
mock().actualCall("foo");
mock().actualCall("foo");
mock().actualCall("foo");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, expectNoCallThatHappened)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
expectations.addFunction(0, "lazy");
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations);
mock().expectNoCall("lazy");
mock().actualCall("lazy");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, expectNoCallDoesntInfluenceExpectOneCall)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
expectations.addFunction(0, "lazy");
expectations.addFunction("influence")->callWasMade(1);
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations);
mock().expectNoCall("lazy");
mock().expectOneCall("influence");
mock().actualCall("influence");
mock().actualCall("lazy");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, expectNoCallOnlyFailureOnceWhenMultipleHappened)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
expectations.addFunction(0, "lazy");
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations);
mock().expectNoCall("lazy");
mock().actualCall("lazy");
mock().actualCall("lazy");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, ignoreOtherCallsExceptForTheUnExpectedOne)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
expectations.addFunction(0, "lazy");
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations);
mock().expectNoCall("lazy");
mock().ignoreOtherCalls();
mock().actualCall("bar").withParameter("foo", 1);
mock().actualCall("bar1").withParameter("foo", 1);
mock().actualCall("bar2").withParameter("foo", 1);
mock().actualCall("lazy");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, expectNoCallInScopeThatHappened)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
expectations.addFunction(0, "scope::lazy");
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "scope::lazy", expectations);
mock("scope").expectNoCall("lazy");
mock("scope").actualCall("lazy");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, expectNoCallInScopeButActualCallInAnotherScope)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "scope2::lazy", expectations);
mock("scope1").expectNoCall("lazy");
mock("scope2").actualCall("lazy");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, expectNoCallInScopeButActualCallInGlobal)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations);
mock("scope1").expectNoCall("lazy");
mock().actualCall("lazy");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, ignoreOtherCallsExceptForTheExpectedOne)
{
mock().expectOneCall("foo");
mock().ignoreOtherCalls();
mock().actualCall("bar").withParameter("foo", 1);
mock().clear();
}
TEST(MockCallTest, ignoreOtherCallsDoesntIgnoreMultipleCallsOfTheSameFunction)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
expectations.addFunction("foo")->callWasMade(1);
MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "foo", expectations);
mock().expectOneCall("foo");
mock().ignoreOtherCalls();
mock().actualCall("bar");
mock().actualCall("foo");
mock().actualCall("foo");
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, ignoreOtherStillFailsIfExpectedOneDidntHappen)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
expectations.addFunction("foo");
MockExpectedCallsDidntHappenFailure expectedFailure(mockFailureTest(), expectations);
mock().expectOneCall("foo");
mock().ignoreOtherCalls();
mock().checkExpectations();
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, threeExpectedAndActual)
{
mock().expectOneCall("function1");
mock().expectOneCall("function2");
mock().expectOneCall("function3");
mock().actualCall("function1");
mock().actualCall("function2");
mock().actualCall("function3");
mock().checkExpectations();
}
TEST(MockCallTest, disableEnable)
{
mock().disable();
mock().expectOneCall("function");
mock().actualCall("differenFunction");
CHECK(! mock().expectedCallsLeft());
mock().enable();
mock().expectOneCall("function");
CHECK(mock().expectedCallsLeft());
mock().actualCall("function");
mock().checkExpectations();
}
TEST(MockCallTest, OnObject)
{
void* objectPtr = (void*) 0x001;
mock().expectOneCall("boo").onObject(objectPtr);
mock().actualCall("boo").onObject(objectPtr);
}
TEST(MockCallTest, OnObjectIgnored_MatchingAlreadyWhenObjectPassed)
{
void* objectPtr = (void*) 0x001;
mock().expectOneCall("boo");
mock().actualCall("boo").onObject(objectPtr);
}
TEST(MockCallTest, OnObjectIgnored_NotMatchingYetWhenObjectPassed)
{
void* objectPtr = (void*) 0x001;
mock().expectOneCall("boo").withBoolParameter("p", true);
mock().actualCall("boo").onObject(objectPtr).withBoolParameter("p", true);
}
TEST(MockCallTest, OnObjectIgnored_InitialMatchDiscarded)
{
void* objectPtr1 = (void*) 0x001;
void* objectPtr2 = (void*) 0x002;
mock().expectOneCall("boo");
mock().expectOneCall("boo").withBoolParameter("p", true);
mock().actualCall("boo").onObject(objectPtr2).withBoolParameter("p", true);
mock().actualCall("boo").onObject(objectPtr1);
}
TEST(MockCallTest, OnObjectFails)
{
MockFailureReporterInstaller failureReporterInstaller;
void* objectPtr = (void*) 0x001;
void* objectPtr2 = (void*) 0x002;
MockExpectedCallsListForTest expectations;
expectations.addFunction("boo")->onObject(objectPtr);
mock().expectOneCall("boo").onObject(objectPtr);
mock().actualCall("boo").onObject(objectPtr2);
MockUnexpectedObjectFailure expectedFailure(mockFailureTest(), "boo", objectPtr2, expectations);
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, OnObjectExpectedButNotCalled)
{
MockFailureReporterInstaller failureReporterInstaller;
void* objectPtr = (void*) 0x001;
MockExpectedCallsListForTest expectations;
expectations.addFunction("boo")->onObject(objectPtr);
expectations.addFunction("boo")->onObject(objectPtr);
mock().expectOneCall("boo").onObject(objectPtr);
mock().expectOneCall("boo").onObject(objectPtr);
mock().actualCall("boo");
mock().actualCall("boo");
MockExpectedObjectDidntHappenFailure expectedFailure(mockFailureTest(), "boo", expectations);
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
mock().checkExpectations();
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, expectNCalls_Fulfilled)
{
mock().expectNCalls(2, "boo");
mock().actualCall("boo");
mock().actualCall("boo");
mock().checkExpectations();
}
TEST(MockCallTest, expectNCalls_NotFulfilled)
{
MockFailureReporterInstaller failureReporterInstaller;
MockExpectedCallsListForTest expectations;
expectations.addFunction(2, "boo")->callWasMade(1);
MockExpectedCallsDidntHappenFailure expectedFailure(mockFailureTest(), expectations);
mock().expectNCalls(2, "boo");
mock().actualCall("boo");
mock().checkExpectations();
CHECK_EXPECTED_MOCK_FAILURE(expectedFailure);
}
TEST(MockCallTest, shouldntFailTwice)
{
MockFailureReporterInstaller failureReporterInstaller;
mock().strictOrder();
mock().expectOneCall("foo");
mock().expectOneCall("boo");
mock().actualCall("boo");
mock().actualCall("bar");
mock().checkExpectations();
CHECK(!MockFailureReporterForTest::getReporter()->mockFailureString.contains("bar"));
CHECK(MockFailureReporterForTest::getReporter()->mockFailureString.contains("boo"));
}
TEST(MockCallTest, shouldReturnDefaultWhenThereIsntAnythingToReturn)
{
CHECK(mock().returnValue().equals(MockNamedValue("")));
}
IGNORE_TEST(MockCallTest, testForPerformanceProfiling)
{
/* TO fix! */
mock().expectNCalls(2000, "SimpleFunction");
for (int i = 0; i < 2000; i++) {
mock().actualCall("SimpleFunction");
}
}
static void mocksAreCountedAsChecksTestFunction_()
{
mock().expectOneCall("foo");
mock().expectNCalls(3, "bar");
mock().expectNoCall("lazy");
mock().clear();
}
TEST(MockCallTest, mockExpectationShouldIncreaseNumberOfChecks)
{
TestTestingFixture fixture;
fixture.setTestFunction(mocksAreCountedAsChecksTestFunction_);
fixture.runAllTests();
LONGS_EQUAL(3, fixture.getCheckCount());
}
TEST(MockCallTest, expectationsLeftBeforCheckExpectations)
{
CHECK(!mock().expectedCallsLeft());
mock().expectOneCall("boo");
CHECK(mock().expectedCallsLeft());
mock().actualCall("boo");
CHECK(!mock().expectedCallsLeft());
mock().checkExpectations();
CHECK(!mock().expectedCallsLeft());
}