From ff09247968c308349f457d3170f28081ac5b5723 Mon Sep 17 00:00:00 2001 From: Arno Moonen Date: Thu, 19 May 2016 21:01:20 +0200 Subject: [PATCH 0001/1093] File and line attribute added to testcase element in JUnit output. Initial work for cpputest/cpputest#967. Might also be interesting for cpputest/cpputest#903. --- src/CppUTest/JUnitTestOutput.cpp | 11 +++- tests/JUnitOutputTest.cpp | 94 ++++++++++++++++---------------- 2 files changed, 57 insertions(+), 48 deletions(-) diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index 929f9dd8f..e6f4d77e3 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -42,6 +42,8 @@ struct JUnitTestCaseResultNode long execTime_; TestFailure* failure_; bool ignored_; + SimpleString file_; + int lineNumber_; JUnitTestCaseResultNode* next_; }; @@ -136,6 +138,8 @@ void JUnitTestOutput::printCurrentTestStarted(const UtestShell& test) impl_->results_.tail_ = impl_->results_.tail_->next_; } impl_->results_.tail_->name_ = test.getName(); + impl_->results_.tail_->file_ = test.getFile(); + impl_->results_.tail_->lineNumber_ = test.getLineNumber(); if (!test.willRun()) { impl_->results_.tail_->ignored_ = true; } @@ -187,11 +191,14 @@ void JUnitTestOutput::writeTestCases() JUnitTestCaseResultNode* cur = impl_->results_.head_; while (cur) { SimpleString buf = StringFromFormat( - "\n", + "\n", impl_->package_.asCharString(), impl_->package_.isEmpty() == true ? "" : ".", impl_->results_.group_.asCharString(), - cur->name_.asCharString(), (int) (cur->execTime_ / 1000), (int)(cur->execTime_ % 1000)); + cur->name_.asCharString(), + (int) (cur->execTime_ / 1000), (int)(cur->execTime_ % 1000), + cur->file_.asCharString(), + cur->lineNumber_); writeToFile(buf.asCharString()); if (cur->failure_) { diff --git a/tests/JUnitOutputTest.cpp b/tests/JUnitOutputTest.cpp index 159253799..f7a9c0508 100644 --- a/tests/JUnitOutputTest.cpp +++ b/tests/JUnitOutputTest.cpp @@ -205,21 +205,21 @@ class JUnitTestOutputTestRunner return *this; } - JUnitTestOutputTestRunner& withTest(const char* testName) + JUnitTestOutputTestRunner &withTest(const char *testName, const char *fileName, int lineNumber) { runPreviousTest(); delete currentTest_; - currentTest_ = new UtestShell(currentGroupName_, testName, "file", 1); + currentTest_ = new UtestShell(currentGroupName_, testName, fileName, lineNumber); return *this; } - JUnitTestOutputTestRunner& withIgnoredTest(const char* testName) + JUnitTestOutputTestRunner &withIgnoredTest(const char *testName, const char *fileName, int lineNumber) { runPreviousTest(); delete currentTest_; - currentTest_ = new IgnoredUtestShell(currentGroupName_, testName, "file", 1); + currentTest_ = new IgnoredUtestShell(currentGroupName_, testName, fileName, lineNumber); return *this; } @@ -316,7 +316,7 @@ TEST_GROUP(JUnitOutputTest) TEST(JUnitOutputTest, withOneTestGroupAndOneTestOnlyWriteToOneFile) { testCaseRunner->start() - .withGroup("groupname").withTest("testname") + .withGroup("groupname").withTest("testname", "sourcefile.c", 123) .end(); LONGS_EQUAL(1, fileSystem.amountOfFiles()); @@ -326,17 +326,17 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestOnlyWriteToOneFile) TEST(JUnitOutputTest, withOneTestGroupAndOneTestOutputsValidXMLFiles) { testCaseRunner->start() - .withGroup("groupname").withTest("testname") + .withGroup("groupname").withTest("testname", "sourcefile.c", 123) .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); STRCMP_EQUAL("\n", outputFile->line(1)); } -TEST(JUnitOutputTest, withOneTestGroupAndOneTestoutputsTestSuiteStartAndEndBlocks) +TEST(JUnitOutputTest, withOneTestGroupAndOneTestOutputsTestSuiteStartAndEndBlocks) { testCaseRunner->start() - .withGroup("groupname").withTest("testname") + .withGroup("groupname").withTest("testname", "sourcefile.c", 123) .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); @@ -347,7 +347,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestoutputsTestSuiteStartAndEndBlock TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyPropertiesBlock) { testCaseRunner->start() - .withGroup("groupname").withTest("testname") + .withGroup("groupname").withTest("testname", "sourcefile.c", 123) .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); @@ -358,7 +358,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyProperti TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyStdoutBlock) { testCaseRunner->start() - .withGroup("groupname").withTest("testname") + .withGroup("groupname").withTest("testname", "sourcefile.c", 123) .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); @@ -368,7 +368,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyStdoutBl TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyStderrBlock) { testCaseRunner->start() - .withGroup("groupname").withTest("testname") + .withGroup("groupname").withTest("testname", "sourcefile.c", 123) .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); @@ -378,34 +378,36 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyStderrBl TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainsATestCaseBlock) { testCaseRunner->start() - .withGroup("groupname").withTest("testname") + .withGroup("groupname").withTest("testname", "sourcefile.c", 12) .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); } TEST(JUnitOutputTest, withOneTestGroupAndTwoTestCasesCreateCorrectTestgroupBlockAndCorrectTestCaseBlock) { testCaseRunner->start() - .withGroup("twoTestsGroup").withTest("firstTestName").withTest("secondTestName") + .withGroup("twoTestsGroup") + .withTest("firstTestName", "source1.c", 123) + .withTest("secondTestName", "source2.c", 234) .end(); outputFile = fileSystem.file("cpputest_twoTestsGroup.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); - STRCMP_EQUAL("\n", outputFile->line(7)); + STRCMP_EQUAL("\n", outputFile->line(7)); STRCMP_EQUAL("\n", outputFile->line(8)); } TEST(JUnitOutputTest, withOneTestGroupAndTimeHasElapsedAndTimestampChanged) { testCaseRunner->start().atTime("2013-07-04T22:28:00") - .withGroup("timeGroup").withTest("Dummy").thatTakes(10).seconds() + .withGroup("timeGroup").withTest("Dummy", "sourcefile.c", 123).thatTakes(10).seconds() .end(); outputFile = fileSystem.file("cpputest_timeGroup.xml"); @@ -417,15 +419,15 @@ TEST(JUnitOutputTest, withOneTestGroupAndMultipleTestCasesWithElapsedTime) { testCaseRunner->start() .withGroup("twoTestsGroup") - .withTest("firstTestName").thatTakes(10).seconds() - .withTest("secondTestName").thatTakes(50).seconds() + .withTest("firstTestName", "source1.c", 123).thatTakes(10).seconds() + .withTest("secondTestName", "source2.c", 234).thatTakes(50).seconds() .end(); outputFile = fileSystem.file("cpputest_twoTestsGroup.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); - STRCMP_EQUAL("\n", outputFile->line(7)); + STRCMP_EQUAL("\n", outputFile->line(7)); STRCMP_EQUAL("\n", outputFile->line(8)); } @@ -433,12 +435,12 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneFailingTest) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FailingTestName").thatFails("Test failed", "thisfile", 10) + .withTest("FailingTestName", "sourcefile.c", 123).thatFails("Test failed", "thisfile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); STRCMP_EQUAL("\n", outputFile->line(7)); STRCMP_EQUAL("\n", outputFile->line(8)); @@ -448,14 +450,14 @@ TEST(JUnitOutputTest, withTwoTestGroupAndOneFailingTest) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FirstTest") - .withTest("FailingTestName").thatFails("Test failed", "thisfile", 10) + .withTest("FirstTest", "sourcefile.c", 123) + .withTest("FailingTestName", "sourcefile.c", 123).thatFails("Test failed", "thisfile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("\n", outputFile->line(7)); + STRCMP_EQUAL("\n", outputFile->line(7)); STRCMP_EQUAL("\n", outputFile->line(8)); } @@ -463,7 +465,7 @@ TEST(JUnitOutputTest, testFailureWithLessThanAndGreaterThanInsideIt) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FailingTestName").thatFails("Test ", "thisfile", 10) + .withTest("FailingTestName", "sourcefile.c", 123).thatFails("Test ", "thisfile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); @@ -475,7 +477,7 @@ TEST(JUnitOutputTest, testFailureWithQuotesInIt) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FailingTestName").thatFails("Test \"failed\"", "thisfile", 10) + .withTest("FailingTestName", "sourcefile.c", 123).thatFails("Test \"failed\"", "thisfile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); @@ -487,7 +489,7 @@ TEST(JUnitOutputTest, testFailureWithNewlineInIt) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FailingTestName").thatFails("Test \nfailed", "thisfile", 10) + .withTest("FailingTestName", "sourcefile.c", 123).thatFails("Test \nfailed", "thisfile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); @@ -499,7 +501,7 @@ TEST(JUnitOutputTest, testFailureWithDifferentFileAndLine) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FailingTestName").thatFails("Test failed", "importantFile", 999) + .withTest("FailingTestName", "sourcefile.c", 123).thatFails("Test failed", "importantFile", 999) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); @@ -511,7 +513,7 @@ TEST(JUnitOutputTest, testFailureWithAmpersands) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FailingTestName").thatFails("&object1 != &object2", "importantFile", 999) + .withTest("FailingTestName", "sourcefile.c", 123).thatFails("&object1 != &object2", "importantFile", 999) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); @@ -523,11 +525,11 @@ TEST(JUnitOutputTest, aCoupleOfTestFailures) { testCaseRunner->start() .withGroup("testGroup") - .withTest("passingOne") - .withTest("FailingTest").thatFails("Failure", "file", 99) - .withTest("passingTwo") - .withTest("passingThree") - .withTest("AnotherFailingTest").thatFails("otherFailure", "anotherFile", 10) + .withTest("passingOne", "sourcefile.c", 123) + .withTest("FailingTest", "sourcefile.c", 123).thatFails("Failure", "file", 99) + .withTest("passingTwo", "sourcefile.c", 123) + .withTest("passingThree", "sourcefile.c", 123) + .withTest("AnotherFailingTest", "sourcefile.c", 123).thatFails("otherFailure", "anotherFile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroup.xml"); @@ -540,10 +542,10 @@ TEST(JUnitOutputTest, testFailuresInSeparateGroups) { testCaseRunner->start() .withGroup("testGroup") - .withTest("passingOne") - .withTest("FailingTest").thatFails("Failure", "file", 99) + .withTest("passingOne", "sourcefile.c", 123) + .withTest("FailingTest", "sourcefile.c", 123).thatFails("Failure", "file", 99) .withGroup("AnotherGroup") - .withTest("AnotherFailingTest").thatFails("otherFailure", "anotherFile", 10) + .withTest("AnotherFailingTest", "sourcefile.c", 123).thatFails("otherFailure", "anotherFile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroup.xml"); @@ -558,9 +560,9 @@ TEST(JUnitOutputTest, twoTestGroupsWriteToTwoDifferentFiles) { testCaseRunner->start() .withGroup("firstTestGroup") - .withTest("testName") + .withTest("testName", "sourcefile.c", 123) .withGroup("secondTestGroup") - .withTest("testName") + .withTest("testName", "sourcefile.c", 123) .end(); CHECK(fileSystem.file("cpputest_firstTestGroup.xml")); @@ -577,25 +579,25 @@ TEST(JUnitOutputTest, TestCaseBlockWithAPackageName) { junitOutput->setPackageName("packagename"); testCaseRunner->start() - .withGroup("groupname").withTest("testname") + .withGroup("groupname").withTest("testname", "sourcefile.c", 123) .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); } TEST(JUnitOutputTest, TestCaseBlockForIgnoredTest) { junitOutput->setPackageName("packagename"); - testCaseRunner->start() - .withGroup("groupname").withIgnoredTest("testname") + testCaseRunner->start() + .withGroup("groupname").withIgnoredTest("testname", "sourcefile.c", 123) .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); STRCMP_EQUAL("\n", outputFile->line(7)); } From a7219a442923a1a31532111dfed31e605889b0f3 Mon Sep 17 00:00:00 2001 From: liu nick Date: Sun, 22 May 2016 13:15:48 +0800 Subject: [PATCH 0002/1093] move hex format responsibility in StringFrom function for unsigned type to the client class --- include/CppUTest/SimpleString.h | 1 + src/CppUTest/SimpleString.cpp | 12 +++++++++--- src/CppUTestExt/MockActualCall.cpp | 4 ++-- src/CppUTestExt/MockNamedValue.cpp | 4 ++-- tests/SimpleStringTest.cpp | 15 ++++++++++++--- tests/TestFailureTest.cpp | 2 +- tests/TestUTestMacro.cpp | 16 ++++++++-------- 7 files changed, 35 insertions(+), 19 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index b15f28d40..545015cdf 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -144,6 +144,7 @@ SimpleString StringFrom(int value); SimpleString StringFrom(unsigned int value); SimpleString StringFrom(long value); SimpleString StringFrom(unsigned long value); +SimpleString HexStringFrom(unsigned int value); SimpleString StringFrom(cpputest_longlong value); SimpleString StringFrom(cpputest_ulonglong value); SimpleString HexStringFrom(long value); diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 563f1e44e..edeab9d21 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -483,6 +483,12 @@ SimpleString HexStringFrom(unsigned long value) return StringFromFormat("%lx", value); } +SimpleString HexStringFrom(unsigned int value) +{ + return StringFromFormat("%08x", value); +} + + #ifdef CPPUTEST_USE_LONG_LONG SimpleString StringFrom(cpputest_longlong value) @@ -492,7 +498,7 @@ SimpleString StringFrom(cpputest_longlong value) SimpleString StringFrom(cpputest_ulonglong value) { - return StringFromFormat("%llu (0x%llx)", value, value); + return StringFromFormat("%llu", value, value); } SimpleString HexStringFrom(cpputest_longlong value) @@ -604,7 +610,7 @@ SimpleString StringFromFormat(const char* format, ...) SimpleString StringFrom(unsigned int i) { - return StringFromFormat("%10u (0x%08x)", i, i); + return StringFromFormat("%10u", i); } #if CPPUTEST_USE_STD_CPP_LIB @@ -620,7 +626,7 @@ SimpleString StringFrom(const std::string& value) SimpleString StringFrom(unsigned long i) { - return StringFromFormat("%lu (0x%lx)", i, i); + return StringFromFormat("%lu", i); } //Kludge to get a va_copy in VC++ V6 diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 0cfef9a2c..64b1f1654 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -590,7 +590,7 @@ MockActualCall& MockActualCallTrace::withBoolParameter(const SimpleString& name, MockActualCall& MockActualCallTrace::withUnsignedIntParameter(const SimpleString& name, unsigned int value) { addParameterName(name); - traceBuffer_ += StringFrom(value); + traceBuffer_ += StringFrom(value) + " " + "(0x" + HexStringFrom(value) + ")"; return *this; } @@ -604,7 +604,7 @@ MockActualCall& MockActualCallTrace::withIntParameter(const SimpleString& name, MockActualCall& MockActualCallTrace::withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) { addParameterName(name); - traceBuffer_ += StringFrom(value); + traceBuffer_ += StringFrom(value) + " " + "(0x" + HexStringFrom(value) + ")"; return *this; } diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 169b9ac29..093f5e400 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -331,11 +331,11 @@ SimpleString MockNamedValue::toString() const else if (type_ == "int") return StringFrom(value_.intValue_); else if (type_ == "unsigned int") - return StringFrom(value_.unsignedIntValue_); + return StringFrom(value_.unsignedIntValue_) + " " + "(0x" + HexStringFrom(value_.unsignedIntValue_) + ")"; else if (type_ == "long int") return StringFrom(value_.longIntValue_); else if (type_ == "unsigned long int") - return StringFrom(value_.unsignedLongIntValue_); + return StringFrom(value_.unsignedLongIntValue_) + " " + "(0x" + HexStringFrom(value_.unsignedLongIntValue_) + ")"; else if (type_ == "const char*") return value_.stringValue_; else if (type_ == "void*") diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 3d0978912..66670a584 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -731,12 +731,21 @@ IGNORE_TEST(SimpleString, _64BitAddressPrintsCorrectly) #endif -TEST(SimpleString, BuildStringFromUnsignedInteger) +TEST(SimpleString, BuildStringFromUnsignedLongInteger) { unsigned long int i = 0xffffffff; SimpleString result = StringFrom(i); - const char* expected_string = "4294967295 (0xffffffff)"; + const char* expected_string = "4294967295"; + CHECK_EQUAL(expected_string, result); +} + +TEST(SimpleString, BuildStringFromUnsignedInteger) +{ + unsigned int i = 0xffffffff; + + SimpleString result = StringFrom(i); + const char* expected_string = "4294967295"; CHECK_EQUAL(expected_string, result); } @@ -761,7 +770,7 @@ TEST(SimpleString, unsigned_long) unsigned long i = 0xffffffffUL; SimpleString result = StringFrom(i); - const char* expected_string = "4294967295 (0xffffffff)"; + const char* expected_string = "4294967295"; CHECK_EQUAL(expected_string, result); } diff --git a/tests/TestFailureTest.cpp b/tests/TestFailureTest.cpp index 8635a2334..64be65c4f 100644 --- a/tests/TestFailureTest.cpp +++ b/tests/TestFailureTest.cpp @@ -155,7 +155,7 @@ TEST(TestFailure, UnsignedLongLongsEqualFailure) { #ifdef CPPUTEST_USE_LONG_LONG UnsignedLongLongsEqualFailure f(test, failFileName, failLineNumber, 1, 2, ""); - FAILURE_EQUAL("expected <1 (0x1) 0x1>\n\tbut was <2 (0x2) 0x2>", f); + FAILURE_EQUAL("expected <1 0x1>\n\tbut was <2 0x2>", f); #else cpputest_ulonglong dummy_ulonglong; UnsignedLongLongsEqualFailure f(test, failFileName, failLineNumber, dummy_ulonglong, dummy_ulonglong, ""); diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 6fad64b6a..eacb2063d 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -77,8 +77,8 @@ static void _UNSIGNED_LONGS_EQUALTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGS_EQUAL) { fixture.runTestWithMethod(_UNSIGNED_LONGS_EQUALTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1) 0x1>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0) 0x0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 0x1>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 0x0>"); } TEST(UnitTestMacros, UNSIGNED_LONGS_EQUALBehavesAsProperMacro) @@ -100,8 +100,8 @@ static void _UNSIGNED_LONGS_EQUAL_TEXTTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGS_EQUAL_TEXT) { fixture.runTestWithMethod(_UNSIGNED_LONGS_EQUAL_TEXTTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1) 0x1>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0) 0x0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 0x1>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 0x0>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); } @@ -175,8 +175,8 @@ static void _UNSIGNED_LONGLONGS_EQUALTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGLONGS_EQUAL) { fixture.runTestWithMethod(_UNSIGNED_LONGLONGS_EQUALTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1) 0x1>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0) 0x0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 0x1>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 0x0>"); } TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALBehavesAsProperMacro) @@ -198,8 +198,8 @@ static void _UNSIGNED_LONGLONGS_EQUAL_TEXTTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGLONGS_EQUAL_TEXT) { fixture.runTestWithMethod(_UNSIGNED_LONGLONGS_EQUAL_TEXTTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1) 0x1>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0) 0x0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 0x1>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 0x0>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); } From a10c84d4849c4a16bd850d22b7779759808aba41 Mon Sep 17 00:00:00 2001 From: liu nick Date: Sun, 22 May 2016 13:51:14 +0800 Subject: [PATCH 0003/1093] refactory brackets format --- include/CppUTest/SimpleString.h | 4 ++++ src/CppUTest/SimpleString.cpp | 15 +++++++++++++++ src/CppUTestExt/MockActualCall.cpp | 2 +- src/CppUTestExt/MockNamedValue.cpp | 4 ++-- tests/SimpleStringTest.cpp | 19 +++++++++++++++++++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 545015cdf..fdcda7a72 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -163,6 +163,10 @@ SimpleString StringFromBinaryWithSize(const unsigned char* value, size_t size); SimpleString StringFromBinaryWithSizeOrNull(const unsigned char* value, size_t size); SimpleString StringFromMaskedBits(unsigned long value, unsigned long mask, size_t byteCount); SimpleString StringFromOrdinalNumber(unsigned int number); +SimpleString BracketsFormattedHexStringFrom(unsigned int value); +SimpleString BracketsFormattedHexStringFrom(unsigned long value); +SimpleString BracketsFormattedHexString(SimpleString hexString); + #if CPPUTEST_USE_STD_CPP_LIB diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index edeab9d21..b8a343e11 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -488,6 +488,21 @@ SimpleString HexStringFrom(unsigned int value) return StringFromFormat("%08x", value); } +SimpleString BracketsFormattedHexStringFrom(unsigned int value) +{ + return BracketsFormattedHexString(HexStringFrom(value)); +} + +SimpleString BracketsFormattedHexStringFrom(unsigned long value) +{ + return BracketsFormattedHexString(HexStringFrom(value)); +} + +SimpleString BracketsFormattedHexString(SimpleString hexString) +{ + return SimpleString("(0x") + hexString + ")" ; +} + #ifdef CPPUTEST_USE_LONG_LONG diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 64b1f1654..6d4cd9f31 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -590,7 +590,7 @@ MockActualCall& MockActualCallTrace::withBoolParameter(const SimpleString& name, MockActualCall& MockActualCallTrace::withUnsignedIntParameter(const SimpleString& name, unsigned int value) { addParameterName(name); - traceBuffer_ += StringFrom(value) + " " + "(0x" + HexStringFrom(value) + ")"; + traceBuffer_ += StringFrom(value) + " " + BracketsFormattedHexStringFrom(value); return *this; } diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 093f5e400..1bad19ce8 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -331,11 +331,11 @@ SimpleString MockNamedValue::toString() const else if (type_ == "int") return StringFrom(value_.intValue_); else if (type_ == "unsigned int") - return StringFrom(value_.unsignedIntValue_) + " " + "(0x" + HexStringFrom(value_.unsignedIntValue_) + ")"; + return StringFrom(value_.unsignedIntValue_) + " " + BracketsFormattedHexStringFrom(value_.unsignedIntValue_); else if (type_ == "long int") return StringFrom(value_.longIntValue_); else if (type_ == "unsigned long int") - return StringFrom(value_.unsignedLongIntValue_) + " " + "(0x" + HexStringFrom(value_.unsignedLongIntValue_) + ")"; + return StringFrom(value_.unsignedLongIntValue_) + " " + BracketsFormattedHexStringFrom(value_.unsignedLongIntValue_); else if (type_ == "const char*") return value_.stringValue_; else if (type_ == "void*") diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 66670a584..c188008c4 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -1026,3 +1026,22 @@ TEST(SimpleString, StringFromOrdinalNumberOthers) STRCMP_EQUAL("100th", StringFromOrdinalNumber(100).asCharString()); STRCMP_EQUAL("101st", StringFromOrdinalNumber(101).asCharString()); } + +TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedInt) +{ + unsigned int value = 1; + + STRCMP_EQUAL("(0x00000001)", BracketsFormattedHexStringFrom(value).asCharString()); +} + +TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedLong) +{ + unsigned long value = 1; + + STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); +} + +TEST(SimpleString, FormattedHexStringFromForUnsignedLong) +{ + +} \ No newline at end of file From 657f6cb4e4987b3ea7053d70afd8aa11d7e16e32 Mon Sep 17 00:00:00 2001 From: liu nick Date: Sun, 22 May 2016 13:51:14 +0800 Subject: [PATCH 0004/1093] refactory brackets format --- include/CppUTest/SimpleString.h | 4 ++++ src/CppUTest/SimpleString.cpp | 15 +++++++++++++++ src/CppUTestExt/MockActualCall.cpp | 4 ++-- src/CppUTestExt/MockNamedValue.cpp | 4 ++-- tests/SimpleStringTest.cpp | 14 ++++++++++++++ 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 545015cdf..fdcda7a72 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -163,6 +163,10 @@ SimpleString StringFromBinaryWithSize(const unsigned char* value, size_t size); SimpleString StringFromBinaryWithSizeOrNull(const unsigned char* value, size_t size); SimpleString StringFromMaskedBits(unsigned long value, unsigned long mask, size_t byteCount); SimpleString StringFromOrdinalNumber(unsigned int number); +SimpleString BracketsFormattedHexStringFrom(unsigned int value); +SimpleString BracketsFormattedHexStringFrom(unsigned long value); +SimpleString BracketsFormattedHexString(SimpleString hexString); + #if CPPUTEST_USE_STD_CPP_LIB diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index edeab9d21..b8a343e11 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -488,6 +488,21 @@ SimpleString HexStringFrom(unsigned int value) return StringFromFormat("%08x", value); } +SimpleString BracketsFormattedHexStringFrom(unsigned int value) +{ + return BracketsFormattedHexString(HexStringFrom(value)); +} + +SimpleString BracketsFormattedHexStringFrom(unsigned long value) +{ + return BracketsFormattedHexString(HexStringFrom(value)); +} + +SimpleString BracketsFormattedHexString(SimpleString hexString) +{ + return SimpleString("(0x") + hexString + ")" ; +} + #ifdef CPPUTEST_USE_LONG_LONG diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 64b1f1654..5635567d0 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -590,7 +590,7 @@ MockActualCall& MockActualCallTrace::withBoolParameter(const SimpleString& name, MockActualCall& MockActualCallTrace::withUnsignedIntParameter(const SimpleString& name, unsigned int value) { addParameterName(name); - traceBuffer_ += StringFrom(value) + " " + "(0x" + HexStringFrom(value) + ")"; + traceBuffer_ += StringFrom(value) + " " + BracketsFormattedHexStringFrom(value); return *this; } @@ -604,7 +604,7 @@ MockActualCall& MockActualCallTrace::withIntParameter(const SimpleString& name, MockActualCall& MockActualCallTrace::withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) { addParameterName(name); - traceBuffer_ += StringFrom(value) + " " + "(0x" + HexStringFrom(value) + ")"; + traceBuffer_ += StringFrom(value) + " " + BracketsFormattedHexStringFrom(value); return *this; } diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 093f5e400..1bad19ce8 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -331,11 +331,11 @@ SimpleString MockNamedValue::toString() const else if (type_ == "int") return StringFrom(value_.intValue_); else if (type_ == "unsigned int") - return StringFrom(value_.unsignedIntValue_) + " " + "(0x" + HexStringFrom(value_.unsignedIntValue_) + ")"; + return StringFrom(value_.unsignedIntValue_) + " " + BracketsFormattedHexStringFrom(value_.unsignedIntValue_); else if (type_ == "long int") return StringFrom(value_.longIntValue_); else if (type_ == "unsigned long int") - return StringFrom(value_.unsignedLongIntValue_) + " " + "(0x" + HexStringFrom(value_.unsignedLongIntValue_) + ")"; + return StringFrom(value_.unsignedLongIntValue_) + " " + BracketsFormattedHexStringFrom(value_.unsignedLongIntValue_); else if (type_ == "const char*") return value_.stringValue_; else if (type_ == "void*") diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 66670a584..541779d18 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -1026,3 +1026,17 @@ TEST(SimpleString, StringFromOrdinalNumberOthers) STRCMP_EQUAL("100th", StringFromOrdinalNumber(100).asCharString()); STRCMP_EQUAL("101st", StringFromOrdinalNumber(101).asCharString()); } + +TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedInt) +{ + unsigned int value = 1; + + STRCMP_EQUAL("(0x00000001)", BracketsFormattedHexStringFrom(value).asCharString()); +} + +TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedLong) +{ + unsigned long value = 1; + + STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); +} \ No newline at end of file From bc3a3d003f7330fc20dd5b8597499ce1082318fb Mon Sep 17 00:00:00 2001 From: Arno Moonen Date: Sat, 21 May 2016 11:02:41 +0200 Subject: [PATCH 0005/1093] Attribute `assertions` added to `testcase` element in JUnit output format. Also fixed test JUnitOutputTest.withOneTestGroupAndOneTestFileShouldContainsATestCaseBlock that I forgot to fix before the previous commit. Related to cpputest/cpputest#967 and cpputest/cpputest#903. --- src/CppUTest/JUnitTestOutput.cpp | 13 +++-- tests/JUnitOutputTest.cpp | 86 ++++++++++++++++++++++++++++---- 2 files changed, 85 insertions(+), 14 deletions(-) diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index e6f4d77e3..31e44bd3b 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -34,7 +34,7 @@ struct JUnitTestCaseResultNode { JUnitTestCaseResultNode() : - execTime_(0), failure_(0), ignored_(false), next_(0) + execTime_(0), failure_(0), ignored_(false), lineNumber_ (0), checkCount_ (0), next_(0) { } @@ -44,18 +44,20 @@ struct JUnitTestCaseResultNode bool ignored_; SimpleString file_; int lineNumber_; + int checkCount_; JUnitTestCaseResultNode* next_; }; struct JUnitTestGroupResult { JUnitTestGroupResult() : - testCount_(0), failureCount_(0), startTime_(0), groupExecTime_(0), head_(0), tail_(0) + testCount_(0), failureCount_(0), totalCheckCount_(0), startTime_(0), groupExecTime_(0), head_(0), tail_(0) { } int testCount_; int failureCount_; + int totalCheckCount_; long startTime_; long groupExecTime_; SimpleString group_; @@ -110,6 +112,7 @@ void JUnitTestOutput::printCurrentTestEnded(const TestResult& result) { impl_->results_.tail_->execTime_ = result.getCurrentTestTotalExecutionTime(); + impl_->results_.tail_->checkCount_ = result.getCheckCount(); } void JUnitTestOutput::printTestsEnded(const TestResult& /*result*/) @@ -189,18 +192,22 @@ void JUnitTestOutput::writeProperties() void JUnitTestOutput::writeTestCases() { JUnitTestCaseResultNode* cur = impl_->results_.head_; + while (cur) { SimpleString buf = StringFromFormat( - "\n", + "\n", impl_->package_.asCharString(), impl_->package_.isEmpty() == true ? "" : ".", impl_->results_.group_.asCharString(), cur->name_.asCharString(), + cur->checkCount_ - impl_->results_.totalCheckCount_, (int) (cur->execTime_ / 1000), (int)(cur->execTime_ % 1000), cur->file_.asCharString(), cur->lineNumber_); writeToFile(buf.asCharString()); + impl_->results_.totalCheckCount_ = cur->checkCount_; + if (cur->failure_) { writeFailure(cur); } diff --git a/tests/JUnitOutputTest.cpp b/tests/JUnitOutputTest.cpp index f7a9c0508..65476d935 100644 --- a/tests/JUnitOutputTest.cpp +++ b/tests/JUnitOutputTest.cpp @@ -157,12 +157,13 @@ class JUnitTestOutputTestRunner UtestShell* currentTest_; bool firstTestInGroup_; int timeTheTestTakes_; + unsigned int numberOfChecksInTest_; TestFailure* testFailure_; public: JUnitTestOutputTestRunner(TestResult result) : - result_(result), currentGroupName_(0), currentTest_(0), firstTestInGroup_(true), timeTheTestTakes_(0), testFailure_(0) + result_(result), currentGroupName_(0), currentTest_(0), firstTestInGroup_(true), timeTheTestTakes_(0), numberOfChecksInTest_(0), testFailure_(0) { millisTime = 0; theTime = "1978-10-03T00:00:00"; @@ -185,6 +186,14 @@ class JUnitTestOutputTestRunner return *this; } + JUnitTestOutputTestRunner& endGroupAndClearTest() + { + endOfPreviousTestGroup(); + delete currentTest_; + currentTest_ = 0; + return *this; + } + void endOfPreviousTestGroup() { runPreviousTest(); @@ -234,6 +243,10 @@ class JUnitTestOutputTestRunner result_.currentTestStarted(currentTest_); millisTime += timeTheTestTakes_; + for(unsigned int i = 0; i < numberOfChecksInTest_; i++) { + result_.countCheck(); + } + numberOfChecksInTest_ = 0; if (testFailure_) { result_.addFailure(*testFailure_); @@ -244,6 +257,12 @@ class JUnitTestOutputTestRunner result_.currentTestEnded(currentTest_); } + JUnitTestOutputTestRunner& thatHasChecks(unsigned int numOfChecks) + { + numberOfChecksInTest_ = numOfChecks; + return *this; + } + JUnitTestOutputTestRunner& thatTakes(int timeElapsed) { timeTheTestTakes_ = timeElapsed; @@ -378,12 +397,12 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyStderrBl TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainsATestCaseBlock) { testCaseRunner->start() - .withGroup("groupname").withTest("testname", "sourcefile.c", 12) + .withGroup("groupname").withTest("testname", "sourcefile.c", 123) .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); } @@ -398,9 +417,9 @@ TEST(JUnitOutputTest, withOneTestGroupAndTwoTestCasesCreateCorrectTestgroupBlock outputFile = fileSystem.file("cpputest_twoTestsGroup.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); - STRCMP_EQUAL("\n", outputFile->line(7)); + STRCMP_EQUAL("\n", outputFile->line(7)); STRCMP_EQUAL("\n", outputFile->line(8)); } @@ -425,9 +444,9 @@ TEST(JUnitOutputTest, withOneTestGroupAndMultipleTestCasesWithElapsedTime) outputFile = fileSystem.file("cpputest_twoTestsGroup.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); - STRCMP_EQUAL("\n", outputFile->line(7)); + STRCMP_EQUAL("\n", outputFile->line(7)); STRCMP_EQUAL("\n", outputFile->line(8)); } @@ -440,7 +459,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneFailingTest) outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); STRCMP_EQUAL("\n", outputFile->line(7)); STRCMP_EQUAL("\n", outputFile->line(8)); @@ -457,7 +476,7 @@ TEST(JUnitOutputTest, withTwoTestGroupAndOneFailingTest) outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("\n", outputFile->line(7)); + STRCMP_EQUAL("\n", outputFile->line(7)); STRCMP_EQUAL("\n", outputFile->line(8)); } @@ -584,7 +603,7 @@ TEST(JUnitOutputTest, TestCaseBlockWithAPackageName) outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); } @@ -597,7 +616,52 @@ TEST(JUnitOutputTest, TestCaseBlockForIgnoredTest) outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); STRCMP_EQUAL("\n", outputFile->line(7)); } + +TEST(JUnitOutputTest, TestCaseBlockWithAssertions) +{ + junitOutput->setPackageName("packagename"); + testCaseRunner->start() + .withGroup("groupname").withTest("testname", "sourcefile.c", 123).thatHasChecks(24) + .end(); + + outputFile = fileSystem.file("cpputest_groupname.xml"); + + STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(6)); +} + +TEST(JUnitOutputTest, MultipleTestCaseBlocksWithAssertions) +{ + testCaseRunner->start() + .withGroup("twoTestsGroup") + .withTest("firstTestName", "source1.c", 123).thatHasChecks(456) + .withTest("secondTestName", "source2.c", 234).thatHasChecks(567) + .end(); + + outputFile = fileSystem.file("cpputest_twoTestsGroup.xml"); + + STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(7)); +} + +TEST(JUnitOutputTest, MultipleTestCasesInDifferentGroupsWithAssertions) +{ + testCaseRunner->start() + .withGroup("groupOne") + .withTest("testA", "source1.c", 123).thatHasChecks(456) + .endGroupAndClearTest() + .withGroup("groupTwo") + .withTest("testB", "source2.c", 456).thatHasChecks(678) + .end(); + + outputFile = fileSystem.file("cpputest_groupOne.xml"); + STRCMP_EQUAL("\n", outputFile->line(5)); + + outputFile = fileSystem.file("cpputest_groupTwo.xml"); + STRCMP_EQUAL("\n", outputFile->line(5)); +} + From 599adb5c450001e8abd4fc880b25b6d869c9b700 Mon Sep 17 00:00:00 2001 From: liu nick Date: Mon, 23 May 2016 22:52:05 +0800 Subject: [PATCH 0006/1093] add brackets hex string for all test and failure --- include/CppUTest/SimpleString.h | 6 ++++ src/CppUTest/SimpleString.cpp | 40 +++++++++++++++++++++- src/CppUTest/TestFailure.cpp | 17 ++++----- src/CppUTestExt/MockActualCall.cpp | 4 +-- src/CppUTestExt/MockNamedValue.cpp | 4 +-- tests/CppUTestExt/MockActualCallTest.cpp | 2 +- tests/CppUTestExt/MockExpectedCallTest.cpp | 6 ++-- tests/CppUTestExt/MockFailureTest.cpp | 18 +++++----- tests/TestFailureTest.cpp | 8 ++--- tests/TestHarness_cTest.cpp | 2 +- tests/TestUTestMacro.cpp | 40 +++++++++++----------- 11 files changed, 96 insertions(+), 51 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index fdcda7a72..c9ef36c49 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -147,6 +147,7 @@ SimpleString StringFrom(unsigned long value); SimpleString HexStringFrom(unsigned int value); SimpleString StringFrom(cpputest_longlong value); SimpleString StringFrom(cpputest_ulonglong value); +SimpleString HexStringFrom(int value); SimpleString HexStringFrom(long value); SimpleString HexStringFrom(unsigned long value); SimpleString HexStringFrom(cpputest_longlong value); @@ -163,11 +164,16 @@ SimpleString StringFromBinaryWithSize(const unsigned char* value, size_t size); SimpleString StringFromBinaryWithSizeOrNull(const unsigned char* value, size_t size); SimpleString StringFromMaskedBits(unsigned long value, unsigned long mask, size_t byteCount); SimpleString StringFromOrdinalNumber(unsigned int number); +SimpleString BracketsFormattedHexStringFrom(int value); SimpleString BracketsFormattedHexStringFrom(unsigned int value); +SimpleString BracketsFormattedHexStringFrom(long value); SimpleString BracketsFormattedHexStringFrom(unsigned long value); +SimpleString BracketsFormattedHexStringFrom(cpputest_longlong value); +SimpleString BracketsFormattedHexStringFrom(cpputest_ulonglong value); SimpleString BracketsFormattedHexString(SimpleString hexString); + #if CPPUTEST_USE_STD_CPP_LIB #include diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index b8a343e11..ff12d4911 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -478,6 +478,11 @@ SimpleString HexStringFrom(long value) return StringFromFormat("%lx", value); } +SimpleString HexStringFrom(int value) +{ + return StringFromFormat("%08x", value); +} + SimpleString HexStringFrom(unsigned long value) { return StringFromFormat("%lx", value); @@ -488,11 +493,22 @@ SimpleString HexStringFrom(unsigned int value) return StringFromFormat("%08x", value); } +SimpleString BracketsFormattedHexStringFrom(int value) +{ + return BracketsFormattedHexString(HexStringFrom(value)); +} + SimpleString BracketsFormattedHexStringFrom(unsigned int value) { return BracketsFormattedHexString(HexStringFrom(value)); } +SimpleString BracketsFormattedHexStringFrom(long value) +{ + return BracketsFormattedHexString(HexStringFrom(value)); +} + + SimpleString BracketsFormattedHexStringFrom(unsigned long value) { return BracketsFormattedHexString(HexStringFrom(value)); @@ -513,7 +529,7 @@ SimpleString StringFrom(cpputest_longlong value) SimpleString StringFrom(cpputest_ulonglong value) { - return StringFromFormat("%llu", value, value); + return StringFromFormat("%llu", value); } SimpleString HexStringFrom(cpputest_longlong value) @@ -536,6 +552,17 @@ SimpleString HexStringFrom(void (*value)()) return HexStringFrom((cpputest_ulonglong) value); } +SimpleString BracketsFormattedHexStringFrom(cpputest_longlong value) +{ + return BracketsFormattedHexString(HexStringFrom(value)); +} + + +SimpleString BracketsFormattedHexStringFrom(cpputest_ulonglong value) +{ + return BracketsFormattedHexString(HexStringFrom(value)); +} + #else /* CPPUTEST_USE_LONG_LONG */ static long convertPointerToLongValue(const void* value) @@ -590,6 +617,17 @@ SimpleString HexStringFrom(void (*value)()) return StringFromFormat("%lx", convertFunctionPointerToLongValue(value)); } +SimpleString BracketsFormattedHexStringFrom(cpputest_longlong value) +{ + return ""; +} + + +SimpleString BracketsFormattedHexStringFrom(cpputest_ulonglong value) +{ + return ""; +} + #endif /* CPPUTEST_USE_LONG_LONG */ SimpleString StringFrom(double value, int precision) diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index d98fd20a4..333a4f520 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -249,8 +249,8 @@ LongsEqualFailure::LongsEqualFailure(UtestShell* test, const char* fileName, int SimpleString::padStringsToSameLength(aDecimal, eDecimal, ' '); SimpleString::padStringsToSameLength(aHex, eHex, '0'); - SimpleString actualReported = aDecimal + " 0x" + aHex; - SimpleString expectedReported = eDecimal + " 0x" + eHex; + SimpleString actualReported = aDecimal + " " + BracketsFormattedHexStringFrom(actual); + SimpleString expectedReported = eDecimal + " " + BracketsFormattedHexStringFrom(expected); message_ += createButWasString(expectedReported, actualReported); } @@ -267,8 +267,9 @@ UnsignedLongsEqualFailure::UnsignedLongsEqualFailure(UtestShell* test, const cha SimpleString::padStringsToSameLength(aDecimal, eDecimal, ' '); SimpleString::padStringsToSameLength(aHex, eHex, '0'); - SimpleString actualReported = aDecimal + " 0x" + aHex; - SimpleString expectedReported = eDecimal + " 0x" + eHex; + SimpleString actualReported = aDecimal + " " + BracketsFormattedHexStringFrom(actual); + SimpleString expectedReported = eDecimal + " " + BracketsFormattedHexStringFrom(expected); + message_ += createButWasString(expectedReported, actualReported); } @@ -285,8 +286,8 @@ LongLongsEqualFailure::LongLongsEqualFailure(UtestShell* test, const char* fileN SimpleString::padStringsToSameLength(aDecimal, eDecimal, ' '); SimpleString::padStringsToSameLength(aHex, eHex, '0'); - SimpleString actualReported = aDecimal + " 0x" + aHex; - SimpleString expectedReported = eDecimal + " 0x" + eHex; + SimpleString actualReported = aDecimal + " " + BracketsFormattedHexStringFrom(actual); + SimpleString expectedReported = eDecimal + " " + BracketsFormattedHexStringFrom(expected); message_ += createButWasString(expectedReported, actualReported); } @@ -303,8 +304,8 @@ UnsignedLongLongsEqualFailure::UnsignedLongLongsEqualFailure(UtestShell* test, c SimpleString::padStringsToSameLength(aDecimal, eDecimal, ' '); SimpleString::padStringsToSameLength(aHex, eHex, '0'); - SimpleString actualReported = aDecimal + " 0x" + aHex; - SimpleString expectedReported = eDecimal + " 0x" + eHex; + SimpleString actualReported = aDecimal + " " + BracketsFormattedHexStringFrom(actual); + SimpleString expectedReported = eDecimal + " " + BracketsFormattedHexStringFrom(expected); message_ += createButWasString(expectedReported, actualReported); } diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 5635567d0..219c10dbc 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -597,7 +597,7 @@ MockActualCall& MockActualCallTrace::withUnsignedIntParameter(const SimpleString MockActualCall& MockActualCallTrace::withIntParameter(const SimpleString& name, int value) { addParameterName(name); - traceBuffer_ += StringFrom(value); + traceBuffer_ += StringFrom(value) + " " + BracketsFormattedHexStringFrom(value); return *this; } @@ -611,7 +611,7 @@ MockActualCall& MockActualCallTrace::withUnsignedLongIntParameter(const SimpleSt MockActualCall& MockActualCallTrace::withLongIntParameter(const SimpleString& name, long int value) { addParameterName(name); - traceBuffer_ += StringFrom(value); + traceBuffer_ += StringFrom(value) + " " + BracketsFormattedHexStringFrom(value); return *this; } diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 1bad19ce8..8614015d0 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -329,11 +329,11 @@ SimpleString MockNamedValue::toString() const if (type_ == "bool") return StringFrom(value_.boolValue_); else if (type_ == "int") - return StringFrom(value_.intValue_); + return StringFrom(value_.intValue_) + " " + BracketsFormattedHexStringFrom(value_.intValue_); else if (type_ == "unsigned int") return StringFrom(value_.unsignedIntValue_) + " " + BracketsFormattedHexStringFrom(value_.unsignedIntValue_); else if (type_ == "long int") - return StringFrom(value_.longIntValue_); + return StringFrom(value_.longIntValue_) + " " + BracketsFormattedHexStringFrom(value_.longIntValue_); else if (type_ == "unsigned long int") return StringFrom(value_.unsignedLongIntValue_) + " " + BracketsFormattedHexStringFrom(value_.unsignedLongIntValue_); else if (type_ == "const char*") diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index e221208df..54606e50a 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -189,7 +189,7 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) expectedString += " bool:true"; expectedString += " unsigned_int: 1 (0x00000001)"; expectedString += " unsigned_long:1 (0x1)"; - expectedString += " long_int:1"; + expectedString += " long_int:1 (0x1)"; expectedString += " pointer:0x"; expectedString += HexStringFrom(&value); expectedString += " const_pointer:0x"; diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index c8d546b68..dd1c04c2c 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -448,7 +448,7 @@ TEST(MockExpectedCall, toStringForMultipleInputParameters) call->withParameter("string", "value"); call->withParameter("integer", int_value); call->withParameter("unsigned-integer", uint_value); - STRCMP_EQUAL("name -> const char* string: , int integer: <10>, unsigned int unsigned-integer: < 7 (0x00000007)>", call->callToString().asCharString()); + STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0x0000000a)>, unsigned int unsigned-integer: < 7 (0x00000007)>", call->callToString().asCharString()); } TEST(MockExpectedCall, toStringForMultipleInputAndOutputParameters) @@ -462,7 +462,7 @@ TEST(MockExpectedCall, toStringForMultipleInputAndOutputParameters) call->withParameter("integer", int_value); call->withParameter("unsigned-integer", uint_value); call->withOutputParameterReturning("buffer", buffer_value, sizeof(buffer_value)); - STRCMP_EQUAL("name -> const char* string: , int integer: <10>, unsigned int unsigned-integer: < 7 (0x00000007)>, " + STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0x0000000a)>, unsigned int unsigned-integer: < 7 (0x00000007)>, " "const void* buffer: ", call->callToString().asCharString()); } @@ -581,7 +581,7 @@ TEST(MockExpectedCallComposite, hasBoolParameter) TEST(MockExpectedCallComposite, hasLongIntParameter) { composite.withParameter("param", (long int) -1); - STRCMP_EQUAL("name -> long int param: <-1>", call.callToString().asCharString()); + STRCMP_EQUAL("name -> long int param: <-1 (0xffffffff)>", call.callToString().asCharString()); } TEST(MockExpectedCallComposite, hasUnsignedLongIntParameter) diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index 7e9b9e417..475dac6dc 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -108,7 +108,7 @@ TEST(MockFailureTest, expectedCallDidNotHappen) STRCMP_EQUAL("Mock Failure: Expected call did not happen.\n" "\tEXPECTED calls that did NOT happen:\n" "\t\tfoobar -> no parameters\n" - "\t\tworld -> int boo: <2>, const char* hello: \n" + "\t\tworld -> int boo: <2 (0x00000002)>, const char* hello: \n" "\tACTUAL calls that did happen (in call order):\n" "\t\thaphaphap -> no parameters", failure.getMessage().asCharString()); } @@ -140,12 +140,12 @@ TEST(MockFailureTest, MockUnexpectedInputParameterFailure) MockUnexpectedInputParameterFailure failure(UtestShell::getCurrent(), "foo", actualParameter, *list); STRCMP_EQUAL("Mock Failure: Unexpected parameter name to function \"foo\": bar\n" "\tEXPECTED calls that DID NOT happen related to function: foo\n" - "\t\tfoo -> int boo: <2>\n" + "\t\tfoo -> int boo: <2 (0x00000002)>\n" "\t\tfoo -> double boo: <3.3>\n" "\tACTUAL calls that DID happen related to function: foo\n" "\t\t\n" "\tACTUAL unexpected parameter passed to function: foo\n" - "\t\tint bar: <2>", failure.getMessage().asCharString()); + "\t\tint bar: <2 (0x00000002)>", failure.getMessage().asCharString()); } TEST(MockFailureTest, MockUnexpectedOutputParameterFailure) @@ -182,14 +182,14 @@ TEST(MockFailureTest, MockUnexpectedParameterValueFailure) actualParameter.setValue(20); MockUnexpectedInputParameterFailure failure(UtestShell::getCurrent(), "foo", actualParameter, *list); - STRCMP_EQUAL("Mock Failure: Unexpected parameter value to parameter \"boo\" to function \"foo\": <20>\n" + STRCMP_EQUAL("Mock Failure: Unexpected parameter value to parameter \"boo\" to function \"foo\": <20 (0x00000014)>\n" "\tEXPECTED calls that DID NOT happen related to function: foo\n" - "\t\tfoo -> int boo: <2>\n" - "\t\tfoo -> int boo: <10>\n" + "\t\tfoo -> int boo: <2 (0x00000002)>\n" + "\t\tfoo -> int boo: <10 (0x0000000a)>\n" "\tACTUAL calls that DID happen related to function: foo\n" "\t\t\n" "\tACTUAL unexpected parameter passed to function: foo\n" - "\t\tint boo: <20>", failure.getMessage().asCharString()); + "\t\tint boo: <20 (0x00000014)>", failure.getMessage().asCharString()); } TEST(MockFailureTest, MockExpectedParameterDidntHappenFailure) @@ -205,9 +205,9 @@ TEST(MockFailureTest, MockExpectedParameterDidntHappenFailure) MockExpectedParameterDidntHappenFailure failure(UtestShell::getCurrent(), "foo", *list); STRCMP_EQUAL("Mock Failure: Expected parameter for function \"foo\" did not happen.\n" "\tEXPECTED calls that DID NOT happen related to function: foo\n" - "\t\tfoo -> int bar: <2>, const char* boo: \n" + "\t\tfoo -> int bar: <2 (0x00000002)>, const char* boo: \n" "\tACTUAL calls that DID happen related to function: foo\n" - "\t\tfoo -> int bar: <10>, const char* boo: \n" + "\t\tfoo -> int bar: <10 (0x0000000a)>, const char* boo: \n" "\tMISSING parameters that didn't happen:\n" "\t\tint bar, const char* boo", failure.getMessage().asCharString()); } diff --git a/tests/TestFailureTest.cpp b/tests/TestFailureTest.cpp index 64be65c4f..2ed86bfba 100644 --- a/tests/TestFailureTest.cpp +++ b/tests/TestFailureTest.cpp @@ -130,20 +130,20 @@ TEST(TestFailure, LongsEqualFailureWithText) { LongsEqualFailure f(test, failFileName, failLineNumber, 1, 2, "text"); FAILURE_EQUAL("Message: text\n" - "\texpected <1 0x1>\n\tbut was <2 0x2>", f); + "\texpected <1 (0x1)>\n\tbut was <2 (0x2)>", f); } TEST(TestFailure, LongsEqualFailure) { LongsEqualFailure f(test, failFileName, failLineNumber, 1, 2, ""); - FAILURE_EQUAL("expected <1 0x1>\n\tbut was <2 0x2>", f); + FAILURE_EQUAL("expected <1 (0x1)>\n\tbut was <2 (0x2)>", f); } TEST(TestFailure, LongLongsEqualFailure) { #ifdef CPPUTEST_USE_LONG_LONG LongLongsEqualFailure f(test, failFileName, failLineNumber, 1, 2, ""); - FAILURE_EQUAL("expected <1 0x1>\n\tbut was <2 0x2>", f); + FAILURE_EQUAL("expected <1 (0x1)>\n\tbut was <2 (0x2)>", f); #else cpputest_longlong dummy_longlong; LongLongsEqualFailure f(test, failFileName, failLineNumber, dummy_longlong, dummy_longlong, ""); @@ -155,7 +155,7 @@ TEST(TestFailure, UnsignedLongLongsEqualFailure) { #ifdef CPPUTEST_USE_LONG_LONG UnsignedLongLongsEqualFailure f(test, failFileName, failLineNumber, 1, 2, ""); - FAILURE_EQUAL("expected <1 0x1>\n\tbut was <2 0x2>", f); + FAILURE_EQUAL("expected <1 (0x1)>\n\tbut was <2 (0x2)>", f); #else cpputest_ulonglong dummy_ulonglong; UnsignedLongLongsEqualFailure f(test, failFileName, failLineNumber, dummy_ulonglong, dummy_ulonglong, ""); diff --git a/tests/TestHarness_cTest.cpp b/tests/TestHarness_cTest.cpp index 3d752a57c..5fb9d1ee1 100644 --- a/tests/TestHarness_cTest.cpp +++ b/tests/TestHarness_cTest.cpp @@ -94,7 +94,7 @@ TEST(TestHarness_c, checkInt) CHECK_EQUAL_C_INT(2, 2); fixture->setTestFunction(_failIntMethod); fixture->runAllTests(); - fixture->assertPrintContains("expected <1 0x1>\n but was <2 0x2>"); + fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index eacb2063d..4ed9e419c 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -77,8 +77,8 @@ static void _UNSIGNED_LONGS_EQUALTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGS_EQUAL) { fixture.runTestWithMethod(_UNSIGNED_LONGS_EQUALTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 0x1>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 0x0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0)>"); } TEST(UnitTestMacros, UNSIGNED_LONGS_EQUALBehavesAsProperMacro) @@ -100,8 +100,8 @@ static void _UNSIGNED_LONGS_EQUAL_TEXTTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGS_EQUAL_TEXT) { fixture.runTestWithMethod(_UNSIGNED_LONGS_EQUAL_TEXTTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 0x1>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 0x0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); } @@ -127,8 +127,8 @@ static void _LONGLONGS_EQUALTestMethod() TEST(UnitTestMacros, TestLONGLONGS_EQUAL) { fixture.runTestWithMethod(_LONGLONGS_EQUALTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 0x1>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 0x0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0)>"); } TEST(UnitTestMacros, LONGLONGS_EQUALBehavesAsProperMacro) @@ -150,8 +150,8 @@ static void _LONGLONGS_EQUAL_TEXTTestMethod() TEST(UnitTestMacros, TestLONGLONGS_EQUAL_TEXT) { fixture.runTestWithMethod(_LONGLONGS_EQUAL_TEXTTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 0x1>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 0x0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); } @@ -175,8 +175,8 @@ static void _UNSIGNED_LONGLONGS_EQUALTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGLONGS_EQUAL) { fixture.runTestWithMethod(_UNSIGNED_LONGLONGS_EQUALTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 0x1>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 0x0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0)>"); } TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALBehavesAsProperMacro) @@ -198,8 +198,8 @@ static void _UNSIGNED_LONGLONGS_EQUAL_TEXTTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGLONGS_EQUAL_TEXT) { fixture.runTestWithMethod(_UNSIGNED_LONGLONGS_EQUAL_TEXTTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 0x1>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 0x0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); } @@ -497,8 +497,8 @@ static void _failingTestMethodWithLONGS_EQUAL() TEST(UnitTestMacros, FailureWithLONGS_EQUALS) { fixture.runTestWithMethod(_failingTestMethodWithLONGS_EQUAL); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected < 1 0x01>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <255 0xff>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected < 1 (0x1)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <255 (0xff)>"); } TEST(UnitTestMacros, LONGS_EQUALBehavesAsProperMacro) @@ -521,8 +521,8 @@ static void _failingTestMethodWithLONGS_EQUAL_TEXT() TEST(UnitTestMacros, FailureWithLONGS_EQUALS_TEXT) { fixture.runTestWithMethod(_failingTestMethodWithLONGS_EQUAL_TEXT); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected < 1 0x01>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <255 0xff>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected < 1 (0x1)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <255 (0xff)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); } @@ -546,8 +546,8 @@ static void _failingTestMethodWithBYTES_EQUAL() TEST(UnitTestMacros, FailureWithBYTES_EQUAL) { fixture.runTestWithMethod(_failingTestMethodWithBYTES_EQUAL); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <97 0x61>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <98 0x62>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <97 (0x61)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <98 (0x62)>"); } TEST(UnitTestMacros, BYTES_EQUALBehavesAsProperMacro) @@ -570,8 +570,8 @@ static void _failingTestMethodWithBYTES_EQUAL_TEXT() TEST(UnitTestMacros, FailureWithBYTES_EQUAL_TEXT) { fixture.runTestWithMethod(_failingTestMethodWithBYTES_EQUAL_TEXT); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <97 0x61>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <98 0x62>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <97 (0x61)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <98 (0x62)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); } From 42f420f5242a99adea50e40f0d05162695eed662 Mon Sep 17 00:00:00 2001 From: liu nick Date: Tue, 24 May 2016 22:14:02 +0800 Subject: [PATCH 0007/1093] keep consistent brackets hex string output --- src/CppUTest/SimpleString.cpp | 4 +- tests/CppUTestExt/MockActualCallTest.cpp | 2 +- tests/CppUTestExt/MockExpectedCallTest.cpp | 4 +- tests/CppUTestExt/MockFailureTest.cpp | 18 ++++----- tests/SimpleStringTest.cpp | 44 +++++++++++++++++++++- 5 files changed, 57 insertions(+), 15 deletions(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index ff12d4911..546da8606 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -480,7 +480,7 @@ SimpleString HexStringFrom(long value) SimpleString HexStringFrom(int value) { - return StringFromFormat("%08x", value); + return StringFromFormat("%x", value); } SimpleString HexStringFrom(unsigned long value) @@ -490,7 +490,7 @@ SimpleString HexStringFrom(unsigned long value) SimpleString HexStringFrom(unsigned int value) { - return StringFromFormat("%08x", value); + return StringFromFormat("%x", value); } SimpleString BracketsFormattedHexStringFrom(int value) diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 54606e50a..d51efb977 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -187,7 +187,7 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) expectedString += " onObject:0x"; expectedString += HexStringFrom(&value); expectedString += " bool:true"; - expectedString += " unsigned_int: 1 (0x00000001)"; + expectedString += " unsigned_int: 1 (0x1)"; expectedString += " unsigned_long:1 (0x1)"; expectedString += " long_int:1 (0x1)"; expectedString += " pointer:0x"; diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index dd1c04c2c..35833dfa3 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -448,7 +448,7 @@ TEST(MockExpectedCall, toStringForMultipleInputParameters) call->withParameter("string", "value"); call->withParameter("integer", int_value); call->withParameter("unsigned-integer", uint_value); - STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0x0000000a)>, unsigned int unsigned-integer: < 7 (0x00000007)>", call->callToString().asCharString()); + STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0xa)>, unsigned int unsigned-integer: < 7 (0x7)>", call->callToString().asCharString()); } TEST(MockExpectedCall, toStringForMultipleInputAndOutputParameters) @@ -462,7 +462,7 @@ TEST(MockExpectedCall, toStringForMultipleInputAndOutputParameters) call->withParameter("integer", int_value); call->withParameter("unsigned-integer", uint_value); call->withOutputParameterReturning("buffer", buffer_value, sizeof(buffer_value)); - STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0x0000000a)>, unsigned int unsigned-integer: < 7 (0x00000007)>, " + STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0xa)>, unsigned int unsigned-integer: < 7 (0x7)>, " "const void* buffer: ", call->callToString().asCharString()); } diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index 475dac6dc..d1356515f 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -108,7 +108,7 @@ TEST(MockFailureTest, expectedCallDidNotHappen) STRCMP_EQUAL("Mock Failure: Expected call did not happen.\n" "\tEXPECTED calls that did NOT happen:\n" "\t\tfoobar -> no parameters\n" - "\t\tworld -> int boo: <2 (0x00000002)>, const char* hello: \n" + "\t\tworld -> int boo: <2 (0x2)>, const char* hello: \n" "\tACTUAL calls that did happen (in call order):\n" "\t\thaphaphap -> no parameters", failure.getMessage().asCharString()); } @@ -140,12 +140,12 @@ TEST(MockFailureTest, MockUnexpectedInputParameterFailure) MockUnexpectedInputParameterFailure failure(UtestShell::getCurrent(), "foo", actualParameter, *list); STRCMP_EQUAL("Mock Failure: Unexpected parameter name to function \"foo\": bar\n" "\tEXPECTED calls that DID NOT happen related to function: foo\n" - "\t\tfoo -> int boo: <2 (0x00000002)>\n" + "\t\tfoo -> int boo: <2 (0x2)>\n" "\t\tfoo -> double boo: <3.3>\n" "\tACTUAL calls that DID happen related to function: foo\n" "\t\t\n" "\tACTUAL unexpected parameter passed to function: foo\n" - "\t\tint bar: <2 (0x00000002)>", failure.getMessage().asCharString()); + "\t\tint bar: <2 (0x2)>", failure.getMessage().asCharString()); } TEST(MockFailureTest, MockUnexpectedOutputParameterFailure) @@ -182,14 +182,14 @@ TEST(MockFailureTest, MockUnexpectedParameterValueFailure) actualParameter.setValue(20); MockUnexpectedInputParameterFailure failure(UtestShell::getCurrent(), "foo", actualParameter, *list); - STRCMP_EQUAL("Mock Failure: Unexpected parameter value to parameter \"boo\" to function \"foo\": <20 (0x00000014)>\n" + STRCMP_EQUAL("Mock Failure: Unexpected parameter value to parameter \"boo\" to function \"foo\": <20 (0x14)>\n" "\tEXPECTED calls that DID NOT happen related to function: foo\n" - "\t\tfoo -> int boo: <2 (0x00000002)>\n" - "\t\tfoo -> int boo: <10 (0x0000000a)>\n" + "\t\tfoo -> int boo: <2 (0x2)>\n" + "\t\tfoo -> int boo: <10 (0xa)>\n" "\tACTUAL calls that DID happen related to function: foo\n" "\t\t\n" "\tACTUAL unexpected parameter passed to function: foo\n" - "\t\tint boo: <20 (0x00000014)>", failure.getMessage().asCharString()); + "\t\tint boo: <20 (0x14)>", failure.getMessage().asCharString()); } TEST(MockFailureTest, MockExpectedParameterDidntHappenFailure) @@ -205,9 +205,9 @@ TEST(MockFailureTest, MockExpectedParameterDidntHappenFailure) MockExpectedParameterDidntHappenFailure failure(UtestShell::getCurrent(), "foo", *list); STRCMP_EQUAL("Mock Failure: Expected parameter for function \"foo\" did not happen.\n" "\tEXPECTED calls that DID NOT happen related to function: foo\n" - "\t\tfoo -> int bar: <2 (0x00000002)>, const char* boo: \n" + "\t\tfoo -> int bar: <2 (0x2)>, const char* boo: \n" "\tACTUAL calls that DID happen related to function: foo\n" - "\t\tfoo -> int bar: <10 (0x0000000a)>, const char* boo: \n" + "\t\tfoo -> int bar: <10 (0xa)>, const char* boo: \n" "\tMISSING parameters that didn't happen:\n" "\t\tint bar, const char* boo", failure.getMessage().asCharString()); } diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 1b69a3586..58d563869 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -1031,7 +1031,7 @@ TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedInt) { unsigned int value = 1; - STRCMP_EQUAL("(0x00000001)", BracketsFormattedHexStringFrom(value).asCharString()); + STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); } TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedLong) @@ -1040,3 +1040,45 @@ TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedLong) STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); } + +TEST(SimpleString, BracketsFormattedHexStringFromForInt) +{ + int value = 1; + + STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); +} + +TEST(SimpleString, BracketsFormattedHexStringFromForLong) +{ + long value = 1; + + STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); +} +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(SimpleString, BracketsFormattedHexStringFromForLongLong) +{ + cpputest_longlong value = 1; + + STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); +} +TEST(SimpleString, BracketsFormattedHexStringFromForULongLong) +{ + cpputest_ulonglong value = 1; + + STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); +} +#else +TEST(SimpleString, BracketsFormattedHexStringFromForLongLong) +{ + cpputest_longlong value = 1; + + STRCMP_EQUAL("", BracketsFormattedHexStringFrom(value).asCharString()); +} +TEST(SimpleString, BracketsFormattedHexStringFromForULongLong) +{ + cpputest_ulonglong value = 1; + + STRCMP_EQUAL("", BracketsFormattedHexStringFrom(value).asCharString()); +} +#endif \ No newline at end of file From 49c7e1a27a526a0c88371c7892d25dabf0617d52 Mon Sep 17 00:00:00 2001 From: liu nick Date: Tue, 24 May 2016 23:11:07 +0800 Subject: [PATCH 0008/1093] avoid to write string test for long because different system has different width for long --- include/CppUTest/SimpleString.h | 2 +- tests/CppUTestExt/MockExpectedCallTest.cpp | 4 ++-- tests/SimpleStringTest.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 7b90e89e1..d534a9932 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -144,9 +144,9 @@ SimpleString StringFrom(int value); SimpleString StringFrom(unsigned int value); SimpleString StringFrom(long value); SimpleString StringFrom(unsigned long value); -SimpleString HexStringFrom(unsigned int value); SimpleString StringFrom(cpputest_longlong value); SimpleString StringFrom(cpputest_ulonglong value); +SimpleString HexStringFrom(unsigned int value); SimpleString HexStringFrom(int value); SimpleString HexStringFrom(signed char value); SimpleString HexStringFrom(long value); diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 35833dfa3..733d95820 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -580,8 +580,8 @@ TEST(MockExpectedCallComposite, hasBoolParameter) TEST(MockExpectedCallComposite, hasLongIntParameter) { - composite.withParameter("param", (long int) -1); - STRCMP_EQUAL("name -> long int param: <-1 (0xffffffff)>", call.callToString().asCharString()); + composite.withParameter("param", (long int) 1); + STRCMP_EQUAL("name -> long int param: <1 (0x1)>", call.callToString().asCharString()); } TEST(MockExpectedCallComposite, hasUnsignedLongIntParameter) diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 535f29166..afb4f370e 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -1054,9 +1054,9 @@ TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedLong) TEST(SimpleString, BracketsFormattedHexStringFromForInt) { - int value = 1; + int value = -1; - STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); + STRCMP_EQUAL("(0xffffffff)", BracketsFormattedHexStringFrom(value).asCharString()); } TEST(SimpleString, BracketsFormattedHexStringFromForLong) From 5c1c766c442b7c2fca3485ebeb2c54762d264070 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 25 May 2016 14:56:29 +0800 Subject: [PATCH 0009/1093] un-INGNORED a failing test (for Mac) so we will fix it --- tests/CppUTestExt/IEEE754PluginTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index b9400c5a3..c4c223f82 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -115,7 +115,7 @@ static void set_everything_but_already_failed(void) CHECK(1 == 2); } -IGNORE_TEST(FE__with_Plugin, should_not_fail_again_when_test_has_already_failed) +TEST(FE__with_Plugin, should_not_fail_again_when_test_has_already_failed) { fixture.setTestFunction(set_everything_but_already_failed); fixture.runAllTests(); From 9a6fa6028dd7ffc234e6eea0e6b0050fb43be2ff Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 25 May 2016 08:27:34 +0100 Subject: [PATCH 0010/1093] Overlooked this one in my npos-2 PR --- src/CppUTest/CommandLineArguments.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index e0b993bcd..826a1f5ee 100755 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -218,7 +218,7 @@ void CommandLineArguments::AddTestToRunBasedOnVerboseOutput(int ac, const char** { SimpleString wholename = getParameterField(ac, av, index, parameterName); SimpleString testname = wholename.subStringFromTill(',', ')'); - testname = testname.subString(2, testname.size()); + testname = testname.subString(2); TestFilter* namefilter = new TestFilter(testname); TestFilter* groupfilter = new TestFilter(wholename.subStringFromTill(wholename.at(0), ',')); namefilter->strictMatching(); From c0bb37766110ae6f9de5a7a61e7c23846aa91ce6 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 25 May 2016 17:43:59 +0800 Subject: [PATCH 0011/1093] C++14 support in CI build --- Makefile.am | 3 +++ configure.ac | 24 +++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 793980012..30803d2ea 100644 --- a/Makefile.am +++ b/Makefile.am @@ -290,6 +290,9 @@ check_basic: @echo "Building with the Std C++ 11 turned on. Compiler acts differently then." make distclean; $(srcdir)/configure --enable-std-cpp11; make + @echo "Building with the Std C++ 14 turned on. Compiler acts differently then." + make distclean; $(srcdir)/configure --enable-std-cpp14; make + @echo "Building without the Standard C library" make distclean; $(srcdir)/configure --disable-std-c; make diff --git a/configure.ac b/configure.ac index 43d89a3cb..da9757b8c 100644 --- a/configure.ac +++ b/configure.ac @@ -81,11 +81,20 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNIN CFLAGS="$saved_cflags" fi +AC_LANG_PUSH([C++]) +##################################################################################### +##### C++ 14 checks + +# FLag -std=c++1y +CXXFLAGS="-std=c++1y" +AC_MSG_CHECKING([whether CXX supports -std=c++1y]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP14FLAG="-std=c++1y" ], [AC_MSG_RESULT([no])]) +CXXFLAGS="$saved_cxxflags" + ##################################################################################### ##### C++ 11 checks ### Checking for Standard C++ 11 compiler flags -AC_LANG_PUSH([C++]) # FLag -std=c++0x CXXFLAGS="-std=c++0x" @@ -338,6 +347,9 @@ AC_ARG_ENABLE([std-cpp], [AC_HELP_STRING([--disable-std-cpp], [disable the use o AC_ARG_ENABLE([std-cpp11], [AC_HELP_STRING([--enable-std-cpp11], [enable the use of Standard C++ 11 (if the compiler supports that)])], [use_std_cpp11=${enableval}], [use_std_cpp11=no]) +AC_ARG_ENABLE([std-cpp14], [AC_HELP_STRING([--enable-std-cpp14], [enable the use of Standard C++ 14 (if the compiler supports that)])], + [use_std_cpp14=${enableval}], [use_std_cpp14=no]) + AC_ARG_ENABLE([cpputest-flags], [AC_HELP_STRING([--disable-cpputest-flags], [disable CFLAGS/CPPFLAGS/CXXFLAGS set by CppUTest])], [cpputest_flags=${enableval}], [cpputest_flags=yes]) @@ -383,10 +395,18 @@ if test "x${use_std_cpp}" = xno; then fi fi +cpp_standard_used="default" # Using the C++11 standard? if test "x${use_std_cpp11}" = xyes; then CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP11FLAG} ${CPPUTEST_CPP11BLACKLIST}" + cpp_standard_used="C++11" +fi + +# Using the C++14 standard? +if test "x${use_std_cpp14}" = xyes; then + CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP14FLAG} ${CPPUTEST_CPP11BLACKLIST}" + cpp_standard_used="C++14" fi # Dealing with memory leak detection @@ -499,6 +519,7 @@ LT_INIT AC_CONFIG_FILES([Makefile]) AC_OUTPUT + echo \ "---------------------------------------------------------------- @@ -517,6 +538,7 @@ Current compiler options: CppUTest LIB: ${LIBS} Features configured in ${PACKAGE_NAME}: + C++ standard used: ${cpp_standard_used} Memory Leak Detection: ${memory_leak_detection} Compiling extensions: ${cpputest_ext} Use Long Long (if available): ${use_longlong} From 3e6e676d3ce676c18707168eb7179e69c590a720 Mon Sep 17 00:00:00 2001 From: liu nick Date: Tue, 24 May 2016 23:11:07 +0800 Subject: [PATCH 0012/1093] avoid to write string test for long because different system has different width for long --- include/CppUTest/SimpleString.h | 2 +- src/CppUTest/SimpleString.cpp | 2 +- tests/CppUTestExt/MockActualCallTest.cpp | 2 +- tests/CppUTestExt/MockExpectedCallTest.cpp | 8 ++++---- tests/SimpleStringTest.cpp | 8 ++++---- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 7b90e89e1..d534a9932 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -144,9 +144,9 @@ SimpleString StringFrom(int value); SimpleString StringFrom(unsigned int value); SimpleString StringFrom(long value); SimpleString StringFrom(unsigned long value); -SimpleString HexStringFrom(unsigned int value); SimpleString StringFrom(cpputest_longlong value); SimpleString StringFrom(cpputest_ulonglong value); +SimpleString HexStringFrom(unsigned int value); SimpleString HexStringFrom(int value); SimpleString HexStringFrom(signed char value); SimpleString HexStringFrom(long value); diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 274ead30c..957ec4050 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -673,7 +673,7 @@ SimpleString StringFromFormat(const char* format, ...) SimpleString StringFrom(unsigned int i) { - return StringFromFormat("%10u", i); + return StringFromFormat("%u", i); } #if CPPUTEST_USE_STD_CPP_LIB diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index d51efb977..b60c099a3 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -187,7 +187,7 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) expectedString += " onObject:0x"; expectedString += HexStringFrom(&value); expectedString += " bool:true"; - expectedString += " unsigned_int: 1 (0x1)"; + expectedString += " unsigned_int:1 (0x1)"; expectedString += " unsigned_long:1 (0x1)"; expectedString += " long_int:1 (0x1)"; expectedString += " pointer:0x"; diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 35833dfa3..7c1a73670 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -448,7 +448,7 @@ TEST(MockExpectedCall, toStringForMultipleInputParameters) call->withParameter("string", "value"); call->withParameter("integer", int_value); call->withParameter("unsigned-integer", uint_value); - STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0xa)>, unsigned int unsigned-integer: < 7 (0x7)>", call->callToString().asCharString()); + STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0xa)>, unsigned int unsigned-integer: <7 (0x7)>", call->callToString().asCharString()); } TEST(MockExpectedCall, toStringForMultipleInputAndOutputParameters) @@ -462,7 +462,7 @@ TEST(MockExpectedCall, toStringForMultipleInputAndOutputParameters) call->withParameter("integer", int_value); call->withParameter("unsigned-integer", uint_value); call->withOutputParameterReturning("buffer", buffer_value, sizeof(buffer_value)); - STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0xa)>, unsigned int unsigned-integer: < 7 (0x7)>, " + STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0xa)>, unsigned int unsigned-integer: <7 (0x7)>, " "const void* buffer: ", call->callToString().asCharString()); } @@ -580,8 +580,8 @@ TEST(MockExpectedCallComposite, hasBoolParameter) TEST(MockExpectedCallComposite, hasLongIntParameter) { - composite.withParameter("param", (long int) -1); - STRCMP_EQUAL("name -> long int param: <-1 (0xffffffff)>", call.callToString().asCharString()); + composite.withParameter("param", (long int) 1); + STRCMP_EQUAL("name -> long int param: <1 (0x1)>", call.callToString().asCharString()); } TEST(MockExpectedCallComposite, hasUnsignedLongIntParameter) diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 535f29166..e0fb78cfb 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -753,10 +753,10 @@ TEST(SimpleString, BuildStringFromUnsignedLongInteger) TEST(SimpleString, BuildStringFromUnsignedInteger) { - unsigned int i = 0xffffffff; + unsigned int i = 0xff; SimpleString result = StringFrom(i); - const char* expected_string = "4294967295"; + const char* expected_string = "255"; CHECK_EQUAL(expected_string, result); } @@ -1054,9 +1054,9 @@ TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedLong) TEST(SimpleString, BracketsFormattedHexStringFromForInt) { - int value = 1; + int value = -1; - STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); + STRCMP_EQUAL("(0xffffffff)", BracketsFormattedHexStringFrom(value).asCharString()); } TEST(SimpleString, BracketsFormattedHexStringFromForLong) From 914dc221c90a9138cc94583059ac7b5ee84c7bce Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 26 May 2016 12:02:30 +0800 Subject: [PATCH 0013/1093] Added another stdc++14 option checking --- configure.ac | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index da9757b8c..c2ad3af06 100644 --- a/configure.ac +++ b/configure.ac @@ -86,28 +86,34 @@ AC_LANG_PUSH([C++]) ##### C++ 14 checks # FLag -std=c++1y -CXXFLAGS="-std=c++1y" +CXXFLAGS="-Werror -std=c++1y" AC_MSG_CHECKING([whether CXX supports -std=c++1y]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP14FLAG="-std=c++1y" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" +# FLag std=c++14 +CXXFLAGS="-Werror -std=c++14" +AC_MSG_CHECKING([whether CXX supports -std=c++14]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP14FLAG="-std=c++14" ], [AC_MSG_RESULT([no])]) +CXXFLAGS="$saved_cxxflags" + ##################################################################################### ##### C++ 11 checks ### Checking for Standard C++ 11 compiler flags # FLag -std=c++0x -CXXFLAGS="-std=c++0x" +CXXFLAGS="-Werror -std=c++0x" AC_MSG_CHECKING([whether CXX supports -std=c++0x]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP11FLAG="-std=c++0x" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" -CXXFLAGS="-std=c++11" +CXXFLAGS="-Werror -std=c++11" AC_MSG_CHECKING([whether CXX supports -std=c++11]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP11FLAG="-std=c++11" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" -CXXFLAGS="-stdlib=libc++" +CXXFLAGS="-Werror -stdlib=libc++" AC_MSG_CHECKING([whether CXX supports -stdlib=libc++]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP11FLAG="${CPPUTEST_CPP11FLAG} -stdlib=libc++" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" @@ -124,6 +130,12 @@ AC_MSG_CHECKING([whether CXX supports -Wno-c++98-compat-pedantic]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP11BLACKLIST="${CPPUTEST_CPP11BLACKLIST} -Wno-c++98-compat-pedantic" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" +# Flag -Wno-c++14-compat +CXXFLAGS="-Werror -Wno-c++14-compat" +AC_MSG_CHECKING([whether CXX supports -Wno-c++14-compat]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP11BLACKLIST="${CPPUTEST_CPP11BLACKLIST} -Wno-c++14-compat" ], [AC_MSG_RESULT([no])]) +CXXFLAGS="$saved_cxxflags" + AC_LANG_POP # FLag -Wno-c++11-long-long. This must be on if it is available as otherwise long long is supported but causes a warning. @@ -134,7 +146,7 @@ CFLAGS="$saved_cflags" # FLag -Wno-long-long must be on for C. CFLAGS="-Werror -Wno-long-long" -AC_MSG_CHECKING([whether CC supports -Wno-long-long]) +AC_MSG_CHECKING([whether CC and CXX supports -Wno-long-long]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wno-long-long" CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-long-long"], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" From 5a3f4f519d2b4e162143611cecc4096b5a51ae46 Mon Sep 17 00:00:00 2001 From: liu nick Date: Thu, 26 May 2016 22:33:50 +0800 Subject: [PATCH 0014/1093] add tests for bracketsFormattedHexString for long type on different platform --- tests/SimpleStringTest.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index e0fb78cfb..1e8720bd0 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -714,6 +714,13 @@ TEST(SimpleString, _64BitAddressPrintsCorrectly) STRCMP_EQUAL(expected.asCharString(), actual.asCharString()); } +TEST(SimpleString, BracketsFormattedHexStringFromForLongOnDifferentPlatform) +{ + long value = -1; + + STRCMP_EQUAL("(0xffffffffffffffff)", BracketsFormattedHexStringFrom(value).asCharString()); +} + #else /* * This test case should pass on 64 bit systems with 32 bit longs, @@ -722,7 +729,12 @@ TEST(SimpleString, _64BitAddressPrintsCorrectly) * different formats on different platforms. However, this will * need to be fixed in the future. */ +TEST(SimpleString, BracketsFormattedHexStringFromForLongOnDifferentPlatform) +{ + long value = -1; + STRCMP_EQUAL("(0xffffffff)", BracketsFormattedHexStringFrom(value).asCharString()); +} IGNORE_TEST(SimpleString, _64BitAddressPrintsCorrectly) { char* p = (char*) 0xffffffff; @@ -740,6 +752,12 @@ IGNORE_TEST(SimpleString, _64BitAddressPrintsCorrectly) { } +TEST(SimpleString, BracketsFormattedHexStringFromForLongOnDifferentPlatform) +{ + long value = -1; + + STRCMP_EQUAL("(0xffffffff)", BracketsFormattedHexStringFrom(value).asCharString()); +} #endif TEST(SimpleString, BuildStringFromUnsignedLongInteger) @@ -1092,4 +1110,4 @@ TEST(SimpleString, BracketsFormattedHexStringFromForULongLong) STRCMP_EQUAL("", BracketsFormattedHexStringFrom(value).asCharString()); } -#endif \ No newline at end of file +#endif From c2949c8b3e240e48e6e889dd3653bac6d31ade6e Mon Sep 17 00:00:00 2001 From: liu nick Date: Fri, 27 May 2016 22:30:02 +0800 Subject: [PATCH 0015/1093] add brackets hex string for SIGNED CHAR --- include/CppUTest/SimpleString.h | 1 + src/CppUTest/SimpleString.cpp | 5 +++++ src/CppUTest/TestFailure.cpp | 19 ++----------------- tests/TestUTestMacro.cpp | 12 ++++++------ 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index d534a9932..c8bbcb5eb 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -171,6 +171,7 @@ SimpleString BracketsFormattedHexStringFrom(long value); SimpleString BracketsFormattedHexStringFrom(unsigned long value); SimpleString BracketsFormattedHexStringFrom(cpputest_longlong value); SimpleString BracketsFormattedHexStringFrom(cpputest_ulonglong value); +SimpleString BracketsFormattedHexStringFrom(signed char value); SimpleString BracketsFormattedHexString(SimpleString hexString); diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 957ec4050..89dfcf499 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -524,6 +524,11 @@ SimpleString BracketsFormattedHexStringFrom(unsigned long value) return BracketsFormattedHexString(HexStringFrom(value)); } +SimpleString BracketsFormattedHexStringFrom(signed char value) +{ + return BracketsFormattedHexString(HexStringFrom(value)); +} + SimpleString BracketsFormattedHexString(SimpleString hexString) { return SimpleString("(0x") + hexString + ")" ; diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index 77198abf6..9b4fd69a9 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -242,12 +242,9 @@ LongsEqualFailure::LongsEqualFailure(UtestShell* test, const char* fileName, int message_ = createUserText(text); SimpleString aDecimal = StringFrom(actual); - SimpleString aHex = HexStringFrom(actual); SimpleString eDecimal = StringFrom(expected); - SimpleString eHex = HexStringFrom(expected); SimpleString::padStringsToSameLength(aDecimal, eDecimal, ' '); - SimpleString::padStringsToSameLength(aHex, eHex, '0'); SimpleString actualReported = aDecimal + " " + BracketsFormattedHexStringFrom(actual); SimpleString expectedReported = eDecimal + " " + BracketsFormattedHexStringFrom(expected); @@ -260,12 +257,9 @@ UnsignedLongsEqualFailure::UnsignedLongsEqualFailure(UtestShell* test, const cha message_ = createUserText(text); SimpleString aDecimal = StringFrom(actual); - SimpleString aHex = HexStringFrom(actual); SimpleString eDecimal = StringFrom(expected); - SimpleString eHex = HexStringFrom(expected); SimpleString::padStringsToSameLength(aDecimal, eDecimal, ' '); - SimpleString::padStringsToSameLength(aHex, eHex, '0'); SimpleString actualReported = aDecimal + " " + BracketsFormattedHexStringFrom(actual); SimpleString expectedReported = eDecimal + " " + BracketsFormattedHexStringFrom(expected); @@ -279,12 +273,9 @@ LongLongsEqualFailure::LongLongsEqualFailure(UtestShell* test, const char* fileN message_ = createUserText(text); SimpleString aDecimal = StringFrom(actual); - SimpleString aHex = HexStringFrom(actual); SimpleString eDecimal = StringFrom(expected); - SimpleString eHex = HexStringFrom(expected); SimpleString::padStringsToSameLength(aDecimal, eDecimal, ' '); - SimpleString::padStringsToSameLength(aHex, eHex, '0'); SimpleString actualReported = aDecimal + " " + BracketsFormattedHexStringFrom(actual); SimpleString expectedReported = eDecimal + " " + BracketsFormattedHexStringFrom(expected); @@ -297,12 +288,9 @@ UnsignedLongLongsEqualFailure::UnsignedLongLongsEqualFailure(UtestShell* test, c message_ = createUserText(text); SimpleString aDecimal = StringFrom(actual); - SimpleString aHex = HexStringFrom(actual); SimpleString eDecimal = StringFrom(expected); - SimpleString eHex = HexStringFrom(expected); SimpleString::padStringsToSameLength(aDecimal, eDecimal, ' '); - SimpleString::padStringsToSameLength(aHex, eHex, '0'); SimpleString actualReported = aDecimal + " " + BracketsFormattedHexStringFrom(actual); SimpleString expectedReported = eDecimal + " " + BracketsFormattedHexStringFrom(expected); @@ -315,15 +303,12 @@ SignedBytesEqualFailure::SignedBytesEqualFailure (UtestShell* test, const char* message_ = createUserText(text); SimpleString aDecimal = StringFrom((int)actual); - SimpleString aHex = HexStringFrom(actual); SimpleString eDecimal = StringFrom((int)expected); - SimpleString eHex = HexStringFrom(expected); SimpleString::padStringsToSameLength(aDecimal, eDecimal, ' '); - SimpleString::padStringsToSameLength(aHex, eHex, '0'); - SimpleString actualReported = aDecimal + " 0x" + aHex; - SimpleString expectedReported = eDecimal + " 0x" + eHex; + SimpleString actualReported = aDecimal + " " + BracketsFormattedHexStringFrom(actual); + SimpleString expectedReported = eDecimal + " " + BracketsFormattedHexStringFrom(expected); message_ += createButWasString(expectedReported, actualReported); } diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 7ac9f1d14..37effd7a1 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -596,11 +596,11 @@ TEST(UnitTestMacros, FailureWithSIGNED_BYTES_EQUAL) { fixture.runTestWithMethod(_failingTestMethodWithSIGNED_BYTES_EQUAL); #if CPPUTEST_CHAR_BIT == 16 - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-1 0xffff>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-2 0xfffe>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-1 (0xffff)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-2 (0xfffe)>"); #else - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-1 0xff>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-2 0xfe>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-1 (0xff)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-2 (0xfe)>"); #endif } @@ -624,8 +624,8 @@ static void _failingTestMethodWithSIGNED_BYTES_EQUAL_TEXT() TEST(UnitTestMacros, FailureWithSIGNED_BYTES_EQUAL_TEXT) { fixture.runTestWithMethod(_failingTestMethodWithSIGNED_BYTES_EQUAL_TEXT); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-127 0x81>"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-126 0x82>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-127 (0x81)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-126 (0x82)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); } From d9ffdb5c931e5974981b75a38538bf5a85019a35 Mon Sep 17 00:00:00 2001 From: liu nick Date: Fri, 27 May 2016 23:23:49 +0800 Subject: [PATCH 0016/1093] add macro to detect 16 bit integer --- include/CppUTest/CppUTestConfig.h | 12 ++++++++++++ tests/SimpleStringTest.cpp | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 9be2585ec..815b16aa0 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -201,6 +201,18 @@ #define CPPUTEST_CHAR_BIT 8 #endif +/* Handling of systems with a different int-width (e.g. 16 bit). + */ +#if CPPUTEST_USE_STD_C_LIB +#if (INT_MIN == 0xffff) && (INT_MAX == 0x7fff) +#define CPPUTEST_INT_BIT 2 +#else +#define CPPUTEST_INT_BIT 4 +#endif +#else +#define CPPUTEST_INT_BIT 4 +#endif + /* * Support for "long long" type. * diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 1e8720bd0..78b037211 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -1056,6 +1056,14 @@ TEST(SimpleString, StringFromOrdinalNumberOthers) STRCMP_EQUAL("101st", StringFromOrdinalNumber(101).asCharString()); } +TEST(SimpleString, BracketsFormattedHexStringFromForSignedChar) +{ + signed char value = 'c'; + + STRCMP_EQUAL("(0x63)", BracketsFormattedHexStringFrom(value).asCharString()); +} + + TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedInt) { unsigned int value = 1; @@ -1070,12 +1078,22 @@ TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedLong) STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); } +#if (CPPUTEST_INT_BIT == 4) TEST(SimpleString, BracketsFormattedHexStringFromForInt) { int value = -1; STRCMP_EQUAL("(0xffffffff)", BracketsFormattedHexStringFrom(value).asCharString()); } +#else +TEST(SimpleString, BracketsFormattedHexStringFromForInt) +{ + int value = -1; + + STRCMP_EQUAL("(0xffff)", BracketsFormattedHexStringFrom(value).asCharString()); +} + +#endif TEST(SimpleString, BracketsFormattedHexStringFromForLong) { @@ -1110,4 +1128,6 @@ TEST(SimpleString, BracketsFormattedHexStringFromForULongLong) STRCMP_EQUAL("", BracketsFormattedHexStringFrom(value).asCharString()); } + #endif + From 2f89f456128038dfb8b80e77ad1bc148ef406785 Mon Sep 17 00:00:00 2001 From: liu nick Date: Fri, 27 May 2016 23:23:49 +0800 Subject: [PATCH 0017/1093] add macro to detect 16 bit integer --- include/CppUTest/CppUTestConfig.h | 12 ++++++++++++ tests/SimpleStringTest.cpp | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 9be2585ec..7d1c70cee 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -201,6 +201,18 @@ #define CPPUTEST_CHAR_BIT 8 #endif +/* Handling of systems with a different int-width (e.g. 16 bit). + */ +#if CPPUTEST_USE_STD_C_LIB +#if (INT_MAX == 0x7fff) +#define CPPUTEST_INT_BIT 2 +#else +#define CPPUTEST_INT_BIT 4 +#endif +#else +#define CPPUTEST_INT_BIT 4 +#endif + /* * Support for "long long" type. * diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 1e8720bd0..78b037211 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -1056,6 +1056,14 @@ TEST(SimpleString, StringFromOrdinalNumberOthers) STRCMP_EQUAL("101st", StringFromOrdinalNumber(101).asCharString()); } +TEST(SimpleString, BracketsFormattedHexStringFromForSignedChar) +{ + signed char value = 'c'; + + STRCMP_EQUAL("(0x63)", BracketsFormattedHexStringFrom(value).asCharString()); +} + + TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedInt) { unsigned int value = 1; @@ -1070,12 +1078,22 @@ TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedLong) STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); } +#if (CPPUTEST_INT_BIT == 4) TEST(SimpleString, BracketsFormattedHexStringFromForInt) { int value = -1; STRCMP_EQUAL("(0xffffffff)", BracketsFormattedHexStringFrom(value).asCharString()); } +#else +TEST(SimpleString, BracketsFormattedHexStringFromForInt) +{ + int value = -1; + + STRCMP_EQUAL("(0xffff)", BracketsFormattedHexStringFrom(value).asCharString()); +} + +#endif TEST(SimpleString, BracketsFormattedHexStringFromForLong) { @@ -1110,4 +1128,6 @@ TEST(SimpleString, BracketsFormattedHexStringFromForULongLong) STRCMP_EQUAL("", BracketsFormattedHexStringFrom(value).asCharString()); } + #endif + From fde6c9566a746e5b5a6073bba868c76d96c0e8fe Mon Sep 17 00:00:00 2001 From: liu nick Date: Sat, 28 May 2016 21:01:26 +0800 Subject: [PATCH 0018/1093] use __WATCOMC__ to detect 16bits integer --- include/CppUTest/CppUTestConfig.h | 13 +++---------- tests/SimpleStringTest.cpp | 8 +++----- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 7d1c70cee..36e618df3 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -203,20 +203,13 @@ /* Handling of systems with a different int-width (e.g. 16 bit). */ -#if CPPUTEST_USE_STD_C_LIB -#if (INT_MAX == 0x7fff) -#define CPPUTEST_INT_BIT 2 -#else -#define CPPUTEST_INT_BIT 4 -#endif -#else -#define CPPUTEST_INT_BIT 4 +#if defined(__WATCOMC__) +#define CPPUTEST_16BIT_INTS #endif - /* * Support for "long long" type. * - * Not supported when CPUTEST_LONG_LONG_DISABLED is set. + * No-=- =-9----------------- =99t supported when CPUTEST_LONG_LONG_DISABLED is set. * Can be overridden by using CPPUTEST_USE_LONG_LONG * * CPPUTEST_HAVE_LONG_LONG_INT is set by configure diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 78b037211..332af87ed 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -1078,21 +1078,19 @@ TEST(SimpleString, BracketsFormattedHexStringFromForUnsignedLong) STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); } -#if (CPPUTEST_INT_BIT == 4) +#ifdef CPPUTEST_16BIT_INTS TEST(SimpleString, BracketsFormattedHexStringFromForInt) { int value = -1; - STRCMP_EQUAL("(0xffffffff)", BracketsFormattedHexStringFrom(value).asCharString()); + STRCMP_EQUAL("(0xffff)", BracketsFormattedHexStringFrom(value).asCharString()); } #else TEST(SimpleString, BracketsFormattedHexStringFromForInt) { int value = -1; - - STRCMP_EQUAL("(0xffff)", BracketsFormattedHexStringFrom(value).asCharString()); + STRCMP_EQUAL("(0xffffffff)", BracketsFormattedHexStringFrom(value).asCharString()); } - #endif TEST(SimpleString, BracketsFormattedHexStringFromForLong) From 95d5ab285e62d7b39eaa89f2abbf9ddb8308c5c3 Mon Sep 17 00:00:00 2001 From: liu nick Date: Sun, 29 May 2016 16:06:08 +0800 Subject: [PATCH 0019/1093] fix strange comment --- include/CppUTest/CppUTestConfig.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 36e618df3..846b795bd 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -209,7 +209,7 @@ /* * Support for "long long" type. * - * No-=- =-9----------------- =99t supported when CPUTEST_LONG_LONG_DISABLED is set. + * Not supported when CPUTEST_LONG_LONG_DISABLED is set. * Can be overridden by using CPPUTEST_USE_LONG_LONG * * CPPUTEST_HAVE_LONG_LONG_INT is set by configure From 83a1864b09309c739b77529bb5c1901228166642 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 30 May 2016 07:22:08 +0100 Subject: [PATCH 0020/1093] Set CPPUTEST_16BIT_INTS based on INT_MAX rather than __WATCOMC__ --- include/CppUTest/CppUTestConfig.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 846b795bd..69ec779a4 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -203,9 +203,10 @@ /* Handling of systems with a different int-width (e.g. 16 bit). */ -#if defined(__WATCOMC__) +#if CPPUTEST_USE_STD_C_LIB && (INT_MAX == 0x7fff) #define CPPUTEST_16BIT_INTS #endif + /* * Support for "long long" type. * From 9da1d9fff72a65b04de1177c4d58285a9819914b Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 30 May 2016 09:24:20 +0100 Subject: [PATCH 0021/1093] Add missing test for SignedBytesEqualFailure --- tests/TestFailureTest.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/TestFailureTest.cpp b/tests/TestFailureTest.cpp index 2ed86bfba..91bbd199d 100644 --- a/tests/TestFailureTest.cpp +++ b/tests/TestFailureTest.cpp @@ -163,6 +163,12 @@ TEST(TestFailure, UnsignedLongLongsEqualFailure) #endif } +TEST(TestFailure, SignedBytesEqualFailure) +{ + SignedBytesEqualFailure f(test, failFileName, failLineNumber, (signed char)-1, (signed char)2, ""); + FAILURE_EQUAL("expected <-1 (0xff)>\n\tbut was < 2 (0x2)>", f); +} + TEST(TestFailure, StringsEqualFailureWithText) { StringEqualFailure f(test, failFileName, failLineNumber, "abc", "abd", "text"); From ed957ef93a1addc961a00f35ac6d451e3e09c076 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 3 Jun 2016 12:44:54 +0200 Subject: [PATCH 0022/1093] Fix handling of -Wno-c++14-compat --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index c2ad3af06..1989aecda 100644 --- a/configure.ac +++ b/configure.ac @@ -133,7 +133,7 @@ CXXFLAGS="$saved_cxxflags" # Flag -Wno-c++14-compat CXXFLAGS="-Werror -Wno-c++14-compat" AC_MSG_CHECKING([whether CXX supports -Wno-c++14-compat]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP11BLACKLIST="${CPPUTEST_CPP11BLACKLIST} -Wno-c++14-compat" ], [AC_MSG_RESULT([no])]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-c++14-compat" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" AC_LANG_POP From aa4de8d93a9faff6e697eadf6101325b07ffa157 Mon Sep 17 00:00:00 2001 From: James Grenning Date: Sat, 4 Jun 2016 10:35:18 -0500 Subject: [PATCH 0023/1093] Added experimental feature to show the symbolic names used in LONGS_EQUAL in place of user text when no user text is provided --- include/CppUTest/UtestMacros.h | 2 +- src/CppUTest/TestFailure.cpp | 6 +++++- tests/TestUTestMacro.cpp | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index d38367d16..fa8910f87 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -191,7 +191,7 @@ //Check two long integers for equality #define LONGS_EQUAL(expected, actual)\ - LONGS_EQUAL_LOCATION((expected), (actual), NULL, __FILE__, __LINE__) + LONGS_EQUAL_LOCATION((expected), (actual), "LONGS_EQUAL(" #expected ", " #actual ") failed", __FILE__, __LINE__) #define LONGS_EQUAL_TEXT(expected, actual, text)\ LONGS_EQUAL_LOCATION((expected), (actual), text, __FILE__, __LINE__) diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index 9b4fd69a9..1a4b58406 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -162,7 +162,11 @@ SimpleString TestFailure::createUserText(const SimpleString& text) SimpleString userMessage = ""; if (!text.isEmpty()) { - userMessage += "Message: "; + //This is a kludge to turn off "Message: " for this case. + //I don't think "Message: " adds anything,a s you get to see the + //message. I propose we remove "Message: " lead in + if (!text.startsWith("LONGS_EQUAL")) + userMessage += "Message: "; userMessage += text; userMessage += "\n\t"; } diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 37effd7a1..8fac3f196 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -501,6 +501,23 @@ TEST(UnitTestMacros, FailureWithLONGS_EQUALS) CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <255 (0xff)>"); } +static void _failingTestMethodWithLONGS_EQUALWithSymbolicParameters() +{ +#define _MONDAY 1 + int day_of_the_week = _MONDAY+1; + LONGS_EQUAL(_MONDAY, day_of_the_week); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, FailureWithLONGS_EQUALShowsSymbolicParameters) +{ + fixture.runTestWithMethod(_failingTestMethodWithLONGS_EQUALWithSymbolicParameters); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("LONGS_EQUAL(_MONDAY, day_of_the_week) failed"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <2 (0x2)>"); + CHECK_FALSE(fixture.getOutput().contains("Message: ")); +} + TEST(UnitTestMacros, LONGS_EQUALBehavesAsProperMacro) { if (false) LONGS_EQUAL(1, 2) From 7f0a4a926f1d5e935b1b11527e26c75e901002e8 Mon Sep 17 00:00:00 2001 From: Gavin Lambert Date: Wed, 8 Jun 2016 19:02:14 +1200 Subject: [PATCH 0024/1093] Adds CHECK_EQUAL_C_BOOL to C TestHarness. --- include/CppUTest/TestHarness_c.h | 5 +++++ src/CppUTest/TestHarness_c.cpp | 5 +++++ tests/TestHarness_cTest.cpp | 17 +++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 50c6cd218..29206e2a0 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -36,6 +36,9 @@ #include "CppUTestConfig.h" +#define CHECK_EQUAL_C_BOOL(expected,actual) \ + CHECK_EQUAL_C_BOOL_LOCATION(expected,actual,__FILE__,__LINE__) + #define CHECK_EQUAL_C_INT(expected,actual) \ CHECK_EQUAL_C_INT_LOCATION(expected,actual,__FILE__,__LINE__) @@ -120,6 +123,8 @@ extern "C" /* CHECKS that can be used from C code */ +extern void CHECK_EQUAL_C_BOOL_LOCATION(int expected, int actual, + const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_INT_LOCATION(int expected, int actual, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_REAL_LOCATION(double expected, double actual, diff --git a/src/CppUTest/TestHarness_c.cpp b/src/CppUTest/TestHarness_c.cpp index 6fb9d3c29..aa55c43e7 100644 --- a/src/CppUTest/TestHarness_c.cpp +++ b/src/CppUTest/TestHarness_c.cpp @@ -35,6 +35,11 @@ extern "C" { +void CHECK_EQUAL_C_BOOL_LOCATION(int expected, int actual, const char* fileName, int lineNumber) +{ + UtestShell::getCurrent()->assertEquals(!!expected != !!actual, expected ? "true" : "false", actual ? "true" : "false", NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); +} + void CHECK_EQUAL_C_INT_LOCATION(int expected, int actual, const char* fileName, int lineNumber) { UtestShell::getCurrent()->assertLongsEqual((long)expected, (long)actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); diff --git a/tests/TestHarness_cTest.cpp b/tests/TestHarness_cTest.cpp index 9c7fde4ff..a7bd99e5c 100644 --- a/tests/TestHarness_cTest.cpp +++ b/tests/TestHarness_cTest.cpp @@ -83,6 +83,23 @@ TEST_GROUP(TestHarness_c) } }; +static void _failBoolMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_BOOL(1, 0); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkBool) +{ + CHECK_EQUAL_C_BOOL(1, 1); + CHECK_EQUAL_C_BOOL(1, 2); + fixture->setTestFunction(_failBoolMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected \n but was "); + fixture->assertPrintContains("arness_c"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failIntMethod() { HasTheDestructorBeenCalledChecker checker; From 071a18956f3b0842312420df2af5095f1cbda647 Mon Sep 17 00:00:00 2001 From: Gavin Lambert Date: Wed, 8 Jun 2016 19:36:49 +1200 Subject: [PATCH 0025/1093] Add CHECK_EQUAL_C_LONGLONG to C TestHarness. And the other int flavours for good measure. --- include/CppUTest/CppUTestConfig.h | 5 ++ include/CppUTest/TestHarness_c.h | 25 +++++++ src/CppUTest/TestHarness_c.cpp | 25 +++++++ tests/TestHarness_cTest.cpp | 114 ++++++++++++++++++++++++++++++ 4 files changed, 169 insertions(+) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 69ec779a4..bcb32de14 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -256,6 +256,11 @@ struct cpputest_ulonglong char dummy[CPPUTEST_SIZE_OF_FAKE_LONG_LONG_TYPE]; }; +#if !defined(__cplusplus) +typedef struct cpputest_longlong cpputest_longlong; +typedef struct cpputest_ulonglong cpputest_ulonglong; +#endif + #endif /* Visual C++ 10.0+ (2010+) supports the override keyword, but doesn't define the C++ version as C++11 */ diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 50c6cd218..607d51e59 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -39,6 +39,21 @@ #define CHECK_EQUAL_C_INT(expected,actual) \ CHECK_EQUAL_C_INT_LOCATION(expected,actual,__FILE__,__LINE__) +#define CHECK_EQUAL_C_UINT(expected,actual) \ + CHECK_EQUAL_C_UINT_LOCATION(expected,actual,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_LONG(expected,actual) \ + CHECK_EQUAL_C_LONG_LOCATION(expected,actual,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_ULONG(expected,actual) \ + CHECK_EQUAL_C_ULONG_LOCATION(expected,actual,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_LONGLONG(expected,actual) \ + CHECK_EQUAL_C_LONGLONG_LOCATION(expected,actual,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_ULONGLONG(expected,actual) \ + CHECK_EQUAL_C_ULONGLONG_LOCATION(expected,actual,__FILE__,__LINE__) + #define CHECK_EQUAL_C_REAL(expected,actual,threshold) \ CHECK_EQUAL_C_REAL_LOCATION(expected,actual,threshold,__FILE__,__LINE__) @@ -122,6 +137,16 @@ extern "C" /* CHECKS that can be used from C code */ extern void CHECK_EQUAL_C_INT_LOCATION(int expected, int actual, const char* fileName, int lineNumber); +extern void CHECK_EQUAL_C_UINT_LOCATION(unsigned int expected, unsigned int actual, + const char* fileName, int lineNumber); +extern void CHECK_EQUAL_C_LONG_LOCATION(long expected, long actual, + const char* fileName, int lineNumber); +extern void CHECK_EQUAL_C_ULONG_LOCATION(unsigned long expected, unsigned long actual, + const char* fileName, int lineNumber); +extern void CHECK_EQUAL_C_LONGLONG_LOCATION(cpputest_longlong expected, cpputest_longlong actual, + const char* fileName, int lineNumber); +extern void CHECK_EQUAL_C_ULONGLONG_LOCATION(cpputest_ulonglong expected, cpputest_ulonglong actual, + const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_REAL_LOCATION(double expected, double actual, double threshold, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_CHAR_LOCATION(char expected, char actual, diff --git a/src/CppUTest/TestHarness_c.cpp b/src/CppUTest/TestHarness_c.cpp index 6fb9d3c29..d965691ef 100644 --- a/src/CppUTest/TestHarness_c.cpp +++ b/src/CppUTest/TestHarness_c.cpp @@ -40,6 +40,31 @@ void CHECK_EQUAL_C_INT_LOCATION(int expected, int actual, const char* fileName, UtestShell::getCurrent()->assertLongsEqual((long)expected, (long)actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); } +void CHECK_EQUAL_C_UINT_LOCATION(unsigned int expected, unsigned int actual, const char* fileName, int lineNumber) +{ + UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); +} + +void CHECK_EQUAL_C_LONG_LOCATION(long expected, long actual, const char* fileName, int lineNumber) +{ + UtestShell::getCurrent()->assertLongsEqual(expected, actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); +} + +void CHECK_EQUAL_C_ULONG_LOCATION(unsigned long expected, unsigned long actual, const char* fileName, int lineNumber) +{ + UtestShell::getCurrent()->assertUnsignedLongsEqual(expected, actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); +} + +void CHECK_EQUAL_C_LONGLONG_LOCATION(cpputest_longlong expected, cpputest_longlong actual, const char* fileName, int lineNumber) +{ + UtestShell::getCurrent()->assertLongLongsEqual(expected, actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); +} + +void CHECK_EQUAL_C_ULONGLONG_LOCATION(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* fileName, int lineNumber) +{ + UtestShell::getCurrent()->assertUnsignedLongLongsEqual(expected, actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); +} + void CHECK_EQUAL_C_REAL_LOCATION(double expected, double actual, double threshold, const char* fileName, int lineNumber) { UtestShell::getCurrent()->assertDoublesEqual(expected, actual, threshold, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); diff --git a/tests/TestHarness_cTest.cpp b/tests/TestHarness_cTest.cpp index 9c7fde4ff..10f825acd 100644 --- a/tests/TestHarness_cTest.cpp +++ b/tests/TestHarness_cTest.cpp @@ -99,6 +99,120 @@ TEST(TestHarness_c, checkInt) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failUnsignedIntMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_UINT(1, 2); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkUnsignedInt) +{ + CHECK_EQUAL_C_UINT(2, 2); + fixture->setTestFunction(_failUnsignedIntMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); + fixture->assertPrintContains("arness_c"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + +static void _failLongIntMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_LONG(1, 2); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkLongInt) +{ + CHECK_EQUAL_C_LONG(2, 2); + fixture->setTestFunction(_failLongIntMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); + fixture->assertPrintContains("arness_c"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + +static void _failUnsignedLongIntMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_ULONG(1, 2); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkUnsignedLongInt) +{ + CHECK_EQUAL_C_ULONG(2, 2); + fixture->setTestFunction(_failUnsignedLongIntMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); + fixture->assertPrintContains("arness_c"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + +#ifdef CPPUTEST_USE_LONG_LONG + +static void _failLongLongIntMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_LONGLONG(1, 2); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkLongLongInt) +{ + CHECK_EQUAL_C_LONGLONG(2, 2); + fixture->setTestFunction(_failLongLongIntMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); + fixture->assertPrintContains("arness_c"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + +static void _failUnsignedLongLongIntMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_ULONGLONG(1, 2); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkUnsignedLongLongInt) +{ + CHECK_EQUAL_C_ULONGLONG(2, 2); + fixture->setTestFunction(_failUnsignedLongLongIntMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); + fixture->assertPrintContains("arness_c"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + +#else + +static void _failLongLongIntMethod() +{ + cpputest_longlong dummy_longlong; + CHECK_EQUAL_C_LONGLONG(dummy_longlong, dummy_longlong); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkLongLongInt) +{ + fixture->setTestFunction(_failLongLongIntMethod); + fixture->runAllTests(); + fixture->assertPrintContains("is not supported"); + fixture->assertPrintContains("arness_c"); +} + +static void _failUnsignedLongLongIntMethod() +{ + cpputest_ulonglong dummy_ulonglong; + CHECK_EQUAL_C_ULONGLONG(dummy_ulonglong, dummy_ulonglong); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkUnsignedLongLongInt) +{ + fixture->setTestFunction(_failUnsignedLongLongIntMethod); + fixture->runAllTests(); + fixture->assertPrintContains("is not supported"); + fixture->assertPrintContains("arness_c"); +} + +#endif + static void _failRealMethod() { HasTheDestructorBeenCalledChecker checker; From d32239aa4ff8c14b04b591ee11b53392ede5efdb Mon Sep 17 00:00:00 2001 From: Gavin Lambert Date: Wed, 8 Jun 2016 19:37:36 +1200 Subject: [PATCH 0026/1093] Some unrelated fixes for longlong-disabled builds. --- src/CppUTest/SimpleString.cpp | 4 ++-- tests/TestFailureTest.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 89dfcf499..6932d0b54 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -632,13 +632,13 @@ SimpleString HexStringFrom(void (*value)()) return StringFromFormat("%lx", convertFunctionPointerToLongValue(value)); } -SimpleString BracketsFormattedHexStringFrom(cpputest_longlong value) +SimpleString BracketsFormattedHexStringFrom(cpputest_longlong) { return ""; } -SimpleString BracketsFormattedHexStringFrom(cpputest_ulonglong value) +SimpleString BracketsFormattedHexStringFrom(cpputest_ulonglong) { return ""; } diff --git a/tests/TestFailureTest.cpp b/tests/TestFailureTest.cpp index 91bbd199d..a5da54352 100644 --- a/tests/TestFailureTest.cpp +++ b/tests/TestFailureTest.cpp @@ -147,7 +147,7 @@ TEST(TestFailure, LongLongsEqualFailure) #else cpputest_longlong dummy_longlong; LongLongsEqualFailure f(test, failFileName, failLineNumber, dummy_longlong, dummy_longlong, ""); - FAILURE_EQUAL("expected < 0x>\n\tbut was < 0x>", f); + FAILURE_EQUAL("expected < >\n\tbut was < >", f); #endif } @@ -159,7 +159,7 @@ TEST(TestFailure, UnsignedLongLongsEqualFailure) #else cpputest_ulonglong dummy_ulonglong; UnsignedLongLongsEqualFailure f(test, failFileName, failLineNumber, dummy_ulonglong, dummy_ulonglong, ""); - FAILURE_EQUAL("expected < 0x>\n\tbut was < 0x>", f); + FAILURE_EQUAL("expected < >\n\tbut was < >", f); #endif } From 1b3a7a169877ffa04c1a13b09e672d4c3e549f30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Hertzog?= Date: Fri, 17 Jun 2016 23:31:43 +0200 Subject: [PATCH 0027/1093] Portability fixes This patches fixes build failures on armel and m68k that do not seem to have working FENV support (changes to CppUTestConfig.h). It also fixes build failures on s390x, ppc64 and sparc64 which were failing a test due to them being big-endian architectures (changes to tests/CppUTestExt/MockSupport_cTest.cpp, typeCopy copies an "int" but the variables param and retval were defined as "long"). Fixes #1004 --- include/CppUTest/CppUTestConfig.h | 2 +- tests/CppUTestExt/MockSupport_cTest.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index bcb32de14..f06271ca1 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -174,7 +174,7 @@ #if CPPUTEST_USE_STD_C_LIB && (!defined(_MSC_VER) || (_MSC_VER >= 1800)) #define CPPUTEST_HAVE_FENV -#if defined(__WATCOMC__) +#if defined(__WATCOMC__) || defined(__ARMEL__) || defined(__m68k__) #define CPPUTEST_FENV_IS_WORKING_PROPERLY 0 #else #define CPPUTEST_FENV_IS_WORKING_PROPERLY 1 diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 8fc55ec70..5188857f3 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -186,8 +186,8 @@ TEST(MockSupport_c, outputParameters_differentType) TEST(MockSupport_c, outputParametersOfType) { - long param = 1; - const long retval = 2; + int param = 1; + const int retval = 2; mock_c()->installCopier("typeName", typeCopy); mock_c()->expectOneCall("foo")->withOutputParameterOfTypeReturning("typeName", "out", &retval); mock_c()->actualCall("foo")->withOutputParameterOfType("typeName", "out", ¶m); From b914c05589b331fa7bc82aedccbe31b80857b543 Mon Sep 17 00:00:00 2001 From: offa Date: Sun, 19 Jun 2016 13:29:26 +0200 Subject: [PATCH 0028/1093] Readme updated. --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f49c4bcdc..8d8a06781 100644 --- a/README.md +++ b/README.md @@ -96,8 +96,7 @@ The failure of one of these macros causes the current test to immediately exit Customize CHECK_EQUAL to work with your types that support operator==() -* Create the function: -** SimpleString StringFrom (const yourType&) +* Create the function: `SimpleString StringFrom(const yourType&)` The Extensions directory has a few of these. @@ -153,10 +152,8 @@ TEST(MemoryLeakWarningTest, Ignore1) int main(int ac, char** av) { - return CommandLineTestRunner::RunAllTests(ac, av); + return RUN_ALL_TESTS(ac, av); } - -IMPORT_TEST_GROUP(ClassName) ``` ## Example Test From e0c94c0dd458f42865d9f6e5683b28232b5cb763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Tue, 21 Jun 2016 21:50:48 +0200 Subject: [PATCH 0029/1093] Added a test that demonstrates that in certain circumstances the output parameters of an expected call which is not the call finally fulfilled are copied. --- tests/CppUTestExt/MockParameterTest.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 64f6d15f6..bd9cf0062 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -678,6 +678,29 @@ TEST(MockParameterTest, outputParameterWithIgnoredParameters) mock().actualCall("foo").withOutputParameter("bar", &retval).withParameter("other", 1); LONGS_EQUAL(param, retval); + + mock().checkExpectations(); +} + +/* + * This test checks that the proper output parameters are copied when multiple calls to the same + * function are expected. + */ +TEST(MockParameterTest, properOutputParametersAreCopied) +{ + int expectedValue1 = 1; + int expectedValue2 = 2; + mock().expectOneCall("foo").withOutputParameterReturning("param", &expectedValue1, sizeof(expectedValue1)).ignoreOtherParameters(); + mock().expectOneCall("foo").withOutputParameterReturning("param", &expectedValue2, sizeof(expectedValue2)); + + int returnedValue1 = 0; + int returnedValue2 = 0; + mock().actualCall("foo").withOutputParameter("param", &returnedValue1); + mock().actualCall("foo").withOutputParameter("param", &returnedValue2).withParameter("optional", 50); + + CHECK_EQUAL_TEXT(expectedValue2, returnedValue1, "Wrong output value in 1st call"); + CHECK_EQUAL_TEXT(expectedValue1, returnedValue2, "Wrong output value in 2nd call"); + mock().checkExpectations(); } From 8fbac347f29b6988c267ec9ca4804ea3cc988da6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Tue, 21 Jun 2016 21:53:45 +0200 Subject: [PATCH 0030/1093] Fixed a bug that copied the output parameters of an expected call that is not the finally fulfilled call. --- src/CppUTestExt/MockActualCall.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 219c10dbc..a7644dc53 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -105,13 +105,17 @@ void MockCheckedActualCall::finalizeOutputParameters(MockCheckedExpectedCall* ex void MockCheckedActualCall::finalizeCallWhenFulfilled() { - if (unfulfilledExpectations_.hasFulfilledExpectationsWithoutIgnoredParameters()) { - finalizeOutputParameters(unfulfilledExpectations_.getOneFulfilledExpectationWithIgnoredParameters()); - } + // Expectations that don't ignore parameters have higher fulfillment preference than those that ignore parameters - if (unfulfilledExpectations_.hasFulfilledExpectations()) { - fulfilledExpectation_ = unfulfilledExpectations_.removeOneFulfilledExpectation(); + fulfilledExpectation_ = unfulfilledExpectations_.removeOneFulfilledExpectation(); + if (fulfilledExpectation_) { + finalizeOutputParameters(fulfilledExpectation_); callHasSucceeded(); + } else { + MockCheckedExpectedCall* fulfilledExpectationWithIgnoredParameters = unfulfilledExpectations_.getOneFulfilledExpectationWithIgnoredParameters(); + if (fulfilledExpectationWithIgnoredParameters) { + finalizeOutputParameters(fulfilledExpectationWithIgnoredParameters); + } } } From ad5942c7d0116853e30b52e61ef665e00d25e3ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Tue, 21 Jun 2016 22:30:58 +0200 Subject: [PATCH 0031/1093] Removed MockExpectedCallsList methods that are no longer used. --- include/CppUTestExt/MockExpectedCallsList.h | 2 -- src/CppUTestExt/MockExpectedCallsList.cpp | 13 ------------- tests/CppUTestExt/ExpectedFunctionsListTest.cpp | 2 +- 3 files changed, 1 insertion(+), 16 deletions(-) diff --git a/include/CppUTestExt/MockExpectedCallsList.h b/include/CppUTestExt/MockExpectedCallsList.h index ea29b0f1c..115192dd8 100644 --- a/include/CppUTestExt/MockExpectedCallsList.h +++ b/include/CppUTestExt/MockExpectedCallsList.h @@ -43,8 +43,6 @@ class MockExpectedCallsList virtual int amountOfExpectationsFor(const SimpleString& name) const; virtual int amountOfUnfulfilledExpectations() const; virtual bool hasUnfulfilledExpectations() const; - virtual bool hasFulfilledExpectations() const; - virtual bool hasFulfilledExpectationsWithoutIgnoredParameters() const; virtual bool hasUnfulfilledExpectationsBecauseOfMissingParameters() const; virtual bool hasExpectationWithName(const SimpleString& name) const; virtual bool hasCallsOutOfOrder() const; diff --git a/src/CppUTestExt/MockExpectedCallsList.cpp b/src/CppUTestExt/MockExpectedCallsList.cpp index 06d0643ce..e34ca4125 100644 --- a/src/CppUTestExt/MockExpectedCallsList.cpp +++ b/src/CppUTestExt/MockExpectedCallsList.cpp @@ -81,19 +81,6 @@ int MockExpectedCallsList::amountOfUnfulfilledExpectations() const return count; } -bool MockExpectedCallsList::hasFulfilledExpectations() const -{ - return (size() - amountOfUnfulfilledExpectations()) != 0; -} - -bool MockExpectedCallsList::hasFulfilledExpectationsWithoutIgnoredParameters() const -{ - for (MockExpectedCallsListNode* p = head_; p; p = p->next_) - if (p->expectedCall_->isFulfilledWithoutIgnoredParameters()) - return true; - return false; -} - bool MockExpectedCallsList::hasUnfulfilledExpectations() const { return amountOfUnfulfilledExpectations() != 0; diff --git a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp index 1c374bece..da0ec90aa 100644 --- a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp +++ b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp @@ -63,7 +63,7 @@ TEST_GROUP(MockExpectedCallsList) TEST(MockExpectedCallsList, emptyList) { CHECK(! list->hasUnfulfilledExpectations()); - CHECK(! list->hasFulfilledExpectations()); + CHECK(list->size() == list->amountOfUnfulfilledExpectations()); LONGS_EQUAL(0, list->size()); } From 6b06b1373c75eb8404dc029a749a7c7d7a21cee7 Mon Sep 17 00:00:00 2001 From: Uwe Koloska Date: Fri, 1 Jul 2016 16:11:13 +0200 Subject: [PATCH 0032/1093] fix conversion from double to int these warnings are treated as errors and thus make the MSVC build fail --- tests/CppUTestExt/MockSupport_cTestCFile.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index 38155c7a5..36564eea5 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -100,15 +100,15 @@ void all_mock_support_c_calls(void) mock_c()->intReturnValue(); mock_c()->returnValue(); - mock_c()->expectOneCall("boo2")->andReturnUnsignedIntValue(1.0); + mock_c()->expectOneCall("boo2")->andReturnUnsignedIntValue(1); mock_c()->actualCall("boo2")->unsignedIntReturnValue(); mock_c()->unsignedIntReturnValue(); - mock_c()->expectOneCall("boo3")->andReturnLongIntValue(1.0); + mock_c()->expectOneCall("boo3")->andReturnLongIntValue(1); mock_c()->actualCall("boo3")->longIntReturnValue(); mock_c()->longIntReturnValue(); - mock_c()->expectOneCall("boo3")->andReturnUnsignedLongIntValue(1.0); + mock_c()->expectOneCall("boo3")->andReturnUnsignedLongIntValue(1); mock_c()->actualCall("boo3")->unsignedLongIntReturnValue(); mock_c()->unsignedLongIntReturnValue(); From 7e14df2a72629dd260e6255abc2e83e5a5aca3f9 Mon Sep 17 00:00:00 2001 From: Arno Moonen Date: Mon, 4 Jul 2016 17:39:23 +0200 Subject: [PATCH 0033/1093] Processed feedback from @basvodde on PR #1010. - Undid the changes to the `withTest` method. - Added methods `inFile` and `onLine`. - Added tests specifically to test the output of the test location. --- tests/JUnitOutputTest.cpp | 158 ++++++++++++++++++++++++-------------- 1 file changed, 100 insertions(+), 58 deletions(-) diff --git a/tests/JUnitOutputTest.cpp b/tests/JUnitOutputTest.cpp index 65476d935..d9f72e344 100644 --- a/tests/JUnitOutputTest.cpp +++ b/tests/JUnitOutputTest.cpp @@ -214,21 +214,37 @@ class JUnitTestOutputTestRunner return *this; } - JUnitTestOutputTestRunner &withTest(const char *testName, const char *fileName, int lineNumber) + JUnitTestOutputTestRunner& withTest(const char* testName) { runPreviousTest(); delete currentTest_; - currentTest_ = new UtestShell(currentGroupName_, testName, fileName, lineNumber); + currentTest_ = new UtestShell(currentGroupName_, testName, "file", 1); return *this; } - JUnitTestOutputTestRunner &withIgnoredTest(const char *testName, const char *fileName, int lineNumber) + JUnitTestOutputTestRunner& withIgnoredTest(const char* testName) { runPreviousTest(); delete currentTest_; - currentTest_ = new IgnoredUtestShell(currentGroupName_, testName, fileName, lineNumber); + currentTest_ = new IgnoredUtestShell(currentGroupName_, testName, "file", 1); + return *this; + } + + JUnitTestOutputTestRunner& inFile(const char* fileName) + { + if(currentTest_) { + currentTest_->setFileName(fileName); + } + return *this; + } + + JUnitTestOutputTestRunner& onLine(int lineNumber) + { + if(currentTest_) { + currentTest_->setLineNumber(lineNumber); + } return *this; } @@ -335,7 +351,7 @@ TEST_GROUP(JUnitOutputTest) TEST(JUnitOutputTest, withOneTestGroupAndOneTestOnlyWriteToOneFile) { testCaseRunner->start() - .withGroup("groupname").withTest("testname", "sourcefile.c", 123) + .withGroup("groupname").withTest("testname") .end(); LONGS_EQUAL(1, fileSystem.amountOfFiles()); @@ -345,7 +361,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestOnlyWriteToOneFile) TEST(JUnitOutputTest, withOneTestGroupAndOneTestOutputsValidXMLFiles) { testCaseRunner->start() - .withGroup("groupname").withTest("testname", "sourcefile.c", 123) + .withGroup("groupname").withTest("testname") .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); @@ -355,7 +371,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestOutputsValidXMLFiles) TEST(JUnitOutputTest, withOneTestGroupAndOneTestOutputsTestSuiteStartAndEndBlocks) { testCaseRunner->start() - .withGroup("groupname").withTest("testname", "sourcefile.c", 123) + .withGroup("groupname").withTest("testname") .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); @@ -366,7 +382,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestOutputsTestSuiteStartAndEndBlock TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyPropertiesBlock) { testCaseRunner->start() - .withGroup("groupname").withTest("testname", "sourcefile.c", 123) + .withGroup("groupname").withTest("testname") .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); @@ -377,7 +393,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyProperti TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyStdoutBlock) { testCaseRunner->start() - .withGroup("groupname").withTest("testname", "sourcefile.c", 123) + .withGroup("groupname").withTest("testname") .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); @@ -387,7 +403,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyStdoutBl TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyStderrBlock) { testCaseRunner->start() - .withGroup("groupname").withTest("testname", "sourcefile.c", 123) + .withGroup("groupname").withTest("testname") .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); @@ -397,36 +413,34 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyStderrBl TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainsATestCaseBlock) { testCaseRunner->start() - .withGroup("groupname").withTest("testname", "sourcefile.c", 123) + .withGroup("groupname").withTest("testname") .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); } TEST(JUnitOutputTest, withOneTestGroupAndTwoTestCasesCreateCorrectTestgroupBlockAndCorrectTestCaseBlock) { testCaseRunner->start() - .withGroup("twoTestsGroup") - .withTest("firstTestName", "source1.c", 123) - .withTest("secondTestName", "source2.c", 234) + .withGroup("twoTestsGroup").withTest("firstTestName").withTest("secondTestName") .end(); outputFile = fileSystem.file("cpputest_twoTestsGroup.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); - STRCMP_EQUAL("\n", outputFile->line(7)); + STRCMP_EQUAL("\n", outputFile->line(7)); STRCMP_EQUAL("\n", outputFile->line(8)); } TEST(JUnitOutputTest, withOneTestGroupAndTimeHasElapsedAndTimestampChanged) { testCaseRunner->start().atTime("2013-07-04T22:28:00") - .withGroup("timeGroup").withTest("Dummy", "sourcefile.c", 123).thatTakes(10).seconds() + .withGroup("timeGroup").withTest("Dummy").thatTakes(10).seconds() .end(); outputFile = fileSystem.file("cpputest_timeGroup.xml"); @@ -438,15 +452,15 @@ TEST(JUnitOutputTest, withOneTestGroupAndMultipleTestCasesWithElapsedTime) { testCaseRunner->start() .withGroup("twoTestsGroup") - .withTest("firstTestName", "source1.c", 123).thatTakes(10).seconds() - .withTest("secondTestName", "source2.c", 234).thatTakes(50).seconds() + .withTest("firstTestName").thatTakes(10).seconds() + .withTest("secondTestName").thatTakes(50).seconds() .end(); outputFile = fileSystem.file("cpputest_twoTestsGroup.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); - STRCMP_EQUAL("\n", outputFile->line(7)); + STRCMP_EQUAL("\n", outputFile->line(7)); STRCMP_EQUAL("\n", outputFile->line(8)); } @@ -454,12 +468,12 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneFailingTest) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FailingTestName", "sourcefile.c", 123).thatFails("Test failed", "thisfile", 10) + .withTest("FailingTestName").thatFails("Test failed", "thisfile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); STRCMP_EQUAL("\n", outputFile->line(7)); STRCMP_EQUAL("\n", outputFile->line(8)); @@ -469,14 +483,14 @@ TEST(JUnitOutputTest, withTwoTestGroupAndOneFailingTest) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FirstTest", "sourcefile.c", 123) - .withTest("FailingTestName", "sourcefile.c", 123).thatFails("Test failed", "thisfile", 10) + .withTest("FirstTest") + .withTest("FailingTestName").thatFails("Test failed", "thisfile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("\n", outputFile->line(7)); + STRCMP_EQUAL("\n", outputFile->line(7)); STRCMP_EQUAL("\n", outputFile->line(8)); } @@ -484,7 +498,7 @@ TEST(JUnitOutputTest, testFailureWithLessThanAndGreaterThanInsideIt) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FailingTestName", "sourcefile.c", 123).thatFails("Test ", "thisfile", 10) + .withTest("FailingTestName").thatFails("Test ", "thisfile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); @@ -496,7 +510,7 @@ TEST(JUnitOutputTest, testFailureWithQuotesInIt) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FailingTestName", "sourcefile.c", 123).thatFails("Test \"failed\"", "thisfile", 10) + .withTest("FailingTestName").thatFails("Test \"failed\"", "thisfile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); @@ -508,7 +522,7 @@ TEST(JUnitOutputTest, testFailureWithNewlineInIt) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FailingTestName", "sourcefile.c", 123).thatFails("Test \nfailed", "thisfile", 10) + .withTest("FailingTestName").thatFails("Test \nfailed", "thisfile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); @@ -520,7 +534,7 @@ TEST(JUnitOutputTest, testFailureWithDifferentFileAndLine) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FailingTestName", "sourcefile.c", 123).thatFails("Test failed", "importantFile", 999) + .withTest("FailingTestName").thatFails("Test failed", "importantFile", 999) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); @@ -532,7 +546,7 @@ TEST(JUnitOutputTest, testFailureWithAmpersands) { testCaseRunner->start() .withGroup("testGroupWithFailingTest") - .withTest("FailingTestName", "sourcefile.c", 123).thatFails("&object1 != &object2", "importantFile", 999) + .withTest("FailingTestName").thatFails("&object1 != &object2", "importantFile", 999) .end(); outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); @@ -544,11 +558,11 @@ TEST(JUnitOutputTest, aCoupleOfTestFailures) { testCaseRunner->start() .withGroup("testGroup") - .withTest("passingOne", "sourcefile.c", 123) - .withTest("FailingTest", "sourcefile.c", 123).thatFails("Failure", "file", 99) - .withTest("passingTwo", "sourcefile.c", 123) - .withTest("passingThree", "sourcefile.c", 123) - .withTest("AnotherFailingTest", "sourcefile.c", 123).thatFails("otherFailure", "anotherFile", 10) + .withTest("passingOne") + .withTest("FailingTest").thatFails("Failure", "file", 99) + .withTest("passingTwo") + .withTest("passingThree") + .withTest("AnotherFailingTest").thatFails("otherFailure", "anotherFile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroup.xml"); @@ -561,10 +575,10 @@ TEST(JUnitOutputTest, testFailuresInSeparateGroups) { testCaseRunner->start() .withGroup("testGroup") - .withTest("passingOne", "sourcefile.c", 123) - .withTest("FailingTest", "sourcefile.c", 123).thatFails("Failure", "file", 99) + .withTest("passingOne") + .withTest("FailingTest").thatFails("Failure", "file", 99) .withGroup("AnotherGroup") - .withTest("AnotherFailingTest", "sourcefile.c", 123).thatFails("otherFailure", "anotherFile", 10) + .withTest("AnotherFailingTest").thatFails("otherFailure", "anotherFile", 10) .end(); outputFile = fileSystem.file("cpputest_testGroup.xml"); @@ -579,9 +593,9 @@ TEST(JUnitOutputTest, twoTestGroupsWriteToTwoDifferentFiles) { testCaseRunner->start() .withGroup("firstTestGroup") - .withTest("testName", "sourcefile.c", 123) + .withTest("testName") .withGroup("secondTestGroup") - .withTest("testName", "sourcefile.c", 123) + .withTest("testName") .end(); CHECK(fileSystem.file("cpputest_firstTestGroup.xml")); @@ -598,70 +612,98 @@ TEST(JUnitOutputTest, TestCaseBlockWithAPackageName) { junitOutput->setPackageName("packagename"); testCaseRunner->start() - .withGroup("groupname").withTest("testname", "sourcefile.c", 123) + .withGroup("groupname").withTest("testname") .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); } TEST(JUnitOutputTest, TestCaseBlockForIgnoredTest) { junitOutput->setPackageName("packagename"); - testCaseRunner->start() - .withGroup("groupname").withIgnoredTest("testname", "sourcefile.c", 123) + testCaseRunner->start() + .withGroup("groupname").withIgnoredTest("testname") .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); STRCMP_EQUAL("\n", outputFile->line(7)); } +TEST(JUnitOutputTest, TestCaseWithTestLocation) +{ + junitOutput->setPackageName("packagename"); + testCaseRunner->start() + .withGroup("groupname") + .withTest("testname").inFile("MySource.c").onLine(159) + .end(); + + outputFile = fileSystem.file("cpputest_groupname.xml"); + + STRCMP_EQUAL("\n", outputFile->line(5)); +} + +TEST(JUnitOutputTest, MultipleTestCaseWithTestLocations) +{ + testCaseRunner->start() + .withGroup("twoTestsGroup") + .withTest("firstTestName").inFile("MyFirstSource.c").onLine(846) + .withTest("secondTestName").inFile("MySecondSource.c").onLine(513) + .end(); + + outputFile = fileSystem.file("cpputest_twoTestsGroup.xml"); + + STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(7)); +} + TEST(JUnitOutputTest, TestCaseBlockWithAssertions) { junitOutput->setPackageName("packagename"); testCaseRunner->start() - .withGroup("groupname").withTest("testname", "sourcefile.c", 123).thatHasChecks(24) + .withGroup("groupname") + .withTest("testname") + .thatHasChecks(24) .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); - STRCMP_EQUAL("\n", outputFile->line(6)); + STRCMP_EQUAL("\n", outputFile->line(5)); } TEST(JUnitOutputTest, MultipleTestCaseBlocksWithAssertions) { testCaseRunner->start() .withGroup("twoTestsGroup") - .withTest("firstTestName", "source1.c", 123).thatHasChecks(456) - .withTest("secondTestName", "source2.c", 234).thatHasChecks(567) + .withTest("firstTestName").thatHasChecks(456) + .withTest("secondTestName").thatHasChecks(567) .end(); outputFile = fileSystem.file("cpputest_twoTestsGroup.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); - STRCMP_EQUAL("\n", outputFile->line(7)); + STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(7)); } TEST(JUnitOutputTest, MultipleTestCasesInDifferentGroupsWithAssertions) { testCaseRunner->start() .withGroup("groupOne") - .withTest("testA", "source1.c", 123).thatHasChecks(456) + .withTest("testA").thatHasChecks(456) .endGroupAndClearTest() .withGroup("groupTwo") - .withTest("testB", "source2.c", 456).thatHasChecks(678) + .withTest("testB").thatHasChecks(678) .end(); outputFile = fileSystem.file("cpputest_groupOne.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); outputFile = fileSystem.file("cpputest_groupTwo.xml"); - STRCMP_EQUAL("\n", outputFile->line(5)); + STRCMP_EQUAL("\n", outputFile->line(5)); } From ade8bbfa02606ed9c4a924ece32d34a20f2f8e86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Tue, 21 Jun 2016 23:30:10 +0200 Subject: [PATCH 0034/1093] Preparation of mock library in order to add support for expected calls that can match many actual calls (i.e. range of calls). The changes are for now just semantic: The nomenclature of "expectation fulfillment"-related methods has been changed, and also some methods have been duplicated and renamed, because expected calls will soon be able to fulfill (match) more than one single actual call, and therefore some of the internal state of expected calls will be devoted to check if the expected call matches the actual call that is being processed, and other state will check if the expected call is fulfilled as a whole (i.e. it has been called/matched a minimum number of times). --- include/CppUTestExt/MockCheckedActualCall.h | 8 +- include/CppUTestExt/MockCheckedExpectedCall.h | 21 ++--- include/CppUTestExt/MockExpectedCallsList.h | 15 ++-- include/CppUTestExt/MockSupport.h | 6 +- src/CppUTestExt/MockActualCall.cpp | 88 ++++++++++--------- src/CppUTestExt/MockExpectedCall.cpp | 70 ++++++++------- src/CppUTestExt/MockExpectedCallsList.cpp | 56 +++++++----- src/CppUTestExt/MockSupport.cpp | 16 ++-- .../CppUTestExt/ExpectedFunctionsListTest.cpp | 24 ++--- tests/CppUTestExt/MockParameterTest.cpp | 2 +- 10 files changed, 165 insertions(+), 141 deletions(-) diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index f4606cf17..f8d53cc9c 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -100,8 +100,8 @@ class MockCheckedActualCall : public MockActualCall SimpleString getName() const; virtual UtestShell* getTest() const; virtual void callHasSucceeded(); - virtual void finalizeOutputParameters(MockCheckedExpectedCall* call); - virtual void finalizeCallWhenFulfilled(); + virtual void copyOutputParameters(MockCheckedExpectedCall* call); + virtual void completeCallWhenMatchIsFound(); virtual void failTest(const MockFailure& failure); virtual void checkInputParameter(const MockNamedValue& actualParameter); virtual void checkOutputParameter(const MockNamedValue& outputParameter); @@ -120,9 +120,9 @@ class MockCheckedActualCall : public MockActualCall MockFailureReporter* reporter_; ActualCallState state_; - MockCheckedExpectedCall* fulfilledExpectation_; + MockCheckedExpectedCall* matchingExpectation_; - MockExpectedCallsList unfulfilledExpectations_; + MockExpectedCallsList potentiallyMatchingExpectations_; const MockExpectedCallsList& allExpectations_; class MockOutputParametersListNode diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index e3f3725af..b183d896d 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -84,17 +84,18 @@ class MockCheckedExpectedCall : public MockExpectedCall virtual bool relatesToObject(const void* objectPtr) const; virtual bool isFulfilled(); - virtual bool isFulfilledWithoutIgnoredParameters(); - virtual bool areParametersFulfilled(); - virtual bool areIgnoredParametersFulfilled(); + virtual bool canMatchActualCalls(); + virtual bool isMatchingActualCallAndFinalized(); + virtual bool isMatchingActualCall(); + virtual bool areParametersMatchingActualCall(); virtual bool isOutOfOrder() const; virtual void callWasMade(int callOrder); virtual void inputParameterWasPassed(const SimpleString& name); virtual void outputParameterWasPassed(const SimpleString& name); - virtual void parametersWereIgnored(); + virtual void finalizeActualCallMatch(); virtual void wasPassedToObject(); - virtual void resetExpectation(); + virtual void resetActualCallMatchingState(); virtual SimpleString callToString(); virtual SimpleString missingParametersToString(); @@ -113,18 +114,18 @@ class MockCheckedExpectedCall : public MockExpectedCall { public: MockExpectedFunctionParameter(const SimpleString& name); - void setFulfilled(bool b); - bool isFulfilled() const; + void setMatchesActualCall(bool b); + bool isMatchingActualCall() const; private: - bool fulfilled_; + bool matchesActualCall_; }; MockExpectedFunctionParameter* item(MockNamedValueListNode* node); bool ignoreOtherParameters_; - bool parametersWereIgnored_; - int callOrder_; + bool isActualCallMatchFinalized_; + int actualCallOrder_; int expectedCallOrder_; bool outOfOrder_; MockNamedValueList* inputParameters_; diff --git a/include/CppUTestExt/MockExpectedCallsList.h b/include/CppUTestExt/MockExpectedCallsList.h index 115192dd8..479f31fdd 100644 --- a/include/CppUTestExt/MockExpectedCallsList.h +++ b/include/CppUTestExt/MockExpectedCallsList.h @@ -43,7 +43,8 @@ class MockExpectedCallsList virtual int amountOfExpectationsFor(const SimpleString& name) const; virtual int amountOfUnfulfilledExpectations() const; virtual bool hasUnfulfilledExpectations() const; - virtual bool hasUnfulfilledExpectationsBecauseOfMissingParameters() const; + virtual bool hasFinalizedMatchingExpectations() const; + virtual bool hasUnmatchingExpectationsBecauseOfMissingParameters() const; virtual bool hasExpectationWithName(const SimpleString& name) const; virtual bool hasCallsOutOfOrder() const; virtual bool isEmpty() const; @@ -53,7 +54,7 @@ class MockExpectedCallsList virtual void addExpectationsRelatedTo(const SimpleString& name, const MockExpectedCallsList& list); virtual void onlyKeepOutOfOrderExpectations(); - virtual void addUnfulfilledExpectations(const MockExpectedCallsList& list); + virtual void addPotentiallyMatchingExpectations(const MockExpectedCallsList& list); virtual void onlyKeepExpectationsRelatedTo(const SimpleString& name); virtual void onlyKeepExpectationsWithInputParameter(const MockNamedValue& parameter); @@ -61,13 +62,13 @@ class MockExpectedCallsList virtual void onlyKeepExpectationsWithOutputParameter(const MockNamedValue& parameter); virtual void onlyKeepExpectationsWithOutputParameterName(const SimpleString& name); virtual void onlyKeepExpectationsOnObject(const void* objectPtr); - virtual void onlyKeepUnfulfilledExpectations(); + virtual void onlyKeepUnmatchingExpectations(); - virtual MockCheckedExpectedCall* removeOneFulfilledExpectation(); - virtual MockCheckedExpectedCall* removeOneFulfilledExpectationWithIgnoredParameters(); - virtual MockCheckedExpectedCall* getOneFulfilledExpectationWithIgnoredParameters(); + virtual MockCheckedExpectedCall* removeFirstFinalizedMatchingExpectation(); + virtual MockCheckedExpectedCall* removeFirstMatchingExpectation(); + virtual MockCheckedExpectedCall* getFirstMatchingExpectation(); - virtual void resetExpectations(); + virtual void resetActualCallMatchingState(); virtual void callWasMade(int callOrder); virtual void wasPassedToObject(); virtual void parameterWasPassed(const SimpleString& parameterName); diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index e58bf2a57..7cb611218 100755 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -124,7 +124,7 @@ class MockSupport void countCheck(); private: - int callOrder_; + int actualCallOrder_; int expectedCallOrder_; bool strictOrdering_; MockFailureReporter *activeReporter_; @@ -142,8 +142,8 @@ class MockSupport bool tracing_; - void checkExpectationsOfLastCall(); - bool wasLastCallFulfilled(); + void checkExpectationsOfLastActualCall(); + bool wasLastActualCallFulfilled(); void failTestWithUnexpectedCalls(); void failTestWithOutOfOrderCalls(); diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index a7644dc53..3fde51f2c 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -50,9 +50,9 @@ SimpleString MockCheckedActualCall::getName() const } MockCheckedActualCall::MockCheckedActualCall(int callOrder, MockFailureReporter* reporter, const MockExpectedCallsList& allExpectations) - : callOrder_(callOrder), reporter_(reporter), state_(CALL_SUCCEED), fulfilledExpectation_(NULL), allExpectations_(allExpectations), outputParameterExpectations_(NULL) + : callOrder_(callOrder), reporter_(reporter), state_(CALL_SUCCEED), matchingExpectation_(NULL), allExpectations_(allExpectations), outputParameterExpectations_(NULL) { - unfulfilledExpectations_.addUnfulfilledExpectations(allExpectations); + potentiallyMatchingExpectations_.addPotentiallyMatchingExpectations(allExpectations); } MockCheckedActualCall::~MockCheckedActualCall() @@ -78,7 +78,7 @@ void MockCheckedActualCall::failTest(const MockFailure& failure) } } -void MockCheckedActualCall::finalizeOutputParameters(MockCheckedExpectedCall* expectedCall) +void MockCheckedActualCall::copyOutputParameters(MockCheckedExpectedCall* expectedCall) { for (MockOutputParametersListNode* p = outputParameterExpectations_; p; p = p->next_) { @@ -103,19 +103,19 @@ void MockCheckedActualCall::finalizeOutputParameters(MockCheckedExpectedCall* ex } } -void MockCheckedActualCall::finalizeCallWhenFulfilled() +void MockCheckedActualCall::completeCallWhenMatchIsFound() { - // Expectations that don't ignore parameters have higher fulfillment preference than those that ignore parameters + // Expectations that don't ignore parameters have higher fulfillment preference than those that ignore parameters - fulfilledExpectation_ = unfulfilledExpectations_.removeOneFulfilledExpectation(); - if (fulfilledExpectation_) { - finalizeOutputParameters(fulfilledExpectation_); + matchingExpectation_ = potentiallyMatchingExpectations_.removeFirstFinalizedMatchingExpectation(); + if (matchingExpectation_) { + copyOutputParameters(matchingExpectation_); callHasSucceeded(); } else { - MockCheckedExpectedCall* fulfilledExpectationWithIgnoredParameters = unfulfilledExpectations_.getOneFulfilledExpectationWithIgnoredParameters(); - if (fulfilledExpectationWithIgnoredParameters) { - finalizeOutputParameters(fulfilledExpectationWithIgnoredParameters); - } + MockCheckedExpectedCall* matchingExpectationWithIgnoredParameters = potentiallyMatchingExpectations_.getFirstMatchingExpectation(); + if (matchingExpectationWithIgnoredParameters) { + copyOutputParameters(matchingExpectationWithIgnoredParameters); + } } } @@ -127,12 +127,12 @@ void MockCheckedActualCall::callHasSucceeded() void MockCheckedActualCall::callIsInProgress() { setState(CALL_IN_PROGRESS); - if (fulfilledExpectation_) + if (matchingExpectation_) { - fulfilledExpectation_->resetExpectation(); - fulfilledExpectation_ = NULL; + matchingExpectation_->resetActualCallMatchingState(); + matchingExpectation_ = NULL; } - unfulfilledExpectations_.onlyKeepUnfulfilledExpectations(); + potentiallyMatchingExpectations_.onlyKeepUnmatchingExpectations(); } MockActualCall& MockCheckedActualCall::withName(const SimpleString& name) @@ -140,16 +140,15 @@ MockActualCall& MockCheckedActualCall::withName(const SimpleString& name) setName(name); callIsInProgress(); - unfulfilledExpectations_.onlyKeepExpectationsRelatedTo(name); - if (unfulfilledExpectations_.isEmpty()) { + potentiallyMatchingExpectations_.onlyKeepExpectationsRelatedTo(name); + if (potentiallyMatchingExpectations_.isEmpty()) { MockUnexpectedCallHappenedFailure failure(getTest(), name, allExpectations_); failTest(failure); return *this; } - unfulfilledExpectations_.callWasMade(callOrder_); - - finalizeCallWhenFulfilled(); + potentiallyMatchingExpectations_.callWasMade(callOrder_); + completeCallWhenMatchIsFound(); return *this; } @@ -168,16 +167,16 @@ void MockCheckedActualCall::checkInputParameter(const MockNamedValue& actualPara callIsInProgress(); - unfulfilledExpectations_.onlyKeepExpectationsWithInputParameter(actualParameter); + potentiallyMatchingExpectations_.onlyKeepExpectationsWithInputParameter(actualParameter); - if (unfulfilledExpectations_.isEmpty()) { + if (potentiallyMatchingExpectations_.isEmpty()) { MockUnexpectedInputParameterFailure failure(getTest(), getName(), actualParameter, allExpectations_); failTest(failure); return; } - unfulfilledExpectations_.parameterWasPassed(actualParameter.getName()); - finalizeCallWhenFulfilled(); + potentiallyMatchingExpectations_.parameterWasPassed(actualParameter.getName()); + completeCallWhenMatchIsFound(); } void MockCheckedActualCall::checkOutputParameter(const MockNamedValue& outputParameter) @@ -189,16 +188,16 @@ void MockCheckedActualCall::checkOutputParameter(const MockNamedValue& outputPar callIsInProgress(); - unfulfilledExpectations_.onlyKeepExpectationsWithOutputParameter(outputParameter); + potentiallyMatchingExpectations_.onlyKeepExpectationsWithOutputParameter(outputParameter); - if (unfulfilledExpectations_.isEmpty()) { + if (potentiallyMatchingExpectations_.isEmpty()) { MockUnexpectedOutputParameterFailure failure(getTest(), getName(), outputParameter, allExpectations_); failTest(failure); return; } - unfulfilledExpectations_.outputParameterWasPassed(outputParameter.getName()); - finalizeCallWhenFulfilled(); + potentiallyMatchingExpectations_.outputParameterWasPassed(outputParameter.getName()); + completeCallWhenMatchIsFound(); } MockActualCall& MockCheckedActualCall::withBoolParameter(const SimpleString& name, bool value) @@ -339,21 +338,22 @@ void MockCheckedActualCall::checkExpectations() { if (state_ != CALL_IN_PROGRESS) { - unfulfilledExpectations_.resetExpectations(); + potentiallyMatchingExpectations_.resetActualCallMatchingState(); return; } - if (! unfulfilledExpectations_.hasUnfulfilledExpectations()) - FAIL("Actual call is in progress. Checking expectations. But no unfulfilled expectations. Cannot happen.") // LCOV_EXCL_LINE + if (potentiallyMatchingExpectations_.hasFinalizedMatchingExpectations()) + FAIL("Actual call is in progress, but there are finalized matching expectations when checking expectations. This cannot happen.") // LCOV_EXCL_LINE - fulfilledExpectation_ = unfulfilledExpectations_.removeOneFulfilledExpectationWithIgnoredParameters(); - if (fulfilledExpectation_) { + matchingExpectation_ = potentiallyMatchingExpectations_.removeFirstMatchingExpectation(); + if (matchingExpectation_) { + matchingExpectation_->finalizeActualCallMatch(); callHasSucceeded(); - unfulfilledExpectations_.resetExpectations(); + potentiallyMatchingExpectations_.resetActualCallMatchingState(); return; } - if (unfulfilledExpectations_.hasUnfulfilledExpectationsBecauseOfMissingParameters()) { + if (potentiallyMatchingExpectations_.hasUnmatchingExpectationsBecauseOfMissingParameters()) { MockExpectedParameterDidntHappenFailure failure(getTest(), getName(), allExpectations_); failTest(failure); } @@ -371,8 +371,8 @@ void MockCheckedActualCall::setState(ActualCallState state) MockNamedValue MockCheckedActualCall::returnValue() { checkExpectations(); - if (fulfilledExpectation_) - return fulfilledExpectation_->returnValue(); + if (matchingExpectation_) + return matchingExpectation_->returnValue(); return MockNamedValue("no return value"); } @@ -513,19 +513,23 @@ bool MockCheckedActualCall::hasReturnValue() MockActualCall& MockCheckedActualCall::onObject(const void* objectPtr) { + if(hasFailed()) { + return *this; + } + callIsInProgress(); - unfulfilledExpectations_.onlyKeepExpectationsOnObject(objectPtr); + potentiallyMatchingExpectations_.onlyKeepExpectationsOnObject(objectPtr); - if (unfulfilledExpectations_.isEmpty()) { + if (potentiallyMatchingExpectations_.isEmpty()) { MockUnexpectedObjectFailure failure(getTest(), getName(), objectPtr, allExpectations_); failTest(failure); return *this; } - unfulfilledExpectations_.wasPassedToObject(); + potentiallyMatchingExpectations_.wasPassedToObject(); + completeCallWhenMatchIsFound(); - finalizeCallWhenFulfilled(); return *this; } diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index e9f3c96d0..ac987c105 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -52,7 +52,7 @@ SimpleString MockCheckedExpectedCall::getName() const } MockCheckedExpectedCall::MockCheckedExpectedCall() - : ignoreOtherParameters_(false), parametersWereIgnored_(false), callOrder_(0), expectedCallOrder_(NO_EXPECTED_CALL_ORDER), outOfOrder_(true), returnValue_(""), objectPtr_(NULL), wasPassedToObject_(true) + : ignoreOtherParameters_(false), isActualCallMatchFinalized_(false), actualCallOrder_(0), expectedCallOrder_(NO_EXPECTED_CALL_ORDER), outOfOrder_(true), returnValue_(""), objectPtr_(NULL), wasPassedToObject_(true) { inputParameters_ = new MockNamedValueList(); outputParameters_ = new MockNamedValueList(); @@ -69,7 +69,7 @@ MockCheckedExpectedCall::~MockCheckedExpectedCall() MockExpectedCall& MockCheckedExpectedCall::withName(const SimpleString& name) { setName(name); - callOrder_ = NOT_CALLED_YET; + actualCallOrder_ = NOT_CALLED_YET; return *this; } @@ -216,25 +216,18 @@ MockNamedValue MockCheckedExpectedCall::getOutputParameter(const SimpleString& n return (p) ? *p : MockNamedValue(""); } -bool MockCheckedExpectedCall::areParametersFulfilled() +bool MockCheckedExpectedCall::areParametersMatchingActualCall() { MockNamedValueListNode* p; for (p = inputParameters_->begin(); p; p = p->next()) - if (! item(p)->isFulfilled()) + if (! item(p)->isMatchingActualCall()) return false; for (p = outputParameters_->begin(); p; p = p->next()) - if (! item(p)->isFulfilled()) + if (! item(p)->isMatchingActualCall()) return false; return true; } -bool MockCheckedExpectedCall::areIgnoredParametersFulfilled() -{ - if (ignoreOtherParameters_) - return parametersWereIgnored_; - return true; -} - MockExpectedCall& MockCheckedExpectedCall::ignoreOtherParameters() { ignoreOtherParameters_ = true; @@ -243,29 +236,38 @@ MockExpectedCall& MockCheckedExpectedCall::ignoreOtherParameters() bool MockCheckedExpectedCall::isFulfilled() { - return isFulfilledWithoutIgnoredParameters() && areIgnoredParametersFulfilled(); + return isMatchingActualCallAndFinalized(); } -bool MockCheckedExpectedCall::isFulfilledWithoutIgnoredParameters() +bool MockCheckedExpectedCall::canMatchActualCalls() { - return callOrder_ != NOT_CALLED_YET && areParametersFulfilled() && wasPassedToObject_; + return !isFulfilled(); } +bool MockCheckedExpectedCall::isMatchingActualCallAndFinalized() +{ + return isMatchingActualCall() && (!ignoreOtherParameters_ || isActualCallMatchFinalized_); +} + +bool MockCheckedExpectedCall::isMatchingActualCall() +{ + return (actualCallOrder_ != NOT_CALLED_YET) && areParametersMatchingActualCall() && wasPassedToObject_; +} void MockCheckedExpectedCall::callWasMade(int callOrder) { - callOrder_ = callOrder; + actualCallOrder_ = callOrder; if (expectedCallOrder_ == NO_EXPECTED_CALL_ORDER) outOfOrder_ = false; - else if (callOrder_ == expectedCallOrder_) + else if (actualCallOrder_ == expectedCallOrder_) outOfOrder_ = false; else outOfOrder_ = true; } -void MockCheckedExpectedCall::parametersWereIgnored() +void MockCheckedExpectedCall::finalizeActualCallMatch() { - parametersWereIgnored_ = true; + isActualCallMatchFinalized_ = true; } @@ -274,23 +276,25 @@ void MockCheckedExpectedCall::wasPassedToObject() wasPassedToObject_ = true; } -void MockCheckedExpectedCall::resetExpectation() +void MockCheckedExpectedCall::resetActualCallMatchingState() { - callOrder_ = NOT_CALLED_YET; + actualCallOrder_ = NOT_CALLED_YET; wasPassedToObject_ = (objectPtr_ == NULL); + isActualCallMatchFinalized_ = false; + MockNamedValueListNode* p; for (p = inputParameters_->begin(); p; p = p->next()) - item(p)->setFulfilled(false); + item(p)->setMatchesActualCall(false); for (p = outputParameters_->begin(); p; p = p->next()) - item(p)->setFulfilled(false); + item(p)->setMatchesActualCall(false); } void MockCheckedExpectedCall::inputParameterWasPassed(const SimpleString& name) { for (MockNamedValueListNode* p = inputParameters_->begin(); p; p = p->next()) { if (p->getName() == name) - item(p)->setFulfilled(true); + item(p)->setMatchesActualCall(true); } } @@ -298,7 +302,7 @@ void MockCheckedExpectedCall::outputParameterWasPassed(const SimpleString& name) { for (MockNamedValueListNode* p = outputParameters_->begin(); p; p = p->next()) { if (p->getName() == name) - item(p)->setFulfilled(true); + item(p)->setMatchesActualCall(true); } } @@ -365,13 +369,13 @@ SimpleString MockCheckedExpectedCall::missingParametersToString() MockNamedValueListNode* p; for (p = inputParameters_->begin(); p; p = p->next()) { - if (! item(p)->isFulfilled()) { + if (! item(p)->isMatchingActualCall()) { if (str != "") str += ", "; str += StringFromFormat("%s %s", p->getType().asCharString(), p->getName().asCharString()); } } for (p = outputParameters_->begin(); p; p = p->next()) { - if (! item(p)->isFulfilled()) { + if (! item(p)->isMatchingActualCall()) { if (str != "") str += ", "; str += StringFromFormat("%s %s", p->getType().asCharString(), p->getName().asCharString()); } @@ -395,18 +399,18 @@ MockCheckedExpectedCall::MockExpectedFunctionParameter* MockCheckedExpectedCall: } MockCheckedExpectedCall::MockExpectedFunctionParameter::MockExpectedFunctionParameter(const SimpleString& name) - : MockNamedValue(name), fulfilled_(false) + : MockNamedValue(name), matchesActualCall_(false) { } -void MockCheckedExpectedCall::MockExpectedFunctionParameter::setFulfilled(bool b) +void MockCheckedExpectedCall::MockExpectedFunctionParameter::setMatchesActualCall(bool b) { - fulfilled_ = b; + matchesActualCall_ = b; } -bool MockCheckedExpectedCall::MockExpectedFunctionParameter::isFulfilled() const +bool MockCheckedExpectedCall::MockExpectedFunctionParameter::isMatchingActualCall() const { - return fulfilled_; + return matchesActualCall_; } MockExpectedCall& MockCheckedExpectedCall::andReturnValue(bool value) @@ -493,7 +497,7 @@ MockNamedValue MockCheckedExpectedCall::returnValue() int MockCheckedExpectedCall::getCallOrder() const { - return callOrder_; + return actualCallOrder_; } MockExpectedCall& MockCheckedExpectedCall::withCallOrder(int callOrder) diff --git a/src/CppUTestExt/MockExpectedCallsList.cpp b/src/CppUTestExt/MockExpectedCallsList.cpp index e34ca4125..8913e239b 100644 --- a/src/CppUTestExt/MockExpectedCallsList.cpp +++ b/src/CppUTestExt/MockExpectedCallsList.cpp @@ -81,9 +81,24 @@ int MockExpectedCallsList::amountOfUnfulfilledExpectations() const return count; } +bool MockExpectedCallsList::hasFinalizedMatchingExpectations() const +{ + for (MockExpectedCallsListNode* p = head_; p; p = p->next_) { + if (p->expectedCall_->isMatchingActualCallAndFinalized()) { + return true; + } + } + return false; +} + bool MockExpectedCallsList::hasUnfulfilledExpectations() const { - return amountOfUnfulfilledExpectations() != 0; + for (MockExpectedCallsListNode* p = head_; p; p = p->next_) { + if (!p->expectedCall_->isFulfilled()) { + return true; + } + } + return false; } bool MockExpectedCallsList::hasExpectationWithName(const SimpleString& name) const @@ -107,10 +122,10 @@ void MockExpectedCallsList::addExpectedCall(MockCheckedExpectedCall* call) } } -void MockExpectedCallsList::addUnfulfilledExpectations(const MockExpectedCallsList& list) +void MockExpectedCallsList::addPotentiallyMatchingExpectations(const MockExpectedCallsList& list) { for (MockExpectedCallsListNode* p = list.head_; p; p = p->next_) - if (! p->expectedCall_->isFulfilled()) + if (p->expectedCall_->canMatchActualCalls()) addExpectedCall(p->expectedCall_); } @@ -144,12 +159,12 @@ void MockExpectedCallsList::onlyKeepOutOfOrderExpectations() pruneEmptyNodeFromList(); } -void MockExpectedCallsList::onlyKeepUnfulfilledExpectations() +void MockExpectedCallsList::onlyKeepUnmatchingExpectations() { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) - if (p->expectedCall_->isFulfilled()) + if (p->expectedCall_->isMatchingActualCallAndFinalized()) { - p->expectedCall_->resetExpectation(); + p->expectedCall_->resetActualCallMatchingState(); p->expectedCall_ = NULL; } @@ -196,38 +211,37 @@ void MockExpectedCallsList::onlyKeepExpectationsOnObject(const void* objectPtr) pruneEmptyNodeFromList(); } -MockCheckedExpectedCall* MockExpectedCallsList::removeOneFulfilledExpectation() +MockCheckedExpectedCall* MockExpectedCallsList::removeFirstFinalizedMatchingExpectation() { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) { - if (p->expectedCall_->isFulfilled()) { - MockCheckedExpectedCall* fulfilledCall = p->expectedCall_; + if (p->expectedCall_->isMatchingActualCallAndFinalized()) { + MockCheckedExpectedCall* matchingCall = p->expectedCall_; p->expectedCall_ = NULL; pruneEmptyNodeFromList(); - return fulfilledCall; + return matchingCall; } } return NULL; } -MockCheckedExpectedCall* MockExpectedCallsList::getOneFulfilledExpectationWithIgnoredParameters() +MockCheckedExpectedCall* MockExpectedCallsList::getFirstMatchingExpectation() { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) { - if (p->expectedCall_->isFulfilledWithoutIgnoredParameters()) { + if (p->expectedCall_->isMatchingActualCall()) { return p->expectedCall_; } } return NULL; } -MockCheckedExpectedCall* MockExpectedCallsList::removeOneFulfilledExpectationWithIgnoredParameters() +MockCheckedExpectedCall* MockExpectedCallsList::removeFirstMatchingExpectation() { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) { - if (p->expectedCall_->isFulfilledWithoutIgnoredParameters()) { - MockCheckedExpectedCall* fulfilledCall = p->expectedCall_; - p->expectedCall_->parametersWereIgnored(); + if (p->expectedCall_->isMatchingActualCall()) { + MockCheckedExpectedCall* matchingCall = p->expectedCall_; p->expectedCall_ = NULL; pruneEmptyNodeFromList(); - return fulfilledCall; + return matchingCall; } } return NULL; @@ -265,10 +279,10 @@ void MockExpectedCallsList::deleteAllExpectationsAndClearList() } } -void MockExpectedCallsList::resetExpectations() +void MockExpectedCallsList::resetActualCallMatchingState() { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) - p->expectedCall_->resetExpectation(); + p->expectedCall_->resetActualCallMatchingState(); } void MockExpectedCallsList::callWasMade(int callOrder) @@ -354,10 +368,10 @@ SimpleString MockExpectedCallsList::missingParametersToString() const return stringOrNoneTextWhenEmpty(str, ""); } -bool MockExpectedCallsList::hasUnfulfilledExpectationsBecauseOfMissingParameters() const +bool MockExpectedCallsList::hasUnmatchingExpectationsBecauseOfMissingParameters() const { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) - if (! p->expectedCall_->areParametersFulfilled()) + if (! p->expectedCall_->areParametersMatchingActualCall()) return true; return false; } diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index fb307652e..484955f92 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -44,7 +44,7 @@ MockSupport& mock(const SimpleString& mockName, MockFailureReporter* failureRepo } MockSupport::MockSupport(const SimpleString& mockName) - : callOrder_(0), expectedCallOrder_(0), strictOrdering_(false), standardReporter_(&defaultReporter_), ignoreOtherCalls_(false), enabled_(true), lastActualFunctionCall_(NULL), mockName_(mockName), tracing_(false) + : actualCallOrder_(0), expectedCallOrder_(0), strictOrdering_(false), standardReporter_(&defaultReporter_), ignoreOtherCalls_(false), enabled_(true), lastActualFunctionCall_(NULL), mockName_(mockName), tracing_(false) { setActiveReporter(NULL); } @@ -123,7 +123,7 @@ void MockSupport::clear() compositeCalls_.clear(); ignoreOtherCalls_ = false; enabled_ = true; - callOrder_ = 0; + actualCallOrder_ = 0; expectedCallOrder_ = 0; strictOrdering_ = false; @@ -184,7 +184,7 @@ MockExpectedCall& MockSupport::expectNCalls(int amount, const SimpleString& func MockCheckedActualCall* MockSupport::createActualFunctionCall() { - lastActualFunctionCall_ = new MockCheckedActualCall(++callOrder_, activeReporter_, expectations_); + lastActualFunctionCall_ = new MockCheckedActualCall(++actualCallOrder_, activeReporter_, expectations_); return lastActualFunctionCall_; } @@ -268,13 +268,13 @@ bool MockSupport::expectedCallsLeft() return callsLeft != 0; } -bool MockSupport::wasLastCallFulfilled() +bool MockSupport::wasLastActualCallFulfilled() { if (lastActualFunctionCall_ && !lastActualFunctionCall_->isFulfilled()) return false; for (MockNamedValueListNode* p = data_.begin(); p; p = p->next()) - if (getMockSupport(p) && !getMockSupport(p)->wasLastCallFulfilled()) + if (getMockSupport(p) && !getMockSupport(p)->wasLastActualCallFulfilled()) return false; return true; @@ -318,7 +318,7 @@ void MockSupport::countCheck() UtestShell::getCurrent()->countCheck(); } -void MockSupport::checkExpectationsOfLastCall() +void MockSupport::checkExpectationsOfLastActualCall() { if(lastActualFunctionCall_) lastActualFunctionCall_->checkExpectations(); @@ -344,9 +344,9 @@ bool MockSupport::hasCallsOutOfOrder() void MockSupport::checkExpectations() { - checkExpectationsOfLastCall(); + checkExpectationsOfLastActualCall(); - if (wasLastCallFulfilled() && expectedCallsLeft()) + if (wasLastActualCallFulfilled() && expectedCallsLeft()) failTestWithUnexpectedCalls(); if (hasCallsOutOfOrder()) diff --git a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp index da0ec90aa..1b8e55da3 100644 --- a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp +++ b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp @@ -63,7 +63,7 @@ TEST_GROUP(MockExpectedCallsList) TEST(MockExpectedCallsList, emptyList) { CHECK(! list->hasUnfulfilledExpectations()); - CHECK(list->size() == list->amountOfUnfulfilledExpectations()); + CHECK(! list->hasFinalizedMatchingExpectations()); LONGS_EQUAL(0, list->size()); } @@ -74,7 +74,7 @@ TEST(MockExpectedCallsList, addingCalls) LONGS_EQUAL(2, list->size()); } -TEST(MockExpectedCallsList, listWithFulfilledExpectationHasNoUnfillfilledOnes) +TEST(MockExpectedCallsList, listWithFulfilledExpectationHasNoUnfulfilledOnes) { call1->callWasMade(1); call2->callWasMade(2); @@ -112,7 +112,7 @@ TEST(MockExpectedCallsList, deleteAllExpectationsAndClearList) list->deleteAllExpectationsAndClearList(); } -TEST(MockExpectedCallsList, onlyKeepUnfulfilledExpectations) +TEST(MockExpectedCallsList, onlyKeepUnmatchingExpectations) { call1->withName("relate"); call2->withName("unrelate"); @@ -122,7 +122,7 @@ TEST(MockExpectedCallsList, onlyKeepUnfulfilledExpectations) list->addExpectedCall(call1); list->addExpectedCall(call2); list->addExpectedCall(call3); - list->onlyKeepUnfulfilledExpectations(); + list->onlyKeepUnmatchingExpectations(); LONGS_EQUAL(1, list->size()); } @@ -200,21 +200,21 @@ TEST(MockExpectedCallsList, onlyKeepExpectationsWithInputParameter) LONGS_EQUAL(2, list->size()); } -TEST(MockExpectedCallsList, addUnfilfilledExpectationsWithEmptyList) +TEST(MockExpectedCallsList, addPotentiallyMatchingExpectationsWithEmptyList) { MockExpectedCallsList newList; - newList.addUnfulfilledExpectations(*list); + newList.addPotentiallyMatchingExpectations(*list); LONGS_EQUAL(0, newList.size()); } -TEST(MockExpectedCallsList, addUnfilfilledExpectationsMultipleUnfulfilledExpectations) +TEST(MockExpectedCallsList, addPotentiallyMatchingExpectationsMultipleUnmatchedExpectations) { call2->callWasMade(1); list->addExpectedCall(call1); list->addExpectedCall(call2); list->addExpectedCall(call3); MockExpectedCallsList newList; - newList.addUnfulfilledExpectations(*list); + newList.addPotentiallyMatchingExpectations(*list); LONGS_EQUAL(2, newList.size()); } @@ -266,14 +266,14 @@ TEST(MockExpectedCallsList, callToStringForFulfilledFunctions) STRCMP_EQUAL(expectedString.asCharString(), list->fulfilledCallsToString().asCharString()); } -TEST(MockExpectedCallsList, removeOneFulfilledExpectationFromEmptyList) +TEST(MockExpectedCallsList, removeOneFinalizedMatchingExpectationFromEmptyList) { - POINTERS_EQUAL(NULL, list->removeOneFulfilledExpectation()); + POINTERS_EQUAL(NULL, list->removeFirstFinalizedMatchingExpectation()); } -TEST(MockExpectedCallsList, getOneFulfilledExpectationWithIgnoredParametersFromEmptyList) +TEST(MockExpectedCallsList, getOneMatchingExpectationFromEmptyList) { - POINTERS_EQUAL(NULL, list->getOneFulfilledExpectationWithIgnoredParameters()); + POINTERS_EQUAL(NULL, list->getFirstMatchingExpectation()); } TEST(MockExpectedCallsList, toStringOnEmptyList) diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index bd9cf0062..74b608d2f 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -442,7 +442,7 @@ TEST(MockParameterTest, ignoreOtherParametersMultipleCallsButOneDidntHappen) MockCheckedExpectedCall* call = expectations.addFunction("boo"); call->ignoreOtherParameters(); call->callWasMade(1); - call->parametersWereIgnored(); + call->finalizeActualCallMatch(); call->ignoreOtherParameters(); expectations.addFunction("boo")->ignoreOtherParameters(); MockExpectedCallsDidntHappenFailure expectedFailure(mockFailureTest(), expectations); From 3b986a3a606cf1ca157f8fda8c6e3738642db522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Tue, 5 Jul 2016 22:44:18 +0200 Subject: [PATCH 0035/1093] Added unit test for MockActualCallsList::hasFinalizedMatchingExpectations(). --- tests/CppUTestExt/ExpectedFunctionsListTest.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp index 1b8e55da3..0b97c50a0 100644 --- a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp +++ b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp @@ -280,3 +280,14 @@ TEST(MockExpectedCallsList, toStringOnEmptyList) { STRCMP_EQUAL("", list->unfulfilledCallsToString().asCharString()); } + +TEST(MockExpectedCallsList, hasFinalizedMatchingExpectations) +{ + call1->ignoreOtherParameters(); + list->addExpectedCall(call1); + CHECK(! list->hasFinalizedMatchingExpectations()); + + call1->callWasMade(1); + call1->finalizeActualCallMatch(); + CHECK(list->hasFinalizedMatchingExpectations()); +} From 89b56ee9ca1b94dd857fb8ce3199b12bdcd8c60f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Mon, 11 Jul 2016 12:29:10 +0200 Subject: [PATCH 0036/1093] Added unit test to check that MockCheckedActualCall::onObject bails out early when the call has already failed. --- tests/CppUTestExt/MockActualCallTest.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index b60c099a3..512440faf 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -80,6 +80,19 @@ TEST(MockCheckedActualCall, unExpectedCallWithAnOutputParameter) CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } +TEST(MockCheckedActualCall, unExpectedCallOnObject) +{ + int object; + + MockCheckedActualCall actualCall(1, reporter, *emptyList); + actualCall.withName("unexpected").onObject(&object); + + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "unexpected", *list); + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); + + CHECK(actualCall.hasFailed()); // Checks that onObject() doesn't "reset" call state +} + TEST(MockCheckedActualCall, actualCallWithNoReturnValueAndMeaninglessCallOrderForCoverage) { MockCheckedActualCall actualCall(1, reporter, *emptyList); From 769f9e8802ad9995334c26ee39248d6eec131e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Wed, 13 Jul 2016 10:05:16 +0200 Subject: [PATCH 0037/1093] Improved unit tests for MockExpectedCallsList::hasFinalizedMatchingExpectations(). --- .../CppUTestExt/ExpectedFunctionsListTest.cpp | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp index 0b97c50a0..8c81850fe 100644 --- a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp +++ b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp @@ -281,13 +281,48 @@ TEST(MockExpectedCallsList, toStringOnEmptyList) STRCMP_EQUAL("", list->unfulfilledCallsToString().asCharString()); } -TEST(MockExpectedCallsList, hasFinalizedMatchingExpectations) +TEST(MockExpectedCallsList, hasFinalizedMatchingExpectations_emptyList) +{ + CHECK(! list->hasFinalizedMatchingExpectations()); +} + +TEST(MockExpectedCallsList, hasFinalizedMatchingExpectations_listHasNonMatchingCalls) { - call1->ignoreOtherParameters(); list->addExpectedCall(call1); + list->addExpectedCall(call2); + list->addExpectedCall(call3); + CHECK(! list->hasFinalizedMatchingExpectations()); +} +TEST(MockExpectedCallsList, hasFinalizedMatchingExpectations_listHasMatchingButNotFinalizedCall) +{ + list->addExpectedCall(call1); + list->addExpectedCall(call2); + call1->ignoreOtherParameters(); + call1->callWasMade(1); + + CHECK(! list->hasFinalizedMatchingExpectations()); +} + +TEST(MockExpectedCallsList, hasFinalizedMatchingExpectations_listHasFinalizedCallThatIgnoresParameters) +{ + list->addExpectedCall(call1); + list->addExpectedCall(call2); + call1->ignoreOtherParameters(); call1->callWasMade(1); call1->finalizeActualCallMatch(); + + CHECK(list->hasFinalizedMatchingExpectations()); +} + +TEST(MockExpectedCallsList, hasFinalizedMatchingExpectations_listHasFinalizedCallThatDoesntIgnoreParameters) +{ + list->addExpectedCall(call1); + list->addExpectedCall(call2); + call1->withParameter("param", 1); + call1->callWasMade(1); + call1->inputParameterWasPassed("param"); + CHECK(list->hasFinalizedMatchingExpectations()); } From 15a0fa0404de3004b0e19a229805a7d49b61fd14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Wed, 13 Jul 2016 15:40:19 +0200 Subject: [PATCH 0038/1093] Changed call order related method parameters and class attributes to use unsigned integers. --- include/CppUTestExt/MockActualCall.h | 2 +- include/CppUTestExt/MockCheckedActualCall.h | 10 +++++----- include/CppUTestExt/MockCheckedExpectedCall.h | 16 ++++++++-------- include/CppUTestExt/MockExpectedCall.h | 2 +- include/CppUTestExt/MockExpectedCallsList.h | 4 ++-- include/CppUTestExt/MockSupport.h | 6 +++--- include/CppUTestExt/MockSupport_c.h | 2 +- src/CppUTestExt/MockActualCall.cpp | 6 +++--- src/CppUTestExt/MockExpectedCall.cpp | 8 ++++---- src/CppUTestExt/MockExpectedCallsList.cpp | 6 +++--- src/CppUTestExt/MockSupport.cpp | 4 ++-- src/CppUTestExt/MockSupport_c.cpp | 4 ++-- tests/CppUTestExt/MockExpectedCallTest.cpp | 4 ++-- tests/CppUTestExt/MockFailureReporterForTest.cpp | 2 +- tests/CppUTestExt/MockFailureReporterForTest.h | 2 +- 15 files changed, 39 insertions(+), 39 deletions(-) diff --git a/include/CppUTestExt/MockActualCall.h b/include/CppUTestExt/MockActualCall.h index 496a499a0..438e65e4f 100644 --- a/include/CppUTestExt/MockActualCall.h +++ b/include/CppUTestExt/MockActualCall.h @@ -42,7 +42,7 @@ class MockActualCall virtual ~MockActualCall(); virtual MockActualCall& withName(const SimpleString& name)=0; - virtual MockActualCall& withCallOrder(int callOrder)=0; + virtual MockActualCall& withCallOrder(unsigned int callOrder)=0; MockActualCall& withParameter(const SimpleString& name, bool value) { return withBoolParameter(name, value); } MockActualCall& withParameter(const SimpleString& name, int value) { return withIntParameter(name, value); } MockActualCall& withParameter(const SimpleString& name, unsigned int value) { return withUnsignedIntParameter(name, value); } diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index f8d53cc9c..dddbf5782 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -34,11 +34,11 @@ class MockCheckedActualCall : public MockActualCall { public: - MockCheckedActualCall(int callOrder, MockFailureReporter* reporter, const MockExpectedCallsList& expectations); + MockCheckedActualCall(unsigned int callOrder, MockFailureReporter* reporter, const MockExpectedCallsList& expectations); virtual ~MockCheckedActualCall(); virtual MockActualCall& withName(const SimpleString& name) _override; - virtual MockActualCall& withCallOrder(int) _override; + virtual MockActualCall& withCallOrder(unsigned int) _override; virtual MockActualCall& withBoolParameter(const SimpleString& name, bool value) _override; virtual MockActualCall& withIntParameter(const SimpleString& name, int value) _override; virtual MockActualCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) _override; @@ -116,7 +116,7 @@ class MockCheckedActualCall : public MockActualCall private: SimpleString functionName_; - int callOrder_; + unsigned int callOrder_; MockFailureReporter* reporter_; ActualCallState state_; @@ -150,7 +150,7 @@ class MockActualCallTrace : public MockActualCall virtual ~MockActualCallTrace(); virtual MockActualCall& withName(const SimpleString& name) _override; - virtual MockActualCall& withCallOrder(int) _override; + virtual MockActualCall& withCallOrder(unsigned int) _override; virtual MockActualCall& withBoolParameter(const SimpleString& name, bool value) _override; virtual MockActualCall& withIntParameter(const SimpleString& name, int value) _override; virtual MockActualCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) _override; @@ -215,7 +215,7 @@ class MockIgnoredActualCall: public MockActualCall { public: virtual MockActualCall& withName(const SimpleString&) _override { return *this;} - virtual MockActualCall& withCallOrder(int) _override { return *this; } + virtual MockActualCall& withCallOrder(unsigned int) _override { return *this; } virtual MockActualCall& withBoolParameter(const SimpleString&, bool) _override { return *this; } virtual MockActualCall& withIntParameter(const SimpleString&, int) _override { return *this; } virtual MockActualCall& withUnsignedIntParameter(const SimpleString&, unsigned int) _override { return *this; } diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index b183d896d..6c6f01920 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -39,7 +39,7 @@ class MockCheckedExpectedCall : public MockExpectedCall virtual ~MockCheckedExpectedCall(); virtual MockExpectedCall& withName(const SimpleString& name) _override; - virtual MockExpectedCall& withCallOrder(int callOrder) _override; + virtual MockExpectedCall& withCallOrder(unsigned int callOrder) _override; virtual MockExpectedCall& withBoolParameter(const SimpleString& name, bool value) _override; virtual MockExpectedCall& withIntParameter(const SimpleString& name, int value) _override; virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) _override; @@ -90,7 +90,7 @@ class MockCheckedExpectedCall : public MockExpectedCall virtual bool areParametersMatchingActualCall(); virtual bool isOutOfOrder() const; - virtual void callWasMade(int callOrder); + virtual void callWasMade(unsigned int callOrder); virtual void inputParameterWasPassed(const SimpleString& name); virtual void outputParameterWasPassed(const SimpleString& name); virtual void finalizeActualCallMatch(); @@ -100,8 +100,8 @@ class MockCheckedExpectedCall : public MockExpectedCall virtual SimpleString callToString(); virtual SimpleString missingParametersToString(); - enum { NOT_CALLED_YET = -1, NO_EXPECTED_CALL_ORDER = -1}; - virtual int getCallOrder() const; + enum { NOT_CALLED_YET = 0, NO_EXPECTED_CALL_ORDER = 0 }; + virtual unsigned int getCallOrder() const; protected: void setName(const SimpleString& name); @@ -125,8 +125,8 @@ class MockCheckedExpectedCall : public MockExpectedCall bool ignoreOtherParameters_; bool isActualCallMatchFinalized_; - int actualCallOrder_; - int expectedCallOrder_; + unsigned int actualCallOrder_; + unsigned int expectedCallOrder_; bool outOfOrder_; MockNamedValueList* inputParameters_; MockNamedValueList* outputParameters_; @@ -143,7 +143,7 @@ class MockExpectedCallComposite : public MockExpectedCall virtual ~MockExpectedCallComposite(); virtual MockExpectedCall& withName(const SimpleString& name) _override; - virtual MockExpectedCall& withCallOrder(int callOrder) _override; + virtual MockExpectedCall& withCallOrder(unsigned int callOrder) _override; virtual MockExpectedCall& withBoolParameter(const SimpleString& name, bool value) _override; virtual MockExpectedCall& withIntParameter(const SimpleString& name, int value) _override; virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) _override; @@ -184,7 +184,7 @@ class MockIgnoredExpectedCall: public MockExpectedCall public: virtual MockExpectedCall& withName(const SimpleString&) _override { return *this;} - virtual MockExpectedCall& withCallOrder(int) _override { return *this; } + virtual MockExpectedCall& withCallOrder(unsigned int) _override { return *this; } virtual MockExpectedCall& withBoolParameter(const SimpleString&, bool) _override { return *this; } virtual MockExpectedCall& withIntParameter(const SimpleString&, int) _override { return *this; } virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString&, unsigned int) _override{ return *this; } diff --git a/include/CppUTestExt/MockExpectedCall.h b/include/CppUTestExt/MockExpectedCall.h index 73120e7f1..c0c9382ae 100644 --- a/include/CppUTestExt/MockExpectedCall.h +++ b/include/CppUTestExt/MockExpectedCall.h @@ -39,7 +39,7 @@ class MockExpectedCall virtual ~MockExpectedCall(); virtual MockExpectedCall& withName(const SimpleString& name)=0; - virtual MockExpectedCall& withCallOrder(int)=0; + virtual MockExpectedCall& withCallOrder(unsigned int)=0; MockExpectedCall& withParameter(const SimpleString& name, bool value) { return withBoolParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, int value) { return withIntParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, unsigned int value) { return withUnsignedIntParameter(name, value); } diff --git a/include/CppUTestExt/MockExpectedCallsList.h b/include/CppUTestExt/MockExpectedCallsList.h index 479f31fdd..fed8f143a 100644 --- a/include/CppUTestExt/MockExpectedCallsList.h +++ b/include/CppUTestExt/MockExpectedCallsList.h @@ -69,7 +69,7 @@ class MockExpectedCallsList virtual MockCheckedExpectedCall* getFirstMatchingExpectation(); virtual void resetActualCallMatchingState(); - virtual void callWasMade(int callOrder); + virtual void callWasMade(unsigned int callOrder); virtual void wasPassedToObject(); virtual void parameterWasPassed(const SimpleString& parameterName); virtual void outputParameterWasPassed(const SimpleString& parameterName); @@ -91,7 +91,7 @@ class MockExpectedCallsList : expectedCall_(expectedCall), next_(NULL) {} }; - virtual MockExpectedCallsListNode* findNodeWithCallOrderOf(int callOrder) const; + virtual MockExpectedCallsListNode* findNodeWithCallOrderOf(unsigned int callOrder) const; private: MockExpectedCallsListNode* head_; diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index 7cb611218..ccf024fcb 100755 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -48,7 +48,7 @@ class MockSupport virtual void strictOrder(); virtual MockExpectedCall& expectOneCall(const SimpleString& functionName); virtual void expectNoCall(const SimpleString& functionName); - virtual MockExpectedCall& expectNCalls(int amount, const SimpleString& functionName); + virtual MockExpectedCall& expectNCalls(unsigned int amount, const SimpleString& functionName); virtual MockActualCall& actualCall(const SimpleString& functionName); virtual bool hasReturnValue(); virtual MockNamedValue returnValue(); @@ -124,8 +124,8 @@ class MockSupport void countCheck(); private: - int actualCallOrder_; - int expectedCallOrder_; + unsigned int actualCallOrder_; + unsigned int expectedCallOrder_; bool strictOrdering_; MockFailureReporter *activeReporter_; MockFailureReporter *standardReporter_; diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 0706d5472..fd0a3d2eb 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -150,7 +150,7 @@ struct SMockSupport_c void (*strictOrder)(void); MockExpectedCall_c* (*expectOneCall)(const char* name); void (*expectNoCall)(const char* name); - MockExpectedCall_c* (*expectNCalls)(int number, const char* name); + MockExpectedCall_c* (*expectNCalls)(unsigned int number, const char* name); MockActualCall_c* (*actualCall)(const char* name); int (*hasReturnValue)(void); MockValue_c (*returnValue)(void); diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 3fde51f2c..66f3ef2a3 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -49,7 +49,7 @@ SimpleString MockCheckedActualCall::getName() const return functionName_; } -MockCheckedActualCall::MockCheckedActualCall(int callOrder, MockFailureReporter* reporter, const MockExpectedCallsList& allExpectations) +MockCheckedActualCall::MockCheckedActualCall(unsigned int callOrder, MockFailureReporter* reporter, const MockExpectedCallsList& allExpectations) : callOrder_(callOrder), reporter_(reporter), state_(CALL_SUCCEED), matchingExpectation_(NULL), allExpectations_(allExpectations), outputParameterExpectations_(NULL) { potentiallyMatchingExpectations_.addPotentiallyMatchingExpectations(allExpectations); @@ -153,7 +153,7 @@ MockActualCall& MockCheckedActualCall::withName(const SimpleString& name) return *this; } -MockActualCall& MockCheckedActualCall::withCallOrder(int) +MockActualCall& MockCheckedActualCall::withCallOrder(unsigned int) { return *this; } @@ -574,7 +574,7 @@ MockActualCall& MockActualCallTrace::withName(const SimpleString& name) return *this; } -MockActualCall& MockActualCallTrace::withCallOrder(int callOrder) +MockActualCall& MockActualCallTrace::withCallOrder(unsigned int callOrder) { traceBuffer_ += " withCallOrder:"; traceBuffer_ += StringFrom(callOrder); diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index ac987c105..50eab3acb 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -254,7 +254,7 @@ bool MockCheckedExpectedCall::isMatchingActualCall() return (actualCallOrder_ != NOT_CALLED_YET) && areParametersMatchingActualCall() && wasPassedToObject_; } -void MockCheckedExpectedCall::callWasMade(int callOrder) +void MockCheckedExpectedCall::callWasMade(unsigned int callOrder) { actualCallOrder_ = callOrder; if (expectedCallOrder_ == NO_EXPECTED_CALL_ORDER) @@ -495,12 +495,12 @@ MockNamedValue MockCheckedExpectedCall::returnValue() return returnValue_; } -int MockCheckedExpectedCall::getCallOrder() const +unsigned int MockCheckedExpectedCall::getCallOrder() const { return actualCallOrder_; } -MockExpectedCall& MockCheckedExpectedCall::withCallOrder(int callOrder) +MockExpectedCall& MockCheckedExpectedCall::withCallOrder(unsigned int callOrder) { expectedCallOrder_ = callOrder; return *this; @@ -549,7 +549,7 @@ MockExpectedCall& MockExpectedCallComposite::withName(const SimpleString& name) return *this; } -MockExpectedCall& MockExpectedCallComposite::withCallOrder(int) +MockExpectedCall& MockExpectedCallComposite::withCallOrder(unsigned int) { FAIL("withCallOrder not supported for CompositeCalls"); return *this; // LCOV_EXCL_LINE diff --git a/src/CppUTestExt/MockExpectedCallsList.cpp b/src/CppUTestExt/MockExpectedCallsList.cpp index 8913e239b..4d35a1956 100644 --- a/src/CppUTestExt/MockExpectedCallsList.cpp +++ b/src/CppUTestExt/MockExpectedCallsList.cpp @@ -285,7 +285,7 @@ void MockExpectedCallsList::resetActualCallMatchingState() p->expectedCall_->resetActualCallMatchingState(); } -void MockExpectedCallsList::callWasMade(int callOrder) +void MockExpectedCallsList::callWasMade(unsigned int callOrder) { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) p->expectedCall_->callWasMade(callOrder); @@ -310,7 +310,7 @@ void MockExpectedCallsList::outputParameterWasPassed(const SimpleString& paramet p->expectedCall_->outputParameterWasPassed(parameterName); } -MockExpectedCallsList::MockExpectedCallsListNode* MockExpectedCallsList::findNodeWithCallOrderOf(int callOrder) const +MockExpectedCallsList::MockExpectedCallsListNode* MockExpectedCallsList::findNodeWithCallOrderOf(unsigned int callOrder) const { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) if (p->expectedCall_->getCallOrder() == callOrder && p->expectedCall_->isFulfilled()) @@ -351,7 +351,7 @@ SimpleString MockExpectedCallsList::fulfilledCallsToString(const SimpleString& l SimpleString str; MockExpectedCallsListNode* nextNodeInOrder; - for (int callOrder = 1; (nextNodeInOrder = findNodeWithCallOrderOf(callOrder)); callOrder++) + for (unsigned int callOrder = 1; (nextNodeInOrder = findNodeWithCallOrderOf(callOrder)); callOrder++) if (nextNodeInOrder) str = appendStringOnANewLine(str, linePrefix, nextNodeInOrder->expectedCall_->callToString()); diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 484955f92..2010895e8 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -173,11 +173,11 @@ void MockSupport::expectNoCall(const SimpleString& functionName) unExpectations_.addExpectedCall(call); } -MockExpectedCall& MockSupport::expectNCalls(int amount, const SimpleString& functionName) +MockExpectedCall& MockSupport::expectNCalls(unsigned int amount, const SimpleString& functionName) { compositeCalls_.clear(); - for (int i = 0; i < amount; i++) + for (unsigned int i = 0; i < amount; i++) compositeCalls_.add(expectOneCall(functionName)); return compositeCalls_; } diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 69145b7de..35ba83e67 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -120,7 +120,7 @@ extern "C" { void strictOrder_c(); MockExpectedCall_c* expectOneCall_c(const char* name); void expectNoCall_c(const char* name); -MockExpectedCall_c* expectNCalls_c(const int number, const char* name); +MockExpectedCall_c* expectNCalls_c(const unsigned int number, const char* name); MockActualCall_c* actualCall_c(const char* name); void disable_c(); void enable_c(); @@ -568,7 +568,7 @@ void expectNoCall_c(const char* name) currentMockSupport->expectNoCall(name); } -MockExpectedCall_c* expectNCalls_c(const int number, const char* name) +MockExpectedCall_c* expectNCalls_c(const unsigned int number, const char* name) { expectedCall = ¤tMockSupport->expectNCalls(number, name); return &gExpectedCall; diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 7c1a73670..2c3227f97 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -385,9 +385,9 @@ TEST(MockExpectedCall, callWithThreeDifferentParameter) DOUBLES_EQUAL(0.12, call->getInputParameter("double").getDoubleValue(), 0.05); } -TEST(MockExpectedCall, withoutANameItsFulfilled) +TEST(MockExpectedCall, withoutANameItsNotFulfilled) { - CHECK(call->isFulfilled()); + CHECK(!call->isFulfilled()); } TEST(MockExpectedCall, withANameItsNotFulfilled) diff --git a/tests/CppUTestExt/MockFailureReporterForTest.cpp b/tests/CppUTestExt/MockFailureReporterForTest.cpp index 4e0b0cfb6..5ffbaef88 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.cpp +++ b/tests/CppUTestExt/MockFailureReporterForTest.cpp @@ -104,7 +104,7 @@ MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(const SimpleS return newCall; } -MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(const SimpleString& name, int order) +MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(const SimpleString& name, unsigned int order) { MockCheckedExpectedCall* newCall = addFunction(name); newCall->withCallOrder(order); diff --git a/tests/CppUTestExt/MockFailureReporterForTest.h b/tests/CppUTestExt/MockFailureReporterForTest.h index bbc58e793..3beedd887 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.h +++ b/tests/CppUTestExt/MockFailureReporterForTest.h @@ -60,7 +60,7 @@ class MockExpectedCallsListForTest : public MockExpectedCallsList public: ~MockExpectedCallsListForTest(); MockCheckedExpectedCall* addFunction(const SimpleString& name); - MockCheckedExpectedCall* addFunction(const SimpleString& name, int order); + MockCheckedExpectedCall* addFunction(const SimpleString& name, unsigned int order); }; #endif From f217d0237e4bfef3d20e6c7ab06a41aa9b5eb3f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Wed, 13 Jul 2016 22:57:00 +0200 Subject: [PATCH 0039/1093] Changed some methods in MockExpectedCallsList to return unsigned integers instead of signed. --- include/CppUTestExt/MockExpectedCallsList.h | 6 +++--- src/CppUTestExt/MockExpectedCallsList.cpp | 12 ++++++------ src/CppUTestExt/MockFailure.cpp | 5 +++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/include/CppUTestExt/MockExpectedCallsList.h b/include/CppUTestExt/MockExpectedCallsList.h index fed8f143a..aec8c25e5 100644 --- a/include/CppUTestExt/MockExpectedCallsList.h +++ b/include/CppUTestExt/MockExpectedCallsList.h @@ -39,9 +39,9 @@ class MockExpectedCallsList virtual ~MockExpectedCallsList(); virtual void deleteAllExpectationsAndClearList(); - virtual int size() const; - virtual int amountOfExpectationsFor(const SimpleString& name) const; - virtual int amountOfUnfulfilledExpectations() const; + virtual unsigned int size() const; + virtual unsigned int amountOfExpectationsFor(const SimpleString& name) const; + virtual unsigned int amountOfUnfulfilledExpectations() const; virtual bool hasUnfulfilledExpectations() const; virtual bool hasFinalizedMatchingExpectations() const; virtual bool hasUnmatchingExpectationsBecauseOfMissingParameters() const; diff --git a/src/CppUTestExt/MockExpectedCallsList.cpp b/src/CppUTestExt/MockExpectedCallsList.cpp index 4d35a1956..a1309e301 100644 --- a/src/CppUTestExt/MockExpectedCallsList.cpp +++ b/src/CppUTestExt/MockExpectedCallsList.cpp @@ -50,9 +50,9 @@ bool MockExpectedCallsList::hasCallsOutOfOrder() const return false; } -int MockExpectedCallsList::size() const +unsigned int MockExpectedCallsList::size() const { - int count = 0; + unsigned int count = 0; for (MockExpectedCallsListNode* p = head_; p; p = p->next_) count++; return count; @@ -64,18 +64,18 @@ bool MockExpectedCallsList::isEmpty() const } -int MockExpectedCallsList::amountOfExpectationsFor(const SimpleString& name) const +unsigned int MockExpectedCallsList::amountOfExpectationsFor(const SimpleString& name) const { - int count = 0; + unsigned int count = 0; for (MockExpectedCallsListNode* p = head_; p; p = p->next_) if (p->expectedCall_->relatesTo(name)) count++; return count; } -int MockExpectedCallsList::amountOfUnfulfilledExpectations() const +unsigned int MockExpectedCallsList::amountOfUnfulfilledExpectations() const { - int count = 0; + unsigned int count = 0; for (MockExpectedCallsListNode* p = head_; p; p = p->next_) if (! p->expectedCall_->isFulfilled()) count++; return count; diff --git a/src/CppUTestExt/MockFailure.cpp b/src/CppUTestExt/MockFailure.cpp index bb93ea503..b7a3ad8e1 100644 --- a/src/CppUTestExt/MockFailure.cpp +++ b/src/CppUTestExt/MockFailure.cpp @@ -103,8 +103,9 @@ MockExpectedCallsDidntHappenFailure::MockExpectedCallsDidntHappenFailure(UtestSh MockUnexpectedCallHappenedFailure::MockUnexpectedCallHappenedFailure(UtestShell* test, const SimpleString& name, const MockExpectedCallsList& expectations) : MockFailure(test) { - if (expectations.amountOfExpectationsFor(name)) { - SimpleString ordinalNumber = StringFromOrdinalNumber((unsigned)(expectations.amountOfExpectationsFor(name) + 1)); + unsigned int amountOfExpectations = expectations.amountOfExpectationsFor(name); + if (amountOfExpectations > 0) { + SimpleString ordinalNumber = StringFromOrdinalNumber(amountOfExpectations + 1); message_ = StringFromFormat("Mock Failure: Unexpected additional (%s) call to function: ", ordinalNumber.asCharString()); } else { message_ = "Mock Failure: Unexpected call to function: "; From 2504895c1877fddba658a0a9b1e9b68e9426fc92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Wed, 13 Jul 2016 15:43:22 +0200 Subject: [PATCH 0040/1093] Renamed MockSupport::createActualFunctionCall() to MockSupport::createActualCall(). --- include/CppUTestExt/MockSupport.h | 2 +- src/CppUTestExt/MockSupport.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index ccf024fcb..b58b51d6c 100755 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -119,7 +119,7 @@ class MockSupport protected: MockSupport* clone(const SimpleString& mockName); - virtual MockCheckedActualCall *createActualFunctionCall(); + virtual MockCheckedActualCall *createActualCall(); virtual void failTest(MockFailure& failure); void countCheck(); diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 2010895e8..d2d610a82 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -182,7 +182,7 @@ MockExpectedCall& MockSupport::expectNCalls(unsigned int amount, const SimpleStr return compositeCalls_; } -MockCheckedActualCall* MockSupport::createActualFunctionCall() +MockCheckedActualCall* MockSupport::createActualCall() { lastActualFunctionCall_ = new MockCheckedActualCall(++actualCallOrder_, activeReporter_, expectations_); return lastActualFunctionCall_; @@ -216,7 +216,7 @@ MockActualCall& MockSupport::actualCall(const SimpleString& functionName) return MockIgnoredActualCall::instance(); } - MockCheckedActualCall* call = createActualFunctionCall(); + MockCheckedActualCall* call = createActualCall(); call->withName(scopeFuntionName); return *call; } From f6d698ed4d2e66d65ca268a0c560c0af463d1f6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Wed, 13 Jul 2016 15:50:00 +0200 Subject: [PATCH 0041/1093] Renamed method in test helper class. This is done to avoid confusion between overloaded methods in subsequent implementations. --- tests/CppUTestExt/MockCallTest.cpp | 2 +- .../CppUTestExt/MockFailureReporterForTest.cpp | 2 +- tests/CppUTestExt/MockFailureReporterForTest.h | 2 +- tests/CppUTestExt/MockStrictOrderTest.cpp | 18 +++++++++--------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index 44f3f7829..5d045f783 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -192,7 +192,7 @@ TEST(MockCallTest, expectNoCallDoesntInfluenceExpectOneCall) MockFailureReporterInstaller failureReporterInstaller; MockExpectedCallsListForTest expectations; - expectations.addFunction("influence", MockCheckedExpectedCall::NO_EXPECTED_CALL_ORDER)->callWasMade(1); + expectations.addFunction("influence")->callWasMade(1); MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); mock().expectNoCall("lazy"); diff --git a/tests/CppUTestExt/MockFailureReporterForTest.cpp b/tests/CppUTestExt/MockFailureReporterForTest.cpp index 5ffbaef88..923ad57bf 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.cpp +++ b/tests/CppUTestExt/MockFailureReporterForTest.cpp @@ -104,7 +104,7 @@ MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(const SimpleS return newCall; } -MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(const SimpleString& name, unsigned int order) +MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunctionOrdered(const SimpleString& name, unsigned int order) { MockCheckedExpectedCall* newCall = addFunction(name); newCall->withCallOrder(order); diff --git a/tests/CppUTestExt/MockFailureReporterForTest.h b/tests/CppUTestExt/MockFailureReporterForTest.h index 3beedd887..21f0af425 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.h +++ b/tests/CppUTestExt/MockFailureReporterForTest.h @@ -60,7 +60,7 @@ class MockExpectedCallsListForTest : public MockExpectedCallsList public: ~MockExpectedCallsListForTest(); MockCheckedExpectedCall* addFunction(const SimpleString& name); - MockCheckedExpectedCall* addFunction(const SimpleString& name, unsigned int order); + MockCheckedExpectedCall* addFunctionOrdered(const SimpleString& name, unsigned int order); }; #endif diff --git a/tests/CppUTestExt/MockStrictOrderTest.cpp b/tests/CppUTestExt/MockStrictOrderTest.cpp index 41fe96d9d..6c8c53d13 100644 --- a/tests/CppUTestExt/MockStrictOrderTest.cpp +++ b/tests/CppUTestExt/MockStrictOrderTest.cpp @@ -66,9 +66,9 @@ TEST(MockStrictOrderTest, orderViolated) mock().strictOrder(); MockExpectedCallsListForTest expectations; - expectations.addFunction("foo1", 1)->callWasMade(1); - expectations.addFunction("foo1", 2)->callWasMade(3); - expectations.addFunction("foo2", 3)->callWasMade(2); + expectations.addFunctionOrdered("foo1", 1)->callWasMade(1); + expectations.addFunctionOrdered("foo1", 2)->callWasMade(3); + expectations.addFunctionOrdered("foo2", 3)->callWasMade(2); MockCallOrderFailure expectedFailure(mockFailureTest(), expectations); mock().expectOneCall("foo1"); @@ -89,8 +89,8 @@ TEST(MockStrictOrderTest, orderViolatedWorksHierarchically) mock("bla").strictOrder(); MockExpectedCallsListForTest expectations; - expectations.addFunction("foo::foo1", 1)->callWasMade(2); - expectations.addFunction("foo::foo2", 2)->callWasMade(1); + expectations.addFunctionOrdered("foo::foo1", 1)->callWasMade(2); + expectations.addFunctionOrdered("foo::foo2", 2)->callWasMade(1); MockCallOrderFailure expectedFailure(mockFailureTest(), expectations); mock("bla").expectOneCall("foo1"); @@ -113,8 +113,8 @@ TEST(MockStrictOrderTest, orderViolatedWorksWithExtraUnexpectedCall) mock().ignoreOtherCalls(); MockExpectedCallsListForTest expectations; - expectations.addFunction("foo::foo1", 1)->callWasMade(2); - expectations.addFunction("foo::foo2", 2)->callWasMade(1); + expectations.addFunctionOrdered("foo::foo1", 1)->callWasMade(2); + expectations.addFunctionOrdered("foo::foo2", 2)->callWasMade(1); MockCallOrderFailure expectedFailure(mockFailureTest(), expectations); mock("bla").expectOneCall("foo1"); @@ -137,8 +137,8 @@ TEST(MockStrictOrderTest, orderViolatedWithinAScope) mock().strictOrder(); MockExpectedCallsListForTest expectations; - expectations.addFunction("scope::foo1", 1)->callWasMade(2); - expectations.addFunction("scope::foo2", 2)->callWasMade(1); + expectations.addFunctionOrdered("scope::foo1", 1)->callWasMade(2); + expectations.addFunctionOrdered("scope::foo2", 2)->callWasMade(1); MockCallOrderFailure expectedFailure(mockFailureTest(), expectations); mock("scope").expectOneCall("foo1"); From cebf6e3bf5f832cc125cdb6c4306d867afde6f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Wed, 13 Jul 2016 20:37:26 +0200 Subject: [PATCH 0042/1093] Optimized MockExpectedCallsList::isEmpty(). This simple modification changes the order of this function to O(1) instead of O(n). Taking in account that this function is called at least once each time that an actual call is created, or withParameter()/onObject() is called on it, the overall actual calls processing can be reduced from O(n!) to O(n)! --- src/CppUTestExt/MockExpectedCallsList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTestExt/MockExpectedCallsList.cpp b/src/CppUTestExt/MockExpectedCallsList.cpp index a1309e301..a963b0a8b 100644 --- a/src/CppUTestExt/MockExpectedCallsList.cpp +++ b/src/CppUTestExt/MockExpectedCallsList.cpp @@ -60,7 +60,7 @@ unsigned int MockExpectedCallsList::size() const bool MockExpectedCallsList::isEmpty() const { - return size() == 0; + return head_ == NULL; } From fd7e32dcfefad157e42162f49715165f0f83bea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Sun, 26 Jun 2016 16:32:47 +0200 Subject: [PATCH 0043/1093] Basic implementation of "multi-matching" expectedCalls. Now a single expectedCall object can match multiple actual calls. The method expectNCalls is not handled any more as just a collection of N expectedCall objects, but just a single expectedCall that requires exactly N calls to be considered fulfilled. Strict ordering checks are not working for the moment, except when all expected calls are for exactly 1 call (e.g. only using expectOneCall). Actual calls order is not registered properly, so for the meantime failure messages just show the expectations that were fulfilled in declaration order, as it has no sense anymore to order them by call order. Composite calls are not needed any more, they have been disabled by pre- compiling them out (#if 0) along with their tests. --- include/CppUTestExt/MockCheckedActualCall.h | 3 +- include/CppUTestExt/MockCheckedExpectedCall.h | 7 + include/CppUTestExt/MockExpectedCallsList.h | 4 +- include/CppUTestExt/MockSupport.h | 3 +- src/CppUTestExt/MockActualCall.cpp | 31 ++- src/CppUTestExt/MockExpectedCall.cpp | 66 ++++--- src/CppUTestExt/MockExpectedCallsList.cpp | 34 +--- src/CppUTestExt/MockFailure.cpp | 16 +- src/CppUTestExt/MockSupport.cpp | 30 ++- .../CppUTestExt/ExpectedFunctionsListTest.cpp | 29 +-- tests/CppUTestExt/MockCallTest.cpp | 50 ++++- tests/CppUTestExt/MockExpectedCallTest.cpp | 178 +++++++++++++----- .../MockFailureReporterForTest.cpp | 8 + .../CppUTestExt/MockFailureReporterForTest.h | 1 + tests/CppUTestExt/MockFailureTest.cpp | 84 +++++---- tests/CppUTestExt/MockStrictOrderTest.cpp | 2 +- 16 files changed, 354 insertions(+), 192 deletions(-) diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index dddbf5782..93e50c316 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -105,7 +105,7 @@ class MockCheckedActualCall : public MockActualCall virtual void failTest(const MockFailure& failure); virtual void checkInputParameter(const MockNamedValue& actualParameter); virtual void checkOutputParameter(const MockNamedValue& outputParameter); - virtual void callIsInProgress(); + virtual void discardCurrentlyMatchingExpectations(); enum ActualCallState { CALL_IN_PROGRESS, @@ -120,6 +120,7 @@ class MockCheckedActualCall : public MockActualCall MockFailureReporter* reporter_; ActualCallState state_; + bool expectationsChecked_; MockCheckedExpectedCall* matchingExpectation_; MockExpectedCallsList potentiallyMatchingExpectations_; diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index 6c6f01920..24067971f 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -36,6 +36,7 @@ class MockCheckedExpectedCall : public MockExpectedCall public: MockCheckedExpectedCall(); + MockCheckedExpectedCall(unsigned int numCalls); virtual ~MockCheckedExpectedCall(); virtual MockExpectedCall& withName(const SimpleString& name) _override; @@ -103,6 +104,8 @@ class MockCheckedExpectedCall : public MockExpectedCall enum { NOT_CALLED_YET = 0, NO_EXPECTED_CALL_ORDER = 0 }; virtual unsigned int getCallOrder() const; + virtual unsigned int getActualCallsFulfilled() const; + protected: void setName(const SimpleString& name); SimpleString getName() const; @@ -133,8 +136,11 @@ class MockCheckedExpectedCall : public MockExpectedCall MockNamedValue returnValue_; void* objectPtr_; bool wasPassedToObject_; + unsigned int actualCalls_; + unsigned int expectedCalls_; }; +#if 0 struct MockExpectedCallCompositeNode; class MockExpectedCallComposite : public MockExpectedCall { @@ -178,6 +184,7 @@ class MockExpectedCallComposite : public MockExpectedCall private: MockExpectedCallCompositeNode* head_; }; +#endif class MockIgnoredExpectedCall: public MockExpectedCall { diff --git a/include/CppUTestExt/MockExpectedCallsList.h b/include/CppUTestExt/MockExpectedCallsList.h index aec8c25e5..94723890d 100644 --- a/include/CppUTestExt/MockExpectedCallsList.h +++ b/include/CppUTestExt/MockExpectedCallsList.h @@ -40,7 +40,7 @@ class MockExpectedCallsList virtual void deleteAllExpectationsAndClearList(); virtual unsigned int size() const; - virtual unsigned int amountOfExpectationsFor(const SimpleString& name) const; + virtual unsigned int amountOfActualCallsFulfilledFor(const SimpleString& name) const; virtual unsigned int amountOfUnfulfilledExpectations() const; virtual bool hasUnfulfilledExpectations() const; virtual bool hasFinalizedMatchingExpectations() const; @@ -69,7 +69,6 @@ class MockExpectedCallsList virtual MockCheckedExpectedCall* getFirstMatchingExpectation(); virtual void resetActualCallMatchingState(); - virtual void callWasMade(unsigned int callOrder); virtual void wasPassedToObject(); virtual void parameterWasPassed(const SimpleString& parameterName); virtual void outputParameterWasPassed(const SimpleString& parameterName); @@ -91,7 +90,6 @@ class MockExpectedCallsList : expectedCall_(expectedCall), next_(NULL) {} }; - virtual MockExpectedCallsListNode* findNodeWithCallOrderOf(unsigned int callOrder) const; private: MockExpectedCallsListNode* head_; diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index b58b51d6c..60517e3b4 100755 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -135,7 +135,6 @@ class MockSupport bool ignoreOtherCalls_; bool enabled_; MockCheckedActualCall *lastActualFunctionCall_; - MockExpectedCallComposite compositeCalls_; MockNamedValueComparatorsAndCopiersRepository comparatorsAndCopiersRepository_; MockNamedValueList data_; const SimpleString mockName_; @@ -144,7 +143,7 @@ class MockSupport void checkExpectationsOfLastActualCall(); bool wasLastActualCallFulfilled(); - void failTestWithUnexpectedCalls(); + void failTestWithExpectedCallsNotFulfilled(); void failTestWithOutOfOrderCalls(); MockNamedValue* retrieveDataFromStore(const SimpleString& name); diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 66f3ef2a3..151cce360 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -50,7 +50,8 @@ SimpleString MockCheckedActualCall::getName() const } MockCheckedActualCall::MockCheckedActualCall(unsigned int callOrder, MockFailureReporter* reporter, const MockExpectedCallsList& allExpectations) - : callOrder_(callOrder), reporter_(reporter), state_(CALL_SUCCEED), matchingExpectation_(NULL), allExpectations_(allExpectations), outputParameterExpectations_(NULL) + : callOrder_(callOrder), reporter_(reporter), state_(CALL_SUCCEED), expectationsChecked_(false), matchingExpectation_(NULL), + allExpectations_(allExpectations), outputParameterExpectations_(NULL) { potentiallyMatchingExpectations_.addPotentiallyMatchingExpectations(allExpectations); } @@ -124,9 +125,8 @@ void MockCheckedActualCall::callHasSucceeded() setState(CALL_SUCCEED); } -void MockCheckedActualCall::callIsInProgress() +void MockCheckedActualCall::discardCurrentlyMatchingExpectations() { - setState(CALL_IN_PROGRESS); if (matchingExpectation_) { matchingExpectation_->resetActualCallMatchingState(); @@ -138,7 +138,7 @@ void MockCheckedActualCall::callIsInProgress() MockActualCall& MockCheckedActualCall::withName(const SimpleString& name) { setName(name); - callIsInProgress(); + setState(CALL_IN_PROGRESS); potentiallyMatchingExpectations_.onlyKeepExpectationsRelatedTo(name); if (potentiallyMatchingExpectations_.isEmpty()) { @@ -147,7 +147,6 @@ MockActualCall& MockCheckedActualCall::withName(const SimpleString& name) return *this; } - potentiallyMatchingExpectations_.callWasMade(callOrder_); completeCallWhenMatchIsFound(); return *this; @@ -165,7 +164,8 @@ void MockCheckedActualCall::checkInputParameter(const MockNamedValue& actualPara return; } - callIsInProgress(); + setState(CALL_IN_PROGRESS); + discardCurrentlyMatchingExpectations(); potentiallyMatchingExpectations_.onlyKeepExpectationsWithInputParameter(actualParameter); @@ -186,7 +186,8 @@ void MockCheckedActualCall::checkOutputParameter(const MockNamedValue& outputPar return; } - callIsInProgress(); + setState(CALL_IN_PROGRESS); + discardCurrentlyMatchingExpectations(); potentiallyMatchingExpectations_.onlyKeepExpectationsWithOutputParameter(outputParameter); @@ -336,8 +337,16 @@ bool MockCheckedActualCall::hasFailed() const void MockCheckedActualCall::checkExpectations() { - if (state_ != CALL_IN_PROGRESS) - { + if(expectationsChecked_) { + return; + } + + expectationsChecked_ = true; + + if (state_ != CALL_IN_PROGRESS) { + if(state_ == CALL_SUCCEED) { + matchingExpectation_->callWasMade(callOrder_); + } potentiallyMatchingExpectations_.resetActualCallMatchingState(); return; } @@ -349,6 +358,7 @@ void MockCheckedActualCall::checkExpectations() if (matchingExpectation_) { matchingExpectation_->finalizeActualCallMatch(); callHasSucceeded(); + matchingExpectation_->callWasMade(callOrder_); potentiallyMatchingExpectations_.resetActualCallMatchingState(); return; } @@ -517,7 +527,8 @@ MockActualCall& MockCheckedActualCall::onObject(const void* objectPtr) return *this; } - callIsInProgress(); + setState(CALL_IN_PROGRESS); + discardCurrentlyMatchingExpectations(); potentiallyMatchingExpectations_.onlyKeepExpectationsOnObject(objectPtr); diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index 50eab3acb..fdc97fe18 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -52,7 +52,18 @@ SimpleString MockCheckedExpectedCall::getName() const } MockCheckedExpectedCall::MockCheckedExpectedCall() - : ignoreOtherParameters_(false), isActualCallMatchFinalized_(false), actualCallOrder_(0), expectedCallOrder_(NO_EXPECTED_CALL_ORDER), outOfOrder_(true), returnValue_(""), objectPtr_(NULL), wasPassedToObject_(true) + : ignoreOtherParameters_(false), isActualCallMatchFinalized_(false), actualCallOrder_(NOT_CALLED_YET), expectedCallOrder_(NO_EXPECTED_CALL_ORDER), + outOfOrder_(false), returnValue_(""), objectPtr_(NULL), wasPassedToObject_(true), + actualCalls_(0), expectedCalls_(1) +{ + inputParameters_ = new MockNamedValueList(); + outputParameters_ = new MockNamedValueList(); +} + +MockCheckedExpectedCall::MockCheckedExpectedCall(unsigned int numCalls) + : ignoreOtherParameters_(false), isActualCallMatchFinalized_(false), actualCallOrder_(NOT_CALLED_YET), expectedCallOrder_(NO_EXPECTED_CALL_ORDER), + outOfOrder_(false), returnValue_(""), objectPtr_(NULL), wasPassedToObject_(true), + actualCalls_(0), expectedCalls_(numCalls) { inputParameters_ = new MockNamedValueList(); outputParameters_ = new MockNamedValueList(); @@ -69,7 +80,6 @@ MockCheckedExpectedCall::~MockCheckedExpectedCall() MockExpectedCall& MockCheckedExpectedCall::withName(const SimpleString& name) { setName(name); - actualCallOrder_ = NOT_CALLED_YET; return *this; } @@ -236,12 +246,12 @@ MockExpectedCall& MockCheckedExpectedCall::ignoreOtherParameters() bool MockCheckedExpectedCall::isFulfilled() { - return isMatchingActualCallAndFinalized(); + return (actualCalls_ == expectedCalls_); } bool MockCheckedExpectedCall::canMatchActualCalls() { - return !isFulfilled(); + return (actualCalls_ < expectedCalls_); } bool MockCheckedExpectedCall::isMatchingActualCallAndFinalized() @@ -251,18 +261,22 @@ bool MockCheckedExpectedCall::isMatchingActualCallAndFinalized() bool MockCheckedExpectedCall::isMatchingActualCall() { - return (actualCallOrder_ != NOT_CALLED_YET) && areParametersMatchingActualCall() && wasPassedToObject_; + return areParametersMatchingActualCall() && wasPassedToObject_; } void MockCheckedExpectedCall::callWasMade(unsigned int callOrder) { + actualCalls_++; actualCallOrder_ = callOrder; + if (expectedCallOrder_ == NO_EXPECTED_CALL_ORDER) outOfOrder_ = false; else if (actualCallOrder_ == expectedCallOrder_) outOfOrder_ = false; else outOfOrder_ = true; + + resetActualCallMatchingState(); } void MockCheckedExpectedCall::finalizeActualCallMatch() @@ -338,28 +352,31 @@ SimpleString MockCheckedExpectedCall::callToString() if (inputParameters_->begin() == NULL && outputParameters_->begin() == NULL) { str += (ignoreOtherParameters_) ? "all parameters ignored" : "no parameters"; - return str; - } + } else { + MockNamedValueListNode* p; - MockNamedValueListNode* p; + for (p = inputParameters_->begin(); p; p = p->next()) { + str += StringFromFormat("%s %s: <%s>", p->getType().asCharString(), p->getName().asCharString(), getInputParameterValueString(p->getName()).asCharString()); + if (p->next()) str += ", "; + } - for (p = inputParameters_->begin(); p; p = p->next()) { - str += StringFromFormat("%s %s: <%s>", p->getType().asCharString(), p->getName().asCharString(), getInputParameterValueString(p->getName()).asCharString()); - if (p->next()) str += ", "; - } + if (inputParameters_->begin() && outputParameters_->begin()) + { + str += ", "; + } - if (inputParameters_->begin() && outputParameters_->begin()) - { - str += ", "; - } + for (p = outputParameters_->begin(); p; p = p->next()) { + str += StringFromFormat("%s %s: ", p->getType().asCharString(), p->getName().asCharString()); + if (p->next()) str += ", "; + } - for (p = outputParameters_->begin(); p; p = p->next()) { - str += StringFromFormat("%s %s: ", p->getType().asCharString(), p->getName().asCharString()); - if (p->next()) str += ", "; + if (ignoreOtherParameters_) + str += ", other parameters are ignored"; } - if (ignoreOtherParameters_) - str += ", other parameters are ignored"; + str += StringFromFormat(" (expected %d call%s, called %d time%s)", + expectedCalls_, (expectedCalls_ == 1) ? "" : "s", actualCalls_, (actualCalls_ == 1) ? "" : "s" ); + return str; } @@ -511,6 +528,12 @@ bool MockCheckedExpectedCall::isOutOfOrder() const return outOfOrder_; } +unsigned int MockCheckedExpectedCall::getActualCallsFulfilled() const +{ + return actualCalls_; +} + +#if 0 struct MockExpectedCallCompositeNode { MockExpectedCallCompositeNode(MockExpectedCall& functionCall, MockExpectedCallCompositeNode* next) : next_(next), call_(functionCall){} @@ -737,6 +760,7 @@ MockExpectedCall& MockExpectedCallComposite::onObject(void* object) node->call_.onObject(object); return *this; } +#endif MockExpectedCall& MockIgnoredExpectedCall::instance() { diff --git a/src/CppUTestExt/MockExpectedCallsList.cpp b/src/CppUTestExt/MockExpectedCallsList.cpp index a963b0a8b..e53afdb80 100644 --- a/src/CppUTestExt/MockExpectedCallsList.cpp +++ b/src/CppUTestExt/MockExpectedCallsList.cpp @@ -63,14 +63,15 @@ bool MockExpectedCallsList::isEmpty() const return head_ == NULL; } - -unsigned int MockExpectedCallsList::amountOfExpectationsFor(const SimpleString& name) const +unsigned int MockExpectedCallsList::amountOfActualCallsFulfilledFor(const SimpleString& name) const { unsigned int count = 0; - for (MockExpectedCallsListNode* p = head_; p; p = p->next_) - if (p->expectedCall_->relatesTo(name)) count++; + for (MockExpectedCallsListNode* p = head_; p; p = p->next_) { + if (p->expectedCall_->relatesTo(name)) { + count += p->expectedCall_->getActualCallsFulfilled(); + } + } return count; - } unsigned int MockExpectedCallsList::amountOfUnfulfilledExpectations() const @@ -285,12 +286,6 @@ void MockExpectedCallsList::resetActualCallMatchingState() p->expectedCall_->resetActualCallMatchingState(); } -void MockExpectedCallsList::callWasMade(unsigned int callOrder) -{ - for (MockExpectedCallsListNode* p = head_; p; p = p->next_) - p->expectedCall_->callWasMade(callOrder); -} - void MockExpectedCallsList::wasPassedToObject() { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) @@ -310,14 +305,6 @@ void MockExpectedCallsList::outputParameterWasPassed(const SimpleString& paramet p->expectedCall_->outputParameterWasPassed(parameterName); } -MockExpectedCallsList::MockExpectedCallsListNode* MockExpectedCallsList::findNodeWithCallOrderOf(unsigned int callOrder) const -{ - for (MockExpectedCallsListNode* p = head_; p; p = p->next_) - if (p->expectedCall_->getCallOrder() == callOrder && p->expectedCall_->isFulfilled()) - return p; - return NULL; -} - static SimpleString stringOrNoneTextWhenEmpty(const SimpleString& inputString, const SimpleString& linePrefix) { SimpleString str = inputString; @@ -350,10 +337,9 @@ SimpleString MockExpectedCallsList::fulfilledCallsToString(const SimpleString& l { SimpleString str; - MockExpectedCallsListNode* nextNodeInOrder; - for (unsigned int callOrder = 1; (nextNodeInOrder = findNodeWithCallOrderOf(callOrder)); callOrder++) - if (nextNodeInOrder) - str = appendStringOnANewLine(str, linePrefix, nextNodeInOrder->expectedCall_->callToString()); + for (MockExpectedCallsListNode* p = head_; p; p = p->next_) + if (p->expectedCall_->isFulfilled()) + str = appendStringOnANewLine(str, linePrefix, p->expectedCall_->callToString()); return stringOrNoneTextWhenEmpty(str, linePrefix); } @@ -362,7 +348,7 @@ SimpleString MockExpectedCallsList::missingParametersToString() const { SimpleString str; for (MockExpectedCallsListNode* p = head_; p; p = p->next_) - if (! p->expectedCall_->isFulfilled()) + if (! p->expectedCall_->isMatchingActualCall()) str = appendStringOnANewLine(str, "", p->expectedCall_->missingParametersToString()); return stringOrNoneTextWhenEmpty(str, ""); diff --git a/src/CppUTestExt/MockFailure.cpp b/src/CppUTestExt/MockFailure.cpp index b7a3ad8e1..252387614 100644 --- a/src/CppUTestExt/MockFailure.cpp +++ b/src/CppUTestExt/MockFailure.cpp @@ -71,9 +71,9 @@ MockFailure::MockFailure(UtestShell* test) : TestFailure(test, "Test failed with void MockFailure::addExpectationsAndCallHistory(const MockExpectedCallsList& expectations) { - message_ += "\tEXPECTED calls that did NOT happen:\n"; + message_ += "\tEXPECTED calls that WERE NOT fulfilled:\n"; message_ += expectations.unfulfilledCallsToString("\t\t"); - message_ += "\n\tACTUAL calls that did happen (in call order):\n"; + message_ += "\n\tEXPECTED calls that WERE fulfilled:\n"; message_ += expectations.fulfilledCallsToString("\t\t"); } @@ -82,13 +82,13 @@ void MockFailure::addExpectationsAndCallHistoryRelatedTo(const SimpleString& nam MockExpectedCallsList expectationsForFunction; expectationsForFunction.addExpectationsRelatedTo(name, expectations); - message_ += "\tEXPECTED calls that DID NOT happen related to function: "; + message_ += "\tEXPECTED calls that WERE NOT fulfilled related to function: "; message_ += name; message_ += "\n"; message_ += expectationsForFunction.unfulfilledCallsToString("\t\t"); - message_ += "\n\tACTUAL calls that DID happen related to function: "; + message_ += "\n\tEXPECTED calls that WERE fulfilled related to function: "; message_ += name; message_ += "\n"; @@ -97,15 +97,15 @@ void MockFailure::addExpectationsAndCallHistoryRelatedTo(const SimpleString& nam MockExpectedCallsDidntHappenFailure::MockExpectedCallsDidntHappenFailure(UtestShell* test, const MockExpectedCallsList& expectations) : MockFailure(test) { - message_ = "Mock Failure: Expected call did not happen.\n"; + message_ = "Mock Failure: Expected call WAS NOT fulfilled.\n"; addExpectationsAndCallHistory(expectations); } MockUnexpectedCallHappenedFailure::MockUnexpectedCallHappenedFailure(UtestShell* test, const SimpleString& name, const MockExpectedCallsList& expectations) : MockFailure(test) { - unsigned int amountOfExpectations = expectations.amountOfExpectationsFor(name); - if (amountOfExpectations > 0) { - SimpleString ordinalNumber = StringFromOrdinalNumber(amountOfExpectations + 1); + unsigned int amountOfActualCalls = expectations.amountOfActualCallsFulfilledFor(name); + if (amountOfActualCalls > 0) { + SimpleString ordinalNumber = StringFromOrdinalNumber(amountOfActualCalls + 1); message_ = StringFromFormat("Mock Failure: Unexpected additional (%s) call to function: ", ordinalNumber.asCharString()); } else { message_ = "Mock Failure: Unexpected call to function: "; diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index d2d610a82..324cfd17a 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -120,7 +120,6 @@ void MockSupport::clear() expectations_.deleteAllExpectationsAndClearList(); unExpectations_.deleteAllExpectationsAndClearList(); - compositeCalls_.clear(); ignoreOtherCalls_ = false; enabled_ = true; actualCallOrder_ = 0; @@ -150,16 +149,7 @@ SimpleString MockSupport::appendScopeToName(const SimpleString& functionName) MockExpectedCall& MockSupport::expectOneCall(const SimpleString& functionName) { - if (!enabled_) return MockIgnoredExpectedCall::instance(); - - countCheck(); - - MockCheckedExpectedCall* call = new MockCheckedExpectedCall; - call->withName(appendScopeToName(functionName)); - if (strictOrdering_) - call->withCallOrder(++expectedCallOrder_); - expectations_.addExpectedCall(call); - return *call; + return expectNCalls(1, functionName); } void MockSupport::expectNoCall(const SimpleString& functionName) @@ -175,11 +165,17 @@ void MockSupport::expectNoCall(const SimpleString& functionName) MockExpectedCall& MockSupport::expectNCalls(unsigned int amount, const SimpleString& functionName) { - compositeCalls_.clear(); + if (!enabled_) return MockIgnoredExpectedCall::instance(); + + countCheck(); - for (unsigned int i = 0; i < amount; i++) - compositeCalls_.add(expectOneCall(functionName)); - return compositeCalls_; + MockCheckedExpectedCall* call = new MockCheckedExpectedCall(amount); + call->withName(appendScopeToName(functionName)); + if (strictOrdering_) { + call->withCallOrder(++expectedCallOrder_); + } + expectations_.addExpectedCall(call); + return *call; } MockCheckedActualCall* MockSupport::createActualCall() @@ -280,7 +276,7 @@ bool MockSupport::wasLastActualCallFulfilled() return true; } -void MockSupport::failTestWithUnexpectedCalls() +void MockSupport::failTestWithExpectedCallsNotFulfilled() { MockExpectedCallsList expectationsList; expectationsList.addExpectations(expectations_); @@ -347,7 +343,7 @@ void MockSupport::checkExpectations() checkExpectationsOfLastActualCall(); if (wasLastActualCallFulfilled() && expectedCallsLeft()) - failTestWithUnexpectedCalls(); + failTestWithExpectedCallsNotFulfilled(); if (hasCallsOutOfOrder()) failTestWithOutOfOrderCalls(); diff --git a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp index 8c81850fe..c518a947b 100644 --- a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp +++ b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp @@ -116,9 +116,7 @@ TEST(MockExpectedCallsList, onlyKeepUnmatchingExpectations) { call1->withName("relate"); call2->withName("unrelate"); - call3->withName("relate"); - call2->callWasMade(1); - call3->callWasMade(2); + call3->withName("relate").withParameter("param",1); list->addExpectedCall(call1); list->addExpectedCall(call2); list->addExpectedCall(call3); @@ -218,20 +216,24 @@ TEST(MockExpectedCallsList, addPotentiallyMatchingExpectationsMultipleUnmatchedE LONGS_EQUAL(2, newList.size()); } -TEST(MockExpectedCallsList, amountOfExpectationsFor) +TEST(MockExpectedCallsList, amountOfActualCallsFulfilledFor_HasOneRelated) { call1->withName("foo"); + call1->callWasMade(1); call2->withName("bar"); + call2->callWasMade(2); list->addExpectedCall(call1); list->addExpectedCall(call2); - LONGS_EQUAL(1, list->amountOfExpectationsFor("bar")); + LONGS_EQUAL(1, list->amountOfActualCallsFulfilledFor("bar")); } -TEST(MockExpectedCallsList, amountOfExpectationsForHasNone) +TEST(MockExpectedCallsList, amountOfActualCallsFulfilledFor_HasNone) { call1->withName("foo"); + call1->callWasMade(1); + call2->withName("bar"); list->addExpectedCall(call1); - LONGS_EQUAL(0, list->amountOfExpectationsFor("bar")); + LONGS_EQUAL(0, list->amountOfActualCallsFulfilledFor("bar")); } TEST(MockExpectedCallsList, callToStringForUnfulfilledFunctions) @@ -262,7 +264,7 @@ TEST(MockExpectedCallsList, callToStringForFulfilledFunctions) list->addExpectedCall(call2); SimpleString expectedString; - expectedString = StringFromFormat("%s\n%s", call2->callToString().asCharString(), call1->callToString().asCharString()); + expectedString = StringFromFormat("%s\n%s", call1->callToString().asCharString(), call2->callToString().asCharString()); STRCMP_EQUAL(expectedString.asCharString(), list->fulfilledCallsToString().asCharString()); } @@ -288,6 +290,9 @@ TEST(MockExpectedCallsList, hasFinalizedMatchingExpectations_emptyList) TEST(MockExpectedCallsList, hasFinalizedMatchingExpectations_listHasNonMatchingCalls) { + call1->withParameter("param", 0); + call2->withParameter("param", 0); + call3->withParameter("param", 0); list->addExpectedCall(call1); list->addExpectedCall(call2); list->addExpectedCall(call3); @@ -300,7 +305,7 @@ TEST(MockExpectedCallsList, hasFinalizedMatchingExpectations_listHasMatchingButN list->addExpectedCall(call1); list->addExpectedCall(call2); call1->ignoreOtherParameters(); - call1->callWasMade(1); + call2->withParameter("param", 0); CHECK(! list->hasFinalizedMatchingExpectations()); } @@ -310,7 +315,8 @@ TEST(MockExpectedCallsList, hasFinalizedMatchingExpectations_listHasFinalizedCal list->addExpectedCall(call1); list->addExpectedCall(call2); call1->ignoreOtherParameters(); - call1->callWasMade(1); + call2->withParameter("param", 0); + call1->finalizeActualCallMatch(); CHECK(list->hasFinalizedMatchingExpectations()); @@ -321,7 +327,8 @@ TEST(MockExpectedCallsList, hasFinalizedMatchingExpectations_listHasFinalizedCal list->addExpectedCall(call1); list->addExpectedCall(call2); call1->withParameter("param", 1); - call1->callWasMade(1); + call2->withParameter("param", 0); + call1->inputParameterWasPassed("param"); CHECK(list->hasFinalizedMatchingExpectations()); diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index 5d045f783..b2bdc26ea 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -49,20 +49,39 @@ TEST(MockCallTest, checkExpectationsDoesntFail) mock().checkExpectations(); } -TEST(MockCallTest, exceptACallThatHappens) +TEST(MockCallTest, expectASingleCallThatHappens) { mock().expectOneCall("func"); - mock().actualCall("func"); + MockCheckedActualCall& actualCall = (MockCheckedActualCall&) mock().actualCall("func"); + actualCall.checkExpectations(); CHECK(! mock().expectedCallsLeft()); } -TEST(MockCallTest, exceptACallInceasesExpectedCallsLeft) +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; @@ -147,7 +166,7 @@ TEST(MockCallTest, expectOneCallInScopeButActualCallInGlobal) } -TEST(MockCallTest, expectMultipleCallsThatHappen) +TEST(MockCallTest, expectMultipleSingleCallsThatHappen) { mock().expectOneCall("foo"); mock().expectOneCall("foo"); @@ -383,7 +402,7 @@ TEST(MockCallTest, OnObjectExpectedButNotCalled) CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } -TEST(MockCallTest, expectMultipleCalls) +TEST(MockCallTest, expectNCalls_Fulfilled) { mock().expectNCalls(2, "boo"); mock().actualCall("boo"); @@ -391,15 +410,34 @@ TEST(MockCallTest, expectMultipleCalls) 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) @@ -429,6 +467,6 @@ TEST(MockCallTest, mockExpectationShouldIncreaseNumberOfChecks) TestTestingFixture fixture; fixture.setTestFunction(mocksAreCountedAsChecksTestFunction_); fixture.runAllTests(); - LONGS_EQUAL(5, fixture.getCheckCount()); + LONGS_EQUAL(3, fixture.getCheckCount()); } diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 2c3227f97..5e73c9e35 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -385,58 +385,121 @@ TEST(MockExpectedCall, callWithThreeDifferentParameter) DOUBLES_EQUAL(0.12, call->getInputParameter("double").getDoubleValue(), 0.05); } -TEST(MockExpectedCall, withoutANameItsNotFulfilled) +TEST(MockExpectedCall, singleCallNotMadeIsNotFulfilledButCanMatchActualCalls) { - CHECK(!call->isFulfilled()); + MockCheckedExpectedCall expectedCall(1); + expectedCall.withName("name"); + CHECK(!expectedCall.isFulfilled()); + CHECK(expectedCall.canMatchActualCalls()); } -TEST(MockExpectedCall, withANameItsNotFulfilled) +TEST(MockExpectedCall, singleCallMadeIsFulFilledAndCannotMatchActualCalls) { - call->withName("name"); - CHECK(!call->isFulfilled()); + MockCheckedExpectedCall expectedCall(1); + expectedCall.callWasMade(1); + CHECK(expectedCall.isFulfilled()); + CHECK(!expectedCall.canMatchActualCalls()); } -TEST(MockExpectedCall, afterSettingCallFulfilledItsFulFilled) +TEST(MockExpectedCall, multiCallNotMadeIsNotFulfilledButCanMatchActualCalls) { - call->withName("name"); - call->callWasMade(1); - CHECK(call->isFulfilled()); + MockCheckedExpectedCall expectedCall(2); + expectedCall.withName("name"); + CHECK(!expectedCall.isFulfilled()); + CHECK(expectedCall.canMatchActualCalls()); } -TEST(MockExpectedCall, calledButNotWithParameterIsNotFulFilled) +TEST(MockExpectedCall, multiCallNotMadeExpectedTimesIsNotFulfilledButCanMatchActualCalls) { - call->withName("name").withParameter("para", 1); - call->callWasMade(1); - CHECK(!call->isFulfilled()); + MockCheckedExpectedCall expectedCall(2); + expectedCall.withName("name"); + expectedCall.callWasMade(1); + CHECK(!expectedCall.isFulfilled()); + CHECK(expectedCall.canMatchActualCalls()); } -TEST(MockExpectedCall, calledAndParametersAreFulfilled) +TEST(MockExpectedCall, multiCallsMadeExpectedTimesIsFulfilledAndCannotMatchActualCalls) { - call->withName("name").withParameter("para", 1); - call->callWasMade(1); - call->inputParameterWasPassed("para"); - CHECK(call->isFulfilled()); + MockCheckedExpectedCall expectedCall(3); + expectedCall.withName("name"); + expectedCall.callWasMade(1); + expectedCall.callWasMade(2); + expectedCall.callWasMade(3); + CHECK(expectedCall.isFulfilled()); + CHECK(!expectedCall.canMatchActualCalls()); } -TEST(MockExpectedCall, calledButNotAllParametersAreFulfilled) +TEST(MockExpectedCall, multiCallsMadeMoreThanExpectedTimesIsNotFulfilledAndCannotMatchActualCalls) { - call->withName("name").withParameter("para", 1).withParameter("two", 2); - call->callWasMade(1); - call->inputParameterWasPassed("para"); - CHECK(!call->isFulfilled()); + MockCheckedExpectedCall expectedCall(3); + expectedCall.withName("name"); + expectedCall.callWasMade(1); + expectedCall.callWasMade(2); + expectedCall.callWasMade(3); + expectedCall.callWasMade(4); + CHECK(!expectedCall.isFulfilled()); + CHECK(!expectedCall.canMatchActualCalls()); } -TEST(MockExpectedCall, toStringForNoParameters) +TEST(MockExpectedCall, callsWithoutParameterAlwaysMatch) { - call->withName("name"); - STRCMP_EQUAL("name -> no parameters", call->callToString().asCharString()); + MockCheckedExpectedCall expectedCall(1); + CHECK(expectedCall.isMatchingActualCall()); +} + +TEST(MockExpectedCall, callsWithParameterNotFulfilledDontMatch) +{ + MockCheckedExpectedCall expectedCall(1); + expectedCall.withParameter("para", 1); + CHECK(!expectedCall.isMatchingActualCall()); +} + +TEST(MockExpectedCall, callsWithParameterFulfilledDoMatch) +{ + MockCheckedExpectedCall expectedCall(1); + expectedCall.withParameter("para", 1); + expectedCall.inputParameterWasPassed("para"); + CHECK(expectedCall.isMatchingActualCall()); +} + +TEST(MockExpectedCall, callsWithSomeParametersNotFulfilledDontMatch) +{ + MockCheckedExpectedCall expectedCall(1); + expectedCall.withParameter("para", 1).withParameter("two", 2); + expectedCall.inputParameterWasPassed("para"); + CHECK(!expectedCall.isMatchingActualCall()); +} + +TEST(MockExpectedCall, toStringForNoParametersSingleCallNotCalled) +{ + MockCheckedExpectedCall expectedCall(1); + expectedCall.withName("name"); + STRCMP_EQUAL("name -> no parameters (expected 1 call, called 0 times)", expectedCall.callToString().asCharString()); +} + +TEST(MockExpectedCall, toStringForNoParametersMultiCallCalledLessThanExpectedTimes) +{ + MockCheckedExpectedCall expectedCall(2); + expectedCall.withName("name"); + expectedCall.callWasMade(1); + STRCMP_EQUAL("name -> no parameters (expected 2 calls, called 1 time)", expectedCall.callToString().asCharString()); +} + +TEST(MockExpectedCall, toStringForNoParametersMultiCallCalledExpectedTimes) +{ + MockCheckedExpectedCall expectedCall(2); + expectedCall.withName("name"); + expectedCall.callWasMade(1); + expectedCall.callWasMade(2); + STRCMP_EQUAL("name -> no parameters (expected 2 calls, called 2 times)", expectedCall.callToString().asCharString()); } TEST(MockExpectedCall, toStringForIgnoredParameters) { - call->withName("name"); - call->ignoreOtherParameters(); - STRCMP_EQUAL("name -> all parameters ignored", call->callToString().asCharString()); + MockCheckedExpectedCall expectedCall(1); + expectedCall.withName("name"); + expectedCall.ignoreOtherParameters(); + STRCMP_EQUAL("name -> all parameters ignored (expected 1 call, called 0 times)", expectedCall.callToString().asCharString()); } TEST(MockExpectedCall, toStringForMultipleInputParameters) @@ -444,11 +507,14 @@ TEST(MockExpectedCall, toStringForMultipleInputParameters) int int_value = 10; unsigned int uint_value = 7; - call->withName("name"); - call->withParameter("string", "value"); - call->withParameter("integer", int_value); - call->withParameter("unsigned-integer", uint_value); - STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0xa)>, unsigned int unsigned-integer: <7 (0x7)>", call->callToString().asCharString()); + MockCheckedExpectedCall expectedCall(1); + expectedCall.withName("name"); + expectedCall.withParameter("string", "value"); + expectedCall.withParameter("integer", int_value); + expectedCall.withParameter("unsigned-integer", uint_value); + expectedCall.callWasMade(1); + STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0xa)>, unsigned int unsigned-integer: <7 (0x7)> " + "(expected 1 call, called 1 time)", expectedCall.callToString().asCharString()); } TEST(MockExpectedCall, toStringForMultipleInputAndOutputParameters) @@ -457,38 +523,46 @@ TEST(MockExpectedCall, toStringForMultipleInputAndOutputParameters) unsigned int uint_value = 7; unsigned char buffer_value[3]; - call->withName("name"); - call->withParameter("string", "value"); - call->withParameter("integer", int_value); - call->withParameter("unsigned-integer", uint_value); - call->withOutputParameterReturning("buffer", buffer_value, sizeof(buffer_value)); + MockCheckedExpectedCall expectedCall(1); + expectedCall.withName("name"); + expectedCall.withParameter("string", "value"); + expectedCall.withParameter("integer", int_value); + expectedCall.withParameter("unsigned-integer", uint_value); + expectedCall.withOutputParameterReturning("buffer", buffer_value, sizeof(buffer_value)); + expectedCall.callWasMade(1); STRCMP_EQUAL("name -> const char* string: , int integer: <10 (0xa)>, unsigned int unsigned-integer: <7 (0x7)>, " - "const void* buffer: ", call->callToString().asCharString()); + "const void* buffer: (expected 1 call, called 1 time)", expectedCall.callToString().asCharString()); } TEST(MockExpectedCall, toStringForMultipleOutputParameters) { unsigned char buffer_value[3]; - call->withName("name"); - call->withOutputParameterReturning("buffer1", buffer_value, sizeof(buffer_value)); - call->withOutputParameterReturning("buffer2", buffer_value, sizeof(buffer_value)); - STRCMP_EQUAL("name -> const void* buffer1: , const void* buffer2: ", call->callToString().asCharString()); + MockCheckedExpectedCall expectedCall(1); + expectedCall.withName("name"); + expectedCall.withOutputParameterReturning("buffer1", buffer_value, sizeof(buffer_value)); + expectedCall.withOutputParameterReturning("buffer2", buffer_value, sizeof(buffer_value)); + expectedCall.callWasMade(1); + STRCMP_EQUAL("name -> const void* buffer1: , const void* buffer2: (expected 1 call, called 1 time)", expectedCall.callToString().asCharString()); } TEST(MockExpectedCall, toStringForParameterAndIgnored) { - call->withName("name"); - call->withParameter("string", "value"); - call->ignoreOtherParameters(); - STRCMP_EQUAL("name -> const char* string: , other parameters are ignored", call->callToString().asCharString()); + MockCheckedExpectedCall expectedCall(1); + expectedCall.withName("name"); + expectedCall.withParameter("string", "value"); + expectedCall.ignoreOtherParameters(); + expectedCall.callWasMade(1); + STRCMP_EQUAL("name -> const char* string: , other parameters are ignored (expected 1 call, called 1 time)", expectedCall.callToString().asCharString()); } TEST(MockExpectedCall, toStringForCallOrder) { - call->withName("name"); - call->withCallOrder(2); - STRCMP_EQUAL("name -> expected call order: <2> -> no parameters", call->callToString().asCharString()); + MockCheckedExpectedCall expectedCall(1); + expectedCall.withName("name"); + expectedCall.withCallOrder(2); + expectedCall.callWasMade(1); + STRCMP_EQUAL("name -> expected call order: <2> -> no parameters (expected 1 call, called 1 time)", expectedCall.callToString().asCharString()); } TEST(MockExpectedCall, callOrderIsNotFulfilledWithWrongOrder) @@ -553,6 +627,7 @@ TEST(MockExpectedCall, hasNoOutputParameterOfTypeDifferentType) CHECK_FALSE(call->hasOutputParameter(foo)); } +#if 0 static MockExpectedCallComposite composite; TEST_GROUP(MockExpectedCallComposite) @@ -726,6 +801,7 @@ TEST(MockExpectedCallComposite, doesNotSupportCallOrder) fixture.runAllTests(); fixture.assertPrintContains("withCallOrder not supported for CompositeCalls"); } +#endif TEST_GROUP(MockIgnoredExpectedCall) { diff --git a/tests/CppUTestExt/MockFailureReporterForTest.cpp b/tests/CppUTestExt/MockFailureReporterForTest.cpp index 923ad57bf..516e7bb22 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.cpp +++ b/tests/CppUTestExt/MockFailureReporterForTest.cpp @@ -104,6 +104,14 @@ MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(const SimpleS return newCall; } +MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(unsigned int numCalls, const SimpleString& name) +{ + MockCheckedExpectedCall* newCall = new MockCheckedExpectedCall(numCalls); + newCall->withName(name); + addExpectedCall(newCall); + return newCall; +} + MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunctionOrdered(const SimpleString& name, unsigned int order) { MockCheckedExpectedCall* newCall = addFunction(name); diff --git a/tests/CppUTestExt/MockFailureReporterForTest.h b/tests/CppUTestExt/MockFailureReporterForTest.h index 21f0af425..ebc6fd252 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.h +++ b/tests/CppUTestExt/MockFailureReporterForTest.h @@ -60,6 +60,7 @@ class MockExpectedCallsListForTest : public MockExpectedCallsList public: ~MockExpectedCallsListForTest(); MockCheckedExpectedCall* addFunction(const SimpleString& name); + MockCheckedExpectedCall* addFunction(unsigned int numCalls, const SimpleString& name); MockCheckedExpectedCall* addFunctionOrdered(const SimpleString& name, unsigned int order); }; diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index d1356515f..ca2935231 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -65,12 +65,22 @@ TEST_GROUP(MockFailureTest) void checkUnexpectedNthCallMessage(unsigned int count, const char* expectedOrdinal) { MockExpectedCallsList callList; - MockCheckedExpectedCall expCall; + MockCheckedExpectedCall expectedCallSingle(1); + MockCheckedExpectedCall expectedCallMulti(count-1); - expCall.withName("bar"); - for (unsigned int i = 0; i < (count - 1); i++) { - expCall.callWasMade(1); - callList.addExpectedCall(&expCall); + expectedCallSingle.withName("bar"); + expectedCallMulti.withName("bar"); + + if (count > 1) { + callList.addExpectedCall(&expectedCallSingle); + expectedCallSingle.callWasMade(1); + } + + if (count > 2) { + callList.addExpectedCall(&expectedCallMulti); + for (unsigned int i = 1; i < (count - 1); i++) { + expectedCallMulti.callWasMade(i+1); + } } MockUnexpectedCallHappenedFailure failure(UtestShell::getCurrent(), "bar", callList); @@ -90,9 +100,9 @@ TEST(MockFailureTest, unexpectedCallHappened) { MockUnexpectedCallHappenedFailure failure(UtestShell::getCurrent(), "foobar", *list); STRCMP_EQUAL("Mock Failure: Unexpected call to function: foobar\n" - "\tEXPECTED calls that did NOT happen:\n" + "\tEXPECTED calls that WERE NOT fulfilled:\n" "\t\t\n" - "\tACTUAL calls that did happen (in call order):\n" + "\tEXPECTED calls that WERE fulfilled:\n" "\t\t", failure.getMessage().asCharString()); } @@ -105,12 +115,12 @@ TEST(MockFailureTest, expectedCallDidNotHappen) addAllToList(); MockExpectedCallsDidntHappenFailure failure(UtestShell::getCurrent(), *list); - STRCMP_EQUAL("Mock Failure: Expected call did not happen.\n" - "\tEXPECTED calls that did NOT happen:\n" - "\t\tfoobar -> no parameters\n" - "\t\tworld -> int boo: <2 (0x2)>, const char* hello: \n" - "\tACTUAL calls that did happen (in call order):\n" - "\t\thaphaphap -> no parameters", failure.getMessage().asCharString()); + STRCMP_EQUAL("Mock Failure: Expected call WAS NOT fulfilled.\n" + "\tEXPECTED calls that WERE NOT fulfilled:\n" + "\t\tfoobar -> no parameters (expected 1 call, called 0 times)\n" + "\t\tworld -> int boo: <2 (0x2)>, const char* hello: (expected 1 call, called 0 times)\n" + "\tEXPECTED calls that WERE fulfilled:\n" + "\t\thaphaphap -> no parameters (expected 1 call, called 1 time)", failure.getMessage().asCharString()); } TEST(MockFailureTest, MockUnexpectedNthAdditionalCallFailure) @@ -139,10 +149,10 @@ TEST(MockFailureTest, MockUnexpectedInputParameterFailure) MockUnexpectedInputParameterFailure failure(UtestShell::getCurrent(), "foo", actualParameter, *list); STRCMP_EQUAL("Mock Failure: Unexpected parameter name to function \"foo\": bar\n" - "\tEXPECTED calls that DID NOT happen related to function: foo\n" - "\t\tfoo -> int boo: <2 (0x2)>\n" - "\t\tfoo -> double boo: <3.3>\n" - "\tACTUAL calls that DID happen related to function: foo\n" + "\tEXPECTED calls that WERE NOT fulfilled related to function: foo\n" + "\t\tfoo -> int boo: <2 (0x2)> (expected 1 call, called 0 times)\n" + "\t\tfoo -> double boo: <3.3> (expected 1 call, called 0 times)\n" + "\tEXPECTED calls that WERE fulfilled related to function: foo\n" "\t\t\n" "\tACTUAL unexpected parameter passed to function: foo\n" "\t\tint bar: <2 (0x2)>", failure.getMessage().asCharString()); @@ -162,10 +172,10 @@ TEST(MockFailureTest, MockUnexpectedOutputParameterFailure) MockUnexpectedOutputParameterFailure failure(UtestShell::getCurrent(), "foo", actualParameter, *list); STRCMP_EQUAL("Mock Failure: Unexpected output parameter name to function \"foo\": bar\n" - "\tEXPECTED calls that DID NOT happen related to function: foo\n" - "\t\tfoo -> const void* boo: \n" - "\t\tfoo -> const void* boo: \n" - "\tACTUAL calls that DID happen related to function: foo\n" + "\tEXPECTED calls that WERE NOT fulfilled related to function: foo\n" + "\t\tfoo -> const void* boo: (expected 1 call, called 0 times)\n" + "\t\tfoo -> const void* boo: (expected 1 call, called 0 times)\n" + "\tEXPECTED calls that WERE fulfilled related to function: foo\n" "\t\t\n" "\tACTUAL unexpected output parameter passed to function: foo\n" "\t\tvoid* bar", failure.getMessage().asCharString()); @@ -183,10 +193,10 @@ TEST(MockFailureTest, MockUnexpectedParameterValueFailure) MockUnexpectedInputParameterFailure failure(UtestShell::getCurrent(), "foo", actualParameter, *list); STRCMP_EQUAL("Mock Failure: Unexpected parameter value to parameter \"boo\" to function \"foo\": <20 (0x14)>\n" - "\tEXPECTED calls that DID NOT happen related to function: foo\n" - "\t\tfoo -> int boo: <2 (0x2)>\n" - "\t\tfoo -> int boo: <10 (0xa)>\n" - "\tACTUAL calls that DID happen related to function: foo\n" + "\tEXPECTED calls that WERE NOT fulfilled related to function: foo\n" + "\t\tfoo -> int boo: <2 (0x2)> (expected 1 call, called 0 times)\n" + "\t\tfoo -> int boo: <10 (0xa)> (expected 1 call, called 0 times)\n" + "\tEXPECTED calls that WERE fulfilled related to function: foo\n" "\t\t\n" "\tACTUAL unexpected parameter passed to function: foo\n" "\t\tint boo: <20 (0x14)>", failure.getMessage().asCharString()); @@ -204,10 +214,10 @@ TEST(MockFailureTest, MockExpectedParameterDidntHappenFailure) MockExpectedParameterDidntHappenFailure failure(UtestShell::getCurrent(), "foo", *list); STRCMP_EQUAL("Mock Failure: Expected parameter for function \"foo\" did not happen.\n" - "\tEXPECTED calls that DID NOT happen related to function: foo\n" - "\t\tfoo -> int bar: <2 (0x2)>, const char* boo: \n" - "\tACTUAL calls that DID happen related to function: foo\n" - "\t\tfoo -> int bar: <10 (0xa)>, const char* boo: \n" + "\tEXPECTED calls that WERE NOT fulfilled related to function: foo\n" + "\t\tfoo -> int bar: <2 (0x2)>, const char* boo: (expected 1 call, called 0 times)\n" + "\tEXPECTED calls that WERE fulfilled related to function: foo\n" + "\t\tfoo -> int bar: <10 (0xa)>, const char* boo: (expected 1 call, called 1 time)\n" "\tMISSING parameters that didn't happen:\n" "\t\tint bar, const char* boo", failure.getMessage().asCharString()); } @@ -231,10 +241,10 @@ TEST(MockFailureTest, MockUnexpectedObjectFailure) STRCMP_EQUAL(StringFromFormat ( "MockFailure: Function called on an unexpected object: foo\n" "\tActual object for call has address: <%p>\n" - "\tEXPECTED calls that DID NOT happen related to function: foo\n" - "\t\t(object address: %p)::foo -> no parameters\n" - "\tACTUAL calls that DID happen related to function: foo\n" - "\t\t(object address: %p)::foo -> no parameters", + "\tEXPECTED calls that WERE NOT fulfilled related to function: foo\n" + "\t\t(object address: %p)::foo -> no parameters (expected 1 call, called 0 times)\n" + "\tEXPECTED calls that WERE fulfilled related to function: foo\n" + "\t\t(object address: %p)::foo -> no parameters (expected 1 call, called 1 time)", (void*) 0x01, (void*) 0x02, (void*) 0x03).asCharString(), failure.getMessage().asCharString()); } @@ -250,9 +260,9 @@ TEST(MockFailureTest, MockExpectedObjectDidntHappenFailure) MockExpectedObjectDidntHappenFailure failure(UtestShell::getCurrent(), "foo", *list); STRCMP_EQUAL(StringFromFormat( "Mock Failure: Expected call on object for function \"foo\" but it did not happen.\n" - "\tEXPECTED calls that DID NOT happen related to function: foo\n" - "\t\t(object address: %p)::foo -> no parameters\n" - "\tACTUAL calls that DID happen related to function: foo\n" - "\t\t(object address: %p)::foo -> no parameters", + "\tEXPECTED calls that WERE NOT fulfilled related to function: foo\n" + "\t\t(object address: %p)::foo -> no parameters (expected 1 call, called 0 times)\n" + "\tEXPECTED calls that WERE fulfilled related to function: foo\n" + "\t\t(object address: %p)::foo -> no parameters (expected 1 call, called 1 time)", (void*) 0x2, (void*) 0x3).asCharString(), failure.getMessage().asCharString()); } diff --git a/tests/CppUTestExt/MockStrictOrderTest.cpp b/tests/CppUTestExt/MockStrictOrderTest.cpp index 6c8c53d13..c34afcbac 100644 --- a/tests/CppUTestExt/MockStrictOrderTest.cpp +++ b/tests/CppUTestExt/MockStrictOrderTest.cpp @@ -178,7 +178,7 @@ TEST(MockStrictOrderTest, orderViolatedAcrossScopes) mock("mock2").checkExpectations(); } -TEST(MockStrictOrderTest, orderUsingNCalls) +IGNORE_TEST(MockStrictOrderTest, orderUsingNCalls) { mock().strictOrder(); From 65c532944673db381da67a2537abdf74c47a558c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Sun, 26 Jun 2016 18:58:23 +0200 Subject: [PATCH 0044/1093] Removed MockExpectedCallComposite. --- include/CppUTestExt/MockCheckedExpectedCall.h | 46 ---- src/CppUTestExt/MockExpectedCall.cpp | 229 ------------------ tests/CppUTestExt/MockExpectedCallTest.cpp | 176 -------------- 3 files changed, 451 deletions(-) diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index 24067971f..6c327a6a9 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -140,52 +140,6 @@ class MockCheckedExpectedCall : public MockExpectedCall unsigned int expectedCalls_; }; -#if 0 -struct MockExpectedCallCompositeNode; -class MockExpectedCallComposite : public MockExpectedCall -{ -public: - MockExpectedCallComposite(); - virtual ~MockExpectedCallComposite(); - - virtual MockExpectedCall& withName(const SimpleString& name) _override; - virtual MockExpectedCall& withCallOrder(unsigned int callOrder) _override; - virtual MockExpectedCall& withBoolParameter(const SimpleString& name, bool value) _override; - virtual MockExpectedCall& withIntParameter(const SimpleString& name, int value) _override; - virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) _override; - virtual MockExpectedCall& withLongIntParameter(const SimpleString& name, long int value) _override; - virtual MockExpectedCall& withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) _override; - virtual MockExpectedCall& withDoubleParameter(const SimpleString& name, double value) _override; - virtual MockExpectedCall& withStringParameter(const SimpleString& name, const char* value) _override; - virtual MockExpectedCall& withConstPointerParameter(const SimpleString& name, const void* value) _override; - virtual MockExpectedCall& withPointerParameter(const SimpleString& name, void* value) _override; - virtual MockExpectedCall& withFunctionPointerParameter(const SimpleString& name, void (*value)()) _override; - virtual MockExpectedCall& withMemoryBufferParameter(const SimpleString& name, const unsigned char* value, size_t size) _override; - virtual MockExpectedCall& withParameterOfType(const SimpleString& typeName, const SimpleString& name, const void* value) _override; - virtual MockExpectedCall& withOutputParameterReturning(const SimpleString& name, const void* value, size_t size) _override; - virtual MockExpectedCall& withOutputParameterOfTypeReturning(const SimpleString& typeName, const SimpleString& name, const void* value) _override; - virtual MockExpectedCall& ignoreOtherParameters() _override; - - virtual MockExpectedCall& andReturnValue(bool value) _override; - virtual MockExpectedCall& andReturnValue(int value) _override; - virtual MockExpectedCall& andReturnValue(unsigned int value) _override; - virtual MockExpectedCall& andReturnValue(long int value) _override; - virtual MockExpectedCall& andReturnValue(unsigned long int value) _override; - virtual MockExpectedCall& andReturnValue(double value) _override; - virtual MockExpectedCall& andReturnValue(const char* value) _override; - virtual MockExpectedCall& andReturnValue(void* value) _override; - virtual MockExpectedCall& andReturnValue(const void* value) _override; - virtual MockExpectedCall& andReturnValue(void (*value)()) _override; - - virtual MockExpectedCall& onObject(void* objectPtr) _override; - - virtual void add(MockExpectedCall& call); - virtual void clear(); -private: - MockExpectedCallCompositeNode* head_; -}; -#endif - class MockIgnoredExpectedCall: public MockExpectedCall { public: diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index fdc97fe18..c57c3b5e9 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -533,235 +533,6 @@ unsigned int MockCheckedExpectedCall::getActualCallsFulfilled() const return actualCalls_; } -#if 0 -struct MockExpectedCallCompositeNode -{ - MockExpectedCallCompositeNode(MockExpectedCall& functionCall, MockExpectedCallCompositeNode* next) : next_(next), call_(functionCall){} - - MockExpectedCallCompositeNode* next_; - MockExpectedCall& call_; -}; - -MockExpectedCallComposite::MockExpectedCallComposite() : head_(NULL) -{ -} - -MockExpectedCallComposite::~MockExpectedCallComposite() -{ - -} - -void MockExpectedCallComposite::add(MockExpectedCall& call) -{ - head_ = new MockExpectedCallCompositeNode(call, head_); -} - -void MockExpectedCallComposite::clear() -{ - while (head_) { - MockExpectedCallCompositeNode* next = head_->next_; - delete head_; - head_ = next; - } -} - -MockExpectedCall& MockExpectedCallComposite::withName(const SimpleString& name) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withName(name); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withCallOrder(unsigned int) -{ - FAIL("withCallOrder not supported for CompositeCalls"); - return *this; // LCOV_EXCL_LINE -} - -MockExpectedCall& MockExpectedCallComposite::withBoolParameter(const SimpleString& name, bool value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withParameter(name, value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withUnsignedIntParameter(const SimpleString& name, unsigned int value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withParameter(name, value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withIntParameter(const SimpleString& name, int value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withParameter(name, value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withLongIntParameter(const SimpleString& name, long int value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withParameter(name, value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withParameter(name, value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withDoubleParameter(const SimpleString& name, double value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withParameter(name, value); - return *this; - -} - -MockExpectedCall& MockExpectedCallComposite::withStringParameter(const SimpleString& name, const char* value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withParameter(name, value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withPointerParameter(const SimpleString& name, void* value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withParameter(name, value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withConstPointerParameter(const SimpleString& name, const void* value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withParameter(name, value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withFunctionPointerParameter(const SimpleString& name, void (*value)()) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withParameter(name, value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withMemoryBufferParameter(const SimpleString& name, const unsigned char* value, size_t size) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withParameter(name, value, size); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withParameterOfType(const SimpleString& typeName, const SimpleString& name, const void* value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withParameterOfType(typeName, name, value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withOutputParameterReturning(const SimpleString& name, const void* value, size_t size) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withOutputParameterReturning(name, value, size); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::withOutputParameterOfTypeReturning(const SimpleString& typeName, const SimpleString& name, const void* value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.withOutputParameterOfTypeReturning(typeName, name, value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::ignoreOtherParameters() -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.ignoreOtherParameters(); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::andReturnValue(bool value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.andReturnValue(value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::andReturnValue(unsigned int value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.andReturnValue(value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::andReturnValue(int value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.andReturnValue(value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::andReturnValue(long int value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.andReturnValue(value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::andReturnValue(unsigned long int value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.andReturnValue(value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::andReturnValue(double value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.andReturnValue(value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::andReturnValue(const char* value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.andReturnValue(value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::andReturnValue(void* value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.andReturnValue(value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::andReturnValue(const void* value) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.andReturnValue(value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::andReturnValue(void (*value)()) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.andReturnValue(value); - return *this; -} - -MockExpectedCall& MockExpectedCallComposite::onObject(void* object) -{ - for (MockExpectedCallCompositeNode* node = head_; node != NULL; node = node->next_) - node->call_.onObject(object); - return *this; -} -#endif - MockExpectedCall& MockIgnoredExpectedCall::instance() { static MockIgnoredExpectedCall call; diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 5e73c9e35..66aa980ba 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -627,182 +627,6 @@ TEST(MockExpectedCall, hasNoOutputParameterOfTypeDifferentType) CHECK_FALSE(call->hasOutputParameter(foo)); } -#if 0 -static MockExpectedCallComposite composite; - -TEST_GROUP(MockExpectedCallComposite) -{ - MockCheckedExpectedCall call; - - void setup() _override - { - composite.add(call); - composite.withName("name"); - } - - void teardown() _override - { - CHECK_NO_MOCK_FAILURE(); - composite.clear(); - } -}; - -TEST(MockExpectedCallComposite, hasBoolParameter) -{ - composite.withParameter("param", true); - STRCMP_EQUAL("name -> bool param: ", call.callToString().asCharString()); -} - -TEST(MockExpectedCallComposite, hasLongIntParameter) -{ - composite.withParameter("param", (long int) 1); - STRCMP_EQUAL("name -> long int param: <1 (0x1)>", call.callToString().asCharString()); -} - -TEST(MockExpectedCallComposite, hasUnsignedLongIntParameter) -{ - composite.withParameter("param", (unsigned long int) 5); - STRCMP_EQUAL("name -> unsigned long int param: <5 (0x5)>", call.callToString().asCharString()); -} - -TEST(MockExpectedCallComposite, hasPointerParameter) -{ - composite.withParameter("param", (void*) 0); - STRCMP_EQUAL("name -> void* param: <0x0>", call.callToString().asCharString()); -} - -TEST(MockExpectedCallComposite, hasConstPointerParameter) -{ - composite.withParameter("param", (const void*) 0); - STRCMP_EQUAL("name -> const void* param: <0x0>", call.callToString().asCharString()); -} - -TEST(MockExpectedCallComposite, hasFunctionPointerParameter) -{ - composite.withParameter("param", (void (*)()) 0); - STRCMP_EQUAL("name -> void (*)() param: <0x0>", call.callToString().asCharString()); -} - -TEST(MockExpectedCallComposite, hasMemoryBufferParameter) -{ - const unsigned char mem_buffer[] = { 0x89, 0xFE, 0x15 }; - composite.withParameter("param", mem_buffer, sizeof(mem_buffer)); - STRCMP_EQUAL("name -> const unsigned char* param: ", call.callToString().asCharString()); -} - -TEST(MockExpectedCallComposite, hasParameterOfType) -{ - composite.withParameterOfType("type", "param", (const void*) 0); - STRCMP_EQUAL("name -> type param: ", call.callToString().asCharString()); -} - -TEST(MockExpectedCallComposite, hasOutputParameterReturning) -{ - composite.withOutputParameterReturning("out", (const void*) 0, 1); - STRCMP_EQUAL("name -> const void* out: ", call.callToString().asCharString()); -} - -TEST(MockExpectedCallComposite, hasOutputParameterOfTypeReturning) -{ - composite.withOutputParameterOfTypeReturning("type", "out", (const void*) 0); - STRCMP_EQUAL("name -> type out: ", call.callToString().asCharString()); -} - -TEST(MockExpectedCallComposite, hasBoolReturnValue) -{ - composite.andReturnValue(true); - STRCMP_EQUAL("bool", call.returnValue().getType().asCharString()); - CHECK_EQUAL(true, call.returnValue().getBoolValue()); -} - -TEST(MockExpectedCallComposite, hasUnsignedIntReturnValue) -{ - composite.andReturnValue((unsigned int) 2); - STRCMP_EQUAL("unsigned int", call.returnValue().getType().asCharString()); - LONGS_EQUAL(2, call.returnValue().getUnsignedIntValue()); -} - -TEST(MockExpectedCallComposite, hasIntReturnValue) -{ - composite.andReturnValue((int) -5); - STRCMP_EQUAL("int", call.returnValue().getType().asCharString()); - LONGS_EQUAL(-5, call.returnValue().getIntValue()); -} - -TEST(MockExpectedCallComposite, hasLongIntReturnValue) -{ - composite.andReturnValue((long int) -17); - STRCMP_EQUAL("long int", call.returnValue().getType().asCharString()); - LONGS_EQUAL(-17, call.returnValue().getLongIntValue()); -} - -TEST(MockExpectedCallComposite, hasUnsignedLongIntReturnValue) -{ - composite.andReturnValue((unsigned long int) 6); - STRCMP_EQUAL("unsigned long int", call.returnValue().getType().asCharString()); - LONGS_EQUAL(6, call.returnValue().getUnsignedLongIntValue()); -} - -TEST(MockExpectedCallComposite, hasDoubleReturnValue) -{ - composite.andReturnValue((double) 3.005); - STRCMP_EQUAL("double", call.returnValue().getType().asCharString()); - DOUBLES_EQUAL(3.005, call.returnValue().getDoubleValue(), 0.0001); -} - -TEST(MockExpectedCallComposite, hasStringReturnValue) -{ - composite.andReturnValue("hello"); - STRCMP_EQUAL("const char*", call.returnValue().getType().asCharString()); - STRCMP_EQUAL("hello", call.returnValue().getStringValue()); -} - -TEST(MockExpectedCallComposite, hasPointerReturnValue) -{ - composite.andReturnValue((void*) 0); - STRCMP_EQUAL("void*", call.returnValue().getType().asCharString()); - POINTERS_EQUAL((void*) 0, call.returnValue().getPointerValue()); -} - -TEST(MockExpectedCallComposite, hasConstPointerReturnValue) -{ - composite.andReturnValue((const void*) 0); - STRCMP_EQUAL("const void*", call.returnValue().getType().asCharString()); - POINTERS_EQUAL((const void*) 0, call.returnValue().getConstPointerValue()); -} - -TEST(MockExpectedCallComposite, hasFunctionPointerReturnValue) -{ - composite.andReturnValue((void(*)()) 0); - STRCMP_EQUAL("void (*)()", call.returnValue().getType().asCharString()); - FUNCTIONPOINTERS_EQUAL((void(*)()) 0, call.returnValue().getFunctionPointerValue()); -} - -TEST(MockExpectedCallComposite, isOnObject) -{ - composite.onObject(&composite); - SimpleString info("(object address: "); - info += StringFromFormat("%p", (void*) &composite); - info += ")::name -> no parameters"; - STRCMP_EQUAL(info.asCharString(), call.callToString().asCharString()); -} - -#include "CppUTest/TestTestingFixture.h" - -static void withCallOrderNotSupportedFailMethod_(void) -{ - composite.withCallOrder(5); -} // LCOV_EXCL_LINE - -TEST(MockExpectedCallComposite, doesNotSupportCallOrder) -{ - TestTestingFixture fixture; - fixture.setTestFunction(&withCallOrderNotSupportedFailMethod_); - fixture.runAllTests(); - fixture.assertPrintContains("withCallOrder not supported for CompositeCalls"); -} -#endif - TEST_GROUP(MockIgnoredExpectedCall) { MockIgnoredExpectedCall ignored; From 18248021311e6e4fa20858421eefd825782b292e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Tue, 28 Jun 2016 00:47:15 +0200 Subject: [PATCH 0045/1093] Re-enabled strict ordering checks. --- include/CppUTestExt/MockCheckedExpectedCall.h | 11 ++-- include/CppUTestExt/MockExpectedCall.h | 1 + src/CppUTestExt/MockExpectedCall.cpp | 34 ++++++----- src/CppUTestExt/MockSupport.cpp | 6 +- tests/CppUTestExt/MockExpectedCallTest.cpp | 57 ++++++++++++++++++- tests/CppUTestExt/MockStrictOrderTest.cpp | 8 ++- 6 files changed, 86 insertions(+), 31 deletions(-) diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index 6c327a6a9..deccb0813 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -40,7 +40,8 @@ class MockCheckedExpectedCall : public MockExpectedCall virtual ~MockCheckedExpectedCall(); virtual MockExpectedCall& withName(const SimpleString& name) _override; - virtual MockExpectedCall& withCallOrder(unsigned int callOrder) _override; + virtual MockExpectedCall& withCallOrder(unsigned int callOrder) _override { return withCallOrder(callOrder, callOrder); } + virtual MockExpectedCall& withCallOrder(unsigned int initialCallOrder, unsigned int finalCallOrder) _override; virtual MockExpectedCall& withBoolParameter(const SimpleString& name, bool value) _override; virtual MockExpectedCall& withIntParameter(const SimpleString& name, int value) _override; virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) _override; @@ -101,8 +102,7 @@ class MockCheckedExpectedCall : public MockExpectedCall virtual SimpleString callToString(); virtual SimpleString missingParametersToString(); - enum { NOT_CALLED_YET = 0, NO_EXPECTED_CALL_ORDER = 0 }; - virtual unsigned int getCallOrder() const; + enum { NO_EXPECTED_CALL_ORDER = 0 }; virtual unsigned int getActualCallsFulfilled() const; @@ -128,8 +128,8 @@ class MockCheckedExpectedCall : public MockExpectedCall bool ignoreOtherParameters_; bool isActualCallMatchFinalized_; - unsigned int actualCallOrder_; - unsigned int expectedCallOrder_; + unsigned int initialExpectedCallOrder_; + unsigned int finalExpectedCallOrder_; bool outOfOrder_; MockNamedValueList* inputParameters_; MockNamedValueList* outputParameters_; @@ -146,6 +146,7 @@ class MockIgnoredExpectedCall: public MockExpectedCall virtual MockExpectedCall& withName(const SimpleString&) _override { return *this;} virtual MockExpectedCall& withCallOrder(unsigned int) _override { return *this; } + virtual MockExpectedCall& withCallOrder(unsigned int, unsigned int) _override { return *this; } virtual MockExpectedCall& withBoolParameter(const SimpleString&, bool) _override { return *this; } virtual MockExpectedCall& withIntParameter(const SimpleString&, int) _override { return *this; } virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString&, unsigned int) _override{ return *this; } diff --git a/include/CppUTestExt/MockExpectedCall.h b/include/CppUTestExt/MockExpectedCall.h index c0c9382ae..2bd11aa7e 100644 --- a/include/CppUTestExt/MockExpectedCall.h +++ b/include/CppUTestExt/MockExpectedCall.h @@ -40,6 +40,7 @@ class MockExpectedCall virtual MockExpectedCall& withName(const SimpleString& name)=0; virtual MockExpectedCall& withCallOrder(unsigned int)=0; + virtual MockExpectedCall& withCallOrder(unsigned int, unsigned int)=0; MockExpectedCall& withParameter(const SimpleString& name, bool value) { return withBoolParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, int value) { return withIntParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, unsigned int value) { return withUnsignedIntParameter(name, value); } diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index c57c3b5e9..47b21b678 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -52,7 +52,8 @@ SimpleString MockCheckedExpectedCall::getName() const } MockCheckedExpectedCall::MockCheckedExpectedCall() - : ignoreOtherParameters_(false), isActualCallMatchFinalized_(false), actualCallOrder_(NOT_CALLED_YET), expectedCallOrder_(NO_EXPECTED_CALL_ORDER), + : ignoreOtherParameters_(false), isActualCallMatchFinalized_(false), + initialExpectedCallOrder_(NO_EXPECTED_CALL_ORDER), finalExpectedCallOrder_(NO_EXPECTED_CALL_ORDER), outOfOrder_(false), returnValue_(""), objectPtr_(NULL), wasPassedToObject_(true), actualCalls_(0), expectedCalls_(1) { @@ -61,7 +62,8 @@ MockCheckedExpectedCall::MockCheckedExpectedCall() } MockCheckedExpectedCall::MockCheckedExpectedCall(unsigned int numCalls) - : ignoreOtherParameters_(false), isActualCallMatchFinalized_(false), actualCallOrder_(NOT_CALLED_YET), expectedCallOrder_(NO_EXPECTED_CALL_ORDER), + : ignoreOtherParameters_(false), isActualCallMatchFinalized_(false), + initialExpectedCallOrder_(NO_EXPECTED_CALL_ORDER), finalExpectedCallOrder_(NO_EXPECTED_CALL_ORDER), outOfOrder_(false), returnValue_(""), objectPtr_(NULL), wasPassedToObject_(true), actualCalls_(0), expectedCalls_(numCalls) { @@ -267,14 +269,11 @@ bool MockCheckedExpectedCall::isMatchingActualCall() void MockCheckedExpectedCall::callWasMade(unsigned int callOrder) { actualCalls_++; - actualCallOrder_ = callOrder; - if (expectedCallOrder_ == NO_EXPECTED_CALL_ORDER) - outOfOrder_ = false; - else if (actualCallOrder_ == expectedCallOrder_) - outOfOrder_ = false; - else + if ( (initialExpectedCallOrder_ != NO_EXPECTED_CALL_ORDER) && + ((callOrder < initialExpectedCallOrder_) || (callOrder > finalExpectedCallOrder_)) ) { outOfOrder_ = true; + } resetActualCallMatchingState(); } @@ -292,7 +291,6 @@ void MockCheckedExpectedCall::wasPassedToObject() void MockCheckedExpectedCall::resetActualCallMatchingState() { - actualCallOrder_ = NOT_CALLED_YET; wasPassedToObject_ = (objectPtr_ == NULL); isActualCallMatchFinalized_ = false; @@ -346,8 +344,12 @@ SimpleString MockCheckedExpectedCall::callToString() str += getName(); str += " -> "; - if (expectedCallOrder_ != NO_EXPECTED_CALL_ORDER) { - str += StringFromFormat("expected call order: <%d> -> ", expectedCallOrder_); + if (initialExpectedCallOrder_ != NO_EXPECTED_CALL_ORDER) { + if (initialExpectedCallOrder_ == finalExpectedCallOrder_) { + str += StringFromFormat("expected call order: <%u> -> ", initialExpectedCallOrder_); + } else { + str += StringFromFormat("expected calls order: <%u..%u> -> ", initialExpectedCallOrder_, finalExpectedCallOrder_); + } } if (inputParameters_->begin() == NULL && outputParameters_->begin() == NULL) { @@ -512,14 +514,10 @@ MockNamedValue MockCheckedExpectedCall::returnValue() return returnValue_; } -unsigned int MockCheckedExpectedCall::getCallOrder() const -{ - return actualCallOrder_; -} - -MockExpectedCall& MockCheckedExpectedCall::withCallOrder(unsigned int callOrder) +MockExpectedCall& MockCheckedExpectedCall::withCallOrder(unsigned int initialCallOrder, unsigned int finalCallOrder) { - expectedCallOrder_ = callOrder; + initialExpectedCallOrder_ = initialCallOrder; + finalExpectedCallOrder_ = finalCallOrder; return *this; } diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 324cfd17a..d90f044f5 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -172,7 +172,8 @@ MockExpectedCall& MockSupport::expectNCalls(unsigned int amount, const SimpleStr MockCheckedExpectedCall* call = new MockCheckedExpectedCall(amount); call->withName(appendScopeToName(functionName)); if (strictOrdering_) { - call->withCallOrder(++expectedCallOrder_); + call->withCallOrder(expectedCallOrder_ + 1, expectedCallOrder_ + amount); + expectedCallOrder_ += amount; } expectations_.addExpectedCall(call); return *call; @@ -286,7 +287,6 @@ void MockSupport::failTestWithExpectedCallsNotFulfilled() expectationsList.addExpectations(getMockSupport(p)->expectations_); MockExpectedCallsDidntHappenFailure failure(activeReporter_->getTestToFail(), expectationsList); - clear(); failTest(failure); } @@ -300,12 +300,12 @@ void MockSupport::failTestWithOutOfOrderCalls() expectationsList.addExpectations(getMockSupport(p)->expectations_); MockCallOrderFailure failure(activeReporter_->getTestToFail(), expectationsList); - clear(); failTest(failure); } void MockSupport::failTest(MockFailure& failure) { + clear(); activeReporter_->failTest(failure); } diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 66aa980ba..e366037ed 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -556,7 +556,7 @@ TEST(MockExpectedCall, toStringForParameterAndIgnored) STRCMP_EQUAL("name -> const char* string: , other parameters are ignored (expected 1 call, called 1 time)", expectedCall.callToString().asCharString()); } -TEST(MockExpectedCall, toStringForCallOrder) +TEST(MockExpectedCall, toStringForCallOrderSingle) { MockCheckedExpectedCall expectedCall(1); expectedCall.withName("name"); @@ -565,7 +565,20 @@ TEST(MockExpectedCall, toStringForCallOrder) STRCMP_EQUAL("name -> expected call order: <2> -> no parameters (expected 1 call, called 1 time)", expectedCall.callToString().asCharString()); } -TEST(MockExpectedCall, callOrderIsNotFulfilledWithWrongOrder) +TEST(MockExpectedCall, toStringForCallOrderMultiple) +{ + MockCheckedExpectedCall expectedCall(5); + expectedCall.withName("name"); + expectedCall.withCallOrder(5, 9); + expectedCall.callWasMade(5); + expectedCall.callWasMade(6); + expectedCall.callWasMade(7); + expectedCall.callWasMade(8); + expectedCall.callWasMade(9); + STRCMP_EQUAL("name -> expected calls order: <5..9> -> no parameters (expected 5 calls, called 5 times)", expectedCall.callToString().asCharString()); +} + +TEST(MockExpectedCall, callOrderIsFulfilledButWithWrongOrderSingle) { call->withName("name"); call->withCallOrder(2); @@ -574,7 +587,31 @@ TEST(MockExpectedCall, callOrderIsNotFulfilledWithWrongOrder) CHECK(call->isOutOfOrder()); } -TEST(MockExpectedCall, callOrderIsFulfilled) +TEST(MockExpectedCall, callOrderIsFulfilledButWithWrongOrderMultipleTooEarly) +{ + MockCheckedExpectedCall expectedCall(3); + expectedCall.withName("name"); + expectedCall.withCallOrder(10, 12); + expectedCall.callWasMade(9); + expectedCall.callWasMade(10); + expectedCall.callWasMade(11); + CHECK(expectedCall.isFulfilled()); + CHECK(expectedCall.isOutOfOrder()); +} + +TEST(MockExpectedCall, callOrderIsFulfilledButWithWrongOrderMultipleTooLate) +{ + MockCheckedExpectedCall expectedCall(3); + expectedCall.withName("name"); + expectedCall.withCallOrder(10, 12); + expectedCall.callWasMade(11); + expectedCall.callWasMade(12); + expectedCall.callWasMade(13); + CHECK(expectedCall.isFulfilled()); + CHECK(expectedCall.isOutOfOrder()); +} + +TEST(MockExpectedCall, callOrderIsFulfilledSingle) { call->withName("name"); call->withCallOrder(1); @@ -583,6 +620,19 @@ TEST(MockExpectedCall, callOrderIsFulfilled) CHECK_FALSE(call->isOutOfOrder()); } +TEST(MockExpectedCall, callOrderIsFulfilledMultiple) +{ + MockCheckedExpectedCall expectedCall(4); + expectedCall.withName("name"); + expectedCall.withCallOrder(150, 153); + expectedCall.callWasMade(150); + expectedCall.callWasMade(151); + expectedCall.callWasMade(152); + expectedCall.callWasMade(153); + CHECK(expectedCall.isFulfilled()); + CHECK_FALSE(expectedCall.isOutOfOrder()); +} + TEST(MockExpectedCall, hasOutputParameter) { const int value = 1; @@ -636,6 +686,7 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) { ignored.withName("func"); ignored.withCallOrder(1); + ignored.withCallOrder(1, 1); ignored.onObject((void*) 0); ignored.withBoolParameter("umm", true); ignored.withIntParameter("bla", (int) 1); diff --git a/tests/CppUTestExt/MockStrictOrderTest.cpp b/tests/CppUTestExt/MockStrictOrderTest.cpp index c34afcbac..400471d21 100644 --- a/tests/CppUTestExt/MockStrictOrderTest.cpp +++ b/tests/CppUTestExt/MockStrictOrderTest.cpp @@ -178,18 +178,22 @@ TEST(MockStrictOrderTest, orderViolatedAcrossScopes) mock("mock2").checkExpectations(); } -IGNORE_TEST(MockStrictOrderTest, orderUsingNCalls) +TEST(MockStrictOrderTest, orderUsingNCalls) { mock().strictOrder(); mock().expectOneCall("foo1"); mock().expectNCalls(2, "foo2"); mock().expectOneCall("foo1"); + mock().expectNCalls(3, "foo2"); + mock().actualCall("foo1"); mock().actualCall("foo2"); mock().actualCall("foo2"); mock().actualCall("foo1"); + mock().actualCall("foo2"); + mock().actualCall("foo2"); + mock().actualCall("foo2"); mock().checkExpectations(); } - From 5ac48adf61450f71cf5269cf26d711262ee3ff53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Fri, 8 Jul 2016 00:52:14 +0200 Subject: [PATCH 0046/1093] Improved unit tests for MockExpectedCall. --- tests/CppUTestExt/MockExpectedCallTest.cpp | 132 ++++++++++++--------- 1 file changed, 79 insertions(+), 53 deletions(-) diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index e366037ed..4cd6c7726 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -155,7 +155,8 @@ TEST_GROUP(MockExpectedCall) MockCheckedExpectedCall* call; void setup() { - call = new MockCheckedExpectedCall; + call = new MockCheckedExpectedCall(1); + call->withName("funcName"); } void teardown() { @@ -173,103 +174,128 @@ TEST(MockExpectedCall, callWithoutParameterSetOrNotFound) TEST(MockExpectedCall, callWithUnsignedIntegerParameter) { - const SimpleString name = "unsigned integer"; - unsigned int value = 777; - call->withParameter(name, value); - STRCMP_EQUAL("unsigned int", call->getInputParameterType(name).asCharString()); - LONGS_EQUAL(value, call->getInputParameter(name).getUnsignedIntValue()); - CHECK(call->hasInputParameterWithName(name)); + const SimpleString paramName = "paramName"; + unsigned int value = 356; + call->withParameter(paramName, value); + STRCMP_EQUAL("unsigned int", call->getInputParameterType(paramName).asCharString()); + LONGS_EQUAL(value, call->getInputParameter(paramName).getUnsignedIntValue()); + CHECK(call->hasInputParameterWithName(paramName)); + STRCMP_CONTAINS("funcName -> unsigned int paramName: <356 (0x164)>", call->callToString().asCharString()); } TEST(MockExpectedCall, callWithIntegerParameter) { - call->withParameter("integer", 1); - STRCMP_EQUAL("int", call->getInputParameterType("integer").asCharString()); - LONGS_EQUAL(1, call->getInputParameter("integer").getIntValue()); - CHECK(call->hasInputParameterWithName("integer")); + const SimpleString paramName = "paramName"; + int value = 2; + call->withParameter(paramName, value); + STRCMP_EQUAL("int", call->getInputParameterType(paramName).asCharString()); + LONGS_EQUAL(value, call->getInputParameter(paramName).getIntValue()); + CHECK(call->hasInputParameterWithName(paramName)); + STRCMP_CONTAINS("funcName -> int paramName: <2 (0x2)>", call->callToString().asCharString()); } TEST(MockExpectedCall, callWithBooleanParameter) { - call->withParameter("boolean", true); - STRCMP_EQUAL("bool", call->getInputParameterType("boolean").asCharString()); - CHECK_EQUAL(true, call->getInputParameter("boolean").getBoolValue()); - CHECK(call->hasInputParameterWithName("boolean")); + const SimpleString paramName = "paramName"; + bool value = true; + call->withParameter(paramName, value); + STRCMP_EQUAL("bool", call->getInputParameterType(paramName).asCharString()); + CHECK_EQUAL(value, call->getInputParameter(paramName).getBoolValue()); + CHECK(call->hasInputParameterWithName(paramName)); + STRCMP_CONTAINS("funcName -> bool paramName: ", call->callToString().asCharString()); } TEST(MockExpectedCall, callWithUnsignedLongIntegerParameter) { - const SimpleString name = "unsigned long integer"; - unsigned long value = 777; - call->withParameter(name, value); - STRCMP_EQUAL("unsigned long int", call->getInputParameterType(name).asCharString()); - LONGS_EQUAL(value, call->getInputParameter(name).getUnsignedLongIntValue()); - CHECK(call->hasInputParameterWithName(name)); + const SimpleString paramName = "paramName"; + unsigned long value = 888; + call->withParameter(paramName, value); + STRCMP_EQUAL("unsigned long int", call->getInputParameterType(paramName).asCharString()); + LONGS_EQUAL(value, call->getInputParameter(paramName).getUnsignedLongIntValue()); + CHECK(call->hasInputParameterWithName(paramName)); + STRCMP_CONTAINS("funcName -> unsigned long int paramName: <888 (0x378)>", call->callToString().asCharString()); } TEST(MockExpectedCall, callWithLongIntegerParameter) { - const SimpleString name = "long integer"; + const SimpleString paramName = "paramName"; long value = 777; - call->withParameter(name, value); - STRCMP_EQUAL("long int", call->getInputParameterType(name).asCharString()); - LONGS_EQUAL(value, call->getInputParameter(name).getLongIntValue()); - CHECK(call->hasInputParameterWithName(name)); + call->withParameter(paramName, value); + STRCMP_EQUAL("long int", call->getInputParameterType(paramName).asCharString()); + LONGS_EQUAL(value, call->getInputParameter(paramName).getLongIntValue()); + CHECK(call->hasInputParameterWithName(paramName)); + STRCMP_CONTAINS("funcName -> long int paramName: <777 (0x309)>", call->callToString().asCharString()); } TEST(MockExpectedCall, callWithDoubleParameter) { - call->withParameter("double", 1.2); - STRCMP_EQUAL("double", call->getInputParameterType("double").asCharString()); - DOUBLES_EQUAL(1.2, call->getInputParameter("double").getDoubleValue(), 0.05); + const SimpleString paramName = "paramName"; + double value = 1.2; + call->withParameter(paramName, value); + STRCMP_EQUAL("double", call->getInputParameterType(paramName).asCharString()); + DOUBLES_EQUAL(value, call->getInputParameter(paramName).getDoubleValue(), 0.05); + STRCMP_CONTAINS("funcName -> double paramName: <1.2>", call->callToString().asCharString()); } TEST(MockExpectedCall, callWithStringParameter) { - call->withParameter("string", "hello world"); - STRCMP_EQUAL("const char*", call->getInputParameterType("string").asCharString()); - STRCMP_EQUAL("hello world", call->getInputParameter("string").getStringValue()); + const SimpleString paramName = "paramName"; + const char* value = "hello world"; + call->withParameter(paramName, value); + STRCMP_EQUAL("const char*", call->getInputParameterType(paramName).asCharString()); + STRCMP_EQUAL(value, call->getInputParameter(paramName).getStringValue()); + STRCMP_CONTAINS("funcName -> const char* paramName: ", call->callToString().asCharString()); } TEST(MockExpectedCall, callWithPointerParameter) { - void* ptr = (void*) 0x123; - call->withParameter("pointer", ptr); - STRCMP_EQUAL("void*", call->getInputParameterType("pointer").asCharString()); - POINTERS_EQUAL(ptr, call->getInputParameter("pointer").getPointerValue()); + const SimpleString paramName = "paramName"; + void* value = (void*) 0x123; + call->withParameter(paramName, value); + STRCMP_EQUAL("void*", call->getInputParameterType(paramName).asCharString()); + POINTERS_EQUAL(value, call->getInputParameter(paramName).getPointerValue()); + STRCMP_CONTAINS("funcName -> void* paramName: <0x123>", call->callToString().asCharString()); } TEST(MockExpectedCall, callWithConstPointerParameter) { - const void* ptr = (const void*) 0x345; - call->withParameter("constPointer", ptr); - STRCMP_EQUAL("const void*", call->getInputParameterType("constPointer").asCharString()); - POINTERS_EQUAL(ptr, call->getInputParameter("constPointer").getConstPointerValue()); + const SimpleString paramName = "paramName"; + const void* value = (const void*) 0x345; + call->withParameter(paramName, value); + STRCMP_EQUAL("const void*", call->getInputParameterType(paramName).asCharString()); + POINTERS_EQUAL(value, call->getInputParameter(paramName).getConstPointerValue()); + STRCMP_CONTAINS("funcName -> const void* paramName: <0x345>", call->callToString().asCharString()); } TEST(MockExpectedCall, callWithFunctionPointerParameter) { - void (*ptr)() = (void (*)()) 0x123; - call->withParameter("functionPointer", ptr); - STRCMP_EQUAL("void (*)()", call->getInputParameterType("functionPointer").asCharString()); - FUNCTIONPOINTERS_EQUAL(ptr, call->getInputParameter("functionPointer").getFunctionPointerValue()); + const SimpleString paramName = "paramName"; + void (*value)() = (void (*)()) 0xdead; + call->withParameter(paramName, value); + STRCMP_EQUAL("void (*)()", call->getInputParameterType(paramName).asCharString()); + FUNCTIONPOINTERS_EQUAL(value, call->getInputParameter(paramName).getFunctionPointerValue()); + STRCMP_CONTAINS("funcName -> void (*)() paramName: <0xdead>", call->callToString().asCharString()); } TEST(MockExpectedCall, callWithMemoryBuffer) { - const unsigned char mem_buffer[] = { 0x12, 0xFE, 0xA1 }; - call->withParameter("memoryBuffer", mem_buffer, sizeof(mem_buffer)); - STRCMP_EQUAL("const unsigned char*", call->getInputParameterType("memoryBuffer").asCharString()); - POINTERS_EQUAL( (void*) mem_buffer, (void*) call->getInputParameter("memoryBuffer").getMemoryBuffer() ); - LONGS_EQUAL(sizeof(mem_buffer), call->getInputParameter("memoryBuffer").getSize()); + const SimpleString paramName = "paramName"; + const unsigned char value[] = { 0x12, 0xFE, 0xA1 }; + call->withParameter(paramName, value, sizeof(value)); + STRCMP_EQUAL("const unsigned char*", call->getInputParameterType(paramName).asCharString()); + POINTERS_EQUAL( (void*) value, (void*) call->getInputParameter(paramName).getMemoryBuffer() ); + LONGS_EQUAL(sizeof(value), call->getInputParameter(paramName).getSize()); + STRCMP_CONTAINS("funcName -> const unsigned char* paramName: ", call->callToString().asCharString()); } TEST(MockExpectedCall, callWithObjectParameter) { - void* ptr = (void*) 0x123; - call->withParameterOfType("class", "object", ptr); - POINTERS_EQUAL(ptr, call->getInputParameter("object").getObjectPointer()); - STRCMP_EQUAL("class", call->getInputParameterType("object").asCharString()); + const SimpleString paramName = "paramName"; + void* value = (void*) 0x123; + call->withParameterOfType("ClassName", paramName, value); + POINTERS_EQUAL(value, call->getInputParameter(paramName).getObjectPointer()); + STRCMP_EQUAL("ClassName", call->getInputParameterType(paramName).asCharString()); + STRCMP_CONTAINS("funcName -> ClassName paramName: ", call->callToString().asCharString()); } TEST(MockExpectedCall, callWithObjectParameterUnequalComparison) From 0d6443b0fccf8dace440b22f0806055f347a5959 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Tue, 28 Jun 2016 22:29:07 +0200 Subject: [PATCH 0047/1093] Simplified MockSupport::expectNoCall() method implementation. MockSupport::expectNoCall() now uses a multi-matching expected call with zero expected calls, thus avoiding the usage of a dedicated list to keep track of "unexpectations" and therefore simplifying the architecture of the MockSupport class. --- include/CppUTestExt/MockSupport.h | 4 +--- src/CppUTestExt/MockSupport.cpp | 20 ++++---------------- tests/CppUTestExt/MockCallTest.cpp | 5 +++++ 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index 60517e3b4..8aa211915 100755 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -131,7 +131,6 @@ class MockSupport MockFailureReporter *standardReporter_; MockFailureReporter defaultReporter_; MockExpectedCallsList expectations_; - MockExpectedCallsList unExpectations_; bool ignoreOtherCalls_; bool enabled_; MockCheckedActualCall *lastActualFunctionCall_; @@ -150,8 +149,7 @@ class MockSupport MockSupport* getMockSupport(MockNamedValueListNode* node); - bool hasntExpectationWithName(const SimpleString& functionName); - bool hasntUnexpectationWithName(const SimpleString& functionName); + bool callIsIgnored(const SimpleString& functionName); bool hasCallsOutOfOrder(); SimpleString appendScopeToName(const SimpleString& functionName); diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index d90f044f5..3dc27f132 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -119,7 +119,6 @@ void MockSupport::clear() MockActualCallTrace::instance().clear(); expectations_.deleteAllExpectationsAndClearList(); - unExpectations_.deleteAllExpectationsAndClearList(); ignoreOtherCalls_ = false; enabled_ = true; actualCallOrder_ = 0; @@ -154,13 +153,7 @@ MockExpectedCall& MockSupport::expectOneCall(const SimpleString& functionName) void MockSupport::expectNoCall(const SimpleString& functionName) { - if (!enabled_) return; - - countCheck(); - - MockCheckedExpectedCall* call = new MockCheckedExpectedCall; - call->withName(appendScopeToName(functionName)); - unExpectations_.addExpectedCall(call); + expectNCalls(0, functionName); } MockExpectedCall& MockSupport::expectNCalls(unsigned int amount, const SimpleString& functionName) @@ -185,14 +178,9 @@ MockCheckedActualCall* MockSupport::createActualCall() return lastActualFunctionCall_; } -bool MockSupport::hasntExpectationWithName(const SimpleString& functionName) -{ - return !expectations_.hasExpectationWithName(functionName) && ignoreOtherCalls_; -} - -bool MockSupport::hasntUnexpectationWithName(const SimpleString& functionName) +bool MockSupport::callIsIgnored(const SimpleString& functionName) { - return !unExpectations_.hasExpectationWithName(functionName); + return ignoreOtherCalls_ && !expectations_.hasExpectationWithName(functionName); } MockActualCall& MockSupport::actualCall(const SimpleString& functionName) @@ -209,7 +197,7 @@ MockActualCall& MockSupport::actualCall(const SimpleString& functionName) if (tracing_) return MockActualCallTrace::instance().withName(scopeFuntionName); - if (hasntUnexpectationWithName(scopeFuntionName) && hasntExpectationWithName(scopeFuntionName)) { + if (callIsIgnored(scopeFuntionName)) { return MockIgnoredActualCall::instance(); } diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index b2bdc26ea..77498f055 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -198,6 +198,7 @@ TEST(MockCallTest, expectNoCallThatHappened) MockFailureReporterInstaller failureReporterInstaller; MockExpectedCallsListForTest expectations; + expectations.addFunction(0, "lazy"); MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); mock().expectNoCall("lazy"); @@ -211,6 +212,7 @@ TEST(MockCallTest, expectNoCallDoesntInfluenceExpectOneCall) MockFailureReporterInstaller failureReporterInstaller; MockExpectedCallsListForTest expectations; + expectations.addFunction(0, "lazy"); expectations.addFunction("influence")->callWasMade(1); MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); @@ -227,6 +229,7 @@ TEST(MockCallTest, expectNoCallOnlyFailureOnceWhenMultipleHappened) MockFailureReporterInstaller failureReporterInstaller; MockExpectedCallsListForTest expectations; + expectations.addFunction(0, "lazy"); MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); mock().expectNoCall("lazy"); @@ -240,6 +243,7 @@ TEST(MockCallTest, ignoreOtherCallsExceptForTheUnExpectedOne) MockFailureReporterInstaller failureReporterInstaller; MockExpectedCallsListForTest expectations; + expectations.addFunction(0, "lazy"); MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); mock().expectNoCall("lazy"); @@ -258,6 +262,7 @@ TEST(MockCallTest, expectNoCallInScopeThatHappened) MockFailureReporterInstaller failureReporterInstaller; MockExpectedCallsListForTest expectations; + expectations.addFunction(0, "scope::lazy"); MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "scope::lazy", expectations); mock("scope").expectNoCall("lazy"); From 777986202520a7adc58c5da5c77f9da0ea9d7427 Mon Sep 17 00:00:00 2001 From: offa Date: Mon, 18 Jul 2016 16:39:37 +0200 Subject: [PATCH 0048/1093] Fix for cmake, which didn't add the C++ compiler flags. --- cmake/Modules/CppUTestWarningFlags.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index 36f7067ea..52d819716 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -16,10 +16,10 @@ else (MSVC) macro(check_and_append_cxx_warning_flags) foreach (flag ${ARGN}) - check_cxx_compiler_flag("-${flag}" WARNING_CXX_FLAG_TO_CHECK) - if (WARNING_CXX_FLAG_TO_CHECK) + check_cxx_compiler_flag("-${flag}" WARNING_CXX_FLAG_${flag}) + if (WARNING_CXX_FLAG_${flag}) set(CPPUTEST_CXX_WARNING_FLAGS "${CPPUTEST_CXX_WARNING_FLAGS} -${flag}") - endif (WARNING_CXX_FLAG_TO_CHECK) + endif (WARNING_CXX_FLAG_${flag}) endforeach (flag) endmacro(check_and_append_cxx_warning_flags) From 7dbe73af7c7fd5030755c1c314c3903cd125426c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Tue, 19 Jul 2016 00:32:33 +0200 Subject: [PATCH 0049/1093] Fix old cmake versions problem when using variable name as regex. --- cmake/Modules/CppUTestWarningFlags.cmake | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index 52d819716..bd6a6916d 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -16,10 +16,11 @@ else (MSVC) macro(check_and_append_cxx_warning_flags) foreach (flag ${ARGN}) - check_cxx_compiler_flag("-${flag}" WARNING_CXX_FLAG_${flag}) - if (WARNING_CXX_FLAG_${flag}) + string(REPLACE "++" "xx" WARNING_CXX_FLAG_VAR "WARNING_CXX_FLAG_${flag}") + check_cxx_compiler_flag("-${flag}" ${WARNING_CXX_FLAG_VAR}) + if (${WARNING_CXX_FLAG_VAR}) set(CPPUTEST_CXX_WARNING_FLAGS "${CPPUTEST_CXX_WARNING_FLAGS} -${flag}") - endif (WARNING_CXX_FLAG_${flag}) + endif (${WARNING_CXX_FLAG_VAR}) endforeach (flag) endmacro(check_and_append_cxx_warning_flags) From 1e5334913fbbe52056b9b9185be245835ec5ba21 Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 20 Jul 2016 13:52:43 +0200 Subject: [PATCH 0050/1093] WERROR added as option to cmake. It enables the errors-as-warnings compiler flag (-Werror). The option is default off to maintain compatibility with older compilers (#1003). --- CMakeLists.txt | 1 + cmake/Modules/CppUTestWarningFlags.cmake | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b1900bb37..61687e0b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,7 @@ option(LONGLONG "Support long long" OFF) option(MAP_FILE "Enable the creation of a map file" OFF) option(COVERAGE "Enable running with coverage" OFF) option(C++11 "Compile with C++11 support" OFF) +option(WERROR "Compile with warnings as errors" OFF) option(TESTS "Compile and make tests for the code?" ON) option(TESTS_DETAILED "Run each test separately instead of grouped?" OFF) diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index bd6a6916d..30f0f3e6d 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -44,6 +44,11 @@ else (MSVC) Wno-long-long ) + if (WERROR) + list(APPEND WARNING_C_FLAGS Werror) + endif (WERROR) + + set(WARNING_C_ONLY_FLAGS Wstrict-prototypes ) From c72d8a2be6493eb5555cbf4cd441735f1c553f23 Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 26 Jul 2016 15:01:35 +0200 Subject: [PATCH 0051/1093] Werror enabled for CMake CI builds. --- scripts/travis_ci_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 0d5efa9b4..d15e98107 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -19,12 +19,12 @@ if [ "x$BUILD" = "xautotools" ]; then fi if [ "x$BUILD" = "xcmake" ]; then - cmake .. -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE + cmake .. -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE -DWERROR=ON make ctest -V if [ "x$CXX" != "xg++" ]; then - cmake .. -DC++11=ON -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE + cmake .. -DC++11=ON -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE -DWERROR=ON make ctest -V fi From 077162888e6d259da63480f2df340f5cff3b66e1 Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 2 Aug 2016 16:55:45 +0200 Subject: [PATCH 0052/1093] Gcc5 C++14 related issue fixed for CMake, if C++11 is enabled. --- cmake/Modules/CppUTestWarningFlags.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index 30f0f3e6d..9868c59d3 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -67,6 +67,7 @@ else (MSVC) ${WARNING_CXX_FLAGS} Wno-c++98-compat Wno-c++98-compat-pedantic + Wno-c++14-compat ) endif (C++11) From 80cf68c993704fcc9df1b5f6dd27ef6bb9016824 Mon Sep 17 00:00:00 2001 From: Martin Ertsaas Date: Thu, 11 Aug 2016 09:27:22 +0200 Subject: [PATCH 0053/1093] cmake: Fix C++11 compatibility detection for Visual Studio Visual Studio has a bug where they still report __cplusplus as 199711L even with a C++11 compatible compiler. --- cmake/Modules/FindCXX11.cmake | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/FindCXX11.cmake b/cmake/Modules/FindCXX11.cmake index 989a99b86..8718ec107 100644 --- a/cmake/Modules/FindCXX11.cmake +++ b/cmake/Modules/FindCXX11.cmake @@ -18,12 +18,17 @@ set(CXX11_FLAG_CANDIDATES "-std=c++11" # Intel windows "/Qstd=c++0x" + "/Qstd=c++11" ) set(CXX11_TEST_SOURCE " -#if __cplusplus < 201103L -#error \"Can not compile with C++11\" +#if defined(_MSC_VER) + #if _MSC_VER < 1800 + #error \"Can not compile with C++11\" + #endif +#elif __cplusplus < 201103L + #error \"Can not compile with C++11\" #endif int main() From 15bf13c53e0861692dd766794d85ebba977cfd74 Mon Sep 17 00:00:00 2001 From: Daniel Gullberg Date: Wed, 31 Aug 2016 10:50:59 +0200 Subject: [PATCH 0054/1093] Added missing references to TeamCityTestOutput.cpp and TestTestingFixture.cpp in the IAR project Compiling CppUTestTest generates a linker error Lp011:Error[Lp011]: section placement failed. This seems to be an out of flash memory error. Increasing the flash size ROM1_end from 0x7FFFF to 0x8FFFF resolves the error. --- platforms/iar/CppUTest.ewp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/platforms/iar/CppUTest.ewp b/platforms/iar/CppUTest.ewp index 35697ada4..539d21e58 100644 --- a/platforms/iar/CppUTest.ewp +++ b/platforms/iar/CppUTest.ewp @@ -1911,6 +1911,9 @@ $PROJ_DIR$\..\..\src\CppUTest\SimpleString.cpp + + $PROJ_DIR$\..\..\src\CppUTest\TeamCityTestOutput.cpp + $PROJ_DIR$\..\..\src\CppUTest\TestFailure.cpp @@ -1935,6 +1938,9 @@ $PROJ_DIR$\..\..\src\CppUTest\TestResult.cpp + + $PROJ_DIR$\..\..\src\CppUTest\TestTestingFixture.cpp + $PROJ_DIR$\..\..\src\CppUTest\Utest.cpp From 7bb69ef0d0942c270aeb7d6a8f6896caffd1d36a Mon Sep 17 00:00:00 2001 From: Daniel Gullberg Date: Wed, 31 Aug 2016 11:00:29 +0200 Subject: [PATCH 0055/1093] Increasing the flash size from 0x7FFFF to 0x8FFFF to resolve linker error. Now compiling, linking and passing all tests on IAR EWARM 7.50.3.10751 --- platforms/iar/CppUTestTest.icf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/iar/CppUTestTest.icf b/platforms/iar/CppUTestTest.icf index 3384b6152..05a0ab0ec 100644 --- a/platforms/iar/CppUTestTest.icf +++ b/platforms/iar/CppUTestTest.icf @@ -5,7 +5,7 @@ define symbol __ICFEDIT_intvec_start__ = 0x00000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_IROM1_start__ = 0x00000080; -define symbol __ICFEDIT_region_IROM1_end__ = 0x0007FFFF; +define symbol __ICFEDIT_region_IROM1_end__ = 0x0008FFFF; define symbol __ICFEDIT_region_IROM2_start__ = 0x0; define symbol __ICFEDIT_region_IROM2_end__ = 0x0; define symbol __ICFEDIT_region_EROM1_start__ = 0x0; From 19b29bfc28a9f50234edeaf605ca6645e7e899a2 Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 6 Sep 2016 13:17:54 +0200 Subject: [PATCH 0056/1093] Pedantic flag added to CMake. --- cmake/Modules/CppUTestWarningFlags.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index 9868c59d3..08a3a855d 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -32,6 +32,7 @@ else (MSVC) Weverything Wall Wextra + pedantic Wshadow Wswitch-default Wswitch-enum From c1471f8ebdc7c53f19f562480afda9bcbfac31a0 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Thu, 8 Sep 2016 23:20:40 -0500 Subject: [PATCH 0057/1093] Cache the MinGW install --- appveyor.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 3e2426f83..e76e1a857 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,6 +2,11 @@ version: 3.7.0-ci{build} image: Visual Studio 2015 +cache: + - C:\ProgramData\chocolatey\bin -> appveyor.yml + - C:\ProgramData\chocolatey\lib -> appveyor.yml + - C:\Tools\MinGW* -> appveyor.yml + environment: Configuration: Release matrix: From e375cf5ad8ca39199b76a6c0bf784e94dfa976ae Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Thu, 8 Sep 2016 23:33:18 -0500 Subject: [PATCH 0058/1093] Wildcard doesn't work for cache --- appveyor.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index e76e1a857..2b6b413cc 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,7 +5,8 @@ image: Visual Studio 2015 cache: - C:\ProgramData\chocolatey\bin -> appveyor.yml - C:\ProgramData\chocolatey\lib -> appveyor.yml - - C:\Tools\MinGW* -> appveyor.yml + - C:\Tools\MinGW32 -> appveyor.yml + - C:\Tools\MinGW64 -> appveyor.yml environment: Configuration: Release From 7ecb77f72aeb35483408fb94e80ec60a7513172c Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 13 Sep 2016 10:17:54 +0200 Subject: [PATCH 0059/1093] Clang 3.9 warning fixed. --- src/CppUTest/SimpleString.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 6932d0b54..685df5aec 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -80,8 +80,10 @@ int SimpleString::AtoI(const char* str) int SimpleString::StrCmp(const char* s1, const char* s2) { - while(*s1 && *s1 == *s2) - s1++, s2++; + while(*s1 && *s1 == *s2) { + ++s1; + ++s2; + } return *(unsigned char *) s1 - *(unsigned char *) s2; } @@ -95,7 +97,9 @@ size_t SimpleString::StrLen(const char* str) int SimpleString::StrNCmp(const char* s1, const char* s2, size_t n) { while (n && *s1 && *s1 == *s2) { - n--, s1++, s2++; + --n; + ++s1; + ++s2; } return n ? *(unsigned char *) s1 - *(unsigned char *) s2 : 0; } @@ -131,10 +135,12 @@ int SimpleString::MemCmp(const void* s1, const void *s2, size_t n) const unsigned char* p2 = (const unsigned char*) s2; while (n--) - if (*p1 != *p2) + if (*p1 != *p2) { return *p1 - *p2; - else - p1++, p2++; + } else { + ++p1; + ++p2; + } return 0; } From 4acf5198b25052183fb66efbd60fc21b703cac99 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 14 Sep 2016 08:54:07 +0800 Subject: [PATCH 0060/1093] Fixing the google test build, the releases are moved to github --- Makefile.am | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/Makefile.am b/Makefile.am index 30803d2ea..20f19c9b0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -235,45 +235,65 @@ if INCLUDE_CPPUTEST_EXT ./$(CPPUTESTEXT_TESTS) endif +cpputest_build_gtest18: + mkdir -p cpputest_build_gtest18 + cd cpputest_build_gtest18; \ + wget https://github.com/google/googletest/archive/release-1.8.0.zip -O gtest-1.8.0.zip && unzip gtest-1.8.0.zip; \ + cd googletest-release-1.8.0; cmake .; make + cpputest_build_gtest17: mkdir -p cpputest_build_gtest17 cd cpputest_build_gtest17; \ - wget https://googlemock.googlecode.com/files/gmock-1.7.0.zip && unzip gmock-1.7.0.zip - cd cpputest_build_gtest17/gmock-1.7.0; ./configure && make check + wget https://github.com/google/googletest/archive/release-1.7.0.zip -O gtest-1.7.0.zip && unzip gtest-1.7.0.zip; \ + wget https://github.com/google/googlemock/archive/release-1.7.0.zip -O gmock-1.7.0.zip && unzip gmock-1.7.0.zip; \ + mv googletest-release-1.7.0 googlemock-release-1.7.0/gtest; \ + cd googlemock-release-1.7.0; autoreconf -i; ./configure && make cpputest_build_gtest16: mkdir -p cpputest_build_gtest16 cd cpputest_build_gtest16; \ - wget https://googlemock.googlecode.com/files/gmock-1.6.0.zip && unzip gmock-1.6.0.zip - cd cpputest_build_gtest16/gmock-1.6.0; ./configure CXXFLAGS=-DGTEST_USE_OWN_TR1_TUPLE=1 && make check + wget https://github.com/google/googletest/archive/release-1.6.0.zip -O gtest-1.6.0.zip && unzip gtest-1.6.0.zip; \ + wget https://github.com/google/googlemock/archive/release-1.6.0.zip -O gmock-1.6.0.zip && unzip gmock-1.6.0.zip; \ + mv googletest-release-1.6.0 googlemock-release-1.6.0/gtest; \ + cd googlemock-release-1.6.0; autoreconf -i; ./configure CXXFLAGS=-DGTEST_USE_OWN_TR1_TUPLE=1 && make cpputest_build_gtest15: mkdir -p cpputest_build_gtest15 cd cpputest_build_gtest15; \ - wget https://googlemock.googlecode.com/files/gmock-1.5.0.zip && unzip gmock-1.5.0.zip - cd cpputest_build_gtest15/gmock-1.5.0; ./configure CXXFLAGS=-DGTEST_USE_OWN_TR1_TUPLE=1 && make + wget https://github.com/google/googletest/archive/release-1.5.0.zip -O gtest-1.5.0.zip && unzip gtest-1.5.0.zip; \ + wget https://github.com/google/googlemock/archive/release-1.5.0.zip -O gmock-1.5.0.zip && unzip gmock-1.5.0.zip; \ + mv googletest-release-1.5.0 googlemock-release-1.5.0/gtest; \ + cd googlemock-release-1.5.0; autoreconf -i; ./configure CXXFLAGS=-DGTEST_USE_OWN_TR1_TUPLE=1 && make check_gtest15: cpputest_build_gtest15 @echo "Build using gmock 1.5"; - export GMOCK_HOME=`pwd`/cpputest_build_gtest15/gmock-1.5.0; \ + export GMOCK_HOME=`pwd`/cpputest_build_gtest15/googlemock-release-1.5.0; \ make distclean; $(srcdir)/configure; make check check_gtest16: cpputest_build_gtest16 @echo "Build using gmock 1.6"; - export GMOCK_HOME=`pwd`/cpputest_build_gtest16/gmock-1.6.0; \ + export GMOCK_HOME=`pwd`/cpputest_build_gtest16/googlemock-release-1.6.0; \ make distclean; $(srcdir)/configure; make check check_gtest17: cpputest_build_gtest17 @echo "Build using gmock 1.7" - export GMOCK_HOME=`pwd`/cpputest_build_gtest17/gmock-1.7.0; \ + export GMOCK_HOME=`pwd`/cpputest_build_gtest17/googlemock-release-1.7.0; \ + make distclean; $(srcdir)/configure; make check + +check_gtest18: cpputest_build_gtest18 + @echo "Build using gmock 1.8" + export GMOCK_HOME=`pwd`/cpputest_build_gtest18/googletest-release-1.8.0; \ make distclean; $(srcdir)/configure; make check remove_gtest_directories: rm -rf cpputest_build_gtest15 rm -rf cpputest_build_gtest16 rm -rf cpputest_build_gtest17 + rm -rf cpputest_build_gtest18 + +check_gtest: remove_gtest_directories check_gtest15 check_gtest16 check_gtest17 check_gtest18 -check_gtest: remove_gtest_directories check_gtest15 check_gtest16 check_gtest17 +#check_gtest: remove_gtest_directories check_gtest18 check_basic: @echo "If dash is available, run the configure with dash to find bash-isms and increase portability" From f149247216f5774a9cbdacb65850e2097dc99c61 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 14 Sep 2016 09:32:52 +0800 Subject: [PATCH 0061/1093] Fixed also gtest18 --- Makefile.am | 5 ++--- configure.ac | 7 ++++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Makefile.am b/Makefile.am index 20f19c9b0..585c9d7cc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -282,7 +282,8 @@ check_gtest17: cpputest_build_gtest17 check_gtest18: cpputest_build_gtest18 @echo "Build using gmock 1.8" - export GMOCK_HOME=`pwd`/cpputest_build_gtest18/googletest-release-1.8.0; \ + export GMOCK_HOME=`pwd`/cpputest_build_gtest18/googletest-release-1.8.0/googlemock; \ + export GTEST_HOME=`pwd`/cpputest_build_gtest18/googletest-release-1.8.0/googletest; \ make distclean; $(srcdir)/configure; make check remove_gtest_directories: @@ -293,8 +294,6 @@ remove_gtest_directories: check_gtest: remove_gtest_directories check_gtest15 check_gtest16 check_gtest17 check_gtest18 -#check_gtest: remove_gtest_directories check_gtest18 - check_basic: @echo "If dash is available, run the configure with dash to find bash-isms and increase portability" make distclean; if test "x$(CPPUTEST_HAS_DASH)" = xyes; then CONFIG_SHELL=dash $(srcdir)/configure; fi diff --git a/configure.ac b/configure.ac index 1989aecda..99c3f1fcd 100644 --- a/configure.ac +++ b/configure.ac @@ -458,7 +458,10 @@ if test -n "${GMOCK_HOME}"; then AC_DEFINE([INCLUDE_GTEST_TESTS], 1, [Include the GTest-related tests in the build]) AC_ARG_VAR([GMOCK_HOME], [Location of the GMock]) - GTEST_HOME=${GMOCK_HOME}/gtest + + if test -z "${GTEST_HOME}"; then + GTEST_HOME=${GMOCK_HOME}/gtest + fi CPPUTEST_CPPFLAGS="${CPPUTEST_CPPFLAGS} -I${GMOCK_HOME}/include -I${GTEST_HOME}/include -I${GTEST_HOME}" CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} -DGTEST_USE_OWN_TR1_TUPLE=1" @@ -466,6 +469,8 @@ if test -n "${GMOCK_HOME}"; then CPPUTEST_LDADD="${CPPUTEST_LDADD} ${GMOCK_HOME}/lib/libgmock.la ${GTEST_HOME}/lib/libgtest.la"; \ elif test -e ${GMOCK_HOME}/libgmock.a && test -e ${GTEST_HOME}/libgtest.a; then \ CPPUTEST_LDADD="${CPPUTEST_LDADD} ${GMOCK_HOME}/libgmock.a ${GTEST_HOME}/libgtest.a"; \ + elif test -e ${GMOCK_HOME}/libgmock.a && test -e ${GMOCK_HOME}/gtest/libgtest.a; then \ + CPPUTEST_LDADD="${CPPUTEST_LDADD} ${GMOCK_HOME}/libgmock.a ${GMOCK_HOME}/gtest/libgtest.a"; \ else \ AC_MSG_ERROR([ ------------------------------------- From 3f6c1d98fcb91da07b5323497b86c9f881903113 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 17 Sep 2016 15:23:52 +0800 Subject: [PATCH 0062/1093] Fixed CMake gtest build? --- scripts/travis_ci_build.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index d15e98107..5a3e276cd 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -38,10 +38,14 @@ if [ "x$BUILD" = "xautotools_gtest" ]; then fi if [ "x$BUILD" = "xcmake_gtest" ]; then - wget https://googlemock.googlecode.com/files/gmock-1.6.0.zip + wget https://github.com/google/googletest/archive/release-1.6.0.zip -O gtest-1.6.0.zip && unzip gtest-1.6.0.zip; + wget https://github.com/google/googlemock/archive/release-1.6.0.zip -O gmock-1.6.0.zip && unzip gmock-1.6.0.zip; + unzip gtest-1.6.0.zip -d $TRAVIS_BUILD_DIR unzip gmock-1.6.0.zip -d $TRAVIS_BUILD_DIR - cd $TRAVIS_BUILD_DIR/gmock-1.6.0 - ./configure && make + cd $TRAVIS_BUILD_DIR + mv googletest-release-1.6.0 googlemock-release-1.6.0/gtest + cd googlemock-release-1.6.0 + autoreconf -i; ./configure CXXFLAGS=-DGTEST_USE_OWN_TR1_TUPLE=1 && make cd - export GMOCK_HOME=$TRAVIS_BUILD_DIR/gmock-1.6.0 From ad94cc0d605a35ecaf0dcac4d501da4f186da6bd Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 19 Sep 2016 09:51:24 +0800 Subject: [PATCH 0063/1093] Should fix the ctest travis build --- cmake/Modules/CppUTestConfigurationOptions.cmake | 1 - scripts/travis_ci_build.sh | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 634482cec..23ded70eb 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -64,7 +64,6 @@ if (DEFINED ENV{GMOCK_HOME}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTEST_USE_OWN_TR1_TUPLE=1") include_directories(${GMOCK_HOME}/include ${GMOCK_HOME}/gtest ${GMOCK_HOME}/gtest/include) add_subdirectory(${GMOCK_HOME} "${CMAKE_CURRENT_BINARY_DIR}/gmock") - set(CPPUNIT_EXTERNAL_LIBRARIES ${CPPUNIT_EXTERNAL_LIBARIES} gmock gtest) set(CPPUTEST_C_WARNING_FLAGS "") set(CPPUTEST_CXX_WARNING_FLAGS "") diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 5a3e276cd..fad244bcd 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -47,9 +47,8 @@ if [ "x$BUILD" = "xcmake_gtest" ]; then cd googlemock-release-1.6.0 autoreconf -i; ./configure CXXFLAGS=-DGTEST_USE_OWN_TR1_TUPLE=1 && make cd - - - export GMOCK_HOME=$TRAVIS_BUILD_DIR/gmock-1.6.0 - export GTEST_HOME=$TRAVIS_BUILD_DIR/gmock-1.6.0/gtest + export GMOCK_HOME=$TRAVIS_BUILD_DIR/googlemock-release-1.6.0 + export GTEST_HOME=$TRAVIS_BUILD_DIR/googlemock-release-1.6.0/gtest cmake .. -DGMOCK=ON make ctest -V From 857075d094ebbb1adae81879874719e00141d7b8 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 19 Sep 2016 10:28:39 +0800 Subject: [PATCH 0064/1093] Changed the build directory on travis --- scripts/travis_ci_build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index fad244bcd..6e6f3ba45 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -38,6 +38,7 @@ if [ "x$BUILD" = "xautotools_gtest" ]; then fi if [ "x$BUILD" = "xcmake_gtest" ]; then + pwd wget https://github.com/google/googletest/archive/release-1.6.0.zip -O gtest-1.6.0.zip && unzip gtest-1.6.0.zip; wget https://github.com/google/googlemock/archive/release-1.6.0.zip -O gmock-1.6.0.zip && unzip gmock-1.6.0.zip; unzip gtest-1.6.0.zip -d $TRAVIS_BUILD_DIR @@ -49,7 +50,7 @@ if [ "x$BUILD" = "xcmake_gtest" ]; then cd - export GMOCK_HOME=$TRAVIS_BUILD_DIR/googlemock-release-1.6.0 export GTEST_HOME=$TRAVIS_BUILD_DIR/googlemock-release-1.6.0/gtest - cmake .. -DGMOCK=ON + cmake . -DGMOCK=ON make ctest -V fi From f2ce674267905817ce574d32375640012b02da0e Mon Sep 17 00:00:00 2001 From: Ma Xilai-DGBV47 Date: Fri, 28 Oct 2016 20:48:50 +0800 Subject: [PATCH 0065/1093] Mock function returnBoolValueOrDefault behaves not as expected #1052 --- include/CppUTestExt/MockCheckedActualCall.h | 2 +- tests/CppUTestExt/MockActualCallTest.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index dddbf5782..c99ae5fd2 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -234,7 +234,7 @@ class MockIgnoredActualCall: public MockActualCall virtual bool hasReturnValue() _override { return false; } virtual MockNamedValue returnValue() _override { return MockNamedValue(""); } - virtual bool returnBoolValueOrDefault(bool) _override { return false; } + virtual bool returnBoolValueOrDefault(bool value) _override { return value; } virtual bool returnBoolValue() _override { return false; } virtual int returnIntValue() _override { return 0; } diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 512440faf..6061a881f 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -151,7 +151,8 @@ TEST(MockCheckedActualCall, MockIgnoredActualCallWorksAsItShould) actual.withCallOrder(1); CHECK(false == actual.returnBoolValue()); - CHECK(false == actual.returnBoolValueOrDefault(true)); + CHECK(true == actual.returnBoolValueOrDefault(true)); + CHECK(false == actual.returnBoolValueOrDefault(false)); CHECK(0 == actual.returnUnsignedLongIntValue()); CHECK(0 == actual.returnIntValue()); CHECK(1ul == actual.returnUnsignedLongIntValueOrDefault(1ul)); From eb056c358bd9923b7432ed8b55960f1f8964299e Mon Sep 17 00:00:00 2001 From: Casey Smith Date: Wed, 27 Jul 2016 10:08:41 -0400 Subject: [PATCH 0066/1093] Removed and ignoring IAR generated dependency files --- .gitignore | 1 + platforms/iar/CppUTest.dep | 557 --------------- platforms/iar/CppUTestTest.dep | 1228 -------------------------------- 3 files changed, 1 insertion(+), 1785 deletions(-) delete mode 100644 platforms/iar/CppUTest.dep delete mode 100644 platforms/iar/CppUTestTest.dep diff --git a/.gitignore b/.gitignore index d344aef87..dd213b974 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,4 @@ missing test-driver platforms/iar/settings cpputest_*.xml +*.dep diff --git a/platforms/iar/CppUTest.dep b/platforms/iar/CppUTest.dep deleted file mode 100644 index a4e6664ce..000000000 --- a/platforms/iar/CppUTest.dep +++ /dev/null @@ -1,557 +0,0 @@ - - - - 2 - 1004061121 - - Debug - - $PROJ_DIR$\Debug\Obj\TestFailure.o - $PROJ_DIR$\Debug\Obj\SimpleString.o - $PROJ_DIR$\Debug\Obj\TestFilter.o - $PROJ_DIR$\Debug\Obj\MemoryLeakWarningPlugin.o - $PROJ_DIR$\Debug\Obj\TestMemoryAllocator.o - $PROJ_DIR$\Debug\Obj\TestHarness_c.o - $PROJ_DIR$\Debug\Obj\SimpleMutex.o - $PROJ_DIR$\Debug\Obj\CommandLineArguments.pbi - $PROJ_DIR$\Debug\Obj\UtestPlatform.o - $PROJ_DIR$\Debug\Obj\TestPlugin.o - $PROJ_DIR$\Debug\Obj\TestOutput.o - $PROJ_DIR$\Debug\Obj\TestRegistry.o - $PROJ_DIR$\Debug\Obj\TestResult.o - $PROJ_DIR$\Debug\Obj\Utest.o - $PROJ_DIR$\Debug\Obj\JUnitTestOutput.pbi - $PROJ_DIR$\Debug\Obj\CommandLineTestRunner.pbi - $PROJ_DIR$\Debug\Obj\MemoryLeakDetector.pbi - $PROJ_DIR$\Debug\Obj\MemoryLeakWarningPlugin.pbi - $PROJ_DIR$\Debug\Obj\SimpleMutex.pbi - $PROJ_DIR$\Debug\Obj\SimpleString.pbi - $PROJ_DIR$\Debug\Obj\TestFailure.pbi - $PROJ_DIR$\Debug\Obj\TestFilter.pbi - $PROJ_DIR$\Debug\Obj\TestHarness_c.pbi - $PROJ_DIR$\Debug\Obj\TestMemoryAllocator.pbi - $PROJ_DIR$\Debug\Obj\TestOutput.pbi - $PROJ_DIR$\Debug\Obj\TestPlugin.pbi - $PROJ_DIR$\Debug\Obj\TestRegistry.pbi - $PROJ_DIR$\Debug\Obj\TestResult.pbi - $PROJ_DIR$\Debug\Obj\UtestPlatform.pbi - $PROJ_DIR$\..\..\include\CppUTest\JUnitTestOutput.h - $PROJ_DIR$\..\..\include\CppUTest\CommandLineTestRunner.h - $PROJ_DIR$\..\..\include\CppUTest\TestRegistry.h - $PROJ_DIR$\..\..\include\CppUTest\TestMemoryAllocator.h - $PROJ_DIR$\..\..\include\CppUTest\SimpleMutex.h - $PROJ_DIR$\..\..\include\CppUTest\MemoryLeakDetector.h - $PROJ_DIR$\..\..\include\CppUTest\TestHarness_c.h - $TOOLKIT_DIR$\inc\c\setjmp.h - $PROJ_DIR$\..\..\src\CppUTest\JUnitTestOutput.cpp - $PROJ_DIR$\..\..\src\CppUTest\CommandLineTestRunner.cpp - $PROJ_DIR$\..\..\src\CppUTest\CommandLineArguments.cpp - $PROJ_DIR$\..\..\src\CppUTest\MemoryLeakDetector.cpp - $PROJ_DIR$\..\..\src\CppUTest\MemoryLeakWarningPlugin.cpp - $PROJ_DIR$\..\..\src\CppUTest\SimpleMutex.cpp - $PROJ_DIR$\..\..\src\CppUTest\SimpleString.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestFailure.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestFilter.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestHarness_c.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestMemoryAllocator.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestOutput.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestPlugin.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestRegistry.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestResult.cpp - $PROJ_DIR$\..\..\src\Platforms\Iar\UtestPlatform.cpp - $PROJ_DIR$\..\..\src\CppUTest\Utest.cpp - $PROJ_DIR$\Debug\Obj\CommandLineTestRunner.o - $PROJ_DIR$\Debug\Obj\CommandLineArguments.o - $PROJ_DIR$\Debug\Obj\MemoryLeakDetector.o - $PROJ_DIR$\Debug\Obj\JUnitTestOutput.o - $PROJ_DIR$\Debug\Obj\Utest.pbi - $PROJ_DIR$\Debug\Exe\CppUTest.a - $PROJ_DIR$\Debug\Obj\CppUTest.pbd - $TOOLKIT_DIR$\inc\cpp\xlocinfo - $TOOLKIT_DIR$\inc\c\xencoding_limits.h - $TOOLKIT_DIR$\inc\c\cmath - $TOOLKIT_DIR$\inc\c\yvals.h - $TOOLKIT_DIR$\inc\c\ycheck.h - $TOOLKIT_DIR$\inc\c\ysizet.h - $TOOLKIT_DIR$\inc\c\cstdlib - $PROJ_DIR$\..\..\include\CppUTest\StandardCLibrary.h - $TOOLKIT_DIR$\inc\c\ymath.h - $PROJ_DIR$\..\..\include\CppUTest\CppUTestConfig.h - $PROJ_DIR$\..\..\include\CppUTest\TestResult.h - $TOOLKIT_DIR$\inc\c\math.h - $TOOLKIT_DIR$\inc\cpp\xiosbase - $TOOLKIT_DIR$\inc\cpp\xlocale - $TOOLKIT_DIR$\inc\cpp\utility - $PROJ_DIR$\..\..\include\CppUTest\SimpleString.h - $TOOLKIT_DIR$\inc\c\DLib_Defaults.h - $TOOLKIT_DIR$\inc\c\DLib_Product.h - $PROJ_DIR$\..\..\include\CppUTest\PlatformSpecificFunctions.h - $TOOLKIT_DIR$\inc\c\cstring - $PROJ_DIR$\..\..\include\CppUTest\PlatformSpecificFunctions_c.h - $TOOLKIT_DIR$\inc\c\ystdio.h - $PROJ_DIR$\..\..\include\CppUTest\UtestMacros.h - $TOOLKIT_DIR$\inc\c\stddef.h - $TOOLKIT_DIR$\inc\cpp\iosfwd - $TOOLKIT_DIR$\inc\cpp\xstddef - $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h - $PROJ_DIR$\..\..\include\CppUTest\TestPlugin.h - $TOOLKIT_DIR$\inc\c\DLib_Product_string.h - $TOOLKIT_DIR$\inc\c\stdlib.h - $TOOLKIT_DIR$\inc\c\stdio.h - $PROJ_DIR$\..\..\include\CppUTest\CommandLineArguments.h - $TOOLKIT_DIR$\inc\cpp\string - $TOOLKIT_DIR$\inc\c\ctype.h - $TOOLKIT_DIR$\inc\cpp\typeinfo - $TOOLKIT_DIR$\inc\c\wchar.h - $TOOLKIT_DIR$\inc\cpp\xstring - $TOOLKIT_DIR$\inc\cpp\xutility - $TOOLKIT_DIR$\inc\cpp\exception - $PROJ_DIR$\..\..\include\CppUTest\TestFailure.h - $TOOLKIT_DIR$\inc\c\xlocaleuse.h - $TOOLKIT_DIR$\inc\cpp\ios - $TOOLKIT_DIR$\inc\cpp\memory - $PROJ_DIR$\..\..\include\CppUTest\MemoryLeakWarningPlugin.h - $PROJ_DIR$\..\..\include\CppUTest\Utest.h - $TOOLKIT_DIR$\inc\c\climits - $TOOLKIT_DIR$\inc\c\DLib_Threads.h - $TOOLKIT_DIR$\inc\cpp\istream - $TOOLKIT_DIR$\inc\cpp\ostream - $TOOLKIT_DIR$\inc\c\cstdio - $TOOLKIT_DIR$\inc\cpp\xlocnum - $TOOLKIT_DIR$\inc\c\cstddef - $TOOLKIT_DIR$\inc\c\clocale - $TOOLKIT_DIR$\inc\cpp\streambuf - $TOOLKIT_DIR$\inc\c\limits.h - $TOOLKIT_DIR$\inc\c\xtgmath.h - $TOOLKIT_DIR$\inc\cpp\stdexcept - $TOOLKIT_DIR$\inc\cpp\xdebug - $TOOLKIT_DIR$\inc\cpp\new - $TOOLKIT_DIR$\inc\c\string.h - $TOOLKIT_DIR$\inc\c\cwchar - $TOOLKIT_DIR$\inc\cpp\xmemory - $TOOLKIT_DIR$\inc\c\ctime - $TOOLKIT_DIR$\inc\c\xtls.h - $TOOLKIT_DIR$\inc\c\xmtx.h - $TOOLKIT_DIR$\inc\c\xlocale.h - $PROJ_DIR$\..\..\include\CppUTest\TestHarness.h - $TOOLKIT_DIR$\inc\c\cctype - $PROJ_DIR$\..\..\include\CppUTest\TestOutput.h - $TOOLKIT_DIR$\inc\c\time.h - $PROJ_DIR$\..\..\include\CppUTest\MemoryLeakDetectorNewMacros.h - $TOOLKIT_DIR$\inc\c\xlocale_c.h - $TOOLKIT_DIR$\inc\c\locale.h - $TOOLKIT_DIR$\inc\c\xlocale_lconv.h - $PROJ_DIR$\..\..\include\CppUTest\TestFilter.h - - - [ROOT_NODE] - - - IARCHIVE - 59 - - - - - $PROJ_DIR$\..\..\src\CppUTest\JUnitTestOutput.cpp - - - BICOMP - 14 - - - ICCARM - 57 - - - - - BICOMP - 78 121 132 70 106 64 65 66 90 77 109 114 112 79 71 62 111 118 120 122 97 134 81 83 88 68 84 87 108 102 110 115 116 117 113 99 86 119 67 133 131 29 100 105 76 104 107 93 63 72 69 91 82 73 74 80 95 61 89 98 75 85 96 128 123 130 129 127 94 126 124 101 125 103 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 29 129 79 81 - - - - - $PROJ_DIR$\..\..\src\CppUTest\CommandLineTestRunner.cpp - - - BICOMP - 15 - - - ICCARM - 54 - - - - - BICOMP - 65 102 64 76 108 117 99 135 31 70 104 107 110 115 116 113 86 119 129 105 100 67 90 62 109 111 106 114 66 118 120 112 122 121 80 94 101 96 103 30 29 83 71 88 68 84 77 87 78 93 63 72 69 91 82 73 74 95 61 89 97 98 75 85 126 124 125 127 128 123 132 133 134 130 131 92 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 30 129 92 135 29 31 - - - - - $PROJ_DIR$\..\..\src\CppUTest\CommandLineArguments.cpp - - - BICOMP - 7 - - - ICCARM - 55 - - - - - BICOMP - 61 65 66 62 63 64 67 71 69 73 74 75 70 77 78 76 68 72 82 80 84 85 86 81 79 83 88 90 87 93 91 95 89 97 98 99 94 101 96 103 92 105 100 104 107 108 109 102 111 106 110 114 115 116 117 118 113 120 112 122 119 121 126 124 125 129 127 128 123 132 133 134 130 131 135 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 92 129 135 79 81 - - - - - $PROJ_DIR$\..\..\src\CppUTest\MemoryLeakDetector.cpp - - - BICOMP - 16 - - - ICCARM - 56 - - - - - BICOMP - 64 65 120 105 90 111 122 81 62 106 118 124 33 100 67 107 109 114 66 112 113 126 125 88 32 70 76 104 108 102 110 115 116 117 99 86 98 80 121 34 79 83 71 68 84 77 87 78 93 63 72 69 91 82 73 74 95 61 89 97 75 85 94 101 96 103 127 119 128 123 132 133 134 130 131 129 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 34 32 79 129 81 33 - - - - - $PROJ_DIR$\..\..\src\CppUTest\MemoryLeakWarningPlugin.cpp - - - BICOMP - 17 - - - ICCARM - 3 - - - - - BICOMP - 105 64 111 122 65 120 81 106 118 124 79 100 67 87 109 114 66 112 113 126 125 88 34 70 76 104 77 62 78 108 102 110 115 116 117 99 86 119 80 121 32 33 83 71 68 84 90 107 93 63 72 69 91 82 73 74 95 61 89 97 98 75 85 94 101 96 103 127 128 123 132 133 134 130 131 129 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 34 32 79 129 81 33 - - - - - $PROJ_DIR$\..\..\src\CppUTest\SimpleMutex.cpp - - - BICOMP - 18 - - - ICCARM - 6 - - - - - BICOMP - 112 65 66 109 114 64 71 87 106 121 70 90 62 111 118 120 122 81 83 88 68 84 77 78 108 102 110 115 116 117 113 99 86 119 96 80 94 101 76 103 33 105 100 104 67 107 93 63 72 69 91 82 73 74 95 61 89 97 98 75 85 126 124 125 127 128 123 132 133 134 130 131 79 129 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 33 79 129 81 - - - - - $PROJ_DIR$\..\..\src\CppUTest\SimpleString.cpp - - - BICOMP - 19 - - - ICCARM - 1 - - - - - BICOMP - 68 64 65 67 98 130 88 90 87 83 84 62 93 91 95 89 97 128 79 71 70 66 77 78 76 63 72 69 82 73 74 80 61 75 110 96 123 122 129 32 105 100 104 107 108 109 102 111 106 114 115 116 117 118 113 120 99 86 112 119 121 132 133 134 131 127 85 94 126 124 101 125 103 81 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 79 129 81 32 - - - - - $PROJ_DIR$\..\..\src\CppUTest\TestFailure.cpp - - - BICOMP - 20 - - - ICCARM - 0 - - - - - BICOMP - 66 65 95 89 97 70 93 91 79 71 87 64 67 98 85 86 81 129 83 88 68 84 90 77 62 78 76 63 72 69 82 73 74 80 61 75 99 94 101 96 100 105 104 107 108 109 102 111 106 110 114 115 116 117 118 113 120 112 122 119 121 126 124 125 103 127 128 123 132 133 134 130 131 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 129 79 81 - - - - - $PROJ_DIR$\..\..\src\CppUTest\TestFilter.cpp - - - BICOMP - 21 - - - ICCARM - 2 - - - - - BICOMP - 121 107 64 67 76 63 98 65 69 91 80 66 68 72 95 89 97 113 126 124 125 135 70 84 90 77 62 93 82 73 74 61 75 85 86 99 94 101 96 87 78 108 109 102 111 106 110 114 115 116 117 118 120 112 122 119 128 123 132 133 134 130 - - - ICCARM - 70 68 84 65 64 77 87 78 62 107 66 67 90 135 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 - - - - - $PROJ_DIR$\..\..\src\CppUTest\TestHarness_c.cpp - - - BICOMP - 22 - - - ICCARM - 5 - - - - - BICOMP - 68 76 64 84 65 77 72 88 90 78 82 80 66 85 35 83 62 63 69 73 74 61 67 75 86 32 71 70 87 93 91 95 89 97 98 99 94 101 96 103 34 79 105 100 104 107 108 109 102 111 106 110 114 115 116 117 118 113 120 112 122 119 121 126 124 125 81 127 128 123 132 133 134 130 131 129 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 34 32 79 129 81 35 - - - - - $PROJ_DIR$\..\..\src\CppUTest\TestMemoryAllocator.cpp - - - BICOMP - 23 - - - ICCARM - 4 - - - - - BICOMP - 64 68 67 98 124 88 90 87 65 83 84 66 93 91 95 89 97 113 126 125 79 71 70 77 62 78 76 63 72 69 82 73 74 80 61 75 121 32 34 105 100 104 107 108 109 102 111 106 110 114 115 116 117 118 120 99 86 112 122 119 85 94 101 96 103 129 127 128 123 132 133 134 130 131 81 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 32 79 129 81 34 - - - - - $PROJ_DIR$\..\..\src\CppUTest\TestOutput.cpp - - - BICOMP - 24 - - - ICCARM - 10 - - - - - BICOMP - 83 84 69 73 74 75 121 65 62 63 64 61 67 88 68 90 77 78 76 72 82 80 66 81 79 71 70 87 93 91 95 89 97 98 113 126 124 125 129 105 100 104 107 108 109 102 111 106 110 114 115 116 117 118 120 99 86 112 122 119 85 94 101 96 103 127 128 123 132 133 134 130 131 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 129 79 81 - - - - - $PROJ_DIR$\..\..\src\CppUTest\TestPlugin.cpp - - - BICOMP - 25 - - - ICCARM - 9 - - - - - BICOMP - 80 63 64 67 71 107 61 66 65 69 73 74 75 103 70 76 68 72 82 84 85 86 99 94 101 96 83 88 90 93 91 95 89 97 98 105 100 104 77 62 87 78 108 109 102 111 106 110 114 115 116 117 118 113 120 112 122 119 121 126 124 125 127 128 123 132 133 134 130 131 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 - - - - - $PROJ_DIR$\..\..\src\CppUTest\TestRegistry.cpp - - - BICOMP - 26 - - - ICCARM - 11 - - - - - BICOMP - 64 102 65 105 96 66 108 117 99 94 101 76 100 67 107 110 115 116 113 86 119 80 103 70 104 109 111 106 114 118 120 112 122 121 31 83 71 88 68 84 90 77 62 87 78 93 63 72 69 91 82 73 74 95 61 89 97 98 75 85 126 124 125 135 127 128 123 132 133 134 130 131 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 31 135 - - - - - $PROJ_DIR$\..\..\src\CppUTest\TestResult.cpp - - - BICOMP - 27 - - - ICCARM - 12 - - - - - BICOMP - 65 106 62 118 121 70 90 111 120 122 79 71 66 87 64 109 114 112 81 100 83 88 68 84 77 78 108 102 110 115 116 117 113 99 86 119 126 124 125 129 105 76 104 67 107 93 63 72 69 91 82 73 74 80 95 61 89 97 98 75 85 94 101 96 103 127 128 123 132 133 134 130 131 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 129 79 81 - - - - - $PROJ_DIR$\..\..\src\Platforms\Iar\UtestPlatform.cpp - - - BICOMP - 28 - - - ICCARM - 8 - - - - - BICOMP - 100 74 108 67 73 80 133 62 116 127 66 64 65 102 120 113 81 36 89 101 96 105 90 110 115 118 98 94 107 82 124 125 70 76 104 109 111 106 114 97 121 134 88 91 72 79 77 87 78 126 132 69 83 71 68 84 93 63 117 75 85 86 99 130 103 95 61 112 122 119 128 123 131 129 - - - ICCARM - 130 65 64 77 87 78 62 107 66 91 82 90 36 120 89 94 126 124 125 101 132 96 72 69 116 127 70 68 84 67 105 76 93 108 109 102 111 106 115 63 110 114 73 74 80 117 99 86 112 97 122 119 98 75 85 121 95 118 61 128 113 133 134 123 83 71 100 88 104 131 103 79 129 81 - - - - - $PROJ_DIR$\..\..\src\CppUTest\Utest.cpp - - - BICOMP - 58 - - - ICCARM - 13 - - - - - BICOMP - 98 65 64 67 88 90 66 68 76 80 81 83 84 93 91 95 89 97 121 135 79 71 70 107 62 63 72 69 82 73 74 61 75 113 126 124 125 31 129 105 100 104 77 87 78 108 109 102 111 106 110 114 115 116 117 118 120 99 86 112 122 119 85 94 101 96 103 127 128 123 132 133 134 130 131 - - - ICCARM - 127 70 68 84 65 64 77 87 78 62 107 66 67 90 105 76 93 108 109 102 111 106 115 63 72 69 116 110 91 82 114 73 74 80 120 89 117 99 86 112 97 122 119 98 75 85 121 96 95 118 61 128 94 126 124 125 101 132 113 133 134 123 130 83 71 100 88 104 131 103 31 135 79 129 81 - - - - - - Release - - - [MULTI_TOOL] - ILINK - - - - - diff --git a/platforms/iar/CppUTestTest.dep b/platforms/iar/CppUTestTest.dep deleted file mode 100644 index 6c31bc41c..000000000 --- a/platforms/iar/CppUTestTest.dep +++ /dev/null @@ -1,1228 +0,0 @@ - - - - 2 - 1731071481 - - Debug - - $TOOLKIT_DIR$\inc\c\time.h - $TOOLKIT_DIR$\inc\c\limits.h - $TOOLKIT_DIR$\inc\c\xtgmath.h - $TOOLKIT_DIR$\inc\cpp\stdexcept - $TOOLKIT_DIR$\inc\cpp\xdebug - $TOOLKIT_DIR$\inc\cpp\xmemory - $TOOLKIT_DIR$\inc\c\string.h - $TOOLKIT_DIR$\inc\cpp\xutility - $TOOLKIT_DIR$\inc\cpp\utility - $TOOLKIT_DIR$\inc\c\xmtx.h - $TOOLKIT_DIR$\inc\c\xlocale.h - $PROJ_DIR$\..\..\include\CppUTest\TestHarness.h - $PROJ_DIR$\Debug\Obj\AllTests.pbi - $PROJ_DIR$\Debug\Obj\AllTests.o - $TOOLKIT_DIR$\inc\c\DLib_Defaults.h - $TOOLKIT_DIR$\inc\c\clocale - $TOOLKIT_DIR$\inc\c\stdlib.h - $PROJ_DIR$\..\..\include\CppUTest\PlatformSpecificFunctions_c.h - $TOOLKIT_DIR$\inc\c\DLib_Product.h - $TOOLKIT_DIR$\inc\cpp\istream - $TOOLKIT_DIR$\inc\cpp\ostream - $TOOLKIT_DIR$\inc\c\cstddef - $TOOLKIT_DIR$\inc\cpp\xlocnum - $TOOLKIT_DIR$\inc\c\cwchar - $TOOLKIT_DIR$\inc\cpp\streambuf - $TOOLKIT_DIR$\inc\c\xtls.h - $PROJ_DIR$\..\..\include\CppUTest\TestFailure.h - $TOOLKIT_DIR$\inc\cpp\new - $TOOLKIT_DIR$\inc\c\DLib_Threads.h - $TOOLKIT_DIR$\inc\c\ctype.h - $TOOLKIT_DIR$\inc\cpp\memory - $PROJ_DIR$\..\..\include\CppUTest\MemoryLeakDetector.h - $PROJ_DIR$\..\..\include\CppUTest\SimpleString.h - $PROJ_DIR$\..\..\include\CppUTest\Utest.h - $PROJ_DIR$\..\..\include\CppUTest\CppUTestConfig.h - $PROJ_DIR$\..\..\include\CppUTest\PlatformSpecificFunctions.h - $PROJ_DIR$\..\..\include\CppUTest\StandardCLibrary.h - $PROJ_DIR$\..\..\include\CppUTest\MemoryLeakWarningPlugin.h - $TOOLKIT_DIR$\inc\c\cmath - $TOOLKIT_DIR$\inc\c\math.h - $TOOLKIT_DIR$\inc\c\ymath.h - $TOOLKIT_DIR$\inc\cpp\ios - $TOOLKIT_DIR$\inc\c\ystdio.h - $PROJ_DIR$\..\..\include\CppUTest\UtestMacros.h - $TOOLKIT_DIR$\inc\cpp\xiosbase - $TOOLKIT_DIR$\inc\cpp\xlocale - $TOOLKIT_DIR$\inc\cpp\xlocinfo - $TOOLKIT_DIR$\inc\c\stddef.h - $TOOLKIT_DIR$\inc\c\xencoding_limits.h - $TOOLKIT_DIR$\inc\cpp\iosfwd - $TOOLKIT_DIR$\inc\cpp\xstddef - $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h - $TOOLKIT_DIR$\inc\c\cstdio - $PROJ_DIR$\..\..\include\CppUTest\TestResult.h - $PROJ_DIR$\..\..\include\CppUTest\TestPlugin.h - $PROJ_DIR$\Debug\Obj\tests.o - $TOOLKIT_DIR$\inc\c\cstdlib - $PROJ_DIR$\..\..\tests\UtestPlatformTest.cpp - $PROJ_DIR$\..\..\tests\UtestTest.cpp - $PROJ_DIR$\..\..\tests\tests.cpp - $TOOLKIT_DIR$\inc\c\wchar.h - $TOOLKIT_DIR$\inc\cpp\xstring - $TOOLKIT_DIR$\inc\cpp\typeinfo - $TOOLKIT_DIR$\inc\cpp\exception - $TOOLKIT_DIR$\inc\cpp\string - $PROJ_DIR$\..\..\include\CppUTest\TestMemoryAllocator.h - $TOOLKIT_DIR$\inc\c\ysizet.h - $PROJ_DIR$\Debug\Obj\AllocationInCppFile.o - $PROJ_DIR$\Debug\Obj\AllocLetTestFreeTest.o - $PROJ_DIR$\Debug\Obj\AllocationInCFile.o - $TOOLKIT_DIR$\lib\m7M_tls.a - $TOOLKIT_DIR$\lib\rt7M_tl.a - $PROJ_DIR$\CppUTestTest.icf - $TOOLKIT_DIR$\lib\shb_l.a - $TOOLKIT_DIR$\lib\dlpp7M_tl_nc.a - $PROJ_DIR$\Debug\Exe\CppUTest.a - $TOOLKIT_DIR$\lib\dl7M_tln.a - $PROJ_DIR$\..\..\include\CppUTest\JUnitTestOutput.h - $PROJ_DIR$\..\..\tests\AllocationInCppFile.cpp - $PROJ_DIR$\..\..\tests\AllocationInCFile.c - $PROJ_DIR$\..\..\tests\AllocLetTestFree.c - $PROJ_DIR$\..\..\tests\MemoryOperatorOverloadTest.cpp - $PROJ_DIR$\..\..\include\CppUTest\SimpleMutex.h - $PROJ_DIR$\..\..\tests\TestResultTest.cpp - $PROJ_DIR$\..\..\tests\TestRegistryTest.cpp - $PROJ_DIR$\..\..\tests\TestUTestMacro.cpp - $TOOLKIT_DIR$\inc\c\climits - $PROJ_DIR$\..\..\tests\AllTests.cpp - $PROJ_DIR$\..\..\tests\SimpleStringTest.cpp - $TOOLKIT_DIR$\inc\c\cctype - $TOOLKIT_DIR$\inc\c\ctime - $TOOLKIT_DIR$\inc\c\xlocale_c.h - $PROJ_DIR$\..\..\include\CppUTest\MemoryLeakDetectorNewMacros.h - $TOOLKIT_DIR$\inc\c\locale.h - $TOOLKIT_DIR$\inc\c\xlocale_lconv.h - $PROJ_DIR$\..\..\include\CppUTest\TestOutput.h - $TOOLKIT_DIR$\inc\c\DLib_Product_string.h - $PROJ_DIR$\Debug\Exe\CppUTestTest.out - $PROJ_DIR$\Debug\Obj\UtestPlatformTest.pbi - $TOOLKIT_DIR$\inc\c\yvals.h - $PROJ_DIR$\Debug\Obj\CppUTestTest.pbd - $PROJ_DIR$\Debug\Obj\tests.pbi - $TOOLKIT_DIR$\inc\c\stdio.h - $TOOLKIT_DIR$\inc\c\cstring - $PROJ_DIR$\Debug\Obj\UtestPlatformTest.o - $PROJ_DIR$\Debug\Obj\UtestTest.pbi - $PROJ_DIR$\Debug\Obj\SimpleStringTest.pbi - $PROJ_DIR$\Debug\Obj\SimpleStringTest.o - $PROJ_DIR$\Debug\Obj\UtestTest.o - $TOOLKIT_DIR$\inc\c\xlocaleuse.h - $TOOLKIT_DIR$\inc\c\ycheck.h - $PROJ_DIR$\..\..\include\CppUTest\TestRegistry.h - $PROJ_DIR$\..\..\include\CppUTest\TestTestingFixture.h - $PROJ_DIR$\..\..\include\CppUTest\TestFilter.h - $PROJ_DIR$\..\..\include\CppUTest\CommandLineTestRunner.h - $PROJ_DIR$\..\..\include\CppUTest\CommandLineArguments.h - $PROJ_DIR$\..\..\tests\SetPluginTest.cpp - $PROJ_DIR$\..\..\tests\PreprocessorTest.cpp - $PROJ_DIR$\..\..\tests\SimpleMutexTest.cpp - $PROJ_DIR$\..\..\tests\TestFailureNaNTest.cpp - $PROJ_DIR$\..\..\tests\TestFailureTest.cpp - $PROJ_DIR$\..\..\tests\TestHarness_cTest.cpp - $PROJ_DIR$\..\..\tests\TestFilterTest.cpp - $PROJ_DIR$\..\..\tests\TestOutputTest.cpp - $PROJ_DIR$\..\..\tests\TestHarness_cTestCFile.c - $PROJ_DIR$\..\..\tests\TestInstallerTest.cpp - $PROJ_DIR$\..\..\tests\TestMemoryAllocatorTest.cpp - $PROJ_DIR$\Debug\Obj\TestFailureNaNTest.o - $PROJ_DIR$\Debug\Obj\TestHarness_cTestCFile.o - $PROJ_DIR$\Debug\Obj\TestFailureTest.o - $PROJ_DIR$\..\..\tests\AllocLetTestFreeTest.cpp - $PROJ_DIR$\..\..\tests\CheatSheetTest.cpp - $PROJ_DIR$\..\..\tests\CommandLineTestRunnerTest.cpp - $PROJ_DIR$\..\..\tests\CommandLineArgumentsTest.cpp - $PROJ_DIR$\..\..\tests\MemoryLeakWarningTest.cpp - $PROJ_DIR$\..\..\tests\JUnitOutputTest.cpp - $PROJ_DIR$\..\..\tests\MemoryLeakDetectorTest.cpp - $PROJ_DIR$\..\..\tests\PluginTest.cpp - $PROJ_DIR$\..\..\include\CppUTest\TestHarness_c.h - $PROJ_DIR$\Debug\Obj\CheatSheetTest.pbi - $PROJ_DIR$\Debug\Obj\MemoryOperatorOverloadTest.o - $PROJ_DIR$\..\..\tests\AllocLetTestFree.h - $PROJ_DIR$\..\..\tests\AllocationInCppFile.h - $PROJ_DIR$\Debug\Obj\CommandLineArgumentsTest.pbi - $PROJ_DIR$\Debug\Obj\CommandLineTestRunnerTest.pbi - $PROJ_DIR$\Debug\Obj\MemoryLeakWarningTest.o - $PROJ_DIR$\Debug\Obj\JUnitOutputTest.o - $PROJ_DIR$\Debug\Obj\JUnitOutputTest.pbi - $PROJ_DIR$\Debug\Obj\MemoryOperatorOverloadTest.pbi - $PROJ_DIR$\Debug\Obj\MemoryLeakDetectorTest.pbi - $PROJ_DIR$\Debug\Obj\MemoryLeakWarningTest.pbi - $PROJ_DIR$\Debug\Obj\MemoryLeakDetectorTest.o - $PROJ_DIR$\Debug\Obj\AllocLetTestFree.pbi - $PROJ_DIR$\Debug\Obj\AllocationInCFile.pbi - $PROJ_DIR$\Debug\Obj\AllocLetTestFree.o - $PROJ_DIR$\Debug\Obj\AllocationInCppFile.pbi - $PROJ_DIR$\Debug\Obj\AllocLetTestFreeTest.pbi - $PROJ_DIR$\Debug\Obj\CommandLineTestRunnerTest.o - $PROJ_DIR$\Debug\Obj\CheatSheetTest.o - $PROJ_DIR$\Debug\Obj\CommandLineArgumentsTest.o - $PROJ_DIR$\..\..\include\CppUTest\MemoryLeakDetectorMallocMacros.h - $PROJ_DIR$\..\..\tests\AllocationInCFile.h - $PROJ_DIR$\Debug\Obj\SetPluginTest.o - $PROJ_DIR$\Debug\Obj\SimpleMutexTest.o - $PROJ_DIR$\Debug\Obj\CheatSheetTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestInstallerTest.pbi - $PROJ_DIR$\Debug\Obj\TestRegistryTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestOutputTest.o - $PROJ_DIR$\Debug\Obj\PreprocessorTest.pbi - $PROJ_DIR$\Debug\Obj\PreprocessorTest.o - $PROJ_DIR$\Debug\Obj\SetPluginTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestUTestMacro.pbi - $PROJ_DIR$\Debug\Obj\JUnitOutputTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestUTestMacro.o - $PROJ_DIR$\Debug\Obj\TestRegistryTest.o - $PROJ_DIR$\Debug\Obj\TestResultTest.pbi - $PROJ_DIR$\Debug\Obj\SetPluginTest.pbi - $PROJ_DIR$\Debug\Obj\CommandLineArgumentsTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestInstallerTest.o - $PROJ_DIR$\Debug\Obj\PluginTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestMemoryAllocatorTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestRegistryTest.pbi - $PROJ_DIR$\Debug\Obj\SimpleMutexTest.pbi - $PROJ_DIR$\Debug\Obj\MemoryLeakWarningTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestFailureNaNTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestHarness_cTestCFile.__cstat.et - $PROJ_DIR$\Debug\Obj\TestResultTest.o - $PROJ_DIR$\Debug\Obj\CommandLineTestRunnerTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestHarness_cTest.__cstat.et - $PROJ_DIR$\Debug\Obj\AllocationInCppFile.__cstat.et - $PROJ_DIR$\Debug\Obj\TestInstallerTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestMemoryAllocatorTest.o - $PROJ_DIR$\Debug\Obj\AllocLetTestFreeTest.__cstat.et - $PROJ_DIR$\Debug\Obj\MemoryLeakDetectorTest.__cstat.et - $PROJ_DIR$\Debug\Obj\AllocationInCFile.__cstat.et - $PROJ_DIR$\Debug\Obj\TestFailureTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestResultTest.__cstat.et - $PROJ_DIR$\Debug\Obj\PluginTest.pbi - $PROJ_DIR$\Debug\Obj\PreprocessorTest.__cstat.et - $PROJ_DIR$\Debug\Obj\MemoryOperatorOverloadTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestOutputTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestOutputTest.pbi - $PROJ_DIR$\Debug\Obj\SimpleMutexTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestFilterTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestUTestMacro.__cstat.et - $PROJ_DIR$\Debug\Obj\AllocLetTestFree.__cstat.et - $PROJ_DIR$\Debug\Obj\TestMemoryAllocatorTest.pbi - $PROJ_DIR$\Debug\Obj\PluginTest.o - $PROJ_DIR$\Debug\Obj\SimpleStringTest.__cstat.et - $PROJ_DIR$\Debug\Obj\AllTests.__cstat.et - $PROJ_DIR$\Debug\Obj\UtestPlatformTest.__cstat.et - $PROJ_DIR$\Debug\Obj\UtestTest.__cstat.et - $PROJ_DIR$\Debug\Obj\TestHarness_cTest.pbi - $PROJ_DIR$\Debug\Obj\TestHarness_cTest.o - $PROJ_DIR$\Debug\Obj\TestFilterTest.o - $PROJ_DIR$\Debug\Obj\TestFilterTest.pbi - $PROJ_DIR$\Debug\Obj\TestFailureTest.pbi - $PROJ_DIR$\Debug\Obj\TestHarness_cTestCFile.pbi - $PROJ_DIR$\Debug\Obj\TestFailureNaNTest.pbi - $PROJ_DIR$\tests\AllTests.cpp - - - $PROJ_DIR$\..\..\tests\UtestPlatformTest.cpp - - - BICOMP - 98 - - - ICCARM - 104 - - - __cstat - 210 - - - - - BICOMP - 110 52 1 99 27 60 28 15 95 32 2 50 63 29 109 17 34 37 66 19 41 3 103 30 112 113 33 26 56 20 22 86 24 4 6 21 5 23 11 35 115 43 53 54 36 47 16 14 48 51 18 64 38 39 40 102 42 44 45 62 46 96 61 7 8 49 10 25 9 114 89 90 91 93 94 0 92 111 - - - ICCARM - 114 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 95 115 113 112 111 35 17 - - - - - $PROJ_DIR$\..\..\tests\UtestTest.cpp - - - BICOMP - 105 - - - ICCARM - 108 - - - __cstat - 211 - - - - - BICOMP - 66 14 36 102 64 110 54 16 18 62 96 61 99 95 17 43 47 48 56 7 103 23 113 112 53 34 51 32 38 39 40 42 44 45 46 8 49 50 15 10 25 9 35 33 26 37 28 19 20 41 22 86 52 24 1 2 3 4 6 63 21 5 27 29 109 60 30 11 89 90 91 93 94 0 92 111 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 95 112 111 113 35 17 - - - - - $PROJ_DIR$\..\..\tests\tests.cpp - - - BICOMP - 101 - - - ICCARM - 55 - - - - - $PROJ_DIR$\..\..\tests\AllocationInCppFile.cpp - - - BICOMP - 155 - - - ICCARM - 67 - - - __cstat - 189 - - - - - BICOMP - 24 20 66 102 47 110 99 18 0 36 16 27 52 62 89 30 34 14 48 86 96 22 2 90 142 64 56 28 51 23 42 60 41 44 45 103 46 63 5 61 91 93 94 92 50 21 7 8 1 49 6 19 38 39 40 3 4 15 29 10 25 109 9 - - - ICCARM - 92 34 36 47 110 99 14 51 18 48 28 66 56 16 27 63 50 21 30 5 7 86 1 8 49 52 102 42 103 6 96 23 60 64 19 20 41 22 38 39 40 2 24 44 45 3 61 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 142 - - - - - $PROJ_DIR$\..\..\tests\AllocationInCFile.c - - - BICOMP - 153 - - - ICCARM - 69 - - - __cstat - 194 - - - - - BICOMP - 110 47 99 36 14 18 34 48 51 160 16 66 28 161 - - - ICCARM - 161 160 34 36 47 110 99 14 51 18 48 28 66 16 - - - - - $PROJ_DIR$\..\..\tests\AllocLetTestFree.c - - - BICOMP - 152 - - - ICCARM - 154 - - - __cstat - 205 - - - - - BICOMP - 110 99 14 18 16 36 66 48 51 34 47 28 141 - - - ICCARM - 36 34 47 110 99 14 51 18 48 28 66 16 141 - - - - - $PROJ_DIR$\..\..\tests\MemoryOperatorOverloadTest.cpp - - - BICOMP - 148 - - - ICCARM - 140 - - - __cstat - 199 - - - - - BICOMP - 99 7 92 56 110 36 138 54 16 51 0 30 113 111 43 47 66 64 102 62 96 61 89 17 31 112 53 34 14 48 18 32 38 39 40 42 44 45 103 46 8 49 52 60 90 65 95 35 142 161 33 26 37 28 19 20 41 22 86 24 1 2 3 4 15 6 63 50 21 5 27 23 91 93 94 11 29 10 25 109 9 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 65 31 95 111 113 35 17 112 142 138 161 - - - - - $PROJ_DIR$\..\..\tests\TestResultTest.cpp - - - BICOMP - 175 - - - ICCARM - 186 - - - __cstat - 196 - - - - - BICOMP - 99 86 26 56 66 23 20 24 110 21 33 16 48 22 4 6 5 17 95 34 32 37 28 19 41 52 1 2 3 15 63 50 27 60 10 25 9 54 35 43 53 36 47 14 51 18 64 38 39 40 102 42 44 45 103 62 46 96 61 7 8 49 29 109 30 11 89 90 91 93 94 0 92 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 35 95 17 - - - - - $PROJ_DIR$\..\..\tests\TestRegistryTest.cpp - - - BICOMP - 181 - - - ICCARM - 174 - - - __cstat - 166 - - - - - BICOMP - 14 21 34 110 103 20 24 18 66 86 99 23 30 53 48 22 4 6 5 63 29 109 60 32 95 43 54 36 47 16 51 19 41 52 1 2 3 15 50 27 111 33 26 37 56 28 64 38 39 40 102 42 44 45 62 46 96 61 7 8 49 10 25 9 113 11 89 90 91 93 94 0 92 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 111 113 95 - - - - - $PROJ_DIR$\..\..\tests\TestUTestMacro.cpp - - - BICOMP - 171 - - - ICCARM - 173 - - - __cstat - 204 - - - - - BICOMP - 56 110 48 99 66 7 53 0 34 14 18 64 102 62 96 61 89 112 43 54 36 47 16 51 32 38 39 40 42 44 45 103 46 8 52 60 90 5 111 95 33 26 37 28 19 20 41 22 86 24 1 2 3 4 15 6 63 50 21 27 23 91 93 94 92 113 11 49 29 10 25 109 9 30 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 95 112 111 113 - - - - - $PROJ_DIR$\..\..\tests\AllTests.cpp - - - BICOMP - 12 - - - ICCARM - 13 - - - __cstat - 209 - - - - - BICOMP - 95 20 24 110 99 53 14 21 66 18 86 23 11 34 48 22 4 6 5 115 43 54 36 47 16 51 19 41 52 1 2 3 15 63 50 27 60 10 25 9 113 33 32 26 37 56 28 64 38 39 40 102 42 44 45 103 62 46 96 61 7 8 49 29 109 30 114 89 90 91 93 94 0 92 - - - ICCARM - 114 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 95 115 113 - - - - - $PROJ_DIR$\..\..\tests\SimpleStringTest.cpp - - - BICOMP - 106 - - - ICCARM - 107 - - - __cstat - 208 - - - - - BICOMP - 66 86 99 30 33 20 24 110 21 7 103 31 26 56 16 48 22 4 6 5 63 29 109 60 32 35 34 37 28 19 41 52 1 2 3 15 50 8 49 65 43 53 54 36 47 14 51 18 64 38 39 40 102 42 44 45 62 46 96 61 27 23 10 25 9 17 11 89 90 91 93 94 0 92 95 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 35 95 17 65 31 - - - - - $PROJ_DIR$\Debug\Exe\CppUTestTest.out - - - ILINK - 72 69 67 154 68 13 158 159 157 146 151 145 140 207 169 162 163 107 127 129 214 213 128 178 191 167 174 186 173 104 108 75 73 71 74 70 76 - - - - - $PROJ_DIR$\..\..\tests\SetPluginTest.cpp - - - BICOMP - 176 - - - ICCARM - 162 - - - __cstat - 170 - - - - - BICOMP - 4 99 27 48 86 110 32 16 22 6 5 66 56 92 34 37 51 20 24 21 23 93 95 33 26 14 18 19 41 52 1 2 3 15 63 50 60 61 91 94 111 54 43 53 36 47 28 64 38 39 40 102 42 44 45 103 62 46 96 7 8 49 89 90 0 11 29 10 25 109 9 30 113 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 111 113 95 - - - - - $PROJ_DIR$\..\..\tests\PreprocessorTest.cpp - - - BICOMP - 168 - - - ICCARM - 169 - - - __cstat - 198 - - - - - BICOMP - 23 28 99 66 56 7 53 110 103 34 64 102 62 96 61 15 10 109 60 32 27 43 54 36 47 16 38 39 40 42 44 45 46 8 49 50 63 29 33 26 37 14 48 51 18 19 20 41 22 86 52 24 1 2 3 4 6 21 5 89 90 25 9 11 91 93 94 0 92 30 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 - - - - - $PROJ_DIR$\..\..\tests\SimpleMutexTest.cpp - - - BICOMP - 182 - - - ICCARM - 163 - - - __cstat - 202 - - - - - BICOMP - 66 62 96 61 110 99 53 64 102 34 51 56 7 103 17 35 43 54 36 47 16 14 48 18 32 38 39 40 42 44 45 46 8 49 50 63 29 109 60 30 82 33 26 37 28 19 20 41 22 86 52 24 1 2 3 4 15 6 21 5 27 23 10 25 9 11 89 90 91 93 94 0 92 95 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 82 35 95 17 - - - - - $PROJ_DIR$\..\..\tests\TestFailureNaNTest.cpp - - - BICOMP - 218 - - - ICCARM - 127 - - - __cstat - 184 - - - - - BICOMP - 99 103 51 110 34 56 7 66 17 53 64 102 62 96 61 23 35 43 54 36 47 16 14 48 18 32 38 39 40 42 44 45 46 8 49 50 15 10 25 9 95 33 26 37 28 19 20 41 22 86 52 24 1 2 3 4 6 63 21 5 27 60 29 109 30 11 89 90 91 93 94 0 92 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 95 35 17 - - - - - $PROJ_DIR$\..\..\tests\TestFailureTest.cpp - - - BICOMP - 216 - - - ICCARM - 129 - - - __cstat - 195 - - - - - BICOMP - 32 36 110 99 47 14 39 93 54 16 18 42 103 66 49 50 43 48 38 40 44 45 46 56 8 92 27 53 34 51 64 102 62 96 61 7 91 94 95 33 26 37 28 19 20 41 22 86 52 24 1 2 3 4 15 6 63 21 5 23 60 89 90 0 11 29 10 25 109 9 30 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 95 - - - - - $PROJ_DIR$\..\..\tests\TestHarness_cTest.cpp - - - BICOMP - 212 - - - ICCARM - 213 - - - __cstat - 188 - - - - - BICOMP - 99 36 33 10 9 16 66 32 39 3 63 110 15 54 112 47 28 26 38 40 50 27 25 111 31 34 37 64 56 86 4 6 21 5 103 23 113 95 11 35 14 48 51 18 43 53 19 20 41 22 52 24 1 2 102 42 44 45 62 46 96 61 7 8 49 29 109 60 30 138 89 90 91 93 94 0 92 17 - - - ICCARM - 138 34 36 47 110 99 14 51 18 48 28 66 56 16 11 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 111 113 95 112 35 17 31 - - - - - $PROJ_DIR$\..\..\tests\TestFilterTest.cpp - - - BICOMP - 215 - - - ICCARM - 214 - - - __cstat - 203 - - - - - BICOMP - 2 50 53 110 52 66 48 1 15 27 60 90 34 14 18 99 19 41 3 63 89 64 43 54 36 47 16 51 20 22 86 24 4 6 21 5 23 56 61 10 25 9 113 33 32 26 37 28 38 39 40 102 42 44 45 103 62 46 96 7 8 49 29 109 11 91 93 94 0 92 30 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 113 - - - - - $PROJ_DIR$\..\..\tests\TestOutputTest.cpp - - - BICOMP - 201 - - - ICCARM - 167 - - - __cstat - 200 - - - - - BICOMP - 62 43 96 61 47 110 48 23 16 64 102 54 36 14 18 56 99 7 103 66 17 53 34 51 32 38 39 40 42 44 45 46 8 15 10 25 9 95 35 33 26 37 28 19 20 41 22 86 52 24 1 2 3 4 6 63 50 21 5 27 49 29 109 60 30 11 89 90 91 93 94 0 92 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 95 35 17 - - - - - $PROJ_DIR$\..\..\tests\TestHarness_cTestCFile.c - - - BICOMP - 217 - - - ICCARM - 128 - - - __cstat - 185 - - - - - BICOMP - 47 48 28 99 66 36 110 34 14 17 16 51 18 138 - - - ICCARM - 138 34 36 47 110 99 14 51 18 48 28 66 16 17 - - - - - $PROJ_DIR$\..\..\tests\TestInstallerTest.cpp - - - BICOMP - 165 - - - ICCARM - 178 - - - __cstat - 190 - - - - - BICOMP - 99 86 51 54 16 110 66 23 90 32 36 20 24 21 64 43 47 22 4 6 5 53 34 14 48 18 19 41 52 1 2 3 15 63 50 27 60 89 0 111 33 26 37 56 28 38 39 40 102 42 44 45 103 62 46 96 61 7 8 49 91 93 94 92 11 29 10 25 109 9 30 113 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 111 113 - - - - - $PROJ_DIR$\..\..\tests\TestMemoryAllocatorTest.cpp - - - BICOMP - 206 - - - ICCARM - 191 - - - __cstat - 180 - - - - - BICOMP - 44 51 8 40 45 54 16 99 110 36 38 46 56 23 43 47 32 39 42 103 66 49 35 112 53 34 14 48 18 64 102 62 96 61 7 15 10 25 9 111 65 33 26 37 28 19 20 41 22 86 52 24 1 2 3 4 6 63 50 21 5 27 29 109 60 30 95 113 11 89 90 91 93 94 0 92 17 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 65 35 95 17 112 111 113 - - - - - $PROJ_DIR$\..\..\tests\AllocLetTestFreeTest.cpp - - - BICOMP - 156 - - - ICCARM - 68 - - - __cstat - 192 - - - - - BICOMP - 20 24 110 21 61 34 66 86 99 23 53 22 4 6 5 56 109 60 32 27 11 47 16 28 43 54 19 41 52 1 2 3 15 63 50 89 90 141 36 14 48 51 18 33 26 37 64 38 39 40 102 42 44 45 103 62 46 96 7 8 49 29 10 25 9 91 93 94 0 92 30 - - - ICCARM - 36 34 47 110 99 14 51 18 48 28 66 56 16 141 11 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 - - - - - $PROJ_DIR$\..\..\tests\CheatSheetTest.cpp - - - BICOMP - 139 - - - ICCARM - 158 - - - __cstat - 164 - - - - - BICOMP - 110 26 56 99 103 28 7 23 33 66 64 102 62 96 61 15 10 109 60 32 27 11 34 37 36 38 39 40 42 44 45 46 47 8 49 50 63 29 43 53 54 16 14 48 51 18 19 20 41 22 86 52 24 1 2 3 4 6 21 5 89 90 25 9 91 93 94 0 92 30 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 - - - - - $PROJ_DIR$\..\..\tests\CommandLineTestRunnerTest.cpp - - - BICOMP - 144 - - - ICCARM - 157 - - - __cstat - 187 - - - - - BICOMP - 25 48 99 33 28 62 96 61 110 16 64 102 32 54 26 56 7 15 10 9 17 111 35 34 37 36 38 39 40 42 44 45 103 46 66 47 8 23 95 114 112 77 43 53 14 51 18 19 20 41 22 86 52 24 1 2 3 4 6 63 50 21 5 27 49 29 109 60 30 113 11 89 90 91 93 94 0 92 115 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 114 95 115 113 111 112 77 35 17 - - - - - $PROJ_DIR$\..\..\tests\CommandLineArgumentsTest.cpp - - - BICOMP - 143 - - - ICCARM - 159 - - - __cstat - 177 - - - - - BICOMP - 66 46 110 38 99 56 32 43 47 40 44 45 8 93 54 36 16 39 42 103 49 50 92 27 111 53 34 28 64 102 62 96 61 7 91 94 113 115 33 26 37 14 48 51 18 19 20 41 22 86 52 24 1 2 3 4 15 6 63 21 5 23 60 89 90 0 11 29 10 25 109 9 30 95 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 115 95 113 111 - - - - - $PROJ_DIR$\..\..\tests\MemoryLeakWarningTest.cpp - - - BICOMP - 150 - - - ICCARM - 145 - - - __cstat - 183 - - - - - BICOMP - 32 36 92 110 99 47 14 39 52 82 54 16 18 42 103 66 49 64 17 31 43 48 38 40 44 45 46 56 8 60 90 95 112 53 34 51 102 62 96 61 7 89 0 113 111 37 65 138 33 26 28 19 20 41 22 86 24 1 2 3 4 15 6 63 50 21 5 27 23 91 93 94 11 29 10 25 109 9 30 35 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 111 113 95 31 65 112 138 82 35 17 - - - - - $PROJ_DIR$\..\..\tests\JUnitOutputTest.cpp - - - BICOMP - 147 - - - ICCARM - 146 - - - __cstat - 172 - - - - - BICOMP - 42 110 16 50 91 34 54 49 103 66 36 32 99 39 47 43 38 40 44 45 46 56 8 61 94 17 53 28 64 102 62 96 7 93 92 27 77 35 33 26 37 14 48 51 18 19 20 41 22 86 52 24 1 2 3 4 15 6 63 21 5 23 60 89 90 0 95 11 29 10 25 109 9 30 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 77 95 35 17 - - - - - $PROJ_DIR$\..\..\tests\MemoryLeakDetectorTest.cpp - - - BICOMP - 149 - - - ICCARM - 151 - - - __cstat - 193 - - - - - BICOMP - 47 16 102 99 43 64 25 110 48 62 96 61 17 54 36 51 56 7 15 10 9 65 53 34 66 14 18 32 38 39 40 42 44 45 103 46 8 49 23 31 35 33 26 37 28 19 20 41 22 86 52 24 1 2 3 4 6 63 50 21 5 27 29 109 60 30 11 89 90 91 93 94 0 92 95 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 31 65 35 95 17 - - - - - $PROJ_DIR$\..\..\tests\PluginTest.cpp - - - BICOMP - 197 - - - ICCARM - 207 - - - __cstat - 179 - - - - - BICOMP - 99 110 48 56 7 60 33 103 63 29 109 32 26 14 18 66 64 102 62 96 61 30 95 34 37 51 36 38 39 40 42 44 45 46 47 8 49 50 111 112 43 53 54 16 28 19 20 41 22 86 52 24 1 2 3 4 15 6 21 5 27 23 10 25 9 113 11 89 90 91 93 94 0 92 - - - ICCARM - 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 111 113 95 112 - - - - - [ROOT_NODE] - - - ILINK - 97 - - - - - $PROJ_DIR$\tests\AllTests.cpp - - - BICOMP - 12 - - - ICCARM - 13 - - - - - BICOMP - 40 45 95 44 8 99 53 66 38 46 56 110 11 34 32 36 39 42 103 47 49 50 23 115 43 54 16 28 48 64 102 62 96 61 7 15 10 25 9 113 33 26 37 14 51 18 19 20 41 22 86 52 24 1 2 3 4 6 63 21 5 27 60 29 109 30 114 89 90 91 93 94 0 92 - - - ICCARM - 114 11 34 36 47 110 99 14 51 18 48 28 66 56 16 33 32 64 19 20 41 22 86 1 38 39 40 2 52 102 42 24 44 45 103 6 96 3 63 50 21 61 5 27 7 8 49 23 60 62 4 46 89 29 10 25 9 109 91 15 93 94 90 0 43 53 26 54 37 92 30 95 115 113 - - - - - $PROJ_DIR$\..\..\tests\UtestPlatformTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\UtestTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\AllocationInCppFile.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\AllocationInCFile.c - C-STAT - - - $PROJ_DIR$\..\..\tests\AllocLetTestFree.c - C-STAT - - - $PROJ_DIR$\..\..\tests\MemoryOperatorOverloadTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\TestResultTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\TestRegistryTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\TestUTestMacro.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\AllTests.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\SimpleStringTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\SetPluginTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\PreprocessorTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\SimpleMutexTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\TestFailureNaNTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\TestFailureTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\TestHarness_cTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\TestFilterTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\TestOutputTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\TestHarness_cTestCFile.c - C-STAT - - - $PROJ_DIR$\..\..\tests\TestInstallerTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\TestMemoryAllocatorTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\AllocLetTestFreeTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\CheatSheetTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\CommandLineTestRunnerTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\CommandLineArgumentsTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\MemoryLeakWarningTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\JUnitOutputTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\MemoryLeakDetectorTest.cpp - C-STAT - - - $PROJ_DIR$\..\..\tests\PluginTest.cpp - C-STAT - - - - Release - - - [MULTI_TOOL] - ILINK - - - [REBUILD_ALL] - - - - - From 51ca4067920f007db4befa403aa1d4c9ae2e48eb Mon Sep 17 00:00:00 2001 From: Daniel Gullberg Date: Fri, 2 Sep 2016 10:23:24 +0200 Subject: [PATCH 0067/1093] Removed and ignoring IAR automatically generated file --- .gitignore | 3 + platforms/iar/CppUTest.ewt | 2176 ------------------------------- platforms/iar/CppUTestTest.ewt | 2215 -------------------------------- 3 files changed, 3 insertions(+), 4391 deletions(-) delete mode 100644 platforms/iar/CppUTest.ewt delete mode 100644 platforms/iar/CppUTestTest.ewt diff --git a/.gitignore b/.gitignore index dd213b974..3ff7f0ad1 100644 --- a/.gitignore +++ b/.gitignore @@ -80,4 +80,7 @@ missing test-driver platforms/iar/settings cpputest_*.xml + +#IAR automatically generated files *.dep +*.ewt diff --git a/platforms/iar/CppUTest.ewt b/platforms/iar/CppUTest.ewt deleted file mode 100644 index c1de1bc55..000000000 --- a/platforms/iar/CppUTest.ewt +++ /dev/null @@ -1,2176 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - C-STAT - 1 - - 1 - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - Release - - ARM - - 0 - - C-STAT - 1 - - 1 - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - src - - CppUTest - - $PROJ_DIR$\src\CppUTest\CommandLineArguments.cpp - - - $PROJ_DIR$\src\CppUTest\CommandLineTestRunner.cpp - - - $PROJ_DIR$\src\CppUTest\JUnitTestOutput.cpp - - - $PROJ_DIR$\src\CppUTest\MemoryLeakDetector.cpp - - - $PROJ_DIR$\src\CppUTest\MemoryLeakWarningPlugin.cpp - - - $PROJ_DIR$\src\CppUTest\SimpleMutex.cpp - - - $PROJ_DIR$\src\CppUTest\SimpleString.cpp - - - $PROJ_DIR$\src\CppUTest\TestFailure.cpp - - - $PROJ_DIR$\src\CppUTest\TestFilter.cpp - - - $PROJ_DIR$\src\CppUTest\TestHarness_c.cpp - - - $PROJ_DIR$\src\CppUTest\TestMemoryAllocator.cpp - - - $PROJ_DIR$\src\CppUTest\TestOutput.cpp - - - $PROJ_DIR$\src\CppUTest\TestPlugin.cpp - - - $PROJ_DIR$\src\CppUTest\TestRegistry.cpp - - - $PROJ_DIR$\src\CppUTest\TestResult.cpp - - - $PROJ_DIR$\src\CppUTest\Utest.cpp - - - - Platforms - - Iar - - $PROJ_DIR$\src\Platforms\Iar\UtestPlatform.cpp - - - - - - - diff --git a/platforms/iar/CppUTestTest.ewt b/platforms/iar/CppUTestTest.ewt deleted file mode 100644 index 64dba0e4f..000000000 --- a/platforms/iar/CppUTestTest.ewt +++ /dev/null @@ -1,2215 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - C-STAT - 1 - - 1 - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - Release - - ARM - - 0 - - C-STAT - 1 - - 1 - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - tests - - failing - - - passing - - $PROJ_DIR$\..\..\tests\AllocationInCFile.c - - - $PROJ_DIR$\..\..\tests\AllocationInCppFile.cpp - - - $PROJ_DIR$\..\..\tests\AllocLetTestFree.c - - - $PROJ_DIR$\..\..\tests\AllocLetTestFreeTest.cpp - - - $PROJ_DIR$\..\..\tests\CheatSheetTest.cpp - - - $PROJ_DIR$\..\..\tests\CommandLineArgumentsTest.cpp - - - $PROJ_DIR$\..\..\tests\CommandLineTestRunnerTest.cpp - - - $PROJ_DIR$\..\..\tests\JUnitOutputTest.cpp - - - $PROJ_DIR$\..\..\tests\MemoryLeakDetectorTest.cpp - - - $PROJ_DIR$\..\..\tests\MemoryLeakWarningTest.cpp - - - $PROJ_DIR$\..\..\tests\MemoryOperatorOverloadTest.cpp - - - $PROJ_DIR$\..\..\tests\PluginTest.cpp - - - $PROJ_DIR$\..\..\tests\PreprocessorTest.cpp - - - $PROJ_DIR$\..\..\tests\SetPluginTest.cpp - - - $PROJ_DIR$\..\..\tests\SimpleMutexTest.cpp - - - $PROJ_DIR$\..\..\tests\SimpleStringTest.cpp - - - $PROJ_DIR$\..\..\tests\TestFailureNaNTest.cpp - - - $PROJ_DIR$\..\..\tests\TestFailureTest.cpp - - - $PROJ_DIR$\..\..\tests\TestFilterTest.cpp - - - $PROJ_DIR$\..\..\tests\TestHarness_cTest.cpp - - - $PROJ_DIR$\..\..\tests\TestHarness_cTestCFile.c - - - $PROJ_DIR$\..\..\tests\TestInstallerTest.cpp - - - $PROJ_DIR$\..\..\tests\TestMemoryAllocatorTest.cpp - - - $PROJ_DIR$\..\..\tests\TestOutputTest.cpp - - - $PROJ_DIR$\..\..\tests\TestRegistryTest.cpp - - - $PROJ_DIR$\..\..\tests\TestResultTest.cpp - - - $PROJ_DIR$\..\..\tests\TestUTestMacro.cpp - - - $PROJ_DIR$\..\..\tests\UtestPlatformTest.cpp - - - $PROJ_DIR$\..\..\tests\UtestTest.cpp - - - - warnings - - - $PROJ_DIR$\tests\AllTests.cpp - - - - - From d17eefc4bc465032fcae2538eef7a47112008208 Mon Sep 17 00:00:00 2001 From: Daniel Gullberg Date: Wed, 9 Nov 2016 16:57:57 +0100 Subject: [PATCH 0068/1093] Upgraded project to IAR EWARM 7.70.1.11471 2nd try. The first upgrade was probably broken because of some changes done in the latest merges that was lost in the process of rebasing my own changes to the cpputest master branch. --- platforms/iar/CppUTest.ewd | 926 ++++++++++++++++++++++++++------- platforms/iar/CppUTest.ewp | 114 ++-- platforms/iar/CppUTestTest.ewd | 926 ++++++++++++++++++++++++++------- platforms/iar/CppUTestTest.ewp | 112 ++-- 4 files changed, 1601 insertions(+), 477 deletions(-) diff --git a/platforms/iar/CppUTest.ewd b/platforms/iar/CppUTest.ewd index 68ed95334..1c6f889c9 100644 --- a/platforms/iar/CppUTest.ewd +++ b/platforms/iar/CppUTest.ewd @@ -12,7 +12,7 @@ C-SPY 2 - 26 + 28 1 1 - + + @@ -278,18 +282,47 @@ - CMSISDAP_ID + CADI_ID 2 - 2 + 0 1 1 + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + @@ -520,15 +561,15 @@ IJET_ID 2 - 6 + 8 1 1 + + JLINK_ID 2 - 15 + 16 1 1 + - @@ -1193,7 +1195,7 @@ STLINK_ID 2 - 2 + 3 1 1 + + + + + + + + + + + + + + + + + + @@ -1253,10 +1328,10 @@ - XDS100_ID + TIFET_ID 2 - 2 + 1 1 1 + + + + + + + + + + + + + + XDS100_ID + 2 + + 5 + 1 + 1 + + + - - - - - $TOOLKIT_DIR$\plugins\middleware\HCCWare\HCCWare.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\AVIX\AVIX.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\MQX\MQXRtosPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Quadros\Quadros_EWB7_Plugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\middleware\HCCWare\HCCWare.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\middleware\PercepioTraceExporter\PercepioTraceExportPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\AVIX\AVIX.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\MQX\MQXRtosPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Quadros\Quadros_EWB7_Plugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin 0 @@ -1359,10 +1627,6 @@ $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin 0 - - $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin - 1 - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin 0 @@ -1379,7 +1643,7 @@ C-SPY 2 - 26 + 28 1 0 - + + @@ -1645,18 +1913,47 @@ - CMSISDAP_ID + CADI_ID 2 - 2 + 0 1 0 + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + @@ -1887,15 +2192,15 @@ IJET_ID 2 - 6 + 8 1 0 + + JLINK_ID 2 - 15 + 16 1 0 + - @@ -2560,7 +2826,7 @@ STLINK_ID 2 - 2 + 3 1 0 + + + + + + + + + + + + + + + + + + @@ -2620,10 +2959,10 @@ - XDS100_ID + TIFET_ID 2 - 2 + 1 1 0 + + + + + + + + + + + + + + XDS100_ID + 2 + + 5 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2666,6 +3194,10 @@ $TOOLKIT_DIR$\plugins\middleware\HCCWare\HCCWare.ewplugin 0 + + $TOOLKIT_DIR$\plugins\middleware\PercepioTraceExporter\PercepioTraceExportPlugin.ewplugin + 0 + $TOOLKIT_DIR$\plugins\rtos\AVIX\AVIX.ENU.ewplugin 0 @@ -2726,10 +3258,6 @@ $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin 0 - - $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin - 1 - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin 0 diff --git a/platforms/iar/CppUTest.ewp b/platforms/iar/CppUTest.ewp index 539d21e58..c8084ff3b 100644 --- a/platforms/iar/CppUTest.ewp +++ b/platforms/iar/CppUTest.ewp @@ -12,7 +12,7 @@ General 3 - 22 + 24 1 1 - - - + + + + + + @@ -631,7 +644,7 @@ ILINK 0 - 16 + 17 1 1 + @@ -934,7 +951,7 @@ @@ -954,7 +971,7 @@ General 3 - 22 + 24 1 0 - - - + + + + + + @@ -1573,7 +1603,7 @@ ILINK 0 - 16 + 17 1 0 + diff --git a/platforms/iar/CppUTestTest.ewd b/platforms/iar/CppUTestTest.ewd index 68ed95334..1c6f889c9 100644 --- a/platforms/iar/CppUTestTest.ewd +++ b/platforms/iar/CppUTestTest.ewd @@ -12,7 +12,7 @@ C-SPY 2 - 26 + 28 1 1 - + + @@ -278,18 +282,47 @@ - CMSISDAP_ID + CADI_ID 2 - 2 + 0 1 1 + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + @@ -520,15 +561,15 @@ IJET_ID 2 - 6 + 8 1 1 + + JLINK_ID 2 - 15 + 16 1 1 + - @@ -1193,7 +1195,7 @@ STLINK_ID 2 - 2 + 3 1 1 + + + + + + + + + + + + + + + + + + @@ -1253,10 +1328,10 @@ - XDS100_ID + TIFET_ID 2 - 2 + 1 1 1 + + + + + + + + + + + + + + XDS100_ID + 2 + + 5 + 1 + 1 + + + - - - - - $TOOLKIT_DIR$\plugins\middleware\HCCWare\HCCWare.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\AVIX\AVIX.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\MQX\MQXRtosPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Quadros\Quadros_EWB7_Plugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\middleware\HCCWare\HCCWare.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\middleware\PercepioTraceExporter\PercepioTraceExportPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\AVIX\AVIX.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\MQX\MQXRtosPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Quadros\Quadros_EWB7_Plugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin 0 @@ -1359,10 +1627,6 @@ $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin 0 - - $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin - 1 - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin 0 @@ -1379,7 +1643,7 @@ C-SPY 2 - 26 + 28 1 0 - + + @@ -1645,18 +1913,47 @@ - CMSISDAP_ID + CADI_ID 2 - 2 + 0 1 0 + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + @@ -1887,15 +2192,15 @@ IJET_ID 2 - 6 + 8 1 0 + + JLINK_ID 2 - 15 + 16 1 0 + - @@ -2560,7 +2826,7 @@ STLINK_ID 2 - 2 + 3 1 0 + + + + + + + + + + + + + + + + + + @@ -2620,10 +2959,10 @@ - XDS100_ID + TIFET_ID 2 - 2 + 1 1 0 + + + + + + + + + + + + + + XDS100_ID + 2 + + 5 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2666,6 +3194,10 @@ $TOOLKIT_DIR$\plugins\middleware\HCCWare\HCCWare.ewplugin 0 + + $TOOLKIT_DIR$\plugins\middleware\PercepioTraceExporter\PercepioTraceExportPlugin.ewplugin + 0 + $TOOLKIT_DIR$\plugins\rtos\AVIX\AVIX.ENU.ewplugin 0 @@ -2726,10 +3258,6 @@ $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin 0 - - $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin - 1 - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin 0 diff --git a/platforms/iar/CppUTestTest.ewp b/platforms/iar/CppUTestTest.ewp index f057ad905..aba2202a6 100644 --- a/platforms/iar/CppUTestTest.ewp +++ b/platforms/iar/CppUTestTest.ewp @@ -12,7 +12,7 @@ General 3 - 22 + 24 1 1 - - - + + + + + + @@ -631,7 +644,7 @@ ILINK 0 - 16 + 17 1 1 + @@ -954,7 +971,7 @@ General 3 - 22 + 24 1 0 - - - + + + + + + @@ -1573,7 +1603,7 @@ ILINK 0 - 16 + 17 1 0 + From c2d29b4573aae3f82229e6986b672126a86c3f26 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Thu, 10 Nov 2016 23:18:07 -0600 Subject: [PATCH 0069/1093] Moved CppUTest tests into dedicated folder --- tests/{ => CppUTest}/AllTests.cpp | 0 tests/{ => CppUTest}/AllTests.h | 0 tests/{ => CppUTest}/AllocLetTestFree.c | 0 tests/{ => CppUTest}/AllocLetTestFree.h | 0 tests/{ => CppUTest}/AllocLetTestFreeTest.cpp | 0 tests/{ => CppUTest}/AllocationInCFile.c | 0 tests/{ => CppUTest}/AllocationInCFile.h | 0 tests/{ => CppUTest}/AllocationInCppFile.cpp | 0 tests/{ => CppUTest}/AllocationInCppFile.h | 0 tests/{ => CppUTest}/CheatSheetTest.cpp | 0 tests/{ => CppUTest}/CommandLineArgumentsTest.cpp | 0 tests/{ => CppUTest}/CommandLineTestRunnerTest.cpp | 0 tests/{ => CppUTest}/JUnitOutputTest.cpp | 0 tests/{ => CppUTest}/MemoryLeakDetectorTest.cpp | 0 tests/{ => CppUTest}/MemoryLeakWarningTest.cpp | 0 tests/{ => CppUTest}/MemoryOperatorOverloadTest.cpp | 0 tests/{ => CppUTest}/PluginTest.cpp | 0 tests/{ => CppUTest}/PreprocessorTest.cpp | 0 tests/{ => CppUTest}/SetPluginTest.cpp | 0 tests/{ => CppUTest}/SimpleMutexTest.cpp | 0 tests/{ => CppUTest}/SimpleStringTest.cpp | 0 tests/{ => CppUTest}/TeamCityOutputTest.cpp | 0 tests/{ => CppUTest}/TestFailureNaNTest.cpp | 0 tests/{ => CppUTest}/TestFailureTest.cpp | 0 tests/{ => CppUTest}/TestFilterTest.cpp | 0 tests/{ => CppUTest}/TestHarness_cTest.cpp | 0 tests/{ => CppUTest}/TestHarness_cTestCFile.c | 0 tests/{ => CppUTest}/TestInstallerTest.cpp | 0 tests/{ => CppUTest}/TestMemoryAllocatorTest.cpp | 0 tests/{ => CppUTest}/TestOutputTest.cpp | 0 tests/{ => CppUTest}/TestRegistryTest.cpp | 0 tests/{ => CppUTest}/TestResultTest.cpp | 0 tests/{ => CppUTest}/TestUTestMacro.cpp | 0 tests/{ => CppUTest}/TestUTestStringMacro.cpp | 0 tests/{ => CppUTest}/UtestPlatformTest.cpp | 0 tests/{ => CppUTest}/UtestTest.cpp | 0 36 files changed, 0 insertions(+), 0 deletions(-) rename tests/{ => CppUTest}/AllTests.cpp (100%) rename tests/{ => CppUTest}/AllTests.h (100%) rename tests/{ => CppUTest}/AllocLetTestFree.c (100%) rename tests/{ => CppUTest}/AllocLetTestFree.h (100%) rename tests/{ => CppUTest}/AllocLetTestFreeTest.cpp (100%) rename tests/{ => CppUTest}/AllocationInCFile.c (100%) rename tests/{ => CppUTest}/AllocationInCFile.h (100%) rename tests/{ => CppUTest}/AllocationInCppFile.cpp (100%) rename tests/{ => CppUTest}/AllocationInCppFile.h (100%) rename tests/{ => CppUTest}/CheatSheetTest.cpp (100%) rename tests/{ => CppUTest}/CommandLineArgumentsTest.cpp (100%) rename tests/{ => CppUTest}/CommandLineTestRunnerTest.cpp (100%) rename tests/{ => CppUTest}/JUnitOutputTest.cpp (100%) rename tests/{ => CppUTest}/MemoryLeakDetectorTest.cpp (100%) rename tests/{ => CppUTest}/MemoryLeakWarningTest.cpp (100%) rename tests/{ => CppUTest}/MemoryOperatorOverloadTest.cpp (100%) rename tests/{ => CppUTest}/PluginTest.cpp (100%) rename tests/{ => CppUTest}/PreprocessorTest.cpp (100%) rename tests/{ => CppUTest}/SetPluginTest.cpp (100%) rename tests/{ => CppUTest}/SimpleMutexTest.cpp (100%) rename tests/{ => CppUTest}/SimpleStringTest.cpp (100%) rename tests/{ => CppUTest}/TeamCityOutputTest.cpp (100%) rename tests/{ => CppUTest}/TestFailureNaNTest.cpp (100%) rename tests/{ => CppUTest}/TestFailureTest.cpp (100%) rename tests/{ => CppUTest}/TestFilterTest.cpp (100%) rename tests/{ => CppUTest}/TestHarness_cTest.cpp (100%) rename tests/{ => CppUTest}/TestHarness_cTestCFile.c (100%) rename tests/{ => CppUTest}/TestInstallerTest.cpp (100%) rename tests/{ => CppUTest}/TestMemoryAllocatorTest.cpp (100%) rename tests/{ => CppUTest}/TestOutputTest.cpp (100%) rename tests/{ => CppUTest}/TestRegistryTest.cpp (100%) rename tests/{ => CppUTest}/TestResultTest.cpp (100%) rename tests/{ => CppUTest}/TestUTestMacro.cpp (100%) rename tests/{ => CppUTest}/TestUTestStringMacro.cpp (100%) rename tests/{ => CppUTest}/UtestPlatformTest.cpp (100%) rename tests/{ => CppUTest}/UtestTest.cpp (100%) diff --git a/tests/AllTests.cpp b/tests/CppUTest/AllTests.cpp similarity index 100% rename from tests/AllTests.cpp rename to tests/CppUTest/AllTests.cpp diff --git a/tests/AllTests.h b/tests/CppUTest/AllTests.h similarity index 100% rename from tests/AllTests.h rename to tests/CppUTest/AllTests.h diff --git a/tests/AllocLetTestFree.c b/tests/CppUTest/AllocLetTestFree.c similarity index 100% rename from tests/AllocLetTestFree.c rename to tests/CppUTest/AllocLetTestFree.c diff --git a/tests/AllocLetTestFree.h b/tests/CppUTest/AllocLetTestFree.h similarity index 100% rename from tests/AllocLetTestFree.h rename to tests/CppUTest/AllocLetTestFree.h diff --git a/tests/AllocLetTestFreeTest.cpp b/tests/CppUTest/AllocLetTestFreeTest.cpp similarity index 100% rename from tests/AllocLetTestFreeTest.cpp rename to tests/CppUTest/AllocLetTestFreeTest.cpp diff --git a/tests/AllocationInCFile.c b/tests/CppUTest/AllocationInCFile.c similarity index 100% rename from tests/AllocationInCFile.c rename to tests/CppUTest/AllocationInCFile.c diff --git a/tests/AllocationInCFile.h b/tests/CppUTest/AllocationInCFile.h similarity index 100% rename from tests/AllocationInCFile.h rename to tests/CppUTest/AllocationInCFile.h diff --git a/tests/AllocationInCppFile.cpp b/tests/CppUTest/AllocationInCppFile.cpp similarity index 100% rename from tests/AllocationInCppFile.cpp rename to tests/CppUTest/AllocationInCppFile.cpp diff --git a/tests/AllocationInCppFile.h b/tests/CppUTest/AllocationInCppFile.h similarity index 100% rename from tests/AllocationInCppFile.h rename to tests/CppUTest/AllocationInCppFile.h diff --git a/tests/CheatSheetTest.cpp b/tests/CppUTest/CheatSheetTest.cpp similarity index 100% rename from tests/CheatSheetTest.cpp rename to tests/CppUTest/CheatSheetTest.cpp diff --git a/tests/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp similarity index 100% rename from tests/CommandLineArgumentsTest.cpp rename to tests/CppUTest/CommandLineArgumentsTest.cpp diff --git a/tests/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp similarity index 100% rename from tests/CommandLineTestRunnerTest.cpp rename to tests/CppUTest/CommandLineTestRunnerTest.cpp diff --git a/tests/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp similarity index 100% rename from tests/JUnitOutputTest.cpp rename to tests/CppUTest/JUnitOutputTest.cpp diff --git a/tests/MemoryLeakDetectorTest.cpp b/tests/CppUTest/MemoryLeakDetectorTest.cpp similarity index 100% rename from tests/MemoryLeakDetectorTest.cpp rename to tests/CppUTest/MemoryLeakDetectorTest.cpp diff --git a/tests/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp similarity index 100% rename from tests/MemoryLeakWarningTest.cpp rename to tests/CppUTest/MemoryLeakWarningTest.cpp diff --git a/tests/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp similarity index 100% rename from tests/MemoryOperatorOverloadTest.cpp rename to tests/CppUTest/MemoryOperatorOverloadTest.cpp diff --git a/tests/PluginTest.cpp b/tests/CppUTest/PluginTest.cpp similarity index 100% rename from tests/PluginTest.cpp rename to tests/CppUTest/PluginTest.cpp diff --git a/tests/PreprocessorTest.cpp b/tests/CppUTest/PreprocessorTest.cpp similarity index 100% rename from tests/PreprocessorTest.cpp rename to tests/CppUTest/PreprocessorTest.cpp diff --git a/tests/SetPluginTest.cpp b/tests/CppUTest/SetPluginTest.cpp similarity index 100% rename from tests/SetPluginTest.cpp rename to tests/CppUTest/SetPluginTest.cpp diff --git a/tests/SimpleMutexTest.cpp b/tests/CppUTest/SimpleMutexTest.cpp similarity index 100% rename from tests/SimpleMutexTest.cpp rename to tests/CppUTest/SimpleMutexTest.cpp diff --git a/tests/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp similarity index 100% rename from tests/SimpleStringTest.cpp rename to tests/CppUTest/SimpleStringTest.cpp diff --git a/tests/TeamCityOutputTest.cpp b/tests/CppUTest/TeamCityOutputTest.cpp similarity index 100% rename from tests/TeamCityOutputTest.cpp rename to tests/CppUTest/TeamCityOutputTest.cpp diff --git a/tests/TestFailureNaNTest.cpp b/tests/CppUTest/TestFailureNaNTest.cpp similarity index 100% rename from tests/TestFailureNaNTest.cpp rename to tests/CppUTest/TestFailureNaNTest.cpp diff --git a/tests/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp similarity index 100% rename from tests/TestFailureTest.cpp rename to tests/CppUTest/TestFailureTest.cpp diff --git a/tests/TestFilterTest.cpp b/tests/CppUTest/TestFilterTest.cpp similarity index 100% rename from tests/TestFilterTest.cpp rename to tests/CppUTest/TestFilterTest.cpp diff --git a/tests/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp similarity index 100% rename from tests/TestHarness_cTest.cpp rename to tests/CppUTest/TestHarness_cTest.cpp diff --git a/tests/TestHarness_cTestCFile.c b/tests/CppUTest/TestHarness_cTestCFile.c similarity index 100% rename from tests/TestHarness_cTestCFile.c rename to tests/CppUTest/TestHarness_cTestCFile.c diff --git a/tests/TestInstallerTest.cpp b/tests/CppUTest/TestInstallerTest.cpp similarity index 100% rename from tests/TestInstallerTest.cpp rename to tests/CppUTest/TestInstallerTest.cpp diff --git a/tests/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp similarity index 100% rename from tests/TestMemoryAllocatorTest.cpp rename to tests/CppUTest/TestMemoryAllocatorTest.cpp diff --git a/tests/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp similarity index 100% rename from tests/TestOutputTest.cpp rename to tests/CppUTest/TestOutputTest.cpp diff --git a/tests/TestRegistryTest.cpp b/tests/CppUTest/TestRegistryTest.cpp similarity index 100% rename from tests/TestRegistryTest.cpp rename to tests/CppUTest/TestRegistryTest.cpp diff --git a/tests/TestResultTest.cpp b/tests/CppUTest/TestResultTest.cpp similarity index 100% rename from tests/TestResultTest.cpp rename to tests/CppUTest/TestResultTest.cpp diff --git a/tests/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp similarity index 100% rename from tests/TestUTestMacro.cpp rename to tests/CppUTest/TestUTestMacro.cpp diff --git a/tests/TestUTestStringMacro.cpp b/tests/CppUTest/TestUTestStringMacro.cpp similarity index 100% rename from tests/TestUTestStringMacro.cpp rename to tests/CppUTest/TestUTestStringMacro.cpp diff --git a/tests/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp similarity index 100% rename from tests/UtestPlatformTest.cpp rename to tests/CppUTest/UtestPlatformTest.cpp diff --git a/tests/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp similarity index 100% rename from tests/UtestTest.cpp rename to tests/CppUTest/UtestTest.cpp From 4a5c1367a2cc0e9447350e3dd43936d58d92a1ff Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Thu, 10 Nov 2016 23:23:32 -0600 Subject: [PATCH 0070/1093] Updated CMake files for new test locations --- CMakeLists.txt | 5 ++++- tests/{ => CppUTest}/CMakeLists.txt | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) rename tests/{ => CppUTest}/CMakeLists.txt (97%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 61687e0b7..f2ec69e54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,7 +70,10 @@ if (EXTENSIONS) endif (EXTENSIONS) if (TESTS) - add_subdirectory(tests) + add_subdirectory(tests/CppUTest) + if (EXTENSIONS) + add_subdirectory(tests/CppUTestExt) + endif (EXTENSIONS) endif (TESTS) set (INCLUDE_INSTALL_DIR "include") diff --git a/tests/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt similarity index 97% rename from tests/CMakeLists.txt rename to tests/CppUTest/CMakeLists.txt index 2759e3785..abc66169c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -55,5 +55,4 @@ add_executable(CppUTestTests ${CppUTestTests_src}) cpputest_normalize_test_output_location(CppUTestTests) target_link_libraries(CppUTestTests CppUTest ${THREAD_LIB}) -add_subdirectory(CppUTestExt) cpputest_buildtime_discover_tests(CppUTestTests) From 6e7651e7c21cc1de67b662282a936e473f04e311 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Thu, 10 Nov 2016 23:24:17 -0600 Subject: [PATCH 0071/1093] Updated VS project files with new test location --- tests/AllTests.dep | 56 ++++++++++++++++---------------- tests/AllTests.dsp | 64 ++++++++++++++++++------------------- tests/AllTests.mak | 46 +++++++++++++-------------- tests/AllTests.vcproj | 70 ++++++++++++++++++++-------------------- tests/AllTests.vcxproj | 72 +++++++++++++++++++++--------------------- 5 files changed, 154 insertions(+), 154 deletions(-) diff --git a/tests/AllTests.dep b/tests/AllTests.dep index 164ffb00e..6ceb6ca45 100644 --- a/tests/AllTests.dep +++ b/tests/AllTests.dep @@ -1,20 +1,20 @@ # Microsoft Developer Studio Generated Dependency File, included by AllTests.mak -.\AllocationInCFile.c : \ +.\CppUTest\AllocationInCFile.c : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorMallocMacros.h"\ "..\include\CppUTest\StandardCLibrary.h"\ - ".\AllocationInCFile.h"\ + ".\CppUTest\AllocationInCFile.h"\ -.\AllocationInCppFile.cpp : \ +.\CppUTest\AllocationInCppFile.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\StandardCLibrary.h"\ - ".\AllocationInCppFile.h"\ + ".\CppUTest\AllocationInCppFile.h"\ -.\CppUTestExt\AllTests.cpp : \ +.\CppUTest\CppUTestExt\AllTests.cpp : \ "..\include\CppUTest\CommandLineArguments.h"\ "..\include\CppUTest\CommandLineTestRunner.h"\ "..\include\CppUTest\CppUTestConfig.h"\ @@ -39,7 +39,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\CheatSheetTest.cpp : \ +.\CppUTest\CheatSheetTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -74,7 +74,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\CommandLineArgumentsTest.cpp : \ +.\CppUTest\CommandLineArgumentsTest.cpp : \ "..\include\CppUTest\CommandLineArguments.h"\ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ @@ -93,7 +93,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\CommandLineTestRunnerTest.cpp : \ +.\CppUTest\CommandLineTestRunnerTest.cpp : \ "..\include\CppUTest\CommandLineArguments.h"\ "..\include\CppUTest\CommandLineTestRunner.h"\ "..\include\CppUTest\CppUTestConfig.h"\ @@ -133,7 +133,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\JUnitOutputTest.cpp : \ +.\CppUTest\JUnitOutputTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\JunitTestOutput.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ @@ -152,7 +152,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\MemoryLeakDetectorTest.cpp : \ +.\CppUTest\MemoryLeakDetectorTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetector.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ @@ -172,7 +172,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\MemoryLeakOperatorOverloadsTest.cpp : \ +.\CppUTest\MemoryLeakOperatorOverloadsTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetector.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ @@ -194,11 +194,11 @@ "..\include\CppUTest\Utest.h"\ "..\include\CppUTest\UtestMacros.h"\ "..\include\platforms\visualcpp\stdint.h"\ - ".\AllocationInCFile.h"\ - ".\AllocationInCppFile.h"\ + ".\CppUTest\AllocationInCFile.h"\ + ".\CppUTest\AllocationInCppFile.h"\ -.\MemoryLeakWarningTest.cpp : \ +.\CppUTest\MemoryLeakWarningTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetector.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ @@ -496,7 +496,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\PluginTest.cpp : \ +.\CppUTest\PluginTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -515,7 +515,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\PreprocessorTest.cpp : \ +.\CppUTest\PreprocessorTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -530,7 +530,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\SetPluginTest.cpp : \ +.\CppUTest\SetPluginTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -548,7 +548,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\SimpleStringTest.cpp : \ +.\CppUTest\SimpleStringTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -567,7 +567,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\TestFailureTest.cpp : \ +.\CppUTest\TestFailureTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -583,7 +583,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\TestFilterTest.cpp : \ +.\CppUTest\TestFilterTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -599,7 +599,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\TestHarness_cTest.cpp : \ +.\CppUTest\TestHarness_cTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -621,14 +621,14 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\TestHarness_cTestCFile.c : \ +.\CppUTest\TestHarness_cTestCFile.c : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ "..\include\CppUTest\StandardCLibrary.h"\ "..\include\CppUTest\TestHarness_c.h"\ -.\TestInstallerTest.cpp : \ +.\CppUTest\TestInstallerTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -645,7 +645,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\TestMemoryAllocatorTest.cpp : \ +.\CppUTest\TestMemoryAllocatorTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -664,7 +664,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\TestOutputTest.cpp : \ +.\CppUTest\TestOutputTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -682,7 +682,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\TestRegistryTest.cpp : \ +.\CppUTest\TestRegistryTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -700,7 +700,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\TestResultTest.cpp : \ +.\CppUTest\TestResultTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ @@ -718,7 +718,7 @@ "..\include\platforms\visualcpp\stdint.h"\ -.\UtestTest.cpp : \ +.\CppUTest\UtestTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ diff --git a/tests/AllTests.dsp b/tests/AllTests.dsp index da3578ac2..1d18a1405 100644 --- a/tests/AllTests.dsp +++ b/tests/AllTests.dsp @@ -98,19 +98,19 @@ PostBuild_Cmds=$(TargetPath) -v # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File -SOURCE=.\AllocationInCFile.c +SOURCE=.\CppUTest\AllocationInCFile.c # End Source File # Begin Source File -SOURCE=.\AllocationInCppFile.cpp +SOURCE=.\CppUTest\AllocationInCppFile.cpp # End Source File # Begin Source File -SOURCE=.\AllocLetTestFree.c +SOURCE=.\CppUTest\AllocLetTestFree.c # End Source File # Begin Source File -SOURCE=.\AllocLetTestFreeTest.cpp +SOURCE=.\CppUTest\AllocLetTestFreeTest.cpp # End Source File # Begin Source File @@ -118,7 +118,7 @@ SOURCE=.\CppUTestExt\AllTests.cpp # End Source File # Begin Source File -SOURCE=.\CheatSheetTest.cpp +SOURCE=.\CppUTest\CheatSheetTest.cpp # End Source File # Begin Source File @@ -126,11 +126,11 @@ SOURCE=.\CppUTestExt\CodeMemoryReporterTest.cpp # End Source File # Begin Source File -SOURCE=.\CommandLineArgumentsTest.cpp +SOURCE=.\CppUTest\CommandLineArgumentsTest.cpp # End Source File # Begin Source File -SOURCE=.\CommandLineTestRunnerTest.cpp +SOURCE=.\CppUTest\CommandLineTestRunnerTest.cpp # End Source File # Begin Source File @@ -150,19 +150,19 @@ SOURCE=.\CppUTestExt\GTest2ConvertorTest.cpp # End Source File # Begin Source File -SOURCE=.\JUnitOutputTest.cpp +SOURCE=.\CppUTest\JUnitOutputTest.cpp # End Source File # Begin Source File -SOURCE=.\MemoryLeakDetectorTest.cpp +SOURCE=.\CppUTest\MemoryLeakDetectorTest.cpp # End Source File # Begin Source File -SOURCE=.\MemoryLeakWarningTest.cpp +SOURCE=.\CppUTest\MemoryLeakWarningTest.cpp # End Source File # Begin Source File -SOURCE=.\MemoryOperatorOverloadTest.cpp +SOURCE=.\CppUTest\MemoryOperatorOverloadTest.cpp # End Source File # Begin Source File @@ -230,75 +230,75 @@ SOURCE=.\CppUTestExt\OrderedTestTest.cpp # End Source File # Begin Source File -SOURCE=.\PluginTest.cpp +SOURCE=.\CppUTest\PluginTest.cpp # End Source File # Begin Source File -SOURCE=.\PreprocessorTest.cpp +SOURCE=.\CppUTest\PreprocessorTest.cpp # End Source File # Begin Source File -SOURCE=.\SetPluginTest.cpp +SOURCE=.\CppUTest\SetPluginTest.cpp # End Source File # Begin Source File -SOURCE=.\SimpleMutexTest.cpp +SOURCE=.\CppUTest\SimpleMutexTest.cpp # End Source File # Begin Source File -SOURCE=.\SimpleStringTest.cpp +SOURCE=.\CppUTest\SimpleStringTest.cpp # End Source File # Begin Source File -SOURCE=.\TestFailureNaNTest.cpp +SOURCE=.\CppUTest\TestFailureNaNTest.cpp # End Source File # Begin Source File -SOURCE=.\TestFailureTest.cpp +SOURCE=.\CppUTest\TestFailureTest.cpp # End Source File # Begin Source File -SOURCE=.\TestFilterTest.cpp +SOURCE=.\CppUTest\TestFilterTest.cpp # End Source File # Begin Source File -SOURCE=.\TestHarness_cTest.cpp +SOURCE=.\CppUTest\TestHarness_cTest.cpp # End Source File # Begin Source File -SOURCE=.\TestHarness_cTestCFile.c +SOURCE=.\CppUTest\TestHarness_cTestCFile.c # End Source File # Begin Source File -SOURCE=.\TestInstallerTest.cpp +SOURCE=.\CppUTest\TestInstallerTest.cpp # End Source File # Begin Source File -SOURCE=.\TestMemoryAllocatorTest.cpp +SOURCE=.\CppUTest\TestMemoryAllocatorTest.cpp # End Source File # Begin Source File -SOURCE=.\TestOutputTest.cpp +SOURCE=.\CppUTest\TestOutputTest.cpp # End Source File # Begin Source File -SOURCE=.\TestRegistryTest.cpp +SOURCE=.\CppUTest\TestRegistryTest.cpp # End Source File # Begin Source File -SOURCE=.\TestResultTest.cpp +SOURCE=.\CppUTest\TestResultTest.cpp # End Source File # Begin Source File -SOURCE=.\TestUtestMacro.cpp +SOURCE=.\CppUTest\TestUtestMacro.cpp # End Source File # Begin Source File -SOURCE=.\UtestPlatformTest.cpp +SOURCE=.\CppUTest\UtestPlatformTest.cpp # End Source File # Begin Source File -SOURCE=.\UtestTest.cpp +SOURCE=.\CppUTest\UtestTest.cpp # End Source File # End Group # Begin Group "Header Files" @@ -306,15 +306,15 @@ SOURCE=.\UtestTest.cpp # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File -SOURCE=.\AllocationInCFile.h +SOURCE=.\CppUTest\AllocationInCFile.h # End Source File # Begin Source File -SOURCE=.\AllocationInCppFile.h +SOURCE=.\CppUTest\AllocationInCppFile.h # End Source File # Begin Source File -SOURCE=.\AllTests.h +SOURCE=.\CppUTest\AllTests.h # End Source File # Begin Source File diff --git a/tests/AllTests.mak b/tests/AllTests.mak index 775a82d4c..b84ade5b1 100644 --- a/tests/AllTests.mak +++ b/tests/AllTests.mak @@ -443,7 +443,7 @@ $(DS_POSTBUILD_DEP) : "CppUTest - Win32 Debug" "$(OUTDIR)\AllTests.exe" "$(OUTDI !IF "$(CFG)" == "AllTests - Win32 Release" || "$(CFG)" == "AllTests - Win32 Debug" -SOURCE=.\AllocationInCFile.c +SOURCE=.\CppUTest\AllocationInCFile.c !IF "$(CFG)" == "AllTests - Win32 Release" @@ -459,7 +459,7 @@ SOURCE=.\AllocationInCFile.c !ENDIF -SOURCE=.\AllocationInCppFile.cpp +SOURCE=.\CppUTest\AllocationInCppFile.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -493,7 +493,7 @@ SOURCE=.\CppUTestExt\AllTests.cpp !ENDIF -SOURCE=.\CheatSheetTest.cpp +SOURCE=.\CppUTest\CheatSheetTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -527,7 +527,7 @@ SOURCE=.\CppUTestExt\CodeMemoryReportFormatterTest.cpp !ENDIF -SOURCE=.\CommandLineArgumentsTest.cpp +SOURCE=.\CppUTest\CommandLineArgumentsTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -543,7 +543,7 @@ SOURCE=.\CommandLineArgumentsTest.cpp !ENDIF -SOURCE=.\CommandLineTestRunnerTest.cpp +SOURCE=.\CppUTest\CommandLineTestRunnerTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -613,7 +613,7 @@ SOURCE=.\CppUTestExt\GTest2ConvertorTest.cpp !ENDIF -SOURCE=.\JUnitOutputTest.cpp +SOURCE=.\CppUTest\JUnitOutputTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -629,7 +629,7 @@ SOURCE=.\JUnitOutputTest.cpp !ENDIF -SOURCE=.\MemoryLeakDetectorTest.cpp +SOURCE=.\CppUTest\MemoryLeakDetectorTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -645,7 +645,7 @@ SOURCE=.\MemoryLeakDetectorTest.cpp !ENDIF -SOURCE=.\MemoryLeakOperatorOverloadsTest.cpp +SOURCE=.\CppUTest\MemoryLeakOperatorOverloadsTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -661,7 +661,7 @@ SOURCE=.\MemoryLeakOperatorOverloadsTest.cpp !ENDIF -SOURCE=.\MemoryLeakWarningTest.cpp +SOURCE=.\CppUTest\MemoryLeakWarningTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -911,7 +911,7 @@ SOURCE=.\CppUTestExt\OrderedTestTest.cpp !ENDIF -SOURCE=.\PluginTest.cpp +SOURCE=.\CppUTest\PluginTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -927,7 +927,7 @@ SOURCE=.\PluginTest.cpp !ENDIF -SOURCE=.\PreprocessorTest.cpp +SOURCE=.\CppUTest\PreprocessorTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -943,7 +943,7 @@ SOURCE=.\PreprocessorTest.cpp !ENDIF -SOURCE=.\SetPluginTest.cpp +SOURCE=.\CppUTest\SetPluginTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -959,7 +959,7 @@ SOURCE=.\SetPluginTest.cpp !ENDIF -SOURCE=.\SimpleStringTest.cpp +SOURCE=.\CppUTest\SimpleStringTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -975,7 +975,7 @@ SOURCE=.\SimpleStringTest.cpp !ENDIF -SOURCE=.\TestFailureTest.cpp +SOURCE=.\CppUTest\TestFailureTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -991,7 +991,7 @@ SOURCE=.\TestFailureTest.cpp !ENDIF -SOURCE=.\TestFilterTest.cpp +SOURCE=.\CppUTest\TestFilterTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -1007,7 +1007,7 @@ SOURCE=.\TestFilterTest.cpp !ENDIF -SOURCE=.\TestHarness_cTest.cpp +SOURCE=.\CppUTest\TestHarness_cTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -1023,7 +1023,7 @@ SOURCE=.\TestHarness_cTest.cpp !ENDIF -SOURCE=.\TestHarness_cTestCFile.c +SOURCE=.\CppUTest\TestHarness_cTestCFile.c !IF "$(CFG)" == "AllTests - Win32 Release" @@ -1039,7 +1039,7 @@ SOURCE=.\TestHarness_cTestCFile.c !ENDIF -SOURCE=.\TestInstallerTest.cpp +SOURCE=.\CppUTest\TestInstallerTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -1055,7 +1055,7 @@ SOURCE=.\TestInstallerTest.cpp !ENDIF -SOURCE=.\TestMemoryAllocatorTest.cpp +SOURCE=.\CppUTest\TestMemoryAllocatorTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -1071,7 +1071,7 @@ SOURCE=.\TestMemoryAllocatorTest.cpp !ENDIF -SOURCE=.\TestOutputTest.cpp +SOURCE=.\CppUTest\TestOutputTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -1087,7 +1087,7 @@ SOURCE=.\TestOutputTest.cpp !ENDIF -SOURCE=.\TestRegistryTest.cpp +SOURCE=.\CppUTest\TestRegistryTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -1103,7 +1103,7 @@ SOURCE=.\TestRegistryTest.cpp !ENDIF -SOURCE=.\TestResultTest.cpp +SOURCE=.\CppUTest\TestResultTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" @@ -1119,7 +1119,7 @@ SOURCE=.\TestResultTest.cpp !ENDIF -SOURCE=.\UtestTest.cpp +SOURCE=.\CppUTest\UtestTest.cpp !IF "$(CFG)" == "AllTests - Win32 Release" diff --git a/tests/AllTests.vcproj b/tests/AllTests.vcproj index 0225cba2e..87425f326 100644 --- a/tests/AllTests.vcproj +++ b/tests/AllTests.vcproj @@ -194,7 +194,7 @@ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" > - - - - - - - + + + + + + + @@ -168,38 +168,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - + From 81515d2d255d27af7e42e4b79a5860d784cb56bb Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Thu, 10 Nov 2016 23:42:25 -0600 Subject: [PATCH 0072/1093] Updated location of tests in autotools file --- Makefile.am | 64 ++++++++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/Makefile.am b/Makefile.am index 585c9d7cc..b868b52b2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -136,38 +136,38 @@ CppUTestTests_LDADD = lib/libCppUTest.a $(CPPUTEST_LDADD) CppUTestTests_LDFLAGS = $(AM_LDFLAGS) $(CPPUTEST_LDFLAGS) $(CPPUTEST_ADDITIONAL_LDFLAGS) CppUTestTests_SOURCES = \ - tests/AllocationInCFile.c \ - tests/AllocationInCppFile.cpp \ - tests/AllocLetTestFree.c \ - tests/AllocLetTestFreeTest.cpp \ - tests/AllTests.cpp \ - tests/CheatSheetTest.cpp \ - tests/CommandLineArgumentsTest.cpp \ - tests/CommandLineTestRunnerTest.cpp \ - tests/JUnitOutputTest.cpp \ - tests/MemoryLeakDetectorTest.cpp \ - tests/MemoryOperatorOverloadTest.cpp \ - tests/MemoryLeakWarningTest.cpp \ - tests/PluginTest.cpp \ - tests/PreprocessorTest.cpp \ - tests/SetPluginTest.cpp \ - tests/SimpleStringTest.cpp \ - tests/SimpleMutexTest.cpp \ - tests/TeamCityOutputTest.cpp \ - tests/TestFailureNaNTest.cpp \ - tests/TestFailureTest.cpp \ - tests/TestFilterTest.cpp \ - tests/TestHarness_cTest.cpp \ - tests/TestHarness_cTestCFile.c \ - tests/TestInstallerTest.cpp \ - tests/TestMemoryAllocatorTest.cpp \ - tests/TestOutputTest.cpp \ - tests/TestRegistryTest.cpp \ - tests/TestResultTest.cpp \ - tests/TestUTestMacro.cpp \ - tests/TestUTestStringMacro.cpp \ - tests/UtestTest.cpp \ - tests/UtestPlatformTest.cpp + tests/CppUTest/AllocationInCFile.c \ + tests/CppUTest/AllocationInCppFile.cpp \ + tests/CppUTest/AllocLetTestFree.c \ + tests/CppUTest/AllocLetTestFreeTest.cpp \ + tests/CppUTest/AllTests.cpp \ + tests/CppUTest/CheatSheetTest.cpp \ + tests/CppUTest/CommandLineArgumentsTest.cpp \ + tests/CppUTest/CommandLineTestRunnerTest.cpp \ + tests/CppUTest/JUnitOutputTest.cpp \ + tests/CppUTest/MemoryLeakDetectorTest.cpp \ + tests/CppUTest/MemoryOperatorOverloadTest.cpp \ + tests/CppUTest/MemoryLeakWarningTest.cpp \ + tests/CppUTest/PluginTest.cpp \ + tests/CppUTest/PreprocessorTest.cpp \ + tests/CppUTest/SetPluginTest.cpp \ + tests/CppUTest/SimpleStringTest.cpp \ + tests/CppUTest/SimpleMutexTest.cpp \ + tests/CppUTest/TeamCityOutputTest.cpp \ + tests/CppUTest/TestFailureNaNTest.cpp \ + tests/CppUTest/TestFailureTest.cpp \ + tests/CppUTest/TestFilterTest.cpp \ + tests/CppUTest/TestHarness_cTest.cpp \ + tests/CppUTest/TestHarness_cTestCFile.c \ + tests/CppUTest/TestInstallerTest.cpp \ + tests/CppUTest/TestMemoryAllocatorTest.cpp \ + tests/CppUTest/TestOutputTest.cpp \ + tests/CppUTest/TestRegistryTest.cpp \ + tests/CppUTest/TestResultTest.cpp \ + tests/CppUTest/TestUTestMacro.cpp \ + tests/CppUTest/TestUTestStringMacro.cpp \ + tests/CppUTest/UtestTest.cpp \ + tests/CppUTest/UtestPlatformTest.cpp CppUTestExtTests_CPPFLAGS = $(lib_libCppUTestExt_a_CPPFLAGS) CppUTestExtTests_CFLAGS = $(lib_libCppUTestExt_a_CFLAGS) From 5157f8ea7f7b455035bc60e456087a78497bc96f Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Thu, 10 Nov 2016 23:54:31 -0600 Subject: [PATCH 0073/1093] Fix path for executing tests --- scripts/appveyor_ci_test.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/appveyor_ci_test.ps1 b/scripts/appveyor_ci_test.ps1 index 423395117..8961b09ee 100644 --- a/scripts/appveyor_ci_test.ps1 +++ b/scripts/appveyor_ci_test.ps1 @@ -95,7 +95,7 @@ switch -Wildcard ($env:Platform) $mingw_path = Get-MinGWBin Add-PathFolder $mingw_path - Invoke-Tests '.\cpputest_build\tests\CppUTestTests.exe' + Invoke-Tests '.\cpputest_build\tests\CppUTest\CppUTestTests.exe' Invoke-Tests '.\cpputest_build\tests\CppUTestExt\CppUTestExtTests.exe' Remove-PathFolder $mingw_path } From 21cdbf7d4a1046f20521fdde561bad40ee9d6fbd Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Thu, 10 Nov 2016 23:56:40 -0600 Subject: [PATCH 0074/1093] Fix path in old-style makefile for new test folder --- Makefile_using_MakefileWorker | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile_using_MakefileWorker b/Makefile_using_MakefileWorker index a4b0a12b2..c5aa4dc6d 100644 --- a/Makefile_using_MakefileWorker +++ b/Makefile_using_MakefileWorker @@ -18,7 +18,7 @@ SRC_DIRS = \ src/Platforms/$(CPP_PLATFORM) TEST_SRC_DIRS = \ - tests + tests/CppUTest INCLUDE_DIRS =\ include From 5c333c596655bac726f7ba5b9e5967839a574837 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Fri, 11 Nov 2016 00:16:05 -0600 Subject: [PATCH 0075/1093] Fix path to open-watcom installer --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 6e6f3ba45..c55b64bda 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -76,7 +76,7 @@ if [ "x$BUILD" = "xcmake_coverage" ]; then fi if [ "x$BUILD" = "xmake_dos" ]; then - wget ftp://ftp.openwatcom.org/pub/open-watcom-c-linux-1.9 -O /tmp/watcom.zip + wget ftp://ftp.openwatcom.org/install/open-watcom-c-linux-1.9 -O /tmp/watcom.zip mkdir -p watcom && unzip -aqd watcom /tmp/watcom.zip && chmod -R +x watcom/binl export PATH=$PATH:$PWD/watcom/binl export WATCOM=$PWD/watcom From 00d78382e5bff32dd46c8b7e58b1de2f24507a82 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Fri, 11 Nov 2016 00:16:05 -0600 Subject: [PATCH 0076/1093] Fix path to open-watcom installer --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 6e6f3ba45..c55b64bda 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -76,7 +76,7 @@ if [ "x$BUILD" = "xcmake_coverage" ]; then fi if [ "x$BUILD" = "xmake_dos" ]; then - wget ftp://ftp.openwatcom.org/pub/open-watcom-c-linux-1.9 -O /tmp/watcom.zip + wget ftp://ftp.openwatcom.org/install/open-watcom-c-linux-1.9 -O /tmp/watcom.zip mkdir -p watcom && unzip -aqd watcom /tmp/watcom.zip && chmod -R +x watcom/binl export PATH=$PATH:$PWD/watcom/binl export WATCOM=$PWD/watcom From af6b8b0eaef51b070d81aaeeee730f7f7026f661 Mon Sep 17 00:00:00 2001 From: Daniel Gullberg Date: Wed, 9 Nov 2016 16:08:46 +0100 Subject: [PATCH 0077/1093] Adding CppUTestExt.ewp which is just a copy of CppUTest.ewp with a changed output file name --- platforms/iar/CppUTestExt.ewp | 1994 +++++++++++++++++++++++++++++++++ 1 file changed, 1994 insertions(+) create mode 100644 platforms/iar/CppUTestExt.ewp diff --git a/platforms/iar/CppUTestExt.ewp b/platforms/iar/CppUTestExt.ewp new file mode 100644 index 000000000..144707eb2 --- /dev/null +++ b/platforms/iar/CppUTestExt.ewp @@ -0,0 +1,1994 @@ + + + + 2 + + Debug + + ARM + + 1 + + General + 3 + + 24 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 17 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 24 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 17 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + src + + CppUTestExt + + $PROJ_DIR$\..\..\src\CppUTest\CommandLineArguments.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\CommandLineTestRunner.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\JUnitTestOutput.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\MemoryLeakDetector.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\MemoryLeakWarningPlugin.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\SimpleMutex.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\SimpleString.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\TeamCityTestOutput.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\TestFailure.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\TestFilter.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\TestHarness_c.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\TestMemoryAllocator.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\TestOutput.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\TestPlugin.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\TestRegistry.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\TestResult.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\TestTestingFixture.cpp + + + $PROJ_DIR$\..\..\src\CppUTest\Utest.cpp + + + + Platforms + + Iar + + $PROJ_DIR$\..\..\src\Platforms\Iar\UtestPlatform.cpp + + + + + + + From 14a1274c6bc31894ad0b48114c374b20e4af6584 Mon Sep 17 00:00:00 2001 From: Daniel Gullberg Date: Fri, 11 Nov 2016 08:28:18 +0100 Subject: [PATCH 0078/1093] Adding the test for CppUTestExt, CppUTestExtTest.ewp which is just a copy of CppUTestTest.ewp with a changed output file name --- platforms/iar/CppUTestExtTest.ewp | 2027 +++++++++++++++++++++++++++++ 1 file changed, 2027 insertions(+) create mode 100644 platforms/iar/CppUTestExtTest.ewp diff --git a/platforms/iar/CppUTestExtTest.ewp b/platforms/iar/CppUTestExtTest.ewp new file mode 100644 index 000000000..140d1c0f3 --- /dev/null +++ b/platforms/iar/CppUTestExtTest.ewp @@ -0,0 +1,2027 @@ + + + + 2 + + Debug + + ARM + + 1 + + General + 3 + + 24 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 17 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 24 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 17 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + tests + + failing + + + passing + + $PROJ_DIR$\..\..\tests\AllocationInCFile.c + + + $PROJ_DIR$\..\..\tests\AllocationInCppFile.cpp + + + $PROJ_DIR$\..\..\tests\AllocLetTestFree.c + + + $PROJ_DIR$\..\..\tests\AllocLetTestFreeTest.cpp + + + $PROJ_DIR$\..\..\tests\CheatSheetTest.cpp + + + $PROJ_DIR$\..\..\tests\CommandLineArgumentsTest.cpp + + + $PROJ_DIR$\..\..\tests\CommandLineTestRunnerTest.cpp + + + $PROJ_DIR$\..\..\tests\JUnitOutputTest.cpp + + + $PROJ_DIR$\..\..\tests\MemoryLeakDetectorTest.cpp + + + $PROJ_DIR$\..\..\tests\MemoryLeakWarningTest.cpp + + + $PROJ_DIR$\..\..\tests\MemoryOperatorOverloadTest.cpp + + + $PROJ_DIR$\..\..\tests\PluginTest.cpp + + + $PROJ_DIR$\..\..\tests\PreprocessorTest.cpp + + + $PROJ_DIR$\..\..\tests\SetPluginTest.cpp + + + $PROJ_DIR$\..\..\tests\SimpleMutexTest.cpp + + + $PROJ_DIR$\..\..\tests\SimpleStringTest.cpp + + + $PROJ_DIR$\..\..\tests\TestFailureNaNTest.cpp + + + $PROJ_DIR$\..\..\tests\TestFailureTest.cpp + + + $PROJ_DIR$\..\..\tests\TestFilterTest.cpp + + + $PROJ_DIR$\..\..\tests\TestHarness_cTest.cpp + + + $PROJ_DIR$\..\..\tests\TestHarness_cTestCFile.c + + + $PROJ_DIR$\..\..\tests\TestInstallerTest.cpp + + + $PROJ_DIR$\..\..\tests\TestMemoryAllocatorTest.cpp + + + $PROJ_DIR$\..\..\tests\TestOutputTest.cpp + + + $PROJ_DIR$\..\..\tests\TestRegistryTest.cpp + + + $PROJ_DIR$\..\..\tests\TestResultTest.cpp + + + $PROJ_DIR$\..\..\tests\TestUTestMacro.cpp + + + $PROJ_DIR$\..\..\tests\UtestPlatformTest.cpp + + + $PROJ_DIR$\..\..\tests\UtestTest.cpp + + + + warnings + + + $PROJ_DIR$\tests\AllTests.cpp + + + + + From 9416d2f371c574d8ddae22edc9679ee52b2e5b57 Mon Sep 17 00:00:00 2001 From: Daniel Gullberg Date: Fri, 11 Nov 2016 08:39:26 +0100 Subject: [PATCH 0079/1093] Adding CppUTestExt.ewp and CppUTestExtTest.ewp to the workspace Also adding an AllTests.cpp that will be special for the IAR environment. Right now it is just a copy of the original AllTests.cpp (Could this be solved by some #ifdefs instead in the original file?) --- platforms/iar/CppUTest.eww | 6 ++ platforms/iar/CppUTestExt.ewp | 40 +++++-------- platforms/iar/CppUTestExtTest.ewp | 63 ++++++++++---------- platforms/iar/tests/CppUTestExt/AllTests.cpp | 61 +++++++++++++++++++ 4 files changed, 114 insertions(+), 56 deletions(-) create mode 100644 platforms/iar/tests/CppUTestExt/AllTests.cpp diff --git a/platforms/iar/CppUTest.eww b/platforms/iar/CppUTest.eww index 2a0cec9a0..004925c23 100644 --- a/platforms/iar/CppUTest.eww +++ b/platforms/iar/CppUTest.eww @@ -4,6 +4,12 @@ $WS_DIR$\CppUTest.ewp + + $WS_DIR$\CppUTestExt.ewp + + + $WS_DIR$\CppUTestExtTest.ewp + $WS_DIR$\CppUTestTest.ewp diff --git a/platforms/iar/CppUTestExt.ewp b/platforms/iar/CppUTestExt.ewp index 144707eb2..6db632015 100644 --- a/platforms/iar/CppUTestExt.ewp +++ b/platforms/iar/CppUTestExt.ewp @@ -1925,58 +1925,46 @@ CppUTestExt - $PROJ_DIR$\..\..\src\CppUTest\CommandLineArguments.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\CodeMemoryReportFormatter.cpp - $PROJ_DIR$\..\..\src\CppUTest\CommandLineTestRunner.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\IEEE754ExceptionsPlugin.cpp - $PROJ_DIR$\..\..\src\CppUTest\JUnitTestOutput.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\MemoryReportAllocator.cpp - $PROJ_DIR$\..\..\src\CppUTest\MemoryLeakDetector.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\MemoryReporterPlugin.cpp - $PROJ_DIR$\..\..\src\CppUTest\MemoryLeakWarningPlugin.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\MemoryReportFormatter.cpp - $PROJ_DIR$\..\..\src\CppUTest\SimpleMutex.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\MockActualCall.cpp - $PROJ_DIR$\..\..\src\CppUTest\SimpleString.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\MockExpectedCall.cpp - $PROJ_DIR$\..\..\src\CppUTest\TeamCityTestOutput.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\MockExpectedCallsList.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestFailure.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\MockFailure.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestFilter.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\MockNamedValue.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestHarness_c.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\MockSupport.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestMemoryAllocator.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\MockSupport_c.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestOutput.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\MockSupportPlugin.cpp - $PROJ_DIR$\..\..\src\CppUTest\TestPlugin.cpp - - - $PROJ_DIR$\..\..\src\CppUTest\TestRegistry.cpp - - - $PROJ_DIR$\..\..\src\CppUTest\TestResult.cpp - - - $PROJ_DIR$\..\..\src\CppUTest\TestTestingFixture.cpp - - - $PROJ_DIR$\..\..\src\CppUTest\Utest.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\OrderedTest.cpp diff --git a/platforms/iar/CppUTestExtTest.ewp b/platforms/iar/CppUTestExtTest.ewp index 140d1c0f3..8d3aeaa3b 100644 --- a/platforms/iar/CppUTestExtTest.ewp +++ b/platforms/iar/CppUTestExtTest.ewp @@ -1928,98 +1928,101 @@ passing - $PROJ_DIR$\..\..\tests\AllocationInCFile.c + $PROJ_DIR$\..\..\tests\CppUTestExt\CodeMemoryReporterTest.cpp - $PROJ_DIR$\..\..\tests\AllocationInCppFile.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\ExpectedFunctionsListTest.cpp - $PROJ_DIR$\..\..\tests\AllocLetTestFree.c + $PROJ_DIR$\..\..\tests\CppUTestExt\GMockTest.cpp - $PROJ_DIR$\..\..\tests\AllocLetTestFreeTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\GTest1Test.cpp - $PROJ_DIR$\..\..\tests\CheatSheetTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\GTest2ConvertorTest.cpp - $PROJ_DIR$\..\..\tests\CommandLineArgumentsTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\IEEE754PluginTest.cpp - $PROJ_DIR$\..\..\tests\CommandLineTestRunnerTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\IEEE754PluginTest_c.c - $PROJ_DIR$\..\..\tests\JUnitOutputTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\IEEE754PluginTest_c.h - $PROJ_DIR$\..\..\tests\MemoryLeakDetectorTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MemoryReportAllocatorTest.cpp - $PROJ_DIR$\..\..\tests\MemoryLeakWarningTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MemoryReporterPluginTest.cpp - $PROJ_DIR$\..\..\tests\MemoryOperatorOverloadTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MemoryReportFormatterTest.cpp - $PROJ_DIR$\..\..\tests\PluginTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockActualCallTest.cpp - $PROJ_DIR$\..\..\tests\PreprocessorTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockCallTest.cpp - $PROJ_DIR$\..\..\tests\SetPluginTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockCheatSheetTest.cpp - $PROJ_DIR$\..\..\tests\SimpleMutexTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockComparatorCopierTest.cpp - $PROJ_DIR$\..\..\tests\SimpleStringTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockExpectedCallTest.cpp - $PROJ_DIR$\..\..\tests\TestFailureNaNTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockFailureReporterForTest.cpp - $PROJ_DIR$\..\..\tests\TestFailureTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockFailureReporterForTest.h - $PROJ_DIR$\..\..\tests\TestFilterTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockFailureTest.cpp - $PROJ_DIR$\..\..\tests\TestHarness_cTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockHierarchyTest.cpp - $PROJ_DIR$\..\..\tests\TestHarness_cTestCFile.c + $PROJ_DIR$\..\..\tests\CppUTestExt\MockNamedValueTest.cpp - $PROJ_DIR$\..\..\tests\TestInstallerTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockParameterTest.cpp - $PROJ_DIR$\..\..\tests\TestMemoryAllocatorTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockPluginTest.cpp - $PROJ_DIR$\..\..\tests\TestOutputTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockReturnValueTest.cpp - $PROJ_DIR$\..\..\tests\TestRegistryTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockStrictOrderTest.cpp - $PROJ_DIR$\..\..\tests\TestResultTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockSupport_cTest.cpp - $PROJ_DIR$\..\..\tests\TestUTestMacro.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockSupport_cTestCFile.c - $PROJ_DIR$\..\..\tests\UtestPlatformTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockSupport_cTestCFile.h - $PROJ_DIR$\..\..\tests\UtestTest.cpp + $PROJ_DIR$\..\..\tests\CppUTestExt\MockSupportTest.cpp + + + $PROJ_DIR$\..\..\tests\CppUTestExt\OrderedTestTest.cpp warnings - $PROJ_DIR$\tests\AllTests.cpp + $PROJ_DIR$\tests\CppUTestExt\AllTests.cpp diff --git a/platforms/iar/tests/CppUTestExt/AllTests.cpp b/platforms/iar/tests/CppUTestExt/AllTests.cpp new file mode 100644 index 000000000..5ca0bf79f --- /dev/null +++ b/platforms/iar/tests/CppUTestExt/AllTests.cpp @@ -0,0 +1,61 @@ +/* + * 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 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 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/CommandLineTestRunner.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MemoryReporterPlugin.h" +#include "CppUTestExt/MockSupportPlugin.h" + +#ifdef CPPUTEST_INCLUDE_GTEST_TESTS +#include "CppUTestExt/GTestConvertor.h" +#endif + +int main(int ac, const char** av) +{ +#ifdef CPPUTEST_INCLUDE_GTEST_TESTS + GTestConvertor convertor; + convertor.addAllGTestToTestRegistry(); +#endif + + MemoryReporterPlugin plugin; + MockSupportPlugin mockPlugin; + TestRegistry::getCurrentRegistry()->installPlugin(&plugin); + TestRegistry::getCurrentRegistry()->installPlugin(&mockPlugin); + +#ifndef GMOCK_RENAME_MAIN + return CommandLineTestRunner::RunAllTests(ac, av); +#else + /* Don't have any memory leak detector when running the Google Test tests */ + + testing::GMOCK_FLAG(verbose) = testing::internal::kWarningVerbosity; + + ConsoleTestOutput output; + CommandLineTestRunner runner(ac, av, &output, TestRegistry::getCurrentRegistry()); + return runner.runAllTestsMain(); +#endif +} + From 6cd5a250a8bb232843df848b31afb128c37bd6de Mon Sep 17 00:00:00 2001 From: Daniel Gullberg Date: Fri, 11 Nov 2016 08:54:10 +0100 Subject: [PATCH 0080/1093] Added missing library to the CppUTestExtTest Also tweaking the simulated flash memory by changing __ICFEDIT_region_IROM1_end__ from 0x0008FFFF to 0x0009FFFF (added a separate icf file for this) --- platforms/iar/CppUTestExtTest.ewp | 7 +-- platforms/iar/CppUTestExtTest.icf | 72 +++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 platforms/iar/CppUTestExtTest.icf diff --git a/platforms/iar/CppUTestExtTest.ewp b/platforms/iar/CppUTestExtTest.ewp index 8d3aeaa3b..6e405c108 100644 --- a/platforms/iar/CppUTestExtTest.ewp +++ b/platforms/iar/CppUTestExtTest.ewp @@ -128,7 +128,7 @@ "); } @@ -259,8 +260,9 @@ void JUnitTestOutput::printBuffer(const char*) { } -void JUnitTestOutput::print(const char*) +void JUnitTestOutput::print(const char *output) { + impl_->stdOutput_ += output; } void JUnitTestOutput::print(long) diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index d9f72e344..1bb81519a 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -301,6 +301,13 @@ class JUnitTestOutputTestRunner theTime = newTime; return *this; } + + JUnitTestOutputTestRunner& thatPrints(const char* output) + { + runPreviousTest(); + result_.print(output); + return *this; + } }; extern "C" { @@ -707,3 +714,13 @@ TEST(JUnitOutputTest, MultipleTestCasesInDifferentGroupsWithAssertions) STRCMP_EQUAL("\n", outputFile->line(5)); } +TEST(JUnitOutputTest, UTPRINTOutputInJUnitOutput) +{ + testCaseRunner->start() + .withGroup("groupname") + .withTest("testname").thatPrints("someoutput") + .end(); + + outputFile = fileSystem.file("cpputest_groupname.xml"); + STRCMP_EQUAL("someoutput\n", outputFile->lineFromTheBack(3)); +} From 922d11f4bd92c57ea34a3af072c992b7dbc5f200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Lindel=C3=B6f?= Date: Tue, 30 May 2017 22:49:20 +0200 Subject: [PATCH 0122/1093] define CHECK_RELATION() macro --- include/CppUTest/UtestMacros.h | 8 ++++++++ tests/CppUTest/TestUTestMacro.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index fa8910f87..15607773c 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -142,6 +142,14 @@ UtestShell::getCurrent()->assertLongsEqual((long)0, (long)0, NULL, file, line); \ } } +#define CHECK_RELATION(first, relop, second)\ + { SimpleString conditionString = "evaluates to ";\ + conditionString += StringFrom(first); conditionString += " ";\ + conditionString += #relop; conditionString += " ";\ + conditionString += StringFrom(second);\ + CHECK_TRUE_LOCATION((first) relop (second), "CHECK", #first " " #relop " " #second, conditionString.asCharString(), __FILE__, __LINE__)\ + } + //This check checks for char* string equality using strcmp. //This makes up for the fact that CHECK_EQUAL only compares the pointers to char*'s #define STRCMP_EQUAL(expected, actual)\ diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index 8fac3f196..ad7d0ce05 100755 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -394,6 +394,31 @@ TEST(UnitTestMacros, FailureWithCHECK_EQUAL) CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <2>"); } +static void _failingTestMethodWithCHECK_RELATION() +{ + double actual = 0.5, minimum = 0.8; + CHECK_RELATION(actual, >=, minimum); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, FailureWithCHECK_RELATION) +{ + fixture.runTestWithMethod(_failingTestMethodWithCHECK_RELATION); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK(actual >= minimum)"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("0.5 >= 0.8"); +} + +TEST(UnitTestMacros, CHECK_RELATIONBehavesAsProperMacro) +{ + if (false) CHECK_RELATION(1, >, 2) + else CHECK_RELATION(1, <, 2) +} + +IGNORE_TEST(UnitTestMacros, CHECK_RELATIONWorksInAnIgnoredTest) +{ + CHECK_RELATION(1, >, 2) // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + static int countInCountingMethod; static int _countingMethod() { From 0fbbe4a5511a7e8f564cd960edfa37e8c0bf3e59 Mon Sep 17 00:00:00 2001 From: Daniel Gullberg Date: Wed, 31 May 2017 10:21:18 +0200 Subject: [PATCH 0123/1093] Moving the test source files to fix error introduced with 02513e803535 (pull request #1059) There is a problem with dependencies: "AllTests.o" will be different between CppUTestTest and CppUTestExtTest, which is not handled correctly in IAR Embedded Workbench 7.70.1. A full rebuild is needed when trying to run the tests, as the last built AllTests.o is used when linking regardless of which project it was built for. Interestingly enough, this problem only occurs within Embedded Workbench. When running the scripted tests from within platforms\iar\settings there are no problems. (If the scripts are missing, try to open each test project from within Embedded Workbench, then they should be created) --- platforms/iar/CppUTestTest.ewp | 58 +++++++++++++++++----------------- platforms/iar/CppUTestTest.icf | 2 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/platforms/iar/CppUTestTest.ewp b/platforms/iar/CppUTestTest.ewp index aba2202a6..76c7e212b 100644 --- a/platforms/iar/CppUTestTest.ewp +++ b/platforms/iar/CppUTestTest.ewp @@ -1928,91 +1928,91 @@ passing - $PROJ_DIR$\..\..\tests\AllocationInCFile.c + $PROJ_DIR$\..\..\tests\CppUTest\AllocationInCFile.c - $PROJ_DIR$\..\..\tests\AllocationInCppFile.cpp + $PROJ_DIR$\..\..\tests\CppUTest\AllocationInCppFile.cpp - $PROJ_DIR$\..\..\tests\AllocLetTestFree.c + $PROJ_DIR$\..\..\tests\CppUTest\AllocLetTestFree.c - $PROJ_DIR$\..\..\tests\AllocLetTestFreeTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\AllocLetTestFreeTest.cpp - $PROJ_DIR$\..\..\tests\CheatSheetTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\CheatSheetTest.cpp - $PROJ_DIR$\..\..\tests\CommandLineArgumentsTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\CommandLineArgumentsTest.cpp - $PROJ_DIR$\..\..\tests\CommandLineTestRunnerTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\CommandLineTestRunnerTest.cpp - $PROJ_DIR$\..\..\tests\JUnitOutputTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\JUnitOutputTest.cpp - $PROJ_DIR$\..\..\tests\MemoryLeakDetectorTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\MemoryLeakDetectorTest.cpp - $PROJ_DIR$\..\..\tests\MemoryLeakWarningTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\MemoryLeakWarningTest.cpp - $PROJ_DIR$\..\..\tests\MemoryOperatorOverloadTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\MemoryOperatorOverloadTest.cpp - $PROJ_DIR$\..\..\tests\PluginTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\PluginTest.cpp - $PROJ_DIR$\..\..\tests\PreprocessorTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\PreprocessorTest.cpp - $PROJ_DIR$\..\..\tests\SetPluginTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\SetPluginTest.cpp - $PROJ_DIR$\..\..\tests\SimpleMutexTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\SimpleMutexTest.cpp - $PROJ_DIR$\..\..\tests\SimpleStringTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\SimpleStringTest.cpp - $PROJ_DIR$\..\..\tests\TestFailureNaNTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\TestFailureNaNTest.cpp - $PROJ_DIR$\..\..\tests\TestFailureTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\TestFailureTest.cpp - $PROJ_DIR$\..\..\tests\TestFilterTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\TestFilterTest.cpp - $PROJ_DIR$\..\..\tests\TestHarness_cTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\TestHarness_cTest.cpp - $PROJ_DIR$\..\..\tests\TestHarness_cTestCFile.c + $PROJ_DIR$\..\..\tests\CppUTest\TestHarness_cTestCFile.c - $PROJ_DIR$\..\..\tests\TestInstallerTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\TestInstallerTest.cpp - $PROJ_DIR$\..\..\tests\TestMemoryAllocatorTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\TestMemoryAllocatorTest.cpp - $PROJ_DIR$\..\..\tests\TestOutputTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\TestOutputTest.cpp - $PROJ_DIR$\..\..\tests\TestRegistryTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\TestRegistryTest.cpp - $PROJ_DIR$\..\..\tests\TestResultTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\TestResultTest.cpp - $PROJ_DIR$\..\..\tests\TestUTestMacro.cpp + $PROJ_DIR$\..\..\tests\CppUTest\TestUTestMacro.cpp - $PROJ_DIR$\..\..\tests\UtestPlatformTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\UtestPlatformTest.cpp - $PROJ_DIR$\..\..\tests\UtestTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\UtestTest.cpp diff --git a/platforms/iar/CppUTestTest.icf b/platforms/iar/CppUTestTest.icf index 05a0ab0ec..2d0a73bfd 100644 --- a/platforms/iar/CppUTestTest.icf +++ b/platforms/iar/CppUTestTest.icf @@ -5,7 +5,7 @@ define symbol __ICFEDIT_intvec_start__ = 0x00000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_IROM1_start__ = 0x00000080; -define symbol __ICFEDIT_region_IROM1_end__ = 0x0008FFFF; +define symbol __ICFEDIT_region_IROM1_end__ = 0x0009FFFF; define symbol __ICFEDIT_region_IROM2_start__ = 0x0; define symbol __ICFEDIT_region_IROM2_end__ = 0x0; define symbol __ICFEDIT_region_EROM1_start__ = 0x0; From 13fd3d627391f2154bad2bfa13fb1f073e7ab5b5 Mon Sep 17 00:00:00 2001 From: Daniel Gullberg Date: Wed, 31 May 2017 15:34:36 +0200 Subject: [PATCH 0124/1093] Adding missing tests to IAR project --- platforms/iar/CppUTestTest.ewp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/platforms/iar/CppUTestTest.ewp b/platforms/iar/CppUTestTest.ewp index 76c7e212b..7e060041f 100644 --- a/platforms/iar/CppUTestTest.ewp +++ b/platforms/iar/CppUTestTest.ewp @@ -1975,6 +1975,9 @@ $PROJ_DIR$\..\..\tests\CppUTest\SimpleStringTest.cpp + + $PROJ_DIR$\..\..\tests\CppUTest\TeamCityOutputTest.cpp + $PROJ_DIR$\..\..\tests\CppUTest\TestFailureNaNTest.cpp @@ -2008,6 +2011,9 @@ $PROJ_DIR$\..\..\tests\CppUTest\TestUTestMacro.cpp + + $PROJ_DIR$\..\..\tests\CppUTest\TestUTestStringMacro.cpp + $PROJ_DIR$\..\..\tests\CppUTest\UtestPlatformTest.cpp From 4324e1b33458412cb154ed39841a94427b225da5 Mon Sep 17 00:00:00 2001 From: Rohit Grover Date: Sun, 18 Jun 2017 10:29:34 +1200 Subject: [PATCH 0125/1093] fix for #1102 --- src/CppUTest/CMakeIntegration-README.md | 24 ++++++++++++++++++++++++ src/CppUTest/CMakeLists.txt | 18 +++++++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 src/CppUTest/CMakeIntegration-README.md diff --git a/src/CppUTest/CMakeIntegration-README.md b/src/CppUTest/CMakeIntegration-README.md new file mode 100644 index 000000000..d39bcced8 --- /dev/null +++ b/src/CppUTest/CMakeIntegration-README.md @@ -0,0 +1,24 @@ +It is possible to integrate CppUTest as a sub-module of an enclosing CMake +project. This may be useful if CppUTest is being built for a target platform +other than that of the development host. The following is an example how an +external project can refer to this CMakeLists.txt to build CppUTest as a +library and include it as a target dependency. + +```cmake +cmake_minimum_required(VERSION 3.7) +project(trying_CppUtest) + +SET(CppUTestRootDirectory /path/to/cpputest) + +# Either set CPP_PLATFORM to one of the provided platforms under +# ${CppUTestRootDirectory}/src/Platforms/, or provide a project-specific +# platform.cpp (as shown below) +add_subdirectory(${CppUTestRootDirectory}/src/CppUTest CppUTest) +target_sources(CppUTest + PRIVATE + ${PROJECT_SOURCE_DIR}/UtestPlatform.cpp +) + +add_executable(trying_CppUtest main.cpp) +target_link_libraries(trying_CppUtest CppUTest) +``` diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 736777f5e..97ca97251 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -1,4 +1,4 @@ -set(CppUTest_src +add_library(CppUTest CommandLineArguments.cpp MemoryLeakWarningPlugin.cpp TestHarness_c.cpp @@ -17,7 +17,20 @@ set(CppUTest_src TestTestingFixture.cpp SimpleMutex.cpp Utest.cpp - ../Platforms/${CPP_PLATFORM}/UtestPlatform.cpp +) + +if (CPP_PLATFORM) #[[Set CPP_PLATFORM in a parent CMakeLists.txt if reusing one of the provided platforms, + else supply the missing definitions]] + target_sources(CppUTest + PRIVATE + ../Platforms/${CPP_PLATFORM}/UtestPlatform.cpp + ) +endif(CPP_PLATFORM) + +#[[Arrange for ../../include to be added to the include paths of any CMake target depending on CppUTest.]] +target_include_directories(CppUTest + PUBLIC + ../../include ) set(CppUTest_headers @@ -48,7 +61,6 @@ set(CppUTest_headers ${CppUTestRootDirectory}/include/CppUTest/UtestMacros.h ) -add_library(CppUTest STATIC ${CppUTest_src} ${CppUTest_headers}) if (WIN32) target_link_libraries(CppUTest winmm.lib) endif (WIN32) From 944a6ca846035fc0e5a1680bb1082a6c0160f4c4 Mon Sep 17 00:00:00 2001 From: Rohit Grover Date: Sun, 18 Jun 2017 15:37:16 +1200 Subject: [PATCH 0126/1093] fix expression for target_include_directories to also work with install directories --- src/CppUTest/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 97ca97251..27bb2d108 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -27,10 +27,11 @@ if (CPP_PLATFORM) #[[Set CPP_PLATFORM in a parent CMakeLists.txt if reusing one ) endif(CPP_PLATFORM) -#[[Arrange for ../../include to be added to the include paths of any CMake target depending on CppUTest.]] +#[[Arrange for the include directory to be added to the include paths of any CMake target depending on CppUTest.]] target_include_directories(CppUTest PUBLIC - ../../include + $ + $ ) set(CppUTest_headers From 973e0705b67b17c7957e67c184287bcf6691302d Mon Sep 17 00:00:00 2001 From: Tyler Smith Date: Thu, 6 Jul 2017 14:13:27 -0600 Subject: [PATCH 0127/1093] Reset dotCount_ when printTestsEnded is called to align progress indicators for repeat runs If you run a test set with "-r#", the progress indicator dots don't line up from one run to another. It makes it difficult to look for differences when the output is different every time even though the tests run the same. --- src/CppUTest/TestOutput.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index 113884ea7..eccabd075 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -170,6 +170,8 @@ void TestOutput::printTestsEnded(const TestResult& result) print("\033[m"); } print("\n\n"); + + dotCount_ = 0; } void TestOutput::printTestRun(int number, int total) From 73c970973b05ab3b196b32d82efa6651e2b34a50 Mon Sep 17 00:00:00 2001 From: Tyler Smith Date: Fri, 7 Jul 2017 06:50:27 -0600 Subject: [PATCH 0128/1093] Adding test for repeat run indicator alignment --- tests/CppUTest/TestOutputTest.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/CppUTest/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp index 5a9786c47..564d87784 100644 --- a/tests/CppUTest/TestOutputTest.cpp +++ b/tests/CppUTest/TestOutputTest.cpp @@ -117,6 +117,22 @@ TEST(TestOutput, PrintTestALot) STRCMP_EQUAL("..................................................\n..........", mock->getOutput().asCharString()); } +TEST(TestOutput, PrintTestALotAndSimulateRepeatRun) +{ + for (int i = 0; i < 60; ++i) { + printer->printCurrentTestEnded(*result); + } + + printer->printTestsEnded(*result); + + for (int i = 0; i < 60; ++i) { + printer->printCurrentTestEnded(*result); + } + STRCMP_EQUAL("..................................................\n.........." \ + "\nOK (0 tests, 0 ran, 0 checks, 0 ignored, 0 filtered out, 10 ms)\n\n" \ + "..................................................\n..........", mock->getOutput().asCharString()); +} + TEST(TestOutput, SetProgressIndicator) { printer->setProgressIndicator("."); From 8f844808c8b763c542a063009c45316467ad0090 Mon Sep 17 00:00:00 2001 From: Tyler Smith Date: Fri, 7 Jul 2017 15:45:17 -0600 Subject: [PATCH 0129/1093] Create an equivalent IGNORE macro for C-only code --- include/CppUTest/TestHarness_c.h | 10 ++++++++++ tests/CppUTest/TestHarness_cTest.cpp | 1 + tests/CppUTest/TestHarness_cTestCFile.c | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index e5037bddc..4b0fdf8d7 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -107,6 +107,10 @@ extern void test_##group_name##_##test_name##_wrapper_c(void);\ void test_##group_name##_##test_name##_wrapper_c() +#define IGNORE_TEST_C(group_name, test_name) \ + extern void ignore_##group_name##_##test_name##_wrapper_c(void);\ + void ignore_##group_name##_##test_name##_wrapper_c() + /* For use in C++ file */ @@ -131,6 +135,12 @@ test_##group_name##_##test_name##_wrapper_c(); \ } +#define IGNORE_TEST_C_WRAPPER(group_name, test_name) \ + extern "C" void ignore_##group_name##_##test_name##_wrapper_c(); \ + IGNORE_TEST(group_name, test_name) { \ + ignore_##group_name##_##test_name##_wrapper_c(); \ + } + #ifdef __cplusplus extern "C" { diff --git a/tests/CppUTest/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp index 53daf3c9e..b72567662 100644 --- a/tests/CppUTest/TestHarness_cTest.cpp +++ b/tests/CppUTest/TestHarness_cTest.cpp @@ -46,6 +46,7 @@ TEST_GROUP_C_WRAPPER(TestGroupInC) }; TEST_C_WRAPPER(TestGroupInC, checkThatTheTestHasRun) +IGNORE_TEST_C_WRAPPER(TestGroupInC, ignoreMacroForCFile) /* * This test is a bit strange. They use the fact that you can do -r2 for repeating the same run. diff --git a/tests/CppUTest/TestHarness_cTestCFile.c b/tests/CppUTest/TestHarness_cTestCFile.c index efcd37046..bfc7d767f 100644 --- a/tests/CppUTest/TestHarness_cTestCFile.c +++ b/tests/CppUTest/TestHarness_cTestCFile.c @@ -29,3 +29,8 @@ TEST_C(TestGroupInC, checkThatTheTestHasRun) { test_was_called_in_test_group_in_C++; } + +IGNORE_TEST_C(TestGroupInC, ignoreMacroForCFile) +{ + test_was_called_in_test_group_in_C++; +} From 867ea44260ec4cabec2e0b55b9426bb15ace6169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Lindel=C3=B6f?= Date: Wed, 26 Jul 2017 07:04:53 +0200 Subject: [PATCH 0130/1093] apply reviewer comments - rename to CHECK_COMPARE - handle failure in ComparisonFailure subclass --- include/CppUTest/TestFailure.h | 7 ++++++- include/CppUTest/Utest.h | 1 + include/CppUTest/UtestMacros.h | 6 +++--- src/CppUTest/TestFailure.cpp | 12 +++++++++++- src/CppUTest/Utest.cpp | 6 ++++++ tests/CppUTest/TestUTestMacro.cpp | 21 ++++++++++----------- 6 files changed, 37 insertions(+), 16 deletions(-) diff --git a/include/CppUTest/TestFailure.h b/include/CppUTest/TestFailure.h index f13714f51..77dcd1463 100644 --- a/include/CppUTest/TestFailure.h +++ b/include/CppUTest/TestFailure.h @@ -104,11 +104,16 @@ class CheckEqualFailure : public TestFailure CheckEqualFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text); }; +class ComparisonFailure : public TestFailure +{ +public: + ComparisonFailure(UtestShell* test, const char *fileName, int lineNumber, const SimpleString& checkString, const SimpleString& comparisonString, const SimpleString& text); +}; + class ContainsFailure: public TestFailure { public: ContainsFailure(UtestShell*, const char* fileName, int lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text); - }; class CheckFailure : public TestFailure diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 7bb560fd9..1c711047d 100755 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -122,6 +122,7 @@ class UtestShell virtual void assertEquals(bool failed, const char* expected, const char* actual, const char* text, const char* file, int line, const TestTerminator& testTerminator = NormalTestTerminator()); virtual void assertBinaryEqual(const void *expected, const void *actual, size_t length, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); virtual void assertBitsEqual(unsigned long expected, unsigned long actual, unsigned long mask, size_t byteCount, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertCompare(bool comparison, const char *checkString, const char *comparisonString, const char *text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); virtual void fail(const char *text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); virtual void exitTest(const TestTerminator& testTerminator = NormalTestTerminator()); diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 15607773c..fb6e9d897 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -142,12 +142,12 @@ UtestShell::getCurrent()->assertLongsEqual((long)0, (long)0, NULL, file, line); \ } } -#define CHECK_RELATION(first, relop, second)\ - { SimpleString conditionString = "evaluates to ";\ +#define CHECK_COMPARE(first, relop, second)\ + { SimpleString conditionString;\ conditionString += StringFrom(first); conditionString += " ";\ conditionString += #relop; conditionString += " ";\ conditionString += StringFrom(second);\ - CHECK_TRUE_LOCATION((first) relop (second), "CHECK", #first " " #relop " " #second, conditionString.asCharString(), __FILE__, __LINE__)\ + UtestShell::getCurrent()->assertCompare((first) relop (second), "CHECK_COMPARE", conditionString.asCharString(), NULL, __FILE__, __LINE__);\ } //This check checks for char* string equality using strcmp. diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index 1a4b58406..a3e615de8 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -163,7 +163,7 @@ SimpleString TestFailure::createUserText(const SimpleString& text) if (!text.isEmpty()) { //This is a kludge to turn off "Message: " for this case. - //I don't think "Message: " adds anything,a s you get to see the + //I don't think "Message: " adds anything, as you get to see the //message. I propose we remove "Message: " lead in if (!text.startsWith("LONGS_EQUAL")) userMessage += "Message: "; @@ -216,6 +216,16 @@ CheckEqualFailure::CheckEqualFailure(UtestShell* test, const char* fileName, int } +ComparisonFailure::ComparisonFailure(UtestShell *test, const char *fileName, int lineNumber, const SimpleString& checkString, const SimpleString &comparisonString, const SimpleString &text) +: TestFailure(test, fileName, lineNumber) +{ + message_ = createUserText(text); + message_ += checkString; + message_ += "("; + message_ += comparisonString; + message_ += ") failed"; +} + ContainsFailure::ContainsFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 14a025182..0970de47d 100755 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -507,6 +507,12 @@ void UtestShell::assertEquals(bool failed, const char* expected, const char* act failWith(CheckEqualFailure(this, file, line, expected, actual, text), testTerminator); } +void UtestShell::assertCompare(bool comparison, const char *checkString, const char *comparisonString, const char *text, const char *fileName, int lineNumber, const TestTerminator &testTerminator) +{ + getTestResult()->countCheck(); + if (!comparison) + failWith(ComparisonFailure(this, fileName, lineNumber, checkString, comparisonString, text), testTerminator); +} void UtestShell::print(const char *text, const char* fileName, int lineNumber) { diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index ad7d0ce05..6f76ddbc8 100755 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -394,29 +394,28 @@ TEST(UnitTestMacros, FailureWithCHECK_EQUAL) CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <2>"); } -static void _failingTestMethodWithCHECK_RELATION() +static void _failingTestMethodWithCHECK_COMPARE() { double actual = 0.5, minimum = 0.8; - CHECK_RELATION(actual, >=, minimum); + CHECK_COMPARE(actual, >=, minimum); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -TEST(UnitTestMacros, FailureWithCHECK_RELATION) +TEST(UnitTestMacros, FailureWithCHECK_COMPARE) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_RELATION); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK(actual >= minimum)"); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("0.5 >= 0.8"); + fixture.runTestWithMethod(_failingTestMethodWithCHECK_COMPARE); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK_COMPARE(0.5 >= 0.8)"); } -TEST(UnitTestMacros, CHECK_RELATIONBehavesAsProperMacro) +TEST(UnitTestMacros, CHECK_COMPAREBehavesAsProperMacro) { - if (false) CHECK_RELATION(1, >, 2) - else CHECK_RELATION(1, <, 2) + if (false) CHECK_COMPARE(1, >, 2) + else CHECK_COMPARE(1, <, 2) } -IGNORE_TEST(UnitTestMacros, CHECK_RELATIONWorksInAnIgnoredTest) +IGNORE_TEST(UnitTestMacros, CHECK_COMPAREWorksInAnIgnoredTest) { - CHECK_RELATION(1, >, 2) // LCOV_EXCL_LINE + CHECK_COMPARE(1, >, 2) // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static int countInCountingMethod; From 0dd3496ba4eefa46ce6d61ffefd9d002a991579d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Lindel=C3=B6f?= Date: Wed, 26 Jul 2017 07:28:12 +0200 Subject: [PATCH 0131/1093] provide CHECK_COMPARE_TEXT --- include/CppUTest/UtestMacros.h | 8 +++++++- tests/CppUTest/TestUTestMacro.cpp | 29 +++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index fb6e9d897..8c650420d 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -143,11 +143,17 @@ } } #define CHECK_COMPARE(first, relop, second)\ + CHECK_COMPARE_TEXT(first, relop, second, NULL) + +#define CHECK_COMPARE_TEXT(first, relop, second, text)\ + CHECK_COMPARE_LOCATION(first, relop, second, text, __FILE__, __LINE__) + +#define CHECK_COMPARE_LOCATION(first, relop, second, text, file, line)\ { SimpleString conditionString;\ conditionString += StringFrom(first); conditionString += " ";\ conditionString += #relop; conditionString += " ";\ conditionString += StringFrom(second);\ - UtestShell::getCurrent()->assertCompare((first) relop (second), "CHECK_COMPARE", conditionString.asCharString(), NULL, __FILE__, __LINE__);\ + UtestShell::getCurrent()->assertCompare((first) relop (second), "CHECK_COMPARE", conditionString.asCharString(), text, __FILE__, __LINE__);\ } //This check checks for char* string equality using strcmp. diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index 6f76ddbc8..8a5907a44 100755 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -396,8 +396,8 @@ TEST(UnitTestMacros, FailureWithCHECK_EQUAL) static void _failingTestMethodWithCHECK_COMPARE() { - double actual = 0.5, minimum = 0.8; - CHECK_COMPARE(actual, >=, minimum); + double small = 0.5, big = 0.8; + CHECK_COMPARE(small, >=, big); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE @@ -418,6 +418,31 @@ IGNORE_TEST(UnitTestMacros, CHECK_COMPAREWorksInAnIgnoredTest) CHECK_COMPARE(1, >, 2) // LCOV_EXCL_LINE } // LCOV_EXCL_LINE +static void _failingTestMethodWithCHECK_COMPARE_TEXT() +{ + double small = 0.5, big = 0.8; + CHECK_COMPARE_TEXT(small, >=, big, "small bigger than big"); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, FailureWithCHECK_COMPARE_TEXT) +{ + fixture.runTestWithMethod(_failingTestMethodWithCHECK_COMPARE_TEXT); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK_COMPARE(0.5 >= 0.8)"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("small bigger than big"); +} + +TEST(UnitTestMacros, CHECK_COMPARE_TEXTBehavesAsProperMacro) +{ + if (false) CHECK_COMPARE_TEXT(1, >, 2, "1 bigger than 2") + else CHECK_COMPARE_TEXT(1, <, 2, "1 smaller than 2") +} + +IGNORE_TEST(UnitTestMacros, CHECK_COMPARE_TEXTWorksInAnIgnoredTest) +{ + CHECK_COMPARE_TEXT(1, >, 2, "1 smaller than 2") // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + static int countInCountingMethod; static int _countingMethod() { From 6a06d0ae598a0501f62ba382563fc3c2a3bc3764 Mon Sep 17 00:00:00 2001 From: Karel Coudijzer Date: Fri, 28 Jul 2017 14:52:03 +0200 Subject: [PATCH 0132/1093] Add cmake cross-build support Don't overwrite CPP_PLATFORM so cross-builds compile the right platform dependent file. --- cmake/Modules/CppUTestConfigurationOptions.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 23ded70eb..5272f729a 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -6,7 +6,9 @@ if (MSVC) ADD_DEFINITIONS(-DSTDC_WANT_SECURE_LIB) endif(STDC_WANT_SECURE_LIB) elseif (STD_C) - set(CPP_PLATFORM Gcc) + if(NOT CPP_PLATFORM) + set(CPP_PLATFORM Gcc) + endif(NOT CPP_PLATFORM) else (MSVC) set(STD_CPP False) set(MEMORY_LEAK_DETECTION False) From 503ba5922f7cae041e2fc562bcbf80adaa73d39c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Ma=C5=82ek?= Date: Fri, 4 Aug 2017 23:42:51 +0200 Subject: [PATCH 0133/1093] Fixing cmake_minimum_version to 3.1 as target_sources requires it --- CMakeLists.txt | 3 ++- src/CppUTest/CMakeLists.txt | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bd0e591c3..e7e10b17e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,8 @@ set(CppUTest_version_major 3) set(CppUTest_version_minor 8) # 2.6.3 is needed for ctest support -cmake_minimum_required(VERSION 2.8.7) +# 3.1 is needed for target_sources +cmake_minimum_required(VERSION 3.1) # Check for functions before setting a lot of stuff include(CheckFunctionExists) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 27bb2d108..6c1832940 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -19,8 +19,8 @@ add_library(CppUTest Utest.cpp ) -if (CPP_PLATFORM) #[[Set CPP_PLATFORM in a parent CMakeLists.txt if reusing one of the provided platforms, - else supply the missing definitions]] +#[[Set CPP_PLATFORM in a parent CMakeLists.txt if reusing one of the provided platforms, else supply the missing definitions]] +if (CPP_PLATFORM) target_sources(CppUTest PRIVATE ../Platforms/${CPP_PLATFORM}/UtestPlatform.cpp From e3a8aafefce73541c7dbd8b7909ffc49e787e3c3 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sat, 30 Sep 2017 09:15:47 -0500 Subject: [PATCH 0134/1093] Fixed some VC++ warnings about divide by zero --- tests/CppUTest/UtestTest.cpp | 3 ++- tests/CppUTestExt/IEEE754PluginTest_c.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 64bcbbf6e..14149d324 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -56,9 +56,10 @@ static void _exitTestMethod() FAIL("Should not get here"); } +static volatile double zero = 0.0; + TEST(UtestShell, compareDoubles) { - double zero = 0.0; double not_a_number = zero / zero; double infinity = 1 / zero; CHECK(doubles_equal(1.0, 1.001, 0.01)); diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.c b/tests/CppUTestExt/IEEE754PluginTest_c.c index 45cc782f2..1cce8bde3 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.c +++ b/tests/CppUTestExt/IEEE754PluginTest_c.c @@ -28,11 +28,12 @@ #include "IEEE754PluginTest_c.h" static volatile float f; +static volatile float zero_float = 0.0f; void set_divisionbyzero_c(void) { f = 1.0f; - f /= 0.0f; + f /= zero_float; } void set_overflow_c(void) From 6aa3266c29a0d24cd9f653823d2a744233692a12 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sun, 8 Oct 2017 08:42:36 -0500 Subject: [PATCH 0135/1093] Need previous image to build correctly The upgraded CMake in the new image breaks the build of 32-bit MinGW --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 2b6b413cc..daaa5235e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ version: 3.7.0-ci{build} -image: Visual Studio 2015 +image: Previous Visual Studio 2015 cache: - C:\ProgramData\chocolatey\bin -> appveyor.yml From dd8d91e75a0342837ca734eec2d159aae38ad7af Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 9 Oct 2017 20:27:35 -0500 Subject: [PATCH 0136/1093] Fix a cmake build error when disabling extensions --- CMakeLists.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e7e10b17e..2ce13b383 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,8 +126,13 @@ if(PkgHelpers_AVAILABLE) ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfig.cmake INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} PATH_VARS INCLUDE_DIR CMAKE_CURRENT_BINARY_DIR) - export(TARGETS CppUTest CppUTestExt - FILE "${CMAKE_CURRENT_BINARY_DIR}/CppUTestTargets.cmake") + if (EXTENSIONS) + export(TARGETS CppUTest CppUTestExt + FILE "${CMAKE_CURRENT_BINARY_DIR}/CppUTestTargets.cmake") + else() + export(TARGETS CppUTest + FILE "${CMAKE_CURRENT_BINARY_DIR}/CppUTestTargets.cmake") + endif() write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfigVersion.cmake VERSION ${CppUTest_version_major}.${CppUTest_version_minor} From cd1cf292a2afbfba7609779f96f1dcdfb6ea7189 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 9 Oct 2017 20:29:31 -0500 Subject: [PATCH 0137/1093] Fix the map file flag Not that it actually works, but it's supposed to be uppercase --- cmake/Modules/CppUTestConfigurationOptions.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 5272f729a..939a94b15 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -45,7 +45,7 @@ if (LONGLONG) endif (LONGLONG) if (MAP_FILE AND NOT MSVC) - set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -Wl,-map,$<.map.txt") + set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -Wl,-Map,$<.map.txt") endif (MAP_FILE AND NOT MSVC) if (COVERAGE AND NOT MSVC) From 2fff74e8ffe2a8431ffa3945f536607e4f13029f Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 9 Oct 2017 21:06:16 -0500 Subject: [PATCH 0138/1093] Some cleanup to appveyor install step Fix the argument, don't need to use Out-Null anymore to suppress decompression output --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index daaa5235e..cdc4f9501 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,7 +28,7 @@ environment: PlatformToolset: v140 install: -- ps: if ($env:Platform -like 'MinGW*') { choco install mingw --version $env:PlatformToolset $( if ($env:Platform -like '*32') { Write-Output -forcex86 } ) | Out-Null } +- ps: if ($env:Platform -like 'MinGW*') { choco install mingw --version $env:PlatformToolset $( if ($env:Platform -like '*32') { Write-Output --forcex86 } ) } build_script: - ps: scripts\appveyor_ci_build.ps1 From 6c8524c7d7a539d1cbc3ceeaa9c91929ef0c3fa8 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sat, 14 Oct 2017 08:52:42 -0500 Subject: [PATCH 0139/1093] Minor improvement to test execution on appveyor --- scripts/appveyor_ci_test.ps1 | 10 +++++++--- scripts/appveyor_helpers.ps1 | 10 ++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/scripts/appveyor_ci_test.ps1 b/scripts/appveyor_ci_test.ps1 index 8961b09ee..830542932 100644 --- a/scripts/appveyor_ci_test.ps1 +++ b/scripts/appveyor_ci_test.ps1 @@ -37,8 +37,12 @@ function Invoke-Tests($executable) { # Run tests and output the results using junit $TestCommand = "$executable -ojunit" - Write-Host $TestCommand + Write-Host $TestCommand -NoNewline Invoke-Expression $TestCommand + Write-Host " - return code: $LASTEXITCODE" + if ($LASTEXITCODE -lt 0) { + Write-Error "Runtime Exception during test execution" + } } function Invoke-CygwinTests($executable) @@ -94,10 +98,10 @@ switch -Wildcard ($env:Platform) { $mingw_path = Get-MinGWBin - Add-PathFolder $mingw_path + Set-Path "$mingw_path;C:\Windows;C:\Windows\System32" Invoke-Tests '.\cpputest_build\tests\CppUTest\CppUTestTests.exe' Invoke-Tests '.\cpputest_build\tests\CppUTestExt\CppUTestExtTests.exe' - Remove-PathFolder $mingw_path + Restore-Path } default diff --git a/scripts/appveyor_helpers.ps1 b/scripts/appveyor_helpers.ps1 index 8f6e0dd67..8888815bd 100644 --- a/scripts/appveyor_helpers.ps1 +++ b/scripts/appveyor_helpers.ps1 @@ -74,3 +74,13 @@ function Remove-PathFolder($folder) $env:Path = $pathFolders -join ";" } +function Set-Path($newPath) +{ + $env:RestorePath = $env:Path + $env:Path = $newPath +} + +function Restore-Path() +{ + $env:Path = $env:RestorePath +} From 71810c3960fd62e0fc03c65c42e4d1cef81b43dd Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sat, 14 Oct 2017 12:55:39 -0500 Subject: [PATCH 0140/1093] Print out the cmake version during build Been debugging an issue related to it, would help to know exactly what versions of tools the automated builds are using --- scripts/appveyor_ci_build.ps1 | 1 + scripts/travis_ci_build.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index 238688545..dc3304622 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -76,6 +76,7 @@ switch -Wildcard ($env:Platform) # Add mingw to the path Add-PathFolder $mingw_path + Invoke-BuildCommand "cmake --version" Invoke-BuildCommand "cmake -G 'MinGW Makefiles' .." 'cpputest_build' Invoke-BuildCommand "mingw32-make all" 'cpputest_build' diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index e17945610..5dc49b45f 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -34,6 +34,7 @@ if [ "x$BUILD" = "xautotools" ]; then fi if [ "x$BUILD" = "xcmake" ]; then + cmake --version cmake -DWERROR=ON -DC++11=${CPP11} .. make ctest -V From 8133e69c7090c5d6bd64c8d6da23d1a03325f512 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sat, 14 Oct 2017 12:56:24 -0500 Subject: [PATCH 0141/1093] Use new image again, force static linkage to fix crashes --- CMakeLists.txt | 9 ++++++++- appveyor.yml | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ce13b383..0faf34a0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,13 +20,20 @@ if(HAVE_STRDUP) add_definitions(-DCPPUTEST_HAVE_STRDUP=1) endif(HAVE_STRDUP) -# Apply workaround for MinGW timespec redefinition (pthread.h / time.h) if (MINGW) + # Apply workaround for MinGW timespec redefinition (pthread.h / time.h) include(CheckStructHasMember) check_struct_has_member("struct timespec" tv_sec time.h HAVE_STRUCT_TIMESPEC) if (HAVE_STRUCT_TIMESPEC) add_definitions(-D_TIMESPEC_DEFINED=1) endif() + + # Apply workaround for static/shared libraries on MinGW C/C++ compiler + # Issue occurs with CMake >= 3.9.0, it doesn't filter out gcc,gcc_s,gcc_eh from + # the implicit library list anymore, so the C++ linker is getting passed the static + # gcc_eh library since that's what the C linker uses by default. Only solution appears + # to be to force static linkage. + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") endif() option(STD_C "Use the standard C library" ON) diff --git a/appveyor.yml b/appveyor.yml index cdc4f9501..bcb01d6b4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ version: 3.7.0-ci{build} -image: Previous Visual Studio 2015 +image: Visual Studio 2015 cache: - C:\ProgramData\chocolatey\bin -> appveyor.yml From 629bed453f5ecc6474b7c80d323cb40021c0fffd Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sat, 14 Oct 2017 14:00:18 -0500 Subject: [PATCH 0142/1093] Add x64 as a target platform --- CppUTest.vcxproj | 100 ++++++++++++++++++++++++++++++++++++++ CppUTest_VS201x.sln | 10 ++++ tests/AllTests.vcxproj | 107 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 217 insertions(+) diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index 16e718e85..a2d6ad4f5 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -5,10 +5,18 @@ Debug Win32 + + Debug + x64 + Release Win32 + + Release + x64 + {F468F539-27BD-468E-BE64-DDE641400B51} @@ -19,11 +27,21 @@ false MultiByte + + StaticLibrary + false + MultiByte + StaticLibrary false MultiByte + + StaticLibrary + false + MultiByte + @@ -31,18 +49,31 @@ + + + + + + + + <_ProjectFileVersion>10.0.30319.1 lib\ + lib\ cpputest_build\Debug\$(ProjectName)\ + cpputest_build\Debug\$(ProjectName)\ lib\ + lib\ cpputest_build\Release\$(ProjectName)\ + cpputest_build\Release\$(ProjectName)\ $(ProjectName)d + $(ProjectName)d @@ -76,6 +107,38 @@ true + + + Disabled + .\include;.\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;STDC_WANT_SECURE_LIB;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + true + winmm.lib;%(AdditionalDependencies) + + + true + .\Debug/CppUTestd.bsc + + + + + + + + true + + Disabled @@ -110,6 +173,40 @@ true + + + Disabled + .\include;.\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) + OnlyExplicitInline + WIN32;NDEBUG;_LIB;STDC_WANT_SECURE_LIB;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + OldStyle + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + true + winmm.lib;%(AdditionalDependencies) + + + true + .\Release/CppUTest.bsc + + + + + + + + true + + @@ -145,8 +242,11 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) diff --git a/CppUTest_VS201x.sln b/CppUTest_VS201x.sln index 12db37f5f..d794568ba 100644 --- a/CppUTest_VS201x.sln +++ b/CppUTest_VS201x.sln @@ -8,17 +8,27 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {913088F6-37C0-4195-80E9-548C7C5303CB}.Debug|Win32.ActiveCfg = Debug|Win32 {913088F6-37C0-4195-80E9-548C7C5303CB}.Debug|Win32.Build.0 = Debug|Win32 + {913088F6-37C0-4195-80E9-548C7C5303CB}.Debug|x64.ActiveCfg = Debug|x64 + {913088F6-37C0-4195-80E9-548C7C5303CB}.Debug|x64.Build.0 = Debug|x64 {913088F6-37C0-4195-80E9-548C7C5303CB}.Release|Win32.ActiveCfg = Release|Win32 {913088F6-37C0-4195-80E9-548C7C5303CB}.Release|Win32.Build.0 = Release|Win32 + {913088F6-37C0-4195-80E9-548C7C5303CB}.Release|x64.ActiveCfg = Release|x64 + {913088F6-37C0-4195-80E9-548C7C5303CB}.Release|x64.Build.0 = Release|x64 {F468F539-27BD-468E-BE64-DDE641400B51}.Debug|Win32.ActiveCfg = Debug|Win32 {F468F539-27BD-468E-BE64-DDE641400B51}.Debug|Win32.Build.0 = Debug|Win32 + {F468F539-27BD-468E-BE64-DDE641400B51}.Debug|x64.ActiveCfg = Debug|x64 + {F468F539-27BD-468E-BE64-DDE641400B51}.Debug|x64.Build.0 = Debug|x64 {F468F539-27BD-468E-BE64-DDE641400B51}.Release|Win32.ActiveCfg = Release|Win32 {F468F539-27BD-468E-BE64-DDE641400B51}.Release|Win32.Build.0 = Release|Win32 + {F468F539-27BD-468E-BE64-DDE641400B51}.Release|x64.ActiveCfg = Release|x64 + {F468F539-27BD-468E-BE64-DDE641400B51}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tests/AllTests.vcxproj b/tests/AllTests.vcxproj index c2f48afeb..6190a5f1f 100644 --- a/tests/AllTests.vcxproj +++ b/tests/AllTests.vcxproj @@ -5,10 +5,18 @@ Debug Win32 + + Debug + x64 + Release Win32 + + Release + x64 + {913088F6-37C0-4195-80E9-548C7C5303CB} @@ -19,11 +27,21 @@ false MultiByte + + Application + false + MultiByte + Application false MultiByte + + Application + false + MultiByte + @@ -31,19 +49,33 @@ + + + + + + + + <_ProjectFileVersion>10.0.30319.1 ..\cpputest_build\ + ..\cpputest_build\ ..\cpputest_build\Release\$(ProjectName)\ + ..\cpputest_build\Release\$(ProjectName)\ false + false ..\cpputest_build\ + ..\cpputest_build\ ..\cpputest_build\Debug\$(ProjectName)\ + ..\cpputest_build\Debug\$(ProjectName)\ true + true @@ -83,6 +115,43 @@ "$(TargetPath)" + + + .\Release/AllTests.tlb + + + + + MaxSpeed + OnlyExplicitInline + WIN32;NDEBUG;_CONSOLE;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + ..\include;..\include\CppUTestExt\CppUTestGTest;..\include\CppUTestExt\CppUTestGMock;..\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) + OldStyle + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + true + Console + false + + + + + true + .\Release/AllTests.bsc + + + "$(TargetPath)" + + .\Debug/AllTests.tlb @@ -122,6 +191,44 @@ "$(TargetPath)" + + + .\Debug/AllTests.tlb + + + + + Disabled + ..\include;..\include\CppUTestExt\CppUTestGTest;..\include\CppUTestExt\CppUTestGMock;..\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) + _CONSOLE;WIN32;_DEBUG;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + true + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + + + true + true + Console + false + + + + + true + + + "$(TargetPath)" + + {f468f539-27bd-468e-be64-dde641400b51} From 56c49e1257249c2c58c0e824da0e6a5f08232dc5 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sat, 14 Oct 2017 14:02:55 -0500 Subject: [PATCH 0143/1093] Clean up some extraneous compiler settings --- CppUTest.vcxproj | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index a2d6ad4f5..2aee80a43 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -240,14 +240,7 @@ - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - + From 1308ce7fda10605f386208262c8028fbb7e1f2aa Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sat, 14 Oct 2017 14:04:37 -0500 Subject: [PATCH 0144/1093] Add 64-bit Visual C++ platforms to appveyor --- appveyor.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index daaa5235e..39ddfee30 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,8 +24,12 @@ environment: PlatformToolset: v90 - Platform: Win32 PlatformToolset: v100 + - Platform: x64 + PlatformToolset: v100 - Platform: Win32 PlatformToolset: v140 + - Platform: x64 + PlatformToolset: v140 install: - ps: if ($env:Platform -like 'MinGW*') { choco install mingw --version $env:PlatformToolset $( if ($env:Platform -like '*32') { Write-Output -forcex86 } ) | Out-Null } From 259bd1df839cdee3b1c26dc815d276fee698707e Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sat, 14 Oct 2017 15:14:34 -0500 Subject: [PATCH 0145/1093] Clean up MSVC casting warnings Changed the constants to avoid the possibility of sign extension if upper bit is 0 --- tests/CppUTest/TestUTestMacro.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index 8a5907a44..93a003652 100755 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -721,8 +721,8 @@ TEST(UnitTestMacros, FailureWithPOINTERS_EQUAL) TEST(UnitTestMacros, POINTERS_EQUALBehavesAsProperMacro) { - if (false) POINTERS_EQUAL(0, (void*) 0xbeefbeef) - else POINTERS_EQUAL((void*)0xdeadbeef, (void*)0xdeadbeef) + if (false) POINTERS_EQUAL(0, 0x0ea1beef) + else POINTERS_EQUAL(0x01debeef, 0x01debeef) } IGNORE_TEST(UnitTestMacros, POINTERS_EQUALWorksInAnIgnoredTest) @@ -746,8 +746,8 @@ TEST(UnitTestMacros, FailureWithPOINTERS_EQUAL_TEXT) TEST(UnitTestMacros, POINTERS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) POINTERS_EQUAL_TEXT(0, (void*) 0xbeefbeef, "Failed because it failed") - else POINTERS_EQUAL_TEXT((void*)0xdeadbeef, (void*)0xdeadbeef, "Failed because it failed") + if (false) POINTERS_EQUAL_TEXT(0, (void*) 0x0ea1beef, "Failed because it failed") + else POINTERS_EQUAL_TEXT((void*)0x01debeef, (void*)0x01debeef, "Failed because it failed") } IGNORE_TEST(UnitTestMacros, POINTERS_EQUAL_TEXTWorksInAnIgnoredTest) @@ -771,8 +771,8 @@ TEST(UnitTestMacros, FailureWithFUNCTIONPOINTERS_EQUAL) TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUALBehavesAsProperMacro) { - if (false) FUNCTIONPOINTERS_EQUAL(0, (void (*)())0xbeefbeef) - else FUNCTIONPOINTERS_EQUAL((void (*)())0xdeadbeef, (void (*)())0xdeadbeef) + if (false) FUNCTIONPOINTERS_EQUAL(0, (void (*)())0x0ea1beef) + else FUNCTIONPOINTERS_EQUAL((void (*)())0x01debeef, (void (*)())0x01debeef) } IGNORE_TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUALWorksInAnIgnoredTest) @@ -796,8 +796,8 @@ TEST(UnitTestMacros, FailureWithFUNCTIONPOINTERS_EQUAL_TEXT) TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) FUNCTIONPOINTERS_EQUAL_TEXT(0, (void (*)())0xbeefbeef, "Failed because it failed") - else FUNCTIONPOINTERS_EQUAL_TEXT((void (*)())0xdeadbeef, (void (*)())0xdeadbeef, "Failed because it failed") + if (false) FUNCTIONPOINTERS_EQUAL_TEXT(0, (void (*)())0x0ea1beef, "Failed because it failed") + else FUNCTIONPOINTERS_EQUAL_TEXT((void (*)())0x01debeef, (void (*)())0x01debeef, "Failed because it failed") } IGNORE_TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUAL_TEXTWorksInAnIgnoredTest) From 395f3ef80fcf594eaa1ddb21b56009ec4895ad52 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sat, 14 Oct 2017 18:34:07 -0500 Subject: [PATCH 0146/1093] Disable x64 on VS2010, it's missing a library? Keep getting errors about winmm missing, just don't build it instead --- appveyor.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 39ddfee30..fe011128c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,8 +24,6 @@ environment: PlatformToolset: v90 - Platform: Win32 PlatformToolset: v100 - - Platform: x64 - PlatformToolset: v100 - Platform: Win32 PlatformToolset: v140 - Platform: x64 From 1c132c6810c575c00f1f8e75de8c5753364c6e84 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 16 Oct 2017 07:37:16 -0500 Subject: [PATCH 0147/1093] This test works now with long long supported --- tests/CppUTest/SimpleStringTest.cpp | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 3ca0f5857..af6889615 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -715,7 +715,6 @@ TEST(SimpleString, CollectionWritingToEmptyString) } #ifdef CPPUTEST_64BIT -#ifndef CPPUTEST_64BIT_32BIT_LONGS TEST(SimpleString, _64BitAddressPrintsCorrectly) { @@ -725,6 +724,8 @@ TEST(SimpleString, _64BitAddressPrintsCorrectly) STRCMP_EQUAL(expected.asCharString(), actual.asCharString()); } +#ifndef CPPUTEST_64BIT_32BIT_LONGS + TEST(SimpleString, BracketsFormattedHexStringFromForLongOnDifferentPlatform) { long value = -1; @@ -733,26 +734,13 @@ TEST(SimpleString, BracketsFormattedHexStringFromForLongOnDifferentPlatform) } #else -/* - * This test case should pass on 64 bit systems with 32 bit longs, - * but actually fails due to an implementation problem: Right now, - * the 64 bit pointers are casted to 32bit as the %p is causing - * different formats on different platforms. However, this will - * need to be fixed in the future. - */ + TEST(SimpleString, BracketsFormattedHexStringFromForLongOnDifferentPlatform) { long value = -1; STRCMP_EQUAL("(0xffffffff)", BracketsFormattedHexStringFrom(value).asCharString()); } -IGNORE_TEST(SimpleString, _64BitAddressPrintsCorrectly) -{ - char* p = (char*) 0xffffffff; - SimpleString expected("0x123456789"); - SimpleString actual = StringFrom((void*)&p[0x2345678A]); - STRCMP_EQUAL(expected.asCharString(), actual.asCharString()); -} #endif #else From 6526bc764d077a4878f4d75a9ca870f5169f442c Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Tue, 24 Oct 2017 21:40:28 -0500 Subject: [PATCH 0148/1093] Use a macro to wrap the casting instead Now the casts change depending on system configuration, allows having the right cast/literal combinations to avoid any warnings --- tests/CppUTest/TestUTestMacro.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index 93a003652..b04d7d361 100755 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -31,6 +31,18 @@ #define CHECK_TEST_FAILS_PROPER_WITH_TEXT(text) fixture.checkTestFailsWithProperTestLocation(text, __FILE__, __LINE__) +// Mainly this is for Visual C++, but we'll define it for any system that has the same behavior +// of a 32-bit long on a 64-bit system +#if defined(CPPUTEST_64BIT) && defined(CPPUTEST_64BIT_32BIT_LONGS) +// Forcing the value to be unsigned long long means that there's no sign-extension to perform +#define to_void_pointer(x) ((void *)x##ULL) +#define to_func_pointer(x) ((void (*)())x##ULL) +#else +// Probably not needed, but let's guarantee that the value is an unsigned long +#define to_void_pointer(x) ((void *)x##UL) +#define to_func_pointer(x) ((void (*)())x##UL) +#endif + TEST_GROUP(UnitTestMacros) { TestTestingFixture fixture; @@ -721,8 +733,8 @@ TEST(UnitTestMacros, FailureWithPOINTERS_EQUAL) TEST(UnitTestMacros, POINTERS_EQUALBehavesAsProperMacro) { - if (false) POINTERS_EQUAL(0, 0x0ea1beef) - else POINTERS_EQUAL(0x01debeef, 0x01debeef) + if (false) POINTERS_EQUAL(0, to_void_pointer(0xbeefbeef)) + else POINTERS_EQUAL(to_void_pointer(0xdeadbeef), to_void_pointer(0xdeadbeef)) } IGNORE_TEST(UnitTestMacros, POINTERS_EQUALWorksInAnIgnoredTest) @@ -746,8 +758,8 @@ TEST(UnitTestMacros, FailureWithPOINTERS_EQUAL_TEXT) TEST(UnitTestMacros, POINTERS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) POINTERS_EQUAL_TEXT(0, (void*) 0x0ea1beef, "Failed because it failed") - else POINTERS_EQUAL_TEXT((void*)0x01debeef, (void*)0x01debeef, "Failed because it failed") + if (false) POINTERS_EQUAL_TEXT(0, to_void_pointer(0xbeefbeef), "Failed because it failed") + else POINTERS_EQUAL_TEXT(to_void_pointer(0xdeadbeef), to_void_pointer(0xdeadbeef), "Failed because it failed") } IGNORE_TEST(UnitTestMacros, POINTERS_EQUAL_TEXTWorksInAnIgnoredTest) @@ -771,8 +783,8 @@ TEST(UnitTestMacros, FailureWithFUNCTIONPOINTERS_EQUAL) TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUALBehavesAsProperMacro) { - if (false) FUNCTIONPOINTERS_EQUAL(0, (void (*)())0x0ea1beef) - else FUNCTIONPOINTERS_EQUAL((void (*)())0x01debeef, (void (*)())0x01debeef) + if (false) FUNCTIONPOINTERS_EQUAL(0, to_func_pointer(0xbeefbeef)) + else FUNCTIONPOINTERS_EQUAL(to_func_pointer(0xdeadbeef), to_func_pointer(0xdeadbeef)) } IGNORE_TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUALWorksInAnIgnoredTest) @@ -796,8 +808,8 @@ TEST(UnitTestMacros, FailureWithFUNCTIONPOINTERS_EQUAL_TEXT) TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) FUNCTIONPOINTERS_EQUAL_TEXT(0, (void (*)())0x0ea1beef, "Failed because it failed") - else FUNCTIONPOINTERS_EQUAL_TEXT((void (*)())0x01debeef, (void (*)())0x01debeef, "Failed because it failed") + if (false) FUNCTIONPOINTERS_EQUAL_TEXT(0, to_func_pointer(0xbeefbeef), "Failed because it failed") + else FUNCTIONPOINTERS_EQUAL_TEXT(to_func_pointer(0xdeadbeef), to_func_pointer(0xdeadbeef), "Failed because it failed") } IGNORE_TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUAL_TEXTWorksInAnIgnoredTest) From b5f2d178ec14fb44d386515c6a6b449c3e376e71 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Tue, 24 Oct 2017 21:49:17 -0500 Subject: [PATCH 0149/1093] Enable warnings as error on release builds --- CppUTest.vcxproj | 2 ++ tests/AllTests.vcxproj | 2 ++ 2 files changed, 4 insertions(+) diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index 2aee80a43..5d850923e 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -151,6 +151,7 @@ Level3 true OldStyle + true NDEBUG;%(PreprocessorDefinitions) @@ -185,6 +186,7 @@ Level3 true OldStyle + true NDEBUG;%(PreprocessorDefinitions) diff --git a/tests/AllTests.vcxproj b/tests/AllTests.vcxproj index 6190a5f1f..d57eadee6 100644 --- a/tests/AllTests.vcxproj +++ b/tests/AllTests.vcxproj @@ -94,6 +94,7 @@ true ..\include;..\include\CppUTestExt\CppUTestGTest;..\include\CppUTestExt\CppUTestGMock;..\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) OldStyle + true NDEBUG;%(PreprocessorDefinitions) @@ -132,6 +133,7 @@ true ..\include;..\include\CppUTestExt\CppUTestGTest;..\include\CppUTestExt\CppUTestGMock;..\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) OldStyle + true NDEBUG;%(PreprocessorDefinitions) From fcdf235714c3ef47113bb93c34484589aac9aeeb Mon Sep 17 00:00:00 2001 From: Victor Ronchetti Date: Mon, 30 Oct 2017 16:29:08 -0400 Subject: [PATCH 0150/1093] Clang Static Analyzer - "dead assignment" warning fixes --- tests/CppUTest/AllocLetTestFree.c | 1 + tests/CppUTestExt/MockCheatSheetTest.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/CppUTest/AllocLetTestFree.c b/tests/CppUTest/AllocLetTestFree.c index 163583141..82358074f 100644 --- a/tests/CppUTest/AllocLetTestFree.c +++ b/tests/CppUTest/AllocLetTestFree.c @@ -22,6 +22,7 @@ void AllocLetTestFree_Destroy(AllocLetTestFree self) AllocLetTestFree no_use = self; self = NULL; self = no_use; + (void)self; } #endif diff --git a/tests/CppUTestExt/MockCheatSheetTest.cpp b/tests/CppUTestExt/MockCheatSheetTest.cpp index 6e91b475d..43dfdd1bb 100644 --- a/tests/CppUTestExt/MockCheatSheetTest.cpp +++ b/tests/CppUTestExt/MockCheatSheetTest.cpp @@ -25,6 +25,7 @@ static int productionCodeFooCalls() { int return_value; return_value = foo("value_string", 10); + (void)return_value; return_value = foo("value_string", 10); return return_value; } From d65d6a374fd9ef6e1f5a19846ee418503a82e53b Mon Sep 17 00:00:00 2001 From: Victor Ronchetti Date: Mon, 30 Oct 2017 16:29:37 -0400 Subject: [PATCH 0151/1093] Clang Static Analyzer - "uninitialized argument value" warning fix --- tests/CppUTest/TestMemoryAllocatorTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 7c6017f36..85819acf8 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -216,7 +216,7 @@ TEST(FailableMemoryAllocator, FailFirstAllocationAtGivenLine) TEST(FailableMemoryAllocator, FailThirdAllocationAtGivenLine) { - int *memory[10]; + int *memory[10] = { NULL }; int allocation; failableMallocAllocator.failNthAllocAt(3, __FILE__, __LINE__ + 4); From d2886e864563984bea25e766eb7f7387c546c4e9 Mon Sep 17 00:00:00 2001 From: Charles Nicholson Date: Mon, 4 Dec 2017 22:02:12 -0500 Subject: [PATCH 0152/1093] Add CMake option for more quieter configuration --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0faf34a0c..2d559e7a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,8 @@ option(WERROR "Compile with warnings as errors" OFF) option(TESTS "Compile and make tests for the code?" ON) option(TESTS_DETAILED "Run each test separately instead of grouped?" OFF) +option(VERBOSE_CONFIG "Print configuration to stdout during generation" ON) + if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "What kind of build this is" FORCE) endif(NOT CMAKE_BUILD_TYPE) @@ -151,7 +153,8 @@ else() " or write generators for CppUTestConfig.cmake by yourself.") endif() -message(" +if(VERBOSE_CONFIG) + message(" ------------------------------------------------------- CppUTest Version ${CppUTest_version_major}.${CppUTest_version_minor} @@ -180,3 +183,4 @@ Features configured in CppUTest: ------------------------------------------------------- ") +endif() From 944f08527e7d286d4463128cfaa2dd33d6a33d01 Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Tue, 20 Feb 2018 12:07:44 +0100 Subject: [PATCH 0153/1093] Fixes compiling with Clang + MinGW bintools in Windows --- CMakeLists.txt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d559e7a6..a71aaffae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,12 +28,14 @@ if (MINGW) add_definitions(-D_TIMESPEC_DEFINED=1) endif() - # Apply workaround for static/shared libraries on MinGW C/C++ compiler - # Issue occurs with CMake >= 3.9.0, it doesn't filter out gcc,gcc_s,gcc_eh from - # the implicit library list anymore, so the C++ linker is getting passed the static - # gcc_eh library since that's what the C linker uses by default. Only solution appears - # to be to force static linkage. - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") + if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + # Apply workaround for static/shared libraries on MinGW C/C++ compiler + # Issue occurs with CMake >= 3.9.0, it doesn't filter out gcc,gcc_s,gcc_eh from + # the implicit library list anymore, so the C++ linker is getting passed the static + # gcc_eh library since that's what the C linker uses by default. Only solution appears + # to be to force static linkage. + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") + endif() endif() option(STD_C "Use the standard C library" ON) From 80a269a2590f62b0bbbf05b8d7dbdabd2d12b8c6 Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Tue, 20 Feb 2018 14:59:45 +0100 Subject: [PATCH 0154/1093] Added cmake toolchain files for Clang+MinGW --- cmake/clang+mingw-win32.toolchain.cmake | 6 ++++++ cmake/clang+mingw-win64.toolchain.cmake | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 cmake/clang+mingw-win32.toolchain.cmake create mode 100644 cmake/clang+mingw-win64.toolchain.cmake diff --git a/cmake/clang+mingw-win32.toolchain.cmake b/cmake/clang+mingw-win32.toolchain.cmake new file mode 100644 index 000000000..05882ea9f --- /dev/null +++ b/cmake/clang+mingw-win32.toolchain.cmake @@ -0,0 +1,6 @@ +# Toolchain to use Clang compiler with MinGW binutils (e.g. linker) in Windows to generate 32-bits executables + +set(CMAKE_C_COMPILER clang) +set(CMAKE_C_FLAGS "-target x86_64-w64-mingw32 -m32" CACHE STRING "" FORCE) +set(CMAKE_CXX_COMPILER clang++) +set(CMAKE_CXX_FLAGS "-target i686-w64-mingw32 -m32" CACHE STRING "" FORCE) \ No newline at end of file diff --git a/cmake/clang+mingw-win64.toolchain.cmake b/cmake/clang+mingw-win64.toolchain.cmake new file mode 100644 index 000000000..8a2d26501 --- /dev/null +++ b/cmake/clang+mingw-win64.toolchain.cmake @@ -0,0 +1,6 @@ +# Toolchain to use Clang compiler with MinGW binutils (e.g. linker) in Windows to generate 64-bits executables + +set(CMAKE_C_COMPILER clang) +set(CMAKE_C_FLAGS "-target x86_64-w64-mingw32" CACHE STRING "" FORCE) +set(CMAKE_CXX_COMPILER clang++) +set(CMAKE_CXX_FLAGS "-target x86_64-w64-mingw32" CACHE STRING "" FORCE) \ No newline at end of file From 68e6eff6813bbde5d6ab58c424975b4001a5d864 Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Tue, 20 Feb 2018 15:00:19 +0100 Subject: [PATCH 0155/1093] Added compilation with Clang to CI builds --- appveyor.yml | 4 ++++ cmake/clang+mingw-win32.toolchain.cmake | 2 +- scripts/appveyor_ci_build.ps1 | 9 ++++++++- scripts/appveyor_helpers.ps1 | 10 ++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index f98221521..def9f84af 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,6 +20,10 @@ environment: PlatformToolset: 5.3.0 - Platform: MinGW64 PlatformToolset: 5.3.0 + - Platform: MinGWClang64 + PlatformToolset: 5.3.0 + - Platform: MinGWClang32 + PlatformToolset: 5.3.0 - Platform: Win32 PlatformToolset: v90 - Platform: Win32 diff --git a/cmake/clang+mingw-win32.toolchain.cmake b/cmake/clang+mingw-win32.toolchain.cmake index 05882ea9f..53711d5a8 100644 --- a/cmake/clang+mingw-win32.toolchain.cmake +++ b/cmake/clang+mingw-win32.toolchain.cmake @@ -1,6 +1,6 @@ # Toolchain to use Clang compiler with MinGW binutils (e.g. linker) in Windows to generate 32-bits executables set(CMAKE_C_COMPILER clang) -set(CMAKE_C_FLAGS "-target x86_64-w64-mingw32 -m32" CACHE STRING "" FORCE) +set(CMAKE_C_FLAGS "-target i686-w64-mingw32 -m32" CACHE STRING "" FORCE) set(CMAKE_CXX_COMPILER clang++) set(CMAKE_CXX_FLAGS "-target i686-w64-mingw32 -m32" CACHE STRING "" FORCE) \ No newline at end of file diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index dc3304622..b5f42b93c 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -72,12 +72,19 @@ switch -Wildcard ($env:Platform) 'MinGW*' { $mingw_path = Get-MinGWBin + + if ($env:Platform -like 'MinGWClang*') + { + $toolchain_filename = Get-ClangToolchainFilename + $toolchain_path = (Join-Path (Split-Path $MyInvocation.MyCommand.Path) "..\cmake\$toolchain_filename") + $toolchain = "-DCMAKE_TOOLCHAIN_FILE=$toolchain_path" + } # Add mingw to the path Add-PathFolder $mingw_path Invoke-BuildCommand "cmake --version" - Invoke-BuildCommand "cmake -G 'MinGW Makefiles' .." 'cpputest_build' + Invoke-BuildCommand "cmake -G 'MinGW Makefiles' $toolchain .." 'cpputest_build' Invoke-BuildCommand "mingw32-make all" 'cpputest_build' Remove-PathFolder $mingw_path diff --git a/scripts/appveyor_helpers.ps1 b/scripts/appveyor_helpers.ps1 index 8888815bd..af08f21ca 100644 --- a/scripts/appveyor_helpers.ps1 +++ b/scripts/appveyor_helpers.ps1 @@ -18,6 +18,16 @@ function Get-MinGWBin() { } } +# Helper function to provide the toolchain file for clang +function Get-ClangToolchainFilename() { + if ($env:Platform -like '*64') { + Write-Output 'clang+mingw-win64.toolchain.cmake' + } + else { + Write-Output 'clang+mingw-win32.toolchain.cmake' + } +} + # Helper function to provide the bin-folder path to cygwin function Get-CygwinBin() { if ($env:Platform -like '*64') { From 1a650c5066868320bdf5a7301de7375790118a65 Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Tue, 20 Feb 2018 18:21:07 +0100 Subject: [PATCH 0156/1093] Use MinGW with DWARF exception handling in CI. This is needed to avoid failure to link Clang compiled objects. --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index def9f84af..f3b72bde2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -34,7 +34,7 @@ environment: PlatformToolset: v140 install: -- ps: if ($env:Platform -like 'MinGW*') { choco install mingw --version $env:PlatformToolset $( if ($env:Platform -like '*32') { Write-Output --forcex86 } ) } +- ps: if ($env:Platform -like 'MinGW*') { choco install mingw --version $env:PlatformToolset $( if ($env:Platform -like '*32') { Write-Output --forcex86 --params /exception:dwarf } ) } build_script: - ps: scripts\appveyor_ci_build.ps1 From c8ec109a6facf6c69c8619f5550a869c319dac0b Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Tue, 20 Feb 2018 23:52:20 +0100 Subject: [PATCH 0157/1093] Made expectation objects optional. If onObject() is called on a expected call, it is considered that the expectation matches only the specific object passed; but if it's not called, it's considered that the expectation matches any object. Therefore, when onObject() is called on an actual call, both the expectations that target the passed object and the expectations that do not target a specific object will match. --- include/CppUTestExt/MockCheckedExpectedCall.h | 1 + src/CppUTestExt/MockActualCall.cpp | 11 +++++--- src/CppUTestExt/MockExpectedCall.cpp | 11 ++++---- tests/CppUTestExt/MockCallTest.cpp | 25 +++++++++++++++++++ 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index deccb0813..9e5f9d302 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -135,6 +135,7 @@ class MockCheckedExpectedCall : public MockExpectedCall MockNamedValueList* outputParameters_; MockNamedValue returnValue_; void* objectPtr_; + bool isSpecificObjectExpected_; bool wasPassedToObject_; unsigned int actualCalls_; unsigned int expectedCalls_; diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 151cce360..585132400 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -527,19 +527,22 @@ MockActualCall& MockCheckedActualCall::onObject(const void* objectPtr) return *this; } - setState(CALL_IN_PROGRESS); - discardCurrentlyMatchingExpectations(); + // Currently matching expectations are not discarded because the passed object + // is ignored if not specifically set in the expectation potentiallyMatchingExpectations_.onlyKeepExpectationsOnObject(objectPtr); - if (potentiallyMatchingExpectations_.isEmpty()) { + if ((!matchingExpectation_) && potentiallyMatchingExpectations_.isEmpty()) { MockUnexpectedObjectFailure failure(getTest(), getName(), objectPtr, allExpectations_); failTest(failure); return *this; } potentiallyMatchingExpectations_.wasPassedToObject(); - completeCallWhenMatchIsFound(); + + if (!matchingExpectation_) { + completeCallWhenMatchIsFound(); + } return *this; } diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index 47b21b678..413003fc5 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -54,7 +54,7 @@ SimpleString MockCheckedExpectedCall::getName() const MockCheckedExpectedCall::MockCheckedExpectedCall() : ignoreOtherParameters_(false), isActualCallMatchFinalized_(false), initialExpectedCallOrder_(NO_EXPECTED_CALL_ORDER), finalExpectedCallOrder_(NO_EXPECTED_CALL_ORDER), - outOfOrder_(false), returnValue_(""), objectPtr_(NULL), wasPassedToObject_(true), + outOfOrder_(false), returnValue_(""), objectPtr_(NULL), isSpecificObjectExpected_(false), wasPassedToObject_(true), actualCalls_(0), expectedCalls_(1) { inputParameters_ = new MockNamedValueList(); @@ -64,7 +64,7 @@ MockCheckedExpectedCall::MockCheckedExpectedCall() MockCheckedExpectedCall::MockCheckedExpectedCall(unsigned int numCalls) : ignoreOtherParameters_(false), isActualCallMatchFinalized_(false), initialExpectedCallOrder_(NO_EXPECTED_CALL_ORDER), finalExpectedCallOrder_(NO_EXPECTED_CALL_ORDER), - outOfOrder_(false), returnValue_(""), objectPtr_(NULL), wasPassedToObject_(true), + outOfOrder_(false), returnValue_(""), objectPtr_(NULL), isSpecificObjectExpected_(false), wasPassedToObject_(true), actualCalls_(0), expectedCalls_(numCalls) { inputParameters_ = new MockNamedValueList(); @@ -291,7 +291,7 @@ void MockCheckedExpectedCall::wasPassedToObject() void MockCheckedExpectedCall::resetActualCallMatchingState() { - wasPassedToObject_ = (objectPtr_ == NULL); + wasPassedToObject_ = !isSpecificObjectExpected_; isActualCallMatchFinalized_ = false; MockNamedValueListNode* p; @@ -339,7 +339,7 @@ bool MockCheckedExpectedCall::hasOutputParameter(const MockNamedValue& parameter SimpleString MockCheckedExpectedCall::callToString() { SimpleString str; - if (objectPtr_) + if (isSpecificObjectExpected_) str = StringFromFormat("(object address: %p)::", objectPtr_); str += getName(); @@ -409,7 +409,7 @@ bool MockCheckedExpectedCall::relatesTo(const SimpleString& functionName) bool MockCheckedExpectedCall::relatesToObject(const void* objectPtr) const { - return objectPtr_ == objectPtr; + return (!isSpecificObjectExpected_) || (objectPtr_ == objectPtr); } MockCheckedExpectedCall::MockExpectedFunctionParameter* MockCheckedExpectedCall::item(MockNamedValueListNode* node) @@ -504,6 +504,7 @@ MockExpectedCall& MockCheckedExpectedCall::andReturnValue(void (*value)()) MockExpectedCall& MockCheckedExpectedCall::onObject(void* objectPtr) { + isSpecificObjectExpected_ = true; wasPassedToObject_ = false; objectPtr_ = objectPtr; return *this; diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index b2bdc26ea..12bfe1843 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -366,6 +366,31 @@ TEST(MockCallTest, OnObject) 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; From 86b026ed62aa232802e8fb0022c44e47b4e60a88 Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Thu, 22 Feb 2018 09:54:49 +0100 Subject: [PATCH 0158/1093] Differentiated const and non-const objects stored in MockNamedValue and exposed by MockSupport --- include/CppUTestExt/MockNamedValue.h | 9 ++++--- include/CppUTestExt/MockSupport.h | 1 + include/CppUTestExt/MockSupport_c.h | 4 +++- src/CppUTestExt/MockActualCall.cpp | 6 ++--- src/CppUTestExt/MockExpectedCall.cpp | 4 ++-- src/CppUTestExt/MockNamedValue.cpp | 24 +++++++++++++++---- src/CppUTestExt/MockSupport.cpp | 6 +++++ src/CppUTestExt/MockSupport_c.cpp | 7 ++++++ .../CppUTestExt/MockComparatorCopierTest.cpp | 4 ++-- tests/CppUTestExt/MockExpectedCallTest.cpp | 18 +++++++------- 10 files changed, 59 insertions(+), 24 deletions(-) diff --git a/include/CppUTestExt/MockNamedValue.h b/include/CppUTestExt/MockNamedValue.h index 2e08be75a..4b9c1dd9f 100644 --- a/include/CppUTestExt/MockNamedValue.h +++ b/include/CppUTestExt/MockNamedValue.h @@ -112,7 +112,8 @@ class MockNamedValue virtual void setValue(void (*value)()); virtual void setValue(const char* value); virtual void setMemoryBuffer(const unsigned char* value, size_t size); - virtual void setObjectPointer(const SimpleString& type, const void* objectPtr); + virtual void setConstObjectPointer(const SimpleString& type, const void* objectPtr); + virtual void setObjectPointer(const SimpleString& type, void* objectPtr); virtual void setSize(size_t size); virtual void setName(const char* name); @@ -136,7 +137,8 @@ class MockNamedValue virtual const void* getConstPointerValue() const; virtual void (*getFunctionPointerValue() const)(); virtual const unsigned char* getMemoryBuffer() const; - virtual const void* getObjectPointer() const; + virtual const void* getConstObjectPointer() const; + virtual void* getObjectPointer() const; virtual size_t getSize() const; virtual MockNamedValueComparator* getComparator() const; @@ -158,7 +160,8 @@ class MockNamedValue const void* constPointerValue_; void (*functionPointerValue_)(); const unsigned char* memoryBufferValue_; - const void* objectPointerValue_; + const void* constObjectPointerValue_; + void* objectPointerValue_; const void* outputPointerValue_; } value_; size_t size_; diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index 60517e3b4..ea900e5af 100755 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -83,6 +83,7 @@ class MockSupport void setData(const SimpleString& name, const void* value); void setData(const SimpleString& name, void (*value)()); void setDataObject(const SimpleString& name, const SimpleString& type, void* value); + void setDataConstObject(const SimpleString& name, const SimpleString& type, const void* value); MockNamedValue getData(const SimpleString& name); MockSupport* getMockSupportScope(const SimpleString& name); diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index fd0a3d2eb..0033c5faf 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -64,7 +64,8 @@ typedef struct SMockValue_c const void* constPointerValue; void (*functionPointerValue)(void); const unsigned char* memoryBufferValue; - const void* objectValue; + void* objectValue; + const void* constObjectValue; } value; } MockValue_c; @@ -184,6 +185,7 @@ struct SMockSupport_c void (*setConstPointerData) (const char* name, const void* value); void (*setFunctionPointerData) (const char* name, void (*value)(void)); void (*setDataObject) (const char* name, const char* type, void* value); + void (*setDataConstObject) (const char* name, const char* type, const void* value); MockValue_c (*getData)(const char* name); void (*disable)(void); diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 151cce360..c11f5f458 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -87,7 +87,7 @@ void MockCheckedActualCall::copyOutputParameters(MockCheckedExpectedCall* expect MockNamedValueCopier* copier = outputParameter.getCopier(); if (copier) { - copier->copy(p->ptr_, outputParameter.getObjectPointer()); + copier->copy(p->ptr_, outputParameter.getConstObjectPointer()); } else if ((outputParameter.getType() == "const void*") && (p->type_ == "void*")) { @@ -292,7 +292,7 @@ MockActualCall& MockCheckedActualCall::withMemoryBufferParameter(const SimpleStr MockActualCall& MockCheckedActualCall::withParameterOfType(const SimpleString& type, const SimpleString& name, const void* value) { MockNamedValue actualParameter(name); - actualParameter.setObjectPointer(type, value); + actualParameter.setConstObjectPointer(type, value); if (actualParameter.getComparator() == NULL) { MockNoWayToCompareCustomTypeFailure failure(getTest(), type); @@ -319,7 +319,7 @@ MockActualCall& MockCheckedActualCall::withOutputParameterOfType(const SimpleStr addOutputParameter(name, type, output); MockNamedValue outputParameter(name); - outputParameter.setObjectPointer(type, output); + outputParameter.setConstObjectPointer(type, output); checkOutputParameter(outputParameter); return *this; diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index 47b21b678..0655df703 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -177,7 +177,7 @@ MockExpectedCall& MockCheckedExpectedCall::withParameterOfType(const SimpleStrin { MockNamedValue* newParameter = new MockExpectedFunctionParameter(name); inputParameters_->add(newParameter); - newParameter->setObjectPointer(type, value); + newParameter->setConstObjectPointer(type, value); return *this; } @@ -194,7 +194,7 @@ MockExpectedCall& MockCheckedExpectedCall::withOutputParameterOfTypeReturning(co { MockNamedValue* newParameter = new MockExpectedFunctionParameter(name); outputParameters_->add(newParameter); - newParameter->setObjectPointer(type, value); + newParameter->setConstObjectPointer(type, value); return *this; } diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 478ccaa06..86cbd1ab4 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -113,7 +113,18 @@ void MockNamedValue::setMemoryBuffer(const unsigned char* value, size_t size) size_ = size; } -void MockNamedValue::setObjectPointer(const SimpleString& type, const void* objectPtr) +void MockNamedValue::setConstObjectPointer(const SimpleString& type, const void* objectPtr) +{ + type_ = type; + value_.constObjectPointerValue_ = objectPtr; + if (defaultRepository_) + { + comparator_ = defaultRepository_->getComparatorForType(type); + copier_ = defaultRepository_->getCopierForType(type); + } +} + +void MockNamedValue::setObjectPointer(const SimpleString& type, void* objectPtr) { type_ = type; value_.objectPointerValue_ = objectPtr; @@ -231,7 +242,12 @@ const unsigned char* MockNamedValue::getMemoryBuffer() const return value_.memoryBufferValue_; } -const void* MockNamedValue::getObjectPointer() const +const void* MockNamedValue::getConstObjectPointer() const +{ + return value_.constObjectPointerValue_; +} + +void* MockNamedValue::getObjectPointer() const { return value_.objectPointerValue_; } @@ -309,7 +325,7 @@ bool MockNamedValue::equals(const MockNamedValue& p) const } if (comparator_) - return comparator_->isEqual(value_.objectPointerValue_, p.value_.objectPointerValue_); + return comparator_->isEqual(value_.constObjectPointerValue_, p.value_.constObjectPointerValue_); return false; } @@ -350,7 +366,7 @@ SimpleString MockNamedValue::toString() const return StringFromBinaryWithSizeOrNull(value_.memoryBufferValue_, size_); if (comparator_) - return comparator_->valueToString(value_.objectPointerValue_); + return comparator_->valueToString(value_.constObjectPointerValue_); return StringFromFormat("No comparator found for type: \"%s\"", type_.asCharString()); diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index d90f044f5..b6dc18ab2 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -419,6 +419,12 @@ void MockSupport::setDataObject(const SimpleString& name, const SimpleString& ty newData->setObjectPointer(type, value); } +void MockSupport::setDataConstObject(const SimpleString& name, const SimpleString& type, const void* value) +{ + MockNamedValue* newData = retrieveDataFromStore(name); + newData->setConstObjectPointer(type, value); +} + MockNamedValue MockSupport::getData(const SimpleString& name) { MockNamedValue* value = data_.getValueByName(name); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 35ba83e67..0dce320a3 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -134,6 +134,7 @@ void setPointerData_c(const char* name, void* value); void setConstPointerData_c(const char* name, const void* value); void setFunctionPointerData_c(const char* name, void (*value)()); void setDataObject_c(const char* name, const char* type, void* value); +void setDataConstObject_c(const char* name, const char* type, const void* value); MockValue_c getData_c(const char* name); int hasReturnValue_c(); @@ -335,6 +336,7 @@ static MockSupport_c gMockSupport = { setConstPointerData_c, setFunctionPointerData_c, setDataObject_c, + setDataConstObject_c, getData_c, disable_c, enable_c, @@ -859,6 +861,11 @@ void setDataObject_c(const char* name, const char* type, void* value) currentMockSupport->setDataObject(name, type, value); } +void setDataConstObject_c(const char* name, const char* type, const void* value) +{ + currentMockSupport->setDataConstObject(name, type, value); +} + MockValue_c getData_c(const char* name) { return getMockValueCFromNamedValue(currentMockSupport->getData(name)); diff --git a/tests/CppUTestExt/MockComparatorCopierTest.cpp b/tests/CppUTestExt/MockComparatorCopierTest.cpp index 0b83a6811..89bf01494 100644 --- a/tests/CppUTestExt/MockComparatorCopierTest.cpp +++ b/tests/CppUTestExt/MockComparatorCopierTest.cpp @@ -205,7 +205,7 @@ TEST(MockComparatorCopierTest, unexpectedCustomTypeOutputParameter) MockExpectedCallsListForTest expectations; expectations.addFunction("foo"); MockNamedValue parameter("parameterName"); - parameter.setObjectPointer("MyTypeForTesting", &actualObject); + parameter.setConstObjectPointer("MyTypeForTesting", &actualObject); MockUnexpectedOutputParameterFailure expectedFailure(mockFailureTest(), "foo", parameter, expectations); mock().expectOneCall("foo"); @@ -250,7 +250,7 @@ TEST(MockComparatorCopierTest, customTypeOutputParameterOfWrongType) MockExpectedCallsListForTest expectations; expectations.addFunction("foo")->withOutputParameterOfTypeReturning("MyTypeForTesting", "output", &expectedObject); MockNamedValue parameter("output"); - parameter.setObjectPointer("OtherTypeForTesting", &actualObject); + parameter.setConstObjectPointer("OtherTypeForTesting", &actualObject); MockUnexpectedOutputParameterFailure expectedFailure(mockFailureTest(), "foo", parameter, expectations); mock().expectOneCall("foo").withOutputParameterOfTypeReturning("MyTypeForTesting", "output", &expectedObject); diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 4cd6c7726..2770af5df 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -293,7 +293,7 @@ TEST(MockExpectedCall, callWithObjectParameter) const SimpleString paramName = "paramName"; void* value = (void*) 0x123; call->withParameterOfType("ClassName", paramName, value); - POINTERS_EQUAL(value, call->getInputParameter(paramName).getObjectPointer()); + POINTERS_EQUAL(value, call->getInputParameter(paramName).getConstObjectPointer()); STRCMP_EQUAL("ClassName", call->getInputParameterType(paramName).asCharString()); STRCMP_CONTAINS("funcName -> ClassName paramName: ", call->callToString().asCharString()); } @@ -302,7 +302,7 @@ TEST(MockExpectedCall, callWithObjectParameterUnequalComparison) { TypeForTestingExpectedFunctionCall type(1), unequalType(2); MockNamedValue parameter("name"); - parameter.setObjectPointer("type", &unequalType); + parameter.setConstObjectPointer("type", &unequalType); call->withParameterOfType("type", "name", &type); CHECK(!call->hasInputParameter(parameter)); } @@ -311,7 +311,7 @@ TEST(MockExpectedCall, callWithObjectParameterEqualComparisonButFailsWithoutRepo { TypeForTestingExpectedFunctionCall type(1), equalType(1); MockNamedValue parameter("name"); - parameter.setObjectPointer("type", &equalType); + parameter.setConstObjectPointer("type", &equalType); call->withParameterOfType("type", "name", &type); CHECK(!call->hasInputParameter(parameter)); } @@ -323,7 +323,7 @@ TEST(MockExpectedCall, callWithObjectParameterEqualComparisonButFailsWithoutComp TypeForTestingExpectedFunctionCall type(1), equalType(1); MockNamedValue parameter("name"); - parameter.setObjectPointer("type", &equalType); + parameter.setConstObjectPointer("type", &equalType); call->withParameterOfType("type", "name", &type); CHECK(!call->hasInputParameter(parameter)); } @@ -337,7 +337,7 @@ TEST(MockExpectedCall, callWithObjectParameterEqualComparison) TypeForTestingExpectedFunctionCall type(1), equalType(1); MockNamedValue parameter("name"); - parameter.setObjectPointer("type", &equalType); + parameter.setConstObjectPointer("type", &equalType); call->withParameterOfType("type", "name", &type); CHECK(call->hasInputParameter(parameter)); @@ -352,7 +352,7 @@ TEST(MockExpectedCall, getParameterValueOfObjectType) TypeForTestingExpectedFunctionCall type(1); call->withParameterOfType("type", "name", &type); - POINTERS_EQUAL(&type, call->getInputParameter("name").getObjectPointer()); + POINTERS_EQUAL(&type, call->getInputParameter("name").getConstObjectPointer()); STRCMP_EQUAL("1", call->getInputParameterValueString("name").asCharString()); } @@ -681,7 +681,7 @@ TEST(MockExpectedCall, hasOutputParameterOfType) TypeForTestingExpectedFunctionCall object(6789); call->withOutputParameterOfTypeReturning("TypeForTestingExpectedFunctionCall", "foo", &object); MockNamedValue foo("foo"); - foo.setObjectPointer("TypeForTestingExpectedFunctionCall", &object); + foo.setConstObjectPointer("TypeForTestingExpectedFunctionCall", &object); CHECK(call->hasOutputParameter(foo)); } @@ -690,7 +690,7 @@ TEST(MockExpectedCall, hasNoOutputParameterOfTypeSameTypeButInput) TypeForTestingExpectedFunctionCall object(543); call->withParameterOfType("TypeForTestingExpectedFunctionCall", "foo", &object); MockNamedValue foo("foo"); - foo.setObjectPointer("TypeForTestingExpectedFunctionCall", &object); + foo.setConstObjectPointer("TypeForTestingExpectedFunctionCall", &object); CHECK_FALSE(call->hasOutputParameter(foo)); } @@ -699,7 +699,7 @@ TEST(MockExpectedCall, hasNoOutputParameterOfTypeDifferentType) TypeForTestingExpectedFunctionCall object(543); call->withOutputParameterOfTypeReturning("TypeForTestingExpectedFunctionCall", "foo", &object); MockNamedValue foo("foo"); - foo.setObjectPointer("OtherTypeForTestingExpectedFunctionCall", &object); + foo.setConstObjectPointer("OtherTypeForTestingExpectedFunctionCall", &object); CHECK_FALSE(call->hasOutputParameter(foo)); } From a4e745800bceafb0d499fd6415a2f58ff5d3727d Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Thu, 22 Feb 2018 09:59:03 +0100 Subject: [PATCH 0159/1093] Added additional unit test to check const object data behavior --- tests/CppUTestExt/MockSupportTest.cpp | 8 ++++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/tests/CppUTestExt/MockSupportTest.cpp b/tests/CppUTestExt/MockSupportTest.cpp index 4c616dd5d..16f3450b3 100644 --- a/tests/CppUTestExt/MockSupportTest.cpp +++ b/tests/CppUTestExt/MockSupportTest.cpp @@ -134,6 +134,14 @@ TEST(MockSupportTest, setDataObject) STRCMP_EQUAL("type", mock().getData("data").getType().asCharString()); } +TEST(MockSupportTest, setDataConstObject) +{ + void * ptr = (void*) 0x011; + mock().setDataConstObject("data", "type", ptr); + POINTERS_EQUAL(ptr, mock().getData("data").getConstObjectPointer()); + STRCMP_EQUAL("type", mock().getData("data").getType().asCharString()); +} + TEST(MockSupportTest, tracing) { mock().tracing(true); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 5188857f3..f409e9a65 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -519,6 +519,12 @@ TEST(MockSupport_c, MockSupportSetDataObject) POINTERS_EQUAL((void*) 1, mock_c()->getData("name").value.objectValue); } +TEST(MockSupport_c, MockSupportSetDataConstObject) +{ + mock_c()->setDataConstObject("name", "type", (const void*) 5); + POINTERS_EQUAL((void*) 5, mock_c()->getData("name").value.constObjectValue); +} + TEST(MockSupport_c, WorksInCFile) { all_mock_support_c_calls(); From f49abffc1a39bbb79082b95fec8f11e5507db824 Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Mon, 19 Feb 2018 01:14:46 +0100 Subject: [PATCH 0160/1093] Fix all the warnings detected by clang 5.0.0 --- include/CppUTest/CommandLineArguments.h | 30 +++++++++---------- include/CppUTest/CommandLineTestRunner.h | 4 +-- include/CppUTest/SimpleString.h | 2 +- include/CppUTest/TestMemoryAllocator.h | 6 ++-- include/CppUTest/TestPlugin.h | 4 +-- include/CppUTest/UtestMacros.h | 2 +- include/CppUTestExt/MemoryReportAllocator.h | 6 ++-- include/CppUTestExt/MemoryReporterPlugin.h | 2 +- src/CppUTest/CommandLineArguments.cpp | 28 ++++++++--------- src/CppUTest/CommandLineTestRunner.cpp | 6 ++-- src/CppUTest/MemoryLeakDetector.cpp | 2 +- src/CppUTest/MemoryLeakWarningPlugin.cpp | 8 ++--- src/CppUTest/SimpleString.cpp | 16 +++++----- src/CppUTest/TestMemoryAllocator.cpp | 6 ++-- src/CppUTest/TestPlugin.cpp | 4 +-- src/CppUTestExt/MemoryReportAllocator.cpp | 6 ++-- src/CppUTestExt/MemoryReporterPlugin.cpp | 2 +- src/CppUTestExt/MockSupport.cpp | 4 +-- src/Platforms/Gcc/UtestPlatform.cpp | 3 ++ tests/CppUTest/AllTests.cpp | 4 +-- tests/CppUTest/CommandLineArgumentsTest.cpp | 4 +-- tests/CppUTest/CommandLineTestRunnerTest.cpp | 4 +-- tests/CppUTest/PluginTest.cpp | 2 +- tests/CppUTest/SimpleStringTest.cpp | 4 +-- tests/CppUTestExt/AllTests.cpp | 2 +- .../CppUTestExt/MemoryReporterPluginTest.cpp | 4 +-- .../CppUTestExt/MockComparatorCopierTest.cpp | 4 +-- tests/CppUTestExt/MockSupport_cTest.cpp | 2 +- 28 files changed, 87 insertions(+), 84 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index 95cc0d7bb..b785b2f55 100755 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -37,7 +37,7 @@ class TestPlugin; class CommandLineArguments { public: - explicit CommandLineArguments(int ac, const char** av); + explicit CommandLineArguments(int ac, const char *const *av); virtual ~CommandLineArguments(); bool parse(TestPlugin* plugin); @@ -63,7 +63,7 @@ class CommandLineArguments OUTPUT_ECLIPSE, OUTPUT_JUNIT, OUTPUT_TEAMCITY }; int ac_; - const char** av_; + const char *const *av_; bool verbose_; bool color_; @@ -77,19 +77,19 @@ class CommandLineArguments OutputType outputType_; SimpleString packageName_; - SimpleString getParameterField(int ac, const char** av, int& i, const SimpleString& parameterName); - void SetRepeatCount(int ac, const char** av, int& index); - void AddGroupFilter(int ac, const char** av, int& index); - void AddStrictGroupFilter(int ac, const char** av, int& index); - void AddExcludeGroupFilter(int ac, const char** av, int& index); - void AddExcludeStrictGroupFilter(int ac, const char** av, int& index); - void AddNameFilter(int ac, const char** av, int& index); - void AddStrictNameFilter(int ac, const char** av, int& index); - void AddExcludeNameFilter(int ac, const char** av, int& index); - void AddExcludeStrictNameFilter(int ac, const char** av, int& index); - void AddTestToRunBasedOnVerboseOutput(int ac, const char** av, int& index, const char* parameterName); - bool SetOutputType(int ac, const char** av, int& index); - void SetPackageName(int ac, const char** av, int& index); + SimpleString getParameterField(int ac, const char *const *av, int& i, const SimpleString& parameterName); + void SetRepeatCount(int ac, const char *const *av, int& index); + void AddGroupFilter(int ac, const char *const *av, int& index); + void AddStrictGroupFilter(int ac, const char *const *av, int& index); + void AddExcludeGroupFilter(int ac, const char *const *av, int& index); + void AddExcludeStrictGroupFilter(int ac, const char *const *av, int& index); + void AddNameFilter(int ac, const char *const *av, int& index); + void AddStrictNameFilter(int ac, const char *const *av, int& index); + void AddExcludeNameFilter(int ac, const char *const *av, int& index); + void AddExcludeStrictNameFilter(int ac, const char *const *av, int& index); + void AddTestToRunBasedOnVerboseOutput(int ac, const char *const *av, int& index, const char* parameterName); + bool SetOutputType(int ac, const char *const *av, int& index); + void SetPackageName(int ac, const char *const *av, int& index); CommandLineArguments(const CommandLineArguments&); CommandLineArguments& operator=(const CommandLineArguments&); diff --git a/include/CppUTest/CommandLineTestRunner.h b/include/CppUTest/CommandLineTestRunner.h index 8cf99d170..194cd4cb2 100644 --- a/include/CppUTest/CommandLineTestRunner.h +++ b/include/CppUTest/CommandLineTestRunner.h @@ -41,10 +41,10 @@ class TestRegistry; class CommandLineTestRunner { public: - static int RunAllTests(int ac, const char** av); + static int RunAllTests(int ac, const char *const *av); static int RunAllTests(int ac, char** av); - CommandLineTestRunner(int ac, const char** av, TestRegistry* registry); + CommandLineTestRunner(int ac, const char *const *av, TestRegistry* registry); virtual ~CommandLineTestRunner(); int runAllTestsMain(); diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index c8bbcb5eb..61ef2a0c8 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -97,7 +97,7 @@ class SimpleString static size_t StrLen(const char*); static int StrNCmp(const char* s1, const char* s2, size_t n); static char* StrNCpy(char* s1, const char* s2, size_t n); - static char* StrStr(const char* s1, const char* s2); + static const char* StrStr(const char* s1, const char* s2); static char ToLower(char ch); static int MemCmp(const void* s1, const void *s2, size_t n); static char* allocStringBuffer(size_t size, const char* file, int line); diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index e81a9ac5f..60e109cdb 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -56,9 +56,9 @@ class TestMemoryAllocator virtual char* alloc_memory(size_t size, const char* file, int line); virtual void free_memory(char* memory, const char* file, int line); - virtual const char* name(); - virtual const char* alloc_name(); - virtual const char* free_name(); + virtual const char* name() const; + virtual const char* alloc_name() const; + virtual const char* free_name() const; virtual bool isOfEqualType(TestMemoryAllocator* allocator); diff --git a/include/CppUTest/TestPlugin.h b/include/CppUTest/TestPlugin.h index b3f85ee74..2b0b33d6c 100644 --- a/include/CppUTest/TestPlugin.h +++ b/include/CppUTest/TestPlugin.h @@ -46,14 +46,14 @@ class TestPlugin { } - virtual bool parseArguments(int /* ac */, const char** /* av */, int /* index */ ) + virtual bool parseArguments(int /* ac */, const char *const * /* av */, int /* index */ ) { return false; } virtual void runAllPreTestAction(UtestShell&, TestResult&); virtual void runAllPostTestAction(UtestShell&, TestResult&); - virtual bool parseAllArguments(int ac, const char** av, int index); + virtual bool parseAllArguments(int ac, const char *const *av, int index); virtual bool parseAllArguments(int ac, char** av, int index); virtual TestPlugin* addPlugin(TestPlugin*); diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 8c650420d..8b4fa8a1b 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -265,7 +265,7 @@ POINTERS_EQUAL_LOCATION((expected), (actual), text, __FILE__, __LINE__) #define POINTERS_EQUAL_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertPointersEqual((void *)expected, (void *)actual, text, file, line); } + { UtestShell::getCurrent()->assertPointersEqual((const void *)expected, (const void *)actual, text, file, line); } #define FUNCTIONPOINTERS_EQUAL(expected, actual)\ FUNCTIONPOINTERS_EQUAL_LOCATION((expected), (actual), NULL, __FILE__, __LINE__) diff --git a/include/CppUTestExt/MemoryReportAllocator.h b/include/CppUTestExt/MemoryReportAllocator.h index 064c83514..ce5473e6b 100644 --- a/include/CppUTestExt/MemoryReportAllocator.h +++ b/include/CppUTestExt/MemoryReportAllocator.h @@ -51,9 +51,9 @@ class MemoryReportAllocator : public TestMemoryAllocator virtual char* alloc_memory(size_t size, const char* file, int line) _override; virtual void free_memory(char* memory, const char* file, int line) _override; - virtual const char* name() _override; - virtual const char* alloc_name() _override; - virtual const char* free_name() _override; + virtual const char* name() const _override; + virtual const char* alloc_name() const _override; + virtual const char* free_name() const _override; }; #endif diff --git a/include/CppUTestExt/MemoryReporterPlugin.h b/include/CppUTestExt/MemoryReporterPlugin.h index 57733558c..5886dba23 100644 --- a/include/CppUTestExt/MemoryReporterPlugin.h +++ b/include/CppUTestExt/MemoryReporterPlugin.h @@ -48,7 +48,7 @@ class MemoryReporterPlugin : public TestPlugin virtual void preTestAction(UtestShell & test, TestResult & result) _override; virtual void postTestAction(UtestShell & test, TestResult & result) _override; - virtual bool parseArguments(int, const char**, int) _override; + virtual bool parseArguments(int, const char *const *, int) _override; protected: virtual MemoryReportFormatter* createMemoryFormatter(const SimpleString& type); diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 826a1f5ee..72b190b40 100755 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -29,7 +29,7 @@ #include "CppUTest/CommandLineArguments.h" #include "CppUTest/PlatformSpecificFunctions.h" -CommandLineArguments::CommandLineArguments(int ac, const char** av) : +CommandLineArguments::CommandLineArguments(int ac, const char *const *av) : ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), repeat_(1), groupFilters_(NULL), nameFilters_(NULL), outputType_(OUTPUT_ECLIPSE) { } @@ -134,7 +134,7 @@ const TestFilter* CommandLineArguments::getNameFilters() const return nameFilters_; } -void CommandLineArguments::SetRepeatCount(int ac, const char** av, int& i) +void CommandLineArguments::SetRepeatCount(int ac, const char *const *av, int& i) { repeat_ = 0; @@ -149,7 +149,7 @@ void CommandLineArguments::SetRepeatCount(int ac, const char** av, int& i) } -SimpleString CommandLineArguments::getParameterField(int ac, const char** av, int& i, const SimpleString& parameterName) +SimpleString CommandLineArguments::getParameterField(int ac, const char * const *av, int& i, const SimpleString& parameterName) { size_t parameterLength = parameterName.size(); SimpleString parameter(av[i]); @@ -158,27 +158,27 @@ SimpleString CommandLineArguments::getParameterField(int ac, const char** av, in return ""; } -void CommandLineArguments::AddGroupFilter(int ac, const char** av, int& i) +void CommandLineArguments::AddGroupFilter(int ac, const char *const *av, int& i) { TestFilter* groupFilter = new TestFilter(getParameterField(ac, av, i, "-g")); groupFilters_ = groupFilter->add(groupFilters_); } -void CommandLineArguments::AddStrictGroupFilter(int ac, const char** av, int& i) +void CommandLineArguments::AddStrictGroupFilter(int ac, const char *const *av, int& i) { TestFilter* groupFilter = new TestFilter(getParameterField(ac, av, i, "-sg")); groupFilter->strictMatching(); groupFilters_ = groupFilter->add(groupFilters_); } -void CommandLineArguments::AddExcludeGroupFilter(int ac, const char** av, int& i) +void CommandLineArguments::AddExcludeGroupFilter(int ac, const char *const *av, int& i) { TestFilter* groupFilter = new TestFilter(getParameterField(ac, av, i, "-xg")); groupFilter->invertMatching(); groupFilters_ = groupFilter->add(groupFilters_); } -void CommandLineArguments::AddExcludeStrictGroupFilter(int ac, const char** av, int& i) +void CommandLineArguments::AddExcludeStrictGroupFilter(int ac, const char *const *av, int& i) { TestFilter* groupFilter = new TestFilter(getParameterField(ac, av, i, "-xsg")); groupFilter->strictMatching(); @@ -186,27 +186,27 @@ void CommandLineArguments::AddExcludeStrictGroupFilter(int ac, const char** av, groupFilters_ = groupFilter->add(groupFilters_); } -void CommandLineArguments::AddNameFilter(int ac, const char** av, int& i) +void CommandLineArguments::AddNameFilter(int ac, const char *const *av, int& i) { TestFilter* nameFilter = new TestFilter(getParameterField(ac, av, i, "-n")); nameFilters_ = nameFilter->add(nameFilters_); } -void CommandLineArguments::AddStrictNameFilter(int ac, const char** av, int& index) +void CommandLineArguments::AddStrictNameFilter(int ac, const char *const *av, int& index) { TestFilter* nameFilter = new TestFilter(getParameterField(ac, av, index, "-sn")); nameFilter->strictMatching(); nameFilters_= nameFilter->add(nameFilters_); } -void CommandLineArguments::AddExcludeNameFilter(int ac, const char** av, int& index) +void CommandLineArguments::AddExcludeNameFilter(int ac, const char *const *av, int& index) { TestFilter* nameFilter = new TestFilter(getParameterField(ac, av, index, "-xn")); nameFilter->invertMatching(); nameFilters_= nameFilter->add(nameFilters_); } -void CommandLineArguments::AddExcludeStrictNameFilter(int ac, const char** av, int& index) +void CommandLineArguments::AddExcludeStrictNameFilter(int ac, const char *const *av, int& index) { TestFilter* nameFilter = new TestFilter(getParameterField(ac, av, index, "-xsn")); nameFilter->invertMatching(); @@ -214,7 +214,7 @@ void CommandLineArguments::AddExcludeStrictNameFilter(int ac, const char** av, i nameFilters_= nameFilter->add(nameFilters_); } -void CommandLineArguments::AddTestToRunBasedOnVerboseOutput(int ac, const char** av, int& index, const char* parameterName) +void CommandLineArguments::AddTestToRunBasedOnVerboseOutput(int ac, const char *const *av, int& index, const char* parameterName) { SimpleString wholename = getParameterField(ac, av, index, parameterName); SimpleString testname = wholename.subStringFromTill(',', ')'); @@ -227,7 +227,7 @@ void CommandLineArguments::AddTestToRunBasedOnVerboseOutput(int ac, const char** nameFilters_ = namefilter->add(nameFilters_); } -void CommandLineArguments::SetPackageName(int ac, const char** av, int& i) +void CommandLineArguments::SetPackageName(int ac, const char *const *av, int& i) { SimpleString packageName = getParameterField(ac, av, i, "-k"); if (packageName.size() == 0) return; @@ -235,7 +235,7 @@ void CommandLineArguments::SetPackageName(int ac, const char** av, int& i) packageName_ = packageName; } -bool CommandLineArguments::SetOutputType(int ac, const char** av, int& i) +bool CommandLineArguments::SetOutputType(int ac, const char *const *av, int& i) { SimpleString outputType = getParameterField(ac, av, i, "-o"); if (outputType.size() == 0) return false; diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 43d2dec5c..db7df7fba 100755 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -34,10 +34,10 @@ int CommandLineTestRunner::RunAllTests(int ac, char** av) { - return RunAllTests(ac, (const char**) av); + return RunAllTests(ac, (const char *const *) av); } -int CommandLineTestRunner::RunAllTests(int ac, const char** av) +int CommandLineTestRunner::RunAllTests(int ac, const char *const *av) { int result = 0; ConsoleTestOutput backupOutput; @@ -58,7 +58,7 @@ int CommandLineTestRunner::RunAllTests(int ac, const char** av) return result; } -CommandLineTestRunner::CommandLineTestRunner(int ac, const char** av, TestRegistry* registry) : +CommandLineTestRunner::CommandLineTestRunner(int ac, const char *const *av, TestRegistry* registry) : output_(NULL), arguments_(NULL), registry_(registry) { arguments_ = new CommandLineArguments(ac, av); diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index 19cab29c9..da1d8f465 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -30,7 +30,7 @@ #include "CppUTest/PlatformSpecificFunctions.h" #include "CppUTest/SimpleMutex.h" -#define UNKNOWN ((char*)("")) +static const char* UNKNOWN = ""; SimpleStringBuffer::SimpleStringBuffer() : positions_filled_(0), write_limit_(SIMPLE_STRING_BUFFER_LEN-1) diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 01fe53ec3..9b61e1d03 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -150,7 +150,7 @@ static void* threadsafe_mem_leak_operator_new_nothrow (size_t size) UT_NOTHROW static void* threadsafe_mem_leak_operator_new_debug (size_t size, const char* file, int line) UT_THROW(std::bad_alloc) { MemLeakScopedMutex lock; - void *memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size, (char*) file, line); + void *memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size, file, line); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); return memory; } @@ -172,7 +172,7 @@ static void* threadsafe_mem_leak_operator_new_array_nothrow (size_t size) UT_NOT static void* threadsafe_mem_leak_operator_new_array_debug (size_t size, const char* file, int line) UT_THROW(std::bad_alloc) { MemLeakScopedMutex lock; - void* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, (char*) file, line); + void* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, file, line); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); return memory; } @@ -206,7 +206,7 @@ static void* mem_leak_operator_new_nothrow (size_t size) UT_NOTHROW static void* mem_leak_operator_new_debug (size_t size, const char* file, int line) UT_THROW(std::bad_alloc) { - void *memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size, (char*) file, line); + void *memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size, file, line); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); return memory; } @@ -225,7 +225,7 @@ static void* mem_leak_operator_new_array_nothrow (size_t size) UT_NOTHROW static void* mem_leak_operator_new_array_debug (size_t size, const char* file, int line) UT_THROW(std::bad_alloc) { - void* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, (char*) file, line); + void* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, file, line); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); return memory; } diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 5c47e58c2..3837a202c 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -84,7 +84,7 @@ int SimpleString::StrCmp(const char* s1, const char* s2) ++s1; ++s2; } - return *(unsigned char *) s1 - *(unsigned char *) s2; + return *(const unsigned char *) s1 - *(const unsigned char *) s2; } size_t SimpleString::StrLen(const char* str) @@ -101,7 +101,7 @@ int SimpleString::StrNCmp(const char* s1, const char* s2, size_t n) ++s1; ++s2; } - return n ? *(unsigned char *) s1 - *(unsigned char *) s2 : 0; + return n ? *(const unsigned char *) s1 - *(const unsigned char *) s2 : 0; } char* SimpleString::StrNCpy(char* s1, const char* s2, size_t n) @@ -115,12 +115,12 @@ char* SimpleString::StrNCpy(char* s1, const char* s2, size_t n) return result; } -char* SimpleString::StrStr(const char* s1, const char* s2) +const char* SimpleString::StrStr(const char* s1, const char* s2) { - if(!*s2) return (char*) s1; + if(!*s2) return s1; for (; *s1; s1++) if (StrNCmp(s1, s2, StrLen(s2)) == 0) - return (char*) s1; + return s1; return NULL; } @@ -211,7 +211,7 @@ bool SimpleString::endsWith(const SimpleString& other) const size_t SimpleString::count(const SimpleString& substr) const { size_t num = 0; - char* str = buffer_; + const char* str = buffer_; while (*str && (str = StrStr(str, substr.buffer_))) { num++; str++; @@ -225,8 +225,8 @@ void SimpleString::split(const SimpleString& delimiter, SimpleStringCollection& size_t extraEndToken = (endsWith(delimiter)) ? 0 : 1U; col.allocate(num + extraEndToken); - char* str = buffer_; - char* prev; + const char* str = buffer_; + const char* prev; for (size_t i = 0; i < num; ++i) { prev = str; str = StrStr(str, delimiter.buffer_) + 1; diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 28f77adc0..31d3ea5e7 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -149,17 +149,17 @@ void TestMemoryAllocator::free_memory(char* memory, const char*, int) { PlatformSpecificFree(memory); } -const char* TestMemoryAllocator::name() +const char* TestMemoryAllocator::name() const { return name_; } -const char* TestMemoryAllocator::alloc_name() +const char* TestMemoryAllocator::alloc_name() const { return alloc_name_; } -const char* TestMemoryAllocator::free_name() +const char* TestMemoryAllocator::free_name() const { return free_name_; } diff --git a/src/CppUTest/TestPlugin.cpp b/src/CppUTest/TestPlugin.cpp index 9f83fee28..d850dab6f 100644 --- a/src/CppUTest/TestPlugin.cpp +++ b/src/CppUTest/TestPlugin.cpp @@ -62,10 +62,10 @@ void TestPlugin::runAllPostTestAction(UtestShell& test, TestResult& result) bool TestPlugin::parseAllArguments(int ac, char** av, int index) { - return parseAllArguments(ac, const_cast (av), index); + return parseAllArguments(ac, const_cast (av), index); } -bool TestPlugin::parseAllArguments(int ac, const char** av, int index) +bool TestPlugin::parseAllArguments(int ac, const char *const *av, int index) { if (parseArguments(ac, av, index)) return true; if (next_) return next_->parseAllArguments(ac, av, index); diff --git a/src/CppUTestExt/MemoryReportAllocator.cpp b/src/CppUTestExt/MemoryReportAllocator.cpp index 30c27c1cf..87fb0e7ad 100644 --- a/src/CppUTestExt/MemoryReportAllocator.cpp +++ b/src/CppUTestExt/MemoryReportAllocator.cpp @@ -37,17 +37,17 @@ MemoryReportAllocator::~MemoryReportAllocator() { } -const char* MemoryReportAllocator::name() +const char* MemoryReportAllocator::name() const { return realAllocator_->name(); } -const char* MemoryReportAllocator::alloc_name() +const char* MemoryReportAllocator::alloc_name() const { return realAllocator_->alloc_name(); } -const char* MemoryReportAllocator::free_name() +const char* MemoryReportAllocator::free_name() const { return realAllocator_->free_name(); } diff --git a/src/CppUTestExt/MemoryReporterPlugin.cpp b/src/CppUTestExt/MemoryReporterPlugin.cpp index e4206e004..8429c2f4d 100644 --- a/src/CppUTestExt/MemoryReporterPlugin.cpp +++ b/src/CppUTestExt/MemoryReporterPlugin.cpp @@ -41,7 +41,7 @@ MemoryReporterPlugin::~MemoryReporterPlugin() destroyMemoryFormatter(formatter_); } -bool MemoryReporterPlugin::parseArguments(int /* ac */, const char** av, int index) +bool MemoryReporterPlugin::parseArguments(int /* ac */, const char *const *av, int index) { SimpleString argument (av[index]); if (argument.contains("-pmemoryreport=")) { diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index b6dc18ab2..728146928 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -455,7 +455,7 @@ MockSupport* MockSupport::getMockSupportScope(const SimpleString& name) if (hasData(mockingSupportName)) { STRCMP_EQUAL("MockSupport", getData(mockingSupportName).getType().asCharString()); - return (MockSupport*) getData(mockingSupportName).getObjectPointer(); + return static_cast( const_cast( getData(mockingSupportName).getObjectPointer() ) ); } MockSupport *newMock = clone(name); @@ -467,7 +467,7 @@ MockSupport* MockSupport::getMockSupportScope(const SimpleString& name) MockSupport* MockSupport::getMockSupport(MockNamedValueListNode* node) { if (node->getType() == "MockSupport" && node->getName().contains(MOCK_SUPPORT_SCOPE_PREFIX)) - return (MockSupport*) node->item()->getObjectPointer(); + return static_cast( const_cast( node->item()->getObjectPointer() ) ); return NULL; } diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 7e4e60d09..09b0dd999 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -199,6 +199,9 @@ const char* (*GetPlatformSpecificTimeString)() = TimeStringImplementation; #pragma clang diagnostic ignored "-Wformat-nonliteral" #endif +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wused-but-marked-unused" +#endif int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_list va_args_list) = vsnprintf; static PlatformSpecificFile PlatformSpecificFOpenImplementation(const char* filename, const char* flag) diff --git a/tests/CppUTest/AllTests.cpp b/tests/CppUTest/AllTests.cpp index fefa35f36..096df5a21 100644 --- a/tests/CppUTest/AllTests.cpp +++ b/tests/CppUTest/AllTests.cpp @@ -27,12 +27,12 @@ #include "CppUTest/CommandLineTestRunner.h" -int main(int ac, const char** av) +int main(int ac, char **av) { /* These checks are here to make sure assertions outside test runs don't crash */ CHECK(true); LONGS_EQUAL(1, 1); - return CommandLineTestRunner::RunAllTests(ac, const_cast(av)); /* cover alternate method */ + return CommandLineTestRunner::RunAllTests(ac, av); /* cover alternate method */ } diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index c2d5dd537..d56d148ee 100755 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -39,7 +39,7 @@ class OptionsPlugin: public TestPlugin ~OptionsPlugin() { } - bool parseArguments(int /*ac*/, const char** /*av*/, int /*index*/) + bool parseArguments(int /*ac*/, const char *const * /*av*/, int /*index*/) { return true; } @@ -61,7 +61,7 @@ TEST_GROUP(CommandLineArguments) delete plugin; } - bool newArgumentParser(int argc, const char** argv) + bool newArgumentParser(int argc, const char *const *argv) { args = new CommandLineArguments(argc, argv); return args->parse(plugin); diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index 722739acd..9db99a532 100755 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -47,7 +47,7 @@ class DummyPluginWhichCountsThePlugins : public TestPlugin { } - virtual bool parseArguments(int, const char**, int) + virtual bool parseArguments(int, const char *const *, int) { /* Remove ourselves from the count */ amountOfPlugins = registry_->countPlugins() - 1; @@ -64,7 +64,7 @@ class CommandLineTestRunnerWithStringBufferOutput : public CommandLineTestRunner StringBufferTestOutput* fakeConsoleOutputWhichIsReallyABuffer; StringBufferTestOutput* fakeTCOutputWhichIsReallyABuffer; - CommandLineTestRunnerWithStringBufferOutput(int argc, const char** argv, TestRegistry* registry) + CommandLineTestRunnerWithStringBufferOutput(int argc, const char *const *argv, TestRegistry* registry) : CommandLineTestRunner(argc, argv, registry), fakeJUnitOutputWhichIsReallyABuffer_(NULL), fakeConsoleOutputWhichIsReallyABuffer(NULL), fakeTCOutputWhichIsReallyABuffer(NULL) {} diff --git a/tests/CppUTest/PluginTest.cpp b/tests/CppUTest/PluginTest.cpp index cf1dba5ab..7a1495e1e 100644 --- a/tests/CppUTest/PluginTest.cpp +++ b/tests/CppUTest/PluginTest.cpp @@ -70,7 +70,7 @@ class DummyPluginWhichAcceptsParameters: public DummyPlugin { } - virtual bool parseArguments(int ac, const char** av, int index) + virtual bool parseArguments(int ac, const char *const *av, int index) { SimpleString argument (av[index]); if (argument == "-paccept") diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index af6889615..3a8d61270 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -38,11 +38,11 @@ class JustUseNewStringAllocator : public TestMemoryAllocator char* alloc_memory(size_t size, const char* file, int line) { - return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, (char*) file, line); + return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, file, line); } void free_memory(char* str, const char* file, int line) { - MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(getCurrentNewArrayAllocator(), str, (char*) file, line); + MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(getCurrentNewArrayAllocator(), str, file, line); } }; diff --git a/tests/CppUTestExt/AllTests.cpp b/tests/CppUTestExt/AllTests.cpp index 5ca0bf79f..8f13e8551 100644 --- a/tests/CppUTestExt/AllTests.cpp +++ b/tests/CppUTestExt/AllTests.cpp @@ -34,7 +34,7 @@ #include "CppUTestExt/GTestConvertor.h" #endif -int main(int ac, const char** av) +int main(int ac, const char *const *av) { #ifdef CPPUTEST_INCLUDE_GTEST_TESTS GTestConvertor convertor; diff --git a/tests/CppUTestExt/MemoryReporterPluginTest.cpp b/tests/CppUTestExt/MemoryReporterPluginTest.cpp index caf185a95..f352a4882 100644 --- a/tests/CppUTestExt/MemoryReporterPluginTest.cpp +++ b/tests/CppUTestExt/MemoryReporterPluginTest.cpp @@ -106,11 +106,11 @@ class TestMemoryAllocatorComparator : public MockNamedValueComparator public: bool isEqual(const void* object1, const void* object2) { - return ((TestMemoryAllocator*)object1)->name() == ((TestMemoryAllocator*)object2)->name(); + return ((const TestMemoryAllocator*)object1)->name() == ((const TestMemoryAllocator*)object2)->name(); } SimpleString valueToString(const void* object) { - return ((TestMemoryAllocator*)object)->name(); + return ((const TestMemoryAllocator*)object)->name(); } }; diff --git a/tests/CppUTestExt/MockComparatorCopierTest.cpp b/tests/CppUTestExt/MockComparatorCopierTest.cpp index 89bf01494..d17746084 100644 --- a/tests/CppUTestExt/MockComparatorCopierTest.cpp +++ b/tests/CppUTestExt/MockComparatorCopierTest.cpp @@ -117,12 +117,12 @@ TEST(MockComparatorCopierTest, customObjectParameterSucceeds) static bool myTypeIsEqual(const void* object1, const void* object2) { - return ((MyTypeForTesting*)object1)->value == ((MyTypeForTesting*)object2)->value; + return ((const MyTypeForTesting*)object1)->value == ((const MyTypeForTesting*)object2)->value; } static SimpleString myTypeValueToString(const void* object) { - return StringFrom(((MyTypeForTesting*)object)->value); + return StringFrom(((const MyTypeForTesting*)object)->value); } TEST(MockComparatorCopierTest, customObjectWithFunctionComparator) diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index f409e9a65..d7e79ee56 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -116,7 +116,7 @@ extern "C"{ static void typeCopy(void* dst, const void* src) { - *(int*) dst = *(int*) src; + *(int*) dst = *(const int*) src; } } From 07233f98ace0f61ba23f9a1cf40867447db86cca Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Tue, 20 Feb 2018 08:28:34 +0100 Subject: [PATCH 0161/1093] Fix all the warnings detected by clang 5.0.0 in C++11 mode --- appveyor.yml | 4 ++ include/CppUTest/CppUTestConfig.h | 10 +++++ include/CppUTest/JUnitTestOutput.h | 2 +- include/CppUTest/MemoryLeakDetector.h | 4 +- include/CppUTest/MemoryLeakWarningPlugin.h | 4 +- include/CppUTest/TeamCityTestOutput.h | 2 +- include/CppUTest/TestOutput.h | 4 +- include/CppUTest/TestTestingFixture.h | 2 +- include/CppUTest/Utest.h | 10 ++--- include/CppUTest/UtestMacros.h | 44 +++++++++---------- .../CppUTestExt/CodeMemoryReportFormatter.h | 2 +- include/CppUTestExt/MemoryReportAllocator.h | 2 +- include/CppUTestExt/MemoryReportFormatter.h | 2 +- include/CppUTestExt/MemoryReporterPlugin.h | 2 +- include/CppUTestExt/MockCheckedActualCall.h | 12 ++--- include/CppUTestExt/MockCheckedExpectedCall.h | 2 +- include/CppUTestExt/MockExpectedCallsList.h | 2 +- include/CppUTestExt/MockSupport.h | 2 +- include/CppUTestExt/MockSupportPlugin.h | 2 +- src/CppUTest/CommandLineArguments.cpp | 2 +- src/CppUTest/CommandLineTestRunner.cpp | 4 +- src/CppUTest/JUnitTestOutput.cpp | 14 +++--- src/CppUTest/MemoryLeakDetector.cpp | 26 +++++------ src/CppUTest/MemoryLeakWarningPlugin.cpp | 14 +++--- src/CppUTest/SimpleString.cpp | 16 +++---- src/CppUTest/TeamCityTestOutput.cpp | 2 +- src/CppUTest/TestFilter.cpp | 6 +-- src/CppUTest/TestHarness_c.cpp | 30 ++++++------- src/CppUTest/TestMemoryAllocator.cpp | 26 +++++------ src/CppUTest/TestOutput.cpp | 2 +- src/CppUTest/TestPlugin.cpp | 4 +- src/CppUTest/TestRegistry.cpp | 18 ++++---- src/CppUTest/Utest.cpp | 42 +++++++++--------- src/CppUTestExt/CodeMemoryReportFormatter.cpp | 4 +- src/CppUTestExt/MemoryReportAllocator.cpp | 2 +- src/CppUTestExt/MemoryReporterPlugin.cpp | 10 ++--- src/CppUTestExt/MockActualCall.cpp | 18 ++++---- src/CppUTestExt/MockExpectedCall.cpp | 12 ++--- src/CppUTestExt/MockExpectedCallsList.cpp | 40 ++++++++--------- src/CppUTestExt/MockNamedValue.cpp | 22 +++++----- src/CppUTestExt/MockSupport.cpp | 18 ++++---- src/CppUTestExt/MockSupportPlugin.cpp | 2 +- src/CppUTestExt/MockSupport_c.cpp | 16 +++---- src/CppUTestExt/OrderedTest.cpp | 8 ++-- src/Platforms/Gcc/UtestPlatform.cpp | 4 +- tests/CppUTest/CommandLineArgumentsTest.cpp | 6 +-- tests/CppUTest/CommandLineTestRunnerTest.cpp | 10 ++--- tests/CppUTest/JUnitOutputTest.cpp | 24 +++++----- tests/CppUTest/MemoryLeakDetectorTest.cpp | 6 +-- tests/CppUTest/MemoryLeakWarningTest.cpp | 14 +++--- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 16 +++---- tests/CppUTest/PluginTest.cpp | 2 +- tests/CppUTest/SetPluginTest.cpp | 2 +- tests/CppUTest/SimpleMutexTest.cpp | 2 +- tests/CppUTest/SimpleStringTest.cpp | 26 +++++------ tests/CppUTest/TeamCityOutputTest.cpp | 2 +- tests/CppUTest/TestFailureTest.cpp | 16 +++---- tests/CppUTest/TestFilterTest.cpp | 10 ++--- tests/CppUTest/TestHarness_cTest.cpp | 30 ++++++------- tests/CppUTest/TestInstallerTest.cpp | 2 +- tests/CppUTest/TestMemoryAllocatorTest.cpp | 20 ++++----- tests/CppUTest/TestRegistryTest.cpp | 12 ++--- tests/CppUTest/TestUTestMacro.cpp | 20 ++++----- tests/CppUTest/TestUTestStringMacro.cpp | 20 ++++----- tests/CppUTest/UtestPlatformTest.cpp | 4 +- tests/CppUTest/UtestTest.cpp | 4 +- tests/CppUTestExt/CodeMemoryReporterTest.cpp | 2 +- .../CppUTestExt/ExpectedFunctionsListTest.cpp | 4 +- .../CppUTestExt/MemoryReporterPluginTest.cpp | 2 +- tests/CppUTestExt/MockActualCallTest.cpp | 20 ++++----- tests/CppUTestExt/MockExpectedCallTest.cpp | 26 +++++------ .../MockFailureReporterForTest.cpp | 2 +- tests/CppUTestExt/MockNamedValueTest.cpp | 4 +- tests/CppUTestExt/MockParameterTest.cpp | 12 ++--- tests/CppUTestExt/MockPluginTest.cpp | 8 ++-- tests/CppUTestExt/MockSupport_cTest.cpp | 8 ++-- tests/CppUTestExt/OrderedTestTest.cpp | 2 +- 77 files changed, 414 insertions(+), 400 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index f98221521..ddf85c442 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,6 +24,10 @@ environment: PlatformToolset: v90 - Platform: Win32 PlatformToolset: v100 + - Platform: Win32 + PlatformToolset: v110 + - Platform: Win32 + PlatformToolset: v120 - Platform: Win32 PlatformToolset: v140 - Platform: x64 diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 10ca99e1f..be9e331a3 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -267,8 +267,17 @@ typedef struct cpputest_ulonglong cpputest_ulonglong; #if defined(__cplusplus) && ((__cplusplus >= 201103L) || (defined(_MSC_VER) && (_MSC_VER >= 1600))) #define CPPUTEST_COMPILER_FULLY_SUPPORTS_CXX11 #define _override override +#define NULLPTR nullptr #else #define _override +#define NULLPTR NULL +#endif + +/* Visual C++ 11.0+ (2012+) supports the override keyword on destructors */ +#if defined(__cplusplus) && ((__cplusplus >= 201103L) || (defined(_MSC_VER) && (_MSC_VER >= 1700))) +#define _destructor_override override +#else +#define _destructor_override #endif /* MinGW-w64 prefers to act like Visual C++, but we want the ANSI behaviors instead */ @@ -279,4 +288,5 @@ typedef struct cpputest_ulonglong cpputest_ulonglong; #pragma clang diagnostic pop #endif + #endif diff --git a/include/CppUTest/JUnitTestOutput.h b/include/CppUTest/JUnitTestOutput.h index d2a349b31..6cd48f5a3 100644 --- a/include/CppUTest/JUnitTestOutput.h +++ b/include/CppUTest/JUnitTestOutput.h @@ -38,7 +38,7 @@ class JUnitTestOutput: public TestOutput { public: JUnitTestOutput(); - virtual ~JUnitTestOutput(); + virtual ~JUnitTestOutput() _destructor_override; virtual void printTestsStarted() _override; virtual void printTestsEnded(const TestResult& result) _override; diff --git a/include/CppUTest/MemoryLeakDetector.h b/include/CppUTest/MemoryLeakDetector.h index 48cb16ada..cd316a7e7 100644 --- a/include/CppUTest/MemoryLeakDetector.h +++ b/include/CppUTest/MemoryLeakDetector.h @@ -117,7 +117,7 @@ class MemoryLeakOutputStringBuffer struct MemoryLeakDetectorNode { MemoryLeakDetectorNode() : - size_(0), number_(0), memory_(0), file_(0), line_(0), allocator_(0), period_(mem_leak_period_enabled), next_(0) + size_(0), number_(0), memory_(NULLPTR), file_(NULLPTR), line_(0), allocator_(NULLPTR), period_(mem_leak_period_enabled), next_(NULLPTR) { } @@ -139,7 +139,7 @@ struct MemoryLeakDetectorNode struct MemoryLeakDetectorList { MemoryLeakDetectorList() : - head_(0) + head_(NULLPTR) {} void addNewNode(MemoryLeakDetectorNode* node); diff --git a/include/CppUTest/MemoryLeakWarningPlugin.h b/include/CppUTest/MemoryLeakWarningPlugin.h index efca7f74f..13156f0d2 100644 --- a/include/CppUTest/MemoryLeakWarningPlugin.h +++ b/include/CppUTest/MemoryLeakWarningPlugin.h @@ -42,8 +42,8 @@ class MemoryLeakFailure; class MemoryLeakWarningPlugin: public TestPlugin { public: - MemoryLeakWarningPlugin(const SimpleString& name, MemoryLeakDetector* localDetector = 0); - virtual ~MemoryLeakWarningPlugin(); + MemoryLeakWarningPlugin(const SimpleString& name, MemoryLeakDetector* localDetector = NULLPTR); + virtual ~MemoryLeakWarningPlugin() _destructor_override; virtual void preTestAction(UtestShell& test, TestResult& result) _override; virtual void postTestAction(UtestShell& test, TestResult& result) _override; diff --git a/include/CppUTest/TeamCityTestOutput.h b/include/CppUTest/TeamCityTestOutput.h index 76708b188..186d21867 100644 --- a/include/CppUTest/TeamCityTestOutput.h +++ b/include/CppUTest/TeamCityTestOutput.h @@ -8,7 +8,7 @@ class TeamCityTestOutput: public ConsoleTestOutput { public: TeamCityTestOutput(void); - virtual ~TeamCityTestOutput(void); + virtual ~TeamCityTestOutput(void) _destructor_override; virtual void printCurrentTestStarted(const UtestShell& test) _override; virtual void printCurrentTestEnded(const TestResult& res) _override; diff --git a/include/CppUTest/TestOutput.h b/include/CppUTest/TestOutput.h index 9f758acc5..d39ad7455 100644 --- a/include/CppUTest/TestOutput.h +++ b/include/CppUTest/TestOutput.h @@ -113,7 +113,7 @@ class ConsoleTestOutput: public TestOutput explicit ConsoleTestOutput() { } - virtual ~ConsoleTestOutput() + virtual ~ConsoleTestOutput() _destructor_override { } @@ -141,7 +141,7 @@ class StringBufferTestOutput: public TestOutput { } - virtual ~StringBufferTestOutput(); + virtual ~StringBufferTestOutput() _destructor_override; void printBuffer(const char* s) _override { diff --git a/include/CppUTest/TestTestingFixture.h b/include/CppUTest/TestTestingFixture.h index 53874dd09..76ce6225f 100755 --- a/include/CppUTest/TestTestingFixture.h +++ b/include/CppUTest/TestTestingFixture.h @@ -50,7 +50,7 @@ class TestTestingFixture virtual ~TestTestingFixture() { - registry_->setCurrentRegistry(0); + registry_->setCurrentRegistry(NULLPTR); delete registry_; delete result_; delete output_; diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 1c711047d..5f672b603 100755 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -70,14 +70,14 @@ class NormalTestTerminator : public TestTerminator { public: virtual void exitCurrentTest() const _override; - virtual ~NormalTestTerminator(); + virtual ~NormalTestTerminator() _destructor_override; }; class TestTerminatorWithoutExceptions : public TestTerminator { public: virtual void exitCurrentTest() const _override; - virtual ~TestTerminatorWithoutExceptions(); + virtual ~TestTerminatorWithoutExceptions() _destructor_override; }; //////////////////// UtestShell @@ -202,9 +202,9 @@ class ExecFunctionTestShell: public UtestShell void (*teardown_)(); void (*testFunction_)(); - ExecFunctionTestShell(void(*set)() = 0, void(*tear)() = 0) : + ExecFunctionTestShell(void(*set)() = NULLPTR, void(*tear)() = NULLPTR) : UtestShell("Generic", "Generic", "Generic", 1), setup_(set), teardown_( - tear), testFunction_(0) + tear), testFunction_(NULLPTR) { } Utest* createTest() { return new ExecFunctionTest(this); } @@ -225,7 +225,7 @@ class IgnoredUtestShell : public UtestShell { public: IgnoredUtestShell(); - virtual ~IgnoredUtestShell(); + virtual ~IgnoredUtestShell() _destructor_override; explicit IgnoredUtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber); virtual bool willRun() const _override; diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 8b4fa8a1b..7a571be4f 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -99,32 +99,32 @@ // Different checking macros #define CHECK(condition)\ - CHECK_TRUE_LOCATION(condition, "CHECK", #condition, NULL, __FILE__, __LINE__) + CHECK_TRUE_LOCATION(condition, "CHECK", #condition, NULLPTR, __FILE__, __LINE__) #define CHECK_TEXT(condition, text) \ CHECK_TRUE_LOCATION(condition, "CHECK", #condition, text, __FILE__, __LINE__) #define CHECK_TRUE(condition)\ - CHECK_TRUE_LOCATION(condition, "CHECK_TRUE", #condition, NULL, __FILE__, __LINE__) + CHECK_TRUE_LOCATION(condition, "CHECK_TRUE", #condition, NULLPTR, __FILE__, __LINE__) #define CHECK_TRUE_TEXT(condition, text)\ CHECK_TRUE_LOCATION(condition, "CHECK_TRUE", #condition, text, __FILE__, __LINE__) #define CHECK_FALSE(condition)\ - CHECK_FALSE_LOCATION(condition, "CHECK_FALSE", #condition, NULL, __FILE__, __LINE__) + CHECK_FALSE_LOCATION(condition, "CHECK_FALSE", #condition, NULLPTR, __FILE__, __LINE__) #define CHECK_FALSE_TEXT(condition, text)\ CHECK_FALSE_LOCATION(condition, "CHECK_FALSE", #condition, text, __FILE__, __LINE__) #define CHECK_TRUE_LOCATION(condition, checkString, conditionString, text, file, line)\ - { UtestShell::getCurrent()->assertTrue((condition) != 0, checkString, conditionString, text, file, line); } + { UtestShell::getCurrent()->assertTrue((condition), checkString, conditionString, text, file, line); } #define CHECK_FALSE_LOCATION(condition, checkString, conditionString, text, file, line)\ - { UtestShell::getCurrent()->assertTrue((condition) == 0, checkString, conditionString, text, file, line); } + { UtestShell::getCurrent()->assertTrue(!(condition), checkString, conditionString, text, file, line); } //This check needs the operator!=(), and a StringFrom(YourType) function #define CHECK_EQUAL(expected, actual)\ - CHECK_EQUAL_LOCATION(expected, actual, NULL, __FILE__, __LINE__) + CHECK_EQUAL_LOCATION(expected, actual, NULLPTR, __FILE__, __LINE__) #define CHECK_EQUAL_TEXT(expected, actual, text)\ CHECK_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) @@ -139,11 +139,11 @@ } \ else \ { \ - UtestShell::getCurrent()->assertLongsEqual((long)0, (long)0, NULL, file, line); \ + UtestShell::getCurrent()->assertLongsEqual((long)0, (long)0, NULLPTR, file, line); \ } } #define CHECK_COMPARE(first, relop, second)\ - CHECK_COMPARE_TEXT(first, relop, second, NULL) + CHECK_COMPARE_TEXT(first, relop, second, NULLPTR) #define CHECK_COMPARE_TEXT(first, relop, second, text)\ CHECK_COMPARE_LOCATION(first, relop, second, text, __FILE__, __LINE__) @@ -159,7 +159,7 @@ //This check checks for char* string equality using strcmp. //This makes up for the fact that CHECK_EQUAL only compares the pointers to char*'s #define STRCMP_EQUAL(expected, actual)\ - STRCMP_EQUAL_LOCATION(expected, actual, NULL, __FILE__, __LINE__) + STRCMP_EQUAL_LOCATION(expected, actual, NULLPTR, __FILE__, __LINE__) #define STRCMP_EQUAL_TEXT(expected, actual, text)\ STRCMP_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) @@ -168,7 +168,7 @@ { UtestShell::getCurrent()->assertCstrEqual(expected, actual, text, file, line); } #define STRNCMP_EQUAL(expected, actual, length)\ - STRNCMP_EQUAL_LOCATION(expected, actual, length, NULL, __FILE__, __LINE__) + STRNCMP_EQUAL_LOCATION(expected, actual, length, NULLPTR, __FILE__, __LINE__) #define STRNCMP_EQUAL_TEXT(expected, actual, length, text)\ STRNCMP_EQUAL_LOCATION(expected, actual, length, text, __FILE__, __LINE__) @@ -177,7 +177,7 @@ { UtestShell::getCurrent()->assertCstrNEqual(expected, actual, length, text, file, line); } #define STRCMP_NOCASE_EQUAL(expected, actual)\ - STRCMP_NOCASE_EQUAL_LOCATION(expected, actual, NULL, __FILE__, __LINE__) + STRCMP_NOCASE_EQUAL_LOCATION(expected, actual, NULLPTR, __FILE__, __LINE__) #define STRCMP_NOCASE_EQUAL_TEXT(expected, actual, text)\ STRCMP_NOCASE_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) @@ -186,7 +186,7 @@ { UtestShell::getCurrent()->assertCstrNoCaseEqual(expected, actual, text, file, line); } #define STRCMP_CONTAINS(expected, actual)\ - STRCMP_CONTAINS_LOCATION(expected, actual, NULL, __FILE__, __LINE__) + STRCMP_CONTAINS_LOCATION(expected, actual, NULLPTR, __FILE__, __LINE__) #define STRCMP_CONTAINS_TEXT(expected, actual, text)\ STRCMP_CONTAINS_LOCATION(expected, actual, text, __FILE__, __LINE__) @@ -195,7 +195,7 @@ { UtestShell::getCurrent()->assertCstrContains(expected, actual, text, file, line); } #define STRCMP_NOCASE_CONTAINS(expected, actual)\ - STRCMP_NOCASE_CONTAINS_LOCATION(expected, actual, NULL, __FILE__, __LINE__) + STRCMP_NOCASE_CONTAINS_LOCATION(expected, actual, NULLPTR, __FILE__, __LINE__) #define STRCMP_NOCASE_CONTAINS_TEXT(expected, actual, text)\ STRCMP_NOCASE_CONTAINS_LOCATION(expected, actual, text, __FILE__, __LINE__) @@ -211,7 +211,7 @@ LONGS_EQUAL_LOCATION((expected), (actual), text, __FILE__, __LINE__) #define UNSIGNED_LONGS_EQUAL(expected, actual)\ - UNSIGNED_LONGS_EQUAL_LOCATION((expected), (actual), NULL, __FILE__, __LINE__) + UNSIGNED_LONGS_EQUAL_LOCATION((expected), (actual), NULLPTR, __FILE__, __LINE__) #define UNSIGNED_LONGS_EQUAL_TEXT(expected, actual, text)\ UNSIGNED_LONGS_EQUAL_LOCATION((expected), (actual), text, __FILE__, __LINE__) @@ -223,13 +223,13 @@ { UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, text, file, line); } #define LONGLONGS_EQUAL(expected, actual)\ - LONGLONGS_EQUAL_LOCATION(expected, actual, NULL, __FILE__, __LINE__) + LONGLONGS_EQUAL_LOCATION(expected, actual, NULLPTR, __FILE__, __LINE__) #define LONGLONGS_EQUAL_TEXT(expected, actual, text)\ LONGLONGS_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) #define UNSIGNED_LONGLONGS_EQUAL(expected, actual)\ - UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, NULL, __FILE__, __LINE__) + UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, NULLPTR, __FILE__, __LINE__) #define UNSIGNED_LONGLONGS_EQUAL_TEXT(expected, actual, text)\ UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) @@ -250,7 +250,7 @@ SIGNED_BYTES_EQUAL_LOCATION(expected, actual, __FILE__, __LINE__) #define SIGNED_BYTES_EQUAL_LOCATION(expected, actual, file, line) \ - { UtestShell::getCurrent()->assertSignedBytesEqual(expected, actual, NULL, file, line); } + { UtestShell::getCurrent()->assertSignedBytesEqual(expected, actual, NULLPTR, file, line); } #define SIGNED_BYTES_EQUAL_TEXT(expected, actual, text)\ SIGNED_BYTES_EQUAL_TEXT_LOCATION(expected, actual, text, __FILE__, __LINE__) @@ -259,7 +259,7 @@ { UtestShell::getCurrent()->assertSignedBytesEqual(expected, actual, text, file, line); } #define POINTERS_EQUAL(expected, actual)\ - POINTERS_EQUAL_LOCATION((expected), (actual), NULL, __FILE__, __LINE__) + POINTERS_EQUAL_LOCATION((expected), (actual), NULLPTR, __FILE__, __LINE__) #define POINTERS_EQUAL_TEXT(expected, actual, text)\ POINTERS_EQUAL_LOCATION((expected), (actual), text, __FILE__, __LINE__) @@ -268,7 +268,7 @@ { UtestShell::getCurrent()->assertPointersEqual((const void *)expected, (const void *)actual, text, file, line); } #define FUNCTIONPOINTERS_EQUAL(expected, actual)\ - FUNCTIONPOINTERS_EQUAL_LOCATION((expected), (actual), NULL, __FILE__, __LINE__) + FUNCTIONPOINTERS_EQUAL_LOCATION((expected), (actual), NULLPTR, __FILE__, __LINE__) #define FUNCTIONPOINTERS_EQUAL_TEXT(expected, actual, text)\ FUNCTIONPOINTERS_EQUAL_LOCATION((expected), (actual), text, __FILE__, __LINE__) @@ -278,7 +278,7 @@ //Check two doubles for equality within a tolerance threshold #define DOUBLES_EQUAL(expected, actual, threshold)\ - DOUBLES_EQUAL_LOCATION(expected, actual, threshold, NULL, __FILE__, __LINE__) + DOUBLES_EQUAL_LOCATION(expected, actual, threshold, NULLPTR, __FILE__, __LINE__) #define DOUBLES_EQUAL_TEXT(expected, actual, threshold, text)\ DOUBLES_EQUAL_LOCATION(expected, actual, threshold, text, __FILE__, __LINE__) @@ -287,7 +287,7 @@ { UtestShell::getCurrent()->assertDoublesEqual(expected, actual, threshold, text, file, line); } #define MEMCMP_EQUAL(expected, actual, size)\ - MEMCMP_EQUAL_LOCATION(expected, actual, size, NULL, __FILE__, __LINE__) + MEMCMP_EQUAL_LOCATION(expected, actual, size, NULLPTR, __FILE__, __LINE__) #define MEMCMP_EQUAL_TEXT(expected, actual, size, text)\ MEMCMP_EQUAL_LOCATION(expected, actual, size, text, __FILE__, __LINE__) @@ -296,7 +296,7 @@ { UtestShell::getCurrent()->assertBinaryEqual(expected, actual, size, text, file, line); } #define BITS_EQUAL(expected, actual, mask)\ - BITS_LOCATION(expected, actual, mask, NULL, __FILE__, __LINE__) + BITS_LOCATION(expected, actual, mask, NULLPTR, __FILE__, __LINE__) #define BITS_EQUAL_TEXT(expected, actual, mask, text)\ BITS_LOCATION(expected, actual, mask, text, __FILE__, __LINE__) diff --git a/include/CppUTestExt/CodeMemoryReportFormatter.h b/include/CppUTestExt/CodeMemoryReportFormatter.h index f73c2ac12..dcb4b8e75 100644 --- a/include/CppUTestExt/CodeMemoryReportFormatter.h +++ b/include/CppUTestExt/CodeMemoryReportFormatter.h @@ -39,7 +39,7 @@ class CodeMemoryReportFormatter : public MemoryReportFormatter public: CodeMemoryReportFormatter(TestMemoryAllocator* internalAllocator); - virtual ~CodeMemoryReportFormatter(); + virtual ~CodeMemoryReportFormatter() _destructor_override; virtual void report_testgroup_start(TestResult* result, UtestShell& test) _override; virtual void report_testgroup_end(TestResult* /*result*/, UtestShell& /*test*/) _override {} // LCOV_EXCL_LINE diff --git a/include/CppUTestExt/MemoryReportAllocator.h b/include/CppUTestExt/MemoryReportAllocator.h index ce5473e6b..649a648e8 100644 --- a/include/CppUTestExt/MemoryReportAllocator.h +++ b/include/CppUTestExt/MemoryReportAllocator.h @@ -40,7 +40,7 @@ class MemoryReportAllocator : public TestMemoryAllocator MemoryReportFormatter* formatter_; public: MemoryReportAllocator(); - virtual ~MemoryReportAllocator(); + virtual ~MemoryReportAllocator() _destructor_override; virtual void setFormatter(MemoryReportFormatter* formatter); virtual void setTestResult(TestResult* result); diff --git a/include/CppUTestExt/MemoryReportFormatter.h b/include/CppUTestExt/MemoryReportFormatter.h index 750265b02..2857bd9ef 100644 --- a/include/CppUTestExt/MemoryReportFormatter.h +++ b/include/CppUTestExt/MemoryReportFormatter.h @@ -50,7 +50,7 @@ class NormalMemoryReportFormatter : public MemoryReportFormatter { public: NormalMemoryReportFormatter(); - virtual ~NormalMemoryReportFormatter(); + virtual ~NormalMemoryReportFormatter() _destructor_override; virtual void report_testgroup_start(TestResult* /*result*/, UtestShell& /*test*/) _override; virtual void report_testgroup_end(TestResult* /*result*/, UtestShell& /*test*/) _override {} // LCOV_EXCL_LINE diff --git a/include/CppUTestExt/MemoryReporterPlugin.h b/include/CppUTestExt/MemoryReporterPlugin.h index 5886dba23..78d4729df 100644 --- a/include/CppUTestExt/MemoryReporterPlugin.h +++ b/include/CppUTestExt/MemoryReporterPlugin.h @@ -44,7 +44,7 @@ class MemoryReporterPlugin : public TestPlugin SimpleString currentTestGroup_; public: MemoryReporterPlugin(); - virtual ~MemoryReporterPlugin(); + virtual ~MemoryReporterPlugin() _destructor_override; virtual void preTestAction(UtestShell & test, TestResult & result) _override; virtual void postTestAction(UtestShell & test, TestResult & result) _override; diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index 420929d1b..a629ac446 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -35,7 +35,7 @@ class MockCheckedActualCall : public MockActualCall { public: MockCheckedActualCall(unsigned int callOrder, MockFailureReporter* reporter, const MockExpectedCallsList& expectations); - virtual ~MockCheckedActualCall(); + virtual ~MockCheckedActualCall() _destructor_override; virtual MockActualCall& withName(const SimpleString& name) _override; virtual MockActualCall& withCallOrder(unsigned int) _override; @@ -135,7 +135,7 @@ class MockCheckedActualCall : public MockActualCall MockOutputParametersListNode* next_; MockOutputParametersListNode(const SimpleString& name, const SimpleString& type, void* ptr) - : name_(name), type_(type), ptr_(ptr), next_(NULL) {} + : name_(name), type_(type), ptr_(ptr), next_(NULLPTR) {} }; MockOutputParametersListNode* outputParameterExpectations_; @@ -148,7 +148,7 @@ class MockActualCallTrace : public MockActualCall { public: MockActualCallTrace(); - virtual ~MockActualCallTrace(); + virtual ~MockActualCallTrace() _destructor_override; virtual MockActualCall& withName(const SimpleString& name) _override; virtual MockActualCall& withCallOrder(unsigned int) _override; @@ -256,13 +256,13 @@ class MockIgnoredActualCall: public MockActualCall virtual const char * returnStringValue() _override { return ""; } virtual const char * returnStringValueOrDefault(const char * value) _override { return value; } - virtual void * returnPointerValue() _override { return NULL; } + virtual void * returnPointerValue() _override { return NULLPTR; } virtual void * returnPointerValueOrDefault(void * value) _override { return value; } - virtual const void * returnConstPointerValue() _override { return NULL; } + virtual const void * returnConstPointerValue() _override { return NULLPTR; } virtual const void * returnConstPointerValueOrDefault(const void * value) _override { return value; } - virtual void (*returnFunctionPointerValue())() _override { return NULL; } + virtual void (*returnFunctionPointerValue())() _override { return NULLPTR; } virtual void (*returnFunctionPointerValueOrDefault(void (*value)()))() _override { return value; } virtual MockActualCall& onObject(const void* ) _override { return *this; } diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index deccb0813..f932ff1df 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -37,7 +37,7 @@ class MockCheckedExpectedCall : public MockExpectedCall public: MockCheckedExpectedCall(); MockCheckedExpectedCall(unsigned int numCalls); - virtual ~MockCheckedExpectedCall(); + virtual ~MockCheckedExpectedCall() _destructor_override; virtual MockExpectedCall& withName(const SimpleString& name) _override; virtual MockExpectedCall& withCallOrder(unsigned int callOrder) _override { return withCallOrder(callOrder, callOrder); } diff --git a/include/CppUTestExt/MockExpectedCallsList.h b/include/CppUTestExt/MockExpectedCallsList.h index 94723890d..74c920dee 100644 --- a/include/CppUTestExt/MockExpectedCallsList.h +++ b/include/CppUTestExt/MockExpectedCallsList.h @@ -87,7 +87,7 @@ class MockExpectedCallsList MockExpectedCallsListNode* next_; MockExpectedCallsListNode(MockCheckedExpectedCall* expectedCall) - : expectedCall_(expectedCall), next_(NULL) {} + : expectedCall_(expectedCall), next_(NULLPTR) {} }; private: diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index ea900e5af..aa973b8b9 100755 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -37,7 +37,7 @@ class UtestShell; class MockSupport; /* This allows access to "the global" mocking support for easier testing */ -MockSupport& mock(const SimpleString& mockName = "", MockFailureReporter* failureReporterForThisCall = NULL); +MockSupport& mock(const SimpleString& mockName = "", MockFailureReporter* failureReporterForThisCall = NULLPTR); class MockSupport { diff --git a/include/CppUTestExt/MockSupportPlugin.h b/include/CppUTestExt/MockSupportPlugin.h index 3ccd18ab4..38c1e9274 100644 --- a/include/CppUTestExt/MockSupportPlugin.h +++ b/include/CppUTestExt/MockSupportPlugin.h @@ -35,7 +35,7 @@ class MockSupportPlugin : public TestPlugin { public: MockSupportPlugin(const SimpleString& name = "MockSupportPLugin"); - virtual ~MockSupportPlugin(); + virtual ~MockSupportPlugin() _destructor_override; virtual void preTestAction(UtestShell&, TestResult&) _override; virtual void postTestAction(UtestShell&, TestResult&) _override; diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 72b190b40..6e120e3fd 100755 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -30,7 +30,7 @@ #include "CppUTest/PlatformSpecificFunctions.h" CommandLineArguments::CommandLineArguments(int ac, const char *const *av) : - ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), repeat_(1), groupFilters_(NULL), nameFilters_(NULL), outputType_(OUTPUT_ECLIPSE) + ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), repeat_(1), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) { } diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index db7df7fba..d2f81a857 100755 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -59,7 +59,7 @@ int CommandLineTestRunner::RunAllTests(int ac, const char *const *av) } CommandLineTestRunner::CommandLineTestRunner(int ac, const char *const *av, TestRegistry* registry) : - output_(NULL), arguments_(NULL), registry_(registry) + output_(NULLPTR), arguments_(NULLPTR), registry_(registry) { arguments_ = new CommandLineArguments(ac, av); } @@ -134,7 +134,7 @@ TestOutput* CommandLineTestRunner::createTeamCityOutput() TestOutput* CommandLineTestRunner::createJUnitOutput(const SimpleString& packageName) { JUnitTestOutput* junitOutput = new JUnitTestOutput; - if (junitOutput != NULL) { + if (junitOutput != NULLPTR) { junitOutput->setPackageName(packageName); } return junitOutput; diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index 2b0a37a0c..bc3f6ed27 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -34,7 +34,7 @@ struct JUnitTestCaseResultNode { JUnitTestCaseResultNode() : - execTime_(0), failure_(0), ignored_(false), lineNumber_ (0), checkCount_ (0), next_(0) + execTime_(0), failure_(NULLPTR), ignored_(false), lineNumber_ (0), checkCount_ (0), next_(NULLPTR) { } @@ -51,7 +51,7 @@ struct JUnitTestCaseResultNode struct JUnitTestGroupResult { JUnitTestGroupResult() : - testCount_(0), failureCount_(0), totalCheckCount_(0), startTime_(0), groupExecTime_(0), head_(0), tail_(0) + testCount_(0), failureCount_(0), totalCheckCount_(0), startTime_(0), groupExecTime_(0), head_(NULLPTR), tail_(NULLPTR) { } @@ -97,8 +97,8 @@ void JUnitTestOutput::resetTestGroupResult() delete cur; cur = tmp; } - impl_->results_.head_ = 0; - impl_->results_.tail_ = 0; + impl_->results_.head_ = NULLPTR; + impl_->results_.tail_ = NULLPTR; } void JUnitTestOutput::printTestsStarted() @@ -133,7 +133,7 @@ void JUnitTestOutput::printCurrentTestStarted(const UtestShell& test) impl_->results_.group_ = test.getGroup(); impl_->results_.startTime_ = GetPlatformSpecificTimeInMillis(); - if (impl_->results_.tail_ == 0) { + if (impl_->results_.tail_ == NULLPTR) { impl_->results_.head_ = impl_->results_.tail_ = new JUnitTestCaseResultNode; } @@ -160,7 +160,7 @@ SimpleString JUnitTestOutput::createFileName(const SimpleString& group) void JUnitTestOutput::setPackageName(const SimpleString& package) { - if (impl_ != NULL) { + if (impl_ != NULLPTR) { impl_->package_ = package; } } @@ -277,7 +277,7 @@ void JUnitTestOutput::flush() void JUnitTestOutput::printFailure(const TestFailure& failure) { - if (impl_->results_.tail_->failure_ == 0) { + if (impl_->results_.tail_->failure_ == NULLPTR) { impl_->results_.failureCount_++; impl_->results_.tail_->failure_ = new TestFailure(failure); } diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index da1d8f465..10af4b919 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -273,7 +273,7 @@ bool MemoryLeakDetectorList::isInPeriod(MemoryLeakDetectorNode* node, MemLeakPer void MemoryLeakDetectorList::clearAllAccounting(MemLeakPeriod period) { MemoryLeakDetectorNode* cur = head_; - MemoryLeakDetectorNode* prev = 0; + MemoryLeakDetectorNode* prev = NULLPTR; while (cur) { if (isInPeriod(cur, period)) { @@ -301,7 +301,7 @@ void MemoryLeakDetectorList::addNewNode(MemoryLeakDetectorNode* node) MemoryLeakDetectorNode* MemoryLeakDetectorList::removeNode(char* memory) { MemoryLeakDetectorNode* cur = head_; - MemoryLeakDetectorNode* prev = 0; + MemoryLeakDetectorNode* prev = NULLPTR; while (cur) { if (cur->memory_ == memory) { if (prev) { @@ -316,7 +316,7 @@ MemoryLeakDetectorNode* MemoryLeakDetectorList::removeNode(char* memory) prev = cur; cur = cur->next_; } - return 0; + return NULLPTR; } MemoryLeakDetectorNode* MemoryLeakDetectorList::retrieveNode(char* memory) @@ -327,14 +327,14 @@ MemoryLeakDetectorNode* MemoryLeakDetectorList::retrieveNode(char* memory) return cur; cur = cur->next_; } - return NULL; + return NULLPTR; } MemoryLeakDetectorNode* MemoryLeakDetectorList::getLeakFrom(MemoryLeakDetectorNode* node, MemLeakPeriod period) { for (MemoryLeakDetectorNode* cur = node; cur; cur = cur->next_) if (isInPeriod(cur, period)) return cur; - return 0; + return NULLPTR; } MemoryLeakDetectorNode* MemoryLeakDetectorList::getFirstLeak(MemLeakPeriod period) @@ -398,7 +398,7 @@ MemoryLeakDetectorNode* MemoryLeakDetectorTable::getFirstLeak(MemLeakPeriod peri MemoryLeakDetectorNode* node = table_[i].getFirstLeak(period); if (node) return node; } - return 0; + return NULLPTR; } MemoryLeakDetectorNode* MemoryLeakDetectorTable::getNextLeak(MemoryLeakDetectorNode* leak, MemLeakPeriod period) @@ -411,7 +411,7 @@ MemoryLeakDetectorNode* MemoryLeakDetectorTable::getNextLeak(MemoryLeakDetectorN node = table_[i].getFirstLeak(period); if (node) return node; } - return 0; + return NULLPTR; } ///////////////////////////////////////////////////////////// @@ -504,7 +504,7 @@ void MemoryLeakDetector::storeLeakInformation(MemoryLeakDetectorNode * node, cha char* MemoryLeakDetector::reallocateMemoryAndLeakInformation(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, int line, bool allocatNodesSeperately) { char* new_memory = reallocateMemoryWithAccountingInformation(allocator, memory, size, file, line, allocatNodesSeperately); - if (new_memory == NULL) return NULL; + if (new_memory == NULLPTR) return NULLPTR; MemoryLeakDetectorNode *node = createMemoryLeakAccountingInformation(allocator, size, new_memory, allocatNodesSeperately); storeLeakInformation(node, new_memory, size, allocator, file, line); @@ -580,7 +580,7 @@ char* MemoryLeakDetector::allocMemory(TestMemoryAllocator* allocator, size_t siz */ char* memory = allocateMemoryWithAccountingInformation(allocator, size, file, line, allocatNodesSeperately); - if (memory == NULL) return NULL; + if (memory == NULLPTR) return NULLPTR; MemoryLeakDetectorNode* node = createMemoryLeakAccountingInformation(allocator, size, memory, allocatNodesSeperately); storeLeakInformation(node, memory, size, allocator, file, line); @@ -595,10 +595,10 @@ void MemoryLeakDetector::removeMemoryLeakInformationWithoutCheckingOrDeallocatin void MemoryLeakDetector::deallocMemory(TestMemoryAllocator* allocator, void* memory, const char* file, int line, bool allocatNodesSeperately) { - if (memory == 0) return; + if (memory == NULLPTR) return; MemoryLeakDetectorNode* node = memoryTable_.removeNode((char*) memory); - if (node == NULL) { + if (node == NULLPTR) { outputBuffer_.reportDeallocateNonAllocatedMemoryFailure(file, line, allocator, reporter_); return; } @@ -617,9 +617,9 @@ char* MemoryLeakDetector::reallocMemory(TestMemoryAllocator* allocator, char* me { if (memory) { MemoryLeakDetectorNode* node = memoryTable_.removeNode(memory); - if (node == NULL) { + if (node == NULLPTR) { outputBuffer_.reportDeallocateNonAllocatedMemoryFailure(file, line, allocator, reporter_); - return NULL; + return NULLPTR; } checkForCorruption(node, file, line, allocator, allocatNodesSeperately); } diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 9b61e1d03..748793741 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -128,7 +128,7 @@ void cpputest_free_location_with_leak_detection(void* buffer, const char* file, #undef new #if CPPUTEST_USE_STD_CPP_LIB -#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) if (memory == NULL) throw std::bad_alloc(); +#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) if (memory == NULLPTR) throw std::bad_alloc(); #else #define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) #endif @@ -475,12 +475,12 @@ class MemoryLeakWarningReporter: public MemoryLeakFailure } // LCOV_EXCL_LINE }; -static MemoryLeakFailure* globalReporter = 0; -static MemoryLeakDetector* globalDetector = 0; +static MemoryLeakFailure* globalReporter = NULLPTR; +static MemoryLeakDetector* globalDetector = NULLPTR; MemoryLeakDetector* MemoryLeakWarningPlugin::getGlobalDetector() { - if (globalDetector == 0) { + if (globalDetector == NULLPTR) { bool newDeleteOverloaded = areNewDeleteOverloaded(); turnOffNewDeleteOverloads(); @@ -513,11 +513,11 @@ void MemoryLeakWarningPlugin::destroyGlobalDetector() turnOffNewDeleteOverloads(); delete globalDetector; delete globalReporter; - globalDetector = NULL; + globalDetector = NULLPTR; } -MemoryLeakWarningPlugin* MemoryLeakWarningPlugin::firstPlugin_ = 0; +MemoryLeakWarningPlugin* MemoryLeakWarningPlugin::firstPlugin_ = NULLPTR; MemoryLeakWarningPlugin* MemoryLeakWarningPlugin::getFirstPlugin() { @@ -542,7 +542,7 @@ void MemoryLeakWarningPlugin::expectLeaksInTest(int n) MemoryLeakWarningPlugin::MemoryLeakWarningPlugin(const SimpleString& name, MemoryLeakDetector* localDetector) : TestPlugin(name), ignoreAllWarnings_(false), destroyGlobalDetectorAndTurnOfMemoryLeakDetectionInDestructor_(false), expectedLeaks_(0) { - if (firstPlugin_ == 0) firstPlugin_ = this; + if (firstPlugin_ == NULLPTR) firstPlugin_ = this; if (localDetector) memLeakDetector_ = localDetector; else memLeakDetector_ = getGlobalDetector(); diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 3837a202c..f7b7449b4 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -30,11 +30,11 @@ #include "CppUTest/PlatformSpecificFunctions.h" #include "CppUTest/TestMemoryAllocator.h" -TestMemoryAllocator* SimpleString::stringAllocator_ = NULL; +TestMemoryAllocator* SimpleString::stringAllocator_ = NULLPTR; TestMemoryAllocator* SimpleString::getStringAllocator() { - if (stringAllocator_ == NULL) + if (stringAllocator_ == NULLPTR) return defaultNewArrayAllocator(); return stringAllocator_; } @@ -108,7 +108,7 @@ char* SimpleString::StrNCpy(char* s1, const char* s2, size_t n) { char* result = s1; - if((NULL == s1) || (0 == n)) return result; + if((NULLPTR == s1) || (0 == n)) return result; while ((*s1++ = *s2++) && --n != 0) ; @@ -121,7 +121,7 @@ const char* SimpleString::StrStr(const char* s1, const char* s2) for (; *s1; s1++) if (StrNCmp(s1, s2, StrLen(s2)) == 0) return s1; - return NULL; + return NULLPTR; } char SimpleString::ToLower(char ch) @@ -146,7 +146,7 @@ int SimpleString::MemCmp(const void* s1, const void *s2, size_t n) SimpleString::SimpleString(const char *otherBuffer) { - if (otherBuffer == 0) { + if (otherBuffer == NULLPTR) { buffer_ = getEmptyString(); } else { @@ -183,7 +183,7 @@ SimpleString& SimpleString::operator=(const SimpleString& other) bool SimpleString::contains(const SimpleString& other) const { - return StrStr(buffer_, other.buffer_) != 0; + return StrStr(buffer_, other.buffer_) != NULLPTR; } bool SimpleString::containsNoCase(const SimpleString& other) const @@ -421,7 +421,7 @@ char* SimpleString::copyToNewBuffer(const char* bufferToCopy, size_t bufferSize) void SimpleString::copyToBuffer(char* bufferToCopy, size_t bufferSize) const { - if (bufferToCopy == NULL || bufferSize == 0) return; + if (bufferToCopy == NULLPTR || bufferSize == 0) return; size_t sizeToCopy = (bufferSize-1 < size()) ? (bufferSize-1) : size(); @@ -816,7 +816,7 @@ SimpleString StringFromOrdinalNumber(unsigned int number) SimpleStringCollection::SimpleStringCollection() { - collection_ = 0; + collection_ = NULLPTR; size_ = 0; } diff --git a/src/CppUTest/TeamCityTestOutput.cpp b/src/CppUTest/TeamCityTestOutput.cpp index 779bc6eb4..6059e8e53 100644 --- a/src/CppUTest/TeamCityTestOutput.cpp +++ b/src/CppUTest/TeamCityTestOutput.cpp @@ -1,7 +1,7 @@ #include "CppUTest/TestHarness.h" #include "CppUTest/TeamCityTestOutput.h" -TeamCityTestOutput::TeamCityTestOutput() : currtest_(0), currGroup_() +TeamCityTestOutput::TeamCityTestOutput() : currtest_(NULLPTR), currGroup_() { } diff --git a/src/CppUTest/TestFilter.cpp b/src/CppUTest/TestFilter.cpp index a684c0891..c977b6fb5 100644 --- a/src/CppUTest/TestFilter.cpp +++ b/src/CppUTest/TestFilter.cpp @@ -28,16 +28,16 @@ #include "CppUTest/CppUTestConfig.h" #include "CppUTest/TestFilter.h" -TestFilter::TestFilter() : strictMatching_(false), invertMatching_(false), next_(NULL) +TestFilter::TestFilter() : strictMatching_(false), invertMatching_(false), next_(NULLPTR) { } -TestFilter::TestFilter(const SimpleString& filter) : strictMatching_(false), invertMatching_(false), next_(NULL) +TestFilter::TestFilter(const SimpleString& filter) : strictMatching_(false), invertMatching_(false), next_(NULLPTR) { filter_ = filter; } -TestFilter::TestFilter(const char* filter) : strictMatching_(false), invertMatching_(false), next_(NULL) +TestFilter::TestFilter(const char* filter) : strictMatching_(false), invertMatching_(false), next_(NULLPTR) { filter_ = filter; } diff --git a/src/CppUTest/TestHarness_c.cpp b/src/CppUTest/TestHarness_c.cpp index 41b78e56f..6d7b04210 100644 --- a/src/CppUTest/TestHarness_c.cpp +++ b/src/CppUTest/TestHarness_c.cpp @@ -36,72 +36,72 @@ extern "C" void CHECK_EQUAL_C_BOOL_LOCATION(int expected, int actual, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertEquals(!!expected != !!actual, expected ? "true" : "false", actual ? "true" : "false", NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertEquals(!!expected != !!actual, expected ? "true" : "false", actual ? "true" : "false", NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void CHECK_EQUAL_C_INT_LOCATION(int expected, int actual, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertLongsEqual((long)expected, (long)actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertLongsEqual((long)expected, (long)actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void CHECK_EQUAL_C_UINT_LOCATION(unsigned int expected, unsigned int actual, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void CHECK_EQUAL_C_LONG_LOCATION(long expected, long actual, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertLongsEqual(expected, actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertLongsEqual(expected, actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void CHECK_EQUAL_C_ULONG_LOCATION(unsigned long expected, unsigned long actual, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertUnsignedLongsEqual(expected, actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertUnsignedLongsEqual(expected, actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void CHECK_EQUAL_C_LONGLONG_LOCATION(cpputest_longlong expected, cpputest_longlong actual, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertLongLongsEqual(expected, actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertLongLongsEqual(expected, actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void CHECK_EQUAL_C_ULONGLONG_LOCATION(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertUnsignedLongLongsEqual(expected, actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertUnsignedLongLongsEqual(expected, actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void CHECK_EQUAL_C_REAL_LOCATION(double expected, double actual, double threshold, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertDoublesEqual(expected, actual, threshold, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertDoublesEqual(expected, actual, threshold, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void CHECK_EQUAL_C_CHAR_LOCATION(char expected, char actual, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertEquals(((expected) != (actual)), StringFrom(expected).asCharString(), StringFrom(actual).asCharString(), NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertEquals(((expected) != (actual)), StringFrom(expected).asCharString(), StringFrom(actual).asCharString(), NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } extern void CHECK_EQUAL_C_UBYTE_LOCATION(unsigned char expected, unsigned char actual, const char* fileName, int lineNumber)\ { - UtestShell::getCurrent()->assertEquals(((expected) != (actual)),StringFrom((int)expected).asCharString(), StringFrom((int) actual).asCharString(), NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertEquals(((expected) != (actual)),StringFrom((int)expected).asCharString(), StringFrom((int) actual).asCharString(), NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void CHECK_EQUAL_C_SBYTE_LOCATION(char signed expected, signed char actual, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertEquals(((expected) != (actual)),StringFrom((int)expected).asCharString(), StringFrom((int) actual).asCharString(), NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertEquals(((expected) != (actual)),StringFrom((int)expected).asCharString(), StringFrom((int) actual).asCharString(), NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void CHECK_EQUAL_C_STRING_LOCATION(const char* expected, const char* actual, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertCstrEqual(expected, actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertCstrEqual(expected, actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, const void* actual, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertPointersEqual(expected, actual, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertPointersEqual(expected, actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } extern void CHECK_EQUAL_C_BITS_LOCATION(unsigned int expected, unsigned int actual, unsigned int mask, size_t size, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertBitsEqual(expected, actual, mask, size, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertBitsEqual(expected, actual, mask, size, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void FAIL_TEXT_C_LOCATION(const char* text, const char* fileName, int lineNumber) @@ -116,7 +116,7 @@ void FAIL_C_LOCATION(const char* fileName, int lineNumber) void CHECK_C_LOCATION(int condition, const char* conditionString, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertTrue(condition != 0, "CHECK_C", conditionString, NULL, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertTrue(condition != 0, "CHECK_C", conditionString, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); } enum { NO_COUNTDOWN = -1, OUT_OF_MEMORRY = 0 }; diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 31d3ea5e7..ba325e88d 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -33,14 +33,14 @@ static char* checkedMalloc(size_t size) { char* mem = (char*) PlatformSpecificMalloc(size); - if (mem == 0) + if (mem == NULLPTR) FAIL("malloc returned null pointer"); return mem; } -static TestMemoryAllocator* currentNewAllocator = 0; -static TestMemoryAllocator* currentNewArrayAllocator = 0; -static TestMemoryAllocator* currentMallocAllocator = 0; +static TestMemoryAllocator* currentNewAllocator = NULLPTR; +static TestMemoryAllocator* currentNewArrayAllocator = NULLPTR; +static TestMemoryAllocator* currentMallocAllocator = NULLPTR; void setCurrentNewAllocator(TestMemoryAllocator* allocator) { @@ -49,7 +49,7 @@ void setCurrentNewAllocator(TestMemoryAllocator* allocator) TestMemoryAllocator* getCurrentNewAllocator() { - if (currentNewAllocator == 0) setCurrentNewAllocatorToDefault(); + if (currentNewAllocator == NULLPTR) setCurrentNewAllocatorToDefault(); return currentNewAllocator; } @@ -71,7 +71,7 @@ void setCurrentNewArrayAllocator(TestMemoryAllocator* allocator) TestMemoryAllocator* getCurrentNewArrayAllocator() { - if (currentNewArrayAllocator == 0) setCurrentNewArrayAllocatorToDefault(); + if (currentNewArrayAllocator == NULLPTR) setCurrentNewArrayAllocatorToDefault(); return currentNewArrayAllocator; } @@ -93,7 +93,7 @@ void setCurrentMallocAllocator(TestMemoryAllocator* allocator) TestMemoryAllocator* getCurrentMallocAllocator() { - if (currentMallocAllocator == 0) setCurrentMallocAllocatorToDefault(); + if (currentMallocAllocator == NULLPTR) setCurrentMallocAllocatorToDefault(); return currentMallocAllocator; } @@ -184,7 +184,7 @@ char* CrashOnAllocationAllocator::alloc_memory(size_t size, const char* file, in char* NullUnknownAllocator::alloc_memory(size_t /*size*/, const char*, int) { - return 0; + return NULLPTR; } void NullUnknownAllocator::free_memory(char* /*memory*/, const char*, int) @@ -238,11 +238,11 @@ class LocationToFailAllocNode } private: - void init(LocationToFailAllocNode* next = NULL) + void init(LocationToFailAllocNode* next = NULLPTR) { allocNumberToFail_ = 0; actualAllocNumber_ = 0; - file_ = NULL; + file_ = NULLPTR; line_ = 0; next_ = next; } @@ -250,7 +250,7 @@ class LocationToFailAllocNode }; FailableMemoryAllocator::FailableMemoryAllocator(const char* name_str, const char* alloc_name_str, const char* free_name_str) -: TestMemoryAllocator(name_str, alloc_name_str, free_name_str), head_(NULL), currentAllocNumber_(0) +: TestMemoryAllocator(name_str, alloc_name_str, free_name_str), head_(NULLPTR), currentAllocNumber_(0) { } @@ -272,7 +272,7 @@ char* FailableMemoryAllocator::alloc_memory(size_t size, const char* file, int l { currentAllocNumber_++; LocationToFailAllocNode* current = head_; - LocationToFailAllocNode* previous = NULL; + LocationToFailAllocNode* previous = NULLPTR; while (current) { if (current->shouldFail(currentAllocNumber_, file, line)) { @@ -280,7 +280,7 @@ char* FailableMemoryAllocator::alloc_memory(size_t size, const char* file, int l else head_ = current->next_; free_memory((char*) current, __FILE__, __LINE__); - return NULL; + return NULLPTR; } previous = current; current = current->next_; diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index eccabd075..4a6036bd5 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -269,7 +269,7 @@ StringBufferTestOutput::~StringBufferTestOutput() } CompositeTestOutput::CompositeTestOutput() - : outputOne_(NULL), outputTwo_(NULL) + : outputOne_(NULLPTR), outputTwo_(NULLPTR) { } diff --git a/src/CppUTest/TestPlugin.cpp b/src/CppUTest/TestPlugin.cpp index d850dab6f..ac45e52e4 100644 --- a/src/CppUTest/TestPlugin.cpp +++ b/src/CppUTest/TestPlugin.cpp @@ -90,7 +90,7 @@ TestPlugin* TestPlugin::getNext() } TestPlugin* TestPlugin::removePluginByName(const SimpleString& name) { - TestPlugin* removed = 0; + TestPlugin* removed = NULLPTR; if (next_ && next_->getName() == name) { removed = next_; next_ = next_->next_; @@ -150,7 +150,7 @@ void SetPointerPlugin::postTestAction(UtestShell& /*test*/, TestResult& /*result //////// NullPlugin NullTestPlugin::NullTestPlugin() : - TestPlugin(0) + TestPlugin(NULLPTR) { } diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 26c049859..5b5459846 100755 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -29,7 +29,7 @@ #include "CppUTest/TestRegistry.h" TestRegistry::TestRegistry() : - tests_(NULL), nameFilters_(NULL), groupFilters_(NULL), firstPlugin_(NullTestPlugin::instance()), runInSeperateProcess_(false), currentRepetition_(0), runIgnored_(false) + tests_(NULLPTR), nameFilters_(NULLPTR), groupFilters_(NULLPTR), firstPlugin_(NullTestPlugin::instance()), runInSeperateProcess_(false), currentRepetition_(0), runIgnored_(false) { } @@ -48,7 +48,7 @@ void TestRegistry::runAllTests(TestResult& result) bool groupStart = true; result.testsStarted(); - for (UtestShell *test = tests_; test != NULL; test = test->getNext()) { + for (UtestShell *test = tests_; test != NULLPTR; test = test->getNext()) { if (runInSeperateProcess_) test->setRunInSeperateProcess(); if (runIgnored_) test->setRunIgnored(); @@ -77,7 +77,7 @@ void TestRegistry::listTestGroupNames(TestResult& result) { SimpleString groupList; - for (UtestShell *test = tests_; test != NULL; test = test->getNext()) { + for (UtestShell *test = tests_; test != NULLPTR; test = test->getNext()) { SimpleString gname; gname += "#"; gname += test->getGroup(); @@ -100,7 +100,7 @@ void TestRegistry::listTestGroupAndCaseNames(TestResult& result) { SimpleString groupAndNameList; - for (UtestShell *test = tests_; test != NULL; test = test->getNext()) { + for (UtestShell *test = tests_; test != NULLPTR; test = test->getNext()) { if (testShouldRun(test, result)) { SimpleString groupAndName; groupAndName += "#"; @@ -133,12 +133,12 @@ int TestRegistry::countTests() return tests_ ? tests_->countTests() : 0; } -TestRegistry* TestRegistry::currentRegistry_ = 0; +TestRegistry* TestRegistry::currentRegistry_ = NULLPTR; TestRegistry* TestRegistry::getCurrentRegistry() { static TestRegistry registry; - return (currentRegistry_ == 0) ? ®istry : currentRegistry_; + return (currentRegistry_ == NULLPTR) ? ®istry : currentRegistry_; } void TestRegistry::setCurrentRegistry(TestRegistry* registry) @@ -148,7 +148,7 @@ void TestRegistry::setCurrentRegistry(TestRegistry* registry) void TestRegistry::unDoLastAddTest() { - tests_ = tests_ ? tests_->getNext() : NULL; + tests_ = tests_ ? tests_->getNext() : NULLPTR; } @@ -243,7 +243,7 @@ UtestShell* TestRegistry::findTestWithName(const SimpleString& name) return current; current = current->getNext(); } - return NULL; + return NULLPTR; } UtestShell* TestRegistry::findTestWithGroup(const SimpleString& group) @@ -254,6 +254,6 @@ UtestShell* TestRegistry::findTestWithGroup(const SimpleString& group) return current; current = current->getNext(); } - return NULL; + return NULLPTR; } diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 0970de47d..4908d1f4d 100755 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -132,12 +132,12 @@ extern "C" { /******************************** */ UtestShell::UtestShell() : - group_("UndefinedTestGroup"), name_("UndefinedTest"), file_("UndefinedFile"), lineNumber_(0), next_(NULL), isRunAsSeperateProcess_(false), hasFailed_(false) + group_("UndefinedTestGroup"), name_("UndefinedTest"), file_("UndefinedFile"), lineNumber_(0), next_(NULLPTR), isRunAsSeperateProcess_(false), hasFailed_(false) { } UtestShell::UtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber) : - group_(groupName), name_(testName), file_(fileName), lineNumber_(lineNumber), next_(NULL), isRunAsSeperateProcess_(false), hasFailed_(false) + group_(groupName), name_(testName), file_(fileName), lineNumber_(lineNumber), next_(NULLPTR), isRunAsSeperateProcess_(false), hasFailed_(false) { } @@ -153,7 +153,7 @@ UtestShell::~UtestShell() // LCOV_EXCL_START - actually covered but not in .gcno due to race condition static void defaultCrashMethod() { - UtestShell* ptr = (UtestShell*) 0x0; ptr->countTests(); + UtestShell* ptr = (UtestShell*) NULLPTR; ptr->countTests(); } // LCOV_EXCL_STOP @@ -322,9 +322,9 @@ int UtestShell::getLineNumber() const bool UtestShell::match(const char* target, const TestFilter* filters) const { - if(filters == NULL) return true; + if(filters == NULLPTR) return true; - for(; filters != NULL; filters = filters->getNext()) + for(; filters != NULLPTR; filters = filters->getNext()) if(filters->match(target)) return true; return false; @@ -368,8 +368,8 @@ void UtestShell::fail(const char *text, const char* fileName, int lineNumber, co void UtestShell::assertCstrEqual(const char* expected, const char* actual, const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); - if (actual == 0 && expected == 0) return; - if (actual == 0 || expected == 0) + if (actual == NULLPTR && expected == NULLPTR) return; + if (actual == NULLPTR || expected == NULLPTR) failWith(StringEqualFailure(this, fileName, lineNumber, expected, actual, text), testTerminator); if (SimpleString::StrCmp(expected, actual) != 0) failWith(StringEqualFailure(this, fileName, lineNumber, expected, actual, text), testTerminator); @@ -378,8 +378,8 @@ void UtestShell::assertCstrEqual(const char* expected, const char* actual, const void UtestShell::assertCstrNEqual(const char* expected, const char* actual, size_t length, const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); - if (actual == 0 && expected == 0) return; - if (actual == 0 || expected == 0) + if (actual == NULLPTR && expected == NULLPTR) return; + if (actual == NULLPTR || expected == NULLPTR) failWith(StringEqualFailure(this, fileName, lineNumber, expected, actual, text), testTerminator); if (SimpleString::StrNCmp(expected, actual, length) != 0) failWith(StringEqualFailure(this, fileName, lineNumber, expected, actual, text), testTerminator); @@ -388,8 +388,8 @@ void UtestShell::assertCstrNEqual(const char* expected, const char* actual, size void UtestShell::assertCstrNoCaseEqual(const char* expected, const char* actual, const char* text, const char* fileName, int lineNumber) { getTestResult()->countCheck(); - if (actual == 0 && expected == 0) return; - if (actual == 0 || expected == 0) + if (actual == NULLPTR && expected == NULLPTR) return; + if (actual == NULLPTR || expected == NULLPTR) failWith(StringEqualNoCaseFailure(this, fileName, lineNumber, expected, actual, text)); if (!SimpleString(expected).equalsNoCase(actual)) failWith(StringEqualNoCaseFailure(this, fileName, lineNumber, expected, actual, text)); @@ -398,8 +398,8 @@ void UtestShell::assertCstrNoCaseEqual(const char* expected, const char* actual, void UtestShell::assertCstrContains(const char* expected, const char* actual, const char* text, const char* fileName, int lineNumber) { getTestResult()->countCheck(); - if (actual == 0 && expected == 0) return; - if(actual == 0 || expected == 0) + if (actual == NULLPTR && expected == NULLPTR) return; + if (actual == NULLPTR || expected == NULLPTR) failWith(ContainsFailure(this, fileName, lineNumber, expected, actual, text)); if (!SimpleString(actual).contains(expected)) failWith(ContainsFailure(this, fileName, lineNumber, expected, actual, text)); @@ -408,8 +408,8 @@ void UtestShell::assertCstrContains(const char* expected, const char* actual, co void UtestShell::assertCstrNoCaseContains(const char* expected, const char* actual, const char* text, const char* fileName, int lineNumber) { getTestResult()->countCheck(); - if (actual == 0 && expected == 0) return; - if(actual == 0 || expected == 0) + if (actual == NULLPTR && expected == NULLPTR) return; + if (actual == NULLPTR || expected == NULLPTR) failWith(ContainsFailure(this, fileName, lineNumber, expected, actual, text)); if (!SimpleString(actual).containsNoCase(expected)) failWith(ContainsFailure(this, fileName, lineNumber, expected, actual, text)); @@ -486,8 +486,8 @@ void UtestShell::assertDoublesEqual(double expected, double actual, double thres void UtestShell::assertBinaryEqual(const void *expected, const void *actual, size_t length, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); - if (actual == 0 && expected == 0) return; - if (actual == 0 || expected == 0) + if (actual == NULLPTR && expected == NULLPTR) return; + if (actual == NULLPTR || expected == NULLPTR) failWith(BinaryEqualFailure(this, fileName, lineNumber, (const unsigned char *) expected, (const unsigned char *) actual, length, text), testTerminator); if (SimpleString::MemCmp(expected, actual, length) != 0) failWith(BinaryEqualFailure(this, fileName, lineNumber, (const unsigned char *) expected, (const unsigned char *) actual, length, text), testTerminator); @@ -530,8 +530,8 @@ void UtestShell::print(const SimpleString& text, const char* fileName, int lineN print(text.asCharString(), fileName, lineNumber); } -TestResult* UtestShell::testResult_ = NULL; -UtestShell* UtestShell::currentTest_ = NULL; +TestResult* UtestShell::testResult_ = NULLPTR; +UtestShell* UtestShell::currentTest_ = NULLPTR; void UtestShell::setTestResult(TestResult* result) { @@ -545,14 +545,14 @@ void UtestShell::setCurrentTest(UtestShell* test) TestResult* UtestShell::getTestResult() { - if (testResult_ == NULL) + if (testResult_ == NULLPTR) return &OutsideTestRunnerUTest::instance().getTestResult(); return testResult_; } UtestShell* UtestShell::getCurrent() { - if (currentTest_ == NULL) + if (currentTest_ == NULLPTR) return &OutsideTestRunnerUTest::instance(); return currentTest_; } diff --git a/src/CppUTestExt/CodeMemoryReportFormatter.cpp b/src/CppUTestExt/CodeMemoryReportFormatter.cpp index ff210374c..6bdf64010 100644 --- a/src/CppUTestExt/CodeMemoryReportFormatter.cpp +++ b/src/CppUTestExt/CodeMemoryReportFormatter.cpp @@ -44,7 +44,7 @@ struct CodeReportingAllocationNode }; CodeMemoryReportFormatter::CodeMemoryReportFormatter(TestMemoryAllocator* internalAllocator) - : codeReportingList_(NULL), internalAllocator_(internalAllocator) + : codeReportingList_(NULLPTR), internalAllocator_(internalAllocator) { } @@ -165,7 +165,7 @@ void CodeMemoryReportFormatter::report_free_memory(TestResult* result, TestMemor SimpleString variableName; CodeReportingAllocationNode* node = findNode(memory); - if (memory == NULL) variableName = "NULL"; + if (memory == NULLPTR) variableName = "NULL"; else variableName = node->variableName_; result->print(StringFromFormat("\t%s\n", getDeallocationString(allocator, variableName, file, line).asCharString()).asCharString()); diff --git a/src/CppUTestExt/MemoryReportAllocator.cpp b/src/CppUTestExt/MemoryReportAllocator.cpp index 87fb0e7ad..b080988e6 100644 --- a/src/CppUTestExt/MemoryReportAllocator.cpp +++ b/src/CppUTestExt/MemoryReportAllocator.cpp @@ -29,7 +29,7 @@ #include "CppUTestExt/MemoryReportAllocator.h" #include "CppUTestExt/MemoryReportFormatter.h" -MemoryReportAllocator::MemoryReportAllocator() : result_(NULL), realAllocator_(NULL), formatter_(NULL) +MemoryReportAllocator::MemoryReportAllocator() : result_(NULLPTR), realAllocator_(NULLPTR), formatter_(NULLPTR) { } diff --git a/src/CppUTestExt/MemoryReporterPlugin.cpp b/src/CppUTestExt/MemoryReporterPlugin.cpp index 8429c2f4d..9a3df9e50 100644 --- a/src/CppUTestExt/MemoryReporterPlugin.cpp +++ b/src/CppUTestExt/MemoryReporterPlugin.cpp @@ -31,7 +31,7 @@ #include "CppUTestExt/CodeMemoryReportFormatter.h" MemoryReporterPlugin::MemoryReporterPlugin() - : TestPlugin("MemoryReporterPlugin"), formatter_(NULL) + : TestPlugin("MemoryReporterPlugin"), formatter_(NULLPTR) { } @@ -62,7 +62,7 @@ MemoryReportFormatter* MemoryReporterPlugin::createMemoryFormatter(const SimpleS else if (type == "code") { return new CodeMemoryReportFormatter(defaultMallocAllocator()); } - return NULL; + return NULLPTR; } void MemoryReporterPlugin::destroyMemoryFormatter(MemoryReportFormatter* formatter) @@ -104,7 +104,7 @@ void MemoryReporterPlugin::initializeAllocator(MemoryReportAllocator* allocator, void MemoryReporterPlugin::preTestAction(UtestShell& test, TestResult& result) { - if (formatter_ == NULL) return; + if (formatter_ == NULLPTR) return; initializeAllocator(&mallocAllocator, result); initializeAllocator(&newAllocator, result); @@ -122,11 +122,11 @@ void MemoryReporterPlugin::preTestAction(UtestShell& test, TestResult& result) void MemoryReporterPlugin::postTestAction(UtestShell& test, TestResult& result) { - if (formatter_ == NULL) return; + if (formatter_ == NULLPTR) return; removeGlobalMemoryReportAllocators(); formatter_->report_test_end(&result, test); - if (test.getNext() == NULL || test.getNext()->getGroup() != currentTestGroup_) + if (test.getNext() == NULLPTR || test.getNext()->getGroup() != currentTestGroup_) formatter_->report_testgroup_end(&result, test); } diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index c11f5f458..770d94c52 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -50,8 +50,8 @@ SimpleString MockCheckedActualCall::getName() const } MockCheckedActualCall::MockCheckedActualCall(unsigned int callOrder, MockFailureReporter* reporter, const MockExpectedCallsList& allExpectations) - : callOrder_(callOrder), reporter_(reporter), state_(CALL_SUCCEED), expectationsChecked_(false), matchingExpectation_(NULL), - allExpectations_(allExpectations), outputParameterExpectations_(NULL) + : callOrder_(callOrder), reporter_(reporter), state_(CALL_SUCCEED), expectationsChecked_(false), matchingExpectation_(NULLPTR), + allExpectations_(allExpectations), outputParameterExpectations_(NULLPTR) { potentiallyMatchingExpectations_.addPotentiallyMatchingExpectations(allExpectations); } @@ -130,7 +130,7 @@ void MockCheckedActualCall::discardCurrentlyMatchingExpectations() if (matchingExpectation_) { matchingExpectation_->resetActualCallMatchingState(); - matchingExpectation_ = NULL; + matchingExpectation_ = NULLPTR; } potentiallyMatchingExpectations_.onlyKeepUnmatchingExpectations(); } @@ -294,7 +294,7 @@ MockActualCall& MockCheckedActualCall::withParameterOfType(const SimpleString& t MockNamedValue actualParameter(name); actualParameter.setConstObjectPointer(type, value); - if (actualParameter.getComparator() == NULL) { + if (actualParameter.getComparator() == NULLPTR) { MockNoWayToCompareCustomTypeFailure failure(getTest(), type); failTest(failure); return *this; @@ -548,7 +548,7 @@ void MockCheckedActualCall::addOutputParameter(const SimpleString& name, const S { MockOutputParametersListNode* newNode = new MockOutputParametersListNode(name, type, ptr); - if (outputParameterExpectations_ == NULL) + if (outputParameterExpectations_ == NULLPTR) outputParameterExpectations_ = newNode; else { MockOutputParametersListNode* lastNode = outputParameterExpectations_; @@ -560,7 +560,7 @@ void MockCheckedActualCall::addOutputParameter(const SimpleString& name, const S void MockCheckedActualCall::cleanUpOutputParameterList() { MockOutputParametersListNode* current = outputParameterExpectations_; - MockOutputParametersListNode* toBeDeleted = NULL; + MockOutputParametersListNode* toBeDeleted = NULLPTR; while (current) { toBeDeleted = current; @@ -763,17 +763,17 @@ unsigned int MockActualCallTrace::returnUnsignedIntValue() void * MockActualCallTrace::returnPointerValue() { - return NULL; + return NULLPTR; } const void * MockActualCallTrace::returnConstPointerValue() { - return NULL; + return NULLPTR; } void (*MockActualCallTrace::returnFunctionPointerValue())() { - return NULL; + return NULLPTR; } const void * MockActualCallTrace::returnConstPointerValueOrDefault(const void *) diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index 0655df703..59f20f813 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -54,7 +54,7 @@ SimpleString MockCheckedExpectedCall::getName() const MockCheckedExpectedCall::MockCheckedExpectedCall() : ignoreOtherParameters_(false), isActualCallMatchFinalized_(false), initialExpectedCallOrder_(NO_EXPECTED_CALL_ORDER), finalExpectedCallOrder_(NO_EXPECTED_CALL_ORDER), - outOfOrder_(false), returnValue_(""), objectPtr_(NULL), wasPassedToObject_(true), + outOfOrder_(false), returnValue_(""), objectPtr_(NULLPTR), wasPassedToObject_(true), actualCalls_(0), expectedCalls_(1) { inputParameters_ = new MockNamedValueList(); @@ -64,7 +64,7 @@ MockCheckedExpectedCall::MockCheckedExpectedCall() MockCheckedExpectedCall::MockCheckedExpectedCall(unsigned int numCalls) : ignoreOtherParameters_(false), isActualCallMatchFinalized_(false), initialExpectedCallOrder_(NO_EXPECTED_CALL_ORDER), finalExpectedCallOrder_(NO_EXPECTED_CALL_ORDER), - outOfOrder_(false), returnValue_(""), objectPtr_(NULL), wasPassedToObject_(true), + outOfOrder_(false), returnValue_(""), objectPtr_(NULLPTR), wasPassedToObject_(true), actualCalls_(0), expectedCalls_(numCalls) { inputParameters_ = new MockNamedValueList(); @@ -207,13 +207,13 @@ SimpleString MockCheckedExpectedCall::getInputParameterType(const SimpleString& bool MockCheckedExpectedCall::hasInputParameterWithName(const SimpleString& name) { MockNamedValue * p = inputParameters_->getValueByName(name); - return p != NULL; + return p != NULLPTR; } bool MockCheckedExpectedCall::hasOutputParameterWithName(const SimpleString& name) { MockNamedValue * p = outputParameters_->getValueByName(name); - return p != NULL; + return p != NULLPTR; } MockNamedValue MockCheckedExpectedCall::getInputParameter(const SimpleString& name) @@ -291,7 +291,7 @@ void MockCheckedExpectedCall::wasPassedToObject() void MockCheckedExpectedCall::resetActualCallMatchingState() { - wasPassedToObject_ = (objectPtr_ == NULL); + wasPassedToObject_ = (objectPtr_ == NULLPTR); isActualCallMatchFinalized_ = false; MockNamedValueListNode* p; @@ -352,7 +352,7 @@ SimpleString MockCheckedExpectedCall::callToString() } } - if (inputParameters_->begin() == NULL && outputParameters_->begin() == NULL) { + if (inputParameters_->begin() == NULLPTR && outputParameters_->begin() == NULLPTR) { str += (ignoreOtherParameters_) ? "all parameters ignored" : "no parameters"; } else { MockNamedValueListNode* p; diff --git a/src/CppUTestExt/MockExpectedCallsList.cpp b/src/CppUTestExt/MockExpectedCallsList.cpp index e53afdb80..f66f46b66 100644 --- a/src/CppUTestExt/MockExpectedCallsList.cpp +++ b/src/CppUTestExt/MockExpectedCallsList.cpp @@ -29,7 +29,7 @@ #include "CppUTestExt/MockExpectedCallsList.h" #include "CppUTestExt/MockCheckedExpectedCall.h" -MockExpectedCallsList::MockExpectedCallsList() : head_(NULL) +MockExpectedCallsList::MockExpectedCallsList() : head_(NULLPTR) { } @@ -60,7 +60,7 @@ unsigned int MockExpectedCallsList::size() const bool MockExpectedCallsList::isEmpty() const { - return head_ == NULL; + return head_ == NULLPTR; } unsigned int MockExpectedCallsList::amountOfActualCallsFulfilledFor(const SimpleString& name) const @@ -114,7 +114,7 @@ void MockExpectedCallsList::addExpectedCall(MockCheckedExpectedCall* call) { MockExpectedCallsListNode* newCall = new MockExpectedCallsListNode(call); - if (head_ == NULL) + if (head_ == NULLPTR) head_ = newCall; else { MockExpectedCallsListNode* lastCall = head_; @@ -147,7 +147,7 @@ void MockExpectedCallsList::onlyKeepExpectationsRelatedTo(const SimpleString& na { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) if (! p->expectedCall_->relatesTo(name)) - p->expectedCall_ = NULL; + p->expectedCall_ = NULLPTR; pruneEmptyNodeFromList(); } @@ -156,7 +156,7 @@ void MockExpectedCallsList::onlyKeepOutOfOrderExpectations() { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) if (!p->expectedCall_->isOutOfOrder()) - p->expectedCall_ = NULL; + p->expectedCall_ = NULLPTR; pruneEmptyNodeFromList(); } @@ -166,7 +166,7 @@ void MockExpectedCallsList::onlyKeepUnmatchingExpectations() if (p->expectedCall_->isMatchingActualCallAndFinalized()) { p->expectedCall_->resetActualCallMatchingState(); - p->expectedCall_ = NULL; + p->expectedCall_ = NULLPTR; } pruneEmptyNodeFromList(); @@ -176,7 +176,7 @@ void MockExpectedCallsList::onlyKeepExpectationsWithInputParameterName(const Sim { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) if (! p->expectedCall_->hasInputParameterWithName(name)) - p->expectedCall_ = NULL; + p->expectedCall_ = NULLPTR; pruneEmptyNodeFromList(); } @@ -184,7 +184,7 @@ void MockExpectedCallsList::onlyKeepExpectationsWithOutputParameterName(const Si { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) if (! p->expectedCall_->hasOutputParameterWithName(name)) - p->expectedCall_ = NULL; + p->expectedCall_ = NULLPTR; pruneEmptyNodeFromList(); } @@ -192,7 +192,7 @@ void MockExpectedCallsList::onlyKeepExpectationsWithInputParameter(const MockNam { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) if (! p->expectedCall_->hasInputParameter(parameter)) - p->expectedCall_ = NULL; + p->expectedCall_ = NULLPTR; pruneEmptyNodeFromList(); } @@ -200,7 +200,7 @@ void MockExpectedCallsList::onlyKeepExpectationsWithOutputParameter(const MockNa { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) if (! p->expectedCall_->hasOutputParameter(parameter)) - p->expectedCall_ = NULL; + p->expectedCall_ = NULLPTR; pruneEmptyNodeFromList(); } @@ -208,7 +208,7 @@ void MockExpectedCallsList::onlyKeepExpectationsOnObject(const void* objectPtr) { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) if (! p->expectedCall_->relatesToObject(objectPtr)) - p->expectedCall_ = NULL; + p->expectedCall_ = NULLPTR; pruneEmptyNodeFromList(); } @@ -217,12 +217,12 @@ MockCheckedExpectedCall* MockExpectedCallsList::removeFirstFinalizedMatchingExpe for (MockExpectedCallsListNode* p = head_; p; p = p->next_) { if (p->expectedCall_->isMatchingActualCallAndFinalized()) { MockCheckedExpectedCall* matchingCall = p->expectedCall_; - p->expectedCall_ = NULL; + p->expectedCall_ = NULLPTR; pruneEmptyNodeFromList(); return matchingCall; } } - return NULL; + return NULLPTR; } MockCheckedExpectedCall* MockExpectedCallsList::getFirstMatchingExpectation() @@ -232,7 +232,7 @@ MockCheckedExpectedCall* MockExpectedCallsList::getFirstMatchingExpectation() return p->expectedCall_; } } - return NULL; + return NULLPTR; } MockCheckedExpectedCall* MockExpectedCallsList::removeFirstMatchingExpectation() @@ -240,24 +240,24 @@ MockCheckedExpectedCall* MockExpectedCallsList::removeFirstMatchingExpectation() for (MockExpectedCallsListNode* p = head_; p; p = p->next_) { if (p->expectedCall_->isMatchingActualCall()) { MockCheckedExpectedCall* matchingCall = p->expectedCall_; - p->expectedCall_ = NULL; + p->expectedCall_ = NULLPTR; pruneEmptyNodeFromList(); return matchingCall; } } - return NULL; + return NULLPTR; } void MockExpectedCallsList::pruneEmptyNodeFromList() { MockExpectedCallsListNode* current = head_; - MockExpectedCallsListNode* previous = NULL; - MockExpectedCallsListNode* toBeDeleted = NULL; + MockExpectedCallsListNode* previous = NULLPTR; + MockExpectedCallsListNode* toBeDeleted = NULLPTR; while (current) { - if (current->expectedCall_ == NULL) { + if (current->expectedCall_ == NULLPTR) { toBeDeleted = current; - if (previous == NULL) + if (previous == NULLPTR) head_ = current = current->next_; else current = previous->next_ = current->next_; diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 86cbd1ab4..8472accea 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -30,14 +30,14 @@ #include "CppUTest/PlatformSpecificFunctions.h" -MockNamedValueComparatorsAndCopiersRepository* MockNamedValue::defaultRepository_ = NULL; +MockNamedValueComparatorsAndCopiersRepository* MockNamedValue::defaultRepository_ = NULLPTR; void MockNamedValue::setDefaultComparatorsAndCopiersRepository(MockNamedValueComparatorsAndCopiersRepository* repository) { defaultRepository_ = repository; } -MockNamedValue::MockNamedValue(const SimpleString& name) : name_(name), type_("int"), size_(0), comparator_(NULL), copier_(NULL) +MockNamedValue::MockNamedValue(const SimpleString& name) : name_(name), type_("int"), size_(0), comparator_(NULLPTR), copier_(NULLPTR) { value_.intValue_ = 0; } @@ -393,7 +393,7 @@ void MockNamedValueListNode::destroy() } MockNamedValueListNode::MockNamedValueListNode(MockNamedValue* newValue) - : data_(newValue), next_(NULL) + : data_(newValue), next_(NULLPTR) { } @@ -407,7 +407,7 @@ SimpleString MockNamedValueListNode::getType() const return data_->getType(); } -MockNamedValueList::MockNamedValueList() : head_(NULL) +MockNamedValueList::MockNamedValueList() : head_(NULLPTR) { } @@ -424,7 +424,7 @@ void MockNamedValueList::clear() void MockNamedValueList::add(MockNamedValue* newValue) { MockNamedValueListNode* newNode = new MockNamedValueListNode(newValue); - if (head_ == NULL) + if (head_ == NULLPTR) head_ = newNode; else { MockNamedValueListNode* lastNode = head_; @@ -438,7 +438,7 @@ MockNamedValue* MockNamedValueList::getValueByName(const SimpleString& name) for (MockNamedValueListNode * p = head_; p; p = p->next()) if (p->getName() == name) return p->item(); - return NULL; + return NULLPTR; } MockNamedValueListNode* MockNamedValueList::begin() @@ -449,9 +449,9 @@ MockNamedValueListNode* MockNamedValueList::begin() struct MockNamedValueComparatorsAndCopiersRepositoryNode { MockNamedValueComparatorsAndCopiersRepositoryNode(const SimpleString& name, MockNamedValueComparator* comparator, MockNamedValueComparatorsAndCopiersRepositoryNode* next) - : name_(name), comparator_(comparator), copier_(NULL), next_(next) {} + : name_(name), comparator_(comparator), copier_(NULLPTR), next_(next) {} MockNamedValueComparatorsAndCopiersRepositoryNode(const SimpleString& name, MockNamedValueCopier* copier, MockNamedValueComparatorsAndCopiersRepositoryNode* next) - : name_(name), comparator_(NULL), copier_(copier), next_(next) {} + : name_(name), comparator_(NULLPTR), copier_(copier), next_(next) {} MockNamedValueComparatorsAndCopiersRepositoryNode(const SimpleString& name, MockNamedValueComparator* comparator, MockNamedValueCopier* copier, MockNamedValueComparatorsAndCopiersRepositoryNode* next) : name_(name), comparator_(comparator), copier_(copier), next_(next) {} SimpleString name_; @@ -460,7 +460,7 @@ struct MockNamedValueComparatorsAndCopiersRepositoryNode MockNamedValueComparatorsAndCopiersRepositoryNode* next_; }; -MockNamedValueComparatorsAndCopiersRepository::MockNamedValueComparatorsAndCopiersRepository() : head_(NULL) +MockNamedValueComparatorsAndCopiersRepository::MockNamedValueComparatorsAndCopiersRepository() : head_(NULLPTR) { } @@ -493,14 +493,14 @@ MockNamedValueComparator* MockNamedValueComparatorsAndCopiersRepository::getComp { for (MockNamedValueComparatorsAndCopiersRepositoryNode* p = head_; p; p = p->next_) if (p->name_ == name && p->comparator_) return p->comparator_; - return NULL; + return NULLPTR; } MockNamedValueCopier* MockNamedValueComparatorsAndCopiersRepository::getCopierForType(const SimpleString& name) { for (MockNamedValueComparatorsAndCopiersRepositoryNode* p = head_; p; p = p->next_) if (p->name_ == name && p->copier_) return p->copier_; - return NULL; + return NULLPTR; } void MockNamedValueComparatorsAndCopiersRepository::installComparatorsAndCopiers(const MockNamedValueComparatorsAndCopiersRepository& repository) diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 728146928..fe8ff4f5f 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -44,9 +44,9 @@ MockSupport& mock(const SimpleString& mockName, MockFailureReporter* failureRepo } MockSupport::MockSupport(const SimpleString& mockName) - : actualCallOrder_(0), expectedCallOrder_(0), strictOrdering_(false), standardReporter_(&defaultReporter_), ignoreOtherCalls_(false), enabled_(true), lastActualFunctionCall_(NULL), mockName_(mockName), tracing_(false) + : actualCallOrder_(0), expectedCallOrder_(0), strictOrdering_(false), standardReporter_(&defaultReporter_), ignoreOtherCalls_(false), enabled_(true), lastActualFunctionCall_(NULLPTR), mockName_(mockName), tracing_(false) { - setActiveReporter(NULL); + setActiveReporter(NULLPTR); } MockSupport::~MockSupport() @@ -60,7 +60,7 @@ void MockSupport::crashOnFailure(bool shouldCrash) void MockSupport::setMockFailureStandardReporter(MockFailureReporter* reporter) { - standardReporter_ = (reporter != NULL) ? reporter : &defaultReporter_; + standardReporter_ = (reporter != NULLPTR) ? reporter : &defaultReporter_; if (lastActualFunctionCall_) lastActualFunctionCall_->setMockFailureReporter(standardReporter_); @@ -113,7 +113,7 @@ void MockSupport::removeAllComparatorsAndCopiers() void MockSupport::clear() { delete lastActualFunctionCall_; - lastActualFunctionCall_ = NULL; + lastActualFunctionCall_ = NULLPTR; tracing_ = false; MockActualCallTrace::instance().clear(); @@ -202,7 +202,7 @@ MockActualCall& MockSupport::actualCall(const SimpleString& functionName) if (lastActualFunctionCall_) { lastActualFunctionCall_->checkExpectations(); delete lastActualFunctionCall_; - lastActualFunctionCall_ = NULL; + lastActualFunctionCall_ = NULLPTR; } if (!enabled_) return MockIgnoredActualCall::instance(); @@ -352,13 +352,13 @@ void MockSupport::checkExpectations() bool MockSupport::hasData(const SimpleString& name) { - return data_.getValueByName(name) != NULL; + return data_.getValueByName(name) != NULLPTR; } MockNamedValue* MockSupport::retrieveDataFromStore(const SimpleString& name) { MockNamedValue* newData = data_.getValueByName(name); - if (newData == NULL) { + if (newData == NULLPTR) { newData = new MockNamedValue(name); data_.add(newData); } @@ -428,7 +428,7 @@ void MockSupport::setDataConstObject(const SimpleString& name, const SimpleStrin MockNamedValue MockSupport::getData(const SimpleString& name) { MockNamedValue* value = data_.getValueByName(name); - if (value == NULL) + if (value == NULLPTR) return MockNamedValue(""); return *value; } @@ -468,7 +468,7 @@ MockSupport* MockSupport::getMockSupport(MockNamedValueListNode* node) { if (node->getType() == "MockSupport" && node->getName().contains(MOCK_SUPPORT_SCOPE_PREFIX)) return static_cast( const_cast( node->item()->getObjectPointer() ) ); - return NULL; + return NULLPTR; } MockNamedValue MockSupport::returnValue() diff --git a/src/CppUTestExt/MockSupportPlugin.cpp b/src/CppUTestExt/MockSupportPlugin.cpp index b2f97f9f6..257b9a0ae 100644 --- a/src/CppUTestExt/MockSupportPlugin.cpp +++ b/src/CppUTestExt/MockSupportPlugin.cpp @@ -72,7 +72,7 @@ void MockSupportPlugin::postTestAction(UtestShell& test, TestResult& result) if (!test.hasFailed()) mock().checkExpectations(); mock().clear(); - mock().setMockFailureStandardReporter(NULL); + mock().setMockFailureStandardReporter(NULLPTR); mock().removeAllComparatorsAndCopiers(); } diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 0dce320a3..013520435 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -49,7 +49,7 @@ class MockFailureReporterTestTerminatorForInCOnlyCode : public TestTerminatorWit TestTerminatorWithoutExceptions::exitCurrentTest(); } // LCOV_EXCL_LINE // LCOV_EXCL_START - virtual ~MockFailureReporterTestTerminatorForInCOnlyCode() + virtual ~MockFailureReporterTestTerminatorForInCOnlyCode() _destructor_override { } // LCOV_EXCL_STOP @@ -69,9 +69,9 @@ class MockFailureReporterForInCOnlyCode : public MockFailureReporter }; -static MockSupport* currentMockSupport = NULL; -static MockExpectedCall* expectedCall = NULL; -static MockActualCall* actualCall = NULL; +static MockSupport* currentMockSupport = NULLPTR; +static MockExpectedCall* expectedCall = NULLPTR; +static MockActualCall* actualCall = NULLPTR; static MockFailureReporterForInCOnlyCode failureReporterForC; class MockCFunctionComparatorNode : public MockNamedValueComparator @@ -79,7 +79,7 @@ class MockCFunctionComparatorNode : public MockNamedValueComparator public: MockCFunctionComparatorNode(MockCFunctionComparatorNode* next, MockTypeEqualFunction_c equal, MockTypeValueToStringFunction_c toString) : next_(next), equal_(equal), toString_(toString) {} - virtual ~MockCFunctionComparatorNode() {} + virtual ~MockCFunctionComparatorNode() _destructor_override {} virtual bool isEqual(const void* object1, const void* object2) _override { @@ -95,14 +95,14 @@ class MockCFunctionComparatorNode : public MockNamedValueComparator MockTypeValueToStringFunction_c toString_; }; -static MockCFunctionComparatorNode* comparatorList_ = NULL; +static MockCFunctionComparatorNode* comparatorList_ = NULLPTR; class MockCFunctionCopierNode : public MockNamedValueCopier { public: MockCFunctionCopierNode(MockCFunctionCopierNode* next, MockTypeCopyFunction_c copier) : next_(next), copier_(copier) {} - virtual ~MockCFunctionCopierNode() {} + virtual ~MockCFunctionCopierNode() _destructor_override {} virtual void copy(void* dst, const void* src) _override { @@ -113,7 +113,7 @@ class MockCFunctionCopierNode : public MockNamedValueCopier MockTypeCopyFunction_c copier_; }; -static MockCFunctionCopierNode* copierList_ = NULL; +static MockCFunctionCopierNode* copierList_ = NULLPTR; extern "C" { diff --git a/src/CppUTestExt/OrderedTest.cpp b/src/CppUTestExt/OrderedTest.cpp index a58dd5582..3d871b265 100644 --- a/src/CppUTestExt/OrderedTest.cpp +++ b/src/CppUTestExt/OrderedTest.cpp @@ -29,10 +29,10 @@ #include "CppUTest/TestRegistry.h" #include "CppUTestExt/OrderedTest.h" -OrderedTestShell* OrderedTestShell::_orderedTestsHead = 0; +OrderedTestShell* OrderedTestShell::_orderedTestsHead = NULLPTR; OrderedTestShell::OrderedTestShell() : - _nextOrderedTest(0), _level(0) + _nextOrderedTest(NULLPTR), _level(0) { } @@ -62,7 +62,7 @@ OrderedTestShell* OrderedTestShell::getOrderedTestHead() bool OrderedTestShell::firstOrderedTest() { - return (getOrderedTestHead() == 0); + return (getOrderedTestHead() == NULLPTR); } OrderedTestShell* OrderedTestShell::addOrderedTest(OrderedTestShell* test) @@ -77,7 +77,7 @@ void OrderedTestShell::addOrderedTestToHead(OrderedTestShell* test) TestRegistry *reg = TestRegistry::getCurrentRegistry(); UtestShell* head = getOrderedTestHead(); - if (NULL == reg->getFirstTest() || head == reg->getFirstTest()) { + if (NULLPTR == reg->getFirstTest() || head == reg->getFirstTest()) { reg->addTest(test); } else { diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 09b0dd999..a5b3e9f5b 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -184,7 +184,7 @@ static long TimeInMillisImplementation() static const char* TimeStringImplementation() { - time_t tm = time(NULL); + time_t tm = time(NULLPTR); static char dateTime[80]; struct tm *tmp = localtime(&tm); strftime(dateTime, 80, "%Y-%m-%dT%H:%M:%S", tmp); @@ -263,7 +263,7 @@ static PlatformSpecificMutex PThreadMutexCreate(void) { pthread_mutex_t *mutex = new pthread_mutex_t; - pthread_mutex_init(mutex, NULL); + pthread_mutex_init(mutex, NULLPTR); return (PlatformSpecificMutex)mutex; } diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index d56d148ee..33727b915 100755 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -53,7 +53,7 @@ TEST_GROUP(CommandLineArguments) void setup() { plugin = new OptionsPlugin("options"); - args = NULL; + args = NULLPTR; } void teardown() { @@ -391,8 +391,8 @@ TEST(CommandLineArguments, checkDefaultArguments) CHECK(newArgumentParser(argc, argv)); CHECK(!args->isVerbose()); LONGS_EQUAL(1, args->getRepeatCount()); - CHECK(NULL == args->getGroupFilters()); - CHECK(NULL == args->getNameFilters()); + CHECK(NULLPTR == args->getGroupFilters()); + CHECK(NULLPTR == args->getNameFilters()); CHECK(args->isEclipseOutput()); CHECK(SimpleString("") == args->getPackageName()); } diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index 9db99a532..cb468b711 100755 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -65,8 +65,8 @@ class CommandLineTestRunnerWithStringBufferOutput : public CommandLineTestRunner StringBufferTestOutput* fakeTCOutputWhichIsReallyABuffer; CommandLineTestRunnerWithStringBufferOutput(int argc, const char *const *argv, TestRegistry* registry) - : CommandLineTestRunner(argc, argv, registry), fakeJUnitOutputWhichIsReallyABuffer_(NULL), - fakeConsoleOutputWhichIsReallyABuffer(NULL), fakeTCOutputWhichIsReallyABuffer(NULL) + : CommandLineTestRunner(argc, argv, registry), fakeJUnitOutputWhichIsReallyABuffer_(NULLPTR), + fakeConsoleOutputWhichIsReallyABuffer(NULLPTR), fakeTCOutputWhichIsReallyABuffer(NULLPTR) {} TestOutput* createConsoleOutput() @@ -137,7 +137,7 @@ TEST(CommandLineTestRunner, TeamcityOutputEnabled) const char* argv[] = {"tests.exe", "-oteamcity"}; CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); commandLineTestRunner.runAllTestsMain(); - CHECK(commandLineTestRunner.fakeTCOutputWhichIsReallyABuffer); + CHECK(commandLineTestRunner.fakeTCOutputWhichIsReallyABuffer != NULLPTR); } TEST(CommandLineTestRunner, JunitOutputEnabled) @@ -146,7 +146,7 @@ TEST(CommandLineTestRunner, JunitOutputEnabled) CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); commandLineTestRunner.runAllTestsMain(); - CHECK(commandLineTestRunner.fakeJUnitOutputWhichIsReallyABuffer_); + CHECK(commandLineTestRunner.fakeJUnitOutputWhichIsReallyABuffer_ != NULLPTR); } TEST(CommandLineTestRunner, JunitOutputAndVerboseEnabled) @@ -205,7 +205,7 @@ struct FakeOutput } static PlatformSpecificFile fopen_fake(const char*, const char*) { - return (PlatformSpecificFile)0; + return (PlatformSpecificFile) NULLPTR; } static void fputs_fake(const char* str, PlatformSpecificFile) { diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index 1bb81519a..3f8796a3e 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -94,7 +94,7 @@ class FileSystemForJUnitTestOutputTests FileForJUnitOutputTests* firstFile_; public: - FileSystemForJUnitTestOutputTests() : firstFile_(0) {} + FileSystemForJUnitTestOutputTests() : firstFile_(NULLPTR) {} ~FileSystemForJUnitTestOutputTests() { clear(); } void clear(void) @@ -114,7 +114,7 @@ class FileSystemForJUnitTestOutputTests int amountOfFiles() { int totalAmountOfFiles = 0; - for (FileForJUnitOutputTests* current = firstFile_; current != NULL; current = current->nextFile()) + for (FileForJUnitOutputTests* current = firstFile_; current != NULLPTR; current = current->nextFile()) totalAmountOfFiles++; return totalAmountOfFiles; } @@ -122,15 +122,15 @@ class FileSystemForJUnitTestOutputTests bool fileExists(const char* filename) { FileForJUnitOutputTests *searchedFile = file(filename); - return (searchedFile != NULL); + return (searchedFile != NULLPTR); } FileForJUnitOutputTests* file(const char* filename) { - for (FileForJUnitOutputTests* current = firstFile_; current != NULL; current = current->nextFile()) + for (FileForJUnitOutputTests* current = firstFile_; current != NULLPTR; current = current->nextFile()) if (current->name() == filename) return current; - return NULL; + return NULLPTR; } }; @@ -163,7 +163,7 @@ class JUnitTestOutputTestRunner public: JUnitTestOutputTestRunner(TestResult result) : - result_(result), currentGroupName_(0), currentTest_(0), firstTestInGroup_(true), timeTheTestTakes_(0), numberOfChecksInTest_(0), testFailure_(0) + result_(result), currentGroupName_(NULLPTR), currentTest_(NULLPTR), firstTestInGroup_(true), timeTheTestTakes_(0), numberOfChecksInTest_(0), testFailure_(NULLPTR) { millisTime = 0; theTime = "1978-10-03T00:00:00"; @@ -190,7 +190,7 @@ class JUnitTestOutputTestRunner { endOfPreviousTestGroup(); delete currentTest_; - currentTest_ = 0; + currentTest_ = NULLPTR; return *this; } @@ -202,7 +202,7 @@ class JUnitTestOutputTestRunner firstTestInGroup_ = true; } - currentGroupName_ = 0; + currentGroupName_ = NULLPTR; } JUnitTestOutputTestRunner& withGroup(const char* groupName) @@ -250,7 +250,7 @@ class JUnitTestOutputTestRunner void runPreviousTest() { - if (currentTest_ == 0) return; + if (currentTest_ == NULLPTR) return; if (firstTestInGroup_) { result_.currentGroupStarted(currentTest_); @@ -267,7 +267,7 @@ class JUnitTestOutputTestRunner if (testFailure_) { result_.addFailure(*testFailure_); delete testFailure_; - testFailure_ = 0; + testFailure_ = NULLPTR; } result_.currentTestEnded(currentTest_); @@ -605,8 +605,8 @@ TEST(JUnitOutputTest, twoTestGroupsWriteToTwoDifferentFiles) .withTest("testName") .end(); - CHECK(fileSystem.file("cpputest_firstTestGroup.xml")); - CHECK(fileSystem.file("cpputest_secondTestGroup.xml")); + CHECK(fileSystem.file("cpputest_firstTestGroup.xml") != NULLPTR); + CHECK(fileSystem.file("cpputest_secondTestGroup.xml") != NULLPTR); } diff --git a/tests/CppUTest/MemoryLeakDetectorTest.cpp b/tests/CppUTest/MemoryLeakDetectorTest.cpp index 13865cba9..ec8c53717 100644 --- a/tests/CppUTest/MemoryLeakDetectorTest.cpp +++ b/tests/CppUTest/MemoryLeakDetectorTest.cpp @@ -442,7 +442,7 @@ TEST(MemoryLeakDetectorTest, memoryCorruption) TEST(MemoryLeakDetectorTest, safelyDeleteNULL) { - detector->deallocMemory(defaultNewAllocator(), 0); + detector->deallocMemory(defaultNewAllocator(), NULLPTR); STRCMP_EQUAL("", reporter->message->asCharString()); } @@ -496,7 +496,7 @@ TEST(MemoryLeakDetectorTest, invalidateMemory) TEST(MemoryLeakDetectorTest, invalidateMemoryNULLShouldWork) { - detector->invalidateMemory(NULL); + detector->invalidateMemory(NULLPTR); } TEST_GROUP(MemoryLeakDetectorListTest) @@ -514,7 +514,7 @@ TEST(MemoryLeakDetectorListTest, clearAllAccountingIsWorkingProperly) listForTesting.clearAllAccounting(mem_leak_period_enabled); - CHECK(NULL == listForTesting.getFirstLeak(mem_leak_period_enabled)); + POINTERS_EQUAL(NULLPTR, listForTesting.getFirstLeak(mem_leak_period_enabled)); CHECK(&node3 == listForTesting.getFirstLeak(mem_leak_period_disabled)); } diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index ee903a6ad..0af9199d7 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -60,8 +60,8 @@ TEST_GROUP(MemoryLeakWarningLocalDetectorTest) TEST(MemoryLeakWarningLocalDetectorTest, localDetectorReturnsNewGlobalWhenNoneWasSet) { - MemoryLeakWarningPlugin memoryLeakWarningPlugin("TestMemoryLeakWarningPlugin", NULL); - CHECK(0 != memoryLeakWarningPlugin.getMemoryLeakDetector()); + MemoryLeakWarningPlugin memoryLeakWarningPlugin("TestMemoryLeakWarningPlugin", NULLPTR); + CHECK(NULLPTR != memoryLeakWarningPlugin.getMemoryLeakDetector()); } TEST(MemoryLeakWarningLocalDetectorTest, localDetectorIsTheOneSpecifiedInConstructor) @@ -74,7 +74,7 @@ TEST(MemoryLeakWarningLocalDetectorTest, localDetectorIsTheOneSpecifiedInConstru TEST(MemoryLeakWarningLocalDetectorTest, localDetectorIsGlobalDetector) { MemoryLeakDetector* globalDetector = MemoryLeakWarningPlugin::getGlobalDetector(); - MemoryLeakWarningPlugin memoryLeakWarningPlugin("TestMemoryLeakWarningPlugin", NULL); + MemoryLeakWarningPlugin memoryLeakWarningPlugin("TestMemoryLeakWarningPlugin", NULLPTR); MemoryLeakDetector* localDetector = memoryLeakWarningPlugin.getMemoryLeakDetector(); POINTERS_EQUAL(globalDetector, localDetector); } @@ -93,8 +93,8 @@ TEST_GROUP(MemoryLeakWarningTest) fixture->registry_->installPlugin(memPlugin); memPlugin->enable(); - leak1 = 0; - leak2 = 0; + leak1 = NULLPTR; + leak2 = NULLPTR; } void teardown() { @@ -230,7 +230,7 @@ TEST(MemoryLeakWarningGlobalDetectorTest, turnOffNewOverloadsCausesNoAdditionalL char* arrayMemory = new char[100]; char* nonArrayMemory = new char; char* mallocMemory = (char*) cpputest_malloc_location_with_leak_detection(10, "file", 10); - char* reallocMemory = (char*) cpputest_realloc_location_with_leak_detection(NULL, 10, "file", 10); + char* reallocMemory = (char*) cpputest_realloc_location_with_leak_detection(NULLPTR, 10, "file", 10); LONGS_EQUAL(storedAmountOfLeaks, detector->totalMemoryLeaks(mem_leak_period_all)); @@ -301,7 +301,7 @@ TEST(MemoryLeakWarningGlobalDetectorTest, crashOnLeakWithOperatorMalloc) TEST(MemoryLeakWarningGlobalDetectorTest, gettingTheGlobalDetectorDoesNotRestoreTheMemoryLeakOverloadsWhenTheyWereAlreadyOff) { - MemoryLeakWarningPlugin::setGlobalDetector(NULL, NULL); + MemoryLeakWarningPlugin::setGlobalDetector(NULLPTR, NULLPTR); MemoryLeakDetector* temporaryDetector = MemoryLeakWarningPlugin::getGlobalDetector(); MemoryLeakFailure* temporaryReporter = MemoryLeakWarningPlugin::getGlobalFailureReporter(); diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index 5567d150f..a9103abf1 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -16,8 +16,8 @@ TEST_GROUP(BasicBehavior) TEST(BasicBehavior, CanDeleteNullPointers) { - delete (char*) NULL; - delete [] (char*) NULL; + delete (char*) NULLPTR; + delete [] (char*) NULLPTR; } #ifndef CPPUTEST_MEM_LEAK_DETECTION_DISABLED @@ -332,12 +332,12 @@ TEST(TestForExceptionsInConstructor,ConstructorThrowsAnExceptionAllocatedAsArray TEST(OutOfMemoryTestsForOperatorNew, FailingNewOperatorReturnsNull) { - POINTERS_EQUAL(NULL, new char); + POINTERS_EQUAL(NULLPTR, new char); } TEST(OutOfMemoryTestsForOperatorNew, FailingNewArrayOperatorReturnsNull) { - POINTERS_EQUAL(NULL, new char[10]); + POINTERS_EQUAL(NULLPTR, new char[10]); } #endif @@ -386,24 +386,24 @@ TEST(OutOfMemoryTestsForOperatorNew, FailingNewArrayOperatorThrowsAnExceptionWhe TEST(OutOfMemoryTestsForOperatorNew, FailingNewOperatorReturnsNullWithoutOverride) { - POINTERS_EQUAL(NULL, new (std::nothrow) char); + POINTERS_EQUAL(NULLPTR, new (std::nothrow) char); } TEST(OutOfMemoryTestsForOperatorNew, FailingNewArrayOperatorReturnsNullWithoutOverride) { - POINTERS_EQUAL(NULL, new (std::nothrow) char[10]); + POINTERS_EQUAL(NULLPTR, new (std::nothrow) char[10]); } #else TEST(OutOfMemoryTestsForOperatorNew, FailingNewOperatorReturnsNullWithoutOverride) { - POINTERS_EQUAL(NULL, new char); + POINTERS_EQUAL(NULLPTR, new char); } TEST(OutOfMemoryTestsForOperatorNew, FailingNewArrayOperatorReturnsNullWithoutOverride) { - POINTERS_EQUAL(NULL, new char[10]); + POINTERS_EQUAL(NULLPTR, new char[10]); } #endif diff --git a/tests/CppUTest/PluginTest.cpp b/tests/CppUTest/PluginTest.cpp index 7a1495e1e..561958db0 100644 --- a/tests/CppUTest/PluginTest.cpp +++ b/tests/CppUTest/PluginTest.cpp @@ -126,7 +126,7 @@ TEST(PluginTest, InstallMultiplePlugins) registry->installPlugin(thirdPlugin); CHECK_EQUAL(firstPlugin, registry->getPluginByName(GENERIC_PLUGIN)); CHECK_EQUAL(thirdPlugin, registry->getPluginByName(GENERIC_PLUGIN3)); - CHECK_EQUAL(0, registry->getPluginByName("I do not exist")); + POINTERS_EQUAL(NULLPTR, registry->getPluginByName("I do not exist")); } TEST(PluginTest, ActionsAllRun) diff --git a/tests/CppUTest/SetPluginTest.cpp b/tests/CppUTest/SetPluginTest.cpp index c8042c23a..d62cd5bcd 100644 --- a/tests/CppUTest/SetPluginTest.cpp +++ b/tests/CppUTest/SetPluginTest.cpp @@ -41,7 +41,7 @@ TEST_GROUP(SetPointerPluginTest) void teardown() { - myRegistry_->setCurrentRegistry(0); + myRegistry_->setCurrentRegistry(NULLPTR); delete myRegistry_; delete plugin_; delete output_; diff --git a/tests/CppUTest/SimpleMutexTest.cpp b/tests/CppUTest/SimpleMutexTest.cpp index 9788ebe0b..17d86a18d 100644 --- a/tests/CppUTest/SimpleMutexTest.cpp +++ b/tests/CppUTest/SimpleMutexTest.cpp @@ -37,7 +37,7 @@ static int mutexDestroyCount = 0; static PlatformSpecificMutex StubMutexCreate(void) { mutexCreateCount++; - return 0; + return NULLPTR; } static void StubMutexLock(PlatformSpecificMutex) diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 3a8d61270..6e56d1ff0 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -56,13 +56,13 @@ TEST_GROUP(SimpleString) } void teardown() { - SimpleString::setStringAllocator(NULL); + SimpleString::setStringAllocator(NULLPTR); } }; TEST(SimpleString, defaultAllocatorIsNewArrayAllocator) { - SimpleString::setStringAllocator(NULL); + SimpleString::setStringAllocator(NULLPTR); POINTERS_EQUAL(getCurrentNewArrayAllocator(), SimpleString::getStringAllocator()); } @@ -86,7 +86,7 @@ TEST(SimpleString, allocatorForSimpleStringCanBeReplaced) SimpleString::setStringAllocator(&myOwnAllocator); SimpleString simpleString; CHECK(myOwnAllocator.memoryWasAllocated); - SimpleString::setStringAllocator(NULL); + SimpleString::setStringAllocator(NULLPTR); } TEST(SimpleString, CreateSequence) @@ -433,9 +433,9 @@ TEST(SimpleString, copyInBufferNormal) TEST(SimpleString, copyInBufferWithEmptyBuffer) { SimpleString str("Hello World"); - char* buffer= NULL; + char* buffer= NULLPTR; str.copyToBuffer(buffer, 0); - POINTERS_EQUAL(NULL, buffer); + POINTERS_EQUAL(NULLPTR, buffer); } TEST(SimpleString, copyInBufferWithBiggerBufferThanNeeded) @@ -461,13 +461,13 @@ TEST(SimpleString, copyInBufferWithSmallerBufferThanNeeded) TEST(SimpleString, ContainsNull) { - SimpleString s(0); + SimpleString s(NULLPTR); STRCMP_EQUAL("", s.asCharString()); } TEST(SimpleString, NULLReportsNullString) { - STRCMP_EQUAL("(null)", StringFromOrNull((char*) NULL).asCharString()); + STRCMP_EQUAL("(null)", StringFromOrNull((char*) NULLPTR).asCharString()); } TEST(SimpleString, Booleans) @@ -831,7 +831,7 @@ TEST(SimpleString, StrNCpy_zero_termination) TEST(SimpleString, StrNCpy_null_proof) { - POINTERS_EQUAL(NULL, SimpleString::StrNCpy(NULL, "woman", 6)); + POINTERS_EQUAL(NULLPTR, SimpleString::StrNCpy(NULLPTR, "woman", 6)); } TEST(SimpleString, StrNCpy_stops_at_end_of_string) @@ -908,9 +908,9 @@ TEST(SimpleString, StrStr) char foobarfoo[] = "foobarfoo"; char barf[] = "barf"; CHECK(SimpleString::StrStr(foo, empty) == foo); - CHECK(SimpleString::StrStr(empty, foo) == 0); + CHECK(SimpleString::StrStr(empty, foo) == NULLPTR); CHECK(SimpleString::StrStr(foobarfoo, barf) == foobarfoo+3); - CHECK(SimpleString::StrStr(barf, foobarfoo) == 0); + CHECK(SimpleString::StrStr(barf, foobarfoo) == NULLPTR); CHECK(SimpleString::StrStr(foo, foo) == foo); } @@ -939,7 +939,7 @@ TEST(SimpleString, Binary) STRCMP_EQUAL(expectedString, StringFromBinary(value, sizeof(value)).asCharString()); STRCMP_EQUAL(expectedString, StringFromBinaryOrNull(value, sizeof(value)).asCharString()); STRCMP_EQUAL("", StringFromBinary(value, 0).asCharString()); - STRCMP_EQUAL("(null)", StringFromBinaryOrNull(NULL, 0).asCharString()); + STRCMP_EQUAL("(null)", StringFromBinaryOrNull(NULLPTR, 0).asCharString()); } TEST(SimpleString, BinaryWithSize) @@ -950,7 +950,7 @@ TEST(SimpleString, BinaryWithSize) STRCMP_EQUAL(expectedString, StringFromBinaryWithSize(value, sizeof(value)).asCharString()); STRCMP_EQUAL(expectedString, StringFromBinaryWithSizeOrNull(value, sizeof(value)).asCharString()); STRCMP_EQUAL("Size = 0 | HexContents = ", StringFromBinaryWithSize(value, 0).asCharString()); - STRCMP_EQUAL("(null)", StringFromBinaryWithSizeOrNull(NULL, 0).asCharString()); + STRCMP_EQUAL("(null)", StringFromBinaryWithSizeOrNull(NULLPTR, 0).asCharString()); } TEST(SimpleString, BinaryWithSizeLargerThan128) @@ -970,7 +970,7 @@ TEST(SimpleString, MemCmp) LONGS_EQUAL(0, SimpleString::MemCmp(smaller, smaller, sizeof(smaller))); CHECK(SimpleString::MemCmp(smaller, greater, sizeof(smaller)) < 0); CHECK(SimpleString::MemCmp(greater, smaller, sizeof(smaller)) > 0); - LONGS_EQUAL(0, SimpleString::MemCmp(NULL, NULL, 0)); + LONGS_EQUAL(0, SimpleString::MemCmp(NULLPTR, NULLPTR, 0)); } TEST(SimpleString, MemCmpFirstLastNotMatching) diff --git a/tests/CppUTest/TeamCityOutputTest.cpp b/tests/CppUTest/TeamCityOutputTest.cpp index 140ff6519..690426bf0 100644 --- a/tests/CppUTest/TeamCityOutputTest.cpp +++ b/tests/CppUTest/TeamCityOutputTest.cpp @@ -9,7 +9,7 @@ class TeamCityOutputToBuffer : public TeamCityTestOutput { } - virtual ~TeamCityOutputToBuffer() + virtual ~TeamCityOutputToBuffer() _destructor_override { } diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index a5da54352..1f8c148f3 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -78,13 +78,13 @@ TEST(TestFailure, EqualsFailure) TEST(TestFailure, EqualsFailureWithNullAsActual) { - EqualsFailure f(test, failFileName, failLineNumber, "expected", NULL, ""); + EqualsFailure f(test, failFileName, failLineNumber, "expected", NULLPTR, ""); FAILURE_EQUAL("expected \n\tbut was <(null)>", f); } TEST(TestFailure, EqualsFailureWithNullAsExpected) { - EqualsFailure f(test, failFileName, failLineNumber, NULL, "actual", ""); + EqualsFailure f(test, failFileName, failLineNumber, NULLPTR, "actual", ""); FAILURE_EQUAL("expected <(null)>\n\tbut was ", f); } @@ -238,14 +238,14 @@ TEST(TestFailure, StringsEqualFailureAtTheBeginning) TEST(TestFailure, StringsEqualFailureWithNullAsActual) { - StringEqualFailure f(test, failFileName, failLineNumber, "abc", NULL, ""); + StringEqualFailure f(test, failFileName, failLineNumber, "abc", NULLPTR, ""); FAILURE_EQUAL("expected \n" "\tbut was <(null)>", f); } TEST(TestFailure, StringsEqualFailureWithNullAsExpected) { - StringEqualFailure f(test, failFileName, failLineNumber, NULL, "abd", ""); + StringEqualFailure f(test, failFileName, failLineNumber, NULLPTR, "abd", ""); FAILURE_EQUAL("expected <(null)>\n" "\tbut was ", f); } @@ -271,14 +271,14 @@ TEST(TestFailure, StringsEqualNoCaseFailure) TEST(TestFailure, StringsEqualNoCaseFailureWithActualAsNull) { - StringEqualNoCaseFailure f(test, failFileName, failLineNumber, "ABC", NULL, ""); + StringEqualNoCaseFailure f(test, failFileName, failLineNumber, "ABC", NULLPTR, ""); FAILURE_EQUAL("expected \n" "\tbut was <(null)>", f); } TEST(TestFailure, StringsEqualNoCaseFailureWithExpectedAsNull) { - StringEqualNoCaseFailure f(test, failFileName, failLineNumber, NULL, "abd", ""); + StringEqualNoCaseFailure f(test, failFileName, failLineNumber, NULLPTR, "abd", ""); FAILURE_EQUAL("expected <(null)>\n" "\tbut was ", f); } @@ -377,14 +377,14 @@ TEST(TestFailure, BinaryEqualLast) TEST(TestFailure, BinaryEqualActualNull) { const unsigned char expectedData[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - BinaryEqualFailure f(test, failFileName, failLineNumber, expectedData, NULL, sizeof(expectedData), ""); + BinaryEqualFailure f(test, failFileName, failLineNumber, expectedData, NULLPTR, sizeof(expectedData), ""); FAILURE_EQUAL("expected <00 00 00 00 00 00 00>\n\tbut was <(null)>", f); } TEST(TestFailure, BinaryEqualExpectedNull) { const unsigned char actualData[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; - BinaryEqualFailure f(test, failFileName, failLineNumber, NULL, actualData, sizeof(actualData), ""); + BinaryEqualFailure f(test, failFileName, failLineNumber, NULLPTR, actualData, sizeof(actualData), ""); FAILURE_EQUAL("expected <(null)>\n\tbut was <00 00 00 00 00 00 01>", f); } diff --git a/tests/CppUTest/TestFilterTest.cpp b/tests/CppUTest/TestFilterTest.cpp index ba476d3d6..1f60e6896 100644 --- a/tests/CppUTest/TestFilterTest.cpp +++ b/tests/CppUTest/TestFilterTest.cpp @@ -141,7 +141,7 @@ TEST(TestFilter, stringFromWithStrictInvertMatching) TEST(TestFilter, listOfFilters) { - TestFilter *listOfFilters = NULL; + TestFilter *listOfFilters = NULLPTR; TestFilter first("foo"); TestFilter secnd("bar"); listOfFilters = first.add(listOfFilters); @@ -150,7 +150,7 @@ TEST(TestFilter, listOfFilters) STRCMP_EQUAL("TestFilter: \"bar\"", StringFrom(*current).asCharString()); current = current->getNext(); STRCMP_EQUAL("TestFilter: \"foo\"", StringFrom(*current).asCharString()); - POINTERS_EQUAL(NULL, current->getNext()); + POINTERS_EQUAL(NULLPTR, current->getNext()); } TEST(TestFilter, constructors) @@ -158,9 +158,9 @@ TEST(TestFilter, constructors) TestFilter filter1; TestFilter filter2(SimpleString("a")); TestFilter filter3("a"); - CHECK(filter1.getNext() == NULL); - CHECK(filter2.getNext() == NULL); - CHECK(filter3.getNext() == NULL); + CHECK(filter1.getNext() == NULLPTR); + CHECK(filter2.getNext() == NULLPTR); + CHECK(filter3.getNext() == NULLPTR); CHECK(filter2.match("ab")); CHECK(filter3.match("ab")); } diff --git a/tests/CppUTest/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp index b72567662..913df1cb0 100644 --- a/tests/CppUTest/TestHarness_cTest.cpp +++ b/tests/CppUTest/TestHarness_cTest.cpp @@ -316,12 +316,12 @@ TEST(TestHarness_c, checkString) static void _failPointerMethod() { HasTheDestructorBeenCalledChecker checker; - CHECK_EQUAL_C_POINTER(NULL, (void *)0x1); + CHECK_EQUAL_C_POINTER(NULLPTR, (void *)0x1); } TEST(TestHarness_c, checkPointer) { - CHECK_EQUAL_C_POINTER(NULL, NULL); + CHECK_EQUAL_C_POINTER(NULLPTR, NULLPTR); fixture->setTestFunction(_failPointerMethod); fixture->runAllTests(); fixture->assertPrintContains("expected <0x0>\n but was <0x1>"); @@ -337,7 +337,7 @@ static void _failBitsMethod() TEST(TestHarness_c, checkBits) { - CHECK_EQUAL_C_POINTER(NULL, NULL); + CHECK_EQUAL_C_POINTER(NULLPTR, NULLPTR); fixture->setTestFunction(_failBitsMethod); fixture->runAllTests(); fixture->assertPrintContains("expected <00000000 00000001>\n\tbut was <00000000 00000011>"); @@ -395,11 +395,11 @@ TEST(TestHarness_c, checkCheck) TEST(TestHarness_c, cpputest_malloc_out_of_memory) { cpputest_malloc_set_out_of_memory(); - CHECK(0 == cpputest_malloc(100)); + CHECK(NULLPTR == cpputest_malloc(100)); cpputest_malloc_set_not_out_of_memory(); void * mem = cpputest_malloc(100); - CHECK(0 != mem); + CHECK(NULLPTR != mem); cpputest_free(mem); } @@ -409,9 +409,9 @@ TEST(TestHarness_c, cpputest_malloc_out_of_memory_after_n_mallocs) void * m1 = cpputest_malloc(10); void * m2 = cpputest_malloc(11); void * m3 = cpputest_malloc(12); - CHECK(m1); - CHECK(m2); - POINTERS_EQUAL(0, m3); + CHECK(m1 != NULLPTR); + CHECK(m2 != NULLPTR); + CHECK(m3 == NULLPTR); cpputest_malloc_set_not_out_of_memory(); cpputest_free(m1); cpputest_free(m2); @@ -421,7 +421,7 @@ TEST(TestHarness_c, cpputest_malloc_out_of_memory_after_0_mallocs) { cpputest_malloc_set_out_of_memory_countdown(0); void * m1 = cpputest_malloc(10); - CHECK(m1 == 0); + CHECK(m1 == NULLPTR); cpputest_malloc_set_not_out_of_memory(); } @@ -442,7 +442,7 @@ TEST(TestHarness_c, count_mallocs) TEST(TestHarness_c, cpputest_strdup) { char * mem = cpputest_strdup("0123456789"); - CHECK(0 != mem); + CHECK(NULLPTR != mem); STRCMP_EQUAL("0123456789", mem) cpputest_free(mem); } @@ -450,7 +450,7 @@ TEST(TestHarness_c, cpputest_strdup) TEST(TestHarness_c, cpputest_strndup) { char * mem = cpputest_strndup("0123456789", 3); - CHECK(0 != mem); + CHECK(NULLPTR != mem); STRCMP_EQUAL("012", mem) cpputest_free(mem); } @@ -460,7 +460,7 @@ TEST(TestHarness_c, cpputest_strndup) TEST(TestHarness_c, cpputest_calloc) { void * mem = cpputest_calloc(10, 10); - CHECK(0 != mem); + CHECK(NULLPTR != mem); cpputest_free(mem); } @@ -472,11 +472,11 @@ TEST(TestHarness_c, cpputest_realloc_larger) SimpleString::StrNCpy(mem1, number_string, 10); - CHECK(mem1 != 0); + CHECK(mem1 != NULLPTR); char* mem2 = (char*) cpputest_realloc(mem1, 1000); - CHECK(mem2 != 0); + CHECK(mem2 != NULLPTR); STRCMP_EQUAL(number_string, mem2); cpputest_free(mem2); @@ -516,7 +516,7 @@ TEST(TestHarness_c, callocShouldReturnNULLWhenOutOfMeory) { cpputest_malloc_set_out_of_memory_countdown(0); void * m = cpputest_calloc(1, 1); - CHECK(m == 0); + CHECK(m == NULLPTR); cpputest_malloc_set_not_out_of_memory(); } #endif diff --git a/tests/CppUTest/TestInstallerTest.cpp b/tests/CppUTest/TestInstallerTest.cpp index ea60037f2..ec646700d 100644 --- a/tests/CppUTest/TestInstallerTest.cpp +++ b/tests/CppUTest/TestInstallerTest.cpp @@ -50,7 +50,7 @@ TEST_GROUP(TestInstaller) } void teardown() { - myRegistry->setCurrentRegistry(0); + myRegistry->setCurrentRegistry(NULLPTR); testInstaller->unDo(); delete testInstaller; delete myRegistry; diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 85819acf8..2a76a7ebe 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -35,7 +35,7 @@ TEST_GROUP(TestMemoryAllocatorTest) void setup() { - allocator = NULL; + allocator = NULLPTR; } void teardown() @@ -158,14 +158,14 @@ TEST_GROUP(FailableMemoryAllocator) TEST(FailableMemoryAllocator, MallocWorksNormallyIfNotAskedToFail) { int *memory = (int*)malloc(sizeof(int)); - CHECK(memory != NULL); + CHECK(memory != NULLPTR); free(memory); } TEST(FailableMemoryAllocator, FailFirstMalloc) { failableMallocAllocator.failAllocNumber(1); - POINTERS_EQUAL(NULL, (int*)malloc(sizeof(int))); + POINTERS_EQUAL(NULLPTR, (int*)malloc(sizeof(int))); } TEST(FailableMemoryAllocator, FailSecondAndFourthMalloc) @@ -177,10 +177,10 @@ TEST(FailableMemoryAllocator, FailSecondAndFourthMalloc) int *memory3 = (int*)malloc(sizeof(int)); int *memory4 = (int*)malloc(sizeof(int)); - CHECK(NULL != memory1); - POINTERS_EQUAL(NULL, memory2); - CHECK(NULL != memory3); - POINTERS_EQUAL(NULL, memory4); + CHECK(NULLPTR != memory1); + POINTERS_EQUAL(NULLPTR, memory2); + CHECK(NULLPTR != memory3); + POINTERS_EQUAL(NULLPTR, memory4); free(memory1); free(memory3); @@ -211,19 +211,19 @@ TEST(FailableMemoryAllocator, FailFirstAllocationAtGivenLine) { failableMallocAllocator.failNthAllocAt(1, __FILE__, __LINE__ + 2); - POINTERS_EQUAL(NULL, malloc(sizeof(int))); + POINTERS_EQUAL(NULLPTR, malloc(sizeof(int))); } TEST(FailableMemoryAllocator, FailThirdAllocationAtGivenLine) { - int *memory[10] = { NULL }; + int *memory[10] = { NULLPTR }; int allocation; failableMallocAllocator.failNthAllocAt(3, __FILE__, __LINE__ + 4); for (allocation = 1; allocation <= 10; allocation++) { memory[allocation - 1] = (int *)malloc(sizeof(int)); - if (memory[allocation - 1] == NULL) + if (memory[allocation - 1] == NULLPTR) break; } diff --git a/tests/CppUTest/TestRegistryTest.cpp b/tests/CppUTest/TestRegistryTest.cpp index 6f544af8a..9e6882e07 100644 --- a/tests/CppUTest/TestRegistryTest.cpp +++ b/tests/CppUTest/TestRegistryTest.cpp @@ -132,7 +132,7 @@ TEST_GROUP(TestRegistry) void teardown() { - myRegistry->setCurrentRegistry(0); + myRegistry->setCurrentRegistry(NULLPTR); delete myRegistry; delete test1; delete test2; @@ -236,7 +236,7 @@ TEST(TestRegistry, reallyUndoLastTest) TEST(TestRegistry, findTestWithNameDoesntExist) { - CHECK(myRegistry->findTestWithName("ThisTestDoesntExists") == NULL); + CHECK(myRegistry->findTestWithName("ThisTestDoesntExists") == NULLPTR); } TEST(TestRegistry, findTestWithName) @@ -245,12 +245,12 @@ TEST(TestRegistry, findTestWithName) test2->setTestName("SomeOtherTest"); myRegistry->addTest(test1); myRegistry->addTest(test2); - CHECK(myRegistry->findTestWithName("NameOfATestThatDoesExist")); + CHECK(myRegistry->findTestWithName("NameOfATestThatDoesExist") != NULLPTR); } TEST(TestRegistry, findTestWithGroupDoesntExist) { - CHECK(myRegistry->findTestWithGroup("ThisTestGroupDoesntExists") == NULL); + CHECK(myRegistry->findTestWithGroup("ThisTestGroupDoesntExists") == NULLPTR); } TEST(TestRegistry, findTestWithGroup) @@ -259,7 +259,7 @@ TEST(TestRegistry, findTestWithGroup) test2->setGroupName("SomeOtherGroup"); myRegistry->addTest(test1); myRegistry->addTest(test2); - CHECK(myRegistry->findTestWithGroup("GroupOfATestThatDoesExist")); + CHECK(myRegistry->findTestWithGroup("GroupOfATestThatDoesExist") != NULLPTR); } TEST(TestRegistry, nameFilterWorks) @@ -311,7 +311,7 @@ class MyTestPluginDummy: public TestPlugin { public: MyTestPluginDummy(const SimpleString& name) : TestPlugin(name) {} - virtual ~MyTestPluginDummy() {} + virtual ~MyTestPluginDummy() _destructor_override {} virtual void runAllPreTestAction(UtestShell&, TestResult&) _override {} virtual void runAllPostTestAction(UtestShell&, TestResult&) _override {} }; diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index b04d7d361..8d34107a2 100755 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -733,7 +733,7 @@ TEST(UnitTestMacros, FailureWithPOINTERS_EQUAL) TEST(UnitTestMacros, POINTERS_EQUALBehavesAsProperMacro) { - if (false) POINTERS_EQUAL(0, to_void_pointer(0xbeefbeef)) + if (false) POINTERS_EQUAL(NULLPTR, to_void_pointer(0xbeefbeef)) else POINTERS_EQUAL(to_void_pointer(0xdeadbeef), to_void_pointer(0xdeadbeef)) } @@ -758,7 +758,7 @@ TEST(UnitTestMacros, FailureWithPOINTERS_EQUAL_TEXT) TEST(UnitTestMacros, POINTERS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) POINTERS_EQUAL_TEXT(0, to_void_pointer(0xbeefbeef), "Failed because it failed") + if (false) POINTERS_EQUAL_TEXT(NULLPTR, to_void_pointer(0xbeefbeef), "Failed because it failed") else POINTERS_EQUAL_TEXT(to_void_pointer(0xdeadbeef), to_void_pointer(0xdeadbeef), "Failed because it failed") } @@ -783,7 +783,7 @@ TEST(UnitTestMacros, FailureWithFUNCTIONPOINTERS_EQUAL) TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUALBehavesAsProperMacro) { - if (false) FUNCTIONPOINTERS_EQUAL(0, to_func_pointer(0xbeefbeef)) + if (false) FUNCTIONPOINTERS_EQUAL(NULLPTR, to_func_pointer(0xbeefbeef)) else FUNCTIONPOINTERS_EQUAL(to_func_pointer(0xdeadbeef), to_func_pointer(0xdeadbeef)) } @@ -808,7 +808,7 @@ TEST(UnitTestMacros, FailureWithFUNCTIONPOINTERS_EQUAL_TEXT) TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) FUNCTIONPOINTERS_EQUAL_TEXT(0, to_func_pointer(0xbeefbeef), "Failed because it failed") + if (false) FUNCTIONPOINTERS_EQUAL_TEXT(NULLPTR, to_func_pointer(0xbeefbeef), "Failed because it failed") else FUNCTIONPOINTERS_EQUAL_TEXT(to_func_pointer(0xdeadbeef), to_func_pointer(0xdeadbeef), "Failed because it failed") } @@ -931,8 +931,8 @@ static int functionThatReturnsAValue() STRCMP_EQUAL_TEXT("THIS", "THIS", "Shouldn't fail"); DOUBLES_EQUAL(1.0, 1.0, .01); DOUBLES_EQUAL_TEXT(1.0, 1.0, .01, "Shouldn't fail"); - POINTERS_EQUAL(0, 0); - POINTERS_EQUAL_TEXT(0, 0, "Shouldn't fail"); + POINTERS_EQUAL(NULLPTR, NULLPTR); + POINTERS_EQUAL_TEXT(NULLPTR, NULLPTR, "Shouldn't fail"); MEMCMP_EQUAL("THIS", "THIS", 5); MEMCMP_EQUAL_TEXT("THIS", "THIS", 5, "Shouldn't fail"); BITS_EQUAL(0x01, (unsigned char )0x01, 0xFF); @@ -979,7 +979,7 @@ static void _MEMCMP_EQUALFailingTestMethodWithNullExpected() { unsigned char actualData[] = { 0x00, 0x01, 0x02, 0x03 }; - MEMCMP_EQUAL(NULL, actualData, sizeof(actualData)); + MEMCMP_EQUAL(NULLPTR, actualData, sizeof(actualData)); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE @@ -994,7 +994,7 @@ static void _MEMCMP_EQUALFailingTestMethodWithNullActual() { unsigned char expectedData[] = { 0x00, 0x01, 0x02, 0x03 }; - MEMCMP_EQUAL(expectedData, NULL, sizeof(expectedData)); + MEMCMP_EQUAL(expectedData, NULLPTR, sizeof(expectedData)); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE @@ -1007,8 +1007,8 @@ TEST(UnitTestMacros, MEMCMP_EQUALFailureWithNullActual) TEST(UnitTestMacros, MEMCMP_EQUALNullExpectedNullActual) { - MEMCMP_EQUAL(NULL, NULL, 0); - MEMCMP_EQUAL(NULL, NULL, 1024); + MEMCMP_EQUAL(NULLPTR, NULLPTR, 0); + MEMCMP_EQUAL(NULLPTR, NULLPTR, 1024); } static void _failingTestMethodWithMEMCMP_EQUAL_TEXT() diff --git a/tests/CppUTest/TestUTestStringMacro.cpp b/tests/CppUTest/TestUTestStringMacro.cpp index 62ac79ddb..27e1e0df2 100755 --- a/tests/CppUTest/TestUTestStringMacro.cpp +++ b/tests/CppUTest/TestUTestStringMacro.cpp @@ -38,7 +38,7 @@ TEST_GROUP(UnitTestStringMacros) static void _STRCMP_EQUALWithActualIsNULLTestMethod() { - STRCMP_EQUAL("ok", NULL); + STRCMP_EQUAL("ok", NULLPTR); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUALAndActualIsNULL) @@ -49,7 +49,7 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUALAndActualIsNULL) static void _STRCMP_EQUALWithExpectedIsNULLTestMethod() { - STRCMP_EQUAL(NULL, "ok"); + STRCMP_EQUAL(NULLPTR, "ok"); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUALAndExpectedIsNULL) @@ -60,7 +60,7 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUALAndExpectedIsNULL) static void _STRCMP_CONTAINSWithActualIsNULLTestMethod() { - STRCMP_CONTAINS("ok", NULL); + STRCMP_CONTAINS("ok", NULLPTR); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINSAndActualIsNULL) @@ -71,7 +71,7 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINSAndActualIsNULL) static void _STRCMP_CONTAINSWithExpectedIsNULLTestMethod() { - STRCMP_CONTAINS(NULL, "ok"); + STRCMP_CONTAINS(NULLPTR, "ok"); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINSAndExpectedIsNULL) @@ -82,7 +82,7 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINSAndExpectedIsNULL) static void _STRNCMP_EQUALWithActualIsNULLTestMethod() { - STRNCMP_EQUAL("ok", NULL, 2); + STRNCMP_EQUAL("ok", NULLPTR, 2); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUALAndActualIsNULL) @@ -93,7 +93,7 @@ TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUALAndActualIsNULL) static void _STRNCMP_EQUALWithExpectedIsNULLTestMethod() { - STRNCMP_EQUAL(NULL, "ok", 2); + STRNCMP_EQUAL(NULLPTR, "ok", 2); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUALAndExpectedIsNULL) @@ -104,7 +104,7 @@ TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUALAndExpectedIsNULL) static void _STRCMP_NOCASE_EQUALWithActualIsNULLTestMethod() { - STRCMP_NOCASE_EQUAL("ok", NULL); + STRCMP_NOCASE_EQUAL("ok", NULLPTR); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUALAndActualIsNULL) @@ -115,7 +115,7 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUALAndActualIsNULL) static void _STRCMP_NOCASE_EQUALWithExpectedIsNULLTestMethod() { - STRCMP_NOCASE_EQUAL(NULL, "ok"); + STRCMP_NOCASE_EQUAL(NULLPTR, "ok"); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUALAndExpectedIsNULL) @@ -137,7 +137,7 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUALAndUnequalInput) static void _STRCMP_NOCASE_CONTAINSWithActualIsNULLTestMethod() { - STRCMP_NOCASE_CONTAINS("ok", NULL); + STRCMP_NOCASE_CONTAINS("ok", NULLPTR); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_CONTAINSAndActualIsNULL) @@ -148,7 +148,7 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_CONTAINSAndActualIsNULL) static void _STRCMP_NOCASE_CONTAINSWithExpectedIsNULLTestMethod() { - STRCMP_NOCASE_CONTAINS(NULL, "ok"); + STRCMP_NOCASE_CONTAINS(NULLPTR, "ok"); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_CONTAINSAndExpectedIsNULL) diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index cf8bbd469..5801818b8 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -60,7 +60,7 @@ static void _failFunction() extern "C" { - static int (*original_waitpid)(int, int*, int) = NULL; + static int (*original_waitpid)(int, int*, int) = NULLPTR; static int fork_failed_stub(void) { return -1; } @@ -85,7 +85,7 @@ extern "C" { static int _accessViolationTestFunction() { - return *(volatile int*) 0; + return *(volatile int*) NULLPTR; } #include diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 14149d324..2d5d81216 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -92,7 +92,7 @@ TEST(UtestShell, PassedCheckEqualWillIncreaseTheAmountOfChecks) IGNORE_TEST(UtestShell, IgnoreTestAccessingFixture) { - CHECK(&fixture != NULL); + CHECK(&fixture != NULLPTR); } TEST(UtestShell, MacrosUsedInSetup) @@ -358,7 +358,7 @@ class AllocateAndDeallocateInConstructorAndDestructor AllocateAndDeallocateInConstructorAndDestructor() { memory_ = new char[100]; - morememory_ = NULL; + morememory_ = NULLPTR; } void allocateMoreMemory() { diff --git a/tests/CppUTestExt/CodeMemoryReporterTest.cpp b/tests/CppUTestExt/CodeMemoryReporterTest.cpp index 41b01f33d..2f84f1154 100644 --- a/tests/CppUTestExt/CodeMemoryReporterTest.cpp +++ b/tests/CppUTestExt/CodeMemoryReporterTest.cpp @@ -124,7 +124,7 @@ TEST(CodeMemoryReportFormatter, NewAllocatorGeneratesDeleteCode) TEST(CodeMemoryReportFormatter, DeleteNullWorksFine) { - formatter->report_free_memory(testResult, newAllocator, NULL, "boo", 4); + formatter->report_free_memory(testResult, newAllocator, NULLPTR, "boo", 4); TESTOUTPUT_CONTAINS("delete [] NULL; /* using delete at boo:4 */"); } diff --git a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp index c518a947b..773dc96c0 100644 --- a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp +++ b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp @@ -270,12 +270,12 @@ TEST(MockExpectedCallsList, callToStringForFulfilledFunctions) TEST(MockExpectedCallsList, removeOneFinalizedMatchingExpectationFromEmptyList) { - POINTERS_EQUAL(NULL, list->removeFirstFinalizedMatchingExpectation()); + POINTERS_EQUAL(NULLPTR, list->removeFirstFinalizedMatchingExpectation()); } TEST(MockExpectedCallsList, getOneMatchingExpectationFromEmptyList) { - POINTERS_EQUAL(NULL, list->getFirstMatchingExpectation()); + POINTERS_EQUAL(NULLPTR, list->getFirstMatchingExpectation()); } TEST(MockExpectedCallsList, toStringOnEmptyList) diff --git a/tests/CppUTestExt/MemoryReporterPluginTest.cpp b/tests/CppUTestExt/MemoryReporterPluginTest.cpp index f352a4882..aa1b9550e 100644 --- a/tests/CppUTestExt/MemoryReporterPluginTest.cpp +++ b/tests/CppUTestExt/MemoryReporterPluginTest.cpp @@ -255,7 +255,7 @@ class UtestForMemoryReportingPlugingTest : public UtestShell TEST(MemoryReporterPlugin, endOfaTestGroupWillReportSo) { - UtestForMemoryReportingPlugingTest fourthTest("differentGroupName", NULL); + UtestForMemoryReportingPlugingTest fourthTest("differentGroupName", NULLPTR); UtestForMemoryReportingPlugingTest thirdTest("differentGroupName", &fourthTest); UtestForMemoryReportingPlugingTest secondTest("groupname", &thirdTest); UtestForMemoryReportingPlugingTest firstTest("groupname", &secondTest); diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 6061a881f..66b489cda 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -74,7 +74,7 @@ TEST(MockCheckedActualCall, unExpectedCallWithAParameter) TEST(MockCheckedActualCall, unExpectedCallWithAnOutputParameter) { MockCheckedActualCall actualCall(1, reporter, *emptyList); - actualCall.withName("unexpected").withOutputParameter("bar", (void*)0); + actualCall.withName("unexpected").withOutputParameter("bar", NULLPTR); MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "unexpected", *list); CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); @@ -165,11 +165,11 @@ TEST(MockCheckedActualCall, MockIgnoredActualCallWorksAsItShould) DOUBLES_EQUAL(1.5, actual.returnDoubleValueOrDefault(1.5), 0.0); STRCMP_EQUAL("bla", actual.returnStringValueOrDefault("bla")); STRCMP_EQUAL("", actual.returnStringValue()); - CHECK(0 == actual.returnPointerValue()); + CHECK(NULLPTR == actual.returnPointerValue()); CHECK((void*) 0x2 == actual.returnPointerValueOrDefault((void*) 0x2)); - CHECK(0 == actual.returnConstPointerValue()); + CHECK(NULLPTR == actual.returnConstPointerValue()); CHECK((const void*) 0x2 == actual.returnConstPointerValueOrDefault((const void*) 0x2)); - CHECK(0 == actual.returnFunctionPointerValue()); + CHECK(NULLPTR == actual.returnFunctionPointerValue()); CHECK((void(*)()) 1 == actual.returnFunctionPointerValueOrDefault((void(*)()) 0x1)); CHECK_FALSE(actual.hasReturnValue()); CHECK(actual.returnValue().equals(MockNamedValue(""))); @@ -232,11 +232,11 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) DOUBLES_EQUAL(0.0, actual.returnDoubleValueOrDefault(1.0), 0.0); STRCMP_EQUAL("", actual.returnStringValueOrDefault("bla")); STRCMP_EQUAL("", actual.returnStringValue()); - CHECK(0 == actual.returnPointerValue()); - CHECK(0 == actual.returnPointerValueOrDefault((void*) 0x0)); - CHECK(0 == actual.returnConstPointerValue()); - CHECK(0 == actual.returnConstPointerValueOrDefault((const void*) 0x0)); - CHECK(0 == actual.returnFunctionPointerValue()); - CHECK(0 == actual.returnFunctionPointerValueOrDefault((void (*)()) 0x0)); + CHECK(NULLPTR == actual.returnPointerValue()); + CHECK(NULLPTR == actual.returnPointerValueOrDefault((void*) NULLPTR)); + CHECK(NULLPTR == actual.returnConstPointerValue()); + CHECK(NULLPTR == actual.returnConstPointerValueOrDefault((const void*) NULLPTR)); + CHECK(NULLPTR == actual.returnFunctionPointerValue()); + CHECK(NULLPTR == actual.returnFunctionPointerValueOrDefault((void (*)()) NULLPTR)); } diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 2770af5df..b9cd60fe1 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -82,7 +82,7 @@ TEST_GROUP(MockNamedValueHandlerRepository) TEST(MockNamedValueHandlerRepository, getComparatorForNonExistingName) { MockNamedValueComparatorsAndCopiersRepository repository; - POINTERS_EQUAL(NULL, repository.getComparatorForType("typeName")); + POINTERS_EQUAL(NULLPTR, repository.getComparatorForType("typeName")); } TEST(MockNamedValueHandlerRepository, installComparator) @@ -108,7 +108,7 @@ TEST(MockNamedValueHandlerRepository, installMultipleComparators) TEST(MockNamedValueHandlerRepository, getCopierForNonExistingName) { MockNamedValueComparatorsAndCopiersRepository repository; - POINTERS_EQUAL(NULL, repository.getCopierForType("typeName")); + POINTERS_EQUAL(NULLPTR, repository.getCopierForType("typeName")); } TEST(MockNamedValueHandlerRepository, installCopier) @@ -713,7 +713,7 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.withName("func"); ignored.withCallOrder(1); ignored.withCallOrder(1, 1); - ignored.onObject((void*) 0); + ignored.onObject(NULLPTR); ignored.withBoolParameter("umm", true); ignored.withIntParameter("bla", (int) 1); ignored.withUnsignedIntParameter("foo", (unsigned int) 1); @@ -721,13 +721,13 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.withUnsignedLongIntParameter("bah", (unsigned long int) 1); ignored.withDoubleParameter("hah", (double) 1.1f); ignored.withStringParameter("goo", "hello"); - ignored.withPointerParameter("pie", (void*) 0); - ignored.withConstPointerParameter("woo", (const void*) 0); - ignored.withFunctionPointerParameter("fop", (void(*)()) 0); - ignored.withMemoryBufferParameter("waa", (const unsigned char*) 0, 0); - ignored.withParameterOfType( "mytype", "top", (const void*) 0); - ignored.withOutputParameterReturning("bar", (void*) 0, 1); - ignored.withOutputParameterOfTypeReturning("mytype", "bar", (const void*) 0); + ignored.withPointerParameter("pie", (void*) NULLPTR); + ignored.withConstPointerParameter("woo", (const void*) NULLPTR); + ignored.withFunctionPointerParameter("fop", (void(*)()) NULLPTR); + ignored.withMemoryBufferParameter("waa", (const unsigned char*) NULLPTR, 0); + ignored.withParameterOfType( "mytype", "top", (const void*) NULLPTR); + ignored.withOutputParameterReturning("bar", (void*) NULLPTR, 1); + ignored.withOutputParameterOfTypeReturning("mytype", "bar", (const void*) NULLPTR); ignored.ignoreOtherParameters(); ignored.andReturnValue(true); ignored.andReturnValue((double) 1.0f); @@ -736,7 +736,7 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.andReturnValue((unsigned long int) 1); ignored.andReturnValue((long int) 1); ignored.andReturnValue("boo"); - ignored.andReturnValue((void*) 0); - ignored.andReturnValue((const void*) 0); - ignored.andReturnValue((void(*)()) 0); + ignored.andReturnValue((void*) NULLPTR); + ignored.andReturnValue((const void*) NULLPTR); + ignored.andReturnValue((void(*)()) NULLPTR); } diff --git a/tests/CppUTestExt/MockFailureReporterForTest.cpp b/tests/CppUTestExt/MockFailureReporterForTest.cpp index 516e7bb22..520532a7d 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.cpp +++ b/tests/CppUTestExt/MockFailureReporterForTest.cpp @@ -45,7 +45,7 @@ MockFailureReporterInstaller::MockFailureReporterInstaller() MockFailureReporterInstaller::~MockFailureReporterInstaller() { - mock().setMockFailureStandardReporter(NULL); + mock().setMockFailureStandardReporter(NULLPTR); } UtestShell* mockFailureTest() diff --git a/tests/CppUTestExt/MockNamedValueTest.cpp b/tests/CppUTestExt/MockNamedValueTest.cpp index 612b6e6bd..e9b9d45d0 100644 --- a/tests/CppUTestExt/MockNamedValueTest.cpp +++ b/tests/CppUTestExt/MockNamedValueTest.cpp @@ -37,7 +37,7 @@ class MyComparator : public MockNamedValueComparator public: MyComparator() {} - virtual ~MyComparator() {} + virtual ~MyComparator() _destructor_override {} virtual bool isEqual(const void*, const void*) _override { return false; } virtual SimpleString valueToString(const void*) _override { return ""; } @@ -48,7 +48,7 @@ class MyCopier : public MockNamedValueCopier public: MyCopier() {} - virtual ~MyCopier() {} + virtual ~MyCopier() _destructor_override {} virtual void copy(void*, const void*) _override {} }; diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 74b608d2f..f4b6ba3b4 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -713,12 +713,12 @@ TEST(MockParameterTest, ignoreOtherCallsIgnoresWithAllKindsOfParameters) .withParameter("foo", 1l) .withParameter("hey", 1ul) .withParameter("duh", 1.0) - .withParameter("yoo", (const void*) 0) - .withParameter("func", (void(*)()) 0) - .withParameter("mem", (const unsigned char*) 0, 0) - .withParameterOfType("hoo", "int", (const void*) 0) - .withOutputParameter("gah", (void*) 0) - .withOutputParameterOfType("goo", "int", (void*) 0); + .withParameter("yoo", (const void*) NULLPTR) + .withParameter("func", (void(*)()) NULLPTR) + .withParameter("mem", (const unsigned char*) NULLPTR, 0) + .withParameterOfType("hoo", "int", (const void*) NULLPTR) + .withOutputParameter("gah", (void*) NULLPTR) + .withOutputParameterOfType("goo", "int", (void*) NULLPTR); mock().checkExpectations(); } diff --git a/tests/CppUTestExt/MockPluginTest.cpp b/tests/CppUTestExt/MockPluginTest.cpp index ae1739b86..ffe714f07 100644 --- a/tests/CppUTestExt/MockPluginTest.cpp +++ b/tests/CppUTestExt/MockPluginTest.cpp @@ -106,8 +106,8 @@ TEST(MockPlugin, installComparatorRecordsTheComparatorButNotInstallsItYet) DummyComparator comparator; plugin.installComparator("myType", comparator); - mock().expectOneCall("foo").withParameterOfType("myType", "name", NULL); - mock().actualCall("foo").withParameterOfType("myType", "name", NULL); + mock().expectOneCall("foo").withParameterOfType("myType", "name", NULLPTR); + mock().actualCall("foo").withParameterOfType("myType", "name", NULLPTR); MockNoWayToCompareCustomTypeFailure failure(test, "myType"); CHECK_EXPECTED_MOCK_FAILURE(failure); @@ -128,8 +128,8 @@ TEST(MockPlugin, installCopierRecordsTheCopierButNotInstallsItYet) DummyCopier copier; plugin.installCopier("myType", copier); - mock().expectOneCall("foo").withOutputParameterOfTypeReturning("myType", "name", NULL); - mock().actualCall("foo").withOutputParameterOfType("myType", "name", NULL); + mock().expectOneCall("foo").withOutputParameterOfTypeReturning("myType", "name", NULLPTR); + mock().actualCall("foo").withOutputParameterOfType("myType", "name", NULLPTR); MockNoWayToCopyCustomTypeFailure failure(test, "myType"); CHECK_EXPECTED_MOCK_FAILURE(failure); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index d7e79ee56..65cd5e613 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -60,12 +60,12 @@ TEST(MockSupport_c, OrderObserved) TEST(MockSupport_c, hasReturnValue) { mock_c()->expectOneCall("foo"); - CHECK(!mock_c()->actualCall("foo")->hasReturnValue()); - CHECK(!mock_c()->hasReturnValue()); + CHECK(mock_c()->actualCall("foo")->hasReturnValue() == 0); + CHECK(mock_c()->hasReturnValue() == 0); mock_c()->expectOneCall("foo2")->andReturnIntValue(1); - CHECK(mock_c()->actualCall("foo2")->hasReturnValue()); - CHECK(mock_c()->hasReturnValue()); + CHECK(mock_c()->actualCall("foo2")->hasReturnValue() != 0); + CHECK(mock_c()->hasReturnValue() != 0); } TEST(MockSupport_c, expectAndActualOneCall) diff --git a/tests/CppUTestExt/OrderedTestTest.cpp b/tests/CppUTestExt/OrderedTestTest.cpp index 9d2c78bd7..3a6602121 100644 --- a/tests/CppUTestExt/OrderedTestTest.cpp +++ b/tests/CppUTestExt/OrderedTestTest.cpp @@ -46,7 +46,7 @@ TEST_GROUP(TestOrderedTest) void setup() { orderedTestCache = OrderedTestShell::getOrderedTestHead(); - OrderedTestShell::setOrderedTestHead(0); + OrderedTestShell::setOrderedTestHead(NULLPTR); fixture = new TestTestingFixture(); fixture->registry_->unDoLastAddTest(); From 87a6909b32128151f7d55eecc3ff6485bd81dc05 Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Fri, 23 Feb 2018 07:53:26 +0100 Subject: [PATCH 0162/1093] Removed const casts which became unnecessary after #1141. --- src/CppUTestExt/MockSupport.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index fe8ff4f5f..32eb90912 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -455,7 +455,7 @@ MockSupport* MockSupport::getMockSupportScope(const SimpleString& name) if (hasData(mockingSupportName)) { STRCMP_EQUAL("MockSupport", getData(mockingSupportName).getType().asCharString()); - return static_cast( const_cast( getData(mockingSupportName).getObjectPointer() ) ); + return (MockSupport*) getData(mockingSupportName).getObjectPointer(); } MockSupport *newMock = clone(name); @@ -467,7 +467,7 @@ MockSupport* MockSupport::getMockSupportScope(const SimpleString& name) MockSupport* MockSupport::getMockSupport(MockNamedValueListNode* node) { if (node->getType() == "MockSupport" && node->getName().contains(MOCK_SUPPORT_SCOPE_PREFIX)) - return static_cast( const_cast( node->item()->getObjectPointer() ) ); + return (MockSupport*) node->item()->getObjectPointer(); return NULLPTR; } From b2c5cca9943de76f74af14726d4e893c3dc14a99 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Tue, 27 Feb 2018 15:54:10 -0800 Subject: [PATCH 0163/1093] add positive checks and fix typecasts for integer comparisons The integer comparisons between signed and unsigned values did not always verify that the signed integer was positive before comparing it to an unsigned type. This is problematic since it could cause an unsigned integer to match its 2s complement signed equivalent. Additionally, the signed comparisons were using incorrect type casts. Signed-off-by: Jacob Keller --- src/CppUTestExt/MockNamedValue.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 8472accea..19f705b2d 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -274,25 +274,25 @@ bool MockNamedValue::equals(const MockNamedValue& p) const else if((type_ == "int") && (p.type_ == "long int")) return value_.intValue_ == p.value_.longIntValue_; else if((type_ == "unsigned int") && (p.type_ == "int")) - return (long)value_.unsignedIntValue_ == (long)p.value_.intValue_; + return (p.value_.intValue_ >= 0) && (value_.unsignedIntValue_ == (unsigned int)p.value_.intValue_); else if((type_ == "int") && (p.type_ == "unsigned int")) - return (long)value_.intValue_ == (long)p.value_.unsignedIntValue_; + return (value_.intValue_ >= 0) && ((unsigned int)value_.intValue_ == p.value_.unsignedIntValue_); else if((type_ == "unsigned long int") && (p.type_ == "int")) - return value_.unsignedLongIntValue_ == (unsigned long)p.value_.intValue_; + return (p.value_.intValue_ >= 0) && (value_.unsignedLongIntValue_ == (unsigned long)p.value_.intValue_); else if((type_ == "int") && (p.type_ == "unsigned long int")) - return (unsigned long)value_.intValue_ == p.value_.unsignedLongIntValue_; + return (value_.intValue_ >= 0) && ((unsigned long)value_.intValue_ == p.value_.unsignedLongIntValue_); else if((type_ == "unsigned int") && (p.type_ == "long int")) - return (long int)value_.unsignedIntValue_ == p.value_.longIntValue_; + return (p.value_.longIntValue_ >= 0) && (value_.unsignedIntValue_ == (unsigned long)p.value_.longIntValue_); else if((type_ == "long int") && (p.type_ == "unsigned int")) - return value_.longIntValue_ == (long int)p.value_.unsignedIntValue_; + return (value_.longIntValue_ >= 0) && ((unsigned long)value_.longIntValue_ == p.value_.unsignedIntValue_); else if((type_ == "unsigned int") && (p.type_ == "unsigned long int")) return value_.unsignedIntValue_ == p.value_.unsignedLongIntValue_; else if((type_ == "unsigned long int") && (p.type_ == "unsigned int")) return value_.unsignedLongIntValue_ == p.value_.unsignedIntValue_; else if((type_ == "long int") && (p.type_ == "unsigned long int")) - return (value_.longIntValue_ >= 0) && (value_.longIntValue_ == (long) p.value_.unsignedLongIntValue_); + return (value_.longIntValue_ >= 0) && ((unsigned long)value_.longIntValue_ == p.value_.unsignedLongIntValue_); else if((type_ == "unsigned long int") && (p.type_ == "long int")) - return (p.value_.longIntValue_ >= 0) && ((long)value_.unsignedLongIntValue_ == p.value_.longIntValue_); + return (p.value_.longIntValue_ >= 0) && (value_.unsignedLongIntValue_ == (unsigned long) p.value_.longIntValue_); if (type_ != p.type_) return false; From ecfc1f2ad907b4aeaf17c6dd593b43a6cb9baa47 Mon Sep 17 00:00:00 2001 From: Kyle Russell Date: Thu, 22 Mar 2018 11:03:27 -0400 Subject: [PATCH 0164/1093] CMakeLists: use standard install directory variables Use the variables provided by cmake for install directories to standardize across build systems. The hard-coded /lib appended to exec_prefix does not necessarily match automake's $(libdir) (especially in multilib scenarios), so depending on whether you're using cmake or automake, you could actually end up with different pkg-config files given the right configuration, in addition to files being installed in different directories. --- CMakeLists.txt | 5 +++-- src/CppUTest/CMakeLists.txt | 5 ++--- src/CppUTestExt/CMakeLists.txt | 5 ++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d559e7a6..b430c27d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,7 @@ include(CTest) #include("${CppUTestRootDirectory}/cmake/Modules/CheckFunctionExists.cmake") include("${CppUTestRootDirectory}/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake") include("${CppUTestRootDirectory}/cmake/Modules/CppUTestNormalizeTestOutputLocation.cmake") +include(GNUInstallDirs) configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" @@ -91,8 +92,8 @@ if (TESTS) endif (EXTENSIONS) endif (TESTS) -set (INCLUDE_INSTALL_DIR "include") -set (LIB_INSTALL_DIR "lib") +set (INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") +set (LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") set (INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") # Pkg-config file. diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 6c1832940..7bed86fd1 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -68,6 +68,5 @@ endif (WIN32) install(FILES ${CppUTest_headers} DESTINATION include/CppUTest) install(TARGETS CppUTest EXPORT CppUTestTargets - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib) + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index 749be7a9e..8e4e2c304 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -43,6 +43,5 @@ target_link_libraries(CppUTestExt ${CPPUNIT_EXTERNAL_LIBRARIES}) install(FILES ${CppUTestExt_headers} DESTINATION include/CppUTestExt) install(TARGETS CppUTestExt EXPORT CppUTestTargets - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib) + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) From 75b33e9396cf65512d56313e80f291077bebbeb3 Mon Sep 17 00:00:00 2001 From: CFlix Date: Fri, 6 Apr 2018 22:51:29 +0200 Subject: [PATCH 0165/1093] IAR: Fix spurious newline after time in JUnit output. Remove the newline character after the date and time in the JUnit output on IAR platform. --- src/Platforms/Iar/UtestPlatform.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Platforms/Iar/UtestPlatform.cpp b/src/Platforms/Iar/UtestPlatform.cpp index 26e7c3907..13c32b5e5 100644 --- a/src/Platforms/Iar/UtestPlatform.cpp +++ b/src/Platforms/Iar/UtestPlatform.cpp @@ -115,7 +115,10 @@ static long TimeInMillisImplementation() static const char* TimeStringImplementation() { time_t tm = time(NULL); - return ctime(&tm); + char* pTimeStr = ctime(&tm); + char* newlineChar = strchr(pTimeStr, '\n'); // Find the terminating newline character. + if(newlineChar != NULL) *newlineChar = '\0'; //If newline is found replace it with the string terminator. + return (pTimeStr); } long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; From a1451938ba2391d445635e4c9c122841bdee8ae6 Mon Sep 17 00:00:00 2001 From: CFlix Date: Fri, 6 Apr 2018 22:59:03 +0200 Subject: [PATCH 0166/1093] Add newline to end of JUnit output files. Add a newline at the end of each JUnit output file so the file ends with a newline character. --- src/CppUTest/JUnitTestOutput.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index bc3f6ed27..bf2dd9e38 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -240,7 +240,7 @@ void JUnitTestOutput::writeFileEnding() { writeToFile(""); writeToFile(impl_->stdOutput_); writeToFile("\n"); writeToFile("\n"); - writeToFile(""); + writeToFile("\n"); } void JUnitTestOutput::writeTestGroupToFile() From 3e8180ddc23295e2c73173535b4c3879be7fc58c Mon Sep 17 00:00:00 2001 From: CFlix Date: Fri, 6 Apr 2018 23:11:46 +0200 Subject: [PATCH 0167/1093] IAR: Add support to redirect file writes to stdout. Ad the possibility to output strings that are normally written to a file to stdout. This makes it possible to generate JUnit XML output with the IAR simulator or even real HW. All FPuts are redirected to stdout and prepended with "FILEx" where x is an incrementing number. This makes it possible to separate the output later to different files. Small caveat: All FPuts must be terminated with a newline character and should not contain newline characters except for the terminating one. --- src/Platforms/Iar/UtestPlatform.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Platforms/Iar/UtestPlatform.cpp b/src/Platforms/Iar/UtestPlatform.cpp index 26e7c3907..3c6b9cf12 100644 --- a/src/Platforms/Iar/UtestPlatform.cpp +++ b/src/Platforms/Iar/UtestPlatform.cpp @@ -125,15 +125,18 @@ int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_ static PlatformSpecificFile PlatformSpecificFOpenImplementation(const char* filename, const char* flag) { + static int fileNo = 0; // Count the files so different files can be differenciated. (void)filename; (void)flag; - return 0; + fileNo++; + return (void*)fileNo; // Return the file handle number. } static void PlatformSpecificFPutsImplementation(const char* str, PlatformSpecificFile file) { (void)str; (void)file; + printf("FILE%d:%s",(int)file, str); // Print the text to stdout preceeded by the characters "FILE". } static void PlatformSpecificFCloseImplementation(PlatformSpecificFile file) From 843d1696af1b90484a72bc82bea1006751caaf99 Mon Sep 17 00:00:00 2001 From: CFlix Date: Fri, 6 Apr 2018 23:32:55 +0200 Subject: [PATCH 0168/1093] Adapt test to expect newline at end of JUnit file. Change the JUnitOutputTest to expect a newline at the end of every test file. --- tests/CppUTest/JUnitOutputTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index 3f8796a3e..3a984d7fe 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -383,7 +383,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestOutputsTestSuiteStartAndEndBlock outputFile = fileSystem.file("cpputest_groupname.xml"); STRCMP_EQUAL("\n", outputFile->line(2)); - STRCMP_EQUAL("", outputFile->lineFromTheBack(1)); + STRCMP_EQUAL("\n", outputFile->lineFromTheBack(1)); } TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainAnEmptyPropertiesBlock) From 5716b744335ee17f914e41556dcad7ed9cfc7d20 Mon Sep 17 00:00:00 2001 From: Saeed Date: Sun, 1 Jul 2018 19:44:53 +0800 Subject: [PATCH 0169/1093] Add -Wno-reserved-id-macro and -Wno-keyword-macro to clang builds. Fixes CppUTest on Xcode 7+, with clang-700+, where warnings were added about using reserved namespaces like __, and for macros that shadow keywords. --- build/MakefileWorker.mk | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index bd054ad4d..8d555d629 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -198,8 +198,12 @@ ifeq ($(COMPILER_NAME),$(CLANG_STR)) CPPUTEST_CXX_WARNINGFLAGS += -Weverything -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables -Wno-old-style-cast -Wno-c++11-long-long CPPUTEST_C_WARNINGFLAGS += -Weverything -Wno-padded -# Clang "7" (Xcode 7 command-line tools) introduced new warnings by default that don't exist on previous versions of clang and cause errors when present. -ifeq ($(findstring clang-7,$(CC_VERSION_OUTPUT)),clang-7) +# Clang "7" or newer (Xcode 7 or newer command-line tools) introduced new warnings by default that don't exist on previous versions of clang and cause errors when present. +CLANG_VERSION := $(shell echo $(CC_VERSION_OUTPUT) | grep -o 'clang-[0-9][0-9][0-9]*.') +CLANG_VERSION_NUM := $(subst .,,$(subst clang-,,$(CLANG_VERSION))) +CLANG_VERSION_NUM_GT_700 := $(shell [[ $(CLANG_VERSION_NUM) -ge 700 ]] && echo Y) + +ifeq ($(CLANG_VERSION_NUM_GT_700), Y) # -Wno-reserved-id-macro -> Many CppUTest macros start with __, which is a reserved namespace # -Wno-keyword-macro -> CppUTest redefines the 'new' keyword for memory leak tracking CPPUTEST_CXX_WARNINGFLAGS += -Wno-reserved-id-macro -Wno-keyword-macro From 0f2cfcea93b5855cff61c97df5f32a59650e519c Mon Sep 17 00:00:00 2001 From: Saeed Date: Sun, 1 Jul 2018 19:46:08 +0800 Subject: [PATCH 0170/1093] remove warning, cast from 'const void *' to 'Event *' drops const qualifier. --- examples/AllTests/EventDispatcherTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/AllTests/EventDispatcherTest.cpp b/examples/AllTests/EventDispatcherTest.cpp index e414bc759..4515ff559 100644 --- a/examples/AllTests/EventDispatcherTest.cpp +++ b/examples/AllTests/EventDispatcherTest.cpp @@ -47,11 +47,11 @@ class EventComparator : public MockNamedValueComparator public: virtual bool isEqual(const void* object1, const void* object2) { - return ((Event*)object1)->type == ((Event*)object2)->type; + return ((const Event*)object1)->type == ((const Event*)object2)->type; } virtual SimpleString valueToString(const void* object) { - return StringFrom(((Event*)object)->type); + return StringFrom(((const Event*)object)->type); } }; From a391671b653fa49726725348e33b0b2b7ba485c6 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Tue, 29 May 2018 13:28:58 -0700 Subject: [PATCH 0171/1093] add StringFrom for std::nullptr_t values In C++11, the nullptr_t type was introduced, and in some projects NULL is defined as nullptr. In this case, the C++ compiler will produce warnings when trying to convert NULL to a string, because it is ambiguous which conversion is used. test.cpp:89:2: error: call to 'StringFrom' is ambiguous CHECK_EQUAL(NULL, actual); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /usr/local/include/CppUTest/UtestMacros.h:127:3: note: expanded from macro 'CHECK_EQUAL' CHECK_EQUAL_LOCATION(expected, actual, NULL, __FILE__, __LINE__) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /usr/local/include/CppUTest/UtestMacros.h:138:52: note: expanded from macro 'CHECK_EQUAL_LOCATION' UtestShell::getCurrent()->assertEquals(true, StringFrom(expected).asCharString(), StringFrom(actual).asCharString(), text, file, line); \ ^~~~~~~~~~ /usr/local/include/CppUTest/SimpleString.h:138:14: note: candidate function SimpleString StringFrom(const void* value); ^ /usr/local/include/CppUTest/SimpleString.h:139:14: note: candidate function SimpleString StringFrom(void (*value)()); ^ /usr/local/include/CppUTest/SimpleString.h:141:14: note: candidate function SimpleString StringFrom(const char *value); ^ /usr/local/include/CppUTest/SimpleString.h:137:14: note: candidate function SimpleString StringFrom(bool value); ^ /usr/local/include/CppUTest/SimpleString.h:157:14: note: candidate function SimpleString StringFrom(const SimpleString& other); ^ /usr/local/include/CppUTest/SimpleString.h:171:14: note: candidate function SimpleString StringFrom(const std::string& other); These warnings can be resolved by providing a StringFrom which takes the nullptr_t as the argument, avoiding the need for conversions at all. According to the C++ standard, the define __cplusplus is set to a value greater than 199711L when C++ 11 is supported. Thus, we'll check this when implementing the function, in order to allow building on older C++ standards. Additionally, avoid a compiler warning due to the expected unused parameter in the implementation of StringFrom. Signed-off-by: Jacob Keller --- include/CppUTest/SimpleString.h | 4 +++- src/CppUTest/SimpleString.cpp | 6 ++++++ tests/CppUTest/SimpleStringTest.cpp | 10 ++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 61ef2a0c8..60ced9b2e 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -174,7 +174,9 @@ SimpleString BracketsFormattedHexStringFrom(cpputest_ulonglong value); SimpleString BracketsFormattedHexStringFrom(signed char value); SimpleString BracketsFormattedHexString(SimpleString hexString); - +#if __cplusplus > 199711L +SimpleString StringFrom(const std::nullptr_t value); +#endif #if CPPUTEST_USE_STD_CPP_LIB diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index f7b7449b4..96006dba8 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -540,6 +540,12 @@ SimpleString BracketsFormattedHexString(SimpleString hexString) return SimpleString("(0x") + hexString + ")" ; } +#if __cplusplus > 199711L +SimpleString StringFrom(const std::nullptr_t __attribute__((unused)) value) +{ + return "(null)"; +} +#endif #ifdef CPPUTEST_USE_LONG_LONG diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 6e56d1ff0..b8dcbb2cf 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -572,6 +572,16 @@ TEST(SimpleString, Sizes) STRCMP_EQUAL("10", StringFrom((int) size).asCharString()); } +#if __cplusplus > 199711L +TEST(SimpleString, nullptr_type) +{ + SimpleString s(StringFrom(nullptr)); + STRCMP_EQUAL("(null)", s.asCharString()); + + CHECK_EQUAL(nullptr, (nullptr_t)0); +} +#endif + TEST(SimpleString, HexStrings) { STRCMP_EQUAL("f3", HexStringFrom((signed char)-13).asCharString()); From 32ee2d6ddd79285bca2aa419d94e77be70da75da Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Fri, 6 Jul 2018 23:17:39 -0700 Subject: [PATCH 0172/1093] remove nullptr CHECK_EQUAL this check doesn't really do anything useful for us and causes some compilers to warn about using zero as a NULL constant. --- tests/CppUTest/SimpleStringTest.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index b8dcbb2cf..9863ce476 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -577,8 +577,6 @@ TEST(SimpleString, nullptr_type) { SimpleString s(StringFrom(nullptr)); STRCMP_EQUAL("(null)", s.asCharString()); - - CHECK_EQUAL(nullptr, (nullptr_t)0); } #endif From ca53c8fcb4fdf814bda33e6a5f14411748200925 Mon Sep 17 00:00:00 2001 From: sensslen Date: Fri, 13 Jul 2018 08:30:50 +0200 Subject: [PATCH 0173/1093] Print test names and test group names escaped when using teamcity When using Teamcity output, we encountered ill formatted output due to missing escapes in testnames. This Patch always outputs "user defined messages" escaped --- src/CppUTest/TeamCityTestOutput.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/CppUTest/TeamCityTestOutput.cpp b/src/CppUTest/TeamCityTestOutput.cpp index 6059e8e53..2196dc6a9 100644 --- a/src/CppUTest/TeamCityTestOutput.cpp +++ b/src/CppUTest/TeamCityTestOutput.cpp @@ -12,11 +12,11 @@ TeamCityTestOutput::~TeamCityTestOutput() void TeamCityTestOutput::printCurrentTestStarted(const UtestShell& test) { print("##teamcity[testStarted name='"); - print(test.getName().asCharString()); + printEscaped(test.getName().asCharString()); print("']\n"); if (!test.willRun()) { print("##teamcity[testIgnored name='"); - print(test.getName().asCharString()); + printEscaped(test.getName().asCharString()); print("']\n"); } currtest_ = &test; @@ -28,7 +28,7 @@ void TeamCityTestOutput::printCurrentTestEnded(const TestResult& res) return; print("##teamcity[testFinished name='"); - print(currtest_->getName().asCharString()); + printEscaped(currtest_->getName().asCharString()); print("' duration='"); print(res.getCurrentTestTotalExecutionTime()); print("']\n"); @@ -38,7 +38,7 @@ void TeamCityTestOutput::printCurrentGroupStarted(const UtestShell& test) { currGroup_ = test.getGroup(); print("##teamcity[testSuiteStarted name='"); - print(currGroup_.asCharString()); + printEscaped(currGroup_.asCharString()); print("']\n"); } @@ -48,7 +48,7 @@ void TeamCityTestOutput::printCurrentGroupEnded(const TestResult& /*res*/) return; print("##teamcity[testSuiteFinished name='"); - print(currGroup_.asCharString()); + printEscaped(currGroup_.asCharString()); print("']\n"); } @@ -80,17 +80,17 @@ void TeamCityTestOutput::printEscaped(const char* s) void TeamCityTestOutput::printFailure(const TestFailure& failure) { print("##teamcity[testFailed name='"); - print(failure.getTestNameOnly().asCharString()); + printEscaped(failure.getTestNameOnly().asCharString()); print("' message='"); if (failure.isOutsideTestFile() || failure.isInHelperFunction()) { print("TEST failed ("); - print(failure.getTestFileName().asCharString()); + printEscaped(failure.getTestFileName().asCharString()); print(":"); print(failure.getTestLineNumber()); print("): "); } - print(failure.getFileName().asCharString()); + printEscaped(failure.getFileName().asCharString()); print(":"); print(failure.getFailureLineNumber()); From 98cf2f2fe9b3e6a5a8b18eb2122b239c9ab4516f Mon Sep 17 00:00:00 2001 From: sensslen Date: Mon, 16 Jul 2018 09:42:22 +0200 Subject: [PATCH 0174/1093] Update TeamCityOutputTest.cpp --- tests/CppUTest/TeamCityOutputTest.cpp | 61 +++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/tests/CppUTest/TeamCityOutputTest.cpp b/tests/CppUTest/TeamCityOutputTest.cpp index 690426bf0..f8cb86db8 100644 --- a/tests/CppUTest/TeamCityOutputTest.cpp +++ b/tests/CppUTest/TeamCityOutputTest.cpp @@ -160,6 +160,67 @@ TEST(TeamCityOutputTest, PrintFailureWithFailInDifferentFile) STRCMP_EQUAL(expected, mock->getOutput().asCharString()); } +TEST(TeamCityOutputTest, TestGroupEscaped_Start) +{ + tst->setGroupName("'[]\n\r"); + result->currentGroupStarted(tst); + const char* expected = + "##teamcity[testSuiteStarted name='|'|[|]|n|r']\n"; + STRCMP_EQUAL(expected, mock->getOutput().asCharString()); +} + +TEST(TeamCityOutputTest, TestGroupEscaped_End) +{ + tst->setGroupName("'[]\n\r"); + result->currentGroupStarted(tst); + result->currentGroupEnded(tst); + const char* expected = + "##teamcity[testSuiteStarted name='|'|[|]|n|r']\n" + "##teamcity[testSuiteFinished name='|'|[|]|n|r']\n"; + STRCMP_EQUAL(expected, mock->getOutput().asCharString()); +} + +TEST(TeamCityOutputTest, TestNameEscaped_Start) +{ + tst->setTestName("'[]\n\r"); + result->currentTestStarted(tst); + const char* expected = + "##teamcity[testStarted name='|'|[|]|n|r']\n"; + STRCMP_EQUAL(expected, mock->getOutput().asCharString()); +} + +TEST(TeamCityOutputTest, TestNameEscaped_End) +{ + tst->setTestName("'[]\n\r"); + result->currentTestStarted(tst); + result->currentTestEnded(tst); + const char* expected = + "##teamcity[testStarted name='|'|[|]|n|r']\n" + "##teamcity[testFinished name='|'|[|]|n|r' duration='0']\n"; + STRCMP_EQUAL(expected, mock->getOutput().asCharString()); +} + +TEST(TeamCityOutputTest, TestNameEscaped_Ignore) +{ + IgnoredUtestShell itst("group", "'[]\n\r", "file", 10); + result->currentTestStarted(&itst); + const char* expected = + "##teamcity[testStarted name='|'|[|]|n|r']\n" + "##teamcity[testIgnored name='|'|[|]|n|r']\n"; + STRCMP_EQUAL(expected, mock->getOutput().asCharString()); +} + +TEST(TeamCityOutputTest, TestNameEscaped_Fail) +{ + tst->setTestName("'[]\n\r"); + TestFailure fail(tst, "failfile", 20, "failure message"); + tcout->printFailure(fail); + const char* expected = + "##teamcity[testFailed name='|'|[|]|n|r' message='TEST failed (file:10): failfile:20' " + "details='failure message']\n"; + STRCMP_EQUAL(expected, mock->getOutput().asCharString()); +} + /* Todo: * -Detect when running in TeamCity and switch output to -o teamcity automatically */ From a18fab8817144400a34ca0ced2e3db60c49dbae1 Mon Sep 17 00:00:00 2001 From: sensslen Date: Mon, 16 Jul 2018 09:45:55 +0200 Subject: [PATCH 0175/1093] remove escaping in print of filename --- src/CppUTest/TeamCityTestOutput.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/TeamCityTestOutput.cpp b/src/CppUTest/TeamCityTestOutput.cpp index 2196dc6a9..faa775363 100644 --- a/src/CppUTest/TeamCityTestOutput.cpp +++ b/src/CppUTest/TeamCityTestOutput.cpp @@ -84,7 +84,7 @@ void TeamCityTestOutput::printFailure(const TestFailure& failure) print("' message='"); if (failure.isOutsideTestFile() || failure.isInHelperFunction()) { print("TEST failed ("); - printEscaped(failure.getTestFileName().asCharString()); + print(failure.getTestFileName().asCharString()); print(":"); print(failure.getTestLineNumber()); print("): "); From d19671b6f9d85fd2e5600bf7e935783add7186a3 Mon Sep 17 00:00:00 2001 From: katono Date: Sun, 22 Jul 2018 00:08:17 +0900 Subject: [PATCH 0176/1093] Fix typo of scripts/README.txt --- scripts/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/README.txt b/scripts/README.txt index 8840b1b0a..2ca147527 100644 --- a/scripts/README.txt +++ b/scripts/README.txt @@ -1,5 +1,5 @@ The New*.sh scripts are helpful for creating the initial files for a new class... - NewClass.sh - for TTDing a new C++ class + NewClass.sh - for TDDing a new C++ class NewInterface.sh - for TDDing a new interface along with its Mock NewCModule.sh - for TDDing a C module NewCmiModule.sh - for TDDing a C module where there will be multiple From 0073039cfe3a449ba20c564806ed57fcea7685db Mon Sep 17 00:00:00 2001 From: Matthieu Longo Date: Wed, 8 Aug 2018 16:18:38 +0200 Subject: [PATCH 0177/1093] [cmake] add support for Conan, a C++ package manager --- CMakeLists.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b430c27d0..6a882b2bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,15 @@ set(CppUTest_version_minor 8) # 3.1 is needed for target_sources cmake_minimum_required(VERSION 3.1) +############### +# Conan support +############### +if (EXISTS "${CMAKE_BINARY_DIR}/conanbuildinfo.cmake") + include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) + message(STATUS "conan_basic_setup()") + conan_basic_setup() +endif() + # Check for functions before setting a lot of stuff include(CheckFunctionExists) set (CMAKE_REQUIRED_INCLUDES "unistd.h") From 6e90b18ba0358af606a8e304c3ca7d8ec3814f64 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Tue, 27 Feb 2018 12:35:48 -0800 Subject: [PATCH 0178/1093] add support for long long integers as native types When testing code that needs to work on both 64-bit platforms and 32-bit platforms, the long integer may not guarantee 64bits of width on the 32-bit platform. This makes testing calls which take and return 64bit values difficult, as the test framework can't handle these natively. Add support for long long integers, so that test code can natively handle these larger values. Note, to avoid ABI compatibility issues, use cpputest_longlong and cpputest_ulonglong. This ensures the virtual function tables are the same whether long long support is enabled or disabled. With this patch, if long long support is disabled in CppUTest, then the mock withParameter and returnParameter functions will fail indicating that the long long support is not enabled. Signed-off-by: Jacob Keller --- Makefile.am | 3 +- include/CppUTest/UtestMacros.h | 4 +- include/CppUTestExt/MockActualCall.h | 11 + include/CppUTestExt/MockCheckedActualCall.h | 24 +++ include/CppUTestExt/MockCheckedExpectedCall.h | 8 + include/CppUTestExt/MockExpectedCall.h | 8 + include/CppUTestExt/MockNamedValue.h | 14 ++ include/CppUTestExt/MockSupport.h | 4 + include/CppUTestExt/MockSupport_c.h | 23 ++ src/CppUTestExt/MockActualCall.cpp | 172 +++++++++++++++ src/CppUTestExt/MockExpectedCall.cpp | 66 ++++++ src/CppUTestExt/MockNamedValue.cpp | 132 ++++++++++++ src/CppUTestExt/MockSupport.cpp | 56 +++++ src/CppUTestExt/MockSupport_c.cpp | 180 ++++++++++++++++ tests/CppUTestExt/MockActualCallTest.cpp | 20 ++ tests/CppUTestExt/MockExpectedCallTest.cpp | 34 +++ tests/CppUTestExt/MockFakeLongLong.cpp | 170 +++++++++++++++ tests/CppUTestExt/MockParameterTest.cpp | 146 +++++++++++++ tests/CppUTestExt/MockReturnValueTest.cpp | 204 ++++++++++++++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 72 +++++++ tests/CppUTestExt/MockSupport_cTestCFile.c | 23 ++ 21 files changed, 1371 insertions(+), 3 deletions(-) create mode 100644 tests/CppUTestExt/MockFakeLongLong.cpp diff --git a/Makefile.am b/Makefile.am index b868b52b2..700c214ff 100644 --- a/Makefile.am +++ b/Makefile.am @@ -203,7 +203,8 @@ CppUTestExtTests_SOURCES = \ tests/CppUTestExt/MockSupport_cTestCFile.c \ tests/CppUTestExt/MockStrictOrderTest.cpp \ tests/CppUTestExt/MockReturnValueTest.cpp \ - tests/CppUTestExt/OrderedTestTest.cpp + tests/CppUTestExt/OrderedTestTest.cpp \ + tests/CppUTestExt/MockFakeLongLong.cpp DISTCLEANFILES = \ filename.map.txt \ diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 7a571be4f..122c20a63 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -235,10 +235,10 @@ UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) #define LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertLongLongsEqual(expected, actual, text, file, line); } + { UtestShell::getCurrent()->assertLongLongsEqual((long long)expected, (long long)actual, text, file, line); } #define UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertUnsignedLongLongsEqual(expected, actual, text, file, line); } + { UtestShell::getCurrent()->assertUnsignedLongLongsEqual((unsigned long long)expected, (unsigned long long)actual, text, file, line); } #define BYTES_EQUAL(expected, actual)\ LONGS_EQUAL((expected) & 0xff,(actual) & 0xff) diff --git a/include/CppUTestExt/MockActualCall.h b/include/CppUTestExt/MockActualCall.h index 438e65e4f..b41c3fdd5 100644 --- a/include/CppUTestExt/MockActualCall.h +++ b/include/CppUTestExt/MockActualCall.h @@ -28,6 +28,7 @@ #ifndef D_MockActualCall_h #define D_MockActualCall_h +#include "CppUTest/CppUTestConfig.h" #include "CppUTest/TestHarness.h" #include "CppUTestExt/MockNamedValue.h" #include "CppUTestExt/MockExpectedCallsList.h" @@ -48,6 +49,8 @@ class MockActualCall MockActualCall& withParameter(const SimpleString& name, unsigned int value) { return withUnsignedIntParameter(name, value); } MockActualCall& withParameter(const SimpleString& name, long int value) { return withLongIntParameter(name, value); } MockActualCall& withParameter(const SimpleString& name, unsigned long int value) { return withUnsignedLongIntParameter(name, value); } + MockActualCall& withParameter(const SimpleString& name, cpputest_longlong value) { return withLongLongIntParameter(name, value); } + MockActualCall& withParameter(const SimpleString& name, cpputest_ulonglong value) { return withUnsignedLongLongIntParameter(name, value); } MockActualCall& withParameter(const SimpleString& name, double value) { return withDoubleParameter(name, value); } MockActualCall& withParameter(const SimpleString& name, const char* value) { return withStringParameter(name, value); } MockActualCall& withParameter(const SimpleString& name, void* value) { return withPointerParameter(name, value); } @@ -63,6 +66,8 @@ class MockActualCall virtual MockActualCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value)=0; virtual MockActualCall& withLongIntParameter(const SimpleString& name, long int value)=0; virtual MockActualCall& withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value)=0; + virtual MockActualCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value)=0; + virtual MockActualCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value)=0; virtual MockActualCall& withDoubleParameter(const SimpleString& name, double value)=0; virtual MockActualCall& withStringParameter(const SimpleString& name, const char* value)=0; virtual MockActualCall& withPointerParameter(const SimpleString& name, void* value)=0; @@ -85,6 +90,12 @@ class MockActualCall virtual long int returnLongIntValue()=0; virtual long int returnLongIntValueOrDefault(long int default_value)=0; + virtual cpputest_ulonglong returnUnsignedLongLongIntValue()=0; + virtual cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong default_value)=0; + + virtual cpputest_longlong returnLongLongIntValue()=0; + virtual cpputest_longlong returnLongLongIntValueOrDefault(cpputest_longlong default_value)=0; + virtual unsigned int returnUnsignedIntValue()=0; virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int default_value)=0; diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index a629ac446..5adb4784d 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -44,6 +44,8 @@ class MockCheckedActualCall : public MockActualCall virtual MockActualCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) _override; virtual MockActualCall& withLongIntParameter(const SimpleString& name, long int value) _override; virtual MockActualCall& withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) _override; + virtual MockActualCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) _override; + virtual MockActualCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) _override; virtual MockActualCall& withDoubleParameter(const SimpleString& name, double value) _override; virtual MockActualCall& withStringParameter(const SimpleString& name, const char* value) _override; virtual MockActualCall& withPointerParameter(const SimpleString& name, void* value) _override; @@ -69,6 +71,12 @@ class MockCheckedActualCall : public MockActualCall virtual long int returnLongIntValue() _override; virtual long int returnLongIntValueOrDefault(long int default_value) _override; + virtual cpputest_ulonglong returnUnsignedLongLongIntValue() _override; + virtual cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong default_value) _override; + + virtual cpputest_longlong returnLongLongIntValue() _override; + virtual cpputest_longlong returnLongLongIntValueOrDefault(cpputest_longlong default_value) _override; + virtual unsigned int returnUnsignedIntValue() _override; virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int default_value) _override; @@ -157,6 +165,8 @@ class MockActualCallTrace : public MockActualCall virtual MockActualCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) _override; virtual MockActualCall& withLongIntParameter(const SimpleString& name, long int value) _override; virtual MockActualCall& withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) _override; + virtual MockActualCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) _override; + virtual MockActualCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) _override; virtual MockActualCall& withDoubleParameter(const SimpleString& name, double value) _override; virtual MockActualCall& withStringParameter(const SimpleString& name, const char* value) _override; virtual MockActualCall& withPointerParameter(const SimpleString& name, void* value) _override; @@ -182,6 +192,12 @@ class MockActualCallTrace : public MockActualCall virtual long int returnLongIntValue() _override; virtual long int returnLongIntValueOrDefault(long int default_value) _override; + virtual cpputest_ulonglong returnUnsignedLongLongIntValue() _override; + virtual cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong default_value) _override; + + virtual cpputest_longlong returnLongLongIntValue() _override; + virtual cpputest_longlong returnLongLongIntValueOrDefault(cpputest_longlong default_value) _override; + virtual unsigned int returnUnsignedIntValue() _override; virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int default_value) _override; @@ -222,6 +238,8 @@ class MockIgnoredActualCall: public MockActualCall virtual MockActualCall& withUnsignedIntParameter(const SimpleString&, unsigned int) _override { return *this; } virtual MockActualCall& withLongIntParameter(const SimpleString&, long int) _override { return *this; } virtual MockActualCall& withUnsignedLongIntParameter(const SimpleString&, unsigned long int) _override { return *this; } + virtual MockActualCall& withLongLongIntParameter(const SimpleString&, cpputest_longlong) _override { return *this; } + virtual MockActualCall& withUnsignedLongLongIntParameter(const SimpleString&, cpputest_ulonglong) _override { return *this; } virtual MockActualCall& withDoubleParameter(const SimpleString&, double) _override { return *this; } virtual MockActualCall& withStringParameter(const SimpleString&, const char*) _override { return *this; } virtual MockActualCall& withPointerParameter(const SimpleString& , void*) _override { return *this; } @@ -247,6 +265,12 @@ class MockIgnoredActualCall: public MockActualCall virtual long int returnLongIntValue() _override { return 0; } virtual long int returnLongIntValueOrDefault(long int value) _override { return value; } + virtual cpputest_ulonglong returnUnsignedLongLongIntValue() _override { return 0; } + virtual cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong value) _override { return value; } + + virtual cpputest_longlong returnLongLongIntValue() _override { return 0; } + virtual cpputest_longlong returnLongLongIntValueOrDefault(cpputest_longlong value) _override { return value; } + virtual unsigned int returnUnsignedIntValue() _override { return 0; } virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int value) _override { return value; } diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index 9eaa1f679..7909ea09e 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -47,6 +47,8 @@ class MockCheckedExpectedCall : public MockExpectedCall virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) _override; virtual MockExpectedCall& withLongIntParameter(const SimpleString& name, long int value) _override; virtual MockExpectedCall& withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) _override; + virtual MockExpectedCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) _override; + virtual MockExpectedCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) _override; virtual MockExpectedCall& withDoubleParameter(const SimpleString& name, double value) _override; virtual MockExpectedCall& withStringParameter(const SimpleString& name, const char* value) _override; virtual MockExpectedCall& withPointerParameter(const SimpleString& name, void* value) _override; @@ -63,6 +65,8 @@ class MockCheckedExpectedCall : public MockExpectedCall virtual MockExpectedCall& andReturnValue(unsigned int value) _override; virtual MockExpectedCall& andReturnValue(long int value) _override; virtual MockExpectedCall& andReturnValue(unsigned long int value) _override; + virtual MockExpectedCall& andReturnValue(cpputest_longlong value) _override; + virtual MockExpectedCall& andReturnValue(cpputest_ulonglong value) _override; virtual MockExpectedCall& andReturnValue(double value) _override; virtual MockExpectedCall& andReturnValue(const char* value) _override; virtual MockExpectedCall& andReturnValue(void* value) _override; @@ -153,6 +157,8 @@ class MockIgnoredExpectedCall: public MockExpectedCall virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString&, unsigned int) _override{ return *this; } virtual MockExpectedCall& withLongIntParameter(const SimpleString&, long int) _override { return *this; } virtual MockExpectedCall& withUnsignedLongIntParameter(const SimpleString&, unsigned long int) _override { return *this; } + virtual MockExpectedCall& withLongLongIntParameter(const SimpleString&, cpputest_longlong) _override { return *this; } + virtual MockExpectedCall& withUnsignedLongLongIntParameter(const SimpleString&, cpputest_ulonglong) _override { return *this; } virtual MockExpectedCall& withDoubleParameter(const SimpleString&, double) _override { return *this; } virtual MockExpectedCall& withStringParameter(const SimpleString&, const char*) _override { return *this; } virtual MockExpectedCall& withPointerParameter(const SimpleString& , void*) _override { return *this; } @@ -169,6 +175,8 @@ class MockIgnoredExpectedCall: public MockExpectedCall virtual MockExpectedCall& andReturnValue(unsigned int) _override { return *this; } virtual MockExpectedCall& andReturnValue(long int) _override { return *this; } virtual MockExpectedCall& andReturnValue(unsigned long int) _override { return *this; } + virtual MockExpectedCall& andReturnValue(cpputest_longlong) _override { return *this; } + virtual MockExpectedCall& andReturnValue(cpputest_ulonglong) _override { return *this; } virtual MockExpectedCall& andReturnValue(double) _override { return *this;} virtual MockExpectedCall& andReturnValue(const char*) _override { return *this; } virtual MockExpectedCall& andReturnValue(void*) _override { return *this; } diff --git a/include/CppUTestExt/MockExpectedCall.h b/include/CppUTestExt/MockExpectedCall.h index 2bd11aa7e..aaa7b2842 100644 --- a/include/CppUTestExt/MockExpectedCall.h +++ b/include/CppUTestExt/MockExpectedCall.h @@ -28,6 +28,8 @@ #ifndef D_MockExpectedCall_h #define D_MockExpectedCall_h +#include "CppUTest/CppUTestConfig.h" + class MockNamedValue; extern SimpleString StringFrom(const MockNamedValue& parameter); @@ -46,6 +48,8 @@ class MockExpectedCall MockExpectedCall& withParameter(const SimpleString& name, unsigned int value) { return withUnsignedIntParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, long int value) { return withLongIntParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, unsigned long int value) { return withUnsignedLongIntParameter(name, value); } + MockExpectedCall& withParameter(const SimpleString& name, cpputest_longlong value) { return withLongLongIntParameter(name, value); } + MockExpectedCall& withParameter(const SimpleString& name, cpputest_ulonglong value) { return withUnsignedLongLongIntParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, double value) { return withDoubleParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, const char* value) { return withStringParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, void* value) { return withPointerParameter(name, value); } @@ -62,6 +66,8 @@ class MockExpectedCall virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value)=0; virtual MockExpectedCall& withLongIntParameter(const SimpleString& name, long int value)=0; virtual MockExpectedCall& withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value)=0; + virtual MockExpectedCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value)=0; + virtual MockExpectedCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value)=0; virtual MockExpectedCall& withDoubleParameter(const SimpleString& name, double value)=0; virtual MockExpectedCall& withStringParameter(const SimpleString& name, const char* value)=0; virtual MockExpectedCall& withPointerParameter(const SimpleString& name, void* value)=0; @@ -73,6 +79,8 @@ class MockExpectedCall virtual MockExpectedCall& andReturnValue(unsigned int value)=0; virtual MockExpectedCall& andReturnValue(long int value)=0; virtual MockExpectedCall& andReturnValue(unsigned long int value)=0; + virtual MockExpectedCall& andReturnValue(cpputest_longlong value)=0; + virtual MockExpectedCall& andReturnValue(cpputest_ulonglong value)=0; virtual MockExpectedCall& andReturnValue(double value)=0; virtual MockExpectedCall& andReturnValue(const char* value)=0; virtual MockExpectedCall& andReturnValue(void* value)=0; diff --git a/include/CppUTestExt/MockNamedValue.h b/include/CppUTestExt/MockNamedValue.h index 4b9c1dd9f..e94d225e0 100644 --- a/include/CppUTestExt/MockNamedValue.h +++ b/include/CppUTestExt/MockNamedValue.h @@ -27,6 +27,9 @@ #ifndef D_MockNamedValue_h #define D_MockNamedValue_h + +#include "CppUTest/CppUTestConfig.h" + /* * MockNamedValueComparator is an interface that needs to be used when creating Comparators. * This is needed when comparing values of non-native type. @@ -106,6 +109,8 @@ class MockNamedValue virtual void setValue(unsigned int value); virtual void setValue(long int value); virtual void setValue(unsigned long int value); + virtual void setValue(cpputest_longlong value); + virtual void setValue(cpputest_ulonglong value); virtual void setValue(double value); virtual void setValue(void* value); virtual void setValue(const void* value); @@ -131,6 +136,8 @@ class MockNamedValue virtual unsigned int getUnsignedIntValue() const; virtual long int getLongIntValue() const; virtual unsigned long int getUnsignedLongIntValue() const; + virtual cpputest_longlong getLongLongIntValue() const; + virtual cpputest_ulonglong getUnsignedLongLongIntValue() const; virtual double getDoubleValue() const; virtual const char* getStringValue() const; virtual void* getPointerValue() const; @@ -141,6 +148,7 @@ class MockNamedValue virtual void* getObjectPointer() const; virtual size_t getSize() const; + virtual MockNamedValueComparator* getComparator() const; virtual MockNamedValueCopier* getCopier() const; @@ -154,6 +162,12 @@ class MockNamedValue unsigned int unsignedIntValue_; long int longIntValue_; unsigned long int unsignedLongIntValue_; +#ifdef CPPUTEST_USE_LONG_LONG + cpputest_longlong longLongIntValue_; + cpputest_ulonglong unsignedLongLongIntValue_; +#else + char longLongPlaceholder_[CPPUTEST_SIZE_OF_FAKE_LONG_LONG_TYPE]; +#endif double doubleValue_; const char* stringValue_; void* pointerValue_; diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index aa973b8b9..96748d021 100755 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -61,6 +61,10 @@ class MockSupport virtual long int returnLongIntValueOrDefault(long int defaultValue); virtual unsigned long int unsignedLongIntReturnValue(); virtual unsigned long int returnUnsignedLongIntValueOrDefault(unsigned long int defaultValue); + virtual cpputest_longlong longLongIntReturnValue(); + virtual cpputest_longlong returnLongLongIntValueOrDefault(cpputest_longlong defaultValue); + virtual cpputest_ulonglong unsignedLongLongIntReturnValue(); + virtual cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong defaultValue); virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int defaultValue); virtual const char* stringReturnValue(); virtual const char* returnStringValueOrDefault(const char * defaultValue); diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 0033c5faf..b2deb9593 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -32,6 +32,7 @@ extern "C" { #endif +#include "CppUTest/CppUTestConfig.h" #include "CppUTest/StandardCLibrary.h" typedef enum { @@ -40,6 +41,8 @@ typedef enum { MOCKVALUETYPE_INTEGER, MOCKVALUETYPE_LONG_INTEGER, MOCKVALUETYPE_UNSIGNED_LONG_INTEGER, + MOCKVALUETYPE_LONG_LONG_INTEGER, + MOCKVALUETYPE_UNSIGNED_LONG_LONG_INTEGER, MOCKVALUETYPE_DOUBLE, MOCKVALUETYPE_STRING, MOCKVALUETYPE_POINTER, @@ -58,6 +61,12 @@ typedef struct SMockValue_c unsigned int unsignedIntValue; long int longIntValue; unsigned long int unsignedLongIntValue; +#ifdef CPPUTEST_USE_LONG_LONG + cpputest_longlong longLongIntValue; + cpputest_ulonglong unsignedLongLongIntValue; +#else + char longLongPlaceholder[CPPUTEST_SIZE_OF_FAKE_LONG_LONG_TYPE]; +#endif double doubleValue; const char* stringValue; void* pointerValue; @@ -77,6 +86,8 @@ struct SMockActualCall_c MockActualCall_c* (*withUnsignedIntParameters)(const char* name, unsigned int value); MockActualCall_c* (*withLongIntParameters)(const char* name, long int value); MockActualCall_c* (*withUnsignedLongIntParameters)(const char* name, unsigned long int value); + MockActualCall_c* (*withLongLongIntParameters)(const char* name, cpputest_longlong value); + MockActualCall_c* (*withUnsignedLongLongIntParameters)(const char* name, cpputest_ulonglong value); MockActualCall_c* (*withDoubleParameters)(const char* name, double value); MockActualCall_c* (*withStringParameters)(const char* name, const char* value); MockActualCall_c* (*withPointerParameters)(const char* name, void* value); @@ -98,6 +109,10 @@ struct SMockActualCall_c long int (*returnLongIntValueOrDefault)(long int defaultValue); unsigned long int (*unsignedLongIntReturnValue)(void); unsigned long int (*returnUnsignedLongIntValueOrDefault)(unsigned long int defaultValue); + cpputest_longlong (*longLongIntReturnValue)(void); + cpputest_longlong (*returnLongLongIntValueOrDefault)(cpputest_longlong defaultValue); + cpputest_ulonglong (*unsignedLongLongIntReturnValue)(void); + cpputest_ulonglong (*returnUnsignedLongLongIntValueOrDefault)(cpputest_ulonglong defaultValue); const char* (*stringReturnValue)(void); const char* (*returnStringValueOrDefault)(const char * defaultValue); double (*doubleReturnValue)(void); @@ -118,6 +133,8 @@ struct SMockExpectedCall_c MockExpectedCall_c* (*withUnsignedIntParameters)(const char* name, unsigned int value); MockExpectedCall_c* (*withLongIntParameters)(const char* name, long int value); MockExpectedCall_c* (*withUnsignedLongIntParameters)(const char* name, unsigned long int value); + MockExpectedCall_c* (*withLongLongIntParameters)(const char* name, cpputest_longlong value); + MockExpectedCall_c* (*withUnsignedLongLongIntParameters)(const char* name, cpputest_ulonglong value); MockExpectedCall_c* (*withDoubleParameters)(const char* name, double value); MockExpectedCall_c* (*withStringParameters)(const char* name, const char* value); MockExpectedCall_c* (*withPointerParameters)(const char* name, void* value); @@ -134,6 +151,8 @@ struct SMockExpectedCall_c MockExpectedCall_c* (*andReturnIntValue)(int value); MockExpectedCall_c* (*andReturnLongIntValue)(long int value); MockExpectedCall_c* (*andReturnUnsignedLongIntValue)(unsigned long int value); + MockExpectedCall_c* (*andReturnLongLongIntValue)(cpputest_longlong value); + MockExpectedCall_c* (*andReturnUnsignedLongLongIntValue)(cpputest_ulonglong value); MockExpectedCall_c* (*andReturnDoubleValue)(double value); MockExpectedCall_c* (*andReturnStringValue)(const char* value); MockExpectedCall_c* (*andReturnPointerValue)(void* value); @@ -165,6 +184,10 @@ struct SMockSupport_c long int (*returnLongIntValueOrDefault)(long int defaultValue); unsigned long int (*unsignedLongIntReturnValue)(void); unsigned long int (*returnUnsignedLongIntValueOrDefault)(unsigned long int defaultValue); + cpputest_longlong (*longLongIntReturnValue)(void); + cpputest_longlong (*returnLongLongIntValueOrDefault)(cpputest_longlong defaultValue); + cpputest_ulonglong (*unsignedLongLongIntReturnValue)(void); + cpputest_ulonglong (*returnUnsignedLongLongIntValueOrDefault)(cpputest_ulonglong defaultValue); const char* (*stringReturnValue)(void); const char* (*returnStringValueOrDefault)(const char * defaultValue); double (*doubleReturnValue)(void); diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index b2376a95c..1730c60d1 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -241,6 +241,40 @@ MockActualCall& MockCheckedActualCall::withLongIntParameter(const SimpleString& return *this; } +#ifdef CPPUTEST_USE_LONG_LONG + +MockActualCall& MockCheckedActualCall::withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) +{ + MockNamedValue actualParameter(name); + actualParameter.setValue(value); + checkInputParameter(actualParameter); + return *this; +} + +MockActualCall& MockCheckedActualCall::withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) +{ + MockNamedValue actualParameter(name); + actualParameter.setValue(value); + checkInputParameter(actualParameter); + return *this; +} + +#else + +MockActualCall& MockCheckedActualCall::withUnsignedLongLongIntParameter(const SimpleString&, cpputest_ulonglong) +{ + FAIL("Unsigned Long Long type is not supported"); + return *this; +} + +MockActualCall& MockCheckedActualCall::withLongLongIntParameter(const SimpleString&, cpputest_longlong) +{ + FAIL("Long Long type is not supported"); + return *this; +} + +#endif + MockActualCall& MockCheckedActualCall::withDoubleParameter(const SimpleString& name, double value) { MockNamedValue actualParameter(name); @@ -438,6 +472,62 @@ long int MockCheckedActualCall::returnLongIntValueOrDefault(long int default_val return returnLongIntValue(); } +#ifdef CPPUTEST_USE_LONG_LONG + +cpputest_ulonglong MockCheckedActualCall::returnUnsignedLongLongIntValue() +{ + return returnValue().getUnsignedLongLongIntValue(); +} + +cpputest_ulonglong MockCheckedActualCall::returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong default_value) +{ + if (!hasReturnValue()) { + return default_value; + } + return returnUnsignedLongLongIntValue(); +} + +cpputest_longlong MockCheckedActualCall::returnLongLongIntValue() +{ + return returnValue().getLongLongIntValue(); +} + +cpputest_longlong MockCheckedActualCall::returnLongLongIntValueOrDefault(cpputest_longlong default_value) +{ + if (!hasReturnValue()) { + return default_value; + } + return returnLongLongIntValue(); +} + +#else + +cpputest_ulonglong MockCheckedActualCall::returnUnsignedLongLongIntValue() +{ + FAIL("Unsigned Long Long type is not supported"); + return cpputest_ulonglong(0); +} + +cpputest_ulonglong MockCheckedActualCall::returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong default_value) +{ + FAIL("Unsigned Long Long type is not supported"); + return default_value; +} + +cpputest_longlong MockCheckedActualCall::returnLongLongIntValue() +{ + FAIL("Long Long type is not supported"); + return cpputest_longlong(0); +} + +cpputest_longlong MockCheckedActualCall::returnLongLongIntValueOrDefault(cpputest_longlong default_value) +{ + FAIL("Long Long type is not supported"); + return default_value; +} + +#endif + double MockCheckedActualCall::returnDoubleValue() { return returnValue().getDoubleValue(); @@ -637,6 +727,38 @@ MockActualCall& MockActualCallTrace::withLongIntParameter(const SimpleString& na return *this; } +#ifdef CPPUTEST_USE_LONG_LONG + +MockActualCall& MockActualCallTrace::withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) +{ + addParameterName(name); + traceBuffer_ += StringFrom(value) + " " + BracketsFormattedHexStringFrom(value); + return *this; +} + +MockActualCall& MockActualCallTrace::withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) +{ + addParameterName(name); + traceBuffer_ += StringFrom(value) + " " + BracketsFormattedHexStringFrom(value); + return *this; +} + +#else + +MockActualCall& MockActualCallTrace::withUnsignedLongLongIntParameter(const SimpleString&, cpputest_ulonglong) +{ + FAIL("Unsigned Long Long type is not supported"); + return *this; +} + +MockActualCall& MockActualCallTrace::withLongLongIntParameter(const SimpleString&, cpputest_longlong) +{ + FAIL("Long Long type is not supported"); + return *this; +} + +#endif + MockActualCall& MockActualCallTrace::withDoubleParameter(const SimpleString& name, double value) { addParameterName(name); @@ -734,6 +856,56 @@ long int MockActualCallTrace::returnLongIntValueOrDefault(long int) return returnLongIntValue(); } +#ifdef CPPUTEST_USE_LONG_LONG + +cpputest_longlong MockActualCallTrace::returnLongLongIntValue() +{ + return 0; +} + +cpputest_ulonglong MockActualCallTrace::returnUnsignedLongLongIntValue() +{ + return 0; +} + +cpputest_ulonglong MockActualCallTrace::returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong) +{ + return 0; +} + +cpputest_longlong MockActualCallTrace::returnLongLongIntValueOrDefault(cpputest_longlong) +{ + return returnLongLongIntValue(); +} + +#else + +cpputest_longlong MockActualCallTrace::returnLongLongIntValue() +{ + FAIL("Long Long type is not supported"); + return cpputest_longlong(0); +} + +cpputest_ulonglong MockActualCallTrace::returnUnsignedLongLongIntValue() +{ + FAIL("Unsigned Long Long type is not supported"); + return cpputest_ulonglong(0); +} + +cpputest_ulonglong MockActualCallTrace::returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong) +{ + FAIL("Unsigned Long Long type is not supported"); + return cpputest_ulonglong(0); +} + +cpputest_longlong MockActualCallTrace::returnLongLongIntValueOrDefault(cpputest_longlong) +{ + FAIL("Long Long type is not supported"); + return cpputest_longlong(0); +} + +#endif + bool MockActualCallTrace::returnBoolValue() { return false; diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index 7ac1b0d31..fff7f831a 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -125,6 +125,40 @@ MockExpectedCall& MockCheckedExpectedCall::withUnsignedLongIntParameter(const Si return *this; } +#ifdef CPPUTEST_USE_LONG_LONG + +MockExpectedCall& MockCheckedExpectedCall::withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) +{ + MockNamedValue* newParameter = new MockExpectedFunctionParameter(name); + inputParameters_->add(newParameter); + newParameter->setValue(value); + return *this; +} + +MockExpectedCall& MockCheckedExpectedCall::withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) +{ + MockNamedValue* newParameter = new MockExpectedFunctionParameter(name); + inputParameters_->add(newParameter); + newParameter->setValue(value); + return *this; +} + +#else + +MockExpectedCall& MockCheckedExpectedCall::withLongLongIntParameter(const SimpleString&, cpputest_longlong) +{ + FAIL("Long Long type is not supported"); + return *this; +} + +MockExpectedCall& MockCheckedExpectedCall::withUnsignedLongLongIntParameter(const SimpleString&, cpputest_ulonglong) +{ + FAIL("Unsigned Long Long type is not supported"); + return *this; +} + +#endif + MockExpectedCall& MockCheckedExpectedCall::withDoubleParameter(const SimpleString& name, double value) { MockNamedValue* newParameter = new MockExpectedFunctionParameter(name); @@ -467,6 +501,38 @@ MockExpectedCall& MockCheckedExpectedCall::andReturnValue(unsigned long int valu return *this; } +#ifdef CPPUTEST_USE_LONG_LONG + +MockExpectedCall& MockCheckedExpectedCall::andReturnValue(cpputest_longlong value) +{ + returnValue_.setName("returnValue"); + returnValue_.setValue(value); + return *this; +} + +MockExpectedCall& MockCheckedExpectedCall::andReturnValue(cpputest_ulonglong value) +{ + returnValue_.setName("returnValue"); + returnValue_.setValue(value); + return *this; +} + +#else + +MockExpectedCall& MockCheckedExpectedCall::andReturnValue(cpputest_longlong) +{ + FAIL("Long Long type is not supported"); + return *this; +} + +MockExpectedCall& MockCheckedExpectedCall::andReturnValue(cpputest_ulonglong) +{ + FAIL("Unsigned Long Long type is not supported"); + return *this; +} + +#endif + MockExpectedCall& MockCheckedExpectedCall::andReturnValue(const char* value) { returnValue_.setName("returnValue"); diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 19f705b2d..cdf1be0a6 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -76,6 +76,34 @@ void MockNamedValue::setValue(unsigned long int value) value_.unsignedLongIntValue_ = value; } +#ifdef CPPUTEST_USE_LONG_LONG + +void MockNamedValue::setValue(cpputest_longlong value) +{ + type_ = "long long int"; + value_.longLongIntValue_ = value; +} + +void MockNamedValue::setValue(cpputest_ulonglong value) +{ + type_ = "unsigned long long int"; + value_.unsignedLongLongIntValue_ = value; +} + +#else + +void MockNamedValue::setValue(cpputest_longlong) +{ + FAIL("Long Long type is not supported"); +} + +void MockNamedValue::setValue(cpputest_ulonglong) +{ + FAIL("Unsigned Long Long type is not supported"); +} + +#endif + void MockNamedValue::setValue(double value) { type_ = "double"; @@ -206,6 +234,60 @@ unsigned long int MockNamedValue::getUnsignedLongIntValue() const } } +#ifdef CPPUTEST_USE_LONG_LONG + +cpputest_longlong MockNamedValue::getLongLongIntValue() const +{ + if(type_ == "int") + return value_.intValue_; + else if(type_ == "unsigned int") + return (long int)value_.unsignedIntValue_; + else if(type_ == "long int") + return (long long int)value_.longIntValue_; + else if(type_ == "unsigned long int") + return (long long int)value_.unsignedLongIntValue_; + else + { + STRCMP_EQUAL("long long int", type_.asCharString()); + return value_.longIntValue_; + } +} + +cpputest_ulonglong MockNamedValue::getUnsignedLongLongIntValue() const +{ + if(type_ == "unsigned int") + return value_.unsignedIntValue_; + else if(type_ == "int" && value_.intValue_ >= 0) + return (unsigned long long int)value_.intValue_; + else if(type_ == "unsigned long int") + return value_.unsignedLongIntValue_; + else if(type_ == "long int" && value_.longIntValue_ >= 0) + return (unsigned long long int)value_.longIntValue_; + else if(type_ == "long long int" && value_.longLongIntValue_ >= 0) + return (unsigned long long int)value_.longLongIntValue_; + else + { + STRCMP_EQUAL("unsigned long long int", type_.asCharString()); + return value_.unsignedLongLongIntValue_; + } +} + +#else + +cpputest_longlong MockNamedValue::getLongLongIntValue() const +{ + FAIL("Long Long type is not supported"); + return cpputest_longlong(0); +} + +cpputest_ulonglong MockNamedValue::getUnsignedLongLongIntValue() const +{ + FAIL("Unsigned Long Long type is not supported"); + return cpputest_ulonglong(0); +} + +#endif + double MockNamedValue::getDoubleValue() const { STRCMP_EQUAL("double", type_.asCharString()); @@ -293,6 +375,44 @@ bool MockNamedValue::equals(const MockNamedValue& p) const return (value_.longIntValue_ >= 0) && ((unsigned long)value_.longIntValue_ == p.value_.unsignedLongIntValue_); else if((type_ == "unsigned long int") && (p.type_ == "long int")) return (p.value_.longIntValue_ >= 0) && (value_.unsignedLongIntValue_ == (unsigned long) p.value_.longIntValue_); +#ifdef CPPUTEST_USE_LONG_LONG + else if ((type_ == "long long int") && (p.type_ == "int")) + return value_.longLongIntValue_ == p.value_.intValue_; + else if ((type_ == "int") && (p.type_ == "long long int")) + return value_.intValue_ == p.value_.longLongIntValue_; + else if ((type_ == "long long int") && (p.type_ == "long int")) + return value_.longLongIntValue_ == p.value_.longIntValue_; + else if ((type_ == "long int") && (p.type_ == "long long int")) + return value_.longIntValue_ == p.value_.longLongIntValue_; + else if ((type_ == "long long int") && (p.type_ == "unsigned int")) + return (value_.longLongIntValue_ >= 0) && ((unsigned long long)value_.longLongIntValue_ == p.value_.unsignedIntValue_); + else if ((type_ == "unsigned int") && (p.type_ == "long long int")) + return (p.value_.longLongIntValue_ >= 0) && (value_.unsignedIntValue_ == (unsigned long long)p.value_.longLongIntValue_); + else if ((type_ == "long long int") && (p.type_ == "unsigned long int")) + return (value_.longLongIntValue_ >= 0) && ((unsigned long long)value_.longLongIntValue_ == p.value_.unsignedLongIntValue_); + else if ((type_ == "unsigned long int") && (p.type_ == "long long int")) + return (p.value_.longLongIntValue_ >= 0) && (value_.unsignedLongIntValue_ == (unsigned long long)p.value_.longLongIntValue_); + else if ((type_ == "long long int") && (p.type_ == "unsigned long long int")) + return (value_.longLongIntValue_ >= 0) && ((unsigned long long)value_.longLongIntValue_ == p.value_.unsignedLongLongIntValue_); + else if ((type_ == "unsigned long long int") && (p.type_ == "long long int")) + return (p.value_.longLongIntValue_ >= 0) && (value_.unsignedLongLongIntValue_ == (unsigned long long)p.value_.longLongIntValue_); + else if ((type_ == "unsigned long long int") && (p.type_ == "int")) + return (p.value_.intValue_ >= 0) && (value_.unsignedLongLongIntValue_ == (unsigned long long)p.value_.intValue_); + else if ((type_ == "int") && (p.type_ == "unsigned long long int")) + return (value_.intValue_ >= 0) && ((unsigned long long)value_.intValue_ == p.value_.unsignedLongLongIntValue_); + else if ((type_ == "unsigned long long int") && (p.type_ == "unsigned int")) + return value_.unsignedLongLongIntValue_ == p.value_.unsignedIntValue_; + else if ((type_ == "unsigned int") && (p.type_ == "unsigned long long int")) + return value_.unsignedIntValue_ == p.value_.unsignedLongLongIntValue_; + else if ((type_ == "unsigned long long int") && (p.type_ == "long int")) + return (p.value_.longIntValue_ >= 0) && (value_.unsignedLongLongIntValue_ == (unsigned long long)p.value_.longIntValue_); + else if ((type_ == "long int") && (p.type_ == "unsigned long long int")) + return (value_.longIntValue_ >= 0) && ((unsigned long long)value_.longLongIntValue_ == p.value_.unsignedLongLongIntValue_); + else if ((type_ == "unsigned long long int") && (p.type_ == "unsigned long int")) + return value_.unsignedLongLongIntValue_ == p.value_.unsignedLongIntValue_; + else if ((type_ == "unsigned long int") && (p.type_ == "unsigned long long int")) + return value_.unsignedLongIntValue_ == p.value_.unsignedLongLongIntValue_; +#endif if (type_ != p.type_) return false; @@ -306,6 +426,12 @@ bool MockNamedValue::equals(const MockNamedValue& p) const return value_.longIntValue_ == p.value_.longIntValue_; else if (type_ == "unsigned long int") return value_.unsignedLongIntValue_ == p.value_.unsignedLongIntValue_; +#ifdef CPPUTEST_USE_LONG_LONG + else if (type_ == "long long int") + return value_.longLongIntValue_ == p.value_.longLongIntValue_; + else if (type_ == "unsigned long long int") + return value_.unsignedLongLongIntValue_ == p.value_.unsignedLongLongIntValue_; +#endif else if (type_ == "const char*") return SimpleString(value_.stringValue_) == SimpleString(p.value_.stringValue_); else if (type_ == "void*") @@ -352,6 +478,12 @@ SimpleString MockNamedValue::toString() const return StringFrom(value_.longIntValue_) + " " + BracketsFormattedHexStringFrom(value_.longIntValue_); else if (type_ == "unsigned long int") return StringFrom(value_.unsignedLongIntValue_) + " " + BracketsFormattedHexStringFrom(value_.unsignedLongIntValue_); +#ifdef CPPUTEST_USE_LONG_LONG + else if (type_ == "long long int") + return StringFrom(value_.longLongIntValue_) + " " + BracketsFormattedHexStringFrom(value_.longLongIntValue_); + else if (type_ == "unsigned long long int") + return StringFrom(value_.unsignedLongLongIntValue_) + " " + BracketsFormattedHexStringFrom(value_.unsignedLongLongIntValue_); +#endif else if (type_ == "const char*") return value_.stringValue_; else if (type_ == "void*") diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 32eb90912..ba07885af 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -558,6 +558,62 @@ unsigned long int MockSupport::unsignedLongIntReturnValue() return returnValue().getUnsignedLongIntValue(); } +#ifdef CPPUTEST_USE_LONG_LONG + +cpputest_longlong MockSupport::longLongIntReturnValue() +{ + return returnValue().getLongLongIntValue(); +} + +cpputest_ulonglong MockSupport::unsignedLongLongIntReturnValue() +{ + return returnValue().getUnsignedLongLongIntValue(); +} + +cpputest_longlong MockSupport::returnLongLongIntValueOrDefault(cpputest_longlong defaultValue) +{ + if (hasReturnValue()) { + return longLongIntReturnValue(); + } + return defaultValue; +} + +cpputest_ulonglong MockSupport::returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong defaultValue) +{ + if (hasReturnValue()) { + return unsignedLongLongIntReturnValue(); + } + return defaultValue; +} + +#else + +cpputest_longlong MockSupport::longLongIntReturnValue() +{ + FAIL("Long Long type is not supported"); + return cpputest_longlong(0); +} + +cpputest_ulonglong MockSupport::unsignedLongLongIntReturnValue() +{ + FAIL("Unsigned Long Long type is not supported"); + return cpputest_ulonglong(0); +} + +cpputest_longlong MockSupport::returnLongLongIntValueOrDefault(cpputest_longlong defaultValue) +{ + FAIL("Long Long type is not supported"); + return defaultValue; +} + +cpputest_ulonglong MockSupport::returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong defaultValue) +{ + FAIL("Unsigned Long Long type is not supported"); + return defaultValue; +} + +#endif + const char* MockSupport::stringReturnValue() { return returnValue().getStringValue(); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 013520435..6c2e14a36 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -148,6 +148,8 @@ MockExpectedCall_c* withIntParameters_c(const char* name, int value); MockExpectedCall_c* withUnsignedIntParameters_c(const char* name, unsigned int value); MockExpectedCall_c* withLongIntParameters_c(const char* name, long int value); MockExpectedCall_c* withUnsignedLongIntParameters_c(const char* name, unsigned long int value); +MockExpectedCall_c* withLongLongIntParameters_c(const char* name, cpputest_longlong value); +MockExpectedCall_c* withUnsignedLongLongIntParameters_c(const char* name, cpputest_ulonglong value); MockExpectedCall_c* withDoubleParameters_c(const char* name, double value); MockExpectedCall_c* withStringParameters_c(const char* name, const char* value); MockExpectedCall_c* withPointerParameters_c(const char* name, void* value); @@ -163,6 +165,8 @@ MockExpectedCall_c* andReturnIntValue_c(int value); MockExpectedCall_c* andReturnUnsignedIntValue_c(unsigned int value); MockExpectedCall_c* andReturnLongIntValue_c(long int value); MockExpectedCall_c* andReturnUnsignedLongIntValue_c(unsigned long int value); +MockExpectedCall_c* andReturnLongLongIntValue_c(cpputest_longlong value); +MockExpectedCall_c* andReturnUnsignedLongLongIntValue_c(cpputest_ulonglong value); MockExpectedCall_c* andReturnDoubleValue_c(double value); MockExpectedCall_c* andReturnStringValue_c(const char* value); MockExpectedCall_c* andReturnPointerValue_c(void* value); @@ -174,6 +178,8 @@ MockActualCall_c* withActualIntParameters_c(const char* name, int value); MockActualCall_c* withActualUnsignedIntParameters_c(const char* name, unsigned int value); MockActualCall_c* withActualLongIntParameters_c(const char* name, long int value); MockActualCall_c* withActualUnsignedLongIntParameters_c(const char* name, unsigned long int value); +MockActualCall_c* withActualLongLongIntParameters_c(const char* name, cpputest_longlong value); +MockActualCall_c* withActualUnsignedLongLongIntParameters_c(const char* name, cpputest_ulonglong value); MockActualCall_c* withActualDoubleParameters_c(const char* name, double value); MockActualCall_c* withActualStringParameters_c(const char* name, const char* value); MockActualCall_c* withActualPointerParameters_c(const char* name, void* value); @@ -194,6 +200,10 @@ long int longIntReturnValue_c(); long int returnLongIntValueOrDefault_c(long int defaultValue); unsigned long int unsignedLongIntReturnValue_c(); unsigned long int returnUnsignedLongIntValueOrDefault_c(unsigned long int defaultValue); +cpputest_longlong longLongIntReturnValue_c(); +cpputest_longlong returnLongLongIntValueOrDefault_c(cpputest_longlong defaultValue); +cpputest_ulonglong unsignedLongLongIntReturnValue_c(); +cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault_c(cpputest_ulonglong defaultValue); const char* stringReturnValue_c(); const char* returnStringValueOrDefault_c(const char * defaultValue); double doubleReturnValue_c(); @@ -238,6 +248,8 @@ static MockExpectedCall_c gExpectedCall = { withUnsignedIntParameters_c, withLongIntParameters_c, withUnsignedLongIntParameters_c, + withLongLongIntParameters_c, + withUnsignedLongLongIntParameters_c, withDoubleParameters_c, withStringParameters_c, withPointerParameters_c, @@ -253,6 +265,8 @@ static MockExpectedCall_c gExpectedCall = { andReturnIntValue_c, andReturnLongIntValue_c, andReturnUnsignedLongIntValue_c, + andReturnLongLongIntValue_c, + andReturnUnsignedLongLongIntValue_c, andReturnDoubleValue_c, andReturnStringValue_c, andReturnPointerValue_c, @@ -266,6 +280,8 @@ static MockActualCall_c gActualCall = { withActualUnsignedIntParameters_c, withActualLongIntParameters_c, withActualUnsignedLongIntParameters_c, + withActualLongLongIntParameters_c, + withActualUnsignedLongLongIntParameters_c, withActualDoubleParameters_c, withActualStringParameters_c, withActualPointerParameters_c, @@ -287,6 +303,10 @@ static MockActualCall_c gActualCall = { returnLongIntValueOrDefault_c, unsignedLongIntReturnValue_c, returnUnsignedLongIntValueOrDefault_c, + longLongIntReturnValue_c, + returnLongLongIntValueOrDefault_c, + unsignedLongLongIntReturnValue_c, + returnUnsignedLongLongIntValueOrDefault_c, stringReturnValue_c, returnStringValueOrDefault_c, doubleReturnValue_c, @@ -317,6 +337,10 @@ static MockSupport_c gMockSupport = { returnLongIntValueOrDefault_c, unsignedLongIntReturnValue_c, returnUnsignedLongIntValueOrDefault_c, + longLongIntReturnValue_c, + returnLongLongIntValueOrDefault_c, + unsignedLongLongIntReturnValue_c, + returnUnsignedLongLongIntValueOrDefault_c, stringReturnValue_c, returnStringValueOrDefault_c, doubleReturnValue_c, @@ -380,6 +404,36 @@ MockExpectedCall_c* withUnsignedLongIntParameters_c(const char* name, unsigned l return &gExpectedCall; } +#ifdef CPPUTEST_USE_LONG_LONG + +MockExpectedCall_c* withLongLongIntParameters_c(const char* name, cpputest_longlong value) +{ + expectedCall = &expectedCall->withParameter(name, value); + return &gExpectedCall; +} + +MockExpectedCall_c* withUnsignedLongLongIntParameters_c(const char* name, cpputest_ulonglong value) +{ + expectedCall = &expectedCall->withParameter(name, value); + return &gExpectedCall; +} + +#else + +MockExpectedCall_c* withLongLongIntParameters_c(const char*, cpputest_longlong) +{ + FAIL("Long Long type is not supported"); + return &gExpectedCall; +} + +MockExpectedCall_c* withUnsignedLongLongIntParameters_c(const char*, cpputest_ulonglong) +{ + FAIL("Unsigned Long Long type is not supported"); + return &gExpectedCall; +} + +#endif + MockExpectedCall_c* withDoubleParameters_c(const char* name, double value) { expectedCall = &expectedCall->withParameter(name, value); @@ -470,6 +524,36 @@ MockExpectedCall_c* andReturnUnsignedLongIntValue_c(unsigned long int value) return &gExpectedCall; } +#ifdef CPPUTEST_USE_LONG_LONG + +MockExpectedCall_c* andReturnLongLongIntValue_c(cpputest_longlong value) +{ + expectedCall = &expectedCall->andReturnValue(value); + return &gExpectedCall; +} + +MockExpectedCall_c* andReturnUnsignedLongLongIntValue_c(cpputest_ulonglong value) +{ + expectedCall = &expectedCall->andReturnValue(value); + return &gExpectedCall; +} + +#else + +MockExpectedCall_c* andReturnLongLongIntValue_c(cpputest_longlong) +{ + FAIL("Long Long type is not supported"); + return &gExpectedCall; +} + +MockExpectedCall_c* andReturnUnsignedLongLongIntValue_c(cpputest_ulonglong) +{ + FAIL("Unsigned Long Long type is not supported"); + return &gExpectedCall; +} + +#endif + MockExpectedCall_c* andReturnDoubleValue_c(double value) { expectedCall = &expectedCall->andReturnValue(value); @@ -523,6 +607,16 @@ static MockValue_c getMockValueCFromNamedValue(const MockNamedValue& namedValue) returnValue.type = MOCKVALUETYPE_UNSIGNED_LONG_INTEGER; returnValue.value.unsignedLongIntValue = namedValue.getUnsignedLongIntValue(); } +#ifdef CPPUTEST_USE_LONG_LONG + else if (SimpleString::StrCmp(namedValue.getType().asCharString(), "long long int") == 0) { + returnValue.type = MOCKVALUETYPE_LONG_LONG_INTEGER; + returnValue.value.longLongIntValue = namedValue.getLongLongIntValue(); + } + else if (SimpleString::StrCmp(namedValue.getType().asCharString(), "unsigned long long int") == 0) { + returnValue.type = MOCKVALUETYPE_UNSIGNED_LONG_LONG_INTEGER; + returnValue.value.unsignedLongLongIntValue = namedValue.getUnsignedLongLongIntValue(); + } +#endif else if (SimpleString::StrCmp(namedValue.getType().asCharString(), "double") == 0) { returnValue.type = MOCKVALUETYPE_DOUBLE; returnValue.value.doubleValue = namedValue.getDoubleValue(); @@ -612,6 +706,36 @@ MockActualCall_c* withActualUnsignedLongIntParameters_c(const char* name, unsign return &gActualCall; } +#ifdef CPPUTEST_USE_LONG_LONG + +MockActualCall_c* withActualLongLongIntParameters_c(const char* name, cpputest_longlong value) +{ + actualCall = &actualCall->withParameter(name, value); + return &gActualCall; +} + +MockActualCall_c* withActualUnsignedLongLongIntParameters_c(const char* name, cpputest_ulonglong value) +{ + actualCall = &actualCall->withParameter(name, value); + return &gActualCall; +} + +#else + +MockActualCall_c* withActualLongLongIntParameters_c(const char*, cpputest_longlong) +{ + FAIL("Long Long type is not supported"); + return &gActualCall; +} + +MockActualCall_c* withActualUnsignedLongLongIntParameters_c(const char*, cpputest_ulonglong) +{ + FAIL("Unsigned Long Long type is not supported"); + return &gActualCall; +} + +#endif + MockActualCall_c* withActualDoubleParameters_c(const char* name, double value) { actualCall = &actualCall->withParameter(name, value); @@ -736,6 +860,62 @@ unsigned long int returnUnsignedLongIntValueOrDefault_c(unsigned long int defaul return unsignedLongIntReturnValue_c(); } +#ifdef CPPUTEST_USE_LONG_LONG + +cpputest_longlong longLongIntReturnValue_c() +{ + return actualCall->returnLongLongIntValue(); +} + +cpputest_longlong returnLongLongIntValueOrDefault_c(cpputest_longlong defaultValue) +{ + if (!hasReturnValue_c()) { + return defaultValue; + } + return longLongIntReturnValue_c(); +} + +cpputest_ulonglong unsignedLongLongIntReturnValue_c() +{ + return actualCall->returnUnsignedLongLongIntValue(); +} + +cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault_c(cpputest_ulonglong defaultValue) +{ + if (!hasReturnValue_c()) { + return defaultValue; + } + return unsignedLongLongIntReturnValue_c(); +} + +#else + +cpputest_longlong longLongIntReturnValue_c() +{ + FAIL("Long Long type is not supported"); + return cpputest_longlong(0); +} + +cpputest_longlong returnLongLongIntValueOrDefault_c(cpputest_longlong) +{ + FAIL("Long Long type is not supported"); + return cpputest_longlong(0); +} + +cpputest_ulonglong unsignedLongLongIntReturnValue_c() +{ + FAIL("Unsigned Long Long type is not supported"); + return cpputest_ulonglong(0); +} + +cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault_c(cpputest_ulonglong) +{ + FAIL("Unsigned Long Long type is not supported"); + return cpputest_ulonglong(0); +} + +#endif + const char* stringReturnValue_c() { return actualCall->returnStringValue(); diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 66b489cda..7899b128e 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -161,6 +161,12 @@ TEST(MockCheckedActualCall, MockIgnoredActualCallWorksAsItShould) CHECK(1l == actual.returnLongIntValueOrDefault(1l)); CHECK(0 == actual.returnUnsignedIntValue()); CHECK(1u == actual.returnUnsignedIntValueOrDefault(1u)); +#ifdef CPPUTEST_USE_LONG_LONG + CHECK(0 == actual.returnLongLongIntValue()); + CHECK(1ll == actual.returnLongLongIntValueOrDefault(1ll)); + CHECK(0 == actual.returnUnsignedLongLongIntValue()); + CHECK(1ull == actual.returnUnsignedLongLongIntValueOrDefault(1ull)); +#endif DOUBLES_EQUAL(0.0, actual.returnDoubleValue(), 0.0); DOUBLES_EQUAL(1.5, actual.returnDoubleValueOrDefault(1.5), 0.0); STRCMP_EQUAL("bla", actual.returnStringValueOrDefault("bla")); @@ -190,6 +196,10 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) actual.withUnsignedIntParameter("unsigned_int", (unsigned int) 1); actual.withUnsignedLongIntParameter("unsigned_long", (unsigned long)1); actual.withLongIntParameter("long_int", (long int) 1); +#ifdef CPPUTEST_USE_LONG_LONG + actual.withLongLongIntParameter("long_long_int", (long long int) 1); + actual.withUnsignedLongLongIntParameter("unsigned_long_long_int", (unsigned long long int) 1); +#endif actual.withPointerParameter("pointer", &value); actual.withConstPointerParameter("const_pointer", &const_value); actual.withFunctionPointerParameter("function_pointer", function_value); @@ -204,6 +214,10 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) expectedString += " unsigned_int:1 (0x1)"; expectedString += " unsigned_long:1 (0x1)"; expectedString += " long_int:1 (0x1)"; +#ifdef CPPUTEST_USE_LONG_LONG + expectedString += " long_long_int:1 (0x1)"; + expectedString += " unsigned_long_long_int:1 (0x1)"; +#endif expectedString += " pointer:0x"; expectedString += HexStringFrom(&value); expectedString += " const_pointer:0x"; @@ -226,6 +240,12 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) CHECK(0 == actual.returnIntValueOrDefault(1)); CHECK(0 == actual.returnLongIntValue()); CHECK(0 == actual.returnLongIntValueOrDefault(1l)); +#ifdef CPPUTEST_USE_LONG_LONG + CHECK(0 == actual.returnLongLongIntValue()); + CHECK(0 == actual.returnLongLongIntValueOrDefault(1ll)); + CHECK(0 == actual.returnUnsignedLongLongIntValue()); + CHECK(0 == actual.returnUnsignedLongLongIntValueOrDefault(1ull)); +#endif CHECK(0 == actual.returnUnsignedIntValue()); CHECK(0 == actual.returnUnsignedIntValueOrDefault(1u)); DOUBLES_EQUAL(0.0, actual.returnDoubleValue(), 0.0); diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index b9cd60fe1..f213b2445 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -227,6 +227,32 @@ TEST(MockExpectedCall, callWithLongIntegerParameter) STRCMP_CONTAINS("funcName -> long int paramName: <777 (0x309)>", call->callToString().asCharString()); } +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(MockExpectedCall, callWithUnsignedLongLongIntegerParameter) +{ + const SimpleString paramName = "paramName"; + unsigned long long value = 888; + call->withParameter(paramName, value); + STRCMP_EQUAL("unsigned long long int", call->getInputParameterType(paramName).asCharString()); + UNSIGNED_LONGLONGS_EQUAL(value, call->getInputParameter(paramName).getUnsignedLongLongIntValue()); + CHECK(call->hasInputParameterWithName(paramName)); + STRCMP_CONTAINS("funcName -> unsigned long long int paramName: <888 (0x378)>", call->callToString().asCharString()); +} + +TEST(MockExpectedCall, callWithLongLongIntegerParameter) +{ + const SimpleString paramName = "paramName"; + long long value = 777; + call->withParameter(paramName, value); + STRCMP_EQUAL("long long int", call->getInputParameterType(paramName).asCharString()); + LONGLONGS_EQUAL(value, call->getInputParameter(paramName).getLongLongIntValue()); + CHECK(call->hasInputParameterWithName(paramName)); + STRCMP_CONTAINS("funcName -> long long int paramName: <777 (0x309)>", call->callToString().asCharString()); +} + +#endif + TEST(MockExpectedCall, callWithDoubleParameter) { const SimpleString paramName = "paramName"; @@ -719,6 +745,10 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.withUnsignedIntParameter("foo", (unsigned int) 1); ignored.withLongIntParameter("hey", (long int) 1); ignored.withUnsignedLongIntParameter("bah", (unsigned long int) 1); +#ifdef CPPUTEST_USE_LONG_LONG + ignored.withLongLongIntParameter("yo", (long long int) 1); + ignored.withUnsignedLongLongIntParameter("grr", (unsigned long long int) 1); +#endif ignored.withDoubleParameter("hah", (double) 1.1f); ignored.withStringParameter("goo", "hello"); ignored.withPointerParameter("pie", (void*) NULLPTR); @@ -735,6 +765,10 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.andReturnValue((int) 1); ignored.andReturnValue((unsigned long int) 1); ignored.andReturnValue((long int) 1); +#ifdef CPPUTEST_USE_LONG_LONG + ignored.andReturnValue((unsigned long long int) 1); + ignored.andReturnValue((long long int) 1); +#endif ignored.andReturnValue("boo"); ignored.andReturnValue((void*) NULLPTR); ignored.andReturnValue((const void*) NULLPTR); diff --git a/tests/CppUTestExt/MockFakeLongLong.cpp b/tests/CppUTestExt/MockFakeLongLong.cpp new file mode 100644 index 000000000..4418e525a --- /dev/null +++ b/tests/CppUTestExt/MockFakeLongLong.cpp @@ -0,0 +1,170 @@ +/* + * 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 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 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/TestOutput.h" +#include "CppUTest/TestTestingFixture.h" +#include "CppUTestExt/MockCheckedActualCall.h" +#include "CppUTestExt/MockCheckedExpectedCall.h" +#include "CppUTestExt/MockExpectedCallsList.h" +#include "CppUTestExt/MockFailure.h" +#include "MockFailureReporterForTest.h" + +#define CHECK_TEST_FAILS_PROPER_WITH_TEXT(text) fixture.checkTestFailsWithProperTestLocation(text, __FILE__, __LINE__) + +TEST_GROUP(FakeLongLongs) +{ + TestTestingFixture fixture; +}; + +#ifndef CPPUTEST_USE_LONG_LONG + +static void _actualCallWithFakeLongLongParameter() +{ + cpputest_longlong value = {0}; + + mock().expectOneCall("foo").withParameter("bar", 0); + mock().actualCall("foo").withParameter("bar", value); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(FakeLongLongs, ActualCallWithFakeLongLongParameterFAILS) +{ + fixture.runTestWithMethod(_actualCallWithFakeLongLongParameter); + mock().clear(); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("Long Long type is not supported"); +} + +static void _actualCallWithFakeUnsignedLongLongParameter() +{ + cpputest_ulonglong value = {0}; + + mock().expectOneCall("foo").withParameter("bar", 0); + mock().actualCall("foo").withParameter("bar", value); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(FakeLongLongs, ActualCallWithFakeUnsignedLongLongParameterFAILS) +{ + fixture.runTestWithMethod(_actualCallWithFakeUnsignedLongLongParameter); + mock().clear(); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("Unsigned Long Long type is not supported"); +} + +static void _actualCallWithFakeLongLongReturn() +{ + mock().expectOneCall("foo").andReturnValue(0); + mock().actualCall("foo").returnLongLongIntValue(); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(FakeLongLongs, ActualCallWithFakeLongLongReturnFAILS) +{ + fixture.runTestWithMethod(_actualCallWithFakeLongLongReturn); + mock().clear(); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("Long Long type is not supported"); +} + +static void _actualCallWithFakeUnsignedLongLongReturn() +{ + mock().expectOneCall("foo").andReturnValue(0); + mock().actualCall("foo").returnUnsignedLongLongIntValue(); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(FakeLongLongs, ActualCallWithFakeUnsignedLongLongReturnFAILS) +{ + fixture.runTestWithMethod(_actualCallWithFakeUnsignedLongLongReturn); + mock().clear(); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("Unsigned Long Long type is not supported"); +} + +static void _expectOneCallWithFakeLongLongParameter() +{ + cpputest_longlong value = {0}; + + mock().expectOneCall("foo").withParameter("bar", value); + mock().actualCall("foo").withParameter("bar", 0); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(FakeLongLongs, ExpectedCallWithFakeLongLongParameterFAILS) +{ + fixture.runTestWithMethod(_expectOneCallWithFakeLongLongParameter); + mock().clear(); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("Long Long type is not supported"); +} + +static void _expectOneCallWithFakeUnsignedLongLongParameter() +{ + cpputest_ulonglong value = {0}; + + mock().expectOneCall("foo").withParameter("bar", value); + mock().actualCall("foo").withParameter("bar", 0); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(FakeLongLongs, ExpectedCallWithFakeUnsignedLongLongParameterFAILS) +{ + fixture.runTestWithMethod(_expectOneCallWithFakeUnsignedLongLongParameter); + mock().clear(); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("Unsigned Long Long type is not supported"); +} + +static void _expectOneCallWithFakeLongLongReturn() +{ + cpputest_longlong value = {0}; + + mock().expectOneCall("foo").andReturnValue(value); + mock().actualCall("foo").returnIntValue(); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(FakeLongLongs, ExpectedCallWithFakeLongLongReturnFAILS) +{ + fixture.runTestWithMethod(_expectOneCallWithFakeLongLongReturn); + mock().clear(); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("Long Long type is not supported"); +} + +static void _expectOneCallWithFakeUnsignedLongLongReturn() +{ + cpputest_ulonglong value = {0}; + + mock().expectOneCall("foo").andReturnValue(value); + mock().actualCall("foo").returnIntValue(); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(FakeLongLongs, ExpectedCallWithFakeUnsignedLongLongReturnFAILS) +{ + fixture.runTestWithMethod(_expectOneCallWithFakeUnsignedLongLongReturn); + mock().clear(); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("Unsigned Long Long type is not supported"); +} + +#endif diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index f4b6ba3b4..55e0ca3e3 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -62,6 +62,29 @@ TEST(MockParameterTest, expectOneIntegerParameterAndValue) mock().checkExpectations(); } +#ifdef CPPUTEST_USE_LONGLONG + +TEST(MockParameterTest, expectOneUnsignedLongLongIntegerParameterAndValue) +{ + unsigned long long value = 0xFFFFAAAAFFFFAAAA; + mock().expectOneCall("foo").withParameter("parameter", value); + mock().actualCall("foo").withParameter("parameter", value); + + mock().checkExpectations(); +} + +TEST(MockParameterTest, expectOneLongLongIntegerParameterAndValue) +{ + long long value = 0x7FFFAAAAFFFFAAAA; + + mock().expectOneCall("foo").withParameter("parameter", value); + mock().actualCall("foo").withParameter("parameter", value); + + mock().checkExpectations(); +} + +#endif + TEST(MockParameterTest, mismatchedIntegerTypesIntAndLongAreAllowed) { mock().expectOneCall("foo").withParameter("parameter", (int)1); @@ -73,6 +96,21 @@ TEST(MockParameterTest, mismatchedIntegerTypesIntAndLongAreAllowed) mock().checkExpectations(); } +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(MockParameterTest, mismatchedIntegerTypesIntAndLongLongAreAllowed) +{ + mock().expectOneCall("foo").withParameter("parameter", (int)1); + mock().actualCall("foo").withParameter("parameter", (long long)1); + + mock().expectOneCall("foo").withParameter("parameter", (long long)1); + mock().actualCall("foo").withParameter("parameter", (int)1); + + mock().checkExpectations(); +} + +#endif + TEST(MockParameterTest, mismatchedIntegerTypesIntAndUnsignedAreAllowed) { mock().expectOneCall("foo").withParameter("parameter", (int)1); @@ -95,6 +133,21 @@ TEST(MockParameterTest, mismatchedIntegerTypesIntAndUnsignedLongAreAllowed) mock().checkExpectations(); } +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(MockParameterTest, mismatchedIntegerTypesIntAndUnsignedLongLongAreAllowed) +{ + mock().expectOneCall("foo").withParameter("parameter", (int)1); + mock().actualCall("foo").withParameter("parameter", (unsigned long long)1); + + mock().expectOneCall("foo").withParameter("parameter", (unsigned long long)1); + mock().actualCall("foo").withParameter("parameter", (int)1); + + mock().checkExpectations(); +} + +#endif + TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndLongAreAllowed) { mock().expectOneCall("foo").withParameter("parameter", (unsigned)1); @@ -106,6 +159,21 @@ TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndLongAreAllowed) mock().checkExpectations(); } +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndLongLongAreAllowed) +{ + mock().expectOneCall("foo").withParameter("parameter", (unsigned)1); + mock().actualCall("foo").withParameter("parameter", (long long)1); + + mock().expectOneCall("foo").withParameter("parameter", (long long)1); + mock().actualCall("foo").withParameter("parameter", (unsigned)1); + + mock().checkExpectations(); +} + +#endif + TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndUnsignedLongAreAllowed) { mock().expectOneCall("foo").withParameter("parameter", (unsigned)1); @@ -117,6 +185,43 @@ TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndUnsignedLongAreAllowed) mock().checkExpectations(); } +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndUnsignedLongLongAreAllowed) +{ + mock().expectOneCall("foo").withParameter("parameter", (unsigned)1); + mock().actualCall("foo").withParameter("parameter", (unsigned long long)1); + + mock().expectOneCall("foo").withParameter("parameter", (unsigned long long)1); + mock().actualCall("foo").withParameter("parameter", (unsigned)1); + + mock().checkExpectations(); +} + +TEST(MockParameterTest, mismatchedIntegerTypesUnsignedLongAndUnsignedLongLongAreAllowed) +{ + mock().expectOneCall("foo").withParameter("parameter", (unsigned long)1); + mock().actualCall("foo").withParameter("parameter", (unsigned long long)1); + + mock().expectOneCall("foo").withParameter("parameter", (unsigned long long)1); + mock().actualCall("foo").withParameter("parameter", (unsigned long)1); + + mock().checkExpectations(); +} + +TEST(MockParameterTest, mismatchedIntegerTypesLongAndLongLongAreAllowed) +{ + mock().expectOneCall("foo").withParameter("parameter", (long)1); + mock().actualCall("foo").withParameter("parameter", (long long)1); + + mock().expectOneCall("foo").withParameter("parameter", (long long)1); + mock().actualCall("foo").withParameter("parameter", (long)1); + + mock().checkExpectations(); +} + +#endif + TEST(MockParameterTest, mismatchedIntegerTypesLongAndUnsignedLongAreAllowed) { mock().expectOneCall("foo").withParameter("parameter", (long)1); @@ -128,6 +233,43 @@ TEST(MockParameterTest, mismatchedIntegerTypesLongAndUnsignedLongAreAllowed) mock().checkExpectations(); } +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(MockParameterTest, mismatchedIntegerTypesLongAndUnsignedLongLongAreAllowed) +{ + mock().expectOneCall("foo").withParameter("parameter", (long)1); + mock().actualCall("foo").withParameter("parameter", (unsigned long long)1); + + mock().expectOneCall("foo").withParameter("parameter", (unsigned long long)1); + mock().actualCall("foo").withParameter("parameter", (long)1); + + mock().checkExpectations(); +} + +TEST(MockParameterTest, mismatchedIntegerTypesUnsignedLongAndLongLongAreAllowed) +{ + mock().expectOneCall("foo").withParameter("parameter", (unsigned long)1); + mock().actualCall("foo").withParameter("parameter", (long long)1); + + mock().expectOneCall("foo").withParameter("parameter", (long long)1); + mock().actualCall("foo").withParameter("parameter", (unsigned long)1); + + mock().checkExpectations(); +} + +TEST(MockParameterTest, mismatchedIntegerTypesLongLongAndUnsignedLongLongAreAllowed) +{ + mock().expectOneCall("foo").withParameter("parameter", (long long)1); + mock().actualCall("foo").withParameter("parameter", (unsigned long long)1); + + mock().expectOneCall("foo").withParameter("parameter", (unsigned long long)1); + mock().actualCall("foo").withParameter("parameter", (long long)1); + + mock().checkExpectations(); +} + +#endif + TEST(MockParameterTest, longAndUnsignedLongWithSameBitRepresentationShouldNotBeTreatedAsEqual) { MockFailureReporterInstaller failureReporterInstaller; @@ -712,6 +854,10 @@ TEST(MockParameterTest, ignoreOtherCallsIgnoresWithAllKindsOfParameters) .withParameter("bar", 1u) .withParameter("foo", 1l) .withParameter("hey", 1ul) +#ifdef CPPUTEST_USE_LONG_LONG + .withParameter("ick", 1ll) + .withParameter("grr", 1ull) +#endif .withParameter("duh", 1.0) .withParameter("yoo", (const void*) NULLPTR) .withParameter("func", (void(*)()) NULLPTR) diff --git a/tests/CppUTestExt/MockReturnValueTest.cpp b/tests/CppUTestExt/MockReturnValueTest.cpp index afeff76d5..911bc6921 100644 --- a/tests/CppUTestExt/MockReturnValueTest.cpp +++ b/tests/CppUTestExt/MockReturnValueTest.cpp @@ -27,6 +27,7 @@ #include "CppUTest/TestHarness.h" #include "MockFailureReporterForTest.h" +#include TEST_GROUP(MockReturnValueTest) { @@ -105,6 +106,87 @@ TEST(MockReturnValueTest, UnsignedIntReturnValueCanBeRetrievedAsUnsignedLongInt) UNSIGNED_LONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getUnsignedLongIntValue()); } +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(MockReturnValueTest, PositiveIntReturnValueCanBeRetrievedAsUnsignedLongLongInt) +{ + int expected_value = 7; + mock().expectOneCall("foo").andReturnValue(expected_value); + UNSIGNED_LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getUnsignedLongLongIntValue()); +} + +TEST(MockReturnValueTest, PositiveLongIntReturnValueCanBeRetrievedAsUnsignedLongLongInt) +{ + long int expected_value = 7; + mock().expectOneCall("foo").andReturnValue(expected_value); + UNSIGNED_LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getUnsignedLongLongIntValue()); +} + +TEST(MockReturnValueTest, PositiveLongLongIntReturnValueCanBeRetrievedAsUnsignedLongLongInt) +{ + long long int expected_value = 7; + mock().expectOneCall("foo").andReturnValue(expected_value); + UNSIGNED_LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getUnsignedLongLongIntValue()); +} + +TEST(MockReturnValueTest, UnsignedIntReturnValueCanBeRetrievedAsUnsignedLongLongInt) +{ + unsigned int expected_value = 7; + mock().expectOneCall("foo").andReturnValue(expected_value); + UNSIGNED_LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getUnsignedLongLongIntValue()); +} + +TEST(MockReturnValueTest, UnsignedLongIntReturnValueCanBeRetrievedAsUnsignedLongLongInt) +{ + unsigned long int expected_value = 7; + mock().expectOneCall("foo").andReturnValue(expected_value); + UNSIGNED_LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getUnsignedLongLongIntValue()); +} + +TEST(MockReturnValueTest, UnsignedLongLongIntReturnValueCanBeRetrieved) +{ + unsigned long long int expected_value = ULLONG_MAX; + mock().expectOneCall("foo").andReturnValue(expected_value); + UNSIGNED_LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getUnsignedLongLongIntValue()); +} + +TEST(MockReturnValueTest, PositiveIntReturnValueCanBeRetrievedAsLongLongInt) +{ + int expected_value = 7; + mock().expectOneCall("foo").andReturnValue(expected_value); + LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getLongLongIntValue()); +} + +TEST(MockReturnValueTest, PositiveLongIntReturnValueCanBeRetrievedAsLongLongInt) +{ + long int expected_value = 7; + mock().expectOneCall("foo").andReturnValue(expected_value); + LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getLongLongIntValue()); +} + +TEST(MockReturnValueTest, UnsignedIntReturnValueCanBeRetrievedAsLongLongInt) +{ + unsigned int expected_value = 7; + mock().expectOneCall("foo").andReturnValue(expected_value); + LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getLongLongIntValue()); +} + +TEST(MockReturnValueTest, UnsignedLongIntReturnValueCanBeRetrievedAsLongLongInt) +{ + unsigned long int expected_value = 7; + mock().expectOneCall("foo").andReturnValue(expected_value); + LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getLongLongIntValue()); +} + +TEST(MockReturnValueTest, LongLongIntReturnValueCanBeRetrieved) +{ + long long int expected_value = LLONG_MAX; + mock().expectOneCall("foo").andReturnValue(expected_value); + LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getLongLongIntValue()); +} + +#endif + TEST(MockReturnValueTest, UnsignedIntegerReturnValueSetsDifferentValues) { unsigned int expected_value = 1; @@ -202,6 +284,44 @@ TEST(MockReturnValueTest, WhenNoLongIntegerReturnValueIsExpectedButThereIsADefau LONGS_EQUAL(default_return_value, mock().returnLongIntValueOrDefault(default_return_value)); } +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(MockReturnValueTest, WhenAUnsignedLongLongIntegerReturnValueIsExpectedAndAlsoThereIsADefaultShouldlIgnoreTheDefault) +{ + unsigned long long int default_return_value = ULLONG_MAX; + unsigned long long int expected_return_value = default_return_value - 1; + mock().expectOneCall("foo").andReturnValue(expected_return_value); + LONGS_EQUAL(expected_return_value, mock().actualCall("foo").returnUnsignedLongLongIntValueOrDefault(default_return_value)); + LONGS_EQUAL(expected_return_value, mock().returnUnsignedLongLongIntValueOrDefault(default_return_value)); +} + +TEST(MockReturnValueTest, WhenNoUnsignedLongLongIntegerReturnValueIsExpectedButThereIsADefaultShouldlUseTheDefaultValue) +{ + unsigned long long int default_return_value = ULLONG_MAX; + mock().expectOneCall("foo"); + LONGS_EQUAL(default_return_value, mock().actualCall("foo").returnUnsignedLongLongIntValueOrDefault(default_return_value)); + LONGS_EQUAL(default_return_value, mock().returnUnsignedLongLongIntValueOrDefault(default_return_value)); +} + +TEST(MockReturnValueTest, WhenALongLongIntegerReturnValueIsExpectedAndAlsoThereIsADefaultShouldlIgnoreTheDefault) +{ + long long int default_return_value = LLONG_MAX; + long long int expected_return_value = default_return_value - 1; + mock().expectOneCall("foo").andReturnValue(expected_return_value); + LONGS_EQUAL(expected_return_value, mock().actualCall("foo").returnLongLongIntValueOrDefault(default_return_value)); + LONGS_EQUAL(expected_return_value, mock().returnLongLongIntValueOrDefault(default_return_value)); +} + +TEST(MockReturnValueTest, WhenNoLongLongIntegerReturnValueIsExpectedButThereIsADefaultShouldlUseTheDefaultValue) +{ + long long int default_return_value = LLONG_MAX; + mock().expectOneCall("foo"); + LONGS_EQUAL(default_return_value, mock().actualCall("foo").returnLongLongIntValueOrDefault(default_return_value)); + LONGS_EQUAL(default_return_value, mock().returnLongLongIntValueOrDefault(default_return_value)); +} + +#endif + TEST(MockReturnValueTest, WhenABooleanReturnValueIsExpectedAndAlsoThereIsADefaultShouldlIgnoreTheDefault) { bool default_return_value = true; @@ -398,6 +518,90 @@ TEST(MockReturnValueTest, UnsignedLongIntegerReturnValueSetsDifferentValuesWhile LONGS_EQUAL(another_ret_value, mock().returnValue().getUnsignedLongIntValue()); } +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(MockReturnValueTest, LongLongIntegerReturnValue) +{ + long long int expected_value = 7; + mock().expectOneCall("foo").andReturnValue(expected_value); + + MockActualCall& actual_call = mock().actualCall("foo"); + LONGLONGS_EQUAL(expected_value, actual_call.returnValue().getLongLongIntValue()); + LONGLONGS_EQUAL(expected_value, actual_call.returnLongLongIntValue()); + LONGLONGS_EQUAL(expected_value, mock().returnValue().getLongLongIntValue()); + LONGLONGS_EQUAL(expected_value, mock().longLongIntReturnValue()); +} + +TEST(MockReturnValueTest, LongLongIntegerReturnValueSetsDifferentValues) +{ + long long int expected_value = 1; + long long int another_expected_value = 2; + + mock().expectOneCall("foo").andReturnValue(expected_value); + mock().expectOneCall("foo").andReturnValue(another_expected_value); + + LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getLongLongIntValue()); + LONGLONGS_EQUAL(expected_value, mock().returnValue().getLongLongIntValue()); + LONGLONGS_EQUAL(another_expected_value, mock().actualCall("foo").returnValue().getLongLongIntValue()); + LONGLONGS_EQUAL(another_expected_value, mock().returnValue().getLongLongIntValue()); +} + +TEST(MockReturnValueTest, LongLongIntegerReturnValueSetsDifferentValuesWhileParametersAreIgnored) +{ + long long int ret_value = 1; + long long int another_ret_value = 2; + + mock().expectOneCall("foo").withParameter("p1", 1).ignoreOtherParameters().andReturnValue(ret_value); + mock().expectOneCall("foo").withParameter("p1", 1).ignoreOtherParameters().andReturnValue(another_ret_value); + + LONGLONGS_EQUAL(ret_value, mock().actualCall("foo").withParameter("p1", 1).returnValue().getLongLongIntValue()); + LONGLONGS_EQUAL(ret_value, mock().returnValue().getLongLongIntValue()); + LONGLONGS_EQUAL(another_ret_value, mock().actualCall("foo").withParameter("p1", 1).returnValue().getLongLongIntValue()); + LONGLONGS_EQUAL(another_ret_value, mock().returnValue().getLongLongIntValue()); +} + +TEST(MockReturnValueTest, UnsignedLongLongIntegerReturnValue) +{ + unsigned long long int expected_value = 7; + mock().expectOneCall("foo").andReturnValue(expected_value); + + MockActualCall& actual_call = mock().actualCall("foo"); + UNSIGNED_LONGLONGS_EQUAL(expected_value, actual_call.returnValue().getUnsignedLongLongIntValue()); + UNSIGNED_LONGLONGS_EQUAL(expected_value, actual_call.returnUnsignedLongLongIntValue()); + UNSIGNED_LONGLONGS_EQUAL(expected_value, mock().returnValue().getUnsignedLongLongIntValue()); + UNSIGNED_LONGLONGS_EQUAL(expected_value, mock().unsignedLongLongIntReturnValue()); +} + +TEST(MockReturnValueTest, UnsignedLongLongIntegerReturnValueSetsDifferentValues) +{ + unsigned long long int expected_value = 1; + unsigned long long int another_expected_value = 2; + + mock().expectOneCall("foo").andReturnValue(expected_value); + mock().expectOneCall("foo").andReturnValue(another_expected_value); + + UNSIGNED_LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getUnsignedLongLongIntValue()); + UNSIGNED_LONGLONGS_EQUAL(expected_value, mock().returnValue().getUnsignedLongLongIntValue()); + UNSIGNED_LONGLONGS_EQUAL(another_expected_value, mock().actualCall("foo").returnValue().getUnsignedLongLongIntValue()); + UNSIGNED_LONGLONGS_EQUAL(another_expected_value, mock().returnValue().getUnsignedLongLongIntValue()); +} + +TEST(MockReturnValueTest, UnsignedLongLongIntegerReturnValueSetsDifferentValuesWhileParametersAreIgnored) +{ + unsigned long long int ret_value = 1; + unsigned long long int another_ret_value = 2; + + mock().expectOneCall("foo").withParameter("p1", 1).ignoreOtherParameters().andReturnValue(ret_value); + mock().expectOneCall("foo").withParameter("p1", 1).ignoreOtherParameters().andReturnValue(another_ret_value); + + UNSIGNED_LONGLONGS_EQUAL(ret_value, mock().actualCall("foo").withParameter("p1", 1).returnValue().getUnsignedLongLongIntValue()); + UNSIGNED_LONGLONGS_EQUAL(ret_value, mock().returnValue().getUnsignedLongLongIntValue()); + UNSIGNED_LONGLONGS_EQUAL(another_ret_value, mock().actualCall("foo").withParameter("p1", 1).returnValue().getUnsignedLongLongIntValue()); + UNSIGNED_LONGLONGS_EQUAL(another_ret_value, mock().returnValue().getUnsignedLongLongIntValue()); +} + +#endif + TEST(MockReturnValueTest, MatchingReturnValueOnWhileSignature) { mock().expectOneCall("foo").withParameter("p1", 1).andReturnValue(1); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 65cd5e613..df29a8732 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -154,6 +154,22 @@ TEST(MockSupport_c, unsignedLongIntParameter) mock_c()->actualCall("foo")->withUnsignedLongIntParameters("p", 1); } +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(MockSupport_c, longLongIntParameter) +{ + mock_c()->expectOneCall("foo")->withLongLongIntParameters("p", 1); + mock_c()->actualCall("foo")->withLongLongIntParameters("p", 1); +} + +TEST(MockSupport_c, unsignedLongLongIntParameter) +{ + mock_c()->expectOneCall("foo")->withUnsignedLongLongIntParameters("p", 1); + mock_c()->actualCall("foo")->withUnsignedLongLongIntParameters("p", 1); +} + +#endif + TEST(MockSupport_c, memoryBufferParameter) { const unsigned char mem_buffer[] = { 1, 2, 3}; @@ -334,6 +350,62 @@ TEST(MockSupport_c, whenNoReturnValueIsGivenReturnUnsignedLongIntValueOrDefaultS LONGS_EQUAL(defaultValue, mock_c()->returnUnsignedLongIntValueOrDefault(defaultValue)); } +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(MockSupport_c, returnLongLongIntValue) +{ + long long int expected_value = -10L; + mock_c()->expectOneCall("boo")->andReturnLongLongIntValue(expected_value); + LONGLONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->longLongIntReturnValue()); + LONGLONGS_EQUAL(expected_value, mock_c()->longLongIntReturnValue()); + LONGLONGS_EQUAL(MOCKVALUETYPE_LONG_LONG_INTEGER, mock_c()->returnValue().type); +} + +TEST(MockSupport_c, whenReturnValueIsGivenReturnLongLongIntValueOrDefaultShouldIgnoreTheDefault) +{ + long long int defaultValue = -10L; + long long int expectedValue = defaultValue - 1L; + mock_c()->expectOneCall("foo")->andReturnLongLongIntValue(expectedValue); + LONGLONGS_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnLongLongIntValueOrDefault(defaultValue)); + LONGLONGS_EQUAL(expectedValue, mock_c()->returnLongLongIntValueOrDefault(defaultValue)); +} + +TEST(MockSupport_c, whenNoReturnValueIsGivenReturnLongLongIntValueOrDefaultShouldlUseTheDefaultValue) +{ + long long int defaultValue = -10L; + mock_c()->expectOneCall("foo"); + LONGLONGS_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnLongLongIntValueOrDefault(defaultValue)); + LONGLONGS_EQUAL(defaultValue, mock_c()->returnLongLongIntValueOrDefault(defaultValue)); +} + +TEST(MockSupport_c, returnUnsignedLongLongIntValue) +{ + unsigned long long int expected_value = 10; + mock_c()->expectOneCall("boo")->andReturnUnsignedLongLongIntValue(expected_value); + UNSIGNED_LONGLONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->unsignedLongLongIntReturnValue()); + UNSIGNED_LONGLONGS_EQUAL(expected_value, mock_c()->unsignedLongLongIntReturnValue()); + UNSIGNED_LONGLONGS_EQUAL(MOCKVALUETYPE_UNSIGNED_LONG_LONG_INTEGER, mock_c()->returnValue().type); +} + +TEST(MockSupport_c, whenReturnValueIsGivenReturnUnsignedLongLongIntValueOrDefaultShouldIgnoreTheDefault) +{ + unsigned long long int defaultValue = 10L; + unsigned long long int expectedValue = defaultValue + 1L; + mock_c()->expectOneCall("foo")->andReturnUnsignedLongLongIntValue(expectedValue); + UNSIGNED_LONGLONGS_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnUnsignedLongLongIntValueOrDefault(defaultValue)); + UNSIGNED_LONGLONGS_EQUAL(expectedValue, mock_c()->returnUnsignedLongLongIntValueOrDefault(defaultValue)); +} + +TEST(MockSupport_c, whenNoReturnValueIsGivenReturnUnsignedLongLongIntValueOrDefaultShouldlUseTheDefaultValue) +{ + unsigned long long int defaultValue = 10L; + mock_c()->expectOneCall("foo"); + UNSIGNED_LONGLONGS_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnUnsignedLongLongIntValueOrDefault(defaultValue)); + UNSIGNED_LONGLONGS_EQUAL(defaultValue, mock_c()->returnUnsignedLongLongIntValueOrDefault(defaultValue)); +} + +#endif + TEST(MockSupport_c, returnStringValue) { mock_c()->expectOneCall("boo")->andReturnStringValue("hello world"); diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index 36564eea5..afc787c4e 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -53,6 +53,11 @@ void all_mock_support_c_calls(void) withUnsignedIntParameters("unsigned", 1)-> withLongIntParameters("long int", (long int) -1)-> withUnsignedLongIntParameters("unsigned long int", (unsigned long int) 1)-> +#ifdef CPPUTEST_USE_LONG_LONG + withLongLongIntParameters("long long int", (long long int) -1)-> + withUnsignedLongLongIntParameters("unsigned long long int", (unsigned long long int) 1)-> +#endif + withDoubleParameters("double", 1.0)-> withStringParameters("string", "string")-> withPointerParameters("pointer", (void*) 1)-> @@ -66,6 +71,10 @@ void all_mock_support_c_calls(void) withUnsignedIntParameters("unsigned", 1)-> withLongIntParameters("long int", (long int) -1)-> withUnsignedLongIntParameters("unsigned long int", (unsigned long int) 1)-> +#ifdef CPPUTEST_USE_LONG_LONG + withLongLongIntParameters("long long int", (long long int) -1)-> + withUnsignedLongLongIntParameters("unsigned long long int", (unsigned long long int) 1)-> +#endif withDoubleParameters("double", 1.0)-> withStringParameters("string", "string")-> withPointerParameters("pointer", (void*) 1)-> @@ -112,6 +121,16 @@ void all_mock_support_c_calls(void) mock_c()->actualCall("boo3")->unsignedLongIntReturnValue(); mock_c()->unsignedLongIntReturnValue(); +#ifdef CPPUTEST_USE_LONG_LONG + mock_c()->expectOneCall("mgrgrgr1")->andReturnLongLongIntValue(1); + mock_c()->actualCall("mgrgrgr1")->longLongIntReturnValue(); + mock_c()->longLongIntReturnValue(); + + mock_c()->expectOneCall("mgrgrgr2")->andReturnUnsignedLongLongIntValue(1); + mock_c()->actualCall("mgrgrgr2")->unsignedLongLongIntReturnValue(); + mock_c()->unsignedLongLongIntReturnValue(); +#endif + mock_c()->expectOneCall("boo4")->andReturnDoubleValue(1.0); mock_c()->actualCall("boo4")->doubleReturnValue(); mock_c()->doubleReturnValue(); @@ -168,6 +187,10 @@ void all_mock_support_c_calls(void) mock_c()->returnUnsignedIntValueOrDefault(1); mock_c()->returnLongIntValueOrDefault(-1L); mock_c()->returnUnsignedLongIntValueOrDefault(1L); +#ifdef CPPUTEST_USE_LONG_LONG + mock_c()->returnLongLongIntValueOrDefault(-1LL); + mock_c()->returnUnsignedLongLongIntValueOrDefault(1ULL); +#endif mock_c()->returnStringValueOrDefault(""); mock_c()->returnDoubleValueOrDefault(0.01); mock_c()->returnPointerValueOrDefault(0); From 684d528b5180aac29838ac0d3d4923f339e7c134 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Thu, 9 Aug 2018 23:25:58 -0700 Subject: [PATCH 0179/1093] return 0 for the actual call traces Signed-off-by: Jacob Keller --- src/CppUTestExt/MockActualCall.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 1730c60d1..cd7a1d9e9 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -853,7 +853,7 @@ unsigned long int MockActualCallTrace::returnUnsignedLongIntValueOrDefault(unsig long int MockActualCallTrace::returnLongIntValueOrDefault(long int) { - return returnLongIntValue(); + return 0; } #ifdef CPPUTEST_USE_LONG_LONG @@ -875,7 +875,7 @@ cpputest_ulonglong MockActualCallTrace::returnUnsignedLongLongIntValueOrDefault( cpputest_longlong MockActualCallTrace::returnLongLongIntValueOrDefault(cpputest_longlong) { - return returnLongLongIntValue(); + return 0; } #else From 0faa1268bfd975ead4ffb6f6a273b0f156360b6a Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Thu, 9 Aug 2018 23:26:50 -0700 Subject: [PATCH 0180/1093] consistently typecast when converting sign of a value Use long long int, instead of long int, and type cast only when we are converting from a signed to an unsigned type, or vice versa. Signed-off-by: Jacob Keller --- src/CppUTestExt/MockNamedValue.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index cdf1be0a6..f8da4e95a 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -241,9 +241,9 @@ cpputest_longlong MockNamedValue::getLongLongIntValue() const if(type_ == "int") return value_.intValue_; else if(type_ == "unsigned int") - return (long int)value_.unsignedIntValue_; + return (long long int)value_.unsignedIntValue_; else if(type_ == "long int") - return (long long int)value_.longIntValue_; + return value_.longIntValue_; else if(type_ == "unsigned long int") return (long long int)value_.unsignedLongIntValue_; else From 2ee5bda4d7bd388c7c9b99b5cde9491ca6f4c89d Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Thu, 9 Aug 2018 23:28:03 -0700 Subject: [PATCH 0181/1093] use a consistent order for the comparisons of other integer types Signed-off-by: Jacob Keller --- src/CppUTestExt/MockNamedValue.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index f8da4e95a..908fd6bf6 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -259,10 +259,10 @@ cpputest_ulonglong MockNamedValue::getUnsignedLongLongIntValue() const return value_.unsignedIntValue_; else if(type_ == "int" && value_.intValue_ >= 0) return (unsigned long long int)value_.intValue_; - else if(type_ == "unsigned long int") - return value_.unsignedLongIntValue_; else if(type_ == "long int" && value_.longIntValue_ >= 0) return (unsigned long long int)value_.longIntValue_; + else if(type_ == "unsigned long int") + return value_.unsignedLongIntValue_; else if(type_ == "long long int" && value_.longLongIntValue_ >= 0) return (unsigned long long int)value_.longLongIntValue_; else From 0cedfc247dcc5d7c97f06aa7a6832e1f8a145a75 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Thu, 9 Aug 2018 23:45:37 -0700 Subject: [PATCH 0182/1093] use correct accessor when returning long long int value Otherwise we will inadvertently return a potentially smaller sized value, resulting in incorrect return values. This fixes tests on various 32 bit platforms. Signed-off-by: Jacob Keller --- src/CppUTestExt/MockNamedValue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 908fd6bf6..71395d7c9 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -249,7 +249,7 @@ cpputest_longlong MockNamedValue::getLongLongIntValue() const else { STRCMP_EQUAL("long long int", type_.asCharString()); - return value_.longIntValue_; + return value_.longLongIntValue_; } } From 33ac61df468421dca2ce38e579acf93b358f04e2 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Fri, 10 Aug 2018 08:50:00 -0700 Subject: [PATCH 0183/1093] use correct longInt accessor in equality test We incorrectly accessed the longLongIntValue_ section of the union when comparing a lont int and an unsigned long long int. This resulted in incorrect behavior on some 32bit platforms. This is likely due to the union not being zero initialized. Fix this by using the correct accessor, longIntValue_. Signed-off-by: Jacob Keller --- src/CppUTestExt/MockNamedValue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 71395d7c9..fd0638bfd 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -407,7 +407,7 @@ bool MockNamedValue::equals(const MockNamedValue& p) const else if ((type_ == "unsigned long long int") && (p.type_ == "long int")) return (p.value_.longIntValue_ >= 0) && (value_.unsignedLongLongIntValue_ == (unsigned long long)p.value_.longIntValue_); else if ((type_ == "long int") && (p.type_ == "unsigned long long int")) - return (value_.longIntValue_ >= 0) && ((unsigned long long)value_.longLongIntValue_ == p.value_.unsignedLongLongIntValue_); + return (value_.longIntValue_ >= 0) && ((unsigned long long)value_.longIntValue_ == p.value_.unsignedLongLongIntValue_); else if ((type_ == "unsigned long long int") && (p.type_ == "unsigned long int")) return value_.unsignedLongLongIntValue_ == p.value_.unsignedLongIntValue_; else if ((type_ == "unsigned long int") && (p.type_ == "unsigned long long int")) From cfe36d6ddb028facfee4ec5c347988a22e89abc6 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Sat, 11 Aug 2018 12:01:44 -0700 Subject: [PATCH 0184/1093] remove unnecessary header It was originally added due to thinking we needed it for ULLONG_MAX definitions. Technically, we probably *do* need it, but it likely gets included through some other file. Signed-off-by: Jacob Keller --- tests/CppUTestExt/MockReturnValueTest.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/CppUTestExt/MockReturnValueTest.cpp b/tests/CppUTestExt/MockReturnValueTest.cpp index 911bc6921..e4391075e 100644 --- a/tests/CppUTestExt/MockReturnValueTest.cpp +++ b/tests/CppUTestExt/MockReturnValueTest.cpp @@ -27,7 +27,6 @@ #include "CppUTest/TestHarness.h" #include "MockFailureReporterForTest.h" -#include TEST_GROUP(MockReturnValueTest) { From 117076891baacef0d5412bf2840a3a6233605ced Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Sat, 11 Aug 2018 12:07:03 -0700 Subject: [PATCH 0185/1093] fix incorrect #ifdef for CPPUTEST_USE_LONG_LONG Signed-off-by: Jacob Keller --- tests/CppUTestExt/MockParameterTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 55e0ca3e3..cca89b0db 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -62,7 +62,7 @@ TEST(MockParameterTest, expectOneIntegerParameterAndValue) mock().checkExpectations(); } -#ifdef CPPUTEST_USE_LONGLONG +#ifdef CPPUTEST_USE_LONG_LONG TEST(MockParameterTest, expectOneUnsignedLongLongIntegerParameterAndValue) { From 233f864ca7716ef3f775560f0b02c0beb8ecbbbf Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Sat, 11 Aug 2018 12:08:25 -0700 Subject: [PATCH 0186/1093] move related MockParameterTests together Combined all of the mismatched long long and other type tests into one block. This reduces the number of checks for CPPUTEST_USE_LONG_LONG, and hopefully makes the code easier to read. I chose not to move the expectOne*ParameterAndValue tests, because these are not related to the mismatched type tests, and I wanted to keep similar tests together. Moving them would make the test layout a bit more confusing. Signed-off-by: Jacob Keller --- tests/CppUTestExt/MockParameterTest.cpp | 86 ++++++++++--------------- 1 file changed, 35 insertions(+), 51 deletions(-) diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index cca89b0db..39f08ff95 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -96,21 +96,6 @@ TEST(MockParameterTest, mismatchedIntegerTypesIntAndLongAreAllowed) mock().checkExpectations(); } -#ifdef CPPUTEST_USE_LONG_LONG - -TEST(MockParameterTest, mismatchedIntegerTypesIntAndLongLongAreAllowed) -{ - mock().expectOneCall("foo").withParameter("parameter", (int)1); - mock().actualCall("foo").withParameter("parameter", (long long)1); - - mock().expectOneCall("foo").withParameter("parameter", (long long)1); - mock().actualCall("foo").withParameter("parameter", (int)1); - - mock().checkExpectations(); -} - -#endif - TEST(MockParameterTest, mismatchedIntegerTypesIntAndUnsignedAreAllowed) { mock().expectOneCall("foo").withParameter("parameter", (int)1); @@ -133,60 +118,74 @@ TEST(MockParameterTest, mismatchedIntegerTypesIntAndUnsignedLongAreAllowed) mock().checkExpectations(); } -#ifdef CPPUTEST_USE_LONG_LONG - -TEST(MockParameterTest, mismatchedIntegerTypesIntAndUnsignedLongLongAreAllowed) +TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndLongAreAllowed) { - mock().expectOneCall("foo").withParameter("parameter", (int)1); - mock().actualCall("foo").withParameter("parameter", (unsigned long long)1); + mock().expectOneCall("foo").withParameter("parameter", (unsigned)1); + mock().actualCall("foo").withParameter("parameter", (long)1); - mock().expectOneCall("foo").withParameter("parameter", (unsigned long long)1); - mock().actualCall("foo").withParameter("parameter", (int)1); + mock().expectOneCall("foo").withParameter("parameter", (long)1); + mock().actualCall("foo").withParameter("parameter", (unsigned)1); mock().checkExpectations(); } -#endif - -TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndLongAreAllowed) +TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndUnsignedLongAreAllowed) { mock().expectOneCall("foo").withParameter("parameter", (unsigned)1); - mock().actualCall("foo").withParameter("parameter", (long)1); + mock().actualCall("foo").withParameter("parameter", (unsigned long)1); - mock().expectOneCall("foo").withParameter("parameter", (long)1); + mock().expectOneCall("foo").withParameter("parameter", (unsigned long)1); mock().actualCall("foo").withParameter("parameter", (unsigned)1); mock().checkExpectations(); } +TEST(MockParameterTest, mismatchedIntegerTypesLongAndUnsignedLongAreAllowed) +{ + mock().expectOneCall("foo").withParameter("parameter", (long)1); + mock().actualCall("foo").withParameter("parameter", (unsigned long)1); + + mock().expectOneCall("foo").withParameter("parameter", (unsigned long)1); + mock().actualCall("foo").withParameter("parameter", (long)1); + + mock().checkExpectations(); +} + #ifdef CPPUTEST_USE_LONG_LONG -TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndLongLongAreAllowed) +TEST(MockParameterTest, mismatchedIntegerTypesIntAndLongLongAreAllowed) { - mock().expectOneCall("foo").withParameter("parameter", (unsigned)1); + mock().expectOneCall("foo").withParameter("parameter", (int)1); mock().actualCall("foo").withParameter("parameter", (long long)1); mock().expectOneCall("foo").withParameter("parameter", (long long)1); - mock().actualCall("foo").withParameter("parameter", (unsigned)1); + mock().actualCall("foo").withParameter("parameter", (int)1); mock().checkExpectations(); } -#endif +TEST(MockParameterTest, mismatchedIntegerTypesIntAndUnsignedLongLongAreAllowed) +{ + mock().expectOneCall("foo").withParameter("parameter", (int)1); + mock().actualCall("foo").withParameter("parameter", (unsigned long long)1); -TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndUnsignedLongAreAllowed) + mock().expectOneCall("foo").withParameter("parameter", (unsigned long long)1); + mock().actualCall("foo").withParameter("parameter", (int)1); + + mock().checkExpectations(); +} + +TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndLongLongAreAllowed) { mock().expectOneCall("foo").withParameter("parameter", (unsigned)1); - mock().actualCall("foo").withParameter("parameter", (unsigned long)1); + mock().actualCall("foo").withParameter("parameter", (long long)1); - mock().expectOneCall("foo").withParameter("parameter", (unsigned long)1); + mock().expectOneCall("foo").withParameter("parameter", (long long)1); mock().actualCall("foo").withParameter("parameter", (unsigned)1); mock().checkExpectations(); } -#ifdef CPPUTEST_USE_LONG_LONG - TEST(MockParameterTest, mismatchedIntegerTypesUnsignedAndUnsignedLongLongAreAllowed) { mock().expectOneCall("foo").withParameter("parameter", (unsigned)1); @@ -220,21 +219,6 @@ TEST(MockParameterTest, mismatchedIntegerTypesLongAndLongLongAreAllowed) mock().checkExpectations(); } -#endif - -TEST(MockParameterTest, mismatchedIntegerTypesLongAndUnsignedLongAreAllowed) -{ - mock().expectOneCall("foo").withParameter("parameter", (long)1); - mock().actualCall("foo").withParameter("parameter", (unsigned long)1); - - mock().expectOneCall("foo").withParameter("parameter", (unsigned long)1); - mock().actualCall("foo").withParameter("parameter", (long)1); - - mock().checkExpectations(); -} - -#ifdef CPPUTEST_USE_LONG_LONG - TEST(MockParameterTest, mismatchedIntegerTypesLongAndUnsignedLongLongAreAllowed) { mock().expectOneCall("foo").withParameter("parameter", (long)1); From ffcef543621cc5c984dd0d8aa378b21b9bfc41a8 Mon Sep 17 00:00:00 2001 From: Diego Benavides Date: Tue, 21 Aug 2018 23:10:00 -0600 Subject: [PATCH 0187/1093] Use CPPUTEST_HOME env variable for eclipse project include path --- scripts/templates/ProjectTemplate/Project.cproject | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/templates/ProjectTemplate/Project.cproject b/scripts/templates/ProjectTemplate/Project.cproject index df56e1665..a3fb56605 100644 --- a/scripts/templates/ProjectTemplate/Project.cproject +++ b/scripts/templates/ProjectTemplate/Project.cproject @@ -30,6 +30,7 @@ @@ -37,12 +38,14 @@ From 15efd32bbca500c73ee106f55ee2809bb02b6372 Mon Sep 17 00:00:00 2001 From: Chen Lijun Date: Thu, 6 Sep 2018 10:22:17 +0200 Subject: [PATCH 0188/1093] Fix: avoid using std::nullptr_t with ARM C++11 compiler --- include/CppUTest/SimpleString.h | 6 +++++- src/CppUTest/SimpleString.cpp | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 60ced9b2e..bfe8b7b44 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -174,7 +174,11 @@ SimpleString BracketsFormattedHexStringFrom(cpputest_ulonglong value); SimpleString BracketsFormattedHexStringFrom(signed char value); SimpleString BracketsFormattedHexString(SimpleString hexString); -#if __cplusplus > 199711L +/* + * ARM compiler has only partial support for C++11. + * Specifically std::nullptr_t is not officially supported + */ +#if __cplusplus > 199711L && !defined __arm__ SimpleString StringFrom(const std::nullptr_t value); #endif diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 96006dba8..93ce72bae 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -540,7 +540,11 @@ SimpleString BracketsFormattedHexString(SimpleString hexString) return SimpleString("(0x") + hexString + ")" ; } -#if __cplusplus > 199711L +/* + * ARM compiler has only partial support for C++11. + * Specifically std::nullptr_t is not officially supported + */ +#if __cplusplus > 199711L && !defined __arm__ SimpleString StringFrom(const std::nullptr_t __attribute__((unused)) value) { return "(null)"; From 754b494746ec8e52953d9ab0d5852b1aae8e02a5 Mon Sep 17 00:00:00 2001 From: Florian Freund Date: Tue, 11 Sep 2018 17:24:35 +0200 Subject: [PATCH 0189/1093] Add _TEXT assertions to C-Interface --- include/CppUTest/TestHarness_c.h | 106 +++++++--- src/CppUTest/TestHarness_c.cpp | 60 +++--- tests/CppUTest/TestHarness_cTest.cpp | 287 ++++++++++++++++++++++++++- 3 files changed, 391 insertions(+), 62 deletions(-) diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 4b0fdf8d7..730eae912 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -37,46 +37,88 @@ #include "CppUTestConfig.h" #define CHECK_EQUAL_C_BOOL(expected,actual) \ - CHECK_EQUAL_C_BOOL_LOCATION(expected,actual,__FILE__,__LINE__) + CHECK_EQUAL_C_BOOL_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_BOOL_TEXT(expected,actual,text) \ + CHECK_EQUAL_C_BOOL_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_INT(expected,actual) \ - CHECK_EQUAL_C_INT_LOCATION(expected,actual,__FILE__,__LINE__) + CHECK_EQUAL_C_INT_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_INT_TEXT(expected,actual,text) \ + CHECK_EQUAL_C_INT_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_UINT(expected,actual) \ - CHECK_EQUAL_C_UINT_LOCATION(expected,actual,__FILE__,__LINE__) + CHECK_EQUAL_C_UINT_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_UINT_TEXT(expected,actual,text) \ + CHECK_EQUAL_C_UINT_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_LONG(expected,actual) \ - CHECK_EQUAL_C_LONG_LOCATION(expected,actual,__FILE__,__LINE__) + CHECK_EQUAL_C_LONG_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_LONG_TEXT(expected,actual,text) \ + CHECK_EQUAL_C_LONG_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_ULONG(expected,actual) \ - CHECK_EQUAL_C_ULONG_LOCATION(expected,actual,__FILE__,__LINE__) + CHECK_EQUAL_C_ULONG_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_ULONG_TEXT(expected,actual,text) \ + CHECK_EQUAL_C_ULONG_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_LONGLONG(expected,actual) \ - CHECK_EQUAL_C_LONGLONG_LOCATION(expected,actual,__FILE__,__LINE__) + CHECK_EQUAL_C_LONGLONG_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_LONGLONG_TEXT(expected,actual,text) \ + CHECK_EQUAL_C_LONGLONG_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_ULONGLONG(expected,actual) \ - CHECK_EQUAL_C_ULONGLONG_LOCATION(expected,actual,__FILE__,__LINE__) + CHECK_EQUAL_C_ULONGLONG_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_ULONGLONG_TEXT(expected,actual,text) \ + CHECK_EQUAL_C_ULONGLONG_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_REAL(expected,actual,threshold) \ - CHECK_EQUAL_C_REAL_LOCATION(expected,actual,threshold,__FILE__,__LINE__) + CHECK_EQUAL_C_REAL_LOCATION(expected,actual,threshold,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_REAL_TEXT(expected,actual,threshold,text) \ + CHECK_EQUAL_C_REAL_LOCATION(expected,actual,threshold,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_CHAR(expected,actual) \ - CHECK_EQUAL_C_CHAR_LOCATION(expected,actual,__FILE__,__LINE__) + CHECK_EQUAL_C_CHAR_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_CHAR_TEXT(expected,actual,text) \ + CHECK_EQUAL_C_CHAR_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_UBYTE(expected,actual) \ - CHECK_EQUAL_C_UBYTE_LOCATION(expected,actual,__FILE__,__LINE__) + CHECK_EQUAL_C_UBYTE_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_UBYTE_TEXT(expected,actual,text) \ + CHECK_EQUAL_C_UBYTE_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_SBYTE(expected,actual) \ - CHECK_EQUAL_C_SBYTE_LOCATION(expected,actual,__FILE__,__LINE__) + CHECK_EQUAL_C_SBYTE_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_SBYTE_TEXT(expected,actual,text) \ + CHECK_EQUAL_C_SBYTE_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_STRING(expected,actual) \ - CHECK_EQUAL_C_STRING_LOCATION(expected,actual,__FILE__,__LINE__) + CHECK_EQUAL_C_STRING_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_STRING_TEXT(expected,actual,text) \ + CHECK_EQUAL_C_STRING_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_POINTER(expected,actual) \ - CHECK_EQUAL_C_POINTER_LOCATION(expected,actual,__FILE__,__LINE__) + CHECK_EQUAL_C_POINTER_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_POINTER_TEXT(expected,actual,text) \ + CHECK_EQUAL_C_POINTER_LOCATION(expected,actual,text,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_BITS(expected, actual, mask) \ + CHECK_EQUAL_C_BITS_LOCATION(expected, actual, mask, sizeof(actual), NULL, __FILE__, __LINE__) -#define CHECK_EQUAL_C_BITS(expected, actual, mask)\ - CHECK_EQUAL_C_BITS_LOCATION(expected, actual, mask, sizeof(actual), __FILE__, __LINE__) +#define CHECK_EQUAL_C_BITS_TEXT(expected, actual, mask, text) \ + CHECK_EQUAL_C_BITS_LOCATION(expected, actual, mask, sizeof(actual), text, __FILE__, __LINE__) #define FAIL_TEXT_C(text) \ FAIL_TEXT_C_LOCATION(text,__FILE__,__LINE__) @@ -85,8 +127,10 @@ FAIL_C_LOCATION(__FILE__,__LINE__) #define CHECK_C(condition) \ - CHECK_C_LOCATION(condition, #condition, __FILE__,__LINE__) + CHECK_C_LOCATION(condition, #condition, NULL, __FILE__,__LINE__) +#define CHECK_C_TEXT(condition, text) \ + CHECK_C_LOCATION(condition, #condition, text, __FILE__, __LINE__) /****************************************************************************** * @@ -149,38 +193,38 @@ extern "C" /* CHECKS that can be used from C code */ extern void CHECK_EQUAL_C_BOOL_LOCATION(int expected, int actual, - const char* fileName, int lineNumber); + const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_INT_LOCATION(int expected, int actual, - const char* fileName, int lineNumber); + const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_UINT_LOCATION(unsigned int expected, unsigned int actual, - const char* fileName, int lineNumber); + const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_LONG_LOCATION(long expected, long actual, - const char* fileName, int lineNumber); + const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_ULONG_LOCATION(unsigned long expected, unsigned long actual, - const char* fileName, int lineNumber); + const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_LONGLONG_LOCATION(cpputest_longlong expected, cpputest_longlong actual, - const char* fileName, int lineNumber); + const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_ULONGLONG_LOCATION(cpputest_ulonglong expected, cpputest_ulonglong actual, - const char* fileName, int lineNumber); + const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_REAL_LOCATION(double expected, double actual, - double threshold, const char* fileName, int lineNumber); + double threshold, const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_CHAR_LOCATION(char expected, char actual, - const char* fileName, int lineNumber); + const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_UBYTE_LOCATION(unsigned char expected, unsigned char actual, - const char* fileName, int lineNumber); + const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_SBYTE_LOCATION(signed char expected, signed char actual, - const char* fileName, int lineNumber); + const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_STRING_LOCATION(const char* expected, - const char* actual, const char* fileName, int lineNumber); + const char* actual, const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, - const void* actual, const char* fileName, int lineNumber); + const void* actual, const char* text, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_BITS_LOCATION(unsigned int expected, unsigned int actual, - unsigned int mask, size_t size, const char* fileName, int lineNumber); + unsigned int mask, size_t size, const char* text, const char* fileName, int lineNumber); extern void FAIL_TEXT_C_LOCATION(const char* text, const char* fileName, int lineNumber); extern void FAIL_C_LOCATION(const char* fileName, int lineNumber); extern void CHECK_C_LOCATION(int condition, const char* conditionString, - const char* fileName, int lineNumber); + const char* text, const char* fileName, int lineNumber); extern void* cpputest_malloc(size_t size); extern char* cpputest_strdup(const char* str); diff --git a/src/CppUTest/TestHarness_c.cpp b/src/CppUTest/TestHarness_c.cpp index 6d7b04210..1d8c39858 100644 --- a/src/CppUTest/TestHarness_c.cpp +++ b/src/CppUTest/TestHarness_c.cpp @@ -34,74 +34,74 @@ extern "C" { -void CHECK_EQUAL_C_BOOL_LOCATION(int expected, int actual, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_BOOL_LOCATION(int expected, int actual, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertEquals(!!expected != !!actual, expected ? "true" : "false", actual ? "true" : "false", NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertEquals(!!expected != !!actual, expected ? "true" : "false", actual ? "true" : "false", text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_INT_LOCATION(int expected, int actual, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_INT_LOCATION(int expected, int actual, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertLongsEqual((long)expected, (long)actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertLongsEqual((long)expected, (long)actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_UINT_LOCATION(unsigned int expected, unsigned int actual, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_UINT_LOCATION(unsigned int expected, unsigned int actual, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_LONG_LOCATION(long expected, long actual, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_LONG_LOCATION(long expected, long actual, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertLongsEqual(expected, actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertLongsEqual(expected, actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_ULONG_LOCATION(unsigned long expected, unsigned long actual, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_ULONG_LOCATION(unsigned long expected, unsigned long actual, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertUnsignedLongsEqual(expected, actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertUnsignedLongsEqual(expected, actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_LONGLONG_LOCATION(cpputest_longlong expected, cpputest_longlong actual, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_LONGLONG_LOCATION(cpputest_longlong expected, cpputest_longlong actual, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertLongLongsEqual(expected, actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertLongLongsEqual(expected, actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_ULONGLONG_LOCATION(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_ULONGLONG_LOCATION(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertUnsignedLongLongsEqual(expected, actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertUnsignedLongLongsEqual(expected, actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_REAL_LOCATION(double expected, double actual, double threshold, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_REAL_LOCATION(double expected, double actual, double threshold, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertDoublesEqual(expected, actual, threshold, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertDoublesEqual(expected, actual, threshold, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_CHAR_LOCATION(char expected, char actual, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_CHAR_LOCATION(char expected, char actual, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertEquals(((expected) != (actual)), StringFrom(expected).asCharString(), StringFrom(actual).asCharString(), NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertEquals(((expected) != (actual)), StringFrom(expected).asCharString(), StringFrom(actual).asCharString(), text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -extern void CHECK_EQUAL_C_UBYTE_LOCATION(unsigned char expected, unsigned char actual, const char* fileName, int lineNumber)\ +extern void CHECK_EQUAL_C_UBYTE_LOCATION(unsigned char expected, unsigned char actual, const char* text, const char* fileName, int lineNumber)\ { - UtestShell::getCurrent()->assertEquals(((expected) != (actual)),StringFrom((int)expected).asCharString(), StringFrom((int) actual).asCharString(), NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertEquals(((expected) != (actual)),StringFrom((int)expected).asCharString(), StringFrom((int) actual).asCharString(), text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_SBYTE_LOCATION(char signed expected, signed char actual, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_SBYTE_LOCATION(char signed expected, signed char actual, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertEquals(((expected) != (actual)),StringFrom((int)expected).asCharString(), StringFrom((int) actual).asCharString(), NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertEquals(((expected) != (actual)),StringFrom((int)expected).asCharString(), StringFrom((int) actual).asCharString(), text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_STRING_LOCATION(const char* expected, const char* actual, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_STRING_LOCATION(const char* expected, const char* actual, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertCstrEqual(expected, actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertCstrEqual(expected, actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, const void* actual, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, const void* actual, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertPointersEqual(expected, actual, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertPointersEqual(expected, actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -extern void CHECK_EQUAL_C_BITS_LOCATION(unsigned int expected, unsigned int actual, unsigned int mask, size_t size, const char* fileName, int lineNumber) +extern void CHECK_EQUAL_C_BITS_LOCATION(unsigned int expected, unsigned int actual, unsigned int mask, size_t size, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertBitsEqual(expected, actual, mask, size, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertBitsEqual(expected, actual, mask, size, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } void FAIL_TEXT_C_LOCATION(const char* text, const char* fileName, int lineNumber) @@ -114,9 +114,9 @@ void FAIL_C_LOCATION(const char* fileName, int lineNumber) UtestShell::getCurrent()->fail("", fileName, lineNumber, TestTerminatorWithoutExceptions()); } // LCOV_EXCL_LINE -void CHECK_C_LOCATION(int condition, const char* conditionString, const char* fileName, int lineNumber) +void CHECK_C_LOCATION(int condition, const char* conditionString, const char* text, const char* fileName, int lineNumber) { - UtestShell::getCurrent()->assertTrue(condition != 0, "CHECK_C", conditionString, NULLPTR, fileName, lineNumber, TestTerminatorWithoutExceptions()); + UtestShell::getCurrent()->assertTrue(condition != 0, "CHECK_C", conditionString, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } enum { NO_COUNTDOWN = -1, OUT_OF_MEMORRY = 0 }; diff --git a/tests/CppUTest/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp index 913df1cb0..2a5e744a8 100644 --- a/tests/CppUTest/TestHarness_cTest.cpp +++ b/tests/CppUTest/TestHarness_cTest.cpp @@ -101,6 +101,24 @@ TEST(TestHarness_c, checkBool) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failBoolTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_BOOL_TEXT(1, 0, "BoolTestText"); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkBoolText) +{ + CHECK_EQUAL_C_BOOL_TEXT(1, 1, "Text"); + CHECK_EQUAL_C_BOOL_TEXT(1, 2, "Text"); + fixture->setTestFunction(_failBoolTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected \n but was "); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: BoolTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failIntMethod() { HasTheDestructorBeenCalledChecker checker; @@ -117,6 +135,23 @@ TEST(TestHarness_c, checkInt) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failIntTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_INT_TEXT(1, 2, "IntTestText"); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkIntText) +{ + CHECK_EQUAL_C_INT_TEXT(2, 2, "Text"); + fixture->setTestFunction(_failIntTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: IntTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failUnsignedIntMethod() { HasTheDestructorBeenCalledChecker checker; @@ -133,6 +168,23 @@ TEST(TestHarness_c, checkUnsignedInt) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failUnsignedIntTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_UINT_TEXT(1, 2, "UnsignedIntTestText"); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkUnsignedIntText) +{ + CHECK_EQUAL_C_UINT_TEXT(2, 2, "Text"); + fixture->setTestFunction(_failUnsignedIntTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: UnsignedIntTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failLongIntMethod() { HasTheDestructorBeenCalledChecker checker; @@ -149,6 +201,23 @@ TEST(TestHarness_c, checkLongInt) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failLongIntTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_LONG_TEXT(1, 2, "LongIntTestText"); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkLongIntText) +{ + CHECK_EQUAL_C_LONG_TEXT(2, 2, "Text"); + fixture->setTestFunction(_failLongIntTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: LongIntTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failUnsignedLongIntMethod() { HasTheDestructorBeenCalledChecker checker; @@ -165,6 +234,23 @@ TEST(TestHarness_c, checkUnsignedLongInt) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failUnsignedLongIntTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_ULONG_TEXT(1, 2, "UnsignedLongIntTestText"); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkUnsignedLongIntText) +{ + CHECK_EQUAL_C_ULONG_TEXT(2, 2, "Text"); + fixture->setTestFunction(_failUnsignedLongIntTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: UnsignedLongIntTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + #ifdef CPPUTEST_USE_LONG_LONG static void _failLongLongIntMethod() @@ -183,6 +269,23 @@ TEST(TestHarness_c, checkLongLongInt) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failLongLongIntTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_LONGLONG_TEXT(1, 2, "LongLongTestText"); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkLongLongIntText) +{ + CHECK_EQUAL_C_LONGLONG_TEXT(2, 2, "Text"); + fixture->setTestFunction(_failLongLongIntTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: LongLongTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failUnsignedLongLongIntMethod() { HasTheDestructorBeenCalledChecker checker; @@ -199,6 +302,23 @@ TEST(TestHarness_c, checkUnsignedLongLongInt) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failUnsignedLongLongIntTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_ULONGLONG_TEXT(1, 2, "UnsignedLongLongTestText"); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkUnsignedLongLongIntText) +{ + CHECK_EQUAL_C_ULONGLONG_TEXT(2, 2, "Text"); + fixture->setTestFunction(_failUnsignedLongLongIntTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: UnsignedLongLongTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + #else static void _failLongLongIntMethod() @@ -215,6 +335,20 @@ TEST(TestHarness_c, checkLongLongInt) fixture->assertPrintContains("arness_c"); } +static void _failLongLongIntTextMethod() +{ + cpputest_longlong dummy_longlong; + CHECK_EQUAL_C_LONGLONG_TEXT(dummy_longlong, dummy_longlong); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkLongLongIntText) +{ + fixture->setTestFunction(_failLongLongIntTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("is not supported"); + fixture->assertPrintContains("arness_c"); +} + static void _failUnsignedLongLongIntMethod() { cpputest_ulonglong dummy_ulonglong; @@ -229,6 +363,20 @@ TEST(TestHarness_c, checkUnsignedLongLongInt) fixture->assertPrintContains("arness_c"); } +static void _failUnsignedLongLongIntTextMethod() +{ + cpputest_ulonglong dummy_ulonglong; + CHECK_EQUAL_C_ULONGLONG_TEXT(dummy_ulonglong, dummy_ulonglong); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkUnsignedLongLongIntText) +{ + fixture->setTestFunction(_failUnsignedLongLongIntTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("is not supported"); + fixture->assertPrintContains("arness_c"); +} + #endif static void _failRealMethod() @@ -247,6 +395,23 @@ TEST(TestHarness_c, checkReal) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failRealTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_REAL_TEXT(1.0, 2.0, 0.5, "RealTestText"); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkRealText) +{ + CHECK_EQUAL_C_REAL_TEXT(1.0, 1.1, 0.5, "Text"); + fixture->setTestFunction(_failRealTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <1>\n but was <2>"); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: RealTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failCharMethod() { HasTheDestructorBeenCalledChecker checker; @@ -263,6 +428,23 @@ TEST(TestHarness_c, checkChar) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failCharTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_CHAR_TEXT('a', 'c', "CharTestText"); +} + +TEST(TestHarness_c, checkCharText) +{ + CHECK_EQUAL_C_CHAR_TEXT('a', 'a', "Text"); + fixture->setTestFunction(_failCharTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected \n but was "); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: CharTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failUnsignedByteMethod() { HasTheDestructorBeenCalledChecker checker; @@ -279,6 +461,23 @@ TEST(TestHarness_c, checkUnsignedByte) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failUnsignedByteTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_UBYTE_TEXT(254, 253, "UnsignedByteTestText"); +} + +TEST(TestHarness_c, checkUnsignedByteText) +{ + CHECK_EQUAL_C_UBYTE_TEXT(254, 254, "Text"); + fixture->setTestFunction(_failUnsignedByteTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <254>\n but was <253>"); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: UnsignedByteTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failSignedByteMethod() { HasTheDestructorBeenCalledChecker checker; @@ -295,6 +494,23 @@ TEST(TestHarness_c, checkSignedByte) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failSignedByteTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_SBYTE_TEXT(-3, -5, "SignedByteTestText"); +} + +TEST(TestHarness_c, checkSignedByteText) +{ + CHECK_EQUAL_C_SBYTE_TEXT(-3, -3, "Text"); + fixture->setTestFunction(_failSignedByteTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <-3>\n but was <-5>"); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: SignedByteTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failStringMethod() { HasTheDestructorBeenCalledChecker checker; @@ -313,6 +529,25 @@ TEST(TestHarness_c, checkString) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failStringTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_STRING_TEXT("Hello", "Hello World", "StringTestText"); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkStringText) +{ + CHECK_EQUAL_C_STRING_TEXT("Hello", "Hello", "Text"); + fixture->setTestFunction(_failStringTextMethod); + fixture->runAllTests(); + + StringEqualFailure failure(UtestShell::getCurrent(), "file", 1, "Hello", "Hello World", ""); + fixture->assertPrintContains(failure.getMessage()); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: StringTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failPointerMethod() { HasTheDestructorBeenCalledChecker checker; @@ -329,6 +564,23 @@ TEST(TestHarness_c, checkPointer) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failPointerTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_POINTER_TEXT(NULLPTR, (void *)0x1, "PointerTestText"); +} + +TEST(TestHarness_c, checkPointerText) +{ + CHECK_EQUAL_C_POINTER_TEXT(NULLPTR, NULLPTR, "Text"); + fixture->setTestFunction(_failPointerTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <0x0>\n but was <0x1>"); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: PointerTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failBitsMethod() { HasTheDestructorBeenCalledChecker checker; @@ -337,7 +589,7 @@ static void _failBitsMethod() TEST(TestHarness_c, checkBits) { - CHECK_EQUAL_C_POINTER(NULLPTR, NULLPTR); + CHECK_EQUAL_C_BITS(0xABCD, (unsigned short)0xABCD, 0xFFFF); fixture->setTestFunction(_failBitsMethod); fixture->runAllTests(); fixture->assertPrintContains("expected <00000000 00000001>\n\tbut was <00000000 00000011>"); @@ -345,6 +597,23 @@ TEST(TestHarness_c, checkBits) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failBitsTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_BITS_TEXT(0x0001, (unsigned short)0x0003, 0xFFFF, "BitsTestText"); +} + +TEST(TestHarness_c, checkBitsText) +{ + CHECK_EQUAL_C_BITS_TEXT(0xABCD, (unsigned short)0xABCD, 0xFFFF, "Text"); + fixture->setTestFunction(_failBitsTextMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <00000000 00000001>\n\tbut was <00000000 00000011>"); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: BitsTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failTextMethod() { HasTheDestructorBeenCalledChecker checker; @@ -390,6 +659,22 @@ TEST(TestHarness_c, checkCheck) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _CheckTextMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_C_TEXT(false, "CheckTestText"); +} // LCOV_EXCL_LINE + +TEST(TestHarness_c, checkCheckText) +{ + CHECK_C_TEXT(true, "Text"); + fixture->setTestFunction(_CheckTextMethod); + fixture->runAllTests(); + LONGS_EQUAL(1, fixture->getFailureCount()); + fixture->assertPrintContains("Message: CheckTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + #if CPPUTEST_USE_MEM_LEAK_DETECTION TEST(TestHarness_c, cpputest_malloc_out_of_memory) From b6953fb813bd137964f4b8e59ef3338052dd28e5 Mon Sep 17 00:00:00 2001 From: Florian Freund Date: Wed, 12 Sep 2018 09:19:19 +0200 Subject: [PATCH 0190/1093] Resolve -Wzero-as-null-pointer-constant --- include/CppUTest/TestHarness_c.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 730eae912..1946f6e2e 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -37,85 +37,85 @@ #include "CppUTestConfig.h" #define CHECK_EQUAL_C_BOOL(expected,actual) \ - CHECK_EQUAL_C_BOOL_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_BOOL_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_BOOL_TEXT(expected,actual,text) \ CHECK_EQUAL_C_BOOL_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_INT(expected,actual) \ - CHECK_EQUAL_C_INT_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_INT_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_INT_TEXT(expected,actual,text) \ CHECK_EQUAL_C_INT_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_UINT(expected,actual) \ - CHECK_EQUAL_C_UINT_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_UINT_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_UINT_TEXT(expected,actual,text) \ CHECK_EQUAL_C_UINT_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_LONG(expected,actual) \ - CHECK_EQUAL_C_LONG_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_LONG_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_LONG_TEXT(expected,actual,text) \ CHECK_EQUAL_C_LONG_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_ULONG(expected,actual) \ - CHECK_EQUAL_C_ULONG_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_ULONG_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_ULONG_TEXT(expected,actual,text) \ CHECK_EQUAL_C_ULONG_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_LONGLONG(expected,actual) \ - CHECK_EQUAL_C_LONGLONG_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_LONGLONG_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_LONGLONG_TEXT(expected,actual,text) \ CHECK_EQUAL_C_LONGLONG_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_ULONGLONG(expected,actual) \ - CHECK_EQUAL_C_ULONGLONG_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_ULONGLONG_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_ULONGLONG_TEXT(expected,actual,text) \ CHECK_EQUAL_C_ULONGLONG_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_REAL(expected,actual,threshold) \ - CHECK_EQUAL_C_REAL_LOCATION(expected,actual,threshold,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_REAL_LOCATION(expected,actual,threshold,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_REAL_TEXT(expected,actual,threshold,text) \ CHECK_EQUAL_C_REAL_LOCATION(expected,actual,threshold,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_CHAR(expected,actual) \ - CHECK_EQUAL_C_CHAR_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_CHAR_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_CHAR_TEXT(expected,actual,text) \ CHECK_EQUAL_C_CHAR_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_UBYTE(expected,actual) \ - CHECK_EQUAL_C_UBYTE_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_UBYTE_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_UBYTE_TEXT(expected,actual,text) \ CHECK_EQUAL_C_UBYTE_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_SBYTE(expected,actual) \ - CHECK_EQUAL_C_SBYTE_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_SBYTE_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_SBYTE_TEXT(expected,actual,text) \ CHECK_EQUAL_C_SBYTE_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_STRING(expected,actual) \ - CHECK_EQUAL_C_STRING_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_STRING_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_STRING_TEXT(expected,actual,text) \ CHECK_EQUAL_C_STRING_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_POINTER(expected,actual) \ - CHECK_EQUAL_C_POINTER_LOCATION(expected,actual,NULL,__FILE__,__LINE__) + CHECK_EQUAL_C_POINTER_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) #define CHECK_EQUAL_C_POINTER_TEXT(expected,actual,text) \ CHECK_EQUAL_C_POINTER_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_BITS(expected, actual, mask) \ - CHECK_EQUAL_C_BITS_LOCATION(expected, actual, mask, sizeof(actual), NULL, __FILE__, __LINE__) + CHECK_EQUAL_C_BITS_LOCATION(expected, actual, mask, sizeof(actual), NULLPTR, __FILE__, __LINE__) #define CHECK_EQUAL_C_BITS_TEXT(expected, actual, mask, text) \ CHECK_EQUAL_C_BITS_LOCATION(expected, actual, mask, sizeof(actual), text, __FILE__, __LINE__) From 1825741c5985241ccb783da555c89ce11b1938cb Mon Sep 17 00:00:00 2001 From: Florian Freund Date: Wed, 12 Sep 2018 09:24:58 +0200 Subject: [PATCH 0191/1093] Solve -Wzero-as-null-pointer-constant --- include/CppUTest/TestHarness_c.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 1946f6e2e..3e4029d91 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -127,7 +127,7 @@ FAIL_C_LOCATION(__FILE__,__LINE__) #define CHECK_C(condition) \ - CHECK_C_LOCATION(condition, #condition, NULL, __FILE__,__LINE__) + CHECK_C_LOCATION(condition, #condition, NULLPTR, __FILE__,__LINE__) #define CHECK_C_TEXT(condition, text) \ CHECK_C_LOCATION(condition, #condition, text, __FILE__, __LINE__) From 22fb542f111a7537a2e730ca046df67931ce09ef Mon Sep 17 00:00:00 2001 From: Florian Freund Date: Tue, 18 Sep 2018 09:08:59 +0200 Subject: [PATCH 0192/1093] add OrderedTest C-Interface --- include/CppUTestExt/OrderedTest.h | 6 ++++ tests/CppUTestExt/CMakeLists.txt | 1 + tests/CppUTestExt/OrderedTestTest.cpp | 45 +++++++++++++++++++++++++++ tests/CppUTestExt/OrderedTestTest_c.c | 18 +++++++++++ 4 files changed, 70 insertions(+) create mode 100644 tests/CppUTestExt/OrderedTestTest_c.c diff --git a/include/CppUTestExt/OrderedTest.h b/include/CppUTestExt/OrderedTest.h index cf1933966..08f3560dc 100644 --- a/include/CppUTestExt/OrderedTest.h +++ b/include/CppUTestExt/OrderedTest.h @@ -78,5 +78,11 @@ class OrderedTestInstaller static OrderedTestInstaller TEST_##testGroup##_##testName##_Installer(TEST_##testGroup##_##testName##_Instance, #testGroup, #testName, __FILE__,__LINE__, testLevel); \ void TEST_##testGroup##_##testName##_Test::testBody() +#define TEST_ORDERED_C_WRAPPER(group_name, test_name, testLevel) \ + extern "C" void test_##group_name##_##test_name##_wrapper_c(void); \ + TEST_ORDERED(group_name, test_name, testLevel) { \ + test_##group_name##_##test_name##_wrapper_c(); \ + } + #endif diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 8039a3b52..88837f22a 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -26,6 +26,7 @@ set(CppUTestExtTests_src MockStrictOrderTest.cpp MockReturnValueTest.cpp OrderedTestTest.cpp + OrderedTestTest_c.c ) if (MINGW) diff --git a/tests/CppUTestExt/OrderedTestTest.cpp b/tests/CppUTestExt/OrderedTestTest.cpp index 3a6602121..f28bf9aee 100644 --- a/tests/CppUTestExt/OrderedTestTest.cpp +++ b/tests/CppUTestExt/OrderedTestTest.cpp @@ -198,3 +198,48 @@ TEST_ORDERED(TestOrderedTestMacros, Test3, 3) { CHECK(OrderedTestTestingFixture::count() == 3); } + +// Test with same level +TEST_ORDERED(TestOrderedTestMacros, Test5_1, 5) +{ + CHECK(OrderedTestTestingFixture::count() == 5); +} + +TEST_ORDERED(TestOrderedTestMacros, Test6_1, 6) +{ + CHECK(OrderedTestTestingFixture::count() == 7); +} + +TEST_ORDERED(TestOrderedTestMacros, Test5_2, 5) +{ + CHECK(OrderedTestTestingFixture::count() == 6); +} + +TEST_ORDERED(TestOrderedTestMacros, Test6_2, 6) +{ + CHECK(OrderedTestTestingFixture::count() == 8); +} + +// Test C-Interface +TEST_ORDERED(TestOrderedTestMacros, Test10, 10) +{ + CHECK(OrderedTestTestingFixture::count() == 12); +} + +TEST_ORDERED(TestOrderedTestMacros, Test8, 8) +{ + CHECK(OrderedTestTestingFixture::count() == 10); +} + +// Export to be usable in OrderedTestTest_c.c +extern "C" { +int orderedTestFixtureCWrapper(void) { + return OrderedTestTestingFixture::count(); +} +} + +TEST_ORDERED_C_WRAPPER(TestOrderedTestMacros, Test11, 11) + +TEST_ORDERED_C_WRAPPER(TestOrderedTestMacros, Test7, 7) + +TEST_ORDERED_C_WRAPPER(TestOrderedTestMacros, Test9, 9) diff --git a/tests/CppUTestExt/OrderedTestTest_c.c b/tests/CppUTestExt/OrderedTestTest_c.c new file mode 100644 index 000000000..b2fac384b --- /dev/null +++ b/tests/CppUTestExt/OrderedTestTest_c.c @@ -0,0 +1,18 @@ +#include "CppUTest/TestHarness_c.h" + +int orderedTestFixtureCWrapper(void); + +TEST_C(TestOrderedTestMacros, Test11) +{ + CHECK_C(orderedTestFixtureCWrapper() == 13); +} + +TEST_C(TestOrderedTestMacros, Test7) +{ + CHECK_C(orderedTestFixtureCWrapper() == 9); +} + +TEST_C(TestOrderedTestMacros, Test9) +{ + CHECK_C(orderedTestFixtureCWrapper() == 11); +} From 21eca88a890bd540eb65e25b7e57246a5f3a72de Mon Sep 17 00:00:00 2001 From: Florian Freund Date: Tue, 18 Sep 2018 09:38:00 +0200 Subject: [PATCH 0193/1093] fix compiler issue --- tests/CppUTestExt/CMakeLists.txt | 2 +- tests/CppUTestExt/OrderedTestTest.cpp | 1 + tests/CppUTestExt/OrderedTestTest_c.c | 3 +-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 88837f22a..b83ceb2cf 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -25,8 +25,8 @@ set(CppUTestExtTests_src MockSupport_cTest.cpp MockStrictOrderTest.cpp MockReturnValueTest.cpp - OrderedTestTest.cpp OrderedTestTest_c.c + OrderedTestTest.cpp ) if (MINGW) diff --git a/tests/CppUTestExt/OrderedTestTest.cpp b/tests/CppUTestExt/OrderedTestTest.cpp index f28bf9aee..35971e80f 100644 --- a/tests/CppUTestExt/OrderedTestTest.cpp +++ b/tests/CppUTestExt/OrderedTestTest.cpp @@ -30,6 +30,7 @@ #include "CppUTest/TestRegistry.h" #include "CppUTest/TestTestingFixture.h" #include "CppUTestExt/OrderedTest.h" +#include "OrderedTestTest.h" TEST_GROUP(TestOrderedTest) { diff --git a/tests/CppUTestExt/OrderedTestTest_c.c b/tests/CppUTestExt/OrderedTestTest_c.c index b2fac384b..8158fd89e 100644 --- a/tests/CppUTestExt/OrderedTestTest_c.c +++ b/tests/CppUTestExt/OrderedTestTest_c.c @@ -1,6 +1,5 @@ #include "CppUTest/TestHarness_c.h" - -int orderedTestFixtureCWrapper(void); +#include "OrderedTestTest.h" TEST_C(TestOrderedTestMacros, Test11) { From 1cd894f23de103297e6b1e0db29d37a73ddd45d2 Mon Sep 17 00:00:00 2001 From: Florian Freund Date: Tue, 18 Sep 2018 09:44:51 +0200 Subject: [PATCH 0194/1093] add missing header --- tests/CppUTestExt/OrderedTestTest.h | 42 +++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tests/CppUTestExt/OrderedTestTest.h diff --git a/tests/CppUTestExt/OrderedTestTest.h b/tests/CppUTestExt/OrderedTestTest.h new file mode 100644 index 000000000..088115191 --- /dev/null +++ b/tests/CppUTestExt/OrderedTestTest.h @@ -0,0 +1,42 @@ +/* + * 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 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 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. + */ + +#ifndef ORDEREDTESTTEST_H +#define ORDEREDTESTTEST_H + +#ifdef __cplusplus +extern "C" { +#endif + +extern int orderedTestFixtureCWrapper(void); + +#ifdef __cplusplus +} +#endif + +#endif /* ORDEREDTESTTEST_H */ + From 24b167125e7ba498d22aa121b6dfb2f1031f27f3 Mon Sep 17 00:00:00 2001 From: Florian Freund Date: Tue, 18 Sep 2018 10:10:41 +0200 Subject: [PATCH 0195/1093] add new files to windows compiler configuration --- tests/AllTests.dep | 8 ++++++++ tests/AllTests.dsp | 8 ++++++++ tests/AllTests.mak | 22 ++++++++++++++++++++++ tests/AllTests.vcproj | 27 +++++++++++++++++++++++++++ tests/AllTests.vcxproj | 2 ++ 5 files changed, 67 insertions(+) diff --git a/tests/AllTests.dep b/tests/AllTests.dep index 6ceb6ca45..e6a436ec3 100644 --- a/tests/AllTests.dep +++ b/tests/AllTests.dep @@ -496,6 +496,14 @@ "..\include\platforms\visualcpp\stdint.h"\ +.\CppUTest\OrderedTestTest_c.c : \ + "..\include\CppUTest\CppUTestConfig.h"\ + "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ + "..\include\CppUTest\StandardCLibrary.h"\ + "..\include\CppUTest\TestHarness_c.h"\ + ".\CppUTestExt\OrderedTestTest.h"\ + + .\CppUTest\PluginTest.cpp : \ "..\include\CppUTest\CppUTestConfig.h"\ "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ diff --git a/tests/AllTests.dsp b/tests/AllTests.dsp index 1d18a1405..41994b0a9 100644 --- a/tests/AllTests.dsp +++ b/tests/AllTests.dsp @@ -230,6 +230,14 @@ SOURCE=.\CppUTestExt\OrderedTestTest.cpp # End Source File # Begin Source File +SOURCE=.\CppUTestExt\OrderedTestTest_c.c +# End Source File +# Begin Source File + +SOURCE=.\CppUTestExt\OrderedTestTest.h +# End Source File +# Begin Source File + SOURCE=.\CppUTest\PluginTest.cpp # End Source File # Begin Source File diff --git a/tests/AllTests.mak b/tests/AllTests.mak index b84ade5b1..33f60e52f 100644 --- a/tests/AllTests.mak +++ b/tests/AllTests.mak @@ -78,6 +78,7 @@ CLEAN : -@erase "$(INTDIR)\MockSupport_cTestCFile.obj" -@erase "$(INTDIR)\MockSupportTest.obj" -@erase "$(INTDIR)\OrderedTestTest.obj" + -@erase "$(INTDIR)\OrderedTestTest_c.obj" -@erase "$(INTDIR)\PluginTest.obj" -@erase "$(INTDIR)\PreprocessorTest.obj" -@erase "$(INTDIR)\SetPluginTest.obj" @@ -134,6 +135,7 @@ LINK32_OBJS= \ "$(INTDIR)\MockSupport_cTestCFile.obj" \ "$(INTDIR)\MockSupportTest.obj" \ "$(INTDIR)\OrderedTestTest.obj" \ + "$(INTDIR)\OrderedTestTest_c.obj" \ "$(INTDIR)\PluginTest.obj" \ "$(INTDIR)\PreprocessorTest.obj" \ "$(INTDIR)\SetPluginTest.obj" \ @@ -246,6 +248,8 @@ CLEAN : -@erase "$(INTDIR)\MockSupportTest.sbr" -@erase "$(INTDIR)\OrderedTestTest.obj" -@erase "$(INTDIR)\OrderedTestTest.sbr" + -@erase "$(INTDIR)\OrderedTestTest_c.obj" + -@erase "$(INTDIR)\OrderedTestTest_c.sbr" -@erase "$(INTDIR)\PluginTest.obj" -@erase "$(INTDIR)\PluginTest.sbr" -@erase "$(INTDIR)\PreprocessorTest.obj" @@ -315,6 +319,7 @@ BSC32_SBRS= \ "$(INTDIR)\MockSupport_cTestCFile.sbr" \ "$(INTDIR)\MockSupportTest.sbr" \ "$(INTDIR)\OrderedTestTest.sbr" \ + "$(INTDIR)\OrderedTestTest_c.sbr" \ "$(INTDIR)\PluginTest.sbr" \ "$(INTDIR)\PreprocessorTest.sbr" \ "$(INTDIR)\SetPluginTest.sbr" \ @@ -365,6 +370,7 @@ LINK32_OBJS= \ "$(INTDIR)\MockSupport_cTestCFile.obj" \ "$(INTDIR)\MockSupportTest.obj" \ "$(INTDIR)\OrderedTestTest.obj" \ + "$(INTDIR)\OrderedTestTest_c.obj" \ "$(INTDIR)\PluginTest.obj" \ "$(INTDIR)\PreprocessorTest.obj" \ "$(INTDIR)\SetPluginTest.obj" \ @@ -909,6 +915,22 @@ SOURCE=.\CppUTestExt\OrderedTestTest.cpp $(CPP) $(CPP_PROJ) $(SOURCE) +!ENDIF + +SOURCE=.\CppUTestExt\OrderedTestTest_c.c + +!IF "$(CFG)" == "AllTests - Win32 Release" + + +"$(INTDIR)\OrderedTestTest_c.obj" : $(SOURCE) "$(INTDIR)" + + +!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" + + +"$(INTDIR)\OrderedTestTest_c.obj" "$(INTDIR)\OrderedTestTest_c.sbr" : $(SOURCE) "$(INTDIR)" + + !ENDIF SOURCE=.\CppUTest\PluginTest.cpp diff --git a/tests/AllTests.vcproj b/tests/AllTests.vcproj index 87425f326..71c97f89f 100644 --- a/tests/AllTests.vcproj +++ b/tests/AllTests.vcproj @@ -908,6 +908,29 @@ /> + + + + + + + + @@ -1374,6 +1397,10 @@ RelativePath=".\CppUTestExt\IEEE754PluginTest_c.h" > + + + @@ -311,6 +312,7 @@ + From 710446dc43b42813e1b67478f5196cc3a857f510 Mon Sep 17 00:00:00 2001 From: Florian Freund Date: Tue, 18 Sep 2018 10:46:29 +0200 Subject: [PATCH 0196/1093] add new tests to all build systems --- Makefile.am | 1 + .../CCStudio/CppUTestExtRunAllTests2.pjt | 1 + platforms/Dos/sources.mk | 1 + platforms/Eclipse-Cygwin/.project | 20 +++++++++++++++++++ platforms/iar/CppUTestExtTest.ewp | 6 ++++++ 5 files changed, 29 insertions(+) diff --git a/Makefile.am b/Makefile.am index 700c214ff..fa951dbdc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -204,6 +204,7 @@ CppUTestExtTests_SOURCES = \ tests/CppUTestExt/MockStrictOrderTest.cpp \ tests/CppUTestExt/MockReturnValueTest.cpp \ tests/CppUTestExt/OrderedTestTest.cpp \ + tests/CppUTestExt/OrderedTestTest_c.c \ tests/CppUTestExt/MockFakeLongLong.cpp DISTCLEANFILES = \ diff --git a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt index 3a16a39b3..b97646249 100644 --- a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt +++ b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt @@ -52,6 +52,7 @@ Source="..\..\tests\CppUTestExt\MockParameterTest.cpp" Source="..\..\tests\CppUTestExt\MockSupport_cTest.cpp" Source="..\..\tests\CppUTestExt\MockSupport_cTestCFile.c" Source="..\..\tests\CppUTestExt\OrderedTestTest.cpp" +Source="..\..\tests\CppUTestExt\OrderedTestTest_c.c" Source="C:\CCStudio_v3.3\C2000\cgtools\lib\src\farmem_cpp.cpp" Source="tests\CppUTestExt\AllTestsForTarget.cpp" Source="sim28335.cmd" diff --git a/platforms/Dos/sources.mk b/platforms/Dos/sources.mk index 37006fa64..4a2ff3477 100644 --- a/platforms/Dos/sources.mk +++ b/platforms/Dos/sources.mk @@ -98,6 +98,7 @@ CPPUX2_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/CodeMemoryReporterTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/OrderedTestTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/OrderedTestTest_c.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockReturnValueTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockNamedValueTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockPluginTest.o \ diff --git a/platforms/Eclipse-Cygwin/.project b/platforms/Eclipse-Cygwin/.project index 5a28c97d8..634bea6fa 100644 --- a/platforms/Eclipse-Cygwin/.project +++ b/platforms/Eclipse-Cygwin/.project @@ -1764,6 +1764,16 @@ 1 PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/CppUTestExt/OrderedTestTest.cpp + + tests/CppUTestExt/OrderedTestTest_c.c + 1 + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/CppUTestExt/OrderedTestTest_c.c + + + tests/CppUTestExt/OrderedTestTest.h + 1 + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/CppUTestExt/OrderedTestTest.h + tests/Debug/AllTests.bsc 1 @@ -2064,6 +2074,16 @@ 1 PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/Debug/OrderedTestTest.sbr + + tests/Debug/OrderedTestTest_c.obj + 1 + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/Debug/OrderedTestTest_c.obj + + + tests/Debug/OrderedTestTest_c.sbr + 1 + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/Debug/OrderedTestTest_c.sbr + tests/Debug/PluginTest.obj 1 diff --git a/platforms/iar/CppUTestExtTest.ewp b/platforms/iar/CppUTestExtTest.ewp index 6e405c108..5693a97d1 100644 --- a/platforms/iar/CppUTestExtTest.ewp +++ b/platforms/iar/CppUTestExtTest.ewp @@ -2018,6 +2018,12 @@ $PROJ_DIR$\..\..\tests\CppUTestExt\OrderedTestTest.cpp + + $PROJ_DIR$\..\..\tests\CppUTestExt\OrderedTestTest_c.c + + + $PROJ_DIR$\..\..\tests\CppUTestExt\OrderedTestTest.h + warnings From 7d58dac91891c7a82bc1b37795c211a4297b4451 Mon Sep 17 00:00:00 2001 From: Thomas Thorne Date: Tue, 16 Oct 2018 10:41:47 +0100 Subject: [PATCH 0197/1093] State Need For Manual "build directory" In ReadMe The present ReadMe Getting Started instructions do not indicate that a new build directory needs to be created by the user. autoget.sh should be run in the root of the project, whereas the configure command needs to be run in a sub-directory. Expand the instructions to show creating and navigating to a build directory and then markup commands. --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8d8a06781..663a84e25 100644 --- a/README.md +++ b/README.md @@ -22,10 +22,11 @@ Building from source (unix-based, cygwin, MacOSX): * Download latest version * autogen.sh -* configure -* make -* make check -* You can use "make install" if you want to install CppUTest system-wide +* make a build directory and change to it `mkdir a_build_dir && cd a_build_dir` +* configure `../configure` +* `make` +* `make check` +* You can use `make install` if you want to install CppUTest system-wide You can also use CMake, which also works for Windows Visual Studio. From 8adb4f4fd8b843a0cae9b30e83af78fb4d6ebb8e Mon Sep 17 00:00:00 2001 From: Raphael Nestler Date: Wed, 14 Nov 2018 18:18:38 +0100 Subject: [PATCH 0198/1093] Do not mark cpp source files as executable These cpp source files were marked as executable for whatever reason. Since there is no point in marking source code executable we can remove the flag. --- src/CppUTest/CommandLineArguments.cpp | 0 src/CppUTest/CommandLineTestRunner.cpp | 0 src/CppUTest/TestRegistry.cpp | 0 src/CppUTest/Utest.cpp | 0 src/CppUTestExt/MockSupport.cpp | 0 tests/CppUTest/CommandLineArgumentsTest.cpp | 0 tests/CppUTest/CommandLineTestRunnerTest.cpp | 0 tests/CppUTest/TestUTestMacro.cpp | 0 tests/CppUTest/TestUTestStringMacro.cpp | 0 9 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/CppUTest/CommandLineArguments.cpp mode change 100755 => 100644 src/CppUTest/CommandLineTestRunner.cpp mode change 100755 => 100644 src/CppUTest/TestRegistry.cpp mode change 100755 => 100644 src/CppUTest/Utest.cpp mode change 100755 => 100644 src/CppUTestExt/MockSupport.cpp mode change 100755 => 100644 tests/CppUTest/CommandLineArgumentsTest.cpp mode change 100755 => 100644 tests/CppUTest/CommandLineTestRunnerTest.cpp mode change 100755 => 100644 tests/CppUTest/TestUTestMacro.cpp mode change 100755 => 100644 tests/CppUTest/TestUTestStringMacro.cpp diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp old mode 100755 new mode 100644 diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp old mode 100755 new mode 100644 diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp old mode 100755 new mode 100644 diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp old mode 100755 new mode 100644 diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp old mode 100755 new mode 100644 diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp old mode 100755 new mode 100644 diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp old mode 100755 new mode 100644 diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp old mode 100755 new mode 100644 diff --git a/tests/CppUTest/TestUTestStringMacro.cpp b/tests/CppUTest/TestUTestStringMacro.cpp old mode 100755 new mode 100644 From 674a2a5f5e54a8c8d9879f60e86f1ba48a60b825 Mon Sep 17 00:00:00 2001 From: offa Date: Mon, 26 Nov 2018 19:11:10 +0100 Subject: [PATCH 0199/1093] Deprecated travis option removed. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index dc4821abe..35b895c61 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: cpp dist: trusty -sudo: false matrix: include: From 768e0480c1ff88eddfb659a2368faa64c7fa5aa1 Mon Sep 17 00:00:00 2001 From: Kyle Russell Date: Tue, 28 Jun 2016 15:26:11 -0400 Subject: [PATCH 0200/1093] Warn if memory leaks expected when memleak support disabled Print a warning message during tests that expect leaks when CppUTest has been configured with --disable-memory-leak-detection. This permits the rest of a test's value to remain in effect if the desired configuration is really to disable memory leak detection. --- src/CppUTest/MemoryLeakWarningPlugin.cpp | 11 +++++-- tests/CppUTest/MemoryLeakWarningTest.cpp | 37 ++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 748793741..cc6d09d56 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -570,8 +570,15 @@ void MemoryLeakWarningPlugin::postTestAction(UtestShell& test, TestResult& resul int leaks = memLeakDetector_->totalMemoryLeaks(mem_leak_period_checking); if (!ignoreAllWarnings_ && expectedLeaks_ != leaks && failureCount_ == result.getFailureCount()) { - TestFailure f(&test, memLeakDetector_->report(mem_leak_period_checking)); - result.addFailure(f); + if(MemoryLeakWarningPlugin::areNewDeleteOverloaded()) { + TestFailure f(&test, memLeakDetector_->report(mem_leak_period_checking)); + result.addFailure(f); + } else if(expectedLeaks_ > 0) { + result.print("Warning: Expected "); + result.print(StringFrom(expectedLeaks_).asCharString()); + result.print(expectedLeaks_ == 1 ? " leak" : " leaks"); + result.print(", but leak detection was disabled"); + } } memLeakDetector_->markCheckingPeriodLeaksAsNonCheckingPeriod(); ignoreAllWarnings_ = false; diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index 0af9199d7..f504ece0a 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -118,8 +118,41 @@ TEST(MemoryLeakWarningTest, TwoLeaks) { fixture->setTestFunction(_testTwoLeaks); fixture->runAllTests(); - LONGS_EQUAL(1, fixture->getFailureCount()); - fixture->assertPrintContains("Total number of leaks: 2"); + if(MemoryLeakWarningPlugin::areNewDeleteOverloaded()) + { + LONGS_EQUAL(1, fixture->getFailureCount()); + fixture->assertPrintContains("Total number of leaks: 2"); + } else { + LONGS_EQUAL(0, fixture->getFailureCount()); + } +} + +static void _testLeakWarningWithPluginDisabled() +{ + memPlugin->expectLeaksInTest(1); + cpputest_malloc_location_with_leak_detection(10, __FILE__, __LINE__); +} + +TEST(MemoryLeakWarningTest, LeakWarningWithPluginDisabled) +{ + MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); // force off even if memleak enabled + + MemoryLeakDetector* origDetector = MemoryLeakWarningPlugin::getGlobalDetector(); + MemoryLeakFailure* origReporter = MemoryLeakWarningPlugin::getGlobalFailureReporter(); + + setCurrentMallocAllocator(allocator); + MemoryLeakWarningPlugin::setGlobalDetector(detector, &dummy); + + fixture->setTestFunction(_testLeakWarningWithPluginDisabled); + fixture->runAllTests(); + + LONGS_EQUAL(0, fixture->getFailureCount()); + fixture->assertPrintContains("Warning: Expected 1 leak, but leak detection was disabled"); + + MemoryLeakWarningPlugin::setGlobalDetector(origDetector, origReporter); + setCurrentMallocAllocator(NULLPTR); + + MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); } static void _testIgnore2() From 0128134e0068621ba4608e26e7eca13892325567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20R=C3=B8rtveit?= Date: Wed, 19 Dec 2018 09:17:02 +0100 Subject: [PATCH 0201/1093] Added support for setting tolerance when mock expects a double input parameter --- include/CppUTestExt/MockCheckedExpectedCall.h | 2 + include/CppUTestExt/MockExpectedCall.h | 2 + include/CppUTestExt/MockNamedValue.h | 9 +++- src/CppUTestExt/MockExpectedCall.cpp | 8 ++++ src/CppUTestExt/MockNamedValue.cpp | 21 ++++++-- tests/CppUTestExt/MockExpectedCallTest.cpp | 15 +++++- tests/CppUTestExt/MockNamedValueTest.cpp | 48 ++++++++++++++++++- tests/CppUTestExt/MockParameterTest.cpp | 25 ++++++++++ 8 files changed, 123 insertions(+), 7 deletions(-) diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index 7909ea09e..211c9bd9b 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -50,6 +50,7 @@ class MockCheckedExpectedCall : public MockExpectedCall virtual MockExpectedCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) _override; virtual MockExpectedCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) _override; virtual MockExpectedCall& withDoubleParameter(const SimpleString& name, double value) _override; + virtual MockExpectedCall& withDoubleParameter(const SimpleString& name, double value, double tolerance) _override; virtual MockExpectedCall& withStringParameter(const SimpleString& name, const char* value) _override; virtual MockExpectedCall& withPointerParameter(const SimpleString& name, void* value) _override; virtual MockExpectedCall& withConstPointerParameter(const SimpleString& name, const void* value) _override; @@ -160,6 +161,7 @@ class MockIgnoredExpectedCall: public MockExpectedCall virtual MockExpectedCall& withLongLongIntParameter(const SimpleString&, cpputest_longlong) _override { return *this; } virtual MockExpectedCall& withUnsignedLongLongIntParameter(const SimpleString&, cpputest_ulonglong) _override { return *this; } virtual MockExpectedCall& withDoubleParameter(const SimpleString&, double) _override { return *this; } + virtual MockExpectedCall& withDoubleParameter(const SimpleString&, double, double) _override { return *this; } virtual MockExpectedCall& withStringParameter(const SimpleString&, const char*) _override { return *this; } virtual MockExpectedCall& withPointerParameter(const SimpleString& , void*) _override { return *this; } virtual MockExpectedCall& withConstPointerParameter(const SimpleString& , const void*) _override { return *this; } diff --git a/include/CppUTestExt/MockExpectedCall.h b/include/CppUTestExt/MockExpectedCall.h index aaa7b2842..5b68ab6f0 100644 --- a/include/CppUTestExt/MockExpectedCall.h +++ b/include/CppUTestExt/MockExpectedCall.h @@ -51,6 +51,7 @@ class MockExpectedCall MockExpectedCall& withParameter(const SimpleString& name, cpputest_longlong value) { return withLongLongIntParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, cpputest_ulonglong value) { return withUnsignedLongLongIntParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, double value) { return withDoubleParameter(name, value); } + MockExpectedCall& withParameter(const SimpleString& name, double value, double tolerance) { return withDoubleParameter(name, value, tolerance); } MockExpectedCall& withParameter(const SimpleString& name, const char* value) { return withStringParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, void* value) { return withPointerParameter(name, value); } MockExpectedCall& withParameter(const SimpleString& name, const void* value) { return withConstPointerParameter(name, value); } @@ -69,6 +70,7 @@ class MockExpectedCall virtual MockExpectedCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value)=0; virtual MockExpectedCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value)=0; virtual MockExpectedCall& withDoubleParameter(const SimpleString& name, double value)=0; + virtual MockExpectedCall& withDoubleParameter(const SimpleString& name, double value, double tolerance)=0; virtual MockExpectedCall& withStringParameter(const SimpleString& name, const char* value)=0; virtual MockExpectedCall& withPointerParameter(const SimpleString& name, void* value)=0; virtual MockExpectedCall& withFunctionPointerParameter(const SimpleString& name, void (*value)())=0; diff --git a/include/CppUTestExt/MockNamedValue.h b/include/CppUTestExt/MockNamedValue.h index e94d225e0..d79995aa6 100644 --- a/include/CppUTestExt/MockNamedValue.h +++ b/include/CppUTestExt/MockNamedValue.h @@ -112,6 +112,7 @@ class MockNamedValue virtual void setValue(cpputest_longlong value); virtual void setValue(cpputest_ulonglong value); virtual void setValue(double value); + virtual void setValue(double value, double tolerance); virtual void setValue(void* value); virtual void setValue(const void* value); virtual void setValue(void (*value)()); @@ -139,6 +140,7 @@ class MockNamedValue virtual cpputest_longlong getLongLongIntValue() const; virtual cpputest_ulonglong getUnsignedLongLongIntValue() const; virtual double getDoubleValue() const; + virtual double getDoubleTolerance() const; virtual const char* getStringValue() const; virtual void* getPointerValue() const; virtual const void* getConstPointerValue() const; @@ -153,6 +155,8 @@ class MockNamedValue virtual MockNamedValueCopier* getCopier() const; static void setDefaultComparatorsAndCopiersRepository(MockNamedValueComparatorsAndCopiersRepository* repository); + + static const double defaultDoubleTolerance; private: SimpleString name_; SimpleString type_; @@ -168,7 +172,10 @@ class MockNamedValue #else char longLongPlaceholder_[CPPUTEST_SIZE_OF_FAKE_LONG_LONG_TYPE]; #endif - double doubleValue_; + struct { + double value; + double tolerance; + } doubleValue_; const char* stringValue_; void* pointerValue_; const void* constPointerValue_; diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index fff7f831a..ad035dc9f 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -167,6 +167,14 @@ MockExpectedCall& MockCheckedExpectedCall::withDoubleParameter(const SimpleStrin return *this; } +MockExpectedCall& MockCheckedExpectedCall::withDoubleParameter(const SimpleString& name, double value, double tolerance) +{ + MockNamedValue* newParameter = new MockExpectedFunctionParameter(name); + inputParameters_->add(newParameter); + newParameter->setValue(value, tolerance); + return *this; +} + MockExpectedCall& MockCheckedExpectedCall::withStringParameter(const SimpleString& name, const char* value) { MockNamedValue* newParameter = new MockExpectedFunctionParameter(name); diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index fd0638bfd..9f4e64a29 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -31,6 +31,7 @@ MockNamedValueComparatorsAndCopiersRepository* MockNamedValue::defaultRepository_ = NULLPTR; +const double MockNamedValue::defaultDoubleTolerance = 0.005; void MockNamedValue::setDefaultComparatorsAndCopiersRepository(MockNamedValueComparatorsAndCopiersRepository* repository) { @@ -105,9 +106,15 @@ void MockNamedValue::setValue(cpputest_ulonglong) #endif void MockNamedValue::setValue(double value) +{ + setValue(value, defaultDoubleTolerance); +} + +void MockNamedValue::setValue(double value, double tolerance) { type_ = "double"; - value_.doubleValue_ = value; + value_.doubleValue_.value = value; + value_.doubleValue_.tolerance = tolerance; } void MockNamedValue::setValue(void* value) @@ -291,7 +298,13 @@ cpputest_ulonglong MockNamedValue::getUnsignedLongLongIntValue() const double MockNamedValue::getDoubleValue() const { STRCMP_EQUAL("double", type_.asCharString()); - return value_.doubleValue_; + return value_.doubleValue_.value; +} + +double MockNamedValue::getDoubleTolerance() const +{ + STRCMP_EQUAL("double", type_.asCharString()); + return value_.doubleValue_.tolerance; } const char* MockNamedValue::getStringValue() const @@ -441,7 +454,7 @@ bool MockNamedValue::equals(const MockNamedValue& p) const else if (type_ == "void (*)()") return value_.functionPointerValue_ == p.value_.functionPointerValue_; else if (type_ == "double") - return (doubles_equal(value_.doubleValue_, p.value_.doubleValue_, 0.005)); + return (doubles_equal(value_.doubleValue_.value, p.value_.doubleValue_.value, value_.doubleValue_.tolerance)); else if (type_ == "const unsigned char*") { if (size_ != p.size_) { @@ -493,7 +506,7 @@ SimpleString MockNamedValue::toString() const else if (type_ == "const void*") return StringFrom(value_.constPointerValue_); else if (type_ == "double") - return StringFrom(value_.doubleValue_); + return StringFrom(value_.doubleValue_.value); else if (type_ == "const unsigned char*") return StringFromBinaryWithSizeOrNull(value_.memoryBufferValue_, size_); diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index f213b2445..c12167a54 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -259,7 +259,19 @@ TEST(MockExpectedCall, callWithDoubleParameter) double value = 1.2; call->withParameter(paramName, value); STRCMP_EQUAL("double", call->getInputParameterType(paramName).asCharString()); - DOUBLES_EQUAL(value, call->getInputParameter(paramName).getDoubleValue(), 0.05); + DOUBLES_EQUAL(value, call->getInputParameter(paramName).getDoubleValue(), 0.0); + STRCMP_CONTAINS("funcName -> double paramName: <1.2>", call->callToString().asCharString()); +} + +TEST(MockExpectedCall, callWithDoubleParameterAndTolerance) +{ + const SimpleString paramName = "paramName"; + double value = 1.2; + double tolerance = 0.2; + call->withParameter(paramName, value, tolerance); + STRCMP_EQUAL("double", call->getInputParameterType(paramName).asCharString()); + DOUBLES_EQUAL(value, call->getInputParameter(paramName).getDoubleValue(), 0.0); + DOUBLES_EQUAL(tolerance, call->getInputParameter(paramName).getDoubleTolerance(), 0.0); STRCMP_CONTAINS("funcName -> double paramName: <1.2>", call->callToString().asCharString()); } @@ -750,6 +762,7 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.withUnsignedLongLongIntParameter("grr", (unsigned long long int) 1); #endif ignored.withDoubleParameter("hah", (double) 1.1f); + ignored.withDoubleParameter("gah", 2.1, 0.3); ignored.withStringParameter("goo", "hello"); ignored.withPointerParameter("pie", (void*) NULLPTR); ignored.withConstPointerParameter("woo", (const void*) NULLPTR); diff --git a/tests/CppUTestExt/MockNamedValueTest.cpp b/tests/CppUTestExt/MockNamedValueTest.cpp index e9b9d45d0..ec59f0dbe 100644 --- a/tests/CppUTestExt/MockNamedValueTest.cpp +++ b/tests/CppUTestExt/MockNamedValueTest.cpp @@ -80,7 +80,7 @@ TEST(ComparatorsAndCopiersRepository, InstallComparatorsAndCopiersFromRepository MyCopier copier; MockNamedValueComparatorsAndCopiersRepository source; MockNamedValueComparatorsAndCopiersRepository target; - + source.installCopier("MyType", copier); source.installComparator("MyType", comparator); @@ -93,3 +93,49 @@ TEST(ComparatorsAndCopiersRepository, InstallComparatorsAndCopiersFromRepository target.clear(); } +TEST_GROUP(MockNamedValue) +{ + MockNamedValue * value; + void setup() + { + value = new MockNamedValue("param"); + } + + void teardown() + { + delete value; + } +}; + +TEST(MockNamedValue, DefaultToleranceUsedWhenNoToleranceGiven) +{ + value->setValue(0.2); + CHECK_EQUAL(MockNamedValue::defaultDoubleTolerance, value->getDoubleTolerance()); +} + +TEST(MockNamedValue, GivenToleranceUsed) +{ + value->setValue(0.2, 3.2); + STRCMP_EQUAL("double", value->getType().asCharString()); + CHECK_EQUAL(0.2, value->getDoubleValue()); + CHECK_EQUAL(3.2, value->getDoubleTolerance()); +} + +TEST(MockNamedValue, DoublesEqualIfWithinTolerance) +{ + value->setValue(5.0, 0.4); + MockNamedValue other("param2"); + other.setValue(5.3); + + CHECK_TRUE(value->equals(other)); +} + + +TEST(MockNamedValue, DoublesNotEqualIfOutsideTolerance) +{ + value->setValue(5.0, 0.4); + MockNamedValue other("param2"); + other.setValue(5.5); + + CHECK_FALSE(value->equals(other)); +} \ No newline at end of file diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 39f08ff95..0ff8ebee1 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -294,6 +294,31 @@ TEST(MockParameterTest, expectOneDoubleParameterAndValue) mock().checkExpectations(); } +TEST(MockParameterTest, expectOneDoubleParameterAndValueAndTolerance) +{ + mock( ).expectOneCall("foo").withParameter("parameter", 100.0, 5.0); + mock( ).actualCall("foo").withParameter("parameter", 96.0); + + mock( ).checkExpectations(); +} + +TEST(MockParameterTest, doubleParameterNotEqualIfOutsideTolerance) +{ + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest expectations; + expectations.addFunction("foo")->withParameter("parameter", 100.0); + MockNamedValue parameter("parameter"); + parameter.setValue(106.0); + MockUnexpectedInputParameterFailure expectedFailure(mockFailureTest(), "foo", parameter, expectations); + + mock( ).expectOneCall("foo").withParameter("parameter", 100.0, 5.0); + mock( ).actualCall("foo").withParameter("parameter", 106.0); + + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); +} + + TEST(MockParameterTest, expectOneStringParameterAndValue) { mock().expectOneCall("foo").withParameter("parameter", "string"); From d09d685a4c992afd5b014bc5b9eaf860b427a355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20R=C3=B8rtveit?= Date: Wed, 19 Dec 2018 09:40:38 +0100 Subject: [PATCH 0202/1093] Changed some tests from CHECK_EQUAL to DOUBLES_EQUAL --- tests/CppUTestExt/MockNamedValueTest.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/CppUTestExt/MockNamedValueTest.cpp b/tests/CppUTestExt/MockNamedValueTest.cpp index ec59f0dbe..00b6badd5 100644 --- a/tests/CppUTestExt/MockNamedValueTest.cpp +++ b/tests/CppUTestExt/MockNamedValueTest.cpp @@ -27,6 +27,7 @@ #include "CppUTest/TestHarness.h" #include "CppUTestExt/MockNamedValue.h" +#include TEST_GROUP(ComparatorsAndCopiersRepository) { @@ -110,15 +111,15 @@ TEST_GROUP(MockNamedValue) TEST(MockNamedValue, DefaultToleranceUsedWhenNoToleranceGiven) { value->setValue(0.2); - CHECK_EQUAL(MockNamedValue::defaultDoubleTolerance, value->getDoubleTolerance()); + DOUBLES_EQUAL(MockNamedValue::defaultDoubleTolerance, value->getDoubleTolerance(), 0.0); } TEST(MockNamedValue, GivenToleranceUsed) { value->setValue(0.2, 3.2); STRCMP_EQUAL("double", value->getType().asCharString()); - CHECK_EQUAL(0.2, value->getDoubleValue()); - CHECK_EQUAL(3.2, value->getDoubleTolerance()); + DOUBLES_EQUAL(0.2, value->getDoubleValue(), 0.0); + DOUBLES_EQUAL(3.2, value->getDoubleTolerance(), 0.0); } TEST(MockNamedValue, DoublesEqualIfWithinTolerance) @@ -138,4 +139,4 @@ TEST(MockNamedValue, DoublesNotEqualIfOutsideTolerance) other.setValue(5.5); CHECK_FALSE(value->equals(other)); -} \ No newline at end of file +} From c62b0ff5dee5b8fc88a0b4a1904ac9f2bcb0ebdd Mon Sep 17 00:00:00 2001 From: Stephen Hill Date: Wed, 19 Dec 2018 08:52:04 +0000 Subject: [PATCH 0203/1093] Ability to disable the guard bytes and poison of heap blocks to allow dynamic code analysis tools, such as Boundschecker, to detect read-overruns --- include/CppUTest/MemoryLeakDetector.h | 4 ++++ src/CppUTest/MemoryLeakDetector.cpp | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/include/CppUTest/MemoryLeakDetector.h b/include/CppUTest/MemoryLeakDetector.h index cd316a7e7..540c469c9 100644 --- a/include/CppUTest/MemoryLeakDetector.h +++ b/include/CppUTest/MemoryLeakDetector.h @@ -216,7 +216,11 @@ class MemoryLeakDetector void removeMemoryLeakInformationWithoutCheckingOrDeallocatingTheMemoryButDeallocatingTheAccountInformation(TestMemoryAllocator* allocator, void* memory, bool allocatNodesSeperately); enum { +#ifdef CPPUTEST_DISABLE_MEM_CORRUPTION_CHECK + memory_corruption_buffer_size = 0 +#else memory_corruption_buffer_size = 3 +#endif }; unsigned getCurrentAllocationNumber(); diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index 10af4b919..3daaa4aab 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -32,6 +32,8 @@ static const char* UNKNOWN = ""; +static const char GuardBytes[] = {'B','A','S'}; + SimpleStringBuffer::SimpleStringBuffer() : positions_filled_(0), write_limit_(SIMPLE_STRING_BUFFER_LEN-1) { @@ -481,7 +483,11 @@ SimpleMutex *MemoryLeakDetector::getMutex() static size_t calculateVoidPointerAlignedSize(size_t size) { +#ifndef CPPUTEST_DISABLE_MEM_CORRUPTION_CHECK return (sizeof(void*) - (size % sizeof(void*))) + size; +#else + return size; +#endif } size_t MemoryLeakDetector::sizeOfMemoryWithCorruptionInfo(size_t size) @@ -513,21 +519,25 @@ char* MemoryLeakDetector::reallocateMemoryAndLeakInformation(TestMemoryAllocator void MemoryLeakDetector::invalidateMemory(char* memory) { +#ifndef CPPUTEST_DISABLE_HEAP_POISON MemoryLeakDetectorNode* node = memoryTable_.retrieveNode(memory); if (node) PlatformSpecificMemset(memory, 0xCD, node->size_); +#endif } void MemoryLeakDetector::addMemoryCorruptionInformation(char* memory) { - memory[0] = 'B'; - memory[1] = 'A'; - memory[2] = 'S'; + for (size_t i=0; i Date: Wed, 19 Dec 2018 10:31:33 +0100 Subject: [PATCH 0204/1093] Added double tolerance support to C-mock --- include/CppUTestExt/MockSupport_c.h | 1 + src/CppUTestExt/MockSupport_c.cpp | 8 ++++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 6 ++++++ tests/CppUTestExt/MockSupport_cTestCFile.c | 2 ++ 4 files changed, 17 insertions(+) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index b2deb9593..a3a13e748 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -136,6 +136,7 @@ struct SMockExpectedCall_c MockExpectedCall_c* (*withLongLongIntParameters)(const char* name, cpputest_longlong value); MockExpectedCall_c* (*withUnsignedLongLongIntParameters)(const char* name, cpputest_ulonglong value); MockExpectedCall_c* (*withDoubleParameters)(const char* name, double value); + MockExpectedCall_c* (*withDoubleParametersAndTolerance)(const char* name, double value, double tolerance); MockExpectedCall_c* (*withStringParameters)(const char* name, const char* value); MockExpectedCall_c* (*withPointerParameters)(const char* name, void* value); MockExpectedCall_c* (*withConstPointerParameters)(const char* name, const void* value); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 6c2e14a36..54d527c9e 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -151,6 +151,7 @@ MockExpectedCall_c* withUnsignedLongIntParameters_c(const char* name, unsigned l MockExpectedCall_c* withLongLongIntParameters_c(const char* name, cpputest_longlong value); MockExpectedCall_c* withUnsignedLongLongIntParameters_c(const char* name, cpputest_ulonglong value); MockExpectedCall_c* withDoubleParameters_c(const char* name, double value); +MockExpectedCall_c* withDoubleParametersAndTolerance_c(const char* name, double value, double tolerance); MockExpectedCall_c* withStringParameters_c(const char* name, const char* value); MockExpectedCall_c* withPointerParameters_c(const char* name, void* value); MockExpectedCall_c* withConstPointerParameters_c(const char* name, const void* value); @@ -251,6 +252,7 @@ static MockExpectedCall_c gExpectedCall = { withLongLongIntParameters_c, withUnsignedLongLongIntParameters_c, withDoubleParameters_c, + withDoubleParametersAndTolerance_c, withStringParameters_c, withPointerParameters_c, withConstPointerParameters_c, @@ -440,6 +442,12 @@ MockExpectedCall_c* withDoubleParameters_c(const char* name, double value) return &gExpectedCall; } +MockExpectedCall_c* withDoubleParametersAndTolerance_c(const char* name, double value, double tolerance) +{ + expectedCall = &expectedCall->withParameter(name, value, tolerance); + return &gExpectedCall; +} + MockExpectedCall_c* withStringParameters_c(const char* name, const char* value) { expectedCall = &expectedCall->withParameter(name, value); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index df29a8732..c368e0c4e 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -154,6 +154,12 @@ TEST(MockSupport_c, unsignedLongIntParameter) mock_c()->actualCall("foo")->withUnsignedLongIntParameters("p", 1); } +TEST(MockSupport_c, doubleParameterWithTolerance) +{ + mock_c( )->expectOneCall("foo")->withDoubleParametersAndTolerance("p", 2.0, 0.2); + mock_c( )->actualCall("foo")->withDoubleParameters("p", 1.9); +} + #ifdef CPPUTEST_USE_LONG_LONG TEST(MockSupport_c, longLongIntParameter) diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index afc787c4e..77e4bdabd 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -59,6 +59,7 @@ void all_mock_support_c_calls(void) #endif withDoubleParameters("double", 1.0)-> + withDoubleParametersAndTolerance("doubleWithTolerance", 1.0, 1.0)-> withStringParameters("string", "string")-> withPointerParameters("pointer", (void*) 1)-> withConstPointerParameters("constpointer", (const void*) 1)-> @@ -76,6 +77,7 @@ void all_mock_support_c_calls(void) withUnsignedLongLongIntParameters("unsigned long long int", (unsigned long long int) 1)-> #endif withDoubleParameters("double", 1.0)-> + withDoubleParameters("doubleWithTolerance", 0.0 )-> withStringParameters("string", "string")-> withPointerParameters("pointer", (void*) 1)-> withConstPointerParameters("constpointer", (const void*) 1)-> From d2fc6c984075c94d5ac3292a3ef761960b1918a5 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Fri, 4 Jan 2019 13:48:03 -0800 Subject: [PATCH 0205/1093] include string.h in StandardCLibrary.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If memory leak detection for C code is enabled, the header file MemoryLeakDetectorMallocMacros.h is included by the command line prior to any of the raw source code for an object. In this case, if CPPUTEST_HAVE_STRDUP is defined, the strdup function will be redefined using a macro. If the source code happens to include or , this will happen *after* the memory leak detection header is included on the command line. Because of this, strdup will have already been redefined, and will then result in compiler warnings similar to the following: /usr/include/string.h:166:37: error: expected identifier before string constant extern char *strdup (const char *__s) ^ /usr/include/string.h:166:37: error: expected ‘,’ or ‘...’ before string constant In file included from : .../include/CppUTest/MemoryLeakDetectorMallocMacros.h:62:21: error: conflicting declaration of C function ‘char* cpputest_strdup_location(const char*, int)’ #define strdup(str) cpputest_strdup_location(str, __FILE__, __LINE__) ^~~~~~~~~~~~~~~~~~~~~~~~ .../include/CppUTest/MemoryLeakDetectorMallocMacros.h:55:14: note: previous declaration ‘char* cpputest_strdup_location(const char*, const char*, int)’ extern char* cpputest_strdup_location(const char* str, const char* file, int line); ^~~~~~~~~~~~~~~~~~~~~~~~ This happens because the "strdup (const char *__s) is converted by the macro. To fix this, must be included prior to the setup of memory leak detection. Modify StandardCLibrary.h to include if CPPUTEST_HAVE_STRING_H is defined. This fixes the error and allows proper usage of the leak detection strdup implementation. Signed-off-by: Jacob Keller --- include/CppUTest/StandardCLibrary.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/CppUTest/StandardCLibrary.h b/include/CppUTest/StandardCLibrary.h index 37333879d..ee132dc03 100644 --- a/include/CppUTest/StandardCLibrary.h +++ b/include/CppUTest/StandardCLibrary.h @@ -27,6 +27,11 @@ /* Needed for some detection of long long and 64 bit */ #include +/* Needed to ensure that string.h is included prior to strdup redefinition */ +#ifdef CPPUTEST_HAVE_STRING_H +#include +#endif + #else #ifdef __KERNEL__ From 8d649c87f5b9ce39f286e6280a194aae60ac26b7 Mon Sep 17 00:00:00 2001 From: Stephen Hill Date: Thu, 10 Jan 2019 11:39:57 +0000 Subject: [PATCH 0206/1093] Fix problems when using plugin --- src/CppUTest/MemoryLeakDetector.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index 3daaa4aab..e1b648f16 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -582,6 +582,9 @@ MemoryLeakDetectorNode* MemoryLeakDetector::createMemoryLeakAccountingInformatio char* MemoryLeakDetector::allocMemory(TestMemoryAllocator* allocator, size_t size, const char* file, int line, bool allocatNodesSeperately) { +#ifdef CPPUTEST_DISABLE_MEM_CORRUPTION_CHECK + allocatNodesSeperately = true; +#endif /* With malloc, it is harder to guarantee that the allocator free is called. * This is because operator new is overloaded via linker symbols, but malloc just via #defines. * If the same allocation is used and the wrong free is called, it will deallocate the memory leak information @@ -612,6 +615,9 @@ void MemoryLeakDetector::deallocMemory(TestMemoryAllocator* allocator, void* mem outputBuffer_.reportDeallocateNonAllocatedMemoryFailure(file, line, allocator, reporter_); return; } +#ifdef CPPUTEST_DISABLE_MEM_CORRUPTION_CHECK + allocatNodesSeperately = true; +#endif if (!allocator->hasBeenDestroyed()) { checkForCorruption(node, file, line, allocator, allocatNodesSeperately); allocator->free_memory((char*) memory, file, line); @@ -625,6 +631,9 @@ void MemoryLeakDetector::deallocMemory(TestMemoryAllocator* allocator, void* mem char* MemoryLeakDetector::reallocMemory(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, int line, bool allocatNodesSeperately) { +#ifdef CPPUTEST_DISABLE_MEM_CORRUPTION_CHECK + allocatNodesSeperately = true; +#endif if (memory) { MemoryLeakDetectorNode* node = memoryTable_.removeNode(memory); if (node == NULLPTR) { From aa46da5d6ca16dac6a84b2188a6beb7514944d48 Mon Sep 17 00:00:00 2001 From: Niko Kontio Date: Mon, 5 Nov 2018 12:30:28 +0200 Subject: [PATCH 0207/1093] Shuffle test execution order with -s Shuffling is off by default. -s enables shuffling with random seed derived from current time. The seed is printed before executing tests. A specific test execution order can be reproduced by setting the seed explicitly with -s . Seed values 0 and 1 are reserved values and cannot be set. If -v (verbose) is enabled, the seed is also printed after test execution. This might be useful in case tests produce console output which could cause the seed printed at the beginning to be lost. Test order is reshuffled between repeats (-r). Co-authored-by: Risto-Matti Vuonnala --- .gitignore | 4 ++ include/CppUTest/CommandLineArguments.h | 3 + include/CppUTest/StandardCLibrary.h | 2 + include/CppUTest/TestOutput.h | 2 + include/CppUTest/TestRegistry.h | 1 + include/CppUTest/TestResult.h | 6 ++ src/CppUTest/CommandLineArguments.cpp | 25 ++++++- src/CppUTest/CommandLineTestRunner.cpp | 37 +++++++++- src/CppUTest/TestOutput.cpp | 10 ++- src/CppUTest/TestRegistry.cpp | 17 +++++ src/CppUTest/TestResult.cpp | 6 +- tests/CppUTest/CommandLineArgumentsTest.cpp | 75 ++++++++++++++++++++- 12 files changed, 179 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 3ff7f0ad1..953af3c10 100644 --- a/.gitignore +++ b/.gitignore @@ -80,6 +80,10 @@ missing test-driver platforms/iar/settings cpputest_*.xml +generated/ +*.deps/ +*.dirstamp +*.trs #IAR automatically generated files *.dep diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index b785b2f55..a71328a9c 100755 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -47,6 +47,7 @@ class CommandLineArguments bool isListingTestGroupAndCaseNames() const; bool isRunIgnored() const; int getRepeatCount() const; + unsigned int getShuffle() const; const TestFilter* getGroupFilters() const; const TestFilter* getNameFilters() const; bool isJUnitOutput() const; @@ -72,6 +73,7 @@ class CommandLineArguments bool listTestGroupAndCaseNames_; bool runIgnored_; int repeat_; + unsigned int shuffle_; // 0: shuffling disabled, 1: random seed, other values: specific random seed TestFilter* groupFilters_; TestFilter* nameFilters_; OutputType outputType_; @@ -79,6 +81,7 @@ class CommandLineArguments SimpleString getParameterField(int ac, const char *const *av, int& i, const SimpleString& parameterName); void SetRepeatCount(int ac, const char *const *av, int& index); + void SetShuffle(int ac, const char *const *av, int& index); void AddGroupFilter(int ac, const char *const *av, int& index); void AddStrictGroupFilter(int ac, const char *const *av, int& index); void AddExcludeGroupFilter(int ac, const char *const *av, int& index); diff --git a/include/CppUTest/StandardCLibrary.h b/include/CppUTest/StandardCLibrary.h index ee132dc03..f3a0a51b9 100644 --- a/include/CppUTest/StandardCLibrary.h +++ b/include/CppUTest/StandardCLibrary.h @@ -15,6 +15,8 @@ #ifdef __cplusplus #if CPPUTEST_USE_STD_CPP_LIB #include + #include + #include #endif #endif diff --git a/include/CppUTest/TestOutput.h b/include/CppUTest/TestOutput.h index d39ad7455..d7908fec4 100644 --- a/include/CppUTest/TestOutput.h +++ b/include/CppUTest/TestOutput.h @@ -58,6 +58,7 @@ class TestOutput virtual void verbose(); virtual void color(); + virtual void setShuffleSeed(unsigned int); virtual void printBuffer(const char*)=0; virtual void print(const char*); virtual void print(long); @@ -91,6 +92,7 @@ class TestOutput int dotCount_; bool verbose_; bool color_; + unsigned int shuffleSeed_; const char* progressIndication_; static WorkingEnvironment workingEnvironment_; diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index c451d8467..0c4b82ee8 100755 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -50,6 +50,7 @@ class TestRegistry virtual void unDoLastAddTest(); virtual int countTests(); virtual void runAllTests(TestResult& result); + virtual void shuffleRunOrder(); virtual void listTestGroupNames(TestResult& result); virtual void listTestGroupAndCaseNames(TestResult& result); virtual void setNameFilters(const TestFilter* filters); diff --git a/include/CppUTest/TestResult.h b/include/CppUTest/TestResult.h index f61194648..5f1da5077 100644 --- a/include/CppUTest/TestResult.h +++ b/include/CppUTest/TestResult.h @@ -57,6 +57,7 @@ class TestResult virtual void countCheck(); virtual void countFilteredOut(); virtual void countIgnored(); + virtual void setShuffleSeed(unsigned int); virtual void addFailure(const TestFailure& failure); virtual void print(const char* text); @@ -84,6 +85,10 @@ class TestResult { return failureCount_; } + unsigned int getShuffleSeed() const + { + return shuffleSeed_; + } long getTotalExecutionTime() const; void setTotalExecutionTime(long exTime); @@ -99,6 +104,7 @@ class TestResult int failureCount_; int filteredOutCount_; int ignoredCount_; + unsigned int shuffleSeed_; long totalExecutionTime_; long timeStarted_; long currentTestTimeStarted_; diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 6e120e3fd..fc9a9ca84 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -30,7 +30,7 @@ #include "CppUTest/PlatformSpecificFunctions.h" CommandLineArguments::CommandLineArguments(int ac, const char *const *av) : - ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), repeat_(1), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) + ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), repeat_(1), shuffle_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) { } @@ -69,6 +69,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument.startsWith("-sn")) AddStrictNameFilter(ac_, av_, i); else if (argument.startsWith("-xn")) AddExcludeNameFilter(ac_, av_, i); else if (argument.startsWith("-xsn")) AddExcludeStrictNameFilter(ac_, av_, i); + else if (argument.startsWith("-s")) SetShuffle(ac_, av_, i); else if (argument.startsWith("TEST(")) AddTestToRunBasedOnVerboseOutput(ac_, av_, i, "TEST("); else if (argument.startsWith("IGNORE_TEST(")) AddTestToRunBasedOnVerboseOutput(ac_, av_, i, "IGNORE_TEST("); else if (argument.startsWith("-o")) correctParameters = SetOutputType(ac_, av_, i); @@ -85,7 +86,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) const char* CommandLineArguments::usage() const { - return "usage [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; + return "usage [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-s [randomizerSeed]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; } bool CommandLineArguments::isVerbose() const @@ -124,6 +125,11 @@ int CommandLineArguments::getRepeatCount() const return repeat_; } +unsigned int CommandLineArguments::getShuffle() const +{ + return shuffle_; +} + const TestFilter* CommandLineArguments::getGroupFilters() const { return groupFilters_; @@ -149,6 +155,21 @@ void CommandLineArguments::SetRepeatCount(int ac, const char *const *av, int& i) } +void CommandLineArguments::SetShuffle(int ac, const char * const *av, int& i) +{ + shuffle_ = 1; + SimpleString shuffleParameter(av[i]); + if (shuffleParameter.size() > 2) { + shuffle_ = SimpleString::AtoI(av[i] + 2); + } else if (i + 1 < ac) { + const int parsed = SimpleString::AtoI(av[i + 1]); + if (parsed != 0) { + i++; + shuffle_ = parsed; + } + } +} + SimpleString CommandLineArguments::getParameterField(int ac, const char * const *av, int& i, const SimpleString& parameterName) { size_t parameterLength = parameterName.size(); diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index d2f81a857..61c482c2e 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -29,6 +29,7 @@ #include "CppUTest/CommandLineTestRunner.h" #include "CppUTest/TestOutput.h" #include "CppUTest/JUnitTestOutput.h" +#include "CppUTest/PlatformSpecificFunctions.h" #include "CppUTest/TeamCityTestOutput.h" #include "CppUTest/TestRegistry.h" @@ -88,13 +89,25 @@ void CommandLineTestRunner::initializeTestRun() { registry_->setGroupFilters(arguments_->getGroupFilters()); registry_->setNameFilters(arguments_->getNameFilters()); - + if (arguments_->isVerbose()) output_->verbose(); if (arguments_->isColor()) output_->color(); if (arguments_->runTestsInSeperateProcess()) registry_->setRunTestsInSeperateProcess(); if (arguments_->isRunIgnored()) registry_->setRunIgnored(); } +static unsigned int getSeed(unsigned int shuffleArg) +{ + if (shuffleArg > 1) return shuffleArg; + + const unsigned int generatedSeed = GetPlatformSpecificTimeInMillis(); + + // do not allow seed values 0 or 1 because they cannot be given as cmd line arguments + if (generatedSeed > 1) return generatedSeed; + + return 2; +} + int CommandLineTestRunner::runAllTests() { initializeTestRun(); @@ -115,14 +128,32 @@ int CommandLineTestRunner::runAllTests() registry_->listTestGroupAndCaseNames(tr); return 0; } - + const bool shuffleEnabled = arguments_->getShuffle() != 0; + unsigned int seed = 0; + if (shuffleEnabled) + { + seed = getSeed(arguments_->getShuffle()); + output_->print("Test order shuffling enabled, seed: "); + output_->print(seed); + output_->print("\n"); + std::srand(seed); + } while (loopCount++ < repeat_) { + if (shuffleEnabled) + { + registry_->shuffleRunOrder(); + } output_->printTestRun(loopCount, repeat_); TestResult tr(*output_); registry_->runAllTests(tr); failureCount += tr.getFailureCount(); } - + if (shuffleEnabled && arguments_->isVerbose()) + { + output_->print("Random seed was: "); + output_->print(seed); + output_->print("\n"); + } return failureCount; } diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index 4a6036bd5..0cd35f78f 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -45,7 +45,7 @@ TestOutput::WorkingEnvironment TestOutput::getWorkingEnvironment() TestOutput::TestOutput() : - dotCount_(0), verbose_(false), color_(false), progressIndication_(".") + dotCount_(0), verbose_(false), color_(false), shuffleSeed_(0), progressIndication_(".") { } @@ -63,6 +63,11 @@ void TestOutput::color() color_ = true; } +void TestOutput::setShuffleSeed(unsigned int shuffleSeed) +{ + shuffleSeed_ = shuffleSeed; +} + void TestOutput::print(const char* str) { printBuffer(str); @@ -162,6 +167,9 @@ void TestOutput::printTestsEnded(const TestResult& result) print(" checks, "); print(result.getIgnoredCount()); print(" ignored, "); + if (shuffleSeed_ != 0) { + printf("0x%08X seed, ", shuffleSeed_); + } print(result.getFilteredOutCount()); print(" filtered out, "); print(result.getTotalExecutionTime()); diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 5b5459846..6c5f96fa6 100644 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -227,6 +227,23 @@ UtestShell* TestRegistry::getFirstTest() return tests_; } +void TestRegistry::shuffleRunOrder() +{ + std::vector tests; + for (UtestShell *test = tests_; test != NULL; test = test->getNext()) { + tests.push_back(test); + } + std::random_shuffle(tests.begin(), tests.end()); + + // Store shuffled vector back to linked list + UtestShell *prev = NULL; + for (size_t i = 0; i < tests.size(); ++i) + { + prev = tests[i]->addTest(prev); + } + tests_ = prev; +} + UtestShell* TestRegistry::getTestWithNext(UtestShell* test) { UtestShell* current = tests_; diff --git a/src/CppUTest/TestResult.cpp b/src/CppUTest/TestResult.cpp index 90c215d69..ac24dfe55 100644 --- a/src/CppUTest/TestResult.cpp +++ b/src/CppUTest/TestResult.cpp @@ -32,7 +32,7 @@ #include "CppUTest/PlatformSpecificFunctions.h" TestResult::TestResult(TestOutput& p) : - output_(p), testCount_(0), runCount_(0), checkCount_(0), failureCount_(0), filteredOutCount_(0), ignoredCount_(0), totalExecutionTime_(0), timeStarted_(0), currentTestTimeStarted_(0), + output_(p), testCount_(0), runCount_(0), checkCount_(0), failureCount_(0), filteredOutCount_(0), ignoredCount_(0), shuffleSeed_(0), totalExecutionTime_(0), timeStarted_(0), currentTestTimeStarted_(0), currentTestTotalExecutionTime_(0), currentGroupTimeStarted_(0), currentGroupTotalExecutionTime_(0) { } @@ -76,6 +76,10 @@ void TestResult::addFailure(const TestFailure& failure) output_.printFailure(failure); failureCount_++; } +void TestResult::setShuffleSeed(unsigned int shuffleSeed) +{ + shuffleSeed_ = shuffleSeed; +} void TestResult::countTest() { diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index 33727b915..5c6801b79 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -66,6 +66,15 @@ TEST_GROUP(CommandLineArguments) args = new CommandLineArguments(argc, argv); return args->parse(plugin); } + + void shuffleDisturbTest(int argc, const char* argv[], unsigned int expectedShuffle) + { + CHECK(newArgumentParser(argc, argv)); + TestFilter groupFilter("group"); + groupFilter.strictMatching(); + CHECK_EQUAL(groupFilter, *args->getGroupFilters()); + CHECK_EQUAL(args->getShuffle(), expectedShuffle); + } }; TEST(CommandLineArguments, Create) @@ -102,12 +111,74 @@ TEST(CommandLineArguments, repeatSetDifferentParameter) LONGS_EQUAL(4, args->getRepeatCount()); } -TEST(CommandLineArguments, repeatSetDefaultsToTwo) +TEST(CommandLineArguments, repeatSetDefaultsToTwoAndShuffleDisabled) { int argc = 2; const char* argv[] = { "tests.exe", "-r" }; CHECK(newArgumentParser(argc, argv)); LONGS_EQUAL(2, args->getRepeatCount()); + CHECK_EQUAL(args->getShuffle(), 0); +} + +TEST(CommandLineArguments, shuffleEnabled) +{ + int argc = 2; + const char* argv[] = { "tests.exe", "-s" }; + CHECK(newArgumentParser(argc, argv)); + CHECK_EQUAL(args->getShuffle(), 1); +} + +TEST(CommandLineArguments, shuffleEnabledSpecificSeedCase1) +{ + int argc = 2; + const char* argv[] = { "tests.exe", "-s999"}; + CHECK(newArgumentParser(argc, argv)); + CHECK_EQUAL(args->getShuffle(), 999); +} + +TEST(CommandLineArguments, shuffleEnabledSpecificSeedCase2) +{ + int argc = 2; + const char* argv[] = { "tests.exe", "-s 888"}; + CHECK(newArgumentParser(argc, argv)); + CHECK_EQUAL(args->getShuffle(), 888); +} + +TEST(CommandLineArguments, shuffleEnabledSpecificSeedCase3) +{ + int argc = 3; + const char* argv[] = { "tests.exe", "-s", "777"}; + CHECK(newArgumentParser(argc, argv)); + CHECK_EQUAL(args->getShuffle(), 777); +} + +TEST(CommandLineArguments, shuffleBeforeDoesNotDisturbOtherSwitchCase1) +{ + const char* argv[] = { "tests.exe", "-s", "-sg", "group" }; + shuffleDisturbTest(4, argv, 1); +} + +TEST(CommandLineArguments, shuffleBeforeDoesNotDisturbOtherSwitchCase2) +{ + const char* argv[] = { "tests.exe", "-s55", "-sg", "group" }; + shuffleDisturbTest(4, argv, 55); +} +TEST(CommandLineArguments, shuffleBeforeDoesNotDisturbOtherSwitchCase3) +{ + const char* argv[] = { "tests.exe", "-s 66", "-sg", "group" }; + shuffleDisturbTest(4, argv, 66); +} + +TEST(CommandLineArguments, shuffleBeforeDoesNotDisturbOtherSwitchCase4) +{ + const char* argv[] = { "tests.exe", "-s", "77", "-sg", "group" }; + shuffleDisturbTest(5, argv, 77); +} + +TEST(CommandLineArguments, shuffleAfterDoesNotDisturbOtherSwitch) +{ + const char* argv[] = { "tests.exe", "-sg", "group", "-s"}; + shuffleDisturbTest(4, argv, 1); } TEST(CommandLineArguments, runningTestsInSeperateProcesses) @@ -370,7 +441,7 @@ TEST(CommandLineArguments, weirdParamatersPrintsUsageAndReturnsFalse) int argc = 2; const char* argv[] = { "tests.exe", "-SomethingWeird" }; CHECK(!newArgumentParser(argc, argv)); - STRCMP_EQUAL("usage [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", + STRCMP_EQUAL("usage [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-s [randomizerSeed]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", args->usage()); } From 1e849992171c3c5d136538bafbbd9334ba13b339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20R=C3=B8rtveit?= Date: Thu, 17 Jan 2019 09:49:16 +0100 Subject: [PATCH 0208/1093] Removed include --- tests/CppUTestExt/MockNamedValueTest.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/CppUTestExt/MockNamedValueTest.cpp b/tests/CppUTestExt/MockNamedValueTest.cpp index 00b6badd5..ef739c39a 100644 --- a/tests/CppUTestExt/MockNamedValueTest.cpp +++ b/tests/CppUTestExt/MockNamedValueTest.cpp @@ -27,7 +27,6 @@ #include "CppUTest/TestHarness.h" #include "CppUTestExt/MockNamedValue.h" -#include TEST_GROUP(ComparatorsAndCopiersRepository) { From d4ba948ea8080a8bc738b5fa5add7d7bce6c3bf2 Mon Sep 17 00:00:00 2001 From: Keita Kita Date: Wed, 6 Feb 2019 09:28:44 +0900 Subject: [PATCH 0209/1093] Add scoped enum support Scoped enumerations from C++11 are no implicit conversions from their values to integral types. Add two assertion macros. ENUMS_EQUAL_INT(excepted, actual) Compares two enums which their underlying type is int ENUMS_EQUAL_TYPE(underlying_type, excepted, actual) Compares two enums which they have the same underlying type --- README.md | 2 + include/CppUTest/UtestMacros.h | 24 +++++ tests/CppUTest/TestUTestMacro.cpp | 159 ++++++++++++++++++++++++++++++ 3 files changed, 185 insertions(+) diff --git a/README.md b/README.md index 663a84e25..24bb84020 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,8 @@ The failure of one of these macros causes the current test to immediately exit * BYTES_EQUAL(expected, actual) - Compares two numbers, eight bits wide * POINTERS_EQUAL(expected, actual) - Compares two const void * * DOUBLES_EQUAL(expected, actual, tolerance) - Compares two doubles within some tolerance +* ENUMS_EQUAL_INT(excepted, actual) - Compares two enums which their underlying type is int +* ENUMS_EQUAL_TYPE(underlying_type, excepted, actual) - Compares two enums which they have the same underlying type * FAIL(text) - always fails * TEST_EXIT - Exit the test without failure - useful for contract testing (implementing an assert fake) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 122c20a63..f2eb24f67 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -304,6 +304,30 @@ #define BITS_LOCATION(expected, actual, mask, text, file, line)\ { UtestShell::getCurrent()->assertBitsEqual(expected, actual, mask, sizeof(actual), text, file, line); } +#define ENUMS_EQUAL_INT(expected, actual)\ + ENUMS_EQUAL_TYPE(int, expected, actual) + +#define ENUMS_EQUAL_INT_TEXT(expected, actual, text)\ + ENUMS_EQUAL_TYPE_TEXT(int, expected, actual, text) + +#define ENUMS_EQUAL_TYPE(underlying_type, expected, actual)\ + ENUMS_EQUAL_TYPE_LOCATION(underlying_type, expected, actual, NULLPTR, __FILE__, __LINE__) + +#define ENUMS_EQUAL_TYPE_TEXT(underlying_type, expected, actual, text)\ + ENUMS_EQUAL_TYPE_LOCATION(underlying_type, expected, actual, text, __FILE__, __LINE__) + +#define ENUMS_EQUAL_TYPE_LOCATION(underlying_type, expected, actual, text, file, line)\ + { underlying_type expected_underlying_value = (underlying_type)(expected); \ + underlying_type actual_underlying_value = (underlying_type)(actual); \ + if (expected_underlying_value != actual_underlying_value) { \ + UtestShell::getCurrent()->assertEquals(true, StringFrom(expected_underlying_value).asCharString(), StringFrom(actual_underlying_value).asCharString(), text, file, line); \ + } \ + else \ + { \ + UtestShell::getCurrent()->assertLongsEqual((long)0, long(0), NULLPTR, file, line); \ + } \ + } + //Fail if you get to this macro //The macro FAIL may already be taken, so allow FAIL_TEST too #ifndef FAIL diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index 8d34107a2..8178741c6 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -1094,6 +1094,165 @@ IGNORE_TEST(UnitTestMacros, BITS_EQUAL_TEXTWorksInAnIgnoredTest) BITS_EQUAL_TEXT(0x00, 0xFF, 0xFF, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE +#if defined(__cplusplus) && __cplusplus >= 201103L +enum class ScopedIntEnum { + A, B +}; + +static void _ENUMS_EQUAL_INTWithScopedIntEnumTestMethod() +{ + ENUMS_EQUAL_INT(ScopedIntEnum::B, ScopedIntEnum::B); + ENUMS_EQUAL_INT(ScopedIntEnum::B, ScopedIntEnum::A); +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, TestENUMS_EQUAL_INTWithScopedIntEnum) +{ + fixture.runTestWithMethod(_ENUMS_EQUAL_INTWithScopedIntEnumTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0>"); +} + +TEST(UnitTestMacros, ENUMS_EQUAL_INTWithScopedIntEnumBehavesAsProperMacro) +{ + if (false) ENUMS_EQUAL_INT(ScopedIntEnum::B, ScopedIntEnum::A) + else ENUMS_EQUAL_INT(ScopedIntEnum::B, ScopedIntEnum::B) +} + +IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_INTWithScopedIntEnumWorksInAnIgnoredTest) +{ + ENUMS_EQUAL_INT(ScopedIntEnum::B, ScopedIntEnum::A); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +static void _ENUMS_EQUAL_INT_TEXTWithScopedIntEnumTestMethod() +{ + ENUMS_EQUAL_INT_TEXT(ScopedIntEnum::B, ScopedIntEnum::A, "Failed because it failed"); +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, TestENUMS_EQUAL_INT_TEXTWithScopedIntEnum) +{ + fixture.runTestWithMethod(_ENUMS_EQUAL_INT_TEXTWithScopedIntEnumTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); +} + +TEST(UnitTestMacros, ENUMS_EQUAL_INT_TEXTWithScopedIntEnumBehavesAsProperMacro) +{ + if (false) ENUMS_EQUAL_INT_TEXT(ScopedIntEnum::B, ScopedIntEnum::A, "Failed because it failed") + else ENUMS_EQUAL_INT_TEXT(ScopedIntEnum::B, ScopedIntEnum::B, "Failed because it failed") +} + +IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_EQUAL_INT_TEXTWithScopedIntEnumWorksInAnIgnoredTest) +{ + ENUMS_EQUAL_INT_TEXT(ScopedIntEnum::B, ScopedIntEnum::A, "Failed because it failed"); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +enum class ScopedLongEnum : long { + A, B +}; + +static void _ENUMS_EQUAL_TYPEWithScopedLongEnumTestMethod() +{ + ENUMS_EQUAL_TYPE(long, ScopedLongEnum::B, ScopedLongEnum::B); + ENUMS_EQUAL_TYPE(long, ScopedLongEnum::B, ScopedLongEnum::A); +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, TestENUMS_EQUAL_TYPEWithScopedLongEnum) +{ + fixture.runTestWithMethod(_ENUMS_EQUAL_TYPEWithScopedLongEnumTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0>"); +} + +TEST(UnitTestMacros, ENUMS_EQUAL_TYPEWithScopedLongEnumBehavesAsProperMacro) +{ + if (false) ENUMS_EQUAL_TYPE(long, ScopedLongEnum::B, ScopedLongEnum::A) + else ENUMS_EQUAL_TYPE(long, ScopedLongEnum::B, ScopedLongEnum::B) +} + +IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_TYPEWithScopedLongEnumWorksInAnIgnoredTest) +{ + ENUMS_EQUAL_TYPE(long, ScopedLongEnum::B, ScopedLongEnum::A); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +static void _ENUMS_EQUAL_TYPE_TEXTWithScopedLongEnumTestMethod() +{ + ENUMS_EQUAL_TYPE_TEXT(long, ScopedLongEnum::B, ScopedLongEnum::A, "Failed because it failed"); +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, TestENUMS_EQUAL_TYPE_TEXTWithScopedLongEnum) +{ + fixture.runTestWithMethod(_ENUMS_EQUAL_TYPE_TEXTWithScopedLongEnumTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); +} + +TEST(UnitTestMacros, ENUMS_EQUAL_TYPE_TEXTWithScopedLongEnumBehavesAsProperMacro) +{ + if (false) ENUMS_EQUAL_TYPE_TEXT(long, ScopedLongEnum::B, ScopedLongEnum::A, "Failed because it failed") + else ENUMS_EQUAL_TYPE_TEXT(long, ScopedLongEnum::B, ScopedLongEnum::B, "Failed because it failed") +} + +IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_EQUAL_TYPE_TEXTWithScopedLongEnumWorksInAnIgnoredTest) +{ + ENUMS_EQUAL_TYPE_TEXT(long, ScopedLongEnum::B, ScopedLongEnum::A, "Failed because it failed"); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +#endif + +enum UnscopedEnum { + UNSCOPED_ENUM_A, UNSCOPED_ENUM_B +}; + +static void _ENUMS_EQUAL_INTWithUnscopedEnumTestMethod() +{ + ENUMS_EQUAL_INT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_B); + ENUMS_EQUAL_INT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A); +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, TestENUMS_EQUAL_INTWithUnscopedEnum) +{ + fixture.runTestWithMethod(_ENUMS_EQUAL_INTWithUnscopedEnumTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0>"); +} + +TEST(UnitTestMacros, ENUMS_EQUAL_INTWithUnscopedEnumBehavesAsProperMacro) +{ + if (false) ENUMS_EQUAL_INT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A) + else ENUMS_EQUAL_INT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_B) +} + +IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_INTWithUnscopedEnumWorksInAnIgnoredTest) +{ + ENUMS_EQUAL_INT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +static void _ENUMS_EQUAL_INT_TEXTWithUnscopedEnumTestMethod() +{ + ENUMS_EQUAL_INT_TEXT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A, "Failed because it failed"); +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, TestENUMS_EQUAL_INT_TEXTWithUnscopedEnum) +{ + fixture.runTestWithMethod(_ENUMS_EQUAL_INT_TEXTWithUnscopedEnumTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); +} + +TEST(UnitTestMacros, ENUMS_EQUAL_INT_TEXTWithUnscopedEnumBehavesAsProperMacro) +{ + if (false) ENUMS_EQUAL_INT_TEXT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A, "Failed because it failed") + else ENUMS_EQUAL_INT_TEXT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_B, "Failed because it failed") +} + +IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_EQUAL_INT_TEXTWithUnscopedEnumWorksInAnIgnoredTest) +{ + ENUMS_EQUAL_INT_TEXT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A, "Failed because it failed"); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + #if CPPUTEST_USE_STD_CPP_LIB static void _failingTestMethod_NoThrowWithCHECK_THROWS() { From c2752af9df7e0e47819b0af5580ad76b1752e772 Mon Sep 17 00:00:00 2001 From: Risto-Matti Vuonnala Date: Mon, 14 Jan 2019 10:55:47 +0200 Subject: [PATCH 0210/1093] Address review comments and fix CI - Use defines for reserved values of random seed - Removed some redundant unit tests - Remove use of C++ standard library headers: -- Implement own shuffle algorithm instead of using random_shuffle from -- Use dynamic array instead of vector from - Implement and use AtoU to parse unsigned integers from strings - Remove dead code from TestResult - Better unit test coverage Also other improvements: - Randomizer seed is printed on the same line as the test result summary - Document the shuffling feature in the manual --- Makefile.am | 1 + README.md | 1 + include/CppUTest/CommandLineArguments.h | 2 +- include/CppUTest/Shuffle.h | 59 ++++++++++++++ include/CppUTest/SimpleString.h | 2 + include/CppUTest/StandardCLibrary.h | 2 - include/CppUTest/TestRegistry.h | 3 +- include/CppUTest/TestResult.h | 6 -- src/CppUTest/CommandLineArguments.cpp | 13 +-- src/CppUTest/CommandLineTestRunner.cpp | 29 +++---- src/CppUTest/SimpleString.cpp | 22 ++++++ src/CppUTest/TestOutput.cpp | 15 ++-- src/CppUTest/TestRegistry.cpp | 29 ++++--- src/CppUTest/TestResult.cpp | 6 +- tests/CppUTest/CMakeLists.txt | 1 + tests/CppUTest/CommandLineArgumentsTest.cpp | 61 +++++++------- tests/CppUTest/CommandLineTestRunnerTest.cpp | 22 ++++++ tests/CppUTest/ShuffleTest.cpp | 83 ++++++++++++++++++++ tests/CppUTest/SimpleStringTest.cpp | 29 +++++++ tests/CppUTest/TestRegistryTest.cpp | 47 +++++++++++ 20 files changed, 348 insertions(+), 85 deletions(-) create mode 100644 include/CppUTest/Shuffle.h create mode 100644 tests/CppUTest/ShuffleTest.cpp diff --git a/Makefile.am b/Makefile.am index fa951dbdc..4ef0c6b02 100644 --- a/Makefile.am +++ b/Makefile.am @@ -153,6 +153,7 @@ CppUTestTests_SOURCES = \ tests/CppUTest/SetPluginTest.cpp \ tests/CppUTest/SimpleStringTest.cpp \ tests/CppUTest/SimpleMutexTest.cpp \ + tests/CppUTest/ShuffleTest.cpp \ tests/CppUTest/TeamCityOutputTest.cpp \ tests/CppUTest/TestFailureNaNTest.cpp \ tests/CppUTest/TestFailureTest.cpp \ diff --git a/README.md b/README.md index 663a84e25..cd404e8aa 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,7 @@ TEST(FirstTestGroup, FirstTest) * -v verbose, print each test name as it runs * -r# repeat the tests some number of times, default is one, default if # is not specified is 2. This is handy if you are experiencing memory leaks related to statics and caches. +* -s# random shuffle the test execution order. # is an integer used for seeding the random number generator. # is optional, and if omitted, the seed value is chosen automatically, which results in a different order every time. The seed value is printed to console to make it possible to reproduce a previously generated execution order. Handy for detecting problems related to dependencies between tests. * -g group only run test whose group contains the substring group * -n name only run test whose name contains the substring name diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index a71328a9c..bdaf5c218 100755 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -73,7 +73,7 @@ class CommandLineArguments bool listTestGroupAndCaseNames_; bool runIgnored_; int repeat_; - unsigned int shuffle_; // 0: shuffling disabled, 1: random seed, other values: specific random seed + unsigned int shuffle_; TestFilter* groupFilters_; TestFilter* nameFilters_; OutputType outputType_; diff --git a/include/CppUTest/Shuffle.h b/include/CppUTest/Shuffle.h new file mode 100644 index 000000000..a08179a75 --- /dev/null +++ b/include/CppUTest/Shuffle.h @@ -0,0 +1,59 @@ +/* + * 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 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 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. + */ + +#ifndef D_Shuffle_h +#define D_Shuffle_h + +#include "StandardCLibrary.h" + + +#define SHUFFLE_DISABLED 0 +#define SHUFFLE_ENABLED_RANDOM_SEED 1 +#define SHUFFLE_SEED_MINIMUM_VALUE 2 + +typedef int (*rand_func_t)(void); + +// wrapper needed for translating calling convention on Watcom/DOS +static inline int rand_(void) // rand_func_t +{ + return rand(); +} + +// "Durstenfeld shuffle" according to Wikipedia +static inline void shuffle_list(rand_func_t rand_func, int numElems, void* listToShuffleInPlace[]) +{ + for (int i = numElems - 1; i >= 1; --i) + { + int j = rand_func() % (i + 1); // distribution biased by modulo, but good enough for shuffling + void* e1 = listToShuffleInPlace[j]; + void* e2 = listToShuffleInPlace[i]; + listToShuffleInPlace[i] = e1; + listToShuffleInPlace[j] = e2; + } +} + +#endif diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index bfe8b7b44..c54c78019 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -93,6 +93,8 @@ class SimpleString static void setStringAllocator(TestMemoryAllocator* allocator); static int AtoI(const char*str); + static unsigned AtoU(const char*str, bool& wasAbleToParseADigit); + static unsigned AtoU(const char*str); static int StrCmp(const char* s1, const char* s2); static size_t StrLen(const char*); static int StrNCmp(const char* s1, const char* s2, size_t n); diff --git a/include/CppUTest/StandardCLibrary.h b/include/CppUTest/StandardCLibrary.h index f3a0a51b9..ee132dc03 100644 --- a/include/CppUTest/StandardCLibrary.h +++ b/include/CppUTest/StandardCLibrary.h @@ -15,8 +15,6 @@ #ifdef __cplusplus #if CPPUTEST_USE_STD_CPP_LIB #include - #include - #include #endif #endif diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index 0c4b82ee8..83a79c936 100755 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -35,6 +35,7 @@ #include "SimpleString.h" #include "TestFilter.h" +#include "Shuffle.h" class UtestShell; class TestResult; @@ -50,7 +51,7 @@ class TestRegistry virtual void unDoLastAddTest(); virtual int countTests(); virtual void runAllTests(TestResult& result); - virtual void shuffleRunOrder(); + virtual void shuffleRunOrder(rand_func_t); virtual void listTestGroupNames(TestResult& result); virtual void listTestGroupAndCaseNames(TestResult& result); virtual void setNameFilters(const TestFilter* filters); diff --git a/include/CppUTest/TestResult.h b/include/CppUTest/TestResult.h index 5f1da5077..f61194648 100644 --- a/include/CppUTest/TestResult.h +++ b/include/CppUTest/TestResult.h @@ -57,7 +57,6 @@ class TestResult virtual void countCheck(); virtual void countFilteredOut(); virtual void countIgnored(); - virtual void setShuffleSeed(unsigned int); virtual void addFailure(const TestFailure& failure); virtual void print(const char* text); @@ -85,10 +84,6 @@ class TestResult { return failureCount_; } - unsigned int getShuffleSeed() const - { - return shuffleSeed_; - } long getTotalExecutionTime() const; void setTotalExecutionTime(long exTime); @@ -104,7 +99,6 @@ class TestResult int failureCount_; int filteredOutCount_; int ignoredCount_; - unsigned int shuffleSeed_; long totalExecutionTime_; long timeStarted_; long currentTestTimeStarted_; diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index fc9a9ca84..2346584ec 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -25,12 +25,13 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "CppUTest/Shuffle.h" #include "CppUTest/TestHarness.h" #include "CppUTest/CommandLineArguments.h" #include "CppUTest/PlatformSpecificFunctions.h" CommandLineArguments::CommandLineArguments(int ac, const char *const *av) : - ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), repeat_(1), shuffle_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) + ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), repeat_(1), shuffle_(SHUFFLE_DISABLED), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) { } @@ -157,13 +158,15 @@ void CommandLineArguments::SetRepeatCount(int ac, const char *const *av, int& i) void CommandLineArguments::SetShuffle(int ac, const char * const *av, int& i) { - shuffle_ = 1; + shuffle_ = SHUFFLE_ENABLED_RANDOM_SEED; SimpleString shuffleParameter(av[i]); if (shuffleParameter.size() > 2) { - shuffle_ = SimpleString::AtoI(av[i] + 2); + shuffle_ = SimpleString::AtoU(av[i] + 2); } else if (i + 1 < ac) { - const int parsed = SimpleString::AtoI(av[i + 1]); - if (parsed != 0) { + bool wasAbleToParseDigit = false; + const unsigned parsed = SimpleString::AtoU(av[i + 1], wasAbleToParseDigit); + if (wasAbleToParseDigit) + { i++; shuffle_ = parsed; } diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 61c482c2e..544893739 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -96,16 +96,17 @@ void CommandLineTestRunner::initializeTestRun() if (arguments_->isRunIgnored()) registry_->setRunIgnored(); } -static unsigned int getSeed(unsigned int shuffleArg) +static unsigned getSeed(unsigned shuffleArg) { - if (shuffleArg > 1) return shuffleArg; + if (shuffleArg != SHUFFLE_ENABLED_RANDOM_SEED) return shuffleArg; - const unsigned int generatedSeed = GetPlatformSpecificTimeInMillis(); + const unsigned generatedSeed = static_cast(GetPlatformSpecificTimeInMillis()); // do not allow seed values 0 or 1 because they cannot be given as cmd line arguments - if (generatedSeed > 1) return generatedSeed; + // (0 and 1 overloaded by SHUFFLE_DISABLED and SHUFFLE_ENABLED_RANDOM_SEED) + if (generatedSeed < SHUFFLE_SEED_MINIMUM_VALUE) return SHUFFLE_SEED_MINIMUM_VALUE; - return 2; + return generatedSeed; } int CommandLineTestRunner::runAllTests() @@ -128,32 +129,26 @@ int CommandLineTestRunner::runAllTests() registry_->listTestGroupAndCaseNames(tr); return 0; } - const bool shuffleEnabled = arguments_->getShuffle() != 0; - unsigned int seed = 0; + const bool shuffleEnabled = arguments_->getShuffle() != SHUFFLE_DISABLED; if (shuffleEnabled) { - seed = getSeed(arguments_->getShuffle()); - output_->print("Test order shuffling enabled, seed: "); + const unsigned seed = getSeed(arguments_->getShuffle()); + output_->setShuffleSeed(seed); + output_->print("Test order shuffling enabled with seed: "); output_->print(seed); output_->print("\n"); - std::srand(seed); + srand(seed); } while (loopCount++ < repeat_) { if (shuffleEnabled) { - registry_->shuffleRunOrder(); + registry_->shuffleRunOrder(rand_); } output_->printTestRun(loopCount, repeat_); TestResult tr(*output_); registry_->runAllTests(tr); failureCount += tr.getFailureCount(); } - if (shuffleEnabled && arguments_->isVerbose()) - { - output_->print("Random seed was: "); - output_->print(seed); - output_->print("\n"); - } return failureCount; } diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 93ce72bae..10db92b63 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -62,6 +62,28 @@ char* SimpleString::getEmptyString() const return empty; } +// does not support + or - prefixes +unsigned SimpleString::AtoU(const char* str, bool& wasAbleToParseADigit) +{ + while (isSpace(*str)) str++; + + wasAbleToParseADigit = false; + unsigned result = 0; + for(; isDigit(*str) && *str >= '0'; str++) + { + wasAbleToParseADigit = true; + result *= 10; + result += static_cast(*str - '0'); + } + return result; +} + +unsigned SimpleString::AtoU(const char* str) +{ + bool dummy; + return AtoU(str, dummy); +} + int SimpleString::AtoI(const char* str) { while (isSpace(*str)) str++; diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index 0cd35f78f..4d8a8d8a3 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -24,7 +24,7 @@ * (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/Shuffle.h" #include "CppUTest/TestHarness.h" #include "CppUTest/TestOutput.h" #include "CppUTest/PlatformSpecificFunctions.h" @@ -45,7 +45,7 @@ TestOutput::WorkingEnvironment TestOutput::getWorkingEnvironment() TestOutput::TestOutput() : - dotCount_(0), verbose_(false), color_(false), shuffleSeed_(0), progressIndication_(".") + dotCount_(0), verbose_(false), color_(false), shuffleSeed_(SHUFFLE_DISABLED), progressIndication_(".") { } @@ -145,7 +145,8 @@ void TestOutput::printCurrentGroupEnded(const TestResult& /*res*/) void TestOutput::printTestsEnded(const TestResult& result) { print("\n"); - if (result.getFailureCount() > 0) { + const bool anyTestFailed = result.getFailureCount() > 0; + if (anyTestFailed) { if (color_) { print("\033[31;1m"); } @@ -167,11 +168,13 @@ void TestOutput::printTestsEnded(const TestResult& result) print(" checks, "); print(result.getIgnoredCount()); print(" ignored, "); - if (shuffleSeed_ != 0) { - printf("0x%08X seed, ", shuffleSeed_); - } print(result.getFilteredOutCount()); print(" filtered out, "); + if (shuffleSeed_ != SHUFFLE_DISABLED && (verbose_ || anyTestFailed)) { + print("shuffle seed was: "); + print(shuffleSeed_); + print(", "); + } print(result.getTotalExecutionTime()); print(" ms)"); if (color_) { diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 6c5f96fa6..75c88dc47 100644 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -227,21 +227,32 @@ UtestShell* TestRegistry::getFirstTest() return tests_; } -void TestRegistry::shuffleRunOrder() + +void TestRegistry::shuffleRunOrder(rand_func_t rand_func) { - std::vector tests; - for (UtestShell *test = tests_; test != NULL; test = test->getNext()) { - tests.push_back(test); + if (getFirstTest() == NULLPTR) + { + return; + } + int numTests = getFirstTest()->countTests(); + typedef UtestShell* listElem; + listElem* tests = new listElem[numTests]; + UtestShell *test = getFirstTest(); + for (int testsIdx = 0; testsIdx < numTests; ++testsIdx) + { + tests[testsIdx] = test; + test = test->getNext(); } - std::random_shuffle(tests.begin(), tests.end()); + shuffle_list(rand_func, numTests, reinterpret_cast(tests)); - // Store shuffled vector back to linked list - UtestShell *prev = NULL; - for (size_t i = 0; i < tests.size(); ++i) + // Store shuffled list back to linked list + UtestShell *prev = NULLPTR; + for (int i = 0; i < numTests; ++i) { - prev = tests[i]->addTest(prev); + prev = tests[numTests - 1 - i]->addTest(prev); } tests_ = prev; + delete[] tests; } UtestShell* TestRegistry::getTestWithNext(UtestShell* test) diff --git a/src/CppUTest/TestResult.cpp b/src/CppUTest/TestResult.cpp index ac24dfe55..90c215d69 100644 --- a/src/CppUTest/TestResult.cpp +++ b/src/CppUTest/TestResult.cpp @@ -32,7 +32,7 @@ #include "CppUTest/PlatformSpecificFunctions.h" TestResult::TestResult(TestOutput& p) : - output_(p), testCount_(0), runCount_(0), checkCount_(0), failureCount_(0), filteredOutCount_(0), ignoredCount_(0), shuffleSeed_(0), totalExecutionTime_(0), timeStarted_(0), currentTestTimeStarted_(0), + output_(p), testCount_(0), runCount_(0), checkCount_(0), failureCount_(0), filteredOutCount_(0), ignoredCount_(0), totalExecutionTime_(0), timeStarted_(0), currentTestTimeStarted_(0), currentTestTotalExecutionTime_(0), currentGroupTimeStarted_(0), currentGroupTotalExecutionTime_(0) { } @@ -76,10 +76,6 @@ void TestResult::addFailure(const TestFailure& failure) output_.printFailure(failure); failureCount_++; } -void TestResult::setShuffleSeed(unsigned int shuffleSeed) -{ - shuffleSeed_ = shuffleSeed; -} void TestResult::countTest() { diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index abc66169c..7df07c1dd 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -22,6 +22,7 @@ set(CppUTestTests_src TestOutputTest.cpp AllocLetTestFreeTest.cpp TestRegistryTest.cpp + ShuffleTest.cpp AllocationInCFile.c PluginTest.cpp TestResultTest.cpp diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index 5c6801b79..7c79728c1 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -67,12 +67,9 @@ TEST_GROUP(CommandLineArguments) return args->parse(plugin); } - void shuffleDisturbTest(int argc, const char* argv[], unsigned int expectedShuffle) + void shuffleTest(int argc, const char* argv[], unsigned int expectedShuffle) { CHECK(newArgumentParser(argc, argv)); - TestFilter groupFilter("group"); - groupFilter.strictMatching(); - CHECK_EQUAL(groupFilter, *args->getGroupFilters()); CHECK_EQUAL(args->getShuffle(), expectedShuffle); } }; @@ -117,15 +114,31 @@ TEST(CommandLineArguments, repeatSetDefaultsToTwoAndShuffleDisabled) const char* argv[] = { "tests.exe", "-r" }; CHECK(newArgumentParser(argc, argv)); LONGS_EQUAL(2, args->getRepeatCount()); - CHECK_EQUAL(args->getShuffle(), 0); + CHECK_EQUAL(args->getShuffle(), SHUFFLE_DISABLED); } TEST(CommandLineArguments, shuffleEnabled) { - int argc = 2; const char* argv[] = { "tests.exe", "-s" }; - CHECK(newArgumentParser(argc, argv)); - CHECK_EQUAL(args->getShuffle(), 1); + shuffleTest(2, argv, SHUFFLE_ENABLED_RANDOM_SEED); +} + +TEST(CommandLineArguments, shuffleDisabledCase1) +{ + const char* argv[] = { "tests.exe", "-s0" }; + shuffleTest(2, argv, SHUFFLE_DISABLED); +} + +TEST(CommandLineArguments, shuffleDisabledCase2) +{ + const char* argv[] = { "tests.exe", "-s 0" }; + shuffleTest(2, argv, SHUFFLE_DISABLED); +} + +TEST(CommandLineArguments, shuffleDisabledCase3) +{ + const char* argv[] = { "tests.exe", "-s", "0" }; + shuffleTest(3, argv, SHUFFLE_DISABLED); } TEST(CommandLineArguments, shuffleEnabledSpecificSeedCase1) @@ -152,33 +165,15 @@ TEST(CommandLineArguments, shuffleEnabledSpecificSeedCase3) CHECK_EQUAL(args->getShuffle(), 777); } -TEST(CommandLineArguments, shuffleBeforeDoesNotDisturbOtherSwitchCase1) +TEST(CommandLineArguments, shuffleBeforeDoesNotDisturbOtherSwitch) { + int argc = 4; const char* argv[] = { "tests.exe", "-s", "-sg", "group" }; - shuffleDisturbTest(4, argv, 1); -} - -TEST(CommandLineArguments, shuffleBeforeDoesNotDisturbOtherSwitchCase2) -{ - const char* argv[] = { "tests.exe", "-s55", "-sg", "group" }; - shuffleDisturbTest(4, argv, 55); -} -TEST(CommandLineArguments, shuffleBeforeDoesNotDisturbOtherSwitchCase3) -{ - const char* argv[] = { "tests.exe", "-s 66", "-sg", "group" }; - shuffleDisturbTest(4, argv, 66); -} - -TEST(CommandLineArguments, shuffleBeforeDoesNotDisturbOtherSwitchCase4) -{ - const char* argv[] = { "tests.exe", "-s", "77", "-sg", "group" }; - shuffleDisturbTest(5, argv, 77); -} - -TEST(CommandLineArguments, shuffleAfterDoesNotDisturbOtherSwitch) -{ - const char* argv[] = { "tests.exe", "-sg", "group", "-s"}; - shuffleDisturbTest(4, argv, 1); + CHECK(newArgumentParser(argc, argv)); + TestFilter groupFilter("group"); + groupFilter.strictMatching(); + CHECK_EQUAL(groupFilter, *args->getGroupFilters()); + CHECK_EQUAL(args->getShuffle(), SHUFFLE_ENABLED_RANDOM_SEED); } TEST(CommandLineArguments, runningTestsInSeperateProcesses) diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index cb468b711..3156ca9b8 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -105,6 +105,13 @@ TEST_GROUP(CommandLineTestRunner) delete pluginCountingPlugin; delete oneTest_; } + + SimpleString runAndGetOutput(const int argc, const char* argv[]) + { + CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(argc, argv, ®istry); + commandLineTestRunner.runAllTestsMain(); + return commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput(); + } }; TEST(CommandLineTestRunner, OnePluginGetsInstalledDuringTheRunningTheTests) @@ -179,6 +186,21 @@ TEST(CommandLineTestRunner, listTestGroupAndCaseNamesShouldWorkProperly) STRCMP_CONTAINS("group.test", commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().asCharString()); } +TEST(CommandLineTestRunner, randomShuffleSeedIsPrinted) +{ + const char* argv[] = { "tests.exe", "-s"}; + SimpleString text = runAndGetOutput(2, argv); + STRCMP_CONTAINS("shuffling enabled with seed:", text.asCharString()); +} + +TEST(CommandLineTestRunner, specificShuffleSeedIsPrintedVerbose) +{ + const char* argv[] = { "tests.exe", "-s2", "-v"}; + SimpleString text = runAndGetOutput(3, argv); + STRCMP_CONTAINS("shuffling enabled with seed: 2", text.asCharString()); + STRCMP_CONTAINS("shuffle seed was: 2", text.asCharString()); +} + extern "C" { typedef PlatformSpecificFile (*FOpenFunc)(const char*, const char*); typedef void (*FPutsFunc)(const char*, PlatformSpecificFile); diff --git a/tests/CppUTest/ShuffleTest.cpp b/tests/CppUTest/ShuffleTest.cpp new file mode 100644 index 000000000..a51bfac83 --- /dev/null +++ b/tests/CppUTest/ShuffleTest.cpp @@ -0,0 +1,83 @@ +/* + * 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 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 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/Shuffle.h" +#include "CppUTest/TestHarness.h" +#include "CppUTest/TestOutput.h" + +TEST_GROUP(ShuffleTest) +{ +}; + +static const int maxNumItems = 3; + +static int getZero() +{ + return 0; +} + +static int getOne() +{ + return 1; +} + +static int getValueExceedingMaxIdx() +{ + return maxNumItems + 1; +} + +TEST(ShuffleTest, ShuffleListTest) +{ + int x0 = 0; + int x1 = 1; + int x2 = 2; + void* tests[maxNumItems] = {&x0, &x1, &x2}; + + // check no-op + shuffle_list(getValueExceedingMaxIdx, 0, tests); + CHECK(tests[0] == &x0); + CHECK(tests[1] == &x1); + CHECK(tests[2] == &x2); + + // swap element with itself: 0, [1], 2 --> 0, 1, 2 + shuffle_list(getOne, 1, tests); + CHECK(tests[0] == &x0); + CHECK(tests[1] == &x1); + CHECK(tests[2] == &x2); + + // always swaps with element at index 0: [0], 1, [2] --> [2], [1], 0 --> 1, 2, 0 + shuffle_list(getZero, maxNumItems, tests); + CHECK(tests[0] == &x1); + CHECK(tests[1] == &x2); + CHECK(tests[2] == &x0); + + // swaps with 4 mod 3 (1) then 4 mod 2 (0): 1, [2], [0] --> [1], [0], 2 --> 0, 1, 2 + shuffle_list(getValueExceedingMaxIdx, maxNumItems, tests); + CHECK(tests[0] == &x0); + CHECK(tests[1] == &x1); + CHECK(tests[2] == &x2); +} diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 9863ce476..996f52d4e 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -939,6 +939,35 @@ TEST(SimpleString, AtoI) CHECK(32767 == SimpleString::AtoI(max_short_str)); } +TEST(SimpleString, AtoU) +{ + char max_short_str[] = "65535"; + CHECK(12345 == SimpleString::AtoU("012345")); + CHECK(6789 == SimpleString::AtoU("6789")); + CHECK(12345 == SimpleString::AtoU("12345/")); + CHECK(12345 == SimpleString::AtoU("12345:")); + CHECK(123 == SimpleString::AtoU("\t \r\n123")); + CHECK(123 == SimpleString::AtoU("123-foo")); + CHECK(65535 == SimpleString::AtoU(max_short_str)); + + bool parsedDigit; + + CHECK(0 == SimpleString::AtoU("foo", parsedDigit)); + CHECK_FALSE(parsedDigit); + + CHECK(0 == SimpleString::AtoU("-foo", parsedDigit)); + CHECK_FALSE(parsedDigit); + + CHECK(0 == SimpleString::AtoU("+1", parsedDigit)); + CHECK_FALSE(parsedDigit); + + CHECK(0 == SimpleString::AtoU("-1", parsedDigit)); + CHECK_FALSE(parsedDigit); + + CHECK(0 == SimpleString::AtoU("0", parsedDigit)); + CHECK_TRUE(parsedDigit); +} + TEST(SimpleString, Binary) { const unsigned char value[] = { 0x00, 0x01, 0x2A, 0xFF }; diff --git a/tests/CppUTest/TestRegistryTest.cpp b/tests/CppUTest/TestRegistryTest.cpp index 9e6882e07..387447db5 100644 --- a/tests/CppUTest/TestRegistryTest.cpp +++ b/tests/CppUTest/TestRegistryTest.cpp @@ -359,3 +359,50 @@ TEST(TestRegistry, listTestGroupAndCaseNames_shouldListBackwardsGroupATestaAfter SimpleString s = output->getOutput(); STRCMP_EQUAL("GROUP_A.test_aa GROUP_B.test_b GROUP_A.test_a", s.asCharString()); } + +static int getZero() +{ + return 0; +} + +TEST(TestRegistry, shuffleEmptyListIsNoOp) +{ + CHECK_TRUE(myRegistry->getFirstTest() == NULLPTR); + myRegistry->shuffleRunOrder(getZero); + CHECK_TRUE(myRegistry->getFirstTest() == NULLPTR); +} + +TEST(TestRegistry, shuffleSingleTestIsNoOp) +{ + myRegistry->addTest(test1); + myRegistry->shuffleRunOrder(getZero); + CHECK_TRUE(myRegistry->getFirstTest() == test1); +} + +TEST(TestRegistry, shuffleTestList) +{ + myRegistry->addTest(test3); + myRegistry->addTest(test2); + myRegistry->addTest(test1); + + UtestShell* first_before = myRegistry->getFirstTest(); + UtestShell* second_before = first_before->getNext(); + UtestShell* third_before = second_before->getNext(); + + CHECK_TRUE(first_before == test1); + CHECK_TRUE(second_before == test2); + CHECK_TRUE(third_before == test3); + CHECK_TRUE(third_before->getNext() == NULLPTR); + + // shuffle always with element at index 0: [1] 2 [3] --> [3] [2] 1 --> 2 3 1 + myRegistry->shuffleRunOrder(getZero); + + UtestShell* first_after = myRegistry->getFirstTest(); + UtestShell* second_after = first_after->getNext(); + UtestShell* third_after = second_after->getNext(); + + CHECK_TRUE(first_after == test2); + CHECK_TRUE(second_after == test3); + CHECK_TRUE(third_after == test1); + CHECK_TRUE(third_after->getNext() == NULLPTR); +} From d0eb9bd90021b1c7e602d32a409420cebaadd6d1 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Sat, 23 Feb 2019 23:11:42 +0200 Subject: [PATCH 0211/1093] Support Microsoft UWP platform by providing an alternative timer function in VisualCppTimeInMillis due to absence of timeGetTime() API in UWP (TIMERR_NOERROR can be used to detect presence of timeGetTime() API). --- src/Platforms/VisualCpp/UtestPlatform.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index 608c5fd21..d790e8b08 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -77,7 +77,26 @@ TestOutput::WorkingEnvironment PlatformSpecificGetWorkingEnvironment() static long VisualCppTimeInMillis() { - return timeGetTime(); + static LARGE_INTEGER s_frequency; + static const BOOL s_use_qpc = QueryPerformanceFrequency(&s_frequency); + if (s_use_qpc) + { + LARGE_INTEGER now; + QueryPerformanceCounter(&now); + return (now.QuadPart * 1000) / s_frequency.QuadPart; + } + else + { + #ifdef TIMERR_NOERROR + return timeGetTime(); + #else + #if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_VISTA) || (_WIN32_WINNT < _WIN32_WINNT_VISTA) + return GetTickCount(); + #else + return GetTickCount64(); + #endif + #endif + } } long (*GetPlatformSpecificTimeInMillis)() = VisualCppTimeInMillis; From 794b3bc8e1e724b6b3c559b7aab7edd84a229428 Mon Sep 17 00:00:00 2001 From: Dmitry Kostjuchenko Date: Mon, 25 Feb 2019 14:38:50 +0200 Subject: [PATCH 0212/1093] Corrected warning by casting to long type. --- src/Platforms/VisualCpp/UtestPlatform.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index d790e8b08..3316f9e26 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -83,7 +83,7 @@ static long VisualCppTimeInMillis() { LARGE_INTEGER now; QueryPerformanceCounter(&now); - return (now.QuadPart * 1000) / s_frequency.QuadPart; + return (long)((now.QuadPart * 1000) / s_frequency.QuadPart); } else { @@ -93,7 +93,7 @@ static long VisualCppTimeInMillis() #if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_VISTA) || (_WIN32_WINNT < _WIN32_WINNT_VISTA) return GetTickCount(); #else - return GetTickCount64(); + return (long)GetTickCount64(); #endif #endif } From 5e75305656119dd3632365e1b164ca7c0c9b6cc8 Mon Sep 17 00:00:00 2001 From: Risto-Matti Vuonnala Date: Tue, 26 Feb 2019 23:16:15 +0200 Subject: [PATCH 0213/1093] Address more review comments Remove output parameter from AtoU. As a consequence, seed value 0 (-s 0) is now treated as an invalid command line parameter. It was redundant anyway, because value 0, i.e., "shuffle disabled" is the default when -s is not given. Also cover rand_() in unit tests. --- include/CppUTest/CommandLineArguments.h | 2 +- include/CppUTest/SimpleString.h | 1 - src/CppUTest/CommandLineArguments.cpp | 18 ++++++----- src/CppUTest/SimpleString.cpp | 10 +----- tests/CppUTest/CommandLineArgumentsTest.cpp | 33 ++++++++++---------- tests/CppUTest/CommandLineTestRunnerTest.cpp | 8 ++++- tests/CppUTest/SimpleStringTest.cpp | 22 +++---------- 7 files changed, 41 insertions(+), 53 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index bdaf5c218..e72bdf6dd 100755 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -81,7 +81,7 @@ class CommandLineArguments SimpleString getParameterField(int ac, const char *const *av, int& i, const SimpleString& parameterName); void SetRepeatCount(int ac, const char *const *av, int& index); - void SetShuffle(int ac, const char *const *av, int& index); + bool SetShuffle(int ac, const char *const *av, int& index); void AddGroupFilter(int ac, const char *const *av, int& index); void AddStrictGroupFilter(int ac, const char *const *av, int& index); void AddExcludeGroupFilter(int ac, const char *const *av, int& index); diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index c54c78019..2d47882ce 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -93,7 +93,6 @@ class SimpleString static void setStringAllocator(TestMemoryAllocator* allocator); static int AtoI(const char*str); - static unsigned AtoU(const char*str, bool& wasAbleToParseADigit); static unsigned AtoU(const char*str); static int StrCmp(const char* s1, const char* s2); static size_t StrLen(const char*); diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 2346584ec..0358bc53d 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -70,7 +70,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument.startsWith("-sn")) AddStrictNameFilter(ac_, av_, i); else if (argument.startsWith("-xn")) AddExcludeNameFilter(ac_, av_, i); else if (argument.startsWith("-xsn")) AddExcludeStrictNameFilter(ac_, av_, i); - else if (argument.startsWith("-s")) SetShuffle(ac_, av_, i); + else if (argument.startsWith("-s")) correctParameters = SetShuffle(ac_, av_, i); else if (argument.startsWith("TEST(")) AddTestToRunBasedOnVerboseOutput(ac_, av_, i, "TEST("); else if (argument.startsWith("IGNORE_TEST(")) AddTestToRunBasedOnVerboseOutput(ac_, av_, i, "IGNORE_TEST("); else if (argument.startsWith("-o")) correctParameters = SetOutputType(ac_, av_, i); @@ -79,6 +79,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else correctParameters = false; if (correctParameters == false) { + shuffle_ = SHUFFLE_DISABLED; return false; } } @@ -87,7 +88,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) const char* CommandLineArguments::usage() const { - return "usage [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-s [randomizerSeed]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; + return "usage [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; } bool CommandLineArguments::isVerbose() const @@ -156,21 +157,24 @@ void CommandLineArguments::SetRepeatCount(int ac, const char *const *av, int& i) } -void CommandLineArguments::SetShuffle(int ac, const char * const *av, int& i) +bool CommandLineArguments::SetShuffle(int ac, const char * const *av, int& i) { shuffle_ = SHUFFLE_ENABLED_RANDOM_SEED; SimpleString shuffleParameter(av[i]); if (shuffleParameter.size() > 2) { shuffle_ = SimpleString::AtoU(av[i] + 2); + if (shuffle_ == SHUFFLE_DISABLED) { + return false; + } } else if (i + 1 < ac) { - bool wasAbleToParseDigit = false; - const unsigned parsed = SimpleString::AtoU(av[i + 1], wasAbleToParseDigit); - if (wasAbleToParseDigit) + const unsigned parsed = SimpleString::AtoU(av[i + 1]); + if (parsed != 0) { - i++; shuffle_ = parsed; + i++; } } + return true; } SimpleString CommandLineArguments::getParameterField(int ac, const char * const *av, int& i, const SimpleString& parameterName) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 10db92b63..29f164710 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -63,27 +63,19 @@ char* SimpleString::getEmptyString() const } // does not support + or - prefixes -unsigned SimpleString::AtoU(const char* str, bool& wasAbleToParseADigit) +unsigned SimpleString::AtoU(const char* str) { while (isSpace(*str)) str++; - wasAbleToParseADigit = false; unsigned result = 0; for(; isDigit(*str) && *str >= '0'; str++) { - wasAbleToParseADigit = true; result *= 10; result += static_cast(*str - '0'); } return result; } -unsigned SimpleString::AtoU(const char* str) -{ - bool dummy; - return AtoU(str, dummy); -} - int SimpleString::AtoI(const char* str) { while (isSpace(*str)) str++; diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index 7c79728c1..07f7fa8fe 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -70,7 +70,12 @@ TEST_GROUP(CommandLineArguments) void shuffleTest(int argc, const char* argv[], unsigned int expectedShuffle) { CHECK(newArgumentParser(argc, argv)); - CHECK_EQUAL(args->getShuffle(), expectedShuffle); + CHECK_EQUAL(expectedShuffle, args->getShuffle()); + } + void shuffleInvalidParamTest(int argc, const char* argv[]) + { + CHECK_FALSE(newArgumentParser(argc, argv)); + CHECK_EQUAL(SHUFFLE_DISABLED, args->getShuffle()); } }; @@ -123,46 +128,40 @@ TEST(CommandLineArguments, shuffleEnabled) shuffleTest(2, argv, SHUFFLE_ENABLED_RANDOM_SEED); } -TEST(CommandLineArguments, shuffleDisabledCase1) +TEST(CommandLineArguments, shuffleInvalidParamCase1) { const char* argv[] = { "tests.exe", "-s0" }; - shuffleTest(2, argv, SHUFFLE_DISABLED); + shuffleInvalidParamTest(2, argv); } -TEST(CommandLineArguments, shuffleDisabledCase2) +TEST(CommandLineArguments, shuffleInvalidParamCase2) { const char* argv[] = { "tests.exe", "-s 0" }; - shuffleTest(2, argv, SHUFFLE_DISABLED); + shuffleInvalidParamTest(2, argv); } -TEST(CommandLineArguments, shuffleDisabledCase3) +TEST(CommandLineArguments, shuffleInvalidParamCase3) { const char* argv[] = { "tests.exe", "-s", "0" }; - shuffleTest(3, argv, SHUFFLE_DISABLED); + shuffleInvalidParamTest(3, argv); } TEST(CommandLineArguments, shuffleEnabledSpecificSeedCase1) { - int argc = 2; const char* argv[] = { "tests.exe", "-s999"}; - CHECK(newArgumentParser(argc, argv)); - CHECK_EQUAL(args->getShuffle(), 999); + shuffleTest(2, argv, 999); } TEST(CommandLineArguments, shuffleEnabledSpecificSeedCase2) { - int argc = 2; const char* argv[] = { "tests.exe", "-s 888"}; - CHECK(newArgumentParser(argc, argv)); - CHECK_EQUAL(args->getShuffle(), 888); + shuffleTest(2, argv, 888); } TEST(CommandLineArguments, shuffleEnabledSpecificSeedCase3) { - int argc = 3; const char* argv[] = { "tests.exe", "-s", "777"}; - CHECK(newArgumentParser(argc, argv)); - CHECK_EQUAL(args->getShuffle(), 777); + shuffleTest(3, argv, 777); } TEST(CommandLineArguments, shuffleBeforeDoesNotDisturbOtherSwitch) @@ -436,7 +435,7 @@ TEST(CommandLineArguments, weirdParamatersPrintsUsageAndReturnsFalse) int argc = 2; const char* argv[] = { "tests.exe", "-SomethingWeird" }; CHECK(!newArgumentParser(argc, argv)); - STRCMP_EQUAL("usage [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-s [randomizerSeed]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", + STRCMP_EQUAL("usage [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", args->usage()); } diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index 3156ca9b8..f350ff3ec 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -186,11 +186,17 @@ TEST(CommandLineTestRunner, listTestGroupAndCaseNamesShouldWorkProperly) STRCMP_CONTAINS("group.test", commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().asCharString()); } -TEST(CommandLineTestRunner, randomShuffleSeedIsPrinted) +TEST(CommandLineTestRunner, randomShuffleSeedIsPrintedAndRandFuncIsExercised) { + // more than 1 item in test list ensures that shuffle algorithm calls rand_() + UtestShell *anotherTest = new UtestShell("group", "test2", "file", 1); + registry.addTest(anotherTest); + const char* argv[] = { "tests.exe", "-s"}; SimpleString text = runAndGetOutput(2, argv); STRCMP_CONTAINS("shuffling enabled with seed:", text.asCharString()); + + delete anotherTest; } TEST(CommandLineTestRunner, specificShuffleSeedIsPrintedVerbose) diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 996f52d4e..7d0e9684c 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -949,23 +949,11 @@ TEST(SimpleString, AtoU) CHECK(123 == SimpleString::AtoU("\t \r\n123")); CHECK(123 == SimpleString::AtoU("123-foo")); CHECK(65535 == SimpleString::AtoU(max_short_str)); - - bool parsedDigit; - - CHECK(0 == SimpleString::AtoU("foo", parsedDigit)); - CHECK_FALSE(parsedDigit); - - CHECK(0 == SimpleString::AtoU("-foo", parsedDigit)); - CHECK_FALSE(parsedDigit); - - CHECK(0 == SimpleString::AtoU("+1", parsedDigit)); - CHECK_FALSE(parsedDigit); - - CHECK(0 == SimpleString::AtoU("-1", parsedDigit)); - CHECK_FALSE(parsedDigit); - - CHECK(0 == SimpleString::AtoU("0", parsedDigit)); - CHECK_TRUE(parsedDigit); + CHECK(0 == SimpleString::AtoU("foo")); + CHECK(0 == SimpleString::AtoU("-foo")); + CHECK(0 == SimpleString::AtoU("+1")); + CHECK(0 == SimpleString::AtoU("-1")); + CHECK(0 == SimpleString::AtoU("0")); } TEST(SimpleString, Binary) From da96679c42a421a4fa024b975ee6bb6ce056f5e9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaychenko Date: Fri, 15 Mar 2019 08:02:01 +0300 Subject: [PATCH 0214/1093] Added missed header files when cpputest is being installed as external project through cmake Added Shuffle.h and SimpleMutex.h in the list of headers to be installed in CMakeLists.txt. --- src/CppUTest/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 7bed86fd1..49a0aadf2 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -60,6 +60,8 @@ set(CppUTest_headers ${CppUTestRootDirectory}/include/CppUTest/MemoryLeakWarningPlugin.h ${CppUTestRootDirectory}/include/CppUTest/TestHarness_c.h ${CppUTestRootDirectory}/include/CppUTest/UtestMacros.h + ${CppUTestRootDirectory}/include/CppUTest/Shuffle.h + ${CppUTestRootDirectory}/include/CppUTest/SimpleMutex.h ) if (WIN32) From 7342fac7ed2d127ef704d730cd87e37313c44210 Mon Sep 17 00:00:00 2001 From: Avraham Shukron Date: Sat, 30 Mar 2019 22:17:03 +0300 Subject: [PATCH 0215/1093] Add public headers as an exported properties of the library This will make the library truly importable using cmake. (Up until now the include dirs were not exported) Signed-off-by: Avraham Shukron --- src/CppUTest/CMakeLists.txt | 8 ++++++-- src/CppUTestExt/CMakeLists.txt | 7 +++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 49a0aadf2..b2272b96b 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -64,11 +64,15 @@ set(CppUTest_headers ${CppUTestRootDirectory}/include/CppUTest/SimpleMutex.h ) +set_target_properties(CppUTest PROPERTIES + PUBLIC_HEADER "${CppUTest_headers}") + if (WIN32) target_link_libraries(CppUTest winmm.lib) endif (WIN32) -install(FILES ${CppUTest_headers} DESTINATION include/CppUTest) install(TARGETS CppUTest EXPORT CppUTestTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CppUTest" + PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CppUTest") diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index 8e4e2c304..ddcf28f78 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -40,8 +40,11 @@ set(CppUTestExt_headers add_library(CppUTestExt STATIC ${CppUTestExt_src} ${CppUTestExt_headers}) target_link_libraries(CppUTestExt ${CPPUNIT_EXTERNAL_LIBRARIES}) -install(FILES ${CppUTestExt_headers} DESTINATION include/CppUTestExt) +set_target_properties(CppUTestExt PROPERTIES + PUBLIC_HEADER "${CppUTestExt_headers}") install(TARGETS CppUTestExt EXPORT CppUTestTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CppUTestExt" + PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CppUTestExt") From ec9a243a328343418ace8cc88ff9bd36dd94de12 Mon Sep 17 00:00:00 2001 From: offa Date: Thu, 4 Apr 2019 18:41:40 +0200 Subject: [PATCH 0216/1093] Signedness and types corrected. --- include/CppUTest/Shuffle.h | 6 +++--- include/CppUTest/TestRegistry.h | 3 ++- include/CppUTest/Utest.h | 2 +- src/CppUTest/TestRegistry.cpp | 8 ++++---- src/CppUTest/Utest.cpp | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/include/CppUTest/Shuffle.h b/include/CppUTest/Shuffle.h index a08179a75..0f43bbe2e 100644 --- a/include/CppUTest/Shuffle.h +++ b/include/CppUTest/Shuffle.h @@ -44,11 +44,11 @@ static inline int rand_(void) // rand_func_t } // "Durstenfeld shuffle" according to Wikipedia -static inline void shuffle_list(rand_func_t rand_func, int numElems, void* listToShuffleInPlace[]) +static inline void shuffle_list(rand_func_t rand_func, size_t numElems, void* listToShuffleInPlace[]) { - for (int i = numElems - 1; i >= 1; --i) + for (size_t i = numElems - 1; i >= 1; --i) { - int j = rand_func() % (i + 1); // distribution biased by modulo, but good enough for shuffling + const size_t j = (size_t) rand_func() % (i + 1); // distribution biased by modulo, but good enough for shuffling void* e1 = listToShuffleInPlace[j]; void* e2 = listToShuffleInPlace[i]; listToShuffleInPlace[i] = e1; diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index 83a79c936..3f25ccc97 100755 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -33,6 +33,7 @@ #ifndef D_TestRegistry_h #define D_TestRegistry_h +#include #include "SimpleString.h" #include "TestFilter.h" #include "Shuffle.h" @@ -49,7 +50,7 @@ class TestRegistry virtual void addTest(UtestShell *test); virtual void unDoLastAddTest(); - virtual int countTests(); + virtual size_t countTests(); virtual void runAllTests(TestResult& result); virtual void shuffleRunOrder(rand_func_t); virtual void listTestGroupNames(TestResult& result); diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 5f672b603..2affa599e 100755 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -93,7 +93,7 @@ class UtestShell virtual UtestShell* addTest(UtestShell* test); virtual UtestShell *getNext() const; - virtual int countTests(); + virtual size_t countTests(); bool shouldRun(const TestFilter* groupFilters, const TestFilter* nameFilters) const; const SimpleString getName() const; diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 75c88dc47..4b1a020bf 100644 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -128,7 +128,7 @@ bool TestRegistry::endOfGroup(UtestShell* test) return (!test || !test->getNext() || test->getGroup() != test->getNext()->getGroup()); } -int TestRegistry::countTests() +size_t TestRegistry::countTests() { return tests_ ? tests_->countTests() : 0; } @@ -234,11 +234,11 @@ void TestRegistry::shuffleRunOrder(rand_func_t rand_func) { return; } - int numTests = getFirstTest()->countTests(); + const size_t numTests = getFirstTest()->countTests(); typedef UtestShell* listElem; listElem* tests = new listElem[numTests]; UtestShell *test = getFirstTest(); - for (int testsIdx = 0; testsIdx < numTests; ++testsIdx) + for (size_t testsIdx = 0; testsIdx < numTests; ++testsIdx) { tests[testsIdx] = test; test = test->getNext(); @@ -247,7 +247,7 @@ void TestRegistry::shuffleRunOrder(rand_func_t rand_func) // Store shuffled list back to linked list UtestShell *prev = NULLPTR; - for (int i = 0; i < numTests; ++i) + for (size_t i = 0; i < numTests; ++i) { prev = tests[numTests - 1 - i]->addTest(prev); } diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 4908d1f4d..ecbfc14fd 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -227,7 +227,7 @@ UtestShell* UtestShell::addTest(UtestShell *test) return this; } -int UtestShell::countTests() +size_t UtestShell::countTests() { return next_ ? next_->countTests() + 1 : 1; } From a67456db81820c0bafd43eb9c76a0e7b12013d95 Mon Sep 17 00:00:00 2001 From: offa Date: Sat, 13 Apr 2019 18:20:39 +0200 Subject: [PATCH 0217/1093] Prevent divison by zero error. --- include/CppUTest/Shuffle.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/include/CppUTest/Shuffle.h b/include/CppUTest/Shuffle.h index 0f43bbe2e..b72ac95b4 100644 --- a/include/CppUTest/Shuffle.h +++ b/include/CppUTest/Shuffle.h @@ -46,13 +46,16 @@ static inline int rand_(void) // rand_func_t // "Durstenfeld shuffle" according to Wikipedia static inline void shuffle_list(rand_func_t rand_func, size_t numElems, void* listToShuffleInPlace[]) { - for (size_t i = numElems - 1; i >= 1; --i) + if( numElems > 0 ) { - const size_t j = (size_t) rand_func() % (i + 1); // distribution biased by modulo, but good enough for shuffling - void* e1 = listToShuffleInPlace[j]; - void* e2 = listToShuffleInPlace[i]; - listToShuffleInPlace[i] = e1; - listToShuffleInPlace[j] = e2; + for (size_t i = numElems - 1; i >= 1; --i) + { + const size_t j = ((size_t)rand_func()) % (i + 1); // distribution biased by modulo, but good enough for shuffling + void* e1 = listToShuffleInPlace[j]; + void* e2 = listToShuffleInPlace[i]; + listToShuffleInPlace[i] = e1; + listToShuffleInPlace[j] = e2; + } } } From 013fe3fc4e7f2c014b22ed45e8a69371197ccebc Mon Sep 17 00:00:00 2001 From: Aalhad Saraf Date: Mon, 22 Apr 2019 18:11:47 +0530 Subject: [PATCH 0218/1093] CPPUTEST_HOME variable prefixed with a $ The CPPUTEST_HOME variable to be added to CPPFLAGS perhaps needs to be prefixed with a $ to work in a Makefile. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aa35da808..d159c1319 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ You can also use CMake, which also works for Windows Visual Studio. Then to get started, you'll need to do the following: * Add the include path to the Makefile. Something like: - * CPPFLAGS += -I(CPPUTEST_HOME)/include + * CPPFLAGS += -I$(CPPUTEST_HOME)/include * Add the memory leak macros to your Makefile (needed for additional debug info!). Something like: * CXXFLAGS += -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorNewMacros.h * CFLAGS += -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorMallocMacros.h From 04b24b2044d73c09cbdadeaca3448e0ee434e496 Mon Sep 17 00:00:00 2001 From: offa Date: Fri, 26 Apr 2019 17:29:41 +0200 Subject: [PATCH 0219/1093] Include of standard library headers fixed and function changed. --- include/CppUTest/Shuffle.h | 17 ++++++++--------- include/CppUTest/TestRegistry.h | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/include/CppUTest/Shuffle.h b/include/CppUTest/Shuffle.h index b72ac95b4..3fd6c10cc 100644 --- a/include/CppUTest/Shuffle.h +++ b/include/CppUTest/Shuffle.h @@ -46,16 +46,15 @@ static inline int rand_(void) // rand_func_t // "Durstenfeld shuffle" according to Wikipedia static inline void shuffle_list(rand_func_t rand_func, size_t numElems, void* listToShuffleInPlace[]) { - if( numElems > 0 ) + if( numElems == 0 ) return; + + for (size_t i = numElems - 1; i >= 1; --i) { - for (size_t i = numElems - 1; i >= 1; --i) - { - const size_t j = ((size_t)rand_func()) % (i + 1); // distribution biased by modulo, but good enough for shuffling - void* e1 = listToShuffleInPlace[j]; - void* e2 = listToShuffleInPlace[i]; - listToShuffleInPlace[i] = e1; - listToShuffleInPlace[j] = e2; - } + const size_t j = ((size_t)rand_func()) % (i + 1); // distribution biased by modulo, but good enough for shuffling + void* e1 = listToShuffleInPlace[j]; + void* e2 = listToShuffleInPlace[i]; + listToShuffleInPlace[i] = e1; + listToShuffleInPlace[j] = e2; } } diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index 3f25ccc97..5a6109c63 100755 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -33,7 +33,7 @@ #ifndef D_TestRegistry_h #define D_TestRegistry_h -#include +#include "StandardCLibrary.h" #include "SimpleString.h" #include "TestFilter.h" #include "Shuffle.h" From 60bd4521f3aeaf1375766bbc05968cdda7eb3c9c Mon Sep 17 00:00:00 2001 From: "Carl S. Gutekunst" Date: Fri, 26 Apr 2019 12:01:34 -0700 Subject: [PATCH 0220/1093] JUnit output: Encode special chars in XML Text This change extends escaping of XML special characters to text blocks as well as attributes. It also changes the mapping to use standard escape encoding: " " < < > > & & This change maintains the historic behavior of mapping newlines to "{newline}" in the XML text. We're not sure whether this is optimal for Bamboo and Jenkins, although our experience to date is it's better then emitting the raw newlines or mapping newlines to spaces. This implementation is expensive, calling SimpleString::replace() repeatedly over the same string. The cost was mitigated by modifying the replace() method to exit quickly if the pattern is not found. --- include/CppUTest/JUnitTestOutput.h | 1 + src/CppUTest/JUnitTestOutput.cpp | 25 +++++++++++++++++-------- src/CppUTest/SimpleString.cpp | 3 +++ tests/CppUTest/JUnitOutputTest.cpp | 27 +++++++++++++++++++++++++-- 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/include/CppUTest/JUnitTestOutput.h b/include/CppUTest/JUnitTestOutput.h index 6cd48f5a3..aff42a781 100644 --- a/include/CppUTest/JUnitTestOutput.h +++ b/include/CppUTest/JUnitTestOutput.h @@ -71,6 +71,7 @@ class JUnitTestOutput: public TestOutput virtual void writeTestSuiteSummary(); virtual void writeProperties(); virtual void writeTestCases(); + virtual SimpleString encodeXmlText(const SimpleString& textbody); virtual void writeFailure(JUnitTestCaseResultNode* node); virtual void writeFileEnding(); diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index bf2dd9e38..0177bb7ae 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -190,6 +190,17 @@ void JUnitTestOutput::writeProperties() writeToFile("\n"); } +SimpleString JUnitTestOutput::encodeXmlText(const SimpleString& textbody) +{ + SimpleString buf = textbody.asCharString(); + buf.replace("&", "&"); + buf.replace("\"", """); + buf.replace("<", "<"); + buf.replace(">", ">"); + buf.replace("\n", "{newline}"); + return buf; +} + void JUnitTestOutput::writeTestCases() { JUnitTestCaseResultNode* cur = impl_->results_.head_; @@ -222,23 +233,21 @@ void JUnitTestOutput::writeTestCases() void JUnitTestOutput::writeFailure(JUnitTestCaseResultNode* node) { - SimpleString message = node->failure_->getMessage().asCharString(); - message.replace('"', '\''); - message.replace('<', '['); - message.replace('>', ']'); - message.replace("&", "&"); - message.replace("\n", "{newline}"); SimpleString buf = StringFromFormat( "\n", node->failure_->getFileName().asCharString(), - node->failure_->getFailureLineNumber(), message.asCharString()); + node->failure_->getFailureLineNumber(), + encodeXmlText(node->failure_->getMessage()).asCharString()); writeToFile(buf.asCharString()); writeToFile("\n"); } + void JUnitTestOutput::writeFileEnding() { - writeToFile(""); writeToFile(impl_->stdOutput_); writeToFile("\n"); + writeToFile(""); + writeToFile(encodeXmlText(impl_->stdOutput_)); + writeToFile("\n"); writeToFile("\n"); writeToFile("\n"); } diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 29f164710..100e21571 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -262,6 +262,9 @@ void SimpleString::replace(char to, char with) void SimpleString::replace(const char* to, const char* with) { size_t c = count(to); + if (c == 0) { + return; + } size_t len = size(); size_t tolen = StrLen(to); size_t withlen = StrLen(with); diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index 3a984d7fe..7da159009 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -510,7 +510,7 @@ TEST(JUnitOutputTest, testFailureWithLessThanAndGreaterThanInsideIt) outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); - STRCMP_EQUAL("\n", outputFile->line(6)); + STRCMP_EQUAL("\n", outputFile->line(6)); } TEST(JUnitOutputTest, testFailureWithQuotesInIt) @@ -522,7 +522,7 @@ TEST(JUnitOutputTest, testFailureWithQuotesInIt) outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); - STRCMP_EQUAL("\n", outputFile->line(6)); + STRCMP_EQUAL("\n", outputFile->line(6)); } TEST(JUnitOutputTest, testFailureWithNewlineInIt) @@ -549,6 +549,18 @@ TEST(JUnitOutputTest, testFailureWithDifferentFileAndLine) STRCMP_EQUAL("\n", outputFile->line(6)); } +TEST(JUnitOutputTest, testFailureWithAmpersandsAndLessThan) +{ + testCaseRunner->start() + .withGroup("testGroupWithFailingTest") + .withTest("FailingTestName").thatFails("&object1 < &object2", "importantFile", 999) + .end(); + + outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); + + STRCMP_EQUAL("\n", outputFile->line(6)); +} + TEST(JUnitOutputTest, testFailureWithAmpersands) { testCaseRunner->start() @@ -724,3 +736,14 @@ TEST(JUnitOutputTest, UTPRINTOutputInJUnitOutput) outputFile = fileSystem.file("cpputest_groupname.xml"); STRCMP_EQUAL("someoutput\n", outputFile->lineFromTheBack(3)); } + +TEST(JUnitOutputTest, UTPRINTOutputInJUnitOutputWithSpecials) +{ + testCaseRunner->start() + .withGroup("groupname") + .withTest("testname").thatPrints("The in \"Spain\"\nGoes \\mainly\\ down the Dr&in\n") + .end(); + + outputFile = fileSystem.file("cpputest_groupname.xml"); + STRCMP_EQUAL("The <rain> in "Spain"{newline}Goes \\mainly\\ down the Dr&in{newline}\n", outputFile->lineFromTheBack(3)); +} From 41da632420bbd52731c3b276fa0f6e64e6a0c639 Mon Sep 17 00:00:00 2001 From: "Carl S. Gutekunst" Date: Fri, 26 Apr 2019 12:57:03 -0700 Subject: [PATCH 0221/1093] Oops: Fix tab/space inconsistency Oops: Fix tab/space inconsistency introduced by commit 60bd4521f3aeaf1375766bbc05968cdda7eb3c9c --- src/CppUTest/JUnitTestOutput.cpp | 2 +- src/CppUTest/SimpleString.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index 0177bb7ae..3b5817ada 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -237,7 +237,7 @@ void JUnitTestOutput::writeFailure(JUnitTestCaseResultNode* node) "\n", node->failure_->getFileName().asCharString(), node->failure_->getFailureLineNumber(), - encodeXmlText(node->failure_->getMessage()).asCharString()); + encodeXmlText(node->failure_->getMessage()).asCharString()); writeToFile(buf.asCharString()); writeToFile("\n"); } diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 100e21571..2b5a94ab8 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -263,7 +263,7 @@ void SimpleString::replace(const char* to, const char* with) { size_t c = count(to); if (c == 0) { - return; + return; } size_t len = size(); size_t tolen = StrLen(to); From 600d7ea188df4ff0fdf5667994a912ff01e6c71b Mon Sep 17 00:00:00 2001 From: offa Date: Sat, 27 Apr 2019 16:40:51 +0200 Subject: [PATCH 0222/1093] Macros fixed to prevent empty statements. --- include/CppUTest/MemoryLeakWarningPlugin.h | 4 +- include/CppUTest/TestPlugin.h | 2 +- include/CppUTest/UtestMacros.h | 70 +++++++++---------- src/CppUTest/MemoryLeakWarningPlugin.cpp | 2 +- tests/CppUTestExt/CodeMemoryReporterTest.cpp | 4 +- .../CppUTestExt/MemoryReportFormatterTest.cpp | 2 +- 6 files changed, 42 insertions(+), 42 deletions(-) diff --git a/include/CppUTest/MemoryLeakWarningPlugin.h b/include/CppUTest/MemoryLeakWarningPlugin.h index 13156f0d2..6b9c98639 100644 --- a/include/CppUTest/MemoryLeakWarningPlugin.h +++ b/include/CppUTest/MemoryLeakWarningPlugin.h @@ -31,8 +31,8 @@ #include "TestPlugin.h" #include "MemoryLeakDetectorNewMacros.h" -#define IGNORE_ALL_LEAKS_IN_TEST() MemoryLeakWarningPlugin::getFirstPlugin()->ignoreAllLeaksInTest(); -#define EXPECT_N_LEAKS(n) MemoryLeakWarningPlugin::getFirstPlugin()->expectLeaksInTest(n); +#define IGNORE_ALL_LEAKS_IN_TEST() MemoryLeakWarningPlugin::getFirstPlugin()->ignoreAllLeaksInTest() +#define EXPECT_N_LEAKS(n) MemoryLeakWarningPlugin::getFirstPlugin()->expectLeaksInTest(n) extern void crash_on_allocation_number(unsigned alloc_number); diff --git a/include/CppUTest/TestPlugin.h b/include/CppUTest/TestPlugin.h index 2b0b33d6c..2b2ed932b 100644 --- a/include/CppUTest/TestPlugin.h +++ b/include/CppUTest/TestPlugin.h @@ -98,7 +98,7 @@ class SetPointerPlugin: public TestPlugin }; }; -#define UT_PTR_SET(a, b) { CppUTestStore( (void**)&a ); a = b; } +#define UT_PTR_SET(a, b) do { CppUTestStore( (void**)&a ); a = b; } while(0) ///////////// Null Plugin diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index f2eb24f67..a519fe7c5 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -117,10 +117,10 @@ CHECK_FALSE_LOCATION(condition, "CHECK_FALSE", #condition, text, __FILE__, __LINE__) #define CHECK_TRUE_LOCATION(condition, checkString, conditionString, text, file, line)\ - { UtestShell::getCurrent()->assertTrue((condition), checkString, conditionString, text, file, line); } + do { UtestShell::getCurrent()->assertTrue((condition), checkString, conditionString, text, file, line); } while(0) #define CHECK_FALSE_LOCATION(condition, checkString, conditionString, text, file, line)\ - { UtestShell::getCurrent()->assertTrue(!(condition), checkString, conditionString, text, file, line); } + do { UtestShell::getCurrent()->assertTrue(!(condition), checkString, conditionString, text, file, line); } while(0) //This check needs the operator!=(), and a StringFrom(YourType) function #define CHECK_EQUAL(expected, actual)\ @@ -130,7 +130,7 @@ CHECK_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) #define CHECK_EQUAL_LOCATION(expected, actual, text, file, line)\ - { if ((expected) != (actual)) { \ + do { if ((expected) != (actual)) { \ if ((actual) != (actual)) \ UtestShell::getCurrent()->print("WARNING:\n\tThe \"Actual Parameter\" parameter is evaluated multiple times resulting in different values.\n\tThus the value in the error message is probably incorrect.", file, line); \ if ((expected) != (expected)) \ @@ -140,7 +140,7 @@ else \ { \ UtestShell::getCurrent()->assertLongsEqual((long)0, (long)0, NULLPTR, file, line); \ - } } + } } while(0) #define CHECK_COMPARE(first, relop, second)\ CHECK_COMPARE_TEXT(first, relop, second, NULLPTR) @@ -149,12 +149,12 @@ CHECK_COMPARE_LOCATION(first, relop, second, text, __FILE__, __LINE__) #define CHECK_COMPARE_LOCATION(first, relop, second, text, file, line)\ - { SimpleString conditionString;\ - conditionString += StringFrom(first); conditionString += " ";\ - conditionString += #relop; conditionString += " ";\ - conditionString += StringFrom(second);\ - UtestShell::getCurrent()->assertCompare((first) relop (second), "CHECK_COMPARE", conditionString.asCharString(), text, __FILE__, __LINE__);\ - } + do { SimpleString conditionString;\ + conditionString += StringFrom(first); conditionString += " ";\ + conditionString += #relop; conditionString += " ";\ + conditionString += StringFrom(second);\ + UtestShell::getCurrent()->assertCompare((first) relop (second), "CHECK_COMPARE", conditionString.asCharString(), text, __FILE__, __LINE__);\ + } while(0) //This check checks for char* string equality using strcmp. //This makes up for the fact that CHECK_EQUAL only compares the pointers to char*'s @@ -165,7 +165,7 @@ STRCMP_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) #define STRCMP_EQUAL_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertCstrEqual(expected, actual, text, file, line); } + do { UtestShell::getCurrent()->assertCstrEqual(expected, actual, text, file, line); } while(0) #define STRNCMP_EQUAL(expected, actual, length)\ STRNCMP_EQUAL_LOCATION(expected, actual, length, NULLPTR, __FILE__, __LINE__) @@ -174,7 +174,7 @@ STRNCMP_EQUAL_LOCATION(expected, actual, length, text, __FILE__, __LINE__) #define STRNCMP_EQUAL_LOCATION(expected, actual, length, text, file, line)\ - { UtestShell::getCurrent()->assertCstrNEqual(expected, actual, length, text, file, line); } + do { UtestShell::getCurrent()->assertCstrNEqual(expected, actual, length, text, file, line); } while(0) #define STRCMP_NOCASE_EQUAL(expected, actual)\ STRCMP_NOCASE_EQUAL_LOCATION(expected, actual, NULLPTR, __FILE__, __LINE__) @@ -183,7 +183,7 @@ STRCMP_NOCASE_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) #define STRCMP_NOCASE_EQUAL_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertCstrNoCaseEqual(expected, actual, text, file, line); } + do { UtestShell::getCurrent()->assertCstrNoCaseEqual(expected, actual, text, file, line); } while(0) #define STRCMP_CONTAINS(expected, actual)\ STRCMP_CONTAINS_LOCATION(expected, actual, NULLPTR, __FILE__, __LINE__) @@ -192,7 +192,7 @@ STRCMP_CONTAINS_LOCATION(expected, actual, text, __FILE__, __LINE__) #define STRCMP_CONTAINS_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertCstrContains(expected, actual, text, file, line); } + do { UtestShell::getCurrent()->assertCstrContains(expected, actual, text, file, line); } while(0) #define STRCMP_NOCASE_CONTAINS(expected, actual)\ STRCMP_NOCASE_CONTAINS_LOCATION(expected, actual, NULLPTR, __FILE__, __LINE__) @@ -201,7 +201,7 @@ STRCMP_NOCASE_CONTAINS_LOCATION(expected, actual, text, __FILE__, __LINE__) #define STRCMP_NOCASE_CONTAINS_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertCstrNoCaseContains(expected, actual, text, file, line); } + do { UtestShell::getCurrent()->assertCstrNoCaseContains(expected, actual, text, file, line); } while(0) //Check two long integers for equality #define LONGS_EQUAL(expected, actual)\ @@ -217,10 +217,10 @@ UNSIGNED_LONGS_EQUAL_LOCATION((expected), (actual), text, __FILE__, __LINE__) #define LONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertLongsEqual((long)expected, (long)actual, text, file, line); } + do { UtestShell::getCurrent()->assertLongsEqual((long)expected, (long)actual, text, file, line); } while(0) #define UNSIGNED_LONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, text, file, line); } + do { UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, text, file, line); } while(0) #define LONGLONGS_EQUAL(expected, actual)\ LONGLONGS_EQUAL_LOCATION(expected, actual, NULLPTR, __FILE__, __LINE__) @@ -235,10 +235,10 @@ UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) #define LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertLongLongsEqual((long long)expected, (long long)actual, text, file, line); } + do { UtestShell::getCurrent()->assertLongLongsEqual((long long)expected, (long long)actual, text, file, line); } while(0) #define UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertUnsignedLongLongsEqual((unsigned long long)expected, (unsigned long long)actual, text, file, line); } + do { UtestShell::getCurrent()->assertUnsignedLongLongsEqual((unsigned long long)expected, (unsigned long long)actual, text, file, line); } while(0) #define BYTES_EQUAL(expected, actual)\ LONGS_EQUAL((expected) & 0xff,(actual) & 0xff) @@ -250,13 +250,13 @@ SIGNED_BYTES_EQUAL_LOCATION(expected, actual, __FILE__, __LINE__) #define SIGNED_BYTES_EQUAL_LOCATION(expected, actual, file, line) \ - { UtestShell::getCurrent()->assertSignedBytesEqual(expected, actual, NULLPTR, file, line); } + do { UtestShell::getCurrent()->assertSignedBytesEqual(expected, actual, NULLPTR, file, line); } while(0) #define SIGNED_BYTES_EQUAL_TEXT(expected, actual, text)\ SIGNED_BYTES_EQUAL_TEXT_LOCATION(expected, actual, text, __FILE__, __LINE__) #define SIGNED_BYTES_EQUAL_TEXT_LOCATION(expected, actual, text, file, line) \ - { UtestShell::getCurrent()->assertSignedBytesEqual(expected, actual, text, file, line); } + do { UtestShell::getCurrent()->assertSignedBytesEqual(expected, actual, text, file, line); } while(0) #define POINTERS_EQUAL(expected, actual)\ POINTERS_EQUAL_LOCATION((expected), (actual), NULLPTR, __FILE__, __LINE__) @@ -265,7 +265,7 @@ POINTERS_EQUAL_LOCATION((expected), (actual), text, __FILE__, __LINE__) #define POINTERS_EQUAL_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertPointersEqual((const void *)expected, (const void *)actual, text, file, line); } + do { UtestShell::getCurrent()->assertPointersEqual((const void *)expected, (const void *)actual, text, file, line); } while(0) #define FUNCTIONPOINTERS_EQUAL(expected, actual)\ FUNCTIONPOINTERS_EQUAL_LOCATION((expected), (actual), NULLPTR, __FILE__, __LINE__) @@ -274,7 +274,7 @@ FUNCTIONPOINTERS_EQUAL_LOCATION((expected), (actual), text, __FILE__, __LINE__) #define FUNCTIONPOINTERS_EQUAL_LOCATION(expected, actual, text, file, line)\ - { UtestShell::getCurrent()->assertFunctionPointersEqual((void (*)())expected, (void (*)())actual, text, file, line); } + do { UtestShell::getCurrent()->assertFunctionPointersEqual((void (*)())expected, (void (*)())actual, text, file, line); } while(0) //Check two doubles for equality within a tolerance threshold #define DOUBLES_EQUAL(expected, actual, threshold)\ @@ -284,7 +284,7 @@ DOUBLES_EQUAL_LOCATION(expected, actual, threshold, text, __FILE__, __LINE__) #define DOUBLES_EQUAL_LOCATION(expected, actual, threshold, text, file, line)\ - { UtestShell::getCurrent()->assertDoublesEqual(expected, actual, threshold, text, file, line); } + do { UtestShell::getCurrent()->assertDoublesEqual(expected, actual, threshold, text, file, line); } while(0) #define MEMCMP_EQUAL(expected, actual, size)\ MEMCMP_EQUAL_LOCATION(expected, actual, size, NULLPTR, __FILE__, __LINE__) @@ -293,7 +293,7 @@ MEMCMP_EQUAL_LOCATION(expected, actual, size, text, __FILE__, __LINE__) #define MEMCMP_EQUAL_LOCATION(expected, actual, size, text, file, line)\ - { UtestShell::getCurrent()->assertBinaryEqual(expected, actual, size, text, file, line); } + do { UtestShell::getCurrent()->assertBinaryEqual(expected, actual, size, text, file, line); } while(0) #define BITS_EQUAL(expected, actual, mask)\ BITS_LOCATION(expected, actual, mask, NULLPTR, __FILE__, __LINE__) @@ -302,7 +302,7 @@ BITS_LOCATION(expected, actual, mask, text, __FILE__, __LINE__) #define BITS_LOCATION(expected, actual, mask, text, file, line)\ - { UtestShell::getCurrent()->assertBitsEqual(expected, actual, mask, sizeof(actual), text, file, line); } + do { UtestShell::getCurrent()->assertBitsEqual(expected, actual, mask, sizeof(actual), text, file, line); } while(0) #define ENUMS_EQUAL_INT(expected, actual)\ ENUMS_EQUAL_TYPE(int, expected, actual) @@ -317,7 +317,7 @@ ENUMS_EQUAL_TYPE_LOCATION(underlying_type, expected, actual, text, __FILE__, __LINE__) #define ENUMS_EQUAL_TYPE_LOCATION(underlying_type, expected, actual, text, file, line)\ - { underlying_type expected_underlying_value = (underlying_type)(expected); \ + do { underlying_type expected_underlying_value = (underlying_type)(expected); \ underlying_type actual_underlying_value = (underlying_type)(actual); \ if (expected_underlying_value != actual_underlying_value) { \ UtestShell::getCurrent()->assertEquals(true, StringFrom(expected_underlying_value).asCharString(), StringFrom(actual_underlying_value).asCharString(), text, file, line); \ @@ -326,7 +326,7 @@ { \ UtestShell::getCurrent()->assertLongsEqual((long)0, long(0), NULLPTR, file, line); \ } \ - } + } while(0) //Fail if you get to this macro //The macro FAIL may already be taken, so allow FAIL_TEST too @@ -335,27 +335,27 @@ FAIL_LOCATION(text, __FILE__,__LINE__) #define FAIL_LOCATION(text, file, line)\ - { UtestShell::getCurrent()->fail(text, file, line); } + do { UtestShell::getCurrent()->fail(text, file, line); } while(0) #endif #define FAIL_TEST(text)\ FAIL_TEST_LOCATION(text, __FILE__,__LINE__) #define FAIL_TEST_LOCATION(text, file,line)\ - { UtestShell::getCurrent()->fail(text, file, line); } + do { UtestShell::getCurrent()->fail(text, file, line); } while(0) #define TEST_EXIT\ - { UtestShell::getCurrent()->exitTest(); } + do { UtestShell::getCurrent()->exitTest(); } while(0) #define UT_PRINT_LOCATION(text, file, line) \ - { UtestShell::getCurrent()->print(text, file, line); } + do { UtestShell::getCurrent()->print(text, file, line); } while(0) #define UT_PRINT(text) \ UT_PRINT_LOCATION(text, __FILE__, __LINE__) #if CPPUTEST_USE_STD_CPP_LIB #define CHECK_THROWS(expected, expression) \ - { \ + do { \ SimpleString failure_msg("expected to throw "#expected "\nbut threw nothing"); \ bool caught_expected = false; \ try { \ @@ -371,10 +371,10 @@ else { \ UtestShell::getCurrent()->countCheck(); \ } \ - } + } while(0) #endif /* CPPUTEST_USE_STD_CPP_LIB */ -#define UT_CRASH() { UtestShell::crash(); } +#define UT_CRASH() do { UtestShell::crash(); } while(0) #define RUN_ALL_TESTS(ac, av) CommandLineTestRunner::RunAllTests(ac, av) #endif /*D_UTestMacros_h*/ diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 748793741..72efa30ee 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -128,7 +128,7 @@ void cpputest_free_location_with_leak_detection(void* buffer, const char* file, #undef new #if CPPUTEST_USE_STD_CPP_LIB -#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) if (memory == NULLPTR) throw std::bad_alloc(); +#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) if (memory == NULLPTR) throw std::bad_alloc() #else #define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) #endif diff --git a/tests/CppUTestExt/CodeMemoryReporterTest.cpp b/tests/CppUTestExt/CodeMemoryReporterTest.cpp index 2f84f1154..a17a50160 100644 --- a/tests/CppUTestExt/CodeMemoryReporterTest.cpp +++ b/tests/CppUTestExt/CodeMemoryReporterTest.cpp @@ -30,8 +30,8 @@ #include "CppUTestExt/MemoryReportAllocator.h" #include "CppUTestExt/CodeMemoryReportFormatter.h" -#define TESTOUTPUT_EQUAL(a) STRCMP_EQUAL_LOCATION(a, testOutput.getOutput().asCharString(), "", __FILE__, __LINE__); -#define TESTOUTPUT_CONTAINS(a) STRCMP_CONTAINS_LOCATION(a, testOutput.getOutput().asCharString(), "", __FILE__, __LINE__); +#define TESTOUTPUT_EQUAL(a) STRCMP_EQUAL_LOCATION(a, testOutput.getOutput().asCharString(), "", __FILE__, __LINE__) +#define TESTOUTPUT_CONTAINS(a) STRCMP_CONTAINS_LOCATION(a, testOutput.getOutput().asCharString(), "", __FILE__, __LINE__) TEST_GROUP(CodeMemoryReportFormatter) { diff --git a/tests/CppUTestExt/MemoryReportFormatterTest.cpp b/tests/CppUTestExt/MemoryReportFormatterTest.cpp index eda0ec09f..7a32b1a89 100644 --- a/tests/CppUTestExt/MemoryReportFormatterTest.cpp +++ b/tests/CppUTestExt/MemoryReportFormatterTest.cpp @@ -30,7 +30,7 @@ #include "CppUTestExt/MemoryReportAllocator.h" #include "CppUTestExt/MemoryReportFormatter.h" -#define TESTOUTPUT_EQUAL(a) STRCMP_EQUAL_LOCATION(a, testOutput.getOutput().asCharString(), "", __FILE__, __LINE__); +#define TESTOUTPUT_EQUAL(a) STRCMP_EQUAL_LOCATION(a, testOutput.getOutput().asCharString(), "", __FILE__, __LINE__) TEST_GROUP(NormalMemoryReportFormatter) { From 0d58b2823b609ae71f0532c014e73c12af186cd4 Mon Sep 17 00:00:00 2001 From: offa Date: Sat, 27 Apr 2019 17:14:19 +0200 Subject: [PATCH 0223/1093] Missing ';' added. --- src/CppUTest/TestTestingFixture.cpp | 2 +- src/CppUTestExt/MockActualCall.cpp | 2 +- tests/CppUTest/SimpleStringTest.cpp | 12 +- tests/CppUTest/TestHarness_cTest.cpp | 68 ++++---- tests/CppUTest/TestUTestMacro.cpp | 200 ++++++++++++------------ tests/CppUTest/TestUTestStringMacro.cpp | 60 +++---- tests/CppUTestExt/MockPluginTest.cpp | 4 +- 7 files changed, 174 insertions(+), 174 deletions(-) diff --git a/src/CppUTest/TestTestingFixture.cpp b/src/CppUTest/TestTestingFixture.cpp index 9e7d9b938..19cc8157e 100644 --- a/src/CppUTest/TestTestingFixture.cpp +++ b/src/CppUTest/TestTestingFixture.cpp @@ -43,6 +43,6 @@ void TestTestingFixture::checkTestFailsWithProperTestLocation(const char* text, STRCMP_CONTAINS_LOCATION(text, output_->getOutput().asCharString(), "", file, line); if (lineOfCodeExecutedAfterCheck) - FAIL_LOCATION("The test should jump/throw on failure and not execute the next line. However, the next line was executed.", file, line) + FAIL_LOCATION("The test should jump/throw on failure and not execute the next line. However, the next line was executed.", file, line); } diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index cd7a1d9e9..c955612fe 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -386,7 +386,7 @@ void MockCheckedActualCall::checkExpectations() } if (potentiallyMatchingExpectations_.hasFinalizedMatchingExpectations()) - FAIL("Actual call is in progress, but there are finalized matching expectations when checking expectations. This cannot happen.") // LCOV_EXCL_LINE + FAIL("Actual call is in progress, but there are finalized matching expectations when checking expectations. This cannot happen."); // LCOV_EXCL_LINE matchingExpectation_ = potentiallyMatchingExpectations_.removeFirstMatchingExpectation(); if (matchingExpectation_) { diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 7d0e9684c..34cedbe47 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -610,17 +610,17 @@ TEST(SimpleString, StringFromFormatpointer) //this is not a great test. but %p is odd on mingw and even more odd on Solaris. SimpleString h1 = StringFromFormat("%p", (void*) 1); if (h1.size() == 3) - STRCMP_EQUAL("0x1", h1.asCharString()) + STRCMP_EQUAL("0x1", h1.asCharString()); else if (h1.size() == 8) - STRCMP_EQUAL("00000001", h1.asCharString()) + STRCMP_EQUAL("00000001", h1.asCharString()); else if (h1.size() == 9) - STRCMP_EQUAL("0000:0001", h1.asCharString()) + STRCMP_EQUAL("0000:0001", h1.asCharString()); else if (h1.size() == 16) - STRCMP_EQUAL("0000000000000001", h1.asCharString()) + STRCMP_EQUAL("0000000000000001", h1.asCharString()); else if (h1.size() == 1) - STRCMP_EQUAL("1", h1.asCharString()) + STRCMP_EQUAL("1", h1.asCharString()); else - FAIL("Off %p behavior") + FAIL("Off %p behavior"); } TEST(SimpleString, StringFromFormatLarge) diff --git a/tests/CppUTest/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp index 2a5e744a8..591154bc1 100644 --- a/tests/CppUTest/TestHarness_cTest.cpp +++ b/tests/CppUTest/TestHarness_cTest.cpp @@ -98,7 +98,7 @@ TEST(TestHarness_c, checkBool) fixture->runAllTests(); fixture->assertPrintContains("expected \n but was "); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failBoolTextMethod() @@ -116,7 +116,7 @@ TEST(TestHarness_c, checkBoolText) fixture->assertPrintContains("expected \n but was "); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: BoolTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failIntMethod() @@ -132,7 +132,7 @@ TEST(TestHarness_c, checkInt) fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failIntTextMethod() @@ -149,7 +149,7 @@ TEST(TestHarness_c, checkIntText) fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: IntTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failUnsignedIntMethod() @@ -165,7 +165,7 @@ TEST(TestHarness_c, checkUnsignedInt) fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failUnsignedIntTextMethod() @@ -182,7 +182,7 @@ TEST(TestHarness_c, checkUnsignedIntText) fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: UnsignedIntTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failLongIntMethod() @@ -198,7 +198,7 @@ TEST(TestHarness_c, checkLongInt) fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failLongIntTextMethod() @@ -215,7 +215,7 @@ TEST(TestHarness_c, checkLongIntText) fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: LongIntTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failUnsignedLongIntMethod() @@ -231,7 +231,7 @@ TEST(TestHarness_c, checkUnsignedLongInt) fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failUnsignedLongIntTextMethod() @@ -248,7 +248,7 @@ TEST(TestHarness_c, checkUnsignedLongIntText) fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: UnsignedLongIntTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } #ifdef CPPUTEST_USE_LONG_LONG @@ -266,7 +266,7 @@ TEST(TestHarness_c, checkLongLongInt) fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failLongLongIntTextMethod() @@ -283,7 +283,7 @@ TEST(TestHarness_c, checkLongLongIntText) fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: LongLongTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failUnsignedLongLongIntMethod() @@ -299,7 +299,7 @@ TEST(TestHarness_c, checkUnsignedLongLongInt) fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failUnsignedLongLongIntTextMethod() @@ -316,7 +316,7 @@ TEST(TestHarness_c, checkUnsignedLongLongIntText) fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: UnsignedLongLongTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } #else @@ -392,7 +392,7 @@ TEST(TestHarness_c, checkReal) fixture->runAllTests(); fixture->assertPrintContains("expected <1>\n but was <2>"); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failRealTextMethod() @@ -409,7 +409,7 @@ TEST(TestHarness_c, checkRealText) fixture->assertPrintContains("expected <1>\n but was <2>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: RealTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failCharMethod() @@ -425,7 +425,7 @@ TEST(TestHarness_c, checkChar) fixture->runAllTests(); fixture->assertPrintContains("expected \n but was "); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failCharTextMethod() @@ -442,7 +442,7 @@ TEST(TestHarness_c, checkCharText) fixture->assertPrintContains("expected \n but was "); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: CharTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failUnsignedByteMethod() @@ -458,7 +458,7 @@ TEST(TestHarness_c, checkUnsignedByte) fixture->runAllTests(); fixture->assertPrintContains("expected <254>\n but was <253>"); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failUnsignedByteTextMethod() @@ -475,7 +475,7 @@ TEST(TestHarness_c, checkUnsignedByteText) fixture->assertPrintContains("expected <254>\n but was <253>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: UnsignedByteTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failSignedByteMethod() @@ -491,7 +491,7 @@ TEST(TestHarness_c, checkSignedByte) fixture->runAllTests(); fixture->assertPrintContains("expected <-3>\n but was <-5>"); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failSignedByteTextMethod() @@ -508,7 +508,7 @@ TEST(TestHarness_c, checkSignedByteText) fixture->assertPrintContains("expected <-3>\n but was <-5>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: SignedByteTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failStringMethod() @@ -526,7 +526,7 @@ TEST(TestHarness_c, checkString) StringEqualFailure failure(UtestShell::getCurrent(), "file", 1, "Hello", "Hello World", ""); fixture->assertPrintContains(failure.getMessage()); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failStringTextMethod() @@ -545,7 +545,7 @@ TEST(TestHarness_c, checkStringText) fixture->assertPrintContains(failure.getMessage()); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: StringTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failPointerMethod() @@ -561,7 +561,7 @@ TEST(TestHarness_c, checkPointer) fixture->runAllTests(); fixture->assertPrintContains("expected <0x0>\n but was <0x1>"); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failPointerTextMethod() @@ -578,7 +578,7 @@ TEST(TestHarness_c, checkPointerText) fixture->assertPrintContains("expected <0x0>\n but was <0x1>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: PointerTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failBitsMethod() @@ -594,7 +594,7 @@ TEST(TestHarness_c, checkBits) fixture->runAllTests(); fixture->assertPrintContains("expected <00000000 00000001>\n\tbut was <00000000 00000011>"); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failBitsTextMethod() @@ -611,7 +611,7 @@ TEST(TestHarness_c, checkBitsText) fixture->assertPrintContains("expected <00000000 00000001>\n\tbut was <00000000 00000011>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: BitsTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failTextMethod() @@ -626,7 +626,7 @@ TEST(TestHarness_c, checkFailText) fixture->runAllTests(); fixture->assertPrintContains("Booo"); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _failMethod() @@ -641,7 +641,7 @@ TEST(TestHarness_c, checkFail) fixture->runAllTests(); LONGS_EQUAL(1, fixture->getFailureCount()); fixture->assertPrintContains("arness_c"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _CheckMethod() @@ -656,7 +656,7 @@ TEST(TestHarness_c, checkCheck) fixture->setTestFunction(_CheckMethod); fixture->runAllTests(); LONGS_EQUAL(1, fixture->getFailureCount()); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } static void _CheckTextMethod() @@ -672,7 +672,7 @@ TEST(TestHarness_c, checkCheckText) fixture->runAllTests(); LONGS_EQUAL(1, fixture->getFailureCount()); fixture->assertPrintContains("Message: CheckTestText"); - CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } #if CPPUTEST_USE_MEM_LEAK_DETECTION @@ -728,7 +728,7 @@ TEST(TestHarness_c, cpputest_strdup) { char * mem = cpputest_strdup("0123456789"); CHECK(NULLPTR != mem); - STRCMP_EQUAL("0123456789", mem) + STRCMP_EQUAL("0123456789", mem); cpputest_free(mem); } @@ -736,7 +736,7 @@ TEST(TestHarness_c, cpputest_strndup) { char * mem = cpputest_strndup("0123456789", 3); CHECK(NULLPTR != mem); - STRCMP_EQUAL("012", mem) + STRCMP_EQUAL("012", mem); cpputest_free(mem); } diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index 8178741c6..953842d59 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -68,11 +68,11 @@ TEST(UnitTestMacros, FAILWillPrintTheFileThatItFailed) TEST(UnitTestMacros, FAILBehavesAsAProperMacro) { - if (false) FAIL("") - else CHECK(true) + if (false) FAIL(""); + else CHECK(true); - if (true) CHECK(true) - else FAIL("") + if (true) CHECK(true); + else FAIL(""); } IGNORE_TEST(UnitTestMacros, FAILworksInAnIgnoredTest) @@ -95,8 +95,8 @@ TEST(UnitTestMacros, TestUNSIGNED_LONGS_EQUAL) TEST(UnitTestMacros, UNSIGNED_LONGS_EQUALBehavesAsProperMacro) { - if (false) UNSIGNED_LONGS_EQUAL(1, 0) - else UNSIGNED_LONGS_EQUAL(1, 1) + if (false) UNSIGNED_LONGS_EQUAL(1, 0); + else UNSIGNED_LONGS_EQUAL(1, 1); } IGNORE_TEST(UnitTestMacros, UNSIGNED_LONGS_EQUALWorksInAnIgnoredTest) @@ -119,8 +119,8 @@ TEST(UnitTestMacros, TestUNSIGNED_LONGS_EQUAL_TEXT) TEST(UnitTestMacros, UNSIGNED_LONGS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) UNSIGNED_LONGS_EQUAL_TEXT(1, 0, "Failed because it failed") - else UNSIGNED_LONGS_EQUAL_TEXT(1, 1, "Failed because it failed") + if (false) UNSIGNED_LONGS_EQUAL_TEXT(1, 0, "Failed because it failed"); + else UNSIGNED_LONGS_EQUAL_TEXT(1, 1, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, UNSIGNED_LONGS_EQUAL_TEXTWorksInAnIgnoredTest) @@ -145,8 +145,8 @@ TEST(UnitTestMacros, TestLONGLONGS_EQUAL) TEST(UnitTestMacros, LONGLONGS_EQUALBehavesAsProperMacro) { - if (false) LONGLONGS_EQUAL(1, 0) - else LONGLONGS_EQUAL(1, 1) + if (false) LONGLONGS_EQUAL(1, 0); + else LONGLONGS_EQUAL(1, 1); } IGNORE_TEST(UnitTestMacros, LONGLONGS_EQUALWorksInAnIgnoredTest) @@ -169,8 +169,8 @@ TEST(UnitTestMacros, TestLONGLONGS_EQUAL_TEXT) TEST(UnitTestMacros, LONGLONGS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) LONGLONGS_EQUAL_TEXT(1, 0, "Failed because it failed") - else LONGLONGS_EQUAL_TEXT(1, 1, "Failed because it failed") + if (false) LONGLONGS_EQUAL_TEXT(1, 0, "Failed because it failed"); + else LONGLONGS_EQUAL_TEXT(1, 1, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, LONGLONGS_EQUAL_TEXTWorksInAnIgnoredTest) @@ -193,8 +193,8 @@ TEST(UnitTestMacros, TestUNSIGNED_LONGLONGS_EQUAL) TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALBehavesAsProperMacro) { - if (false) UNSIGNED_LONGLONGS_EQUAL(1, 0) - else UNSIGNED_LONGLONGS_EQUAL(1, 1) + if (false) UNSIGNED_LONGLONGS_EQUAL(1, 0); + else UNSIGNED_LONGLONGS_EQUAL(1, 1); } IGNORE_TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALWorksInAnIgnoredTest) @@ -217,8 +217,8 @@ TEST(UnitTestMacros, TestUNSIGNED_LONGLONGS_EQUAL_TEXT) TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) UNSIGNED_LONGLONGS_EQUAL_TEXT(1, 0, "Failed because it failed") - else UNSIGNED_LONGLONGS_EQUAL_TEXT(1, 1, "Failed because it failed") + if (false) UNSIGNED_LONGLONGS_EQUAL_TEXT(1, 0, "Failed because it failed"); + else UNSIGNED_LONGLONGS_EQUAL_TEXT(1, 1, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUAL_TEXTWorksInAnIgnoredTest) @@ -266,8 +266,8 @@ TEST(UnitTestMacros, FailureWithCHECK) TEST(UnitTestMacros, CHECKBehavesAsProperMacro) { - if (false) CHECK(false) - else CHECK(true) + if (false) CHECK(false); + else CHECK(true); } IGNORE_TEST(UnitTestMacros, CHECKWorksInAnIgnoredTest) @@ -290,8 +290,8 @@ TEST(UnitTestMacros, FailureWithCHECK_TEXT) TEST(UnitTestMacros, CHECK_TEXTBehavesAsProperMacro) { - if (false) CHECK_TEXT(false, "false") - else CHECK_TEXT(true, "true") + if (false) CHECK_TEXT(false, "false"); + else CHECK_TEXT(true, "true"); } IGNORE_TEST(UnitTestMacros, CHECK_TEXTWorksInAnIgnoredTest) @@ -313,13 +313,13 @@ TEST(UnitTestMacros, FailureWithCHECK_TRUE) TEST(UnitTestMacros, CHECK_TRUEBehavesAsProperMacro) { - if (false) CHECK_TRUE(false) - else CHECK_TRUE(true) + if (false) CHECK_TRUE(false); + else CHECK_TRUE(true); } IGNORE_TEST(UnitTestMacros, CHECK_TRUEWorksInAnIgnoredTest) { - CHECK_TRUE(false) // LCOV_EXCL_LINE + CHECK_TRUE(false); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithCHECK_TRUE_TEXT() @@ -337,13 +337,13 @@ TEST(UnitTestMacros, FailureWithCHECK_TRUE_TEXT) TEST(UnitTestMacros, CHECK_TRUE_TEXTBehavesAsProperMacro) { - if (false) CHECK_TRUE_TEXT(false, "Failed because it failed") - else CHECK_TRUE_TEXT(true, "Failed because it failed") + if (false) CHECK_TRUE_TEXT(false, "Failed because it failed"); + else CHECK_TRUE_TEXT(true, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, CHECK_TRUE_TEXTWorksInAnIgnoredTest) { - CHECK_TRUE_TEXT(false, "Failed because it failed") // LCOV_EXCL_LINE + CHECK_TRUE_TEXT(false, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithCHECK_FALSE() @@ -360,13 +360,13 @@ TEST(UnitTestMacros, FailureWithCHECK_FALSE) TEST(UnitTestMacros, CHECK_FALSEBehavesAsProperMacro) { - if (false) CHECK_FALSE(true) - else CHECK_FALSE(false) + if (false) CHECK_FALSE(true); + else CHECK_FALSE(false); } IGNORE_TEST(UnitTestMacros, CHECK_FALSEWorksInAnIgnoredTest) { - CHECK_FALSE(true) // LCOV_EXCL_LINE + CHECK_FALSE(true); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithCHECK_FALSE_TEXT() @@ -384,13 +384,13 @@ TEST(UnitTestMacros, FailureWithCHECK_FALSE_TEXT) TEST(UnitTestMacros, CHECK_FALSE_TEXTBehavesAsProperMacro) { - if (false) CHECK_FALSE_TEXT(true, "Failed because it failed") - else CHECK_FALSE_TEXT(false, "Failed because it failed") + if (false) CHECK_FALSE_TEXT(true, "Failed because it failed"); + else CHECK_FALSE_TEXT(false, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, CHECK_FALSE_TEXTWorksInAnIgnoredTest) { - CHECK_FALSE_TEXT(true, "Failed because it failed") // LCOV_EXCL_LINE + CHECK_FALSE_TEXT(true, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithCHECK_EQUAL() @@ -421,13 +421,13 @@ TEST(UnitTestMacros, FailureWithCHECK_COMPARE) TEST(UnitTestMacros, CHECK_COMPAREBehavesAsProperMacro) { - if (false) CHECK_COMPARE(1, >, 2) - else CHECK_COMPARE(1, <, 2) + if (false) CHECK_COMPARE(1, >, 2); + else CHECK_COMPARE(1, <, 2); } IGNORE_TEST(UnitTestMacros, CHECK_COMPAREWorksInAnIgnoredTest) { - CHECK_COMPARE(1, >, 2) // LCOV_EXCL_LINE + CHECK_COMPARE(1, >, 2); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithCHECK_COMPARE_TEXT() @@ -446,13 +446,13 @@ TEST(UnitTestMacros, FailureWithCHECK_COMPARE_TEXT) TEST(UnitTestMacros, CHECK_COMPARE_TEXTBehavesAsProperMacro) { - if (false) CHECK_COMPARE_TEXT(1, >, 2, "1 bigger than 2") - else CHECK_COMPARE_TEXT(1, <, 2, "1 smaller than 2") + if (false) CHECK_COMPARE_TEXT(1, >, 2, "1 bigger than 2"); + else CHECK_COMPARE_TEXT(1, <, 2, "1 smaller than 2"); } IGNORE_TEST(UnitTestMacros, CHECK_COMPARE_TEXTWorksInAnIgnoredTest) { - CHECK_COMPARE_TEXT(1, >, 2, "1 smaller than 2") // LCOV_EXCL_LINE + CHECK_COMPARE_TEXT(1, >, 2, "1 smaller than 2"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static int countInCountingMethod; @@ -515,13 +515,13 @@ TEST(UnitTestMacros, failing_CHECK_EQUAL_withParamatersThatDontChangeWillNotGive TEST(UnitTestMacros, CHECK_EQUALBehavesAsProperMacro) { - if (false) CHECK_EQUAL(1, 2) - else CHECK_EQUAL(1, 1) + if (false) CHECK_EQUAL(1, 2); + else CHECK_EQUAL(1, 1); } IGNORE_TEST(UnitTestMacros, CHECK_EQUALWorksInAnIgnoredTest) { - CHECK_EQUAL(1, 2) // LCOV_EXCL_LINE + CHECK_EQUAL(1, 2); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithCHECK_EQUAL_TEXT() @@ -540,13 +540,13 @@ TEST(UnitTestMacros, FailureWithCHECK_EQUAL_TEXT) TEST(UnitTestMacros, CHECK_EQUAL_TEXTBehavesAsProperMacro) { - if (false) CHECK_EQUAL_TEXT(1, 2, "Failed because it failed") - else CHECK_EQUAL_TEXT(1, 1, "Failed because it failed") + if (false) CHECK_EQUAL_TEXT(1, 2, "Failed because it failed"); + else CHECK_EQUAL_TEXT(1, 1, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, CHECK_EQUAL_TEXTWorksInAnIgnoredTest) { - CHECK_EQUAL_TEXT(1, 2, "Failed because it failed") // LCOV_EXCL_LINE + CHECK_EQUAL_TEXT(1, 2, "Failed because it failed"); // LCOV_EXCL_LINE; } // LCOV_EXCL_LINE static void _failingTestMethodWithLONGS_EQUAL() @@ -581,13 +581,13 @@ TEST(UnitTestMacros, FailureWithLONGS_EQUALShowsSymbolicParameters) TEST(UnitTestMacros, LONGS_EQUALBehavesAsProperMacro) { - if (false) LONGS_EQUAL(1, 2) - else LONGS_EQUAL(10, 10) + if (false) LONGS_EQUAL(1, 2); + else LONGS_EQUAL(10, 10); } IGNORE_TEST(UnitTestMacros, LONGS_EQUALWorksInAnIgnoredTest) { - LONGS_EQUAL(11, 22) // LCOV_EXCL_LINE + LONGS_EQUAL(11, 22); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithLONGS_EQUAL_TEXT() @@ -606,13 +606,13 @@ TEST(UnitTestMacros, FailureWithLONGS_EQUALS_TEXT) TEST(UnitTestMacros, LONGS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) LONGS_EQUAL_TEXT(1, 2, "Failed because it failed") - else LONGS_EQUAL_TEXT(10, 10, "Failed because it failed") + if (false) LONGS_EQUAL_TEXT(1, 2, "Failed because it failed"); + else LONGS_EQUAL_TEXT(10, 10, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, LONGS_EQUAL_TEXTWorksInAnIgnoredTest) { - LONGS_EQUAL_TEXT(11, 22, "Failed because it failed") // LCOV_EXCL_LINE + LONGS_EQUAL_TEXT(11, 22, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithBYTES_EQUAL() @@ -630,13 +630,13 @@ TEST(UnitTestMacros, FailureWithBYTES_EQUAL) TEST(UnitTestMacros, BYTES_EQUALBehavesAsProperMacro) { - if (false) BYTES_EQUAL('a', 'b') - else BYTES_EQUAL('c', 'c') + if (false) BYTES_EQUAL('a', 'b'); + else BYTES_EQUAL('c', 'c'); } IGNORE_TEST(UnitTestMacros, BYTES_EQUALWorksInAnIgnoredTest) { - BYTES_EQUAL('q', 'w') // LCOV_EXCL_LINE + BYTES_EQUAL('q', 'w'); // LCOV_EXCL_LINE; } // LCOV_EXCL_LINE static void _failingTestMethodWithBYTES_EQUAL_TEXT() @@ -655,13 +655,13 @@ TEST(UnitTestMacros, FailureWithBYTES_EQUAL_TEXT) TEST(UnitTestMacros, BYTES_EQUAL_TEXTBehavesAsProperMacro) { - if (false) BYTES_EQUAL_TEXT('a', 'b', "Failed because it failed") - else BYTES_EQUAL_TEXT('c', 'c', "Failed because it failed") + if (false) BYTES_EQUAL_TEXT('a', 'b', "Failed because it failed"); + else BYTES_EQUAL_TEXT('c', 'c', "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, BYTES_EQUAL_TEXTWorksInAnIgnoredTest) { - BYTES_EQUAL_TEXT('q', 'w', "Failed because it failed") // LCOV_EXCL_LINE + BYTES_EQUAL_TEXT('q', 'w', "Failed because it failed"); // LCOV_EXCL_LINE; } // LCOV_EXCL_LINE static void _failingTestMethodWithSIGNED_BYTES_EQUAL() @@ -684,13 +684,13 @@ TEST(UnitTestMacros, FailureWithSIGNED_BYTES_EQUAL) TEST(UnitTestMacros, CHARS_EQUALBehavesAsProperMacro) { - if (false) SIGNED_BYTES_EQUAL(-1, -2) - else SIGNED_BYTES_EQUAL(-3, -3) + if (false) SIGNED_BYTES_EQUAL(-1, -2); + else SIGNED_BYTES_EQUAL(-3, -3); } IGNORE_TEST(UnitTestMacros, CHARS_EQUALWorksInAnIgnoredTest) { - SIGNED_BYTES_EQUAL(-7, 19) // LCOV_EXCL_LINE + SIGNED_BYTES_EQUAL(-7, 19); // LCOV_EXCL_LINE; } // LCOV_EXCL_LINE static void _failingTestMethodWithSIGNED_BYTES_EQUAL_TEXT() @@ -709,13 +709,13 @@ TEST(UnitTestMacros, FailureWithSIGNED_BYTES_EQUAL_TEXT) TEST(UnitTestMacros, CHARS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) SIGNED_BYTES_EQUAL_TEXT(-1, -2, "Failed because it failed") - else SIGNED_BYTES_EQUAL_TEXT(-3, -3, "Failed because it failed") + if (false) SIGNED_BYTES_EQUAL_TEXT(-1, -2, "Failed because it failed"); + else SIGNED_BYTES_EQUAL_TEXT(-3, -3, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, SIGNED_BYTES_EQUAL_TEXTWorksInAnIgnoredTest) { - SIGNED_BYTES_EQUAL_TEXT(-7, 19, "Failed because it failed") // LCOV_EXCL_LINE + SIGNED_BYTES_EQUAL_TEXT(-7, 19, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithPOINTERS_EQUAL() @@ -733,13 +733,13 @@ TEST(UnitTestMacros, FailureWithPOINTERS_EQUAL) TEST(UnitTestMacros, POINTERS_EQUALBehavesAsProperMacro) { - if (false) POINTERS_EQUAL(NULLPTR, to_void_pointer(0xbeefbeef)) - else POINTERS_EQUAL(to_void_pointer(0xdeadbeef), to_void_pointer(0xdeadbeef)) + if (false) POINTERS_EQUAL(NULLPTR, to_void_pointer(0xbeefbeef)); + else POINTERS_EQUAL(to_void_pointer(0xdeadbeef), to_void_pointer(0xdeadbeef)); } IGNORE_TEST(UnitTestMacros, POINTERS_EQUALWorksInAnIgnoredTest) { - POINTERS_EQUAL((void*) 0xbeef, (void*) 0xdead) // LCOV_EXCL_LINE + POINTERS_EQUAL((void*) 0xbeef, (void*) 0xdead); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithPOINTERS_EQUAL_TEXT() @@ -758,13 +758,13 @@ TEST(UnitTestMacros, FailureWithPOINTERS_EQUAL_TEXT) TEST(UnitTestMacros, POINTERS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) POINTERS_EQUAL_TEXT(NULLPTR, to_void_pointer(0xbeefbeef), "Failed because it failed") - else POINTERS_EQUAL_TEXT(to_void_pointer(0xdeadbeef), to_void_pointer(0xdeadbeef), "Failed because it failed") + if (false) POINTERS_EQUAL_TEXT(NULLPTR, to_void_pointer(0xbeefbeef), "Failed because it failed"); + else POINTERS_EQUAL_TEXT(to_void_pointer(0xdeadbeef), to_void_pointer(0xdeadbeef), "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, POINTERS_EQUAL_TEXTWorksInAnIgnoredTest) { - POINTERS_EQUAL_TEXT((void*) 0xbeef, (void*) 0xdead, "Failed because it failed") // LCOV_EXCL_LINE + POINTERS_EQUAL_TEXT((void*) 0xbeef, (void*) 0xdead, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE @@ -783,13 +783,13 @@ TEST(UnitTestMacros, FailureWithFUNCTIONPOINTERS_EQUAL) TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUALBehavesAsProperMacro) { - if (false) FUNCTIONPOINTERS_EQUAL(NULLPTR, to_func_pointer(0xbeefbeef)) - else FUNCTIONPOINTERS_EQUAL(to_func_pointer(0xdeadbeef), to_func_pointer(0xdeadbeef)) + if (false) FUNCTIONPOINTERS_EQUAL(NULLPTR, to_func_pointer(0xbeefbeef)); + else FUNCTIONPOINTERS_EQUAL(to_func_pointer(0xdeadbeef), to_func_pointer(0xdeadbeef)); } IGNORE_TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUALWorksInAnIgnoredTest) { - FUNCTIONPOINTERS_EQUAL((void (*)())0xbeef, (void (*)())0xdead) // LCOV_EXCL_LINE + FUNCTIONPOINTERS_EQUAL((void (*)())0xbeef, (void (*)())0xdead); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithFUNCTIONPOINTERS_EQUAL_TEXT() @@ -808,13 +808,13 @@ TEST(UnitTestMacros, FailureWithFUNCTIONPOINTERS_EQUAL_TEXT) TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUAL_TEXTBehavesAsProperMacro) { - if (false) FUNCTIONPOINTERS_EQUAL_TEXT(NULLPTR, to_func_pointer(0xbeefbeef), "Failed because it failed") - else FUNCTIONPOINTERS_EQUAL_TEXT(to_func_pointer(0xdeadbeef), to_func_pointer(0xdeadbeef), "Failed because it failed") + if (false) FUNCTIONPOINTERS_EQUAL_TEXT(NULLPTR, to_func_pointer(0xbeefbeef), "Failed because it failed"); + else FUNCTIONPOINTERS_EQUAL_TEXT(to_func_pointer(0xdeadbeef), to_func_pointer(0xdeadbeef), "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUAL_TEXTWorksInAnIgnoredTest) { - FUNCTIONPOINTERS_EQUAL_TEXT((void (*)())0xbeef, (void (*)())0xdead, "Failed because it failed") // LCOV_EXCL_LINE + FUNCTIONPOINTERS_EQUAL_TEXT((void (*)())0xbeef, (void (*)())0xdead, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE @@ -836,13 +836,13 @@ TEST(UnitTestMacros, FailureWithDOUBLES_EQUAL) TEST(UnitTestMacros, DOUBLES_EQUALBehavesAsProperMacro) { - if (false) DOUBLES_EQUAL(0.0, 1.1, 0.0005) - else DOUBLES_EQUAL(0.1, 0.2, 0.2) + if (false) DOUBLES_EQUAL(0.0, 1.1, 0.0005); + else DOUBLES_EQUAL(0.1, 0.2, 0.2); } IGNORE_TEST(UnitTestMacros, DOUBLES_EQUALWorksInAnIgnoredTest) { - DOUBLES_EQUAL(100.0, 0.0, 0.2) // LCOV_EXCL_LINE + DOUBLES_EQUAL(100.0, 0.0, 0.2); // LCOV_EXCL_LINE; } // LCOV_EXCL_LINE static void _failingTestMethodWithDOUBLES_EQUAL_TEXT() @@ -862,13 +862,13 @@ TEST(UnitTestMacros, FailureWithDOUBLES_EQUAL_TEXT) TEST(UnitTestMacros, DOUBLES_EQUAL_TEXTBehavesAsProperMacro) { - if (false) DOUBLES_EQUAL_TEXT(0.0, 1.1, 0.0005, "Failed because it failed") - else DOUBLES_EQUAL_TEXT(0.1, 0.2, 0.2, "Failed because it failed") + if (false) DOUBLES_EQUAL_TEXT(0.0, 1.1, 0.0005, "Failed because it failed"); + else DOUBLES_EQUAL_TEXT(0.1, 0.2, 0.2, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, DOUBLES_EQUAL_TEXTWorksInAnIgnoredTest) { - DOUBLES_EQUAL_TEXT(100.0, 0.0, 0.2, "Failed because it failed") // LCOV_EXCL_LINE + DOUBLES_EQUAL_TEXT(100.0, 0.0, 0.2, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static bool lineOfCodeExecutedAfterCheck = false; @@ -949,8 +949,8 @@ TEST(UnitTestMacros, allMacrosFromFunctionThatReturnsAValue) TEST(UnitTestMacros, MEMCMP_EQUALBehavesAsAProperMacro) { - if (false) MEMCMP_EQUAL("TEST", "test", 5) - else MEMCMP_EQUAL("TEST", "TEST", 5) + if (false) MEMCMP_EQUAL("TEST", "test", 5); + else MEMCMP_EQUAL("TEST", "TEST", 5); } IGNORE_TEST(UnitTestMacros, MEMCMP_EQUALWorksInAnIgnoredTest) @@ -1031,8 +1031,8 @@ TEST(UnitTestMacros, FailureWithMEMCMP_EQUAL_TEXT) TEST(UnitTestMacros, MEMCMP_EQUAL_TEXTBehavesAsAProperMacro) { - if (false) MEMCMP_EQUAL_TEXT("TEST", "test", 5, "Failed because it failed") - else MEMCMP_EQUAL_TEXT("TEST", "TEST", 5, "Failed because it failed") + if (false) MEMCMP_EQUAL_TEXT("TEST", "test", 5, "Failed because it failed"); + else MEMCMP_EQUAL_TEXT("TEST", "TEST", 5, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, MEMCMP_EQUAL_TEXTWorksInAnIgnoredTest) @@ -1042,8 +1042,8 @@ IGNORE_TEST(UnitTestMacros, MEMCMP_EQUAL_TEXTWorksInAnIgnoredTest) TEST(UnitTestMacros, BITS_EQUALBehavesAsAProperMacro) { - if (false) BITS_EQUAL(0x00, 0xFF, 0xFF) - else BITS_EQUAL(0x00, 0x00, 0xFF) + if (false) BITS_EQUAL(0x00, 0xFF, 0xFF); + else BITS_EQUAL(0x00, 0x00, 0xFF); } IGNORE_TEST(UnitTestMacros, BITS_EQUALWorksInAnIgnoredTest) @@ -1085,8 +1085,8 @@ TEST(UnitTestMacros, FailureWithBITS_EQUAL_TEXT) TEST(UnitTestMacros, BITS_EQUAL_TEXTBehavesAsAProperMacro) { - if (false) BITS_EQUAL_TEXT(0x00, 0xFF, 0xFF, "Failed because it failed") - else BITS_EQUAL_TEXT(0x00, 0x00, 0xFF, "Failed because it failed") + if (false) BITS_EQUAL_TEXT(0x00, 0xFF, 0xFF, "Failed because it failed"); + else BITS_EQUAL_TEXT(0x00, 0x00, 0xFF, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, BITS_EQUAL_TEXTWorksInAnIgnoredTest) @@ -1114,8 +1114,8 @@ TEST(UnitTestMacros, TestENUMS_EQUAL_INTWithScopedIntEnum) TEST(UnitTestMacros, ENUMS_EQUAL_INTWithScopedIntEnumBehavesAsProperMacro) { - if (false) ENUMS_EQUAL_INT(ScopedIntEnum::B, ScopedIntEnum::A) - else ENUMS_EQUAL_INT(ScopedIntEnum::B, ScopedIntEnum::B) + if (false) ENUMS_EQUAL_INT(ScopedIntEnum::B, ScopedIntEnum::A); + else ENUMS_EQUAL_INT(ScopedIntEnum::B, ScopedIntEnum::B); } IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_INTWithScopedIntEnumWorksInAnIgnoredTest) @@ -1138,8 +1138,8 @@ TEST(UnitTestMacros, TestENUMS_EQUAL_INT_TEXTWithScopedIntEnum) TEST(UnitTestMacros, ENUMS_EQUAL_INT_TEXTWithScopedIntEnumBehavesAsProperMacro) { - if (false) ENUMS_EQUAL_INT_TEXT(ScopedIntEnum::B, ScopedIntEnum::A, "Failed because it failed") - else ENUMS_EQUAL_INT_TEXT(ScopedIntEnum::B, ScopedIntEnum::B, "Failed because it failed") + if (false) ENUMS_EQUAL_INT_TEXT(ScopedIntEnum::B, ScopedIntEnum::A, "Failed because it failed"); + else ENUMS_EQUAL_INT_TEXT(ScopedIntEnum::B, ScopedIntEnum::B, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_EQUAL_INT_TEXTWithScopedIntEnumWorksInAnIgnoredTest) @@ -1166,8 +1166,8 @@ TEST(UnitTestMacros, TestENUMS_EQUAL_TYPEWithScopedLongEnum) TEST(UnitTestMacros, ENUMS_EQUAL_TYPEWithScopedLongEnumBehavesAsProperMacro) { - if (false) ENUMS_EQUAL_TYPE(long, ScopedLongEnum::B, ScopedLongEnum::A) - else ENUMS_EQUAL_TYPE(long, ScopedLongEnum::B, ScopedLongEnum::B) + if (false) ENUMS_EQUAL_TYPE(long, ScopedLongEnum::B, ScopedLongEnum::A); + else ENUMS_EQUAL_TYPE(long, ScopedLongEnum::B, ScopedLongEnum::B); } IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_TYPEWithScopedLongEnumWorksInAnIgnoredTest) @@ -1190,8 +1190,8 @@ TEST(UnitTestMacros, TestENUMS_EQUAL_TYPE_TEXTWithScopedLongEnum) TEST(UnitTestMacros, ENUMS_EQUAL_TYPE_TEXTWithScopedLongEnumBehavesAsProperMacro) { - if (false) ENUMS_EQUAL_TYPE_TEXT(long, ScopedLongEnum::B, ScopedLongEnum::A, "Failed because it failed") - else ENUMS_EQUAL_TYPE_TEXT(long, ScopedLongEnum::B, ScopedLongEnum::B, "Failed because it failed") + if (false) ENUMS_EQUAL_TYPE_TEXT(long, ScopedLongEnum::B, ScopedLongEnum::A, "Failed because it failed"); + else ENUMS_EQUAL_TYPE_TEXT(long, ScopedLongEnum::B, ScopedLongEnum::B, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_EQUAL_TYPE_TEXTWithScopedLongEnumWorksInAnIgnoredTest) @@ -1220,8 +1220,8 @@ TEST(UnitTestMacros, TestENUMS_EQUAL_INTWithUnscopedEnum) TEST(UnitTestMacros, ENUMS_EQUAL_INTWithUnscopedEnumBehavesAsProperMacro) { - if (false) ENUMS_EQUAL_INT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A) - else ENUMS_EQUAL_INT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_B) + if (false) ENUMS_EQUAL_INT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A); + else ENUMS_EQUAL_INT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_B); } IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_INTWithUnscopedEnumWorksInAnIgnoredTest) @@ -1244,8 +1244,8 @@ TEST(UnitTestMacros, TestENUMS_EQUAL_INT_TEXTWithUnscopedEnum) TEST(UnitTestMacros, ENUMS_EQUAL_INT_TEXTWithUnscopedEnumBehavesAsProperMacro) { - if (false) ENUMS_EQUAL_INT_TEXT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A, "Failed because it failed") - else ENUMS_EQUAL_INT_TEXT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_B, "Failed because it failed") + if (false) ENUMS_EQUAL_INT_TEXT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A, "Failed because it failed"); + else ENUMS_EQUAL_INT_TEXT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_B, "Failed because it failed"); } IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_EQUAL_INT_TEXTWithUnscopedEnumWorksInAnIgnoredTest) diff --git a/tests/CppUTest/TestUTestStringMacro.cpp b/tests/CppUTest/TestUTestStringMacro.cpp index 27e1e0df2..5d558bb08 100644 --- a/tests/CppUTest/TestUTestStringMacro.cpp +++ b/tests/CppUTest/TestUTestStringMacro.cpp @@ -172,13 +172,13 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUAL) TEST(UnitTestStringMacros, STRCMP_EQUALBehavesAsProperMacro) { - if (false) STRCMP_EQUAL("1", "2") - else STRCMP_EQUAL("1", "1") + if (false) STRCMP_EQUAL("1", "2"); + else STRCMP_EQUAL("1", "1"); } IGNORE_TEST(UnitTestStringMacros, STRCMP_EQUALWorksInAnIgnoredTest) { - STRCMP_EQUAL("Hello", "World") // LCOV_EXCL_LINE + STRCMP_EQUAL("Hello", "World"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithSTRCMP_EQUAL_TEXT() @@ -197,13 +197,13 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUAL_TEXT) TEST(UnitTestStringMacros, STRCMP_EQUAL_TEXTBehavesAsProperMacro) { - if (false) STRCMP_EQUAL_TEXT("1", "2", "Failed because it failed") - else STRCMP_EQUAL_TEXT("1", "1", "Failed because it failed") + if (false) STRCMP_EQUAL_TEXT("1", "2", "Failed because it failed"); + else STRCMP_EQUAL_TEXT("1", "1", "Failed because it failed"); } IGNORE_TEST(UnitTestStringMacros, STRCMP_EQUAL_TEXTWorksInAnIgnoredTest) { - STRCMP_EQUAL_TEXT("Hello", "World", "Failed because it failed") // LCOV_EXCL_LINE + STRCMP_EQUAL_TEXT("Hello", "World", "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithSTRNCMP_EQUAL() @@ -221,13 +221,13 @@ TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUAL) TEST(UnitTestStringMacros, STRNCMP_EQUALBehavesAsProperMacro) { - if (false) STRNCMP_EQUAL("1", "2", 1) - else STRNCMP_EQUAL("1", "1", 1) + if (false) STRNCMP_EQUAL("1", "2", 1); + else STRNCMP_EQUAL("1", "1", 1); } IGNORE_TEST(UnitTestStringMacros, STRNCMP_EQUALWorksInAnIgnoredTest) { - STRNCMP_EQUAL("Hello", "World", 3) // LCOV_EXCL_LINE + STRNCMP_EQUAL("Hello", "World", 3); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithSTRNCMP_EQUAL_TEXT() @@ -246,13 +246,13 @@ TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUAL_TEXT) TEST(UnitTestStringMacros, STRNCMP_EQUAL_TEXTBehavesAsProperMacro) { - if (false) STRNCMP_EQUAL_TEXT("1", "2", 1, "Failed because it failed") - else STRNCMP_EQUAL_TEXT("1", "1", 1, "Failed because it failed") + if (false) STRNCMP_EQUAL_TEXT("1", "2", 1, "Failed because it failed"); + else STRNCMP_EQUAL_TEXT("1", "1", 1, "Failed because it failed"); } IGNORE_TEST(UnitTestStringMacros, STRNCMP_EQUAL_TEXTWorksInAnIgnoredTest) { - STRNCMP_EQUAL_TEXT("Hello", "World", 3, "Failed because it failed") // LCOV_EXCL_LINE + STRNCMP_EQUAL_TEXT("Hello", "World", 3, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithSTRCMP_NOCASE_EQUAL() @@ -270,13 +270,13 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUAL) TEST(UnitTestStringMacros, STRCMP_NOCASE_EQUALBehavesAsProperMacro) { - if (false) STRCMP_NOCASE_EQUAL("1", "2") - else STRCMP_NOCASE_EQUAL("1", "1") + if (false) STRCMP_NOCASE_EQUAL("1", "2"); + else STRCMP_NOCASE_EQUAL("1", "1"); } IGNORE_TEST(UnitTestStringMacros, STRCMP_NOCASE_EQUALWorksInAnIgnoredTest) { - STRCMP_NOCASE_EQUAL("Hello", "World") // LCOV_EXCL_LINE + STRCMP_NOCASE_EQUAL("Hello", "World"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithSTRCMP_NOCASE_EQUAL_TEXT() @@ -295,13 +295,13 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUAL_TEXT) TEST(UnitTestStringMacros, STRCMP_NOCASE_EQUAL_TEXTBehavesAsProperMacro) { - if (false) STRCMP_NOCASE_EQUAL_TEXT("1", "2", "Failed because it failed") - else STRCMP_NOCASE_EQUAL_TEXT("1", "1", "Failed because it failed") + if (false) STRCMP_NOCASE_EQUAL_TEXT("1", "2", "Failed because it failed"); + else STRCMP_NOCASE_EQUAL_TEXT("1", "1", "Failed because it failed"); } IGNORE_TEST(UnitTestStringMacros, STRCMP_NOCASE_EQUAL_TEXTWorksInAnIgnoredTest) { - STRCMP_NOCASE_EQUAL_TEXT("Hello", "World", "Failed because it failed") // LCOV_EXCL_LINE + STRCMP_NOCASE_EQUAL_TEXT("Hello", "World", "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithSTRCMP_CONTAINS() @@ -319,13 +319,13 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINS) TEST(UnitTestStringMacros, STRCMP_CONTAINSBehavesAsProperMacro) { - if (false) STRCMP_CONTAINS("1", "2") - else STRCMP_CONTAINS("1", "1") + if (false) STRCMP_CONTAINS("1", "2"); + else STRCMP_CONTAINS("1", "1"); } IGNORE_TEST(UnitTestStringMacros, STRCMP_CONTAINSWorksInAnIgnoredTest) { - STRCMP_CONTAINS("Hello", "World") // LCOV_EXCL_LINE + STRCMP_CONTAINS("Hello", "World"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithSTRCMP_CONTAINS_TEXT() @@ -344,13 +344,13 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINS_TEXT) TEST(UnitTestStringMacros, STRCMP_CONTAINS_TEXTBehavesAsProperMacro) { - if (false) STRCMP_CONTAINS_TEXT("1", "2", "Failed because it failed") - else STRCMP_CONTAINS_TEXT("1", "1", "Failed because it failed") + if (false) STRCMP_CONTAINS_TEXT("1", "2", "Failed because it failed"); + else STRCMP_CONTAINS_TEXT("1", "1", "Failed because it failed"); } IGNORE_TEST(UnitTestStringMacros, STRCMP_CONTAINS_TEXTWorksInAnIgnoredTest) { - STRCMP_CONTAINS_TEXT("Hello", "World", "Failed because it failed") // LCOV_EXCL_LINE + STRCMP_CONTAINS_TEXT("Hello", "World", "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithSTRCMP_NOCASE_CONTAINS() @@ -368,13 +368,13 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_CONTAINS) TEST(UnitTestStringMacros, STRCMP_NOCASE_CONTAINSBehavesAsProperMacro) { - if (false) STRCMP_NOCASE_CONTAINS("never", "executed") - else STRCMP_NOCASE_CONTAINS("hello", "HELLO WORLD") + if (false) STRCMP_NOCASE_CONTAINS("never", "executed"); + else STRCMP_NOCASE_CONTAINS("hello", "HELLO WORLD"); } IGNORE_TEST(UnitTestStringMacros, STRCMP_NO_CASE_CONTAINSWorksInAnIgnoredTest) { - STRCMP_NOCASE_CONTAINS("Hello", "World") // LCOV_EXCL_LINE + STRCMP_NOCASE_CONTAINS("Hello", "World"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE static void _failingTestMethodWithSTRCMP_NOCASE_CONTAINS_TEXT() @@ -393,13 +393,13 @@ TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_CONTAINS_TEXT) TEST(UnitTestStringMacros, STRCMP_NOCASE_CONTAINS_TEXTBehavesAsProperMacro) { - if (false) STRCMP_NOCASE_CONTAINS_TEXT("never", "executed", "Failed because it failed") - else STRCMP_NOCASE_CONTAINS_TEXT("hello", "HELLO WORLD", "Failed because it failed") + if (false) STRCMP_NOCASE_CONTAINS_TEXT("never", "executed", "Failed because it failed"); + else STRCMP_NOCASE_CONTAINS_TEXT("hello", "HELLO WORLD", "Failed because it failed"); } IGNORE_TEST(UnitTestStringMacros, STRCMP_NO_CASE_CONTAINS_TEXTWorksInAnIgnoredTest) { - STRCMP_NOCASE_CONTAINS_TEXT("Hello", "World", "Failed because it failed") // LCOV_EXCL_LINE + STRCMP_NOCASE_CONTAINS_TEXT("Hello", "World", "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, NFirstCharsComparison) diff --git a/tests/CppUTestExt/MockPluginTest.cpp b/tests/CppUTestExt/MockPluginTest.cpp index ffe714f07..3e0dc5817 100644 --- a/tests/CppUTestExt/MockPluginTest.cpp +++ b/tests/CppUTestExt/MockPluginTest.cpp @@ -65,7 +65,7 @@ TEST(MockPlugin, checkExpectationsAndClearAtEnd) plugin.postTestAction(*test, *result); - STRCMP_CONTAINS(expectedFailure.getMessage().asCharString(), output.getOutput().asCharString()) + STRCMP_CONTAINS(expectedFailure.getMessage().asCharString(), output.getOutput().asCharString()); LONGS_EQUAL(0, mock().expectedCallsLeft()); CHECK_NO_MOCK_FAILURE(); } @@ -83,7 +83,7 @@ TEST(MockPlugin, checkExpectationsWorksAlsoWithHierachicalObjects) plugin.postTestAction(*test, *result); - STRCMP_CONTAINS(expectedFailure.getMessage().asCharString(), output.getOutput().asCharString()) + STRCMP_CONTAINS(expectedFailure.getMessage().asCharString(), output.getOutput().asCharString()); CHECK_NO_MOCK_FAILURE(); } From 87497ab717ff0c3cee89c60a009bfd1baa083963 Mon Sep 17 00:00:00 2001 From: offa Date: Sat, 27 Apr 2019 16:47:12 +0200 Subject: [PATCH 0224/1093] Empty expression removed. --- src/CppUTest/JUnitTestOutput.cpp | 1 - src/CppUTest/TestFailure.cpp | 2 +- tests/CppUTest/SetPluginTest.cpp | 1 - tests/CppUTestExt/MemoryReporterPluginTest.cpp | 4 ++-- tests/CppUTestExt/MockCallTest.cpp | 4 ++-- tests/CppUTestExt/MockParameterTest.cpp | 2 +- 6 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index bf2dd9e38..1aef4e2e6 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -92,7 +92,6 @@ void JUnitTestOutput::resetTestGroupResult() JUnitTestCaseResultNode* cur = impl_->results_.head_; while (cur) { JUnitTestCaseResultNode* tmp = cur->next_; - ; delete cur->failure_; delete cur; cur = tmp; diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index a3e615de8..5fb21fce5 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -387,5 +387,5 @@ FeatureUnsupportedFailure::FeatureUnsupportedFailure(UtestShell* test, const cha { message_ = createUserText(text); - message_ += StringFromFormat("The feature \"%s\" is not supported in this environment or with the feature set selected when building the library.", featureName.asCharString());; + message_ += StringFromFormat("The feature \"%s\" is not supported in this environment or with the feature set selected when building the library.", featureName.asCharString()); } diff --git a/tests/CppUTest/SetPluginTest.cpp b/tests/CppUTest/SetPluginTest.cpp index d62cd5bcd..c26a51258 100644 --- a/tests/CppUTest/SetPluginTest.cpp +++ b/tests/CppUTest/SetPluginTest.cpp @@ -77,7 +77,6 @@ class FunctionPointerUtestShell: public UtestShell TEST(SetPointerPluginTest, installTwoFunctionPointer) { FunctionPointerUtestShell *tst = new FunctionPointerUtestShell(); - ; fp1 = orig_func1; fp2 = orig_func2; diff --git a/tests/CppUTestExt/MemoryReporterPluginTest.cpp b/tests/CppUTestExt/MemoryReporterPluginTest.cpp index aa1b9550e..c359fb2a4 100644 --- a/tests/CppUTestExt/MemoryReporterPluginTest.cpp +++ b/tests/CppUTestExt/MemoryReporterPluginTest.cpp @@ -178,8 +178,8 @@ TEST(MemoryReporterPlugin, preTestActionReportsTest) TEST(MemoryReporterPlugin, postTestActionReportsTest) { - mock("formatter").expectOneCall("report_test_end").withParameter("result", result).withParameter("test", test);; - mock("formatter").expectOneCall("report_testgroup_end").withParameter("result", result).withParameter("test", test);; + mock("formatter").expectOneCall("report_test_end").withParameter("result", result).withParameter("test", test); + mock("formatter").expectOneCall("report_testgroup_end").withParameter("result", result).withParameter("test", test); reporter->postTestAction(*test, *result); } diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index 9d709446c..a260e6909 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -301,7 +301,7 @@ TEST(MockCallTest, ignoreOtherCallsExceptForTheExpectedOne) { mock().expectOneCall("foo"); mock().ignoreOtherCalls(); - mock().actualCall("bar").withParameter("foo", 1);; + mock().actualCall("bar").withParameter("foo", 1); mock().clear(); } @@ -392,7 +392,7 @@ TEST(MockCallTest, OnObjectIgnored_InitialMatchDiscarded) mock().expectOneCall("boo"); mock().expectOneCall("boo").withBoolParameter("p", true); - mock().actualCall("boo").onObject(objectPtr2).withBoolParameter("p", true);; + mock().actualCall("boo").onObject(objectPtr2).withBoolParameter("p", true); mock().actualCall("boo").onObject(objectPtr1); } diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 0ff8ebee1..476ccc83d 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -616,7 +616,7 @@ TEST(MockParameterTest, newCallStartsWhileNotAllParametersWerePassed) mock().expectOneCall("foo").withParameter("p1", 1); mock().actualCall("foo"); - mock().actualCall("foo").withParameter("p1", 1);; + mock().actualCall("foo").withParameter("p1", 1); CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } From 45e79cc23bdb98f0776c4a66aae48983527f1e65 Mon Sep 17 00:00:00 2001 From: Asger Graarup Overby Date: Wed, 5 Jun 2019 16:22:25 +0200 Subject: [PATCH 0225/1093] Enable cmake buildtime discover tests for CppuUTest clients. --- CMakeLists.txt | 4 ++++ CppUTestConfig.cmake.install.in | 1 + .../CppUTestBuildTimeDiscoverTests.cmake | 22 +++++++++++++----- .../CppUTestBuildTimeDiscoverTests.cmake | 23 ++++++++++++------- src/CppUTest/CMakeLists.txt | 2 +- src/CppUTestExt/CMakeLists.txt | 8 +++++++ 6 files changed, 45 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a882b2bd..0f655fc9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -141,6 +141,10 @@ if(PkgHelpers_AVAILABLE) DESTINATION ${LIB_INSTALL_DIR}/CppUTest/cmake ) install(EXPORT CppUTestTargets DESTINATION ${LIB_INSTALL_DIR}/CppUTest/cmake) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake + DESTINATION ${LIB_INSTALL_DIR}/CppUTest/cmake/Scripts) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake + DESTINATION ${LIB_INSTALL_DIR}/CppUTest/cmake/Modules) configure_package_config_file(CppUTestConfig.cmake.build.in ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfig.cmake INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} diff --git a/CppUTestConfig.cmake.install.in b/CppUTestConfig.cmake.install.in index 2edba1c1d..3e6b91e00 100644 --- a/CppUTestConfig.cmake.install.in +++ b/CppUTestConfig.cmake.install.in @@ -3,5 +3,6 @@ set_and_check(CppUTest_INCLUDE_DIRS "@PACKAGE_INCLUDE_INSTALL_DIR@") include("${CMAKE_CURRENT_LIST_DIR}/CppUTestTargets.cmake") set(CppUTest_LIBRARIES CppUTest CppUTestExt) +include("${CMAKE_CURRENT_LIST_DIR}/Modules/CppUTestBuildTimeDiscoverTests.cmake") check_required_components(CppUTest) diff --git a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake index 57a5649ed..49b297319 100644 --- a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake +++ b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake @@ -1,9 +1,19 @@ # Create target to discover tests function (cpputest_buildtime_discover_tests EXECUTABLE) - add_custom_command (TARGET ${EXECUTABLE} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -DTESTS_DETAILED:BOOL=${TESTS_DETAILED} -DEXECUTABLE=${EXECUTABLE} -P ${PROJECT_SOURCE_DIR}/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - COMMENT "Discovering Tests in ${EXECUTABLE}" - VERBATIM) + # The path to the discover script depends on execution mode: + # - internal (building CppUTest it self). + # - imported (installed, imported, and executed by a client of the CppUTest lib) + if (PROJECT_NAME STREQUAL "CppUTest") # internal - (path is relative to source dir) + SET(DISCOVER_SCRIPT ${PROJECT_SOURCE_DIR}/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake) + else (PROJECT_NAME STREQUAL "CppUTest") # Installed (path is relative to install directory) + SET(DISCOVER_SCRIPT ${CppUTest_DIR}/Scripts/CppUTestBuildTimeDiscoverTests.cmake) + endif (PROJECT_NAME STREQUAL "CppUTest") + + add_custom_command (TARGET ${EXECUTABLE} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -DTESTS_DETAILED:BOOL=${TESTS_DETAILED} -DEXECUTABLE=$ -P ${DISCOVER_SCRIPT} + VERBATIM + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Discovering Tests in ${EXECUTABLE}" + VERBATIM) endfunction () diff --git a/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake b/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake index 901e08bbc..01eb45b3c 100644 --- a/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake +++ b/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake @@ -5,6 +5,13 @@ # # This script is to be called from ../Modules/CppUTestBuildTimeDiscoverTests.cmake # +# Notes on invocation and used variables: +# ${CMAKE_COMMAND} -DTESTS_DETAILED:BOOL= -DEXECUTABLE= -P +# +# TESTS_DETAILED c.f. top-level CMakeLists.txt +# FULLPATH-TO-EXECUTABLE - use $ or explicit +# The overwritten CTestTestfile.cmake is located in ${CMAKE_CURRENT_BINARY_DIR} +# # Steps to generate ADD_TEST() commands build time # - Read CTestTestfile.cmake # - Create update entries @@ -33,13 +40,13 @@ function (JOIN VALUES GLUE OUTPUT) set (${OUTPUT} "${_TMP_STR}" PARENT_SCOPE) endfunction() -function (buildtime_discover_tests EXECUTABLE_CMD DISCOVER_ARG OUTPUT) - execute_process(COMMAND ${EXECUTABLE_CMD} ${DISCOVER_ARG} +function (buildtime_discover_tests EXECUTABLE DISCOVER_ARG OUTPUT) + execute_process(COMMAND ${EXECUTABLE} ${DISCOVER_ARG} OUTPUT_VARIABLE _TMP_OUTPUT ERROR_VARIABLE DISCOVER_ERR RESULT_VARIABLE DISCOVER_ERR) if(NOT ${DISCOVER_ERR} EQUAL 0) - message(SEND_ERROR "Executable \"${EXECUTABLE_CMD} ${DISCOVER_ARG}\" failed with output:\n" + message(SEND_ERROR "Executable \"${EXECUTABLE} ${DISCOVER_ARG}\" failed with output:\n" "${DISCOVER_ERR}\n" "Please check that the excutable was added.") endif(NOT ${DISCOVER_ERR} EQUAL 0) @@ -54,11 +61,11 @@ endfunction() set(CTESTFNAME "${CMAKE_CURRENT_BINARY_DIR}/CTestTestfile.cmake") file(STRINGS ${CTESTFNAME} CTESTTESTS) -set(EXECUTABLE_CMD "${CMAKE_CURRENT_BINARY_DIR}/${EXECUTABLE}") +get_filename_component(EXECUTABLE_SHORT_NAME ${EXECUTABLE} NAME_WE) if (TESTS_DETAILED) set(DISCOVER_ARG "-ln") - buildtime_discover_tests("${EXECUTABLE_CMD}" "${DISCOVER_ARG}" TestList_GroupsAndNames) + buildtime_discover_tests("${EXECUTABLE}" "${DISCOVER_ARG}" TestList_GroupsAndNames) set(lastgroup "") foreach(testfullname ${TestList_GroupsAndNames}) string(REGEX MATCH "^([^/.]+)" groupname ${testfullname}) @@ -68,14 +75,14 @@ if (TESTS_DETAILED) set(lastgroup "${groupname}") endif (NOT ("${groupname}" STREQUAL "${lastgroup}")) message("... ${testname}") - buildtime_add_test(${EXECUTABLE}.${testfullname} ${EXECUTABLE_CMD} -sg ${groupname} -sn ${testname} -c) + buildtime_add_test(${EXECUTABLE_SHORT_NAME}.${testfullname} ${EXECUTABLE} -sg ${groupname} -sn ${testname}) endforeach() else (TESTS_DETAILED) set(DISCOVER_ARG "-lg") - buildtime_discover_tests("${EXECUTABLE_CMD}" "${DISCOVER_ARG}" TestList_Groups) + buildtime_discover_tests("${EXECUTABLE}" "${DISCOVER_ARG}" TestList_Groups) foreach(group ${TestList_Groups}) message("TestGroup: ${group}") - buildtime_add_test(${EXECUTABLE}.${group} "${EXECUTABLE_CMD}" -sg ${group} -c) + buildtime_add_test(${EXECUTABLE_SHORT_NAME}.${group} "${EXECUTABLE}" -sg ${group}) endforeach() endif (TESTS_DETAILED) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index b2272b96b..6b950d5e2 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -31,7 +31,7 @@ endif(CPP_PLATFORM) target_include_directories(CppUTest PUBLIC $ - $ + $ ) set(CppUTest_headers diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index ddcf28f78..01fcf70e7 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -40,6 +40,14 @@ set(CppUTestExt_headers add_library(CppUTestExt STATIC ${CppUTestExt_src} ${CppUTestExt_headers}) target_link_libraries(CppUTestExt ${CPPUNIT_EXTERNAL_LIBRARIES}) + +#[[Arrange for the include directory to be added to the include paths of any CMake target depending on CppUTestExt.]] +target_include_directories(CppUTestExt + PUBLIC + $ + $ +) + set_target_properties(CppUTestExt PROPERTIES PUBLIC_HEADER "${CppUTestExt_headers}") install(TARGETS CppUTestExt From 711fbc75fe9ec9ca4176e2774d22fb52c879c584 Mon Sep 17 00:00:00 2001 From: Stefan Misik Date: Wed, 12 Jun 2019 10:36:44 +0200 Subject: [PATCH 0226/1093] Add Shuffle.h to autotools install Autotools-generated makefile now installs Shuffle.h, which was previously omitted, causing failures when compiling tests. --- Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.am b/Makefile.am index 4ef0c6b02..093348cf3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -66,6 +66,7 @@ include_cpputest_HEADERS = \ include/CppUTest/MemoryLeakWarningPlugin.h \ include/CppUTest/PlatformSpecificFunctions.h \ include/CppUTest/PlatformSpecificFunctions_c.h \ + include/CppUTest/Shuffle.h \ include/CppUTest/SimpleString.h \ include/CppUTest/SimpleMutex.h \ include/CppUTest/StandardCLibrary.h \ From 1cfa42c9c85e19012ef6619c87bd7eb4080f2293 Mon Sep 17 00:00:00 2001 From: Michael Altizer Date: Mon, 22 Jul 2019 00:18:12 -0400 Subject: [PATCH 0227/1093] Fix missing class member function override specifiers This fixes a handful of pedantic compiler and static analysis warnings. --- include/CppUTest/TestOutput.h | 34 +++++++++++++++++----------------- include/CppUTest/Utest.h | 2 +- include/CppUTest/UtestMacros.h | 4 ++-- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/include/CppUTest/TestOutput.h b/include/CppUTest/TestOutput.h index d7908fec4..868ffa315 100644 --- a/include/CppUTest/TestOutput.h +++ b/include/CppUTest/TestOutput.h @@ -178,24 +178,24 @@ class CompositeTestOutput : public TestOutput CompositeTestOutput(); virtual ~CompositeTestOutput(); - virtual void printTestsStarted(); - virtual void printTestsEnded(const TestResult& result); - - virtual void printCurrentTestStarted(const UtestShell& test); - virtual void printCurrentTestEnded(const TestResult& res); - virtual void printCurrentGroupStarted(const UtestShell& test); - virtual void printCurrentGroupEnded(const TestResult& res); - - virtual void verbose(); - virtual void color(); - virtual void printBuffer(const char*); - virtual void print(const char*); - virtual void print(long); - virtual void printDouble(double); - virtual void printFailure(const TestFailure& failure); - virtual void setProgressIndicator(const char*); + virtual void printTestsStarted() _override; + virtual void printTestsEnded(const TestResult& result) _override; + + virtual void printCurrentTestStarted(const UtestShell& test) _override; + virtual void printCurrentTestEnded(const TestResult& res) _override; + virtual void printCurrentGroupStarted(const UtestShell& test) _override; + virtual void printCurrentGroupEnded(const TestResult& res) _override; + + virtual void verbose() _override; + virtual void color() _override; + virtual void printBuffer(const char*) _override; + virtual void print(const char*) _override; + virtual void print(long) _override; + virtual void printDouble(double) _override; + virtual void printFailure(const TestFailure& failure) _override; + virtual void setProgressIndicator(const char*) _override; - virtual void flush(); + virtual void flush() _override; protected: CompositeTestOutput(const TestOutput&); diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 2affa599e..b7aed93b8 100755 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -207,7 +207,7 @@ class ExecFunctionTestShell: public UtestShell tear), testFunction_(NULLPTR) { } - Utest* createTest() { return new ExecFunctionTest(this); } + Utest* createTest() _override { return new ExecFunctionTest(this); } virtual ~ExecFunctionTestShell(); }; diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index a519fe7c5..4987287f4 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -62,7 +62,7 @@ \ class TEST_##testGroup##_##testName##_Test : public TEST_GROUP_##CppUTestGroup##testGroup \ { public: TEST_##testGroup##_##testName##_Test () : TEST_GROUP_##CppUTestGroup##testGroup () {} \ - void testBody(); }; \ + void testBody() _override; }; \ class TEST_##testGroup##_##testName##_TestShell : public UtestShell { \ virtual Utest* createTest() _override { return new TEST_##testGroup##_##testName##_Test; } \ } TEST_##testGroup##_##testName##_TestShell_instance; \ @@ -76,7 +76,7 @@ \ class IGNORE##testGroup##_##testName##_Test : public TEST_GROUP_##CppUTestGroup##testGroup \ { public: IGNORE##testGroup##_##testName##_Test () : TEST_GROUP_##CppUTestGroup##testGroup () {} \ - public: void testBody (); }; \ + public: void testBody() _override; }; \ class IGNORE##testGroup##_##testName##_TestShell : public IgnoredUtestShell { \ virtual Utest* createTest() _override { return new IGNORE##testGroup##_##testName##_Test; } \ } IGNORE##testGroup##_##testName##_TestShell_instance; \ From 4231f4762ab389d597176d1a11feba2aabb0a5ea Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 23 Jul 2019 18:14:26 +0200 Subject: [PATCH 0228/1093] Disable inconsistent-missing-destructor-override Warning. --- cmake/Modules/CppUTestWarningFlags.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index 08a3a855d..aa11bfc01 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -69,6 +69,7 @@ else (MSVC) Wno-c++98-compat Wno-c++98-compat-pedantic Wno-c++14-compat + Wno-inconsistent-missing-destructor-override ) endif (C++11) From 9e79a9c872154abc96e507761a6fc38d3b1d4f41 Mon Sep 17 00:00:00 2001 From: Jak_o_Shadows Date: Sat, 3 Aug 2019 23:59:06 +0930 Subject: [PATCH 0229/1093] Force line endings to fix libtoolize error. Fixes : "AC_CONFIG_MACRO_DIR([m4]) conflicts with ACLOCAL_AFLAGS=-I m4" error --- .gitattributes | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitattributes b/.gitattributes index 089225dce..b2b0cd5f5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13,3 +13,8 @@ *.mak text eol=crlf *.vcproj text eol=crlf *.vcxproj text eol=crlf + + +*.sh -crlf +*.ac -crlf +*.am -crlf From 774dc95b43b0abea2b9d82611fc940a6aaa76f3a Mon Sep 17 00:00:00 2001 From: "SEL\\dandw" Date: Thu, 5 Sep 2019 17:38:16 -0700 Subject: [PATCH 0230/1093] Add header that defines std::nullptr_t. --- include/CppUTest/SimpleString.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 2d47882ce..5e19b32bd 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -180,6 +180,8 @@ SimpleString BracketsFormattedHexString(SimpleString hexString); * Specifically std::nullptr_t is not officially supported */ #if __cplusplus > 199711L && !defined __arm__ +/* Needed for std::nullptr_t */ +#include SimpleString StringFrom(const std::nullptr_t value); #endif From 51e9babbca58adcd241d1ded774734b375bc6002 Mon Sep 17 00:00:00 2001 From: "SEL\\dandw" Date: Thu, 5 Sep 2019 18:23:17 -0700 Subject: [PATCH 0231/1093] Reflect lack of floating point support for GreenHills compiler on the ColdFire processor. Here is an excerpt from "MULTI Compiler 2017.1 Release Notes for Embedded 68K/ColdFire": Changes in fenv.h: The fenv.h header file no longer defines the floating-point exception macros FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, and FE_UNDERFLOW. In addition, the FE_ALL_EXCEPT macro is now defined as 0. This change more clearly indicates the compiler's lack of support for floating-point exceptions. --- include/CppUTest/CppUTestConfig.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index be9e331a3..24dca5f5c 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -169,10 +169,13 @@ /* * Handling of IEEE754 floating point exceptions via fenv.h - * Works on non-Visual C++ compilers and Visual C++ 2008 and newer + * Predominantly works on non-Visual C++ compilers and Visual C++ 2008 and newer */ -#if CPPUTEST_USE_STD_C_LIB && (!defined(_MSC_VER) || (_MSC_VER >= 1800)) && (!defined(__APPLE__)) +#if CPPUTEST_USE_STD_C_LIB && \ + (!defined(_MSC_VER) || (_MSC_VER >= 1800)) && \ + (!defined(__APPLE__)) && \ + (!defined(__ghs__) || !defined(__ColdFire__)) #define CPPUTEST_HAVE_FENV #if defined(__WATCOMC__) || defined(__ARMEL__) || defined(__m68k__) #define CPPUTEST_FENV_IS_WORKING_PROPERLY 0 From 61072d9e378b0a757e85667ebbd0bbc5792ae283 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 7 Sep 2019 09:03:46 +0800 Subject: [PATCH 0232/1093] Removed the executable flag on header files --- include/CppUTest/CommandLineArguments.h | 0 include/CppUTest/TestRegistry.h | 0 include/CppUTest/TestTestingFixture.h | 0 include/CppUTest/Utest.h | 0 include/CppUTest/UtestMacros.h | 0 5 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 include/CppUTest/CommandLineArguments.h mode change 100755 => 100644 include/CppUTest/TestRegistry.h mode change 100755 => 100644 include/CppUTest/TestTestingFixture.h mode change 100755 => 100644 include/CppUTest/Utest.h mode change 100755 => 100644 include/CppUTest/UtestMacros.h diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h old mode 100755 new mode 100644 diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h old mode 100755 new mode 100644 diff --git a/include/CppUTest/TestTestingFixture.h b/include/CppUTest/TestTestingFixture.h old mode 100755 new mode 100644 diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h old mode 100755 new mode 100644 diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h old mode 100755 new mode 100644 From 8f85830268f661785bfcbce4ed36011cae2e1f47 Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 11 Sep 2019 18:10:04 +0200 Subject: [PATCH 0233/1093] Travis image updated. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 35b895c61..a1bd0f92f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: cpp -dist: trusty +dist: bionic matrix: include: From 7a9db8a328d2c3d538e03ed9f80b17748896fff6 Mon Sep 17 00:00:00 2001 From: "SEL\\dandw" Date: Thu, 12 Sep 2019 17:28:43 -0700 Subject: [PATCH 0234/1093] Use globally namespaced nullptr_t variation for maximum portability to avoid dependency on cstddef * cstddef is required to apply the std namespace to avoid polluting the global namespace * stddef.h may provide a std namespace variant of nullptr_t, but doesn't have to In my example, using GreenHills Multi v7.1.4 for Coldfire, only cstddef has std::nullptr_t and stddef.h provides nullptr_t. --- include/CppUTest/SimpleString.h | 6 ++---- src/CppUTest/SimpleString.cpp | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 5e19b32bd..27193e742 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -177,12 +177,10 @@ SimpleString BracketsFormattedHexString(SimpleString hexString); /* * ARM compiler has only partial support for C++11. - * Specifically std::nullptr_t is not officially supported + * Specifically nullptr_t is not officially supported */ #if __cplusplus > 199711L && !defined __arm__ -/* Needed for std::nullptr_t */ -#include -SimpleString StringFrom(const std::nullptr_t value); +SimpleString StringFrom(const nullptr_t value); #endif #if CPPUTEST_USE_STD_CPP_LIB diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 2b5a94ab8..c5d6a4ba4 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -559,10 +559,10 @@ SimpleString BracketsFormattedHexString(SimpleString hexString) /* * ARM compiler has only partial support for C++11. - * Specifically std::nullptr_t is not officially supported + * Specifically nullptr_t is not officially supported */ #if __cplusplus > 199711L && !defined __arm__ -SimpleString StringFrom(const std::nullptr_t __attribute__((unused)) value) +SimpleString StringFrom(const nullptr_t __attribute__((unused)) value) { return "(null)"; } From 15f67e6596f429ff3ca2c61389b866367771fb90 Mon Sep 17 00:00:00 2001 From: "SEL\\dandw" Date: Fri, 13 Sep 2019 11:57:14 -0700 Subject: [PATCH 0235/1093] Fix issue where GreenHills is sensitive to the location of the "override" specifier on methods that return function pointers. An example of the error produced follows: [ 6%] Building CXX object src/CppUTestExt/CMakeFiles/CppUTestExt.dir/MockSupportPlugin.cpp.o "N:/cpputest/include/CppUTestExt/MockCheckedActualCall.h", line 216: error #65: expected a ";" virtual void (*returnFunctionPointerValue())() _override; --- include/CppUTestExt/MockCheckedActualCall.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index 5adb4784d..32aa7089b 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -92,8 +92,8 @@ class MockCheckedActualCall : public MockActualCall virtual void * returnPointerValue() _override; virtual void * returnPointerValueOrDefault(void *) _override; - virtual void (*returnFunctionPointerValue())() _override; - virtual void (*returnFunctionPointerValueOrDefault(void (*)()))() _override; + virtual void (*returnFunctionPointerValue() _override )(); + virtual void (*returnFunctionPointerValueOrDefault(void (*)()) _override )(); virtual MockActualCall& onObject(const void* objectPtr) _override; @@ -213,8 +213,8 @@ class MockActualCallTrace : public MockActualCall virtual const void * returnConstPointerValue() _override; virtual const void * returnConstPointerValueOrDefault(const void * default_value) _override; - virtual void (*returnFunctionPointerValue())() _override; - virtual void (*returnFunctionPointerValueOrDefault(void (*)()))() _override; + virtual void (*returnFunctionPointerValue() _override )(); + virtual void (*returnFunctionPointerValueOrDefault(void (*)()) _override )(); virtual MockActualCall& onObject(const void* objectPtr) _override; @@ -286,8 +286,8 @@ class MockIgnoredActualCall: public MockActualCall virtual const void * returnConstPointerValue() _override { return NULLPTR; } virtual const void * returnConstPointerValueOrDefault(const void * value) _override { return value; } - virtual void (*returnFunctionPointerValue())() _override { return NULLPTR; } - virtual void (*returnFunctionPointerValueOrDefault(void (*value)()))() _override { return value; } + virtual void (*returnFunctionPointerValue() _override )() { return NULLPTR; } + virtual void (*returnFunctionPointerValueOrDefault(void (*value)()) _override )() { return value; } virtual MockActualCall& onObject(const void* ) _override { return *this; } From 05736b526a75983dfb0aba78778388682919fd58 Mon Sep 17 00:00:00 2001 From: "SEL\\dandw" Date: Fri, 13 Sep 2019 12:25:43 -0700 Subject: [PATCH 0236/1093] Fix issue where GreenHills is sensitive to the location of the "override" specifier on methods that return function pointers. This fix was tested with Visual Studio 2017 and GreenHills 7.1.4 on ColdFire. An example of the error previously produced follows: [ 6%] Building CXX object src/CppUTestExt/CMakeFiles/CppUTestExt.dir/MockSupportPlugin.cpp.o "N:/cpputest/include/CppUTestExt/MockCheckedActualCall.h", line 216: error #65: expected a ";" virtual void (*returnFunctionPointerValue())() _override; --- include/CppUTest/CppUTestConfig.h | 8 ++++++++ include/CppUTestExt/MockCheckedActualCall.h | 12 ++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 24dca5f5c..b5216f4f9 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -268,8 +268,16 @@ typedef struct cpputest_ulonglong cpputest_ulonglong; /* Visual C++ 10.0+ (2010+) supports the override keyword, but doesn't define the C++ version as C++11 */ #if defined(__cplusplus) && ((__cplusplus >= 201103L) || (defined(_MSC_VER) && (_MSC_VER >= 1600))) +#if !defined(__ghs__) #define CPPUTEST_COMPILER_FULLY_SUPPORTS_CXX11 #define _override override +#else +/* GreenHills is not compatible with other compilers with regards to where + * it expects the override specifier to be on methods that return function + * pointers. Given this, it is easiest to not use the override specifier. + */ +#define _override +#endif #define NULLPTR nullptr #else #define _override diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index 32aa7089b..5adb4784d 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -92,8 +92,8 @@ class MockCheckedActualCall : public MockActualCall virtual void * returnPointerValue() _override; virtual void * returnPointerValueOrDefault(void *) _override; - virtual void (*returnFunctionPointerValue() _override )(); - virtual void (*returnFunctionPointerValueOrDefault(void (*)()) _override )(); + virtual void (*returnFunctionPointerValue())() _override; + virtual void (*returnFunctionPointerValueOrDefault(void (*)()))() _override; virtual MockActualCall& onObject(const void* objectPtr) _override; @@ -213,8 +213,8 @@ class MockActualCallTrace : public MockActualCall virtual const void * returnConstPointerValue() _override; virtual const void * returnConstPointerValueOrDefault(const void * default_value) _override; - virtual void (*returnFunctionPointerValue() _override )(); - virtual void (*returnFunctionPointerValueOrDefault(void (*)()) _override )(); + virtual void (*returnFunctionPointerValue())() _override; + virtual void (*returnFunctionPointerValueOrDefault(void (*)()))() _override; virtual MockActualCall& onObject(const void* objectPtr) _override; @@ -286,8 +286,8 @@ class MockIgnoredActualCall: public MockActualCall virtual const void * returnConstPointerValue() _override { return NULLPTR; } virtual const void * returnConstPointerValueOrDefault(const void * value) _override { return value; } - virtual void (*returnFunctionPointerValue() _override )() { return NULLPTR; } - virtual void (*returnFunctionPointerValueOrDefault(void (*value)()) _override )() { return value; } + virtual void (*returnFunctionPointerValue())() _override { return NULLPTR; } + virtual void (*returnFunctionPointerValueOrDefault(void (*value)()))() _override { return value; } virtual MockActualCall& onObject(const void* ) _override { return *this; } From 93adf3330e42a5bb6b43d73406e5cb245184df78 Mon Sep 17 00:00:00 2001 From: offa Date: Fri, 20 Sep 2019 15:59:27 +0200 Subject: [PATCH 0237/1093] Use C++98 for pre C++11 builds to prevent compilers to use a newer standard. --- scripts/travis_ci_build.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 5dc49b45f..c76350947 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -34,8 +34,14 @@ if [ "x$BUILD" = "xautotools" ]; then fi if [ "x$BUILD" = "xcmake" ]; then + BUILD_ARGS=("-DWERROR=ON" "-DC++11=${CPP11}") + + if [ "x$CPP11" = "xOFF" ]; then + BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=98") + fi + cmake --version - cmake -DWERROR=ON -DC++11=${CPP11} .. + cmake "${BUILD_ARGS[@]}" .. make ctest -V fi From d6077a4d0008b9dd562532d65ccc359909994962 Mon Sep 17 00:00:00 2001 From: Simon Ensslen Date: Mon, 30 Sep 2019 14:15:18 +0200 Subject: [PATCH 0238/1093] Allow nullpointers in Memory comparer when comparison size is zero --- src/CppUTest/Utest.cpp | 1 + tests/CppUTest/TestUTestMacro.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index ecbfc14fd..2834833c9 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -486,6 +486,7 @@ void UtestShell::assertDoublesEqual(double expected, double actual, double thres void UtestShell::assertBinaryEqual(const void *expected, const void *actual, size_t length, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); + if (length == 0) return; if (actual == NULLPTR && expected == NULLPTR) return; if (actual == NULLPTR || expected == NULLPTR) failWith(BinaryEqualFailure(this, fileName, lineNumber, (const unsigned char *) expected, (const unsigned char *) actual, length, text), testTerminator); diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index 953842d59..c0057f991 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -1011,6 +1011,18 @@ TEST(UnitTestMacros, MEMCMP_EQUALNullExpectedNullActual) MEMCMP_EQUAL(NULLPTR, NULLPTR, 1024); } +TEST(UnitTestMacros, MEMCMP_EQUALNullPointerIgnoredInExpectationWhenSize0) +{ + unsigned char actualData[] = { 0x00, 0x01, 0x03, 0x03 }; + MEMCMP_EQUAL(NULLPTR, actualData, 0); +} + +TEST(UnitTestMacros, MEMCMP_EQUALNullPointerIgnoredInActualWhenSize0) +{ + unsigned char expectedData[] = { 0x00, 0x01, 0x02, 0x03 }; + MEMCMP_EQUAL(expectedData, NULLPTR, 0); +} + static void _failingTestMethodWithMEMCMP_EQUAL_TEXT() { unsigned char expectedData[] = { 0x00, 0x01, 0x02, 0x03 }; From f034383754e36ce83c929364fa81e30b9befec6c Mon Sep 17 00:00:00 2001 From: offa Date: Fri, 4 Oct 2019 14:31:57 +0200 Subject: [PATCH 0239/1093] CI builds for C++98/11/14/17 added. --- .travis.yml | 24 ++++++++++++++++++++---- scripts/travis_ci_build.sh | 6 +++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index a1bd0f92f..de39a2129 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,22 +5,38 @@ dist: bionic matrix: include: - compiler: clang - env: BUILD=cmake CPP11=OFF + env: BUILD=cmake CPP_STD=98 CPP11=OFF addons: apt: packages: - libc++-dev - compiler: clang - env: BUILD=cmake CPP11=ON + env: BUILD=cmake CPP_STD=11 CPP11=ON + addons: + apt: + packages: + - libc++-dev + - compiler: clang + env: BUILD=cmake CPP_STD=14 CPP11=ON + addons: + apt: + packages: + - libc++-dev + - compiler: clang + env: BUILD=cmake CPP_STD=17 CPP11=ON addons: apt: packages: - libc++-dev - compiler: gcc - env: BUILD=cmake CPP11=OFF + env: BUILD=cmake CPP_STD=98 CPP11=OFF + - compiler: gcc + env: BUILD=cmake CPP_STD=11 CPP11=ON + - compiler: gcc + env: BUILD=cmake CPP_STD=14 CPP11=ON - compiler: gcc - env: BUILD=cmake CPP11=ON + env: BUILD=cmake CPP_STD=17 CPP11=ON - compiler: gcc env: BUILD=autotools diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index c76350947..59e0f4763 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -34,10 +34,10 @@ if [ "x$BUILD" = "xautotools" ]; then fi if [ "x$BUILD" = "xcmake" ]; then - BUILD_ARGS=("-DWERROR=ON" "-DC++11=${CPP11}") + BUILD_ARGS=("-DWERROR=ON" "-DC++11=$CPP11") - if [ "x$CPP11" = "xOFF" ]; then - BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=98") + if [ -n "$CPP_STD" ]; then + BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=$CPP_STD") fi cmake --version From 235b68ace2f3a35db0cb312ef279d1cf5ff52f80 Mon Sep 17 00:00:00 2001 From: offa Date: Fri, 4 Oct 2019 15:08:57 +0200 Subject: [PATCH 0240/1093] Don't set C++11 standard flag if another c++ standard is passed. --- cmake/Modules/CppUTestConfigurationOptions.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 939a94b15..6c5c4a942 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -54,10 +54,10 @@ if (COVERAGE AND NOT MSVC) set(CMAKE_BUILD_TYPE "Debug") endif (COVERAGE AND NOT MSVC) -if (C++11) +if (NOT CMAKE_CXX_STANDARD AND C++11) find_package(CXX11 REQUIRED) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} ${CXX11_FLAGS}") -endif (C++11) +endif () set(GMOCK_HOME $ENV{GMOCK_HOME}) if (DEFINED ENV{GMOCK_HOME}) From 744271644623794bddb01c9dde35014670621942 Mon Sep 17 00:00:00 2001 From: sbashford Date: Fri, 4 Oct 2019 10:48:56 -0500 Subject: [PATCH 0241/1093] Update README.md "Example Test" missing semicolon after TEST_GROUP. Adding semicolon to example. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d159c1319..7543111ae 100644 --- a/README.md +++ b/README.md @@ -178,7 +178,7 @@ TEST_GROUP(ClassName) { delete className; } -} +}; TEST(ClassName, Create) { From 360d5e8ab4b211858159bde168fd3cf7011d7ef2 Mon Sep 17 00:00:00 2001 From: offa Date: Sat, 5 Oct 2019 14:47:14 +0200 Subject: [PATCH 0242/1093] Enable C++11 and later warnings based on CMAKE_CXX_STANDARD too. --- cmake/Modules/CppUTestWarningFlags.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index aa11bfc01..3b8f2d7f2 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -63,7 +63,7 @@ else (MSVC) Wno-old-style-cast ) - if (C++11) + if (C++11 OR (DEFINED CMAKE_CXX_STANDARD AND NOT CMAKE_CXX_STANDARD EQUAL 98)) set(WARNING_CXX_FLAGS ${WARNING_CXX_FLAGS} Wno-c++98-compat @@ -71,7 +71,7 @@ else (MSVC) Wno-c++14-compat Wno-inconsistent-missing-destructor-override ) - endif (C++11) + endif () check_and_append_c_warning_flags(${WARNING_C_FLAGS}) check_and_append_c_warning_flags(${WARNING_C_ONLY_FLAGS}) From 2f3ea61e607e81dbb19d485a340f81617b44554a Mon Sep 17 00:00:00 2001 From: offa Date: Sat, 5 Oct 2019 14:48:43 +0200 Subject: [PATCH 0243/1093] CPP11 option removed from the CI build. The actual standard used is passed directly to each build. --- .travis.yml | 16 ++++++++-------- scripts/travis_ci_build.sh | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index de39a2129..056576082 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,38 +5,38 @@ dist: bionic matrix: include: - compiler: clang - env: BUILD=cmake CPP_STD=98 CPP11=OFF + env: BUILD=cmake CPP_STD=98 addons: apt: packages: - libc++-dev - compiler: clang - env: BUILD=cmake CPP_STD=11 CPP11=ON + env: BUILD=cmake CPP_STD=11 addons: apt: packages: - libc++-dev - compiler: clang - env: BUILD=cmake CPP_STD=14 CPP11=ON + env: BUILD=cmake CPP_STD=14 addons: apt: packages: - libc++-dev - compiler: clang - env: BUILD=cmake CPP_STD=17 CPP11=ON + env: BUILD=cmake CPP_STD=17 addons: apt: packages: - libc++-dev - compiler: gcc - env: BUILD=cmake CPP_STD=98 CPP11=OFF + env: BUILD=cmake CPP_STD=98 - compiler: gcc - env: BUILD=cmake CPP_STD=11 CPP11=ON + env: BUILD=cmake CPP_STD=11 - compiler: gcc - env: BUILD=cmake CPP_STD=14 CPP11=ON + env: BUILD=cmake CPP_STD=14 - compiler: gcc - env: BUILD=cmake CPP_STD=17 CPP11=ON + env: BUILD=cmake CPP_STD=17 - compiler: gcc env: BUILD=autotools diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 59e0f4763..df0851ce5 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -34,7 +34,7 @@ if [ "x$BUILD" = "xautotools" ]; then fi if [ "x$BUILD" = "xcmake" ]; then - BUILD_ARGS=("-DWERROR=ON" "-DC++11=$CPP11") + BUILD_ARGS=("-DWERROR=ON") if [ -n "$CPP_STD" ]; then BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=$CPP_STD") From 3ab890360729b8a59b2310cd280dd07a69283378 Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 29 Oct 2019 18:40:48 +0100 Subject: [PATCH 0244/1093] Coverage CI build options fixed. --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index df0851ce5..bfbeb50de 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -87,7 +87,7 @@ fi if [ "x$BUILD" = "xcmake_coverage" ]; then pip install --user cpp-coveralls - cmake .. -DCMAKE_BUILD_TYPE=C++11=ON -DCOVERAGE=ON -DLONGLONG=ON + cmake .. -DCMAKE_BUILD_TYPE=Debug -DC++11=ON -DCOVERAGE=ON -DLONGLONG=ON make ctest From 431f55060b9fb6a45a4348b23d3b20d5c7010693 Mon Sep 17 00:00:00 2001 From: Matt Kelly Date: Tue, 5 Nov 2019 12:09:48 -0500 Subject: [PATCH 0245/1093] Fix typo: scopeFunctionName --- src/CppUTestExt/MockSupport.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index d44b0ca92..f22dd3514 100644 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -185,7 +185,7 @@ bool MockSupport::callIsIgnored(const SimpleString& functionName) MockActualCall& MockSupport::actualCall(const SimpleString& functionName) { - const SimpleString scopeFuntionName = appendScopeToName(functionName); + const SimpleString scopeFunctionName = appendScopeToName(functionName); if (lastActualFunctionCall_) { lastActualFunctionCall_->checkExpectations(); @@ -194,15 +194,15 @@ MockActualCall& MockSupport::actualCall(const SimpleString& functionName) } if (!enabled_) return MockIgnoredActualCall::instance(); - if (tracing_) return MockActualCallTrace::instance().withName(scopeFuntionName); + if (tracing_) return MockActualCallTrace::instance().withName(scopeFunctionName); - if (callIsIgnored(scopeFuntionName)) { + if (callIsIgnored(scopeFunctionName)) { return MockIgnoredActualCall::instance(); } MockCheckedActualCall* call = createActualCall(); - call->withName(scopeFuntionName); + call->withName(scopeFunctionName); return *call; } From bc59f876ee6310e5c31b767348fbe6c96eabd372 Mon Sep 17 00:00:00 2001 From: Vladimir Poddubnyi Date: Wed, 6 Nov 2019 15:08:10 +0300 Subject: [PATCH 0246/1093] Return non-zero for command line errors If command line arguments parsing fails, return non-zero from RunAllTests. --- src/CppUTest/CommandLineTestRunner.cpp | 3 ++- tests/CppUTest/CommandLineTestRunnerTest.cpp | 21 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 544893739..6d80e39b1 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2007, Michael Feathers, James Grenning and Bas Vodde + * Copyright (c) 2019, Nokia * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -73,7 +74,7 @@ CommandLineTestRunner::~CommandLineTestRunner() int CommandLineTestRunner::runAllTestsMain() { - int testResult = 0; + int testResult = 1; SetPointerPlugin pPlugin(DEF_PLUGIN_SET_POINTER); registry_->installPlugin(&pPlugin); diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index f350ff3ec..16591005d 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2007, Michael Feathers, James Grenning and Bas Vodde + * Copyright (c) 2019, Nokia * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -139,6 +140,26 @@ TEST(CommandLineTestRunner, NoPluginsAreInstalledAtTheEndOfARunWhenTheArgumentsA } +TEST(CommandLineTestRunner, ReturnsNonZeroWhenTheArgumentsAreInvalid) +{ + const char* argv[] = { "tests.exe", "-fdskjnfkds"}; + + CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); + int returned = commandLineTestRunner.runAllTestsMain(); + + CHECK_TRUE(0 != returned); +} + +TEST(CommandLineTestRunner, ReturnsZeroWhenNoErrors) +{ + const char* argv[] = { "tests.exe" }; + + CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(1, argv, ®istry); + int returned = commandLineTestRunner.runAllTestsMain(); + + LONGS_EQUAL(0, returned); +} + TEST(CommandLineTestRunner, TeamcityOutputEnabled) { const char* argv[] = {"tests.exe", "-oteamcity"}; From adad93045d5d2c48a492f666f31c329492bb120d Mon Sep 17 00:00:00 2001 From: Vladimir Poddubnyi Date: Thu, 7 Nov 2019 16:37:16 +0300 Subject: [PATCH 0247/1093] Return -1 for invalid command line CommandLineTestRunner::RunAllTests() returns -1 for invalid arguments --- src/CppUTest/CommandLineTestRunner.cpp | 3 +-- tests/CppUTest/CommandLineTestRunnerTest.cpp | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 6d80e39b1..997591e62 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -1,6 +1,5 @@ /* * Copyright (c) 2007, Michael Feathers, James Grenning and Bas Vodde - * Copyright (c) 2019, Nokia * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -74,7 +73,7 @@ CommandLineTestRunner::~CommandLineTestRunner() int CommandLineTestRunner::runAllTestsMain() { - int testResult = 1; + int testResult = -1; SetPointerPlugin pPlugin(DEF_PLUGIN_SET_POINTER); registry_->installPlugin(&pPlugin); diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index 16591005d..e6e897d66 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -1,6 +1,5 @@ /* * Copyright (c) 2007, Michael Feathers, James Grenning and Bas Vodde - * Copyright (c) 2019, Nokia * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -140,14 +139,14 @@ TEST(CommandLineTestRunner, NoPluginsAreInstalledAtTheEndOfARunWhenTheArgumentsA } -TEST(CommandLineTestRunner, ReturnsNonZeroWhenTheArgumentsAreInvalid) +TEST(CommandLineTestRunner, ReturnsNegativeWhenTheArgumentsAreInvalid) { - const char* argv[] = { "tests.exe", "-fdskjnfkds"}; + const char* argv[] = { "tests.exe", "-some-invalid=parameter" }; CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); int returned = commandLineTestRunner.runAllTestsMain(); - CHECK_TRUE(0 != returned); + CHECK_COMPARE(returned, <, 0); } TEST(CommandLineTestRunner, ReturnsZeroWhenNoErrors) @@ -160,6 +159,16 @@ TEST(CommandLineTestRunner, ReturnsZeroWhenNoErrors) LONGS_EQUAL(0, returned); } +TEST(CommandLineTestRunner, ReturnsZeroWhenNoTestsMatchProvidedFilter) +{ + const char* argv[] = { "tests.exe", "-g", "NoSuchGroup"}; + + CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(3, argv, ®istry); + int returned = commandLineTestRunner.runAllTestsMain(); + + LONGS_EQUAL(0, returned); +} + TEST(CommandLineTestRunner, TeamcityOutputEnabled) { const char* argv[] = {"tests.exe", "-oteamcity"}; From 831808e6f3e926fea25b76a6c5ab71451760407b Mon Sep 17 00:00:00 2001 From: Vladimir Poddubnyi Date: Mon, 11 Nov 2019 19:51:09 +0300 Subject: [PATCH 0248/1093] Return 1 (one) for invalid command line --- src/CppUTest/CommandLineTestRunner.cpp | 2 +- tests/CppUTest/CommandLineTestRunnerTest.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 997591e62..e1c88c427 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -73,7 +73,7 @@ CommandLineTestRunner::~CommandLineTestRunner() int CommandLineTestRunner::runAllTestsMain() { - int testResult = -1; + int testResult = 1; SetPointerPlugin pPlugin(DEF_PLUGIN_SET_POINTER); registry_->installPlugin(&pPlugin); diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index e6e897d66..5f72e7aa9 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -139,14 +139,14 @@ TEST(CommandLineTestRunner, NoPluginsAreInstalledAtTheEndOfARunWhenTheArgumentsA } -TEST(CommandLineTestRunner, ReturnsNegativeWhenTheArgumentsAreInvalid) +TEST(CommandLineTestRunner, ReturnsOneWhenTheArgumentsAreInvalid) { const char* argv[] = { "tests.exe", "-some-invalid=parameter" }; CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); int returned = commandLineTestRunner.runAllTestsMain(); - CHECK_COMPARE(returned, <, 0); + LONGS_EQUAL(1, returned); } TEST(CommandLineTestRunner, ReturnsZeroWhenNoErrors) From 7fbb1bbede78f517933281d08475e58c8dc5b533 Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 29 Oct 2019 18:20:07 +0100 Subject: [PATCH 0249/1093] GCC 5 operator delete compat warning fixed. These operators are only included for C++ >= 14. --- include/CppUTest/MemoryLeakDetectorNewMacros.h | 2 ++ src/CppUTest/MemoryLeakWarningPlugin.cpp | 4 ++++ tests/CppUTest/MemoryOperatorOverloadTest.cpp | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/MemoryLeakDetectorNewMacros.h b/include/CppUTest/MemoryLeakDetectorNewMacros.h index be694927d..eba7e6d64 100644 --- a/include/CppUTest/MemoryLeakDetectorNewMacros.h +++ b/include/CppUTest/MemoryLeakDetectorNewMacros.h @@ -60,8 +60,10 @@ void operator delete[](void* mem, const char* file, int line) UT_NOTHROW; void operator delete(void* mem) UT_NOTHROW; void operator delete[](void* mem) UT_NOTHROW; +#if __cplusplus >= 201402L void operator delete (void* mem, size_t size) UT_NOTHROW; void operator delete[] (void* mem, size_t size) UT_NOTHROW; +#endif #endif diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 72efa30ee..1c78609fe 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -319,10 +319,12 @@ void operator delete(void* mem, const char*, int) UT_NOTHROW operator_delete_fptr(mem); } +#if __cplusplus >= 201402L void operator delete (void* mem, size_t) UT_NOTHROW { operator_delete_fptr(mem); } +#endif void* operator new[](size_t size) UT_THROW(std::bad_alloc) { @@ -344,10 +346,12 @@ void operator delete[](void* mem, const char*, int) UT_NOTHROW operator_delete_array_fptr(mem); } +#if __cplusplus >= 201402L void operator delete[] (void* mem, size_t) UT_NOTHROW { operator_delete_array_fptr(mem); } +#endif #if CPPUTEST_USE_STD_CPP_LIB diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index a9103abf1..c62ac1cb1 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -38,6 +38,7 @@ TEST(BasicBehavior, deleteInvalidatesMemory) CHECK(*memory != 0xAD); } +#if __cplusplus >= 201402L TEST(BasicBehavior, DeleteWithSizeParameterWorks) { char* charMemory = new char; @@ -45,7 +46,7 @@ TEST(BasicBehavior, DeleteWithSizeParameterWorks) ::operator delete(charMemory, sizeof(char)); ::operator delete[](charArrayMemory, sizeof(char)* 10); } - +#endif static void deleteUnallocatedMemory() { From 5c57164e3f0c67a2127511f9ddd168ee472814ae Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 26 Nov 2019 17:46:59 +0100 Subject: [PATCH 0250/1093] __attribute__((unused)) extension replaced with more portable cast-to-void (#1257). --- src/CppUTest/SimpleString.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index c5d6a4ba4..b8c924b7c 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -562,8 +562,9 @@ SimpleString BracketsFormattedHexString(SimpleString hexString) * Specifically nullptr_t is not officially supported */ #if __cplusplus > 199711L && !defined __arm__ -SimpleString StringFrom(const nullptr_t __attribute__((unused)) value) +SimpleString StringFrom(const nullptr_t value) { + (void) value; return "(null)"; } #endif From f1e4a9498e60844c249d89604b99f47bd7b13d1f Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 27 Nov 2019 19:00:01 +0100 Subject: [PATCH 0251/1093] Unsigned comparison corrected (fixes #1231). --- src/CppUTest/MemoryLeakDetector.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index e1b648f16..d2a5231d7 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -49,8 +49,8 @@ void SimpleStringBuffer::clear() void SimpleStringBuffer::add(const char* format, ...) { int count = 0; - size_t positions_left = write_limit_ - positions_filled_; - if (positions_left <= 0) return; + const size_t positions_left = write_limit_ - positions_filled_; + if (positions_left == 0) return; va_list arguments; va_start(arguments, format); @@ -65,7 +65,7 @@ void SimpleStringBuffer::addMemoryDump(const void* memory, size_t memorySize) const unsigned char* byteMemory = (const unsigned char*)memory; const size_t maxLineBytes = 16; size_t currentPos = 0; - size_t p; + size_t p; while (currentPos < memorySize) { add(" %04lx: ", (unsigned long) currentPos); From b9279978af2d0d1bcb630a778dfeb8cc25edd5b7 Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 27 Nov 2019 19:01:31 +0100 Subject: [PATCH 0252/1093] Variable made const. --- src/CppUTest/MemoryLeakDetector.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index d2a5231d7..154995c2e 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -48,13 +48,12 @@ void SimpleStringBuffer::clear() void SimpleStringBuffer::add(const char* format, ...) { - int count = 0; const size_t positions_left = write_limit_ - positions_filled_; if (positions_left == 0) return; va_list arguments; va_start(arguments, format); - count = PlatformSpecificVSNprintf(buffer_ + positions_filled_, positions_left+1, format, arguments); + const int count = PlatformSpecificVSNprintf(buffer_ + positions_filled_, positions_left+1, format, arguments); if (count > 0) positions_filled_ += (size_t) count; if (positions_filled_ > write_limit_) positions_filled_ = write_limit_; va_end(arguments); From ea1d4cdd7f39fd7602ba9b9f257684c545ecbd44 Mon Sep 17 00:00:00 2001 From: Benjamin Giesinger Date: Thu, 28 Nov 2019 14:33:59 +0100 Subject: [PATCH 0253/1093] nullptr is defined in Std namespace Not 100% sure if this is really necessary, but I had some problems compiling without the std so I thought it might do no harm --- include/CppUTest/SimpleString.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 27193e742..f0fc5e218 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -180,7 +180,7 @@ SimpleString BracketsFormattedHexString(SimpleString hexString); * Specifically nullptr_t is not officially supported */ #if __cplusplus > 199711L && !defined __arm__ -SimpleString StringFrom(const nullptr_t value); +SimpleString StringFrom(const std::nullptr_t value); #endif #if CPPUTEST_USE_STD_CPP_LIB From 1f4df788f3417d30c3177aecc04fd5559aa50bc2 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 4 Dec 2019 11:29:49 +0800 Subject: [PATCH 0254/1093] Added csdtdef for std::nulptr --- include/CppUTest/StandardCLibrary.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/CppUTest/StandardCLibrary.h b/include/CppUTest/StandardCLibrary.h index ee132dc03..91890c986 100644 --- a/include/CppUTest/StandardCLibrary.h +++ b/include/CppUTest/StandardCLibrary.h @@ -21,6 +21,13 @@ /* Needed for malloc */ #include +/* Needed for std::nullptr */ +#ifdef __cplusplus + #if CPPUTEST_USE_STD_CPP_LIB + #include + #endif +#endif + /* Needed for ... */ #include From cb8c457dda6741ede7009103db99967b5f27c969 Mon Sep 17 00:00:00 2001 From: Leonardo Pereira Santos Date: Wed, 4 Dec 2019 14:22:55 -0500 Subject: [PATCH 0255/1093] Added namespace directive to fix compilation error under MinGW-w64. --- src/CppUTest/SimpleString.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index b8c924b7c..430041af2 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -562,7 +562,7 @@ SimpleString BracketsFormattedHexString(SimpleString hexString) * Specifically nullptr_t is not officially supported */ #if __cplusplus > 199711L && !defined __arm__ -SimpleString StringFrom(const nullptr_t value) +SimpleString StringFrom(const std::nullptr_t value) { (void) value; return "(null)"; From bbbf27b859456c39962660cbb8fa4be865d13d73 Mon Sep 17 00:00:00 2001 From: Vladimir Poddubnyi Date: Fri, 6 Dec 2019 18:46:45 +0300 Subject: [PATCH 0256/1093] Add package to JUnit report file name If JUnit package is set, add it to the report file name. Slightly expand list of special characters not allowed in file names as package is provided via command line. --- src/CppUTest/JUnitTestOutput.cpp | 18 +++++++++++++++++- tests/CppUTest/JUnitOutputTest.cpp | 22 ++++++++++++++++------ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index 406579072..0b29d69ef 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -151,8 +151,24 @@ void JUnitTestOutput::printCurrentTestStarted(const UtestShell& test) SimpleString JUnitTestOutput::createFileName(const SimpleString& group) { SimpleString fileName = "cpputest_"; + if (!impl_->package_.isEmpty()) { + fileName += impl_->package_; + fileName += "_"; + } fileName += group; + + // special character list based on: https://en.wikipedia.org/wiki/Filename fileName.replace('/', '_'); + fileName.replace('\\', '_'); + fileName.replace('?', '_'); + fileName.replace('%', '_'); + fileName.replace('*', '_'); + fileName.replace(':', '_'); + fileName.replace('|', '_'); + fileName.replace('"', '_'); + fileName.replace('<', '_'); + fileName.replace('>', '_'); + fileName += ".xml"; return fileName; } @@ -208,7 +224,7 @@ void JUnitTestOutput::writeTestCases() SimpleString buf = StringFromFormat( "\n", impl_->package_.asCharString(), - impl_->package_.isEmpty() == true ? "" : ".", + impl_->package_.isEmpty() ? "" : ".", impl_->results_.group_.asCharString(), cur->name_.asCharString(), cur->checkCount_ - impl_->results_.totalCheckCount_, diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index 7da159009..2248ce7ac 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -42,7 +42,7 @@ class FileForJUnitOutputTests public: - FileForJUnitOutputTests(SimpleString filename, FileForJUnitOutputTests* next) : + FileForJUnitOutputTests(const SimpleString& filename, FileForJUnitOutputTests* next) : name_(filename), isOpen_(true), next_(next) {} FileForJUnitOutputTests* nextFile() @@ -162,7 +162,7 @@ class JUnitTestOutputTestRunner public: - JUnitTestOutputTestRunner(TestResult result) : + explicit JUnitTestOutputTestRunner(const TestResult& result) : result_(result), currentGroupName_(NULLPTR), currentTest_(NULLPTR), firstTestInGroup_(true), timeTheTestTakes_(0), numberOfChecksInTest_(0), testFailure_(NULLPTR) { millisTime = 0; @@ -365,6 +365,16 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestOnlyWriteToOneFile) CHECK(fileSystem.fileExists("cpputest_groupname.xml")); } +TEST(JUnitOutputTest, withReservedCharactersInPackageOrTestGroupUsesUnderscoresForFileName) +{ + junitOutput->setPackageName("p/a\\c?k%a*g:e|n\"ae."); + testCaseRunner->start() + .withGroup("g/r\\o?u%p*n:a|m\"eere").withTest("testname") + .end(); + + CHECK(fileSystem.fileExists("cpputest_p_a_c_k_a_g_e_n_a_m_e._g_r_o_u_p_n_a_m_e_h_ere.xml")); +} + TEST(JUnitOutputTest, withOneTestGroupAndOneTestOutputsValidXMLFiles) { testCaseRunner->start() @@ -634,7 +644,7 @@ TEST(JUnitOutputTest, TestCaseBlockWithAPackageName) .withGroup("groupname").withTest("testname") .end(); - outputFile = fileSystem.file("cpputest_groupname.xml"); + outputFile = fileSystem.file("cpputest_packagename_groupname.xml"); STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); @@ -647,7 +657,7 @@ TEST(JUnitOutputTest, TestCaseBlockForIgnoredTest) .withGroup("groupname").withIgnoredTest("testname") .end(); - outputFile = fileSystem.file("cpputest_groupname.xml"); + outputFile = fileSystem.file("cpputest_packagename_groupname.xml"); STRCMP_EQUAL("\n", outputFile->line(5)); STRCMP_EQUAL("\n", outputFile->line(6)); @@ -662,7 +672,7 @@ TEST(JUnitOutputTest, TestCaseWithTestLocation) .withTest("testname").inFile("MySource.c").onLine(159) .end(); - outputFile = fileSystem.file("cpputest_groupname.xml"); + outputFile = fileSystem.file("cpputest_packagename_groupname.xml"); STRCMP_EQUAL("\n", outputFile->line(5)); } @@ -690,7 +700,7 @@ TEST(JUnitOutputTest, TestCaseBlockWithAssertions) .thatHasChecks(24) .end(); - outputFile = fileSystem.file("cpputest_groupname.xml"); + outputFile = fileSystem.file("cpputest_packagename_groupname.xml"); STRCMP_EQUAL("\n", outputFile->line(5)); } From cfaae80a7077773603f0fcf93f64de4d9c903079 Mon Sep 17 00:00:00 2001 From: Vladimir Poddubnyi Date: Tue, 10 Dec 2019 12:55:19 +0300 Subject: [PATCH 0257/1093] Extract file name encoding function in JUnitTestOutput --- include/CppUTest/JUnitTestOutput.h | 2 +- src/CppUTest/JUnitTestOutput.cpp | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/include/CppUTest/JUnitTestOutput.h b/include/CppUTest/JUnitTestOutput.h index aff42a781..33c7c6ab2 100644 --- a/include/CppUTest/JUnitTestOutput.h +++ b/include/CppUTest/JUnitTestOutput.h @@ -72,9 +72,9 @@ class JUnitTestOutput: public TestOutput virtual void writeProperties(); virtual void writeTestCases(); virtual SimpleString encodeXmlText(const SimpleString& textbody); + virtual SimpleString encodeFileName(const SimpleString& fileName); virtual void writeFailure(JUnitTestCaseResultNode* node); virtual void writeFileEnding(); - }; #endif diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index 0b29d69ef..ee764f153 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -156,21 +156,19 @@ SimpleString JUnitTestOutput::createFileName(const SimpleString& group) fileName += "_"; } fileName += group; + return encodeFileName(fileName) + ".xml"; +} +SimpleString JUnitTestOutput::encodeFileName(const SimpleString& fileName) +{ // special character list based on: https://en.wikipedia.org/wiki/Filename - fileName.replace('/', '_'); - fileName.replace('\\', '_'); - fileName.replace('?', '_'); - fileName.replace('%', '_'); - fileName.replace('*', '_'); - fileName.replace(':', '_'); - fileName.replace('|', '_'); - fileName.replace('"', '_'); - fileName.replace('<', '_'); - fileName.replace('>', '_'); - - fileName += ".xml"; - return fileName; + static const char* const forbiddenCharacters = "/\\?%*:|\"<>"; + + SimpleString result = fileName; + for (const char* sym = forbiddenCharacters; *sym; ++sym) { + result.replace(*sym, '_'); + } + return result; } void JUnitTestOutput::setPackageName(const SimpleString& package) From a61989e5bf5c8dbab8507746c8d02456bcd25bce Mon Sep 17 00:00:00 2001 From: Vladimir Poddubnyi Date: Wed, 11 Dec 2019 18:58:43 +0300 Subject: [PATCH 0258/1093] Fix GCC platform-specific error cases for -p flag - Treat any non-zero return from child process as failure. - Fix waiting for test in separate process under debugger by not checking uninitialized status variable (happens when continue checks loop condition). - Count tests run in separate process as 'run' if fork() succeeds. --- src/Platforms/Gcc/UtestPlatform.cpp | 20 +++++++------ tests/CppUTest/UtestPlatformTest.cpp | 43 ++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index a5b3e9f5b..4ed99a314 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -76,29 +76,33 @@ static int PlatformSpecificWaitPidImplementation(int, int*, int) static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin* plugin, TestResult* result) { - pid_t cpid, w; + const pid_t syscallError = -1; + pid_t cpid; + pid_t w; int status; cpid = PlatformSpecificFork(); - if (cpid == -1) { + if (cpid == syscallError) { result->addFailure(TestFailure(shell, "Call to fork() failed")); return; } if (cpid == 0) { /* Code executed by child */ - shell->runOneTestInCurrentProcess(plugin, *result); // LCOV_EXCL_LINE - _exit(result->getFailureCount()); // LCOV_EXCL_LINE + const int initialFailureCount = result->getFailureCount(); // LCOV_EXCL_LINE + shell->runOneTestInCurrentProcess(plugin, *result); // LCOV_EXCL_LINE + _exit(initialFailureCount < result->getFailureCount()); // LCOV_EXCL_LINE } else { /* Code executed by parent */ + result->countRun(); do { w = PlatformSpecificWaitPid(cpid, &status, WUNTRACED); - if (w == -1) { - if(EINTR ==errno) continue; /* OS X debugger */ + if (w == syscallError) { + if(EINTR == errno) continue; /* OS X debugger */ result->addFailure(TestFailure(shell, "Call to waitpid() failed")); return; } - if (WIFEXITED(status) && WEXITSTATUS(status) > result->getFailureCount()) { + if (WIFEXITED(status) && WEXITSTATUS(status) != 0) { result->addFailure(TestFailure(shell, "Failed in separate process")); } else if (WIFSIGNALED(status)) { SimpleString signal(StringFrom(WTERMSIG(status))); @@ -111,7 +115,7 @@ static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, Test result->addFailure(TestFailure(shell, "Stopped in separate process - continuing")); kill(w, SIGCONT); } - } while (!WIFEXITED(status) && !WIFSIGNALED(status)); + } while ((w == syscallError) || (!WIFEXITED(status) && !WIFSIGNALED(status))); } } diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index 5801818b8..d5d0f6470 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -25,6 +25,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include + #include "CppUTest/CommandLineTestRunner.h" #include "CppUTest/TestHarness.h" #include "CppUTest/TestTestingFixture.h" @@ -56,8 +58,16 @@ static void _failFunction() FAIL("This test fails"); } +static void _exitNonZeroFunction() +{ + exit(1); +} + #include +static int waitpid_while_debugging_stub_number_called = 0; +const int waitpid_while_debugging_stub_forced_failures = 10; + extern "C" { static int (*original_waitpid)(int, int*, int) = NULLPTR; @@ -66,10 +76,9 @@ extern "C" { static int waitpid_while_debugging_stub(int pid, int* status, int options) { - static int number_called = 0; static int saved_status; - if (number_called++ < 10) { + if (waitpid_while_debugging_stub_number_called++ < waitpid_while_debugging_stub_forced_failures) { saved_status = *status; errno=EINTR; return -1; @@ -96,12 +105,20 @@ static void _stoppedTestFunction() kill(getpid(), SIGSTOP); } +TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, TestInSeparateProcessWorks) +{ + fixture.registry_->setRunTestsInSeperateProcess(); + fixture.runAllTests(); + fixture.assertPrintContains("OK (1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out"); +} + TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, FailureInSeparateProcessWorks) { fixture.registry_->setRunTestsInSeperateProcess(); fixture.setTestFunction(_failFunction); fixture.runAllTests(); fixture.assertPrintContains("Failed in separate process"); + fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out"); } TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, AccessViolationInSeparateProcessWorks) @@ -110,6 +127,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, AccessViolati fixture.setTestFunction((void(*)())_accessViolationTestFunction); fixture.runAllTests(); fixture.assertPrintContains("Failed in separate process - killed by signal 11"); + fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran"); } TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, StoppedInSeparateProcessWorks) @@ -118,6 +136,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, StoppedInSepa fixture.setTestFunction(_stoppedTestFunction); fixture.runAllTests(); fixture.assertPrintContains("Stopped in separate process - continuing"); + fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran"); } TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToForkFailedInSeparateProcessWorks) @@ -126,15 +145,19 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToForkFai fixture.registry_->setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("Call to fork() failed"); + fixture.assertPrintContains("Errors (1 failures, 1 tests, 0 ran"); } TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToWaitPidWhileDebuggingInSeparateProcessWorks) { UT_PTR_SET(original_waitpid, PlatformSpecificWaitPid); UT_PTR_SET(PlatformSpecificWaitPid, waitpid_while_debugging_stub); + waitpid_while_debugging_stub_number_called = 0; fixture.registry_->setRunTestsInSeperateProcess(); fixture.runAllTests(); - fixture.assertPrintContains("OK (1 tests, 0 ran, 0 checks, 0 ignored, 0 filtered out"); + fixture.assertPrintContains("OK (1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out"); + // extra check to confirm that waitpid() was polled until it passed (and passed call adds one) + LONGS_EQUAL(waitpid_while_debugging_stub_forced_failures + 1, waitpid_while_debugging_stub_number_called); } TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToWaitPidFailedInSeparateProcessWorks) @@ -143,6 +166,20 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToWaitPid fixture.registry_->setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("Call to waitpid() failed"); + fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran"); +} + +TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, MultipleTestsInSeparateProcessAreCountedProperly) +{ + fixture.registry_->setRunTestsInSeperateProcess(); + fixture.runTestWithMethod(NULLPTR); + fixture.runTestWithMethod(_stoppedTestFunction); + fixture.runTestWithMethod(NULLPTR); + fixture.runTestWithMethod(_exitNonZeroFunction); + fixture.runTestWithMethod(NULLPTR); + fixture.assertPrintContains("Failed in separate process"); + fixture.assertPrintContains("Stopped in separate process"); + fixture.assertPrintContains("Errors (2 failures, 5 tests, 5 ran, 0 checks, 0 ignored, 0 filtered out"); } #endif From 88964863e8413f838350fb3107f2fdbb31ac12ef Mon Sep 17 00:00:00 2001 From: Vladimir Poddubnyi Date: Wed, 11 Dec 2019 19:29:34 +0300 Subject: [PATCH 0259/1093] Mark _exitNonZeroFunction() noreturn --- tests/CppUTest/UtestPlatformTest.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index d5d0f6470..270949c6e 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -58,6 +58,7 @@ static void _failFunction() FAIL("This test fails"); } +static void _exitNonZeroFunction() __no_return__; static void _exitNonZeroFunction() { exit(1); From 70507491d8fff2b6a6ec06a67fa378c75fbce634 Mon Sep 17 00:00:00 2001 From: Vladimir Poddubnyi Date: Fri, 13 Dec 2019 19:47:41 +0300 Subject: [PATCH 0260/1093] Refactor GccPlatformSpecificRunTestInASeperateProcess Move countRun() to Utest parent function (to align same/separate process) code. Refactor GccPlatformSpecificRunTestInASeperateProcess() for readablity. --- src/CppUTest/Utest.cpp | 2 +- src/Platforms/Gcc/UtestPlatform.cpp | 37 +++++++++++++++------------- tests/CppUTest/UtestPlatformTest.cpp | 2 +- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 2834833c9..515abdfae 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -177,6 +177,7 @@ void UtestShell::crash() void UtestShell::runOneTest(TestPlugin* plugin, TestResult& result) { hasFailed_ = false; + result.countRun(); HelperTestRunInfo runInfo(this, plugin, &result); if (isRunInSeperateProcess()) PlatformSpecificSetJmp(helperDoRunOneTestSeperateProcess, &runInfo); @@ -202,7 +203,6 @@ void UtestShell::runOneTestInCurrentProcess(TestPlugin* plugin, TestResult& resu UtestShell* savedTest = UtestShell::getCurrent(); TestResult* savedResult = UtestShell::getTestResult(); - result.countRun(); UtestShell::setTestResult(&result); UtestShell::setCurrentTest(this); diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 4ed99a314..f351c6700 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -74,6 +74,19 @@ static int PlatformSpecificWaitPidImplementation(int, int*, int) #else +static void SetTestFailureByStatusCode(UtestShell* shell, TestResult* result, int status) +{ + if (WIFEXITED(status) && WEXITSTATUS(status) != 0) { + result->addFailure(TestFailure(shell, "Failed in separate process")); + } else if (WIFSIGNALED(status)) { + SimpleString message("Failed in separate process - killed by signal "); + message += StringFrom(WTERMSIG(status)); + result->addFailure(TestFailure(shell, message)); + } else if (WIFSTOPPED(status)) { + result->addFailure(TestFailure(shell, "Stopped in separate process - continuing")); + } +} + static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin* plugin, TestResult* result) { const pid_t syscallError = -1; @@ -93,27 +106,17 @@ static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, Test shell->runOneTestInCurrentProcess(plugin, *result); // LCOV_EXCL_LINE _exit(initialFailureCount < result->getFailureCount()); // LCOV_EXCL_LINE } else { /* Code executed by parent */ - result->countRun(); do { w = PlatformSpecificWaitPid(cpid, &status, WUNTRACED); if (w == syscallError) { - if(EINTR == errno) continue; /* OS X debugger */ - result->addFailure(TestFailure(shell, "Call to waitpid() failed")); - return; - } - - if (WIFEXITED(status) && WEXITSTATUS(status) != 0) { - result->addFailure(TestFailure(shell, "Failed in separate process")); - } else if (WIFSIGNALED(status)) { - SimpleString signal(StringFrom(WTERMSIG(status))); - { - SimpleString message("Failed in separate process - killed by signal "); - message += signal; - result->addFailure(TestFailure(shell, message)); + // OS X debugger causes EINTR + if (EINTR != errno) { + result->addFailure(TestFailure(shell, "Call to waitpid() failed")); + return; } - } else if (WIFSTOPPED(status)) { - result->addFailure(TestFailure(shell, "Stopped in separate process - continuing")); - kill(w, SIGCONT); + } else { + if (WIFSTOPPED(status)) kill(w, SIGCONT); + SetTestFailureByStatusCode(shell, result, status); } } while ((w == syscallError) || (!WIFEXITED(status) && !WIFSIGNALED(status))); } diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index 270949c6e..6ea6796a2 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -146,7 +146,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToForkFai fixture.registry_->setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("Call to fork() failed"); - fixture.assertPrintContains("Errors (1 failures, 1 tests, 0 ran"); + fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran"); } TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToWaitPidWhileDebuggingInSeparateProcessWorks) From 75ada2da985d35140631faa3516a09bdb3792148 Mon Sep 17 00:00:00 2001 From: Vladimir Poddubnyi Date: Mon, 16 Dec 2019 20:41:51 +0300 Subject: [PATCH 0261/1093] Fix code review findings Use standard library wrapper in UtestPlatformTest.cpp. Swap kill(SIGCONT) and SetTestFailureByStatusCode(). --- src/Platforms/Gcc/UtestPlatform.cpp | 2 +- tests/CppUTest/UtestPlatformTest.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index f351c6700..6c9874629 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -115,8 +115,8 @@ static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, Test return; } } else { - if (WIFSTOPPED(status)) kill(w, SIGCONT); SetTestFailureByStatusCode(shell, result, status); + if (WIFSTOPPED(status)) kill(w, SIGCONT); } } while ((w == syscallError) || (!WIFEXITED(status) && !WIFSIGNALED(status))); } diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index 6ea6796a2..e0b668014 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -25,12 +25,11 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include - #include "CppUTest/CommandLineTestRunner.h" #include "CppUTest/TestHarness.h" #include "CppUTest/TestTestingFixture.h" #include "CppUTest/PlatformSpecificFunctions.h" +#include "CppUTest/StandardCLibrary.h" // This will cause a crash in VS2010 due to PlatformSpecificFree being uninitialized static const SimpleString str1("abc"); From 4d0e7c4f3f7a0de0b63693a8be37c015420fdcd1 Mon Sep 17 00:00:00 2001 From: Vladimir Poddubnyi Date: Tue, 24 Dec 2019 15:42:56 +0300 Subject: [PATCH 0262/1093] Return failure if no tests are run or ignored * Add helper function to TestResult * Make TestOutput report error based on it * Make runAllTests() return non-zero based on it --- include/CppUTest/TestResult.h | 5 +++ src/CppUTest/CommandLineTestRunner.cpp | 16 ++++++---- src/CppUTest/TestOutput.cpp | 16 +++++++--- tests/CppUTest/CommandLineTestRunnerTest.cpp | 4 +-- tests/CppUTest/TestOutputTest.cpp | 27 ++++++++++++++-- tests/CppUTest/TestResultTest.cpp | 33 ++++++++++++++++++++ 6 files changed, 85 insertions(+), 16 deletions(-) diff --git a/include/CppUTest/TestResult.h b/include/CppUTest/TestResult.h index f61194648..ee8307c9f 100644 --- a/include/CppUTest/TestResult.h +++ b/include/CppUTest/TestResult.h @@ -85,6 +85,11 @@ class TestResult return failureCount_; } + bool isFailure() const + { + return (getFailureCount() != 0) || (getRunCount() + getIgnoredCount() == 0); + } + long getTotalExecutionTime() const; void setTotalExecutionTime(long exTime); diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index e1c88c427..7cb8ec2b0 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -113,8 +113,9 @@ int CommandLineTestRunner::runAllTests() { initializeTestRun(); int loopCount = 0; - int failureCount = 0; - int repeat_ = arguments_->getRepeatCount(); + int failedTestCount = 0; + int failedExecutionCount = 0; + int repeatCount = arguments_->getRepeatCount(); if (arguments_->isListingTestGroupNames()) { @@ -139,17 +140,20 @@ int CommandLineTestRunner::runAllTests() output_->print("\n"); srand(seed); } - while (loopCount++ < repeat_) { + while (loopCount++ < repeatCount) { if (shuffleEnabled) { registry_->shuffleRunOrder(rand_); } - output_->printTestRun(loopCount, repeat_); + output_->printTestRun(loopCount, repeatCount); TestResult tr(*output_); registry_->runAllTests(tr); - failureCount += tr.getFailureCount(); + failedTestCount += tr.getFailureCount(); + if (tr.isFailure()) { + failedExecutionCount++; + } } - return failureCount; + return failedTestCount != 0 ? failedTestCount : failedExecutionCount; } TestOutput* CommandLineTestRunner::createTeamCityOutput() diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index 4d8a8d8a3..d8fae95a1 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -145,14 +145,20 @@ void TestOutput::printCurrentGroupEnded(const TestResult& /*res*/) void TestOutput::printTestsEnded(const TestResult& result) { print("\n"); - const bool anyTestFailed = result.getFailureCount() > 0; - if (anyTestFailed) { + const bool isFailure = result.isFailure(); + if (isFailure) { if (color_) { print("\033[31;1m"); } print("Errors ("); - print(result.getFailureCount()); - print(" failures, "); + const int failureCount = result.getFailureCount(); + if (failureCount > 0) { + print(failureCount); + print(" failures, "); + } + else { + print("ran nothing, "); + } } else { if (color_) { @@ -170,7 +176,7 @@ void TestOutput::printTestsEnded(const TestResult& result) print(" ignored, "); print(result.getFilteredOutCount()); print(" filtered out, "); - if (shuffleSeed_ != SHUFFLE_DISABLED && (verbose_ || anyTestFailed)) { + if (shuffleSeed_ != SHUFFLE_DISABLED && (verbose_ || isFailure)) { print("shuffle seed was: "); print(shuffleSeed_); print(", "); diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index 5f72e7aa9..3e244e93f 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -159,14 +159,14 @@ TEST(CommandLineTestRunner, ReturnsZeroWhenNoErrors) LONGS_EQUAL(0, returned); } -TEST(CommandLineTestRunner, ReturnsZeroWhenNoTestsMatchProvidedFilter) +TEST(CommandLineTestRunner, ReturnsOneWhenNoTestsMatchProvidedFilter) { const char* argv[] = { "tests.exe", "-g", "NoSuchGroup"}; CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(3, argv, ®istry); int returned = commandLineTestRunner.runAllTestsMain(); - LONGS_EQUAL(0, returned); + LONGS_EQUAL(1, returned); } TEST(CommandLineTestRunner, TeamcityOutputEnabled) diff --git a/tests/CppUTest/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp index 564d87784..e761c339a 100644 --- a/tests/CppUTest/TestOutputTest.cpp +++ b/tests/CppUTest/TestOutputTest.cpp @@ -76,6 +76,12 @@ TEST_GROUP(TestOutput) delete f3; delete result; } + + void runOneTest() + { + result->countTest(); + result->countRun(); + } }; TEST(TestOutput, PrintConstCharStar) @@ -120,16 +126,18 @@ TEST(TestOutput, PrintTestALot) TEST(TestOutput, PrintTestALotAndSimulateRepeatRun) { for (int i = 0; i < 60; ++i) { + runOneTest(); printer->printCurrentTestEnded(*result); } printer->printTestsEnded(*result); for (int i = 0; i < 60; ++i) { + runOneTest(); printer->printCurrentTestEnded(*result); } STRCMP_EQUAL("..................................................\n.........." \ - "\nOK (0 tests, 0 ran, 0 checks, 0 ignored, 0 filtered out, 10 ms)\n\n" \ + "\nOK (60 tests, 60 ran, 0 checks, 0 ignored, 0 filtered out, 10 ms)\n\n" \ "..................................................\n..........", mock->getOutput().asCharString()); } @@ -164,17 +172,21 @@ TEST(TestOutput, PrintTestVerboseEnded) TEST(TestOutput, printColorWithSuccess) { mock->color(); + runOneTest(); printer->printTestsEnded(*result); - STRCMP_EQUAL("\n\033[32;1mOK (0 tests, 0 ran, 0 checks, 0 ignored, 0 filtered out, 10 ms)\033[m\n\n", mock->getOutput().asCharString()); + STRCMP_EQUAL("\n\033[32;1mOK (1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out, 10 ms)\033[m\n\n", + mock->getOutput().asCharString()); } TEST(TestOutput, printColorWithFailures) { mock->color(); + runOneTest(); result->addFailure(*f); printer->flush(); printer->printTestsEnded(*result); - STRCMP_EQUAL("\n\033[31;1mErrors (1 failures, 0 tests, 0 ran, 0 checks, 0 ignored, 0 filtered out, 10 ms)\033[m\n\n", mock->getOutput().asCharString()); + STRCMP_EQUAL("\n\033[31;1mErrors (1 failures, 1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out, 10 ms)" + "\033[m\n\n", mock->getOutput().asCharString()); } TEST(TestOutput, PrintTestRun) @@ -250,6 +262,15 @@ TEST(TestOutput, printTestsEndedWithFailures) STRCMP_EQUAL("\nErrors (1 failures, 0 tests, 0 ran, 0 checks, 0 ignored, 0 filtered out, 10 ms)\n\n", mock->getOutput().asCharString()); } +TEST(TestOutput, printTestsEndedWithNoTestsRunOrIgnored) +{ + result->countTest(); + printer->flush(); + printer->printTestsEnded(*result); + STRCMP_EQUAL("\nErrors (ran nothing, 1 tests, 0 ran, 0 checks, 0 ignored, 0 filtered out, 10 ms)\n\n", + mock->getOutput().asCharString()); +} + class CompositeTestOutputTestStringBufferTestOutput : public StringBufferTestOutput { public: diff --git a/tests/CppUTest/TestResultTest.cpp b/tests/CppUTest/TestResultTest.cpp index 88107dd4c..c60fff12b 100644 --- a/tests/CppUTest/TestResultTest.cpp +++ b/tests/CppUTest/TestResultTest.cpp @@ -64,3 +64,36 @@ TEST(TestResult, TestEndedWillPrintResultsAndExecutionTime) res->testsEnded(); CHECK(mock->getOutput().contains("10 ms")); } + +TEST(TestResult, ResultIsOkIfTestIsRunWithNoFailures) +{ + res->countTest(); + res->countRun(); + CHECK_FALSE(res->isFailure()); +} + +TEST(TestResult, ResultIsOkIfTestIsIgnored) +{ + res->countTest(); + res->countIgnored(); + CHECK_FALSE(res->isFailure()); +} + +TEST(TestResult, ResultIsNotOkIfFailures) +{ + res->countTest(); + res->countRun(); + res->addFailure(TestFailure(UtestShell::getCurrent(), StringFrom("dummy message"))); + CHECK_TRUE(res->isFailure()); +} + +TEST(TestResult, ResultIsNotOkIfNoTestsAtAll) +{ + CHECK_TRUE(res->isFailure()); +} + +TEST(TestResult, ResultIsNotOkIfNoTestsRunOrIgnored) +{ + res->countTest(); + CHECK_TRUE(res->isFailure()); +} From 4163c84f98fdb51afd9cd6b7221564c0fac33657 Mon Sep 17 00:00:00 2001 From: Vladimir Poddubnyi Date: Thu, 26 Dec 2019 17:38:31 +0300 Subject: [PATCH 0263/1093] Add more verbose message when failing due to no tests run --- src/CppUTest/TestOutput.cpp | 6 +++++- tests/CppUTest/TestOutputTest.cpp | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index d8fae95a1..444e4c394 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -146,12 +146,12 @@ void TestOutput::printTestsEnded(const TestResult& result) { print("\n"); const bool isFailure = result.isFailure(); + const int failureCount = result.getFailureCount(); if (isFailure) { if (color_) { print("\033[31;1m"); } print("Errors ("); - const int failureCount = result.getFailureCount(); if (failureCount > 0) { print(failureCount); print(" failures, "); @@ -186,6 +186,10 @@ void TestOutput::printTestsEnded(const TestResult& result) if (color_) { print("\033[m"); } + if (isFailure && failureCount == 0) { + print("\nNote: test run failed because no tests were run or ignored. Assuming something went wrong. " + "This often happens because of linking errors or typos in test filter."); + } print("\n\n"); dotCount_ = 0; diff --git a/tests/CppUTest/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp index e761c339a..29a2a0581 100644 --- a/tests/CppUTest/TestOutputTest.cpp +++ b/tests/CppUTest/TestOutputTest.cpp @@ -267,7 +267,9 @@ TEST(TestOutput, printTestsEndedWithNoTestsRunOrIgnored) result->countTest(); printer->flush(); printer->printTestsEnded(*result); - STRCMP_EQUAL("\nErrors (ran nothing, 1 tests, 0 ran, 0 checks, 0 ignored, 0 filtered out, 10 ms)\n\n", + STRCMP_EQUAL("\nErrors (ran nothing, 1 tests, 0 ran, 0 checks, 0 ignored, 0 filtered out, 10 ms)\n" + "Note: test run failed because no tests were run or ignored. Assuming something went wrong. " + "This often happens because of linking errors or typos in test filter.\n\n", mock->getOutput().asCharString()); } From 2e84aaedd641a90cc478d4cc046389ab03a62f7b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 3 Feb 2020 16:37:57 +0100 Subject: [PATCH 0264/1093] Weird behavior with some autotools in Debian caused the default directories to be different. Adding the additional configuration flag fixes that --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index 914fb0a8d..c188240d2 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,7 @@ AC_PREREQ([2.68]) AC_INIT([CppUTest], [3.8], [https://github.com/cpputest/cpputest]) +AC_CONFIG_AUX_DIR([.]) AM_INIT_AUTOMAKE([subdir-objects]) AC_CONFIG_SRCDIR([src/CppUTest/Utest.cpp]) AC_CONFIG_HEADERS([config.h]) From b79023680df3c6a9a486029ee4f84a970525930e Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Fri, 7 Feb 2020 09:00:12 -0800 Subject: [PATCH 0265/1093] add .withUnmodifiedOutputParameter to expected call When writing mock expectations, a mock implementation may have an output parameter. In some tests it may be that the output parameter remains unmodified. To write an expectation which has an output parameter that is unmodified you can use the following code: .withOutputParameterReturning("name", NULL, 0) This is somewhat confusing, so add a shorthand .withUnmodifiedtOutputParameter("name") This sets up the mock function to expect the "name" output parameter but leave it unmodified. Signed-off-by: Jacob Keller --- include/CppUTestExt/MockCheckedExpectedCall.h | 2 ++ include/CppUTestExt/MockExpectedCall.h | 1 + include/CppUTestExt/MockSupport_c.h | 1 + src/CppUTestExt/MockExpectedCall.cpp | 5 ++++ src/CppUTestExt/MockSupport_c.cpp | 8 ++++++ tests/CppUTestExt/MockExpectedCallTest.cpp | 19 ++++++++++++++ tests/CppUTestExt/MockFailureTest.cpp | 22 ++++++++++++++++ tests/CppUTestExt/MockParameterTest.cpp | 25 +++++++++++++++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 9 +++++++ 9 files changed, 92 insertions(+) diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index 211c9bd9b..2079577f0 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -59,6 +59,7 @@ class MockCheckedExpectedCall : public MockExpectedCall virtual MockExpectedCall& withParameterOfType(const SimpleString& typeName, const SimpleString& name, const void* value) _override; virtual MockExpectedCall& withOutputParameterReturning(const SimpleString& name, const void* value, size_t size) _override; virtual MockExpectedCall& withOutputParameterOfTypeReturning(const SimpleString& typeName, const SimpleString& name, const void* value) _override; + virtual MockExpectedCall& withUnmodifiedOutputParameter(const SimpleString& name) _override; virtual MockExpectedCall& ignoreOtherParameters() _override; virtual MockExpectedCall& andReturnValue(bool value) _override; @@ -170,6 +171,7 @@ class MockIgnoredExpectedCall: public MockExpectedCall virtual MockExpectedCall& withParameterOfType(const SimpleString&, const SimpleString&, const void*) _override { return *this; } virtual MockExpectedCall& withOutputParameterReturning(const SimpleString&, const void*, size_t) _override { return *this; } virtual MockExpectedCall& withOutputParameterOfTypeReturning(const SimpleString&, const SimpleString&, const void*) _override { return *this; } + virtual MockExpectedCall& withUnmodifiedOutputParameter(const SimpleString&) _override { return *this; } virtual MockExpectedCall& ignoreOtherParameters() _override { return *this;} virtual MockExpectedCall& andReturnValue(bool) _override { return *this; } diff --git a/include/CppUTestExt/MockExpectedCall.h b/include/CppUTestExt/MockExpectedCall.h index 5b68ab6f0..51630dc3d 100644 --- a/include/CppUTestExt/MockExpectedCall.h +++ b/include/CppUTestExt/MockExpectedCall.h @@ -60,6 +60,7 @@ class MockExpectedCall virtual MockExpectedCall& withParameterOfType(const SimpleString& typeName, const SimpleString& name, const void* value)=0; virtual MockExpectedCall& withOutputParameterReturning(const SimpleString& name, const void* value, size_t size)=0; virtual MockExpectedCall& withOutputParameterOfTypeReturning(const SimpleString& typeName, const SimpleString& name, const void* value)=0; + virtual MockExpectedCall& withUnmodifiedOutputParameter(const SimpleString& name)=0; virtual MockExpectedCall& ignoreOtherParameters()=0; virtual MockExpectedCall& withBoolParameter(const SimpleString& name, bool value)=0; diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index a3a13e748..32f2b7d40 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -145,6 +145,7 @@ struct SMockExpectedCall_c MockExpectedCall_c* (*withParameterOfType)(const char* type, const char* name, const void* value); MockExpectedCall_c* (*withOutputParameterReturning)(const char* name, const void* value, size_t size); MockExpectedCall_c* (*withOutputParameterOfTypeReturning)(const char* type, const char* name, const void* value); + MockExpectedCall_c* (*withUnmodifiedOutputParameter)(const char* name); MockExpectedCall_c* (*ignoreOtherParameters)(void); MockExpectedCall_c* (*andReturnBoolValue)(int value); diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index ad035dc9f..de931dcbd 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -240,6 +240,11 @@ MockExpectedCall& MockCheckedExpectedCall::withOutputParameterOfTypeReturning(co return *this; } +MockExpectedCall& MockCheckedExpectedCall::withUnmodifiedOutputParameter(const SimpleString& name) +{ + return withOutputParameterReturning(name, NULLPTR, 0); +} + SimpleString MockCheckedExpectedCall::getInputParameterType(const SimpleString& name) { MockNamedValue * p = inputParameters_->getValueByName(name); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 54d527c9e..ddfd24070 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -160,6 +160,7 @@ MockExpectedCall_c* withMemoryBufferParameters_c(const char* name, const unsigne MockExpectedCall_c* withParameterOfType_c(const char* type, const char* name, const void* value); MockExpectedCall_c* withOutputParameterReturning_c(const char* name, const void* value, size_t size); MockExpectedCall_c* withOutputParameterOfTypeReturning_c(const char* type, const char* name, const void* value); +MockExpectedCall_c* withUnmodifiedOutputParameter_c(const char* name); MockExpectedCall_c* ignoreOtherParameters_c(); MockExpectedCall_c* andReturnBoolValue_c(int value); MockExpectedCall_c* andReturnIntValue_c(int value); @@ -261,6 +262,7 @@ static MockExpectedCall_c gExpectedCall = { withParameterOfType_c, withOutputParameterReturning_c, withOutputParameterOfTypeReturning_c, + withUnmodifiedOutputParameter_c, ignoreOtherParameters_c, andReturnBoolValue_c, andReturnUnsignedIntValue_c, @@ -496,6 +498,12 @@ MockExpectedCall_c* withOutputParameterOfTypeReturning_c(const char* type, const return &gExpectedCall; } +MockExpectedCall_c* withUnmodifiedOutputParameter_c(const char* name) +{ + expectedCall = &expectedCall->withUnmodifiedOutputParameter(name); + return &gExpectedCall; +} + MockExpectedCall_c* ignoreOtherParameters_c() { expectedCall = &expectedCall->ignoreOtherParameters(); diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index c12167a54..b557f5346 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -610,6 +610,15 @@ TEST(MockExpectedCall, toStringForMultipleOutputParameters) STRCMP_EQUAL("name -> const void* buffer1: , const void* buffer2: (expected 1 call, called 1 time)", expectedCall.callToString().asCharString()); } +TEST(MockExpectedCall, toStringForUnmodifiedOutputParameter) +{ + MockCheckedExpectedCall expectedCall(1); + expectedCall.withName("name"); + expectedCall.withUnmodifiedOutputParameter("buffer1"); + expectedCall.callWasMade(1); + STRCMP_EQUAL("name -> const void* buffer1: (expected 1 call, called 1 time)", expectedCall.callToString().asCharString()); +} + TEST(MockExpectedCall, toStringForParameterAndIgnored) { MockCheckedExpectedCall expectedCall(1); @@ -706,6 +715,15 @@ TEST(MockExpectedCall, hasOutputParameter) CHECK(call->hasOutputParameter(foo)); } +TEST(MockExpectedCall, hasUnmodifiedOutputParameter) +{ + call->withUnmodifiedOutputParameter("foo"); + MockNamedValue foo("foo"); + foo.setValue((const void *)NULLPTR); + foo.setSize(0); + CHECK(call->hasOutputParameter(foo)); +} + TEST(MockExpectedCall, hasNoOutputParameter) { call->withIntParameter("foo", (int)1); @@ -771,6 +789,7 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.withParameterOfType( "mytype", "top", (const void*) NULLPTR); ignored.withOutputParameterReturning("bar", (void*) NULLPTR, 1); ignored.withOutputParameterOfTypeReturning("mytype", "bar", (const void*) NULLPTR); + ignored.withUnmodifiedOutputParameter("unmod"); ignored.ignoreOtherParameters(); ignored.andReturnValue(true); ignored.andReturnValue((double) 1.0f); diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index ca2935231..7cca4f590 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -181,6 +181,28 @@ TEST(MockFailureTest, MockUnexpectedOutputParameterFailure) "\t\tvoid* bar", failure.getMessage().asCharString()); } +TEST(MockFailureTest, MockUnexpectedUnmodifiedOutputParameterFailure) +{ + int out1; + call1->withName("foo").withOutputParameterReturning("boo", &out1, sizeof(out1)); + call2->withName("foo").withUnmodifiedOutputParameter("boo"); + call3->withName("unrelated"); + addAllToList(); + + MockNamedValue actualParameter("bar"); + actualParameter.setValue((void *)0x123); + + MockUnexpectedOutputParameterFailure failure(UtestShell::getCurrent(), "foo", actualParameter, *list); + STRCMP_EQUAL("Mock Failure: Unexpected output parameter name to function \"foo\": bar\n" + "\tEXPECTED calls that WERE NOT fulfilled related to function: foo\n" + "\t\tfoo -> const void* boo: (expected 1 call, called 0 times)\n" + "\t\tfoo -> const void* boo: (expected 1 call, called 0 times)\n" + "\tEXPECTED calls that WERE fulfilled related to function: foo\n" + "\t\t\n" + "\tACTUAL unexpected output parameter passed to function: foo\n" + "\t\tvoid* bar", failure.getMessage().asCharString()); +} + TEST(MockFailureTest, MockUnexpectedParameterValueFailure) { call1->withName("foo").withParameter("boo", 2); diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 476ccc83d..4052ffa53 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -634,6 +634,17 @@ TEST(MockParameterTest, outputParameterSucceeds) mock().checkExpectations(); } +TEST(MockParameterTest, unmodifiedOutputParameterSucceeds) +{ + int param = 1; + + mock().expectOneCall("function").withUnmodifiedOutputParameter("parameterName"); + mock().actualCall("function").withOutputParameter("parameterName", ¶m); + + CHECK_EQUAL(param, 1); + mock().checkExpectations(); +} + TEST(MockParameterTest, noActualCallForOutputParameter) { MockFailureReporterInstaller failureReporterInstaller; @@ -649,6 +660,20 @@ TEST(MockParameterTest, noActualCallForOutputParameter) CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } +TEST(MockParameterTest, noActualCallForUnmodifiedOutputParameter) +{ + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest expectations; + mock().expectOneCall("foo").withUnmodifiedOutputParameter("output"); + + expectations.addFunction("foo")->withUnmodifiedOutputParameter("output"); + MockExpectedCallsDidntHappenFailure expectedFailure(mockFailureTest(), expectations); + + mock().checkExpectations(); + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); +} + TEST(MockParameterTest, unexpectedOutputParameter) { MockFailureReporterInstaller failureReporterInstaller; diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index c368e0c4e..d1caa1374 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -195,6 +195,15 @@ TEST(MockSupport_c, outputParameters) LONGS_EQUAL(2, retval); } +TEST(MockSupport_c, unmodifiedOutputParameter) +{ + int param = 1; + mock_c()->expectOneCall("foo")->withUnmodifiedOutputParameter("out"); + mock_c()->actualCall("foo")->withOutputParameter("out", ¶m); + mock_c()->checkExpectations(); + LONGS_EQUAL(1, param); +} + TEST(MockSupport_c, outputParameters_differentType) { long param = 1; From 60823995809c19afb865f4f90a32a1bb4ddd2c9f Mon Sep 17 00:00:00 2001 From: Gavin Lambert Date: Tue, 10 Mar 2020 16:33:02 +1300 Subject: [PATCH 0266/1093] Use a safer method to toggle new/delete overloads. Fixes #1278. --- include/CppUTest/MemoryLeakWarningPlugin.h | 5 +- src/CppUTest/MemoryLeakWarningPlugin.cpp | 64 ++++++++++++++++++---- 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/include/CppUTest/MemoryLeakWarningPlugin.h b/include/CppUTest/MemoryLeakWarningPlugin.h index 6b9c98639..97d31cf42 100644 --- a/include/CppUTest/MemoryLeakWarningPlugin.h +++ b/include/CppUTest/MemoryLeakWarningPlugin.h @@ -67,7 +67,10 @@ class MemoryLeakWarningPlugin: public TestPlugin static void turnOffNewDeleteOverloads(); static void turnOnNewDeleteOverloads(); static void turnOnThreadSafeNewDeleteOverloads(); - static bool areNewDeleteOverloaded(); + + static void saveAndDisableNewDeleteOverloads(); + static void restoreNewDeleteOverloads(); + private: MemoryLeakDetector* memLeakDetector_; bool ignoreAllWarnings_; diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 1c78609fe..f1d1b26be 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -101,6 +101,9 @@ static void normal_free(void* buffer, const char*, int) static void *(*malloc_fptr)(size_t size, const char* file, int line) = mem_leak_malloc; static void (*free_fptr)(void* mem, const char* file, int line) = mem_leak_free; static void*(*realloc_fptr)(void* memory, size_t size, const char* file, int line) = mem_leak_realloc; +static void *(*saved_malloc_fptr)(size_t size, const char* file, int line) = mem_leak_malloc; +static void (*saved_free_fptr)(void* mem, const char* file, int line) = mem_leak_free; +static void*(*saved_realloc_fptr)(void* memory, size_t size, const char* file, int line) = mem_leak_realloc; #else static void *(*malloc_fptr)(size_t size, const char* file, int line) = normal_malloc; static void (*free_fptr)(void* mem, const char* file, int line) = normal_free; @@ -299,6 +302,16 @@ static void *(*operator_new_array_debug_fptr)(size_t size, const char* file, int static void (*operator_delete_fptr)(void* mem) UT_NOTHROW = mem_leak_operator_delete; static void (*operator_delete_array_fptr)(void* mem) UT_NOTHROW = mem_leak_operator_delete_array; +static void *(*saved_operator_new_fptr)(size_t size) UT_THROW(std::bad_alloc) = mem_leak_operator_new; +static void *(*saved_operator_new_nothrow_fptr)(size_t size) UT_NOTHROW = mem_leak_operator_new_nothrow; +static void *(*saved_operator_new_debug_fptr)(size_t size, const char* file, int line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_debug; +static void *(*saved_operator_new_array_fptr)(size_t size) UT_THROW(std::bad_alloc) = mem_leak_operator_new_array; +static void *(*saved_operator_new_array_nothrow_fptr)(size_t size) UT_NOTHROW = mem_leak_operator_new_array_nothrow; +static void *(*saved_operator_new_array_debug_fptr)(size_t size, const char* file, int line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_array_debug; +static void (*saved_operator_delete_fptr)(void* mem) UT_NOTHROW = mem_leak_operator_delete; +static void (*saved_operator_delete_array_fptr)(void* mem) UT_NOTHROW = mem_leak_operator_delete_array; +static int save_counter = 0; + void* operator new(size_t size) UT_THROW(std::bad_alloc) { return operator_new_fptr(size); @@ -430,15 +443,6 @@ void MemoryLeakWarningPlugin::turnOnNewDeleteOverloads() #endif } -bool MemoryLeakWarningPlugin::areNewDeleteOverloaded() -{ -#if CPPUTEST_USE_MEM_LEAK_DETECTION - return operator_new_fptr == mem_leak_operator_new; -#else - return false; -#endif -} - void MemoryLeakWarningPlugin::turnOnThreadSafeNewDeleteOverloads() { #if CPPUTEST_USE_MEM_LEAK_DETECTION @@ -456,6 +460,43 @@ void MemoryLeakWarningPlugin::turnOnThreadSafeNewDeleteOverloads() #endif } +void MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads() +{ +#if CPPUTEST_USE_MEM_LEAK_DETECTION + if (++save_counter > 1) return; + saved_operator_new_fptr = operator_new_fptr; + saved_operator_new_nothrow_fptr = operator_new_nothrow_fptr; + saved_operator_new_debug_fptr = operator_new_debug_fptr; + saved_operator_new_array_fptr = operator_new_array_fptr; + saved_operator_new_array_nothrow_fptr = operator_new_array_nothrow_fptr; + saved_operator_new_array_debug_fptr = operator_new_array_debug_fptr; + saved_operator_delete_fptr = operator_delete_fptr; + saved_operator_delete_array_fptr = operator_delete_array_fptr; + saved_malloc_fptr = malloc_fptr; + saved_realloc_fptr = realloc_fptr; + saved_free_fptr = free_fptr; + turnOffNewDeleteOverloads(); +#endif +} + +void MemoryLeakWarningPlugin::restoreNewDeleteOverloads() +{ +#if CPPUTEST_USE_MEM_LEAK_DETECTION + if (--save_counter > 0) return; + operator_new_fptr = saved_operator_new_fptr; + operator_new_nothrow_fptr = saved_operator_new_nothrow_fptr; + operator_new_debug_fptr = saved_operator_new_debug_fptr; + operator_new_array_fptr = saved_operator_new_array_fptr; + operator_new_array_nothrow_fptr = saved_operator_new_array_nothrow_fptr; + operator_new_array_debug_fptr = saved_operator_new_array_debug_fptr; + operator_delete_fptr = saved_operator_delete_fptr; + operator_delete_array_fptr = saved_operator_delete_array_fptr; + malloc_fptr = saved_malloc_fptr; + realloc_fptr = saved_realloc_fptr; + free_fptr = saved_free_fptr; +#endif +} + void crash_on_allocation_number(unsigned alloc_number) { static CrashOnAllocationAllocator crashAllocator; @@ -485,13 +526,12 @@ static MemoryLeakDetector* globalDetector = NULLPTR; MemoryLeakDetector* MemoryLeakWarningPlugin::getGlobalDetector() { if (globalDetector == NULLPTR) { - bool newDeleteOverloaded = areNewDeleteOverloaded(); - turnOffNewDeleteOverloads(); + saveAndDisableNewDeleteOverloads(); globalReporter = new MemoryLeakWarningReporter; globalDetector = new MemoryLeakDetector(globalReporter); - if (newDeleteOverloaded) turnOnNewDeleteOverloads(); + restoreNewDeleteOverloads(); } return globalDetector; } From c05f75cae8ac67185ea89429436a3ac618ee06d2 Mon Sep 17 00:00:00 2001 From: Michael Altizer Date: Sat, 14 Mar 2020 13:40:33 -0400 Subject: [PATCH 0267/1093] Fix remaining missing class member function override specifiers --- include/CppUTest/TestOutput.h | 2 +- include/CppUTest/Utest.h | 2 +- include/CppUTestExt/MockFailure.h | 2 +- include/CppUTestExt/OrderedTest.h | 2 +- src/CppUTest/MemoryLeakWarningPlugin.cpp | 4 ++-- src/CppUTest/Utest.cpp | 2 +- src/CppUTestExt/MockFailure.cpp | 4 ++-- tests/CppUTest/CommandLineArgumentsTest.cpp | 4 ++-- tests/CppUTest/MemoryLeakDetectorTest.cpp | 4 ++-- tests/CppUTest/MemoryLeakWarningTest.cpp | 10 +++++----- tests/CppUTest/SimpleStringTest.cpp | 10 +++++----- tests/CppUTest/TestRegistryTest.cpp | 14 +++++++------- tests/CppUTestExt/MockFailureReporterForTest.h | 2 +- 13 files changed, 31 insertions(+), 31 deletions(-) diff --git a/include/CppUTest/TestOutput.h b/include/CppUTest/TestOutput.h index 868ffa315..3968ea4fc 100644 --- a/include/CppUTest/TestOutput.h +++ b/include/CppUTest/TestOutput.h @@ -176,7 +176,7 @@ class CompositeTestOutput : public TestOutput virtual void setOutputTwo(TestOutput* output); CompositeTestOutput(); - virtual ~CompositeTestOutput(); + virtual ~CompositeTestOutput() _destructor_override; virtual void printTestsStarted() _override; virtual void printTestsEnded(const TestResult& result) _override; diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index b7aed93b8..567f30d5e 100644 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -208,7 +208,7 @@ class ExecFunctionTestShell: public UtestShell { } Utest* createTest() _override { return new ExecFunctionTest(this); } - virtual ~ExecFunctionTestShell(); + virtual ~ExecFunctionTestShell() _destructor_override; }; //////////////////// CppUTestFailedException diff --git a/include/CppUTestExt/MockFailure.h b/include/CppUTestExt/MockFailure.h index 8cfdced74..af2578575 100644 --- a/include/CppUTestExt/MockFailure.h +++ b/include/CppUTestExt/MockFailure.h @@ -54,7 +54,7 @@ class MockFailure : public TestFailure { public: MockFailure(UtestShell* test); - virtual ~MockFailure(){} + virtual ~MockFailure() _destructor_override {} protected: void addExpectationsAndCallHistory(const MockExpectedCallsList& expectations); void addExpectationsAndCallHistoryRelatedTo(const SimpleString& function, const MockExpectedCallsList& expectations); diff --git a/include/CppUTestExt/OrderedTest.h b/include/CppUTestExt/OrderedTest.h index 08f3560dc..002dd472d 100644 --- a/include/CppUTestExt/OrderedTest.h +++ b/include/CppUTestExt/OrderedTest.h @@ -32,7 +32,7 @@ class OrderedTestShell : public UtestShell { public: OrderedTestShell(); - virtual ~OrderedTestShell(); + virtual ~OrderedTestShell() _destructor_override; virtual OrderedTestShell* addOrderedTest(OrderedTestShell* test); virtual OrderedTestShell* getNextOrderedTest(); diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 1c78609fe..79bf7d842 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -468,11 +468,11 @@ void crash_on_allocation_number(unsigned alloc_number) class MemoryLeakWarningReporter: public MemoryLeakFailure { public: - virtual ~MemoryLeakWarningReporter() + virtual ~MemoryLeakWarningReporter() _destructor_override { } - virtual void fail(char* fail_string) + virtual void fail(char* fail_string) _override { UtestShell* currentTest = UtestShell::getCurrent(); currentTest->failWith(FailFailure(currentTest, currentTest->getName().asCharString(), currentTest->getLineNumber(), fail_string), TestTerminatorWithoutExceptions()); diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 515abdfae..f76f4c62b 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -55,7 +55,7 @@ class OutsideTestRunnerUTest: public UtestShell { return defaultTestResult; } - virtual ~OutsideTestRunnerUTest() + virtual ~OutsideTestRunnerUTest() _destructor_override { } private: diff --git a/src/CppUTestExt/MockFailure.cpp b/src/CppUTestExt/MockFailure.cpp index 252387614..703c0753a 100644 --- a/src/CppUTestExt/MockFailure.cpp +++ b/src/CppUTestExt/MockFailure.cpp @@ -38,7 +38,7 @@ class MockFailureReporterTestTerminator : public NormalTestTerminator { } - virtual void exitCurrentTest() const + virtual void exitCurrentTest() const _override { if (crashOnFailure_) UT_CRASH(); @@ -46,7 +46,7 @@ class MockFailureReporterTestTerminator : public NormalTestTerminator NormalTestTerminator::exitCurrentTest(); } // LCOV_EXCL_LINE - virtual ~MockFailureReporterTestTerminator() + virtual ~MockFailureReporterTestTerminator() _destructor_override { } private: diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index 07f7fa8fe..a5db0a1e3 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -36,10 +36,10 @@ class OptionsPlugin: public TestPlugin TestPlugin(name) { } - ~OptionsPlugin() + ~OptionsPlugin() _destructor_override { } - bool parseArguments(int /*ac*/, const char *const * /*av*/, int /*index*/) + bool parseArguments(int /*ac*/, const char *const * /*av*/, int /*index*/) _override { return true; } diff --git a/tests/CppUTest/MemoryLeakDetectorTest.cpp b/tests/CppUTest/MemoryLeakDetectorTest.cpp index ec8c53717..c4ea89db5 100644 --- a/tests/CppUTest/MemoryLeakDetectorTest.cpp +++ b/tests/CppUTest/MemoryLeakDetectorTest.cpp @@ -33,11 +33,11 @@ class MemoryLeakFailureForTest: public MemoryLeakFailure { public: - virtual ~MemoryLeakFailureForTest() + virtual ~MemoryLeakFailureForTest() _destructor_override { } - virtual void fail(char* fail_string) + virtual void fail(char* fail_string) _override { *message = fail_string; } diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index 0af9199d7..fa269e127 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -41,10 +41,10 @@ static long* leak2; class DummyReporter: public MemoryLeakFailure { public: - virtual ~DummyReporter() + virtual ~DummyReporter() _destructor_override { } - virtual void fail(char* /*fail_string*/) + virtual void fail(char* /*fail_string*/) _override { } }; @@ -156,7 +156,7 @@ class DummyMemoryLeakDetector : public MemoryLeakDetector { public: DummyMemoryLeakDetector(MemoryLeakFailure* reporter) : MemoryLeakDetector(reporter) {} - virtual ~DummyMemoryLeakDetector() + virtual ~DummyMemoryLeakDetector() _destructor_override { memoryLeakDetectorWasDeleted = true; } @@ -164,11 +164,11 @@ class DummyMemoryLeakDetector : public MemoryLeakDetector class DummyMemoryLeakFailure : public MemoryLeakFailure { - virtual ~DummyMemoryLeakFailure() + virtual ~DummyMemoryLeakFailure() _destructor_override { memoryLeakFailureWasDelete = true; } - virtual void fail(char*) + virtual void fail(char*) _override { } }; diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 34cedbe47..6e8c6c6cd 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -34,13 +34,13 @@ class JustUseNewStringAllocator : public TestMemoryAllocator { public: - virtual ~JustUseNewStringAllocator() {} + virtual ~JustUseNewStringAllocator() _destructor_override {} - char* alloc_memory(size_t size, const char* file, int line) + char* alloc_memory(size_t size, const char* file, int line) _override { return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, file, line); } - void free_memory(char* str, const char* file, int line) + void free_memory(char* str, const char* file, int line) _override { MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(getCurrentNewArrayAllocator(), str, file, line); } @@ -70,10 +70,10 @@ class MyOwnStringAllocator : public TestMemoryAllocator { public: MyOwnStringAllocator() : memoryWasAllocated(false) {} - virtual ~MyOwnStringAllocator() {} + virtual ~MyOwnStringAllocator() _destructor_override {} bool memoryWasAllocated; - char* alloc_memory(size_t size, const char* file, int line) + char* alloc_memory(size_t size, const char* file, int line) _override { memoryWasAllocated = true; return TestMemoryAllocator::alloc_memory(size, file, line); diff --git a/tests/CppUTest/TestRegistryTest.cpp b/tests/CppUTest/TestRegistryTest.cpp index 387447db5..ca604e814 100644 --- a/tests/CppUTest/TestRegistryTest.cpp +++ b/tests/CppUTest/TestRegistryTest.cpp @@ -66,7 +66,7 @@ class MockTestResult: public TestResult resetCount(); } - virtual ~MockTestResult() + virtual ~MockTestResult() _destructor_override { } @@ -80,27 +80,27 @@ class MockTestResult: public TestResult countCurrentGroupEnded = 0; } - virtual void testsStarted() + virtual void testsStarted() _override { countTestsStarted++; } - virtual void testsEnded() + virtual void testsEnded() _override { countTestsEnded++; } - virtual void currentTestStarted(UtestShell* /*test*/) + virtual void currentTestStarted(UtestShell* /*test*/) _override { countCurrentTestStarted++; } - virtual void currentTestEnded(UtestShell* /*test*/) + virtual void currentTestEnded(UtestShell* /*test*/) _override { countCurrentTestEnded++; } - virtual void currentGroupStarted(UtestShell* /*test*/) + virtual void currentGroupStarted(UtestShell* /*test*/) _override { countCurrentGroupStarted++; } - virtual void currentGroupEnded(UtestShell* /*test*/) + virtual void currentGroupEnded(UtestShell* /*test*/) _override { countCurrentGroupEnded++; } diff --git a/tests/CppUTestExt/MockFailureReporterForTest.h b/tests/CppUTestExt/MockFailureReporterForTest.h index ebc6fd252..0c61ec694 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.h +++ b/tests/CppUTestExt/MockFailureReporterForTest.h @@ -58,7 +58,7 @@ void CHECK_NO_MOCK_FAILURE_LOCATION(const char* file, int line); class MockExpectedCallsListForTest : public MockExpectedCallsList { public: - ~MockExpectedCallsListForTest(); + ~MockExpectedCallsListForTest() _destructor_override; MockCheckedExpectedCall* addFunction(const SimpleString& name); MockCheckedExpectedCall* addFunction(unsigned int numCalls, const SimpleString& name); MockCheckedExpectedCall* addFunctionOrdered(const SimpleString& name, unsigned int order); From 0fe68e341e8ffc48fe778aec3d4ed251f9d8947c Mon Sep 17 00:00:00 2001 From: Benjamin Giesinger Date: Sun, 15 Mar 2020 21:05:53 +0100 Subject: [PATCH 0268/1093] Added installation as external cmake project --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index 7543111ae..64e6ac68a 100644 --- a/README.md +++ b/README.md @@ -196,5 +196,28 @@ There are some scripts that are helpful in creating your initial h, cpp, and Test files. See scripts/README.TXT +## Integration as external CMake project + +Sometimes you want to use CppUTest in your project without installing it to your system or for having control over the version you are using. This little snippet get the wanted version from Github and builds it as a library. + +```cmake +# CppUTest +include(FetchContent) +FetchContent_Declare( + CppUTest + GIT_REPOSITORY https://github.com/cpputest/cpputest.git + GIT_TAG v3.8 +) +# Set this to ON if you want to have the CppUTests in your project as well. +set(TESTS OFF CACHE BOOL "Switch off CppUTest Test build") +FetchContent_MakeAvailable(CppUTest) +include_directories(${CppUTest_SOURCE_DIR}/include) +``` +It can be used then like so: +```cmake +file(GLOB_RECURSE TEST_SOURCES ${TEST_DIR}/*.cpp) +add_executable(run_tests ${TEST_SOURCES}) +target_link_libraries(run_tests CppUTest) +``` \ No newline at end of file From fe30d2a9a8523716e5e090bf926d5ffa0a601a16 Mon Sep 17 00:00:00 2001 From: Jan Markowski Date: Thu, 2 Apr 2020 11:35:48 -0400 Subject: [PATCH 0269/1093] Remove the lib that gets created when using the 'clean' target --- build/MakefileWorker.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index bd054ad4d..43403eebc 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -516,7 +516,7 @@ endif clean: @echo Making clean $(SILENCE)$(RM) $(STUFF_TO_CLEAN) - $(SILENCE)rm -rf gcov $(CPPUTEST_OBJS_DIR) + $(SILENCE)rm -rf gcov $(CPPUTEST_OBJS_DIR) $(CPPUTEST_LIB_DIR) $(SILENCE)find . -name "*.gcno" | xargs rm -f $(SILENCE)find . -name "*.gcda" | xargs rm -f From 571bef0b5999d4912067b4151bcad17f369f946b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 14 Apr 2020 09:15:20 +0800 Subject: [PATCH 0270/1093] Removed unused macro warning --- tests/CppUTestExt/MockFakeLongLong.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/CppUTestExt/MockFakeLongLong.cpp b/tests/CppUTestExt/MockFakeLongLong.cpp index 4418e525a..cc6b3462e 100644 --- a/tests/CppUTestExt/MockFakeLongLong.cpp +++ b/tests/CppUTestExt/MockFakeLongLong.cpp @@ -34,7 +34,6 @@ #include "CppUTestExt/MockFailure.h" #include "MockFailureReporterForTest.h" -#define CHECK_TEST_FAILS_PROPER_WITH_TEXT(text) fixture.checkTestFailsWithProperTestLocation(text, __FILE__, __LINE__) TEST_GROUP(FakeLongLongs) { @@ -43,6 +42,8 @@ TEST_GROUP(FakeLongLongs) #ifndef CPPUTEST_USE_LONG_LONG +#define CHECK_TEST_FAILS_PROPER_WITH_TEXT(text) fixture.checkTestFailsWithProperTestLocation(text, __FILE__, __LINE__) + static void _actualCallWithFakeLongLongParameter() { cpputest_longlong value = {0}; From 6f6f3d062768f71484c24ec03b08057f0e8deacb Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 14 Apr 2020 10:17:11 +0800 Subject: [PATCH 0271/1093] Extracted the DummyMemoryLeakProtector to ensure compiler inlining doesnt cause watcom compielr to fail --- Makefile.am | 1 + tests/CppUTest/DummyMemoryLeakDetector.cpp | 72 ++++++++++++++++++++++ tests/CppUTest/DummyMemoryLeakDetector.h | 51 +++++++++++++++ tests/CppUTest/MemoryLeakWarningTest.cpp | 69 +++++---------------- 4 files changed, 139 insertions(+), 54 deletions(-) create mode 100644 tests/CppUTest/DummyMemoryLeakDetector.cpp create mode 100644 tests/CppUTest/DummyMemoryLeakDetector.h diff --git a/Makefile.am b/Makefile.am index 093348cf3..b5e1cdd19 100644 --- a/Makefile.am +++ b/Makefile.am @@ -145,6 +145,7 @@ CppUTestTests_SOURCES = \ tests/CppUTest/CheatSheetTest.cpp \ tests/CppUTest/CommandLineArgumentsTest.cpp \ tests/CppUTest/CommandLineTestRunnerTest.cpp \ + tests/CppUTest/DummyMemoryLeakDetector.cpp \ tests/CppUTest/JUnitOutputTest.cpp \ tests/CppUTest/MemoryLeakDetectorTest.cpp \ tests/CppUTest/MemoryOperatorOverloadTest.cpp \ diff --git a/tests/CppUTest/DummyMemoryLeakDetector.cpp b/tests/CppUTest/DummyMemoryLeakDetector.cpp new file mode 100644 index 000000000..1ed683149 --- /dev/null +++ b/tests/CppUTest/DummyMemoryLeakDetector.cpp @@ -0,0 +1,72 @@ +/* + * 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 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 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/MemoryLeakDetector.h" +#include "DummyMemoryLeakDetector.h" + +DummyMemoryLeakDetector::DummyMemoryLeakDetector(MemoryLeakFailure* reporter) : MemoryLeakDetector(reporter) +{ + memoryLeakDetectorWasDeleted = false; +} + +DummyMemoryLeakDetector::~DummyMemoryLeakDetector() _destructor_override +{ + memoryLeakDetectorWasDeleted = true; +} + +bool DummyMemoryLeakDetector::wasDeleted() +{ + return memoryLeakDetectorWasDeleted; +} + +bool DummyMemoryLeakDetector::memoryLeakDetectorWasDeleted = false; + +DummyMemoryLeakFailure::DummyMemoryLeakFailure() + : MemoryLeakFailure() +{ + memoryLeakFailureWasDelete = false; +} + +DummyMemoryLeakFailure::~DummyMemoryLeakFailure() _destructor_override +{ + memoryLeakFailureWasDelete = true; +} + +bool DummyMemoryLeakFailure::wasDeleted() +{ + return memoryLeakFailureWasDelete; +} + +void DummyMemoryLeakFailure::fail(char*) _override +{ +} + +bool DummyMemoryLeakFailure::memoryLeakFailureWasDelete = false; + + + diff --git a/tests/CppUTest/DummyMemoryLeakDetector.h b/tests/CppUTest/DummyMemoryLeakDetector.h new file mode 100644 index 000000000..a6c1932c9 --- /dev/null +++ b/tests/CppUTest/DummyMemoryLeakDetector.h @@ -0,0 +1,51 @@ +/* + * 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 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 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. + */ + +class DummyMemoryLeakDetector : public MemoryLeakDetector +{ +public: + DummyMemoryLeakDetector(MemoryLeakFailure* reporter); + virtual ~DummyMemoryLeakDetector() _destructor_override; + static bool wasDeleted(); + +private: + static bool memoryLeakDetectorWasDeleted; +}; + +class DummyMemoryLeakFailure : public MemoryLeakFailure +{ +public: + DummyMemoryLeakFailure(); + + virtual ~DummyMemoryLeakFailure() _destructor_override; + static bool wasDeleted(); + virtual void fail(char*) _override; + +private: + static bool memoryLeakFailureWasDelete; +}; + diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index fa269e127..80ba75733 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -34,28 +34,11 @@ #include "CppUTest/TestTestingFixture.h" #include "CppUTest/TestHarness_c.h" #include "CppUTest/SimpleMutex.h" - -static char* leak1; -static long* leak2; - -class DummyReporter: public MemoryLeakFailure -{ -public: - virtual ~DummyReporter() _destructor_override - { - } - virtual void fail(char* /*fail_string*/) _override - { - } -}; - -static MemoryLeakDetector* detector; -static MemoryLeakWarningPlugin* memPlugin; -static DummyReporter dummy; -static TestMemoryAllocator* allocator; +#include "DummyMemoryLeakDetector.h" TEST_GROUP(MemoryLeakWarningLocalDetectorTest) { + DummyMemoryLeakFailure dummy; }; TEST(MemoryLeakWarningLocalDetectorTest, localDetectorReturnsNewGlobalWhenNoneWasSet) @@ -79,9 +62,16 @@ TEST(MemoryLeakWarningLocalDetectorTest, localDetectorIsGlobalDetector) POINTERS_EQUAL(globalDetector, localDetector); } +static char* leak1; +static long* leak2; + +static MemoryLeakDetector* detector; +static MemoryLeakWarningPlugin* memPlugin; +static TestMemoryAllocator* allocator; TEST_GROUP(MemoryLeakWarningTest) { + DummyMemoryLeakFailure dummy; TestTestingFixture* fixture; void setup() @@ -96,6 +86,7 @@ TEST_GROUP(MemoryLeakWarningTest) leak1 = NULLPTR; leak2 = NULLPTR; } + void teardown() { detector->deallocMemory(allocator, leak1); @@ -149,31 +140,6 @@ TEST(MemoryLeakWarningTest, FailingTestDoesNotReportMemoryLeaks) LONGS_EQUAL(1, fixture->getFailureCount()); } -static bool memoryLeakDetectorWasDeleted = false; -static bool memoryLeakFailureWasDelete = false; - -class DummyMemoryLeakDetector : public MemoryLeakDetector -{ -public: - DummyMemoryLeakDetector(MemoryLeakFailure* reporter) : MemoryLeakDetector(reporter) {} - virtual ~DummyMemoryLeakDetector() _destructor_override - { - memoryLeakDetectorWasDeleted = true; - } -}; - -class DummyMemoryLeakFailure : public MemoryLeakFailure -{ - virtual ~DummyMemoryLeakFailure() _destructor_override - { - memoryLeakFailureWasDelete = true; - } - virtual void fail(char*) _override - { - } -}; - - static bool cpputestHasCrashed; TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) @@ -194,9 +160,6 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) detector = MemoryLeakWarningPlugin::getGlobalDetector(); failureReporter = MemoryLeakWarningPlugin::getGlobalFailureReporter(); - memoryLeakDetectorWasDeleted = false; - memoryLeakFailureWasDelete = false; - MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); dummyReporter = new DummyMemoryLeakFailure; @@ -209,8 +172,8 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) void teardown() { MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); - if (!memoryLeakDetectorWasDeleted) delete dummyDetector; - if (!memoryLeakFailureWasDelete) delete dummyReporter; + if (!DummyMemoryLeakDetector::wasDeleted()) delete dummyDetector; + if (!DummyMemoryLeakFailure::wasDeleted()) delete dummyReporter; MemoryLeakWarningPlugin::setGlobalDetector(detector, failureReporter); MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); @@ -246,8 +209,8 @@ TEST(MemoryLeakWarningGlobalDetectorTest, destroyGlobalDetector) MemoryLeakWarningPlugin::destroyGlobalDetector(); - CHECK(memoryLeakDetectorWasDeleted); - CHECK(memoryLeakFailureWasDelete); + CHECK(DummyMemoryLeakDetector::wasDeleted()); + CHECK(DummyMemoryLeakFailure::wasDeleted()); } TEST(MemoryLeakWarningGlobalDetectorTest, MemoryWarningPluginCanBeSetToDestroyTheGlobalDetector) @@ -258,7 +221,7 @@ TEST(MemoryLeakWarningGlobalDetectorTest, MemoryWarningPluginCanBeSetToDestroyTh delete plugin; - CHECK(memoryLeakDetectorWasDeleted); + CHECK(DummyMemoryLeakDetector::wasDeleted()); } #ifndef CPPUTEST_MEM_LEAK_DETECTION_DISABLED @@ -372,8 +335,6 @@ static void StubMutexUnlock(PlatformSpecificMutex) mutexUnlockCount++; } - - TEST_GROUP(MemoryLeakWarningThreadSafe) { void setup() From 38403334f57e9590632968a1ef9fba337d1c8c20 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 14 Apr 2020 10:49:40 +0800 Subject: [PATCH 0272/1093] Added file to the CMakefile --- tests/CppUTest/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 7df07c1dd..bb4c26dd8 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -13,6 +13,7 @@ set(CppUTestTests_src TestHarness_cTest.cpp JUnitOutputTest.cpp TestHarness_cTestCFile.c + DummyMemoryLeakDetector.cpp MemoryLeakDetectorTest.cpp TestInstallerTest.cpp AllocLetTestFree.c From 81222ce8e3b9aa4c6bd86d42ac4fe25148074104 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 14 Apr 2020 10:55:28 +0800 Subject: [PATCH 0273/1093] Removed the override attributes from the cpp file --- tests/CppUTest/DummyMemoryLeakDetector.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/CppUTest/DummyMemoryLeakDetector.cpp b/tests/CppUTest/DummyMemoryLeakDetector.cpp index 1ed683149..1be2c872b 100644 --- a/tests/CppUTest/DummyMemoryLeakDetector.cpp +++ b/tests/CppUTest/DummyMemoryLeakDetector.cpp @@ -34,7 +34,7 @@ DummyMemoryLeakDetector::DummyMemoryLeakDetector(MemoryLeakFailure* reporter) : memoryLeakDetectorWasDeleted = false; } -DummyMemoryLeakDetector::~DummyMemoryLeakDetector() _destructor_override +DummyMemoryLeakDetector::~DummyMemoryLeakDetector() { memoryLeakDetectorWasDeleted = true; } @@ -52,7 +52,7 @@ DummyMemoryLeakFailure::DummyMemoryLeakFailure() memoryLeakFailureWasDelete = false; } -DummyMemoryLeakFailure::~DummyMemoryLeakFailure() _destructor_override +DummyMemoryLeakFailure::~DummyMemoryLeakFailure() { memoryLeakFailureWasDelete = true; } @@ -62,7 +62,7 @@ bool DummyMemoryLeakFailure::wasDeleted() return memoryLeakFailureWasDelete; } -void DummyMemoryLeakFailure::fail(char*) _override +void DummyMemoryLeakFailure::fail(char*) { } From 083ee167f3783b4893f9917a951b6dd38d5822ef Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 14 Apr 2020 10:58:59 +0800 Subject: [PATCH 0274/1093] Added file to VC project file --- tests/AllTests.vcproj | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/AllTests.vcproj b/tests/AllTests.vcproj index 71c97f89f..6193a77c2 100644 --- a/tests/AllTests.vcproj +++ b/tests/AllTests.vcproj @@ -546,6 +546,29 @@ /> + + + + + + + + From 3d18cfb0d190275d0c716b0775cc925a7d9fe982 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 14 Apr 2020 11:24:31 +0800 Subject: [PATCH 0275/1093] Added missing file to the dos build --- platforms/Dos/sources.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/platforms/Dos/sources.mk b/platforms/Dos/sources.mk index 4a2ff3477..46a3cd6fe 100644 --- a/platforms/Dos/sources.mk +++ b/platforms/Dos/sources.mk @@ -44,6 +44,7 @@ CPPU1_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/CommandLineArgumentsTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/CommandLineTestRunnerTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/JUnitOutputTest.o \ + $(CPPUTEST_HOME)/tests/CppUTest/DummyMemoryLeakDetector.o \ $(CPPUTEST_HOME)/tests/CppUTest/MemoryLeakWarningTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/PluginTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/PreprocessorTest.o \ From 87bc33444ee56ed04964565e4b415b1286ff2e4c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 14 Apr 2020 12:10:30 +0800 Subject: [PATCH 0276/1093] Added another file to the VC project file --- tests/AllTests.vcxproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/AllTests.vcxproj b/tests/AllTests.vcxproj index 294621255..193be1dcb 100644 --- a/tests/AllTests.vcxproj +++ b/tests/AllTests.vcxproj @@ -281,6 +281,7 @@ + @@ -317,4 +318,4 @@ - \ No newline at end of file + From 71ef3f53fb0c3be1b75cdd7373681b521117e2ca Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 14 Apr 2020 18:17:04 +0800 Subject: [PATCH 0277/1093] Removed the rand and srand out of shuffle and cleaned up the feature --- include/CppUTest/CommandLineArguments.h | 34 +++---- .../CppUTest/PlatformSpecificFunctions_c.h | 4 + include/CppUTest/Shuffle.h | 27 +----- include/CppUTest/TestOutput.h | 2 - include/CppUTest/TestRegistry.h | 4 +- src/CppUTest/CommandLineArguments.cpp | 88 ++++++++++--------- src/CppUTest/CommandLineTestRunner.cpp | 31 ++----- src/CppUTest/TestOutput.cpp | 12 +-- src/CppUTest/TestRegistry.cpp | 48 ++++++---- src/Platforms/Gcc/UtestPlatform.cpp | 2 + tests/CppUTest/CommandLineArgumentsTest.cpp | 56 ++++++------ tests/CppUTest/CommandLineTestRunnerTest.cpp | 1 - tests/CppUTest/ShuffleTest.cpp | 80 ++++++++++------- tests/CppUTest/TestRegistryTest.cpp | 17 ++-- 14 files changed, 199 insertions(+), 207 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index e72bdf6dd..7e11142ca 100644 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -47,7 +47,8 @@ class CommandLineArguments bool isListingTestGroupAndCaseNames() const; bool isRunIgnored() const; int getRepeatCount() const; - unsigned int getShuffle() const; + bool isShuffling() const; + unsigned int getShuffleSeed() const; const TestFilter* getGroupFilters() const; const TestFilter* getNameFilters() const; bool isJUnitOutput() const; @@ -63,6 +64,7 @@ class CommandLineArguments { OUTPUT_ECLIPSE, OUTPUT_JUNIT, OUTPUT_TEAMCITY }; + int ac_; const char *const *av_; @@ -72,27 +74,29 @@ class CommandLineArguments bool listTestGroupNames_; bool listTestGroupAndCaseNames_; bool runIgnored_; + bool shuffling_; + bool shufflingPreSeeded_; int repeat_; - unsigned int shuffle_; + unsigned int shuffleSeed_; TestFilter* groupFilters_; TestFilter* nameFilters_; OutputType outputType_; SimpleString packageName_; SimpleString getParameterField(int ac, const char *const *av, int& i, const SimpleString& parameterName); - void SetRepeatCount(int ac, const char *const *av, int& index); - bool SetShuffle(int ac, const char *const *av, int& index); - void AddGroupFilter(int ac, const char *const *av, int& index); - void AddStrictGroupFilter(int ac, const char *const *av, int& index); - void AddExcludeGroupFilter(int ac, const char *const *av, int& index); - void AddExcludeStrictGroupFilter(int ac, const char *const *av, int& index); - void AddNameFilter(int ac, const char *const *av, int& index); - void AddStrictNameFilter(int ac, const char *const *av, int& index); - void AddExcludeNameFilter(int ac, const char *const *av, int& index); - void AddExcludeStrictNameFilter(int ac, const char *const *av, int& index); - void AddTestToRunBasedOnVerboseOutput(int ac, const char *const *av, int& index, const char* parameterName); - bool SetOutputType(int ac, const char *const *av, int& index); - void SetPackageName(int ac, const char *const *av, int& index); + void setRepeatCount(int ac, const char *const *av, int& index); + bool setShuffle(int ac, const char *const *av, int& index); + void addGroupFilter(int ac, const char *const *av, int& index); + void addStrictGroupFilter(int ac, const char *const *av, int& index); + void addExcludeGroupFilter(int ac, const char *const *av, int& index); + void addExcludeStrictGroupFilter(int ac, const char *const *av, int& index); + void addNameFilter(int ac, const char *const *av, int& index); + void addStrictNameFilter(int ac, const char *const *av, int& index); + void addExcludeNameFilter(int ac, const char *const *av, int& index); + void addExcludeStrictNameFilter(int ac, const char *const *av, int& index); + void addTestToRunBasedOnVerboseOutput(int ac, const char *const *av, int& index, const char* parameterName); + bool setOutputType(int ac, const char *const *av, int& index); + void setPackageName(int ac, const char *const *av, int& index); CommandLineArguments(const CommandLineArguments&); CommandLineArguments& operator=(const CommandLineArguments&); diff --git a/include/CppUTest/PlatformSpecificFunctions_c.h b/include/CppUTest/PlatformSpecificFunctions_c.h index fedb34fad..b39d88fd3 100644 --- a/include/CppUTest/PlatformSpecificFunctions_c.h +++ b/include/CppUTest/PlatformSpecificFunctions_c.h @@ -69,6 +69,10 @@ extern void (*PlatformSpecificFClose)(PlatformSpecificFile file); extern int (*PlatformSpecificPutchar)(int c); extern void (*PlatformSpecificFlush)(void); +/* Random operations */ +extern void (*PlatformSpecificSrand)(unsigned int); +extern int (*PlatformSpecificRand)(void); + /* Dynamic Memory operations */ extern void* (*PlatformSpecificMalloc)(size_t size); extern void* (*PlatformSpecificRealloc)(void* memory, size_t size); diff --git a/include/CppUTest/Shuffle.h b/include/CppUTest/Shuffle.h index 3fd6c10cc..93eb7474a 100644 --- a/include/CppUTest/Shuffle.h +++ b/include/CppUTest/Shuffle.h @@ -28,34 +28,9 @@ #ifndef D_Shuffle_h #define D_Shuffle_h -#include "StandardCLibrary.h" +#include "PlatformSpecificFunctions.h" -#define SHUFFLE_DISABLED 0 -#define SHUFFLE_ENABLED_RANDOM_SEED 1 -#define SHUFFLE_SEED_MINIMUM_VALUE 2 -typedef int (*rand_func_t)(void); - -// wrapper needed for translating calling convention on Watcom/DOS -static inline int rand_(void) // rand_func_t -{ - return rand(); -} - -// "Durstenfeld shuffle" according to Wikipedia -static inline void shuffle_list(rand_func_t rand_func, size_t numElems, void* listToShuffleInPlace[]) -{ - if( numElems == 0 ) return; - - for (size_t i = numElems - 1; i >= 1; --i) - { - const size_t j = ((size_t)rand_func()) % (i + 1); // distribution biased by modulo, but good enough for shuffling - void* e1 = listToShuffleInPlace[j]; - void* e2 = listToShuffleInPlace[i]; - listToShuffleInPlace[i] = e1; - listToShuffleInPlace[j] = e2; - } -} #endif diff --git a/include/CppUTest/TestOutput.h b/include/CppUTest/TestOutput.h index 3968ea4fc..be0285175 100644 --- a/include/CppUTest/TestOutput.h +++ b/include/CppUTest/TestOutput.h @@ -58,7 +58,6 @@ class TestOutput virtual void verbose(); virtual void color(); - virtual void setShuffleSeed(unsigned int); virtual void printBuffer(const char*)=0; virtual void print(const char*); virtual void print(long); @@ -92,7 +91,6 @@ class TestOutput int dotCount_; bool verbose_; bool color_; - unsigned int shuffleSeed_; const char* progressIndication_; static WorkingEnvironment workingEnvironment_; diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index 5a6109c63..3ea387821 100644 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -52,7 +52,7 @@ class TestRegistry virtual void unDoLastAddTest(); virtual size_t countTests(); virtual void runAllTests(TestResult& result); - virtual void shuffleRunOrder(rand_func_t); + virtual void shuffleRunOrder(); virtual void listTestGroupNames(TestResult& result); virtual void listTestGroupAndCaseNames(TestResult& result); virtual void setNameFilters(const TestFilter* filters); @@ -76,6 +76,8 @@ class TestRegistry virtual void setRunTestsInSeperateProcess(); int getCurrentRepetition(); void setRunIgnored(); + + static void shuffleList(size_t numElems, void* listToShuffleInPlace[]); private: bool testShouldRun(UtestShell* test, TestResult& result); diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 0358bc53d..b7ed27b7c 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -31,7 +31,7 @@ #include "CppUTest/PlatformSpecificFunctions.h" CommandLineArguments::CommandLineArguments(int ac, const char *const *av) : - ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), repeat_(1), shuffle_(SHUFFLE_DISABLED), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) + ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) { } @@ -61,25 +61,24 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument == "-lg") listTestGroupNames_ = true; else if (argument == "-ln") listTestGroupAndCaseNames_ = true; else if (argument == "-ri") runIgnored_ = true; - else if (argument.startsWith("-r")) SetRepeatCount(ac_, av_, i); - else if (argument.startsWith("-g")) AddGroupFilter(ac_, av_, i); - else if (argument.startsWith("-sg")) AddStrictGroupFilter(ac_, av_, i); - else if (argument.startsWith("-xg")) AddExcludeGroupFilter(ac_, av_, i); - else if (argument.startsWith("-xsg")) AddExcludeStrictGroupFilter(ac_, av_, i); - else if (argument.startsWith("-n")) AddNameFilter(ac_, av_, i); - else if (argument.startsWith("-sn")) AddStrictNameFilter(ac_, av_, i); - else if (argument.startsWith("-xn")) AddExcludeNameFilter(ac_, av_, i); - else if (argument.startsWith("-xsn")) AddExcludeStrictNameFilter(ac_, av_, i); - else if (argument.startsWith("-s")) correctParameters = SetShuffle(ac_, av_, i); - else if (argument.startsWith("TEST(")) AddTestToRunBasedOnVerboseOutput(ac_, av_, i, "TEST("); - else if (argument.startsWith("IGNORE_TEST(")) AddTestToRunBasedOnVerboseOutput(ac_, av_, i, "IGNORE_TEST("); - else if (argument.startsWith("-o")) correctParameters = SetOutputType(ac_, av_, i); + else if (argument.startsWith("-r")) setRepeatCount(ac_, av_, i); + else if (argument.startsWith("-g")) addGroupFilter(ac_, av_, i); + else if (argument.startsWith("-sg")) addStrictGroupFilter(ac_, av_, i); + else if (argument.startsWith("-xg")) addExcludeGroupFilter(ac_, av_, i); + else if (argument.startsWith("-xsg")) addExcludeStrictGroupFilter(ac_, av_, i); + else if (argument.startsWith("-n")) addNameFilter(ac_, av_, i); + else if (argument.startsWith("-sn")) addStrictNameFilter(ac_, av_, i); + else if (argument.startsWith("-xn")) addExcludeNameFilter(ac_, av_, i); + else if (argument.startsWith("-xsn")) addExcludeStrictNameFilter(ac_, av_, i); + else if (argument.startsWith("-s")) correctParameters = setShuffle(ac_, av_, i); + else if (argument.startsWith("TEST(")) addTestToRunBasedOnVerboseOutput(ac_, av_, i, "TEST("); + else if (argument.startsWith("IGNORE_TEST(")) addTestToRunBasedOnVerboseOutput(ac_, av_, i, "IGNORE_TEST("); + else if (argument.startsWith("-o")) correctParameters = setOutputType(ac_, av_, i); else if (argument.startsWith("-p")) correctParameters = plugin->parseAllArguments(ac_, av_, i); - else if (argument.startsWith("-k")) SetPackageName(ac_, av_, i); + else if (argument.startsWith("-k")) setPackageName(ac_, av_, i); else correctParameters = false; if (correctParameters == false) { - shuffle_ = SHUFFLE_DISABLED; return false; } } @@ -127,9 +126,14 @@ int CommandLineArguments::getRepeatCount() const return repeat_; } -unsigned int CommandLineArguments::getShuffle() const +bool CommandLineArguments::isShuffling() const { - return shuffle_; + return shuffling_; +} + +unsigned int CommandLineArguments::getShuffleSeed() const +{ + return shuffleSeed_; } const TestFilter* CommandLineArguments::getGroupFilters() const @@ -142,7 +146,7 @@ const TestFilter* CommandLineArguments::getNameFilters() const return nameFilters_; } -void CommandLineArguments::SetRepeatCount(int ac, const char *const *av, int& i) +void CommandLineArguments::setRepeatCount(int ac, const char *const *av, int& i) { repeat_ = 0; @@ -157,24 +161,26 @@ void CommandLineArguments::SetRepeatCount(int ac, const char *const *av, int& i) } -bool CommandLineArguments::SetShuffle(int ac, const char * const *av, int& i) +bool CommandLineArguments::setShuffle(int ac, const char * const *av, int& i) { - shuffle_ = SHUFFLE_ENABLED_RANDOM_SEED; - SimpleString shuffleParameter(av[i]); + shuffling_ = true; + shuffleSeed_ = (unsigned int)GetPlatformSpecificTimeInMillis(); + if (shuffleSeed_ == 0) shuffleSeed_++; + + SimpleString shuffleParameter = av[i]; if (shuffleParameter.size() > 2) { - shuffle_ = SimpleString::AtoU(av[i] + 2); - if (shuffle_ == SHUFFLE_DISABLED) { - return false; - } + shufflingPreSeeded_ = true; + shuffleSeed_ = SimpleString::AtoU(av[i] + 2); } else if (i + 1 < ac) { - const unsigned parsed = SimpleString::AtoU(av[i + 1]); - if (parsed != 0) + unsigned int parsedParameter = SimpleString::AtoU(av[i + 1]); + if (parsedParameter != 0) { - shuffle_ = parsed; + shufflingPreSeeded_ = true; + shuffleSeed_ = parsedParameter; i++; } } - return true; + return (shuffleSeed_ != 0); } SimpleString CommandLineArguments::getParameterField(int ac, const char * const *av, int& i, const SimpleString& parameterName) @@ -186,27 +192,27 @@ SimpleString CommandLineArguments::getParameterField(int ac, const char * const return ""; } -void CommandLineArguments::AddGroupFilter(int ac, const char *const *av, int& i) +void CommandLineArguments::addGroupFilter(int ac, const char *const *av, int& i) { TestFilter* groupFilter = new TestFilter(getParameterField(ac, av, i, "-g")); groupFilters_ = groupFilter->add(groupFilters_); } -void CommandLineArguments::AddStrictGroupFilter(int ac, const char *const *av, int& i) +void CommandLineArguments::addStrictGroupFilter(int ac, const char *const *av, int& i) { TestFilter* groupFilter = new TestFilter(getParameterField(ac, av, i, "-sg")); groupFilter->strictMatching(); groupFilters_ = groupFilter->add(groupFilters_); } -void CommandLineArguments::AddExcludeGroupFilter(int ac, const char *const *av, int& i) +void CommandLineArguments::addExcludeGroupFilter(int ac, const char *const *av, int& i) { TestFilter* groupFilter = new TestFilter(getParameterField(ac, av, i, "-xg")); groupFilter->invertMatching(); groupFilters_ = groupFilter->add(groupFilters_); } -void CommandLineArguments::AddExcludeStrictGroupFilter(int ac, const char *const *av, int& i) +void CommandLineArguments::addExcludeStrictGroupFilter(int ac, const char *const *av, int& i) { TestFilter* groupFilter = new TestFilter(getParameterField(ac, av, i, "-xsg")); groupFilter->strictMatching(); @@ -214,27 +220,27 @@ void CommandLineArguments::AddExcludeStrictGroupFilter(int ac, const char *const groupFilters_ = groupFilter->add(groupFilters_); } -void CommandLineArguments::AddNameFilter(int ac, const char *const *av, int& i) +void CommandLineArguments::addNameFilter(int ac, const char *const *av, int& i) { TestFilter* nameFilter = new TestFilter(getParameterField(ac, av, i, "-n")); nameFilters_ = nameFilter->add(nameFilters_); } -void CommandLineArguments::AddStrictNameFilter(int ac, const char *const *av, int& index) +void CommandLineArguments::addStrictNameFilter(int ac, const char *const *av, int& index) { TestFilter* nameFilter = new TestFilter(getParameterField(ac, av, index, "-sn")); nameFilter->strictMatching(); nameFilters_= nameFilter->add(nameFilters_); } -void CommandLineArguments::AddExcludeNameFilter(int ac, const char *const *av, int& index) +void CommandLineArguments::addExcludeNameFilter(int ac, const char *const *av, int& index) { TestFilter* nameFilter = new TestFilter(getParameterField(ac, av, index, "-xn")); nameFilter->invertMatching(); nameFilters_= nameFilter->add(nameFilters_); } -void CommandLineArguments::AddExcludeStrictNameFilter(int ac, const char *const *av, int& index) +void CommandLineArguments::addExcludeStrictNameFilter(int ac, const char *const *av, int& index) { TestFilter* nameFilter = new TestFilter(getParameterField(ac, av, index, "-xsn")); nameFilter->invertMatching(); @@ -242,7 +248,7 @@ void CommandLineArguments::AddExcludeStrictNameFilter(int ac, const char *const nameFilters_= nameFilter->add(nameFilters_); } -void CommandLineArguments::AddTestToRunBasedOnVerboseOutput(int ac, const char *const *av, int& index, const char* parameterName) +void CommandLineArguments::addTestToRunBasedOnVerboseOutput(int ac, const char *const *av, int& index, const char* parameterName) { SimpleString wholename = getParameterField(ac, av, index, parameterName); SimpleString testname = wholename.subStringFromTill(',', ')'); @@ -255,7 +261,7 @@ void CommandLineArguments::AddTestToRunBasedOnVerboseOutput(int ac, const char * nameFilters_ = namefilter->add(nameFilters_); } -void CommandLineArguments::SetPackageName(int ac, const char *const *av, int& i) +void CommandLineArguments::setPackageName(int ac, const char *const *av, int& i) { SimpleString packageName = getParameterField(ac, av, i, "-k"); if (packageName.size() == 0) return; @@ -263,7 +269,7 @@ void CommandLineArguments::SetPackageName(int ac, const char *const *av, int& i) packageName_ = packageName; } -bool CommandLineArguments::SetOutputType(int ac, const char *const *av, int& i) +bool CommandLineArguments::setOutputType(int ac, const char *const *av, int& i) { SimpleString outputType = getParameterField(ac, av, i, "-o"); if (outputType.size() == 0) return false; diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 7cb8ec2b0..192ac6543 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -96,19 +96,6 @@ void CommandLineTestRunner::initializeTestRun() if (arguments_->isRunIgnored()) registry_->setRunIgnored(); } -static unsigned getSeed(unsigned shuffleArg) -{ - if (shuffleArg != SHUFFLE_ENABLED_RANDOM_SEED) return shuffleArg; - - const unsigned generatedSeed = static_cast(GetPlatformSpecificTimeInMillis()); - - // do not allow seed values 0 or 1 because they cannot be given as cmd line arguments - // (0 and 1 overloaded by SHUFFLE_DISABLED and SHUFFLE_ENABLED_RANDOM_SEED) - if (generatedSeed < SHUFFLE_SEED_MINIMUM_VALUE) return SHUFFLE_SEED_MINIMUM_VALUE; - - return generatedSeed; -} - int CommandLineTestRunner::runAllTests() { initializeTestRun(); @@ -130,21 +117,19 @@ int CommandLineTestRunner::runAllTests() registry_->listTestGroupAndCaseNames(tr); return 0; } - const bool shuffleEnabled = arguments_->getShuffle() != SHUFFLE_DISABLED; - if (shuffleEnabled) + + if (arguments_->isShuffling()) { - const unsigned seed = getSeed(arguments_->getShuffle()); - output_->setShuffleSeed(seed); output_->print("Test order shuffling enabled with seed: "); - output_->print(seed); + output_->print(arguments_->getShuffleSeed()); output_->print("\n"); - srand(seed); + PlatformSpecificSrand(arguments_->getShuffleSeed()); } while (loopCount++ < repeatCount) { - if (shuffleEnabled) - { - registry_->shuffleRunOrder(rand_); - } + + if (arguments_->isShuffling()) + registry_->shuffleRunOrder(); + output_->printTestRun(loopCount, repeatCount); TestResult tr(*output_); registry_->runAllTests(tr); diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index 444e4c394..b74c0fce5 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -45,7 +45,7 @@ TestOutput::WorkingEnvironment TestOutput::getWorkingEnvironment() TestOutput::TestOutput() : - dotCount_(0), verbose_(false), color_(false), shuffleSeed_(SHUFFLE_DISABLED), progressIndication_(".") + dotCount_(0), verbose_(false), color_(false), progressIndication_(".") { } @@ -63,11 +63,6 @@ void TestOutput::color() color_ = true; } -void TestOutput::setShuffleSeed(unsigned int shuffleSeed) -{ - shuffleSeed_ = shuffleSeed; -} - void TestOutput::print(const char* str) { printBuffer(str); @@ -176,11 +171,6 @@ void TestOutput::printTestsEnded(const TestResult& result) print(" ignored, "); print(result.getFilteredOutCount()); print(" filtered out, "); - if (shuffleSeed_ != SHUFFLE_DISABLED && (verbose_ || isFailure)) { - print("shuffle seed was: "); - print(shuffleSeed_); - print(", "); - } print(result.getTotalExecutionTime()); print(" ms)"); if (color_) { diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 4b1a020bf..38bd22821 100644 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -227,32 +227,46 @@ UtestShell* TestRegistry::getFirstTest() return tests_; } +// "Durstenfeld shuffle" according to Wikipedia +void TestRegistry::shuffleList(size_t numElems, void* listToShuffleInPlace[]) +{ + if( numElems == 0 ) return; + + for (size_t i = numElems - 1; i >= 1; --i) + { + const size_t j = ((size_t)PlatformSpecificRand()) % (i + 1); // distribution biased by modulo, but good enough for shuffling + void* e1 = listToShuffleInPlace[j]; + void* e2 = listToShuffleInPlace[i]; + listToShuffleInPlace[i] = e1; + listToShuffleInPlace[j] = e2; + } +} -void TestRegistry::shuffleRunOrder(rand_func_t rand_func) +void TestRegistry::shuffleRunOrder() { if (getFirstTest() == NULLPTR) - { return; - } - const size_t numTests = getFirstTest()->countTests(); - typedef UtestShell* listElem; - listElem* tests = new listElem[numTests]; - UtestShell *test = getFirstTest(); - for (size_t testsIdx = 0; testsIdx < numTests; ++testsIdx) + + const size_t testCount = getFirstTest()->countTests(); + + UtestShell** arrayOfTests = new UtestShell*[testCount]; + + UtestShell* currentTest = getFirstTest(); + for (size_t i = 0; i < testCount; i++) { - tests[testsIdx] = test; - test = test->getNext(); + arrayOfTests[i] = currentTest; + currentTest = currentTest->getNext(); } - shuffle_list(rand_func, numTests, reinterpret_cast(tests)); - // Store shuffled list back to linked list - UtestShell *prev = NULLPTR; - for (size_t i = 0; i < numTests; ++i) + shuffleList(testCount, (void**)arrayOfTests); + + tests_ = NULLPTR; + for (size_t i = 0; i < testCount; i++) { - prev = tests[numTests - 1 - i]->addTest(prev); + tests_ = arrayOfTests[testCount - 1 - i]->addTest(tests_); } - tests_ = prev; - delete[] tests; + + delete[] arrayOfTests; } UtestShell* TestRegistry::getTestWithNext(UtestShell* test) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 6c9874629..322e98e2d 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -262,6 +262,8 @@ static int IsInfImplementation(double d) } double (*PlatformSpecificFabs)(double) = fabs; +void (*PlatformSpecificSrand)(unsigned int) = srand; +int (*PlatformSpecificRand)(void) = rand; int (*PlatformSpecificIsNan)(double) = IsNanImplementation; int (*PlatformSpecificIsInf)(double) = IsInfImplementation; int (*PlatformSpecificAtExit)(void(*func)(void)) = atexit; /// this was undefined before diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index a5db0a1e3..fc192010d 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -66,17 +66,6 @@ TEST_GROUP(CommandLineArguments) args = new CommandLineArguments(argc, argv); return args->parse(plugin); } - - void shuffleTest(int argc, const char* argv[], unsigned int expectedShuffle) - { - CHECK(newArgumentParser(argc, argv)); - CHECK_EQUAL(expectedShuffle, args->getShuffle()); - } - void shuffleInvalidParamTest(int argc, const char* argv[]) - { - CHECK_FALSE(newArgumentParser(argc, argv)); - CHECK_EQUAL(SHUFFLE_DISABLED, args->getShuffle()); - } }; TEST(CommandLineArguments, Create) @@ -119,49 +108,54 @@ TEST(CommandLineArguments, repeatSetDefaultsToTwoAndShuffleDisabled) const char* argv[] = { "tests.exe", "-r" }; CHECK(newArgumentParser(argc, argv)); LONGS_EQUAL(2, args->getRepeatCount()); - CHECK_EQUAL(args->getShuffle(), SHUFFLE_DISABLED); } -TEST(CommandLineArguments, shuffleEnabled) +TEST(CommandLineArguments, shuffleDisabledByDefault) { - const char* argv[] = { "tests.exe", "-s" }; - shuffleTest(2, argv, SHUFFLE_ENABLED_RANDOM_SEED); -} - -TEST(CommandLineArguments, shuffleInvalidParamCase1) -{ - const char* argv[] = { "tests.exe", "-s0" }; - shuffleInvalidParamTest(2, argv); + int argc = 1; + const char* argv[] = { "tests.exe" }; + CHECK(newArgumentParser(argc, argv)); + CHECK_FALSE(args->isShuffling()); } -TEST(CommandLineArguments, shuffleInvalidParamCase2) +TEST(CommandLineArguments, shuffleEnabled) { - const char* argv[] = { "tests.exe", "-s 0" }; - shuffleInvalidParamTest(2, argv); + int argc = 2; + const char* argv[] = { "tests.exe", "-s" }; + CHECK(newArgumentParser(argc, argv)); + CHECK_TRUE(args->isShuffling()); } -TEST(CommandLineArguments, shuffleInvalidParamCase3) +TEST(CommandLineArguments, shuffleWithSeedZeroIsOk) { - const char* argv[] = { "tests.exe", "-s", "0" }; - shuffleInvalidParamTest(3, argv); + int argc = 2; + const char* argv[] = { "tests.exe", "-s0" }; + CHECK_FALSE(newArgumentParser(argc, argv)); + CHECK_EQUAL(0, args->getShuffleSeed()); } TEST(CommandLineArguments, shuffleEnabledSpecificSeedCase1) { + int argc = 2; const char* argv[] = { "tests.exe", "-s999"}; - shuffleTest(2, argv, 999); + CHECK(newArgumentParser(argc, argv)); + CHECK_EQUAL(999, args->getShuffleSeed()); } TEST(CommandLineArguments, shuffleEnabledSpecificSeedCase2) { + int argc = 2; const char* argv[] = { "tests.exe", "-s 888"}; - shuffleTest(2, argv, 888); + CHECK(newArgumentParser(argc, argv)); + CHECK_EQUAL(888, args->getShuffleSeed()); } TEST(CommandLineArguments, shuffleEnabledSpecificSeedCase3) { + int argc = 3; const char* argv[] = { "tests.exe", "-s", "777"}; - shuffleTest(3, argv, 777); + CHECK(newArgumentParser(argc, argv)); + CHECK_EQUAL(777, args->getShuffleSeed()); } TEST(CommandLineArguments, shuffleBeforeDoesNotDisturbOtherSwitch) @@ -172,7 +166,7 @@ TEST(CommandLineArguments, shuffleBeforeDoesNotDisturbOtherSwitch) TestFilter groupFilter("group"); groupFilter.strictMatching(); CHECK_EQUAL(groupFilter, *args->getGroupFilters()); - CHECK_EQUAL(args->getShuffle(), SHUFFLE_ENABLED_RANDOM_SEED); + CHECK_TRUE(args->isShuffling()); } TEST(CommandLineArguments, runningTestsInSeperateProcesses) diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index 3e244e93f..b4ef60f5c 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -234,7 +234,6 @@ TEST(CommandLineTestRunner, specificShuffleSeedIsPrintedVerbose) const char* argv[] = { "tests.exe", "-s2", "-v"}; SimpleString text = runAndGetOutput(3, argv); STRCMP_CONTAINS("shuffling enabled with seed: 2", text.asCharString()); - STRCMP_CONTAINS("shuffle seed was: 2", text.asCharString()); } extern "C" { diff --git a/tests/CppUTest/ShuffleTest.cpp b/tests/CppUTest/ShuffleTest.cpp index a51bfac83..c2d03e809 100644 --- a/tests/CppUTest/ShuffleTest.cpp +++ b/tests/CppUTest/ShuffleTest.cpp @@ -28,12 +28,30 @@ #include "CppUTest/Shuffle.h" #include "CppUTest/TestHarness.h" #include "CppUTest/TestOutput.h" +#include "CppUTest/TestRegistry.h" + +static const int maxNumItems = 3; TEST_GROUP(ShuffleTest) { -}; + int x0; + int x1; + int x2; -static const int maxNumItems = 3; + void* elements[maxNumItems]; + + void setup() + { + x0 = 0; + x1 = 1; + x2 = 2; + + elements[0] = &x0; + elements[1] = &x1; + elements[2] = &x2; + } + +}; static int getZero() { @@ -50,34 +68,34 @@ static int getValueExceedingMaxIdx() return maxNumItems + 1; } -TEST(ShuffleTest, ShuffleListTest) +TEST(ShuffleTest, ShuffleListTestWithNoElementsInList) +{ + UT_PTR_SET(PlatformSpecificRand, getValueExceedingMaxIdx); + TestRegistry::shuffleList(0, elements); + + CHECK(elements[0] == &x0); + CHECK(elements[1] == &x1); + CHECK(elements[2] == &x2); +} + +TEST(ShuffleTest, ShuffleListTestWithRandomAlwaysReturningZero) { - int x0 = 0; - int x1 = 1; - int x2 = 2; - void* tests[maxNumItems] = {&x0, &x1, &x2}; - - // check no-op - shuffle_list(getValueExceedingMaxIdx, 0, tests); - CHECK(tests[0] == &x0); - CHECK(tests[1] == &x1); - CHECK(tests[2] == &x2); - - // swap element with itself: 0, [1], 2 --> 0, 1, 2 - shuffle_list(getOne, 1, tests); - CHECK(tests[0] == &x0); - CHECK(tests[1] == &x1); - CHECK(tests[2] == &x2); - - // always swaps with element at index 0: [0], 1, [2] --> [2], [1], 0 --> 1, 2, 0 - shuffle_list(getZero, maxNumItems, tests); - CHECK(tests[0] == &x1); - CHECK(tests[1] == &x2); - CHECK(tests[2] == &x0); - - // swaps with 4 mod 3 (1) then 4 mod 2 (0): 1, [2], [0] --> [1], [0], 2 --> 0, 1, 2 - shuffle_list(getValueExceedingMaxIdx, maxNumItems, tests); - CHECK(tests[0] == &x0); - CHECK(tests[1] == &x1); - CHECK(tests[2] == &x2); + UT_PTR_SET(PlatformSpecificRand, getZero); + TestRegistry::shuffleList(3, elements); + + CHECK(elements[0] == &x1); + CHECK(elements[1] == &x2); + CHECK(elements[2] == &x0); } + +// swaps with 4 mod 3 (1) then 4 mod 2 (0): 1, [2], [0] --> [1], [0], 2 --> 0, 1, 2 +TEST(ShuffleTest, ShuffleListTestWithRandomAlwaysReturningOne) +{ + UT_PTR_SET(PlatformSpecificRand, getOne); + TestRegistry::shuffleList(3, elements); + + CHECK(elements[0] == &x0); + CHECK(elements[1] == &x2); + CHECK(elements[2] == &x1); +} + diff --git a/tests/CppUTest/TestRegistryTest.cpp b/tests/CppUTest/TestRegistryTest.cpp index ca604e814..b9bdba2d9 100644 --- a/tests/CppUTest/TestRegistryTest.cpp +++ b/tests/CppUTest/TestRegistryTest.cpp @@ -360,27 +360,28 @@ TEST(TestRegistry, listTestGroupAndCaseNames_shouldListBackwardsGroupATestaAfter STRCMP_EQUAL("GROUP_A.test_aa GROUP_B.test_b GROUP_A.test_a", s.asCharString()); } -static int getZero() -{ - return 0; -} - TEST(TestRegistry, shuffleEmptyListIsNoOp) { CHECK_TRUE(myRegistry->getFirstTest() == NULLPTR); - myRegistry->shuffleRunOrder(getZero); + myRegistry->shuffleRunOrder(); CHECK_TRUE(myRegistry->getFirstTest() == NULLPTR); } TEST(TestRegistry, shuffleSingleTestIsNoOp) { myRegistry->addTest(test1); - myRegistry->shuffleRunOrder(getZero); + myRegistry->shuffleRunOrder(); CHECK_TRUE(myRegistry->getFirstTest() == test1); } +static int getZero() +{ + return 0; +} + TEST(TestRegistry, shuffleTestList) { + UT_PTR_SET(PlatformSpecificRand, getZero); myRegistry->addTest(test3); myRegistry->addTest(test2); myRegistry->addTest(test1); @@ -395,7 +396,7 @@ TEST(TestRegistry, shuffleTestList) CHECK_TRUE(third_before->getNext() == NULLPTR); // shuffle always with element at index 0: [1] 2 [3] --> [3] [2] 1 --> 2 3 1 - myRegistry->shuffleRunOrder(getZero); + myRegistry->shuffleRunOrder(); UtestShell* first_after = myRegistry->getFirstTest(); UtestShell* second_after = first_after->getNext(); From 6efe88e6c9cd0f69652d4790c110273b1c5e510c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 14 Apr 2020 19:03:03 +0800 Subject: [PATCH 0278/1093] Added rand to VC platform --- src/Platforms/VisualCpp/UtestPlatform.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index 3316f9e26..6e3ab35c4 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -185,6 +185,8 @@ static void VisualCppFree(void* memory) free(memory); } +void (*PlatformSpecificSrand)(unsigned int) = srand; +int (*PlatformSpecificRand)(void) = rand; void* (*PlatformSpecificMalloc)(size_t size) = VisualCppMalloc; void* (*PlatformSpecificRealloc)(void* memory, size_t size) = VisualCppReAlloc; void (*PlatformSpecificFree)(void* memory) = VisualCppFree; From 734471c19817133e301f426b98da784ad991b039 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 14 Apr 2020 19:57:53 +0800 Subject: [PATCH 0279/1093] Removed the Shuffle.h --- Makefile.am | 1 - include/CppUTest/Shuffle.h | 36 --------------------------- include/CppUTest/TestRegistry.h | 1 - src/CppUTest/CMakeLists.txt | 1 - src/CppUTest/CommandLineArguments.cpp | 1 - src/CppUTest/TestOutput.cpp | 1 - src/CppUTest/TestRegistry.cpp | 1 + tests/CppUTest/ShuffleTest.cpp | 2 +- tests/CppUTest/TestRegistryTest.cpp | 1 + 9 files changed, 3 insertions(+), 42 deletions(-) delete mode 100644 include/CppUTest/Shuffle.h diff --git a/Makefile.am b/Makefile.am index b5e1cdd19..b91b57157 100644 --- a/Makefile.am +++ b/Makefile.am @@ -66,7 +66,6 @@ include_cpputest_HEADERS = \ include/CppUTest/MemoryLeakWarningPlugin.h \ include/CppUTest/PlatformSpecificFunctions.h \ include/CppUTest/PlatformSpecificFunctions_c.h \ - include/CppUTest/Shuffle.h \ include/CppUTest/SimpleString.h \ include/CppUTest/SimpleMutex.h \ include/CppUTest/StandardCLibrary.h \ diff --git a/include/CppUTest/Shuffle.h b/include/CppUTest/Shuffle.h deleted file mode 100644 index 93eb7474a..000000000 --- a/include/CppUTest/Shuffle.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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 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 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. - */ - -#ifndef D_Shuffle_h -#define D_Shuffle_h - -#include "PlatformSpecificFunctions.h" - - - - -#endif diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index 3ea387821..b96fd98e6 100644 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -36,7 +36,6 @@ #include "StandardCLibrary.h" #include "SimpleString.h" #include "TestFilter.h" -#include "Shuffle.h" class UtestShell; class TestResult; diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 6b950d5e2..a87862e89 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -60,7 +60,6 @@ set(CppUTest_headers ${CppUTestRootDirectory}/include/CppUTest/MemoryLeakWarningPlugin.h ${CppUTestRootDirectory}/include/CppUTest/TestHarness_c.h ${CppUTestRootDirectory}/include/CppUTest/UtestMacros.h - ${CppUTestRootDirectory}/include/CppUTest/Shuffle.h ${CppUTestRootDirectory}/include/CppUTest/SimpleMutex.h ) diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index b7ed27b7c..1691b8e21 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -25,7 +25,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "CppUTest/Shuffle.h" #include "CppUTest/TestHarness.h" #include "CppUTest/CommandLineArguments.h" #include "CppUTest/PlatformSpecificFunctions.h" diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index b74c0fce5..0162bbf09 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -24,7 +24,6 @@ * (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/Shuffle.h" #include "CppUTest/TestHarness.h" #include "CppUTest/TestOutput.h" #include "CppUTest/PlatformSpecificFunctions.h" diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 38bd22821..2ecdc9f99 100644 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -27,6 +27,7 @@ #include "CppUTest/TestHarness.h" #include "CppUTest/TestRegistry.h" +#include "CppUTest/PlatformSpecificFunctions.h" TestRegistry::TestRegistry() : tests_(NULLPTR), nameFilters_(NULLPTR), groupFilters_(NULLPTR), firstPlugin_(NullTestPlugin::instance()), runInSeperateProcess_(false), currentRepetition_(0), runIgnored_(false) diff --git a/tests/CppUTest/ShuffleTest.cpp b/tests/CppUTest/ShuffleTest.cpp index c2d03e809..62fa2bea4 100644 --- a/tests/CppUTest/ShuffleTest.cpp +++ b/tests/CppUTest/ShuffleTest.cpp @@ -25,10 +25,10 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "CppUTest/Shuffle.h" #include "CppUTest/TestHarness.h" #include "CppUTest/TestOutput.h" #include "CppUTest/TestRegistry.h" +#include "CppUTest/PlatformSpecificFunctions.h" static const int maxNumItems = 3; diff --git a/tests/CppUTest/TestRegistryTest.cpp b/tests/CppUTest/TestRegistryTest.cpp index b9bdba2d9..9c8523734 100644 --- a/tests/CppUTest/TestRegistryTest.cpp +++ b/tests/CppUTest/TestRegistryTest.cpp @@ -28,6 +28,7 @@ #include "CppUTest/TestHarness.h" #include "CppUTest/TestRegistry.h" #include "CppUTest/TestOutput.h" +#include "CppUTest/PlatformSpecificFunctions.h" namespace { From 898070ef6c7503afed8f7ffa58adb22f0729bd81 Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 15 Apr 2020 13:57:59 +0200 Subject: [PATCH 0280/1093] Missing platform rand and srand for DOS added. --- src/Platforms/Dos/UtestPlatform.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Platforms/Dos/UtestPlatform.cpp b/src/Platforms/Dos/UtestPlatform.cpp index 6c196a907..9367214bf 100644 --- a/src/Platforms/Dos/UtestPlatform.cpp +++ b/src/Platforms/Dos/UtestPlatform.cpp @@ -186,6 +186,16 @@ void (*PlatformSpecificFree)(void* memory) = DosFree; void* (*PlatformSpecificMemCpy)(void* s1, const void* s2, size_t size) = DosMemCpy; void* (*PlatformSpecificMemset)(void* mem, int c, size_t size) = DosMemset; +static void DosSrand(unsigned int seed) +{ + srand(seed); +} + +static int DosRand() +{ + return rand(); +} + static double DosFabs(double d) { return fabs(d); @@ -201,6 +211,8 @@ static int DosIsInf(double d) return isinf(d); } +void (*PlatformSpecificSrand)(unsigned int) = DosSrand; +int (*PlatformSpecificRand)(void) = DosRand; double (*PlatformSpecificFabs)(double) = DosFabs; int (*PlatformSpecificIsNan)(double d) = DosIsNan; int (*PlatformSpecificIsInf)(double d) = DosIsInf; From bdec98d5e6170e4888c593e71276e46add633f0a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 16 Apr 2020 11:29:22 +0800 Subject: [PATCH 0281/1093] Added help text. Couldn't remember all options --- include/CppUTest/CommandLineArguments.h | 3 ++ src/CppUTest/CommandLineArguments.cpp | 46 +++++++++++++++++++- src/CppUTest/CommandLineTestRunner.cpp | 2 +- tests/CppUTest/CommandLineArgumentsTest.cpp | 17 +++++++- tests/CppUTest/CommandLineTestRunnerTest.cpp | 12 +++++ 5 files changed, 75 insertions(+), 5 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index 7e11142ca..b88d764d5 100644 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -41,6 +41,7 @@ class CommandLineArguments virtual ~CommandLineArguments(); bool parse(TestPlugin* plugin); + bool needHelp() const; bool isVerbose() const; bool isColor() const; bool isListingTestGroupNames() const; @@ -57,6 +58,7 @@ class CommandLineArguments bool runTestsInSeperateProcess() const; const SimpleString& getPackageName() const; const char* usage() const; + const char* help() const; private: @@ -68,6 +70,7 @@ class CommandLineArguments int ac_; const char *const *av_; + bool needHelp_; bool verbose_; bool color_; bool runTestsAsSeperateProcess_; diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 1691b8e21..fd6bee27c 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -30,7 +30,7 @@ #include "CppUTest/PlatformSpecificFunctions.h" CommandLineArguments::CommandLineArguments(int ac, const char *const *av) : - ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) + ac_(ac), av_(av), needHelp_(false), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) { } @@ -54,6 +54,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) for (int i = 1; i < ac_; i++) { SimpleString argument = av_[i]; + if (argument == "-h") needHelp_ = true; if (argument == "-v") verbose_ = true; else if (argument == "-c") color_ = true; else if (argument == "-p") runTestsAsSeperateProcess_ = true; @@ -86,7 +87,48 @@ bool CommandLineArguments::parse(TestPlugin* plugin) const char* CommandLineArguments::usage() const { - return "usage [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; + return "use -h for more extensive help\nusage [-h] [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; +} + +const char* CommandLineArguments::help() const +{ + return + "Thanks for using CppUTest.\n" + "\n" + "Options that do not run tests but query:\n" + " -h - this wonderful help screen. Joy!\n" + " -lg - print a list of group names, separated by spaces\n" + " -ln - print a list of test names in the form of group.name, separated by spaces\n" + "\n" + "Options that change the output format:\n" + " -c - colorize output, print green if OK, or red if failed\n" + " -v - verbose, print each test name as it runs\n" + "\n" + "Options that change the output location:\n" + " -oteamcity - output to xml files (as the name suggests, for TeamCity)\n" + " -ojunit - output to JUnit ant plugin style xml files (for CI systems)\n" + " -k package name - Add a package name in JUnit output (for classification in CI systems)\n" + "\n" + "\n" + "Options that control which tests are run:\n" + " -g group - only run test whose group contains the substring group\n" + " -n name - only run test whose name contains the substring name\n" + " -sg group - only run test whose group exactly matches the string group\n" + " -sn name - only run test whose name exactly matches the string name\n" + " -xg group - exclude tests whose group contains the substring group (v3.8)\n" + " -xn name - exclude tests whose name contains the substring name (v3.8)\n" + " TEST(group,name) - only run test whose group and name matches the strings group and name.\n" + " This can be used to copy-paste output from the -v option on the command line.\n" + "\n" + "Options that control how the tests are run:\n" + " -p - run tests in a separate process.\n" + " -s [seed] - shuffle tests randomly. Seed is optional\n" + " -r# - repeat the tests some number (#) of times, or twice if # is not specified.\n"; +} + +bool CommandLineArguments::needHelp() const +{ + return needHelp_; } bool CommandLineArguments::isVerbose() const diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 192ac6543..e0ef3fe6a 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -172,7 +172,7 @@ bool CommandLineTestRunner::parseArguments(TestPlugin* plugin) { if (!arguments_->parse(plugin)) { output_ = createConsoleOutput(); - output_->print(arguments_->usage()); + output_->print((arguments_->needHelp()) ? arguments_->help() : arguments_->usage()); return false; } diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index fc192010d..8e27a5c85 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -424,15 +424,28 @@ TEST(CommandLineArguments, setPrintGroupsAndNames) CHECK(args->isListingTestGroupAndCaseNames()); } -TEST(CommandLineArguments, weirdParamatersPrintsUsageAndReturnsFalse) +TEST(CommandLineArguments, weirdParamatersReturnsFalse) { int argc = 2; const char* argv[] = { "tests.exe", "-SomethingWeird" }; CHECK(!newArgumentParser(argc, argv)); - STRCMP_EQUAL("usage [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", +} + +TEST(CommandLineArguments, printUsage) +{ + STRCMP_EQUAL("use -h for more extensive help\nusage [-h] [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", args->usage()); } +TEST(CommandLineArguments, helpPrintsTheHelp) +{ + int argc = 2; + const char* argv[] = { "tests.exe", "-h" }; + CHECK(!newArgumentParser(argc, argv)); + CHECK(args->needHelp()); +} + + TEST(CommandLineArguments, pluginKnowsOption) { int argc = 2; diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index b4ef60f5c..e01559227 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -149,6 +149,18 @@ TEST(CommandLineTestRunner, ReturnsOneWhenTheArgumentsAreInvalid) LONGS_EQUAL(1, returned); } +TEST(CommandLineTestRunner, ReturnsOnePrintsHelpOnHelp) +{ + const char* argv[] = { "tests.exe", "-h" }; + + CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); + int returned = commandLineTestRunner.runAllTestsMain(); + + LONGS_EQUAL(1, returned); + STRCMP_CONTAINS("Thanks for using CppUTest.", commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().asCharString()); +} + + TEST(CommandLineTestRunner, ReturnsZeroWhenNoErrors) { const char* argv[] = { "tests.exe" }; From e48696cfffa31618349c720b1c54fa470e846f0d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 16 Apr 2020 14:17:15 +0800 Subject: [PATCH 0282/1093] Cleaned up shuffling some more and added reversing --- include/CppUTest/TestRegistry.h | 4 +- include/CppUTest/Utest.h | 23 ++++++ src/CppUTest/CommandLineTestRunner.cpp | 3 +- src/CppUTest/TestRegistry.cpp | 44 +++--------- src/CppUTest/Utest.cpp | 79 +++++++++++++++++++++ tests/CppUTest/ShuffleTest.cpp | 98 +++++++++++++++++--------- tests/CppUTest/TestRegistryTest.cpp | 25 +++++-- 7 files changed, 199 insertions(+), 77 deletions(-) diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index b96fd98e6..c088df513 100644 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -51,7 +51,8 @@ class TestRegistry virtual void unDoLastAddTest(); virtual size_t countTests(); virtual void runAllTests(TestResult& result); - virtual void shuffleRunOrder(); + virtual void shuffleTests(unsigned seed); + virtual void reverseTests(); virtual void listTestGroupNames(TestResult& result); virtual void listTestGroupAndCaseNames(TestResult& result); virtual void setNameFilters(const TestFilter* filters); @@ -76,7 +77,6 @@ class TestRegistry int getCurrentRepetition(); void setRunIgnored(); - static void shuffleList(size_t numElems, void* listToShuffleInPlace[]); private: bool testShouldRun(UtestShell* test, TestResult& result); diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 567f30d5e..22b24993d 100644 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -242,6 +242,29 @@ class IgnoredUtestShell : public UtestShell }; +//////////////////// UtestShellPointerArray + +class UtestShellPointerArray +{ +public: + UtestShellPointerArray(UtestShell* firstTest); + ~UtestShellPointerArray(); + + void shuffle(unsigned seed); + void reverse(); + void relinkTestsInOrder(); + UtestShell* getFirstTest() const; + UtestShell* get(unsigned index) const; + +private: + + void swap(size_t index1, size_t index2); + + UtestShell** arrayOfTests_; + size_t count_; +}; + + //////////////////// TestInstaller class TestInstaller diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index e0ef3fe6a..4b6e972a7 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -123,12 +123,11 @@ int CommandLineTestRunner::runAllTests() output_->print("Test order shuffling enabled with seed: "); output_->print(arguments_->getShuffleSeed()); output_->print("\n"); - PlatformSpecificSrand(arguments_->getShuffleSeed()); } while (loopCount++ < repeatCount) { if (arguments_->isShuffling()) - registry_->shuffleRunOrder(); + registry_->shuffleTests(arguments_->getShuffleSeed()); output_->printTestRun(loopCount, repeatCount); TestResult tr(*output_); diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 2ecdc9f99..27f66f69a 100644 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -228,46 +228,18 @@ UtestShell* TestRegistry::getFirstTest() return tests_; } -// "Durstenfeld shuffle" according to Wikipedia -void TestRegistry::shuffleList(size_t numElems, void* listToShuffleInPlace[]) +void TestRegistry::shuffleTests(unsigned seed) { - if( numElems == 0 ) return; - - for (size_t i = numElems - 1; i >= 1; --i) - { - const size_t j = ((size_t)PlatformSpecificRand()) % (i + 1); // distribution biased by modulo, but good enough for shuffling - void* e1 = listToShuffleInPlace[j]; - void* e2 = listToShuffleInPlace[i]; - listToShuffleInPlace[i] = e1; - listToShuffleInPlace[j] = e2; - } + UtestShellPointerArray array(getFirstTest()); + array.shuffle(seed); + tests_ = array.getFirstTest(); } -void TestRegistry::shuffleRunOrder() +void TestRegistry::reverseTests() { - if (getFirstTest() == NULLPTR) - return; - - const size_t testCount = getFirstTest()->countTests(); - - UtestShell** arrayOfTests = new UtestShell*[testCount]; - - UtestShell* currentTest = getFirstTest(); - for (size_t i = 0; i < testCount; i++) - { - arrayOfTests[i] = currentTest; - currentTest = currentTest->getNext(); - } - - shuffleList(testCount, (void**)arrayOfTests); - - tests_ = NULLPTR; - for (size_t i = 0; i < testCount; i++) - { - tests_ = arrayOfTests[testCount - 1 - i]->addTest(tests_); - } - - delete[] arrayOfTests; + UtestShellPointerArray array(getFirstTest()); + array.reverse(); + tests_ = array.getFirstTest(); } UtestShell* TestRegistry::getTestWithNext(UtestShell* test) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index f76f4c62b..4a51d441d 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -715,6 +715,85 @@ void IgnoredUtestShell::setRunIgnored() runIgnored_ = true; } +//////////////////// UtestShellPointerArray + +UtestShellPointerArray::UtestShellPointerArray(UtestShell* firstTest) + : arrayOfTests_(NULLPTR), count_(0) +{ + count_ = (firstTest) ? firstTest->countTests() : 0; + if (count_ == 0) return; + + arrayOfTests_ = new UtestShell*[count_]; + + UtestShell*currentTest = firstTest; + for (size_t i = 0; i < count_; i++) + { + arrayOfTests_[i] = currentTest; + currentTest = currentTest->getNext(); + } +} + +UtestShellPointerArray::~UtestShellPointerArray() +{ + delete [] arrayOfTests_; +} + +void UtestShellPointerArray::swap(size_t index1, size_t index2) +{ + UtestShell* e2 = arrayOfTests_[index2]; + UtestShell* e1 = arrayOfTests_[index1]; + arrayOfTests_[index1] = e2; + arrayOfTests_[index2] = e1; +} + +void UtestShellPointerArray::shuffle(unsigned seed) +{ + if (count_ == 0) return; + + PlatformSpecificSrand(seed); + + for (size_t i = count_ - 1; i >= 1; --i) + { + if (count_ == 0) return; + + const size_t j = ((size_t)PlatformSpecificRand()) % (i + 1); // distribution biased by modulo, but good enough for shuffling + swap(i, j); + } + relinkTestsInOrder(); +} + +void UtestShellPointerArray::reverse() +{ + if (count_ == 0) return; + + size_t halfCount = count_ / 2; + for (size_t i = 0; i < halfCount; i++) + { + size_t j = count_ - i - 1; + swap(i, j); + } + relinkTestsInOrder(); +} + +void UtestShellPointerArray::relinkTestsInOrder() +{ + UtestShell *tests = NULLPTR; + for (size_t i = 0; i < count_; i++) + tests = arrayOfTests_[count_ - i - 1]->addTest(tests); +} + +UtestShell* UtestShellPointerArray::getFirstTest() const +{ + return get(0); +} + +UtestShell* UtestShellPointerArray::get(unsigned index) const +{ + if (index >= count_) return NULLPTR; + return arrayOfTests_[index]; +} + + ////////////// TestInstaller //////////// diff --git a/tests/CppUTest/ShuffleTest.cpp b/tests/CppUTest/ShuffleTest.cpp index 62fa2bea4..4c8cc3097 100644 --- a/tests/CppUTest/ShuffleTest.cpp +++ b/tests/CppUTest/ShuffleTest.cpp @@ -30,72 +30,104 @@ #include "CppUTest/TestRegistry.h" #include "CppUTest/PlatformSpecificFunctions.h" -static const int maxNumItems = 3; +static int getZero() +{ + return 0; +} -TEST_GROUP(ShuffleTest) +static int getOne() { - int x0; - int x1; - int x2; + return 1; +} - void* elements[maxNumItems]; +TEST_GROUP(ShuffleTest) +{ + UtestShell* test0; + UtestShell* test1; + UtestShell* test2; void setup() { - x0 = 0; - x1 = 1; - x2 = 2; + test0 = new IgnoredUtestShell(); + test1 = new IgnoredUtestShell(); + test2 = new IgnoredUtestShell(); - elements[0] = &x0; - elements[1] = &x1; - elements[2] = &x2; + test0->addTest(test1); + test1->addTest(test2); } + void teardown() + { + delete test0; + delete test1; + delete test2; + } }; -static int getZero() + +TEST(ShuffleTest, empty) { - return 0; + UtestShellPointerArray tests(NULLPTR); + tests.shuffle(0); + CHECK(NULL == tests.getFirstTest()); } -static int getOne() +TEST(ShuffleTest, testsAreInOrder) { - return 1; + UtestShellPointerArray tests(test0); + CHECK(tests.get(0) == test0); + CHECK(tests.get(1) == test1); + CHECK(tests.get(2) == test2); } -static int getValueExceedingMaxIdx() +TEST(ShuffleTest, relinkingTestsWillKeepThemTheSameWhenNothingWasDone) { - return maxNumItems + 1; + UtestShellPointerArray tests(test0); + tests.relinkTestsInOrder(); + CHECK(tests.get(0) == test0); + CHECK(tests.get(1) == test1); + CHECK(tests.get(2) == test2); } -TEST(ShuffleTest, ShuffleListTestWithNoElementsInList) -{ - UT_PTR_SET(PlatformSpecificRand, getValueExceedingMaxIdx); - TestRegistry::shuffleList(0, elements); - CHECK(elements[0] == &x0); - CHECK(elements[1] == &x1); - CHECK(elements[2] == &x2); +TEST(ShuffleTest, firstTestisNotTheFirstTestWithSeed1234) +{ + UtestShellPointerArray tests(test0); + tests.shuffle(1234); + CHECK(tests.getFirstTest() != test0); } TEST(ShuffleTest, ShuffleListTestWithRandomAlwaysReturningZero) { UT_PTR_SET(PlatformSpecificRand, getZero); - TestRegistry::shuffleList(3, elements); - CHECK(elements[0] == &x1); - CHECK(elements[1] == &x2); - CHECK(elements[2] == &x0); + UtestShellPointerArray tests(test0); + tests.shuffle(3); + CHECK(tests.get(0) == test1); + CHECK(tests.get(1) == test2); + CHECK(tests.get(2) == test0); } // swaps with 4 mod 3 (1) then 4 mod 2 (0): 1, [2], [0] --> [1], [0], 2 --> 0, 1, 2 TEST(ShuffleTest, ShuffleListTestWithRandomAlwaysReturningOne) { UT_PTR_SET(PlatformSpecificRand, getOne); - TestRegistry::shuffleList(3, elements); - CHECK(elements[0] == &x0); - CHECK(elements[1] == &x2); - CHECK(elements[2] == &x1); + UtestShellPointerArray tests(test0); + tests.shuffle(3); + CHECK(tests.get(0) == test0); + CHECK(tests.get(1) == test2); + CHECK(tests.get(2) == test1); +} + +TEST(ShuffleTest, reverse) +{ + UT_PTR_SET(PlatformSpecificRand, getOne); + + UtestShellPointerArray tests(test0); + tests.reverse(); + CHECK(tests.get(0) == test2); + CHECK(tests.get(1) == test1); + CHECK(tests.get(2) == test0); } diff --git a/tests/CppUTest/TestRegistryTest.cpp b/tests/CppUTest/TestRegistryTest.cpp index 9c8523734..b727f8c33 100644 --- a/tests/CppUTest/TestRegistryTest.cpp +++ b/tests/CppUTest/TestRegistryTest.cpp @@ -364,14 +364,14 @@ TEST(TestRegistry, listTestGroupAndCaseNames_shouldListBackwardsGroupATestaAfter TEST(TestRegistry, shuffleEmptyListIsNoOp) { CHECK_TRUE(myRegistry->getFirstTest() == NULLPTR); - myRegistry->shuffleRunOrder(); + myRegistry->shuffleTests(0); CHECK_TRUE(myRegistry->getFirstTest() == NULLPTR); } TEST(TestRegistry, shuffleSingleTestIsNoOp) { myRegistry->addTest(test1); - myRegistry->shuffleRunOrder(); + myRegistry->shuffleTests(0); CHECK_TRUE(myRegistry->getFirstTest() == test1); } @@ -380,7 +380,7 @@ static int getZero() return 0; } -TEST(TestRegistry, shuffleTestList) +IGNORE_TEST(TestRegistry, shuffleTestList) { UT_PTR_SET(PlatformSpecificRand, getZero); myRegistry->addTest(test3); @@ -397,7 +397,7 @@ TEST(TestRegistry, shuffleTestList) CHECK_TRUE(third_before->getNext() == NULLPTR); // shuffle always with element at index 0: [1] 2 [3] --> [3] [2] 1 --> 2 3 1 - myRegistry->shuffleRunOrder(); + myRegistry->shuffleTests(0); UtestShell* first_after = myRegistry->getFirstTest(); UtestShell* second_after = first_after->getNext(); @@ -408,3 +408,20 @@ TEST(TestRegistry, shuffleTestList) CHECK_TRUE(third_after == test1); CHECK_TRUE(third_after->getNext() == NULLPTR); } + +TEST(TestRegistry, reverseTests) +{ + myRegistry->addTest(test1); + myRegistry->addTest(test2); + + myRegistry->reverseTests(); + + CHECK(test1 == myRegistry->getFirstTest()); +} + +TEST(TestRegistry, reverseZeroTests) +{ + myRegistry->reverseTests(); + + CHECK(NULLPTR == myRegistry->getFirstTest()); +} From af78518105df72d83366a5c30097a864c8ea19a8 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 16 Apr 2020 14:33:47 +0800 Subject: [PATCH 0283/1093] Moved the shuffle tests away --- tests/CppUTest/ShuffleTest.cpp | 101 --------------------------------- tests/CppUTest/UtestTest.cpp | 101 +++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 101 deletions(-) diff --git a/tests/CppUTest/ShuffleTest.cpp b/tests/CppUTest/ShuffleTest.cpp index 4c8cc3097..cd44b17a9 100644 --- a/tests/CppUTest/ShuffleTest.cpp +++ b/tests/CppUTest/ShuffleTest.cpp @@ -30,104 +30,3 @@ #include "CppUTest/TestRegistry.h" #include "CppUTest/PlatformSpecificFunctions.h" -static int getZero() -{ - return 0; -} - -static int getOne() -{ - return 1; -} - -TEST_GROUP(ShuffleTest) -{ - UtestShell* test0; - UtestShell* test1; - UtestShell* test2; - - void setup() - { - test0 = new IgnoredUtestShell(); - test1 = new IgnoredUtestShell(); - test2 = new IgnoredUtestShell(); - - test0->addTest(test1); - test1->addTest(test2); - } - - void teardown() - { - delete test0; - delete test1; - delete test2; - } -}; - - -TEST(ShuffleTest, empty) -{ - UtestShellPointerArray tests(NULLPTR); - tests.shuffle(0); - CHECK(NULL == tests.getFirstTest()); -} - -TEST(ShuffleTest, testsAreInOrder) -{ - UtestShellPointerArray tests(test0); - CHECK(tests.get(0) == test0); - CHECK(tests.get(1) == test1); - CHECK(tests.get(2) == test2); -} - -TEST(ShuffleTest, relinkingTestsWillKeepThemTheSameWhenNothingWasDone) -{ - UtestShellPointerArray tests(test0); - tests.relinkTestsInOrder(); - CHECK(tests.get(0) == test0); - CHECK(tests.get(1) == test1); - CHECK(tests.get(2) == test2); -} - - -TEST(ShuffleTest, firstTestisNotTheFirstTestWithSeed1234) -{ - UtestShellPointerArray tests(test0); - tests.shuffle(1234); - CHECK(tests.getFirstTest() != test0); -} - -TEST(ShuffleTest, ShuffleListTestWithRandomAlwaysReturningZero) -{ - UT_PTR_SET(PlatformSpecificRand, getZero); - - UtestShellPointerArray tests(test0); - tests.shuffle(3); - CHECK(tests.get(0) == test1); - CHECK(tests.get(1) == test2); - CHECK(tests.get(2) == test0); -} - -// swaps with 4 mod 3 (1) then 4 mod 2 (0): 1, [2], [0] --> [1], [0], 2 --> 0, 1, 2 -TEST(ShuffleTest, ShuffleListTestWithRandomAlwaysReturningOne) -{ - UT_PTR_SET(PlatformSpecificRand, getOne); - - UtestShellPointerArray tests(test0); - tests.shuffle(3); - CHECK(tests.get(0) == test0); - CHECK(tests.get(1) == test2); - CHECK(tests.get(2) == test1); -} - -TEST(ShuffleTest, reverse) -{ - UT_PTR_SET(PlatformSpecificRand, getOne); - - UtestShellPointerArray tests(test0); - tests.reverse(); - CHECK(tests.get(0) == test2); - CHECK(tests.get(1) == test1); - CHECK(tests.get(2) == test0); -} - diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 2d5d81216..c4af4c35e 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -382,3 +382,104 @@ TEST(CanHaveMemberVariablesInTestGroupThatAllocateMemoryWithoutCausingMemoryLeak dummy.allocateMoreMemory(); } +static int getZero() +{ + return 0; +} + +static int getOne() +{ + return 1; +} + +TEST_GROUP(UtestShellPointerArrayTest) +{ + UtestShell* test0; + UtestShell* test1; + UtestShell* test2; + + void setup() + { + test0 = new IgnoredUtestShell(); + test1 = new IgnoredUtestShell(); + test2 = new IgnoredUtestShell(); + + test0->addTest(test1); + test1->addTest(test2); + } + + void teardown() + { + delete test0; + delete test1; + delete test2; + } +}; + + +TEST(UtestShellPointerArrayTest, empty) +{ + UtestShellPointerArray tests(NULLPTR); + tests.shuffle(0); + CHECK(NULL == tests.getFirstTest()); +} + +TEST(UtestShellPointerArrayTest, testsAreInOrder) +{ + UtestShellPointerArray tests(test0); + CHECK(tests.get(0) == test0); + CHECK(tests.get(1) == test1); + CHECK(tests.get(2) == test2); +} + +TEST(UtestShellPointerArrayTest, relinkingTestsWillKeepThemTheSameWhenNothingWasDone) +{ + UtestShellPointerArray tests(test0); + tests.relinkTestsInOrder(); + CHECK(tests.get(0) == test0); + CHECK(tests.get(1) == test1); + CHECK(tests.get(2) == test2); +} + + +TEST(UtestShellPointerArrayTest, firstTestisNotTheFirstTestWithSeed1234) +{ + UtestShellPointerArray tests(test0); + tests.shuffle(1234); + CHECK(tests.getFirstTest() != test0); +} + +TEST(UtestShellPointerArrayTest, ShuffleListTestWithRandomAlwaysReturningZero) +{ + UT_PTR_SET(PlatformSpecificRand, getZero); + + UtestShellPointerArray tests(test0); + tests.shuffle(3); + CHECK(tests.get(0) == test1); + CHECK(tests.get(1) == test2); + CHECK(tests.get(2) == test0); +} + +// swaps with 4 mod 3 (1) then 4 mod 2 (0): 1, [2], [0] --> [1], [0], 2 --> 0, 1, 2 +TEST(UtestShellPointerArrayTest, ShuffleListTestWithRandomAlwaysReturningOne) +{ + UT_PTR_SET(PlatformSpecificRand, getOne); + + UtestShellPointerArray tests(test0); + tests.shuffle(3); + CHECK(tests.get(0) == test0); + CHECK(tests.get(1) == test2); + CHECK(tests.get(2) == test1); +} + +TEST(UtestShellPointerArrayTest, reverse) +{ + UT_PTR_SET(PlatformSpecificRand, getOne); + + UtestShellPointerArray tests(test0); + tests.reverse(); + CHECK(tests.get(0) == test2); + CHECK(tests.get(1) == test1); + CHECK(tests.get(2) == test0); +} + From a6f2a15cdb6757269677d19592bbf2449290402e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 16 Apr 2020 15:10:46 +0800 Subject: [PATCH 0284/1093] Removed ShuttleTest.cpp --- Makefile.am | 1 - tests/CppUTest/CMakeLists.txt | 1 - tests/CppUTest/ShuffleTest.cpp | 32 -------------------------------- 3 files changed, 34 deletions(-) delete mode 100644 tests/CppUTest/ShuffleTest.cpp diff --git a/Makefile.am b/Makefile.am index b91b57157..1bfb67155 100644 --- a/Makefile.am +++ b/Makefile.am @@ -154,7 +154,6 @@ CppUTestTests_SOURCES = \ tests/CppUTest/SetPluginTest.cpp \ tests/CppUTest/SimpleStringTest.cpp \ tests/CppUTest/SimpleMutexTest.cpp \ - tests/CppUTest/ShuffleTest.cpp \ tests/CppUTest/TeamCityOutputTest.cpp \ tests/CppUTest/TestFailureNaNTest.cpp \ tests/CppUTest/TestFailureTest.cpp \ diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index bb4c26dd8..925993660 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -23,7 +23,6 @@ set(CppUTestTests_src TestOutputTest.cpp AllocLetTestFreeTest.cpp TestRegistryTest.cpp - ShuffleTest.cpp AllocationInCFile.c PluginTest.cpp TestResultTest.cpp diff --git a/tests/CppUTest/ShuffleTest.cpp b/tests/CppUTest/ShuffleTest.cpp deleted file mode 100644 index cd44b17a9..000000000 --- a/tests/CppUTest/ShuffleTest.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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 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 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/TestOutput.h" -#include "CppUTest/TestRegistry.h" -#include "CppUTest/PlatformSpecificFunctions.h" - From d11c76a1056381b64bcb2cb575b65433a02f6382 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 16 Apr 2020 16:45:18 +0800 Subject: [PATCH 0285/1093] Running the tests in reverse from normal --- include/CppUTest/CommandLineArguments.h | 2 + src/CppUTest/CommandLineArguments.cpp | 11 +++- src/CppUTest/CommandLineTestRunner.cpp | 3 ++ tests/CppUTest/CommandLineArgumentsTest.cpp | 10 +++- tests/CppUTest/CommandLineTestRunnerTest.cpp | 57 +++++++++++++++----- 5 files changed, 67 insertions(+), 16 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index b88d764d5..e3ba29a6f 100644 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -49,6 +49,7 @@ class CommandLineArguments bool isRunIgnored() const; int getRepeatCount() const; bool isShuffling() const; + bool isReversing() const; unsigned int getShuffleSeed() const; const TestFilter* getGroupFilters() const; const TestFilter* getNameFilters() const; @@ -77,6 +78,7 @@ class CommandLineArguments bool listTestGroupNames_; bool listTestGroupAndCaseNames_; bool runIgnored_; + bool reversing_; bool shuffling_; bool shufflingPreSeeded_; int repeat_; diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index fd6bee27c..87379d33d 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -30,7 +30,7 @@ #include "CppUTest/PlatformSpecificFunctions.h" CommandLineArguments::CommandLineArguments(int ac, const char *const *av) : - ac_(ac), av_(av), needHelp_(false), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) + ac_(ac), av_(av), needHelp_(false), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), reversing_(false), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) { } @@ -58,6 +58,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) if (argument == "-v") verbose_ = true; else if (argument == "-c") color_ = true; else if (argument == "-p") runTestsAsSeperateProcess_ = true; + else if (argument == "-b") reversing_ = true; else if (argument == "-lg") listTestGroupNames_ = true; else if (argument == "-ln") listTestGroupAndCaseNames_ = true; else if (argument == "-ri") runIgnored_ = true; @@ -87,7 +88,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) const char* CommandLineArguments::usage() const { - return "use -h for more extensive help\nusage [-h] [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; + return "use -h for more extensive help\nusage [-h] [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; } const char* CommandLineArguments::help() const @@ -122,6 +123,7 @@ const char* CommandLineArguments::help() const "\n" "Options that control how the tests are run:\n" " -p - run tests in a separate process.\n" + " -b - run the tests backwards, reversing the normal way\n" " -s [seed] - shuffle tests randomly. Seed is optional\n" " -r# - repeat the tests some number (#) of times, or twice if # is not specified.\n"; } @@ -167,6 +169,11 @@ int CommandLineArguments::getRepeatCount() const return repeat_; } +bool CommandLineArguments::isReversing() const +{ + return reversing_; +} + bool CommandLineArguments::isShuffling() const { return shuffling_; diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 4b6e972a7..9a4e74139 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -118,6 +118,9 @@ int CommandLineTestRunner::runAllTests() return 0; } + if (arguments_->isReversing()) + registry_->reverseTests(); + if (arguments_->isShuffling()) { output_->print("Test order shuffling enabled with seed: "); diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index 8e27a5c85..f03c83563 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -110,6 +110,14 @@ TEST(CommandLineArguments, repeatSetDefaultsToTwoAndShuffleDisabled) LONGS_EQUAL(2, args->getRepeatCount()); } +TEST(CommandLineArguments, reverseEnabled) +{ + int argc = 2; + const char* argv[] = { "tests.exe", "-b" }; + CHECK(newArgumentParser(argc, argv)); + CHECK_TRUE(args->isReversing()); +} + TEST(CommandLineArguments, shuffleDisabledByDefault) { int argc = 1; @@ -433,7 +441,7 @@ TEST(CommandLineArguments, weirdParamatersReturnsFalse) TEST(CommandLineArguments, printUsage) { - STRCMP_EQUAL("use -h for more extensive help\nusage [-h] [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", + STRCMP_EQUAL("use -h for more extensive help\nusage [-h] [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", args->usage()); } diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index e01559227..ec7f27246 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -91,19 +91,22 @@ class CommandLineTestRunnerWithStringBufferOutput : public CommandLineTestRunner TEST_GROUP(CommandLineTestRunner) { TestRegistry registry; - UtestShell *oneTest_; + UtestShell *test1; + UtestShell *test2; DummyPluginWhichCountsThePlugins* pluginCountingPlugin; void setup() { - oneTest_ = new UtestShell("group", "test", "file", 1); - registry.addTest(oneTest_); + test1 = new UtestShell("group1", "test1", "file1", 1); + test2 = new UtestShell("group2", "test2", "file2", 2); + registry.addTest(test1); pluginCountingPlugin = new DummyPluginWhichCountsThePlugins("PluginCountingPlugin", ®istry); } void teardown() { delete pluginCountingPlugin; - delete oneTest_; + delete test2; + delete test1; } SimpleString runAndGetOutput(const int argc, const char* argv[]) @@ -204,8 +207,36 @@ TEST(CommandLineTestRunner, JunitOutputAndVerboseEnabled) CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(3, argv, ®istry); commandLineTestRunner.runAllTestsMain(); - STRCMP_CONTAINS("TEST(group, test)", commandLineTestRunner.fakeJUnitOutputWhichIsReallyABuffer_->getOutput().asCharString()); - STRCMP_CONTAINS("TEST(group, test)", commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().asCharString()); + STRCMP_CONTAINS("TEST(group1, test1)", commandLineTestRunner.fakeJUnitOutputWhichIsReallyABuffer_->getOutput().asCharString()); + STRCMP_CONTAINS("TEST(group1, test1)", commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().asCharString()); +} + +TEST(CommandLineTestRunner, defaultTestsAreRunInOrderTheyAreInRepository) +{ + const char* argv[] = { "tests.exe", "-v"}; + + registry.addTest(test2); + CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); + commandLineTestRunner.runAllTestsMain(); + + SimpleStringCollection stringCollection; + commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().split("\n", stringCollection); + STRCMP_CONTAINS("test2", stringCollection[0].asCharString()); + STRCMP_CONTAINS("test1", stringCollection[1].asCharString()); +} + +TEST(CommandLineTestRunner, testsCanBeRunInReverseOrder) +{ + const char* argv[] = { "tests.exe", "-v", "-b"}; + + registry.addTest(test2); + CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(3, argv, ®istry); + commandLineTestRunner.runAllTestsMain(); + + SimpleStringCollection stringCollection; + commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().split("\n", stringCollection); + STRCMP_CONTAINS("test1", stringCollection[0].asCharString()); + STRCMP_CONTAINS("test2", stringCollection[1].asCharString()); } TEST(CommandLineTestRunner, listTestGroupNamesShouldWorkProperly) @@ -225,7 +256,7 @@ TEST(CommandLineTestRunner, listTestGroupAndCaseNamesShouldWorkProperly) CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); commandLineTestRunner.runAllTestsMain(); - STRCMP_CONTAINS("group.test", commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().asCharString()); + STRCMP_CONTAINS("group1.test1", commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().asCharString()); } TEST(CommandLineTestRunner, randomShuffleSeedIsPrintedAndRandFuncIsExercised) @@ -311,8 +342,8 @@ TEST(CommandLineTestRunner, realJunitOutputShouldBeCreatedAndWorkProperly) delete fakeOutput; /* Original output must be restored before further output occurs */ - STRCMP_CONTAINS(" Date: Thu, 16 Apr 2020 18:02:22 +0800 Subject: [PATCH 0286/1093] Added max retry count, which causes gdb not be end up in endless loop --- src/Platforms/Gcc/UtestPlatform.cpp | 12 ++++++++++-- tests/CppUTest/UtestPlatformTest.cpp | 19 +++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 322e98e2d..97bda74c5 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -92,7 +92,7 @@ static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, Test const pid_t syscallError = -1; pid_t cpid; pid_t w; - int status; + int status = 0; cpid = PlatformSpecificFork(); @@ -106,11 +106,19 @@ static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, Test shell->runOneTestInCurrentProcess(plugin, *result); // LCOV_EXCL_LINE _exit(initialFailureCount < result->getFailureCount()); // LCOV_EXCL_LINE } else { /* Code executed by parent */ + size_t amountOfRetries = 0; do { w = PlatformSpecificWaitPid(cpid, &status, WUNTRACED); if (w == syscallError) { // OS X debugger causes EINTR - if (EINTR != errno) { + if (EINTR == errno) { + if (amountOfRetries > 30) { + result->addFailure(TestFailure(shell, "Call to waitpid() failed with EINTR. Tried 30 times and giving up! Sometimes happens in debugger")); + return; + } + amountOfRetries++; + } + else { result->addFailure(TestFailure(shell, "Call to waitpid() failed")); return; } diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index e0b668014..df63fe6e0 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -66,7 +66,7 @@ static void _exitNonZeroFunction() #include static int waitpid_while_debugging_stub_number_called = 0; -const int waitpid_while_debugging_stub_forced_failures = 10; +static int waitpid_while_debugging_stub_forced_failures = 0; extern "C" { @@ -153,13 +153,28 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToWaitPid UT_PTR_SET(original_waitpid, PlatformSpecificWaitPid); UT_PTR_SET(PlatformSpecificWaitPid, waitpid_while_debugging_stub); waitpid_while_debugging_stub_number_called = 0; + waitpid_while_debugging_stub_forced_failures = 10; fixture.registry_->setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("OK (1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out"); // extra check to confirm that waitpid() was polled until it passed (and passed call adds one) - LONGS_EQUAL(waitpid_while_debugging_stub_forced_failures + 1, waitpid_while_debugging_stub_number_called); + CHECK(waitpid_while_debugging_stub_number_called > waitpid_while_debugging_stub_forced_failures); } +TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToWaitPidStopsAndReportsAnErrorAfter20TimesRetry) +{ + UT_PTR_SET(original_waitpid, PlatformSpecificWaitPid); + UT_PTR_SET(PlatformSpecificWaitPid, waitpid_while_debugging_stub); + waitpid_while_debugging_stub_number_called = 0; + waitpid_while_debugging_stub_forced_failures = 40; + fixture.registry_->setRunTestsInSeperateProcess(); + fixture.runAllTests(); + fixture.assertPrintContains("Call to waitpid() failed with EINTR. Tried 30 times and giving up! Sometimes happens in debugger"); + // extra check to confirm that waitpid() was polled until it passed (and passed call adds one) + CHECK(waitpid_while_debugging_stub_number_called > 30); +} + + TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToWaitPidFailedInSeparateProcessWorks) { UT_PTR_SET(PlatformSpecificWaitPid, waitpid_failed_stub); From e89d6f88fc7796d8dc43bf11f6a063f0d723b87f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 16 Apr 2020 19:30:07 +0800 Subject: [PATCH 0287/1093] Added OSX build to build matrix in travis. Works? --- .travis.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 056576082..eb5899fce 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: cpp dist: bionic -matrix: +jobs: include: - compiler: clang env: BUILD=cmake CPP_STD=98 @@ -62,6 +62,13 @@ matrix: apt: packages: - dosbox + - compiler: clang + os: osx + env: BUILD=cmake CPP_STD=17 + addons: + apt: + packages: + - libc++-dev global: - secure: |- From 9c2a0f2c70b64a4096d498aa6787a557c2e7b04a Mon Sep 17 00:00:00 2001 From: offa Date: Thu, 16 Apr 2020 13:49:11 +0200 Subject: [PATCH 0288/1093] Cmake example updated. --- README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 64e6ac68a..e0d60ffb8 100644 --- a/README.md +++ b/README.md @@ -206,18 +206,16 @@ include(FetchContent) FetchContent_Declare( CppUTest GIT_REPOSITORY https://github.com/cpputest/cpputest.git - GIT_TAG v3.8 + GIT_TAG master # or use release tag, eg. v3.8 ) # Set this to ON if you want to have the CppUTests in your project as well. set(TESTS OFF CACHE BOOL "Switch off CppUTest Test build") FetchContent_MakeAvailable(CppUTest) -include_directories(${CppUTest_SOURCE_DIR}/include) ``` It can be used then like so: ```cmake -file(GLOB_RECURSE TEST_SOURCES ${TEST_DIR}/*.cpp) -add_executable(run_tests ${TEST_SOURCES}) -target_link_libraries(run_tests CppUTest) -``` \ No newline at end of file +add_executable(run_tests UnitTest1.cpp UnitTest2.cpp) +target_link_libraries(run_tests PRIVATE CppUTest CppUTestExt) +``` From cfe14165a7220d96e9e4a9301f172ebe1a16a240 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 16 Apr 2020 20:08:36 +0800 Subject: [PATCH 0289/1093] Added more osx builds --- .travis.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.travis.yml b/.travis.yml index eb5899fce..ec626810c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -69,6 +69,25 @@ jobs: apt: packages: - libc++-dev + - compiler: gcc + os: osx + env: BUILD=cmake CPP_STD=14 + + - compiler: gcc + os: osx + env: BUILD=autotools + addons: + apt: + packages: + - valgrind + - compiler: clang + env: BUILD=autotools + os: osx + addons: + apt: + packages: + - libc++-dev + - valgrind global: - secure: |- From f14ff394835b56107c44f46a1df77c76afe5427e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 16 Apr 2020 18:10:05 -0700 Subject: [PATCH 0290/1093] Added #if for compilation with -no-libc --- include/CppUTest/SimpleString.h | 2 +- src/CppUTest/SimpleString.cpp | 2 +- tests/CppUTest/SimpleStringTest.cpp | 2 +- tests/CppUTest/UtestPlatformTest.cpp | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index f0fc5e218..3b1200bfe 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -179,7 +179,7 @@ SimpleString BracketsFormattedHexString(SimpleString hexString); * ARM compiler has only partial support for C++11. * Specifically nullptr_t is not officially supported */ -#if __cplusplus > 199711L && !defined __arm__ +#if __cplusplus > 199711L && !defined __arm__ && CPPUTEST_USE_STD_C_LIB SimpleString StringFrom(const std::nullptr_t value); #endif diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 430041af2..5caa98f65 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -561,7 +561,7 @@ SimpleString BracketsFormattedHexString(SimpleString hexString) * ARM compiler has only partial support for C++11. * Specifically nullptr_t is not officially supported */ -#if __cplusplus > 199711L && !defined __arm__ +#if __cplusplus > 199711L && !defined __arm__ && CPPUTEST_USE_C_LIB SimpleString StringFrom(const std::nullptr_t value) { (void) value; diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 6e8c6c6cd..1d11073b4 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -572,7 +572,7 @@ TEST(SimpleString, Sizes) STRCMP_EQUAL("10", StringFrom((int) size).asCharString()); } -#if __cplusplus > 199711L +#if __cplusplus > 199711L && CPPUTEST_USE_STD_C_LIB TEST(SimpleString, nullptr_type) { SimpleString s(StringFrom(nullptr)); diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index df63fe6e0..548debf53 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -31,6 +31,8 @@ #include "CppUTest/PlatformSpecificFunctions.h" #include "CppUTest/StandardCLibrary.h" +#if CPPUTEST_USE_STD_C_LIB + // This will cause a crash in VS2010 due to PlatformSpecificFree being uninitialized static const SimpleString str1("abc"); static const SimpleString str2("def"); @@ -198,3 +200,5 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, MultipleTests } #endif +#endif + From 32fff2f44689c1444b99eb6e37b1a7d56b129bb7 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 17 Apr 2020 12:18:48 +0800 Subject: [PATCH 0291/1093] Typo in the define --- src/CppUTest/SimpleString.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 5caa98f65..6b43ea026 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -561,7 +561,7 @@ SimpleString BracketsFormattedHexString(SimpleString hexString) * ARM compiler has only partial support for C++11. * Specifically nullptr_t is not officially supported */ -#if __cplusplus > 199711L && !defined __arm__ && CPPUTEST_USE_C_LIB +#if __cplusplus > 199711L && !defined __arm__ && CPPUTEST_USE_STD_C_LIB SimpleString StringFrom(const std::nullptr_t value) { (void) value; From 8132fc2253f5c550a026233c6fe255e4a3eb6c3a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 17 Apr 2020 12:50:12 +0800 Subject: [PATCH 0292/1093] Changed from not compiler nullptr when no c+ lib is used --- include/CppUTest/SimpleString.h | 2 +- src/CppUTest/SimpleString.cpp | 2 +- tests/CppUTest/SimpleStringTest.cpp | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 3b1200bfe..8481f46e7 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -179,7 +179,7 @@ SimpleString BracketsFormattedHexString(SimpleString hexString); * ARM compiler has only partial support for C++11. * Specifically nullptr_t is not officially supported */ -#if __cplusplus > 199711L && !defined __arm__ && CPPUTEST_USE_STD_C_LIB +#if __cplusplus > 199711L && !defined __arm__ && CPPUTEST_USE_STD_CPP_LIB SimpleString StringFrom(const std::nullptr_t value); #endif diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 6b43ea026..96f62e526 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -561,7 +561,7 @@ SimpleString BracketsFormattedHexString(SimpleString hexString) * ARM compiler has only partial support for C++11. * Specifically nullptr_t is not officially supported */ -#if __cplusplus > 199711L && !defined __arm__ && CPPUTEST_USE_STD_C_LIB +#if __cplusplus > 199711L && !defined __arm__ && CPPUTEST_USE_STD_CPP_LIB SimpleString StringFrom(const std::nullptr_t value) { (void) value; diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 1d11073b4..c45e9d329 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -572,12 +572,14 @@ TEST(SimpleString, Sizes) STRCMP_EQUAL("10", StringFrom((int) size).asCharString()); } -#if __cplusplus > 199711L && CPPUTEST_USE_STD_C_LIB +#if __cplusplus > 199711L && !defined __arm__ && CPPUTEST_USE_STD_CPP_LIB + TEST(SimpleString, nullptr_type) { SimpleString s(StringFrom(nullptr)); STRCMP_EQUAL("(null)", s.asCharString()); } + #endif TEST(SimpleString, HexStrings) From af792bd591b41fdd17406d18f254d6fb487e8a2c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 17 Apr 2020 13:41:39 +0800 Subject: [PATCH 0293/1093] Support for C++98 --- Makefile.am | 5 ++++- configure.ac | 19 +++++++++++++++++-- src/CppUTest/SimpleString.cpp | 6 +++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Makefile.am b/Makefile.am index 1bfb67155..d584c152f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -271,7 +271,7 @@ cpputest_build_gtest15: check_gtest15: cpputest_build_gtest15 @echo "Build using gmock 1.5"; export GMOCK_HOME=`pwd`/cpputest_build_gtest15/googlemock-release-1.5.0; \ - make distclean; $(srcdir)/configure; make check + make distclean; $(srcdir)/configure --enable-std-cpp98; make check check_gtest16: cpputest_build_gtest16 @echo "Build using gmock 1.6"; @@ -309,6 +309,9 @@ check_basic: @echo "Building without extensions" make distclean; $(srcdir)/configure --disable-extensions; make check + @echo "Building with the Std C++ 98 turned on. Compiler acts differently then." + make distclean; $(srcdir)/configure --enable-std-cpp98; make + @echo "Building with the Std C++ 11 turned on. Compiler acts differently then." make distclean; $(srcdir)/configure --enable-std-cpp11; make diff --git a/configure.ac b/configure.ac index c188240d2..6c264cfe5 100644 --- a/configure.ac +++ b/configure.ac @@ -99,9 +99,15 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP14FL CXXFLAGS="$saved_cxxflags" ##################################################################################### -##### C++ 11 checks +##### C++ version checks -### Checking for Standard C++ 11 compiler flags +### Checking for C++ version compiler flags + +# FLag -std=c++98 +CXXFLAGS="-Werror -std=c++98" +AC_MSG_CHECKING([whether CXX supports -std=c++98]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP98FLAG="-std=c++98" ], [AC_MSG_RESULT([no])]) +CXXFLAGS="$saved_cxxflags" # FLag -std=c++0x CXXFLAGS="-Werror -std=c++0x" @@ -357,6 +363,9 @@ AC_ARG_ENABLE([std-c], [AC_HELP_STRING([--disable-std-c], [disable the use of St AC_ARG_ENABLE([std-cpp], [AC_HELP_STRING([--disable-std-cpp], [disable the use of Standard C++ Library])], [use_std_cpp=${enableval}], [use_std_cpp=${default_use_std_cpp}]) +AC_ARG_ENABLE([std-cpp98], [AC_HELP_STRING([--enable-std-cpp98], [enable the use of Standard C++ 98 (if the compiler supports that)])], + [use_std_cpp98=${enableval}], [use_std_cpp98=no]) + AC_ARG_ENABLE([std-cpp11], [AC_HELP_STRING([--enable-std-cpp11], [enable the use of Standard C++ 11 (if the compiler supports that)])], [use_std_cpp11=${enableval}], [use_std_cpp11=no]) @@ -410,6 +419,12 @@ if test "x${use_std_cpp}" = xno; then fi cpp_standard_used="default" +# Using the C++98 standard? +if test "x${use_std_cpp98}" = xyes; then + CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP98FLAG} ${CPPUTEST_CPP11BLACKLIST}" + cpp_standard_used="C++98" +fi + # Using the C++11 standard? if test "x${use_std_cpp11}" = xyes; then CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP11FLAG} ${CPPUTEST_CPP11BLACKLIST}" diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 96f62e526..6ee3f2983 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -731,10 +731,14 @@ SimpleString StringFrom(unsigned long i) return StringFromFormat("%lu", i); } -//Kludge to get a va_copy in VC++ V6 +//Kludge to get a va_copy in VC++ V6 and in C++98 GCC #ifndef va_copy +#ifdef __GNUC__ +#define va_copy __va_copy +#else #define va_copy(copy, original) copy = original; #endif +#endif SimpleString VStringFromFormat(const char* format, va_list args) { From 6e0ee2d05a032e8b5bb3f4b3fbe74df100974c6a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 17 Apr 2020 14:43:40 +0800 Subject: [PATCH 0294/1093] Moved the va_copy hack into the StandardCLibrary.h --- include/CppUTest/StandardCLibrary.h | 18 ++++++++++++++---- src/CppUTest/SimpleString.cpp | 11 +---------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/include/CppUTest/StandardCLibrary.h b/include/CppUTest/StandardCLibrary.h index 91890c986..00dfb3387 100644 --- a/include/CppUTest/StandardCLibrary.h +++ b/include/CppUTest/StandardCLibrary.h @@ -5,7 +5,6 @@ #ifndef STANDARDCLIBRARY_H_ #define STANDARDCLIBRARY_H_ - #if CPPUTEST_USE_STD_C_LIB /* Needed for size_t */ @@ -31,6 +30,15 @@ /* Needed for ... */ #include +//Kludge to get a va_copy in VC++ V6 and in GCC 98 +#ifndef va_copy +#ifdef __GNUC__ +#define va_copy __va_copy +#else +#define va_copy(copy, original) copy = original; +#endif +#endif + /* Needed for some detection of long long and 64 bit */ #include @@ -69,14 +77,16 @@ typedef __SIZE_TYPE__ size_t; typedef long unsigned int size_t; #endif -typedef char* va_list; #define NULL (0) extern void* malloc(size_t); extern void free(void *); #define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd))) -#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,sizeof(int)-1)))) -#define va_end(ap) (void) 0 + +#define va_list __builtin_va_list +#define va_copy __builtin_va_copy +#define va_start __builtin_va_start +#define va_end __builtin_va_end #endif diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 6ee3f2983..6a7a618da 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -227,8 +227,8 @@ size_t SimpleString::count(const SimpleString& substr) const size_t num = 0; const char* str = buffer_; while (*str && (str = StrStr(str, substr.buffer_))) { - num++; str++; + num++; } return num; } @@ -731,15 +731,6 @@ SimpleString StringFrom(unsigned long i) return StringFromFormat("%lu", i); } -//Kludge to get a va_copy in VC++ V6 and in C++98 GCC -#ifndef va_copy -#ifdef __GNUC__ -#define va_copy __va_copy -#else -#define va_copy(copy, original) copy = original; -#endif -#endif - SimpleString VStringFromFormat(const char* format, va_list args) { va_list argsCopy; From fe256db70b3d57be5b0ecc1f1169e2b7b8c7be1f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 17 Apr 2020 16:08:34 +0800 Subject: [PATCH 0295/1093] Fixed linux compilation of gtest support --- Makefile.am | 7 ++++--- include/CppUTestExt/GTest.h | 2 ++ src/CppUTestExt/GTest.cpp | 8 ++++++++ tests/CppUTestExt/GTest1Test.cpp | 3 +++ 4 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 src/CppUTestExt/GTest.cpp diff --git a/Makefile.am b/Makefile.am index d584c152f..35fc19d5c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -90,6 +90,7 @@ lib_libCppUTestExt_a_CXXFLAGS = $(lib_libCppUTest_a_CXXFLAGS) lib_libCppUTestExt_a_SOURCES = \ src/CppUTestExt/CodeMemoryReportFormatter.cpp \ + src/CppUTestExt/GTest.cpp \ src/CppUTestExt/IEEE754ExceptionsPlugin.cpp \ src/CppUTestExt/MemoryReportAllocator.cpp \ src/CppUTestExt/MemoryReporterPlugin.cpp \ @@ -276,18 +277,18 @@ check_gtest15: cpputest_build_gtest15 check_gtest16: cpputest_build_gtest16 @echo "Build using gmock 1.6"; export GMOCK_HOME=`pwd`/cpputest_build_gtest16/googlemock-release-1.6.0; \ - make distclean; $(srcdir)/configure; make check + make distclean; $(srcdir)/configure --enable-std-cpp98; make check check_gtest17: cpputest_build_gtest17 @echo "Build using gmock 1.7" export GMOCK_HOME=`pwd`/cpputest_build_gtest17/googlemock-release-1.7.0; \ - make distclean; $(srcdir)/configure; make check + make distclean; $(srcdir)/configure --enable-std-cpp98; make check check_gtest18: cpputest_build_gtest18 @echo "Build using gmock 1.8" export GMOCK_HOME=`pwd`/cpputest_build_gtest18/googletest-release-1.8.0/googlemock; \ export GTEST_HOME=`pwd`/cpputest_build_gtest18/googletest-release-1.8.0/googletest; \ - make distclean; $(srcdir)/configure; make check + make distclean; $(srcdir)/configure --enable-std-cpp98; make check remove_gtest_directories: rm -rf cpputest_build_gtest15 diff --git a/include/CppUTestExt/GTest.h b/include/CppUTestExt/GTest.h index 811e49a10..47e61494b 100644 --- a/include/CppUTestExt/GTest.h +++ b/include/CppUTestExt/GTest.h @@ -44,6 +44,8 @@ #include "CppUTest/MemoryLeakDetectorMallocMacros.h" #endif +extern void CppuTestGTestIgnoreLeaksInTest(); + #ifndef RUN_ALL_TESTS #define GTEST_VERSION_GTEST_1_7 #else diff --git a/src/CppUTestExt/GTest.cpp b/src/CppUTestExt/GTest.cpp new file mode 100644 index 000000000..900a1ddbb --- /dev/null +++ b/src/CppUTestExt/GTest.cpp @@ -0,0 +1,8 @@ + +#include "CppUTest/TestHarness.h" + +void CppuTestGTestIgnoreLeaksInTest() +{ + IGNORE_ALL_LEAKS_IN_TEST(); +} + diff --git a/tests/CppUTestExt/GTest1Test.cpp b/tests/CppUTestExt/GTest1Test.cpp index ae787ba2c..77e037fe2 100644 --- a/tests/CppUTestExt/GTest1Test.cpp +++ b/tests/CppUTestExt/GTest1Test.cpp @@ -73,6 +73,9 @@ static void crashMe () TEST(GTestSimpleTest, GTestDeathTest) { +#if defined(GTEST_VERSION_GTEST_1_7) + CppuTestGTestIgnoreLeaksInTest(); +#endif ASSERT_DEATH(crashMe(), "Crash me!"); } From 6925f0dcb2fef79b2058c071f66094e1ebe8e808 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 17 Apr 2020 16:40:15 +0800 Subject: [PATCH 0296/1093] Added GTest.cpp to as many project files as I could find --- CppUTest.dsp | 4 ++++ CppUTest.mak | 1 + CppUTest.vcproj | 22 +++++++++++++++++++ CppUTest.vcxproj | 3 ++- platforms/CCStudio/CppUTest.pjt | 1 + .../CCStudio/CppUTestExtRunAllTests1.pjt | 1 + .../CCStudio/CppUTestExtRunAllTests2.pjt | 1 + platforms/Eclipse-Cygwin/.project | 5 +++++ platforms/iar/CppUTestExt.ewp | 3 +++ src/CppUTestExt/CMakeLists.txt | 1 + 10 files changed, 41 insertions(+), 1 deletion(-) diff --git a/CppUTest.dsp b/CppUTest.dsp index f13f8216e..a454fad93 100644 --- a/CppUTest.dsp +++ b/CppUTest.dsp @@ -90,6 +90,10 @@ SOURCE=.\src\CppUTestExt\CodeMemoryReportFormatter.cpp # End Source File # Begin Source File +SOURCE=.\src\CppUTestExt\GTest.cpp +# End Source File +# Begin Source File + SOURCE=.\src\CppUTestExt\MemoryReportAllocator.cpp # End Source File # Begin Source File diff --git a/CppUTest.mak b/CppUTest.mak index 52b1aca6a..21d6373b5 100644 --- a/CppUTest.mak +++ b/CppUTest.mak @@ -41,6 +41,7 @@ ALL : "$(OUTDIR)\CppUTest.lib" CLEAN : -@erase "$(INTDIR)\CodeMemoryReportFormatter.obj" + -@erase "$(INTDIR)\GTest.obj" -@erase "$(INTDIR)\CommandLineArguments.obj" -@erase "$(INTDIR)\CommandLineTestRunner.obj" -@erase "$(INTDIR)\JUnitTestOutput.obj" diff --git a/CppUTest.vcproj b/CppUTest.vcproj index c0edc3813..ceabd5c33 100644 --- a/CppUTest.vcproj +++ b/CppUTest.vcproj @@ -182,6 +182,28 @@ /> + + + + + + + + diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index 5d850923e..932c3988f 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -211,6 +211,7 @@ + @@ -295,4 +296,4 @@ - \ No newline at end of file + diff --git a/platforms/CCStudio/CppUTest.pjt b/platforms/CCStudio/CppUTest.pjt index 60a338dd8..3186c6109 100644 --- a/platforms/CCStudio/CppUTest.pjt +++ b/platforms/CCStudio/CppUTest.pjt @@ -30,6 +30,7 @@ Source="..\..\src\CppUTest\TestResult.cpp" Source="..\..\src\CppUTest\TestTestingFixture.cpp" Source="..\..\src\CppUTest\Utest.cpp" Source="..\..\src\CppUTestExt\CodeMemoryReportFormatter.cpp" +Source="..\..\src\CppUTestExt\GTest.cpp" Source="..\..\src\CppUTestExt\MemoryReportAllocator.cpp" Source="..\..\src\CppUTestExt\MemoryReporterPlugin.cpp" Source="..\..\src\CppUTestExt\MemoryReportFormatter.cpp" diff --git a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt index d48d4aaec..4161d35c3 100644 --- a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt +++ b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt @@ -30,6 +30,7 @@ Source="..\..\src\CppUTest\TestResult.cpp" Source="..\..\src\CppUTest\TestTestingFixture.cpp" Source="..\..\src\CppUTest\Utest.cpp" Source="..\..\src\CppUTestExt\CodeMemoryReportFormatter.cpp" +Source="..\..\src\CppUTestExt\GTest.cpp" Source="..\..\src\CppUTestExt\MemoryReportAllocator.cpp" Source="..\..\src\CppUTestExt\MemoryReporterPlugin.cpp" Source="..\..\src\CppUTestExt\MemoryReportFormatter.cpp" diff --git a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt index b97646249..66cf04e2d 100644 --- a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt +++ b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt @@ -30,6 +30,7 @@ Source="..\..\src\CppUTest\TestResult.cpp" Source="..\..\src\CppUTest\TestTestingFixture.cpp" Source="..\..\src\CppUTest\Utest.cpp" Source="..\..\src\CppUTestExt\CodeMemoryReportFormatter.cpp" +Source="..\..\src\CppUTestExt\GTest.cpp" Source="..\..\src\CppUTestExt\MemoryReportAllocator.cpp" Source="..\..\src\CppUTestExt\MemoryReporterPlugin.cpp" Source="..\..\src\CppUTestExt\MemoryReportFormatter.cpp" diff --git a/platforms/Eclipse-Cygwin/.project b/platforms/Eclipse-Cygwin/.project index 634bea6fa..d43f49d90 100644 --- a/platforms/Eclipse-Cygwin/.project +++ b/platforms/Eclipse-Cygwin/.project @@ -1564,6 +1564,11 @@ 1 PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/src/CppUTestExt/CodeMemoryReportFormatter.cpp + + src/CppUTestExt/GTest.cpp + 1 + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/src/CppUTestExt/GTest.cpp + src/CppUTestExt/MemoryReportAllocator.cpp 1 diff --git a/platforms/iar/CppUTestExt.ewp b/platforms/iar/CppUTestExt.ewp index 6db632015..baafa6ab2 100644 --- a/platforms/iar/CppUTestExt.ewp +++ b/platforms/iar/CppUTestExt.ewp @@ -1927,6 +1927,9 @@ $PROJ_DIR$\..\..\src\CppUTestExt\CodeMemoryReportFormatter.cpp + + $PROJ_DIR$\..\..\src\CppUTestExt\GTest.cpp + $PROJ_DIR$\..\..\src\CppUTestExt\IEEE754ExceptionsPlugin.cpp diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index 01fcf70e7..bd02f2af6 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -1,5 +1,6 @@ set(CppUTestExt_src CodeMemoryReportFormatter.cpp + GTest.cpp IEEE754ExceptionsPlugin.cpp MemoryReporterPlugin.cpp MockFailure.cpp From 027b484ad69ae453088d8ab75d814a6a891daf39 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 18 Apr 2020 11:13:00 +0800 Subject: [PATCH 0297/1093] Splitted in more binaries and then it seems to work --- platforms/Dos/Makefile | 4 +-- platforms/Dos/sources.mk | 67 ++++++++++++++++++++++++++++++---------- 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/platforms/Dos/Makefile b/platforms/Dos/Makefile index cd3c0aa46..525b9c0aa 100644 --- a/platforms/Dos/Makefile +++ b/platforms/Dos/Makefile @@ -30,8 +30,8 @@ CXXFLAGS := $(CFLAGS) -xds .PHONY: all clean all: CPPU.LIB CPPUX.LIB \ - CPPU1.EXE CPPU2.EXE CPPU3.EXE \ - CPPUX1.EXE CPPUX2.EXE CPPUX3.EXE CPPUX4.EXE + CPPU1.EXE CPPU2.EXE CPPU3.EXE CPPU4.EXE CPPU5.EXE CPPU6.EXE CPPU7.EXE CPPU8.EXE \ + CPPUX1.EXE CPPUX2.EXE CPPUX3.EXE CPPUX4.EXE CPPUX5.EXE CPPUX6.EXE CPPUX7.EXE CPPUX8.EXE CPPUX9.EXE clean: rm -rf ../src/CppUTest/*.o ../src/CppUTestExt/*.o \ diff --git a/platforms/Dos/sources.mk b/platforms/Dos/sources.mk index 46a3cd6fe..3021cf840 100644 --- a/platforms/Dos/sources.mk +++ b/platforms/Dos/sources.mk @@ -34,7 +34,7 @@ CPPUX_OBJECTS := \ $(CPPUTEST_HOME)/src/CppUTestExt/OrderedTest.o \ $(CPPUTEST_HOME)/src/CppUTestExt/MemoryReportFormatter.o \ $(CPPUTEST_HOME)/src/CppUTestExt/MockExpectedCallsList.o \ - $(CPPUTEST_HOME)/src/CppUTestExt/MockSupport.o \ + $(CPPUTEST_HOME)/src/CppUTestExt/MockSupport.o CPPU1_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ @@ -43,7 +43,10 @@ CPPU1_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/CheatSheetTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/CommandLineArgumentsTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/CommandLineTestRunnerTest.o \ - $(CPPUTEST_HOME)/tests/CppUTest/JUnitOutputTest.o \ + $(CPPUTEST_HOME)/tests/CppUTest/JUnitOutputTest.o + +CPPU2_OBJECTS := \ + $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTest/DummyMemoryLeakDetector.o \ $(CPPUTEST_HOME)/tests/CppUTest/MemoryLeakWarningTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/PluginTest.o \ @@ -55,25 +58,37 @@ CPPU1_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/TestFailureTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/TestResultTest.o \ -CPPU2_OBJECTS := \ +CPPU3_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTest/MemoryLeakDetectorTest.o \ - $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringTest.o \ + $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringTest.o + +CPPU4_OBJECTS := \ + $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTest/TestOutputTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/TestRegistryTest.o \ -CPPU3_OBJECTS := \ +CPPU5_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTest/AllocationInCFile.o \ $(CPPUTEST_HOME)/tests/CppUTest/AllocationInCppFile.o \ $(CPPUTEST_HOME)/tests/CppUTest/MemoryOperatorOverloadTest.o \ - $(CPPUTEST_HOME)/tests/CppUTest/TeamCityOutputTest.o \ + $(CPPUTEST_HOME)/tests/CppUTest/TeamCityOutputTest.o + +CPPU6_OBJECTS := \ + $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTest/TestFilterTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/TestHarness_cTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/TestHarness_cTestCFile.o \ - $(CPPUTEST_HOME)/tests/CppUTest/TestInstallerTest.o \ + $(CPPUTEST_HOME)/tests/CppUTest/TestInstallerTest.o + +CPPU7_OBJECTS := \ + $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTest/TestMemoryAllocatorTest.o \ - $(CPPUTEST_HOME)/tests/CppUTest/TestUTestMacro.o \ + $(CPPUTEST_HOME)/tests/CppUTest/TestUTestMacro.o + +CPPU8_OBJECTS := \ + $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTest/UtestPlatformTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/UtestTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/TestUTestStringMacro.o \ @@ -84,7 +99,11 @@ CPPUX1_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/ExpectedFunctionsListTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/GMockTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/GTest1Test.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/GTest2ConvertorTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/GTest2ConvertorTest.o + +CPPUX2_OBJECTS := \ + $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MemoryReportAllocatorTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MemoryReportFormatterTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MemoryReporterPluginTest.o \ @@ -92,35 +111,51 @@ CPPUX1_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockCheatSheetTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockComparatorCopierTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockExpectedCallTest.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/MockHierarchyTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockHierarchyTest.o -CPPUX2_OBJECTS := \ +CPPUX3_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/CodeMemoryReporterTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/OrderedTestTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/OrderedTestTest_c.o \ + +CPPUX4_OBJECTS := \ + $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockReturnValueTest.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/MockNamedValueTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockNamedValueTest.o + +CPPUX5_OBJECTS := \ + $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockPluginTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockSupport_cTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockSupport_cTestCFile.o \ -CPPUX3_OBJECTS := \ +CPPUX6_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/ExpectedFunctionsListTest.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/MockCallTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockCallTest.o + +CPPUX7_OBJECTS := \ + $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockComparatorCopierTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockHierarchyTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockParameterTest.o \ -CPPUX4_OBJECTS := \ +CPPUX8_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/IEEE754PluginTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/IEEE754PluginTest_c.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/MockComparatorCopierTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockComparatorCopierTest.o + +CPPUX9_OBJECTS := \ + $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockHierarchyTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockPluginTest.o \ From 448b33c118260c01e059150b753feebb157d8537 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 18 Apr 2020 11:28:35 +0800 Subject: [PATCH 0298/1093] Removed the GTest support function in a separate file. Can be used to bridge Cpputest space and GTest space --- include/CppUTestExt/GTest.h | 2 +- include/CppUTestExt/GTestSupport.h | 33 ++++++++++++++++++++++++++++++ src/CppUTestExt/GTest.cpp | 1 + 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 include/CppUTestExt/GTestSupport.h diff --git a/include/CppUTestExt/GTest.h b/include/CppUTestExt/GTest.h index 47e61494b..1d3a7d124 100644 --- a/include/CppUTestExt/GTest.h +++ b/include/CppUTestExt/GTest.h @@ -44,7 +44,7 @@ #include "CppUTest/MemoryLeakDetectorMallocMacros.h" #endif -extern void CppuTestGTestIgnoreLeaksInTest(); +#include "CppUTestExt/GTestSupport.h" #ifndef RUN_ALL_TESTS #define GTEST_VERSION_GTEST_1_7 diff --git a/include/CppUTestExt/GTestSupport.h b/include/CppUTestExt/GTestSupport.h new file mode 100644 index 000000000..9cbb27bb5 --- /dev/null +++ b/include/CppUTestExt/GTestSupport.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2011, 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 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 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. + */ + +#ifndef GTESTSUPPORT__H_ +#define GTESTSUPPORT__H_ + +extern void CppuTestGTestIgnoreLeaksInTest(); + +#endif diff --git a/src/CppUTestExt/GTest.cpp b/src/CppUTestExt/GTest.cpp index 900a1ddbb..919866c39 100644 --- a/src/CppUTestExt/GTest.cpp +++ b/src/CppUTestExt/GTest.cpp @@ -1,5 +1,6 @@ #include "CppUTest/TestHarness.h" +#include "CppUTestExt/GTestSupport.h" void CppuTestGTestIgnoreLeaksInTest() { From 5969f21b3f7051230b88946e297be9520377714a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 18 Apr 2020 12:05:42 +0800 Subject: [PATCH 0299/1093] Added new file to as many project files as possible --- CppUTest.vcproj | 4 ++++ CppUTest.vcxproj | 1 + Makefile.am | 1 + platforms/Eclipse-Cygwin/.project | 5 +++++ src/CppUTestExt/CMakeLists.txt | 1 + 5 files changed, 12 insertions(+) diff --git a/CppUTest.vcproj b/CppUTest.vcproj index ceabd5c33..1ea73723f 100644 --- a/CppUTest.vcproj +++ b/CppUTest.vcproj @@ -905,6 +905,10 @@ RelativePath=".\include\CppUTestExt\GTest.h" > + + diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index 932c3988f..81c69d384 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -249,6 +249,7 @@ + diff --git a/Makefile.am b/Makefile.am index 35fc19d5c..fa3f7624b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -111,6 +111,7 @@ include_cpputestextdir = $(includedir)/CppUTestExt include_cpputestext_HEADERS = \ include/CppUTestExt/GMock.h \ include/CppUTestExt/GTest.h \ + include/CppUTestExt/GTestSupport.h \ include/CppUTestExt/GTestConvertor.h \ include/CppUTestExt/IEEE754ExceptionsPlugin.h \ include/CppUTestExt/MemoryReportAllocator.h \ diff --git a/platforms/Eclipse-Cygwin/.project b/platforms/Eclipse-Cygwin/.project index d43f49d90..1ba52cb7c 100644 --- a/platforms/Eclipse-Cygwin/.project +++ b/platforms/Eclipse-Cygwin/.project @@ -1094,6 +1094,11 @@ 1 PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/include/CppUTestExt/GMock.h + + include/CppUTestExt/GTestSupport.h + 1 + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/include/CppUTestExt/GTestSupport.h + include/CppUTestExt/GTest.h 1 diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index bd02f2af6..72507f8a5 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -30,6 +30,7 @@ set(CppUTestExt_headers ${CppUTestRootDirectory}/include/CppUTestExt/MockSupport_c.h ${CppUTestRootDirectory}/include/CppUTestExt/GMock.h ${CppUTestRootDirectory}/include/CppUTestExt/GTest.h + ${CppUTestRootDirectory}/include/CppUTestExt/GTestSupport.h ${CppUTestRootDirectory}/include/CppUTestExt/MemoryReporterPlugin.h ${CppUTestRootDirectory}/include/CppUTestExt/OrderedTest.h ${CppUTestRootDirectory}/include/CppUTestExt/GTestConvertor.h From 82af537d5b9815c1bc388eba14498339d4ab9bfd Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 20 Apr 2020 11:31:30 +0800 Subject: [PATCH 0300/1093] Added macro for checking compiler version --- m4/m4_ax_compiler_version.m4 | 529 +++++++++++++++++++++++++++++++++++ 1 file changed, 529 insertions(+) create mode 100644 m4/m4_ax_compiler_version.m4 diff --git a/m4/m4_ax_compiler_version.m4 b/m4/m4_ax_compiler_version.m4 new file mode 100644 index 000000000..0581d1bc0 --- /dev/null +++ b/m4/m4_ax_compiler_version.m4 @@ -0,0 +1,529 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_compiler_version.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_COMPILER_VERSION +# +# DESCRIPTION +# +# This macro retrieves the compiler version and returns it in the cache +# variable $ax_cv_c_compiler_version for C and $ax_cv_cxx_compiler_version +# for C++. +# +# Version is returned as epoch:major.minor.patchversion +# +# Epoch is used in order to have an increasing version number in case of +# marketing change. +# +# Epoch use: * borland compiler use chronologically 0turboc for turboc +# era, +# +# 1borlanc BORLANDC++ before 5, 2cppbuilder for cppbuilder era, +# 3borlancpp for return of BORLANDC++ (after version 5.5), +# 4cppbuilder for cppbuilder with year version, +# and 5xe for XE era. +# +# An empty string is returned otherwise. +# +# LICENSE +# +# Copyright (c) 2014 Bastien ROUCARIES +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 12 + +# for intel +AC_DEFUN([_AX_COMPILER_VERSION_INTEL], + [ dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + [__INTEL_COMPILER/100],, + AC_MSG_FAILURE([[[$0]] unknown intel compiler version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + [(__INTEL_COMPILER%100)/10],, + AC_MSG_FAILURE([[[$0]] unknown intel compiler version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [(__INTEL_COMPILER%10)],, + AC_MSG_FAILURE([[[$0]] unknown intel compiler version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# for IBM +AC_DEFUN([_AX_COMPILER_VERSION_IBM], + [ dnl + dnl check between z/OS C/C++ and XL C/C++ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([], + [ + #if defined(__COMPILER_VER__) + choke me; + #endif + ])], + [ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + [__xlC__/100],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler major version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + [__xlC__%100],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__xlC_ver__/0x100],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_build, + [__xlC_ver__%0x100],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler build version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_build" + ], + [ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__xlC__%1000],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + [(__xlC__/10000)%10],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + [(__xlC__/100000)%10],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) +]) + +# for pathscale +AC_DEFUN([_AX_COMPILER_VERSION_PATHSCALE],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + __PATHCC__,, + AC_MSG_FAILURE([[[$0]] unknown pathscale major])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + __PATHCC_MINOR__,, + AC_MSG_FAILURE([[[$0]] unknown pathscale minor])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__PATHCC_PATCHLEVEL__],, + AC_MSG_FAILURE([[[$0]] unknown pathscale patch level])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# for clang +AC_DEFUN([_AX_COMPILER_VERSION_CLANG],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + __clang_major__,, + AC_MSG_FAILURE([[[$0]] unknown clang major])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + __clang_minor__,, + AC_MSG_FAILURE([[[$0]] unknown clang minor])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__clang_patchlevel__],,0) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# for crayc +AC_DEFUN([_AX_COMPILER_VERSION_CRAY],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + _RELEASE,, + AC_MSG_FAILURE([[[$0]] unknown crayc release])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + _RELEASE_MINOR,, + AC_MSG_FAILURE([[[$0]] unknown crayc minor])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor" + ]) + +# for fujitsu +AC_DEFUN([_AX_COMPILER_VERSION_FUJITSU],[ + AC_COMPUTE_INT(ax_cv_[]_AC_LANG_ABBREV[]_compiler_version, + __FCC_VERSION,, + AC_MSG_FAILURE([[[$0]]unknown fujitsu release])) + ]) + +# for GNU +AC_DEFUN([_AX_COMPILER_VERSION_GNU],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + __GNUC__,, + AC_MSG_FAILURE([[[$0]] unknown gcc major])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + __GNUC_MINOR__,, + AC_MSG_FAILURE([[[$0]] unknown gcc minor])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__GNUC_PATCHLEVEL__],, + AC_MSG_FAILURE([[[$0]] unknown gcc patch level])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# For sun +AC_DEFUN([_AX_COMPILER_VERSION_SUN],[ + m4_define([_AX_COMPILER_VERSION_SUN_NUMBER], + [ + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + ]) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_until59, + !!(_AX_COMPILER_VERSION_SUN_NUMBER < 0x1000),, + AC_MSG_FAILURE([[[$0]] unknown sun release version])) + AS_IF([test "X$_ax_[]_AC_LANG_ABBREV[]_compiler_version_until59" = X1], + [dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + _AX_COMPILER_VERSION_SUN_NUMBER % 0x10,, + AC_MSG_FAILURE([[[$0]] unknown sun patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + (_AX_COMPILER_VERSION_SUN_NUMBER / 0x10) % 0x10,, + AC_MSG_FAILURE([[[$0]] unknown sun minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + (_AX_COMPILER_VERSION_SUN_NUMBER / 0x100),, + AC_MSG_FAILURE([[[$0]] unknown sun major version])) + ], + [dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + _AX_COMPILER_VERSION_SUN_NUMBER % 0x10,, + AC_MSG_FAILURE([[[$0]] unknown sun patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + (_AX_COMPILER_VERSION_SUN_NUMBER / 0x100) % 0x100,, + AC_MSG_FAILURE([[[$0]] unknown sun minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + (_AX_COMPILER_VERSION_SUN_NUMBER / 0x1000),, + AC_MSG_FAILURE([[[$0]] unknown sun major version])) + ]) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" +]) + +AC_DEFUN([_AX_COMPILER_VERSION_HP],[ + m4_define([_AX_COMPILER_VERSION_HP_NUMBER], + [ + #if defined(__HP_cc) + __HP_cc + #else + __HP_aCC + #endif + ]) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_untilA0121, + !!(_AX_COMPILER_VERSION_HP_NUMBER <= 1),, + AC_MSG_FAILURE([[[$0]] unknown hp release version])) + AS_IF([test "X$_ax_[]_AC_LANG_ABBREV[]_compiler_version_untilA0121" = X1], + [dnl By default output last version with this behavior. + dnl it is so old + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="01.21.00" + ], + [dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + (_AX_COMPILER_VERSION_HP_NUMBER % 100),, + AC_MSG_FAILURE([[[$0]] unknown hp release version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + ((_AX_COMPILER_VERSION_HP_NUMBER / 100)%100),, + AC_MSG_FAILURE([[[$0]] unknown hp minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + ((_AX_COMPILER_VERSION_HP_NUMBER / 10000)%100),, + AC_MSG_FAILURE([[[$0]] unknown hp major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) +]) + +AC_DEFUN([_AX_COMPILER_VERSION_DEC],[dnl + m4_define([_AX_COMPILER_VERSION_DEC_NUMBER], + [ + #if defined(__DECC_VER) + __DECC_VER + #else + __DECCXX_VER + #endif + ]) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + (_AX_COMPILER_VERSION_DEC_NUMBER % 10000),, + AC_MSG_FAILURE([[[$0]] unknown dec release version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + ((_AX_COMPILER_VERSION_DEC_NUMBER / 100000UL)%100),, + AC_MSG_FAILURE([[[$0]] unknown dec minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + ((_AX_COMPILER_VERSION_DEC_NUMBER / 10000000UL)%100),, + AC_MSG_FAILURE([[[$0]] unknown dec major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# borland +AC_DEFUN([_AX_COMPILER_VERSION_BORLAND],[dnl + m4_define([_AX_COMPILER_VERSION_TURBOC_NUMBER], + [ + #if defined(__TURBOC__) + __TURBOC__ + #else + choke me + #endif + ]) + m4_define([_AX_COMPILER_VERSION_BORLANDC_NUMBER], + [ + #if defined(__BORLANDC__) + __BORLANDC__ + #else + __CODEGEARC__ + #endif + ]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM(, + _AX_COMPILER_VERSION_TURBOC_NUMBER)], + [dnl TURBOC + AC_COMPUTE_INT( + _ax_[]_AC_LANG_ABBREV[]_compiler_version_turboc_raw, + _AX_COMPILER_VERSION_TURBOC_NUMBER,, + AC_MSG_FAILURE([[[$0]] unknown turboc version])) + AS_IF( + [test $_ax_[]_AC_LANG_ABBREV[]_compiler_version_turboc_raw -lt 661 || test $_ax_[]_AC_LANG_ABBREV[]_compiler_version_turboc_raw -gt 1023], + [dnl compute normal version + AC_COMPUTE_INT( + _ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + _AX_COMPILER_VERSION_TURBOC_NUMBER % 0x100,, + AC_MSG_FAILURE([[[$0]] unknown turboc minor version])) + AC_COMPUTE_INT( + _ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + (_AX_COMPILER_VERSION_TURBOC_NUMBER/0x100)%0x100,, + AC_MSG_FAILURE([[[$0]] unknown turboc major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="0turboc:$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor"], + [dnl special version + AS_CASE([$_ax_[]_AC_LANG_ABBREV[]_compiler_version_turboc_raw], + [661],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="0turboc:1.00"], + [662],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="0turboc:1.01"], + [663],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="0turboc:2.00"], + [ + AC_MSG_WARN([[[$0]] unknown turboc version between 0x295 and 0x400 please report bug]) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="" + ]) + ]) + ], + # borlandc + [ + AC_COMPUTE_INT( + _ax_[]_AC_LANG_ABBREV[]_compiler_version_borlandc_raw, + _AX_COMPILER_VERSION_BORLANDC_NUMBER,, + AC_MSG_FAILURE([[[$0]] unknown borlandc version])) + AS_CASE([$_ax_[]_AC_LANG_ABBREV[]_compiler_version_borlandc_raw], + dnl BORLANDC++ before 5.5 + [512] ,[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:2.00"], + [1024],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:3.00"], + [1024],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:3.00"], + [1040],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:3.1"], + [1106],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:4.0"], + [1280],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:5.0"], + [1312],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:5.02"], + dnl C++ Builder era + [1328],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="2cppbuilder:3.0"], + [1344],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="2cppbuilder:4.0"], + dnl BORLANDC++ after 5.5 + [1360],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="3borlancpp:5.5"], + [1361],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="3borlancpp:5.51"], + [1378],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="3borlancpp:5.6.4"], + dnl C++ Builder with year number + [1392],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="4cppbuilder:2006"], + [1424],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="4cppbuilder:2007"], + [1555],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="4cppbuilder:2009"], + [1569],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="4cppbuilder:2010"], + dnl XE version + [1584],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="5xe"], + [1600],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="5xe:2"], + [1616],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="5xe:3"], + [1632],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="5xe:4"], + [ + AC_MSG_WARN([[[$0]] Unknown borlandc compiler version $_ax_[]_AC_LANG_ABBREV[]_compiler_version_borlandc_raw please report bug]) + ]) + ]) + ]) + +# COMO +AC_DEFUN([_AX_COMPILER_VERSION_COMEAU], + [ dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + [__COMO_VERSION__%100],, + AC_MSG_FAILURE([[[$0]] unknown comeau compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + [(__COMO_VERSION__/100)%10],, + AC_MSG_FAILURE([[[$0]] unknown comeau compiler major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor" + ]) + +# KAI +AC_DEFUN([_AX_COMPILER_VERSION_KAI],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__KCC_VERSION%100],, + AC_MSG_FAILURE([[[$0]] unknown kay compiler patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + [(__KCC_VERSION/100)%10],, + AC_MSG_FAILURE([[[$0]] unknown kay compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + [(__KCC_VERSION/1000)%10],, + AC_MSG_FAILURE([[[$0]] unknown kay compiler major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +dnl LCC +dnl LCC does not output version... + +# SGI +AC_DEFUN([_AX_COMPILER_VERSION_SGI],[ + m4_define([_AX_COMPILER_VERSION_SGI_NUMBER], + [ + #if defined(_COMPILER_VERSION) + _COMPILER_VERSION + #else + _SGI_COMPILER_VERSION + #endif + ]) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [_AX_COMPILER_VERSION_SGI_NUMBER%10],, + AC_MSG_FAILURE([[[$0]] unknown SGI compiler patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + [(_AX_COMPILER_VERSION_SGI_NUMBER/10)%10],, + AC_MSG_FAILURE([[[$0]] unknown SGI compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + [(_AX_COMPILER_VERSION_SGI_NUMBER/100)%10],, + AC_MSG_FAILURE([[[$0]] unknown SGI compiler major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# microsoft +AC_DEFUN([_AX_COMPILER_VERSION_MICROSOFT],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + _MSC_VER%100,, + AC_MSG_FAILURE([[[$0]] unknown microsoft compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + (_MSC_VER/100)%100,, + AC_MSG_FAILURE([[[$0]] unknown microsoft compiler major version])) + dnl could be overridden + _ax_[]_AC_LANG_ABBREV[]_compiler_version_patch=0 + _ax_[]_AC_LANG_ABBREV[]_compiler_version_build=0 + # special case for version 6 + AS_IF([test "X$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major" = "X12"], + [AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + _MSC_FULL_VER%1000,, + _ax_[]_AC_LANG_ABBREV[]_compiler_version_patch=0)]) + # for version 7 + AS_IF([test "X$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major" = "X13"], + [AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + _MSC_FULL_VER%1000,, + AC_MSG_FAILURE([[[$0]] unknown microsoft compiler patch version])) + ]) + # for version > 8 + AS_IF([test $_ax_[]_AC_LANG_ABBREV[]_compiler_version_major -ge 14], + [AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + _MSC_FULL_VER%10000,, + AC_MSG_FAILURE([[[$0]] unknown microsoft compiler patch version])) + ]) + AS_IF([test $_ax_[]_AC_LANG_ABBREV[]_compiler_version_major -ge 15], + [AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_build, + _MSC_BUILD,, + AC_MSG_FAILURE([[[$0]] unknown microsoft compiler build version])) + ]) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_build" + ]) + +# for metrowerks +AC_DEFUN([_AX_COMPILER_VERSION_METROWERKS],[dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + __MWERKS__%0x100,, + AC_MSG_FAILURE([[[$0]] unknown metrowerks compiler patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + (__MWERKS__/0x100)%0x10,, + AC_MSG_FAILURE([[[$0]] unknown metrowerks compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + (__MWERKS__/0x1000)%0x10,, + AC_MSG_FAILURE([[[$0]] unknown metrowerks compiler major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# for watcom +AC_DEFUN([_AX_COMPILER_VERSION_WATCOM],[dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + __WATCOMC__%100,, + AC_MSG_FAILURE([[[$0]] unknown watcom compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + (__WATCOMC__/100)%100,, + AC_MSG_FAILURE([[[$0]] unknown watcom compiler major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor" + ]) + +# for PGI +AC_DEFUN([_AX_COMPILER_VERSION_PORTLAND],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + __PGIC__,, + AC_MSG_FAILURE([[[$0]] unknown pgi major])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + __PGIC_MINOR__,, + AC_MSG_FAILURE([[[$0]] unknown pgi minor])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__PGIC_PATCHLEVEL__],, + AC_MSG_FAILURE([[[$0]] unknown pgi patch level])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# tcc +AC_DEFUN([_AX_COMPILER_VERSION_TCC],[ + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version=[`tcc -v | $SED 's/^[ ]*tcc[ ]\+version[ ]\+\([0-9.]\+\).*/\1/g'`] + ]) + +# for GNU +AC_DEFUN([_AX_COMPILER_VERSION_SDCC],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + /* avoid parse error with comments */ + #if(defined(__SDCC_VERSION_MAJOR)) + __SDCC_VERSION_MAJOR + #else + SDCC/100 + #endif + ,, + AC_MSG_FAILURE([[[$0]] unknown sdcc major])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + /* avoid parse error with comments */ + #if(defined(__SDCC_VERSION_MINOR)) + __SDCC_VERSION_MINOR + #else + (SDCC%100)/10 + #endif + ,, + AC_MSG_FAILURE([[[$0]] unknown sdcc minor])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [ + /* avoid parse error with comments */ + #if(defined(__SDCC_VERSION_PATCH)) + __SDCC_VERSION_PATCH + #elsif(defined(_SDCC_VERSION_PATCHLEVEL)) + __SDCC_VERSION_PATCHLEVEL + #else + SDCC%10 + #endif + ],, + AC_MSG_FAILURE([[[$0]] unknown sdcc patch level])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# main entry point +AC_DEFUN([AX_COMPILER_VERSION],[dnl + AC_REQUIRE([AX_COMPILER_VENDOR]) + AC_REQUIRE([AC_PROG_SED]) + AC_CACHE_CHECK([for _AC_LANG compiler version], + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version, + [ dnl + AS_CASE([$ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor], + [intel],[_AX_COMPILER_VERSION_INTEL], + [ibm],[_AX_COMPILER_VERSION_IBM], + [pathscale],[_AX_COMPILER_VERSION_PATHSCALE], + [clang],[_AX_COMPILER_VERSION_CLANG], + [cray],[_AX_COMPILER_VERSION_CRAY], + [fujitsu],[_AX_COMPILER_VERSION_FUJITSU], + [gnu],[_AX_COMPILER_VERSION_GNU], + [sun],[_AX_COMPILER_VERSION_SUN], + [hp],[_AX_COMPILER_VERSION_HP], + [dec],[_AX_COMPILER_VERSION_DEC], + [borland],[_AX_COMPILER_VERSION_BORLAND], + [comeau],[_AX_COMPILER_VERSION_COMEAU], + [kai],[_AX_COMPILER_VERSION_KAI], + [sgi],[_AX_COMPILER_VERSION_SGI], + [microsoft],[_AX_COMPILER_VERSION_MICROSOFT], + [metrowerks],[_AX_COMPILER_VERSION_METROWERKS], + [watcom],[_AX_COMPILER_VERSION_WATCOM], + [portland],[_AX_COMPILER_VERSION_PORTLAND], + [tcc],[_AX_COMPILER_VERSION_TCC], + [sdcc],[_AX_COMPILER_VERSION_SDCC], + [ax_cv_[]_AC_LANG_ABBREV[]_compiler_version=""]) + ]) +]) From 8e6a399ca65c04e29f09698223388c5a39b9378f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 20 Apr 2020 11:34:23 +0800 Subject: [PATCH 0301/1093] Compiler vendor m4 --- m4/m4_ax_compiler_vendor.m4 | 117 ++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 m4/m4_ax_compiler_vendor.m4 diff --git a/m4/m4_ax_compiler_vendor.m4 b/m4/m4_ax_compiler_vendor.m4 new file mode 100644 index 000000000..f06e86540 --- /dev/null +++ b/m4/m4_ax_compiler_vendor.m4 @@ -0,0 +1,117 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_COMPILER_VENDOR +# +# DESCRIPTION +# +# Determine the vendor of the C, C++ or Fortran compiler. The vendor is +# returned in the cache variable $ax_cv_c_compiler_vendor for C, +# $ax_cv_cxx_compiler_vendor for C++ or $ax_cv_fc_compiler_vendor for +# (modern) Fortran. The value is one of "intel", "ibm", "pathscale", +# "clang" (LLVM), "cray", "fujitsu", "sdcc", "sx", "portland" (PGI), "gnu" +# (GCC), "sun" (Oracle Developer Studio), "hp", "dec", "borland", +# "comeau", "kai", "lcc", "sgi", "microsoft", "metrowerks", "watcom", +# "tcc" (Tiny CC) or "unknown" (if the compiler cannot be determined). +# +# To check for a Fortran compiler, you must first call AC_FC_PP_SRCEXT +# with an appropriate preprocessor-enabled extension. For example: +# +# AC_LANG_PUSH([Fortran]) +# AC_PROG_FC +# AC_FC_PP_SRCEXT([F]) +# AX_COMPILER_VENDOR +# AC_LANG_POP([Fortran]) +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2008 Matteo Frigo +# Copyright (c) 2018-19 John Zaitseff +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 30 + +AC_DEFUN([AX_COMPILER_VENDOR], [dnl + AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, [dnl + dnl If you modify this list of vendors, please add similar support + dnl to ax_compiler_version.m4 if at all possible. + dnl + dnl Note: Do NOT check for GCC first since some other compilers + dnl define __GNUC__ to remain compatible with it. Compilers that + dnl are very slow to start (such as Intel) are listed first. + + vendors=" + intel: __ICC,__ECC,__INTEL_COMPILER + ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__,__ibmxl__ + pathscale: __PATHCC__,__PATHSCALE__ + clang: __clang__ + cray: _CRAYC + fujitsu: __FUJITSU + sdcc: SDCC,__SDCC + sx: _SX + portland: __PGI + gnu: __GNUC__ + sun: __SUNPRO_C,__SUNPRO_CC,__SUNPRO_F90,__SUNPRO_F95 + hp: __HP_cc,__HP_aCC + dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER + borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ + comeau: __COMO__ + kai: __KCC + lcc: __LCC__ + sgi: __sgi,sgi + microsoft: _MSC_VER + metrowerks: __MWERKS__ + watcom: __WATCOMC__ + tcc: __TINYC__ + unknown: UNKNOWN + " + for ventest in $vendors; do + case $ventest in + *:) + vendor=$ventest + continue + ;; + *) + vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" + ;; + esac + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[ +#if !($vencpp) + thisisanerror; +#endif + ]])], [break]) + done + + ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1` + ]) +])dnl From 8a862cd0fb982a6c0086de925c4bbe8377317d8a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 20 Apr 2020 12:15:22 +0800 Subject: [PATCH 0302/1093] Added version reporting to the configure output --- configure.ac | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configure.ac b/configure.ac index 6c264cfe5..9c26bf6d6 100644 --- a/configure.ac +++ b/configure.ac @@ -34,6 +34,7 @@ AM_SILENT_RULES ACX_PTHREAD([LIBS="$PTHREAD_LIBS $LIBS"]) +AX_COMPILER_VERSION # This additional -lpthread was added due to a bug on gcc for MacOSX: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42159 # According to the bug report, a workaround is to link -lpthread. Even the ACX_PTHREAD doesn't do that, so we add an # additional check if that it possible, and if it is, then we link pthread @@ -561,6 +562,8 @@ ${PACKAGE_NAME} Version ${PACKAGE_VERSION} Current compiler options: CC: ${CC} CXX: ${CXX} + CC version: ${ax_cv_c_compiler_version} + CXX version: ${ax_cv_cxx_compiler_version} LD: ${LD} Default CFLAGS: ${CFLAGS} Default CXXFLAGS: ${CXXFLAGS} From 2e065af8f38f604acee757d78c531533c2b3165c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 20 Apr 2020 17:19:33 +0800 Subject: [PATCH 0303/1093] Added first version of docker files --- docker/Dockerfile.ubuntu | 14 ++++++++++++++ scripts/create_docker_images_and_containers | 3 +++ 2 files changed, 17 insertions(+) create mode 100644 docker/Dockerfile.ubuntu create mode 100755 scripts/create_docker_images_and_containers diff --git a/docker/Dockerfile.ubuntu b/docker/Dockerfile.ubuntu new file mode 100644 index 000000000..81ffce89e --- /dev/null +++ b/docker/Dockerfile.ubuntu @@ -0,0 +1,14 @@ +FROM ubuntu + +RUN apt-get update +RUN apt-get install -y -q file +RUN apt-get install -y -q git +RUN apt-get install -y -q gcc +RUN apt-get install -y -q g++ +RUN apt-get install -y -q make +RUN apt-get install -y -q automake +RUN apt-get install -y -q autoconf +RUN apt-get install -y -q libtool + +WORKDIR /cpputest_build + diff --git a/scripts/create_docker_images_and_containers b/scripts/create_docker_images_and_containers new file mode 100755 index 000000000..5cd56befb --- /dev/null +++ b/scripts/create_docker_images_and_containers @@ -0,0 +1,3 @@ + +docker build -f $CPPUTEST_HOME/docker/Dockerfile.ubuntu --tag cpputest/ubuntu:current . +docker create -v$CPPUTEST_HOME:/cpputest --name cpputest_ubuntu cpputest/ubuntu:current bash -l From 41ab11b2b347debac137b0a528937c327fd42f48 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 08:50:54 +0800 Subject: [PATCH 0304/1093] Updated the docker script and Dockerfile. Seems to work better now --- docker/Dockerfile.gcc10 | 14 ++++++++ docker/Dockerfile.ubuntu | 2 ++ scripts/create_docker_images_and_containers | 37 +++++++++++++++++++-- 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 docker/Dockerfile.gcc10 diff --git a/docker/Dockerfile.gcc10 b/docker/Dockerfile.gcc10 new file mode 100644 index 000000000..8f1b850f4 --- /dev/null +++ b/docker/Dockerfile.gcc10 @@ -0,0 +1,14 @@ +FROM okannen/gcc-10 + +RUN apt-get update +RUN apt-get install -y -q file +RUN apt-get install -y -q git +RUN apt-get install -y -q make +RUN apt-get install -y -q automake +RUN apt-get install -y -q autoconf +RUN apt-get install -y -q libtool +RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100 + +WORKDIR /cpputest_build + +CMD autoreconf -i ../cpputest && ../cpputest/configure && make tdd diff --git a/docker/Dockerfile.ubuntu b/docker/Dockerfile.ubuntu index 81ffce89e..1e39b92c0 100644 --- a/docker/Dockerfile.ubuntu +++ b/docker/Dockerfile.ubuntu @@ -12,3 +12,5 @@ RUN apt-get install -y -q libtool WORKDIR /cpputest_build +CMD autoreconf -i ../cpputest && ../cpputest/configure && make tdd + diff --git a/scripts/create_docker_images_and_containers b/scripts/create_docker_images_and_containers index 5cd56befb..ff0f14c30 100755 --- a/scripts/create_docker_images_and_containers +++ b/scripts/create_docker_images_and_containers @@ -1,3 +1,36 @@ +#!/bin/bash +#$1 is the container name + +checkForCppUTestToolsEnvVariable() { + if [ -z "$CPPUTEST_HOME" ] ; then + echo "CPPUTEST_HOME not set. You must set CPPUTEST_HOME to the top level CppUTest directory" + exit 1 + fi + if [ ! -d "$CPPUTEST_HOME" ] ; then + echo "CPPUTEST_HOME not set to a directory. You must set CPPUTEST_HOME to the top level CppUTest directory" + exit 2 + fi +} + +checkForImageNameParameter() { + if [ -z "$container" ] ; then + echo "Container name parameter not set. Check the docker directory. It should be the extension of the Dockerfile. e.g. ubuntu" + exit 1 + fi + if [ ! -f "$CPPUTEST_HOME/docker/Dockerfile.$container" ] ; then + echo "The Dockerfile docker/Dockerfile.$container doesn't exist. Typo?" + exit 2 + fi +} + + +container=$1 +checkForCppUTestToolsEnvVariable +checkForImageNameParameter + +docker build -f $CPPUTEST_HOME/docker/Dockerfile.$container --tag cpputest/$container:current . +docker container rm cpputest_$container +docker create -i -v$CPPUTEST_HOME:/cpputest --name cpputest_$container cpputest/$container:current + +echo "You can run your container through: docker start -i cpputest_. E.g. docker start -i cpputest_ubuntu -docker build -f $CPPUTEST_HOME/docker/Dockerfile.ubuntu --tag cpputest/ubuntu:current . -docker create -v$CPPUTEST_HOME:/cpputest --name cpputest_ubuntu cpputest/ubuntu:current bash -l From 404bc231066f4ccb86fcd8d82bddb1e38f5eea40 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 09:13:55 +0800 Subject: [PATCH 0305/1093] Included docker build into the travis build --- .travis.yml | 1 + scripts/travis_ci_build.sh | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ec626810c..46caa3e45 100644 --- a/.travis.yml +++ b/.travis.yml @@ -88,6 +88,7 @@ jobs: packages: - libc++-dev - valgrind + - env: BUILD=docker_ubuntu_autotools global: - secure: |- diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index bfbeb50de..9be8209ca 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -6,6 +6,7 @@ if [[ "$CXX" == clang* ]]; then export CXXFLAGS="-stdlib=libc++" fi +export CPPUTEST_HOME=$TRAVIS_BUILD_DIR if [ "x$BUILD" = "xautotools" ]; then autoreconf -i .. @@ -94,12 +95,16 @@ if [ "x$BUILD" = "xcmake_coverage" ]; then coveralls -b . -r .. -i "src" -i "include" --gcov-options="-lbc" || true fi +if [ "x$BUILD" = "xdocker_ubuntu_autotools" ]; then + $(CPPUTEST_HOME)/scripts/create_docker_images_and_containers ubuntu + docker start -i cpputest_ubuntu +fi + if [ "x$BUILD" = "xmake_dos" ]; then wget http://ftp.openwatcom.org/install/open-watcom-c-linux-1.9 -O /tmp/watcom.zip mkdir -p watcom && unzip -aqd watcom /tmp/watcom.zip && chmod -R +x watcom/binl export PATH=$PATH:$PWD/watcom/binl export WATCOM=$PWD/watcom - export CPPUTEST_HOME=$TRAVIS_BUILD_DIR export CC=wcl export CXX=wcl $CC --version From be22ddc63f7944771d5eb5f0223a10475aa69c4b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 09:27:58 +0800 Subject: [PATCH 0306/1093] Wrong variable format --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 9be8209ca..1c0c87761 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -96,7 +96,7 @@ if [ "x$BUILD" = "xcmake_coverage" ]; then fi if [ "x$BUILD" = "xdocker_ubuntu_autotools" ]; then - $(CPPUTEST_HOME)/scripts/create_docker_images_and_containers ubuntu + $CPPUTEST_HOME/scripts/create_docker_images_and_containers ubuntu docker start -i cpputest_ubuntu fi From e7ff247e8197c4ba308ddba90b373cb2ae11b650 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 09:41:31 +0800 Subject: [PATCH 0307/1093] Shame --- scripts/create_docker_images_and_containers | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/create_docker_images_and_containers b/scripts/create_docker_images_and_containers index ff0f14c30..b58efc775 100755 --- a/scripts/create_docker_images_and_containers +++ b/scripts/create_docker_images_and_containers @@ -32,5 +32,6 @@ docker build -f $CPPUTEST_HOME/docker/Dockerfile.$container --tag cpputest/$cont docker container rm cpputest_$container docker create -i -v$CPPUTEST_HOME:/cpputest --name cpputest_$container cpputest/$container:current -echo "You can run your container through: docker start -i cpputest_. E.g. docker start -i cpputest_ubuntu +echo "You can run your container through: docker start -i cpputest_. E.g. docker start -i cpputest_ubuntu" + From 137c79881064355564ee92b8621bb16eb702b14f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 09:54:23 +0800 Subject: [PATCH 0308/1093] gcc10 added to the build. Should fail because of bug --- scripts/travis_ci_build.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 1c0c87761..20864f661 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -100,6 +100,11 @@ if [ "x$BUILD" = "xdocker_ubuntu_autotools" ]; then docker start -i cpputest_ubuntu fi +if [ "x$BUILD" = "xdocker_ubuntu_gcc10" ]; then + $CPPUTEST_HOME/scripts/create_docker_images_and_containers gcc10 + docker start -i cpputest_gcc10 +fi + if [ "x$BUILD" = "xmake_dos" ]; then wget http://ftp.openwatcom.org/install/open-watcom-c-linux-1.9 -O /tmp/watcom.zip mkdir -p watcom && unzip -aqd watcom /tmp/watcom.zip && chmod -R +x watcom/binl From 5c4f7b9dc9fa71e70dcdb27774a0fdcad01ccb45 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 10:13:00 +0800 Subject: [PATCH 0309/1093] And the travis yaml file --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 46caa3e45..31ef6a454 100644 --- a/.travis.yml +++ b/.travis.yml @@ -89,6 +89,7 @@ jobs: - libc++-dev - valgrind - env: BUILD=docker_ubuntu_autotools + - env: BUILD=docker_ubuntu_gcc10 global: - secure: |- From b274656c27cc29f1183fcb4974090b26429fe26c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 10:34:29 +0800 Subject: [PATCH 0310/1093] Fixed bug related to optimizing away the operator new --- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index c62ac1cb1..6aecf0310 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -371,9 +371,16 @@ TEST(OutOfMemoryTestsForOperatorNew, FailingNewArrayOperatorReturnsNull) * We (Bas Vodde and Terry Yin) suspect that in a real product, you wouldn't be able to detect the optimization and it's breaking of Standard C++. Therefore, * for now, we keep this hack in the test to fool the optimizer and hope nobody will ever notice this 'optimizer behavior' in a real product. * + * Update 2020: The gcc compiler implemented the same optimization, but it seems to be slightly smarter and discovered that we assign to a static variable. + * Thus it still optimized away the call to operator new. Did another bug report, but it is unlikely to get fixed. You can find it at: + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94671 + * + * Changed the variable to be external so it would definitively be a mistake to optimize the call. + * */ -static char* some_memory; +extern char* some_memory; +char* some_memory; TEST(OutOfMemoryTestsForOperatorNew, FailingNewOperatorThrowsAnExceptionWhenUsingStdCppNewWithoutOverride) { From a93ca1939e2711bde2a2871b197e187a52c6185e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 11:16:06 +0800 Subject: [PATCH 0311/1093] Made the automake files line-ending automatic --- .gitattributes | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index b2b0cd5f5..2bdb94418 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15,6 +15,6 @@ *.vcxproj text eol=crlf -*.sh -crlf -*.ac -crlf -*.am -crlf +*.sh text +*.ac text +*.am text From 6743596e3ec75690c3865379ccf3d883bdc85faa Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 13:14:03 +0800 Subject: [PATCH 0312/1093] Better support for thread safe operator new overloads --- include/CppUTest/MemoryLeakWarningPlugin.h | 3 +- src/CppUTest/MemoryLeakWarningPlugin.cpp | 11 ++++- tests/CppUTest/MemoryLeakWarningTest.cpp | 57 ++++++++++++++++------ 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/include/CppUTest/MemoryLeakWarningPlugin.h b/include/CppUTest/MemoryLeakWarningPlugin.h index 97d31cf42..e511ed94d 100644 --- a/include/CppUTest/MemoryLeakWarningPlugin.h +++ b/include/CppUTest/MemoryLeakWarningPlugin.h @@ -65,8 +65,9 @@ class MemoryLeakWarningPlugin: public TestPlugin static void destroyGlobalDetector(); static void turnOffNewDeleteOverloads(); - static void turnOnNewDeleteOverloads(); + static void turnOnDefaultNotThreadSafeNewDeleteOverloads(); static void turnOnThreadSafeNewDeleteOverloads(); + static bool areNewDeleteOverloaded(); static void saveAndDisableNewDeleteOverloads(); static void restoreNewDeleteOverloads(); diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index d21ea2e9d..d97018182 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -426,7 +426,7 @@ void MemoryLeakWarningPlugin::turnOffNewDeleteOverloads() #endif } -void MemoryLeakWarningPlugin::turnOnNewDeleteOverloads() +void MemoryLeakWarningPlugin::turnOnDefaultNotThreadSafeNewDeleteOverloads() { #if CPPUTEST_USE_MEM_LEAK_DETECTION operator_new_fptr = mem_leak_operator_new; @@ -460,6 +460,15 @@ void MemoryLeakWarningPlugin::turnOnThreadSafeNewDeleteOverloads() #endif } +bool MemoryLeakWarningPlugin::areNewDeleteOverloaded() +{ +#if CPPUTEST_USE_MEM_LEAK_DETECTION + return operator_new_fptr == mem_leak_operator_new || operator_new_fptr == threadsafe_mem_leak_operator_new; +#else + return false; +#endif +} + void MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads() { #if CPPUTEST_USE_MEM_LEAK_DETECTION diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index 80ba75733..a685bd469 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -160,7 +160,7 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) detector = MemoryLeakWarningPlugin::getGlobalDetector(); failureReporter = MemoryLeakWarningPlugin::getGlobalFailureReporter(); - MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); + MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); dummyReporter = new DummyMemoryLeakFailure; dummyDetector = new DummyMemoryLeakDetector(dummyReporter); @@ -171,12 +171,14 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) void teardown() { - MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); + MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); + + MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); if (!DummyMemoryLeakDetector::wasDeleted()) delete dummyDetector; if (!DummyMemoryLeakFailure::wasDeleted()) delete dummyReporter; MemoryLeakWarningPlugin::setGlobalDetector(detector, failureReporter); - MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); + MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); UtestShell::resetCrashMethod(); @@ -230,36 +232,41 @@ TEST(MemoryLeakWarningGlobalDetectorTest, crashOnLeakWithOperatorNew) { MemoryLeakWarningPlugin::setGlobalDetector(dummyDetector, dummyReporter); - MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); + MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); crash_on_allocation_number(1); char* memory = new char[100]; CHECK(cpputestHasCrashed); delete [] memory; + MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); } TEST(MemoryLeakWarningGlobalDetectorTest, crashOnLeakWithOperatorNewArray) { MemoryLeakWarningPlugin::setGlobalDetector(dummyDetector, dummyReporter); - MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); + MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); crash_on_allocation_number(1); char* memory = new char; CHECK(cpputestHasCrashed); delete memory; + + MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); } TEST(MemoryLeakWarningGlobalDetectorTest, crashOnLeakWithOperatorMalloc) { MemoryLeakWarningPlugin::setGlobalDetector(dummyDetector, dummyReporter); - MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); + MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); crash_on_allocation_number(1); char* memory = (char*) cpputest_malloc(10); CHECK(cpputestHasCrashed); cpputest_free(memory); + + MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); } TEST(MemoryLeakWarningGlobalDetectorTest, gettingTheGlobalDetectorDoesNotRestoreTheMemoryLeakOverloadsWhenTheyWereAlreadyOff) @@ -268,20 +275,20 @@ TEST(MemoryLeakWarningGlobalDetectorTest, gettingTheGlobalDetectorDoesNotRestore MemoryLeakDetector* temporaryDetector = MemoryLeakWarningPlugin::getGlobalDetector(); MemoryLeakFailure* temporaryReporter = MemoryLeakWarningPlugin::getGlobalFailureReporter(); - MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); + MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); + bool areNewDeleteOverloaded = MemoryLeakWarningPlugin::areNewDeleteOverloaded(); - MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); + MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); CHECK(!areNewDeleteOverloaded); - MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); delete temporaryReporter; delete temporaryDetector; } TEST(MemoryLeakWarningGlobalDetectorTest, checkIfTheMemoryLeakOverloadsAreOn) { - MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); + MemoryLeakWarningPlugin::turnOnDefaultNotThreadSafeNewDeleteOverloads(); CHECK(MemoryLeakWarningPlugin::areNewDeleteOverloaded()); MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); @@ -292,10 +299,32 @@ TEST(MemoryLeakWarningGlobalDetectorTest, checkIfTheMemoryLeakOverloadsAreOff) MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); bool areNewDeleteOverloaded = MemoryLeakWarningPlugin::areNewDeleteOverloaded(); - MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); + MemoryLeakWarningPlugin::turnOnDefaultNotThreadSafeNewDeleteOverloads(); CHECK(!areNewDeleteOverloaded); } +TEST(MemoryLeakWarningGlobalDetectorTest, checkIfTheMemoryLeakOverloadsAreOnWithRestore) +{ + MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); + CHECK(MemoryLeakWarningPlugin::areNewDeleteOverloaded()); + MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); +} + +TEST(MemoryLeakWarningGlobalDetectorTest, checkIfTheMemoryLeakOverloadsAreOffWithSaveDisable) +{ + MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); + CHECK(!MemoryLeakWarningPlugin::areNewDeleteOverloaded()); + MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); +} + +TEST(MemoryLeakWarningGlobalDetectorTest, threadSafeMemoryLeakDetectorOverloadsAreAlsoOverloaded) +{ + MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); + MemoryLeakWarningPlugin::turnOnThreadSafeNewDeleteOverloads(); + CHECK(MemoryLeakWarningPlugin::areNewDeleteOverloaded()); + MemoryLeakWarningPlugin::turnOnDefaultNotThreadSafeNewDeleteOverloads(); + MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); +} #endif @@ -375,7 +404,7 @@ TEST(MemoryLeakWarningThreadSafe, turnOnThreadSafeMallocFreeReallocOverloadsDebu CHECK_EQUAL(3, mutexLockCount); CHECK_EQUAL(3, mutexUnlockCount); - MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); + MemoryLeakWarningPlugin::turnOnDefaultNotThreadSafeNewDeleteOverloads(); } TEST(MemoryLeakWarningThreadSafe, turnOnThreadSafeNewDeleteOverloadsDebug) @@ -398,7 +427,7 @@ TEST(MemoryLeakWarningThreadSafe, turnOnThreadSafeNewDeleteOverloadsDebug) CHECK_EQUAL(4, mutexLockCount); CHECK_EQUAL(4, mutexUnlockCount); - MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); + MemoryLeakWarningPlugin::turnOnDefaultNotThreadSafeNewDeleteOverloads(); } #ifdef __clang__ @@ -437,7 +466,7 @@ TEST(MemoryLeakWarningThreadSafe, turnOnThreadSafeNewDeleteOverloads) CHECK_EQUAL(8, mutexLockCount); CHECK_EQUAL(8, mutexUnlockCount); - MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); + MemoryLeakWarningPlugin::turnOnDefaultNotThreadSafeNewDeleteOverloads(); #ifdef CPPUTEST_USE_NEW_MACROS #include "CppUTest/MemoryLeakDetectorNewMacros.h" #endif From 47e2ad14574b27052fca6256ed9d466d90f2929d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 14:04:27 +0800 Subject: [PATCH 0313/1093] Removed useless and confusing comments --- src/Platforms/Iar/UtestPlatform.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Platforms/Iar/UtestPlatform.cpp b/src/Platforms/Iar/UtestPlatform.cpp index 1ad99b048..ef3c184ad 100644 --- a/src/Platforms/Iar/UtestPlatform.cpp +++ b/src/Platforms/Iar/UtestPlatform.cpp @@ -128,18 +128,18 @@ int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_ static PlatformSpecificFile PlatformSpecificFOpenImplementation(const char* filename, const char* flag) { - static int fileNo = 0; // Count the files so different files can be differenciated. + static int fileNo = 0; (void)filename; (void)flag; fileNo++; - return (void*)fileNo; // Return the file handle number. + return (void*)fileNo; } static void PlatformSpecificFPutsImplementation(const char* str, PlatformSpecificFile file) { (void)str; (void)file; - printf("FILE%d:%s",(int)file, str); // Print the text to stdout preceeded by the characters "FILE". + printf("FILE%d:%s",(int)file, str); } static void PlatformSpecificFCloseImplementation(PlatformSpecificFile file) From 49c4b9426eefd1d30ebf8a4a699ac80b97b1d74f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 14:46:47 +0800 Subject: [PATCH 0314/1093] Fixed test and simplified output a bit --- src/CppUTest/MemoryLeakWarningPlugin.cpp | 5 +---- tests/CppUTest/MemoryLeakWarningTest.cpp | 18 +++++++----------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 68e972ada..ea6e377a8 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -627,10 +627,7 @@ void MemoryLeakWarningPlugin::postTestAction(UtestShell& test, TestResult& resul TestFailure f(&test, memLeakDetector_->report(mem_leak_period_checking)); result.addFailure(f); } else if(expectedLeaks_ > 0) { - result.print("Warning: Expected "); - result.print(StringFrom(expectedLeaks_).asCharString()); - result.print(expectedLeaks_ == 1 ? " leak" : " leaks"); - result.print(", but leak detection was disabled"); + result.print(StringFromFormat("Warning: Expected %d leak(s), but leak detection was disabled", expectedLeaks_).asCharString()); } } memLeakDetector_->markCheckingPeriodLeaksAsNonCheckingPeriod(); diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index 4009bcbea..09eaa0bf9 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -109,13 +109,9 @@ TEST(MemoryLeakWarningTest, TwoLeaks) { fixture->setTestFunction(_testTwoLeaks); fixture->runAllTests(); - if(MemoryLeakWarningPlugin::areNewDeleteOverloaded()) - { - LONGS_EQUAL(1, fixture->getFailureCount()); - fixture->assertPrintContains("Total number of leaks: 2"); - } else { - LONGS_EQUAL(0, fixture->getFailureCount()); - } + + CHECK(MemoryLeakWarningPlugin::areNewDeleteOverloaded()); + LONGS_EQUAL(1, fixture->getFailureCount()); } static void _testLeakWarningWithPluginDisabled() @@ -126,7 +122,7 @@ static void _testLeakWarningWithPluginDisabled() TEST(MemoryLeakWarningTest, LeakWarningWithPluginDisabled) { - MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); // force off even if memleak enabled + MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); MemoryLeakDetector* origDetector = MemoryLeakWarningPlugin::getGlobalDetector(); MemoryLeakFailure* origReporter = MemoryLeakWarningPlugin::getGlobalFailureReporter(); @@ -138,12 +134,12 @@ TEST(MemoryLeakWarningTest, LeakWarningWithPluginDisabled) fixture->runAllTests(); LONGS_EQUAL(0, fixture->getFailureCount()); - fixture->assertPrintContains("Warning: Expected 1 leak, but leak detection was disabled"); + fixture->assertPrintContains("Warning: Expected 1 leak(s), but leak detection was disabled"); MemoryLeakWarningPlugin::setGlobalDetector(origDetector, origReporter); - setCurrentMallocAllocator(NULLPTR); + setCurrentMallocAllocatorToDefault(); - MemoryLeakWarningPlugin::turnOnNewDeleteOverloads(); + MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); } static void _testIgnore2() From fc9f189f3b29d8b150730f53b5a0bcf7b786cf04 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 17:18:55 +0800 Subject: [PATCH 0315/1093] Fixed the failing tests for when the memory leak detector is turned off --- tests/CppUTest/MemoryLeakWarningTest.cpp | 26 +++++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index 09eaa0bf9..3d9756f50 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -105,15 +105,29 @@ static void _testTwoLeaks() leak2 = (long*) (void*) detector->allocMemory(allocator, 4); } +#if CPPUTEST_USE_MEM_LEAK_DETECTION + TEST(MemoryLeakWarningTest, TwoLeaks) { fixture->setTestFunction(_testTwoLeaks); fixture->runAllTests(); - CHECK(MemoryLeakWarningPlugin::areNewDeleteOverloaded()); LONGS_EQUAL(1, fixture->getFailureCount()); } +#else + +TEST(MemoryLeakWarningTest, TwoLeaks) +{ + fixture->setTestFunction(_testTwoLeaks); + fixture->runAllTests(); + + LONGS_EQUAL(0, fixture->getFailureCount()); +} + +#endif + + static void _testLeakWarningWithPluginDisabled() { memPlugin->expectLeaksInTest(1); @@ -124,22 +138,14 @@ TEST(MemoryLeakWarningTest, LeakWarningWithPluginDisabled) { MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); - MemoryLeakDetector* origDetector = MemoryLeakWarningPlugin::getGlobalDetector(); - MemoryLeakFailure* origReporter = MemoryLeakWarningPlugin::getGlobalFailureReporter(); - - setCurrentMallocAllocator(allocator); - MemoryLeakWarningPlugin::setGlobalDetector(detector, &dummy); - fixture->setTestFunction(_testLeakWarningWithPluginDisabled); fixture->runAllTests(); LONGS_EQUAL(0, fixture->getFailureCount()); fixture->assertPrintContains("Warning: Expected 1 leak(s), but leak detection was disabled"); - MemoryLeakWarningPlugin::setGlobalDetector(origDetector, origReporter); - setCurrentMallocAllocatorToDefault(); - MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); + } static void _testIgnore2() From e0b64bfce4565aaae6b15f9716430cf180220e7b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 17:37:45 +0800 Subject: [PATCH 0316/1093] Added docker file for DOS build. Can now more easily run dos build --- docker/Dockerfile.dos | 12 ++++++++++++ platforms/Dos/Makefile | 4 ++-- platforms/Dos/alltests.sh | 2 +- scripts/create_docker_images_and_containers | 4 ++-- scripts/travis_ci_build.sh | 8 +++++--- 5 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 docker/Dockerfile.dos diff --git a/docker/Dockerfile.dos b/docker/Dockerfile.dos new file mode 100644 index 000000000..f41dcb339 --- /dev/null +++ b/docker/Dockerfile.dos @@ -0,0 +1,12 @@ +FROM ubuntu + +RUN apt-get update +RUN apt-get install -y wget +RUN apt-get install -y unzip +RUN apt-get install -y dosbox +RUN apt-get install -y make + +WORKDIR /cpputest_build + +CMD BUILD=make_dos /cpputest/scripts/travis_ci_build.sh + diff --git a/platforms/Dos/Makefile b/platforms/Dos/Makefile index 525b9c0aa..9273c1a2b 100644 --- a/platforms/Dos/Makefile +++ b/platforms/Dos/Makefile @@ -10,8 +10,8 @@ path_separator := / drive = $(subst $(CYGDRIVE),$(lastword $(subst /, ,$(CYGDRIVE))):/,$(1)) convert_paths = $(if $(CYGDRIVE),$(subst /,$(path_separator),$(call drive,$(1))),$(1)) --include ../platforms/Dos/platform.mk -include ../platforms/Dos/sources.mk +-include $(CPPUTEST_HOME)/platforms/Dos/platform.mk +include $(CPPUTEST_HOME)/platforms/Dos/sources.mk # Disable W013 unreachable code - it overreacts to CHECK_EQUAL macros # Disable W367 conditional expression in if statement is always true - same diff --git a/platforms/Dos/alltests.sh b/platforms/Dos/alltests.sh index 6bfa8fd30..0cb753f5a 100755 --- a/platforms/Dos/alltests.sh +++ b/platforms/Dos/alltests.sh @@ -4,7 +4,7 @@ printf "" >ALLTESTS.LOG for test in `ls *.EXE`; do kb=`ls -lsk ${test} | awk '{print $1}'` printf "Running ${test} (${kb}k) inside DOSBox...\n" - dosbox -conf ../platforms/Dos/dosbox-0.74.conf exit \ + dosbox -conf ${CPPUTEST_HOME}/platforms/Dos/dosbox-0.74.conf exit \ -c "echo *** ${test} (${kb}k) *****************************>>ALLTESTS.LOG" \ -c "${test}>>ALLTESTS.LOG" \ -noconsole -exit || exit 1 diff --git a/scripts/create_docker_images_and_containers b/scripts/create_docker_images_and_containers index b58efc775..828faebe6 100755 --- a/scripts/create_docker_images_and_containers +++ b/scripts/create_docker_images_and_containers @@ -30,8 +30,8 @@ checkForImageNameParameter docker build -f $CPPUTEST_HOME/docker/Dockerfile.$container --tag cpputest/$container:current . docker container rm cpputest_$container -docker create -i -v$CPPUTEST_HOME:/cpputest --name cpputest_$container cpputest/$container:current +docker create -it -v$CPPUTEST_HOME:/cpputest -e "CPPUTEST_HOME=/cpputest" --name cpputest_$container cpputest/$container:current -echo "You can run your container through: docker start -i cpputest_. E.g. docker start -i cpputest_ubuntu" +echo "You can run your container through: docker start -i cpputest_. E.g. docker start -i cpputest_$container" diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 20864f661..5b03cce18 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -6,7 +6,9 @@ if [[ "$CXX" == clang* ]]; then export CXXFLAGS="-stdlib=libc++" fi -export CPPUTEST_HOME=$TRAVIS_BUILD_DIR +if [ "x$CPPUTEST_HOME" = "" ] ; then + export CPPUTEST_HOME=$TRAVIS_BUILD_DIR +fi if [ "x$BUILD" = "xautotools" ]; then autoreconf -i .. @@ -113,7 +115,7 @@ if [ "x$BUILD" = "xmake_dos" ]; then export CC=wcl export CXX=wcl $CC --version - make -f ../platforms/Dos/Makefile || exit 1 - ../platforms/Dos/alltests.sh || exit 1 + make -f $CPPUTEST_HOME/platforms/Dos/Makefile || exit 1 + $CPPUTEST_HOME/platforms/Dos/alltests.sh || exit 1 fi From ec67f3fbaa4c29addf05fa1b424daccb57e40fe9 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 17:53:43 +0800 Subject: [PATCH 0317/1093] Fixed typo in travis build script --- scripts/travis_ci_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 5b03cce18..2362d599d 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -6,7 +6,7 @@ if [[ "$CXX" == clang* ]]; then export CXXFLAGS="-stdlib=libc++" fi -if [ "x$CPPUTEST_HOME" = "" ] ; then +if [ "x$CPPUTEST_HOME" = "x" ] ; then export CPPUTEST_HOME=$TRAVIS_BUILD_DIR fi @@ -15,7 +15,7 @@ if [ "x$BUILD" = "xautotools" ]; then ../configure echo "CONFIGURATION DONE. Compiling now." - if [ "${TRAVIS_EVENT_TYPE}" == "cron" ]; then + if [ "${TRAVIS_EVENT_TYPE}" = "cron" ]; then make check_all fi From def25c51e063b1829a607596b1483191f81847c6 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 19:13:43 +0800 Subject: [PATCH 0318/1093] Remove key not used anymore --- .travis.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 31ef6a454..0626f315f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -91,16 +91,6 @@ jobs: - env: BUILD=docker_ubuntu_autotools - env: BUILD=docker_ubuntu_gcc10 -global: -- secure: |- - P05xUfJVw5YM4hF7hzQLjyMzDD4Q1/fyWP9Uk5aK5VrSWNY99EuxldXI5QK/ - vA1NkcW49tQW1wQvBlRtdlLNOmUfDP/oiJFXPwNn4dqwOIOEet2P7JO/5hnH - MNHlZmGu2WpoZREhOFBfsIhK0IP8mloqLDq2XemBdga/LWygrLU= -- secure: |- - Y/8iNkf6uEbE3qltnM+7mGlCvFWzyttwwRGgVGw1m9xOiUJcobvOImQRU8XZ - 91dgO+Fz0A3mljqs1sK1OPjpXmFGE1jP/NlotMw0WlDOuSIDjQ4ubwdTNGAw - NY53R9ygbIjEmqxHAJm9mOZqxW2hNaoI7TcX6oX248/hLibyx8M= - before_script: - export CPPUTEST_BUILD_DIR=$TRAVIS_BUILD_DIR/cpputest_build - mkdir -p $CPPUTEST_BUILD_DIR && cd $CPPUTEST_BUILD_DIR From 4c495f9bed3a3738d589affc8c570c066ba946f9 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 21 Apr 2020 19:14:19 +0800 Subject: [PATCH 0319/1093] Removed github deployer. Switching to travis deployment support --- .travis_github_deployer.yml | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 .travis_github_deployer.yml diff --git a/.travis_github_deployer.yml b/.travis_github_deployer.yml deleted file mode 100644 index 08e782d2f..000000000 --- a/.travis_github_deployer.yml +++ /dev/null @@ -1,10 +0,0 @@ -destination_repository: https://github.com/cpputest/cpputest.github.io.git - -files_to_deploy: - cpputest_build/unit_test_report/*: unit_test_report - cpputest_build/cpputest-3.7dev.tar.gz: - destination: releases - purge: yes - cpputest_build/cpputest-3.7dev.zip: - destination: releases - purge: yes From 8e329ccaf3547b94fe019307800c2805e3d6f78a Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 21 Apr 2020 20:49:33 +0200 Subject: [PATCH 0320/1093] Dockerfiles updates; run statements merged. --- docker/Dockerfile.dos | 7 +------ docker/Dockerfile.gcc10 | 11 +++-------- docker/Dockerfile.ubuntu | 12 ++---------- 3 files changed, 6 insertions(+), 24 deletions(-) diff --git a/docker/Dockerfile.dos b/docker/Dockerfile.dos index f41dcb339..a3005408e 100644 --- a/docker/Dockerfile.dos +++ b/docker/Dockerfile.dos @@ -1,12 +1,7 @@ FROM ubuntu -RUN apt-get update -RUN apt-get install -y wget -RUN apt-get install -y unzip -RUN apt-get install -y dosbox -RUN apt-get install -y make +RUN apt-get update && apt-get install -y --no-install-recommends wget unzip dosbox make WORKDIR /cpputest_build CMD BUILD=make_dos /cpputest/scripts/travis_ci_build.sh - diff --git a/docker/Dockerfile.gcc10 b/docker/Dockerfile.gcc10 index 8f1b850f4..ea0785f54 100644 --- a/docker/Dockerfile.gcc10 +++ b/docker/Dockerfile.gcc10 @@ -1,13 +1,8 @@ FROM okannen/gcc-10 -RUN apt-get update -RUN apt-get install -y -q file -RUN apt-get install -y -q git -RUN apt-get install -y -q make -RUN apt-get install -y -q automake -RUN apt-get install -y -q autoconf -RUN apt-get install -y -q libtool -RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100 +RUN apt-get update && \ + apt-get install -y --no-install-recommends file git make automake autoconf libtool && \ + update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100 WORKDIR /cpputest_build diff --git a/docker/Dockerfile.ubuntu b/docker/Dockerfile.ubuntu index 1e39b92c0..7a660ed28 100644 --- a/docker/Dockerfile.ubuntu +++ b/docker/Dockerfile.ubuntu @@ -1,16 +1,8 @@ FROM ubuntu -RUN apt-get update -RUN apt-get install -y -q file -RUN apt-get install -y -q git -RUN apt-get install -y -q gcc -RUN apt-get install -y -q g++ -RUN apt-get install -y -q make -RUN apt-get install -y -q automake -RUN apt-get install -y -q autoconf -RUN apt-get install -y -q libtool +RUN apt-get update && \ + apt-get install -y -q --no-install-recommends file git gcc g++ make automake autoconf libtool WORKDIR /cpputest_build CMD autoreconf -i ../cpputest && ../cpputest/configure && make tdd - From c40abf3f2cb0b4547d3094440188aab921d43c65 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 10:22:13 +0800 Subject: [PATCH 0321/1093] Travis github deploy key --- .travis.yml | 3 +++ github_deploy_key.enc | Bin 0 -> 3408 bytes 2 files changed, 3 insertions(+) create mode 100644 github_deploy_key.enc diff --git a/.travis.yml b/.travis.yml index 0626f315f..d4e4a5b90 100644 --- a/.travis.yml +++ b/.travis.yml @@ -100,3 +100,6 @@ after_failure: - "../scripts/travis_ci_after.sh" after_success: - "../scripts/travis_ci_after.sh" +before_install: + - "openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in github_deploy_key.enc -out github_deploy_key -d" + diff --git a/github_deploy_key.enc b/github_deploy_key.enc new file mode 100644 index 0000000000000000000000000000000000000000..7ff8c1aab508b758677b2f27175587d34761ef89 GIT binary patch literal 3408 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 literal 0 HcmV?d00001 From d25178185b831baa0fd2fbbb5a3a17b1925857a3 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 11:24:51 +0800 Subject: [PATCH 0322/1093] new attempt at deploy keys --- .travis.yml | 4 ++++ github_deploy_key.enc | Bin 3408 -> 3408 bytes 2 files changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index d4e4a5b90..e77d37066 100644 --- a/.travis.yml +++ b/.travis.yml @@ -102,4 +102,8 @@ after_success: - "../scripts/travis_ci_after.sh" before_install: - "openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in github_deploy_key.enc -out github_deploy_key -d" + - chmod 600 github_deploy_key + - eval $(ssh-agent -s) + - ssh-add github_deploy_key + diff --git a/github_deploy_key.enc b/github_deploy_key.enc index 7ff8c1aab508b758677b2f27175587d34761ef89..d5e40f70e4024d191971741659abfc785dae483b 100644 GIT binary patch literal 3408 zcmV-W4X^T2tEzF=OFw%Bzdx2-3Ng{aIFoA@?Y{){%J`O!ldT#>Z$qnQpSVCtU-ioD z$8OP>Ri(bDDTN*I{tAr4DI7HE(k2|0JsqDC%YsEdLJ`|C1Pqn-Cp}V7_vO_l6R9;O zgGH#c{9KFB+QGQ4k7#|lO7j9Ao7Fx&2HaC4>Bz}g{tH3=h{149yYEJFat>z^G_&v^ z;TUI*gl>6|BWWMG;D{@BzscIpOPcepZ-yWXdC)J{21 zs-z!REe}~(w`uWHPHb2z{3%KY@+)N8BpIsKvr0k2FwwyJK3fY(c}(7JU$ckyPlKf5 zj7AoFq^pfsOOP!+YQISc>>NU5b!cQU-V`2qD_rLSkc^R^tO2QQHsXX928Y5F22G;e z3`^OPRC`AGT$~}AQEEU{7McqS0bJ7FN@vvy7@w6>-1uUDWidT=zxe1hd8{srvW08f zzK!3Xcu!`3r60B8a+G3Lj6T-&hj!H|AXbB}XVxd!QQsWTh%TI*iciSw^zv}lRaDT9 z(2;4R^>YGuNJ_1Yqb|EDHo{5<7fFh&RAhG(o$$?X-|{7+W^&}1b`_sk^F0s;p)$vF zdk1XUgXvh1kS6e59#;dEp{)MS9pb-Tkxw5z6206{(;|KSBE7S?S!4isRoY2eBkUO! z%t|ItL^5WV^_eRGBPxcPyOKPPad1-pq)O;*F<4e4o7fKe>bQS7tj#%7z80mj81a=c z#b`Rb)MUhhCo5i1Q_+m;Jx3(LsRAv2D>Q>?aWLdW7IBB713BvCb`p5=dT>qJ6ld5l z+@{5hHao>dd9sT4?t-rp8UyImc}WwV*WfjCX7&jAQzE^y(JRji6ec@d3c`4pE>H7@ z0wI}Y`@YUx*q^?kf)l~DUE{&Xu}pO<4{7P=e{__yTi8M5gj^h&UycNiU6&wfcO_)+PUh0EjKk3a0kE_rk7L!Ijej!M@uwphMUS2ySA)T(L@*Tigt2pv$2=M!cb zL2a2vTYF;EK_tOu*rlR+SdNZs?v;+~Rdmod;Vc=O0Idehl>D-Ed&^ncVvEo|VX(we!lr0c#IA9U;CP0~1;y~Fgg(DtG z^%4$CtU>{tO<1x@_PqzUnZ**{dq0Di;8HhgMQKbtmK!5vFz92Xb5YJmzaOO2I27v# zu|93vi;`XMzZ(EIsIaZ`>3s)&6qF#7>y0YxQ;V>a77e^HU2j50^;B&~yFqO6a*l$q zB9>?UzaCK`Ix+^Dx81(j>C$0{jK6fYxo5>6{$CVN)nxeQd_%1Z6$Vo|*rx+YeWz%4 z)bjDLn0gi)m<%_{CyA$jQ&=IAUXE@w*C$obvD^41dqt{%WLoTG%%EM8(?54LU1!#37idnOPcI1=SWRW;St74F8X)Bx(i1+bd}7qwA0el5vp#nd zL8Ut@32=UM{N2smlXb$~I74jVK(_pYO+~y)Dqiq7J}W(Wz>`2K=IC-bTB?YU#Ewqv zv%vrF%!7L!L;UVl?fI$z9PU^VOrY;N;9^$$av0j$mPyJko9K-UO^jdg`YE6zT_&H) zFourq8~t>mZ`P){O>X57&C{bF-VAPt@q92 zG1}#pTz^|TX}#E6{LK%IS^MoTKd+JFF(9vo7u8D4J2}Yt=-0!Z3fuJWCQLwYT4ZoF z`3%w=kM57q-BTZtcg!kd=>|VDS;%sB$JfEP%(M#C#&~NBYtqkUQ*FP-Qa9DKrHY!> zd;l9NE=fH~({!8wP5!osVyiA4!FsrTEW}7|9Nf40id{H6G@V`+$t=V%GbE+i{N`+z zBLulDMwT`*c#gsA8!MhQ#e_BUa+TAt z-K$$>>f~h=Lk*dK8EomHxV-Y=Oztd)lK*o9sq>Er&g%q)(4l|NvO71V{tFCZPeR0^ z($>H6jj^&+HwU}AI-S_@iJomV&G==JJBOTnak>-7c(1$y>LCK^h})d+E6Szj0cO0I z1KRR3^XO@HqW#1}BXjP3D zKLGigWzm+tow zB9EJFHOL0Ql)R)zT$nDd71>{dF)8bO=9`r2HmXeE7Vr3sENb?;PwiF;_~gi=nLdBvdZ?&|<|hknv9 zQh)yB(hm%$VUdELT%ieEwEwqUX1=xfCGWQ-hP4nF>b2w2Eq)DXEFwtQT6|j+NBmi# zQz%ka5`ol*&~86)2ss^K1Wio}UpBB=r^>11i}sOc`3%`kUU8r-2Qy{pnrp2ajY4(t zTTO#T!prOt>sUR$I^ixlXK!UfB?zi;=02oj8&(x(C(ohsy&;HnC}orw8oDa5?GA+A zP!!(obKcx2hMJHFb1cpr;;IIosq2e(7dw4rdWS|oHN#m}vNbmEz#z!|bn`U_?Sy2E zNWsc*6DEleQ?SYZT|HtYk7T#HQDjXTe}}EM(T$IxQ%bA=cC|Y-6`{_?Es<2-U?Y+B zOt*F^7gM!nvB%|bs>uY3L$Fi{V=nJFYb>VH4gDjdGWgDG+W0?1VxuaA`JQ~HGH_$w zr?Q`tN+AGh>c!?fQJkrtVc5}qnRw9?;^HVBq!ak$MQm0__^WVv^N>o%&e+Jgwqwa+ zGu3%0O=ihgkj?7&9@+lF)j)vGmw6qJe|u8Fe;-O}2=IrkW;f`Ih>Y?=c6=F}YXx=5 z;qCQMBmu#lE6n7=?$k7gY2uGtkg_?0iH)q*#&b>s{E}rnH61le_q#_Cv#2i*sR=Kp}(v!Iq%PcAk{fYbCU&uY<2BFeR&MBev z2Oo4VQ3(ElV+9YN%dGASNliUxSvYXwQznNRf^yIBD=fct!})>hA8v&Geg87CZIXftj)o(_;U!uz_Uh9xjWU+ zFGhzy*W&ttb6zWgJDRWus}mSl_~qgkJ&E?=6;xN~Gc@;pA)i=kx_#Rx+Pn#&gEiKw zi3m$qDZ-dDfojR@F6zU*$1pJy|DK$oqFuP~DwnuR!S|8WxWY0Sa_YuRR26?&DeFc} z+9wBPwCf5bP)6b@zE1N^GjR5{O}!^Zr729&QO*{a>E|Oo9m+A^kUK;;(=b_ijbrc3<9k{983{y4PEarTRDZGQcYY2_O zt35{hy&vi;S;N3L#|gwS8lbzb7Bnpdq%Qa)rQqN;93}^v0|D&gL8x~mso^jILY|Q) zwpJI2+nJ$}wr|s>Y-3n|ah|Bc)9CdbI=>p$41SqtmKUANuh(i0JV#fda$S&9{mm;YP_gKY&L7^ z@OEo8J-_4WwBvW~=jnDCupr(sw)0)i6 ztJP&93KZ($8O(GJph_`|bCt>5kO1CoJMiar2jF32A^zVpdXms6hhIb}OC=&6VhR{a z%urp4>FiV=wVno+opEFbV^v$??BiTq3^UKe%4#}F^{t!1!4jIaT%rS!`MG}O{*i3k zl$Q-4iRx16nNCo=#T#SqjM`L!k?>O%4`1#ywv1aAPG#8^9W<@4+qK{)%87-&h89j5 z{=xMv^TN67r8bf4w`c!Q;bBu#LK8U_`|1uw@eH9f^%8yFQ&=&kB$H;`5cWxg-$*DE zb}oSScJpQKHrxg$IIH{MbU8H7iNPYB?2@Ej4#&ck7U~@WEC-{%7IKQdf?-7y`NUA_7x<_ATcbS^c>=XOM1LTBEFXxK@`fd5XC>6AQr=! zMZXI+q}dma7ax7YRhE_^`zYP~fRa|_yX)TC5V{Fpd&N`m+{(rFXUX z5FPT=pX{9S#fR)?6Ff(`M-95RPP`iNcUnzbEW?c&Yl_4UNC=lU$Luqj6~54#1)&~B zZ7}ODbuS@P)hQ=0)%6beJ%x-HssZmZxt0&s3@94|GAvnY4{RD{J!uod#dJS$+g<=y z!Pz>Jz2w_%|Lfpa+I><;0Hf`RiprQqx}VPhJywJxQ6@@w%USl_X7Rhx=IbrpHjMYl z3m(~q#-J2zLLG;kK3&n@5kJ1tli5yqph@NTS*1ZOR1m#AB}WfJS4P8{%S_LoTwW;F zbkf7$+@z^T!oqCe^_Fg)b&GN6m6e!q$@Q7l$$G=l;{d%^YE6(V1*udjXA#k~ro_LU z2r#&d`cur`q2dIiPkoHmGf?`eZ&)D*n3U}<+8$Cor_Z>tRhS}avcuhau|{^~@60O$ zk3R(16!)v{v5V8aUxubyOv{RR__AJ`4l5BA(l)8u9gskiMWF~VF=wEW+IZ;I`p7|; zxPN2Z$yx-oc`*zNFfin9-0t>V;rF2bbf`MG{q1i9N8nfze!o}W>f(h-D#LvMCRz_A zx3MO9&aG_teP4gP-Oh3E`N0mH46ai9COOXwc`s9C7u zo`uKP{!gtdo_(!VR*$qktQc2k38u`GQ(DeF@+o>}4h)WWm^c*42!AZd9Omc`jJ)RA ze9|m^ucfCQn5~19J%W1G_-C?pXwR?VDvLvQmg^7Gp=Sg4QMOQd*77pc8bbz+y!tbz z6m3w@BAwYO%g6^KcLuk*1R@3fQ!-G~#6Y6New&h#b8CL2r`>)jm%bljtN~eX%uZl>$le zo+Z5puAk#{6EY$lwoS3G`*2(akmoTD+{$SeIwx>Q5{%jZW@{UzRsYz~YIL*TI~=@T zp71y#d(rJrbUc(9+NRNhRugtWhsJ`NVB&8L0Kgw2MTqguZ6B~*ii*ZBy7$ZwkHs|F zbK+9K)c*CJf&*LiQ@4XiPJALthx#n)w!7qIKZ)?goh60#=ET3fB+-}cHiO>;PIl4h zWb72a5uJV|)hId~oABX@W3zw1%CZZfF}yxyVB1^v^=MN_Yp|q)y2`fjscW|3Ij%54 zcfFhJhvkvx)AgC1MJT`Z4h*W&C|OpG$PB>~!CEzD)+azeyAo0RK`q*=u`Im^1dDp=rf#T3$q zCRoz~0W*PxYW(S0H4}`@Cb?c6#5et+z_+0yeUflPn(&5KBdx-7XzuNOomEXk_2gP{}%=_9-iD@}N z*exWzdV3(@n`{&h0v>tUz{+JndGsXe8yAgZ6p5W9&l5WQk z-%IH}uogLR7O3Ce62)A+T#G>%daTh8^f)T4n0}%X&0NODgRgyhdWn%HXaWKkKIQ;6 zA3A;dW~kRYYkLmGPtfmHw{ZlpguTQs3ea2q| z!m$y3#yKxKM9fRARt1Vc!7Zd_u+>HUm93IiMOL68c^dsPNyIpyVO(6*Sb7`NUQNb{54a5MJYVWQ= z6r!H?JNWvPt7m%~8kr9lu67FF}h z3is;fjBu`ef>gvGyB6nVFucZYDXyN~QdL}*Xa=Ar0d@{CbxI^=T<4$w6=|N91hJ#T zfC0*uH~#CB0J@3=lcSe6(Om}sQ^zntngS_Irf4PiF1)C@US~+jgTg1WFsatYsJ>zs zo&IXGP$@3?$EN~J?#3KO(VN~0O0tW?9=}FOhN=VgfcW_aLVKrr$gTdeZDg)1z_PLj z+@H_c_+cB@t`TM3Wx#Hjaj7|GsQW+2kS6Q2VM9M6d&Kn*%sPK^uZ~;hzMP~YJEiDx zcLXt6J`c3*i{}*h4d4{zpFUYRyLEkZLDMP3~0loc1leLLreWgfaQA|VQ26qPb zJpagGPEm1^M3tS9@?A-cpyiyNvq(DW71Zpt6T3Ma{**gC*iFgGNp;F+0aM` zku^$Y5IL1e-(~bo!yjUG`qQwescOc=pzG0Yg0;_6^bSeb=xgm(yRi&~4U_IWu1n}=?3wPts{pXrx~kUZk`DYJSXDPj!!)PCkED5eDNlyo3t~nm=_P4V m{48~wQ~C|-EEzw0<>h|=vWP3~_G10#E?Q?J_G%c%tw5>ySE4rn From cb48f596e651b027af88a49254e47cd7fd391145 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 13:06:15 +0800 Subject: [PATCH 0323/1093] Experiment in tagging in the build --- .travis.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.travis.yml b/.travis.yml index d4e4a5b90..788d95201 100644 --- a/.travis.yml +++ b/.travis.yml @@ -94,12 +94,20 @@ jobs: before_script: - export CPPUTEST_BUILD_DIR=$TRAVIS_BUILD_DIR/cpputest_build - mkdir -p $CPPUTEST_BUILD_DIR && cd $CPPUTEST_BUILD_DIR + script: - "../scripts/travis_ci_build.sh" + after_failure: - "../scripts/travis_ci_after.sh" + after_success: - "../scripts/travis_ci_after.sh" + before_install: - "openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in github_deploy_key.enc -out github_deploy_key -d" +before_deploy: + - git tag latest_passing_build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" + - this travis yaml is still an experiment + From 694bf119b2f6ec007ae43aa54bea21c07dcfe37d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 13:28:37 +0800 Subject: [PATCH 0324/1093] before_install also runs on PRs and the variables are not set there --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 788d95201..8445ebe67 100644 --- a/.travis.yml +++ b/.travis.yml @@ -104,10 +104,8 @@ after_failure: after_success: - "../scripts/travis_ci_after.sh" -before_install: - - "openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in github_deploy_key.enc -out github_deploy_key -d" - before_deploy: + - "openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in github_deploy_key.enc -out github_deploy_key -d" - git tag latest_passing_build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" - this travis yaml is still an experiment From 1e3f79f1638e4c8567e2edaf7f5ab0be39814e18 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 13:41:47 +0800 Subject: [PATCH 0325/1093] New experiment with tagging in travis --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index beb9aeb86..4a5f10196 100644 --- a/.travis.yml +++ b/.travis.yml @@ -106,8 +106,8 @@ after_success: before_deploy: - "openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in github_deploy_key.enc -out github_deploy_key -d" - - git tag latest_passing_build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" - - this travis yaml is still an experiment - chmod 600 github_deploy_key - eval $(ssh-agent -s) - ssh-add github_deploy_key + - git tag latest_passing_build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" + - this travis yaml is still an experiment From cad2ae8e3f29ded3abb3dc2dd524d16c96383272 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 14:08:20 +0800 Subject: [PATCH 0326/1093] Moved dos to docker, see if the weird output goes away --- .travis.yml | 6 +----- scripts/travis_ci_build.sh | 7 ++++++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4a5f10196..27adb5b7a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -57,11 +57,7 @@ jobs: - compiler: gcc env: BUILD=cmake_gtest - compiler: wcl - env: BUILD=make_dos - addons: - apt: - packages: - - dosbox + env: BUILD=docker_dos - compiler: clang os: osx env: BUILD=cmake CPP_STD=17 diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 2362d599d..e3748034e 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -107,9 +107,14 @@ if [ "x$BUILD" = "xdocker_ubuntu_gcc10" ]; then docker start -i cpputest_gcc10 fi +if [ "x$BUILD" = "xdocker_dos" ]; then + $CPPUTEST_HOME/scripts/create_docker_images_and_containers dos + docker start -i dos +fi + if [ "x$BUILD" = "xmake_dos" ]; then wget http://ftp.openwatcom.org/install/open-watcom-c-linux-1.9 -O /tmp/watcom.zip - mkdir -p watcom && unzip -aqd watcom /tmp/watcom.zip && chmod -R +x watcom/binl + mkdir -p watcom && unzip -aqod watcom /tmp/watcom.zip && chmod -R +x watcom/binl export PATH=$PATH:$PWD/watcom/binl export WATCOM=$PWD/watcom export CC=wcl From 1caecd22dc216513cb36470c46993f4a3837b691 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 14:28:31 +0800 Subject: [PATCH 0327/1093] Fixing the docker dos build in travis, maybe --- .travis.yml | 3 +-- docker/Dockerfile.dos | 2 +- scripts/travis_ci_build.sh | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 27adb5b7a..f2eebe3b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -56,8 +56,7 @@ jobs: env: BUILD=cmake_coverage - compiler: gcc env: BUILD=cmake_gtest - - compiler: wcl - env: BUILD=docker_dos + - env: BUILD=docker_dos - compiler: clang os: osx env: BUILD=cmake CPP_STD=17 diff --git a/docker/Dockerfile.dos b/docker/Dockerfile.dos index a3005408e..b1f7ab483 100644 --- a/docker/Dockerfile.dos +++ b/docker/Dockerfile.dos @@ -1,6 +1,6 @@ FROM ubuntu -RUN apt-get update && apt-get install -y --no-install-recommends wget unzip dosbox make +RUN apt-get -qq update && apt-get -qq install -y --no-install-recommends wget unzip dosbox make WORKDIR /cpputest_build diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index e3748034e..b1d7ed692 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -1,6 +1,6 @@ #!/bin/bash # Script run in the travis CI -set -ex +# set -ex if [[ "$CXX" == clang* ]]; then export CXXFLAGS="-stdlib=libc++" @@ -109,7 +109,7 @@ fi if [ "x$BUILD" = "xdocker_dos" ]; then $CPPUTEST_HOME/scripts/create_docker_images_and_containers dos - docker start -i dos + docker start -i cpputest_dos fi if [ "x$BUILD" = "xmake_dos" ]; then From a9fb6f8330b69337397658c1927b2bc42bff15f2 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 15:00:17 +0800 Subject: [PATCH 0328/1093] Attempt to remove the dosbox error messages from the log --- .travis.yml | 2 +- platforms/Dos/alltests.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f2eebe3b1..5c977b579 100644 --- a/.travis.yml +++ b/.travis.yml @@ -56,7 +56,7 @@ jobs: env: BUILD=cmake_coverage - compiler: gcc env: BUILD=cmake_gtest - - env: BUILD=docker_dos + - env: BUILD=make_dos - compiler: clang os: osx env: BUILD=cmake CPP_STD=17 diff --git a/platforms/Dos/alltests.sh b/platforms/Dos/alltests.sh index 0cb753f5a..ec0a59a67 100755 --- a/platforms/Dos/alltests.sh +++ b/platforms/Dos/alltests.sh @@ -7,7 +7,7 @@ for test in `ls *.EXE`; do dosbox -conf ${CPPUTEST_HOME}/platforms/Dos/dosbox-0.74.conf exit \ -c "echo *** ${test} (${kb}k) *****************************>>ALLTESTS.LOG" \ -c "${test}>>ALLTESTS.LOG" \ - -noconsole -exit || exit 1 + -noconsole -exit 2>/dev/null || exit 1 done printf "\n" [ "`cat ALLTESTS.LOG`" ] || { printf "No tests to run!\n"; exit 1; } From 63b6a253a3cf0babe97fa59eb9eff82cecb0d611 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 15:24:35 +0800 Subject: [PATCH 0329/1093] New attempt --- platforms/Dos/alltests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/Dos/alltests.sh b/platforms/Dos/alltests.sh index ec0a59a67..dbf4b4d62 100755 --- a/platforms/Dos/alltests.sh +++ b/platforms/Dos/alltests.sh @@ -7,7 +7,7 @@ for test in `ls *.EXE`; do dosbox -conf ${CPPUTEST_HOME}/platforms/Dos/dosbox-0.74.conf exit \ -c "echo *** ${test} (${kb}k) *****************************>>ALLTESTS.LOG" \ -c "${test}>>ALLTESTS.LOG" \ - -noconsole -exit 2>/dev/null || exit 1 + -noconsole -exit 2>dosbox_error.log || { printf "error running command!\n"; cat dosbox_error.log; exit 1; } done printf "\n" [ "`cat ALLTESTS.LOG`" ] || { printf "No tests to run!\n"; exit 1; } From a7932843a019ec15236b9db7f0c78f9a22fc5e43 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 15:43:46 +0800 Subject: [PATCH 0330/1093] Duh --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 5c977b579..2f23df022 100644 --- a/.travis.yml +++ b/.travis.yml @@ -57,6 +57,10 @@ jobs: - compiler: gcc env: BUILD=cmake_gtest - env: BUILD=make_dos + addons: + apt: + packages: + - dosbox - compiler: clang os: osx env: BUILD=cmake CPP_STD=17 From aae994ad05684eb9608cb265f07c09f8850df840 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 16:39:00 +0800 Subject: [PATCH 0331/1093] Get watcom compiler from github instead --- docker/Dockerfile.dos | 2 +- scripts/travis_ci_build.sh | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docker/Dockerfile.dos b/docker/Dockerfile.dos index b1f7ab483..cff3d4f72 100644 --- a/docker/Dockerfile.dos +++ b/docker/Dockerfile.dos @@ -1,6 +1,6 @@ FROM ubuntu -RUN apt-get -qq update && apt-get -qq install -y --no-install-recommends wget unzip dosbox make +RUN apt-get -qq update && apt-get -qq install -y --no-install-recommends dosbox make openssl ca-certificates git WORKDIR /cpputest_build diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index b1d7ed692..ab1510748 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -113,8 +113,7 @@ if [ "x$BUILD" = "xdocker_dos" ]; then fi if [ "x$BUILD" = "xmake_dos" ]; then - wget http://ftp.openwatcom.org/install/open-watcom-c-linux-1.9 -O /tmp/watcom.zip - mkdir -p watcom && unzip -aqod watcom /tmp/watcom.zip && chmod -R +x watcom/binl + git clone https://github.com/cpputest/watcom-compiler.git watcom export PATH=$PATH:$PWD/watcom/binl export WATCOM=$PWD/watcom export CC=wcl From d895dcaf1292454e78f902918e33ceda2608d414 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 17:00:24 +0800 Subject: [PATCH 0332/1093] Removed the console output of the dos box. --- platforms/Dos/alltests.sh | 18 ++++++++++++++++-- scripts/create_docker_images_and_containers | 4 ++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/platforms/Dos/alltests.sh b/platforms/Dos/alltests.sh index dbf4b4d62..2acebbcb9 100755 --- a/platforms/Dos/alltests.sh +++ b/platforms/Dos/alltests.sh @@ -1,13 +1,27 @@ #!/bin/bash + +checkForCppUTestToolsEnvVariable() { + if [ -z "$CPPUTEST_HOME" ] ; then + echo "CPPUTEST_HOME not set. You must set CPPUTEST_HOME to the top level CppUTest directory" + exit 1 + fi + if [ ! -d "$CPPUTEST_HOME" ] ; then + echo "CPPUTEST_HOME not set to a directory. You must set CPPUTEST_HOME to the top level CppUTest directory" + exit 2 + fi +} + +checkForCppUTestToolsEnvVariable + printf "" > exit # so dosbox will run 'external' command 'exit' correctly printf "" >ALLTESTS.LOG for test in `ls *.EXE`; do kb=`ls -lsk ${test} | awk '{print $1}'` printf "Running ${test} (${kb}k) inside DOSBox...\n" - dosbox -conf ${CPPUTEST_HOME}/platforms/Dos/dosbox-0.74.conf exit \ + dosbox -conf $CPPUTEST_HOME/platforms/Dos/dosbox-0.74.conf exit \ -c "echo *** ${test} (${kb}k) *****************************>>ALLTESTS.LOG" \ -c "${test}>>ALLTESTS.LOG" \ - -noconsole -exit 2>dosbox_error.log || { printf "error running command!\n"; cat dosbox_error.log; exit 1; } + -noconsole -exit 1>console_output 2>dosbox_error.log || { printf "error running command!\n"; cat dosbox_error.log; exit 1; } done printf "\n" [ "`cat ALLTESTS.LOG`" ] || { printf "No tests to run!\n"; exit 1; } diff --git a/scripts/create_docker_images_and_containers b/scripts/create_docker_images_and_containers index 828faebe6..ab4ec05b6 100755 --- a/scripts/create_docker_images_and_containers +++ b/scripts/create_docker_images_and_containers @@ -28,9 +28,9 @@ container=$1 checkForCppUTestToolsEnvVariable checkForImageNameParameter -docker build -f $CPPUTEST_HOME/docker/Dockerfile.$container --tag cpputest/$container:current . +docker build -f $CPPUTEST_HOME/docker/Dockerfile.$container --tag cpputest/$container:latest . docker container rm cpputest_$container -docker create -it -v$CPPUTEST_HOME:/cpputest -e "CPPUTEST_HOME=/cpputest" --name cpputest_$container cpputest/$container:current +docker create -it -v$CPPUTEST_HOME:/cpputest -e "CPPUTEST_HOME=/cpputest" --name cpputest_$container cpputest/$container:latest echo "You can run your container through: docker start -i cpputest_. E.g. docker start -i cpputest_$container" From 6a6b2cecb7404c3d680f88c0e02c9ec41236345f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 17:38:06 +0800 Subject: [PATCH 0333/1093] New attempt --- .travis.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.travis.yml b/.travis.yml index 2f23df022..4750bd9dc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -110,3 +110,12 @@ before_deploy: - ssh-add github_deploy_key - git tag latest_passing_build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" - this travis yaml is still an experiment + +deploy: + provider: releases + # ⋮ + edge: true + skip_cleanup: true + on: + tags: false + From 431a14a8e8026e6d435ecfd10a1cdcbde1097fb8 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 18:02:00 +0800 Subject: [PATCH 0334/1093] Find the enc key please --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4750bd9dc..1171fbf23 100644 --- a/.travis.yml +++ b/.travis.yml @@ -104,7 +104,7 @@ after_success: - "../scripts/travis_ci_after.sh" before_deploy: - - "openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in github_deploy_key.enc -out github_deploy_key -d" + - "openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in $TRAVIS_BUILD_DIR/github_deploy_key.enc -out github_deploy_key -d" - chmod 600 github_deploy_key - eval $(ssh-agent -s) - ssh-add github_deploy_key From 4756808d06d7af957f7cc97e3838038c462b8d5a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 19:46:05 +0800 Subject: [PATCH 0335/1093] Moved to travis build stages for single deployment --- .travis.yml | 26 ++++++++++++-------------- scripts/travis_before_deploy.sh | 8 ++++++++ 2 files changed, 20 insertions(+), 14 deletions(-) create mode 100755 scripts/travis_before_deploy.sh diff --git a/.travis.yml b/.travis.yml index 1171fbf23..07020c7fe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,8 @@ dist: bionic jobs: include: - - compiler: clang + - stage: "build & test" + compiler: clang env: BUILD=cmake CPP_STD=98 addons: apt: @@ -89,6 +90,16 @@ jobs: - valgrind - env: BUILD=docker_ubuntu_autotools - env: BUILD=docker_ubuntu_gcc10 + - stage: "Final Build" + - stage: "Deploy" + script: ../scripts/travis_before_deploy.sh + deploy: + provider: releases + # ⋮ + edge: true + skip_cleanup: true + on: + tags: false before_script: - export CPPUTEST_BUILD_DIR=$TRAVIS_BUILD_DIR/cpputest_build @@ -104,18 +115,5 @@ after_success: - "../scripts/travis_ci_after.sh" before_deploy: - - "openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in $TRAVIS_BUILD_DIR/github_deploy_key.enc -out github_deploy_key -d" - - chmod 600 github_deploy_key - - eval $(ssh-agent -s) - - ssh-add github_deploy_key - - git tag latest_passing_build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" - - this travis yaml is still an experiment -deploy: - provider: releases - # ⋮ - edge: true - skip_cleanup: true - on: - tags: false diff --git a/scripts/travis_before_deploy.sh b/scripts/travis_before_deploy.sh new file mode 100755 index 000000000..c5b9e49fc --- /dev/null +++ b/scripts/travis_before_deploy.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in $TRAVIS_BUILD_DIR/github_deploy_key.enc -out github_deploy_key -d +chmod 600 github_deploy_key +eval $(ssh-agent -s) +ssh-add github_deploy_key +git tag latest_passing_build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" +this travis yaml is still an experiment From 94f5706261001e549b9fc82ea5b7844eab571922 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 20:08:34 +0800 Subject: [PATCH 0336/1093] Only execute on master --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 07020c7fe..eaf6a6f51 100644 --- a/.travis.yml +++ b/.travis.yml @@ -92,6 +92,7 @@ jobs: - env: BUILD=docker_ubuntu_gcc10 - stage: "Final Build" - stage: "Deploy" + if: branch = master script: ../scripts/travis_before_deploy.sh deploy: provider: releases From d5a0e384eb800aa54c53e4950fbd1ede5e18bf82 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 20:25:46 +0800 Subject: [PATCH 0337/1093] Will this prevent the deploy on the PR? --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index eaf6a6f51..42649e865 100644 --- a/.travis.yml +++ b/.travis.yml @@ -91,8 +91,8 @@ jobs: - env: BUILD=docker_ubuntu_autotools - env: BUILD=docker_ubuntu_gcc10 - stage: "Final Build" - - stage: "Deploy" - if: branch = master + - if: branch = master + stage: "Deploy" script: ../scripts/travis_before_deploy.sh deploy: provider: releases From 166999b3278cf2436c854741a2b6c61132ed0552 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 20:43:36 +0800 Subject: [PATCH 0338/1093] Does this exclude the deploy stage from the pull request? --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 42649e865..de33d51e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -91,7 +91,7 @@ jobs: - env: BUILD=docker_ubuntu_autotools - env: BUILD=docker_ubuntu_gcc10 - stage: "Final Build" - - if: branch = master + - if: (NOT type IN (pull_request)) AND (branch = master) stage: "Deploy" script: ../scripts/travis_before_deploy.sh deploy: From 4c85f71d8f048cea01ff94a3560e19723161f3dc Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 08:37:51 +0800 Subject: [PATCH 0339/1093] Pushing the passing build tag --- scripts/travis_before_deploy.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/travis_before_deploy.sh b/scripts/travis_before_deploy.sh index c5b9e49fc..5bc5dc7db 100755 --- a/scripts/travis_before_deploy.sh +++ b/scripts/travis_before_deploy.sh @@ -1,8 +1,8 @@ -#!/bin/bash +#!/bin/bash -x openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in $TRAVIS_BUILD_DIR/github_deploy_key.enc -out github_deploy_key -d chmod 600 github_deploy_key eval $(ssh-agent -s) ssh-add github_deploy_key -git tag latest_passing_build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" -this travis yaml is still an experiment +git tag latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" +git push From 9558a0f60b813f889a4f938c6ea0f1d2ff0f557b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 09:14:28 +0800 Subject: [PATCH 0340/1093] Push the tags to Cpputest repo --- scripts/travis_before_deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_before_deploy.sh b/scripts/travis_before_deploy.sh index 5bc5dc7db..09f6f01de 100755 --- a/scripts/travis_before_deploy.sh +++ b/scripts/travis_before_deploy.sh @@ -5,4 +5,4 @@ chmod 600 github_deploy_key eval $(ssh-agent -s) ssh-add github_deploy_key git tag latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" -git push +git push https://github.com/cpputest/cpputest.git --tags From 2313370760f4db5fba08bc195b1779dbcb2c5c95 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 09:56:19 +0800 Subject: [PATCH 0341/1093] new attempt to push tag --- scripts/travis_before_deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_before_deploy.sh b/scripts/travis_before_deploy.sh index 09f6f01de..1a1b131dc 100755 --- a/scripts/travis_before_deploy.sh +++ b/scripts/travis_before_deploy.sh @@ -5,4 +5,4 @@ chmod 600 github_deploy_key eval $(ssh-agent -s) ssh-add github_deploy_key git tag latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" -git push https://github.com/cpputest/cpputest.git --tags +git push git@github.com:cpputest/cpputest.git --tags From 0407d9d739d3734522409d1ed2599327cf6a85de Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 10:43:07 +0800 Subject: [PATCH 0342/1093] Added a final build step before deploying. It'll make dist --- .travis.yml | 1 + scripts/travis_ci_build.sh | 7 ------- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index de33d51e2..a370f0d4c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -91,6 +91,7 @@ jobs: - env: BUILD=docker_ubuntu_autotools - env: BUILD=docker_ubuntu_gcc10 - stage: "Final Build" + env: BUILD=autotools - if: (NOT type IN (pull_request)) AND (branch = master) stage: "Deploy" script: ../scripts/travis_before_deploy.sh diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index ab1510748..bd61f71b4 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -27,13 +27,6 @@ if [ "x$BUILD" = "xautotools" ]; then make dist make dist-zip fi - - - if [ "x$CXX" = "xg++" ]; then - echo "Deploy please" -# gem install travis_github_deployer -# cd .. && travis_github_deployer -v || exit 1 - fi; fi if [ "x$BUILD" = "xcmake" ]; then From 61cbfa2fba591e010085c187def38fddc26e635e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 11:08:45 +0800 Subject: [PATCH 0343/1093] Added -ex to make it fail on a failed tag --- scripts/travis_before_deploy.sh | 1 + scripts/travis_ci_build.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/travis_before_deploy.sh b/scripts/travis_before_deploy.sh index 1a1b131dc..ce9c58318 100755 --- a/scripts/travis_before_deploy.sh +++ b/scripts/travis_before_deploy.sh @@ -1,4 +1,5 @@ #!/bin/bash -x +set -ex openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in $TRAVIS_BUILD_DIR/github_deploy_key.enc -out github_deploy_key -d chmod 600 github_deploy_key diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index bd61f71b4..580be5f84 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -1,6 +1,6 @@ #!/bin/bash # Script run in the travis CI -# set -ex +set -ex if [[ "$CXX" == clang* ]]; then export CXXFLAGS="-stdlib=libc++" From fbd655577a4f46496953f0ab4161796da3e8014c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 12:04:11 +0800 Subject: [PATCH 0344/1093] Force the retag --- scripts/travis_before_deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_before_deploy.sh b/scripts/travis_before_deploy.sh index ce9c58318..72bcea98f 100755 --- a/scripts/travis_before_deploy.sh +++ b/scripts/travis_before_deploy.sh @@ -5,5 +5,5 @@ openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_i chmod 600 github_deploy_key eval $(ssh-agent -s) ssh-add github_deploy_key -git tag latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" +git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" git push git@github.com:cpputest/cpputest.git --tags From 5ce206c289ba6126abc634f16dde7a94348cd4a2 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 12:35:26 +0800 Subject: [PATCH 0345/1093] Force the pushing of the new tag --- scripts/InstallScripts.sh | 3 ++- scripts/travis_before_deploy.sh | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/InstallScripts.sh b/scripts/InstallScripts.sh index 54b85e3a9..1c632e718 100755 --- a/scripts/InstallScripts.sh +++ b/scripts/InstallScripts.sh @@ -3,7 +3,8 @@ FirstLetter=${0:0:1} if [[ $FirstLetter == "/" ]] ; then CPPUTEST_HOME=${0%/scripts/*} else - CPPUTEST_HOME="$(pwd)/${0%/scripts/*}" + file=$(pwd)/${0} + CPPUTEST_HOME="${file%/scripts/*}" fi EXE_DIR=${EXE_DIR:-/usr/local/bin} diff --git a/scripts/travis_before_deploy.sh b/scripts/travis_before_deploy.sh index 72bcea98f..182e4b242 100755 --- a/scripts/travis_before_deploy.sh +++ b/scripts/travis_before_deploy.sh @@ -5,5 +5,6 @@ openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_i chmod 600 github_deploy_key eval $(ssh-agent -s) ssh-add github_deploy_key + git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" -git push git@github.com:cpputest/cpputest.git --tags +git push -f git@github.com:cpputest/cpputest.git --tags From 505f654a29a1da4d5549b91f47105938f478eca8 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 12:42:11 +0800 Subject: [PATCH 0346/1093] Removed deployer --- platforms/Eclipse-Cygwin/.project | 5 ----- 1 file changed, 5 deletions(-) diff --git a/platforms/Eclipse-Cygwin/.project b/platforms/Eclipse-Cygwin/.project index 1ba52cb7c..8f4fc691f 100644 --- a/platforms/Eclipse-Cygwin/.project +++ b/platforms/Eclipse-Cygwin/.project @@ -39,11 +39,6 @@ 1 PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/.travis.yml - - .travis_github_deployer.yml - 1 - PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/.travis_github_deployer.yml - AUTHORS 1 From 8db46655bc4303293cfe09f8a234880532511a24 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 12:44:55 +0800 Subject: [PATCH 0347/1093] Moved OSX builds earlier, so they start earlier, to speed up the travis build --- .travis.yml | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/.travis.yml b/.travis.yml index a370f0d4c..197bacc67 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,32 @@ jobs: include: - stage: "build & test" compiler: clang + os: osx + env: BUILD=cmake CPP_STD=17 + addons: + apt: + packages: + - libc++-dev + - compiler: gcc + os: osx + env: BUILD=cmake CPP_STD=14 + + - compiler: gcc + os: osx + env: BUILD=autotools + addons: + apt: + packages: + - valgrind + - compiler: clang + env: BUILD=autotools + os: osx + addons: + apt: + packages: + - libc++-dev + - valgrind + - compiler: clang env: BUILD=cmake CPP_STD=98 addons: apt: @@ -62,32 +88,6 @@ jobs: apt: packages: - dosbox - - compiler: clang - os: osx - env: BUILD=cmake CPP_STD=17 - addons: - apt: - packages: - - libc++-dev - - compiler: gcc - os: osx - env: BUILD=cmake CPP_STD=14 - - - compiler: gcc - os: osx - env: BUILD=autotools - addons: - apt: - packages: - - valgrind - - compiler: clang - env: BUILD=autotools - os: osx - addons: - apt: - packages: - - libc++-dev - - valgrind - env: BUILD=docker_ubuntu_autotools - env: BUILD=docker_ubuntu_gcc10 - stage: "Final Build" From dc1a85d70e449cfe6e329419635039d5a1255bdf Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 15:47:45 +0800 Subject: [PATCH 0348/1093] Next steps for deploying every passing build --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 197bacc67..9dc84f566 100644 --- a/.travis.yml +++ b/.travis.yml @@ -100,6 +100,9 @@ jobs: # ⋮ edge: true skip_cleanup: true + token: github_deploy_key + name: "Latest passing build" + tag: latest-passing-build on: tags: false From afb1db217b65b425dd8b178981fb4789ecd9a520 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 16:16:38 +0800 Subject: [PATCH 0349/1093] Fixing the name of the release? --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9dc84f566..09d5d898c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -101,8 +101,9 @@ jobs: edge: true skip_cleanup: true token: github_deploy_key + tag_name: latest-passing-build name: "Latest passing build" - tag: latest-passing-build + body: "This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build." on: tags: false From efb78c47bd0b2a887f0d7f8b3e0376d79cd2b6f1 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 16:51:05 +0800 Subject: [PATCH 0350/1093] New attempt --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 09d5d898c..4c5215bcd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -97,10 +97,9 @@ jobs: script: ../scripts/travis_before_deploy.sh deploy: provider: releases - # ⋮ - edge: true + api_key: + secure: skip_cleanup: true - token: github_deploy_key tag_name: latest-passing-build name: "Latest passing build" body: "This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build." From e8eb47b8f1632ebc5781e226a29e23583dbf8a5e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 16:52:03 +0800 Subject: [PATCH 0351/1093] New attempt --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4c5215bcd..1419c5e1f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -98,7 +98,7 @@ jobs: deploy: provider: releases api_key: - secure: + secure: github_deploy_key skip_cleanup: true tag_name: latest-passing-build name: "Latest passing build" From ed761d6daf18d6d7391f611e540800e08e4f253e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 17:20:19 +0800 Subject: [PATCH 0352/1093] Avoiding double builds on deployment --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index 1419c5e1f..987e9945d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,11 @@ language: cpp dist: bionic +# Do not let the tag trigger a build. +branches: + except: + - latest-passing-build + jobs: include: - stage: "build & test" From d4a6e82df583045a74b314a2fd75023390497c28 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 18:29:01 +0800 Subject: [PATCH 0353/1093] Token removed for now. Is it needed? --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 987e9945d..13a2dacd7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -102,8 +102,6 @@ jobs: script: ../scripts/travis_before_deploy.sh deploy: provider: releases - api_key: - secure: github_deploy_key skip_cleanup: true tag_name: latest-passing-build name: "Latest passing build" From 305576fe98c3395642127fbf31f1901dfad20818 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 20:23:34 +0800 Subject: [PATCH 0354/1093] Using github OAuth token? --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 13a2dacd7..bb31d3d0d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -100,6 +100,7 @@ jobs: - if: (NOT type IN (pull_request)) AND (branch = master) stage: "Deploy" script: ../scripts/travis_before_deploy.sh + api-key: "GITHUB OAUTH TOKEN" deploy: provider: releases skip_cleanup: true @@ -124,4 +125,6 @@ after_success: before_deploy: - +env: + global: + secure: O98m3aZQaKYWnEHlAR9XBRLnJpusBRwWKLwzOraHIrlxJ3Xy0QU1G/QOWb2lII2FWcCdeTYU77VIMvbZ5vt7wggS1/dUfN/5faO70g8UMJh4+QPqA+jHYcf4cZvAiScFYEmp8ptTxecnKMFRNWTrZGbY8xoFfMk6LyOje0KcPK4= From c23721d170573f9f884846b56f2161ca21049840 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 20:25:29 +0800 Subject: [PATCH 0355/1093] Ah like this, perhaps --- .travis.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index bb31d3d0d..0a01c80d4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -100,7 +100,8 @@ jobs: - if: (NOT type IN (pull_request)) AND (branch = master) stage: "Deploy" script: ../scripts/travis_before_deploy.sh - api-key: "GITHUB OAUTH TOKEN" + api-key: + secure: O98m3aZQaKYWnEHlAR9XBRLnJpusBRwWKLwzOraHIrlxJ3Xy0QU1G/QOWb2lII2FWcCdeTYU77VIMvbZ5vt7wggS1/dUfN/5faO70g8UMJh4+QPqA+jHYcf4cZvAiScFYEmp8ptTxecnKMFRNWTrZGbY8xoFfMk6LyOje0KcPK4= deploy: provider: releases skip_cleanup: true @@ -122,9 +123,3 @@ after_failure: after_success: - "../scripts/travis_ci_after.sh" - -before_deploy: - -env: - global: - secure: O98m3aZQaKYWnEHlAR9XBRLnJpusBRwWKLwzOraHIrlxJ3Xy0QU1G/QOWb2lII2FWcCdeTYU77VIMvbZ5vt7wggS1/dUfN/5faO70g8UMJh4+QPqA+jHYcf4cZvAiScFYEmp8ptTxecnKMFRNWTrZGbY8xoFfMk6LyOje0KcPK4= From 4364f60db18c0a6391c431c034c0725b0f68ae86 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 23 Apr 2020 20:41:56 +0800 Subject: [PATCH 0356/1093] Wrong place, getting late. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0a01c80d4..24c594cf5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -100,11 +100,11 @@ jobs: - if: (NOT type IN (pull_request)) AND (branch = master) stage: "Deploy" script: ../scripts/travis_before_deploy.sh - api-key: - secure: O98m3aZQaKYWnEHlAR9XBRLnJpusBRwWKLwzOraHIrlxJ3Xy0QU1G/QOWb2lII2FWcCdeTYU77VIMvbZ5vt7wggS1/dUfN/5faO70g8UMJh4+QPqA+jHYcf4cZvAiScFYEmp8ptTxecnKMFRNWTrZGbY8xoFfMk6LyOje0KcPK4= deploy: provider: releases skip_cleanup: true + api-key: + secure: O98m3aZQaKYWnEHlAR9XBRLnJpusBRwWKLwzOraHIrlxJ3Xy0QU1G/QOWb2lII2FWcCdeTYU77VIMvbZ5vt7wggS1/dUfN/5faO70g8UMJh4+QPqA+jHYcf4cZvAiScFYEmp8ptTxecnKMFRNWTrZGbY8xoFfMk6LyOje0KcPK4= tag_name: latest-passing-build name: "Latest passing build" body: "This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build." From 32732ba9646e8688cc6876dc37b0bbdb5442cbbb Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 08:32:34 +0800 Subject: [PATCH 0357/1093] Use OAuth token also for tagging? Will the release also push? --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 24c594cf5..4799ebc1a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -99,7 +99,7 @@ jobs: env: BUILD=autotools - if: (NOT type IN (pull_request)) AND (branch = master) stage: "Deploy" - script: ../scripts/travis_before_deploy.sh + - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" deploy: provider: releases skip_cleanup: true From 9db9fd3cb181cab785b03d253b24287b46fb0a55 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 09:58:28 +0800 Subject: [PATCH 0358/1093] Removed some travis warnings --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4799ebc1a..c9af405b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -102,12 +102,11 @@ jobs: - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" deploy: provider: releases - skip_cleanup: true - api-key: + token: secure: O98m3aZQaKYWnEHlAR9XBRLnJpusBRwWKLwzOraHIrlxJ3Xy0QU1G/QOWb2lII2FWcCdeTYU77VIMvbZ5vt7wggS1/dUfN/5faO70g8UMJh4+QPqA+jHYcf4cZvAiScFYEmp8ptTxecnKMFRNWTrZGbY8xoFfMk6LyOje0KcPK4= tag_name: latest-passing-build name: "Latest passing build" - body: "This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build." + release_notes: "This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build." on: tags: false From 946761336aa4ab4dfe8f99b25791c541a5f3c9b5 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 10:02:02 +0800 Subject: [PATCH 0359/1093] Removed unneeded || exit to trigger travis build --- scripts/travis_ci_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 580be5f84..e8430c7dc 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -112,7 +112,7 @@ if [ "x$BUILD" = "xmake_dos" ]; then export CC=wcl export CXX=wcl $CC --version - make -f $CPPUTEST_HOME/platforms/Dos/Makefile || exit 1 - $CPPUTEST_HOME/platforms/Dos/alltests.sh || exit 1 + make -f $CPPUTEST_HOME/platforms/Dos/Makefile + $CPPUTEST_HOME/platforms/Dos/alltests.sh fi From e4ac9ba966b01273c24ebb9dceb446b67a0ecd83 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 10:13:39 +0800 Subject: [PATCH 0360/1093] Test to check why the travis build is not triggered --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index c9af405b5..5e20c0c35 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,9 @@ language: cpp dist: bionic # Do not let the tag trigger a build. -branches: - except: - - latest-passing-build +#branches: +# except: +# - latest-passing-build jobs: include: From a5d2794abbfeab553c62b7edeeba5320975850da Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 10:26:56 +0800 Subject: [PATCH 0361/1093] Can trigger builds through pull request? --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5e20c0c35..c9af405b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,9 @@ language: cpp dist: bionic # Do not let the tag trigger a build. -#branches: -# except: -# - latest-passing-build +branches: + except: + - latest-passing-build jobs: include: From 5d8e7037445601d6a4ff83504331d2adc853d89a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 10:41:56 +0800 Subject: [PATCH 0362/1093] An attempt to compare the cmake and automake installation in the build --- Makefile.am | 16 ++++++++++++++++ scripts/travis_ci_build.sh | 29 +++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/Makefile.am b/Makefile.am index fa3f7624b..061591d4f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -24,6 +24,21 @@ TESTS = $(check_PROGRAMS) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = cpputest.pc +cmakemodulesdir = $(libdir)/CppUTest/cmake/Modules +cmakemodules_DATA = \ + cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake + +cmakescriptsdir = $(libdir)/CppUTest/cmake/Scripts +cmakescripts_DATA = \ + cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake + +cmakedir = $(libdir)/CppUTest/cmake +cmake_DATA = \ + build/cmake_package_files/CppUTestConfig.cmake \ + build/cmake_package_files/CppUTestConfigVersion.cmake \ + build/cmake_package_files/CppUTestTargets-relwithdebinfo.cmake \ + build/cmake_package_files/CppUTestTargets.cmake + EXTRA_DIST = \ cpputest.pc.in \ $(ALL_FILES_IN_GIT) @@ -109,6 +124,7 @@ if INCLUDE_CPPUTEST_EXT include_cpputestextdir = $(includedir)/CppUTestExt include_cpputestext_HEADERS = \ + include/CppUTestExt/CodeMemoryReportFormatter.h \ include/CppUTestExt/GMock.h \ include/CppUTestExt/GTest.h \ include/CppUTestExt/GTestSupport.h \ diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index e8430c7dc..03d5e8c73 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -90,6 +90,35 @@ if [ "x$BUILD" = "xcmake_coverage" ]; then coveralls -b . -r .. -i "src" -i "include" --gcov-options="-lbc" || true fi +if [ "x$BUILD" = "xautotools_cmake_install_test" ]; then + autoreconf -i .. + ../configure + rm -rf install_autotools + mkdir -p install_autotools + make DESTDIR=install_autotools install + + cmake .. + rm -rf install_cmake + mkdir -p install_cmake + make DESTDIR=install_cmake install + + export INSTALL_DIFF=`diff -rq install_autotools install_cmake | grep -v CppUTestGeneratedConfig.h | grep -v libCppUTest.a | grep -v libCppUTestExt.a` + if [ "x$INSTALL_DIFF" != "x" ]; then + echo "FAILED: CMake install and Autotools install is not the same!\n" + echo "Difference\n" + echo "-------------------------------\n" + echo "$INSTALL_DIFF" + echo "-------------------------------\n" + exit 1; + fi + + # Hack: autotools cannot make CMake package. We cached and copied them. Here we check they are still the same + for cmakefile in CppUTestConfig.cmake /CppUTestConfigVersion.cmake; do + diff install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile || exit 1 + done + diff install_autotools/usr/local/lib/CppUTest/cmake//CppUTestConfigVersion.cmake install_cmale/usr/local/lib/CppUTest/cmake//CppUTestConfigVersion.cmake +fi + if [ "x$BUILD" = "xdocker_ubuntu_autotools" ]; then $CPPUTEST_HOME/scripts/create_docker_images_and_containers ubuntu docker start -i cpputest_ubuntu From 5d3aff0c8151444e0bd4eaa912d94834e5c213ea Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 13:40:31 +0800 Subject: [PATCH 0363/1093] Added support for address sanitizer --- Makefile.am | 3 +++ configure.ac | 10 +++++++ include/CppUTest/CppUTestConfig.h | 26 +++++++++++++++++++ tests/CppUTest/MemoryOperatorOverloadTest.cpp | 24 ++++++++++++++--- tests/CppUTest/TestMemoryAllocatorTest.cpp | 7 +++-- tests/CppUTest/UtestPlatformTest.cpp | 14 ++++++---- 6 files changed, 74 insertions(+), 10 deletions(-) diff --git a/Makefile.am b/Makefile.am index 061591d4f..071b87e08 100644 --- a/Makefile.am +++ b/Makefile.am @@ -345,6 +345,9 @@ check_basic: @echo "Building without memory leak detection" make distclean; $(srcdir)/configure --disable-memory-leak-detection; make check + @echo "Building with address sanitizer" + make distclean; $(srcdir)/configure --enable-sanitize-address; make check + @echo "Building without memory leak detection and without Standard C++" make distclean; $(srcdir)/configure --disable-memory-leak-detection --disable-std-cpp; make check diff --git a/configure.ac b/configure.ac index 9c26bf6d6..aa3d88099 100644 --- a/configure.ac +++ b/configure.ac @@ -391,6 +391,9 @@ AC_ARG_ENABLE([generate-map-file], [AC_HELP_STRING([--enable-generate-map-file], AC_ARG_ENABLE([coverage], [AC_HELP_STRING([--enable-coverage], [enable running with coverage])], [coverage=${enableval}], [coverage=no]) +AC_ARG_ENABLE([sanitize-address], [AC_HELP_STRING([--enable-sanitize-address], [enable running with address sanitizer])], + [sanitize_address=${enableval}], [sanitize_address=no]) + ############################## Setting options ############################### AM_CONDITIONAL([INCLUDE_CPPUTEST_EXT], [test "x${cpputest_ext}" = xyes]) @@ -451,6 +454,12 @@ if test "x${use_longlong}" = xno; then AC_DEFINE([LONG_LONG_DISABLED], 1, [disable long long]) fi +# Dealing with address sanitizer +if test "x${sanitize_address}" = xyes; then + CPPUTEST_CFLAGS="${CPPUTEST_CFLAGS} -fsanitize=address" + CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} -fsanitize=address" +fi + # Generating map files. if test "x${generate_map_file}" = xyes; then CPPUTEST_LDFLAGS="${CPPUTEST_LDFLAGS} ${CPPUTEST_LD_MAP_GENERATION}" @@ -579,6 +588,7 @@ Features configured in ${PACKAGE_NAME}: Compiling extensions: ${cpputest_ext} Use Long Long (if available): ${use_longlong} Disable CppUTest compile/link flags: ${cpputest_flags} + Address sanitizer: ${sanitize_address} Using Standard C++ Library: ${use_std_cpp} Using Standard C Library: ${use_std_c} diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index b5216f4f9..f7994c092 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -167,6 +167,32 @@ #endif #endif +/* + * Address sanitizer is a good thing... and it causes some conflicts with the CppUTest tests + * To check whether it is on or off, we create a CppUTest define here. +*/ +#if defined(__has_feature) +#if __has_feature(address_sanitizer) +#define CPPUTEST_SANITIZE_ADDRESS 1 +#endif +#endif + +#ifdef __SANITIZE_ADDRESS__ +#define CPPUTEST_SANITIZE_ADDRESS 1 +#endif + +#ifndef CPPUTEST_SANITIZE_ADDRESS +#define CPPUTEST_SANITIZE_ADDRESS 0 +#endif + +#if CPPUTEST_SANITIZE_ADDRESS +#define CPPUTEST_SANITIZE_ADDRESS 1 +#define CPPUTEST_DO_NOT_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) +#else +#define CPPUTEST_SANITIZER_ADDRESS 0 +#define CPPUTEST_DO_NOT_SANITIZE_ADDRESS +#endif + /* * Handling of IEEE754 floating point exceptions via fenv.h * Predominantly works on non-Visual C++ compilers and Visual C++ 2008 and newer diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index 6aecf0310..098225cda 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -22,7 +22,8 @@ TEST(BasicBehavior, CanDeleteNullPointers) #ifndef CPPUTEST_MEM_LEAK_DETECTION_DISABLED -TEST(BasicBehavior, deleteArrayInvalidatesMemory) +CPPUTEST_DO_NOT_SANITIZE_ADDRESS +static void deleteArrayInvalidatesMemory() { unsigned char* memory = new unsigned char[10]; PlatformSpecificMemset(memory, 0xAB, 10); @@ -30,7 +31,13 @@ TEST(BasicBehavior, deleteArrayInvalidatesMemory) CHECK(memory[5] != 0xCB); } -TEST(BasicBehavior, deleteInvalidatesMemory) +TEST(BasicBehavior, deleteArrayInvalidatesMemory) +{ + deleteArrayInvalidatesMemory(); +} + +CPPUTEST_DO_NOT_SANITIZE_ADDRESS +static void deleteInvalidatesMemory() { unsigned char* memory = new unsigned char; *memory = 0xAD; @@ -38,6 +45,11 @@ TEST(BasicBehavior, deleteInvalidatesMemory) CHECK(*memory != 0xAD); } +TEST(BasicBehavior, deleteInvalidatesMemory) +{ + deleteInvalidatesMemory(); +} + #if __cplusplus >= 201402L TEST(BasicBehavior, DeleteWithSizeParameterWorks) { @@ -91,13 +103,19 @@ TEST(BasicBehavior, bothMallocAndFreeAreOverloaded) #if CPPUTEST_USE_MEM_LEAK_DETECTION -TEST(BasicBehavior, freeInvalidatesMemory) +CPPUTEST_DO_NOT_SANITIZE_ADDRESS +static void freeInvalidatesMemory() { unsigned char* memory = (unsigned char*) cpputest_malloc(sizeof(unsigned char)); *memory = 0xAD; cpputest_free(memory); CHECK(*memory != 0xAD); } + +TEST(BasicBehavior, freeInvalidatesMemory) +{ + freeInvalidatesMemory(); +} #endif TEST_GROUP(MemoryLeakOverridesToBeUsedInProductionCode) diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 2a76a7ebe..e67b1ae13 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -28,6 +28,7 @@ #include "CppUTest/TestHarness.h" #include "CppUTest/TestMemoryAllocator.h" #include "CppUTest/PlatformSpecificFunctions.h" +#include "CppUTest/TestTestingFixture.h" TEST_GROUP(TestMemoryAllocatorTest) { @@ -112,6 +113,8 @@ TEST(TestMemoryAllocatorTest, NullUnknownNames) STRCMP_EQUAL("unknown", allocator->free_name()); } +#if (! CPPUTEST_SANITIZE_ADDRESS) + #define MAX_SIZE_FOR_ALLOC ((size_t) -1 > (unsigned short)-1) ? (size_t) -97 : (size_t) -1 static void failTryingToAllocateTooMuchMemory(void) @@ -120,8 +123,6 @@ static void failTryingToAllocateTooMuchMemory(void) allocator.alloc_memory(MAX_SIZE_FOR_ALLOC, "file", 1); } // LCOV_EXCL_LINE -#include "CppUTest/TestTestingFixture.h" - TEST(TestMemoryAllocatorTest, TryingToAllocateTooMuchFailsTest) { TestTestingFixture fixture; @@ -130,6 +131,8 @@ TEST(TestMemoryAllocatorTest, TryingToAllocateTooMuchFailsTest) fixture.assertPrintContains("malloc returned null pointer"); } +#endif + #if CPPUTEST_USE_MEM_LEAK_DETECTION #if CPPUTEST_USE_MALLOC_MACROS diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index 548debf53..6ef35aa5a 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -94,11 +94,6 @@ extern "C" { static int waitpid_failed_stub(int, int*, int) { return -1; } } -static int _accessViolationTestFunction() -{ - return *(volatile int*) NULLPTR; -} - #include #include @@ -123,6 +118,13 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, FailureInSepa fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out"); } +#if (! CPPUTEST_SANITIZE_ADDRESS) + +static int _accessViolationTestFunction() +{ + return *(volatile int*) NULLPTR; +} + TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, AccessViolationInSeparateProcessWorks) { fixture.registry_->setRunTestsInSeperateProcess(); @@ -132,6 +134,8 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, AccessViolati fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran"); } +#endif + TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, StoppedInSeparateProcessWorks) { fixture.registry_->setRunTestsInSeperateProcess(); From 67bc727fcd48f7bfe223a62599b256f591d42929 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 14:35:12 +0800 Subject: [PATCH 0364/1093] Travis yaml was invalid --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c9af405b5..d05a78d4d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -99,7 +99,7 @@ jobs: env: BUILD=autotools - if: (NOT type IN (pull_request)) AND (branch = master) stage: "Deploy" - - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" + script: ./.scripts/travis_before_deploy.sh deploy: provider: releases token: From 0a4c2d29f5989e8e74b128d828d3c9ab4f1ff68c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 14:51:55 +0800 Subject: [PATCH 0365/1093] Typo in path --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d05a78d4d..22382d3b6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -99,7 +99,7 @@ jobs: env: BUILD=autotools - if: (NOT type IN (pull_request)) AND (branch = master) stage: "Deploy" - script: ./.scripts/travis_before_deploy.sh + script: ../scripts/travis_before_deploy.sh deploy: provider: releases token: From 97cf6e9590425b1d6b29d777e7c8ae63b82a962e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 15:06:31 +0800 Subject: [PATCH 0366/1093] Retry to see if the deploy also pushes the tag --- scripts/travis_before_deploy.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/travis_before_deploy.sh b/scripts/travis_before_deploy.sh index 182e4b242..37a0ded11 100755 --- a/scripts/travis_before_deploy.sh +++ b/scripts/travis_before_deploy.sh @@ -1,10 +1,10 @@ #!/bin/bash -x set -ex -openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in $TRAVIS_BUILD_DIR/github_deploy_key.enc -out github_deploy_key -d -chmod 600 github_deploy_key -eval $(ssh-agent -s) -ssh-add github_deploy_key +# openssl aes-256-cbc -K $encrypted_8ebb1ef83f64_key -iv $encrypted_8ebb1ef83f64_iv -in $TRAVIS_BUILD_DIR/github_deploy_key.enc -out github_deploy_key -d +# chmod 600 github_deploy_key +# eval $(ssh-agent -s) +# ssh-add github_deploy_key git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" -git push -f git@github.com:cpputest/cpputest.git --tags +# git push -f git@github.com:cpputest/cpputest.git --tags From 7b475d3c76d11c9b2f9acab7e4ce5e47e8b332a9 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 15:34:53 +0800 Subject: [PATCH 0367/1093] Moving the tagging to the yaml file --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 22382d3b6..3af236eac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -99,7 +99,8 @@ jobs: env: BUILD=autotools - if: (NOT type IN (pull_request)) AND (branch = master) stage: "Deploy" - script: ../scripts/travis_before_deploy.sh + script: + - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" deploy: provider: releases token: From caf6a6837547639cf0d8c3b652fdd52b8f8fce4d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 15:50:39 +0800 Subject: [PATCH 0368/1093] Trying to push from travis yaml. Should fail --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 3af236eac..3850e058c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -101,6 +101,7 @@ jobs: stage: "Deploy" script: - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" + - git push -f git@github.com:cpputest/cpputest.git --tags deploy: provider: releases token: From 3d32e5e3030f5e1ccd755631a36f0bd1aab005f1 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 16:06:38 +0800 Subject: [PATCH 0369/1093] Added slack notifications. Reformatted so we can use command line travis changes --- .travis.yml | 227 +++++++++++++++++++++++++--------------------------- 1 file changed, 110 insertions(+), 117 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3850e058c..68c0496df 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,126 +1,119 @@ language: cpp - dist: bionic - -# Do not let the tag trigger a build. branches: except: - - latest-passing-build - + - latest-passing-build jobs: - include: - - stage: "build & test" - compiler: clang - os: osx - env: BUILD=cmake CPP_STD=17 - addons: - apt: - packages: - - libc++-dev - - compiler: gcc - os: osx - env: BUILD=cmake CPP_STD=14 - - - compiler: gcc - os: osx - env: BUILD=autotools - addons: - apt: - packages: - - valgrind - - compiler: clang - env: BUILD=autotools - os: osx - addons: - apt: - packages: - - libc++-dev - - valgrind - - compiler: clang - env: BUILD=cmake CPP_STD=98 - addons: - apt: - packages: - - libc++-dev - - compiler: clang - env: BUILD=cmake CPP_STD=11 - addons: - apt: - packages: - - libc++-dev - - compiler: clang - env: BUILD=cmake CPP_STD=14 - addons: - apt: - packages: - - libc++-dev - - compiler: clang - env: BUILD=cmake CPP_STD=17 - addons: - apt: - packages: - - libc++-dev - - - compiler: gcc - env: BUILD=cmake CPP_STD=98 - - compiler: gcc - env: BUILD=cmake CPP_STD=11 - - compiler: gcc - env: BUILD=cmake CPP_STD=14 - - compiler: gcc - env: BUILD=cmake CPP_STD=17 - - - compiler: gcc - env: BUILD=autotools - addons: - apt: - packages: - - valgrind - - compiler: clang - env: BUILD=autotools - addons: - apt: - packages: - - libc++-dev - - valgrind - - - compiler: gcc - env: BUILD=cmake_coverage - - compiler: gcc - env: BUILD=cmake_gtest - - env: BUILD=make_dos - addons: - apt: - packages: - - dosbox - - env: BUILD=docker_ubuntu_autotools - - env: BUILD=docker_ubuntu_gcc10 - - stage: "Final Build" - env: BUILD=autotools - - if: (NOT type IN (pull_request)) AND (branch = master) - stage: "Deploy" - script: - - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" - - git push -f git@github.com:cpputest/cpputest.git --tags - deploy: - provider: releases - token: - secure: O98m3aZQaKYWnEHlAR9XBRLnJpusBRwWKLwzOraHIrlxJ3Xy0QU1G/QOWb2lII2FWcCdeTYU77VIMvbZ5vt7wggS1/dUfN/5faO70g8UMJh4+QPqA+jHYcf4cZvAiScFYEmp8ptTxecnKMFRNWTrZGbY8xoFfMk6LyOje0KcPK4= - tag_name: latest-passing-build - name: "Latest passing build" - release_notes: "This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build." - on: - tags: false - + include: + - stage: build & test + compiler: clang + os: osx + env: BUILD=cmake CPP_STD=17 + addons: + apt: + packages: + - libc++-dev + - compiler: gcc + os: osx + env: BUILD=cmake CPP_STD=14 + - compiler: gcc + os: osx + env: BUILD=autotools + addons: + apt: + packages: + - valgrind + - compiler: clang + env: BUILD=autotools + os: osx + addons: + apt: + packages: + - libc++-dev + - valgrind + - compiler: clang + env: BUILD=cmake CPP_STD=98 + addons: + apt: + packages: + - libc++-dev + - compiler: clang + env: BUILD=cmake CPP_STD=11 + addons: + apt: + packages: + - libc++-dev + - compiler: clang + env: BUILD=cmake CPP_STD=14 + addons: + apt: + packages: + - libc++-dev + - compiler: clang + env: BUILD=cmake CPP_STD=17 + addons: + apt: + packages: + - libc++-dev + - compiler: gcc + env: BUILD=cmake CPP_STD=98 + - compiler: gcc + env: BUILD=cmake CPP_STD=11 + - compiler: gcc + env: BUILD=cmake CPP_STD=14 + - compiler: gcc + env: BUILD=cmake CPP_STD=17 + - compiler: gcc + env: BUILD=autotools + addons: + apt: + packages: + - valgrind + - compiler: clang + env: BUILD=autotools + addons: + apt: + packages: + - libc++-dev + - valgrind + - compiler: gcc + env: BUILD=cmake_coverage + - compiler: gcc + env: BUILD=cmake_gtest + - env: BUILD=make_dos + addons: + apt: + packages: + - dosbox + - env: BUILD=docker_ubuntu_autotools + - env: BUILD=docker_ubuntu_gcc10 + - stage: Final Build + env: BUILD=autotools + - if: "(NOT type IN (pull_request)) AND (branch = master)" + stage: Deploy + script: + - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build + $TRAVIS_BUILD_NUMBER" + - git push -f git@github.com:cpputest/cpputest.git --tags + deploy: + provider: releases + token: + secure: O98m3aZQaKYWnEHlAR9XBRLnJpusBRwWKLwzOraHIrlxJ3Xy0QU1G/QOWb2lII2FWcCdeTYU77VIMvbZ5vt7wggS1/dUfN/5faO70g8UMJh4+QPqA+jHYcf4cZvAiScFYEmp8ptTxecnKMFRNWTrZGbY8xoFfMk6LyOje0KcPK4= + tag_name: latest-passing-build + name: Latest passing build + release_notes: This is the automatic release from Travis CI. Whenever a build + passes, it gets released as Latest Passing Build. + on: + tags: false before_script: - - export CPPUTEST_BUILD_DIR=$TRAVIS_BUILD_DIR/cpputest_build - - mkdir -p $CPPUTEST_BUILD_DIR && cd $CPPUTEST_BUILD_DIR - +- export CPPUTEST_BUILD_DIR=$TRAVIS_BUILD_DIR/cpputest_build +- mkdir -p $CPPUTEST_BUILD_DIR && cd $CPPUTEST_BUILD_DIR script: - - "../scripts/travis_ci_build.sh" - +- "../scripts/travis_ci_build.sh" after_failure: - - "../scripts/travis_ci_after.sh" - +- "../scripts/travis_ci_after.sh" after_success: - - "../scripts/travis_ci_after.sh" +- "../scripts/travis_ci_after.sh" +notifications: + slack: + secure: oOx4AGIiJB+j1pkIxlLeQh5qp7TF89Sj+3RzJRQuo6z0HocTz9yJgXPlDh1H9rLj5SxK/UKsk+WFafVuPdWakQ40LeYO49C/+e+mCDcS0ujLka6dvIE8v0SEb1PuaAGjJWdhiviAhSqu9YOKPYZs37lD3oqepuEpxeiXwsur9QU= From 04be417d0f3ecc4677f2b5ecb90f2095e78d6012 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 16:26:21 +0800 Subject: [PATCH 0370/1093] Added info on CppUTest slack channel --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e0d60ffb8..5fb2aece2 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,9 @@ AppVeyor Windows build status: Coverage: [![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) +Slack channel: +[Join if link not expired](https://join.slack.com/t/cpputest/shared_invite/zt-dvhne8z8-i_sOcxMF3oYvjoN~qpwiDw) + ## Getting Started You'll need to do the following to get started: From fb5de4829f06a8949ce507d72e81370d247d790d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 16:30:22 +0800 Subject: [PATCH 0371/1093] Added new encrypted token --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 68c0496df..1c5c0197e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -117,3 +117,6 @@ after_success: notifications: slack: secure: oOx4AGIiJB+j1pkIxlLeQh5qp7TF89Sj+3RzJRQuo6z0HocTz9yJgXPlDh1H9rLj5SxK/UKsk+WFafVuPdWakQ40LeYO49C/+e+mCDcS0ujLka6dvIE8v0SEb1PuaAGjJWdhiviAhSqu9YOKPYZs37lD3oqepuEpxeiXwsur9QU= +env: + global: + secure: H6djbn5YP1P62n//ergaRZ4lIkneCzWp1Ok4F71kvvNiwlRzYDGll4kJT6MhVq6bBHeR81W/lwUd+RdjyqsJpVhj7DHXC/0k0h0xpAAm7LUhOl+6mIII1uhcMFqbeHvilwvDCzTQ6qv8Mzd1g0QfUECrmti9/U+/TTFJG0r0Zuc= From 403ab46ecba36ce81a5d842b538c035734fec9dc Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 16:31:40 +0800 Subject: [PATCH 0372/1093] Use the token for deploy --- .travis.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1c5c0197e..6b73a1051 100644 --- a/.travis.yml +++ b/.travis.yml @@ -92,13 +92,11 @@ jobs: - if: "(NOT type IN (pull_request)) AND (branch = master)" stage: Deploy script: - - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build - $TRAVIS_BUILD_NUMBER" - - git push -f git@github.com:cpputest/cpputest.git --tags + # - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" + # - git push -f git@github.com:cpputest/cpputest.git --tags deploy: provider: releases - token: - secure: O98m3aZQaKYWnEHlAR9XBRLnJpusBRwWKLwzOraHIrlxJ3Xy0QU1G/QOWb2lII2FWcCdeTYU77VIMvbZ5vt7wggS1/dUfN/5faO70g8UMJh4+QPqA+jHYcf4cZvAiScFYEmp8ptTxecnKMFRNWTrZGbY8xoFfMk6LyOje0KcPK4= + token: $(GH_TOKEN) tag_name: latest-passing-build name: Latest passing build release_notes: This is the automatic release from Travis CI. Whenever a build From 279933adae7974f1eec79f9a3d0a37dc812382ac Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 16:58:50 +0800 Subject: [PATCH 0373/1093] Wrong variable format and empty script section let to trouble --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6b73a1051..600557a66 100644 --- a/.travis.yml +++ b/.travis.yml @@ -92,11 +92,10 @@ jobs: - if: "(NOT type IN (pull_request)) AND (branch = master)" stage: Deploy script: - # - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" - # - git push -f git@github.com:cpputest/cpputest.git --tags + - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" deploy: provider: releases - token: $(GH_TOKEN) + token: $GH_TOKEN tag_name: latest-passing-build name: Latest passing build release_notes: This is the automatic release from Travis CI. Whenever a build From ac732123071bc076b08332f0cf6860cd74c5e6ff Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 17:17:08 +0800 Subject: [PATCH 0374/1093] push tag with Github token --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 600557a66..ec842d760 100644 --- a/.travis.yml +++ b/.travis.yml @@ -93,6 +93,7 @@ jobs: stage: Deploy script: - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" + - git push -f https://cpputest-travis:$GH_TOKEN@github.com/cpputest/cpputest.git --tags deploy: provider: releases token: $GH_TOKEN From d45eecd310b893eb1e1b0279d5effd15f639cdec Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 18:15:33 +0800 Subject: [PATCH 0375/1093] Removing travis things that we don't use anymore --- github_deploy_key.enc | Bin 3408 -> 0 bytes scripts/travis_before_deploy.sh | 10 ---------- 2 files changed, 10 deletions(-) delete mode 100644 github_deploy_key.enc delete mode 100755 scripts/travis_before_deploy.sh diff --git a/github_deploy_key.enc b/github_deploy_key.enc deleted file mode 100644 index d5e40f70e4024d191971741659abfc785dae483b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3408 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 Date: Fri, 24 Apr 2020 18:20:29 +0800 Subject: [PATCH 0376/1093] Compare the CMake install and autotools install to ensure they are mostly the same --- .travis.yml | 2 ++ scripts/travis_ci_build.sh | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ec842d760..1b99b63e1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -63,6 +63,8 @@ jobs: env: BUILD=cmake CPP_STD=14 - compiler: gcc env: BUILD=cmake CPP_STD=17 + - compiler: gcc + env: BUILD=autotools_cmake_install_test - compiler: gcc env: BUILD=autotools addons: diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 03d5e8c73..c9203aadc 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -116,7 +116,6 @@ if [ "x$BUILD" = "xautotools_cmake_install_test" ]; then for cmakefile in CppUTestConfig.cmake /CppUTestConfigVersion.cmake; do diff install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile || exit 1 done - diff install_autotools/usr/local/lib/CppUTest/cmake//CppUTestConfigVersion.cmake install_cmale/usr/local/lib/CppUTest/cmake//CppUTestConfigVersion.cmake fi if [ "x$BUILD" = "xdocker_ubuntu_autotools" ]; then From bf15b0c2b80663ae7ef1f5e1c17b405a4a03597b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 19:45:13 +0800 Subject: [PATCH 0377/1093] Cached CMake files for autotools CMake package deployment --- .../cmake_package_files/CppUTestConfig.cmake | 32 ++++++ .../CppUTestConfigVersion.cmake | 51 +++++++++ .../CppUTestTargets-relwithdebinfo.cmake | 29 +++++ .../cmake_package_files/CppUTestTargets.cmake | 101 ++++++++++++++++++ scripts/travis_ci_build.sh | 2 +- 5 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 build/cmake_package_files/CppUTestConfig.cmake create mode 100644 build/cmake_package_files/CppUTestConfigVersion.cmake create mode 100644 build/cmake_package_files/CppUTestTargets-relwithdebinfo.cmake create mode 100644 build/cmake_package_files/CppUTestTargets.cmake diff --git a/build/cmake_package_files/CppUTestConfig.cmake b/build/cmake_package_files/CppUTestConfig.cmake new file mode 100644 index 000000000..cce1985ae --- /dev/null +++ b/build/cmake_package_files/CppUTestConfig.cmake @@ -0,0 +1,32 @@ + +####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() ####### +####### Any changes to this file will be overwritten by the next CMake run #### +####### The input file was CppUTestConfig.cmake.install.in ######## + +get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE) + +macro(set_and_check _var _file) + set(${_var} "${_file}") + if(NOT EXISTS "${_file}") + message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !") + endif() +endmacro() + +macro(check_required_components _NAME) + foreach(comp ${${_NAME}_FIND_COMPONENTS}) + if(NOT ${_NAME}_${comp}_FOUND) + if(${_NAME}_FIND_REQUIRED_${comp}) + set(${_NAME}_FOUND FALSE) + endif() + endif() + endforeach() +endmacro() + +#################################################################################### + +set_and_check(CppUTest_INCLUDE_DIRS "${PACKAGE_PREFIX_DIR}/include") +include("${CMAKE_CURRENT_LIST_DIR}/CppUTestTargets.cmake") +set(CppUTest_LIBRARIES CppUTest CppUTestExt) +include("${CMAKE_CURRENT_LIST_DIR}/Modules/CppUTestBuildTimeDiscoverTests.cmake") + +check_required_components(CppUTest) diff --git a/build/cmake_package_files/CppUTestConfigVersion.cmake b/build/cmake_package_files/CppUTestConfigVersion.cmake new file mode 100644 index 000000000..c9ecfd431 --- /dev/null +++ b/build/cmake_package_files/CppUTestConfigVersion.cmake @@ -0,0 +1,51 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version, +# but only if the requested major version is the same as the current one. +# The variable CVF_VERSION must be set before calling configure_file(). + + +set(PACKAGE_VERSION "3.8") + +if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + + if("3.8" MATCHES "^([0-9]+)\\.") + set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}") + else() + set(CVF_VERSION_MAJOR "3.8") + endif() + + if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR) + set(PACKAGE_VERSION_COMPATIBLE TRUE) + else() + set(PACKAGE_VERSION_COMPATIBLE FALSE) + endif() + + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() + + +# if the installed project requested no architecture check, don't perform the check +if("FALSE") + return() +endif() + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8") + math(EXPR installedBits "8 * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/build/cmake_package_files/CppUTestTargets-relwithdebinfo.cmake b/build/cmake_package_files/CppUTestTargets-relwithdebinfo.cmake new file mode 100644 index 000000000..31ffbf4ba --- /dev/null +++ b/build/cmake_package_files/CppUTestTargets-relwithdebinfo.cmake @@ -0,0 +1,29 @@ +#---------------------------------------------------------------- +# Generated CMake target import file for configuration "RelWithDebInfo". +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Import target "CppUTest" for configuration "RelWithDebInfo" +set_property(TARGET CppUTest APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO) +set_target_properties(CppUTest PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_RELWITHDEBINFO "CXX" + IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib/libCppUTest.a" + ) + +list(APPEND _IMPORT_CHECK_TARGETS CppUTest ) +list(APPEND _IMPORT_CHECK_FILES_FOR_CppUTest "${_IMPORT_PREFIX}/lib/libCppUTest.a" ) + +# Import target "CppUTestExt" for configuration "RelWithDebInfo" +set_property(TARGET CppUTestExt APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO) +set_target_properties(CppUTestExt PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_RELWITHDEBINFO "CXX" + IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib/libCppUTestExt.a" + ) + +list(APPEND _IMPORT_CHECK_TARGETS CppUTestExt ) +list(APPEND _IMPORT_CHECK_FILES_FOR_CppUTestExt "${_IMPORT_PREFIX}/lib/libCppUTestExt.a" ) + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) diff --git a/build/cmake_package_files/CppUTestTargets.cmake b/build/cmake_package_files/CppUTestTargets.cmake new file mode 100644 index 000000000..e1d587696 --- /dev/null +++ b/build/cmake_package_files/CppUTestTargets.cmake @@ -0,0 +1,101 @@ +# Generated by CMake + +if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5) + message(FATAL_ERROR "CMake >= 2.6.0 required") +endif() +cmake_policy(PUSH) +cmake_policy(VERSION 2.6) +#---------------------------------------------------------------- +# Generated CMake target import file. +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Protect against multiple inclusion, which would fail when already imported targets are added once more. +set(_targetsDefined) +set(_targetsNotDefined) +set(_expectedTargets) +foreach(_expectedTarget CppUTest CppUTestExt) + list(APPEND _expectedTargets ${_expectedTarget}) + if(NOT TARGET ${_expectedTarget}) + list(APPEND _targetsNotDefined ${_expectedTarget}) + endif() + if(TARGET ${_expectedTarget}) + list(APPEND _targetsDefined ${_expectedTarget}) + endif() +endforeach() +if("${_targetsDefined}" STREQUAL "${_expectedTargets}") + unset(_targetsDefined) + unset(_targetsNotDefined) + unset(_expectedTargets) + set(CMAKE_IMPORT_FILE_VERSION) + cmake_policy(POP) + return() +endif() +if(NOT "${_targetsDefined}" STREQUAL "") + message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n") +endif() +unset(_targetsDefined) +unset(_targetsNotDefined) +unset(_expectedTargets) + + +# Compute the installation prefix relative to this file. +get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +if(_IMPORT_PREFIX STREQUAL "/") + set(_IMPORT_PREFIX "") +endif() + +# Create imported target CppUTest +add_library(CppUTest STATIC IMPORTED) + +set_target_properties(CppUTest PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${_IMPORT_PREFIX}/include/CppUTest" +) + +# Create imported target CppUTestExt +add_library(CppUTestExt STATIC IMPORTED) + +set_target_properties(CppUTestExt PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${_IMPORT_PREFIX}/include/CppUTestExt" +) + +# Load information for each installed configuration. +get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +file(GLOB CONFIG_FILES "${_DIR}/CppUTestTargets-*.cmake") +foreach(f ${CONFIG_FILES}) + include(${f}) +endforeach() + +# Cleanup temporary variables. +set(_IMPORT_PREFIX) + +# Loop over all imported files and verify that they actually exist +foreach(target ${_IMPORT_CHECK_TARGETS} ) + foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) + if(NOT EXISTS "${file}" ) + message(FATAL_ERROR "The imported target \"${target}\" references the file + \"${file}\" +but this file does not exist. Possible reasons include: +* The file was deleted, renamed, or moved to another location. +* An install or uninstall procedure did not complete successfully. +* The installation package was faulty and contained + \"${CMAKE_CURRENT_LIST_FILE}\" +but not all the files it references. +") + endif() + endforeach() + unset(_IMPORT_CHECK_FILES_FOR_${target}) +endforeach() +unset(_IMPORT_CHECK_TARGETS) + +# This file does not depend on other imported targets which have +# been exported from the same project but in a separate export set. + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) +cmake_policy(POP) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index c9203aadc..e0173f12a 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -113,7 +113,7 @@ if [ "x$BUILD" = "xautotools_cmake_install_test" ]; then fi # Hack: autotools cannot make CMake package. We cached and copied them. Here we check they are still the same - for cmakefile in CppUTestConfig.cmake /CppUTestConfigVersion.cmake; do + for cmakefile in CppUTestConfig.cmake CppUTestConfigVersion.cmake CppUTestTargets-relwithdebinfo.cmake CppUTestTargets.cmake; do diff install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile || exit 1 done fi From 7ec4c7662d711a737ca2e78d442049490a2d72b6 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 24 Apr 2020 20:05:27 +0800 Subject: [PATCH 0378/1093] Checking the difference --- scripts/travis_ci_build.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index e0173f12a..0f2fadfbc 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -115,6 +115,8 @@ if [ "x$BUILD" = "xautotools_cmake_install_test" ]; then # Hack: autotools cannot make CMake package. We cached and copied them. Here we check they are still the same for cmakefile in CppUTestConfig.cmake CppUTestConfigVersion.cmake CppUTestTargets-relwithdebinfo.cmake CppUTestTargets.cmake; do diff install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile || exit 1 + cat install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile + cat install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile done fi From b1fb9afa26755e0a2f0830b3620e1eb456bceb5e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 07:00:38 +0800 Subject: [PATCH 0379/1093] Cat before diff, of course --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 0f2fadfbc..583ddef26 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -114,9 +114,9 @@ if [ "x$BUILD" = "xautotools_cmake_install_test" ]; then # Hack: autotools cannot make CMake package. We cached and copied them. Here we check they are still the same for cmakefile in CppUTestConfig.cmake CppUTestConfigVersion.cmake CppUTestTargets-relwithdebinfo.cmake CppUTestTargets.cmake; do - diff install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile || exit 1 cat install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile cat install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile + diff install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile || exit 1 done fi From 8b1d38632a3f6184f5165990fa7347c061c1e7a4 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 07:30:09 +0800 Subject: [PATCH 0380/1093] Moved the specific CMake package checks earlier --- scripts/travis_ci_build.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 583ddef26..680a5548b 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -102,7 +102,14 @@ if [ "x$BUILD" = "xautotools_cmake_install_test" ]; then mkdir -p install_cmake make DESTDIR=install_cmake install - export INSTALL_DIFF=`diff -rq install_autotools install_cmake | grep -v CppUTestGeneratedConfig.h | grep -v libCppUTest.a | grep -v libCppUTestExt.a` + # Hack: autotools cannot make CMake package. We cached and copied them. Here we check they are still the same + for cmakefile in CppUTestConfig.cmake CppUTestConfigVersion.cmake CppUTestTargets-relwithdebinfo.cmake CppUTestTargets.cmake; do + cat install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile + cat install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile + diff install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile || exit 1 + done + + export INSTALL_DIFF=`diff -rq install_autotools install_cmake -X CppUTestGeneratedConfig.h -X libCppUTest.a -X libCppUTestExt.a` if [ "x$INSTALL_DIFF" != "x" ]; then echo "FAILED: CMake install and Autotools install is not the same!\n" echo "Difference\n" @@ -111,13 +118,6 @@ if [ "x$BUILD" = "xautotools_cmake_install_test" ]; then echo "-------------------------------\n" exit 1; fi - - # Hack: autotools cannot make CMake package. We cached and copied them. Here we check they are still the same - for cmakefile in CppUTestConfig.cmake CppUTestConfigVersion.cmake CppUTestTargets-relwithdebinfo.cmake CppUTestTargets.cmake; do - cat install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile - cat install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile - diff install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile || exit 1 - done fi if [ "x$BUILD" = "xdocker_ubuntu_autotools" ]; then From e52433d2d17d2660d7034f26dea186afac459f8d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 08:53:14 +0800 Subject: [PATCH 0381/1093] Updated it to the ubuntu generated file instead of the Mac generated file --- .../CppUTestConfigVersion.cmake | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/build/cmake_package_files/CppUTestConfigVersion.cmake b/build/cmake_package_files/CppUTestConfigVersion.cmake index c9ecfd431..ca617baf7 100644 --- a/build/cmake_package_files/CppUTestConfigVersion.cmake +++ b/build/cmake_package_files/CppUTestConfigVersion.cmake @@ -7,42 +7,28 @@ # PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version, # but only if the requested major version is the same as the current one. # The variable CVF_VERSION must be set before calling configure_file(). - - set(PACKAGE_VERSION "3.8") - if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) set(PACKAGE_VERSION_COMPATIBLE FALSE) else() - if("3.8" MATCHES "^([0-9]+)\\.") set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}") else() set(CVF_VERSION_MAJOR "3.8") endif() - if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR) set(PACKAGE_VERSION_COMPATIBLE TRUE) else() set(PACKAGE_VERSION_COMPATIBLE FALSE) endif() - if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) set(PACKAGE_VERSION_EXACT TRUE) endif() endif() - - -# if the installed project requested no architecture check, don't perform the check -if("FALSE") - return() -endif() - # if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "") - return() + return() endif() - # check that the installed version has the same 32/64bit-ness as the one which is currently searching: if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8") math(EXPR installedBits "8 * 8") From 32919dfe6622cf199a0dbcd5747db23ae9293ff0 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 09:07:10 +0800 Subject: [PATCH 0382/1093] Ignore white space, please --- scripts/travis_ci_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 680a5548b..9b34afd61 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -106,10 +106,10 @@ if [ "x$BUILD" = "xautotools_cmake_install_test" ]; then for cmakefile in CppUTestConfig.cmake CppUTestConfigVersion.cmake CppUTestTargets-relwithdebinfo.cmake CppUTestTargets.cmake; do cat install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile cat install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile - diff install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile || exit 1 + diff -w install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile || exit 1 done - export INSTALL_DIFF=`diff -rq install_autotools install_cmake -X CppUTestGeneratedConfig.h -X libCppUTest.a -X libCppUTestExt.a` + export INSTALL_DIFF=`diff -rwq install_autotools install_cmake -X CppUTestGeneratedConfig.h -X libCppUTest.a -X libCppUTestExt.a` if [ "x$INSTALL_DIFF" != "x" ]; then echo "FAILED: CMake install and Autotools install is not the same!\n" echo "Difference\n" From f3a8c69f7bc6af14d912e4807f4b25e821cb6556 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 09:16:38 +0800 Subject: [PATCH 0383/1093] Ignore new lines and whitespace? --- scripts/travis_ci_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 9b34afd61..fb1b07766 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -106,10 +106,10 @@ if [ "x$BUILD" = "xautotools_cmake_install_test" ]; then for cmakefile in CppUTestConfig.cmake CppUTestConfigVersion.cmake CppUTestTargets-relwithdebinfo.cmake CppUTestTargets.cmake; do cat install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile cat install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile - diff -w install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile || exit 1 + diff -Bw install_autotools/usr/local/lib/CppUTest/cmake/$cmakefile install_cmake/usr/local/lib/CppUTest/cmake/$cmakefile || exit 1 done - export INSTALL_DIFF=`diff -rwq install_autotools install_cmake -X CppUTestGeneratedConfig.h -X libCppUTest.a -X libCppUTestExt.a` + export INSTALL_DIFF=`diff -rwBq install_autotools install_cmake -X CppUTestGeneratedConfig.h -X libCppUTest.a -X libCppUTestExt.a` if [ "x$INSTALL_DIFF" != "x" ]; then echo "FAILED: CMake install and Autotools install is not the same!\n" echo "Difference\n" From 82e72a8502289c99dc8167417882ad63b2159fff Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 12:30:01 +0800 Subject: [PATCH 0384/1093] Updated travis yml to make sense of it all --- .travis.yml | 257 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 157 insertions(+), 100 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1b99b63e1..70e093fec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,122 +1,179 @@ + +# Global environment language: cpp +os: linux dist: bionic + +# Avoid double build because of the tagging in the build. branches: except: - latest-passing-build + +# Build stages and the conditionals for the stages +stages: + - name: basic build & test + if: "(NOT (TRAVIS_EVENT_TYPE = cron))" + - extended build & test + - dist build + - name: deploy latest + - if: "(NOT type IN (pull_request)) AND (branch = master)" + jobs: include: - - stage: build & test - compiler: clang - os: osx - env: BUILD=cmake CPP_STD=17 - addons: - apt: - packages: - - libc++-dev - - compiler: gcc - os: osx - env: BUILD=cmake CPP_STD=14 - - compiler: gcc - os: osx - env: BUILD=autotools - addons: - apt: - packages: - - valgrind - - compiler: clang - env: BUILD=autotools - os: osx - addons: - apt: - packages: - - libc++-dev - - valgrind - - compiler: clang - env: BUILD=cmake CPP_STD=98 - addons: - apt: - packages: - - libc++-dev - - compiler: clang - env: BUILD=cmake CPP_STD=11 - addons: - apt: - packages: - - libc++-dev - - compiler: clang - env: BUILD=cmake CPP_STD=14 - addons: - apt: - packages: - - libc++-dev - - compiler: clang - env: BUILD=cmake CPP_STD=17 - addons: - apt: - packages: - - libc++-dev - - compiler: gcc - env: BUILD=cmake CPP_STD=98 - - compiler: gcc - env: BUILD=cmake CPP_STD=11 - - compiler: gcc - env: BUILD=cmake CPP_STD=14 - - compiler: gcc - env: BUILD=cmake CPP_STD=17 - - compiler: gcc - env: BUILD=autotools_cmake_install_test - - compiler: gcc - env: BUILD=autotools - addons: - apt: - packages: - - valgrind - - compiler: clang - env: BUILD=autotools - addons: - apt: - packages: - - libc++-dev - - valgrind - - compiler: gcc - env: BUILD=cmake_coverage - - compiler: gcc - env: BUILD=cmake_gtest - - env: BUILD=make_dos - addons: - apt: - packages: - - dosbox - - env: BUILD=docker_ubuntu_autotools - - env: BUILD=docker_ubuntu_gcc10 - - stage: Final Build - env: BUILD=autotools - - if: "(NOT type IN (pull_request)) AND (branch = master)" - stage: Deploy - script: - - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" - - git push -f https://cpputest-travis:$GH_TOKEN@github.com/cpputest/cpputest.git --tags - deploy: - provider: releases - token: $GH_TOKEN - tag_name: latest-passing-build - name: Latest passing build - release_notes: This is the automatic release from Travis CI. Whenever a build - passes, it gets released as Latest Passing Build. - on: - tags: false + +# Basic builds + +# Mac OSX + - stage: basic build & test + - compiler: gcc + os: osx + env: BUILD=autotools + - compiler: clang + env: BUILD=autotools + os: osx + addons: + apt: + packages: + - libc++-dev +# Linux + - compiler: gcc + env: BUILD=cmake CPP_STD=17 + - compiler: gcc + env: BUILD=autotools + - compiler: clang + env: BUILD=autotools + addons: + apt: + packages: + - libc++-dev + +# Extended builds, different C++ version and build tools + - stage: extended build & test + +# Mac OSX + - compiler: clang + os: osx + env: BUILD=cmake CPP_STD=17 + addons: + apt: + packages: + - libc++-dev + - compiler: gcc + os: osx + env: BUILD=cmake CPP_STD=14 + +# Linux +# CMake different C++ versions with clang + - compiler: clang + env: BUILD=cmake CPP_STD=98 + addons: + apt: + packages: + - libc++-dev + - compiler: clang + env: BUILD=cmake CPP_STD=11 + addons: + apt: + packages: + - libc++-dev + - compiler: clang + env: BUILD=cmake CPP_STD=14 + addons: + apt: + packages: + - libc++-dev + - compiler: clang + env: BUILD=cmake CPP_STD=17 + addons: + apt: + packages: + - libc++-dev + +# CMake different C++ versions with gcc + - compiler: gcc + env: BUILD=cmake CPP_STD=98 + - compiler: gcc + env: BUILD=cmake CPP_STD=11 + - compiler: gcc + env: BUILD=cmake CPP_STD=14 + - compiler: gcc + env: BUILD=cmake CPP_STD=17 + +# New compilers can be added here. Need to be cleared when compiler becomes standard + - compiler: gcc + env: BUILD=cmake CPP_STD=17 + - CC=gcc-10 + - CXX=g++-10 + addons: + apt: + packages: ['g++-10'] + sources: + - sourceline: 'ppa:ubuntu-toolchain-r/test' + - compiler: clang + env: BUILD=cmake CPP_STD=17 + - CC=clang-10 + - CXX=clang++-10 + addons: + apt: + sources: + - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main' + key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key' + packages: ['clang-10', 'libc++-10-dev', 'libc++abi-10-dev'] + +# Specific other tests + - compiler: gcc + env: BUILD=autotools_cmake_install_test + - compiler: gcc + env: BUILD=cmake_coverage + - compiler: gcc + env: BUILD=cmake_gtest + +# MS DOS Build + - env: BUILD=make_dos + addons: + apt: + packages: + - dosbox + +# Docker images. Need to be cleared at times + - env: BUILD=docker_ubuntu_autotools + - env: BUILD=docker_ubuntu_gcc10 + +# Create zip and tgz for distribution + - stage: dist build + env: BUILD=autotools_dist + +# Deploy to github releases + - stage: deploy latest + script: + - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" + - git push -f https://cpputest-travis:$GH_TOKEN@github.com/cpputest/cpputest.git --tags + deploy: + provider: releases + token: $GH_TOKEN + tag_name: latest-passing-build + name: Latest passing build + release_notes: This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build. + on: + tags: false + before_script: - export CPPUTEST_BUILD_DIR=$TRAVIS_BUILD_DIR/cpputest_build - mkdir -p $CPPUTEST_BUILD_DIR && cd $CPPUTEST_BUILD_DIR + script: - "../scripts/travis_ci_build.sh" + after_failure: - "../scripts/travis_ci_after.sh" + after_success: - "../scripts/travis_ci_after.sh" + notifications: slack: secure: oOx4AGIiJB+j1pkIxlLeQh5qp7TF89Sj+3RzJRQuo6z0HocTz9yJgXPlDh1H9rLj5SxK/UKsk+WFafVuPdWakQ40LeYO49C/+e+mCDcS0ujLka6dvIE8v0SEb1PuaAGjJWdhiviAhSqu9YOKPYZs37lD3oqepuEpxeiXwsur9QU= + env: global: secure: H6djbn5YP1P62n//ergaRZ4lIkneCzWp1Ok4F71kvvNiwlRzYDGll4kJT6MhVq6bBHeR81W/lwUd+RdjyqsJpVhj7DHXC/0k0h0xpAAm7LUhOl+6mIII1uhcMFqbeHvilwvDCzTQ6qv8Mzd1g0QfUECrmti9/U+/TTFJG0r0Zuc= From a3916593cd436f2fed356e5d4a4975664e2662b7 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 12:40:22 +0800 Subject: [PATCH 0385/1093] Two mistakes in yml. Next try --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 70e093fec..0f4dac1dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ stages: - extended build & test - dist build - name: deploy latest - - if: "(NOT type IN (pull_request)) AND (branch = master)" + if: "(NOT type IN (pull_request)) AND (branch = master)" jobs: include: @@ -25,7 +25,7 @@ jobs: # Mac OSX - stage: basic build & test - - compiler: gcc + compiler: gcc os: osx env: BUILD=autotools - compiler: clang From 50ac6b5efc27aa4cd2a0fa696a804fca3618770e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 12:42:52 +0800 Subject: [PATCH 0386/1093] And a few more tweaks --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0f4dac1dd..72e69e9c7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,9 +14,11 @@ stages: - name: basic build & test if: "(NOT (TRAVIS_EVENT_TYPE = cron))" - extended build & test + if: "(NOT (TRAVIS_EVENT_TYPE = cron))" - dist build + if: "(NOT (TRAVIS_EVENT_TYPE = cron))" - name: deploy latest - if: "(NOT type IN (pull_request)) AND (branch = master)" + if: "(NOT type IN (pull_request)) AND (branch = master) AND (NOT (TRAVIS_EVENT_TYPE = cron))" jobs: include: @@ -51,7 +53,7 @@ jobs: - stage: extended build & test # Mac OSX - - compiler: clang + compiler: clang os: osx env: BUILD=cmake CPP_STD=17 addons: From 65cb61435a3a052183859475b3cbbe6b10edc1b2 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 12:53:48 +0800 Subject: [PATCH 0387/1093] Oops --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 72e69e9c7..9c5711086 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,9 +13,9 @@ branches: stages: - name: basic build & test if: "(NOT (TRAVIS_EVENT_TYPE = cron))" - - extended build & test + - name: extended build & test if: "(NOT (TRAVIS_EVENT_TYPE = cron))" - - dist build + - name: dist build if: "(NOT (TRAVIS_EVENT_TYPE = cron))" - name: deploy latest if: "(NOT type IN (pull_request)) AND (branch = master) AND (NOT (TRAVIS_EVENT_TYPE = cron))" From 0f546c1cb5bc4cc6e9c874cd8f29a6e3b604fae5 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 13:26:53 +0800 Subject: [PATCH 0388/1093] Targets in the build file but not in the yaml file. Added them. Let's see --- .travis.yml | 7 +++++- scripts/travis_ci_build.sh | 45 +++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9c5711086..447370b00 100644 --- a/.travis.yml +++ b/.travis.yml @@ -124,11 +124,15 @@ jobs: # Specific other tests - compiler: gcc - env: BUILD=autotools_cmake_install_test + env: BUILD=test_report - compiler: gcc env: BUILD=cmake_coverage - compiler: gcc env: BUILD=cmake_gtest + - compiler: clang + env: BUILD=autotools_gtest + - compiler: gcc + env: BUILD=autotools_cmake_install_test # MS DOS Build - env: BUILD=make_dos @@ -140,6 +144,7 @@ jobs: # Docker images. Need to be cleared at times - env: BUILD=docker_ubuntu_autotools - env: BUILD=docker_ubuntu_gcc10 + - env: BUILD=docker_ubuntu_dos # Create zip and tgz for distribution - stage: dist build diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index fb1b07766..85e73e85c 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -2,31 +2,18 @@ # Script run in the travis CI set -ex -if [[ "$CXX" == clang* ]]; then - export CXXFLAGS="-stdlib=libc++" -fi - if [ "x$CPPUTEST_HOME" = "x" ] ; then export CPPUTEST_HOME=$TRAVIS_BUILD_DIR fi +if [[ "$CXX" == clang* ]]; then + export CXXFLAGS="-stdlib=libc++" +fi + if [ "x$BUILD" = "xautotools" ]; then autoreconf -i .. ../configure - echo "CONFIGURATION DONE. Compiling now." - - if [ "${TRAVIS_EVENT_TYPE}" = "cron" ]; then - make check_all - fi - - - if [ "x$TRAVIS_OS_NAME" = "xosx" ]; then - COPYFILE_DISABLE=1 make dist - COPYFILE_DISABLE=1 make dist-zip - else - make dist - make dist-zip - fi + make tdd fi if [ "x$BUILD" = "xcmake" ]; then @@ -45,7 +32,6 @@ fi if [ "x$BUILD" = "xautotools_gtest" ]; then autoreconf -i .. ../configure - make check_gtest fi @@ -144,5 +130,24 @@ if [ "x$BUILD" = "xmake_dos" ]; then $CC --version make -f $CPPUTEST_HOME/platforms/Dos/Makefile $CPPUTEST_HOME/platforms/Dos/alltests.sh - fi +fi + +if [ "x$BUILD" = "xextensive_check" ]; then + if [ "${TRAVIS_EVENT_TYPE}" = "cron" ]; then + make check_all + fi +fi + +if [ "x$BUILD" = "xautotools_dist" ]; then + autoreconf -i .. + ../configure + + if [ "x$TRAVIS_OS_NAME" = "xosx" ]; then + COPYFILE_DISABLE=1 make dist VERSION=latest + COPYFILE_DISABLE=1 make dist-zip VERSION=latest + else + make dist VERSION=latest + make dist-zip VERSION=latest + fi +fi From 1f71ece6e4c8fbed178bd764ac5d0285e7575ee0 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 13:52:36 +0800 Subject: [PATCH 0389/1093] Less warnings --- configure.ac | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index aa3d88099..beb69e96d 100644 --- a/configure.ac +++ b/configure.ac @@ -129,13 +129,13 @@ CXXFLAGS="$saved_cxxflags" # Flag -Wno-c++98-compat CXXFLAGS="-Werror -Wno-c++98-compat" AC_MSG_CHECKING([whether CXX supports -Wno-c++98-compat]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP11BLACKLIST="${CPPUTEST_CPP11BLACKLIST} -Wno-c++98-compat" ], [AC_MSG_RESULT([no])]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-c++98-compat" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" # Flag -Wno-c++98-compat-pedantic CXXFLAGS="-Werror -Wno-c++98-compat-pedantic" AC_MSG_CHECKING([whether CXX supports -Wno-c++98-compat-pedantic]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP11BLACKLIST="${CPPUTEST_CPP11BLACKLIST} -Wno-c++98-compat-pedantic" ], [AC_MSG_RESULT([no])]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-c++98-compat-pedantic" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" # Flag -Wno-c++14-compat @@ -425,19 +425,19 @@ cpp_standard_used="default" # Using the C++98 standard? if test "x${use_std_cpp98}" = xyes; then - CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP98FLAG} ${CPPUTEST_CPP11BLACKLIST}" + CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP98FLAG}" cpp_standard_used="C++98" fi # Using the C++11 standard? if test "x${use_std_cpp11}" = xyes; then - CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP11FLAG} ${CPPUTEST_CPP11BLACKLIST}" + CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP11FLAG}" cpp_standard_used="C++11" fi # Using the C++14 standard? if test "x${use_std_cpp14}" = xyes; then - CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP14FLAG} ${CPPUTEST_CPP11BLACKLIST}" + CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP14FLAG}" cpp_standard_used="C++14" fi From 877fce4c3fb045a4021a2e86f7a21cf38a59dc00 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 14:08:55 +0800 Subject: [PATCH 0390/1093] Added Ant JUnit package --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 447370b00..85e05c7ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -125,6 +125,10 @@ jobs: # Specific other tests - compiler: gcc env: BUILD=test_report + addons: + apt: + packages: + - ant-optional - compiler: gcc env: BUILD=cmake_coverage - compiler: gcc From 8cff8642e16a72ce20751b3f98f122ff3caea2e3 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 14:11:45 +0800 Subject: [PATCH 0391/1093] Other C++ lib --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 85e05c7ba..6a0496962 100644 --- a/.travis.yml +++ b/.travis.yml @@ -135,6 +135,10 @@ jobs: env: BUILD=cmake_gtest - compiler: clang env: BUILD=autotools_gtest + addons: + apt: + packages: + - libc++-dev - compiler: gcc env: BUILD=autotools_cmake_install_test From f074153c91898f03003e3130c5f636f8aa284663 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 16:48:08 +0800 Subject: [PATCH 0392/1093] Trying to figure out why it fails on Travis and not locally --- scripts/travis_ci_build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 85e73e85c..54bfb5eb4 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -6,9 +6,9 @@ if [ "x$CPPUTEST_HOME" = "x" ] ; then export CPPUTEST_HOME=$TRAVIS_BUILD_DIR fi -if [[ "$CXX" == clang* ]]; then - export CXXFLAGS="-stdlib=libc++" -fi +#if [[ "$CXX" == clang* ]]; then +# export CXXFLAGS="-stdlib=libc++" +#fi if [ "x$BUILD" = "xautotools" ]; then autoreconf -i .. From c0eb3ff923bf77954185840dd5cc356f2de31ef6 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 17:06:56 +0800 Subject: [PATCH 0393/1093] No need this package anymore? --- .travis.yml | 33 +-------------------------------- 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6a0496962..d35e5450d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,10 +33,7 @@ jobs: - compiler: clang env: BUILD=autotools os: osx - addons: - apt: - packages: - - libc++-dev + # Linux - compiler: gcc env: BUILD=cmake CPP_STD=17 @@ -44,10 +41,6 @@ jobs: env: BUILD=autotools - compiler: clang env: BUILD=autotools - addons: - apt: - packages: - - libc++-dev # Extended builds, different C++ version and build tools - stage: extended build & test @@ -56,10 +49,6 @@ jobs: compiler: clang os: osx env: BUILD=cmake CPP_STD=17 - addons: - apt: - packages: - - libc++-dev - compiler: gcc os: osx env: BUILD=cmake CPP_STD=14 @@ -68,28 +57,12 @@ jobs: # CMake different C++ versions with clang - compiler: clang env: BUILD=cmake CPP_STD=98 - addons: - apt: - packages: - - libc++-dev - compiler: clang env: BUILD=cmake CPP_STD=11 - addons: - apt: - packages: - - libc++-dev - compiler: clang env: BUILD=cmake CPP_STD=14 - addons: - apt: - packages: - - libc++-dev - compiler: clang env: BUILD=cmake CPP_STD=17 - addons: - apt: - packages: - - libc++-dev # CMake different C++ versions with gcc - compiler: gcc @@ -135,10 +108,6 @@ jobs: env: BUILD=cmake_gtest - compiler: clang env: BUILD=autotools_gtest - addons: - apt: - packages: - - libc++-dev - compiler: gcc env: BUILD=autotools_cmake_install_test From a65a7675ec21d4c2d1cf48807835f5ac8e216754 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 17:32:19 +0800 Subject: [PATCH 0394/1093] Some cleanup in travis CI build --- scripts/travis_ci_build.sh | 7 ------- 1 file changed, 7 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 54bfb5eb4..289c2cc31 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -6,10 +6,6 @@ if [ "x$CPPUTEST_HOME" = "x" ] ; then export CPPUTEST_HOME=$TRAVIS_BUILD_DIR fi -#if [[ "$CXX" == clang* ]]; then -# export CXXFLAGS="-stdlib=libc++" -#fi - if [ "x$BUILD" = "xautotools" ]; then autoreconf -i .. ../configure @@ -54,9 +50,6 @@ if [ "x$BUILD" = "xcmake_gtest" ]; then fi if [ "x$BUILD" = "xtest_report" ]; then - if [ "x$TRAVIS_OS_NAME" = "xosx" ]; then - brew install ant - fi autoreconf -i .. ../configure make check From b9d22d0762cdcc6826ce6d63861207e42f9de6a9 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 25 Apr 2020 17:38:26 +0800 Subject: [PATCH 0395/1093] Upload the file --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index d35e5450d..42d664982 100644 --- a/.travis.yml +++ b/.travis.yml @@ -137,6 +137,8 @@ jobs: token: $GH_TOKEN tag_name: latest-passing-build name: Latest passing build + file: cpputest-latest.tar.gz + overwrite: true release_notes: This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build. on: tags: false From fb6357405634ca097df170ead10462fee7f44c8d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 26 Apr 2020 07:30:18 +0800 Subject: [PATCH 0396/1093] New attempt to deploy file --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 42d664982..7a51b84d8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -129,9 +129,11 @@ jobs: # Deploy to github releases - stage: deploy latest + env: BUILD=autotools_dist script: - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" - git push -f https://cpputest-travis:$GH_TOKEN@github.com/cpputest/cpputest.git --tags + - ../scripts/travis_ci_build.sh deploy: provider: releases token: $GH_TOKEN From 03e70821ee7f3ab758750692f14ff551b516fd9c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 26 Apr 2020 07:55:56 +0800 Subject: [PATCH 0397/1093] Added some debug info --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 7a51b84d8..302becb9c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -134,6 +134,8 @@ jobs: - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" - git push -f https://cpputest-travis:$GH_TOKEN@github.com/cpputest/cpputest.git --tags - ../scripts/travis_ci_build.sh + - pwd + - ls deploy: provider: releases token: $GH_TOKEN From 3221f8007bceabecbdfb2c70f9e0cb028d025632 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 26 Apr 2020 11:06:08 +0800 Subject: [PATCH 0398/1093] Trying to keep the tgz file for deployment --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 302becb9c..0e1f1f880 100644 --- a/.travis.yml +++ b/.travis.yml @@ -143,6 +143,7 @@ jobs: name: Latest passing build file: cpputest-latest.tar.gz overwrite: true + cleanup: false release_notes: This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build. on: tags: false From 0e5b07260c6d33bd1161321d53840987278a00ce Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 26 Apr 2020 11:30:07 +0800 Subject: [PATCH 0399/1093] Attemptng to not cleanup and add the date to the release --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0e1f1f880..199e03b69 100644 --- a/.travis.yml +++ b/.travis.yml @@ -131,7 +131,8 @@ jobs: - stage: deploy latest env: BUILD=autotools_dist script: - - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER" + - export DATE=`date` + - git tag -f latest-passing-build -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER at $DATE" - git push -f https://cpputest-travis:$GH_TOKEN@github.com/cpputest/cpputest.git --tags - ../scripts/travis_ci_build.sh - pwd @@ -143,7 +144,7 @@ jobs: name: Latest passing build file: cpputest-latest.tar.gz overwrite: true - cleanup: false + skip_cleanup: true release_notes: This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build. on: tags: false From c31c40e3fc961d3dd72d6bb92b47e3f017bdf6a7 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 26 Apr 2020 11:52:55 +0800 Subject: [PATCH 0400/1093] Added body and zip file to the release --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 199e03b69..bb56af2dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -142,10 +142,12 @@ jobs: token: $GH_TOKEN tag_name: latest-passing-build name: Latest passing build - file: cpputest-latest.tar.gz + body: This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build. + file: + - cpputest-latest.tar.gz + - cpputest-latest.zip overwrite: true skip_cleanup: true - release_notes: This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build. on: tags: false From e25a4cc97882e21d414757e38d065a0c44d82d30 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 26 Apr 2020 12:12:58 +0800 Subject: [PATCH 0401/1093] All works, except for the release body --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bb56af2dd..a741033e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -142,7 +142,7 @@ jobs: token: $GH_TOKEN tag_name: latest-passing-build name: Latest passing build - body: This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build. + body: "This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build." file: - cpputest-latest.tar.gz - cpputest-latest.zip From d37765a487f770a6501e09e094d4540f53311e0f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 26 Apr 2020 13:11:42 +0800 Subject: [PATCH 0402/1093] Cron daily additional build --- .travis.yml | 12 +++++++----- scripts/travis_ci_build.sh | 6 +++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index a741033e4..cb7eafb1f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,12 +11,11 @@ branches: # Build stages and the conditionals for the stages stages: + - name: extensive daily tests - name: basic build & test if: "(NOT (TRAVIS_EVENT_TYPE = cron))" - name: extended build & test if: "(NOT (TRAVIS_EVENT_TYPE = cron))" - - name: dist build - if: "(NOT (TRAVIS_EVENT_TYPE = cron))" - name: deploy latest if: "(NOT type IN (pull_request)) AND (branch = master) AND (NOT (TRAVIS_EVENT_TYPE = cron))" @@ -122,10 +121,13 @@ jobs: - env: BUILD=docker_ubuntu_autotools - env: BUILD=docker_ubuntu_gcc10 - env: BUILD=docker_ubuntu_dos + - env: BUILD=autotools_dist -# Create zip and tgz for distribution - - stage: dist build - env: BUILD=autotools_dist + - stage: extensive daily tests + compiler: gcc + env: BUILD=extensive_check + - compiler: clang + env: BUILD=extensive_check # Deploy to github releases - stage: deploy latest diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 289c2cc31..1ca87a84c 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -126,9 +126,9 @@ if [ "x$BUILD" = "xmake_dos" ]; then fi if [ "x$BUILD" = "xextensive_check" ]; then - if [ "${TRAVIS_EVENT_TYPE}" = "cron" ]; then - make check_all - fi + autoreconf -i .. + ../configure + make check_all fi if [ "x$BUILD" = "xautotools_dist" ]; then From 86261d7494e3cdc8b908a7b5e29a1f2436a77e3c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 26 Apr 2020 17:29:57 +0800 Subject: [PATCH 0403/1093] Not use ifndef but use if --- tests/CppUTest/UtestTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index c4af4c35e..fb32cd7ce 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -194,7 +194,7 @@ TEST(UtestShell, RunInSeparateProcessTest) fixture.assertPrintContains("Failed in separate process"); } -#ifndef CPPUTEST_HAVE_FORK +#if !CPPUTEST_HAVE_FORK IGNORE_TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) {} From e5ddf07597f89789bb3247e80082ded39ed7f222 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 26 Apr 2020 17:31:41 +0800 Subject: [PATCH 0404/1093] Run the extensive build on cron --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index cb7eafb1f..bc603dfb0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,7 @@ branches: # Build stages and the conditionals for the stages stages: - name: extensive daily tests + if: "(TRAVIS_EVENT_TYPE = cron)" - name: basic build & test if: "(NOT (TRAVIS_EVENT_TYPE = cron))" - name: extended build & test From b7c16b54dee491f0463f4fb3c90c404dac31618c Mon Sep 17 00:00:00 2001 From: Jakub Miernik Date: Sun, 26 Apr 2020 14:32:43 +0200 Subject: [PATCH 0405/1093] Add examples to cmake --- CMakeLists.txt | 6 ++++++ examples/AllTests/CMakeLists.txt | 17 +++++++++++++++++ examples/ApplicationLib/CMakeLists.txt | 6 ++++++ examples/CMakeLists.txt | 4 ++++ 4 files changed, 33 insertions(+) create mode 100644 examples/AllTests/CMakeLists.txt create mode 100644 examples/ApplicationLib/CMakeLists.txt create mode 100644 examples/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f655fc9d..2972a9c50 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,8 @@ option(WERROR "Compile with warnings as errors" OFF) option(TESTS "Compile and make tests for the code?" ON) option(TESTS_DETAILED "Run each test separately instead of grouped?" OFF) +option(EXAMPLES "Compile and make exaples?" OFF) + option(VERBOSE_CONFIG "Print configuration to stdout during generation" ON) if(NOT CMAKE_BUILD_TYPE) @@ -101,6 +103,10 @@ if (TESTS) endif (EXTENSIONS) endif (TESTS) +if (EXAMPLES) + add_subdirectory(examples) +endif(EXAMPLES) + set (INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") set (LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") set (INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") diff --git a/examples/AllTests/CMakeLists.txt b/examples/AllTests/CMakeLists.txt new file mode 100644 index 000000000..8f5208a17 --- /dev/null +++ b/examples/AllTests/CMakeLists.txt @@ -0,0 +1,17 @@ +enable_testing() + +include_directories(../ApplicationLib) + +add_executable(ExampleTests + AllTests.cpp + CircularBufferTest.cpp + EventDispatcherTest.cpp + FEDemoTest.cpp + HelloTest.cpp + MockDocumentationTest.cpp + PrinterTest.cpp +) + +cpputest_normalize_test_output_location(ExampleTests) +target_link_libraries(ExampleTests ApplicationLib CppUTest CppUTestExt) +cpputest_buildtime_discover_tests(ExampleTests) diff --git a/examples/ApplicationLib/CMakeLists.txt b/examples/ApplicationLib/CMakeLists.txt new file mode 100644 index 000000000..987a4eaf3 --- /dev/null +++ b/examples/ApplicationLib/CMakeLists.txt @@ -0,0 +1,6 @@ +add_library(ApplicationLib + CircularBuffer.cpp + EventDispatcher.cpp + hello.c + Printer.cpp +) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 000000000..58e84a016 --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,4 @@ +enable_testing() + +add_subdirectory(AllTests) +add_subdirectory(ApplicationLib) From 58f21a1f03336504e8098a5614fbdd34979e61e1 Mon Sep 17 00:00:00 2001 From: offa Date: Sun, 26 Apr 2020 18:51:53 +0200 Subject: [PATCH 0406/1093] Git ref of the cmake example updated. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5fb2aece2..175e30dd9 100644 --- a/README.md +++ b/README.md @@ -209,7 +209,7 @@ include(FetchContent) FetchContent_Declare( CppUTest GIT_REPOSITORY https://github.com/cpputest/cpputest.git - GIT_TAG master # or use release tag, eg. v3.8 + GIT_TAG latest-passing-build # or use release tag, eg. v3.8 ) # Set this to ON if you want to have the CppUTests in your project as well. set(TESTS OFF CACHE BOOL "Switch off CppUTest Test build") From ec4787c65db696e131a1f259dca1f307291064d1 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 27 Apr 2020 11:20:04 +0800 Subject: [PATCH 0407/1093] Added to git ignore for open pull request --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 953af3c10..eda2a9d57 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,10 @@ Release _build_ _build builds/*gcc* +cpputest_build/Makefile +cpputest_build/generated +cpputest_build/src +cpputest_build/tests /.deps CppUTestExtTests CppUTestTests From ed45ae66a94ee356ac02abeb697880245578f40f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 27 Apr 2020 13:49:26 +0800 Subject: [PATCH 0408/1093] Next attempt to trigger cron jobs --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index bc603dfb0..e95ca55c3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,13 +12,13 @@ branches: # Build stages and the conditionals for the stages stages: - name: extensive daily tests - if: "(TRAVIS_EVENT_TYPE = cron)" + if: type = cron - name: basic build & test - if: "(NOT (TRAVIS_EVENT_TYPE = cron))" + if: type != cron - name: extended build & test - if: "(NOT (TRAVIS_EVENT_TYPE = cron))" + if: type != cron - name: deploy latest - if: "(NOT type IN (pull_request)) AND (branch = master) AND (NOT (TRAVIS_EVENT_TYPE = cron))" + if: "(NOT type IN (pull_request)) AND (branch = master) AND (type != cron)" jobs: include: From 1103c30b8f2a009a2cdfec67548a51b7108152ec Mon Sep 17 00:00:00 2001 From: offa Date: Sun, 26 Apr 2020 18:34:16 +0200 Subject: [PATCH 0409/1093] enable_testing() moved to project source root directory. --- CMakeLists.txt | 2 ++ examples/AllTests/CMakeLists.txt | 2 -- examples/CMakeLists.txt | 2 -- tests/CppUTest/CMakeLists.txt | 2 -- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a1a95660..71e11a046 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,6 +84,8 @@ include("${CppUTestRootDirectory}/cmake/Modules/CppUTestBuildTimeDiscoverTests.c include("${CppUTestRootDirectory}/cmake/Modules/CppUTestNormalizeTestOutputLocation.cmake") include(GNUInstallDirs) +enable_testing() + configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" "${PROJECT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" diff --git a/examples/AllTests/CMakeLists.txt b/examples/AllTests/CMakeLists.txt index 8f5208a17..95910e869 100644 --- a/examples/AllTests/CMakeLists.txt +++ b/examples/AllTests/CMakeLists.txt @@ -1,5 +1,3 @@ -enable_testing() - include_directories(../ApplicationLib) add_executable(ExampleTests diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 58e84a016..d4b547439 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,4 +1,2 @@ -enable_testing() - add_subdirectory(AllTests) add_subdirectory(ApplicationLib) diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 925993660..c38cc8227 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -1,5 +1,3 @@ -enable_testing() - set(CppUTestTests_src AllTests.cpp SetPluginTest.cpp From a347d99f5bf491ce01b1d1ec4c7003a4451795b1 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 28 Apr 2020 12:23:10 +0800 Subject: [PATCH 0410/1093] Added -t group.name for running tests --- include/CppUTest/CommandLineArguments.h | 1 + src/CppUTest/CommandLineArguments.cpp | 19 ++++++++++++++++++- tests/CppUTest/CommandLineArgumentsTest.cpp | 20 +++++++++++++++++++- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index e3ba29a6f..dd8c01d0f 100644 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -92,6 +92,7 @@ class CommandLineArguments void setRepeatCount(int ac, const char *const *av, int& index); bool setShuffle(int ac, const char *const *av, int& index); void addGroupFilter(int ac, const char *const *av, int& index); + bool addGroupDotNameFilter(int ac, const char *const *av, int& index); void addStrictGroupFilter(int ac, const char *const *av, int& index); void addExcludeGroupFilter(int ac, const char *const *av, int& index); void addExcludeStrictGroupFilter(int ac, const char *const *av, int& index); diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 87379d33d..4f2b11324 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -64,6 +64,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument == "-ri") runIgnored_ = true; else if (argument.startsWith("-r")) setRepeatCount(ac_, av_, i); else if (argument.startsWith("-g")) addGroupFilter(ac_, av_, i); + else if (argument.startsWith("-t")) correctParameters = addGroupDotNameFilter(ac_, av_, i); else if (argument.startsWith("-sg")) addStrictGroupFilter(ac_, av_, i); else if (argument.startsWith("-xg")) addExcludeGroupFilter(ac_, av_, i); else if (argument.startsWith("-xsg")) addExcludeStrictGroupFilter(ac_, av_, i); @@ -88,7 +89,9 @@ bool CommandLineArguments::parse(TestPlugin* plugin) const char* CommandLineArguments::usage() const { - return "use -h for more extensive help\nusage [-h] [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; + return "use -h for more extensive help\nusage [-h] [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#]\n" + " [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-t groupName.testName]...\n" + " [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; } const char* CommandLineArguments::help() const @@ -114,6 +117,7 @@ const char* CommandLineArguments::help() const "Options that control which tests are run:\n" " -g group - only run test whose group contains the substring group\n" " -n name - only run test whose name contains the substring name\n" + " -t group.name - only run test whose name contains the substring group and name\n" " -sg group - only run test whose group exactly matches the string group\n" " -sn name - only run test whose name exactly matches the string name\n" " -xg group - exclude tests whose group contains the substring group (v3.8)\n" @@ -246,6 +250,19 @@ void CommandLineArguments::addGroupFilter(int ac, const char *const *av, int& i) groupFilters_ = groupFilter->add(groupFilters_); } +bool CommandLineArguments::addGroupDotNameFilter(int ac, const char *const *av, int& i) +{ + SimpleString groupDotName = getParameterField(ac, av, i, "-t"); + SimpleStringCollection collection; + groupDotName.split(".", collection); + + if (collection.size() != 2) return false; + + groupFilters_ = (new TestFilter(collection[0].subString(0, collection[0].size()-1)))->add(groupFilters_); + nameFilters_ = (new TestFilter(collection[1]))->add(nameFilters_); + return true; +} + void CommandLineArguments::addStrictGroupFilter(int ac, const char *const *av, int& i) { TestFilter* groupFilter = new TestFilter(getParameterField(ac, av, i, "-sg")); diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index f03c83563..a12a0f100 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -193,6 +193,22 @@ TEST(CommandLineArguments, setGroupFilter) CHECK_EQUAL(TestFilter("group"), *args->getGroupFilters()); } +TEST(CommandLineArguments, setCompleteGroupDotNameFilterInvalidArgument) +{ + int argc = 3; + const char* argv[] = { "tests.exe", "-t", "groupname" }; + CHECK_FALSE(newArgumentParser(argc, argv)); +} +TEST(CommandLineArguments, setCompleteGroupDotNameFilter) +{ + int argc = 3; + const char* argv[] = { "tests.exe", "-t", "group.name" }; + CHECK(newArgumentParser(argc, argv)); + CHECK_EQUAL(TestFilter("group"), *args->getGroupFilters()); + CHECK_EQUAL(TestFilter("name"), *args->getNameFilters()); +} + + TEST(CommandLineArguments, setGroupFilterSameParameter) { int argc = 2; @@ -441,7 +457,9 @@ TEST(CommandLineArguments, weirdParamatersReturnsFalse) TEST(CommandLineArguments, printUsage) { - STRCMP_EQUAL("use -h for more extensive help\nusage [-h] [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", + STRCMP_EQUAL("use -h for more extensive help\nusage [-h] [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#]\n" + " [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-t groupName.testName]...\n" + " [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", args->usage()); } From 4c37543d3ce29c064f2b32a92457b27d66af4eba Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 28 Apr 2020 14:09:14 +0800 Subject: [PATCH 0411/1093] Removed a memory leak, found by address sanitizer. Good job sanitizer --- tests/CppUTest/MemoryLeakWarningTest.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index 3d9756f50..53ad80b1c 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -131,7 +131,7 @@ TEST(MemoryLeakWarningTest, TwoLeaks) static void _testLeakWarningWithPluginDisabled() { memPlugin->expectLeaksInTest(1); - cpputest_malloc_location_with_leak_detection(10, __FILE__, __LINE__); + leak1 = (char*) cpputest_malloc_location_with_leak_detection(10, __FILE__, __LINE__); } TEST(MemoryLeakWarningTest, LeakWarningWithPluginDisabled) @@ -144,8 +144,10 @@ TEST(MemoryLeakWarningTest, LeakWarningWithPluginDisabled) LONGS_EQUAL(0, fixture->getFailureCount()); fixture->assertPrintContains("Warning: Expected 1 leak(s), but leak detection was disabled"); - MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); + cpputest_free_location_with_leak_detection(leak1, __FILE__, __LINE__); + leak1 = NULLPTR; + MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); } static void _testIgnore2() From a900c4cd2eacacbf497eed4f3fdaeac0da14f390 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 28 Apr 2020 14:22:22 +0800 Subject: [PATCH 0412/1093] Crash methods better not run with address sanitizer --- tests/CppUTest/UtestTest.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index fb32cd7ce..fc0b5364e 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -200,6 +200,8 @@ IGNORE_TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) {} #else +#if !CPPUTEST_SANITIZE_ADDRESS + TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) { fixture.setTestFunction(UtestShell::crash); @@ -213,6 +215,8 @@ TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) #endif +#endif + #if CPPUTEST_USE_STD_CPP_LIB static bool destructorWasCalledOnFailedTest = false; From e048816e350da44f6409f85c7344344299b27387 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 28 Apr 2020 14:33:43 +0800 Subject: [PATCH 0413/1093] Updated sanitizer flags in configure file --- configure.ac | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index beb69e96d..2254b4b5c 100644 --- a/configure.ac +++ b/configure.ac @@ -456,8 +456,9 @@ fi # Dealing with address sanitizer if test "x${sanitize_address}" = xyes; then - CPPUTEST_CFLAGS="${CPPUTEST_CFLAGS} -fsanitize=address" - CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} -fsanitize=address" + CPPUTEST_CFLAGS="${CPPUTEST_CFLAGS} -fsanitize=address -fno-omit-frame-pointer" + CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} -fsanitize=address -fno-omit-frame-pointer" + CPPUTEST_LDFLAGS="${CPPUTEST_CXXFLAGS} -fsanitize=address -fno-omit-frame-pointer" fi # Generating map files. From 491cb9e72d472ad511c744981d83e72304c72e4e Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 28 Apr 2020 13:06:29 +0200 Subject: [PATCH 0414/1093] Disable C++ extensions by default. --- cmake/Modules/CppUTestConfigurationOptions.cmake | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 6c5c4a942..fc711d83a 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -54,9 +54,13 @@ if (COVERAGE AND NOT MSVC) set(CMAKE_BUILD_TYPE "Debug") endif (COVERAGE AND NOT MSVC) -if (NOT CMAKE_CXX_STANDARD AND C++11) +if (CMAKE_CXX_STANDARD) + set(CMAKE_CXX_EXTENSIONS OFF) +elseif (C++11) find_package(CXX11 REQUIRED) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} ${CXX11_FLAGS}") +else() + # No standard specified endif () set(GMOCK_HOME $ENV{GMOCK_HOME}) From dca6294f2226be1f670973be20fc875245e9308c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 28 Apr 2020 19:59:05 +0800 Subject: [PATCH 0415/1093] Adding Memory Allocation stages to Memory Leak Detector --- include/CppUTest/MemoryLeakDetector.h | 28 +++++--- src/CppUTest/MemoryLeakDetector.cpp | 79 ++++++++++++++++++++++- tests/CppUTest/MemoryLeakDetectorTest.cpp | 30 +++++++++ tests/CppUTest/MemoryLeakWarningTest.cpp | 1 + 4 files changed, 128 insertions(+), 10 deletions(-) diff --git a/include/CppUTest/MemoryLeakDetector.h b/include/CppUTest/MemoryLeakDetector.h index 540c469c9..05b0b611e 100644 --- a/include/CppUTest/MemoryLeakDetector.h +++ b/include/CppUTest/MemoryLeakDetector.h @@ -117,11 +117,11 @@ class MemoryLeakOutputStringBuffer struct MemoryLeakDetectorNode { MemoryLeakDetectorNode() : - size_(0), number_(0), memory_(NULLPTR), file_(NULLPTR), line_(0), allocator_(NULLPTR), period_(mem_leak_period_enabled), next_(NULLPTR) + size_(0), number_(0), memory_(NULLPTR), file_(NULLPTR), line_(0), allocator_(NULLPTR), period_(mem_leak_period_enabled), allocation_stage_(0), next_(NULLPTR) { } - void init(char* memory, unsigned number, size_t size, TestMemoryAllocator* allocator, MemLeakPeriod period, const char* file, int line); + void init(char* memory, unsigned number, size_t size, TestMemoryAllocator* allocator, MemLeakPeriod period, unsigned char allocation_stage, const char* file, int line); size_t size_; unsigned number_; @@ -130,6 +130,7 @@ struct MemoryLeakDetectorNode int line_; TestMemoryAllocator* allocator_; MemLeakPeriod period_; + unsigned char allocation_stage_; private: friend struct MemoryLeakDetectorList; @@ -147,15 +148,19 @@ struct MemoryLeakDetectorList MemoryLeakDetectorNode* removeNode(char* memory); MemoryLeakDetectorNode* getFirstLeak(MemLeakPeriod period); - MemoryLeakDetectorNode* getNextLeak(MemoryLeakDetectorNode* node, - MemLeakPeriod period); - MemoryLeakDetectorNode* getLeakFrom(MemoryLeakDetectorNode* node, - MemLeakPeriod period); + MemoryLeakDetectorNode* getFirstLeakForAllocationStage(unsigned char allocation_stage); + + MemoryLeakDetectorNode* getNextLeak(MemoryLeakDetectorNode* node, MemLeakPeriod period); + MemoryLeakDetectorNode* getNextLeakForAllocationStage(MemoryLeakDetectorNode* node, unsigned char allocation_stage); + + MemoryLeakDetectorNode* getLeakFrom(MemoryLeakDetectorNode* node, MemLeakPeriod period); + MemoryLeakDetectorNode* getLeakForAllocationStageFrom(MemoryLeakDetectorNode* node, unsigned char allocation_stage); int getTotalLeaks(MemLeakPeriod period); void clearAllAccounting(MemLeakPeriod period); bool isInPeriod(MemoryLeakDetectorNode* node, MemLeakPeriod period); + bool isInAllocationStage(MemoryLeakDetectorNode* node, unsigned char allocation_stage); private: MemoryLeakDetectorNode* head_; @@ -172,8 +177,9 @@ struct MemoryLeakDetectorTable int getTotalLeaks(MemLeakPeriod period); MemoryLeakDetectorNode* getFirstLeak(MemLeakPeriod period); - MemoryLeakDetectorNode* getNextLeak(MemoryLeakDetectorNode* leak, - MemLeakPeriod period); + MemoryLeakDetectorNode* getFirstLeakForAllocationStage(unsigned char allocation_stage); + MemoryLeakDetectorNode* getNextLeak(MemoryLeakDetectorNode* leak, MemLeakPeriod period); + MemoryLeakDetectorNode* getNextLeakForAllocationStage(MemoryLeakDetectorNode* leak, unsigned char allocation_stage); private: unsigned long hash(char* memory); @@ -200,6 +206,10 @@ class MemoryLeakDetector void startChecking(); void stopChecking(); + unsigned char getCurrentAllocationStage() const; + void increaseAllocationStage(); + void decreaseAllocationStage(); + const char* report(MemLeakPeriod period); void markCheckingPeriodLeaksAsNonCheckingPeriod(); int totalMemoryLeaks(MemLeakPeriod period); @@ -210,6 +220,7 @@ class MemoryLeakDetector const char* file, int line, bool allocatNodesSeperately = false); void deallocMemory(TestMemoryAllocator* allocator, void* memory, bool allocatNodesSeperately = false); void deallocMemory(TestMemoryAllocator* allocator, void* memory, const char* file, int line, bool allocatNodesSeperately = false); + void deallocAllMemoryInCurrentAllocationStage(); char* reallocMemory(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, int line, bool allocatNodesSeperately = false); void invalidateMemory(char* memory); @@ -233,6 +244,7 @@ class MemoryLeakDetector MemoryLeakDetectorTable memoryTable_; bool doAllocationTypeChecking_; unsigned allocationSequenceNumber_; + unsigned char current_allocation_stage_; SimpleMutex* mutex_; char* allocateMemoryWithAccountingInformation(TestMemoryAllocator* allocator, size_t size, const char* file, int line, bool allocatNodesSeperately); diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index 154995c2e..93e1f1593 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -253,13 +253,14 @@ void MemoryLeakOutputStringBuffer::clear() //////////////////////// -void MemoryLeakDetectorNode::init(char* memory, unsigned number, size_t size, TestMemoryAllocator* allocator, MemLeakPeriod period, const char* file, int line) +void MemoryLeakDetectorNode::init(char* memory, unsigned number, size_t size, TestMemoryAllocator* allocator, MemLeakPeriod period, unsigned char allocation_stage, const char* file, int line) { number_ = number; memory_ = memory; size_ = size; allocator_ = allocator; period_ = period; + allocation_stage_ = allocation_stage; file_ = file; line_ = line; } @@ -271,6 +272,11 @@ bool MemoryLeakDetectorList::isInPeriod(MemoryLeakDetectorNode* node, MemLeakPer return period == mem_leak_period_all || node->period_ == period || (node->period_ != mem_leak_period_disabled && period == mem_leak_period_enabled); } +bool MemoryLeakDetectorList::isInAllocationStage(MemoryLeakDetectorNode* node, unsigned char allocation_stage) +{ + return node->allocation_stage_ == allocation_stage; +} + void MemoryLeakDetectorList::clearAllAccounting(MemLeakPeriod period) { MemoryLeakDetectorNode* cur = head_; @@ -338,16 +344,35 @@ MemoryLeakDetectorNode* MemoryLeakDetectorList::getLeakFrom(MemoryLeakDetectorNo return NULLPTR; } +MemoryLeakDetectorNode* MemoryLeakDetectorList::getLeakForAllocationStageFrom(MemoryLeakDetectorNode* node, unsigned char allocation_stage) +{ + for (MemoryLeakDetectorNode* cur = node; cur; cur = cur->next_) + if (isInAllocationStage(cur, allocation_stage)) return cur; + return NULLPTR; +} + MemoryLeakDetectorNode* MemoryLeakDetectorList::getFirstLeak(MemLeakPeriod period) { return getLeakFrom(head_, period); } +MemoryLeakDetectorNode* MemoryLeakDetectorList::getFirstLeakForAllocationStage(unsigned char allocation_stage) +{ + return getLeakForAllocationStageFrom(head_, allocation_stage); +} + MemoryLeakDetectorNode* MemoryLeakDetectorList::getNextLeak(MemoryLeakDetectorNode* node, MemLeakPeriod period) { return getLeakFrom(node->next_, period); } +MemoryLeakDetectorNode* MemoryLeakDetectorList::getNextLeakForAllocationStage(MemoryLeakDetectorNode* node, unsigned char allocation_stage) +{ + return getLeakForAllocationStageFrom(node->next_, allocation_stage); +} + + + int MemoryLeakDetectorList::getTotalLeaks(MemLeakPeriod period) { int total_leaks = 0; @@ -402,6 +427,15 @@ MemoryLeakDetectorNode* MemoryLeakDetectorTable::getFirstLeak(MemLeakPeriod peri return NULLPTR; } +MemoryLeakDetectorNode* MemoryLeakDetectorTable::getFirstLeakForAllocationStage(unsigned char allocation_stage) +{ + for (int i = 0; i < hash_prime; i++) { + MemoryLeakDetectorNode* node = table_[i].getFirstLeakForAllocationStage(allocation_stage); + if (node) return node; + } + return NULLPTR; +} + MemoryLeakDetectorNode* MemoryLeakDetectorTable::getNextLeak(MemoryLeakDetectorNode* leak, MemLeakPeriod period) { unsigned long i = hash(leak->memory_); @@ -415,6 +449,19 @@ MemoryLeakDetectorNode* MemoryLeakDetectorTable::getNextLeak(MemoryLeakDetectorN return NULLPTR; } +MemoryLeakDetectorNode* MemoryLeakDetectorTable::getNextLeakForAllocationStage(MemoryLeakDetectorNode* leak, unsigned char allocation_stage) +{ + unsigned long i = hash(leak->memory_); + MemoryLeakDetectorNode* node = table_[i].getNextLeakForAllocationStage(leak, allocation_stage); + if (node) return node; + + for (++i; i < hash_prime; i++) { + node = table_[i].getFirstLeakForAllocationStage(allocation_stage); + if (node) return node; + } + return NULLPTR; +} + ///////////////////////////////////////////////////////////// MemoryLeakDetector::MemoryLeakDetector(MemoryLeakFailure* reporter) @@ -422,6 +469,7 @@ MemoryLeakDetector::MemoryLeakDetector(MemoryLeakFailure* reporter) doAllocationTypeChecking_ = true; allocationSequenceNumber_ = 1; current_period_ = mem_leak_period_disabled; + current_allocation_stage_ = 0; reporter_ = reporter; mutex_ = new SimpleMutex; } @@ -450,6 +498,11 @@ void MemoryLeakDetector::stopChecking() current_period_ = mem_leak_period_enabled; } +unsigned char MemoryLeakDetector::getCurrentAllocationStage() const +{ + return current_allocation_stage_; +} + void MemoryLeakDetector::enable() { current_period_ = mem_leak_period_enabled; @@ -475,6 +528,16 @@ unsigned MemoryLeakDetector::getCurrentAllocationNumber() return allocationSequenceNumber_; } +void MemoryLeakDetector::increaseAllocationStage() +{ + current_allocation_stage_++; +} + +void MemoryLeakDetector::decreaseAllocationStage() +{ + current_allocation_stage_--; +} + SimpleMutex *MemoryLeakDetector::getMutex() { return mutex_; @@ -501,7 +564,7 @@ MemoryLeakDetectorNode* MemoryLeakDetector::getNodeFromMemoryPointer(char* memor void MemoryLeakDetector::storeLeakInformation(MemoryLeakDetectorNode * node, char *new_memory, size_t size, TestMemoryAllocator *allocator, const char *file, int line) { - node->init(new_memory, allocationSequenceNumber_++, size, allocator, current_period_, file, line); + node->init(new_memory, allocationSequenceNumber_++, size, allocator, current_period_, current_allocation_stage_, file, line); addMemoryCorruptionInformation(node->memory_ + node->size_); memoryTable_.addNewNode(node); } @@ -628,6 +691,18 @@ void MemoryLeakDetector::deallocMemory(TestMemoryAllocator* allocator, void* mem deallocMemory(allocator, (char*) memory, UNKNOWN, 0, allocatNodesSeperately); } +void MemoryLeakDetector::deallocAllMemoryInCurrentAllocationStage() +{ + char* memory = NULLPTR; + MemoryLeakDetectorNode* node = memoryTable_.getFirstLeakForAllocationStage(current_allocation_stage_); + while (node) { + memory = node->memory_; + TestMemoryAllocator* allocator = node->allocator_; + node = memoryTable_.getNextLeakForAllocationStage(node, current_allocation_stage_); + deallocMemory(allocator, memory, __FILE__, __LINE__); + } +} + char* MemoryLeakDetector::reallocMemory(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, int line, bool allocatNodesSeperately) { #ifdef CPPUTEST_DISABLE_MEM_CORRUPTION_CHECK diff --git a/tests/CppUTest/MemoryLeakDetectorTest.cpp b/tests/CppUTest/MemoryLeakDetectorTest.cpp index c4ea89db5..173a905af 100644 --- a/tests/CppUTest/MemoryLeakDetectorTest.cpp +++ b/tests/CppUTest/MemoryLeakDetectorTest.cpp @@ -478,6 +478,36 @@ TEST(MemoryLeakDetectorTest, periodChecking) detector->deallocMemory(defaultMallocAllocator(), mem); } +TEST(MemoryLeakDetectorTest, defaultAllocationStageIsZero) +{ + LONGS_EQUAL(0, detector->getCurrentAllocationStage()); +} + +TEST(MemoryLeakDetectorTest, increaseAllocationStage) +{ + detector->increaseAllocationStage(); + LONGS_EQUAL(1, detector->getCurrentAllocationStage()); +} + +TEST(MemoryLeakDetectorTest, freeAllMemoryInCurrentAllocationStage) +{ + detector->increaseAllocationStage(); + detector->allocMemory(defaultMallocAllocator(), 2); + detector->allocMemory(defaultMallocAllocator(), 2); + detector->deallocAllMemoryInCurrentAllocationStage(); + LONGS_EQUAL(0, detector->totalMemoryLeaks(mem_leak_period_all)); +} + +TEST(MemoryLeakDetectorTest, freeOnlyTheMemoryInTheAllocationStage) +{ + char* mem = detector->allocMemory(defaultMallocAllocator(), 2); + detector->increaseAllocationStage(); + detector->allocMemory(defaultMallocAllocator(), 2); + detector->deallocAllMemoryInCurrentAllocationStage(); + LONGS_EQUAL(1, detector->totalMemoryLeaks(mem_leak_period_all)); + detector->deallocMemory(defaultMallocAllocator(), mem); +} + TEST(MemoryLeakDetectorTest, allocateWithANullAllocatorCausesNoProblems) { char* mem = detector->allocMemory(NullUnknownAllocator::defaultAllocator(), 2); diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index 53ad80b1c..5561d2ce6 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -321,6 +321,7 @@ TEST(MemoryLeakWarningGlobalDetectorTest, gettingTheGlobalDetectorDoesNotRestore delete temporaryReporter; delete temporaryDetector; + MemoryLeakWarningPlugin::setGlobalDetector(NULLPTR, NULLPTR); } TEST(MemoryLeakWarningGlobalDetectorTest, checkIfTheMemoryLeakOverloadsAreOn) From 82660030ba15c272247bd1ba15ba07980b20f4ed Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 29 Apr 2020 12:24:39 +0800 Subject: [PATCH 0416/1093] Improvements in TestTestingFixture and resolved some leaks in FailableMemoryAllocator --- include/CppUTest/TestTestingFixture.h | 125 +++++------------ include/CppUTest/Utest.h | 30 +++- src/CppUTest/TestMemoryAllocator.cpp | 21 ++- src/CppUTest/TestRegistry.cpp | 1 - src/CppUTest/TestTestingFixture.cpp | 155 ++++++++++++++++++++- src/CppUTest/Utest.cpp | 31 ++++- tests/CppUTest/MemoryLeakWarningTest.cpp | 8 +- tests/CppUTest/PluginTest.cpp | 5 +- tests/CppUTest/TestMemoryAllocatorTest.cpp | 67 +++++---- tests/CppUTest/TestUTestMacro.cpp | 2 +- tests/CppUTest/UtestPlatformTest.cpp | 16 +-- tests/CppUTest/UtestTest.cpp | 6 +- 12 files changed, 310 insertions(+), 157 deletions(-) diff --git a/include/CppUTest/TestTestingFixture.h b/include/CppUTest/TestTestingFixture.h index 76ce6225f..0c7e2964d 100644 --- a/include/CppUTest/TestTestingFixture.h +++ b/include/CppUTest/TestTestingFixture.h @@ -35,106 +35,45 @@ class TestTestingFixture { public: - TestTestingFixture() - { - output_ = new StringBufferTestOutput(); - result_ = new TestResult(*output_); - genTest_ = new ExecFunctionTestShell(); - registry_ = new TestRegistry(); - - registry_->setCurrentRegistry(registry_); - registry_->addTest(genTest_); - - lineOfCodeExecutedAfterCheck = false; - } - - virtual ~TestTestingFixture() - { - registry_->setCurrentRegistry(NULLPTR); - delete registry_; - delete result_; - delete output_; - delete genTest_; - } - - void addTest(UtestShell * test) - { - registry_->addTest(test); - } - - void setTestFunction(void(*testFunction)()) - { - genTest_->testFunction_ = testFunction; - } - - void setSetup(void(*setupFunction)()) - { - genTest_->setup_ = setupFunction; - } - - void setTeardown(void(*teardownFunction)()) - { - genTest_->teardown_ = teardownFunction; - } - - void runTestWithMethod(void(*method)()) - { - setTestFunction(method); - runAllTests(); - } - - void runAllTests() - { - registry_->runAllTests(*result_); - } - - int getFailureCount() - { - return result_->getFailureCount(); - } - - int getCheckCount() - { - return result_->getCheckCount(); - } - - int getIgnoreCount() - { - return result_->getIgnoredCount(); - } - - bool hasTestFailed() - { - return genTest_->hasFailed(); - } - - void assertPrintContains(const SimpleString& contains) - { - assertPrintContains(getOutput(), contains); - } - - const SimpleString& getOutput() - { - return output_->getOutput(); - } - - static void assertPrintContains(const SimpleString& output, const SimpleString& contains) - { - STRCMP_CONTAINS(contains.asCharString(), output.asCharString()); - } - - int getRunCount() - { - return result_->getRunCount(); - } - + TestTestingFixture(); + virtual ~TestTestingFixture(); + void flushOutputAndResetResult(); + + void addTest(UtestShell * test); + void installPlugin(TestPlugin* plugin); + + void setTestFunction(void(*testFunction)()); + void setTestFunction(ExecFunction* testFunction); + void setSetup(void(*setupFunction)()); + void setTeardown(void(*teardownFunction)()); + + void setOutputVerbose(); + void setRunTestsInSeperateProcess(); + + void runTestWithMethod(void(*method)()); + void runAllTests(); + + int getFailureCount(); + int getCheckCount(); + int getIgnoreCount(); + int getRunCount(); + int getTestCount(); + const SimpleString& getOutput(); + TestRegistry* getRegistry(); + + bool hasTestFailed(); + void assertPrintContains(const SimpleString& contains); + void assertPrintContainsNot(const SimpleString& contains); void checkTestFailsWithProperTestLocation(const char* text, const char* file, int line); static void lineExecutedAfterCheck(); + +private: static bool lineOfCodeExecutedAfterCheck; TestRegistry* registry_; ExecFunctionTestShell* genTest_; + bool ownsExecFunction_; StringBufferTestOutput* output_; TestResult * result_; }; diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 22b24993d..3d7d46947 100644 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -193,20 +193,42 @@ class ExecFunctionTest : public Utest ExecFunctionTestShell* shell_; }; +//////////////////// ExecFunction + +class ExecFunction +{ +public: + ExecFunction(); + virtual ~ExecFunction(); + + virtual void exec(); +}; + +class ExecFunctionWithoutParameters : public ExecFunction +{ +public: + void (*testFunction_)(); + + ExecFunctionWithoutParameters(void(*testFunction)()); + virtual ~ExecFunctionWithoutParameters() _destructor_override; + + virtual void exec() _override; +}; + //////////////////// ExecFunctionTestShell -class ExecFunctionTestShell: public UtestShell +class ExecFunctionTestShell : public UtestShell { public: void (*setup_)(); void (*teardown_)(); - void (*testFunction_)(); + ExecFunction* testFunction_; ExecFunctionTestShell(void(*set)() = NULLPTR, void(*tear)() = NULLPTR) : - UtestShell("Generic", "Generic", "Generic", 1), setup_(set), teardown_( - tear), testFunction_(NULLPTR) + UtestShell("ExecFunction", "ExecFunction", "ExecFunction", 1), setup_(set), teardown_(tear), testFunction_(NULLPTR) { } + Utest* createTest() _override { return new ExecFunctionTest(this); } virtual ~ExecFunctionTestShell() _destructor_override; }; diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index ba325e88d..499582f60 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -295,17 +295,16 @@ char* FailableMemoryAllocator::allocMemoryLeakNode(size_t size) void FailableMemoryAllocator::checkAllFailedAllocsWereDone() { - if (head_) { - UtestShell* currentTest = UtestShell::getCurrent(); - SimpleString failText; - if (head_->file_) - failText = StringFromFormat("Expected failing alloc at %s:%d was never done", head_->file_, head_->line_); - else - failText = StringFromFormat("Expected allocation number %d was never done", head_->allocNumberToFail_); - - currentTest->failWith(FailFailure(currentTest, currentTest->getName().asCharString(), - currentTest->getLineNumber(), failText), TestTerminatorWithoutExceptions()); - } + if (head_) { + UtestShell* currentTest = UtestShell::getCurrent(); + SimpleString failText; + if (head_->file_) + failText = StringFromFormat("Expected failing alloc at %s:%d was never done", head_->file_, head_->line_); + else + failText = StringFromFormat("Expected allocation number %d was never done", head_->allocNumberToFail_); + + currentTest->failWith(FailFailure(currentTest, currentTest->getName().asCharString(), currentTest->getLineNumber(), failText)); + } } void FailableMemoryAllocator::clearFailedAllocs() diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 27f66f69a..4d8de4168 100644 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -31,7 +31,6 @@ TestRegistry::TestRegistry() : tests_(NULLPTR), nameFilters_(NULLPTR), groupFilters_(NULLPTR), firstPlugin_(NullTestPlugin::instance()), runInSeperateProcess_(false), currentRepetition_(0), runIgnored_(false) - { } diff --git a/src/CppUTest/TestTestingFixture.cpp b/src/CppUTest/TestTestingFixture.cpp index 19cc8157e..6c1c9408a 100644 --- a/src/CppUTest/TestTestingFixture.cpp +++ b/src/CppUTest/TestTestingFixture.cpp @@ -30,19 +30,162 @@ bool TestTestingFixture::lineOfCodeExecutedAfterCheck = false; +TestTestingFixture::TestTestingFixture() +{ + output_ = new StringBufferTestOutput(); + result_ = new TestResult(*output_); + genTest_ = new ExecFunctionTestShell(); + registry_ = new TestRegistry(); + ownsExecFunction_ = false; + + registry_->setCurrentRegistry(registry_); + registry_->addTest(genTest_); + + lineOfCodeExecutedAfterCheck = false; +} + +void TestTestingFixture::flushOutputAndResetResult() +{ + output_->flush(); + delete result_; + result_ = new TestResult(*output_); +} + +TestTestingFixture::~TestTestingFixture() +{ + registry_->setCurrentRegistry(NULLPTR); + if (ownsExecFunction_) + delete genTest_->testFunction_; + delete registry_; + delete result_; + delete output_; + delete genTest_; +} + +void TestTestingFixture::addTest(UtestShell * test) +{ + registry_->addTest(test); +} + +void TestTestingFixture::setTestFunction(void(*testFunction)()) +{ + if (genTest_->testFunction_ && ownsExecFunction_) + delete genTest_->testFunction_; + + genTest_->testFunction_ = new ExecFunctionWithoutParameters(testFunction); + ownsExecFunction_ = true; +} + +void TestTestingFixture::setTestFunction(ExecFunction* testFunction) +{ + if (genTest_->testFunction_ && ownsExecFunction_) + delete genTest_->testFunction_; + + genTest_->testFunction_ = testFunction; + + ownsExecFunction_ = false; +} + +void TestTestingFixture::setSetup(void(*setupFunction)()) +{ + genTest_->setup_ = setupFunction; +} + +void TestTestingFixture::setTeardown(void(*teardownFunction)()) +{ + genTest_->teardown_ = teardownFunction; +} + +void TestTestingFixture::installPlugin(TestPlugin* plugin) +{ + registry_->installPlugin(plugin); +} + +void TestTestingFixture::setRunTestsInSeperateProcess() +{ + registry_->setRunTestsInSeperateProcess(); +} + +void TestTestingFixture::setOutputVerbose() +{ + output_->verbose(); +} + +void TestTestingFixture::runTestWithMethod(void(*method)()) +{ + setTestFunction(method); + runAllTests(); +} + +void TestTestingFixture::runAllTests() +{ + registry_->runAllTests(*result_); +} + +int TestTestingFixture::getFailureCount() +{ + return result_->getFailureCount(); +} + +int TestTestingFixture::getCheckCount() +{ + return result_->getCheckCount(); +} + +int TestTestingFixture::getTestCount() +{ + return result_->getTestCount(); +} + +int TestTestingFixture::getIgnoreCount() +{ + return result_->getIgnoredCount(); +} + +TestRegistry* TestTestingFixture::getRegistry() +{ + return registry_; +} + +bool TestTestingFixture::hasTestFailed() +{ + return genTest_->hasFailed(); +} + +void TestTestingFixture::assertPrintContains(const SimpleString& contains) +{ + STRCMP_CONTAINS(contains.asCharString(), getOutput().asCharString()); +} + +void TestTestingFixture::assertPrintContainsNot(const SimpleString& contains) +{ + CHECK(! getOutput().contains(contains)); +} + + +const SimpleString& TestTestingFixture::getOutput() +{ + return output_->getOutput(); +} + +int TestTestingFixture::getRunCount() +{ + return result_->getRunCount(); +} + void TestTestingFixture::lineExecutedAfterCheck() { - lineOfCodeExecutedAfterCheck = true; + lineOfCodeExecutedAfterCheck = true; } void TestTestingFixture::checkTestFailsWithProperTestLocation(const char* text, const char* file, int line) { - if (getFailureCount() != 1) - FAIL_LOCATION(StringFromFormat("Expected one test failure, but got %d amount of test failures", getFailureCount()).asCharString(), file, line); + if (getFailureCount() != 1) + FAIL_LOCATION(StringFromFormat("Expected one test failure, but got %d amount of test failures", getFailureCount()).asCharString(), file, line); - STRCMP_CONTAINS_LOCATION(text, output_->getOutput().asCharString(), "", file, line); + STRCMP_CONTAINS_LOCATION(text, output_->getOutput().asCharString(), "", file, line); - if (lineOfCodeExecutedAfterCheck) - FAIL_LOCATION("The test should jump/throw on failure and not execute the next line. However, the next line was executed.", file, line); + if (lineOfCodeExecutedAfterCheck) + FAIL_LOCATION("The test should jump/throw on failure and not execute the next line. However, the next line was executed.", file, line); } diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 4a51d441d..b1c2e93df 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -649,6 +649,35 @@ TestTerminatorWithoutExceptions::~TestTerminatorWithoutExceptions() { } +//////////////////// ExecFunction +// +ExecFunction::ExecFunction() +{ +} + +ExecFunction::~ExecFunction() +{ +} + +void ExecFunction::exec() +{ +} + +ExecFunctionWithoutParameters::ExecFunctionWithoutParameters(void(*testFunction)()) + : testFunction_(testFunction) +{ +} + +ExecFunctionWithoutParameters::~ExecFunctionWithoutParameters() +{ +} + +void ExecFunctionWithoutParameters::exec() +{ + if (testFunction_) + testFunction_(); +} + //////////////////// ExecFunctionTest ExecFunctionTest::ExecFunctionTest(ExecFunctionTestShell* shell) @@ -658,7 +687,7 @@ ExecFunctionTest::ExecFunctionTest(ExecFunctionTestShell* shell) void ExecFunctionTest::testBody() { - if (shell_->testFunction_) shell_->testFunction_(); + if (shell_->testFunction_) shell_->testFunction_->exec(); } void ExecFunctionTest::setup() diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index 5561d2ce6..f04d3d81a 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -80,7 +80,7 @@ TEST_GROUP(MemoryLeakWarningTest) detector = new MemoryLeakDetector(&dummy); allocator = new TestMemoryAllocator; memPlugin = new MemoryLeakWarningPlugin("TestMemoryLeakWarningPlugin", detector); - fixture->registry_->installPlugin(memPlugin); + fixture->installPlugin(memPlugin); memPlugin->enable(); leak1 = NULLPTR; @@ -136,9 +136,10 @@ static void _testLeakWarningWithPluginDisabled() TEST(MemoryLeakWarningTest, LeakWarningWithPluginDisabled) { + fixture->setTestFunction(_testLeakWarningWithPluginDisabled); + MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); - fixture->setTestFunction(_testLeakWarningWithPluginDisabled); fixture->runAllTests(); LONGS_EQUAL(0, fixture->getFailureCount()); @@ -211,10 +212,11 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); + if (!DummyMemoryLeakDetector::wasDeleted()) delete dummyDetector; if (!DummyMemoryLeakFailure::wasDeleted()) delete dummyReporter; - MemoryLeakWarningPlugin::setGlobalDetector(detector, failureReporter); + MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); UtestShell::resetCrashMethod(); diff --git a/tests/CppUTest/PluginTest.cpp b/tests/CppUTest/PluginTest.cpp index 561958db0..1231e7791 100644 --- a/tests/CppUTest/PluginTest.cpp +++ b/tests/CppUTest/PluginTest.cpp @@ -86,14 +86,15 @@ TEST_GROUP(PluginTest) DummyPluginWhichAcceptsParameters* secondPlugin; DummyPlugin* thirdPlugin; TestTestingFixture *genFixture; - TestRegistry *registry; + TestRegistry* registry; + void setup() { firstPlugin = new DummyPlugin(GENERIC_PLUGIN); secondPlugin = new DummyPluginWhichAcceptsParameters(GENERIC_PLUGIN2); thirdPlugin = new DummyPlugin(GENERIC_PLUGIN3); genFixture = new TestTestingFixture; - registry = genFixture->registry_; + registry = genFixture->getRegistry(); registry->installPlugin(firstPlugin); sequenceNumber = 1; } diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index e67b1ae13..ab70109a5 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -136,24 +136,42 @@ TEST(TestMemoryAllocatorTest, TryingToAllocateTooMuchFailsTest) #if CPPUTEST_USE_MEM_LEAK_DETECTION #if CPPUTEST_USE_MALLOC_MACROS -// FailableMemoryAllocator must be global. Otherwise, it does not exist when memory leak detector -// reports memory leaks. -static FailableMemoryAllocator failableMallocAllocator("Failable Malloc Allocator", "malloc", "free"); +class FailableMemoryAllocatorExecFunction : public ExecFunction +{ +public: + FailableMemoryAllocator* allocator_; + void (*testFunction_)(FailableMemoryAllocator*); + void exec() _override + { + testFunction_(allocator_); + } + + FailableMemoryAllocatorExecFunction(FailableMemoryAllocator* allocator) : allocator_(allocator) {} + virtual ~FailableMemoryAllocatorExecFunction() _destructor_override {} +}; TEST_GROUP(FailableMemoryAllocator) { + FailableMemoryAllocator *failableMallocAllocator; + FailableMemoryAllocatorExecFunction * testFunction; TestTestingFixture *fixture; + void setup() { fixture = new TestTestingFixture; - failableMallocAllocator.clearFailedAllocs(); - setCurrentMallocAllocator(&failableMallocAllocator); + failableMallocAllocator = new FailableMemoryAllocator("Failable Malloc Allocator", "malloc", "free"); + testFunction = new FailableMemoryAllocatorExecFunction(failableMallocAllocator); + fixture->setTestFunction(testFunction); + setCurrentMallocAllocator(failableMallocAllocator); } void teardown() { - failableMallocAllocator.checkAllFailedAllocsWereDone(); + failableMallocAllocator->checkAllFailedAllocsWereDone(); setCurrentMallocAllocatorToDefault(); + failableMallocAllocator->clearFailedAllocs(); + delete testFunction; + delete failableMallocAllocator; delete fixture; } }; @@ -167,14 +185,14 @@ TEST(FailableMemoryAllocator, MallocWorksNormallyIfNotAskedToFail) TEST(FailableMemoryAllocator, FailFirstMalloc) { - failableMallocAllocator.failAllocNumber(1); + failableMallocAllocator->failAllocNumber(1); POINTERS_EQUAL(NULLPTR, (int*)malloc(sizeof(int))); } TEST(FailableMemoryAllocator, FailSecondAndFourthMalloc) { - failableMallocAllocator.failAllocNumber(2); - failableMallocAllocator.failAllocNumber(4); + failableMallocAllocator->failAllocNumber(2); + failableMallocAllocator->failAllocNumber(4); int *memory1 = (int*)malloc(sizeof(int)); int *memory2 = (int*)malloc(sizeof(int)); int *memory3 = (int*)malloc(sizeof(int)); @@ -189,30 +207,30 @@ TEST(FailableMemoryAllocator, FailSecondAndFourthMalloc) free(memory3); } -static void _failingAllocIsNeverDone() +static void _failingAllocIsNeverDone(FailableMemoryAllocator* failableMallocAllocator) { - failableMallocAllocator.failAllocNumber(1); - failableMallocAllocator.failAllocNumber(2); - failableMallocAllocator.failAllocNumber(3); + failableMallocAllocator->failAllocNumber(1); + failableMallocAllocator->failAllocNumber(2); + failableMallocAllocator->failAllocNumber(3); malloc(sizeof(int)); malloc(sizeof(int)); - failableMallocAllocator.checkAllFailedAllocsWereDone(); + failableMallocAllocator->checkAllFailedAllocsWereDone(); } TEST(FailableMemoryAllocator, CheckAllFailingAllocsWereDone) { - fixture->setTestFunction(_failingAllocIsNeverDone); + testFunction->testFunction_ = _failingAllocIsNeverDone; fixture->runAllTests(); LONGS_EQUAL(1, fixture->getFailureCount()); fixture->assertPrintContains("Expected allocation number 3 was never done"); - failableMallocAllocator.clearFailedAllocs(); + failableMallocAllocator->clearFailedAllocs(); } TEST(FailableMemoryAllocator, FailFirstAllocationAtGivenLine) { - failableMallocAllocator.failNthAllocAt(1, __FILE__, __LINE__ + 2); + failableMallocAllocator->failNthAllocAt(1, __FILE__, __LINE__ + 2); POINTERS_EQUAL(NULLPTR, malloc(sizeof(int))); } @@ -221,35 +239,36 @@ TEST(FailableMemoryAllocator, FailThirdAllocationAtGivenLine) { int *memory[10] = { NULLPTR }; int allocation; - failableMallocAllocator.failNthAllocAt(3, __FILE__, __LINE__ + 4); + failableMallocAllocator->failNthAllocAt(3, __FILE__, __LINE__ + 4); for (allocation = 1; allocation <= 10; allocation++) { memory[allocation - 1] = (int *)malloc(sizeof(int)); if (memory[allocation - 1] == NULLPTR) break; + free(memory[allocation -1]); } LONGS_EQUAL(3, allocation); - free(memory[0]); free(memory[1]); } -static void _failingLocationAllocIsNeverDone() +static void _failingLocationAllocIsNeverDone(FailableMemoryAllocator* failableMallocAllocator) { - failableMallocAllocator.failNthAllocAt(1, "TestMemoryAllocatorTest.cpp", __LINE__); - failableMallocAllocator.checkAllFailedAllocsWereDone(); + failableMallocAllocator->failNthAllocAt(1, "TestMemoryAllocatorTest.cpp", __LINE__); + failableMallocAllocator->checkAllFailedAllocsWereDone(); } TEST(FailableMemoryAllocator, CheckAllFailingLocationAllocsWereDone) { - fixture->setTestFunction(_failingLocationAllocIsNeverDone); + testFunction->testFunction_ = _failingLocationAllocIsNeverDone; fixture->runAllTests(); LONGS_EQUAL(1, fixture->getFailureCount()); fixture->assertPrintContains("Expected failing alloc at TestMemoryAllocatorTest.cpp:"); fixture->assertPrintContains("was never done"); - failableMallocAllocator.clearFailedAllocs(); + + failableMallocAllocator->clearFailedAllocs(); } #endif diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index c0057f991..8e955dcaf 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -510,7 +510,7 @@ TEST(UnitTestMacros, failing_CHECK_EQUAL_WithExpectedBeingEvaluatesMultipleTimes TEST(UnitTestMacros, failing_CHECK_EQUAL_withParamatersThatDontChangeWillNotGiveAnyWarning) { fixture.runTestWithMethod(_failingTestMethodWithCHECK_EQUAL); - CHECK( ! fixture.output_->getOutput().contains("WARNING")); + fixture.assertPrintContainsNot("WARNING"); } TEST(UnitTestMacros, CHECK_EQUALBehavesAsProperMacro) diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index 6ef35aa5a..5db9b77a6 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -104,14 +104,14 @@ static void _stoppedTestFunction() TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, TestInSeparateProcessWorks) { - fixture.registry_->setRunTestsInSeperateProcess(); + fixture.setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("OK (1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out"); } TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, FailureInSeparateProcessWorks) { - fixture.registry_->setRunTestsInSeperateProcess(); + fixture.setRunTestsInSeperateProcess(); fixture.setTestFunction(_failFunction); fixture.runAllTests(); fixture.assertPrintContains("Failed in separate process"); @@ -138,7 +138,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, AccessViolati TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, StoppedInSeparateProcessWorks) { - fixture.registry_->setRunTestsInSeperateProcess(); + fixture.setRunTestsInSeperateProcess(); fixture.setTestFunction(_stoppedTestFunction); fixture.runAllTests(); fixture.assertPrintContains("Stopped in separate process - continuing"); @@ -148,7 +148,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, StoppedInSepa TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToForkFailedInSeparateProcessWorks) { UT_PTR_SET(PlatformSpecificFork, fork_failed_stub); - fixture.registry_->setRunTestsInSeperateProcess(); + fixture.setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("Call to fork() failed"); fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran"); @@ -160,7 +160,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToWaitPid UT_PTR_SET(PlatformSpecificWaitPid, waitpid_while_debugging_stub); waitpid_while_debugging_stub_number_called = 0; waitpid_while_debugging_stub_forced_failures = 10; - fixture.registry_->setRunTestsInSeperateProcess(); + fixture.setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("OK (1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out"); // extra check to confirm that waitpid() was polled until it passed (and passed call adds one) @@ -173,7 +173,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToWaitPid UT_PTR_SET(PlatformSpecificWaitPid, waitpid_while_debugging_stub); waitpid_while_debugging_stub_number_called = 0; waitpid_while_debugging_stub_forced_failures = 40; - fixture.registry_->setRunTestsInSeperateProcess(); + fixture.setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("Call to waitpid() failed with EINTR. Tried 30 times and giving up! Sometimes happens in debugger"); // extra check to confirm that waitpid() was polled until it passed (and passed call adds one) @@ -184,7 +184,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToWaitPid TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToWaitPidFailedInSeparateProcessWorks) { UT_PTR_SET(PlatformSpecificWaitPid, waitpid_failed_stub); - fixture.registry_->setRunTestsInSeperateProcess(); + fixture.setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("Call to waitpid() failed"); fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran"); @@ -192,7 +192,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, CallToWaitPid TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, MultipleTestsInSeparateProcessAreCountedProperly) { - fixture.registry_->setRunTestsInSeperateProcess(); + fixture.setRunTestsInSeperateProcess(); fixture.runTestWithMethod(NULLPTR); fixture.runTestWithMethod(_stoppedTestFunction); fixture.runTestWithMethod(NULLPTR); diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index fc0b5364e..6c798aed4 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -178,7 +178,7 @@ TEST(UtestShell, this_test_covers_the_UtestShell_createTest_and_Utest_testBody_m defaultUtestShell shell; fixture.addTest(&shell); fixture.runAllTests(); - LONGS_EQUAL(2, fixture.result_->getTestCount()); + LONGS_EQUAL(2, fixture.getTestCount()); } static void StubPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin*, TestResult* result) @@ -189,7 +189,7 @@ static void StubPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, Tes TEST(UtestShell, RunInSeparateProcessTest) { UT_PTR_SET(PlatformSpecificRunTestInASeperateProcess, StubPlatformSpecificRunTestInASeperateProcess); - fixture.registry_->setRunTestsInSeperateProcess(); + fixture.getRegistry()->setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("Failed in separate process"); } @@ -258,7 +258,7 @@ TEST(IgnoredUtestShell, doesIgnoreCount) TEST(IgnoredUtestShell, printsIGNORE_TESTwhenVerbose) { - fixture.output_->verbose(); + fixture.setOutputVerbose(); fixture.runAllTests(); fixture.assertPrintContains("IGNORE_TEST"); } From e4d1a790799db43a11ef0ebdddf1e791c459d9c7 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 29 Apr 2020 13:25:29 +0800 Subject: [PATCH 0417/1093] Forgot to commit --- tests/CppUTestExt/MockPluginTest.cpp | 2 +- tests/CppUTestExt/MockSupportTest.cpp | 5 +---- tests/CppUTestExt/OrderedTestTest.cpp | 6 +++--- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/tests/CppUTestExt/MockPluginTest.cpp b/tests/CppUTestExt/MockPluginTest.cpp index 3e0dc5817..0edc40003 100644 --- a/tests/CppUTestExt/MockPluginTest.cpp +++ b/tests/CppUTestExt/MockPluginTest.cpp @@ -161,7 +161,7 @@ static void _failTwiceFunction() TEST(MockPlugin, shouldNotFailAgainWhenTestAlreadyFailed) { TestTestingFixture fixture; - fixture.registry_->installPlugin(&plugin); + fixture.installPlugin(&plugin); fixture.setTestFunction(_failTwiceFunction); fixture.runAllTests(); fixture.assertPrintContains("1 failures, 1 tests, 1 ran, 2 checks,"); diff --git a/tests/CppUTestExt/MockSupportTest.cpp b/tests/CppUTestExt/MockSupportTest.cpp index 16f3450b3..658839231 100644 --- a/tests/CppUTestExt/MockSupportTest.cpp +++ b/tests/CppUTestExt/MockSupportTest.cpp @@ -250,16 +250,13 @@ TEST(MockSupportTestWithFixture, ShouldNotCrashOnFailureAfterCrashMethodWasReset TEST(MockSupportTestWithFixture, failedMockShouldFailAgainWhenRepeated) { - fixture.setTestFunction(unexpectedCallTestFunction_); int repeatCount = 2; while(repeatCount--) { fixture.runAllTests(); fixture.assertPrintContains("Unexpected call to function: unexpected"); fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out"); - fixture.output_->flush(); - delete fixture.result_; - fixture.result_ = new TestResult(*fixture.output_); + fixture.flushOutputAndResetResult(); } } diff --git a/tests/CppUTestExt/OrderedTestTest.cpp b/tests/CppUTestExt/OrderedTestTest.cpp index 35971e80f..31fa74084 100644 --- a/tests/CppUTestExt/OrderedTestTest.cpp +++ b/tests/CppUTestExt/OrderedTestTest.cpp @@ -50,7 +50,7 @@ TEST_GROUP(TestOrderedTest) OrderedTestShell::setOrderedTestHead(NULLPTR); fixture = new TestTestingFixture(); - fixture->registry_->unDoLastAddTest(); + fixture->getRegistry()->unDoLastAddTest(); } void teardown() @@ -71,12 +71,12 @@ TEST_GROUP(TestOrderedTest) UtestShell* firstTest() { - return fixture->registry_->getFirstTest(); + return fixture->getRegistry()->getFirstTest(); } UtestShell* secondTest() { - return fixture->registry_->getFirstTest()->getNext(); + return firstTest()->getNext(); } }; From e41ccf91620d6994f8501eb4258ae8dfea769742 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 29 Apr 2020 13:30:48 +0800 Subject: [PATCH 0418/1093] Thank god for builds --- tests/CppUTest/UtestTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 6c798aed4..e5bbe3865 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -205,7 +205,7 @@ IGNORE_TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) {} TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) { fixture.setTestFunction(UtestShell::crash); - fixture.registry_->setRunTestsInSeperateProcess(); + fixture.setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("Failed in separate process - killed by signal"); From 28838e216df4b09ca498a48d0a8e30ea96e413da Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 29 Apr 2020 13:43:46 +0800 Subject: [PATCH 0419/1093] And another one --- tests/CppUTest/UtestPlatformTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index 5db9b77a6..048f85665 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -127,7 +127,7 @@ static int _accessViolationTestFunction() TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, AccessViolationInSeparateProcessWorks) { - fixture.registry_->setRunTestsInSeperateProcess(); + fixture.setRunTestsInSeperateProcess(); fixture.setTestFunction((void(*)())_accessViolationTestFunction); fixture.runAllTests(); fixture.assertPrintContains("Failed in separate process - killed by signal 11"); From f85531f725c94a21238d4e4f20f01bb8046af075 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 29 Apr 2020 13:49:25 +0800 Subject: [PATCH 0420/1093] Another one --- tests/CppUTestExt/IEEE754PluginTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index 63d3acd32..133f4d0b1 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -45,7 +45,7 @@ TEST_GROUP(FE__with_Plugin) IEEE754ExceptionsPlugin ieee754Plugin; void setup(void) _override { - fixture.registry_->installPlugin(&ieee754Plugin); + fixture.installPlugin(&ieee754Plugin); } }; From bfb38effb8b6865678a51b0947c50be5e7880443 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 29 Apr 2020 14:22:03 +0800 Subject: [PATCH 0421/1093] Sloppy, missed one line --- tests/CppUTestExt/MockSupportTest.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/CppUTestExt/MockSupportTest.cpp b/tests/CppUTestExt/MockSupportTest.cpp index 658839231..3fbf268a9 100644 --- a/tests/CppUTestExt/MockSupportTest.cpp +++ b/tests/CppUTestExt/MockSupportTest.cpp @@ -250,6 +250,7 @@ TEST(MockSupportTestWithFixture, ShouldNotCrashOnFailureAfterCrashMethodWasReset TEST(MockSupportTestWithFixture, failedMockShouldFailAgainWhenRepeated) { + fixture.setTestFunction(unexpectedCallTestFunction_); int repeatCount = 2; while(repeatCount--) { From 085440acbeaf1d099fcce23d0c614464501ec147 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 29 Apr 2020 14:49:16 +0800 Subject: [PATCH 0422/1093] And one more for MSDOS --- tests/CppUTest/UtestPlatformTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index 048f85665..e05bc287d 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -47,7 +47,7 @@ TEST_GROUP(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess) TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, DummyFailsWithMessage) { - fixture.registry_->setRunTestsInSeperateProcess(); + fixture.setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("-p doesn't work on this platform, as it is lacking fork.\b"); } From 174a73d416b12eaf99af3299887fd0bf5b086a9d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 29 Apr 2020 15:35:50 +0800 Subject: [PATCH 0423/1093] Bit more tests --- tests/CppUTest/MemoryLeakDetectorTest.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/CppUTest/MemoryLeakDetectorTest.cpp b/tests/CppUTest/MemoryLeakDetectorTest.cpp index 173a905af..3da0b05e0 100644 --- a/tests/CppUTest/MemoryLeakDetectorTest.cpp +++ b/tests/CppUTest/MemoryLeakDetectorTest.cpp @@ -483,12 +483,25 @@ TEST(MemoryLeakDetectorTest, defaultAllocationStageIsZero) LONGS_EQUAL(0, detector->getCurrentAllocationStage()); } +TEST(MemoryLeakDetectorTest, canFreeNoAllocations) +{ + detector->deallocAllMemoryInCurrentAllocationStage(); + LONGS_EQUAL(0, detector->getCurrentAllocationStage()); +} + TEST(MemoryLeakDetectorTest, increaseAllocationStage) { detector->increaseAllocationStage(); LONGS_EQUAL(1, detector->getCurrentAllocationStage()); } +TEST(MemoryLeakDetectorTest, decreaseAllocationStage) +{ + detector->increaseAllocationStage(); + detector->decreaseAllocationStage(); + LONGS_EQUAL(0, detector->getCurrentAllocationStage()); +} + TEST(MemoryLeakDetectorTest, freeAllMemoryInCurrentAllocationStage) { detector->increaseAllocationStage(); From cb38960dbfae8a3a00d090750a50f38f32dde6f0 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 29 Apr 2020 15:45:40 +0800 Subject: [PATCH 0424/1093] Trying the new deploy plugin to see if the release notes work --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e95ca55c3..768222e64 100644 --- a/.travis.yml +++ b/.travis.yml @@ -142,15 +142,16 @@ jobs: - ls deploy: provider: releases + #: + edge: true token: $GH_TOKEN tag_name: latest-passing-build name: Latest passing build - body: "This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build." + release_notes: "This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build." file: - cpputest-latest.tar.gz - cpputest-latest.zip overwrite: true - skip_cleanup: true on: tags: false From 211e3e1797c8fb0c4323ce6c553565e0ab324f66 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 30 Apr 2020 14:52:25 +0800 Subject: [PATCH 0425/1093] Added Memory Accountant --- include/CppUTest/TestMemoryAllocator.h | 94 ++++++ src/CppUTest/TestMemoryAllocator.cpp | 299 ++++++++++++++++++ tests/CppUTest/AllTests.cpp | 17 +- tests/CppUTest/MemoryLeakDetectorTest.cpp | 12 +- tests/CppUTest/MemoryLeakWarningTest.cpp | 7 +- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 5 +- tests/CppUTest/TestMemoryAllocatorTest.cpp | 199 ++++++++++++ 7 files changed, 621 insertions(+), 12 deletions(-) diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index 60e109cdb..0e96491ee 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -46,6 +46,18 @@ extern TestMemoryAllocator* getCurrentMallocAllocator(); extern void setCurrentMallocAllocatorToDefault(); extern TestMemoryAllocator* defaultMallocAllocator(); +class GlobalMemoryAllocatorStash +{ +public: + void save(); + void restore(); + +private: + TestMemoryAllocator* originalMallocAllocator; + TestMemoryAllocator* originalNewAllocator; + TestMemoryAllocator* originalNewArrayAllocator; +}; + class TestMemoryAllocator { public: @@ -79,6 +91,7 @@ class CrashOnAllocationAllocator : public TestMemoryAllocator unsigned allocationToCrashOn_; public: CrashOnAllocationAllocator(); + virtual ~CrashOnAllocationAllocator() _destructor_override; virtual void setNumberToCrashOn(unsigned allocationToCrashOn); @@ -90,6 +103,8 @@ class NullUnknownAllocator: public TestMemoryAllocator { public: NullUnknownAllocator(); + virtual ~NullUnknownAllocator() _destructor_override; + virtual char* alloc_memory(size_t size, const char* file, int line) _override; virtual void free_memory(char* memory, const char* file, int line) _override; @@ -102,6 +117,7 @@ class FailableMemoryAllocator: public TestMemoryAllocator { public: FailableMemoryAllocator(const char* name_str = "failable alloc", const char* alloc_name_str = "alloc", const char* free_name_str = "free"); + virtual ~FailableMemoryAllocator() _destructor_override; virtual char* alloc_memory(size_t size, const char* file, int line); virtual char* allocMemoryLeakNode(size_t size); @@ -118,5 +134,83 @@ class FailableMemoryAllocator: public TestMemoryAllocator int currentAllocNumber_; }; +struct MemoryAccountantAllocationNode; + +class MemoryAccountant +{ +public: + MemoryAccountant(); + + void clear(); + + void alloc(size_t size); + void dealloc(size_t size); + + size_t totalAllocationsOfSize(size_t size) const; + size_t totalDeallocationsOfSize(size_t size) const; + size_t maximumAllocationAtATimeOfSize(size_t size) const; + + size_t totalAllocations() const; + size_t totalDeallocations() const; + + SimpleString report() const; + + void setAllocator(TestMemoryAllocator* allocator); +private: + MemoryAccountantAllocationNode* findOrCreateNodeOfSize(size_t size); + MemoryAccountantAllocationNode* findNodeOfSize(size_t size) const; + + MemoryAccountantAllocationNode* createNewAccountantAllocationNode(size_t size, MemoryAccountantAllocationNode* next); + void destroyAccountantAllocationNode(MemoryAccountantAllocationNode* node); + + MemoryAccountantAllocationNode* head_; + TestMemoryAllocator* allocator_; +}; + +struct AccountingTestMemoryAllocatorMemoryNode; + +class AccountingTestMemoryAllocator : public TestMemoryAllocator +{ +public: + AccountingTestMemoryAllocator(MemoryAccountant& accountant, TestMemoryAllocator* originalAllocator); + virtual ~AccountingTestMemoryAllocator() _destructor_override; + + virtual char* alloc_memory(size_t size, const char* file, int line) _override; + virtual void free_memory(char* memory, const char* file, int line) _override; + + TestMemoryAllocator* getOriginalAllocator(); +private: + + void addMemoryToMemoryTrackingToKeepTrackOfSize(char* memory, size_t size); + size_t removeMemoryFromTrackingAndReturnAllocatedSize(char* memory); + + size_t removeNextNodeAndReturnSize(AccountingTestMemoryAllocatorMemoryNode* node); + size_t removeHeadAndReturnSize(); + + MemoryAccountant& accountant_; + TestMemoryAllocator* originalAllocator_; + AccountingTestMemoryAllocatorMemoryNode* head_; +}; + +class GlobalMemoryAccountant +{ +public: + GlobalMemoryAccountant(); + + void start(); + void stop(); + SimpleString report(); + + TestMemoryAllocator* getMallocAllocator(); + TestMemoryAllocator* getNewAllocator(); + TestMemoryAllocator* getNewArrayAllocator(); + +private: + MemoryAccountant accountant_; + AccountingTestMemoryAllocator* mallocAllocator_; + AccountingTestMemoryAllocator* newAllocator_; + AccountingTestMemoryAllocator* newArrayAllocator_; +}; + #endif diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 499582f60..086c0f610 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -110,6 +110,20 @@ TestMemoryAllocator* defaultMallocAllocator() ///////////////////////////////////////////// +void GlobalMemoryAllocatorStash::save() +{ + originalMallocAllocator = getCurrentMallocAllocator(); + originalNewAllocator = getCurrentNewAllocator(); + originalNewArrayAllocator = getCurrentNewArrayAllocator(); +} + +void GlobalMemoryAllocatorStash::restore() +{ + setCurrentMallocAllocator(originalMallocAllocator); + setCurrentNewAllocator(originalNewAllocator); + setCurrentNewArrayAllocator(originalNewArrayAllocator); +} + TestMemoryAllocator::TestMemoryAllocator(const char* name_str, const char* alloc_name_str, const char* free_name_str) : name_(name_str), alloc_name_(alloc_name_str), free_name_(free_name_str), hasBeenDestroyed_(false) { @@ -168,6 +182,10 @@ CrashOnAllocationAllocator::CrashOnAllocationAllocator() : allocationToCrashOn_( { } +CrashOnAllocationAllocator::~CrashOnAllocationAllocator() +{ +} + void CrashOnAllocationAllocator::setNumberToCrashOn(unsigned allocationToCrashOn) { allocationToCrashOn_ = allocationToCrashOn; @@ -182,6 +200,10 @@ char* CrashOnAllocationAllocator::alloc_memory(size_t size, const char* file, in } +NullUnknownAllocator::~NullUnknownAllocator() +{ +} + char* NullUnknownAllocator::alloc_memory(size_t /*size*/, const char*, int) { return NULLPTR; @@ -249,6 +271,10 @@ class LocationToFailAllocNode }; +FailableMemoryAllocator::~FailableMemoryAllocator() +{ +} + FailableMemoryAllocator::FailableMemoryAllocator(const char* name_str, const char* alloc_name_str, const char* free_name_str) : TestMemoryAllocator(name_str, alloc_name_str, free_name_str), head_(NULLPTR), currentAllocNumber_(0) { @@ -318,3 +344,276 @@ void FailableMemoryAllocator::clearFailedAllocs() currentAllocNumber_ = 0; } +struct MemoryAccountantAllocationNode +{ + size_t size_; + size_t allocations_; + size_t deallocations_; + size_t maxAllocations_; + size_t currentAllocations_; + MemoryAccountantAllocationNode* next_; +}; + +MemoryAccountantAllocationNode* MemoryAccountant::createNewAccountantAllocationNode(size_t size, MemoryAccountantAllocationNode* next) +{ + MemoryAccountantAllocationNode* node = (MemoryAccountantAllocationNode*) (void*) allocator_->alloc_memory(sizeof(MemoryAccountantAllocationNode), __FILE__, __LINE__); + node->size_ = size; + node->allocations_ = 0; + node->deallocations_ = 0; + node->maxAllocations_ = 0; + node->currentAllocations_ = 0; + node->next_ = next; + return node; +} + +void MemoryAccountant::destroyAccountantAllocationNode(MemoryAccountantAllocationNode* node) +{ + allocator_->free_memory((char*) node, __FILE__, __LINE__); +} + +MemoryAccountant::MemoryAccountant() + : head_(NULLPTR), allocator_(defaultMallocAllocator()) +{ +} + +void MemoryAccountant::setAllocator(TestMemoryAllocator* allocator) +{ + allocator_ = allocator; +} + +void MemoryAccountant::clear() +{ + MemoryAccountantAllocationNode* node = head_; + MemoryAccountantAllocationNode* to_be_deleted = NULLPTR; + while (node) { + to_be_deleted = node; + node = node->next_; + destroyAccountantAllocationNode(to_be_deleted); + } +} + +MemoryAccountantAllocationNode* MemoryAccountant::findNodeOfSize(size_t size) const +{ + for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) + if (node->size_ == size) + return node; + return NULLPTR; +} + +MemoryAccountantAllocationNode* MemoryAccountant::findOrCreateNodeOfSize(size_t size) +{ + if (head_ && head_->size_ > size) + head_ = createNewAccountantAllocationNode(size, head_); + + for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) { + if (node->size_ == size) + return node; + if (node->next_ == NULLPTR || node->next_->size_ > size) + node->next_ = createNewAccountantAllocationNode(size, node->next_); + } + head_ = createNewAccountantAllocationNode(size, head_); + return head_; +} + +void MemoryAccountant::alloc(size_t size) +{ + MemoryAccountantAllocationNode* node = findOrCreateNodeOfSize(size); + node->allocations_++; + node->currentAllocations_++; + node->maxAllocations_ = (node->currentAllocations_ > node->maxAllocations_) ? node->currentAllocations_ : node->maxAllocations_; +} + +void MemoryAccountant::dealloc(size_t size) +{ + MemoryAccountantAllocationNode* node = findOrCreateNodeOfSize(size); + node->deallocations_++; + node->currentAllocations_--; +} + +size_t MemoryAccountant::totalAllocationsOfSize(size_t size) const +{ + MemoryAccountantAllocationNode* node = findNodeOfSize(size); + if (node) + return node->allocations_; + return 0; +} + +size_t MemoryAccountant::totalDeallocationsOfSize(size_t size) const +{ + MemoryAccountantAllocationNode* node = findNodeOfSize(size); + if (node) + return node->deallocations_; + return 0; +} + +size_t MemoryAccountant::maximumAllocationAtATimeOfSize(size_t size) const +{ + MemoryAccountantAllocationNode* node = findNodeOfSize(size); + if (node) + return node->maxAllocations_; + return 0; +} + +size_t MemoryAccountant::totalAllocations() const +{ + size_t totalAllocations = 0; + + for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) + totalAllocations += node->allocations_; + + return totalAllocations; +} + +size_t MemoryAccountant::totalDeallocations() const +{ + size_t totalDeallocations = 0; + + for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) + totalDeallocations += node->deallocations_; + + return totalDeallocations; +} + +SimpleString MemoryAccountant::report() const +{ + if (head_ == NULLPTR) + return SimpleString("CppUTest Memory Accountant has not noticed any allocations or deallocations. Sorry\n"); + + SimpleString report("CppUTest Memory Accountant report:\n" + "Allocation size # allocations # deallocations max # allocations at one time\n"); + for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) + report += StringFromFormat("%5lu %5lu %5lu %5lu\n", + node->size_, node->allocations_, node->deallocations_, node->maxAllocations_); + report += SimpleString(" Thank you for your business\n"); + return report; +} + +AccountingTestMemoryAllocator::AccountingTestMemoryAllocator(MemoryAccountant& accountant, TestMemoryAllocator* originalAllocator) + : accountant_(accountant), originalAllocator_(originalAllocator) +{ +} + +AccountingTestMemoryAllocator::~AccountingTestMemoryAllocator() +{ +} + +struct AccountingTestMemoryAllocatorMemoryNode +{ + char* memory_; + size_t size_; + AccountingTestMemoryAllocatorMemoryNode* next_; +}; + +void AccountingTestMemoryAllocator::addMemoryToMemoryTrackingToKeepTrackOfSize(char* memory, size_t size) +{ + AccountingTestMemoryAllocatorMemoryNode* node = (AccountingTestMemoryAllocatorMemoryNode*) (void*) originalAllocator_->alloc_memory(sizeof(AccountingTestMemoryAllocatorMemoryNode), __FILE__, __LINE__); + node->memory_ = memory; + node->size_ = size; + node->next_ = head_; + head_ = node; +} + +size_t AccountingTestMemoryAllocator::removeNextNodeAndReturnSize(AccountingTestMemoryAllocatorMemoryNode* node) +{ + AccountingTestMemoryAllocatorMemoryNode* foundNode = node->next_; + node->next_ = node->next_->next_; + + size_t size = foundNode->size_; + originalAllocator_->free_memory((char*) foundNode, __FILE__, __LINE__); + return size; +} + +size_t AccountingTestMemoryAllocator::removeHeadAndReturnSize() +{ + AccountingTestMemoryAllocatorMemoryNode* foundNode = head_; + head_ = head_->next_; + + size_t size = foundNode->size_; + originalAllocator_->free_memory((char*) foundNode, __FILE__, __LINE__); + return size; +} + +size_t AccountingTestMemoryAllocator::removeMemoryFromTrackingAndReturnAllocatedSize(char* memory) +{ + if (head_ && head_->memory_ == memory) + return removeHeadAndReturnSize(); + + for (AccountingTestMemoryAllocatorMemoryNode* node = head_; node; node = node->next_) { + if (node->next_ && node->next_->memory_ == memory) + return removeNextNodeAndReturnSize(node); + } + + return 0; +} + +TestMemoryAllocator* AccountingTestMemoryAllocator::getOriginalAllocator() +{ + return originalAllocator_; +} + +char* AccountingTestMemoryAllocator::alloc_memory(size_t size, const char* file, int line) +{ + accountant_.alloc(size); + char* memory = originalAllocator_->alloc_memory(size, file, line); + addMemoryToMemoryTrackingToKeepTrackOfSize(memory, size); + return memory; +} + +void AccountingTestMemoryAllocator::free_memory(char* memory, const char* file, int line) +{ + size_t size = removeMemoryFromTrackingAndReturnAllocatedSize(memory); + accountant_.dealloc(size); + return originalAllocator_->free_memory(memory, file, line); +} + +GlobalMemoryAccountant::GlobalMemoryAccountant() + : mallocAllocator_(NULLPTR), newAllocator_(NULLPTR), newArrayAllocator_(NULLPTR) +{ +} + +void GlobalMemoryAccountant::start() +{ + accountant_.setAllocator(getCurrentMallocAllocator()); + + mallocAllocator_ = new AccountingTestMemoryAllocator(accountant_, getCurrentMallocAllocator()); + newAllocator_ = new AccountingTestMemoryAllocator(accountant_, getCurrentNewAllocator()); + newArrayAllocator_ = new AccountingTestMemoryAllocator(accountant_, getCurrentNewArrayAllocator()); + + + setCurrentMallocAllocator(mallocAllocator_); + setCurrentNewAllocator(newAllocator_); + setCurrentNewArrayAllocator(newArrayAllocator_); +} + +void GlobalMemoryAccountant::stop() +{ + setCurrentMallocAllocator(mallocAllocator_->getOriginalAllocator()); + setCurrentNewAllocator(newAllocator_->getOriginalAllocator()); + setCurrentNewArrayAllocator(newArrayAllocator_->getOriginalAllocator()); + + delete mallocAllocator_; + delete newAllocator_; + delete newArrayAllocator_; +} + +SimpleString GlobalMemoryAccountant::report() +{ + return accountant_.report(); +} + +TestMemoryAllocator* GlobalMemoryAccountant::getMallocAllocator() +{ + return mallocAllocator_; +} + +TestMemoryAllocator* GlobalMemoryAccountant::getNewAllocator() +{ + return newAllocator_; +} + +TestMemoryAllocator* GlobalMemoryAccountant::getNewArrayAllocator() +{ + return newArrayAllocator_; +} + + diff --git a/tests/CppUTest/AllTests.cpp b/tests/CppUTest/AllTests.cpp index 096df5a21..59e89beb3 100644 --- a/tests/CppUTest/AllTests.cpp +++ b/tests/CppUTest/AllTests.cpp @@ -26,6 +26,9 @@ */ #include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestMemoryAllocator.h" + +#define SHOW_MEMORY_REPORT 0 int main(int ac, char **av) { @@ -33,6 +36,18 @@ int main(int ac, char **av) CHECK(true); LONGS_EQUAL(1, 1); - return CommandLineTestRunner::RunAllTests(ac, av); /* cover alternate method */ +#if SHOW_MEMORY_REPORT + GlobalMemoryAccountant accountant; + accountant.start(); +#endif + + int returnValue = CommandLineTestRunner::RunAllTests(ac, av); /* cover alternate method */ + +#if SHOW_MEMORY_REPORT + accountant.stop(); + printf("%s", accountant.report().asCharString()); +#endif + + return returnValue; } diff --git a/tests/CppUTest/MemoryLeakDetectorTest.cpp b/tests/CppUTest/MemoryLeakDetectorTest.cpp index 3da0b05e0..fecef5217 100644 --- a/tests/CppUTest/MemoryLeakDetectorTest.cpp +++ b/tests/CppUTest/MemoryLeakDetectorTest.cpp @@ -678,15 +678,15 @@ TEST_GROUP(ReallocBugReported) TEST(ReallocBugReported, CanSafelyDoAReallocWithANewAllocator) { MemoryLeakDetector detector(&reporter); - char* mem = detector.allocMemory(getCurrentNewAllocator(), 5, "file", 1); - mem = detector.reallocMemory(getCurrentNewAllocator(), mem, 19, "file", 1); - detector.deallocMemory(getCurrentNewAllocator(), mem); + char* mem = detector.allocMemory(defaultNewAllocator(), 5, "file", 1); + mem = detector.reallocMemory(defaultNewAllocator(), mem, 19, "file", 1); + detector.deallocMemory(defaultNewAllocator(), mem); } TEST(ReallocBugReported, CanSafelyDoAReallocWithAMallocAllocator) { MemoryLeakDetector detector(&reporter); - char* mem = detector.allocMemory(getCurrentMallocAllocator(), 5, "file", 1, true); - mem = detector.reallocMemory(getCurrentMallocAllocator(), mem, 19, "file", 1, true); - detector.deallocMemory(getCurrentMallocAllocator(), mem, true); + char* mem = detector.allocMemory(defaultMallocAllocator(), 5, "file", 1, true); + mem = detector.reallocMemory(defaultMallocAllocator(), mem, 19, "file", 1, true); + detector.deallocMemory(defaultMallocAllocator(), mem, true); } diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index f04d3d81a..2c1ad4a6c 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -188,6 +188,8 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) DummyMemoryLeakDetector * dummyDetector; MemoryLeakFailure* dummyReporter; + GlobalMemoryAllocatorStash memoryAllocatorStash; + static void crashMethod() { cpputestHasCrashed = true; @@ -195,6 +197,7 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) void setup() { + memoryAllocatorStash.save(); detector = MemoryLeakWarningPlugin::getGlobalDetector(); failureReporter = MemoryLeakWarningPlugin::getGlobalFailureReporter(); @@ -221,9 +224,7 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) UtestShell::resetCrashMethod(); - setCurrentMallocAllocatorToDefault(); - setCurrentNewAllocatorToDefault(); - setCurrentNewArrayAllocatorToDefault(); + memoryAllocatorStash.restore(); } }; diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index 098225cda..0ab2d8c01 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -304,8 +304,10 @@ TEST(MemoryLeakOverridesToBeUsedInProductionCode, MemoryOverridesAreDisabled) TEST_GROUP(OutOfMemoryTestsForOperatorNew) { TestMemoryAllocator* no_memory_allocator; + GlobalMemoryAllocatorStash memoryAllocatorStash; void setup() { + memoryAllocatorStash.save(); no_memory_allocator = new NullUnknownAllocator; setCurrentNewAllocator(no_memory_allocator); setCurrentNewArrayAllocator(no_memory_allocator); @@ -313,9 +315,8 @@ TEST_GROUP(OutOfMemoryTestsForOperatorNew) void teardown() { - setCurrentNewAllocatorToDefault(); - setCurrentNewArrayAllocatorToDefault(); delete no_memory_allocator; + memoryAllocatorStash.restore(); } }; diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index ab70109a5..744de43ee 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -33,15 +33,18 @@ TEST_GROUP(TestMemoryAllocatorTest) { TestMemoryAllocator* allocator; + GlobalMemoryAllocatorStash memoryAllocatorStash; void setup() { + memoryAllocatorStash.save(); allocator = NULLPTR; } void teardown() { delete allocator; + memoryAllocatorStash.restore(); } }; @@ -50,8 +53,16 @@ TEST(TestMemoryAllocatorTest, SetCurrentNewAllocator) allocator = new TestMemoryAllocator("new allocator for test"); setCurrentNewAllocator(allocator); POINTERS_EQUAL(allocator, getCurrentNewAllocator()); +} + +TEST(TestMemoryAllocatorTest, SetCurrentNewAllocatorToDefault) +{ + TestMemoryAllocator* originalAllocator = getCurrentNewAllocator(); + setCurrentNewAllocatorToDefault(); POINTERS_EQUAL(defaultNewAllocator(), getCurrentNewAllocator()); + + setCurrentNewAllocator(originalAllocator); } TEST(TestMemoryAllocatorTest, SetCurrentNewArrayAllocator) @@ -273,3 +284,191 @@ TEST(FailableMemoryAllocator, CheckAllFailingLocationAllocsWereDone) #endif #endif + +TEST_GROUP(TestMemoryAccountant) +{ + MemoryAccountant accountant; + + void teardown() + { + accountant.clear(); + } +}; + +TEST(TestMemoryAccountant, totalAllocsIsZero) +{ + LONGS_EQUAL(0, accountant.totalAllocations()); + LONGS_EQUAL(0, accountant.totalDeallocations()); +} + +TEST(TestMemoryAccountant, countAllocationsPerSize) +{ + accountant.alloc(4); + LONGS_EQUAL(1, accountant.totalAllocationsOfSize(4)); + LONGS_EQUAL(0, accountant.totalAllocationsOfSize(10)); + LONGS_EQUAL(1, accountant.totalAllocations()); +} + +TEST(TestMemoryAccountant, countAllocationsPerSizeMultipleAllocations) +{ + accountant.alloc(4); + accountant.alloc(4); + accountant.alloc(8); + LONGS_EQUAL(2, accountant.totalAllocationsOfSize(4)); + LONGS_EQUAL(1, accountant.totalAllocationsOfSize(8)); + LONGS_EQUAL(0, accountant.totalAllocationsOfSize(10)); + LONGS_EQUAL(3, accountant.totalAllocations()); +} + +TEST(TestMemoryAccountant, countAllocationsPerSizeMultipleAllocationsOutOfOrder) +{ + accountant.alloc(4); + accountant.alloc(8); + accountant.alloc(4); + accountant.alloc(5); + accountant.alloc(2); + accountant.alloc(4); + accountant.alloc(10); + + LONGS_EQUAL(3, accountant.totalAllocationsOfSize(4)); + LONGS_EQUAL(1, accountant.totalAllocationsOfSize(8)); + LONGS_EQUAL(1, accountant.totalAllocationsOfSize(10)); + LONGS_EQUAL(7, accountant.totalAllocations()); +} + +TEST(TestMemoryAccountant, countDeallocationsPerSizeMultipleAllocations) +{ + accountant.dealloc(8); + accountant.dealloc(4); + accountant.dealloc(8); + LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(4)); + LONGS_EQUAL(2, accountant.totalDeallocationsOfSize(8)); + LONGS_EQUAL(0, accountant.totalDeallocationsOfSize(20)); + LONGS_EQUAL(3, accountant.totalDeallocations()); +} + +TEST(TestMemoryAccountant, countMaximumAllocationsAtATime) +{ + accountant.alloc(4); + accountant.alloc(4); + accountant.dealloc(4); + accountant.dealloc(4); + accountant.alloc(4); + LONGS_EQUAL(2, accountant.maximumAllocationAtATimeOfSize(4)); +} + +TEST(TestMemoryAccountant, reportNoAllocations) +{ + STRCMP_EQUAL("CppUTest Memory Accountant has not noticed any allocations or deallocations. Sorry\n", accountant.report().asCharString()); +} + +TEST(TestMemoryAccountant, reportAllocations) +{ + accountant.dealloc(8); + accountant.dealloc(8); + accountant.dealloc(8); + + accountant.alloc(4); + accountant.dealloc(4); + accountant.alloc(4); + STRCMP_EQUAL("CppUTest Memory Accountant report:\n" + "Allocation size # allocations # deallocations max # allocations at one time\n" + " 4 2 1 1\n" + " 8 0 3 0\n" + " Thank you for your business\n" + , accountant.report().asCharString()); +} + +TEST_GROUP(AccountingTestMemoryAllocator) +{ + MemoryAccountant accountant; + AccountingTestMemoryAllocator *allocator; + + void setup() + { + allocator = new AccountingTestMemoryAllocator(accountant, getCurrentMallocAllocator()); + } + + void teardown() + { + accountant.clear(); + delete allocator; + } +}; + +TEST(AccountingTestMemoryAllocator, canAllocateAndAccountMemory) +{ + char* memory = allocator->alloc_memory(10, __FILE__, __LINE__); + allocator->free_memory(memory, __FILE__, __LINE__); + + LONGS_EQUAL(1, accountant.totalAllocationsOfSize(10)); + LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(10)); +} + +TEST(AccountingTestMemoryAllocator, canAllocateAndAccountMemoryMultipleAllocations) +{ + char* memory1 = allocator->alloc_memory(10, __FILE__, __LINE__); + char* memory2 = allocator->alloc_memory(8, __FILE__, __LINE__); + char* memory3 = allocator->alloc_memory(12, __FILE__, __LINE__); + + allocator->free_memory(memory1, __FILE__, __LINE__); + allocator->free_memory(memory3, __FILE__, __LINE__); + + char* memory4 = allocator->alloc_memory(15, __FILE__, __LINE__); + char* memory5 = allocator->alloc_memory(20, __FILE__, __LINE__); + + allocator->free_memory(memory2, __FILE__, __LINE__); + allocator->free_memory(memory4, __FILE__, __LINE__); + allocator->free_memory(memory5, __FILE__, __LINE__); + + char* memory6 = allocator->alloc_memory(1, __FILE__, __LINE__); + char* memory7 = allocator->alloc_memory(100, __FILE__, __LINE__); + + allocator->free_memory(memory6, __FILE__, __LINE__); + allocator->free_memory(memory7, __FILE__, __LINE__); + + LONGS_EQUAL(7, accountant.totalAllocations()); + LONGS_EQUAL(7, accountant.totalDeallocations()); +} + +TEST_GROUP(GlobalMemoryAccountant) +{ + GlobalMemoryAccountant accountant; +}; + +TEST(GlobalMemoryAccountant, start) +{ + accountant.start(); + + POINTERS_EQUAL(accountant.getMallocAllocator(), getCurrentMallocAllocator()); + POINTERS_EQUAL(accountant.getNewAllocator(), getCurrentNewAllocator()); + POINTERS_EQUAL(accountant.getNewArrayAllocator(), getCurrentNewArrayAllocator()); + + accountant.stop(); +} + +TEST(GlobalMemoryAccountant, stop) +{ + TestMemoryAllocator* originalMallocAllocator = getCurrentMallocAllocator(); + TestMemoryAllocator* originalNewAllocator = getCurrentNewAllocator(); + TestMemoryAllocator* originalNewArrayAllocator = getCurrentNewArrayAllocator(); + + accountant.start(); + accountant.stop(); + + POINTERS_EQUAL(originalMallocAllocator, getCurrentMallocAllocator()); + POINTERS_EQUAL(originalNewAllocator, getCurrentNewAllocator()); + POINTERS_EQUAL(originalNewArrayAllocator, getCurrentNewArrayAllocator()); +} + +TEST(GlobalMemoryAccountant, report) +{ + accountant.start(); + char* memory = new char[185]; + delete [] memory; + accountant.stop(); + + /* Allocation includes memory leak info */ + STRCMP_CONTAINS("256", accountant.report().asCharString()); +} + From 470cbaa7598927c84991f522668b212fd0b6fadb Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 30 Apr 2020 16:08:34 +0800 Subject: [PATCH 0426/1093] Added missing overrides --- include/CppUTest/TestMemoryAllocator.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index 0e96491ee..1f9fdb23c 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -119,8 +119,8 @@ class FailableMemoryAllocator: public TestMemoryAllocator FailableMemoryAllocator(const char* name_str = "failable alloc", const char* alloc_name_str = "alloc", const char* free_name_str = "free"); virtual ~FailableMemoryAllocator() _destructor_override; - virtual char* alloc_memory(size_t size, const char* file, int line); - virtual char* allocMemoryLeakNode(size_t size); + virtual char* alloc_memory(size_t size, const char* file, int line) _override; + virtual char* allocMemoryLeakNode(size_t size) _override; virtual void failAllocNumber(int number); virtual void failNthAllocAt(int allocationNumber, const char* file, int line); From 334fb5a5e39afc45f783897299e537acbe2ba8a6 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 30 Apr 2020 17:10:49 +0800 Subject: [PATCH 0427/1093] Added some additional checks --- src/CppUTest/TestMemoryAllocator.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 086c0f610..cbfe6eacb 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -110,6 +110,11 @@ TestMemoryAllocator* defaultMallocAllocator() ///////////////////////////////////////////// +GlobalMemoryAllocatorStash::GlobalMemoryAllocatorStash() + : originalMallocAllocator(NULLPTR), originalNewAllocator(NULLPTR), originalNewArrayAllocator(NULLPTR) +{ +} + void GlobalMemoryAllocatorStash::save() { originalMallocAllocator = getCurrentMallocAllocator(); @@ -119,9 +124,9 @@ void GlobalMemoryAllocatorStash::save() void GlobalMemoryAllocatorStash::restore() { - setCurrentMallocAllocator(originalMallocAllocator); - setCurrentNewAllocator(originalNewAllocator); - setCurrentNewArrayAllocator(originalNewArrayAllocator); + if (originalMallocAllocator) setCurrentMallocAllocator(originalMallocAllocator); + if (originalNewAllocator) setCurrentNewAllocator(originalNewAllocator); + if (originalNewArrayAllocator) setCurrentNewArrayAllocator(originalNewArrayAllocator); } TestMemoryAllocator::TestMemoryAllocator(const char* name_str, const char* alloc_name_str, const char* free_name_str) From 0777fe3e9201d8c6a9cd2cd414ae9b5cfa472aff Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 30 Apr 2020 17:15:08 +0800 Subject: [PATCH 0428/1093] Forgot the header file --- include/CppUTest/TestMemoryAllocator.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index 1f9fdb23c..b279c157b 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -49,6 +49,7 @@ extern TestMemoryAllocator* defaultMallocAllocator(); class GlobalMemoryAllocatorStash { public: + GlobalMemoryAllocatorStash(); void save(); void restore(); From 75b24479adca50ed158ff967d52824aba12ae18e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 30 Apr 2020 19:22:01 +0800 Subject: [PATCH 0429/1093] Test cannot pass when memory leak detection is off, need to be #if-ed --- tests/CppUTest/TestMemoryAllocatorTest.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 744de43ee..4fa6deb48 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -461,6 +461,8 @@ TEST(GlobalMemoryAccountant, stop) POINTERS_EQUAL(originalNewArrayAllocator, getCurrentNewArrayAllocator()); } +#if CPPUTEST_USE_MEM_LEAK_DETECTION + TEST(GlobalMemoryAccountant, report) { accountant.start(); @@ -472,3 +474,5 @@ TEST(GlobalMemoryAccountant, report) STRCMP_CONTAINS("256", accountant.report().asCharString()); } +#endif + From b03e4c495097e4957f1a7f782655d7adfc94c72e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 09:13:29 +0800 Subject: [PATCH 0430/1093] ensure the proper defines are in place when no config was generated --- include/CppUTest/CppUTestGeneratedConfig.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/CppUTest/CppUTestGeneratedConfig.h b/include/CppUTest/CppUTestGeneratedConfig.h index 94e293f9c..6208c0c24 100644 --- a/include/CppUTest/CppUTestGeneratedConfig.h +++ b/include/CppUTest/CppUTestGeneratedConfig.h @@ -43,5 +43,7 @@ #ifdef HAVE_CONFIG_H #include "generated/CppUTestGeneratedConfig.h" +#else +#define CPPUTEST_HAVE_FORK 1 #endif From 46f06240ef55b834ddaaf69fe8e0d7b348879244 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 11:02:03 +0800 Subject: [PATCH 0431/1093] Reverted the HAVE_FORK change. #ifndef is correct --- include/CppUTest/CppUTestGeneratedConfig.h | 2 -- scripts/travis_ci_build.sh | 4 +++- tests/CppUTest/UtestTest.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/CppUTest/CppUTestGeneratedConfig.h b/include/CppUTest/CppUTestGeneratedConfig.h index 6208c0c24..94e293f9c 100644 --- a/include/CppUTest/CppUTestGeneratedConfig.h +++ b/include/CppUTest/CppUTestGeneratedConfig.h @@ -43,7 +43,5 @@ #ifdef HAVE_CONFIG_H #include "generated/CppUTestGeneratedConfig.h" -#else -#define CPPUTEST_HAVE_FORK 1 #endif diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 1ca87a84c..765b26154 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -115,7 +115,9 @@ if [ "x$BUILD" = "xdocker_dos" ]; then fi if [ "x$BUILD" = "xmake_dos" ]; then - git clone https://github.com/cpputest/watcom-compiler.git watcom + if [ ! -d watcom ]; then + git clone https://github.com/cpputest/watcom-compiler.git watcom + fi export PATH=$PATH:$PWD/watcom/binl export WATCOM=$PWD/watcom export CC=wcl diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index e5bbe3865..7443b8d44 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -194,7 +194,7 @@ TEST(UtestShell, RunInSeparateProcessTest) fixture.assertPrintContains("Failed in separate process"); } -#if !CPPUTEST_HAVE_FORK +#ifndef CPPUTEST_HAVE_FORK IGNORE_TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) {} From 193804e0c517f9dcd0adc88eb9b40dd825a89693 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 11:05:09 +0800 Subject: [PATCH 0432/1093] This commit includes a test that should fail but is not. Something wrong --- src/CppUTest/TestMemoryAllocator.cpp | 7 ++- tests/CppUTest/TestMemoryAllocatorTest.cpp | 69 ++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index cbfe6eacb..3a08f7250 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -578,12 +578,14 @@ GlobalMemoryAccountant::GlobalMemoryAccountant() void GlobalMemoryAccountant::start() { - accountant_.setAllocator(getCurrentMallocAllocator()); + if (mallocAllocator_ != NULLPTR) + FAIL("FAIL"); mallocAllocator_ = new AccountingTestMemoryAllocator(accountant_, getCurrentMallocAllocator()); newAllocator_ = new AccountingTestMemoryAllocator(accountant_, getCurrentNewAllocator()); newArrayAllocator_ = new AccountingTestMemoryAllocator(accountant_, getCurrentNewArrayAllocator()); + accountant_.setAllocator(getCurrentMallocAllocator()); setCurrentMallocAllocator(mallocAllocator_); setCurrentNewAllocator(newAllocator_); @@ -592,6 +594,9 @@ void GlobalMemoryAccountant::start() void GlobalMemoryAccountant::stop() { + if (mallocAllocator_ == NULLPTR) + FAIL("GlobalMemoryAccount: Stop called without starting"); + setCurrentMallocAllocator(mallocAllocator_->getOriginalAllocator()); setCurrentNewAllocator(newAllocator_->getOriginalAllocator()); setCurrentNewArrayAllocator(newArrayAllocator_->getOriginalAllocator()); diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 4fa6deb48..1cbaf04a6 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -431,9 +431,30 @@ TEST(AccountingTestMemoryAllocator, canAllocateAndAccountMemoryMultipleAllocatio LONGS_EQUAL(7, accountant.totalDeallocations()); } +class GlobalMemoryAccountantExecFunction + : public ExecFunction +{ +public: + void (*testFunction_)(GlobalMemoryAccountant*); + GlobalMemoryAccountant* parameter_; + + virtual void exec() _override + { + testFunction_(parameter_); + } +}; + TEST_GROUP(GlobalMemoryAccountant) { GlobalMemoryAccountant accountant; + TestTestingFixture fixture; + GlobalMemoryAccountantExecFunction testFunction; + + void setup() + { + testFunction.parameter_ = &accountant; + fixture.setTestFunction(&testFunction); + } }; TEST(GlobalMemoryAccountant, start) @@ -476,3 +497,51 @@ TEST(GlobalMemoryAccountant, report) #endif +static void _failStopWithoutStartingWillFail(GlobalMemoryAccountant* accountant) +{ + accountant->stop(); +} + +TEST(GlobalMemoryAccountant, StopCantBeCalledWithoutStarting) +{ + testFunction.testFunction_ = _failStopWithoutStartingWillFail; + fixture.runAllTests(); + fixture.assertPrintContains("GlobalMemoryAccount: Stop called without starting"); +} + +static void _failStartingTwiceWillFail(GlobalMemoryAccountant* accountant) +{ + accountant->start(); +} + +TEST(GlobalMemoryAccountant, startTwiceWillFail) +{ + testFunction.testFunction_ = _failStartingTwiceWillFail; + fixture.runAllTests(); + accountant.stop(); + + fixture.assertPrintContains("Global allocator start called twice!"); + +} + +#if 0 +TEST(GlobalMemoryAccountant, startTwiceWillFailWhenTheAllocatorIsntTheSame) +{ +} + +static void _failChangeMallocMemoryAllocator(GlobalMemoryAccountant* accountant) +{ + accountant->start(); + setCurrentMallocAllocator(defaultMallocAllocator()); + accountant->stop(); +} + +TEST(GlobalMemoryAccountant, checkWhetherMallocAllocatorIsNotChanged) +{ + testFunction.testFunction_ = _failChangeMallocMemoryAllocator; + fixture.runAllTests(); + fixture.assertPrintContains("Something wrong: Malloc memory allocator has been changed while accounting for memory"); +} + + +#endif From 2dd1dd7c298d5a97fb7bf877e10436e9a47598bb Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 13:13:12 +0800 Subject: [PATCH 0433/1093] Only destroy the test AFTER the current test has been reset. That way the current test will be good when the destroyTest fails --- src/CppUTest/Utest.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index b1c2e93df..f9eb42bac 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -208,11 +208,12 @@ void UtestShell::runOneTestInCurrentProcess(TestPlugin* plugin, TestResult& resu Utest* testToRun = createTest(); testToRun->run(); - destroyTest(testToRun); UtestShell::setCurrentTest(savedTest); UtestShell::setTestResult(savedResult); + destroyTest(testToRun); + plugin->runAllPostTestAction(*this, result); } From 315e86c674e1a55788fdda8bab628f7d2f91441b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 13:32:07 +0800 Subject: [PATCH 0434/1093] Small initialization error --- src/CppUTest/TestMemoryAllocator.cpp | 2 +- tests/CppUTest/TestMemoryAllocatorTest.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 3a08f7250..de603ef13 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -494,7 +494,7 @@ SimpleString MemoryAccountant::report() const } AccountingTestMemoryAllocator::AccountingTestMemoryAllocator(MemoryAccountant& accountant, TestMemoryAllocator* originalAllocator) - : accountant_(accountant), originalAllocator_(originalAllocator) + : accountant_(accountant), originalAllocator_(originalAllocator), head_(NULLPTR) { } diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 1cbaf04a6..e7727b8c1 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -431,10 +431,20 @@ TEST(AccountingTestMemoryAllocator, canAllocateAndAccountMemoryMultipleAllocatio LONGS_EQUAL(7, accountant.totalDeallocations()); } +TEST(AccountingTestMemoryAllocator, useOriginalAllocatorWhenDeallocatingMemoryNotAllocatedByAllocator) +{ + char* memory = getCurrentMallocAllocator()->alloc_memory(10, __FILE__, __LINE__); + allocator->free_memory(memory, __FILE__, __LINE__); +} + class GlobalMemoryAccountantExecFunction : public ExecFunction { public: + virtual ~GlobalMemoryAccountantExecFunction() _destructor_override + { + } + void (*testFunction_)(GlobalMemoryAccountant*); GlobalMemoryAccountant* parameter_; From 5c24e0c1cfdf719c68c453ba485da436d908eb89 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 13:56:05 +0800 Subject: [PATCH 0435/1093] Finally figured out how to avoid alloc/dealloc warning when using decorator allocators --- include/CppUTest/TestMemoryAllocator.h | 4 +++- src/CppUTest/MemoryLeakDetector.cpp | 6 +++--- src/CppUTest/TestMemoryAllocator.cpp | 23 +++++++++++++--------- tests/CppUTest/TestMemoryAllocatorTest.cpp | 3 +++ 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index b279c157b..b6d68ef36 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -78,6 +78,8 @@ class TestMemoryAllocator virtual char* allocMemoryLeakNode(size_t size); virtual void freeMemoryLeakNode(char* memory); + virtual TestMemoryAllocator* actualAllocator(); + protected: const char* name_; @@ -179,7 +181,7 @@ class AccountingTestMemoryAllocator : public TestMemoryAllocator virtual char* alloc_memory(size_t size, const char* file, int line) _override; virtual void free_memory(char* memory, const char* file, int line) _override; - TestMemoryAllocator* getOriginalAllocator(); + virtual TestMemoryAllocator* actualAllocator() _override; private: void addMemoryToMemoryTrackingToKeepTrackOfSize(char* memory, size_t size); diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index 93e1f1593..012aa16d6 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -611,10 +611,10 @@ bool MemoryLeakDetector::matchingAllocation(TestMemoryAllocator *alloc_allocator void MemoryLeakDetector::checkForCorruption(MemoryLeakDetectorNode* node, const char* file, int line, TestMemoryAllocator* allocator, bool allocateNodesSeperately) { - if (!matchingAllocation(node->allocator_, allocator)) - outputBuffer_.reportAllocationDeallocationMismatchFailure(node, file, line, allocator, reporter_); + if (!matchingAllocation(node->allocator_->actualAllocator(), allocator->actualAllocator())) + outputBuffer_.reportAllocationDeallocationMismatchFailure(node, file, line, allocator->actualAllocator(), reporter_); else if (!validMemoryCorruptionInformation(node->memory_ + node->size_)) - outputBuffer_.reportMemoryCorruptionFailure(node, file, line, allocator, reporter_); + outputBuffer_.reportMemoryCorruptionFailure(node, file, line, allocator->actualAllocator(), reporter_); else if (allocateNodesSeperately) allocator->freeMemoryLeakNode((char*) node); } diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index de603ef13..ce86b608d 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -183,6 +183,11 @@ const char* TestMemoryAllocator::free_name() const return free_name_; } +TestMemoryAllocator* TestMemoryAllocator::actualAllocator() +{ + return this; +} + CrashOnAllocationAllocator::CrashOnAllocationAllocator() : allocationToCrashOn_(0) { } @@ -551,11 +556,6 @@ size_t AccountingTestMemoryAllocator::removeMemoryFromTrackingAndReturnAllocated return 0; } -TestMemoryAllocator* AccountingTestMemoryAllocator::getOriginalAllocator() -{ - return originalAllocator_; -} - char* AccountingTestMemoryAllocator::alloc_memory(size_t size, const char* file, int line) { accountant_.alloc(size); @@ -568,7 +568,12 @@ void AccountingTestMemoryAllocator::free_memory(char* memory, const char* file, { size_t size = removeMemoryFromTrackingAndReturnAllocatedSize(memory); accountant_.dealloc(size); - return originalAllocator_->free_memory(memory, file, line); + originalAllocator_->free_memory(memory, file, line); +} + +TestMemoryAllocator* AccountingTestMemoryAllocator::actualAllocator() +{ + return originalAllocator_; } GlobalMemoryAccountant::GlobalMemoryAccountant() @@ -597,9 +602,9 @@ void GlobalMemoryAccountant::stop() if (mallocAllocator_ == NULLPTR) FAIL("GlobalMemoryAccount: Stop called without starting"); - setCurrentMallocAllocator(mallocAllocator_->getOriginalAllocator()); - setCurrentNewAllocator(newAllocator_->getOriginalAllocator()); - setCurrentNewArrayAllocator(newArrayAllocator_->getOriginalAllocator()); + setCurrentMallocAllocator(mallocAllocator_->actualAllocator()); + setCurrentNewAllocator(newAllocator_->actualAllocator()); + setCurrentNewArrayAllocator(newArrayAllocator_->actualAllocator()); delete mallocAllocator_; delete newAllocator_; diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index e7727b8c1..572ad1f8c 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -435,6 +435,9 @@ TEST(AccountingTestMemoryAllocator, useOriginalAllocatorWhenDeallocatingMemoryNo { char* memory = getCurrentMallocAllocator()->alloc_memory(10, __FILE__, __LINE__); allocator->free_memory(memory, __FILE__, __LINE__); + + LONGS_EQUAL(0, accountant.totalAllocations()); + LONGS_EQUAL(1, accountant.totalDeallocations()); } class GlobalMemoryAccountantExecFunction From 2d250f2dce17676fc624ad59eda40cb553b00b7f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 13:59:08 +0800 Subject: [PATCH 0436/1093] Finally fixed the failing test --- src/CppUTest/TestMemoryAllocator.cpp | 2 +- tests/CppUTest/TestMemoryAllocatorTest.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index ce86b608d..1f033a4d3 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -584,7 +584,7 @@ GlobalMemoryAccountant::GlobalMemoryAccountant() void GlobalMemoryAccountant::start() { if (mallocAllocator_ != NULLPTR) - FAIL("FAIL"); + FAIL("Global allocator start called twice!"); mallocAllocator_ = new AccountingTestMemoryAllocator(accountant_, getCurrentMallocAllocator()); newAllocator_ = new AccountingTestMemoryAllocator(accountant_, getCurrentNewAllocator()); diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 572ad1f8c..025ee621a 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -525,6 +525,7 @@ TEST(GlobalMemoryAccountant, StopCantBeCalledWithoutStarting) static void _failStartingTwiceWillFail(GlobalMemoryAccountant* accountant) { accountant->start(); + accountant->start(); } TEST(GlobalMemoryAccountant, startTwiceWillFail) From d03718eccd216688c9bb1d3563d59477d10988fc Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 18:20:58 +0800 Subject: [PATCH 0437/1093] Need to find where the allocators get reset --- include/CppUTest/TestMemoryAllocator.h | 5 +++ src/CppUTest/TestMemoryAllocator.cpp | 40 +++++++++++++++++--- tests/CppUTest/TestMemoryAllocatorTest.cpp | 43 ++++++++++++++++++---- 3 files changed, 74 insertions(+), 14 deletions(-) diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index b6d68ef36..b0f07dd00 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -182,6 +182,7 @@ class AccountingTestMemoryAllocator : public TestMemoryAllocator virtual void free_memory(char* memory, const char* file, int line) _override; virtual TestMemoryAllocator* actualAllocator() _override; + TestMemoryAllocator* originalAllocator(); private: void addMemoryToMemoryTrackingToKeepTrackOfSize(char* memory, size_t size); @@ -199,6 +200,7 @@ class GlobalMemoryAccountant { public: GlobalMemoryAccountant(); + ~GlobalMemoryAccountant(); void start(); void stop(); @@ -209,6 +211,9 @@ class GlobalMemoryAccountant TestMemoryAllocator* getNewArrayAllocator(); private: + + void restoreMemoryAllocators(); + MemoryAccountant accountant_; AccountingTestMemoryAllocator* mallocAllocator_; AccountingTestMemoryAllocator* newAllocator_; diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 1f033a4d3..38d69022d 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -572,6 +572,11 @@ void AccountingTestMemoryAllocator::free_memory(char* memory, const char* file, } TestMemoryAllocator* AccountingTestMemoryAllocator::actualAllocator() +{ + return originalAllocator_->actualAllocator(); +} + +TestMemoryAllocator* AccountingTestMemoryAllocator::originalAllocator() { return originalAllocator_; } @@ -581,6 +586,14 @@ GlobalMemoryAccountant::GlobalMemoryAccountant() { } +GlobalMemoryAccountant::~GlobalMemoryAccountant() +{ + restoreMemoryAllocators(); + delete mallocAllocator_; + delete newAllocator_; + delete newArrayAllocator_; +} + void GlobalMemoryAccountant::start() { if (mallocAllocator_ != NULLPTR) @@ -597,18 +610,33 @@ void GlobalMemoryAccountant::start() setCurrentNewArrayAllocator(newArrayAllocator_); } +void GlobalMemoryAccountant::restoreMemoryAllocators() +{ + if (getCurrentMallocAllocator() == mallocAllocator_) + setCurrentMallocAllocator(mallocAllocator_->originalAllocator()); + + if (getCurrentNewAllocator() == newAllocator_) + setCurrentNewAllocator(newAllocator_->originalAllocator()); + + if (getCurrentNewArrayAllocator() == newArrayAllocator_) + setCurrentNewArrayAllocator(newArrayAllocator_->originalAllocator()); +} + void GlobalMemoryAccountant::stop() { if (mallocAllocator_ == NULLPTR) FAIL("GlobalMemoryAccount: Stop called without starting"); - setCurrentMallocAllocator(mallocAllocator_->actualAllocator()); - setCurrentNewAllocator(newAllocator_->actualAllocator()); - setCurrentNewArrayAllocator(newArrayAllocator_->actualAllocator()); + if (getCurrentMallocAllocator() != mallocAllocator_) + FAIL("GlobalMemoryAccountant: Malloc memory allocator has been changed while accounting for memory"); - delete mallocAllocator_; - delete newAllocator_; - delete newArrayAllocator_; + if (getCurrentNewAllocator() != newAllocator_) + FAIL("GlobalMemoryAccountant: New memory allocator has been changed while accounting for memory"); + + if (getCurrentNewArrayAllocator() != newArrayAllocator_) + FAIL("GlobalMemoryAccountant: New Array memory allocator has been changed while accounting for memory"); + + restoreMemoryAllocators(); } SimpleString GlobalMemoryAccountant::report() diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 025ee621a..d0aab35db 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -462,11 +462,18 @@ TEST_GROUP(GlobalMemoryAccountant) GlobalMemoryAccountant accountant; TestTestingFixture fixture; GlobalMemoryAccountantExecFunction testFunction; + GlobalMemoryAllocatorStash stash; void setup() { testFunction.parameter_ = &accountant; fixture.setTestFunction(&testFunction); + stash.save(); + } + + void teardown() + { + stash.restore(); } }; @@ -535,12 +542,6 @@ TEST(GlobalMemoryAccountant, startTwiceWillFail) accountant.stop(); fixture.assertPrintContains("Global allocator start called twice!"); - -} - -#if 0 -TEST(GlobalMemoryAccountant, startTwiceWillFailWhenTheAllocatorIsntTheSame) -{ } static void _failChangeMallocMemoryAllocator(GlobalMemoryAccountant* accountant) @@ -554,8 +555,34 @@ TEST(GlobalMemoryAccountant, checkWhetherMallocAllocatorIsNotChanged) { testFunction.testFunction_ = _failChangeMallocMemoryAllocator; fixture.runAllTests(); - fixture.assertPrintContains("Something wrong: Malloc memory allocator has been changed while accounting for memory"); + fixture.assertPrintContains("GlobalMemoryAccountant: Malloc memory allocator has been changed while accounting for memory"); } +static void _failChangeNewMemoryAllocator(GlobalMemoryAccountant* accountant) +{ + accountant->start(); + setCurrentNewAllocator(defaultNewAllocator()); + accountant->stop(); +} + +TEST(GlobalMemoryAccountant, checkWhetherNewAllocatorIsNotChanged) +{ + testFunction.testFunction_ = _failChangeNewMemoryAllocator; + fixture.runAllTests(); + fixture.assertPrintContains("GlobalMemoryAccountant: New memory allocator has been changed while accounting for memory"); +} + +static void _failChangeNewArrayMemoryAllocator(GlobalMemoryAccountant* accountant) +{ + accountant->start(); + setCurrentNewArrayAllocator(defaultNewArrayAllocator()); + accountant->stop(); +} + +TEST(GlobalMemoryAccountant, checkWhetherNewArrayAllocatorIsNotChanged) +{ + testFunction.testFunction_ = _failChangeNewArrayMemoryAllocator; + fixture.runAllTests(); + fixture.assertPrintContains("GlobalMemoryAccountant: New Array memory allocator has been changed while accounting for memory"); +} -#endif From c523540655f115ac70e4f3f02b561df5150e3f98 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 19:41:14 +0800 Subject: [PATCH 0438/1093] Fixed more allocators. Should be done now --- src/CppUTest/TestHarness_c.cpp | 7 ++++- tests/CppUTest/TestHarness_cTest.cpp | 2 +- tests/CppUTest/TestMemoryAllocatorTest.cpp | 36 ++++++++++------------ 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/CppUTest/TestHarness_c.cpp b/src/CppUTest/TestHarness_c.cpp index 1d8c39858..3abfd9419 100644 --- a/src/CppUTest/TestHarness_c.cpp +++ b/src/CppUTest/TestHarness_c.cpp @@ -133,15 +133,20 @@ int cpputest_malloc_get_count() return malloc_count; } +static TestMemoryAllocator* originalAllocator = NULLPTR; + void cpputest_malloc_set_out_of_memory() { + if (originalAllocator == NULLPTR) + originalAllocator = getCurrentMallocAllocator(); setCurrentMallocAllocator(NullUnknownAllocator::defaultAllocator()); } void cpputest_malloc_set_not_out_of_memory() { malloc_out_of_memory_counter = NO_COUNTDOWN; - setCurrentMallocAllocatorToDefault(); + setCurrentMallocAllocator(originalAllocator); + originalAllocator = NULLPTR; } void cpputest_malloc_set_out_of_memory_countdown(int count) diff --git a/tests/CppUTest/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp index 591154bc1..8ead57153 100644 --- a/tests/CppUTest/TestHarness_cTest.cpp +++ b/tests/CppUTest/TestHarness_cTest.cpp @@ -797,7 +797,7 @@ TEST(TestHarness_c, callocInitializedToZero) free(mem); } -TEST(TestHarness_c, callocShouldReturnNULLWhenOutOfMeory) +TEST(TestHarness_c, callocShouldReturnNULLWhenOutOfMemory) { cpputest_malloc_set_out_of_memory_countdown(0); void * m = cpputest_calloc(1, 1); diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index d0aab35db..3c3b0ad62 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -158,32 +158,30 @@ class FailableMemoryAllocatorExecFunction : public ExecFunction testFunction_(allocator_); } - FailableMemoryAllocatorExecFunction(FailableMemoryAllocator* allocator) : allocator_(allocator) {} + FailableMemoryAllocatorExecFunction() : allocator_(NULLPTR), testFunction_(NULLPTR) {} virtual ~FailableMemoryAllocatorExecFunction() _destructor_override {} }; TEST_GROUP(FailableMemoryAllocator) { FailableMemoryAllocator *failableMallocAllocator; - FailableMemoryAllocatorExecFunction * testFunction; - TestTestingFixture *fixture; + FailableMemoryAllocatorExecFunction testFunction; + TestTestingFixture fixture; + GlobalMemoryAllocatorStash stash; void setup() { - fixture = new TestTestingFixture; - failableMallocAllocator = new FailableMemoryAllocator("Failable Malloc Allocator", "malloc", "free"); - testFunction = new FailableMemoryAllocatorExecFunction(failableMallocAllocator); - fixture->setTestFunction(testFunction); + stash.save(); + testFunction.allocator_ = failableMallocAllocator = new FailableMemoryAllocator("Failable Malloc Allocator", "malloc", "free"); + fixture.setTestFunction(&testFunction); setCurrentMallocAllocator(failableMallocAllocator); } void teardown() { failableMallocAllocator->checkAllFailedAllocsWereDone(); - setCurrentMallocAllocatorToDefault(); failableMallocAllocator->clearFailedAllocs(); - delete testFunction; delete failableMallocAllocator; - delete fixture; + stash.restore(); } }; @@ -230,12 +228,12 @@ static void _failingAllocIsNeverDone(FailableMemoryAllocator* failableMallocAllo TEST(FailableMemoryAllocator, CheckAllFailingAllocsWereDone) { - testFunction->testFunction_ = _failingAllocIsNeverDone; + testFunction.testFunction_ = _failingAllocIsNeverDone; - fixture->runAllTests(); + fixture.runAllTests(); - LONGS_EQUAL(1, fixture->getFailureCount()); - fixture->assertPrintContains("Expected allocation number 3 was never done"); + LONGS_EQUAL(1, fixture.getFailureCount()); + fixture.assertPrintContains("Expected allocation number 3 was never done"); failableMallocAllocator->clearFailedAllocs(); } @@ -271,13 +269,13 @@ static void _failingLocationAllocIsNeverDone(FailableMemoryAllocator* failableMa TEST(FailableMemoryAllocator, CheckAllFailingLocationAllocsWereDone) { - testFunction->testFunction_ = _failingLocationAllocIsNeverDone; + testFunction.testFunction_ = _failingLocationAllocIsNeverDone; - fixture->runAllTests(); + fixture.runAllTests(); - LONGS_EQUAL(1, fixture->getFailureCount()); - fixture->assertPrintContains("Expected failing alloc at TestMemoryAllocatorTest.cpp:"); - fixture->assertPrintContains("was never done"); + LONGS_EQUAL(1, fixture.getFailureCount()); + fixture.assertPrintContains("Expected failing alloc at TestMemoryAllocatorTest.cpp:"); + fixture.assertPrintContains("was never done"); failableMallocAllocator->clearFailedAllocs(); } From fed2c739df1b191b238a81e7258f73ed6acecebd Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 19:55:46 +0800 Subject: [PATCH 0439/1093] Should fix the dos build --- scripts/travis_ci_build.sh | 1 + src/CppUTest/TestMemoryAllocator.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 765b26154..658dae2a3 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -123,6 +123,7 @@ if [ "x$BUILD" = "xmake_dos" ]; then export CC=wcl export CXX=wcl $CC --version + make -f $CPPUTEST_HOME/platforms/Dos/Makefile clean make -f $CPPUTEST_HOME/platforms/Dos/Makefile $CPPUTEST_HOME/platforms/Dos/alltests.sh fi diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 38d69022d..bd39a53f9 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -492,8 +492,8 @@ SimpleString MemoryAccountant::report() const SimpleString report("CppUTest Memory Accountant report:\n" "Allocation size # allocations # deallocations max # allocations at one time\n"); for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) - report += StringFromFormat("%5lu %5lu %5lu %5lu\n", - node->size_, node->allocations_, node->deallocations_, node->maxAllocations_); + report += StringFromFormat("%5d %5d %5d %5d\n", + (int) node->size_, (int) node->allocations_, (int) node->deallocations_, (int) node->maxAllocations_); report += SimpleString(" Thank you for your business\n"); return report; } From 3c10424f872638e885cd80f58cdadcfc85ceab1e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 20:20:58 +0800 Subject: [PATCH 0440/1093] First restore the allocator, then delete it --- tests/CppUTest/TestMemoryAllocatorTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 3c3b0ad62..8930e3f56 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -37,14 +37,14 @@ TEST_GROUP(TestMemoryAllocatorTest) void setup() { - memoryAllocatorStash.save(); allocator = NULLPTR; + memoryAllocatorStash.save(); } void teardown() { - delete allocator; memoryAllocatorStash.restore(); + delete allocator; } }; From bee9e7b36cdfe1fe9995b10ad27811be54617153 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 20:22:06 +0800 Subject: [PATCH 0441/1093] Same as last commit --- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index 0ab2d8c01..cb9afb8d7 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -315,8 +315,8 @@ TEST_GROUP(OutOfMemoryTestsForOperatorNew) void teardown() { - delete no_memory_allocator; memoryAllocatorStash.restore(); + delete no_memory_allocator; } }; From f94a1d70cdbbb12cc579cbc2492d6a998b07bf44 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 1 May 2020 22:13:34 +0800 Subject: [PATCH 0442/1093] Missing test --- tests/CppUTest/TestMemoryAllocatorTest.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 8930e3f56..59acde4c3 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -305,6 +305,7 @@ TEST(TestMemoryAccountant, countAllocationsPerSize) LONGS_EQUAL(1, accountant.totalAllocationsOfSize(4)); LONGS_EQUAL(0, accountant.totalAllocationsOfSize(10)); LONGS_EQUAL(1, accountant.totalAllocations()); + LONGS_EQUAL(0, accountant.maximumAllocationAtATimeOfSize(10)); } TEST(TestMemoryAccountant, countAllocationsPerSizeMultipleAllocations) From 879e277b68a373aa4fb26c5132f9210dfe9e1599 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 2 May 2020 07:35:04 +0800 Subject: [PATCH 0443/1093] Made exec function virtual --- include/CppUTest/Utest.h | 2 +- src/CppUTest/Utest.cpp | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 3d7d46947..55b4e6a11 100644 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -201,7 +201,7 @@ class ExecFunction ExecFunction(); virtual ~ExecFunction(); - virtual void exec(); + virtual void exec()=0; }; class ExecFunctionWithoutParameters : public ExecFunction diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index f9eb42bac..9325450d9 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -660,10 +660,6 @@ ExecFunction::~ExecFunction() { } -void ExecFunction::exec() -{ -} - ExecFunctionWithoutParameters::ExecFunctionWithoutParameters(void(*testFunction)()) : testFunction_(testFunction) { From 8a08f8ff2f349af7c92184ac056e56cdb26a7999 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 2 May 2020 07:41:25 +0800 Subject: [PATCH 0444/1093] Not use the allocation size to check the number of allocations anymore --- tests/CppUTest/TestMemoryAllocatorTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 59acde4c3..13a0c817c 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -511,7 +511,7 @@ TEST(GlobalMemoryAccountant, report) accountant.stop(); /* Allocation includes memory leak info */ - STRCMP_CONTAINS("256", accountant.report().asCharString()); + STRCMP_CONTAINS("1 1 1", accountant.report().asCharString()); } #endif From f0c73be9a7f89427674e8a3a8cdc2a8dd613b066 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 2 May 2020 08:37:34 +0800 Subject: [PATCH 0445/1093] Updated release notes to contain more info --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 768222e64..b3cf18b36 100644 --- a/.travis.yml +++ b/.travis.yml @@ -147,7 +147,7 @@ jobs: token: $GH_TOKEN tag_name: latest-passing-build name: Latest passing build - release_notes: "This is the automatic release from Travis CI. Whenever a build passes, it gets released as Latest Passing Build." + release_notes: "This is the automatic release from Travis CI.\n\nWhenever a build passes, it gets released as Latest Passing Build.\n\nBuild number: $TRAVIS_BUILD_NUMBER\nDate: $DATE\nLog: $TRAVIS_BUILD_WEB_URL" file: - cpputest-latest.tar.gz - cpputest-latest.zip From 805c33f417f4099d4f9924d38103c17b94d16240 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 2 May 2020 12:33:16 +0800 Subject: [PATCH 0446/1093] String accounting and start of caching and tracking --- include/CppUTest/SimpleString.h | 46 ++++++++++ src/CppUTest/SimpleString.cpp | 96 +++++++++++++++++++ tests/CppUTest/SimpleStringTest.cpp | 138 +++++++++++++++++++++++++++- 3 files changed, 277 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 8481f46e7..8648d3919 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -135,6 +135,52 @@ class SimpleStringCollection SimpleStringCollection(SimpleStringCollection&); }; +class GlobalSimpleStringAllocatorStash +{ +public: + GlobalSimpleStringAllocatorStash(); + void save(); + void restore(); +private: + TestMemoryAllocator* originalAllocator_; +}; + +class MemoryAccountant; +class AccountingTestMemoryAllocator; + +class GlobalSimpleStringMemoryAccountant +{ +public: + GlobalSimpleStringMemoryAccountant(); + ~GlobalSimpleStringMemoryAccountant(); + + void start(); + void stop(); + SimpleString report(); + + AccountingTestMemoryAllocator* getAllocator(); +private: + void restoreAllocator(); + + AccountingTestMemoryAllocator* allocator_; + MemoryAccountant* accountant_; +}; + +class SimpleStringInternalCache +{ +public: + SimpleStringInternalCache(); + + char* alloc(size_t size); + void dealloc(char* memory, size_t size); + + void clear(); + size_t totalAvailableBlocks() const; +private: + size_t availableBlocks_; + char* cache_; +}; + SimpleString StringFrom(bool value); SimpleString StringFrom(const void* value); SimpleString StringFrom(void (*value)()); diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 6a7a618da..bda566fa6 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -30,6 +30,102 @@ #include "CppUTest/PlatformSpecificFunctions.h" #include "CppUTest/TestMemoryAllocator.h" +GlobalSimpleStringAllocatorStash::GlobalSimpleStringAllocatorStash() + : originalAllocator_(NULLPTR) +{ +} + +void GlobalSimpleStringAllocatorStash::save() +{ + originalAllocator_ = SimpleString::getStringAllocator(); +} + +void GlobalSimpleStringAllocatorStash::restore() +{ + SimpleString::setStringAllocator(originalAllocator_); +} + +SimpleStringInternalCache::SimpleStringInternalCache() + : availableBlocks_(0), cache_(NULLPTR) +{ +} + +GlobalSimpleStringMemoryAccountant::GlobalSimpleStringMemoryAccountant() + : allocator_(NULLPTR), accountant_(NULLPTR) +{ +} + +GlobalSimpleStringMemoryAccountant::~GlobalSimpleStringMemoryAccountant() +{ + restoreAllocator(); + + delete accountant_; + delete allocator_; +} + +void GlobalSimpleStringMemoryAccountant::restoreAllocator() +{ + if (SimpleString::getStringAllocator() == allocator_) + SimpleString::setStringAllocator(allocator_->originalAllocator()); +} + +void GlobalSimpleStringMemoryAccountant::start() +{ + if (accountant_ != NULLPTR) + FAIL("Global SimpleString allocator start called twice!"); + + accountant_ = new MemoryAccountant(); + allocator_ = new AccountingTestMemoryAllocator(*accountant_, SimpleString::getStringAllocator()); + + SimpleString::setStringAllocator(allocator_); +} + +void GlobalSimpleStringMemoryAccountant::stop() +{ + if (allocator_ == NULLPTR) + FAIL("Global SimpleString allocator stopped without starting"); + + if (SimpleString::getStringAllocator() != allocator_) + FAIL("GlobalStrimpleStringMemoryAccountant: allocator has changed between start and stop!"); + + restoreAllocator(); +} + +SimpleString GlobalSimpleStringMemoryAccountant::report() +{ + return accountant_->report(); +} + +AccountingTestMemoryAllocator* GlobalSimpleStringMemoryAccountant::getAllocator() +{ + return allocator_; +} + +size_t SimpleStringInternalCache::totalAvailableBlocks() const +{ + return availableBlocks_; +} + +char* SimpleStringInternalCache::alloc(size_t size) +{ + if (cache_) + return cache_; + return new char[size]; +} + +void SimpleStringInternalCache::dealloc(char* memory, size_t) +{ + if (cache_ == NULLPTR) { + cache_ = memory; + availableBlocks_++; + } +} + +void SimpleStringInternalCache::clear() +{ + delete [] cache_; +} + TestMemoryAllocator* SimpleString::stringAllocator_ = NULLPTR; TestMemoryAllocator* SimpleString::getStringAllocator() diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index c45e9d329..0c11b7829 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -30,6 +30,7 @@ #include "CppUTest/PlatformSpecificFunctions.h" #include "CppUTest/TestMemoryAllocator.h" #include "CppUTest/MemoryLeakDetector.h" +#include "CppUTest/TestTestingFixture.h" class JustUseNewStringAllocator : public TestMemoryAllocator { @@ -46,24 +47,120 @@ class JustUseNewStringAllocator : public TestMemoryAllocator } }; +class GlobalSimpleStringMemoryAccountantExecFunction + : public ExecFunction +{ +public: + void (*testFunction_)(GlobalSimpleStringMemoryAccountant*); + GlobalSimpleStringMemoryAccountant* parameter_; + + virtual void exec() _override + { + testFunction_(parameter_); + } +}; + +TEST_GROUP(GlobalSimpleStringMemoryAccountant) +{ + GlobalSimpleStringAllocatorStash stash; + GlobalSimpleStringMemoryAccountantExecFunction testFunction; + TestTestingFixture fixture; + GlobalSimpleStringMemoryAccountant accountant; + + void setup() + { + stash.save(); + testFunction.parameter_ = &accountant; + fixture.setTestFunction(&testFunction); + } + + void teardown() + { + stash.restore(); + } +}; + +TEST(GlobalSimpleStringMemoryAccountant, start) +{ + accountant.start(); + POINTERS_EQUAL(accountant.getAllocator(), SimpleString::getStringAllocator()); +} + +static void _startTwice(GlobalSimpleStringMemoryAccountant* accountant) +{ + accountant->start(); + accountant->start(); +} + +TEST(GlobalSimpleStringMemoryAccountant, startTwiceWillFail) +{ + testFunction.testFunction_ = _startTwice; + fixture.runAllTests(); + fixture.assertPrintContains("Global SimpleString allocator start called twice!"); +} + +TEST(GlobalSimpleStringMemoryAccountant, stop) +{ + TestMemoryAllocator* originalAllocator = SimpleString::getStringAllocator(); + accountant.start(); + accountant.stop(); + POINTERS_EQUAL(originalAllocator, SimpleString::getStringAllocator()); +} + +static void _stopAccountant(GlobalSimpleStringMemoryAccountant* accountant) +{ + accountant->stop(); +} + +TEST(GlobalSimpleStringMemoryAccountant, stopWithoutStartWillFail) +{ + testFunction.testFunction_ = _stopAccountant; + fixture.runAllTests(); + fixture.assertPrintContains("Global SimpleString allocator stopped without starting"); +} + +static void _changeAllocatorBetweenStartAndStop(GlobalSimpleStringMemoryAccountant* accountant) +{ + accountant->start(); + SimpleString::setStringAllocator(defaultMallocAllocator()); + accountant->stop(); +} + +TEST(GlobalSimpleStringMemoryAccountant, stopFailsWhenAllocatorWasChangedInBetween) +{ + testFunction.testFunction_ = _changeAllocatorBetweenStartAndStop; + fixture.runAllTests(); + fixture.assertPrintContains("GlobalStrimpleStringMemoryAccountant: allocator has changed between start and stop!"); +} + +TEST(GlobalSimpleStringMemoryAccountant, report) +{ + SimpleString str; + accountant.start(); + str += "More"; + accountant.stop(); + STRCMP_CONTAINS(" 1 0 1", accountant.report().asCharString()); +} TEST_GROUP(SimpleString) { JustUseNewStringAllocator justNewForSimpleStringTestAllocator; + GlobalSimpleStringAllocatorStash stash; void setup() { - SimpleString::setStringAllocator(&justNewForSimpleStringTestAllocator); + stash.save(); + SimpleString::setStringAllocator(&justNewForSimpleStringTestAllocator); } void teardown() { - SimpleString::setStringAllocator(NULLPTR); + stash.restore(); } }; TEST(SimpleString, defaultAllocatorIsNewArrayAllocator) { SimpleString::setStringAllocator(NULLPTR); - POINTERS_EQUAL(getCurrentNewArrayAllocator(), SimpleString::getStringAllocator()); + POINTERS_EQUAL(defaultNewArrayAllocator(), SimpleString::getStringAllocator()); } class MyOwnStringAllocator : public TestMemoryAllocator @@ -1155,3 +1252,38 @@ TEST(SimpleString, BracketsFormattedHexStringFromForULongLong) #endif + +TEST_GROUP(SimpleStringInternalCache) +{ + SimpleStringInternalCache cache; + + void teardown() + { + cache.clear(); + } +}; + +TEST(SimpleStringInternalCache, noAllocationWillLeaveTheCacheEmpty) +{ + LONGS_EQUAL(0, cache.totalAvailableBlocks()); +} + +TEST(SimpleStringInternalCache, allocationAndFreeWillCreateAvailabelBlocks) +{ + char* mem = cache.alloc(10); + cache.dealloc(mem, 10); + LONGS_EQUAL(1, cache.totalAvailableBlocks()); +} + +TEST(SimpleStringInternalCache, allocationWillReuseTheAllocatedBlocks) +{ + char* mem = cache.alloc(10); + cache.dealloc(mem, 10); + mem = cache.alloc(10); + cache.dealloc(mem, 10); + + LONGS_EQUAL(1, cache.totalAvailableBlocks()); +} + + + From 6552d738a0008d05a3f9af7cbbc3ab16064fabb2 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 2 May 2020 20:08:51 +0800 Subject: [PATCH 0447/1093] Memory leaks in Ext tests --- include/CppUTestExt/MemoryReportAllocator.h | 2 ++ include/CppUTestExt/MemoryReporterPlugin.h | 3 +++ src/CppUTestExt/MemoryReportAllocator.cpp | 7 ++++++- src/CppUTestExt/MemoryReporterPlugin.cpp | 14 ++++++++++++++ tests/CppUTestExt/MemoryReporterPluginTest.cpp | 18 ++++++++++-------- 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/include/CppUTestExt/MemoryReportAllocator.h b/include/CppUTestExt/MemoryReportAllocator.h index 649a648e8..d7faad491 100644 --- a/include/CppUTestExt/MemoryReportAllocator.h +++ b/include/CppUTestExt/MemoryReportAllocator.h @@ -54,6 +54,8 @@ class MemoryReportAllocator : public TestMemoryAllocator virtual const char* name() const _override; virtual const char* alloc_name() const _override; virtual const char* free_name() const _override; + + virtual TestMemoryAllocator* actualAllocator(); }; #endif diff --git a/include/CppUTestExt/MemoryReporterPlugin.h b/include/CppUTestExt/MemoryReporterPlugin.h index 78d4729df..9874cade6 100644 --- a/include/CppUTestExt/MemoryReporterPlugin.h +++ b/include/CppUTestExt/MemoryReporterPlugin.h @@ -50,6 +50,9 @@ class MemoryReporterPlugin : public TestPlugin virtual void postTestAction(UtestShell & test, TestResult & result) _override; virtual bool parseArguments(int, const char *const *, int) _override; + MemoryReportAllocator* getMallocAllocator(); + MemoryReportAllocator* getNewAllocator(); + MemoryReportAllocator* getNewArrayAllocator(); protected: virtual MemoryReportFormatter* createMemoryFormatter(const SimpleString& type); diff --git a/src/CppUTestExt/MemoryReportAllocator.cpp b/src/CppUTestExt/MemoryReportAllocator.cpp index b080988e6..91fa9e627 100644 --- a/src/CppUTestExt/MemoryReportAllocator.cpp +++ b/src/CppUTestExt/MemoryReportAllocator.cpp @@ -39,7 +39,7 @@ MemoryReportAllocator::~MemoryReportAllocator() const char* MemoryReportAllocator::name() const { - return realAllocator_->name(); + return "MemoryReporterAllocator"; } const char* MemoryReportAllocator::alloc_name() const @@ -62,6 +62,11 @@ TestMemoryAllocator* MemoryReportAllocator::getRealAllocator() return realAllocator_; } +TestMemoryAllocator* MemoryReportAllocator::actualAllocator() +{ + return realAllocator_->actualAllocator(); +} + void MemoryReportAllocator::setTestResult(TestResult* result) { result_ = result; diff --git a/src/CppUTestExt/MemoryReporterPlugin.cpp b/src/CppUTestExt/MemoryReporterPlugin.cpp index 9a3df9e50..e42bcd6bc 100644 --- a/src/CppUTestExt/MemoryReporterPlugin.cpp +++ b/src/CppUTestExt/MemoryReporterPlugin.cpp @@ -95,6 +95,20 @@ void MemoryReporterPlugin::removeGlobalMemoryReportAllocators() setCurrentMallocAllocator(mallocAllocator.getRealAllocator()); } +MemoryReportAllocator* MemoryReporterPlugin::getMallocAllocator() +{ + return &mallocAllocator; +} + +MemoryReportAllocator* MemoryReporterPlugin::getNewAllocator() +{ + return &newAllocator; +} + +MemoryReportAllocator* MemoryReporterPlugin::getNewArrayAllocator() +{ + return &newArrayAllocator; +} void MemoryReporterPlugin::initializeAllocator(MemoryReportAllocator* allocator, TestResult & result) { diff --git a/tests/CppUTestExt/MemoryReporterPluginTest.cpp b/tests/CppUTestExt/MemoryReporterPluginTest.cpp index c359fb2a4..9a95ecc6b 100644 --- a/tests/CppUTestExt/MemoryReporterPluginTest.cpp +++ b/tests/CppUTestExt/MemoryReporterPluginTest.cpp @@ -140,6 +140,8 @@ TEST_GROUP(MemoryReporterPlugin) } void teardown() { + setCurrentNewAllocator(previousNewAllocator); + mock().clear(); delete reporter; delete test; delete result; @@ -186,8 +188,8 @@ TEST(MemoryReporterPlugin, postTestActionReportsTest) TEST(MemoryReporterPlugin, newAllocationsAreReportedTest) { - mock("formatter").expectOneCall("report_alloc_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", defaultNewAllocator()); - mock("formatter").expectOneCall("report_free_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", defaultNewAllocator()); + mock("formatter").expectOneCall("report_alloc_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", reporter->getNewAllocator()); + mock("formatter").expectOneCall("report_free_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", reporter->getNewAllocator()); mock("formatter").ignoreOtherCalls(); reporter->preTestAction(*test, *result); @@ -198,8 +200,8 @@ TEST(MemoryReporterPlugin, newAllocationsAreReportedTest) TEST(MemoryReporterPlugin, whenUsingOnlyMallocAllocatorNoOtherOfTheAllocatorsAreUsed) { mock("formatter").expectOneCall("report_test_start").withParameter("result", result).withParameter("test", test); - mock("formatter").expectOneCall("report_alloc_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", defaultMallocAllocator()); - mock("formatter").expectOneCall("report_free_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", defaultMallocAllocator()); + mock("formatter").expectOneCall("report_alloc_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", reporter->getMallocAllocator()); + mock("formatter").expectOneCall("report_free_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", reporter->getMallocAllocator()); mock("formatter").ignoreOtherCalls(); reporter->preTestAction(*test, *result); @@ -209,8 +211,8 @@ TEST(MemoryReporterPlugin, whenUsingOnlyMallocAllocatorNoOtherOfTheAllocatorsAre TEST(MemoryReporterPlugin, newArrayAllocationsAreReportedTest) { - mock("formatter").expectOneCall("report_alloc_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", defaultNewArrayAllocator()); - mock("formatter").expectOneCall("report_free_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", defaultNewArrayAllocator()); + mock("formatter").expectOneCall("report_alloc_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", reporter->getNewArrayAllocator()); + mock("formatter").expectOneCall("report_free_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", reporter->getNewArrayAllocator()); mock("formatter").ignoreOtherCalls(); reporter->preTestAction(*test, *result); @@ -220,8 +222,8 @@ TEST(MemoryReporterPlugin, newArrayAllocationsAreReportedTest) TEST(MemoryReporterPlugin, mallocAllocationsAreReportedTest) { - mock("formatter").expectOneCall("report_alloc_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", defaultMallocAllocator()); - mock("formatter").expectOneCall("report_free_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", defaultMallocAllocator()); + mock("formatter").expectOneCall("report_alloc_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", reporter->getMallocAllocator()); + mock("formatter").expectOneCall("report_free_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", reporter->getMallocAllocator()); mock("formatter").ignoreOtherCalls(); reporter->preTestAction(*test, *result); From bc68d73c2fa66f4834ff54b5c6283c5b0a863e0d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 2 May 2020 20:26:18 +0800 Subject: [PATCH 0448/1093] More memory leaks in Ext resolved --- tests/CppUTestExt/MockPluginTest.cpp | 1 + tests/CppUTestExt/MockReturnValueTest.cpp | 3 ++- tests/CppUTestExt/MockSupportTest.cpp | 10 ++++++++-- tests/CppUTestExt/MockSupport_cTest.cpp | 4 ++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/tests/CppUTestExt/MockPluginTest.cpp b/tests/CppUTestExt/MockPluginTest.cpp index 0edc40003..a1aa4971b 100644 --- a/tests/CppUTestExt/MockPluginTest.cpp +++ b/tests/CppUTestExt/MockPluginTest.cpp @@ -50,6 +50,7 @@ TEST_GROUP(MockPlugin) { delete test; delete result; + mock().clear(); } }; diff --git a/tests/CppUTestExt/MockReturnValueTest.cpp b/tests/CppUTestExt/MockReturnValueTest.cpp index e4391075e..da412830a 100644 --- a/tests/CppUTestExt/MockReturnValueTest.cpp +++ b/tests/CppUTestExt/MockReturnValueTest.cpp @@ -32,7 +32,8 @@ TEST_GROUP(MockReturnValueTest) { void teardown() { - mock().checkExpectations(); + mock().checkExpectations(); + mock().clear(); } }; diff --git a/tests/CppUTestExt/MockSupportTest.cpp b/tests/CppUTestExt/MockSupportTest.cpp index 3fbf268a9..65c0f8d70 100644 --- a/tests/CppUTestExt/MockSupportTest.cpp +++ b/tests/CppUTestExt/MockSupportTest.cpp @@ -39,8 +39,9 @@ TEST_GROUP(MockSupportTest) void teardown() { - mock().checkExpectations(); - CHECK_NO_MOCK_FAILURE(); + mock().checkExpectations(); + CHECK_NO_MOCK_FAILURE(); + mock().clear(); } }; @@ -170,6 +171,11 @@ TEST(MockSupportTest, tracingWorksHierarchically) TEST_GROUP(MockSupportTestWithFixture) { TestTestingFixture fixture; + + void teardown() + { + mock().clear(); + } }; static void CHECK_EXPECTED_MOCK_FAILURE_LOCATION_failedTestMethod_() diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index d1caa1374..3aff93d7d 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -43,6 +43,10 @@ extern "C" { TEST_GROUP(MockSupport_c) { + void teardown() + { + mock_c()->clear(); + } }; TEST(MockSupport_c, OrderObserved) From 9c1933c846b83ce87e65cd33defa1a5e0e4e8cfa Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 2 May 2020 21:11:25 +0800 Subject: [PATCH 0449/1093] Forgot _override --- include/CppUTestExt/MemoryReportAllocator.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTestExt/MemoryReportAllocator.h b/include/CppUTestExt/MemoryReportAllocator.h index d7faad491..b0861e81f 100644 --- a/include/CppUTestExt/MemoryReportAllocator.h +++ b/include/CppUTestExt/MemoryReportAllocator.h @@ -55,7 +55,7 @@ class MemoryReportAllocator : public TestMemoryAllocator virtual const char* alloc_name() const _override; virtual const char* free_name() const _override; - virtual TestMemoryAllocator* actualAllocator(); + virtual TestMemoryAllocator* actualAllocator() _override; }; #endif From 6ac5ea87f1cec28ec23618c910e6ca44e0a519a1 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 2 May 2020 21:31:17 +0800 Subject: [PATCH 0450/1093] Added test --- tests/CppUTestExt/MemoryReportAllocatorTest.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/CppUTestExt/MemoryReportAllocatorTest.cpp b/tests/CppUTestExt/MemoryReportAllocatorTest.cpp index 1df85c114..3cc990511 100644 --- a/tests/CppUTestExt/MemoryReportAllocatorTest.cpp +++ b/tests/CppUTestExt/MemoryReportAllocatorTest.cpp @@ -32,13 +32,20 @@ TEST_GROUP(MemoryReportAllocator) { + MemoryReportAllocator allocator; }; TEST(MemoryReportAllocator, FunctionsAreForwardedForMallocAllocator) { - MemoryReportAllocator allocator; allocator.setRealAllocator(getCurrentMallocAllocator()); STRCMP_EQUAL("malloc", allocator.alloc_name()); STRCMP_EQUAL("free", allocator.free_name()); } + +TEST(MemoryReportAllocator, keepingTrackOfActualAllocator) +{ + TestMemoryAllocator* originalAllocator = getCurrentMallocAllocator(); + allocator.setRealAllocator(getCurrentMallocAllocator()); + POINTERS_EQUAL(originalAllocator->actualAllocator(), allocator.actualAllocator()); +} From bbf5b9f2f10c2303c258744099f449e52e787608 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 3 May 2020 15:09:02 +0800 Subject: [PATCH 0451/1093] Added -vv for very verbose --- include/CppUTest/CommandLineArguments.h | 2 ++ include/CppUTest/TestOutput.h | 13 ++++++----- include/CppUTest/TestResult.h | 1 + src/CppUTest/CommandLineArguments.cpp | 18 +++++++++++---- src/CppUTest/CommandLineTestRunner.cpp | 3 ++- src/CppUTest/TestOutput.cpp | 23 +++++++++++++------- src/CppUTest/TestResult.cpp | 5 +++++ src/CppUTest/TestTestingFixture.cpp | 2 +- src/CppUTest/Utest.cpp | 11 ++++++++++ tests/CppUTest/CommandLineArgumentsTest.cpp | 9 +++++++- tests/CppUTest/CommandLineTestRunnerTest.cpp | 10 +++++++++ tests/CppUTest/TestOutputTest.cpp | 6 ++--- tests/CppUTest/UtestTest.cpp | 14 ++++++++++++ 13 files changed, 94 insertions(+), 23 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index dd8c01d0f..fba2d9790 100644 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -43,6 +43,7 @@ class CommandLineArguments bool parse(TestPlugin* plugin); bool needHelp() const; bool isVerbose() const; + bool isVeryVerbose() const; bool isColor() const; bool isListingTestGroupNames() const; bool isListingTestGroupAndCaseNames() const; @@ -73,6 +74,7 @@ class CommandLineArguments bool needHelp_; bool verbose_; + bool veryVerbose_; bool color_; bool runTestsAsSeperateProcess_; bool listTestGroupNames_; diff --git a/include/CppUTest/TestOutput.h b/include/CppUTest/TestOutput.h index be0285175..8dcb8cb7f 100644 --- a/include/CppUTest/TestOutput.h +++ b/include/CppUTest/TestOutput.h @@ -46,6 +46,9 @@ class TestResult; class TestOutput { public: + enum WorkingEnvironment {visualStudio, eclipse, detectEnvironment}; + enum VerbosityLevel {level_quiet, level_verbose, level_veryVerbose}; + explicit TestOutput(); virtual ~TestOutput(); @@ -56,7 +59,7 @@ class TestOutput virtual void printCurrentGroupStarted(const UtestShell& test); virtual void printCurrentGroupEnded(const TestResult& res); - virtual void verbose(); + virtual void verbose(VerbosityLevel level); virtual void color(); virtual void printBuffer(const char*)=0; virtual void print(const char*); @@ -66,9 +69,9 @@ class TestOutput virtual void printTestRun(int number, int total); virtual void setProgressIndicator(const char*); - virtual void flush()=0; + virtual void printVeryVerbose(const char*); - enum WorkingEnvironment {visualStudio, eclipse, detectEnvironment}; + virtual void flush()=0; static void setWorkingEnvironment(WorkingEnvironment workEnvironment); static WorkingEnvironment getWorkingEnvironment(); @@ -89,7 +92,7 @@ class TestOutput TestOutput& operator=(const TestOutput&); int dotCount_; - bool verbose_; + VerbosityLevel verbose_; bool color_; const char* progressIndication_; @@ -184,7 +187,7 @@ class CompositeTestOutput : public TestOutput virtual void printCurrentGroupStarted(const UtestShell& test) _override; virtual void printCurrentGroupEnded(const TestResult& res) _override; - virtual void verbose() _override; + virtual void verbose(VerbosityLevel level) _override; virtual void color() _override; virtual void printBuffer(const char*) _override; virtual void print(const char*) _override; diff --git a/include/CppUTest/TestResult.h b/include/CppUTest/TestResult.h index ee8307c9f..1be1af43e 100644 --- a/include/CppUTest/TestResult.h +++ b/include/CppUTest/TestResult.h @@ -59,6 +59,7 @@ class TestResult virtual void countIgnored(); virtual void addFailure(const TestFailure& failure); virtual void print(const char* text); + virtual void printVeryVerbose(const char* text); int getTestCount() const { diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 4f2b11324..dd125e153 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -30,7 +30,7 @@ #include "CppUTest/PlatformSpecificFunctions.h" CommandLineArguments::CommandLineArguments(int ac, const char *const *av) : - ac_(ac), av_(av), needHelp_(false), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), reversing_(false), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) + ac_(ac), av_(av), needHelp_(false), verbose_(false), veryVerbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), reversing_(false), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) { } @@ -54,8 +54,12 @@ bool CommandLineArguments::parse(TestPlugin* plugin) for (int i = 1; i < ac_; i++) { SimpleString argument = av_[i]; - if (argument == "-h") needHelp_ = true; - if (argument == "-v") verbose_ = true; + if (argument == "-h") { + needHelp_ = true; + correctParameters = false; + } + else if (argument == "-v") verbose_ = true; + else if (argument == "-vv") veryVerbose_ = true; else if (argument == "-c") color_ = true; else if (argument == "-p") runTestsAsSeperateProcess_ = true; else if (argument == "-b") reversing_ = true; @@ -89,7 +93,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) const char* CommandLineArguments::usage() const { - return "use -h for more extensive help\nusage [-h] [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#]\n" + return "use -h for more extensive help\nusage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ri] [-r#]\n" " [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-t groupName.testName]...\n" " [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; } @@ -107,6 +111,7 @@ const char* CommandLineArguments::help() const "Options that change the output format:\n" " -c - colorize output, print green if OK, or red if failed\n" " -v - verbose, print each test name as it runs\n" + " -vv - very verbose, print internal information during test run\n" "\n" "Options that change the output location:\n" " -oteamcity - output to xml files (as the name suggests, for TeamCity)\n" @@ -142,6 +147,11 @@ bool CommandLineArguments::isVerbose() const return verbose_; } +bool CommandLineArguments::isVeryVerbose() const +{ + return veryVerbose_; +} + bool CommandLineArguments::isColor() const { return color_; diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 9a4e74139..7aff75747 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -90,7 +90,8 @@ void CommandLineTestRunner::initializeTestRun() registry_->setGroupFilters(arguments_->getGroupFilters()); registry_->setNameFilters(arguments_->getNameFilters()); - if (arguments_->isVerbose()) output_->verbose(); + if (arguments_->isVerbose()) output_->verbose(TestOutput::level_verbose); + if (arguments_->isVeryVerbose()) output_->verbose(TestOutput::level_veryVerbose); if (arguments_->isColor()) output_->color(); if (arguments_->runTestsInSeperateProcess()) registry_->setRunTestsInSeperateProcess(); if (arguments_->isRunIgnored()) registry_->setRunIgnored(); diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index 0162bbf09..b9036b4e3 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -44,7 +44,7 @@ TestOutput::WorkingEnvironment TestOutput::getWorkingEnvironment() TestOutput::TestOutput() : - dotCount_(0), verbose_(false), color_(false), progressIndication_(".") + dotCount_(0), verbose_(level_quiet), color_(false), progressIndication_(".") { } @@ -52,9 +52,9 @@ TestOutput::~TestOutput() { } -void TestOutput::verbose() +void TestOutput::verbose(VerbosityLevel level) { - verbose_ = true; + verbose_ = level; } void TestOutput::color() @@ -91,7 +91,7 @@ TestOutput& operator<<(TestOutput& p, long int i) void TestOutput::printCurrentTestStarted(const UtestShell& test) { - if (verbose_) print(test.getFormattedName().asCharString()); + if (verbose_ > level_quiet) print(test.getFormattedName().asCharString()); if (test.willRun()) { setProgressIndicator("."); @@ -103,7 +103,7 @@ void TestOutput::printCurrentTestStarted(const UtestShell& test) void TestOutput::printCurrentTestEnded(const TestResult& res) { - if (verbose_) { + if (verbose_ > level_quiet) { print(" - "); print(res.getCurrentTestTotalExecutionTime()); print(" ms\n"); @@ -260,6 +260,13 @@ void TestOutput::printVisualStudioErrorInFileOnLine(SimpleString file, int lineN print(" error:"); } +void TestOutput::printVeryVerbose(const char* str) +{ + if(verbose_ == level_veryVerbose) + printBuffer(str); +} + + void ConsoleTestOutput::printBuffer(const char* s) { while (*s) { @@ -337,10 +344,10 @@ void CompositeTestOutput::printCurrentGroupEnded(const TestResult& res) if (outputTwo_) outputTwo_->printCurrentGroupEnded(res); } -void CompositeTestOutput::verbose() +void CompositeTestOutput::verbose(VerbosityLevel level) { - if (outputOne_) outputOne_->verbose(); - if (outputTwo_) outputTwo_->verbose(); + if (outputOne_) outputOne_->verbose(level); + if (outputTwo_) outputTwo_->verbose(level); } void CompositeTestOutput::color() diff --git a/src/CppUTest/TestResult.cpp b/src/CppUTest/TestResult.cpp index 90c215d69..31253d98f 100644 --- a/src/CppUTest/TestResult.cpp +++ b/src/CppUTest/TestResult.cpp @@ -64,6 +64,11 @@ void TestResult::print(const char* text) output_.print(text); } +void TestResult::printVeryVerbose(const char* text) +{ + output_.printVeryVerbose(text); +} + void TestResult::currentTestEnded(UtestShell* /*test*/) { currentTestTotalExecutionTime_ = GetPlatformSpecificTimeInMillis() - currentTestTimeStarted_; diff --git a/src/CppUTest/TestTestingFixture.cpp b/src/CppUTest/TestTestingFixture.cpp index 6c1c9408a..cc2c4d0ac 100644 --- a/src/CppUTest/TestTestingFixture.cpp +++ b/src/CppUTest/TestTestingFixture.cpp @@ -108,7 +108,7 @@ void TestTestingFixture::setRunTestsInSeperateProcess() void TestTestingFixture::setOutputVerbose() { - output_->verbose(); + output_->verbose(TestOutput::level_verbose); } void TestTestingFixture::runTestWithMethod(void(*method)()) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 9325450d9..153d55b69 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -197,7 +197,9 @@ void UtestShell::destroyTest(Utest* test) void UtestShell::runOneTestInCurrentProcess(TestPlugin* plugin, TestResult& result) { + result.printVeryVerbose("\n-- before runAllPreTestAction: "); plugin->runAllPreTestAction(*this, result); + result.printVeryVerbose("\n-- after runAllPreTestAction: "); //save test context, so that test class can be tested UtestShell* savedTest = UtestShell::getCurrent(); @@ -206,15 +208,24 @@ void UtestShell::runOneTestInCurrentProcess(TestPlugin* plugin, TestResult& resu UtestShell::setTestResult(&result); UtestShell::setCurrentTest(this); + result.printVeryVerbose("\n---- before createTest: "); Utest* testToRun = createTest(); + result.printVeryVerbose("\n---- after createTest: "); + + result.printVeryVerbose("\n------ before runTest: "); testToRun->run(); + result.printVeryVerbose("\n------ after runTest: "); UtestShell::setCurrentTest(savedTest); UtestShell::setTestResult(savedResult); + result.printVeryVerbose("\n---- before destroyTest: "); destroyTest(testToRun); + result.printVeryVerbose("\n---- after destroyTest: "); + result.printVeryVerbose("\n-- before runAllPostTestAction: "); plugin->runAllPostTestAction(*this, result); + result.printVeryVerbose("\n-- after runAllPostTestAction: "); } UtestShell *UtestShell::getNext() const diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index a12a0f100..407dc75ce 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -79,6 +79,13 @@ TEST(CommandLineArguments, verboseSetMultipleParameters) CHECK(args->isVerbose()); } +TEST(CommandLineArguments, veryVerbose) +{ + const char* argv[] = { "tests.exe", "-vv" }; + CHECK(newArgumentParser(2, argv)); + CHECK(args->isVeryVerbose()); +} + TEST(CommandLineArguments, setColor) { const char* argv[] = { "tests.exe", "-c" }; @@ -457,7 +464,7 @@ TEST(CommandLineArguments, weirdParamatersReturnsFalse) TEST(CommandLineArguments, printUsage) { - STRCMP_EQUAL("use -h for more extensive help\nusage [-h] [-v] [-c] [-p] [-lg] [-ln] [-ri] [-r#]\n" + STRCMP_EQUAL("use -h for more extensive help\nusage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ri] [-r#]\n" " [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-t groupName.testName]...\n" " [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", args->usage()); diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index ec7f27246..9b4771bc7 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -211,6 +211,16 @@ TEST(CommandLineTestRunner, JunitOutputAndVerboseEnabled) STRCMP_CONTAINS("TEST(group1, test1)", commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().asCharString()); } +TEST(CommandLineTestRunner, veryVerboseSetOnOutput) +{ + const char* argv[] = { "tests.exe", "-vv"}; + + CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); + commandLineTestRunner.runAllTestsMain(); + STRCMP_CONTAINS("TEST(group1, test1)", commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().asCharString()); + STRCMP_CONTAINS("destroyTest", commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().asCharString()); +} + TEST(CommandLineTestRunner, defaultTestsAreRunInOrderTheyAreInRepository) { const char* argv[] = { "tests.exe", "-v"}; diff --git a/tests/CppUTest/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp index 29a2a0581..3b5f5830b 100644 --- a/tests/CppUTest/TestOutputTest.cpp +++ b/tests/CppUTest/TestOutputTest.cpp @@ -155,14 +155,14 @@ TEST(TestOutput, SetProgressIndicator) TEST(TestOutput, PrintTestVerboseStarted) { - mock->verbose(); + mock->verbose(TestOutput::level_verbose); printer->printCurrentTestStarted(*tst); STRCMP_EQUAL("TEST(group, test)", mock->getOutput().asCharString()); } TEST(TestOutput, PrintTestVerboseEnded) { - mock->verbose(); + mock->verbose(TestOutput::level_verbose); result->currentTestStarted(tst); millisTime = 5; result->currentTestEnded(tst); @@ -401,7 +401,7 @@ TEST(CompositeTestOutput, printDouble) TEST(CompositeTestOutput, verbose) { - compositeOutput.verbose(); + compositeOutput.verbose(TestOutput::level_verbose); CHECK(output1->isVerbose()); CHECK(output2->isVerbose()); } diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 7443b8d44..b200408e2 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -169,6 +169,18 @@ TEST(UtestShell, TestStopsAfterSetupFailure) LONGS_EQUAL(0, stopAfterFailure); } +TEST(UtestShell, veryVebose) +{ + UtestShell shell("Group", "name", __FILE__, __LINE__); + StringBufferTestOutput normalOutput; + normalOutput.verbose(TestOutput::level_veryVerbose); + NullTestPlugin plugin; + + TestResult result(normalOutput); + shell.runOneTestInCurrentProcess(&plugin, result); + STRCMP_CONTAINS("\n------ before runTest", normalOutput.getOutput().asCharString()); +} + class defaultUtestShell: public UtestShell { }; @@ -181,6 +193,7 @@ TEST(UtestShell, this_test_covers_the_UtestShell_createTest_and_Utest_testBody_m LONGS_EQUAL(2, fixture.getTestCount()); } + static void StubPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin*, TestResult* result) { result->addFailure(TestFailure(shell, "Failed in separate process")); @@ -487,3 +500,4 @@ TEST(UtestShellPointerArrayTest, reverse) CHECK(tests.get(2) == test0); } + From ba60e08d99b9a4fea221369f77acafeb0a0b3634 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 3 May 2020 15:44:56 +0800 Subject: [PATCH 0452/1093] Even more verbose --- include/CppUTest/Utest.h | 1 + src/CppUTest/Utest.cpp | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 55b4e6a11..96957ec1b 100644 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -128,6 +128,7 @@ class UtestShell virtual void print(const char *text, const char *fileName, int lineNumber); virtual void print(const SimpleString & text, const char *fileName, int lineNumber); + virtual void printVeryVerbose(const char* text); void setFileName(const char *fileName); void setLineNumber(int lineNumber); diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 153d55b69..aaeae4187 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -543,6 +543,11 @@ void UtestShell::print(const SimpleString& text, const char* fileName, int lineN print(text.asCharString(), fileName, lineNumber); } +void UtestShell::printVeryVerbose(const char* text) +{ + getTestResult()->printVeryVerbose(text); +} + TestResult* UtestShell::testResult_ = NULLPTR; UtestShell* UtestShell::currentTest_ = NULLPTR; @@ -589,9 +594,17 @@ Utest::~Utest() void Utest::run() { + UtestShell* current = UtestShell::getCurrent(); + int jumpResult = 0; try { - if (PlatformSpecificSetJmp(helperDoTestSetup, this)) { + current->printVeryVerbose("\n-------- before setup: "); + jumpResult = PlatformSpecificSetJmp(helperDoTestSetup, this); + current->printVeryVerbose("\n-------- after setup: "); + + if (jumpResult) { + current->printVeryVerbose("\n---------- before body: "); PlatformSpecificSetJmp(helperDoTestBody, this); + current->printVeryVerbose("\n---------- after body: "); } } catch (CppUTestFailedException&) @@ -600,7 +613,9 @@ void Utest::run() } try { + current->printVeryVerbose("\n-------- before teardown: "); PlatformSpecificSetJmp(helperDoTestTeardown, this); + current->printVeryVerbose("\n-------- after teardown: "); } catch (CppUTestFailedException&) { From 26b03973a3789e39deb56985ce4683373dfd8787 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 3 May 2020 16:09:20 +0800 Subject: [PATCH 0453/1093] Memory leak in plugin tests. Removed. --- include/CppUTestExt/MockSupportPlugin.h | 2 ++ src/CppUTestExt/MockSupportPlugin.cpp | 5 +++++ tests/CppUTestExt/MockPluginTest.cpp | 7 +++++++ 3 files changed, 14 insertions(+) diff --git a/include/CppUTestExt/MockSupportPlugin.h b/include/CppUTestExt/MockSupportPlugin.h index 38c1e9274..cc0be2099 100644 --- a/include/CppUTestExt/MockSupportPlugin.h +++ b/include/CppUTestExt/MockSupportPlugin.h @@ -42,6 +42,8 @@ class MockSupportPlugin : public TestPlugin virtual void installComparator(const SimpleString& name, MockNamedValueComparator& comparator); virtual void installCopier(const SimpleString& name, MockNamedValueCopier& copier); + + void clear(); private: MockNamedValueComparatorsAndCopiersRepository repository_; }; diff --git a/src/CppUTestExt/MockSupportPlugin.cpp b/src/CppUTestExt/MockSupportPlugin.cpp index 257b9a0ae..8f299fa5f 100644 --- a/src/CppUTestExt/MockSupportPlugin.cpp +++ b/src/CppUTestExt/MockSupportPlugin.cpp @@ -56,6 +56,11 @@ MockSupportPlugin::MockSupportPlugin(const SimpleString& name) } MockSupportPlugin::~MockSupportPlugin() +{ + clear(); +} + +void MockSupportPlugin::clear() { repository_.clear(); } diff --git a/tests/CppUTestExt/MockPluginTest.cpp b/tests/CppUTestExt/MockPluginTest.cpp index a1aa4971b..a9f947367 100644 --- a/tests/CppUTestExt/MockPluginTest.cpp +++ b/tests/CppUTestExt/MockPluginTest.cpp @@ -51,6 +51,7 @@ TEST_GROUP(MockPlugin) delete test; delete result; mock().clear(); + mock().removeAllComparatorsAndCopiers(); } }; @@ -112,6 +113,8 @@ TEST(MockPlugin, installComparatorRecordsTheComparatorButNotInstallsItYet) MockNoWayToCompareCustomTypeFailure failure(test, "myType"); CHECK_EXPECTED_MOCK_FAILURE(failure); + + plugin.clear(); } class DummyCopier : public MockNamedValueCopier @@ -134,6 +137,8 @@ TEST(MockPlugin, installCopierRecordsTheCopierButNotInstallsItYet) MockNoWayToCopyCustomTypeFailure failure(test, "myType"); CHECK_EXPECTED_MOCK_FAILURE(failure); + + plugin.clear(); } TEST(MockPlugin, preTestActionWillEnableMultipleComparatorsToTheGlobalMockSupportSpace) @@ -151,6 +156,8 @@ TEST(MockPlugin, preTestActionWillEnableMultipleComparatorsToTheGlobalMockSuppor mock().checkExpectations(); LONGS_EQUAL(0, result->getFailureCount()); + + plugin.clear(); } static void _failTwiceFunction() From b019c67ce4634c2da44faca4af7f0a21da695f8f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 3 May 2020 16:13:00 +0800 Subject: [PATCH 0454/1093] Removed 2 more leaking mock tests --- tests/CppUTestExt/MockParameterTest.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 4052ffa53..7373fe0bc 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -33,7 +33,8 @@ TEST_GROUP(MockParameterTest) { void teardown() { - mock().checkExpectations(); + mock().checkExpectations(); + mock().clear(); } }; From 99ff11154f8fb493a44f5e8fde2b63fb8797850a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 3 May 2020 16:17:59 +0800 Subject: [PATCH 0455/1093] and more --- tests/CppUTestExt/MockHierarchyTest.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/CppUTestExt/MockHierarchyTest.cpp b/tests/CppUTestExt/MockHierarchyTest.cpp index 800ec74dc..962ae7981 100644 --- a/tests/CppUTestExt/MockHierarchyTest.cpp +++ b/tests/CppUTestExt/MockHierarchyTest.cpp @@ -30,6 +30,10 @@ TEST_GROUP(MockHierarchyTest) { + void teardown() + { + mock().clear(); + } }; TEST(MockHierarchyTest, getMockSupportScope) From d43b759af618fd1415569d8282dcf1a1bf17c371 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 3 May 2020 17:10:41 +0800 Subject: [PATCH 0456/1093] More memory leaks in the Extensions. This should be the last... hopefully --- include/CppUTest/TestMemoryAllocator.h | 3 +++ include/CppUTestExt/MockNamedValue.h | 1 + src/CppUTest/TestMemoryAllocator.cpp | 10 ++++++++++ src/CppUTestExt/MockNamedValue.cpp | 5 +++++ tests/CppUTest/TestMemoryAllocatorTest.cpp | 7 +++++++ tests/CppUTestExt/MockCallTest.cpp | 9 +++++---- tests/CppUTestExt/MockCheatSheetTest.cpp | 2 ++ tests/CppUTestExt/MockComparatorCopierTest.cpp | 10 ++++++---- tests/CppUTestExt/MockExpectedCallTest.cpp | 3 +++ 9 files changed, 42 insertions(+), 8 deletions(-) diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index b0f07dd00..347e4591d 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -183,6 +183,9 @@ class AccountingTestMemoryAllocator : public TestMemoryAllocator virtual TestMemoryAllocator* actualAllocator() _override; TestMemoryAllocator* originalAllocator(); + + virtual const char* alloc_name() const _override; + virtual const char* free_name() const _override; private: void addMemoryToMemoryTrackingToKeepTrackOfSize(char* memory, size_t size); diff --git a/include/CppUTestExt/MockNamedValue.h b/include/CppUTestExt/MockNamedValue.h index d79995aa6..426b70c9d 100644 --- a/include/CppUTestExt/MockNamedValue.h +++ b/include/CppUTestExt/MockNamedValue.h @@ -155,6 +155,7 @@ class MockNamedValue virtual MockNamedValueCopier* getCopier() const; static void setDefaultComparatorsAndCopiersRepository(MockNamedValueComparatorsAndCopiersRepository* repository); + static MockNamedValueComparatorsAndCopiersRepository* getDefaultComparatorsAndCopiersRepository(); static const double defaultDoubleTolerance; private: diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index bd39a53f9..f396f6d2b 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -581,6 +581,16 @@ TestMemoryAllocator* AccountingTestMemoryAllocator::originalAllocator() return originalAllocator_; } +const char* AccountingTestMemoryAllocator::alloc_name() const +{ + return originalAllocator_->alloc_name(); +} + +const char* AccountingTestMemoryAllocator::free_name() const +{ + return originalAllocator_->free_name(); +} + GlobalMemoryAccountant::GlobalMemoryAccountant() : mallocAllocator_(NULLPTR), newAllocator_(NULLPTR), newArrayAllocator_(NULLPTR) { diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 9f4e64a29..50fe209d1 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -38,6 +38,11 @@ void MockNamedValue::setDefaultComparatorsAndCopiersRepository(MockNamedValueCom defaultRepository_ = repository; } +MockNamedValueComparatorsAndCopiersRepository* MockNamedValue::getDefaultComparatorsAndCopiersRepository() +{ + return defaultRepository_; +} + MockNamedValue::MockNamedValue(const SimpleString& name) : name_(name), type_("int"), size_(0), comparator_(NULLPTR), copier_(NULLPTR) { value_.intValue_ = 0; diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 13a0c817c..5afce421a 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -439,6 +439,13 @@ TEST(AccountingTestMemoryAllocator, useOriginalAllocatorWhenDeallocatingMemoryNo LONGS_EQUAL(1, accountant.totalDeallocations()); } +TEST(AccountingTestMemoryAllocator, allocatorForwardsAllocAndFreeName) +{ + STRCMP_EQUAL("malloc", allocator->alloc_name()); + STRCMP_EQUAL("free", allocator->free_name()); +} + + class GlobalMemoryAccountantExecFunction : public ExecFunction { diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index a260e6909..4bfc372f1 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -31,10 +31,11 @@ TEST_GROUP(MockCallTest) { - void teardown() - { - mock().checkExpectations(); - } + void teardown() + { + mock().checkExpectations(); + mock().clear(); + } }; TEST(MockCallTest, clear) diff --git a/tests/CppUTestExt/MockCheatSheetTest.cpp b/tests/CppUTestExt/MockCheatSheetTest.cpp index 43dfdd1bb..f5a97df85 100644 --- a/tests/CppUTestExt/MockCheatSheetTest.cpp +++ b/tests/CppUTestExt/MockCheatSheetTest.cpp @@ -43,6 +43,8 @@ TEST_GROUP(MockCheatSheet) { /* Check expectations. Alternatively use MockSupportPlugin */ mock().checkExpectations(); + + mock().clear(); } }; diff --git a/tests/CppUTestExt/MockComparatorCopierTest.cpp b/tests/CppUTestExt/MockComparatorCopierTest.cpp index d17746084..5c3ba60d6 100644 --- a/tests/CppUTestExt/MockComparatorCopierTest.cpp +++ b/tests/CppUTestExt/MockComparatorCopierTest.cpp @@ -30,10 +30,12 @@ TEST_GROUP(MockComparatorCopierTest) { - void teardown() - { - mock().checkExpectations(); - } + void teardown() + { + mock().checkExpectations(); + mock().clear(); + mock().removeAllComparatorsAndCopiers(); + } }; class MyTypeForTesting diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index b557f5346..7b6a52de2 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -153,13 +153,16 @@ TEST(MockNamedValueHandlerRepository, installMultipleHandlers) TEST_GROUP(MockExpectedCall) { MockCheckedExpectedCall* call; + MockNamedValueComparatorsAndCopiersRepository* originalComparatorRepository; void setup() { + originalComparatorRepository = MockNamedValue::getDefaultComparatorsAndCopiersRepository(); call = new MockCheckedExpectedCall(1); call->withName("funcName"); } void teardown() { + MockNamedValue::setDefaultComparatorsAndCopiersRepository(originalComparatorRepository); delete call; CHECK_NO_MOCK_FAILURE(); } From 7e4b657db27a9a03a72b118ddd7e9d391c9122c4 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 3 May 2020 17:40:34 +0800 Subject: [PATCH 0457/1093] Fixed the Gtest compilation --- configure.ac | 2 +- tests/CppUTestExt/AllTests.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 2254b4b5c..8d3988566 100644 --- a/configure.ac +++ b/configure.ac @@ -491,7 +491,7 @@ if test -n "${GMOCK_HOME}"; then fi CPPUTEST_CPPFLAGS="${CPPUTEST_CPPFLAGS} -I${GMOCK_HOME}/include -I${GTEST_HOME}/include -I${GTEST_HOME}" - CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} -DGTEST_USE_OWN_TR1_TUPLE=1" + CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} -DGTEST_USE_OWN_TR1_TUPLE=1 -DGMOCK_RENAME_MAIN=1" if test -e ${GMOCK_HOME}/lib/libgmock.la && test -e ${GTEST_HOME}/lib/libgtest.la; then \ CPPUTEST_LDADD="${CPPUTEST_LDADD} ${GMOCK_HOME}/lib/libgmock.la ${GTEST_HOME}/lib/libgtest.la"; \ elif test -e ${GMOCK_HOME}/libgmock.a && test -e ${GTEST_HOME}/libgtest.a; then \ diff --git a/tests/CppUTestExt/AllTests.cpp b/tests/CppUTestExt/AllTests.cpp index 8f13e8551..cc7336b62 100644 --- a/tests/CppUTestExt/AllTests.cpp +++ b/tests/CppUTestExt/AllTests.cpp @@ -54,7 +54,7 @@ int main(int ac, const char *const *av) testing::GMOCK_FLAG(verbose) = testing::internal::kWarningVerbosity; ConsoleTestOutput output; - CommandLineTestRunner runner(ac, av, &output, TestRegistry::getCurrentRegistry()); + CommandLineTestRunner runner(ac, av, TestRegistry::getCurrentRegistry()); return runner.runAllTestsMain(); #endif } From 48db69edda8ca545c546f43006eb1e9ea7b3c748 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 3 May 2020 17:41:56 +0800 Subject: [PATCH 0458/1093] Removed execution flag --- include/CppUTestExt/MockSupport.h | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 include/CppUTestExt/MockSupport.h diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h old mode 100755 new mode 100644 From d64a5d3733616f7dccfbcf5dcf80282b3ec8093c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 3 May 2020 20:52:25 +0800 Subject: [PATCH 0459/1093] Changed a bunch of int to size_t. Hope for less warnings in future --- include/CppUTest/CommandLineArguments.h | 8 +- include/CppUTest/MemoryLeakDetector.h | 44 +++++----- .../CppUTest/MemoryLeakDetectorMallocMacros.h | 12 +-- .../CppUTest/MemoryLeakDetectorNewMacros.h | 8 +- include/CppUTest/MemoryLeakWarningPlugin.h | 14 ++-- include/CppUTest/SimpleString.h | 4 +- include/CppUTest/TestFailure.h | 49 ++++++------ include/CppUTest/TestHarness_c.h | 64 ++++++--------- include/CppUTest/TestMemoryAllocator.h | 18 ++--- include/CppUTest/TestOutput.h | 10 ++- include/CppUTest/TestRegistry.h | 2 +- include/CppUTest/TestResult.h | 44 +++++----- include/CppUTest/TestTestingFixture.h | 12 +-- include/CppUTest/Utest.h | 60 +++++++------- .../CppUTestExt/CodeMemoryReportFormatter.h | 8 +- include/CppUTestExt/MemoryReportAllocator.h | 4 +- include/CppUTestExt/MemoryReportFormatter.h | 8 +- include/CppUTestExt/OrderedTest.h | 2 +- src/CppUTest/CommandLineArguments.cpp | 8 +- src/CppUTest/CommandLineTestRunner.cpp | 10 +-- src/CppUTest/JUnitTestOutput.cpp | 31 ++++--- src/CppUTest/MemoryLeakDetector.cpp | 50 ++++++------ src/CppUTest/MemoryLeakWarningPlugin.cpp | 80 +++++++++---------- src/CppUTest/SimpleString.cpp | 4 +- src/CppUTest/TestFailure.cpp | 44 +++++----- src/CppUTest/TestHarness_c.cpp | 48 +++++------ src/CppUTest/TestMemoryAllocator.cpp | 28 +++---- src/CppUTest/TestOutput.cpp | 21 +++-- src/CppUTest/TestRegistry.cpp | 2 +- src/CppUTest/TestResult.cpp | 20 ++--- src/CppUTest/TestTestingFixture.cpp | 14 ++-- src/CppUTest/Utest.cpp | 60 +++++++------- src/CppUTestExt/CodeMemoryReportFormatter.cpp | 16 ++-- src/CppUTestExt/MemoryReportAllocator.cpp | 4 +- src/CppUTestExt/MemoryReportFormatter.cpp | 8 +- src/CppUTestExt/OrderedTest.cpp | 2 +- src/Platforms/Gcc/UtestPlatform.cpp | 2 +- tests/CppUTest/CommandLineTestRunnerTest.cpp | 2 +- tests/CppUTest/JUnitOutputTest.cpp | 4 +- tests/CppUTest/MemoryLeakDetectorTest.cpp | 8 +- tests/CppUTest/MemoryLeakWarningTest.cpp | 8 +- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 8 +- tests/CppUTest/SimpleStringTest.cpp | 6 +- tests/CppUTest/TestHarness_cTest.cpp | 2 +- tests/CppUTest/TestOutputTest.cpp | 26 +++++- .../CppUTestExt/MemoryReporterPluginTest.cpp | 4 +- .../MockFailureReporterForTest.cpp | 4 +- .../CppUTestExt/MockFailureReporterForTest.h | 4 +- 48 files changed, 455 insertions(+), 444 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index fba2d9790..afd134047 100644 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -48,10 +48,10 @@ class CommandLineArguments bool isListingTestGroupNames() const; bool isListingTestGroupAndCaseNames() const; bool isRunIgnored() const; - int getRepeatCount() const; + size_t getRepeatCount() const; bool isShuffling() const; bool isReversing() const; - unsigned int getShuffleSeed() const; + size_t getShuffleSeed() const; const TestFilter* getGroupFilters() const; const TestFilter* getNameFilters() const; bool isJUnitOutput() const; @@ -83,8 +83,8 @@ class CommandLineArguments bool reversing_; bool shuffling_; bool shufflingPreSeeded_; - int repeat_; - unsigned int shuffleSeed_; + size_t repeat_; + size_t shuffleSeed_; TestFilter* groupFilters_; TestFilter* nameFilters_; OutputType outputType_; diff --git a/include/CppUTest/MemoryLeakDetector.h b/include/CppUTest/MemoryLeakDetector.h index 05b0b611e..f2c046619 100644 --- a/include/CppUTest/MemoryLeakDetector.h +++ b/include/CppUTest/MemoryLeakDetector.h @@ -86,30 +86,30 @@ class MemoryLeakOutputStringBuffer void reportMemoryLeak(MemoryLeakDetectorNode* leak); - void reportDeallocateNonAllocatedMemoryFailure(const char* freeFile, int freeLine, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter); - void reportMemoryCorruptionFailure(MemoryLeakDetectorNode* node, const char* freeFile, int freeLineNumber, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter); - void reportAllocationDeallocationMismatchFailure(MemoryLeakDetectorNode* node, const char* freeFile, int freeLineNumber, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter); + void reportDeallocateNonAllocatedMemoryFailure(const char* freeFile, size_t freeLine, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter); + void reportMemoryCorruptionFailure(MemoryLeakDetectorNode* node, const char* freeFile, size_t freeLineNumber, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter); + void reportAllocationDeallocationMismatchFailure(MemoryLeakDetectorNode* node, const char* freeFile, size_t freeLineNumber, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter); char* toString(); private: - void addAllocationLocation(const char* allocationFile, int allocationLineNumber, size_t allocationSize, TestMemoryAllocator* allocator); - void addDeallocationLocation(const char* freeFile, int freeLineNumber, TestMemoryAllocator* allocator); + void addAllocationLocation(const char* allocationFile, size_t allocationLineNumber, size_t allocationSize, TestMemoryAllocator* allocator); + void addDeallocationLocation(const char* freeFile, size_t freeLineNumber, TestMemoryAllocator* allocator); void addMemoryLeakHeader(); - void addMemoryLeakFooter(int totalAmountOfLeaks); + void addMemoryLeakFooter(size_t totalAmountOfLeaks); void addWarningForUsingMalloc(); void addNoMemoryLeaksMessage(); void addErrorMessageForTooMuchLeaks(); private: - int total_leaks_; + size_t total_leaks_; bool giveWarningOnUsingMalloc_; void reportFailure(const char* message, const char* allocFile, - int allocLine, size_t allocSize, + size_t allocLine, size_t allocSize, TestMemoryAllocator* allocAllocator, const char* freeFile, - int freeLine, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter); + size_t freeLine, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter); SimpleStringBuffer outputBuffer_; }; @@ -121,13 +121,13 @@ struct MemoryLeakDetectorNode { } - void init(char* memory, unsigned number, size_t size, TestMemoryAllocator* allocator, MemLeakPeriod period, unsigned char allocation_stage, const char* file, int line); + void init(char* memory, unsigned number, size_t size, TestMemoryAllocator* allocator, MemLeakPeriod period, unsigned char allocation_stage, const char* file, size_t line); size_t size_; unsigned number_; char* memory_; const char* file_; - int line_; + size_t line_; TestMemoryAllocator* allocator_; MemLeakPeriod period_; unsigned char allocation_stage_; @@ -156,7 +156,7 @@ struct MemoryLeakDetectorList MemoryLeakDetectorNode* getLeakFrom(MemoryLeakDetectorNode* node, MemLeakPeriod period); MemoryLeakDetectorNode* getLeakForAllocationStageFrom(MemoryLeakDetectorNode* node, unsigned char allocation_stage); - int getTotalLeaks(MemLeakPeriod period); + size_t getTotalLeaks(MemLeakPeriod period); void clearAllAccounting(MemLeakPeriod period); bool isInPeriod(MemoryLeakDetectorNode* node, MemLeakPeriod period); @@ -174,7 +174,7 @@ struct MemoryLeakDetectorTable MemoryLeakDetectorNode* retrieveNode(char* memory); MemoryLeakDetectorNode* removeNode(char* memory); - int getTotalLeaks(MemLeakPeriod period); + size_t getTotalLeaks(MemLeakPeriod period); MemoryLeakDetectorNode* getFirstLeak(MemLeakPeriod period); MemoryLeakDetectorNode* getFirstLeakForAllocationStage(unsigned char allocation_stage); @@ -212,16 +212,16 @@ class MemoryLeakDetector const char* report(MemLeakPeriod period); void markCheckingPeriodLeaksAsNonCheckingPeriod(); - int totalMemoryLeaks(MemLeakPeriod period); + size_t totalMemoryLeaks(MemLeakPeriod period); void clearAllAccounting(MemLeakPeriod period); char* allocMemory(TestMemoryAllocator* allocator, size_t size, bool allocatNodesSeperately = false); char* allocMemory(TestMemoryAllocator* allocator, size_t size, - const char* file, int line, bool allocatNodesSeperately = false); + const char* file, size_t line, bool allocatNodesSeperately = false); void deallocMemory(TestMemoryAllocator* allocator, void* memory, bool allocatNodesSeperately = false); - void deallocMemory(TestMemoryAllocator* allocator, void* memory, const char* file, int line, bool allocatNodesSeperately = false); + void deallocMemory(TestMemoryAllocator* allocator, void* memory, const char* file, size_t line, bool allocatNodesSeperately = false); void deallocAllMemoryInCurrentAllocationStage(); - char* reallocMemory(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, int line, bool allocatNodesSeperately = false); + char* reallocMemory(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, size_t line, bool allocatNodesSeperately = false); void invalidateMemory(char* memory); void removeMemoryLeakInformationWithoutCheckingOrDeallocatingTheMemoryButDeallocatingTheAccountInformation(TestMemoryAllocator* allocator, void* memory, bool allocatNodesSeperately); @@ -247,24 +247,24 @@ class MemoryLeakDetector unsigned char current_allocation_stage_; SimpleMutex* mutex_; - char* allocateMemoryWithAccountingInformation(TestMemoryAllocator* allocator, size_t size, const char* file, int line, bool allocatNodesSeperately); - char* reallocateMemoryWithAccountingInformation(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, int line, bool allocatNodesSeperately); + char* allocateMemoryWithAccountingInformation(TestMemoryAllocator* allocator, size_t size, const char* file, size_t line, bool allocatNodesSeperately); + char* reallocateMemoryWithAccountingInformation(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, size_t line, bool allocatNodesSeperately); MemoryLeakDetectorNode* createMemoryLeakAccountingInformation(TestMemoryAllocator* allocator, size_t size, char* memory, bool allocatNodesSeperately); bool validMemoryCorruptionInformation(char* memory); bool matchingAllocation(TestMemoryAllocator *alloc_allocator, TestMemoryAllocator *free_allocator); - void storeLeakInformation(MemoryLeakDetectorNode * node, char *new_memory, size_t size, TestMemoryAllocator *allocator, const char *file, int line); + void storeLeakInformation(MemoryLeakDetectorNode * node, char *new_memory, size_t size, TestMemoryAllocator *allocator, const char *file, size_t line); void ConstructMemoryLeakReport(MemLeakPeriod period); size_t sizeOfMemoryWithCorruptionInfo(size_t size); MemoryLeakDetectorNode* getNodeFromMemoryPointer(char* memory, size_t size); - char* reallocateMemoryAndLeakInformation(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, int line, bool allocatNodesSeperately); + char* reallocateMemoryAndLeakInformation(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, size_t line, bool allocatNodesSeperately); void addMemoryCorruptionInformation(char* memory); - void checkForCorruption(MemoryLeakDetectorNode* node, const char* file, int line, TestMemoryAllocator* allocator, bool allocateNodesSeperately); + void checkForCorruption(MemoryLeakDetectorNode* node, const char* file, size_t line, TestMemoryAllocator* allocator, bool allocateNodesSeperately); }; #endif diff --git a/include/CppUTest/MemoryLeakDetectorMallocMacros.h b/include/CppUTest/MemoryLeakDetectorMallocMacros.h index 36b51e91e..42c324796 100644 --- a/include/CppUTest/MemoryLeakDetectorMallocMacros.h +++ b/include/CppUTest/MemoryLeakDetectorMallocMacros.h @@ -21,10 +21,10 @@ extern "C" { #endif -extern void* cpputest_malloc_location(size_t size, const char* file, int line); -extern void* cpputest_calloc_location(size_t count, size_t size, const char* file, int line); -extern void* cpputest_realloc_location(void *, size_t, const char* file, int line); -extern void cpputest_free_location(void* buffer, const char* file, int line); +extern void* cpputest_malloc_location(size_t size, const char* file, size_t line); +extern void* cpputest_calloc_location(size_t count, size_t size, const char* file, size_t line); +extern void* cpputest_realloc_location(void *, size_t, const char* file, size_t line); +extern void cpputest_free_location(void* buffer, const char* file, size_t line); #ifdef __cplusplus } @@ -52,8 +52,8 @@ extern "C" { #endif -extern char* cpputest_strdup_location(const char* str, const char* file, int line); -extern char* cpputest_strndup_location(const char* str, size_t n, const char* file, int line); +extern char* cpputest_strdup_location(const char* str, const char* file, size_t line); +extern char* cpputest_strndup_location(const char* str, size_t n, const char* file, size_t line); #ifdef __cplusplus } diff --git a/include/CppUTest/MemoryLeakDetectorNewMacros.h b/include/CppUTest/MemoryLeakDetectorNewMacros.h index eba7e6d64..fb7b87a03 100644 --- a/include/CppUTest/MemoryLeakDetectorNewMacros.h +++ b/include/CppUTest/MemoryLeakDetectorNewMacros.h @@ -51,13 +51,13 @@ #endif #endif - void* operator new(size_t size, const char* file, int line) UT_THROW (std::bad_alloc); - void* operator new[](size_t size, const char* file, int line) UT_THROW (std::bad_alloc); + void* operator new(size_t size, const char* file, size_t line) UT_THROW (std::bad_alloc); + void* operator new[](size_t size, const char* file, size_t line) UT_THROW (std::bad_alloc); void* operator new(size_t size) UT_THROW(std::bad_alloc); void* operator new[](size_t size) UT_THROW(std::bad_alloc); - void operator delete(void* mem, const char* file, int line) UT_NOTHROW; - void operator delete[](void* mem, const char* file, int line) UT_NOTHROW; + void operator delete(void* mem, const char* file, size_t line) UT_NOTHROW; + void operator delete[](void* mem, const char* file, size_t line) UT_NOTHROW; void operator delete(void* mem) UT_NOTHROW; void operator delete[](void* mem) UT_NOTHROW; #if __cplusplus >= 201402L diff --git a/include/CppUTest/MemoryLeakWarningPlugin.h b/include/CppUTest/MemoryLeakWarningPlugin.h index e511ed94d..b826de032 100644 --- a/include/CppUTest/MemoryLeakWarningPlugin.h +++ b/include/CppUTest/MemoryLeakWarningPlugin.h @@ -48,10 +48,10 @@ class MemoryLeakWarningPlugin: public TestPlugin virtual void preTestAction(UtestShell& test, TestResult& result) _override; virtual void postTestAction(UtestShell& test, TestResult& result) _override; - virtual const char* FinalReport(int toBeDeletedLeaks = 0); + virtual const char* FinalReport(size_t toBeDeletedLeaks = 0); void ignoreAllLeaksInTest(); - void expectLeaksInTest(int n); + void expectLeaksInTest(size_t n); void destroyGlobalDetectorAndTurnOffMemoryLeakDetectionInDestructor(bool des); @@ -76,14 +76,14 @@ class MemoryLeakWarningPlugin: public TestPlugin MemoryLeakDetector* memLeakDetector_; bool ignoreAllWarnings_; bool destroyGlobalDetectorAndTurnOfMemoryLeakDetectionInDestructor_; - int expectedLeaks_; - int failureCount_; + size_t expectedLeaks_; + size_t failureCount_; static MemoryLeakWarningPlugin* firstPlugin_; }; -extern void* cpputest_malloc_location_with_leak_detection(size_t size, const char* file, int line); -extern void* cpputest_realloc_location_with_leak_detection(void* memory, size_t size, const char* file, int line); -extern void cpputest_free_location_with_leak_detection(void* buffer, const char* file, int line); +extern void* cpputest_malloc_location_with_leak_detection(size_t size, const char* file, size_t line); +extern void* cpputest_realloc_location_with_leak_detection(void* memory, size_t size, const char* file, size_t line); +extern void cpputest_free_location_with_leak_detection(void* buffer, const char* file, size_t line); #endif diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 8648d3919..8572b40c7 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -101,8 +101,8 @@ class SimpleString static const char* StrStr(const char* s1, const char* s2); static char ToLower(char ch); static int MemCmp(const void* s1, const void *s2, size_t n); - static char* allocStringBuffer(size_t size, const char* file, int line); - static void deallocStringBuffer(char* str, const char* file, int line); + static char* allocStringBuffer(size_t size, const char* file, size_t line); + static void deallocStringBuffer(char* str, const char* file, size_t line); private: char *buffer_; diff --git a/include/CppUTest/TestFailure.h b/include/CppUTest/TestFailure.h index 77dcd1463..8b93fe332 100644 --- a/include/CppUTest/TestFailure.h +++ b/include/CppUTest/TestFailure.h @@ -45,20 +45,19 @@ class TestFailure { public: - TestFailure(UtestShell*, const char* fileName, int lineNumber, - const SimpleString& theMessage); + TestFailure(UtestShell*, const char* fileName, size_t lineNumber, const SimpleString& theMessage); TestFailure(UtestShell*, const SimpleString& theMessage); - TestFailure(UtestShell*, const char* fileName, int lineNumber); + TestFailure(UtestShell*, const char* fileName, size_t lineNumber); TestFailure(const TestFailure&); virtual ~TestFailure(); virtual SimpleString getFileName() const; virtual SimpleString getTestName() const; virtual SimpleString getTestNameOnly() const; - virtual int getFailureLineNumber() const; + virtual size_t getFailureLineNumber() const; virtual SimpleString getMessage() const; virtual SimpleString getTestFileName() const; - virtual int getTestLineNumber() const; + virtual size_t getTestLineNumber() const; bool isOutsideTestFile() const; bool isInHelperFunction() const; @@ -76,9 +75,9 @@ class TestFailure SimpleString testName_; SimpleString testNameOnly_; SimpleString fileName_; - int lineNumber_; + size_t lineNumber_; SimpleString testFileName_; - int testLineNumber_; + size_t testLineNumber_; SimpleString message_; TestFailure& operator=(const TestFailure&); @@ -88,104 +87,104 @@ class TestFailure class EqualsFailure: public TestFailure { public: - EqualsFailure(UtestShell*, const char* fileName, int lineNumber, const char* expected, const char* actual, const SimpleString& text); - EqualsFailure(UtestShell*, const char* fileName, int lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text); + EqualsFailure(UtestShell*, const char* fileName, size_t lineNumber, const char* expected, const char* actual, const SimpleString& text); + EqualsFailure(UtestShell*, const char* fileName, size_t lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text); }; class DoublesEqualFailure: public TestFailure { public: - DoublesEqualFailure(UtestShell*, const char* fileName, int lineNumber, double expected, double actual, double threshold, const SimpleString& text); + DoublesEqualFailure(UtestShell*, const char* fileName, size_t lineNumber, double expected, double actual, double threshold, const SimpleString& text); }; class CheckEqualFailure : public TestFailure { public: - CheckEqualFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text); + CheckEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text); }; class ComparisonFailure : public TestFailure { public: - ComparisonFailure(UtestShell* test, const char *fileName, int lineNumber, const SimpleString& checkString, const SimpleString& comparisonString, const SimpleString& text); + ComparisonFailure(UtestShell* test, const char *fileName, size_t lineNumber, const SimpleString& checkString, const SimpleString& comparisonString, const SimpleString& text); }; class ContainsFailure: public TestFailure { public: - ContainsFailure(UtestShell*, const char* fileName, int lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text); + ContainsFailure(UtestShell*, const char* fileName, size_t lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text); }; class CheckFailure : public TestFailure { public: - CheckFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& checkString, const SimpleString& conditionString, const SimpleString& textString = ""); + CheckFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& checkString, const SimpleString& conditionString, const SimpleString& textString = ""); }; class FailFailure : public TestFailure { public: - FailFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& message); + FailFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& message); }; class LongsEqualFailure : public TestFailure { public: - LongsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, long expected, long actual, const SimpleString& text); + LongsEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, long expected, long actual, const SimpleString& text); }; class UnsignedLongsEqualFailure : public TestFailure { public: - UnsignedLongsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, unsigned long expected, unsigned long actual, const SimpleString& text); + UnsignedLongsEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, unsigned long expected, unsigned long actual, const SimpleString& text); }; class LongLongsEqualFailure : public TestFailure { public: - LongLongsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, cpputest_longlong expected, cpputest_longlong actual, const SimpleString& text); + LongLongsEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, cpputest_longlong expected, cpputest_longlong actual, const SimpleString& text); }; class UnsignedLongLongsEqualFailure : public TestFailure { public: - UnsignedLongLongsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, cpputest_ulonglong expected, cpputest_ulonglong actual, const SimpleString& text); + UnsignedLongLongsEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, cpputest_ulonglong expected, cpputest_ulonglong actual, const SimpleString& text); }; class SignedBytesEqualFailure : public TestFailure { public: - SignedBytesEqualFailure (UtestShell* test, const char* fileName, int lineNumber, signed char expected, signed char actual, const SimpleString& text); + SignedBytesEqualFailure (UtestShell* test, const char* fileName, size_t lineNumber, signed char expected, signed char actual, const SimpleString& text); }; class StringEqualFailure : public TestFailure { public: - StringEqualFailure(UtestShell* test, const char* fileName, int lineNumber, const char* expected, const char* actual, const SimpleString& text); + StringEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, const char* expected, const char* actual, const SimpleString& text); }; class StringEqualNoCaseFailure : public TestFailure { public: - StringEqualNoCaseFailure(UtestShell* test, const char* fileName, int lineNumber, const char* expected, const char* actual, const SimpleString& text); + StringEqualNoCaseFailure(UtestShell* test, const char* fileName, size_t lineNumber, const char* expected, const char* actual, const SimpleString& text); }; class BinaryEqualFailure : public TestFailure { public: - BinaryEqualFailure(UtestShell* test, const char* fileName, int lineNumber, const unsigned char* expected, const unsigned char* actual, size_t size, const SimpleString& text); + BinaryEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, const unsigned char* expected, const unsigned char* actual, size_t size, const SimpleString& text); }; class BitsEqualFailure : public TestFailure { public: - BitsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, unsigned long expected, unsigned long actual, unsigned long mask, size_t byteCount, const SimpleString& text); + BitsEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, unsigned long expected, unsigned long actual, unsigned long mask, size_t byteCount, const SimpleString& text); }; class FeatureUnsupportedFailure : public TestFailure { public: - FeatureUnsupportedFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& featureName, const SimpleString& text); + FeatureUnsupportedFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& featureName, const SimpleString& text); }; #endif diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 3e4029d91..2f1ae775b 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -192,39 +192,23 @@ extern "C" /* CHECKS that can be used from C code */ -extern void CHECK_EQUAL_C_BOOL_LOCATION(int expected, int actual, - const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_INT_LOCATION(int expected, int actual, - const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_UINT_LOCATION(unsigned int expected, unsigned int actual, - const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_LONG_LOCATION(long expected, long actual, - const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_ULONG_LOCATION(unsigned long expected, unsigned long actual, - const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_LONGLONG_LOCATION(cpputest_longlong expected, cpputest_longlong actual, - const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_ULONGLONG_LOCATION(cpputest_ulonglong expected, cpputest_ulonglong actual, - const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_REAL_LOCATION(double expected, double actual, - double threshold, const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_CHAR_LOCATION(char expected, char actual, - const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_UBYTE_LOCATION(unsigned char expected, unsigned char actual, - const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_SBYTE_LOCATION(signed char expected, signed char actual, - const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_STRING_LOCATION(const char* expected, - const char* actual, const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, - const void* actual, const char* text, const char* fileName, int lineNumber); -extern void CHECK_EQUAL_C_BITS_LOCATION(unsigned int expected, unsigned int actual, - unsigned int mask, size_t size, const char* text, const char* fileName, int lineNumber); -extern void FAIL_TEXT_C_LOCATION(const char* text, const char* fileName, - int lineNumber); -extern void FAIL_C_LOCATION(const char* fileName, int lineNumber); -extern void CHECK_C_LOCATION(int condition, const char* conditionString, - const char* text, const char* fileName, int lineNumber); +extern void CHECK_EQUAL_C_BOOL_LOCATION(int expected, int actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_INT_LOCATION(int expected, int actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_UINT_LOCATION(unsigned int expected, unsigned int actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_LONG_LOCATION(long expected, long actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_ULONG_LOCATION(unsigned long expected, unsigned long actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_LONGLONG_LOCATION(cpputest_longlong expected, cpputest_longlong actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_ULONGLONG_LOCATION(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_REAL_LOCATION(double expected, double actual, double threshold, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_CHAR_LOCATION(char expected, char actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_UBYTE_LOCATION(unsigned char expected, unsigned char actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_SBYTE_LOCATION(signed char expected, signed char actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_STRING_LOCATION(const char* expected, const char* actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, const void* actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_BITS_LOCATION(unsigned int expected, unsigned int actual, unsigned int mask, size_t size, const char* text, const char* fileName, size_t lineNumber); +extern void FAIL_TEXT_C_LOCATION(const char* text, const char* fileName, size_t lineNumber); +extern void FAIL_C_LOCATION(const char* fileName, size_t lineNumber); +extern void CHECK_C_LOCATION(int condition, const char* conditionString, const char* text, const char* fileName, size_t lineNumber); extern void* cpputest_malloc(size_t size); extern char* cpputest_strdup(const char* str); @@ -233,14 +217,12 @@ extern void* cpputest_calloc(size_t num, size_t size); extern void* cpputest_realloc(void* ptr, size_t size); extern void cpputest_free(void* buffer); -extern void* cpputest_malloc_location(size_t size, const char* file, int line); -extern char* cpputest_strdup_location(const char* str, const char* file, int line); -extern char* cpputest_strndup_location(const char* str, size_t n, const char* file, int line); -extern void* cpputest_calloc_location(size_t num, size_t size, - const char* file, int line); -extern void* cpputest_realloc_location(void* memory, size_t size, - const char* file, int line); -extern void cpputest_free_location(void* buffer, const char* file, int line); +extern void* cpputest_malloc_location(size_t size, const char* file, size_t line); +extern char* cpputest_strdup_location(const char* str, const char* file, size_t line); +extern char* cpputest_strndup_location(const char* str, size_t n, const char* file, size_t line); +extern void* cpputest_calloc_location(size_t num, size_t size, const char* file, size_t line); +extern void* cpputest_realloc_location(void* memory, size_t size, const char* file, size_t line); +extern void cpputest_free_location(void* buffer, const char* file, size_t line); void cpputest_malloc_set_out_of_memory(void); void cpputest_malloc_set_not_out_of_memory(void); diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index 347e4591d..f11731e43 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -66,8 +66,8 @@ class TestMemoryAllocator virtual ~TestMemoryAllocator(); bool hasBeenDestroyed(); - virtual char* alloc_memory(size_t size, const char* file, int line); - virtual void free_memory(char* memory, const char* file, int line); + virtual char* alloc_memory(size_t size, const char* file, size_t line); + virtual void free_memory(char* memory, const char* file, size_t line); virtual const char* name() const; virtual const char* alloc_name() const; @@ -98,7 +98,7 @@ class CrashOnAllocationAllocator : public TestMemoryAllocator virtual void setNumberToCrashOn(unsigned allocationToCrashOn); - virtual char* alloc_memory(size_t size, const char* file, int line) _override; + virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; }; @@ -108,8 +108,8 @@ class NullUnknownAllocator: public TestMemoryAllocator NullUnknownAllocator(); virtual ~NullUnknownAllocator() _destructor_override; - virtual char* alloc_memory(size_t size, const char* file, int line) _override; - virtual void free_memory(char* memory, const char* file, int line) _override; + virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; + virtual void free_memory(char* memory, const char* file, size_t line) _override; static TestMemoryAllocator* defaultAllocator(); }; @@ -122,11 +122,11 @@ class FailableMemoryAllocator: public TestMemoryAllocator FailableMemoryAllocator(const char* name_str = "failable alloc", const char* alloc_name_str = "alloc", const char* free_name_str = "free"); virtual ~FailableMemoryAllocator() _destructor_override; - virtual char* alloc_memory(size_t size, const char* file, int line) _override; + virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; virtual char* allocMemoryLeakNode(size_t size) _override; virtual void failAllocNumber(int number); - virtual void failNthAllocAt(int allocationNumber, const char* file, int line); + virtual void failNthAllocAt(int allocationNumber, const char* file, size_t line); virtual void checkAllFailedAllocsWereDone(); virtual void clearFailedAllocs(); @@ -178,8 +178,8 @@ class AccountingTestMemoryAllocator : public TestMemoryAllocator AccountingTestMemoryAllocator(MemoryAccountant& accountant, TestMemoryAllocator* originalAllocator); virtual ~AccountingTestMemoryAllocator() _destructor_override; - virtual char* alloc_memory(size_t size, const char* file, int line) _override; - virtual void free_memory(char* memory, const char* file, int line) _override; + virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; + virtual void free_memory(char* memory, const char* file, size_t line) _override; virtual TestMemoryAllocator* actualAllocator() _override; TestMemoryAllocator* originalAllocator(); diff --git a/include/CppUTest/TestOutput.h b/include/CppUTest/TestOutput.h index 8dcb8cb7f..dff6e0af9 100644 --- a/include/CppUTest/TestOutput.h +++ b/include/CppUTest/TestOutput.h @@ -64,9 +64,10 @@ class TestOutput virtual void printBuffer(const char*)=0; virtual void print(const char*); virtual void print(long); + virtual void print(size_t); virtual void printDouble(double); virtual void printFailure(const TestFailure& failure); - virtual void printTestRun(int number, int total); + virtual void printTestRun(size_t number, size_t total); virtual void setProgressIndicator(const char*); virtual void printVeryVerbose(const char*); @@ -78,15 +79,15 @@ class TestOutput protected: - virtual void printEclipseErrorInFileOnLine(SimpleString file, int lineNumber); - virtual void printVisualStudioErrorInFileOnLine(SimpleString file, int lineNumber); + virtual void printEclipseErrorInFileOnLine(SimpleString file, size_t lineNumber); + virtual void printVisualStudioErrorInFileOnLine(SimpleString file, size_t lineNumber); virtual void printProgressIndicator(); void printFileAndLineForTestAndFailure(const TestFailure& failure); void printFileAndLineForFailure(const TestFailure& failure); void printFailureInTest(SimpleString testName); void printFailureMessage(SimpleString reason); - void printErrorInFileOnLineFormattedForWorkingEnvironment(SimpleString testFile, int lineNumber); + void printErrorInFileOnLineFormattedForWorkingEnvironment(SimpleString testFile, size_t lineNumber); TestOutput(const TestOutput&); TestOutput& operator=(const TestOutput&); @@ -192,6 +193,7 @@ class CompositeTestOutput : public TestOutput virtual void printBuffer(const char*) _override; virtual void print(const char*) _override; virtual void print(long) _override; + virtual void print(size_t) _override; virtual void printDouble(double) _override; virtual void printFailure(const TestFailure& failure) _override; virtual void setProgressIndicator(const char*) _override; diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index c088df513..36617a2c7 100644 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -51,7 +51,7 @@ class TestRegistry virtual void unDoLastAddTest(); virtual size_t countTests(); virtual void runAllTests(TestResult& result); - virtual void shuffleTests(unsigned seed); + virtual void shuffleTests(size_t seed); virtual void reverseTests(); virtual void listTestGroupNames(TestResult& result); virtual void listTestGroupAndCaseNames(TestResult& result); diff --git a/include/CppUTest/TestResult.h b/include/CppUTest/TestResult.h index 1be1af43e..62c4f77fe 100644 --- a/include/CppUTest/TestResult.h +++ b/include/CppUTest/TestResult.h @@ -61,27 +61,27 @@ class TestResult virtual void print(const char* text); virtual void printVeryVerbose(const char* text); - int getTestCount() const + size_t getTestCount() const { return testCount_; } - int getRunCount() const + size_t getRunCount() const { return runCount_; } - int getCheckCount() const + size_t getCheckCount() const { return checkCount_; } - int getFilteredOutCount() const + size_t getFilteredOutCount() const { return filteredOutCount_; } - int getIgnoredCount() const + size_t getIgnoredCount() const { return ignoredCount_; } - int getFailureCount() const + size_t getFailureCount() const { return failureCount_; } @@ -91,26 +91,26 @@ class TestResult return (getFailureCount() != 0) || (getRunCount() + getIgnoredCount() == 0); } - long getTotalExecutionTime() const; - void setTotalExecutionTime(long exTime); + size_t getTotalExecutionTime() const; + void setTotalExecutionTime(size_t exTime); - long getCurrentTestTotalExecutionTime() const; - long getCurrentGroupTotalExecutionTime() const; + size_t getCurrentTestTotalExecutionTime() const; + size_t getCurrentGroupTotalExecutionTime() const; private: TestOutput& output_; - int testCount_; - int runCount_; - int checkCount_; - int failureCount_; - int filteredOutCount_; - int ignoredCount_; - long totalExecutionTime_; - long timeStarted_; - long currentTestTimeStarted_; - long currentTestTotalExecutionTime_; - long currentGroupTimeStarted_; - long currentGroupTotalExecutionTime_; + size_t testCount_; + size_t runCount_; + size_t checkCount_; + size_t failureCount_; + size_t filteredOutCount_; + size_t ignoredCount_; + size_t totalExecutionTime_; + size_t timeStarted_; + size_t currentTestTimeStarted_; + size_t currentTestTotalExecutionTime_; + size_t currentGroupTimeStarted_; + size_t currentGroupTotalExecutionTime_; }; #endif diff --git a/include/CppUTest/TestTestingFixture.h b/include/CppUTest/TestTestingFixture.h index 0c7e2964d..f48ce2f08 100644 --- a/include/CppUTest/TestTestingFixture.h +++ b/include/CppUTest/TestTestingFixture.h @@ -53,18 +53,18 @@ class TestTestingFixture void runTestWithMethod(void(*method)()); void runAllTests(); - int getFailureCount(); - int getCheckCount(); - int getIgnoreCount(); - int getRunCount(); - int getTestCount(); + size_t getFailureCount(); + size_t getCheckCount(); + size_t getIgnoreCount(); + size_t getRunCount(); + size_t getTestCount(); const SimpleString& getOutput(); TestRegistry* getRegistry(); bool hasTestFailed(); void assertPrintContains(const SimpleString& contains); void assertPrintContainsNot(const SimpleString& contains); - void checkTestFailsWithProperTestLocation(const char* text, const char* file, int line); + void checkTestFailsWithProperTestLocation(const char* text, const char* file, size_t line); static void lineExecutedAfterCheck(); diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 96957ec1b..5d7a7f9a3 100644 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -88,7 +88,7 @@ class UtestShell static UtestShell *getCurrent(); public: - UtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber); + UtestShell(const char* groupName, const char* testName, const char* fileName, size_t lineNumber); virtual ~UtestShell(); virtual UtestShell* addTest(UtestShell* test); @@ -100,38 +100,38 @@ class UtestShell const SimpleString getGroup() const; virtual SimpleString getFormattedName() const; const SimpleString getFile() const; - int getLineNumber() const; + size_t getLineNumber() const; virtual bool willRun() const; virtual bool hasFailed() const; void countCheck(); - virtual void assertTrue(bool condition, const char *checkString, const char *conditionString, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertCstrEqual(const char *expected, const char *actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertCstrNEqual(const char *expected, const char *actual, size_t length, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertCstrNoCaseEqual(const char *expected, const char *actual, const char* text, const char *fileName, int lineNumber); - virtual void assertCstrContains(const char *expected, const char *actual, const char* text, const char *fileName, int lineNumber); - virtual void assertCstrNoCaseContains(const char *expected, const char *actual, const char* text, const char *fileName, int lineNumber); - virtual void assertLongsEqual(long expected, long actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertUnsignedLongsEqual(unsigned long expected, unsigned long actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertLongLongsEqual(cpputest_longlong expected, cpputest_longlong actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertUnsignedLongLongsEqual(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertSignedBytesEqual(signed char expected, signed char actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertPointersEqual(const void *expected, const void *actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertFunctionPointersEqual(void (*expected)(), void (*actual)(), const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertDoublesEqual(double expected, double actual, double threshold, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertEquals(bool failed, const char* expected, const char* actual, const char* text, const char* file, int line, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertBinaryEqual(const void *expected, const void *actual, size_t length, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertBitsEqual(unsigned long expected, unsigned long actual, unsigned long mask, size_t byteCount, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void assertCompare(bool comparison, const char *checkString, const char *comparisonString, const char *text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void fail(const char *text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertTrue(bool condition, const char *checkString, const char *conditionString, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertCstrEqual(const char *expected, const char *actual, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertCstrNEqual(const char *expected, const char *actual, size_t length, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertCstrNoCaseEqual(const char *expected, const char *actual, const char* text, const char *fileName, size_t lineNumber); + virtual void assertCstrContains(const char *expected, const char *actual, const char* text, const char *fileName, size_t lineNumber); + virtual void assertCstrNoCaseContains(const char *expected, const char *actual, const char* text, const char *fileName, size_t lineNumber); + virtual void assertLongsEqual(long expected, long actual, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertUnsignedLongsEqual(unsigned long expected, unsigned long actual, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertLongLongsEqual(cpputest_longlong expected, cpputest_longlong actual, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertUnsignedLongLongsEqual(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertSignedBytesEqual(signed char expected, signed char actual, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertPointersEqual(const void *expected, const void *actual, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertFunctionPointersEqual(void (*expected)(), void (*actual)(), const char* text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertDoublesEqual(double expected, double actual, double threshold, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertEquals(bool failed, const char* expected, const char* actual, const char* text, const char* file, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertBinaryEqual(const void *expected, const void *actual, size_t length, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertBitsEqual(unsigned long expected, unsigned long actual, unsigned long mask, size_t byteCount, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void assertCompare(bool comparison, const char *checkString, const char *comparisonString, const char *text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); + virtual void fail(const char *text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator = NormalTestTerminator()); virtual void exitTest(const TestTerminator& testTerminator = NormalTestTerminator()); - virtual void print(const char *text, const char *fileName, int lineNumber); - virtual void print(const SimpleString & text, const char *fileName, int lineNumber); + virtual void print(const char *text, const char *fileName, size_t lineNumber); + virtual void print(const SimpleString & text, const char *fileName, size_t lineNumber); virtual void printVeryVerbose(const char* text); void setFileName(const char *fileName); - void setLineNumber(int lineNumber); + void setLineNumber(size_t lineNumber); void setGroupName(const char *groupName); void setTestName(const char *testName); @@ -155,7 +155,7 @@ class UtestShell protected: UtestShell(); - UtestShell(const char *groupName, const char *testName, const char *fileName, int lineNumber, UtestShell *nextTest); + UtestShell(const char *groupName, const char *testName, const char *fileName, size_t lineNumber, UtestShell *nextTest); virtual SimpleString getMacroName() const; TestResult *getTestResult(); @@ -163,7 +163,7 @@ class UtestShell const char *group_; const char *name_; const char *file_; - int lineNumber_; + size_t lineNumber_; UtestShell *next_; bool isRunAsSeperateProcess_; bool hasFailed_; @@ -250,7 +250,7 @@ class IgnoredUtestShell : public UtestShell IgnoredUtestShell(); virtual ~IgnoredUtestShell() _destructor_override; explicit IgnoredUtestShell(const char* groupName, const char* testName, - const char* fileName, int lineNumber); + const char* fileName, size_t lineNumber); virtual bool willRun() const _override; virtual void setRunIgnored() _override; protected: @@ -273,11 +273,11 @@ class UtestShellPointerArray UtestShellPointerArray(UtestShell* firstTest); ~UtestShellPointerArray(); - void shuffle(unsigned seed); + void shuffle(size_t seed); void reverse(); void relinkTestsInOrder(); UtestShell* getFirstTest() const; - UtestShell* get(unsigned index) const; + UtestShell* get(size_t index) const; private: @@ -294,7 +294,7 @@ class TestInstaller { public: explicit TestInstaller(UtestShell& shell, const char* groupName, const char* testName, - const char* fileName, int lineNumber); + const char* fileName, size_t lineNumber); virtual ~TestInstaller(); void unDo(); diff --git a/include/CppUTestExt/CodeMemoryReportFormatter.h b/include/CppUTestExt/CodeMemoryReportFormatter.h index dcb4b8e75..466784123 100644 --- a/include/CppUTestExt/CodeMemoryReportFormatter.h +++ b/include/CppUTestExt/CodeMemoryReportFormatter.h @@ -47,8 +47,8 @@ class CodeMemoryReportFormatter : public MemoryReportFormatter virtual void report_test_start(TestResult* result, UtestShell& test) _override; virtual void report_test_end(TestResult* result, UtestShell& test) _override; - virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, int line) _override; - virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, int line) _override; + virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, size_t line) _override; + virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, size_t line) _override; private: @@ -58,10 +58,10 @@ class CodeMemoryReportFormatter : public MemoryReportFormatter void clearReporting(); bool isNewAllocator(TestMemoryAllocator* allocator); - SimpleString createVariableNameFromFileLineInfo(const char *file, int line); + SimpleString createVariableNameFromFileLineInfo(const char *file, size_t line); SimpleString getAllocationString(TestMemoryAllocator* allocator, const SimpleString& variableName, size_t size); - SimpleString getDeallocationString(TestMemoryAllocator* allocator, const SimpleString& variableName, const char* file, int line); + SimpleString getDeallocationString(TestMemoryAllocator* allocator, const SimpleString& variableName, const char* file, size_t line); }; #endif diff --git a/include/CppUTestExt/MemoryReportAllocator.h b/include/CppUTestExt/MemoryReportAllocator.h index b0861e81f..e42e848df 100644 --- a/include/CppUTestExt/MemoryReportAllocator.h +++ b/include/CppUTestExt/MemoryReportAllocator.h @@ -48,8 +48,8 @@ class MemoryReportAllocator : public TestMemoryAllocator virtual TestMemoryAllocator* getRealAllocator(); - virtual char* alloc_memory(size_t size, const char* file, int line) _override; - virtual void free_memory(char* memory, const char* file, int line) _override; + virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; + virtual void free_memory(char* memory, const char* file, size_t line) _override; virtual const char* name() const _override; virtual const char* alloc_name() const _override; diff --git a/include/CppUTestExt/MemoryReportFormatter.h b/include/CppUTestExt/MemoryReportFormatter.h index 2857bd9ef..d0034b686 100644 --- a/include/CppUTestExt/MemoryReportFormatter.h +++ b/include/CppUTestExt/MemoryReportFormatter.h @@ -42,8 +42,8 @@ class MemoryReportFormatter virtual void report_test_start(TestResult* result, UtestShell& test)=0; virtual void report_test_end(TestResult* result, UtestShell& test)=0; - virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, int line)=0; - virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, int line)=0; + virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, size_t line)=0; + virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, size_t line)=0; }; class NormalMemoryReportFormatter : public MemoryReportFormatter @@ -58,8 +58,8 @@ class NormalMemoryReportFormatter : public MemoryReportFormatter virtual void report_test_start(TestResult* result, UtestShell& test) _override; virtual void report_test_end(TestResult* result, UtestShell& test) _override; - virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, int line) _override; - virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, int line) _override; + virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, size_t line) _override; + virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, size_t line) _override; }; #endif diff --git a/include/CppUTestExt/OrderedTest.h b/include/CppUTestExt/OrderedTest.h index 002dd472d..a3687fa99 100644 --- a/include/CppUTestExt/OrderedTest.h +++ b/include/CppUTestExt/OrderedTest.h @@ -56,7 +56,7 @@ class OrderedTestShell : public UtestShell class OrderedTestInstaller { public: - explicit OrderedTestInstaller(OrderedTestShell& test, const char* groupName, const char* testName, const char* fileName, int lineNumber, int level); + explicit OrderedTestInstaller(OrderedTestShell& test, const char* groupName, const char* testName, const char* fileName, size_t lineNumber, int level); virtual ~OrderedTestInstaller(); private: diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index dd125e153..627ec757a 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -178,7 +178,7 @@ bool CommandLineArguments::runTestsInSeperateProcess() const } -int CommandLineArguments::getRepeatCount() const +size_t CommandLineArguments::getRepeatCount() const { return repeat_; } @@ -193,7 +193,7 @@ bool CommandLineArguments::isShuffling() const return shuffling_; } -unsigned int CommandLineArguments::getShuffleSeed() const +size_t CommandLineArguments::getShuffleSeed() const { return shuffleSeed_; } @@ -213,9 +213,9 @@ void CommandLineArguments::setRepeatCount(int ac, const char *const *av, int& i) repeat_ = 0; SimpleString repeatParameter(av[i]); - if (repeatParameter.size() > 2) repeat_ = SimpleString::AtoI(av[i] + 2); + if (repeatParameter.size() > 2) repeat_ = (size_t) (SimpleString::AtoI(av[i] + 2)); else if (i + 1 < ac) { - repeat_ = SimpleString::AtoI(av[i + 1]); + repeat_ = (size_t) (SimpleString::AtoI(av[i + 1])); if (repeat_ != 0) i++; } diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 7aff75747..39290c720 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -100,10 +100,10 @@ void CommandLineTestRunner::initializeTestRun() int CommandLineTestRunner::runAllTests() { initializeTestRun(); - int loopCount = 0; - int failedTestCount = 0; - int failedExecutionCount = 0; - int repeatCount = arguments_->getRepeatCount(); + size_t loopCount = 0; + size_t failedTestCount = 0; + size_t failedExecutionCount = 0; + size_t repeatCount = arguments_->getRepeatCount(); if (arguments_->isListingTestGroupNames()) { @@ -141,7 +141,7 @@ int CommandLineTestRunner::runAllTests() failedExecutionCount++; } } - return failedTestCount != 0 ? failedTestCount : failedExecutionCount; + return (int) (failedTestCount != 0 ? failedTestCount : failedExecutionCount); } TestOutput* CommandLineTestRunner::createTeamCityOutput() diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index ee764f153..1d39405a4 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -39,12 +39,12 @@ struct JUnitTestCaseResultNode } SimpleString name_; - long execTime_; + size_t execTime_; TestFailure* failure_; bool ignored_; SimpleString file_; - int lineNumber_; - int checkCount_; + size_t lineNumber_; + size_t checkCount_; JUnitTestCaseResultNode* next_; }; @@ -55,11 +55,11 @@ struct JUnitTestGroupResult { } - int testCount_; - int failureCount_; - int totalCheckCount_; - long startTime_; - long groupExecTime_; + size_t testCount_; + size_t failureCount_; + size_t totalCheckCount_; + size_t startTime_; + size_t groupExecTime_; SimpleString group_; JUnitTestCaseResultNode* head_; JUnitTestCaseResultNode* tail_; @@ -110,8 +110,7 @@ void JUnitTestOutput::printCurrentGroupStarted(const UtestShell& /*test*/) void JUnitTestOutput::printCurrentTestEnded(const TestResult& result) { - impl_->results_.tail_->execTime_ - = result.getCurrentTestTotalExecutionTime(); + impl_->results_.tail_->execTime_ = result.getCurrentTestTotalExecutionTime(); impl_->results_.tail_->checkCount_ = result.getCheckCount(); } @@ -130,7 +129,7 @@ void JUnitTestOutput::printCurrentTestStarted(const UtestShell& test) { impl_->results_.testCount_++; impl_->results_.group_ = test.getGroup(); - impl_->results_.startTime_ = GetPlatformSpecificTimeInMillis(); + impl_->results_.startTime_ = (size_t) GetPlatformSpecificTimeInMillis(); if (impl_->results_.tail_ == NULLPTR) { impl_->results_.head_ = impl_->results_.tail_ @@ -189,9 +188,9 @@ void JUnitTestOutput::writeTestSuiteSummary() buf = StringFromFormat( "\n", - impl_->results_.failureCount_, + (int)impl_->results_.failureCount_, impl_->results_.group_.asCharString(), - impl_->results_.testCount_, + (int) impl_->results_.testCount_, (int) (impl_->results_.groupExecTime_ / 1000), (int) (impl_->results_.groupExecTime_ % 1000), GetPlatformSpecificTimeString()); writeToFile(buf.asCharString()); @@ -225,10 +224,10 @@ void JUnitTestOutput::writeTestCases() impl_->package_.isEmpty() ? "" : ".", impl_->results_.group_.asCharString(), cur->name_.asCharString(), - cur->checkCount_ - impl_->results_.totalCheckCount_, + (int) (cur->checkCount_ - impl_->results_.totalCheckCount_), (int) (cur->execTime_ / 1000), (int)(cur->execTime_ % 1000), cur->file_.asCharString(), - cur->lineNumber_); + (int) cur->lineNumber_); writeToFile(buf.asCharString()); impl_->results_.totalCheckCount_ = cur->checkCount_; @@ -249,7 +248,7 @@ void JUnitTestOutput::writeFailure(JUnitTestCaseResultNode* node) SimpleString buf = StringFromFormat( "\n", node->failure_->getFileName().asCharString(), - node->failure_->getFailureLineNumber(), + (int) node->failure_->getFailureLineNumber(), encodeXmlText(node->failure_->getMessage()).asCharString()); writeToFile(buf.asCharString()); writeToFile("\n"); diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index 012aa16d6..f7e089eac 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -135,14 +135,14 @@ MemoryLeakOutputStringBuffer::MemoryLeakOutputStringBuffer() { } -void MemoryLeakOutputStringBuffer::addAllocationLocation(const char* allocationFile, int allocationLineNumber, size_t allocationSize, TestMemoryAllocator* allocator) +void MemoryLeakOutputStringBuffer::addAllocationLocation(const char* allocationFile, size_t allocationLineNumber, size_t allocationSize, TestMemoryAllocator* allocator) { - outputBuffer_.add(" allocated at file: %s line: %d size: %lu type: %s\n", allocationFile, allocationLineNumber, (unsigned long) allocationSize, allocator->alloc_name()); + outputBuffer_.add(" allocated at file: %s line: %d size: %lu type: %s\n", allocationFile, (int) allocationLineNumber, (unsigned long) allocationSize, allocator->alloc_name()); } -void MemoryLeakOutputStringBuffer::addDeallocationLocation(const char* freeFile, int freeLineNumber, TestMemoryAllocator* allocator) +void MemoryLeakOutputStringBuffer::addDeallocationLocation(const char* freeFile, size_t freeLineNumber, TestMemoryAllocator* allocator) { - outputBuffer_.add(" deallocated at file: %s line: %d type: %s\n", freeFile, freeLineNumber, allocator->free_name()); + outputBuffer_.add(" deallocated at file: %s line: %d type: %s\n", freeFile, (int) freeLineNumber, allocator->free_name()); } void MemoryLeakOutputStringBuffer::addNoMemoryLeaksMessage() @@ -169,7 +169,7 @@ void MemoryLeakOutputStringBuffer::reportMemoryLeak(MemoryLeakDetectorNode* leak total_leaks_++; outputBuffer_.add("Alloc num (%u) Leak size: %lu Allocated at: %s and line: %d. Type: \"%s\"\n\tMemory: <%p> Content:\n", - leak->number_, (unsigned long) leak->size_, leak->file_, leak->line_, leak->allocator_->alloc_name(), (void*) leak->memory_); + leak->number_, (unsigned long) leak->size_, leak->file_, (int) leak->line_, leak->allocator_->alloc_name(), (void*) leak->memory_); outputBuffer_.addMemoryDump(leak->memory_, leak->size_); if (SimpleString::StrCmp(leak->allocator_->alloc_name(), (const char*) "malloc") == 0) @@ -206,9 +206,9 @@ void MemoryLeakOutputStringBuffer::addErrorMessageForTooMuchLeaks() outputBuffer_.add(MEM_LEAK_TOO_MUCH); } -void MemoryLeakOutputStringBuffer::addMemoryLeakFooter(int amountOfLeaks) +void MemoryLeakOutputStringBuffer::addMemoryLeakFooter(size_t amountOfLeaks) { - outputBuffer_.add("%s %d\n", MEM_LEAK_FOOTER, amountOfLeaks); + outputBuffer_.add("%s %d\n", MEM_LEAK_FOOTER, (int) amountOfLeaks); } void MemoryLeakOutputStringBuffer::addWarningForUsingMalloc() @@ -216,22 +216,22 @@ void MemoryLeakOutputStringBuffer::addWarningForUsingMalloc() outputBuffer_.add(MEM_LEAK_ADDITION_MALLOC_WARNING); } -void MemoryLeakOutputStringBuffer::reportDeallocateNonAllocatedMemoryFailure(const char* freeFile, int freeLine, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter) +void MemoryLeakOutputStringBuffer::reportDeallocateNonAllocatedMemoryFailure(const char* freeFile, size_t freeLine, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter) { reportFailure("Deallocating non-allocated memory\n", "", 0, 0, NullUnknownAllocator::defaultAllocator(), freeFile, freeLine, freeAllocator, reporter); } -void MemoryLeakOutputStringBuffer::reportAllocationDeallocationMismatchFailure(MemoryLeakDetectorNode* node, const char* freeFile, int freeLineNumber, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter) +void MemoryLeakOutputStringBuffer::reportAllocationDeallocationMismatchFailure(MemoryLeakDetectorNode* node, const char* freeFile, size_t freeLineNumber, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter) { reportFailure("Allocation/deallocation type mismatch\n", node->file_, node->line_, node->size_, node->allocator_, freeFile, freeLineNumber, freeAllocator, reporter); } -void MemoryLeakOutputStringBuffer::reportMemoryCorruptionFailure(MemoryLeakDetectorNode* node, const char* freeFile, int freeLineNumber, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter) +void MemoryLeakOutputStringBuffer::reportMemoryCorruptionFailure(MemoryLeakDetectorNode* node, const char* freeFile, size_t freeLineNumber, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter) { reportFailure("Memory corruption (written out of bounds?)\n", node->file_, node->line_, node->size_, node->allocator_, freeFile, freeLineNumber, freeAllocator, reporter); } -void MemoryLeakOutputStringBuffer::reportFailure(const char* message, const char* allocFile, int allocLine, size_t allocSize, TestMemoryAllocator* allocAllocator, const char* freeFile, int freeLine, +void MemoryLeakOutputStringBuffer::reportFailure(const char* message, const char* allocFile, size_t allocLine, size_t allocSize, TestMemoryAllocator* allocAllocator, const char* freeFile, size_t freeLine, TestMemoryAllocator* freeAllocator, MemoryLeakFailure* reporter) { outputBuffer_.add("%s", message); @@ -253,7 +253,7 @@ void MemoryLeakOutputStringBuffer::clear() //////////////////////// -void MemoryLeakDetectorNode::init(char* memory, unsigned number, size_t size, TestMemoryAllocator* allocator, MemLeakPeriod period, unsigned char allocation_stage, const char* file, int line) +void MemoryLeakDetectorNode::init(char* memory, unsigned number, size_t size, TestMemoryAllocator* allocator, MemLeakPeriod period, unsigned char allocation_stage, const char* file, size_t line) { number_ = number; memory_ = memory; @@ -373,9 +373,9 @@ MemoryLeakDetectorNode* MemoryLeakDetectorList::getNextLeakForAllocationStage(Me -int MemoryLeakDetectorList::getTotalLeaks(MemLeakPeriod period) +size_t MemoryLeakDetectorList::getTotalLeaks(MemLeakPeriod period) { - int total_leaks = 0; + size_t total_leaks = 0; for (MemoryLeakDetectorNode* node = head_; node; node = node->next_) { if (isInPeriod(node, period)) total_leaks++; } @@ -410,9 +410,9 @@ MemoryLeakDetectorNode* MemoryLeakDetectorTable::retrieveNode(char* memory) return table_[hash(memory)].retrieveNode(memory); } -int MemoryLeakDetectorTable::getTotalLeaks(MemLeakPeriod period) +size_t MemoryLeakDetectorTable::getTotalLeaks(MemLeakPeriod period) { - int total_leaks = 0; + size_t total_leaks = 0; for (int i = 0; i < hash_prime; i++) total_leaks += table_[i].getTotalLeaks(period); return total_leaks; @@ -562,14 +562,14 @@ MemoryLeakDetectorNode* MemoryLeakDetector::getNodeFromMemoryPointer(char* memor return (MemoryLeakDetectorNode*) (void*) (memory + sizeOfMemoryWithCorruptionInfo(memory_size)); } -void MemoryLeakDetector::storeLeakInformation(MemoryLeakDetectorNode * node, char *new_memory, size_t size, TestMemoryAllocator *allocator, const char *file, int line) +void MemoryLeakDetector::storeLeakInformation(MemoryLeakDetectorNode * node, char *new_memory, size_t size, TestMemoryAllocator *allocator, const char *file, size_t line) { node->init(new_memory, allocationSequenceNumber_++, size, allocator, current_period_, current_allocation_stage_, file, line); addMemoryCorruptionInformation(node->memory_ + node->size_); memoryTable_.addNewNode(node); } -char* MemoryLeakDetector::reallocateMemoryAndLeakInformation(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, int line, bool allocatNodesSeperately) +char* MemoryLeakDetector::reallocateMemoryAndLeakInformation(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, size_t line, bool allocatNodesSeperately) { char* new_memory = reallocateMemoryWithAccountingInformation(allocator, memory, size, file, line, allocatNodesSeperately); if (new_memory == NULLPTR) return NULLPTR; @@ -609,7 +609,7 @@ bool MemoryLeakDetector::matchingAllocation(TestMemoryAllocator *alloc_allocator return free_allocator->isOfEqualType(alloc_allocator); } -void MemoryLeakDetector::checkForCorruption(MemoryLeakDetectorNode* node, const char* file, int line, TestMemoryAllocator* allocator, bool allocateNodesSeperately) +void MemoryLeakDetector::checkForCorruption(MemoryLeakDetectorNode* node, const char* file, size_t line, TestMemoryAllocator* allocator, bool allocateNodesSeperately) { if (!matchingAllocation(node->allocator_->actualAllocator(), allocator->actualAllocator())) outputBuffer_.reportAllocationDeallocationMismatchFailure(node, file, line, allocator->actualAllocator(), reporter_); @@ -624,13 +624,13 @@ char* MemoryLeakDetector::allocMemory(TestMemoryAllocator* allocator, size_t siz return allocMemory(allocator, size, UNKNOWN, 0, allocatNodesSeperately); } -char* MemoryLeakDetector::allocateMemoryWithAccountingInformation(TestMemoryAllocator* allocator, size_t size, const char* file, int line, bool allocatNodesSeperately) +char* MemoryLeakDetector::allocateMemoryWithAccountingInformation(TestMemoryAllocator* allocator, size_t size, const char* file, size_t line, bool allocatNodesSeperately) { if (allocatNodesSeperately) return allocator->alloc_memory(sizeOfMemoryWithCorruptionInfo(size), file, line); else return allocator->alloc_memory(sizeOfMemoryWithCorruptionInfo(size) + sizeof(MemoryLeakDetectorNode), file, line); } -char* MemoryLeakDetector::reallocateMemoryWithAccountingInformation(TestMemoryAllocator* /*allocator*/, char* memory, size_t size, const char* /*file*/, int /*line*/, bool allocatNodesSeperately) +char* MemoryLeakDetector::reallocateMemoryWithAccountingInformation(TestMemoryAllocator* /*allocator*/, char* memory, size_t size, const char* /*file*/, size_t /*line*/, bool allocatNodesSeperately) { if (allocatNodesSeperately) return (char*) PlatformSpecificRealloc(memory, sizeOfMemoryWithCorruptionInfo(size)); else return (char*) PlatformSpecificRealloc(memory, sizeOfMemoryWithCorruptionInfo(size) + sizeof(MemoryLeakDetectorNode)); @@ -642,7 +642,7 @@ MemoryLeakDetectorNode* MemoryLeakDetector::createMemoryLeakAccountingInformatio else return getNodeFromMemoryPointer(memory, size); } -char* MemoryLeakDetector::allocMemory(TestMemoryAllocator* allocator, size_t size, const char* file, int line, bool allocatNodesSeperately) +char* MemoryLeakDetector::allocMemory(TestMemoryAllocator* allocator, size_t size, const char* file, size_t line, bool allocatNodesSeperately) { #ifdef CPPUTEST_DISABLE_MEM_CORRUPTION_CHECK allocatNodesSeperately = true; @@ -668,7 +668,7 @@ void MemoryLeakDetector::removeMemoryLeakInformationWithoutCheckingOrDeallocatin if (allocatNodesSeperately) allocator->freeMemoryLeakNode( (char*) node); } -void MemoryLeakDetector::deallocMemory(TestMemoryAllocator* allocator, void* memory, const char* file, int line, bool allocatNodesSeperately) +void MemoryLeakDetector::deallocMemory(TestMemoryAllocator* allocator, void* memory, const char* file, size_t line, bool allocatNodesSeperately) { if (memory == NULLPTR) return; @@ -703,7 +703,7 @@ void MemoryLeakDetector::deallocAllMemoryInCurrentAllocationStage() } } -char* MemoryLeakDetector::reallocMemory(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, int line, bool allocatNodesSeperately) +char* MemoryLeakDetector::reallocMemory(TestMemoryAllocator* allocator, char* memory, size_t size, const char* file, size_t line, bool allocatNodesSeperately) { #ifdef CPPUTEST_DISABLE_MEM_CORRUPTION_CHECK allocatNodesSeperately = true; @@ -749,7 +749,7 @@ void MemoryLeakDetector::markCheckingPeriodLeaksAsNonCheckingPeriod() } } -int MemoryLeakDetector::totalMemoryLeaks(MemLeakPeriod period) +size_t MemoryLeakDetector::totalMemoryLeaks(MemLeakPeriod period) { return memoryTable_.getTotalLeaks(period); } diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index ea6e377a8..52b975000 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -44,83 +44,83 @@ class MemLeakScopedMutex ScopedMutexLock lock; }; -static void* threadsafe_mem_leak_malloc(size_t size, const char* file, int line) +static void* threadsafe_mem_leak_malloc(size_t size, const char* file, size_t line) { MemLeakScopedMutex lock; return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentMallocAllocator(), size, file, line, true); } -static void threadsafe_mem_leak_free(void* buffer, const char* file, int line) +static void threadsafe_mem_leak_free(void* buffer, const char* file, size_t line) { MemLeakScopedMutex lock; MemoryLeakWarningPlugin::getGlobalDetector()->invalidateMemory((char*) buffer); MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(getCurrentMallocAllocator(), (char*) buffer, file, line, true); } -static void* threadsafe_mem_leak_realloc(void* memory, size_t size, const char* file, int line) +static void* threadsafe_mem_leak_realloc(void* memory, size_t size, const char* file, size_t line) { MemLeakScopedMutex lock; return MemoryLeakWarningPlugin::getGlobalDetector()->reallocMemory(getCurrentMallocAllocator(), (char*) memory, size, file, line, true); } -static void* mem_leak_malloc(size_t size, const char* file, int line) +static void* mem_leak_malloc(size_t size, const char* file, size_t line) { return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentMallocAllocator(), size, file, line, true); } -static void mem_leak_free(void* buffer, const char* file, int line) +static void mem_leak_free(void* buffer, const char* file, size_t line) { MemoryLeakWarningPlugin::getGlobalDetector()->invalidateMemory((char*) buffer); MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(getCurrentMallocAllocator(), (char*) buffer, file, line, true); } -static void* mem_leak_realloc(void* memory, size_t size, const char* file, int line) +static void* mem_leak_realloc(void* memory, size_t size, const char* file, size_t line) { return MemoryLeakWarningPlugin::getGlobalDetector()->reallocMemory(getCurrentMallocAllocator(), (char*) memory, size, file, line, true); } #endif -static void* normal_malloc(size_t size, const char*, int) +static void* normal_malloc(size_t size, const char*, size_t) { return PlatformSpecificMalloc(size); } -static void* normal_realloc(void* memory, size_t size, const char*, int) +static void* normal_realloc(void* memory, size_t size, const char*, size_t) { return PlatformSpecificRealloc(memory, size); } -static void normal_free(void* buffer, const char*, int) +static void normal_free(void* buffer, const char*, size_t) { PlatformSpecificFree(buffer); } #if CPPUTEST_USE_MEM_LEAK_DETECTION -static void *(*malloc_fptr)(size_t size, const char* file, int line) = mem_leak_malloc; -static void (*free_fptr)(void* mem, const char* file, int line) = mem_leak_free; -static void*(*realloc_fptr)(void* memory, size_t size, const char* file, int line) = mem_leak_realloc; -static void *(*saved_malloc_fptr)(size_t size, const char* file, int line) = mem_leak_malloc; -static void (*saved_free_fptr)(void* mem, const char* file, int line) = mem_leak_free; -static void*(*saved_realloc_fptr)(void* memory, size_t size, const char* file, int line) = mem_leak_realloc; +static void *(*malloc_fptr)(size_t size, const char* file, size_t line) = mem_leak_malloc; +static void (*free_fptr)(void* mem, const char* file, size_t line) = mem_leak_free; +static void*(*realloc_fptr)(void* memory, size_t size, const char* file, size_t line) = mem_leak_realloc; +static void *(*saved_malloc_fptr)(size_t size, const char* file, size_t line) = mem_leak_malloc; +static void (*saved_free_fptr)(void* mem, const char* file, size_t line) = mem_leak_free; +static void*(*saved_realloc_fptr)(void* memory, size_t size, const char* file, size_t line) = mem_leak_realloc; #else -static void *(*malloc_fptr)(size_t size, const char* file, int line) = normal_malloc; -static void (*free_fptr)(void* mem, const char* file, int line) = normal_free; -static void*(*realloc_fptr)(void* memory, size_t size, const char* file, int line) = normal_realloc; +static void *(*malloc_fptr)(size_t size, const char* file, size_t line) = normal_malloc; +static void (*free_fptr)(void* mem, const char* file, size_t line) = normal_free; +static void*(*realloc_fptr)(void* memory, size_t size, const char* file, size_t line) = normal_realloc; #endif -void* cpputest_malloc_location_with_leak_detection(size_t size, const char* file, int line) +void* cpputest_malloc_location_with_leak_detection(size_t size, const char* file, size_t line) { return malloc_fptr(size, file, line); } -void* cpputest_realloc_location_with_leak_detection(void* memory, size_t size, const char* file, int line) +void* cpputest_realloc_location_with_leak_detection(void* memory, size_t size, const char* file, size_t line) { return realloc_fptr(memory, size, file, line); } -void cpputest_free_location_with_leak_detection(void* buffer, const char* file, int line) +void cpputest_free_location_with_leak_detection(void* buffer, const char* file, size_t line) { free_fptr(buffer, file, line); } @@ -150,7 +150,7 @@ static void* threadsafe_mem_leak_operator_new_nothrow (size_t size) UT_NOTHROW return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size); } -static void* threadsafe_mem_leak_operator_new_debug (size_t size, const char* file, int line) UT_THROW(std::bad_alloc) +static void* threadsafe_mem_leak_operator_new_debug (size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) { MemLeakScopedMutex lock; void *memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size, file, line); @@ -172,7 +172,7 @@ static void* threadsafe_mem_leak_operator_new_array_nothrow (size_t size) UT_NOT return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size); } -static void* threadsafe_mem_leak_operator_new_array_debug (size_t size, const char* file, int line) UT_THROW(std::bad_alloc) +static void* threadsafe_mem_leak_operator_new_array_debug (size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) { MemLeakScopedMutex lock; void* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, file, line); @@ -207,7 +207,7 @@ static void* mem_leak_operator_new_nothrow (size_t size) UT_NOTHROW return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size); } -static void* mem_leak_operator_new_debug (size_t size, const char* file, int line) UT_THROW(std::bad_alloc) +static void* mem_leak_operator_new_debug (size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) { void *memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size, file, line); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); @@ -226,7 +226,7 @@ static void* mem_leak_operator_new_array_nothrow (size_t size) UT_NOTHROW return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size); } -static void* mem_leak_operator_new_array_debug (size_t size, const char* file, int line) UT_THROW(std::bad_alloc) +static void* mem_leak_operator_new_array_debug (size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) { void* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, file, line); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); @@ -257,7 +257,7 @@ static void* normal_operator_new_nothrow (size_t size) UT_NOTHROW return PlatformSpecificMalloc(size); } -static void* normal_operator_new_debug (size_t size, const char* /*file*/, int /*line*/) UT_THROW(std::bad_alloc) +static void* normal_operator_new_debug (size_t size, const char* /*file*/, size_t /*line*/) UT_THROW(std::bad_alloc) { void* memory = PlatformSpecificMalloc(size); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); @@ -276,7 +276,7 @@ static void* normal_operator_new_array_nothrow (size_t size) UT_NOTHROW return PlatformSpecificMalloc(size); } -static void* normal_operator_new_array_debug (size_t size, const char* /*file*/, int /*line*/) UT_THROW(std::bad_alloc) +static void* normal_operator_new_array_debug (size_t size, const char* /*file*/, size_t /*line*/) UT_THROW(std::bad_alloc) { void* memory = PlatformSpecificMalloc(size); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); @@ -295,19 +295,19 @@ static void normal_operator_delete_array (void* mem) UT_NOTHROW static void *(*operator_new_fptr)(size_t size) UT_THROW(std::bad_alloc) = mem_leak_operator_new; static void *(*operator_new_nothrow_fptr)(size_t size) UT_NOTHROW = mem_leak_operator_new_nothrow; -static void *(*operator_new_debug_fptr)(size_t size, const char* file, int line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_debug; +static void *(*operator_new_debug_fptr)(size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_debug; static void *(*operator_new_array_fptr)(size_t size) UT_THROW(std::bad_alloc) = mem_leak_operator_new_array; static void *(*operator_new_array_nothrow_fptr)(size_t size) UT_NOTHROW = mem_leak_operator_new_array_nothrow; -static void *(*operator_new_array_debug_fptr)(size_t size, const char* file, int line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_array_debug; +static void *(*operator_new_array_debug_fptr)(size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_array_debug; static void (*operator_delete_fptr)(void* mem) UT_NOTHROW = mem_leak_operator_delete; static void (*operator_delete_array_fptr)(void* mem) UT_NOTHROW = mem_leak_operator_delete_array; static void *(*saved_operator_new_fptr)(size_t size) UT_THROW(std::bad_alloc) = mem_leak_operator_new; static void *(*saved_operator_new_nothrow_fptr)(size_t size) UT_NOTHROW = mem_leak_operator_new_nothrow; -static void *(*saved_operator_new_debug_fptr)(size_t size, const char* file, int line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_debug; +static void *(*saved_operator_new_debug_fptr)(size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_debug; static void *(*saved_operator_new_array_fptr)(size_t size) UT_THROW(std::bad_alloc) = mem_leak_operator_new_array; static void *(*saved_operator_new_array_nothrow_fptr)(size_t size) UT_NOTHROW = mem_leak_operator_new_array_nothrow; -static void *(*saved_operator_new_array_debug_fptr)(size_t size, const char* file, int line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_array_debug; +static void *(*saved_operator_new_array_debug_fptr)(size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_array_debug; static void (*saved_operator_delete_fptr)(void* mem) UT_NOTHROW = mem_leak_operator_delete; static void (*saved_operator_delete_array_fptr)(void* mem) UT_NOTHROW = mem_leak_operator_delete_array; static int save_counter = 0; @@ -317,7 +317,7 @@ void* operator new(size_t size) UT_THROW(std::bad_alloc) return operator_new_fptr(size); } -void* operator new(size_t size, const char* file, int line) UT_THROW(std::bad_alloc) +void* operator new(size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) { return operator_new_debug_fptr(size, file, line); } @@ -327,7 +327,7 @@ void operator delete(void* mem) UT_NOTHROW operator_delete_fptr(mem); } -void operator delete(void* mem, const char*, int) UT_NOTHROW +void operator delete(void* mem, const char*, size_t) UT_NOTHROW { operator_delete_fptr(mem); } @@ -344,7 +344,7 @@ void* operator new[](size_t size) UT_THROW(std::bad_alloc) return operator_new_array_fptr(size); } -void* operator new [](size_t size, const char* file, int line) UT_THROW(std::bad_alloc) +void* operator new [](size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) { return operator_new_array_debug_fptr(size, file, line); } @@ -354,7 +354,7 @@ void operator delete[](void* mem) UT_NOTHROW operator_delete_array_fptr(mem); } -void operator delete[](void* mem, const char*, int) UT_NOTHROW +void operator delete[](void* mem, const char*, size_t) UT_NOTHROW { operator_delete_array_fptr(mem); } @@ -587,7 +587,7 @@ void MemoryLeakWarningPlugin::ignoreAllLeaksInTest() ignoreAllWarnings_ = true; } -void MemoryLeakWarningPlugin::expectLeaksInTest(int n) +void MemoryLeakWarningPlugin::expectLeaksInTest(size_t n) { expectedLeaks_ = n; } @@ -620,14 +620,14 @@ void MemoryLeakWarningPlugin::preTestAction(UtestShell& /*test*/, TestResult& re void MemoryLeakWarningPlugin::postTestAction(UtestShell& test, TestResult& result) { memLeakDetector_->stopChecking(); - int leaks = memLeakDetector_->totalMemoryLeaks(mem_leak_period_checking); + size_t leaks = memLeakDetector_->totalMemoryLeaks(mem_leak_period_checking); if (!ignoreAllWarnings_ && expectedLeaks_ != leaks && failureCount_ == result.getFailureCount()) { if(MemoryLeakWarningPlugin::areNewDeleteOverloaded()) { TestFailure f(&test, memLeakDetector_->report(mem_leak_period_checking)); result.addFailure(f); } else if(expectedLeaks_ > 0) { - result.print(StringFromFormat("Warning: Expected %d leak(s), but leak detection was disabled", expectedLeaks_).asCharString()); + result.print(StringFromFormat("Warning: Expected %d leak(s), but leak detection was disabled", (int) expectedLeaks_).asCharString()); } } memLeakDetector_->markCheckingPeriodLeaksAsNonCheckingPeriod(); @@ -635,9 +635,9 @@ void MemoryLeakWarningPlugin::postTestAction(UtestShell& test, TestResult& resul expectedLeaks_ = 0; } -const char* MemoryLeakWarningPlugin::FinalReport(int toBeDeletedLeaks) +const char* MemoryLeakWarningPlugin::FinalReport(size_t toBeDeletedLeaks) { - int leaks = memLeakDetector_->totalMemoryLeaks(mem_leak_period_enabled); + size_t leaks = memLeakDetector_->totalMemoryLeaks(mem_leak_period_enabled); if (leaks != toBeDeletedLeaks) return memLeakDetector_->report(mem_leak_period_enabled); return ""; } diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index bda566fa6..6ebdc29de 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -141,12 +141,12 @@ void SimpleString::setStringAllocator(TestMemoryAllocator* allocator) } /* Avoid using the memory leak detector INSIDE SimpleString as its used inside the detector */ -char* SimpleString::allocStringBuffer(size_t _size, const char* file, int line) +char* SimpleString::allocStringBuffer(size_t _size, const char* file, size_t line) { return getStringAllocator()->alloc_memory(_size, file, line); } -void SimpleString::deallocStringBuffer(char* str, const char* file, int line) +void SimpleString::deallocStringBuffer(char* str, const char* file, size_t line) { getStringAllocator()->free_memory(str, file, line); } diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index 5fb21fce5..a6400878b 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -60,7 +60,7 @@ static SimpleString addMarkerToString(const SimpleString& str, int markerPos) } -TestFailure::TestFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& theMessage) : +TestFailure::TestFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& theMessage) : testName_(test->getFormattedName()), testNameOnly_(test->getName()), fileName_(fileName), lineNumber_(lineNumber), testFileName_(test->getFile()), testLineNumber_(test->getLineNumber()), message_(theMessage) { } @@ -70,7 +70,7 @@ TestFailure::TestFailure(UtestShell* test, const SimpleString& theMessage) : { } -TestFailure::TestFailure(UtestShell* test, const char* fileName, int lineNum) : +TestFailure::TestFailure(UtestShell* test, const char* fileName, size_t lineNum) : testName_(test->getFormattedName()), testNameOnly_(test->getName()), fileName_(fileName), lineNumber_(lineNum), testFileName_(test->getFile()), testLineNumber_(test->getLineNumber()), message_("no message") { } @@ -105,12 +105,12 @@ SimpleString TestFailure::getTestNameOnly() const return testNameOnly_; } -int TestFailure::getFailureLineNumber() const +size_t TestFailure::getFailureLineNumber() const { return lineNumber_; } -int TestFailure::getTestLineNumber() const +size_t TestFailure::getTestLineNumber() const { return testLineNumber_; } @@ -173,7 +173,7 @@ SimpleString TestFailure::createUserText(const SimpleString& text) return userMessage; } -EqualsFailure::EqualsFailure(UtestShell* test, const char* fileName, int lineNumber, const char* expected, const char* actual, const SimpleString& text) : +EqualsFailure::EqualsFailure(UtestShell* test, const char* fileName, size_t lineNumber, const char* expected, const char* actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -181,7 +181,7 @@ EqualsFailure::EqualsFailure(UtestShell* test, const char* fileName, int lineNum message_ += createButWasString(StringFromOrNull(expected), StringFromOrNull(actual)); } -EqualsFailure::EqualsFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text) +EqualsFailure::EqualsFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -189,7 +189,7 @@ EqualsFailure::EqualsFailure(UtestShell* test, const char* fileName, int lineNum message_ += createButWasString(expected, actual); } -DoublesEqualFailure::DoublesEqualFailure(UtestShell* test, const char* fileName, int lineNumber, double expected, double actual, double threshold, const SimpleString& text) +DoublesEqualFailure::DoublesEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, double expected, double actual, double threshold, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -203,7 +203,7 @@ DoublesEqualFailure::DoublesEqualFailure(UtestShell* test, const char* fileName, message_ += "\n\tCannot make comparisons with Nan"; } -CheckEqualFailure::CheckEqualFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text) +CheckEqualFailure::CheckEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -216,7 +216,7 @@ CheckEqualFailure::CheckEqualFailure(UtestShell* test, const char* fileName, int } -ComparisonFailure::ComparisonFailure(UtestShell *test, const char *fileName, int lineNumber, const SimpleString& checkString, const SimpleString &comparisonString, const SimpleString &text) +ComparisonFailure::ComparisonFailure(UtestShell *test, const char *fileName, size_t lineNumber, const SimpleString& checkString, const SimpleString &comparisonString, const SimpleString &text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -226,7 +226,7 @@ ComparisonFailure::ComparisonFailure(UtestShell *test, const char *fileName, int message_ += ") failed"; } -ContainsFailure::ContainsFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text) +ContainsFailure::ContainsFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& expected, const SimpleString& actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -234,7 +234,7 @@ ContainsFailure::ContainsFailure(UtestShell* test, const char* fileName, int lin message_ += StringFromFormat("actual <%s>\n\tdid not contain <%s>", actual.asCharString(), expected.asCharString()); } -CheckFailure::CheckFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& checkString, const SimpleString& conditionString, const SimpleString& text) +CheckFailure::CheckFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& checkString, const SimpleString& conditionString, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -245,12 +245,12 @@ CheckFailure::CheckFailure(UtestShell* test, const char* fileName, int lineNumbe message_ += ") failed"; } -FailFailure::FailFailure(UtestShell* test, const char* fileName, int lineNumber, const SimpleString& message) : TestFailure(test, fileName, lineNumber) +FailFailure::FailFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& message) : TestFailure(test, fileName, lineNumber) { message_ = message; } -LongsEqualFailure::LongsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, long expected, long actual, const SimpleString& text) +LongsEqualFailure::LongsEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, long expected, long actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -265,7 +265,7 @@ LongsEqualFailure::LongsEqualFailure(UtestShell* test, const char* fileName, int message_ += createButWasString(expectedReported, actualReported); } -UnsignedLongsEqualFailure::UnsignedLongsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, unsigned long expected, unsigned long actual, const SimpleString& text) +UnsignedLongsEqualFailure::UnsignedLongsEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, unsigned long expected, unsigned long actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -281,7 +281,7 @@ UnsignedLongsEqualFailure::UnsignedLongsEqualFailure(UtestShell* test, const cha message_ += createButWasString(expectedReported, actualReported); } -LongLongsEqualFailure::LongLongsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, cpputest_longlong expected, cpputest_longlong actual, const SimpleString& text) +LongLongsEqualFailure::LongLongsEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, cpputest_longlong expected, cpputest_longlong actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -296,7 +296,7 @@ LongLongsEqualFailure::LongLongsEqualFailure(UtestShell* test, const char* fileN message_ += createButWasString(expectedReported, actualReported); } -UnsignedLongLongsEqualFailure::UnsignedLongLongsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, cpputest_ulonglong expected, cpputest_ulonglong actual, const SimpleString& text) +UnsignedLongLongsEqualFailure::UnsignedLongLongsEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, cpputest_ulonglong expected, cpputest_ulonglong actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -311,7 +311,7 @@ UnsignedLongLongsEqualFailure::UnsignedLongLongsEqualFailure(UtestShell* test, c message_ += createButWasString(expectedReported, actualReported); } -SignedBytesEqualFailure::SignedBytesEqualFailure (UtestShell* test, const char* fileName, int lineNumber, signed char expected, signed char actual, const SimpleString& text) +SignedBytesEqualFailure::SignedBytesEqualFailure (UtestShell* test, const char* fileName, size_t lineNumber, signed char expected, signed char actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -326,7 +326,7 @@ SignedBytesEqualFailure::SignedBytesEqualFailure (UtestShell* test, const char* message_ += createButWasString(expectedReported, actualReported); } -StringEqualFailure::StringEqualFailure(UtestShell* test, const char* fileName, int lineNumber, const char* expected, const char* actual, const SimpleString& text) +StringEqualFailure::StringEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, const char* expected, const char* actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -341,7 +341,7 @@ StringEqualFailure::StringEqualFailure(UtestShell* test, const char* fileName, i } } -StringEqualNoCaseFailure::StringEqualNoCaseFailure(UtestShell* test, const char* fileName, int lineNumber, const char* expected, const char* actual, const SimpleString& text) +StringEqualNoCaseFailure::StringEqualNoCaseFailure(UtestShell* test, const char* fileName, size_t lineNumber, const char* expected, const char* actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { message_ = createUserText(text); @@ -356,7 +356,7 @@ StringEqualNoCaseFailure::StringEqualNoCaseFailure(UtestShell* test, const char* } } -BinaryEqualFailure::BinaryEqualFailure(UtestShell* test, const char* fileName, int lineNumber, const unsigned char* expected, +BinaryEqualFailure::BinaryEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, const unsigned char* expected, const unsigned char* actual, size_t size, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { @@ -372,7 +372,7 @@ BinaryEqualFailure::BinaryEqualFailure(UtestShell* test, const char* fileName, i } } -BitsEqualFailure::BitsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, unsigned long expected, unsigned long actual, +BitsEqualFailure::BitsEqualFailure(UtestShell* test, const char* fileName, size_t lineNumber, unsigned long expected, unsigned long actual, unsigned long mask, size_t byteCount, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { @@ -381,7 +381,7 @@ BitsEqualFailure::BitsEqualFailure(UtestShell* test, const char* fileName, int l message_ += createButWasString(StringFromMaskedBits(expected, mask, byteCount), StringFromMaskedBits(actual, mask, byteCount)); } -FeatureUnsupportedFailure::FeatureUnsupportedFailure(UtestShell* test, const char* fileName, int lineNumber, +FeatureUnsupportedFailure::FeatureUnsupportedFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& featureName, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { diff --git a/src/CppUTest/TestHarness_c.cpp b/src/CppUTest/TestHarness_c.cpp index 3abfd9419..b97fdd5d8 100644 --- a/src/CppUTest/TestHarness_c.cpp +++ b/src/CppUTest/TestHarness_c.cpp @@ -34,87 +34,87 @@ extern "C" { -void CHECK_EQUAL_C_BOOL_LOCATION(int expected, int actual, const char* text, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_BOOL_LOCATION(int expected, int actual, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertEquals(!!expected != !!actual, expected ? "true" : "false", actual ? "true" : "false", text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_INT_LOCATION(int expected, int actual, const char* text, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_INT_LOCATION(int expected, int actual, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertLongsEqual((long)expected, (long)actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_UINT_LOCATION(unsigned int expected, unsigned int actual, const char* text, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_UINT_LOCATION(unsigned int expected, unsigned int actual, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_LONG_LOCATION(long expected, long actual, const char* text, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_LONG_LOCATION(long expected, long actual, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertLongsEqual(expected, actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_ULONG_LOCATION(unsigned long expected, unsigned long actual, const char* text, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_ULONG_LOCATION(unsigned long expected, unsigned long actual, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertUnsignedLongsEqual(expected, actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_LONGLONG_LOCATION(cpputest_longlong expected, cpputest_longlong actual, const char* text, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_LONGLONG_LOCATION(cpputest_longlong expected, cpputest_longlong actual, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertLongLongsEqual(expected, actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_ULONGLONG_LOCATION(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* text, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_ULONGLONG_LOCATION(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertUnsignedLongLongsEqual(expected, actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_REAL_LOCATION(double expected, double actual, double threshold, const char* text, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_REAL_LOCATION(double expected, double actual, double threshold, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertDoublesEqual(expected, actual, threshold, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_CHAR_LOCATION(char expected, char actual, const char* text, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_CHAR_LOCATION(char expected, char actual, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertEquals(((expected) != (actual)), StringFrom(expected).asCharString(), StringFrom(actual).asCharString(), text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -extern void CHECK_EQUAL_C_UBYTE_LOCATION(unsigned char expected, unsigned char actual, const char* text, const char* fileName, int lineNumber)\ +extern void CHECK_EQUAL_C_UBYTE_LOCATION(unsigned char expected, unsigned char actual, const char* text, const char* fileName, size_t lineNumber)\ { UtestShell::getCurrent()->assertEquals(((expected) != (actual)),StringFrom((int)expected).asCharString(), StringFrom((int) actual).asCharString(), text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_SBYTE_LOCATION(char signed expected, signed char actual, const char* text, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_SBYTE_LOCATION(char signed expected, signed char actual, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertEquals(((expected) != (actual)),StringFrom((int)expected).asCharString(), StringFrom((int) actual).asCharString(), text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_STRING_LOCATION(const char* expected, const char* actual, const char* text, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_STRING_LOCATION(const char* expected, const char* actual, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertCstrEqual(expected, actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, const void* actual, const char* text, const char* fileName, int lineNumber) +void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, const void* actual, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertPointersEqual(expected, actual, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -extern void CHECK_EQUAL_C_BITS_LOCATION(unsigned int expected, unsigned int actual, unsigned int mask, size_t size, const char* text, const char* fileName, int lineNumber) +extern void CHECK_EQUAL_C_BITS_LOCATION(unsigned int expected, unsigned int actual, unsigned int mask, size_t size, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertBitsEqual(expected, actual, mask, size, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } -void FAIL_TEXT_C_LOCATION(const char* text, const char* fileName, int lineNumber) +void FAIL_TEXT_C_LOCATION(const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->fail(text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } // LCOV_EXCL_LINE -void FAIL_C_LOCATION(const char* fileName, int lineNumber) +void FAIL_C_LOCATION(const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->fail("", fileName, lineNumber, TestTerminatorWithoutExceptions()); } // LCOV_EXCL_LINE -void CHECK_C_LOCATION(int condition, const char* conditionString, const char* text, const char* fileName, int lineNumber) +void CHECK_C_LOCATION(int condition, const char* conditionString, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertTrue(condition != 0, "CHECK_C", conditionString, text, fileName, lineNumber, TestTerminatorWithoutExceptions()); } @@ -200,7 +200,7 @@ static void countdown() cpputest_malloc_set_out_of_memory(); } -void* cpputest_malloc_location(size_t size, const char* file, int line) +void* cpputest_malloc_location(size_t size, const char* file, size_t line) { countdown(); malloc_count++; @@ -214,7 +214,7 @@ static size_t test_harness_c_strlen(const char * str) return n; } -static char* strdup_alloc(const char * str, size_t size, const char* file, int line) +static char* strdup_alloc(const char * str, size_t size, const char* file, size_t line) { char* result = (char*) cpputest_malloc_location(size, file, line); PlatformSpecificMemCpy(result, str, size); @@ -222,13 +222,13 @@ static char* strdup_alloc(const char * str, size_t size, const char* file, int l return result; } -char* cpputest_strdup_location(const char * str, const char* file, int line) +char* cpputest_strdup_location(const char * str, const char* file, size_t line) { size_t length = 1 + test_harness_c_strlen(str); return strdup_alloc(str, length, file, line); } -char* cpputest_strndup_location(const char * str, size_t n, const char* file, int line) +char* cpputest_strndup_location(const char * str, size_t n, const char* file, size_t line) { size_t length = test_harness_c_strlen(str); length = length < n ? length : n; @@ -237,7 +237,7 @@ char* cpputest_strndup_location(const char * str, size_t n, const char* file, in } -void* cpputest_calloc_location(size_t num, size_t size, const char* file, int line) +void* cpputest_calloc_location(size_t num, size_t size, const char* file, size_t line) { void* mem = cpputest_malloc_location(num * size, file, line); if (mem) @@ -245,12 +245,12 @@ void* cpputest_calloc_location(size_t num, size_t size, const char* file, int li return mem; } -void* cpputest_realloc_location(void* memory, size_t size, const char* file, int line) +void* cpputest_realloc_location(void* memory, size_t size, const char* file, size_t line) { return cpputest_realloc_location_with_leak_detection(memory, size, file, line); } -void cpputest_free_location(void* buffer, const char* file, int line) +void cpputest_free_location(void* buffer, const char* file, size_t line) { cpputest_free_location_with_leak_detection(buffer, file, line); } diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index f396f6d2b..09a1a2e35 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -159,12 +159,12 @@ void TestMemoryAllocator::freeMemoryLeakNode(char* memory) free_memory(memory, "MemoryLeakNode", 1); } -char* TestMemoryAllocator::alloc_memory(size_t size, const char*, int) +char* TestMemoryAllocator::alloc_memory(size_t size, const char*, size_t) { return checkedMalloc(size); } -void TestMemoryAllocator::free_memory(char* memory, const char*, int) +void TestMemoryAllocator::free_memory(char* memory, const char*, size_t) { PlatformSpecificFree(memory); } @@ -201,7 +201,7 @@ void CrashOnAllocationAllocator::setNumberToCrashOn(unsigned allocationToCrashOn allocationToCrashOn_ = allocationToCrashOn; } -char* CrashOnAllocationAllocator::alloc_memory(size_t size, const char* file, int line) +char* CrashOnAllocationAllocator::alloc_memory(size_t size, const char* file, size_t line) { if (MemoryLeakWarningPlugin::getGlobalDetector()->getCurrentAllocationNumber() == allocationToCrashOn_) UT_CRASH(); @@ -214,12 +214,12 @@ NullUnknownAllocator::~NullUnknownAllocator() { } -char* NullUnknownAllocator::alloc_memory(size_t /*size*/, const char*, int) +char* NullUnknownAllocator::alloc_memory(size_t /*size*/, const char*, size_t) { return NULLPTR; } -void NullUnknownAllocator::free_memory(char* /*memory*/, const char*, int) +void NullUnknownAllocator::free_memory(char* /*memory*/, const char*, size_t) { } @@ -241,7 +241,7 @@ class LocationToFailAllocNode int allocNumberToFail_; int actualAllocNumber_; const char* file_; - int line_; + size_t line_; LocationToFailAllocNode* next_; void failAtAllocNumber(int number, LocationToFailAllocNode* next) @@ -250,7 +250,7 @@ class LocationToFailAllocNode allocNumberToFail_ = number; } - void failNthAllocAt(int allocationNumber, const char* file, int line, LocationToFailAllocNode* next) + void failNthAllocAt(int allocationNumber, const char* file, size_t line, LocationToFailAllocNode* next) { init(next); allocNumberToFail_ = allocationNumber; @@ -258,7 +258,7 @@ class LocationToFailAllocNode line_ = line; } - bool shouldFail(int allocationNumber, const char* file, int line) + bool shouldFail(int allocationNumber, const char* file, size_t line) { if (file_ && SimpleString::StrCmp(file, file_) == 0 && line == line_) { actualAllocNumber_++; @@ -297,14 +297,14 @@ void FailableMemoryAllocator::failAllocNumber(int number) head_ = newNode; } -void FailableMemoryAllocator::failNthAllocAt(int allocationNumber, const char* file, int line) +void FailableMemoryAllocator::failNthAllocAt(int allocationNumber, const char* file, size_t line) { LocationToFailAllocNode* newNode = (LocationToFailAllocNode*) (void*) allocMemoryLeakNode(sizeof(LocationToFailAllocNode)); newNode->failNthAllocAt(allocationNumber, file, line, head_); head_ = newNode; } -char* FailableMemoryAllocator::alloc_memory(size_t size, const char* file, int line) +char* FailableMemoryAllocator::alloc_memory(size_t size, const char* file, size_t line) { currentAllocNumber_++; LocationToFailAllocNode* current = head_; @@ -335,9 +335,9 @@ void FailableMemoryAllocator::checkAllFailedAllocsWereDone() UtestShell* currentTest = UtestShell::getCurrent(); SimpleString failText; if (head_->file_) - failText = StringFromFormat("Expected failing alloc at %s:%d was never done", head_->file_, head_->line_); + failText = StringFromFormat("Expected failing alloc at %s:%d was never done", head_->file_, (int) head_->line_); else - failText = StringFromFormat("Expected allocation number %d was never done", head_->allocNumberToFail_); + failText = StringFromFormat("Expected allocation number %d was never done", (int) head_->allocNumberToFail_); currentTest->failWith(FailFailure(currentTest, currentTest->getName().asCharString(), currentTest->getLineNumber(), failText)); } @@ -556,7 +556,7 @@ size_t AccountingTestMemoryAllocator::removeMemoryFromTrackingAndReturnAllocated return 0; } -char* AccountingTestMemoryAllocator::alloc_memory(size_t size, const char* file, int line) +char* AccountingTestMemoryAllocator::alloc_memory(size_t size, const char* file, size_t line) { accountant_.alloc(size); char* memory = originalAllocator_->alloc_memory(size, file, line); @@ -564,7 +564,7 @@ char* AccountingTestMemoryAllocator::alloc_memory(size_t size, const char* file, return memory; } -void AccountingTestMemoryAllocator::free_memory(char* memory, const char* file, int line) +void AccountingTestMemoryAllocator::free_memory(char* memory, const char* file, size_t line) { size_t size = removeMemoryFromTrackingAndReturnAllocatedSize(memory); accountant_.dealloc(size); diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index b9036b4e3..21a3b08cc 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -72,6 +72,11 @@ void TestOutput::print(long n) print(StringFrom(n).asCharString()); } +void TestOutput::print(size_t n) +{ + print(StringFrom(n).asCharString()); +} + void TestOutput::printDouble(double d) { print(StringFrom(d).asCharString()); @@ -140,7 +145,7 @@ void TestOutput::printTestsEnded(const TestResult& result) { print("\n"); const bool isFailure = result.isFailure(); - const int failureCount = result.getFailureCount(); + const size_t failureCount = result.getFailureCount(); if (isFailure) { if (color_) { print("\033[31;1m"); @@ -184,7 +189,7 @@ void TestOutput::printTestsEnded(const TestResult& result) dotCount_ = 0; } -void TestOutput::printTestRun(int number, int total) +void TestOutput::printTestRun(size_t number, size_t total) { if (total > 1) { print("Test run "); @@ -232,7 +237,7 @@ void TestOutput::printFailureMessage(SimpleString reason) print("\n\n"); } -void TestOutput::printErrorInFileOnLineFormattedForWorkingEnvironment(SimpleString file, int lineNumber) +void TestOutput::printErrorInFileOnLineFormattedForWorkingEnvironment(SimpleString file, size_t lineNumber) { if (TestOutput::getWorkingEnvironment() == TestOutput::visualStudio) printVisualStudioErrorInFileOnLine(file, lineNumber); @@ -240,7 +245,7 @@ void TestOutput::printErrorInFileOnLineFormattedForWorkingEnvironment(SimpleStri printEclipseErrorInFileOnLine(file, lineNumber); } -void TestOutput::printEclipseErrorInFileOnLine(SimpleString file, int lineNumber) +void TestOutput::printEclipseErrorInFileOnLine(SimpleString file, size_t lineNumber) { print("\n"); print(file.asCharString()); @@ -250,7 +255,7 @@ void TestOutput::printEclipseErrorInFileOnLine(SimpleString file, int lineNumber print(" error:"); } -void TestOutput::printVisualStudioErrorInFileOnLine(SimpleString file, int lineNumber) +void TestOutput::printVisualStudioErrorInFileOnLine(SimpleString file, size_t lineNumber) { print("\n"); print(file.asCharString()); @@ -374,6 +379,12 @@ void CompositeTestOutput::print(long number) if (outputTwo_) outputTwo_->print(number); } +void CompositeTestOutput::print(size_t number) +{ + if (outputOne_) outputOne_->print(number); + if (outputTwo_) outputTwo_->print(number); +} + void CompositeTestOutput::printDouble(double number) { if (outputOne_) outputOne_->printDouble(number); diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 4d8de4168..aa99c531e 100644 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -227,7 +227,7 @@ UtestShell* TestRegistry::getFirstTest() return tests_; } -void TestRegistry::shuffleTests(unsigned seed) +void TestRegistry::shuffleTests(size_t seed) { UtestShellPointerArray array(getFirstTest()); array.shuffle(seed); diff --git a/src/CppUTest/TestResult.cpp b/src/CppUTest/TestResult.cpp index 31253d98f..b081f49b7 100644 --- a/src/CppUTest/TestResult.cpp +++ b/src/CppUTest/TestResult.cpp @@ -44,19 +44,19 @@ TestResult::~TestResult() void TestResult::currentGroupStarted(UtestShell* test) { output_.printCurrentGroupStarted(*test); - currentGroupTimeStarted_ = GetPlatformSpecificTimeInMillis(); + currentGroupTimeStarted_ = (size_t) GetPlatformSpecificTimeInMillis(); } void TestResult::currentGroupEnded(UtestShell* /*test*/) { - currentGroupTotalExecutionTime_ = GetPlatformSpecificTimeInMillis() - currentGroupTimeStarted_; + currentGroupTotalExecutionTime_ = (size_t) GetPlatformSpecificTimeInMillis() - currentGroupTimeStarted_; output_.printCurrentGroupEnded(*this); } void TestResult::currentTestStarted(UtestShell* test) { output_.printCurrentTestStarted(*test); - currentTestTimeStarted_ = GetPlatformSpecificTimeInMillis(); + currentTestTimeStarted_ = (size_t) GetPlatformSpecificTimeInMillis(); } void TestResult::print(const char* text) @@ -71,7 +71,7 @@ void TestResult::printVeryVerbose(const char* text) void TestResult::currentTestEnded(UtestShell* /*test*/) { - currentTestTotalExecutionTime_ = GetPlatformSpecificTimeInMillis() - currentTestTimeStarted_; + currentTestTotalExecutionTime_ = (size_t) GetPlatformSpecificTimeInMillis() - currentTestTimeStarted_; output_.printCurrentTestEnded(*this); } @@ -109,33 +109,33 @@ void TestResult::countIgnored() void TestResult::testsStarted() { - timeStarted_ = GetPlatformSpecificTimeInMillis(); + timeStarted_ = (size_t) GetPlatformSpecificTimeInMillis(); output_.printTestsStarted(); } void TestResult::testsEnded() { - long timeEnded = GetPlatformSpecificTimeInMillis(); + size_t timeEnded = (size_t) GetPlatformSpecificTimeInMillis(); totalExecutionTime_ = timeEnded - timeStarted_; output_.printTestsEnded(*this); } -long TestResult::getTotalExecutionTime() const +size_t TestResult::getTotalExecutionTime() const { return totalExecutionTime_; } -void TestResult::setTotalExecutionTime(long exTime) +void TestResult::setTotalExecutionTime(size_t exTime) { totalExecutionTime_ = exTime; } -long TestResult::getCurrentTestTotalExecutionTime() const +size_t TestResult::getCurrentTestTotalExecutionTime() const { return currentTestTotalExecutionTime_; } -long TestResult::getCurrentGroupTotalExecutionTime() const +size_t TestResult::getCurrentGroupTotalExecutionTime() const { return currentGroupTotalExecutionTime_; } diff --git a/src/CppUTest/TestTestingFixture.cpp b/src/CppUTest/TestTestingFixture.cpp index cc2c4d0ac..0fe79f5ad 100644 --- a/src/CppUTest/TestTestingFixture.cpp +++ b/src/CppUTest/TestTestingFixture.cpp @@ -122,22 +122,22 @@ void TestTestingFixture::runAllTests() registry_->runAllTests(*result_); } -int TestTestingFixture::getFailureCount() +size_t TestTestingFixture::getFailureCount() { return result_->getFailureCount(); } -int TestTestingFixture::getCheckCount() +size_t TestTestingFixture::getCheckCount() { return result_->getCheckCount(); } -int TestTestingFixture::getTestCount() +size_t TestTestingFixture::getTestCount() { return result_->getTestCount(); } -int TestTestingFixture::getIgnoreCount() +size_t TestTestingFixture::getIgnoreCount() { return result_->getIgnoredCount(); } @@ -168,7 +168,7 @@ const SimpleString& TestTestingFixture::getOutput() return output_->getOutput(); } -int TestTestingFixture::getRunCount() +size_t TestTestingFixture::getRunCount() { return result_->getRunCount(); } @@ -178,10 +178,10 @@ void TestTestingFixture::lineExecutedAfterCheck() lineOfCodeExecutedAfterCheck = true; } -void TestTestingFixture::checkTestFailsWithProperTestLocation(const char* text, const char* file, int line) +void TestTestingFixture::checkTestFailsWithProperTestLocation(const char* text, const char* file, size_t line) { if (getFailureCount() != 1) - FAIL_LOCATION(StringFromFormat("Expected one test failure, but got %d amount of test failures", getFailureCount()).asCharString(), file, line); + FAIL_LOCATION(StringFromFormat("Expected one test failure, but got %d amount of test failures", (int) getFailureCount()).asCharString(), file, line); STRCMP_CONTAINS_LOCATION(text, output_->getOutput().asCharString(), "", file, line); diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index aaeae4187..d078bdf2b 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -136,12 +136,12 @@ UtestShell::UtestShell() : { } -UtestShell::UtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber) : +UtestShell::UtestShell(const char* groupName, const char* testName, const char* fileName, size_t lineNumber) : group_(groupName), name_(testName), file_(fileName), lineNumber_(lineNumber), next_(NULLPTR), isRunAsSeperateProcess_(false), hasFailed_(false) { } -UtestShell::UtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber, UtestShell* nextTest) : +UtestShell::UtestShell(const char* groupName, const char* testName, const char* fileName, size_t lineNumber, UtestShell* nextTest) : group_(groupName), name_(testName), file_(fileName), lineNumber_(lineNumber), next_(nextTest), isRunAsSeperateProcess_(false), hasFailed_(false) { } @@ -307,7 +307,7 @@ void UtestShell::setFileName(const char* fileName) file_ = fileName; } -void UtestShell::setLineNumber(int lineNumber) +void UtestShell::setLineNumber(size_t lineNumber) { lineNumber_ = lineNumber; } @@ -327,7 +327,7 @@ const SimpleString UtestShell::getFile() const return SimpleString(file_); } -int UtestShell::getLineNumber() const +size_t UtestShell::getLineNumber() const { return lineNumber_; } @@ -364,20 +364,20 @@ void UtestShell::exitTest(const TestTerminator& terminator) terminator.exitCurrentTest(); } // LCOV_EXCL_LINE -void UtestShell::assertTrue(bool condition, const char *checkString, const char *conditionString, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertTrue(bool condition, const char *checkString, const char *conditionString, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if (!condition) failWith(CheckFailure(this, fileName, lineNumber, checkString, conditionString, text), testTerminator); } -void UtestShell::fail(const char *text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::fail(const char *text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); failWith(FailFailure(this, fileName, lineNumber, text), testTerminator); } // LCOV_EXCL_LINE -void UtestShell::assertCstrEqual(const char* expected, const char* actual, const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertCstrEqual(const char* expected, const char* actual, const char* text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if (actual == NULLPTR && expected == NULLPTR) return; @@ -387,7 +387,7 @@ void UtestShell::assertCstrEqual(const char* expected, const char* actual, const failWith(StringEqualFailure(this, fileName, lineNumber, expected, actual, text), testTerminator); } -void UtestShell::assertCstrNEqual(const char* expected, const char* actual, size_t length, const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertCstrNEqual(const char* expected, const char* actual, size_t length, const char* text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if (actual == NULLPTR && expected == NULLPTR) return; @@ -397,7 +397,7 @@ void UtestShell::assertCstrNEqual(const char* expected, const char* actual, size failWith(StringEqualFailure(this, fileName, lineNumber, expected, actual, text), testTerminator); } -void UtestShell::assertCstrNoCaseEqual(const char* expected, const char* actual, const char* text, const char* fileName, int lineNumber) +void UtestShell::assertCstrNoCaseEqual(const char* expected, const char* actual, const char* text, const char* fileName, size_t lineNumber) { getTestResult()->countCheck(); if (actual == NULLPTR && expected == NULLPTR) return; @@ -407,7 +407,7 @@ void UtestShell::assertCstrNoCaseEqual(const char* expected, const char* actual, failWith(StringEqualNoCaseFailure(this, fileName, lineNumber, expected, actual, text)); } -void UtestShell::assertCstrContains(const char* expected, const char* actual, const char* text, const char* fileName, int lineNumber) +void UtestShell::assertCstrContains(const char* expected, const char* actual, const char* text, const char* fileName, size_t lineNumber) { getTestResult()->countCheck(); if (actual == NULLPTR && expected == NULLPTR) return; @@ -417,7 +417,7 @@ void UtestShell::assertCstrContains(const char* expected, const char* actual, co failWith(ContainsFailure(this, fileName, lineNumber, expected, actual, text)); } -void UtestShell::assertCstrNoCaseContains(const char* expected, const char* actual, const char* text, const char* fileName, int lineNumber) +void UtestShell::assertCstrNoCaseContains(const char* expected, const char* actual, const char* text, const char* fileName, size_t lineNumber) { getTestResult()->countCheck(); if (actual == NULLPTR && expected == NULLPTR) return; @@ -427,21 +427,21 @@ void UtestShell::assertCstrNoCaseContains(const char* expected, const char* actu failWith(ContainsFailure(this, fileName, lineNumber, expected, actual, text)); } -void UtestShell::assertLongsEqual(long expected, long actual, const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertLongsEqual(long expected, long actual, const char* text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if (expected != actual) failWith(LongsEqualFailure (this, fileName, lineNumber, expected, actual, text), testTerminator); } -void UtestShell::assertUnsignedLongsEqual(unsigned long expected, unsigned long actual, const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertUnsignedLongsEqual(unsigned long expected, unsigned long actual, const char* text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if (expected != actual) failWith(UnsignedLongsEqualFailure (this, fileName, lineNumber, expected, actual, text), testTerminator); } -void UtestShell::assertLongLongsEqual(cpputest_longlong expected, cpputest_longlong actual, const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertLongLongsEqual(cpputest_longlong expected, cpputest_longlong actual, const char* text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); #ifdef CPPUTEST_USE_LONG_LONG @@ -454,7 +454,7 @@ void UtestShell::assertLongLongsEqual(cpputest_longlong expected, cpputest_longl #endif } -void UtestShell::assertUnsignedLongLongsEqual(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertUnsignedLongLongsEqual(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); #ifdef CPPUTEST_USE_LONG_LONG @@ -467,35 +467,35 @@ void UtestShell::assertUnsignedLongLongsEqual(cpputest_ulonglong expected, cpput #endif } -void UtestShell::assertSignedBytesEqual(signed char expected, signed char actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertSignedBytesEqual(signed char expected, signed char actual, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if (expected != actual) failWith(SignedBytesEqualFailure (this, fileName, lineNumber, expected, actual, text), testTerminator); } -void UtestShell::assertPointersEqual(const void* expected, const void* actual, const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertPointersEqual(const void* expected, const void* actual, const char* text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if (expected != actual) failWith(EqualsFailure(this, fileName, lineNumber, StringFrom(expected), StringFrom(actual), text), testTerminator); } -void UtestShell::assertFunctionPointersEqual(void (*expected)(), void (*actual)(), const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertFunctionPointersEqual(void (*expected)(), void (*actual)(), const char* text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if (expected != actual) failWith(EqualsFailure(this, fileName, lineNumber, StringFrom(expected), StringFrom(actual), text), testTerminator); } -void UtestShell::assertDoublesEqual(double expected, double actual, double threshold, const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertDoublesEqual(double expected, double actual, double threshold, const char* text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if (!doubles_equal(expected, actual, threshold)) failWith(DoublesEqualFailure(this, fileName, lineNumber, expected, actual, threshold, text), testTerminator); } -void UtestShell::assertBinaryEqual(const void *expected, const void *actual, size_t length, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertBinaryEqual(const void *expected, const void *actual, size_t length, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if (length == 0) return; @@ -506,28 +506,28 @@ void UtestShell::assertBinaryEqual(const void *expected, const void *actual, siz failWith(BinaryEqualFailure(this, fileName, lineNumber, (const unsigned char *) expected, (const unsigned char *) actual, length, text), testTerminator); } -void UtestShell::assertBitsEqual(unsigned long expected, unsigned long actual, unsigned long mask, size_t byteCount, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator) +void UtestShell::assertBitsEqual(unsigned long expected, unsigned long actual, unsigned long mask, size_t byteCount, const char* text, const char *fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if ((expected & mask) != (actual & mask)) failWith(BitsEqualFailure(this, fileName, lineNumber, expected, actual, mask, byteCount, text), testTerminator); } -void UtestShell::assertEquals(bool failed, const char* expected, const char* actual, const char* text, const char* file, int line, const TestTerminator& testTerminator) +void UtestShell::assertEquals(bool failed, const char* expected, const char* actual, const char* text, const char* file, size_t line, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if (failed) failWith(CheckEqualFailure(this, file, line, expected, actual, text), testTerminator); } -void UtestShell::assertCompare(bool comparison, const char *checkString, const char *comparisonString, const char *text, const char *fileName, int lineNumber, const TestTerminator &testTerminator) +void UtestShell::assertCompare(bool comparison, const char *checkString, const char *comparisonString, const char *text, const char *fileName, size_t lineNumber, const TestTerminator &testTerminator) { getTestResult()->countCheck(); if (!comparison) failWith(ComparisonFailure(this, fileName, lineNumber, checkString, comparisonString, text), testTerminator); } -void UtestShell::print(const char *text, const char* fileName, int lineNumber) +void UtestShell::print(const char *text, const char* fileName, size_t lineNumber) { SimpleString stringToPrint = "\n"; stringToPrint += fileName; @@ -538,7 +538,7 @@ void UtestShell::print(const char *text, const char* fileName, int lineNumber) getTestResult()->print(stringToPrint.asCharString()); } -void UtestShell::print(const SimpleString& text, const char* fileName, int lineNumber) +void UtestShell::print(const SimpleString& text, const char* fileName, size_t lineNumber) { print(text.asCharString(), fileName, lineNumber); } @@ -728,7 +728,7 @@ IgnoredUtestShell::IgnoredUtestShell(): runIgnored_(false) { } -IgnoredUtestShell::IgnoredUtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber) : +IgnoredUtestShell::IgnoredUtestShell(const char* groupName, const char* testName, const char* fileName, size_t lineNumber) : UtestShell(groupName, testName, fileName, lineNumber), runIgnored_(false) { } @@ -798,11 +798,11 @@ void UtestShellPointerArray::swap(size_t index1, size_t index2) arrayOfTests_[index2] = e1; } -void UtestShellPointerArray::shuffle(unsigned seed) +void UtestShellPointerArray::shuffle(size_t seed) { if (count_ == 0) return; - PlatformSpecificSrand(seed); + PlatformSpecificSrand((unsigned int) seed); for (size_t i = count_ - 1; i >= 1; --i) { @@ -839,7 +839,7 @@ UtestShell* UtestShellPointerArray::getFirstTest() const return get(0); } -UtestShell* UtestShellPointerArray::get(unsigned index) const +UtestShell* UtestShellPointerArray::get(size_t index) const { if (index >= count_) return NULLPTR; return arrayOfTests_[index]; @@ -849,7 +849,7 @@ UtestShell* UtestShellPointerArray::get(unsigned index) const ////////////// TestInstaller //////////// -TestInstaller::TestInstaller(UtestShell& shell, const char* groupName, const char* testName, const char* fileName, int lineNumber) +TestInstaller::TestInstaller(UtestShell& shell, const char* groupName, const char* testName, const char* fileName, size_t lineNumber) { shell.setGroupName(groupName); shell.setTestName(testName); diff --git a/src/CppUTestExt/CodeMemoryReportFormatter.cpp b/src/CppUTestExt/CodeMemoryReportFormatter.cpp index 6bdf64010..670a91677 100644 --- a/src/CppUTestExt/CodeMemoryReportFormatter.cpp +++ b/src/CppUTestExt/CodeMemoryReportFormatter.cpp @@ -90,13 +90,13 @@ static SimpleString extractFileNameFromPath(const char* file) return fileNameOnly; } -SimpleString CodeMemoryReportFormatter::createVariableNameFromFileLineInfo(const char *file, int line) +SimpleString CodeMemoryReportFormatter::createVariableNameFromFileLineInfo(const char *file, size_t line) { SimpleString fileNameOnly = extractFileNameFromPath(file); fileNameOnly.replace(".", "_"); for (int i = 1; i < 100; i++) { - SimpleString variableName = StringFromFormat("%s_%d_%d", fileNameOnly.asCharString(), line, i); + SimpleString variableName = StringFromFormat("%s_%d_%d", fileNameOnly.asCharString(), (int) line, i); if (!variableExists(variableName)) return variableName; } @@ -127,19 +127,19 @@ SimpleString CodeMemoryReportFormatter::getAllocationString(TestMemoryAllocator* return StringFromFormat("void* %s = malloc(%lu);", variableName.asCharString(), (unsigned long) size); } -SimpleString CodeMemoryReportFormatter::getDeallocationString(TestMemoryAllocator* allocator, const SimpleString& variableName, const char* file, int line) +SimpleString CodeMemoryReportFormatter::getDeallocationString(TestMemoryAllocator* allocator, const SimpleString& variableName, const char* file, size_t line) { if (isNewAllocator(allocator)) - return StringFromFormat("delete [] %s; /* using %s at %s:%d */", variableName.asCharString(), allocator->free_name(), file, line); + return StringFromFormat("delete [] %s; /* using %s at %s:%d */", variableName.asCharString(), allocator->free_name(), file, (int) line); else - return StringFromFormat("free(%s); /* at %s:%d */", variableName.asCharString(), file, line); + return StringFromFormat("free(%s); /* at %s:%d */", variableName.asCharString(), file, (int) line); } void CodeMemoryReportFormatter::report_test_start(TestResult* result, UtestShell& test) { clearReporting(); result->print(StringFromFormat("*/\nTEST(%s_memoryReport, %s)\n{ /* at %s:%d */\n", - test.getGroup().asCharString(), test.getName().asCharString(), test.getFile().asCharString(), test.getLineNumber()).asCharString()); + test.getGroup().asCharString(), test.getName().asCharString(), test.getFile().asCharString(), (int) test.getLineNumber()).asCharString()); } void CodeMemoryReportFormatter::report_test_end(TestResult* result, UtestShell&) @@ -153,14 +153,14 @@ void CodeMemoryReportFormatter::report_testgroup_start(TestResult* result, Utest test.getGroup().asCharString()).asCharString()); } -void CodeMemoryReportFormatter::report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, int line) +void CodeMemoryReportFormatter::report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, size_t line) { SimpleString variableName = createVariableNameFromFileLineInfo(file, line); result->print(StringFromFormat("\t%s\n", getAllocationString(allocator, variableName, size).asCharString()).asCharString()); addNodeToList(variableName.asCharString(), memory, codeReportingList_); } -void CodeMemoryReportFormatter::report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, int line) +void CodeMemoryReportFormatter::report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, size_t line) { SimpleString variableName; CodeReportingAllocationNode* node = findNode(memory); diff --git a/src/CppUTestExt/MemoryReportAllocator.cpp b/src/CppUTestExt/MemoryReportAllocator.cpp index 91fa9e627..ba4b87182 100644 --- a/src/CppUTestExt/MemoryReportAllocator.cpp +++ b/src/CppUTestExt/MemoryReportAllocator.cpp @@ -77,7 +77,7 @@ void MemoryReportAllocator::setFormatter(MemoryReportFormatter* formatter) formatter_ = formatter; } -char* MemoryReportAllocator::alloc_memory(size_t size, const char* file, int line) +char* MemoryReportAllocator::alloc_memory(size_t size, const char* file, size_t line) { char* memory = realAllocator_->alloc_memory(size, file, line); if (result_ && formatter_) @@ -85,7 +85,7 @@ char* MemoryReportAllocator::alloc_memory(size_t size, const char* file, int lin return memory; } -void MemoryReportAllocator::free_memory(char* memory, const char* file, int line) +void MemoryReportAllocator::free_memory(char* memory, const char* file, size_t line) { realAllocator_->free_memory(memory, file, line); if (result_ && formatter_) diff --git a/src/CppUTestExt/MemoryReportFormatter.cpp b/src/CppUTestExt/MemoryReportFormatter.cpp index ec912e76a..6ed6bcf58 100644 --- a/src/CppUTestExt/MemoryReportFormatter.cpp +++ b/src/CppUTestExt/MemoryReportFormatter.cpp @@ -47,14 +47,14 @@ void NormalMemoryReportFormatter::report_test_end(TestResult* result, UtestShell result->print(StringFromFormat("ENDTEST(%s, %s)\n", test.getGroup().asCharString(), test.getName().asCharString()).asCharString()); } -void NormalMemoryReportFormatter::report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, int line) +void NormalMemoryReportFormatter::report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, size_t line) { - result->print(StringFromFormat("\tAllocation using %s of size: %lu pointer: %p at %s:%d\n", allocator->alloc_name(), (unsigned long) size, (void*) memory, file, line).asCharString()); + result->print(StringFromFormat("\tAllocation using %s of size: %lu pointer: %p at %s:%d\n", allocator->alloc_name(), (unsigned long) size, (void*) memory, file, (int) line).asCharString()); } -void NormalMemoryReportFormatter::report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, int line) +void NormalMemoryReportFormatter::report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, size_t line) { - result->print(StringFromFormat("\tDeallocation using %s of pointer: %p at %s:%d\n", allocator->free_name(), (void*) memory, file, line).asCharString()); + result->print(StringFromFormat("\tDeallocation using %s of pointer: %p at %s:%d\n", allocator->free_name(), (void*) memory, file, (int) line).asCharString()); } void NormalMemoryReportFormatter::report_testgroup_start(TestResult* result, UtestShell& test) diff --git a/src/CppUTestExt/OrderedTest.cpp b/src/CppUTestExt/OrderedTest.cpp index 3d871b265..17035102e 100644 --- a/src/CppUTestExt/OrderedTest.cpp +++ b/src/CppUTestExt/OrderedTest.cpp @@ -96,7 +96,7 @@ OrderedTestShell* OrderedTestShell::getNextOrderedTest() OrderedTestInstaller::OrderedTestInstaller(OrderedTestShell& test, const char* groupName, const char* testName, const char* fileName, - int lineNumber, int level) + size_t lineNumber, int level) { test.setTestName(testName); test.setGroupName(groupName); diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 97bda74c5..df7b66cd2 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -102,7 +102,7 @@ static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, Test } if (cpid == 0) { /* Code executed by child */ - const int initialFailureCount = result->getFailureCount(); // LCOV_EXCL_LINE + const size_t initialFailureCount = result->getFailureCount(); // LCOV_EXCL_LINE shell->runOneTestInCurrentProcess(plugin, *result); // LCOV_EXCL_LINE _exit(initialFailureCount < result->getFailureCount()); // LCOV_EXCL_LINE } else { /* Code executed by parent */ diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index 9b4771bc7..b53ab5b98 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -389,7 +389,7 @@ bool RunIgnoredUtest::Checker = false; class RunIgnoredUtestShell : public IgnoredUtestShell { public: - RunIgnoredUtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber) + RunIgnoredUtestShell(const char* groupName, const char* testName, const char* fileName, size_t lineNumber) : IgnoredUtestShell(groupName, testName, fileName, lineNumber) {} virtual Utest* createTest() _override { return new RunIgnoredUtest; } }; diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index 2248ce7ac..c94e8a91c 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -240,7 +240,7 @@ class JUnitTestOutputTestRunner return *this; } - JUnitTestOutputTestRunner& onLine(int lineNumber) + JUnitTestOutputTestRunner& onLine(size_t lineNumber) { if(currentTest_) { currentTest_->setLineNumber(lineNumber); @@ -290,7 +290,7 @@ class JUnitTestOutputTestRunner return *this; } - JUnitTestOutputTestRunner& thatFails(const char* message, const char* file, int line) + JUnitTestOutputTestRunner& thatFails(const char* message, const char* file, size_t line) { testFailure_ = new TestFailure( currentTest_, file, line, message); return *this; diff --git a/tests/CppUTest/MemoryLeakDetectorTest.cpp b/tests/CppUTest/MemoryLeakDetectorTest.cpp index fecef5217..b685653ef 100644 --- a/tests/CppUTest/MemoryLeakDetectorTest.cpp +++ b/tests/CppUTest/MemoryLeakDetectorTest.cpp @@ -56,12 +56,12 @@ class NewAllocatorForMemoryLeakDetectionTest: public TestMemoryAllocator int alloc_called; int free_called; - char* alloc_memory(size_t size, const char*, int) + char* alloc_memory(size_t size, const char*, size_t) { alloc_called++; return TestMemoryAllocator::alloc_memory(size, "file", 1); } - void free_memory(char* memory, const char* file, int line) + void free_memory(char* memory, const char* file, size_t line) { free_called++; TestMemoryAllocator::free_memory(memory, file, line); @@ -81,12 +81,12 @@ class AllocatorForMemoryLeakDetectionTest: public TestMemoryAllocator int allocMemoryLeakNodeCalled; int freeMemoryLeakNodeCalled; - char* alloc_memory(size_t size, const char* file, int line) + char* alloc_memory(size_t size, const char* file, size_t line) { alloc_called++; return TestMemoryAllocator::alloc_memory(size, file, line); } - void free_memory(char* memory, const char* file, int line) + void free_memory(char* memory, const char* file, size_t line) { free_called++; TestMemoryAllocator::free_memory(memory, file, line); diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index 2c1ad4a6c..79da06c27 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -230,7 +230,7 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) TEST(MemoryLeakWarningGlobalDetectorTest, turnOffNewOverloadsCausesNoAdditionalLeaks) { - int storedAmountOfLeaks = detector->totalMemoryLeaks(mem_leak_period_all); + size_t storedAmountOfLeaks = detector->totalMemoryLeaks(mem_leak_period_all); char* arrayMemory = new char[100]; char* nonArrayMemory = new char; @@ -374,7 +374,7 @@ TEST(MemoryLeakWarningGlobalDetectorTest, threadSafeMemoryLeakDetectorOverloadsA TEST(MemoryLeakWarningGlobalDetectorTest, turnOffNewOverloadsNoThrowCausesNoAdditionalLeaks) { #undef new - int storedAmountOfLeaks = detector->totalMemoryLeaks(mem_leak_period_all); + size_t storedAmountOfLeaks = detector->totalMemoryLeaks(mem_leak_period_all); char* nonMemoryNoThrow = new (std::nothrow) char; char* nonArrayMemoryNoThrow = new (std::nothrow) char[10]; @@ -423,7 +423,7 @@ TEST_GROUP(MemoryLeakWarningThreadSafe) TEST(MemoryLeakWarningThreadSafe, turnOnThreadSafeMallocFreeReallocOverloadsDebug) { - int storedAmountOfLeaks = MemoryLeakWarningPlugin::getGlobalDetector()->totalMemoryLeaks(mem_leak_period_all); + size_t storedAmountOfLeaks = MemoryLeakWarningPlugin::getGlobalDetector()->totalMemoryLeaks(mem_leak_period_all); MemoryLeakWarningPlugin::turnOnThreadSafeNewDeleteOverloads(); @@ -450,7 +450,7 @@ TEST(MemoryLeakWarningThreadSafe, turnOnThreadSafeMallocFreeReallocOverloadsDebu TEST(MemoryLeakWarningThreadSafe, turnOnThreadSafeNewDeleteOverloadsDebug) { - int storedAmountOfLeaks = MemoryLeakWarningPlugin::getGlobalDetector()->totalMemoryLeaks(mem_leak_period_all); + size_t storedAmountOfLeaks = MemoryLeakWarningPlugin::getGlobalDetector()->totalMemoryLeaks(mem_leak_period_all); MemoryLeakWarningPlugin::turnOnThreadSafeNewDeleteOverloads(); diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index cb9afb8d7..f5a69d655 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -132,7 +132,7 @@ TEST_GROUP(MemoryLeakOverridesToBeUsedInProductionCode) TEST(MemoryLeakOverridesToBeUsedInProductionCode, MallocOverrideIsUsed) { - int memLeaks = memLeakDetector->totalMemoryLeaks(mem_leak_period_checking); + size_t memLeaks = memLeakDetector->totalMemoryLeaks(mem_leak_period_checking); void* memory = malloc(10); LONGS_EQUAL(memLeaks+1, memLeakDetector->totalMemoryLeaks(mem_leak_period_checking)); free (memory); @@ -142,7 +142,7 @@ TEST(MemoryLeakOverridesToBeUsedInProductionCode, MallocOverrideIsUsed) TEST(MemoryLeakOverridesToBeUsedInProductionCode, StrdupOverrideIsUsed) { - int memLeaks = memLeakDetector->totalMemoryLeaks(mem_leak_period_checking); + size_t memLeaks = memLeakDetector->totalMemoryLeaks(mem_leak_period_checking); char* memory = strdup("0123456789"); LONGS_EQUAL(memLeaks+1, memLeakDetector->totalMemoryLeaks(mem_leak_period_checking)); free (memory); @@ -150,7 +150,7 @@ TEST(MemoryLeakOverridesToBeUsedInProductionCode, StrdupOverrideIsUsed) TEST(MemoryLeakOverridesToBeUsedInProductionCode, StrndupOverrideIsUsed) { - int memLeaks = memLeakDetector->totalMemoryLeaks(mem_leak_period_checking); + size_t memLeaks = memLeakDetector->totalMemoryLeaks(mem_leak_period_checking); char* memory = strndup("0123456789", 10); LONGS_EQUAL(memLeaks+1, memLeakDetector->totalMemoryLeaks(mem_leak_period_checking)); free (memory); @@ -161,7 +161,7 @@ TEST(MemoryLeakOverridesToBeUsedInProductionCode, StrndupOverrideIsUsed) TEST(MemoryLeakOverridesToBeUsedInProductionCode, UseNativeMallocByTemporarlySwitchingOffMalloc) { - int memLeaks = memLeakDetector->totalMemoryLeaks(mem_leak_period_checking); + size_t memLeaks = memLeakDetector->totalMemoryLeaks(mem_leak_period_checking); #ifdef CPPUTEST_USE_MALLOC_MACROS #undef malloc #undef free diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 0c11b7829..f1302f54e 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -37,11 +37,11 @@ class JustUseNewStringAllocator : public TestMemoryAllocator public: virtual ~JustUseNewStringAllocator() _destructor_override {} - char* alloc_memory(size_t size, const char* file, int line) _override + char* alloc_memory(size_t size, const char* file, size_t line) _override { return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, file, line); } - void free_memory(char* str, const char* file, int line) _override + void free_memory(char* str, const char* file, size_t line) _override { MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(getCurrentNewArrayAllocator(), str, file, line); } @@ -170,7 +170,7 @@ class MyOwnStringAllocator : public TestMemoryAllocator virtual ~MyOwnStringAllocator() _destructor_override {} bool memoryWasAllocated; - char* alloc_memory(size_t size, const char* file, int line) _override + char* alloc_memory(size_t size, const char* file, size_t line) _override { memoryWasAllocated = true; return TestMemoryAllocator::alloc_memory(size, file, line); diff --git a/tests/CppUTest/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp index 8ead57153..61881f360 100644 --- a/tests/CppUTest/TestHarness_cTest.cpp +++ b/tests/CppUTest/TestHarness_cTest.cpp @@ -773,7 +773,7 @@ TEST(TestHarness_c, macros) { #if CPPUTEST_USE_MALLOC_MACROS MemoryLeakDetector* memLeakDetector = MemoryLeakWarningPlugin::getGlobalDetector(); - int memLeaks = memLeakDetector->totalMemoryLeaks(mem_leak_period_checking); + size_t memLeaks = memLeakDetector->totalMemoryLeaks(mem_leak_period_checking); #endif void* mem1 = malloc(10); void* mem2 = calloc(10, 20); diff --git a/tests/CppUTest/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp index 3b5f5830b..f4b6240d5 100644 --- a/tests/CppUTest/TestOutputTest.cpp +++ b/tests/CppUTest/TestOutputTest.cpp @@ -93,10 +93,19 @@ TEST(TestOutput, PrintConstCharStar) TEST(TestOutput, PrintLong) { - printer->print(1234); + long number = 1234; + printer->print(number); STRCMP_EQUAL("1234", mock->getOutput().asCharString()); } +TEST(TestOutput, PrintSize) +{ + size_t ten = 10; + printer->print(ten); + STRCMP_EQUAL("10", mock->getOutput().asCharString()); +} + + TEST(TestOutput, PrintDouble) { printer->printDouble(12.34); @@ -283,7 +292,7 @@ class CompositeTestOutputTestStringBufferTestOutput : public StringBufferTestOut virtual void printTestsEnded(const TestResult& result) { - output += StringFromFormat("Test End %d\n", result.getTestCount()); + output += StringFromFormat("Test End %d\n", (int) result.getTestCount()); } void printCurrentGroupStarted(const UtestShell& test) @@ -293,7 +302,7 @@ class CompositeTestOutputTestStringBufferTestOutput : public StringBufferTestOut void printCurrentGroupEnded(const TestResult& res) { - output += StringFromFormat("Group End %d\n", res.getTestCount()); + output += StringFromFormat("Group End %d\n", (int) res.getTestCount()); } virtual void printCurrentTestStarted(const UtestShell&) @@ -387,11 +396,20 @@ TEST(CompositeTestOutput, printChar) TEST(CompositeTestOutput, printLong) { - compositeOutput.print(10); + long ten = 10; + compositeOutput.print(ten); STRCMP_EQUAL("10", output1->getOutput().asCharString()); STRCMP_EQUAL("10", output2->getOutput().asCharString()); } +TEST(CompositeTestOutput, PrintSize) +{ + size_t ten = 10; + compositeOutput.print(ten); + STRCMP_EQUAL("10", output1->getOutput().asCharString()); + STRCMP_EQUAL("10", output2->getOutput().asCharString()); +} + TEST(CompositeTestOutput, printDouble) { compositeOutput.printDouble(1.01); diff --git a/tests/CppUTestExt/MemoryReporterPluginTest.cpp b/tests/CppUTestExt/MemoryReporterPluginTest.cpp index 9a95ecc6b..6a6573667 100644 --- a/tests/CppUTestExt/MemoryReporterPluginTest.cpp +++ b/tests/CppUTestExt/MemoryReporterPluginTest.cpp @@ -76,13 +76,13 @@ class MockMemoryReportFormatter : public MemoryReportFormatter mock("formatter").actualCall("report_test_end").withParameter("result", result).withParameter("test", &test); } - virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t, char* , const char* , int ) + virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t, char* , const char* , size_t ) { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_alloc_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", allocator); } - virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* , const char* , int ) + virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* , const char* , size_t ) { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_free_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", allocator); diff --git a/tests/CppUTestExt/MockFailureReporterForTest.cpp b/tests/CppUTestExt/MockFailureReporterForTest.cpp index 520532a7d..a6a7b9c97 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.cpp +++ b/tests/CppUTestExt/MockFailureReporterForTest.cpp @@ -63,7 +63,7 @@ void CLEAR_MOCK_FAILURE() MockFailureReporterForTest::getReporter()->mockFailureString = ""; } -void CHECK_EXPECTED_MOCK_FAILURE_LOCATION(const MockFailure& expectedFailure, const char* file, int line) +void CHECK_EXPECTED_MOCK_FAILURE_LOCATION(const MockFailure& expectedFailure, const char* file, size_t line) { SimpleString expectedFailureString = expectedFailure.getMessage(); SimpleString actualFailureString = mockFailureString(); @@ -79,7 +79,7 @@ void CHECK_EXPECTED_MOCK_FAILURE_LOCATION(const MockFailure& expectedFailure, co } } -void CHECK_NO_MOCK_FAILURE_LOCATION(const char* file, int line) +void CHECK_NO_MOCK_FAILURE_LOCATION(const char* file, size_t line) { if (mockFailureString() != "") { SimpleString error = "Unexpected mock failure:\n"; diff --git a/tests/CppUTestExt/MockFailureReporterForTest.h b/tests/CppUTestExt/MockFailureReporterForTest.h index 0c61ec694..575c458c6 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.h +++ b/tests/CppUTestExt/MockFailureReporterForTest.h @@ -52,8 +52,8 @@ class MockFailureReporterInstaller UtestShell* mockFailureTest(); SimpleString mockFailureString(); void CLEAR_MOCK_FAILURE(); -void CHECK_EXPECTED_MOCK_FAILURE_LOCATION(const MockFailure& expectedFailure, const char* file, int line); -void CHECK_NO_MOCK_FAILURE_LOCATION(const char* file, int line); +void CHECK_EXPECTED_MOCK_FAILURE_LOCATION(const MockFailure& expectedFailure, const char* file, size_t line); +void CHECK_NO_MOCK_FAILURE_LOCATION(const char* file, size_t line); class MockExpectedCallsListForTest : public MockExpectedCallsList { From 72011d4a43c984eba61f9011e221dbaf5b78c509 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 3 May 2020 20:54:06 +0800 Subject: [PATCH 0460/1093] Missed this bool to enum change --- tests/CppUTest/TestOutputTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp index f4b6240d5..c3d1a4a1c 100644 --- a/tests/CppUTest/TestOutputTest.cpp +++ b/tests/CppUTest/TestOutputTest.cpp @@ -315,7 +315,7 @@ class CompositeTestOutputTestStringBufferTestOutput : public StringBufferTestOut output += "flush"; } - virtual bool isVerbose() + virtual VerbosityLevel isVerbose() { return verbose_; } From 4e09fa467594f540c981c41d246aff3af44b1212 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 3 May 2020 21:43:40 +0800 Subject: [PATCH 0461/1093] Not hide the long version --- include/CppUTest/JUnitTestOutput.h | 1 + src/CppUTest/JUnitTestOutput.cpp | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/include/CppUTest/JUnitTestOutput.h b/include/CppUTest/JUnitTestOutput.h index 33c7c6ab2..1c4a0b0eb 100644 --- a/include/CppUTest/JUnitTestOutput.h +++ b/include/CppUTest/JUnitTestOutput.h @@ -50,6 +50,7 @@ class JUnitTestOutput: public TestOutput virtual void printBuffer(const char*) _override; virtual void print(const char*) _override; virtual void print(long) _override; + virtual void print(size_t) _override; virtual void printFailure(const TestFailure& failure) _override; virtual void flush() _override; diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index 1d39405a4..e85999144 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -290,6 +290,10 @@ void JUnitTestOutput::print(long) { } +void JUnitTestOutput::print(size_t) +{ +} + void JUnitTestOutput::flush() { } From f6272d64acf8bc9065f5b8e515d8921c286e3c06 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 4 May 2020 08:21:58 +0800 Subject: [PATCH 0462/1093] Missed another one --- tests/CppUTest/MemoryLeakWarningTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index 79da06c27..ed19a0b3f 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -486,7 +486,7 @@ TEST(MemoryLeakWarningThreadSafe, turnOnThreadSafeNewDeleteOverloads) { #undef new - int storedAmountOfLeaks = MemoryLeakWarningPlugin::getGlobalDetector()->totalMemoryLeaks(mem_leak_period_all); + size_t storedAmountOfLeaks = MemoryLeakWarningPlugin::getGlobalDetector()->totalMemoryLeaks(mem_leak_period_all); MemoryLeakWarningPlugin::turnOnThreadSafeNewDeleteOverloads(); int *n = new int; From 2aa9dc73638b03df78ca518508f389a13118ebc3 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 4 May 2020 09:03:31 +0800 Subject: [PATCH 0463/1093] IGNORE and EXPECT macros now don't crash when not having a memory leak plugin installed --- include/CppUTest/MemoryLeakWarningPlugin.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/CppUTest/MemoryLeakWarningPlugin.h b/include/CppUTest/MemoryLeakWarningPlugin.h index b826de032..ec3c824d9 100644 --- a/include/CppUTest/MemoryLeakWarningPlugin.h +++ b/include/CppUTest/MemoryLeakWarningPlugin.h @@ -31,8 +31,8 @@ #include "TestPlugin.h" #include "MemoryLeakDetectorNewMacros.h" -#define IGNORE_ALL_LEAKS_IN_TEST() MemoryLeakWarningPlugin::getFirstPlugin()->ignoreAllLeaksInTest() -#define EXPECT_N_LEAKS(n) MemoryLeakWarningPlugin::getFirstPlugin()->expectLeaksInTest(n) +#define IGNORE_ALL_LEAKS_IN_TEST() if (MemoryLeakWarningPlugin::getFirstPlugin()) MemoryLeakWarningPlugin::getFirstPlugin()->ignoreAllLeaksInTest() +#define EXPECT_N_LEAKS(n) if (MemoryLeakWarningPlugin::getFirstPlugin()) MemoryLeakWarningPlugin::getFirstPlugin()->expectLeaksInTest(n) extern void crash_on_allocation_number(unsigned alloc_number); From 05307762eaa7ef49251db79dcdf95775dccbe01c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 4 May 2020 09:17:07 +0800 Subject: [PATCH 0464/1093] One warning less --- tests/CppUTest/TestOutputTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/CppUTest/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp index c3d1a4a1c..034dae73e 100644 --- a/tests/CppUTest/TestOutputTest.cpp +++ b/tests/CppUTest/TestOutputTest.cpp @@ -315,9 +315,9 @@ class CompositeTestOutputTestStringBufferTestOutput : public StringBufferTestOut output += "flush"; } - virtual VerbosityLevel isVerbose() + virtual bool isVerbose() { - return verbose_; + return verbose_ == level_verbose || verbose_ == level_veryVerbose; } virtual bool isColor() From eecc64274bdca37fc47539aa7384a2218040b7fa Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 4 May 2020 13:22:50 +0800 Subject: [PATCH 0465/1093] Use windows in travis? --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index b3cf18b36..df85d7e0e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,11 @@ jobs: env: BUILD=autotools os: osx +# Windows + - compiler: gcc + os: windows + env: BUILD=autotools + # Linux - compiler: gcc env: BUILD=cmake CPP_STD=17 From 20c1fd7f8354bc250a0172dd7ee85220271f4f94 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 4 May 2020 13:30:56 +0800 Subject: [PATCH 0466/1093] Not use autotools on windows for now --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index df85d7e0e..68a83ad3f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,9 +35,9 @@ jobs: os: osx # Windows - - compiler: gcc + - compiler: clang os: windows - env: BUILD=autotools + env: BUILD=cmake # Linux - compiler: gcc From 4cd8d4e1ce9a12fbb681c5124c246f884aff0b6e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 4 May 2020 13:37:31 +0800 Subject: [PATCH 0467/1093] Install make to Choco --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 68a83ad3f..a09b166cc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,6 +36,7 @@ jobs: # Windows - compiler: clang + before_install: choco install make os: windows env: BUILD=cmake From 6dbe6692bc98e2b62d6a23f2ff7e582694179a47 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 4 May 2020 13:59:03 +0800 Subject: [PATCH 0468/1093] Getting more debug info out of travis? --- .travis.yml | 3 +-- scripts/travis_ci_build.sh | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a09b166cc..8765df923 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,9 +36,8 @@ jobs: # Windows - compiler: clang - before_install: choco install make os: windows - env: BUILD=cmake + env: BUILD=cmake_windows # Linux - compiler: gcc diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 658dae2a3..4ddbe5c53 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -147,3 +147,19 @@ if [ "x$BUILD" = "xautotools_dist" ]; then fi fi +if [ "x$BUILD" = "xcmake_windows" ]; then + pwd + ls + choco install make + BUILD_ARGS=("-DWERROR=ON") + + if [ -n "$CPP_STD" ]; then + BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=$CPP_STD") + fi + + cmake --version + cmake "${BUILD_ARGS[@]}" .. + make + ctest -V +fi + From 72727640342ee24631e97c5cf3df10004622c53f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 4 May 2020 14:06:31 +0800 Subject: [PATCH 0469/1093] Turn off windows, for now --- scripts/travis_ci_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 4ddbe5c53..1205856d3 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -159,7 +159,7 @@ if [ "x$BUILD" = "xcmake_windows" ]; then cmake --version cmake "${BUILD_ARGS[@]}" .. - make - ctest -V +# make +# ctest -V fi From f69a21e8174f0c28ae7947a8697cdc28b4216ac1 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 4 May 2020 14:11:44 +0800 Subject: [PATCH 0470/1093] Memory accountant reporting on different cache sizes --- include/CppUTest/SimpleString.h | 2 + include/CppUTest/TestMemoryAllocator.h | 20 +++- src/CppUTest/SimpleString.cpp | 11 +- src/CppUTest/TestMemoryAllocator.cpp | 108 ++++++++++++++--- tests/CppUTest/SimpleStringTest.cpp | 12 ++ tests/CppUTest/TestMemoryAllocatorTest.cpp | 131 +++++++++++++++++++++ 6 files changed, 265 insertions(+), 19 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 8572b40c7..76b7248b0 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -154,6 +154,8 @@ class GlobalSimpleStringMemoryAccountant GlobalSimpleStringMemoryAccountant(); ~GlobalSimpleStringMemoryAccountant(); + void useCacheSizes(size_t cacheSizes[], size_t length); + void start(); void stop(); SimpleString report(); diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index f11731e43..9eb84bb99 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -144,6 +144,8 @@ class MemoryAccountant public: MemoryAccountant(); + void useCacheSizes(size_t sizes[], size_t length); + void clear(); void alloc(size_t size); @@ -163,11 +165,22 @@ class MemoryAccountant MemoryAccountantAllocationNode* findOrCreateNodeOfSize(size_t size); MemoryAccountantAllocationNode* findNodeOfSize(size_t size) const; - MemoryAccountantAllocationNode* createNewAccountantAllocationNode(size_t size, MemoryAccountantAllocationNode* next); - void destroyAccountantAllocationNode(MemoryAccountantAllocationNode* node); + MemoryAccountantAllocationNode* createNewAccountantAllocationNode(size_t size, MemoryAccountantAllocationNode* next) const; + void destroyAccountantAllocationNode(MemoryAccountantAllocationNode* node) const; + + void createCacheSizeNodes(size_t sizes[], size_t length); MemoryAccountantAllocationNode* head_; TestMemoryAllocator* allocator_; + bool useCacheSizes_; + + SimpleString reportNoAllocations() const; + SimpleString reportTitle() const; + SimpleString reportTitleWithCacheSizes() const; + SimpleString reportHeader() const; + SimpleString reportFooter() const; + SimpleString stringSize(size_t size) const; + }; struct AccountingTestMemoryAllocatorMemoryNode; @@ -205,9 +218,12 @@ class GlobalMemoryAccountant GlobalMemoryAccountant(); ~GlobalMemoryAccountant(); + void useCacheSizes(size_t sizes[], size_t length); + void start(); void stop(); SimpleString report(); + SimpleString reportWithCacheSizes(size_t sizes[], size_t length); TestMemoryAllocator* getMallocAllocator(); TestMemoryAllocator* getNewAllocator(); diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 6ebdc29de..45241a497 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -51,8 +51,9 @@ SimpleStringInternalCache::SimpleStringInternalCache() } GlobalSimpleStringMemoryAccountant::GlobalSimpleStringMemoryAccountant() - : allocator_(NULLPTR), accountant_(NULLPTR) + : allocator_(NULLPTR) { + accountant_ = new MemoryAccountant(); } GlobalSimpleStringMemoryAccountant::~GlobalSimpleStringMemoryAccountant() @@ -69,12 +70,16 @@ void GlobalSimpleStringMemoryAccountant::restoreAllocator() SimpleString::setStringAllocator(allocator_->originalAllocator()); } +void GlobalSimpleStringMemoryAccountant::useCacheSizes(size_t cacheSizes[], size_t length) +{ + accountant_->useCacheSizes(cacheSizes, length); +} + void GlobalSimpleStringMemoryAccountant::start() { - if (accountant_ != NULLPTR) + if (allocator_ != NULLPTR) FAIL("Global SimpleString allocator start called twice!"); - accountant_ = new MemoryAccountant(); allocator_ = new AccountingTestMemoryAllocator(*accountant_, SimpleString::getStringAllocator()); SimpleString::setStringAllocator(allocator_); diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 09a1a2e35..ca3e13633 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -364,7 +364,7 @@ struct MemoryAccountantAllocationNode MemoryAccountantAllocationNode* next_; }; -MemoryAccountantAllocationNode* MemoryAccountant::createNewAccountantAllocationNode(size_t size, MemoryAccountantAllocationNode* next) +MemoryAccountantAllocationNode* MemoryAccountant::createNewAccountantAllocationNode(size_t size, MemoryAccountantAllocationNode* next) const { MemoryAccountantAllocationNode* node = (MemoryAccountantAllocationNode*) (void*) allocator_->alloc_memory(sizeof(MemoryAccountantAllocationNode), __FILE__, __LINE__); node->size_ = size; @@ -376,16 +376,43 @@ MemoryAccountantAllocationNode* MemoryAccountant::createNewAccountantAllocationN return node; } -void MemoryAccountant::destroyAccountantAllocationNode(MemoryAccountantAllocationNode* node) +void MemoryAccountant::destroyAccountantAllocationNode(MemoryAccountantAllocationNode* node) const { allocator_->free_memory((char*) node, __FILE__, __LINE__); } MemoryAccountant::MemoryAccountant() - : head_(NULLPTR), allocator_(defaultMallocAllocator()) + : head_(NULLPTR), allocator_(defaultMallocAllocator()), useCacheSizes_(false) { } +void MemoryAccountant::createCacheSizeNodes(size_t sizes[], size_t length) +{ + for (size_t i = 0; i < length; i++) + findOrCreateNodeOfSize(sizes[i]); + + if (head_ == NULLPTR) + head_ = createNewAccountantAllocationNode(0, NULLPTR); + else { + for (MemoryAccountantAllocationNode* lastNode = head_; lastNode; lastNode = lastNode->next_) { + if (lastNode->next_ == NULLPTR) { + lastNode->next_ = createNewAccountantAllocationNode(0, NULLPTR); + break; + } + } + } +} + + +void MemoryAccountant::useCacheSizes(size_t sizes[], size_t length) +{ + if (head_) + FAIL("MemoryAccountant: Cannot set cache sizes as allocations already occured!"); + + createCacheSizeNodes(sizes, length); + useCacheSizes_ = true; +} + void MemoryAccountant::setAllocator(TestMemoryAllocator* allocator) { allocator_ = allocator; @@ -404,14 +431,26 @@ void MemoryAccountant::clear() MemoryAccountantAllocationNode* MemoryAccountant::findNodeOfSize(size_t size) const { - for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) - if (node->size_ == size) - return node; + if (useCacheSizes_) { + for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) { + if (size > node->size_ && node->next_ == NULLPTR) + return node; + else if (size <= node->size_ && !(node->next_->size_ != 0 && node->next_->size_ <= size)) + return node; + } + } + else + for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) + if (node->size_ == size) + return node; return NULLPTR; } MemoryAccountantAllocationNode* MemoryAccountant::findOrCreateNodeOfSize(size_t size) { + if (useCacheSizes_) + return findNodeOfSize(size); + if (head_ && head_->size_ > size) head_ = createNewAccountantAllocationNode(size, head_); @@ -437,7 +476,8 @@ void MemoryAccountant::dealloc(size_t size) { MemoryAccountantAllocationNode* node = findOrCreateNodeOfSize(size); node->deallocations_++; - node->currentAllocations_--; + if (node->currentAllocations_) + node->currentAllocations_--; } size_t MemoryAccountant::totalAllocationsOfSize(size_t size) const @@ -484,18 +524,53 @@ size_t MemoryAccountant::totalDeallocations() const return totalDeallocations; } +SimpleString MemoryAccountant::reportNoAllocations() const +{ + return SimpleString("CppUTest Memory Accountant has not noticed any allocations or deallocations. Sorry\n"); +} + +SimpleString MemoryAccountant::reportTitle() const +{ + if (useCacheSizes_) + return "CppUTest Memory Accountant report (with cache sizes):\n"; + return "CppUTest Memory Accountant report:\n"; +} + +SimpleString MemoryAccountant::reportTitleWithCacheSizes() const +{ + return "CppUTest Memory Accountant report (for cache sizes):\n"; +} + +SimpleString MemoryAccountant::reportHeader() const +{ + if (useCacheSizes_) + return "Cache size # allocations # deallocations max # allocations at one time\n"; + return "Allocation size # allocations # deallocations max # allocations at one time\n"; +} + +#define MEMORY_ACCOUNTANT_ROW_FORMAT "%s %5d %5d %5d\n" + +SimpleString MemoryAccountant::reportFooter() const +{ + return SimpleString(" Thank you for your business\n"); +} + +SimpleString MemoryAccountant::stringSize(size_t size) const +{ + return (size == 0) ? "other" : StringFromFormat("%5d", (int) size); +} + SimpleString MemoryAccountant::report() const { if (head_ == NULLPTR) - return SimpleString("CppUTest Memory Accountant has not noticed any allocations or deallocations. Sorry\n"); + return reportNoAllocations(); + + SimpleString report = reportTitle() + reportHeader(); - SimpleString report("CppUTest Memory Accountant report:\n" - "Allocation size # allocations # deallocations max # allocations at one time\n"); for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) - report += StringFromFormat("%5d %5d %5d %5d\n", - (int) node->size_, (int) node->allocations_, (int) node->deallocations_, (int) node->maxAllocations_); - report += SimpleString(" Thank you for your business\n"); - return report; + report += StringFromFormat(MEMORY_ACCOUNTANT_ROW_FORMAT, stringSize(node->size_).asCharString(), (int) node->allocations_, (int) node->deallocations_, (int) node->maxAllocations_); + + return report + reportFooter(); } AccountingTestMemoryAllocator::AccountingTestMemoryAllocator(MemoryAccountant& accountant, TestMemoryAllocator* originalAllocator) @@ -604,6 +679,11 @@ GlobalMemoryAccountant::~GlobalMemoryAccountant() delete newArrayAllocator_; } +void GlobalMemoryAccountant::useCacheSizes(size_t sizes[], size_t length) +{ + accountant_.useCacheSizes(sizes, length); +} + void GlobalMemoryAccountant::start() { if (mallocAllocator_ != NULLPTR) diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index f1302f54e..e5d601e11 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -142,6 +142,18 @@ TEST(GlobalSimpleStringMemoryAccountant, report) STRCMP_CONTAINS(" 1 0 1", accountant.report().asCharString()); } +TEST(GlobalSimpleStringMemoryAccountant, reportUseCaches) +{ + size_t caches[] = {32}; + accountant.useCacheSizes(caches, 1); + SimpleString str; + accountant.start(); + str += "More"; + accountant.stop(); + STRCMP_CONTAINS("32 1 1 1", accountant.report().asCharString()); +} + + TEST_GROUP(SimpleString) { JustUseNewStringAllocator justNewForSimpleStringTestAllocator; diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 5afce421a..d7f111414 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -283,9 +283,34 @@ TEST(FailableMemoryAllocator, CheckAllFailingLocationAllocsWereDone) #endif #endif +class MemoryAccountantExecFunction + : public ExecFunction +{ +public: + virtual ~MemoryAccountantExecFunction() _destructor_override + { + } + + void (*testFunction_)(MemoryAccountant*); + MemoryAccountant* parameter_; + + virtual void exec() _override + { + testFunction_(parameter_); + } +}; + TEST_GROUP(TestMemoryAccountant) { MemoryAccountant accountant; + TestTestingFixture fixture; + MemoryAccountantExecFunction testFunction; + + void setup() + { + testFunction.parameter_ = &accountant; + fixture.setTestFunction(&testFunction); + } void teardown() { @@ -378,6 +403,98 @@ TEST(TestMemoryAccountant, reportAllocations) , accountant.report().asCharString()); } +TEST(TestMemoryAccountant, reportAllocationsWithSizeZero) +{ + accountant.dealloc(0); + + accountant.dealloc(4); + accountant.dealloc(4); + accountant.alloc(4); + + STRCMP_EQUAL("CppUTest Memory Accountant report:\n" + "Allocation size # allocations # deallocations max # allocations at one time\n" + "other 0 1 0\n" + " 4 1 2 1\n" + " Thank you for your business\n" + , accountant.report().asCharString()); +} + + +static void _failUseCacheSizesAfterAllocation(MemoryAccountant* accountant) +{ + size_t cacheSizes[] = {0}; + + accountant->alloc(4); + accountant->useCacheSizes(cacheSizes, 1); +} + +TEST(TestMemoryAccountant, withCacheSizesFailsWhenAlreadyAllocatedMemory) +{ + testFunction.testFunction_ = _failUseCacheSizesAfterAllocation; + + fixture.runAllTests(); + + fixture.assertPrintContains("MemoryAccountant: Cannot set cache sizes as allocations already occured!"); +} + +TEST(TestMemoryAccountant, reportWithCacheSizesEmpty) +{ + size_t cacheSizes[] = {0}; + + accountant.useCacheSizes(cacheSizes, 0); + accountant.alloc(4); + + STRCMP_EQUAL("CppUTest Memory Accountant report (with cache sizes):\n" + "Cache size # allocations # deallocations max # allocations at one time\n" + "other 1 0 1\n" + " Thank you for your business\n" + , accountant.report().asCharString()); +} + + +TEST(TestMemoryAccountant, reportWithCacheSizes) +{ + size_t cacheSizes[] = {4}; + + accountant.useCacheSizes(cacheSizes, 1); + accountant.dealloc(8); + accountant.dealloc(12); + accountant.dealloc(20); + + accountant.alloc(4); + accountant.dealloc(4); + accountant.alloc(4); + STRCMP_EQUAL("CppUTest Memory Accountant report (with cache sizes):\n" + "Cache size # allocations # deallocations max # allocations at one time\n" + " 4 2 1 1\n" + "other 0 3 0\n" + " Thank you for your business\n" + , accountant.report().asCharString()); +} + +TEST(TestMemoryAccountant, reportWithCacheSizesMultipleCaches) +{ + size_t cacheSizes[] = {4, 10, 20}; + + accountant.useCacheSizes(cacheSizes, 3); + accountant.alloc(8); + accountant.alloc(12); + accountant.alloc(20); + + accountant.alloc(4); + accountant.dealloc(4); + accountant.alloc(4); + STRCMP_EQUAL("CppUTest Memory Accountant report (with cache sizes):\n" + "Cache size # allocations # deallocations max # allocations at one time\n" + " 4 2 1 1\n" + " 10 1 0 1\n" + " 20 2 0 2\n" + "other 0 0 0\n" + " Thank you for your business\n" + , accountant.report().asCharString()); +} + + TEST_GROUP(AccountingTestMemoryAllocator) { MemoryAccountant accountant; @@ -521,6 +638,20 @@ TEST(GlobalMemoryAccountant, report) STRCMP_CONTAINS("1 1 1", accountant.report().asCharString()); } +TEST(GlobalMemoryAccountant, reportWithCacheSizes) +{ + size_t cacheSizes[] = {512}; + accountant.useCacheSizes(cacheSizes, 1); + accountant.start(); + char* memory = new char[185]; + delete [] memory; + accountant.stop(); + + /* Allocation includes memory leak info */ + STRCMP_CONTAINS("512 1 1 1", accountant.report().asCharString()); +} + + #endif static void _failStopWithoutStartingWillFail(GlobalMemoryAccountant* accountant) From 3b5cacc984469ef1b51278af7e41e9536b99d64e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 4 May 2020 15:55:04 +0800 Subject: [PATCH 0471/1093] Weird little MemoryLeakAllocator --- include/CppUTest/TestMemoryAllocator.h | 18 +++++++++ src/CppUTest/TestMemoryAllocator.cpp | 39 +++++++++++++++++++ tests/CppUTest/TestMemoryAllocatorTest.cpp | 45 ++++++++++++++++++++++ 3 files changed, 102 insertions(+) diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index 9eb84bb99..2f96da6d8 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -89,6 +89,24 @@ class TestMemoryAllocator bool hasBeenDestroyed_; }; +class MemoryLeakAllocator : public TestMemoryAllocator +{ +public: + MemoryLeakAllocator(TestMemoryAllocator* originalAllocator); + virtual ~MemoryLeakAllocator() _destructor_override; + + virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; + virtual void free_memory(char* memory, const char* file, size_t line) _override; + + virtual const char* name() const _override; + virtual const char* alloc_name() const _override; + virtual const char* free_name() const _override; + + virtual TestMemoryAllocator* actualAllocator() _override; +private: + TestMemoryAllocator* originalAllocator_; +}; + class CrashOnAllocationAllocator : public TestMemoryAllocator { unsigned allocationToCrashOn_; diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index ca3e13633..a90b83f00 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -188,6 +188,45 @@ TestMemoryAllocator* TestMemoryAllocator::actualAllocator() return this; } +MemoryLeakAllocator::MemoryLeakAllocator(TestMemoryAllocator* originalAllocator) + : originalAllocator_(originalAllocator) +{ +} + +MemoryLeakAllocator::~MemoryLeakAllocator() +{ +} + +char* MemoryLeakAllocator::alloc_memory(size_t size, const char* file, size_t line) +{ + return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(originalAllocator_, size, file, line); +} + +void MemoryLeakAllocator::free_memory(char* memory, const char* file, size_t line) +{ + MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(originalAllocator_, memory, file, line); +} + +const char* MemoryLeakAllocator::name() const +{ + return "MemoryLeakAllocator"; +} + +const char* MemoryLeakAllocator::alloc_name() const +{ + return originalAllocator_->alloc_name(); +} + +const char* MemoryLeakAllocator::free_name() const +{ + return originalAllocator_->free_name(); +} + +TestMemoryAllocator* MemoryLeakAllocator::actualAllocator() +{ + return originalAllocator_->actualAllocator(); +} + CrashOnAllocationAllocator::CrashOnAllocationAllocator() : allocationToCrashOn_(0) { } diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index d7f111414..69307da08 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -29,6 +29,7 @@ #include "CppUTest/TestMemoryAllocator.h" #include "CppUTest/PlatformSpecificFunctions.h" #include "CppUTest/TestTestingFixture.h" +#include "CppUTest/MemoryLeakDetector.h" TEST_GROUP(TestMemoryAllocatorTest) { @@ -144,6 +145,50 @@ TEST(TestMemoryAllocatorTest, TryingToAllocateTooMuchFailsTest) #endif +TEST_GROUP(MemoryLeakAllocator) +{ + MemoryLeakAllocator* allocator; + + void setup() + { + allocator = new MemoryLeakAllocator(defaultMallocAllocator()); + } + + void teardown() + { + delete allocator; + } +}; + +TEST(MemoryLeakAllocator, allocMemory) +{ + char* memory = allocator->alloc_memory(10, __FILE__, __LINE__); + memory[0] = 'B'; + MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(allocator->actualAllocator(), memory); + + /* No leaks or crashes */ +} + +TEST(MemoryLeakAllocator, freeMemory) +{ + char* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(allocator->actualAllocator(), 10); + allocator->free_memory(memory, __FILE__, __LINE__); + + /* No leaks or crashes */ +} + +TEST(MemoryLeakAllocator, originalAllocator) +{ + POINTERS_EQUAL(defaultMallocAllocator(), allocator->actualAllocator()); + STRCMP_EQUAL(defaultMallocAllocator()->alloc_name(), allocator->alloc_name()); + STRCMP_EQUAL(defaultMallocAllocator()->free_name(), allocator->free_name()); +} + +TEST(MemoryLeakAllocator, name) +{ + STRCMP_EQUAL("MemoryLeakAllocator", allocator->name()); +} + #if CPPUTEST_USE_MEM_LEAK_DETECTION #if CPPUTEST_USE_MALLOC_MACROS From aaedc501cdaeb94ad95244fe9f506accc6d4029e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 4 May 2020 16:32:44 +0800 Subject: [PATCH 0472/1093] Removed unused function --- include/CppUTest/TestMemoryAllocator.h | 1 - src/CppUTest/TestMemoryAllocator.cpp | 5 ----- 2 files changed, 6 deletions(-) diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index 2f96da6d8..6e8d4f739 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -194,7 +194,6 @@ class MemoryAccountant SimpleString reportNoAllocations() const; SimpleString reportTitle() const; - SimpleString reportTitleWithCacheSizes() const; SimpleString reportHeader() const; SimpleString reportFooter() const; SimpleString stringSize(size_t size) const; diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index a90b83f00..5139490aa 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -575,11 +575,6 @@ SimpleString MemoryAccountant::reportTitle() const return "CppUTest Memory Accountant report:\n"; } -SimpleString MemoryAccountant::reportTitleWithCacheSizes() const -{ - return "CppUTest Memory Accountant report (for cache sizes):\n"; -} - SimpleString MemoryAccountant::reportHeader() const { if (useCacheSizes_) From 10b5ae74f3f7e06101af839e70f38f022ed193a8 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 5 May 2020 18:15:17 +0800 Subject: [PATCH 0473/1093] Simple String internal cached (not yet used) --- include/CppUTest/SimpleString.h | 36 ++++- src/CppUTest/SimpleString.cpp | 203 ++++++++++++++++++++++++++-- tests/CppUTest/SimpleStringTest.cpp | 166 ++++++++++++++++++++++- 3 files changed, 379 insertions(+), 26 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 76b7248b0..b36948dc2 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -168,19 +168,47 @@ class GlobalSimpleStringMemoryAccountant MemoryAccountant* accountant_; }; +struct SimpleStringInternalCacheNode; +struct SimpleStringMemoryBlock; + class SimpleStringInternalCache { public: SimpleStringInternalCache(); + ~SimpleStringInternalCache(); + + void setAllocator(TestMemoryAllocator* allocator); char* alloc(size_t size); void dealloc(char* memory, size_t size); - void clear(); - size_t totalAvailableBlocks() const; + bool hasFreeBlocksOfSize(size_t size); + + void clearCache(); + void clearAllIncludingCurrentlyUsedMemory(); private: - size_t availableBlocks_; - char* cache_; + + enum { amountOfInternalCacheNodes = 5}; + bool isCached(size_t size); + size_t getIndexForCache(size_t size); + SimpleStringInternalCacheNode* getCacheNodeFromSize(size_t size); + + SimpleStringInternalCacheNode* createInternalCacheNodes(); + void destroyInternalCacheNode(SimpleStringInternalCacheNode * node); + SimpleStringMemoryBlock* createSimpleStringMemoryBlock(size_t sizeOfString, SimpleStringMemoryBlock* next); + void destroySimpleStringMemoryBlock(SimpleStringMemoryBlock * block); + void destroySimpleStringMemoryBlockList(SimpleStringMemoryBlock * block); + + SimpleStringMemoryBlock* reserveCachedBlockFrom(SimpleStringInternalCacheNode* node); + void releaseCachedBlockFrom(char* memory, SimpleStringInternalCacheNode* node); + void releaseNonCachedMemory(char* memory); + + SimpleStringMemoryBlock* allocateNewCacheBlockFrom(SimpleStringInternalCacheNode* node); + SimpleStringMemoryBlock* addToSimpleStringMemoryBlockList(SimpleStringMemoryBlock* newBlock, SimpleStringMemoryBlock* previousHead); + + TestMemoryAllocator* allocator_; + SimpleStringInternalCacheNode* cache_; + SimpleStringMemoryBlock* nonCachedAllocations_; }; SimpleString StringFrom(bool value); diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 45241a497..57578abe3 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -45,10 +45,6 @@ void GlobalSimpleStringAllocatorStash::restore() SimpleString::setStringAllocator(originalAllocator_); } -SimpleStringInternalCache::SimpleStringInternalCache() - : availableBlocks_(0), cache_(NULLPTR) -{ -} GlobalSimpleStringMemoryAccountant::GlobalSimpleStringMemoryAccountant() : allocator_(NULLPTR) @@ -106,29 +102,206 @@ AccountingTestMemoryAllocator* GlobalSimpleStringMemoryAccountant::getAllocator( return allocator_; } -size_t SimpleStringInternalCache::totalAvailableBlocks() const +struct SimpleStringMemoryBlock +{ + SimpleStringMemoryBlock* next_; + char* memory_; +}; + +struct SimpleStringInternalCacheNode +{ + size_t size_; + SimpleStringMemoryBlock* freeMemoryHead_; + SimpleStringMemoryBlock* usedMemoryHead_; +}; + +SimpleStringInternalCache::SimpleStringInternalCache() + : allocator_(defaultMallocAllocator()), cache_(NULLPTR), nonCachedAllocations_(NULLPTR) +{ + cache_ = createInternalCacheNodes(); +} + +SimpleStringInternalCache::~SimpleStringInternalCache() +{ + allocator_ = defaultMallocAllocator(); + destroyInternalCacheNode(cache_); +} + +void SimpleStringInternalCache::setAllocator(TestMemoryAllocator* allocator) +{ + allocator_ = allocator; +} + +SimpleStringInternalCacheNode* SimpleStringInternalCache::createInternalCacheNodes() +{ + SimpleStringInternalCacheNode* node = (SimpleStringInternalCacheNode*) (void*) allocator_->alloc_memory(sizeof(SimpleStringInternalCacheNode) * amountOfInternalCacheNodes, __FILE__, __LINE__); + + for (int i = 0; i < amountOfInternalCacheNodes; i++) { + node[i].freeMemoryHead_ = NULLPTR; + node[i].usedMemoryHead_ = NULLPTR; + } + node[0].size_ = 32; + node[1].size_ = 64; + node[2].size_ = 96; + node[3].size_ = 128; + node[4].size_ = 256; + return node; +} + +bool SimpleStringInternalCache::isCached(size_t size) +{ + return size <= 256; +} + +size_t SimpleStringInternalCache::getIndexForCache(size_t size) +{ + for (size_t i = 0; i < amountOfInternalCacheNodes; i++) + if (size <= cache_[i].size_) + return i; + return 0; +} + +SimpleStringInternalCacheNode* SimpleStringInternalCache::getCacheNodeFromSize(size_t size) +{ + size_t index = getIndexForCache(size); + return &cache_[index]; +} + +void SimpleStringInternalCache::destroyInternalCacheNode(SimpleStringInternalCacheNode * node) +{ + allocator_->free_memory((char*) node, __FILE__, __LINE__); +} + +SimpleStringMemoryBlock* SimpleStringInternalCache::createSimpleStringMemoryBlock(size_t size, SimpleStringMemoryBlock* next) +{ + SimpleStringMemoryBlock* block = (SimpleStringMemoryBlock*) (void*) allocator_->alloc_memory(sizeof(SimpleStringMemoryBlock) , __FILE__, __LINE__); + block->memory_ = allocator_->alloc_memory(size , __FILE__, __LINE__); + block->next_ = next; + return block; +} + +void SimpleStringInternalCache::destroySimpleStringMemoryBlock(SimpleStringMemoryBlock * block) +{ + allocator_->free_memory(block->memory_, __FILE__, __LINE__); + allocator_->free_memory((char*) block, __FILE__, __LINE__); +} + +void SimpleStringInternalCache::destroySimpleStringMemoryBlockList(SimpleStringMemoryBlock * block) +{ + SimpleStringMemoryBlock* current = block; + while (current) { + SimpleStringMemoryBlock* next = current->next_; + destroySimpleStringMemoryBlock(current); + current = next; + } +} + +SimpleStringMemoryBlock* SimpleStringInternalCache::addToSimpleStringMemoryBlockList(SimpleStringMemoryBlock* newBlock, SimpleStringMemoryBlock* previousHead) +{ + newBlock->next_ = previousHead; + return newBlock; +} + +bool SimpleStringInternalCache::hasFreeBlocksOfSize(size_t size) +{ + if (isCached(size)) + return getCacheNodeFromSize(size)->freeMemoryHead_ != NULLPTR; + return false; +} + +SimpleStringMemoryBlock* SimpleStringInternalCache::reserveCachedBlockFrom(SimpleStringInternalCacheNode* node) +{ + SimpleStringMemoryBlock* block = node->freeMemoryHead_; + node->freeMemoryHead_ = block->next_; + node->usedMemoryHead_ = addToSimpleStringMemoryBlockList(block, node->usedMemoryHead_); + return block; +} + +SimpleStringMemoryBlock* SimpleStringInternalCache::allocateNewCacheBlockFrom(SimpleStringInternalCacheNode* node) { - return availableBlocks_; + SimpleStringMemoryBlock* block = createSimpleStringMemoryBlock(node->size_, node->usedMemoryHead_); + node->usedMemoryHead_ = addToSimpleStringMemoryBlockList(block, node->usedMemoryHead_); + return block; +} + +void SimpleStringInternalCache::releaseCachedBlockFrom(char* memory, SimpleStringInternalCacheNode* node) +{ + if (node->usedMemoryHead_ && node->usedMemoryHead_->memory_ == memory) { + SimpleStringMemoryBlock* block = node->usedMemoryHead_; + node->usedMemoryHead_ = node->usedMemoryHead_->next_; + node->freeMemoryHead_ = addToSimpleStringMemoryBlockList(block, node->freeMemoryHead_); + return; + } + + for (SimpleStringMemoryBlock* block = node->usedMemoryHead_; block; block = block->next_) { + if (block->next_ && block->next_->memory_ == memory) { + SimpleStringMemoryBlock* blockToFree = block->next_; + block->next_ = block->next_->next_; + node->freeMemoryHead_ = addToSimpleStringMemoryBlockList(blockToFree, node->freeMemoryHead_); + } + } +} + +void SimpleStringInternalCache::releaseNonCachedMemory(char* memory) +{ + if (nonCachedAllocations_ && nonCachedAllocations_->memory_ == memory) { + SimpleStringMemoryBlock* block = nonCachedAllocations_; + nonCachedAllocations_ = block->next_; + destroySimpleStringMemoryBlock(block); + return; + } + + for (SimpleStringMemoryBlock* block = nonCachedAllocations_; block; block = block->next_) { + if (block->next_ && block->next_->memory_ == memory) { + SimpleStringMemoryBlock* blockToFree = block->next_; + block->next_ = block->next_->next_; + destroySimpleStringMemoryBlock(blockToFree); + } + } } char* SimpleStringInternalCache::alloc(size_t size) { - if (cache_) - return cache_; - return new char[size]; + if (isCached(size)) { + if (hasFreeBlocksOfSize(size)) + return reserveCachedBlockFrom(getCacheNodeFromSize(size))->memory_; + else + return allocateNewCacheBlockFrom(getCacheNodeFromSize(size))->memory_; + } + + nonCachedAllocations_ = createSimpleStringMemoryBlock(size, nonCachedAllocations_); + return nonCachedAllocations_->memory_; } -void SimpleStringInternalCache::dealloc(char* memory, size_t) +void SimpleStringInternalCache::dealloc(char* memory, size_t size) { - if (cache_ == NULLPTR) { - cache_ = memory; - availableBlocks_++; + if (isCached(size)) { + size_t index = getIndexForCache(size); + SimpleStringInternalCacheNode* cacheNode = &cache_[index]; + releaseCachedBlockFrom(memory, cacheNode); + return; } + releaseNonCachedMemory(memory); } -void SimpleStringInternalCache::clear() +void SimpleStringInternalCache::clearCache() { - delete [] cache_; + for (size_t i = 0; i < amountOfInternalCacheNodes; i++) { + destroySimpleStringMemoryBlockList(cache_[i].freeMemoryHead_); + cache_[i].freeMemoryHead_ = NULLPTR; + } +} + +void SimpleStringInternalCache::clearAllIncludingCurrentlyUsedMemory() +{ + for (size_t i = 0; i < amountOfInternalCacheNodes; i++) { + destroySimpleStringMemoryBlockList(cache_[i].freeMemoryHead_); + destroySimpleStringMemoryBlockList(cache_[i].usedMemoryHead_); + cache_[i].freeMemoryHead_ = NULLPTR; + cache_[i].usedMemoryHead_ = NULLPTR; + } + destroySimpleStringMemoryBlockList(nonCachedAllocations_); + nonCachedAllocations_ = NULLPTR; } TestMemoryAllocator* SimpleString::stringAllocator_ = NULLPTR; diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index e5d601e11..bfbb2da09 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -1268,34 +1268,186 @@ TEST(SimpleString, BracketsFormattedHexStringFromForULongLong) TEST_GROUP(SimpleStringInternalCache) { SimpleStringInternalCache cache; + MemoryAccountant accountant; + MemoryLeakAllocator* defaultAllocator; + AccountingTestMemoryAllocator* allocator; + + void setup() + { + defaultAllocator = new MemoryLeakAllocator(defaultMallocAllocator()); + allocator = new AccountingTestMemoryAllocator(accountant, defaultAllocator); + cache.setAllocator(defaultAllocator); + } void teardown() { - cache.clear(); + cache.clearAllIncludingCurrentlyUsedMemory(); + delete allocator; + delete defaultAllocator; + } + + void createCacheForSize(size_t size, size_t amount) + { + for (size_t i = 0; i < amount; i++) { + char* memory = cache.alloc(size); + cache.dealloc(memory, size); + } } }; -TEST(SimpleStringInternalCache, noAllocationWillLeaveTheCacheEmpty) +TEST(SimpleStringInternalCache, cacheHitWithOneEntry) { - LONGS_EQUAL(0, cache.totalAvailableBlocks()); + createCacheForSize(10, 1); + cache.setAllocator(allocator); + + char* mem = cache.alloc(10); + mem[0] = 'B'; + mem[3] = 'A'; + mem[9] = 'S'; + + cache.setAllocator(allocator->originalAllocator()); + + LONGS_EQUAL(0, accountant.totalAllocationsOfSize(10)); + CHECK(!cache.hasFreeBlocksOfSize(10)); + + cache.setAllocator(allocator); } -TEST(SimpleStringInternalCache, allocationAndFreeWillCreateAvailabelBlocks) +TEST(SimpleStringInternalCache, cacheHitWithTwoEntries) { + createCacheForSize(10, 2); + cache.setAllocator(allocator); + char* mem = cache.alloc(10); - cache.dealloc(mem, 10); - LONGS_EQUAL(1, cache.totalAvailableBlocks()); + mem = cache.alloc(10); + + cache.setAllocator(allocator->originalAllocator()); + + LONGS_EQUAL(0, accountant.totalAllocationsOfSize(10)); + CHECK(!cache.hasFreeBlocksOfSize(10)); + + cache.setAllocator(allocator); } +TEST(SimpleStringInternalCache, allocatingMoreThanCacheAvailable) +{ + createCacheForSize(10, 1); + cache.setAllocator(allocator); + + char* mem = cache.alloc(10); + mem = cache.alloc(10); + + cache.setAllocator(allocator->originalAllocator()); + + LONGS_EQUAL(1, accountant.totalAllocationsOfSize(32)); + CHECK(!cache.hasFreeBlocksOfSize(10)); + + cache.setAllocator(allocator); +} + + TEST(SimpleStringInternalCache, allocationWillReuseTheAllocatedBlocks) { + cache.setAllocator(allocator); + char* mem = cache.alloc(10); cache.dealloc(mem, 10); mem = cache.alloc(10); cache.dealloc(mem, 10); - LONGS_EQUAL(1, cache.totalAvailableBlocks()); + LONGS_EQUAL(1, accountant.totalAllocationsOfSize(32)); } +TEST(SimpleStringInternalCache, multipleDifferentSizeAllocationsAndDeallocations) +{ + cache.setAllocator(allocator); + + char* mem10 = cache.alloc(10); + char* mem11 = cache.alloc(11); + + char* mem100 = cache.alloc(100); + cache.dealloc(mem100, 100); + + char* mem101 = cache.alloc(101); + char* mem102 = cache.alloc(102); + char* mem103 = cache.alloc(103); + cache.dealloc(mem101, 102); + cache.dealloc(mem102, 103); + cache.dealloc(mem103, 104); + + cache.alloc(105); + cache.alloc(106); + cache.alloc(107); + + cache.dealloc(mem10, 10); + cache.dealloc(mem11, 11); + + LONGS_EQUAL(2, accountant.totalAllocationsOfSize(32)); + LONGS_EQUAL(3, accountant.totalAllocationsOfSize(128)); +} + +TEST(SimpleStringInternalCache, deallocOfCachedMemoryWillNotDealloc) +{ + cache.setAllocator(allocator); + + char* mem = cache.alloc(10); + cache.dealloc(mem, 10); + + LONGS_EQUAL(0, accountant.totalDeallocationsOfSize(32)); +} + +TEST(SimpleStringInternalCache, clearCacheWillRemoveAllCachedMemoryButNotAllUsedMemory) +{ + cache.setAllocator(allocator); + + char* mem = cache.alloc(10); + cache.dealloc(mem, 10); + + mem = cache.alloc(60); + + cache.clearCache(); + + LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(32)); + LONGS_EQUAL(0, accountant.totalDeallocationsOfSize(64)); +} + +TEST(SimpleStringInternalCache, clearAllIncludingCurrentlyUsedMemory) +{ + cache.setAllocator(allocator); + + cache.alloc(60); + + cache.clearAllIncludingCurrentlyUsedMemory(); + + LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(64)); +} + + + +TEST(SimpleStringInternalCache, allocatingLargerStringThanCached) +{ + cache.setAllocator(allocator); + + char* mem = cache.alloc(1234); + cache.dealloc(mem, 1234); + + LONGS_EQUAL(1, accountant.totalAllocationsOfSize(1234)); + LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(1234)); +} + +TEST(SimpleStringInternalCache, clearAllIncludingCurrentlyUsedMemoryAlsoReleasesLargeNonCachesMemory) +{ + cache.setAllocator(allocator); + + cache.alloc(1234); + cache.alloc(1234); + cache.alloc(1234); + + cache.clearAllIncludingCurrentlyUsedMemory(); + + LONGS_EQUAL(3, accountant.totalAllocationsOfSize(1234)); + LONGS_EQUAL(3, accountant.totalDeallocationsOfSize(1234)); +} + From f92ddfe68cc348882dc12ff53a24fa1a35eca51e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 5 May 2020 19:19:03 +0800 Subject: [PATCH 0474/1093] Removed a warning of unused variable by removing the variable --- tests/CppUTest/SimpleStringTest.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index bfbb2da09..f45d9977b 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -1318,8 +1318,8 @@ TEST(SimpleStringInternalCache, cacheHitWithTwoEntries) createCacheForSize(10, 2); cache.setAllocator(allocator); - char* mem = cache.alloc(10); - mem = cache.alloc(10); + cache.alloc(10); + cache.alloc(10); cache.setAllocator(allocator->originalAllocator()); @@ -1334,8 +1334,8 @@ TEST(SimpleStringInternalCache, allocatingMoreThanCacheAvailable) createCacheForSize(10, 1); cache.setAllocator(allocator); - char* mem = cache.alloc(10); - mem = cache.alloc(10); + cache.alloc(10); + cache.alloc(10); cache.setAllocator(allocator->originalAllocator()); From a3736b1ebfe43a219a085c888e8019a0d8290ca8 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 6 May 2020 08:15:29 +0800 Subject: [PATCH 0475/1093] Missing test and simplified code --- src/CppUTest/SimpleString.cpp | 6 ++---- tests/CppUTest/SimpleStringTest.cpp | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 57578abe3..0d6507219 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -158,7 +158,7 @@ size_t SimpleStringInternalCache::getIndexForCache(size_t size) for (size_t i = 0; i < amountOfInternalCacheNodes; i++) if (size <= cache_[i].size_) return i; - return 0; + return 0; // LCOV_EXCL_LINE } SimpleStringInternalCacheNode* SimpleStringInternalCache::getCacheNodeFromSize(size_t size) @@ -204,9 +204,7 @@ SimpleStringMemoryBlock* SimpleStringInternalCache::addToSimpleStringMemoryBlock bool SimpleStringInternalCache::hasFreeBlocksOfSize(size_t size) { - if (isCached(size)) - return getCacheNodeFromSize(size)->freeMemoryHead_ != NULLPTR; - return false; + return getCacheNodeFromSize(size)->freeMemoryHead_ != NULLPTR; } SimpleStringMemoryBlock* SimpleStringInternalCache::reserveCachedBlockFrom(SimpleStringInternalCacheNode* node) diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index f45d9977b..77595c673 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -1436,6 +1436,23 @@ TEST(SimpleStringInternalCache, allocatingLargerStringThanCached) LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(1234)); } +TEST(SimpleStringInternalCache, allocatingMultipleLargerStringThanCached) +{ + cache.setAllocator(allocator); + + char* mem = cache.alloc(1234); + char* mem2 = cache.alloc(1234); + char* mem3 = cache.alloc(1234); + + cache.dealloc(mem2, 1234); + cache.dealloc(mem, 1234); + cache.dealloc(mem3, 1234); + + LONGS_EQUAL(3, accountant.totalAllocationsOfSize(1234)); + LONGS_EQUAL(3, accountant.totalDeallocationsOfSize(1234)); +} + + TEST(SimpleStringInternalCache, clearAllIncludingCurrentlyUsedMemoryAlsoReleasesLargeNonCachesMemory) { cache.setAllocator(allocator); From 89908a601307b3aab9da5da4dfab8a773bc837d6 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 6 May 2020 10:54:41 +0800 Subject: [PATCH 0476/1093] StringCacheAllocator --- include/CppUTest/TestMemoryAllocator.h | 22 ++++++++++ include/CppUTest/TestTestingFixture.h | 2 + src/CppUTest/TestMemoryAllocator.cpp | 48 +++++++++++++++++++++- src/CppUTest/TestTestingFixture.cpp | 12 ++++-- tests/CppUTest/TestMemoryAllocatorTest.cpp | 48 ++++++++++++++++++++++ 5 files changed, 127 insertions(+), 5 deletions(-) diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index 6e8d4f739..2b9d7a74c 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -68,6 +68,7 @@ class TestMemoryAllocator virtual char* alloc_memory(size_t size, const char* file, size_t line); virtual void free_memory(char* memory, const char* file, size_t line); + virtual void free_memory(char* memory, size_t size, const char* file, size_t line); virtual const char* name() const; virtual const char* alloc_name() const; @@ -256,5 +257,26 @@ class GlobalMemoryAccountant AccountingTestMemoryAllocator* newArrayAllocator_; }; +class SimpleStringInternalCache; + +class SimpleStringCacheAllocator : public TestMemoryAllocator +{ +public: + SimpleStringCacheAllocator(SimpleStringInternalCache& cache, TestMemoryAllocator* previousAllocator); + virtual ~SimpleStringCacheAllocator() _destructor_override; + + virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; + virtual void free_memory(char* memory, size_t size, const char* file, size_t line) _override; + + virtual const char* name() const _override; + virtual const char* alloc_name() const _override; + virtual const char* free_name() const _override; + + virtual TestMemoryAllocator* actualAllocator() _override; +private: + SimpleStringInternalCache& cache_; + TestMemoryAllocator* originalAllocator_; +}; + #endif diff --git a/include/CppUTest/TestTestingFixture.h b/include/CppUTest/TestTestingFixture.h index f48ce2f08..17d12d0cb 100644 --- a/include/CppUTest/TestTestingFixture.h +++ b/include/CppUTest/TestTestingFixture.h @@ -69,6 +69,8 @@ class TestTestingFixture static void lineExecutedAfterCheck(); private: + void clearExecFunction(); + static bool lineOfCodeExecutedAfterCheck; TestRegistry* registry_; diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 5139490aa..e9fab30dd 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -164,10 +164,16 @@ char* TestMemoryAllocator::alloc_memory(size_t size, const char*, size_t) return checkedMalloc(size); } -void TestMemoryAllocator::free_memory(char* memory, const char*, size_t) +void TestMemoryAllocator::free_memory(char* memory, const char* file, size_t line) +{ + free_memory(memory, 0, file, line); +} + +void TestMemoryAllocator::free_memory(char* memory, size_t, const char*, size_t) { PlatformSpecificFree(memory); } + const char* TestMemoryAllocator::name() const { return name_; @@ -783,4 +789,44 @@ TestMemoryAllocator* GlobalMemoryAccountant::getNewArrayAllocator() return newArrayAllocator_; } +SimpleStringCacheAllocator::SimpleStringCacheAllocator(SimpleStringInternalCache& cache, TestMemoryAllocator* originalAllocator) + : cache_(cache), originalAllocator_(originalAllocator) +{ + cache_.setAllocator(originalAllocator); +} + +SimpleStringCacheAllocator::~SimpleStringCacheAllocator() +{ + cache_.setAllocator(NULLPTR); +} + +char* SimpleStringCacheAllocator::alloc_memory(size_t size, const char*, size_t) +{ + return cache_.alloc(size); +} + +void SimpleStringCacheAllocator::free_memory(char* memory, size_t size, const char*, size_t) +{ + cache_.dealloc(memory, size); +} + +const char* SimpleStringCacheAllocator::name() const +{ + return "SimpleStringCacheAllocator"; +} + +const char* SimpleStringCacheAllocator::alloc_name() const +{ + return originalAllocator_->alloc_name(); +} + +const char* SimpleStringCacheAllocator::free_name() const +{ + return originalAllocator_->free_name(); +} + +TestMemoryAllocator* SimpleStringCacheAllocator::actualAllocator() +{ + return originalAllocator_->actualAllocator(); +} diff --git a/src/CppUTest/TestTestingFixture.cpp b/src/CppUTest/TestTestingFixture.cpp index 0fe79f5ad..133e9583c 100644 --- a/src/CppUTest/TestTestingFixture.cpp +++ b/src/CppUTest/TestTestingFixture.cpp @@ -54,14 +54,19 @@ void TestTestingFixture::flushOutputAndResetResult() TestTestingFixture::~TestTestingFixture() { registry_->setCurrentRegistry(NULLPTR); - if (ownsExecFunction_) - delete genTest_->testFunction_; + clearExecFunction(); delete registry_; delete result_; delete output_; delete genTest_; } +void TestTestingFixture::clearExecFunction() +{ + if (genTest_->testFunction_ && ownsExecFunction_) + delete genTest_->testFunction_; +} + void TestTestingFixture::addTest(UtestShell * test) { registry_->addTest(test); @@ -69,8 +74,7 @@ void TestTestingFixture::addTest(UtestShell * test) void TestTestingFixture::setTestFunction(void(*testFunction)()) { - if (genTest_->testFunction_ && ownsExecFunction_) - delete genTest_->testFunction_; + clearExecFunction(); genTest_->testFunction_ = new ExecFunctionWithoutParameters(testFunction); ownsExecFunction_ = true; diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 69307da08..f8bc074fb 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -768,3 +768,51 @@ TEST(GlobalMemoryAccountant, checkWhetherNewArrayAllocatorIsNotChanged) fixture.assertPrintContains("GlobalMemoryAccountant: New Array memory allocator has been changed while accounting for memory"); } +TEST_GROUP(SimpleStringCacheAllocator) +{ + SimpleStringCacheAllocator* allocator; + SimpleStringInternalCache cache; + MemoryAccountant accountant; + AccountingTestMemoryAllocator* accountingAllocator; + + void setup() + { + accountingAllocator = new AccountingTestMemoryAllocator(accountant, defaultMallocAllocator()); + allocator = new SimpleStringCacheAllocator(cache, accountingAllocator); + } + + void teardown() + { + delete allocator; + delete accountingAllocator; + } +}; + +TEST(SimpleStringCacheAllocator, allocationIsCached) +{ + char* mem = allocator->alloc_memory(10, __FILE__, __LINE__); + allocator->free_memory(mem, 10, __FILE__, __LINE__); + + size_t totalAllocations = accountant.totalAllocations(); + size_t totalDeallocations = accountant.totalDeallocations(); + + mem = allocator->alloc_memory(10, __FILE__, __LINE__); + allocator->free_memory(mem, 10, __FILE__, __LINE__); + + LONGS_EQUAL(totalAllocations, accountant.totalAllocations()); + LONGS_EQUAL(totalDeallocations, accountant.totalDeallocations()); +} + +TEST(SimpleStringCacheAllocator, originalAllocator) +{ + POINTERS_EQUAL(defaultMallocAllocator(), allocator->actualAllocator()); + STRCMP_EQUAL(defaultMallocAllocator()->alloc_name(), allocator->alloc_name()); + STRCMP_EQUAL(defaultMallocAllocator()->free_name(), allocator->free_name()); +} + +TEST(SimpleStringCacheAllocator, name) +{ + STRCMP_EQUAL("SimpleStringCacheAllocator", allocator->name()); +} + + From 7afd64462b011b1801503b7fdaca77c0eeb749f9 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 6 May 2020 13:54:27 +0800 Subject: [PATCH 0477/1093] Refactored SimpleString and used the size for deallocation of memory --- include/CppUTest/SimpleString.h | 23 +- include/CppUTest/TestMemoryAllocator.h | 7 +- include/CppUTestExt/MemoryReportAllocator.h | 2 +- src/CppUTest/MemoryLeakDetector.cpp | 2 +- src/CppUTest/SimpleString.cpp | 198 +++++++++++------- src/CppUTest/TestMemoryAllocator.cpp | 25 +-- src/CppUTestExt/CodeMemoryReportFormatter.cpp | 2 +- src/CppUTestExt/MemoryReportAllocator.cpp | 4 +- tests/CppUTest/MemoryLeakDetectorTest.cpp | 10 +- tests/CppUTest/SimpleStringTest.cpp | 6 +- tests/CppUTest/TestMemoryAllocatorTest.cpp | 24 +-- .../CppUTestExt/MemoryReporterPluginTest.cpp | 8 +- 12 files changed, 188 insertions(+), 123 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index b36948dc2..d6a93b039 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -102,14 +102,27 @@ class SimpleString static char ToLower(char ch); static int MemCmp(const void* s1, const void *s2, size_t n); static char* allocStringBuffer(size_t size, const char* file, size_t line); - static void deallocStringBuffer(char* str, const char* file, size_t line); + static void deallocStringBuffer(char* str, size_t size, const char* file, size_t line); private: + + const char* getBuffer() const; + + void deallocateInternalBuffer(); + void setInternalBufferAsEmptyString(); + void setInternalBufferToNewBuffer(size_t size); + void setInternalBufferTo(char* buffer, size_t size); + void copyBufferToNewInternalBuffer(const char* otherBuffer); + void copyBufferToNewInternalBuffer(const char* otherBuffer, size_t size); + void copyBufferToNewInternalBuffer(const SimpleString& otherBuffer); + char *buffer_; + size_t bufferSize_; static TestMemoryAllocator* stringAllocator_; char* getEmptyString() const; - static char* copyToNewBuffer(const char* bufferToCopy, size_t bufferSize=0); + static char* copyToNewBuffer(const char* bufferToCopy); + static char* copyToNewBuffer(const char* bufferToCopy, size_t bufferSize); static bool isDigit(char ch); static bool isSpace(char ch); static bool isUpper(char ch); @@ -196,12 +209,12 @@ class SimpleStringInternalCache SimpleStringInternalCacheNode* createInternalCacheNodes(); void destroyInternalCacheNode(SimpleStringInternalCacheNode * node); SimpleStringMemoryBlock* createSimpleStringMemoryBlock(size_t sizeOfString, SimpleStringMemoryBlock* next); - void destroySimpleStringMemoryBlock(SimpleStringMemoryBlock * block); - void destroySimpleStringMemoryBlockList(SimpleStringMemoryBlock * block); + void destroySimpleStringMemoryBlock(SimpleStringMemoryBlock * block, size_t size); + void destroySimpleStringMemoryBlockList(SimpleStringMemoryBlock * block, size_t size); SimpleStringMemoryBlock* reserveCachedBlockFrom(SimpleStringInternalCacheNode* node); void releaseCachedBlockFrom(char* memory, SimpleStringInternalCacheNode* node); - void releaseNonCachedMemory(char* memory); + void releaseNonCachedMemory(char* memory, size_t size); SimpleStringMemoryBlock* allocateNewCacheBlockFrom(SimpleStringInternalCacheNode* node); SimpleStringMemoryBlock* addToSimpleStringMemoryBlockList(SimpleStringMemoryBlock* newBlock, SimpleStringMemoryBlock* previousHead); diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index 2b9d7a74c..7597f4df5 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -67,7 +67,6 @@ class TestMemoryAllocator bool hasBeenDestroyed(); virtual char* alloc_memory(size_t size, const char* file, size_t line); - virtual void free_memory(char* memory, const char* file, size_t line); virtual void free_memory(char* memory, size_t size, const char* file, size_t line); virtual const char* name() const; @@ -97,7 +96,7 @@ class MemoryLeakAllocator : public TestMemoryAllocator virtual ~MemoryLeakAllocator() _destructor_override; virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; - virtual void free_memory(char* memory, const char* file, size_t line) _override; + virtual void free_memory(char* memory, size_t size, const char* file, size_t line) _override; virtual const char* name() const _override; virtual const char* alloc_name() const _override; @@ -128,7 +127,7 @@ class NullUnknownAllocator: public TestMemoryAllocator virtual ~NullUnknownAllocator() _destructor_override; virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; - virtual void free_memory(char* memory, const char* file, size_t line) _override; + virtual void free_memory(char* memory, size_t size, const char* file, size_t line) _override; static TestMemoryAllocator* defaultAllocator(); }; @@ -210,7 +209,7 @@ class AccountingTestMemoryAllocator : public TestMemoryAllocator virtual ~AccountingTestMemoryAllocator() _destructor_override; virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; - virtual void free_memory(char* memory, const char* file, size_t line) _override; + virtual void free_memory(char* memory, size_t size, const char* file, size_t line) _override; virtual TestMemoryAllocator* actualAllocator() _override; TestMemoryAllocator* originalAllocator(); diff --git a/include/CppUTestExt/MemoryReportAllocator.h b/include/CppUTestExt/MemoryReportAllocator.h index e42e848df..becdb4ac4 100644 --- a/include/CppUTestExt/MemoryReportAllocator.h +++ b/include/CppUTestExt/MemoryReportAllocator.h @@ -49,7 +49,7 @@ class MemoryReportAllocator : public TestMemoryAllocator virtual TestMemoryAllocator* getRealAllocator(); virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; - virtual void free_memory(char* memory, const char* file, size_t line) _override; + virtual void free_memory(char* memory, size_t size, const char* file, size_t line) _override; virtual const char* name() const _override; virtual const char* alloc_name() const _override; diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index f7e089eac..9b0f39361 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -682,7 +682,7 @@ void MemoryLeakDetector::deallocMemory(TestMemoryAllocator* allocator, void* mem #endif if (!allocator->hasBeenDestroyed()) { checkForCorruption(node, file, line, allocator, allocatNodesSeperately); - allocator->free_memory((char*) memory, file, line); + allocator->free_memory((char*) memory, node->size_, file, line); } } diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 0d6507219..d91f0610d 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -169,7 +169,7 @@ SimpleStringInternalCacheNode* SimpleStringInternalCache::getCacheNodeFromSize(s void SimpleStringInternalCache::destroyInternalCacheNode(SimpleStringInternalCacheNode * node) { - allocator_->free_memory((char*) node, __FILE__, __LINE__); + allocator_->free_memory((char*) node, sizeof(SimpleStringInternalCacheNode) * amountOfInternalCacheNodes, __FILE__, __LINE__); } SimpleStringMemoryBlock* SimpleStringInternalCache::createSimpleStringMemoryBlock(size_t size, SimpleStringMemoryBlock* next) @@ -180,18 +180,18 @@ SimpleStringMemoryBlock* SimpleStringInternalCache::createSimpleStringMemoryBloc return block; } -void SimpleStringInternalCache::destroySimpleStringMemoryBlock(SimpleStringMemoryBlock * block) +void SimpleStringInternalCache::destroySimpleStringMemoryBlock(SimpleStringMemoryBlock * block, size_t size) { - allocator_->free_memory(block->memory_, __FILE__, __LINE__); - allocator_->free_memory((char*) block, __FILE__, __LINE__); + allocator_->free_memory(block->memory_, size, __FILE__, __LINE__); + allocator_->free_memory((char*) block, sizeof(SimpleStringMemoryBlock), __FILE__, __LINE__); } -void SimpleStringInternalCache::destroySimpleStringMemoryBlockList(SimpleStringMemoryBlock * block) +void SimpleStringInternalCache::destroySimpleStringMemoryBlockList(SimpleStringMemoryBlock * block, size_t size) { SimpleStringMemoryBlock* current = block; while (current) { SimpleStringMemoryBlock* next = current->next_; - destroySimpleStringMemoryBlock(current); + destroySimpleStringMemoryBlock(current, size); current = next; } } @@ -240,12 +240,12 @@ void SimpleStringInternalCache::releaseCachedBlockFrom(char* memory, SimpleStrin } } -void SimpleStringInternalCache::releaseNonCachedMemory(char* memory) +void SimpleStringInternalCache::releaseNonCachedMemory(char* memory, size_t size) { if (nonCachedAllocations_ && nonCachedAllocations_->memory_ == memory) { SimpleStringMemoryBlock* block = nonCachedAllocations_; nonCachedAllocations_ = block->next_; - destroySimpleStringMemoryBlock(block); + destroySimpleStringMemoryBlock(block, size); return; } @@ -253,7 +253,7 @@ void SimpleStringInternalCache::releaseNonCachedMemory(char* memory) if (block->next_ && block->next_->memory_ == memory) { SimpleStringMemoryBlock* blockToFree = block->next_; block->next_ = block->next_->next_; - destroySimpleStringMemoryBlock(blockToFree); + destroySimpleStringMemoryBlock(blockToFree, size); } } } @@ -279,13 +279,13 @@ void SimpleStringInternalCache::dealloc(char* memory, size_t size) releaseCachedBlockFrom(memory, cacheNode); return; } - releaseNonCachedMemory(memory); + releaseNonCachedMemory(memory, size); } void SimpleStringInternalCache::clearCache() { for (size_t i = 0; i < amountOfInternalCacheNodes; i++) { - destroySimpleStringMemoryBlockList(cache_[i].freeMemoryHead_); + destroySimpleStringMemoryBlockList(cache_[i].freeMemoryHead_, cache_[i].size_); cache_[i].freeMemoryHead_ = NULLPTR; } } @@ -293,12 +293,12 @@ void SimpleStringInternalCache::clearCache() void SimpleStringInternalCache::clearAllIncludingCurrentlyUsedMemory() { for (size_t i = 0; i < amountOfInternalCacheNodes; i++) { - destroySimpleStringMemoryBlockList(cache_[i].freeMemoryHead_); - destroySimpleStringMemoryBlockList(cache_[i].usedMemoryHead_); + destroySimpleStringMemoryBlockList(cache_[i].freeMemoryHead_, cache_[i].size_); + destroySimpleStringMemoryBlockList(cache_[i].usedMemoryHead_, cache_[i].size_); cache_[i].freeMemoryHead_ = NULLPTR; cache_[i].usedMemoryHead_ = NULLPTR; } - destroySimpleStringMemoryBlockList(nonCachedAllocations_); + destroySimpleStringMemoryBlockList(nonCachedAllocations_, 0); nonCachedAllocations_ = NULLPTR; } @@ -322,9 +322,9 @@ char* SimpleString::allocStringBuffer(size_t _size, const char* file, size_t lin return getStringAllocator()->alloc_memory(_size, file, line); } -void SimpleString::deallocStringBuffer(char* str, const char* file, size_t line) +void SimpleString::deallocStringBuffer(char* str, size_t size, const char* file, size_t line) { - getStringAllocator()->free_memory(str, file, line); + getStringAllocator()->free_memory(str, size, file, line); } char* SimpleString::getEmptyString() const @@ -430,21 +430,77 @@ int SimpleString::MemCmp(const void* s1, const void *s2, size_t n) return 0; } -SimpleString::SimpleString(const char *otherBuffer) +void SimpleString::deallocateInternalBuffer() { - if (otherBuffer == NULLPTR) { - buffer_ = getEmptyString(); - } - else { - buffer_ = copyToNewBuffer(otherBuffer); + if (buffer_) { + deallocStringBuffer(buffer_, bufferSize_, __FILE__, __LINE__); + buffer_ = NULLPTR; + bufferSize_ = 0; } } +void SimpleString::setInternalBufferAsEmptyString() +{ + deallocateInternalBuffer(); + + bufferSize_ = 1; + buffer_ = getEmptyString(); +} + +void SimpleString::copyBufferToNewInternalBuffer(const char* otherBuffer, size_t size) +{ + deallocateInternalBuffer(); + + bufferSize_ = size; + buffer_ = copyToNewBuffer(otherBuffer, bufferSize_); +} + +void SimpleString::setInternalBufferToNewBuffer(size_t size) +{ + deallocateInternalBuffer(); + + bufferSize_ = size; + buffer_ = allocStringBuffer(bufferSize_, __FILE__, __LINE__); +} + +void SimpleString::setInternalBufferTo(char* buffer, size_t size) +{ + deallocateInternalBuffer(); + + bufferSize_ = size; + buffer_ = buffer; +} + +void SimpleString::copyBufferToNewInternalBuffer(const SimpleString& otherBuffer) +{ + copyBufferToNewInternalBuffer(otherBuffer.buffer_, otherBuffer.size() + 1); +} + +void SimpleString::copyBufferToNewInternalBuffer(const char* otherBuffer) +{ + copyBufferToNewInternalBuffer(otherBuffer, StrLen(otherBuffer) + 1); +} + +const char* SimpleString::getBuffer() const +{ + return buffer_; +} + +SimpleString::SimpleString(const char *otherBuffer) + : buffer_(NULLPTR), bufferSize_(0) +{ + if (otherBuffer == NULLPTR) + setInternalBufferAsEmptyString(); + else + copyBufferToNewInternalBuffer(otherBuffer); +} + SimpleString::SimpleString(const char *other, size_t repeatCount) + : buffer_(NULLPTR), bufferSize_(0) { size_t otherStringLength = StrLen(other); - size_t len = otherStringLength * repeatCount + 1; - buffer_ = allocStringBuffer(len, __FILE__, __LINE__); + setInternalBufferToNewBuffer(otherStringLength * repeatCount + 1); + char* next = buffer_; for (size_t i = 0; i < repeatCount; i++) { StrNCpy(next, other, otherStringLength + 1); @@ -454,22 +510,21 @@ SimpleString::SimpleString(const char *other, size_t repeatCount) } SimpleString::SimpleString(const SimpleString& other) + : buffer_(NULLPTR), bufferSize_(0) { - buffer_ = copyToNewBuffer(other.buffer_); + copyBufferToNewInternalBuffer(other.getBuffer()); } SimpleString& SimpleString::operator=(const SimpleString& other) { - if (this != &other) { - deallocStringBuffer(buffer_, __FILE__, __LINE__); - buffer_ = copyToNewBuffer(other.buffer_); - } + if (this != &other) + copyBufferToNewInternalBuffer(other); return *this; } bool SimpleString::contains(const SimpleString& other) const { - return StrStr(buffer_, other.buffer_) != NULLPTR; + return StrStr(getBuffer(), other.getBuffer()) != NULLPTR; } bool SimpleString::containsNoCase(const SimpleString& other) const @@ -479,26 +534,28 @@ bool SimpleString::containsNoCase(const SimpleString& other) const bool SimpleString::startsWith(const SimpleString& other) const { - if (StrLen(other.buffer_) == 0) return true; + if (other.size() == 0) return true; else if (size() == 0) return false; - else return StrStr(buffer_, other.buffer_) == buffer_; + else return StrStr(getBuffer(), other.getBuffer()) == getBuffer(); } bool SimpleString::endsWith(const SimpleString& other) const { - size_t buffer_length = size(); - size_t other_buffer_length = StrLen(other.buffer_); - if (other_buffer_length == 0) return true; - if (buffer_length == 0) return false; - if (buffer_length < other_buffer_length) return false; - return StrCmp(buffer_ + buffer_length - other_buffer_length, other.buffer_) == 0; + size_t length = size(); + size_t other_length = other.size(); + + if (other_length == 0) return true; + if (length == 0) return false; + if (length < other_length) return false; + + return StrCmp(getBuffer() + length - other_length, other.getBuffer()) == 0; } size_t SimpleString::count(const SimpleString& substr) const { size_t num = 0; - const char* str = buffer_; - while (*str && (str = StrStr(str, substr.buffer_))) { + const char* str = getBuffer(); + while (*str && (str = StrStr(str, substr.getBuffer()))) { str++; num++; } @@ -511,11 +568,11 @@ void SimpleString::split(const SimpleString& delimiter, SimpleStringCollection& size_t extraEndToken = (endsWith(delimiter)) ? 0 : 1U; col.allocate(num + extraEndToken); - const char* str = buffer_; + const char* str = getBuffer(); const char* prev; for (size_t i = 0; i < num; ++i) { prev = str; - str = StrStr(str, delimiter.buffer_) + 1; + str = StrStr(str, delimiter.getBuffer()) + 1; col[i] = SimpleString(prev).subString(0, size_t (str - prev)); } if (extraEndToken) { @@ -527,7 +584,7 @@ void SimpleString::replace(char to, char with) { size_t s = size(); for (size_t i = 0; i < s; i++) { - if (buffer_[i] == to) buffer_[i] = with; + if (getBuffer()[i] == to) buffer_[i] = with; } } @@ -546,25 +603,22 @@ void SimpleString::replace(const char* to, const char* with) if (newsize > 1) { char* newbuf = allocStringBuffer(newsize, __FILE__, __LINE__); for (size_t i = 0, j = 0; i < len;) { - if (StrNCmp(&buffer_[i], to, tolen) == 0) { + if (StrNCmp(&getBuffer()[i], to, tolen) == 0) { StrNCpy(&newbuf[j], with, withlen + 1); j += withlen; i += tolen; } else { - newbuf[j] = buffer_[i]; + newbuf[j] = getBuffer()[i]; j++; i++; } } - deallocStringBuffer(buffer_, __FILE__, __LINE__); - buffer_ = newbuf; - buffer_[newsize - 1] = '\0'; - } - else { - deallocStringBuffer(buffer_, __FILE__, __LINE__); - buffer_ = getEmptyString(); + newbuf[newsize - 1] = '\0'; + setInternalBufferTo(newbuf, newsize); } + else + setInternalBufferAsEmptyString(); } SimpleString SimpleString::lowerCase() const @@ -573,19 +627,19 @@ SimpleString SimpleString::lowerCase() const size_t str_size = str.size(); for (size_t i = 0; i < str_size; i++) - str.buffer_[i] = ToLower(str.buffer_[i]); + str.buffer_[i] = ToLower(str.getBuffer()[i]); return str; } const char *SimpleString::asCharString() const { - return buffer_; + return getBuffer(); } size_t SimpleString::size() const { - return StrLen(buffer_); + return StrLen(getBuffer()); } bool SimpleString::isEmpty() const @@ -593,10 +647,9 @@ bool SimpleString::isEmpty() const return size() == 0; } - SimpleString::~SimpleString() { - deallocStringBuffer(buffer_, __FILE__, __LINE__); + deallocateInternalBuffer(); } bool operator==(const SimpleString& left, const SimpleString& right) @@ -617,14 +670,14 @@ bool operator!=(const SimpleString& left, const SimpleString& right) SimpleString SimpleString::operator+(const SimpleString& rhs) const { - SimpleString t(buffer_); - t += rhs.buffer_; + SimpleString t(getBuffer()); + t += rhs.getBuffer(); return t; } SimpleString& SimpleString::operator+=(const SimpleString& rhs) { - return operator+=(rhs.buffer_); + return operator+=(rhs.getBuffer()); } SimpleString& SimpleString::operator+=(const char* rhs) @@ -632,10 +685,10 @@ SimpleString& SimpleString::operator+=(const char* rhs) size_t originalSize = this->size(); size_t additionalStringSize = StrLen(rhs) + 1; size_t sizeOfNewString = originalSize + additionalStringSize; - char* tbuffer = copyToNewBuffer(this->buffer_, sizeOfNewString); + char* tbuffer = copyToNewBuffer(this->getBuffer(), sizeOfNewString); StrNCpy(tbuffer + originalSize, rhs, additionalStringSize); - deallocStringBuffer(this->buffer_, __FILE__, __LINE__); - this->buffer_ = tbuffer; + + setInternalBufferTo(tbuffer, sizeOfNewString); return *this; } @@ -656,7 +709,7 @@ SimpleString SimpleString::subString(size_t beginPos, size_t amount) const { if (beginPos > size()-1) return ""; - SimpleString newString = buffer_ + beginPos; + SimpleString newString = getBuffer() + beginPos; if (newString.size() > amount) newString.buffer_[amount] = '\0'; @@ -671,7 +724,7 @@ SimpleString SimpleString::subString(size_t beginPos) const char SimpleString::at(size_t pos) const { - return buffer_[pos]; + return getBuffer()[pos]; } size_t SimpleString::find(char ch) const @@ -683,7 +736,7 @@ size_t SimpleString::findFrom(size_t starting_position, char ch) const { size_t length = size(); for (size_t i = starting_position; i < length; i++) - if (buffer_[i] == ch) return i; + if (at(i) == ch) return i; return npos; } @@ -698,23 +751,28 @@ SimpleString SimpleString::subStringFromTill(char startChar, char lastExcludedCh return subString(beginPos, endPos - beginPos); } -char* SimpleString::copyToNewBuffer(const char* bufferToCopy, size_t bufferSize) +char* SimpleString::copyToNewBuffer(const char* bufferToCopy) { - if(bufferSize == 0) bufferSize = StrLen(bufferToCopy) + 1; + size_t bufferSize = StrLen(bufferToCopy) + 1; + return copyToNewBuffer(bufferToCopy, bufferSize); +} +char* SimpleString::copyToNewBuffer(const char* bufferToCopy, size_t bufferSize) +{ char* newBuffer = allocStringBuffer(bufferSize, __FILE__, __LINE__); StrNCpy(newBuffer, bufferToCopy, bufferSize); newBuffer[bufferSize-1] = '\0'; return newBuffer; } + void SimpleString::copyToBuffer(char* bufferToCopy, size_t bufferSize) const { if (bufferToCopy == NULLPTR || bufferSize == 0) return; size_t sizeToCopy = (bufferSize-1 < size()) ? (bufferSize-1) : size(); - StrNCpy(bufferToCopy, buffer_, sizeToCopy); + StrNCpy(bufferToCopy, getBuffer(), sizeToCopy); bufferToCopy[sizeToCopy] = '\0'; } @@ -1024,7 +1082,7 @@ SimpleString VStringFromFormat(const char* format, va_list args) PlatformSpecificVSNprintf(newBuffer, newBufferSize, format, argsCopy); resultString = SimpleString(newBuffer); - SimpleString::deallocStringBuffer(newBuffer, __FILE__, __LINE__); + SimpleString::deallocStringBuffer(newBuffer, newBufferSize, __FILE__, __LINE__); } va_end(argsCopy); return resultString; diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index e9fab30dd..6048ee7a6 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -156,7 +156,7 @@ char* TestMemoryAllocator::allocMemoryLeakNode(size_t size) void TestMemoryAllocator::freeMemoryLeakNode(char* memory) { - free_memory(memory, "MemoryLeakNode", 1); + free_memory(memory, 0, "MemoryLeakNode", 1); } char* TestMemoryAllocator::alloc_memory(size_t size, const char*, size_t) @@ -164,11 +164,6 @@ char* TestMemoryAllocator::alloc_memory(size_t size, const char*, size_t) return checkedMalloc(size); } -void TestMemoryAllocator::free_memory(char* memory, const char* file, size_t line) -{ - free_memory(memory, 0, file, line); -} - void TestMemoryAllocator::free_memory(char* memory, size_t, const char*, size_t) { PlatformSpecificFree(memory); @@ -208,7 +203,7 @@ char* MemoryLeakAllocator::alloc_memory(size_t size, const char* file, size_t li return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(originalAllocator_, size, file, line); } -void MemoryLeakAllocator::free_memory(char* memory, const char* file, size_t line) +void MemoryLeakAllocator::free_memory(char* memory, size_t, const char* file, size_t line) { MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(originalAllocator_, memory, file, line); } @@ -264,7 +259,7 @@ char* NullUnknownAllocator::alloc_memory(size_t /*size*/, const char*, size_t) return NULLPTR; } -void NullUnknownAllocator::free_memory(char* /*memory*/, const char*, size_t) +void NullUnknownAllocator::free_memory(char* /*memory*/, size_t, const char*, size_t) { } @@ -360,7 +355,7 @@ char* FailableMemoryAllocator::alloc_memory(size_t size, const char* file, size_ if (previous) previous->next_ = current->next_; else head_ = current->next_; - free_memory((char*) current, __FILE__, __LINE__); + free_memory((char*) current, size, __FILE__, __LINE__); return NULLPTR; } previous = current; @@ -393,7 +388,7 @@ void FailableMemoryAllocator::clearFailedAllocs() LocationToFailAllocNode* current = head_; while (current) { head_ = current->next_; - free_memory((char*) current, __FILE__, __LINE__); + free_memory((char*) current, 0, __FILE__, __LINE__); current = head_; } currentAllocNumber_ = 0; @@ -423,7 +418,7 @@ MemoryAccountantAllocationNode* MemoryAccountant::createNewAccountantAllocationN void MemoryAccountant::destroyAccountantAllocationNode(MemoryAccountantAllocationNode* node) const { - allocator_->free_memory((char*) node, __FILE__, __LINE__); + allocator_->free_memory((char*) node, sizeof(node), __FILE__, __LINE__); } MemoryAccountant::MemoryAccountant() @@ -644,7 +639,7 @@ size_t AccountingTestMemoryAllocator::removeNextNodeAndReturnSize(AccountingTest node->next_ = node->next_->next_; size_t size = foundNode->size_; - originalAllocator_->free_memory((char*) foundNode, __FILE__, __LINE__); + originalAllocator_->free_memory((char*) foundNode, size, __FILE__, __LINE__); return size; } @@ -654,7 +649,7 @@ size_t AccountingTestMemoryAllocator::removeHeadAndReturnSize() head_ = head_->next_; size_t size = foundNode->size_; - originalAllocator_->free_memory((char*) foundNode, __FILE__, __LINE__); + originalAllocator_->free_memory((char*) foundNode, size, __FILE__, __LINE__); return size; } @@ -679,11 +674,11 @@ char* AccountingTestMemoryAllocator::alloc_memory(size_t size, const char* file, return memory; } -void AccountingTestMemoryAllocator::free_memory(char* memory, const char* file, size_t line) +void AccountingTestMemoryAllocator::free_memory(char* memory, size_t, const char* file, size_t line) { size_t size = removeMemoryFromTrackingAndReturnAllocatedSize(memory); accountant_.dealloc(size); - originalAllocator_->free_memory(memory, file, line); + originalAllocator_->free_memory(memory, size, file, line); } TestMemoryAllocator* AccountingTestMemoryAllocator::actualAllocator() diff --git a/src/CppUTestExt/CodeMemoryReportFormatter.cpp b/src/CppUTestExt/CodeMemoryReportFormatter.cpp index 670a91677..3fdf95f58 100644 --- a/src/CppUTestExt/CodeMemoryReportFormatter.cpp +++ b/src/CppUTestExt/CodeMemoryReportFormatter.cpp @@ -58,7 +58,7 @@ void CodeMemoryReportFormatter::clearReporting() while (codeReportingList_) { CodeReportingAllocationNode* oldNode = codeReportingList_; codeReportingList_ = codeReportingList_->next_; - internalAllocator_->free_memory((char*) oldNode, __FILE__, __LINE__); + internalAllocator_->free_memory((char*) oldNode, 0, __FILE__, __LINE__); } } diff --git a/src/CppUTestExt/MemoryReportAllocator.cpp b/src/CppUTestExt/MemoryReportAllocator.cpp index ba4b87182..beea0e357 100644 --- a/src/CppUTestExt/MemoryReportAllocator.cpp +++ b/src/CppUTestExt/MemoryReportAllocator.cpp @@ -85,9 +85,9 @@ char* MemoryReportAllocator::alloc_memory(size_t size, const char* file, size_t return memory; } -void MemoryReportAllocator::free_memory(char* memory, const char* file, size_t line) +void MemoryReportAllocator::free_memory(char* memory, size_t size, const char* file, size_t line) { - realAllocator_->free_memory(memory, file, line); + realAllocator_->free_memory(memory, size, file, line); if (result_ && formatter_) formatter_->report_free_memory(result_, this, memory, file, line); } diff --git a/tests/CppUTest/MemoryLeakDetectorTest.cpp b/tests/CppUTest/MemoryLeakDetectorTest.cpp index b685653ef..53e457c9e 100644 --- a/tests/CppUTest/MemoryLeakDetectorTest.cpp +++ b/tests/CppUTest/MemoryLeakDetectorTest.cpp @@ -61,10 +61,10 @@ class NewAllocatorForMemoryLeakDetectionTest: public TestMemoryAllocator alloc_called++; return TestMemoryAllocator::alloc_memory(size, "file", 1); } - void free_memory(char* memory, const char* file, size_t line) + void free_memory(char* memory, size_t size, const char* file, size_t line) { free_called++; - TestMemoryAllocator::free_memory(memory, file, line); + TestMemoryAllocator::free_memory(memory, size, file, line); } }; @@ -86,10 +86,10 @@ class AllocatorForMemoryLeakDetectionTest: public TestMemoryAllocator alloc_called++; return TestMemoryAllocator::alloc_memory(size, file, line); } - void free_memory(char* memory, const char* file, size_t line) + void free_memory(char* memory, size_t size, const char* file, size_t line) { free_called++; - TestMemoryAllocator::free_memory(memory, file, line); + TestMemoryAllocator::free_memory(memory, size, file, line); } char* allocMemoryLeakNode(size_t size) @@ -101,7 +101,7 @@ class AllocatorForMemoryLeakDetectionTest: public TestMemoryAllocator void freeMemoryLeakNode(char* memory) { freeMemoryLeakNodeCalled++; - TestMemoryAllocator::free_memory(memory, __FILE__, __LINE__); + TestMemoryAllocator::free_memory(memory, 0, __FILE__, __LINE__); } }; diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 77595c673..8b9172fcb 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -39,11 +39,11 @@ class JustUseNewStringAllocator : public TestMemoryAllocator char* alloc_memory(size_t size, const char* file, size_t line) _override { - return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, file, line); + return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, file, line); } - void free_memory(char* str, const char* file, size_t line) _override + void free_memory(char* str, size_t, const char* file, size_t line) _override { - MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(getCurrentNewArrayAllocator(), str, file, line); + MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(getCurrentNewArrayAllocator(), str, file, line); } }; diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index f8bc074fb..6fa3bd51a 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -87,7 +87,7 @@ TEST(TestMemoryAllocatorTest, SetCurrentMallocAllocator) TEST(TestMemoryAllocatorTest, MemoryAllocation) { allocator = new TestMemoryAllocator(); - allocator->free_memory(allocator->alloc_memory(100, "file", 1), "file", 1); + allocator->free_memory(allocator->alloc_memory(100, "file", 1), 100, "file", 1); } TEST(TestMemoryAllocatorTest, MallocNames) @@ -114,7 +114,7 @@ TEST(TestMemoryAllocatorTest, NewArrayNames) TEST(TestMemoryAllocatorTest, NullUnknownAllocation) { allocator = new NullUnknownAllocator; - allocator->free_memory(allocator->alloc_memory(100, "file", 1), "file", 1); + allocator->free_memory(allocator->alloc_memory(100, "file", 1), 100, "file", 1); } TEST(TestMemoryAllocatorTest, NullUnknownNames) @@ -172,7 +172,7 @@ TEST(MemoryLeakAllocator, allocMemory) TEST(MemoryLeakAllocator, freeMemory) { char* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(allocator->actualAllocator(), 10); - allocator->free_memory(memory, __FILE__, __LINE__); + allocator->free_memory(memory, 10, __FILE__, __LINE__); /* No leaks or crashes */ } @@ -560,7 +560,7 @@ TEST_GROUP(AccountingTestMemoryAllocator) TEST(AccountingTestMemoryAllocator, canAllocateAndAccountMemory) { char* memory = allocator->alloc_memory(10, __FILE__, __LINE__); - allocator->free_memory(memory, __FILE__, __LINE__); + allocator->free_memory(memory, 10, __FILE__, __LINE__); LONGS_EQUAL(1, accountant.totalAllocationsOfSize(10)); LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(10)); @@ -572,21 +572,21 @@ TEST(AccountingTestMemoryAllocator, canAllocateAndAccountMemoryMultipleAllocatio char* memory2 = allocator->alloc_memory(8, __FILE__, __LINE__); char* memory3 = allocator->alloc_memory(12, __FILE__, __LINE__); - allocator->free_memory(memory1, __FILE__, __LINE__); - allocator->free_memory(memory3, __FILE__, __LINE__); + allocator->free_memory(memory1, 10, __FILE__, __LINE__); + allocator->free_memory(memory3, 12, __FILE__, __LINE__); char* memory4 = allocator->alloc_memory(15, __FILE__, __LINE__); char* memory5 = allocator->alloc_memory(20, __FILE__, __LINE__); - allocator->free_memory(memory2, __FILE__, __LINE__); - allocator->free_memory(memory4, __FILE__, __LINE__); - allocator->free_memory(memory5, __FILE__, __LINE__); + allocator->free_memory(memory2, 8, __FILE__, __LINE__); + allocator->free_memory(memory4, 15, __FILE__, __LINE__); + allocator->free_memory(memory5, 20, __FILE__, __LINE__); char* memory6 = allocator->alloc_memory(1, __FILE__, __LINE__); char* memory7 = allocator->alloc_memory(100, __FILE__, __LINE__); - allocator->free_memory(memory6, __FILE__, __LINE__); - allocator->free_memory(memory7, __FILE__, __LINE__); + allocator->free_memory(memory6, 1, __FILE__, __LINE__); + allocator->free_memory(memory7, 100, __FILE__, __LINE__); LONGS_EQUAL(7, accountant.totalAllocations()); LONGS_EQUAL(7, accountant.totalDeallocations()); @@ -595,7 +595,7 @@ TEST(AccountingTestMemoryAllocator, canAllocateAndAccountMemoryMultipleAllocatio TEST(AccountingTestMemoryAllocator, useOriginalAllocatorWhenDeallocatingMemoryNotAllocatedByAllocator) { char* memory = getCurrentMallocAllocator()->alloc_memory(10, __FILE__, __LINE__); - allocator->free_memory(memory, __FILE__, __LINE__); + allocator->free_memory(memory, 10, __FILE__, __LINE__); LONGS_EQUAL(0, accountant.totalAllocations()); LONGS_EQUAL(1, accountant.totalDeallocations()); diff --git a/tests/CppUTestExt/MemoryReporterPluginTest.cpp b/tests/CppUTestExt/MemoryReporterPluginTest.cpp index 6a6573667..72bcb69b2 100644 --- a/tests/CppUTestExt/MemoryReporterPluginTest.cpp +++ b/tests/CppUTestExt/MemoryReporterPluginTest.cpp @@ -194,7 +194,7 @@ TEST(MemoryReporterPlugin, newAllocationsAreReportedTest) reporter->preTestAction(*test, *result); char *memory = getCurrentNewAllocator()->allocMemoryLeakNode(100); - getCurrentNewAllocator()->free_memory(memory, "unknown", 1); + getCurrentNewAllocator()->free_memory(memory, 100, "unknown", 1); } TEST(MemoryReporterPlugin, whenUsingOnlyMallocAllocatorNoOtherOfTheAllocatorsAreUsed) @@ -206,7 +206,7 @@ TEST(MemoryReporterPlugin, whenUsingOnlyMallocAllocatorNoOtherOfTheAllocatorsAre reporter->preTestAction(*test, *result); char *memory = getCurrentMallocAllocator()->allocMemoryLeakNode(100); - getCurrentMallocAllocator()->free_memory(memory, "unknown", 1); + getCurrentMallocAllocator()->free_memory(memory, 100, "unknown", 1); } TEST(MemoryReporterPlugin, newArrayAllocationsAreReportedTest) @@ -217,7 +217,7 @@ TEST(MemoryReporterPlugin, newArrayAllocationsAreReportedTest) reporter->preTestAction(*test, *result); char *memory = getCurrentNewArrayAllocator()->allocMemoryLeakNode(100); - getCurrentNewArrayAllocator()->free_memory(memory, "unknown", 1); + getCurrentNewArrayAllocator()->free_memory(memory, 100, "unknown", 1); } TEST(MemoryReporterPlugin, mallocAllocationsAreReportedTest) @@ -228,7 +228,7 @@ TEST(MemoryReporterPlugin, mallocAllocationsAreReportedTest) reporter->preTestAction(*test, *result); char *memory = getCurrentMallocAllocator()->allocMemoryLeakNode(100); - getCurrentMallocAllocator()->free_memory(memory, "unknown", 1); + getCurrentMallocAllocator()->free_memory(memory, 100, "unknown", 1); } TEST(MemoryReporterPlugin, startOfANewTestWillReportTheTestGroupStart) From 494a1d6a8f4cb662677ed74d6a0c0a970f61fb35 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 6 May 2020 14:15:27 +0800 Subject: [PATCH 0478/1093] Function not used. Can be deleted --- include/CppUTest/SimpleString.h | 1 - src/CppUTest/SimpleString.cpp | 6 ------ src/CppUTest/TestTestingFixture.cpp | 3 +-- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index d6a93b039..6566d9025 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -121,7 +121,6 @@ class SimpleString static TestMemoryAllocator* stringAllocator_; char* getEmptyString() const; - static char* copyToNewBuffer(const char* bufferToCopy); static char* copyToNewBuffer(const char* bufferToCopy, size_t bufferSize); static bool isDigit(char ch); static bool isSpace(char ch); diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index d91f0610d..e9246d1d9 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -751,12 +751,6 @@ SimpleString SimpleString::subStringFromTill(char startChar, char lastExcludedCh return subString(beginPos, endPos - beginPos); } -char* SimpleString::copyToNewBuffer(const char* bufferToCopy) -{ - size_t bufferSize = StrLen(bufferToCopy) + 1; - return copyToNewBuffer(bufferToCopy, bufferSize); -} - char* SimpleString::copyToNewBuffer(const char* bufferToCopy, size_t bufferSize) { char* newBuffer = allocStringBuffer(bufferSize, __FILE__, __LINE__); diff --git a/src/CppUTest/TestTestingFixture.cpp b/src/CppUTest/TestTestingFixture.cpp index 133e9583c..1f23e5fac 100644 --- a/src/CppUTest/TestTestingFixture.cpp +++ b/src/CppUTest/TestTestingFixture.cpp @@ -82,8 +82,7 @@ void TestTestingFixture::setTestFunction(void(*testFunction)()) void TestTestingFixture::setTestFunction(ExecFunction* testFunction) { - if (genTest_->testFunction_ && ownsExecFunction_) - delete genTest_->testFunction_; + clearExecFunction(); genTest_->testFunction_ = testFunction; From 1df9936cac7fd43d0fbe648fe802e43ec701c528 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 7 May 2020 17:44:14 +0800 Subject: [PATCH 0479/1093] Will we ever have this String Cache? --- include/CppUTest/SimpleString.h | 14 +++++ include/CppUTest/TestMemoryAllocator.h | 1 + src/CppUTest/SimpleString.cpp | 37 ++++++++++++- src/CppUTest/TestMemoryAllocator.cpp | 5 ++ tests/CppUTest/SimpleStringTest.cpp | 72 ++++++++++++++++++++++++++ 5 files changed, 128 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 6566d9025..dfe34d639 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -221,6 +221,20 @@ class SimpleStringInternalCache TestMemoryAllocator* allocator_; SimpleStringInternalCacheNode* cache_; SimpleStringMemoryBlock* nonCachedAllocations_; + bool hasWarnedAboutDeallocations; +}; + +class SimpleStringCacheAllocator; +class GlobalSimpleStringCache +{ + SimpleStringCacheAllocator* allocator_; + SimpleStringInternalCache cache_; + +public: + GlobalSimpleStringCache(); + ~GlobalSimpleStringCache(); + + TestMemoryAllocator* getAllocator(); }; SimpleString StringFrom(bool value); diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index 7597f4df5..b29254cec 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -272,6 +272,7 @@ class SimpleStringCacheAllocator : public TestMemoryAllocator virtual const char* free_name() const _override; virtual TestMemoryAllocator* actualAllocator() _override; + TestMemoryAllocator* originalAllocator(); private: SimpleStringInternalCache& cache_; TestMemoryAllocator* originalAllocator_; diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index e9246d1d9..527d66473 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -116,7 +116,7 @@ struct SimpleStringInternalCacheNode }; SimpleStringInternalCache::SimpleStringInternalCache() - : allocator_(defaultMallocAllocator()), cache_(NULLPTR), nonCachedAllocations_(NULLPTR) + : allocator_(defaultMallocAllocator()), cache_(NULLPTR), nonCachedAllocations_(NULLPTR), hasWarnedAboutDeallocations(false) { cache_ = createInternalCacheNodes(); } @@ -236,8 +236,19 @@ void SimpleStringInternalCache::releaseCachedBlockFrom(char* memory, SimpleStrin SimpleStringMemoryBlock* blockToFree = block->next_; block->next_ = block->next_->next_; node->freeMemoryHead_ = addToSimpleStringMemoryBlockList(blockToFree, node->freeMemoryHead_); + return; } } + + if (!hasWarnedAboutDeallocations) { + hasWarnedAboutDeallocations = true; + UtestShell::getCurrent()->print("\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" + "This is likely due statics and will cause problems.\n" + "Only warning once to avoid recursive warnings\n", __FILE__, __LINE__); + fprintf(stderr, "\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" + "This is likely due statics and will cause problems.\n" + "Only warning once to avoid recursive warnings\n", __FILE__, __LINE__); + } } void SimpleStringInternalCache::releaseNonCachedMemory(char* memory, size_t size) @@ -294,14 +305,38 @@ void SimpleStringInternalCache::clearAllIncludingCurrentlyUsedMemory() { for (size_t i = 0; i < amountOfInternalCacheNodes; i++) { destroySimpleStringMemoryBlockList(cache_[i].freeMemoryHead_, cache_[i].size_); + if (cache_[i].usedMemoryHead_ && cache_[i].usedMemoryHead_->memory_) + fprintf(stderr, "\nNon cached items being cleared: %s\n", cache_[i].usedMemoryHead_->memory_); destroySimpleStringMemoryBlockList(cache_[i].usedMemoryHead_, cache_[i].size_); cache_[i].freeMemoryHead_ = NULLPTR; cache_[i].usedMemoryHead_ = NULLPTR; } + + if (nonCachedAllocations_ && nonCachedAllocations_->memory_) + fprintf(stderr, "\nNon cached items being cleared: %s\n", nonCachedAllocations_->memory_); + destroySimpleStringMemoryBlockList(nonCachedAllocations_, 0); nonCachedAllocations_ = NULLPTR; } +GlobalSimpleStringCache::GlobalSimpleStringCache() +{ + allocator_ = new SimpleStringCacheAllocator(cache_, SimpleString::getStringAllocator()); + SimpleString::setStringAllocator(allocator_); +} + +GlobalSimpleStringCache::~GlobalSimpleStringCache() +{ + SimpleString::setStringAllocator(allocator_->originalAllocator()); + cache_.clearAllIncludingCurrentlyUsedMemory(); + delete allocator_; +} + +TestMemoryAllocator* GlobalSimpleStringCache::getAllocator() +{ + return allocator_; +} + TestMemoryAllocator* SimpleString::stringAllocator_ = NULLPTR; TestMemoryAllocator* SimpleString::getStringAllocator() diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 6048ee7a6..0cb84b4a8 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -825,3 +825,8 @@ TestMemoryAllocator* SimpleStringCacheAllocator::actualAllocator() return originalAllocator_->actualAllocator(); } +TestMemoryAllocator* SimpleStringCacheAllocator::originalAllocator() +{ + return originalAllocator_; +} + diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 8b9172fcb..3aabf4e30 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -1264,6 +1264,18 @@ TEST(SimpleString, BracketsFormattedHexStringFromForULongLong) #endif +class TestFunctionWithCache : public ExecFunction +{ +public: + void (*testFunction)(SimpleStringInternalCache*, size_t); + SimpleStringInternalCache* parameter; + size_t allocationSize; + + void exec() _override + { + testFunction(parameter, allocationSize); + } +}; TEST_GROUP(SimpleStringInternalCache) { @@ -1272,8 +1284,14 @@ TEST_GROUP(SimpleStringInternalCache) MemoryLeakAllocator* defaultAllocator; AccountingTestMemoryAllocator* allocator; + TestFunctionWithCache testFunction; + TestTestingFixture fixture; + void setup() { + fixture.setTestFunction(&testFunction); + testFunction.parameter = &cache; + defaultAllocator = new MemoryLeakAllocator(defaultMallocAllocator()); allocator = new AccountingTestMemoryAllocator(accountant, defaultAllocator); cache.setAllocator(defaultAllocator); @@ -1467,4 +1485,58 @@ TEST(SimpleStringInternalCache, clearAllIncludingCurrentlyUsedMemoryAlsoReleases LONGS_EQUAL(3, accountant.totalDeallocationsOfSize(1234)); } +static void _deallocatingStringMemoryThatWasntAllocatedWithCache(SimpleStringInternalCache* cache, size_t allocationSize) +{ + char* mem = defaultMallocAllocator()->alloc_memory(allocationSize, __FILE__, __LINE__); + cache->dealloc(mem, allocationSize); + defaultMallocAllocator()->free_memory(mem, allocationSize, __FILE__, __LINE__); +} + +TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarning) +{ + testFunction.testFunction = _deallocatingStringMemoryThatWasntAllocatedWithCache; + testFunction.allocationSize = 123; + + cache.setAllocator(allocator); + fixture.runAllTests(); + + fixture.assertPrintContains("\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" + "This is likely due statics and will cause problems.\n" + "Only warning once to avoid recursive warnings\n"); + +} + +static void _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache(SimpleStringInternalCache* cache, size_t allocationSize) +{ + char* mem = defaultMallocAllocator()->alloc_memory(allocationSize, __FILE__, __LINE__); + cache->dealloc(mem, allocationSize); + cache->dealloc(mem, allocationSize); + defaultMallocAllocator()->free_memory(mem, allocationSize, __FILE__, __LINE__); +} + +TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarningButOnlyOnce) +{ + testFunction.testFunction = _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache; + testFunction.allocationSize = 123; + + cache.setAllocator(allocator); + fixture.runAllTests(); + + LONGS_EQUAL(1, fixture.getOutput().count("WARNING")); +} + +TEST_GROUP(GlobalSimpleStringCache) +{ +}; + +TEST(GlobalSimpleStringCache, installsAndRemovedCache) +{ + TestMemoryAllocator* originalStringAllocator = SimpleString::getStringAllocator(); + { + GlobalSimpleStringCache cache; + STRCMP_EQUAL("SimpleStringCacheAllocator", SimpleString::getStringAllocator()->name()); + POINTERS_EQUAL(cache.getAllocator(), SimpleString::getStringAllocator()); + } + POINTERS_EQUAL(originalStringAllocator, SimpleString::getStringAllocator()); +} From 83ed2200995edccdfa222bbba33bb260a633f1a1 Mon Sep 17 00:00:00 2001 From: Markus Rinne Date: Thu, 7 May 2020 16:11:55 +0300 Subject: [PATCH 0480/1093] cmake: Fix typo --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 71e11a046..9e6653fff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,7 +51,7 @@ option(STD_C "Use the standard C library" ON) option(STD_CPP "Use the standard C++ library" ON) option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) option(MEMORY_LEAK_DETECTION "Enable memory leak detection" ON) -option(EXTENSIONS "Use the CppUTest extenstion library" ON) +option(EXTENSIONS "Use the CppUTest extension library" ON) option(LONGLONG "Support long long" OFF) option(MAP_FILE "Enable the creation of a map file" OFF) option(COVERAGE "Enable running with coverage" OFF) From c68ab7dcc630c280f5dfdcc5fae710a1b0c5551b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 8 May 2020 08:25:57 +0800 Subject: [PATCH 0481/1093] Using the String Cache now --- include/CppUTest/SimpleString.h | 1 + src/CppUTest/CommandLineTestRunner.cpp | 1 + src/CppUTest/SimpleString.cpp | 31 +++++------ tests/CppUTest/CommandLineTestRunnerTest.cpp | 54 ++++++++++++++------ tests/CppUTest/SimpleStringTest.cpp | 52 +++++++++++++++---- tests/CppUTest/TestMemoryAllocatorTest.cpp | 4 -- tests/CppUTest/UtestPlatformTest.cpp | 3 ++ 7 files changed, 99 insertions(+), 47 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index dfe34d639..bd3aa563a 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -199,6 +199,7 @@ class SimpleStringInternalCache void clearCache(); void clearAllIncludingCurrentlyUsedMemory(); private: + void printDeallocatingUnknownMemory(char* memory); enum { amountOfInternalCacheNodes = 5}; bool isCached(size_t size); diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 39290c720..6d650e4f9 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -35,6 +35,7 @@ int CommandLineTestRunner::RunAllTests(int ac, char** av) { + GlobalSimpleStringCache cache; return RunAllTests(ac, (const char *const *) av); } diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 527d66473..9902f3485 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -74,7 +74,7 @@ void GlobalSimpleStringMemoryAccountant::useCacheSizes(size_t cacheSizes[], size void GlobalSimpleStringMemoryAccountant::start() { if (allocator_ != NULLPTR) - FAIL("Global SimpleString allocator start called twice!"); + return; allocator_ = new AccountingTestMemoryAllocator(*accountant_, SimpleString::getStringAllocator()); @@ -222,6 +222,17 @@ SimpleStringMemoryBlock* SimpleStringInternalCache::allocateNewCacheBlockFrom(Si return block; } +void SimpleStringInternalCache::printDeallocatingUnknownMemory(char* memory) +{ + if (!hasWarnedAboutDeallocations) { + hasWarnedAboutDeallocations = true; + UtestShell::getCurrent()->print(StringFromFormat("\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" + "This is likely due statics and will cause problems.\n" + "Only warning once to avoid recursive warnings.\n" + "String we are deallocating: \"%s\"\n", memory).asCharString(), __FILE__, __LINE__); + } +} + void SimpleStringInternalCache::releaseCachedBlockFrom(char* memory, SimpleStringInternalCacheNode* node) { if (node->usedMemoryHead_ && node->usedMemoryHead_->memory_ == memory) { @@ -239,16 +250,8 @@ void SimpleStringInternalCache::releaseCachedBlockFrom(char* memory, SimpleStrin return; } } + printDeallocatingUnknownMemory(memory); - if (!hasWarnedAboutDeallocations) { - hasWarnedAboutDeallocations = true; - UtestShell::getCurrent()->print("\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" - "This is likely due statics and will cause problems.\n" - "Only warning once to avoid recursive warnings\n", __FILE__, __LINE__); - fprintf(stderr, "\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" - "This is likely due statics and will cause problems.\n" - "Only warning once to avoid recursive warnings\n", __FILE__, __LINE__); - } } void SimpleStringInternalCache::releaseNonCachedMemory(char* memory, size_t size) @@ -265,8 +268,11 @@ void SimpleStringInternalCache::releaseNonCachedMemory(char* memory, size_t size SimpleStringMemoryBlock* blockToFree = block->next_; block->next_ = block->next_->next_; destroySimpleStringMemoryBlock(blockToFree, size); + return; } } + + printDeallocatingUnknownMemory(memory); } char* SimpleStringInternalCache::alloc(size_t size) @@ -305,16 +311,11 @@ void SimpleStringInternalCache::clearAllIncludingCurrentlyUsedMemory() { for (size_t i = 0; i < amountOfInternalCacheNodes; i++) { destroySimpleStringMemoryBlockList(cache_[i].freeMemoryHead_, cache_[i].size_); - if (cache_[i].usedMemoryHead_ && cache_[i].usedMemoryHead_->memory_) - fprintf(stderr, "\nNon cached items being cleared: %s\n", cache_[i].usedMemoryHead_->memory_); destroySimpleStringMemoryBlockList(cache_[i].usedMemoryHead_, cache_[i].size_); cache_[i].freeMemoryHead_ = NULLPTR; cache_[i].usedMemoryHead_ = NULLPTR; } - if (nonCachedAllocations_ && nonCachedAllocations_->memory_) - fprintf(stderr, "\nNon cached items being cleared: %s\n", nonCachedAllocations_->memory_); - destroySimpleStringMemoryBlockList(nonCachedAllocations_, 0); nonCachedAllocations_ = NULLPTR; } diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index b53ab5b98..122961ead 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -300,37 +300,57 @@ struct FakeOutput { FakeOutput() : SaveFOpen(PlatformSpecificFOpen), SaveFPuts(PlatformSpecificFPuts), SaveFClose(PlatformSpecificFClose), SavePutchar(PlatformSpecificPutchar) + { + installFakes(); + currentFake = this; + } + + ~FakeOutput() + { + currentFake = NULLPTR; + restoreOriginals(); + } + + void installFakes() { PlatformSpecificFOpen = (FOpenFunc)fopen_fake; PlatformSpecificFPuts = (FPutsFunc)fputs_fake; PlatformSpecificFClose = (FCloseFunc)fclose_fake; PlatformSpecificPutchar = (PutcharFunc)putchar_fake; } - ~FakeOutput() + + void restoreOriginals() { PlatformSpecificPutchar = SavePutchar; PlatformSpecificFOpen = SaveFOpen; PlatformSpecificFPuts = SaveFPuts; PlatformSpecificFClose = SaveFClose; } + static PlatformSpecificFile fopen_fake(const char*, const char*) { return (PlatformSpecificFile) NULLPTR; } + static void fputs_fake(const char* str, PlatformSpecificFile) { - file += str; + currentFake->file += str; } + static void fclose_fake(PlatformSpecificFile) { } + static int putchar_fake(int c) { - console += StringFrom((char)c); + currentFake->console += StringFrom((char)c); return c; } - static SimpleString file; - static SimpleString console; + + SimpleString file; + SimpleString console; + + static FakeOutput* currentFake; private: FOpenFunc SaveFOpen; FPutsFunc SaveFPuts; @@ -338,39 +358,39 @@ struct FakeOutput PutcharFunc SavePutchar; }; -SimpleString FakeOutput::console = ""; -SimpleString FakeOutput::file = ""; +FakeOutput* FakeOutput::currentFake = NULLPTR; TEST(CommandLineTestRunner, realJunitOutputShouldBeCreatedAndWorkProperly) { const char* argv[] = { "tests.exe", "-ojunit", "-v", "-kpackage", }; - FakeOutput* fakeOutput = new FakeOutput; /* UT_PTR_SET() is not reentrant */ + FakeOutput fakeOutput; /* UT_PTR_SET() is not reentrant */ CommandLineTestRunner commandLineTestRunner(4, argv, ®istry); commandLineTestRunner.runAllTestsMain(); - delete fakeOutput; /* Original output must be restored before further output occurs */ + fakeOutput.restoreOriginals(); + + STRCMP_CONTAINS("start(); - accountant->start(); -} + accountant.start(); + TestMemoryAllocator* memoryAccountantAllocator = SimpleString::getStringAllocator(); + accountant.start(); -TEST(GlobalSimpleStringMemoryAccountant, startTwiceWillFail) -{ - testFunction.testFunction_ = _startTwice; - fixture.runAllTests(); - fixture.assertPrintContains("Global SimpleString allocator start called twice!"); + POINTERS_EQUAL(memoryAccountantAllocator, SimpleString::getStringAllocator()); + + accountant.stop(); } TEST(GlobalSimpleStringMemoryAccountant, stop) @@ -121,8 +119,9 @@ TEST(GlobalSimpleStringMemoryAccountant, stopWithoutStartWillFail) static void _changeAllocatorBetweenStartAndStop(GlobalSimpleStringMemoryAccountant* accountant) { + TestMemoryAllocator* originalAllocator = SimpleString::getStringAllocator(); accountant->start(); - SimpleString::setStringAllocator(defaultMallocAllocator()); + SimpleString::setStringAllocator(originalAllocator); accountant->stop(); } @@ -1488,6 +1487,10 @@ TEST(SimpleStringInternalCache, clearAllIncludingCurrentlyUsedMemoryAlsoReleases static void _deallocatingStringMemoryThatWasntAllocatedWithCache(SimpleStringInternalCache* cache, size_t allocationSize) { char* mem = defaultMallocAllocator()->alloc_memory(allocationSize, __FILE__, __LINE__); + mem[0] = 'B'; + mem[1] = 'a'; + mem[2] = 's'; + mem[3] = '\0'; cache->dealloc(mem, allocationSize); defaultMallocAllocator()->free_memory(mem, allocationSize, __FILE__, __LINE__); } @@ -1502,7 +1505,8 @@ TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWa fixture.assertPrintContains("\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" "This is likely due statics and will cause problems.\n" - "Only warning once to avoid recursive warnings\n"); + "Only warning once to avoid recursive warnings.\n" + "String we are deallocating: \"Bas\"\n"); } @@ -1525,6 +1529,32 @@ TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWa LONGS_EQUAL(1, fixture.getOutput().count("WARNING")); } +TEST(SimpleStringInternalCache, deallocatingLargeMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarning) +{ + testFunction.testFunction = _deallocatingStringMemoryThatWasntAllocatedWithCache; + testFunction.allocationSize = 12345; + + cache.setAllocator(allocator); + fixture.runAllTests(); + + fixture.assertPrintContains("\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" + "This is likely due statics and will cause problems.\n" + "Only warning once to avoid recursive warnings.\n" + "String we are deallocating: \"Bas\"\n"); + +} + +TEST(SimpleStringInternalCache, deallocatingLargeMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarningButOnlyOnce) +{ + testFunction.testFunction = _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache; + testFunction.allocationSize = 12345; + + cache.setAllocator(allocator); + fixture.runAllTests(); + + LONGS_EQUAL(1, fixture.getOutput().count("WARNING")); +} + TEST_GROUP(GlobalSimpleStringCache) { }; diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 6fa3bd51a..b4e1ded28 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -612,10 +612,6 @@ class GlobalMemoryAccountantExecFunction : public ExecFunction { public: - virtual ~GlobalMemoryAccountantExecFunction() _destructor_override - { - } - void (*testFunction_)(GlobalMemoryAccountant*); GlobalMemoryAccountant* parameter_; diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index e05bc287d..da56eb13e 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -30,6 +30,7 @@ #include "CppUTest/TestTestingFixture.h" #include "CppUTest/PlatformSpecificFunctions.h" #include "CppUTest/StandardCLibrary.h" +#include "CppUTest/TestMemoryAllocator.h" #if CPPUTEST_USE_STD_C_LIB @@ -62,6 +63,8 @@ static void _failFunction() static void _exitNonZeroFunction() __no_return__; static void _exitNonZeroFunction() { + /* destructor of static objects will be called. If StringCache was there then the allocator will report invalid deallocations of static SimpleString */ + SimpleString::setStringAllocator(SimpleString::getStringAllocator()->actualAllocator()); exit(1); } From 412bdb6f2ff2268fbd5037490611a72201517497 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 8 May 2020 10:29:34 +0800 Subject: [PATCH 0482/1093] Fixed a potential access to deallocated memory --- src/CppUTest/MemoryLeakDetector.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index 9b0f39361..6c30e429f 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -681,8 +681,9 @@ void MemoryLeakDetector::deallocMemory(TestMemoryAllocator* allocator, void* mem allocatNodesSeperately = true; #endif if (!allocator->hasBeenDestroyed()) { + size_t size = node->size_; checkForCorruption(node, file, line, allocator, allocatNodesSeperately); - allocator->free_memory((char*) memory, node->size_, file, line); + allocator->free_memory((char*) memory, size, file, line); } } From 50c93cea08360caf458e9145d15d05826725e128 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 8 May 2020 12:57:18 +0800 Subject: [PATCH 0483/1093] Able to use the Cache for CppUTest, but not yet for extension. --- include/CppUTest/TestMemoryAllocator.h | 1 + src/CppUTest/CommandLineTestRunner.cpp | 1 - src/CppUTest/SimpleString.cpp | 1 + src/CppUTest/TestMemoryAllocator.cpp | 6 ++++++ tests/CppUTest/SimpleStringTest.cpp | 2 ++ tests/CppUTest/TestMemoryAllocatorTest.cpp | 1 + 6 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index b29254cec..068fe2c39 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -161,6 +161,7 @@ class MemoryAccountant { public: MemoryAccountant(); + ~MemoryAccountant(); void useCacheSizes(size_t sizes[], size_t length); diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 6d650e4f9..39290c720 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -35,7 +35,6 @@ int CommandLineTestRunner::RunAllTests(int ac, char** av) { - GlobalSimpleStringCache cache; return RunAllTests(ac, (const char *const *) av); } diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 9902f3485..2c39dfcac 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -497,6 +497,7 @@ void SimpleString::setInternalBufferToNewBuffer(size_t size) bufferSize_ = size; buffer_ = allocStringBuffer(bufferSize_, __FILE__, __LINE__); + buffer_[0] = '\0'; } void SimpleString::setInternalBufferTo(char* buffer, size_t size) diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 0cb84b4a8..c19562a3f 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -426,6 +426,11 @@ MemoryAccountant::MemoryAccountant() { } +MemoryAccountant::~MemoryAccountant() +{ + clear(); +} + void MemoryAccountant::createCacheSizeNodes(size_t sizes[], size_t length) { for (size_t i = 0; i < length; i++) @@ -467,6 +472,7 @@ void MemoryAccountant::clear() node = node->next_; destroyAccountantAllocationNode(to_be_deleted); } + head_ = NULLPTR; } MemoryAccountantAllocationNode* MemoryAccountant::findNodeOfSize(size_t size) const diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 5c066c1bd..e01bddd72 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -1299,6 +1299,7 @@ TEST_GROUP(SimpleStringInternalCache) void teardown() { cache.clearAllIncludingCurrentlyUsedMemory(); + accountant.clear(); delete allocator; delete defaultAllocator; } @@ -1513,6 +1514,7 @@ TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWa static void _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache(SimpleStringInternalCache* cache, size_t allocationSize) { char* mem = defaultMallocAllocator()->alloc_memory(allocationSize, __FILE__, __LINE__); + mem[0] = '\0'; cache->dealloc(mem, allocationSize); cache->dealloc(mem, allocationSize); defaultMallocAllocator()->free_memory(mem, allocationSize, __FILE__, __LINE__); diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index b4e1ded28..2d482d6a0 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -779,6 +779,7 @@ TEST_GROUP(SimpleStringCacheAllocator) void teardown() { + cache.clearCache(); delete allocator; delete accountingAllocator; } From 08a452e4314d9eabc19c1ffb631de203dea19aa6 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 8 May 2020 13:54:35 +0800 Subject: [PATCH 0484/1093] Killed static objects --- include/CppUTestExt/MockCheckedActualCall.h | 3 ++ src/CppUTestExt/MockActualCall.cpp | 13 ++++++-- src/CppUTestExt/MockSupport.cpp | 2 +- tests/CppUTest/AllTests.cpp | 21 ++++++++----- tests/CppUTestExt/AllTests.cpp | 31 ++++++++++++------- .../CppUTestExt/ExpectedFunctionsListTest.cpp | 1 + tests/CppUTestExt/MockActualCallTest.cpp | 3 ++ tests/CppUTestExt/MockExpectedCallTest.cpp | 2 ++ .../MockFailureReporterForTest.cpp | 15 +++++++-- .../CppUTestExt/MockFailureReporterForTest.h | 3 ++ tests/CppUTestExt/MockFailureTest.cpp | 2 ++ tests/CppUTestExt/MockSupportTest.cpp | 2 ++ 12 files changed, 73 insertions(+), 25 deletions(-) diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index 5adb4784d..fd6ebd0ff 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -221,10 +221,13 @@ class MockActualCallTrace : public MockActualCall const char* getTraceOutput(); void clear(); static MockActualCallTrace& instance(); + static void clearInstance(); private: SimpleString traceBuffer_; + static MockActualCallTrace* instance_; + void addParameterName(const SimpleString& name); }; diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index c955612fe..495886657 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -1003,10 +1003,19 @@ const char* MockActualCallTrace::getTraceOutput() return traceBuffer_.asCharString(); } +MockActualCallTrace* MockActualCallTrace::instance_ = NULLPTR; + MockActualCallTrace& MockActualCallTrace::instance() { - static MockActualCallTrace call; - return call; + if (instance_ == NULLPTR) + instance_ = new MockActualCallTrace; + return *instance_; +} + +void MockActualCallTrace::clearInstance() +{ + delete instance_; + instance_ = NULLPTR; } MockIgnoredActualCall& MockIgnoredActualCall::instance() diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index f22dd3514..45f58b4eb 100644 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -116,7 +116,7 @@ void MockSupport::clear() lastActualFunctionCall_ = NULLPTR; tracing_ = false; - MockActualCallTrace::instance().clear(); + MockActualCallTrace::clearInstance(); expectations_.deleteAllExpectationsAndClearList(); ignoreOtherCalls_ = false; diff --git a/tests/CppUTest/AllTests.cpp b/tests/CppUTest/AllTests.cpp index 59e89beb3..6e97ea169 100644 --- a/tests/CppUTest/AllTests.cpp +++ b/tests/CppUTest/AllTests.cpp @@ -32,21 +32,26 @@ int main(int ac, char **av) { - /* These checks are here to make sure assertions outside test runs don't crash */ - CHECK(true); - LONGS_EQUAL(1, 1); + int returnValue = 0; + GlobalSimpleStringCache stringCache; + + { + /* These checks are here to make sure assertions outside test runs don't crash */ + CHECK(true); + LONGS_EQUAL(1, 1); #if SHOW_MEMORY_REPORT - GlobalMemoryAccountant accountant; - accountant.start(); + GlobalMemoryAccountant accountant; + accountant.start(); #endif - int returnValue = CommandLineTestRunner::RunAllTests(ac, av); /* cover alternate method */ + CommandLineTestRunner::RunAllTests(ac, av); /* cover alternate method */ #if SHOW_MEMORY_REPORT - accountant.stop(); - printf("%s", accountant.report().asCharString()); + accountant.stop(); + printf("%s", accountant.report().asCharString()); #endif + } return returnValue; } diff --git a/tests/CppUTestExt/AllTests.cpp b/tests/CppUTestExt/AllTests.cpp index cc7336b62..09d5713da 100644 --- a/tests/CppUTestExt/AllTests.cpp +++ b/tests/CppUTestExt/AllTests.cpp @@ -36,26 +36,33 @@ int main(int ac, const char *const *av) { + int result = 0; + GlobalSimpleStringCache simpleStringCache; + + { #ifdef CPPUTEST_INCLUDE_GTEST_TESTS - GTestConvertor convertor; - convertor.addAllGTestToTestRegistry(); + GTestConvertor convertor; + convertor.addAllGTestToTestRegistry(); #endif - MemoryReporterPlugin plugin; - MockSupportPlugin mockPlugin; - TestRegistry::getCurrentRegistry()->installPlugin(&plugin); - TestRegistry::getCurrentRegistry()->installPlugin(&mockPlugin); + MemoryReporterPlugin plugin; + MockSupportPlugin mockPlugin; + TestRegistry::getCurrentRegistry()->installPlugin(&plugin); + TestRegistry::getCurrentRegistry()->installPlugin(&mockPlugin); #ifndef GMOCK_RENAME_MAIN - return CommandLineTestRunner::RunAllTests(ac, av); + result = CommandLineTestRunner::RunAllTests(ac, av); #else - /* Don't have any memory leak detector when running the Google Test tests */ + /* Don't have any memory leak detector when running the Google Test tests */ - testing::GMOCK_FLAG(verbose) = testing::internal::kWarningVerbosity; + testing::GMOCK_FLAG(verbose) = testing::internal::kWarningVerbosity; - ConsoleTestOutput output; - CommandLineTestRunner runner(ac, av, TestRegistry::getCurrentRegistry()); - return runner.runAllTestsMain(); + ConsoleTestOutput output; + CommandLineTestRunner runner(ac, av, TestRegistry::getCurrentRegistry()); + result = runner.runAllTestsMain(); #endif + } + + return result; } diff --git a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp index 773dc96c0..61cd42a7c 100644 --- a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp +++ b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp @@ -57,6 +57,7 @@ TEST_GROUP(MockExpectedCallsList) delete call4; delete list; CHECK_NO_MOCK_FAILURE(); + MockFailureReporterForTest::clearReporter(); } }; diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 7899b128e..92406c8a3 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -48,6 +48,9 @@ TEST_GROUP(MockCheckedActualCall) void teardown() { CHECK_NO_MOCK_FAILURE(); + + MockFailureReporterForTest::clearReporter(); + delete emptyList; delete list; } diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 7b6a52de2..c953d1b39 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -76,6 +76,7 @@ TEST_GROUP(MockNamedValueHandlerRepository) void teardown() { CHECK_NO_MOCK_FAILURE(); + MockFailureReporterForTest::clearReporter(); } }; @@ -165,6 +166,7 @@ TEST_GROUP(MockExpectedCall) MockNamedValue::setDefaultComparatorsAndCopiersRepository(originalComparatorRepository); delete call; CHECK_NO_MOCK_FAILURE(); + MockFailureReporterForTest::clearReporter(); } }; diff --git a/tests/CppUTestExt/MockFailureReporterForTest.cpp b/tests/CppUTestExt/MockFailureReporterForTest.cpp index a6a7b9c97..b8437b8b7 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.cpp +++ b/tests/CppUTestExt/MockFailureReporterForTest.cpp @@ -32,10 +32,20 @@ void MockFailureReporterForTest::failTest(const MockFailure& failure) mockFailureString = failure.getMessage(); } +MockFailureReporterForTest* MockFailureReporterForTest::instance_ = NULLPTR; + MockFailureReporterForTest* MockFailureReporterForTest::getReporter() { - static MockFailureReporterForTest reporter; - return &reporter; + if (instance_ == NULLPTR) + instance_ = new MockFailureReporterForTest; + + return instance_; +} + +void MockFailureReporterForTest::clearReporter() +{ + delete instance_; + instance_ = NULLPTR; } MockFailureReporterInstaller::MockFailureReporterInstaller() @@ -46,6 +56,7 @@ MockFailureReporterInstaller::MockFailureReporterInstaller() MockFailureReporterInstaller::~MockFailureReporterInstaller() { mock().setMockFailureStandardReporter(NULLPTR); + MockFailureReporterForTest::clearReporter(); } UtestShell* mockFailureTest() diff --git a/tests/CppUTestExt/MockFailureReporterForTest.h b/tests/CppUTestExt/MockFailureReporterForTest.h index 575c458c6..387f22b4f 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.h +++ b/tests/CppUTestExt/MockFailureReporterForTest.h @@ -40,6 +40,9 @@ class MockFailureReporterForTest : public MockFailureReporter virtual void failTest(const MockFailure& failure); static MockFailureReporterForTest* getReporter(); + static void clearReporter(); +private: + static MockFailureReporterForTest* instance_; }; class MockFailureReporterInstaller diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index 7cca4f590..1582c3fcb 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -54,7 +54,9 @@ TEST_GROUP(MockFailureTest) delete call2; delete call3; CHECK_NO_MOCK_FAILURE(); + MockFailureReporterForTest::clearReporter(); } + void addAllToList() { list->addExpectedCall(call1); diff --git a/tests/CppUTestExt/MockSupportTest.cpp b/tests/CppUTestExt/MockSupportTest.cpp index 65c0f8d70..09083afd6 100644 --- a/tests/CppUTestExt/MockSupportTest.cpp +++ b/tests/CppUTestExt/MockSupportTest.cpp @@ -41,6 +41,7 @@ TEST_GROUP(MockSupportTest) { mock().checkExpectations(); CHECK_NO_MOCK_FAILURE(); + MockFailureReporterForTest::clearReporter(); mock().clear(); } }; @@ -175,6 +176,7 @@ TEST_GROUP(MockSupportTestWithFixture) void teardown() { mock().clear(); + MockFailureReporterForTest::clearReporter(); } }; From cde4bbf858e9c2fed9b2dc346b3ee33fc548a897 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 8 May 2020 14:41:14 +0800 Subject: [PATCH 0485/1093] Added test for clear --- tests/CppUTestExt/MockActualCallTest.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 92406c8a3..e8f398fcc 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -263,3 +263,10 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) CHECK(NULLPTR == actual.returnFunctionPointerValueOrDefault((void (*)()) NULLPTR)); } +TEST(MockCheckedActualCall, MockActualCallTraceClear) +{ + MockActualCallTrace actual; + actual.withName("func"); + actual.clear(); + STRCMP_EQUAL("", actual.getTraceOutput()); +} From 10469985bb0d21885638eb4ea7676c0f55e46fae Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 8 May 2020 15:26:57 +0800 Subject: [PATCH 0486/1093] Seperated SimpleStringCache from SimpleString --- Makefile.am | 3 + include/CppUTest/SimpleString.h | 58 --- include/CppUTest/SimpleStringInternalCache.h | 110 +++++ include/CppUTest/TestMemoryAllocator.h | 22 - src/CppUTest/SimpleString.cpp | 236 ----------- src/CppUTest/SimpleStringInternalCache.cpp | 312 ++++++++++++++ src/CppUTest/TestMemoryAllocator.cpp | 46 --- tests/CppUTest/AllTests.cpp | 1 + .../SimpleStringInternalCacheTest.cpp | 390 ++++++++++++++++++ tests/CppUTest/SimpleStringTest.cpp | 309 -------------- tests/CppUTest/TestMemoryAllocatorTest.cpp | 49 --- tests/CppUTestExt/AllTests.cpp | 1 + 12 files changed, 817 insertions(+), 720 deletions(-) create mode 100644 include/CppUTest/SimpleStringInternalCache.h create mode 100644 src/CppUTest/SimpleStringInternalCache.cpp create mode 100644 tests/CppUTest/SimpleStringInternalCacheTest.cpp diff --git a/Makefile.am b/Makefile.am index 071b87e08..440d9e133 100644 --- a/Makefile.am +++ b/Makefile.am @@ -54,6 +54,7 @@ lib_libCppUTest_a_SOURCES = \ src/CppUTest/MemoryLeakDetector.cpp \ src/CppUTest/MemoryLeakWarningPlugin.cpp \ src/CppUTest/SimpleString.cpp \ + src/CppUTest/SimpleStringInternalCache.cpp \ src/CppUTest/SimpleMutex.cpp \ src/CppUTest/TeamCityTestOutput.cpp \ src/CppUTest/TestFailure.cpp \ @@ -82,6 +83,7 @@ include_cpputest_HEADERS = \ include/CppUTest/PlatformSpecificFunctions.h \ include/CppUTest/PlatformSpecificFunctions_c.h \ include/CppUTest/SimpleString.h \ + include/CppUTest/SimpleStringInternalCache.h \ include/CppUTest/SimpleMutex.h \ include/CppUTest/StandardCLibrary.h \ include/CppUTest/TeamCityTestOutput.h \ @@ -171,6 +173,7 @@ CppUTestTests_SOURCES = \ tests/CppUTest/PreprocessorTest.cpp \ tests/CppUTest/SetPluginTest.cpp \ tests/CppUTest/SimpleStringTest.cpp \ + tests/CppUTest/SimpleStringInternalCacheTest.cpp \ tests/CppUTest/SimpleMutexTest.cpp \ tests/CppUTest/TeamCityOutputTest.cpp \ tests/CppUTest/TestFailureNaNTest.cpp \ diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index bd3aa563a..2fb125824 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -180,64 +180,6 @@ class GlobalSimpleStringMemoryAccountant MemoryAccountant* accountant_; }; -struct SimpleStringInternalCacheNode; -struct SimpleStringMemoryBlock; - -class SimpleStringInternalCache -{ -public: - SimpleStringInternalCache(); - ~SimpleStringInternalCache(); - - void setAllocator(TestMemoryAllocator* allocator); - - char* alloc(size_t size); - void dealloc(char* memory, size_t size); - - bool hasFreeBlocksOfSize(size_t size); - - void clearCache(); - void clearAllIncludingCurrentlyUsedMemory(); -private: - void printDeallocatingUnknownMemory(char* memory); - - enum { amountOfInternalCacheNodes = 5}; - bool isCached(size_t size); - size_t getIndexForCache(size_t size); - SimpleStringInternalCacheNode* getCacheNodeFromSize(size_t size); - - SimpleStringInternalCacheNode* createInternalCacheNodes(); - void destroyInternalCacheNode(SimpleStringInternalCacheNode * node); - SimpleStringMemoryBlock* createSimpleStringMemoryBlock(size_t sizeOfString, SimpleStringMemoryBlock* next); - void destroySimpleStringMemoryBlock(SimpleStringMemoryBlock * block, size_t size); - void destroySimpleStringMemoryBlockList(SimpleStringMemoryBlock * block, size_t size); - - SimpleStringMemoryBlock* reserveCachedBlockFrom(SimpleStringInternalCacheNode* node); - void releaseCachedBlockFrom(char* memory, SimpleStringInternalCacheNode* node); - void releaseNonCachedMemory(char* memory, size_t size); - - SimpleStringMemoryBlock* allocateNewCacheBlockFrom(SimpleStringInternalCacheNode* node); - SimpleStringMemoryBlock* addToSimpleStringMemoryBlockList(SimpleStringMemoryBlock* newBlock, SimpleStringMemoryBlock* previousHead); - - TestMemoryAllocator* allocator_; - SimpleStringInternalCacheNode* cache_; - SimpleStringMemoryBlock* nonCachedAllocations_; - bool hasWarnedAboutDeallocations; -}; - -class SimpleStringCacheAllocator; -class GlobalSimpleStringCache -{ - SimpleStringCacheAllocator* allocator_; - SimpleStringInternalCache cache_; - -public: - GlobalSimpleStringCache(); - ~GlobalSimpleStringCache(); - - TestMemoryAllocator* getAllocator(); -}; - SimpleString StringFrom(bool value); SimpleString StringFrom(const void* value); SimpleString StringFrom(void (*value)()); diff --git a/include/CppUTest/SimpleStringInternalCache.h b/include/CppUTest/SimpleStringInternalCache.h new file mode 100644 index 000000000..94bfdd808 --- /dev/null +++ b/include/CppUTest/SimpleStringInternalCache.h @@ -0,0 +1,110 @@ +/* + * 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 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 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. + */ + +#ifndef D_SimpleStringInternalCache_h +#define D_SimpleStringInternalCache_h + +#include "CppUTest/TestMemoryAllocator.h" + +struct SimpleStringMemoryBlock; +struct SimpleStringInternalCacheNode; + +class SimpleStringInternalCache +{ +public: + SimpleStringInternalCache(); + ~SimpleStringInternalCache(); + + void setAllocator(TestMemoryAllocator* allocator); + + char* alloc(size_t size); + void dealloc(char* memory, size_t size); + + bool hasFreeBlocksOfSize(size_t size); + + void clearCache(); + void clearAllIncludingCurrentlyUsedMemory(); +private: + void printDeallocatingUnknownMemory(char* memory); + + enum { amountOfInternalCacheNodes = 5}; + bool isCached(size_t size); + size_t getIndexForCache(size_t size); + SimpleStringInternalCacheNode* getCacheNodeFromSize(size_t size); + + SimpleStringInternalCacheNode* createInternalCacheNodes(); + void destroyInternalCacheNode(SimpleStringInternalCacheNode * node); + SimpleStringMemoryBlock* createSimpleStringMemoryBlock(size_t sizeOfString, SimpleStringMemoryBlock* next); + void destroySimpleStringMemoryBlock(SimpleStringMemoryBlock * block, size_t size); + void destroySimpleStringMemoryBlockList(SimpleStringMemoryBlock * block, size_t size); + + SimpleStringMemoryBlock* reserveCachedBlockFrom(SimpleStringInternalCacheNode* node); + void releaseCachedBlockFrom(char* memory, SimpleStringInternalCacheNode* node); + void releaseNonCachedMemory(char* memory, size_t size); + + SimpleStringMemoryBlock* allocateNewCacheBlockFrom(SimpleStringInternalCacheNode* node); + SimpleStringMemoryBlock* addToSimpleStringMemoryBlockList(SimpleStringMemoryBlock* newBlock, SimpleStringMemoryBlock* previousHead); + + TestMemoryAllocator* allocator_; + SimpleStringInternalCacheNode* cache_; + SimpleStringMemoryBlock* nonCachedAllocations_; + bool hasWarnedAboutDeallocations; +}; + +class SimpleStringCacheAllocator : public TestMemoryAllocator +{ +public: + SimpleStringCacheAllocator(SimpleStringInternalCache& cache, TestMemoryAllocator* previousAllocator); + virtual ~SimpleStringCacheAllocator() _destructor_override; + + virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; + virtual void free_memory(char* memory, size_t size, const char* file, size_t line) _override; + + virtual const char* name() const _override; + virtual const char* alloc_name() const _override; + virtual const char* free_name() const _override; + + virtual TestMemoryAllocator* actualAllocator() _override; + TestMemoryAllocator* originalAllocator(); +private: + SimpleStringInternalCache& cache_; + TestMemoryAllocator* originalAllocator_; +}; + +class GlobalSimpleStringCache +{ + SimpleStringCacheAllocator* allocator_; + SimpleStringInternalCache cache_; + +public: + GlobalSimpleStringCache(); + ~GlobalSimpleStringCache(); + + TestMemoryAllocator* getAllocator(); +}; + +#endif diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index 068fe2c39..17e5b11f8 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -257,27 +257,5 @@ class GlobalMemoryAccountant AccountingTestMemoryAllocator* newArrayAllocator_; }; -class SimpleStringInternalCache; - -class SimpleStringCacheAllocator : public TestMemoryAllocator -{ -public: - SimpleStringCacheAllocator(SimpleStringInternalCache& cache, TestMemoryAllocator* previousAllocator); - virtual ~SimpleStringCacheAllocator() _destructor_override; - - virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; - virtual void free_memory(char* memory, size_t size, const char* file, size_t line) _override; - - virtual const char* name() const _override; - virtual const char* alloc_name() const _override; - virtual const char* free_name() const _override; - - virtual TestMemoryAllocator* actualAllocator() _override; - TestMemoryAllocator* originalAllocator(); -private: - SimpleStringInternalCache& cache_; - TestMemoryAllocator* originalAllocator_; -}; - #endif diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 2c39dfcac..f0479f8c1 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -102,242 +102,6 @@ AccountingTestMemoryAllocator* GlobalSimpleStringMemoryAccountant::getAllocator( return allocator_; } -struct SimpleStringMemoryBlock -{ - SimpleStringMemoryBlock* next_; - char* memory_; -}; - -struct SimpleStringInternalCacheNode -{ - size_t size_; - SimpleStringMemoryBlock* freeMemoryHead_; - SimpleStringMemoryBlock* usedMemoryHead_; -}; - -SimpleStringInternalCache::SimpleStringInternalCache() - : allocator_(defaultMallocAllocator()), cache_(NULLPTR), nonCachedAllocations_(NULLPTR), hasWarnedAboutDeallocations(false) -{ - cache_ = createInternalCacheNodes(); -} - -SimpleStringInternalCache::~SimpleStringInternalCache() -{ - allocator_ = defaultMallocAllocator(); - destroyInternalCacheNode(cache_); -} - -void SimpleStringInternalCache::setAllocator(TestMemoryAllocator* allocator) -{ - allocator_ = allocator; -} - -SimpleStringInternalCacheNode* SimpleStringInternalCache::createInternalCacheNodes() -{ - SimpleStringInternalCacheNode* node = (SimpleStringInternalCacheNode*) (void*) allocator_->alloc_memory(sizeof(SimpleStringInternalCacheNode) * amountOfInternalCacheNodes, __FILE__, __LINE__); - - for (int i = 0; i < amountOfInternalCacheNodes; i++) { - node[i].freeMemoryHead_ = NULLPTR; - node[i].usedMemoryHead_ = NULLPTR; - } - node[0].size_ = 32; - node[1].size_ = 64; - node[2].size_ = 96; - node[3].size_ = 128; - node[4].size_ = 256; - return node; -} - -bool SimpleStringInternalCache::isCached(size_t size) -{ - return size <= 256; -} - -size_t SimpleStringInternalCache::getIndexForCache(size_t size) -{ - for (size_t i = 0; i < amountOfInternalCacheNodes; i++) - if (size <= cache_[i].size_) - return i; - return 0; // LCOV_EXCL_LINE -} - -SimpleStringInternalCacheNode* SimpleStringInternalCache::getCacheNodeFromSize(size_t size) -{ - size_t index = getIndexForCache(size); - return &cache_[index]; -} - -void SimpleStringInternalCache::destroyInternalCacheNode(SimpleStringInternalCacheNode * node) -{ - allocator_->free_memory((char*) node, sizeof(SimpleStringInternalCacheNode) * amountOfInternalCacheNodes, __FILE__, __LINE__); -} - -SimpleStringMemoryBlock* SimpleStringInternalCache::createSimpleStringMemoryBlock(size_t size, SimpleStringMemoryBlock* next) -{ - SimpleStringMemoryBlock* block = (SimpleStringMemoryBlock*) (void*) allocator_->alloc_memory(sizeof(SimpleStringMemoryBlock) , __FILE__, __LINE__); - block->memory_ = allocator_->alloc_memory(size , __FILE__, __LINE__); - block->next_ = next; - return block; -} - -void SimpleStringInternalCache::destroySimpleStringMemoryBlock(SimpleStringMemoryBlock * block, size_t size) -{ - allocator_->free_memory(block->memory_, size, __FILE__, __LINE__); - allocator_->free_memory((char*) block, sizeof(SimpleStringMemoryBlock), __FILE__, __LINE__); -} - -void SimpleStringInternalCache::destroySimpleStringMemoryBlockList(SimpleStringMemoryBlock * block, size_t size) -{ - SimpleStringMemoryBlock* current = block; - while (current) { - SimpleStringMemoryBlock* next = current->next_; - destroySimpleStringMemoryBlock(current, size); - current = next; - } -} - -SimpleStringMemoryBlock* SimpleStringInternalCache::addToSimpleStringMemoryBlockList(SimpleStringMemoryBlock* newBlock, SimpleStringMemoryBlock* previousHead) -{ - newBlock->next_ = previousHead; - return newBlock; -} - -bool SimpleStringInternalCache::hasFreeBlocksOfSize(size_t size) -{ - return getCacheNodeFromSize(size)->freeMemoryHead_ != NULLPTR; -} - -SimpleStringMemoryBlock* SimpleStringInternalCache::reserveCachedBlockFrom(SimpleStringInternalCacheNode* node) -{ - SimpleStringMemoryBlock* block = node->freeMemoryHead_; - node->freeMemoryHead_ = block->next_; - node->usedMemoryHead_ = addToSimpleStringMemoryBlockList(block, node->usedMemoryHead_); - return block; -} - -SimpleStringMemoryBlock* SimpleStringInternalCache::allocateNewCacheBlockFrom(SimpleStringInternalCacheNode* node) -{ - SimpleStringMemoryBlock* block = createSimpleStringMemoryBlock(node->size_, node->usedMemoryHead_); - node->usedMemoryHead_ = addToSimpleStringMemoryBlockList(block, node->usedMemoryHead_); - return block; -} - -void SimpleStringInternalCache::printDeallocatingUnknownMemory(char* memory) -{ - if (!hasWarnedAboutDeallocations) { - hasWarnedAboutDeallocations = true; - UtestShell::getCurrent()->print(StringFromFormat("\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" - "This is likely due statics and will cause problems.\n" - "Only warning once to avoid recursive warnings.\n" - "String we are deallocating: \"%s\"\n", memory).asCharString(), __FILE__, __LINE__); - } -} - -void SimpleStringInternalCache::releaseCachedBlockFrom(char* memory, SimpleStringInternalCacheNode* node) -{ - if (node->usedMemoryHead_ && node->usedMemoryHead_->memory_ == memory) { - SimpleStringMemoryBlock* block = node->usedMemoryHead_; - node->usedMemoryHead_ = node->usedMemoryHead_->next_; - node->freeMemoryHead_ = addToSimpleStringMemoryBlockList(block, node->freeMemoryHead_); - return; - } - - for (SimpleStringMemoryBlock* block = node->usedMemoryHead_; block; block = block->next_) { - if (block->next_ && block->next_->memory_ == memory) { - SimpleStringMemoryBlock* blockToFree = block->next_; - block->next_ = block->next_->next_; - node->freeMemoryHead_ = addToSimpleStringMemoryBlockList(blockToFree, node->freeMemoryHead_); - return; - } - } - printDeallocatingUnknownMemory(memory); - -} - -void SimpleStringInternalCache::releaseNonCachedMemory(char* memory, size_t size) -{ - if (nonCachedAllocations_ && nonCachedAllocations_->memory_ == memory) { - SimpleStringMemoryBlock* block = nonCachedAllocations_; - nonCachedAllocations_ = block->next_; - destroySimpleStringMemoryBlock(block, size); - return; - } - - for (SimpleStringMemoryBlock* block = nonCachedAllocations_; block; block = block->next_) { - if (block->next_ && block->next_->memory_ == memory) { - SimpleStringMemoryBlock* blockToFree = block->next_; - block->next_ = block->next_->next_; - destroySimpleStringMemoryBlock(blockToFree, size); - return; - } - } - - printDeallocatingUnknownMemory(memory); -} - -char* SimpleStringInternalCache::alloc(size_t size) -{ - if (isCached(size)) { - if (hasFreeBlocksOfSize(size)) - return reserveCachedBlockFrom(getCacheNodeFromSize(size))->memory_; - else - return allocateNewCacheBlockFrom(getCacheNodeFromSize(size))->memory_; - } - - nonCachedAllocations_ = createSimpleStringMemoryBlock(size, nonCachedAllocations_); - return nonCachedAllocations_->memory_; -} - -void SimpleStringInternalCache::dealloc(char* memory, size_t size) -{ - if (isCached(size)) { - size_t index = getIndexForCache(size); - SimpleStringInternalCacheNode* cacheNode = &cache_[index]; - releaseCachedBlockFrom(memory, cacheNode); - return; - } - releaseNonCachedMemory(memory, size); -} - -void SimpleStringInternalCache::clearCache() -{ - for (size_t i = 0; i < amountOfInternalCacheNodes; i++) { - destroySimpleStringMemoryBlockList(cache_[i].freeMemoryHead_, cache_[i].size_); - cache_[i].freeMemoryHead_ = NULLPTR; - } -} - -void SimpleStringInternalCache::clearAllIncludingCurrentlyUsedMemory() -{ - for (size_t i = 0; i < amountOfInternalCacheNodes; i++) { - destroySimpleStringMemoryBlockList(cache_[i].freeMemoryHead_, cache_[i].size_); - destroySimpleStringMemoryBlockList(cache_[i].usedMemoryHead_, cache_[i].size_); - cache_[i].freeMemoryHead_ = NULLPTR; - cache_[i].usedMemoryHead_ = NULLPTR; - } - - destroySimpleStringMemoryBlockList(nonCachedAllocations_, 0); - nonCachedAllocations_ = NULLPTR; -} - -GlobalSimpleStringCache::GlobalSimpleStringCache() -{ - allocator_ = new SimpleStringCacheAllocator(cache_, SimpleString::getStringAllocator()); - SimpleString::setStringAllocator(allocator_); -} - -GlobalSimpleStringCache::~GlobalSimpleStringCache() -{ - SimpleString::setStringAllocator(allocator_->originalAllocator()); - cache_.clearAllIncludingCurrentlyUsedMemory(); - delete allocator_; -} - -TestMemoryAllocator* GlobalSimpleStringCache::getAllocator() -{ - return allocator_; -} - TestMemoryAllocator* SimpleString::stringAllocator_ = NULLPTR; TestMemoryAllocator* SimpleString::getStringAllocator() diff --git a/src/CppUTest/SimpleStringInternalCache.cpp b/src/CppUTest/SimpleStringInternalCache.cpp new file mode 100644 index 000000000..77bcbca0b --- /dev/null +++ b/src/CppUTest/SimpleStringInternalCache.cpp @@ -0,0 +1,312 @@ +/* + * 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 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 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/SimpleStringInternalCache.h" + +struct SimpleStringMemoryBlock +{ + SimpleStringMemoryBlock* next_; + char* memory_; +}; + +struct SimpleStringInternalCacheNode +{ + size_t size_; + SimpleStringMemoryBlock* freeMemoryHead_; + SimpleStringMemoryBlock* usedMemoryHead_; +}; + +SimpleStringInternalCache::SimpleStringInternalCache() + : allocator_(defaultMallocAllocator()), cache_(NULLPTR), nonCachedAllocations_(NULLPTR), hasWarnedAboutDeallocations(false) +{ + cache_ = createInternalCacheNodes(); +} + +SimpleStringInternalCache::~SimpleStringInternalCache() +{ + allocator_ = defaultMallocAllocator(); + destroyInternalCacheNode(cache_); +} + +void SimpleStringInternalCache::setAllocator(TestMemoryAllocator* allocator) +{ + allocator_ = allocator; +} + +SimpleStringInternalCacheNode* SimpleStringInternalCache::createInternalCacheNodes() +{ + SimpleStringInternalCacheNode* node = (SimpleStringInternalCacheNode*) (void*) allocator_->alloc_memory(sizeof(SimpleStringInternalCacheNode) * amountOfInternalCacheNodes, __FILE__, __LINE__); + + for (int i = 0; i < amountOfInternalCacheNodes; i++) { + node[i].freeMemoryHead_ = NULLPTR; + node[i].usedMemoryHead_ = NULLPTR; + } + node[0].size_ = 32; + node[1].size_ = 64; + node[2].size_ = 96; + node[3].size_ = 128; + node[4].size_ = 256; + return node; +} + +bool SimpleStringInternalCache::isCached(size_t size) +{ + return size <= 256; +} + +size_t SimpleStringInternalCache::getIndexForCache(size_t size) +{ + for (size_t i = 0; i < amountOfInternalCacheNodes; i++) + if (size <= cache_[i].size_) + return i; + return 0; // LCOV_EXCL_LINE +} + +SimpleStringInternalCacheNode* SimpleStringInternalCache::getCacheNodeFromSize(size_t size) +{ + size_t index = getIndexForCache(size); + return &cache_[index]; +} + +void SimpleStringInternalCache::destroyInternalCacheNode(SimpleStringInternalCacheNode * node) +{ + allocator_->free_memory((char*) node, sizeof(SimpleStringInternalCacheNode) * amountOfInternalCacheNodes, __FILE__, __LINE__); +} + +SimpleStringMemoryBlock* SimpleStringInternalCache::createSimpleStringMemoryBlock(size_t size, SimpleStringMemoryBlock* next) +{ + SimpleStringMemoryBlock* block = (SimpleStringMemoryBlock*) (void*) allocator_->alloc_memory(sizeof(SimpleStringMemoryBlock) , __FILE__, __LINE__); + block->memory_ = allocator_->alloc_memory(size , __FILE__, __LINE__); + block->next_ = next; + return block; +} + +void SimpleStringInternalCache::destroySimpleStringMemoryBlock(SimpleStringMemoryBlock * block, size_t size) +{ + allocator_->free_memory(block->memory_, size, __FILE__, __LINE__); + allocator_->free_memory((char*) block, sizeof(SimpleStringMemoryBlock), __FILE__, __LINE__); +} + +void SimpleStringInternalCache::destroySimpleStringMemoryBlockList(SimpleStringMemoryBlock * block, size_t size) +{ + SimpleStringMemoryBlock* current = block; + while (current) { + SimpleStringMemoryBlock* next = current->next_; + destroySimpleStringMemoryBlock(current, size); + current = next; + } +} + +SimpleStringMemoryBlock* SimpleStringInternalCache::addToSimpleStringMemoryBlockList(SimpleStringMemoryBlock* newBlock, SimpleStringMemoryBlock* previousHead) +{ + newBlock->next_ = previousHead; + return newBlock; +} + +bool SimpleStringInternalCache::hasFreeBlocksOfSize(size_t size) +{ + return getCacheNodeFromSize(size)->freeMemoryHead_ != NULLPTR; +} + +SimpleStringMemoryBlock* SimpleStringInternalCache::reserveCachedBlockFrom(SimpleStringInternalCacheNode* node) +{ + SimpleStringMemoryBlock* block = node->freeMemoryHead_; + node->freeMemoryHead_ = block->next_; + node->usedMemoryHead_ = addToSimpleStringMemoryBlockList(block, node->usedMemoryHead_); + return block; +} + +SimpleStringMemoryBlock* SimpleStringInternalCache::allocateNewCacheBlockFrom(SimpleStringInternalCacheNode* node) +{ + SimpleStringMemoryBlock* block = createSimpleStringMemoryBlock(node->size_, node->usedMemoryHead_); + node->usedMemoryHead_ = addToSimpleStringMemoryBlockList(block, node->usedMemoryHead_); + return block; +} + +void SimpleStringInternalCache::printDeallocatingUnknownMemory(char* memory) +{ + if (!hasWarnedAboutDeallocations) { + hasWarnedAboutDeallocations = true; + UtestShell::getCurrent()->print(StringFromFormat("\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" + "This is likely due statics and will cause problems.\n" + "Only warning once to avoid recursive warnings.\n" + "String we are deallocating: \"%s\"\n", memory).asCharString(), __FILE__, __LINE__); + } +} + +void SimpleStringInternalCache::releaseCachedBlockFrom(char* memory, SimpleStringInternalCacheNode* node) +{ + if (node->usedMemoryHead_ && node->usedMemoryHead_->memory_ == memory) { + SimpleStringMemoryBlock* block = node->usedMemoryHead_; + node->usedMemoryHead_ = node->usedMemoryHead_->next_; + node->freeMemoryHead_ = addToSimpleStringMemoryBlockList(block, node->freeMemoryHead_); + return; + } + + for (SimpleStringMemoryBlock* block = node->usedMemoryHead_; block; block = block->next_) { + if (block->next_ && block->next_->memory_ == memory) { + SimpleStringMemoryBlock* blockToFree = block->next_; + block->next_ = block->next_->next_; + node->freeMemoryHead_ = addToSimpleStringMemoryBlockList(blockToFree, node->freeMemoryHead_); + return; + } + } + printDeallocatingUnknownMemory(memory); + +} + +void SimpleStringInternalCache::releaseNonCachedMemory(char* memory, size_t size) +{ + if (nonCachedAllocations_ && nonCachedAllocations_->memory_ == memory) { + SimpleStringMemoryBlock* block = nonCachedAllocations_; + nonCachedAllocations_ = block->next_; + destroySimpleStringMemoryBlock(block, size); + return; + } + + for (SimpleStringMemoryBlock* block = nonCachedAllocations_; block; block = block->next_) { + if (block->next_ && block->next_->memory_ == memory) { + SimpleStringMemoryBlock* blockToFree = block->next_; + block->next_ = block->next_->next_; + destroySimpleStringMemoryBlock(blockToFree, size); + return; + } + } + + printDeallocatingUnknownMemory(memory); +} + +char* SimpleStringInternalCache::alloc(size_t size) +{ + if (isCached(size)) { + if (hasFreeBlocksOfSize(size)) + return reserveCachedBlockFrom(getCacheNodeFromSize(size))->memory_; + else + return allocateNewCacheBlockFrom(getCacheNodeFromSize(size))->memory_; + } + + nonCachedAllocations_ = createSimpleStringMemoryBlock(size, nonCachedAllocations_); + return nonCachedAllocations_->memory_; +} + +void SimpleStringInternalCache::dealloc(char* memory, size_t size) +{ + if (isCached(size)) { + size_t index = getIndexForCache(size); + SimpleStringInternalCacheNode* cacheNode = &cache_[index]; + releaseCachedBlockFrom(memory, cacheNode); + return; + } + releaseNonCachedMemory(memory, size); +} + +void SimpleStringInternalCache::clearCache() +{ + for (size_t i = 0; i < amountOfInternalCacheNodes; i++) { + destroySimpleStringMemoryBlockList(cache_[i].freeMemoryHead_, cache_[i].size_); + cache_[i].freeMemoryHead_ = NULLPTR; + } +} + +void SimpleStringInternalCache::clearAllIncludingCurrentlyUsedMemory() +{ + for (size_t i = 0; i < amountOfInternalCacheNodes; i++) { + destroySimpleStringMemoryBlockList(cache_[i].freeMemoryHead_, cache_[i].size_); + destroySimpleStringMemoryBlockList(cache_[i].usedMemoryHead_, cache_[i].size_); + cache_[i].freeMemoryHead_ = NULLPTR; + cache_[i].usedMemoryHead_ = NULLPTR; + } + + destroySimpleStringMemoryBlockList(nonCachedAllocations_, 0); + nonCachedAllocations_ = NULLPTR; +} + +GlobalSimpleStringCache::GlobalSimpleStringCache() +{ + allocator_ = new SimpleStringCacheAllocator(cache_, SimpleString::getStringAllocator()); + SimpleString::setStringAllocator(allocator_); +} + +GlobalSimpleStringCache::~GlobalSimpleStringCache() +{ + SimpleString::setStringAllocator(allocator_->originalAllocator()); + cache_.clearAllIncludingCurrentlyUsedMemory(); + delete allocator_; +} + +TestMemoryAllocator* GlobalSimpleStringCache::getAllocator() +{ + return allocator_; +} + +SimpleStringCacheAllocator::SimpleStringCacheAllocator(SimpleStringInternalCache& cache, TestMemoryAllocator* originalAllocator) + : cache_(cache), originalAllocator_(originalAllocator) +{ + cache_.setAllocator(originalAllocator); +} + +SimpleStringCacheAllocator::~SimpleStringCacheAllocator() +{ + cache_.setAllocator(NULLPTR); +} + +char* SimpleStringCacheAllocator::alloc_memory(size_t size, const char*, size_t) +{ + return cache_.alloc(size); +} + +void SimpleStringCacheAllocator::free_memory(char* memory, size_t size, const char*, size_t) +{ + cache_.dealloc(memory, size); +} + +const char* SimpleStringCacheAllocator::name() const +{ + return "SimpleStringCacheAllocator"; +} + +const char* SimpleStringCacheAllocator::alloc_name() const +{ + return originalAllocator_->alloc_name(); +} + +const char* SimpleStringCacheAllocator::free_name() const +{ + return originalAllocator_->free_name(); +} + +TestMemoryAllocator* SimpleStringCacheAllocator::actualAllocator() +{ + return originalAllocator_->actualAllocator(); +} + +TestMemoryAllocator* SimpleStringCacheAllocator::originalAllocator() +{ + return originalAllocator_; +} + diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index c19562a3f..0b2829280 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -790,49 +790,3 @@ TestMemoryAllocator* GlobalMemoryAccountant::getNewArrayAllocator() return newArrayAllocator_; } -SimpleStringCacheAllocator::SimpleStringCacheAllocator(SimpleStringInternalCache& cache, TestMemoryAllocator* originalAllocator) - : cache_(cache), originalAllocator_(originalAllocator) -{ - cache_.setAllocator(originalAllocator); -} - -SimpleStringCacheAllocator::~SimpleStringCacheAllocator() -{ - cache_.setAllocator(NULLPTR); -} - -char* SimpleStringCacheAllocator::alloc_memory(size_t size, const char*, size_t) -{ - return cache_.alloc(size); -} - -void SimpleStringCacheAllocator::free_memory(char* memory, size_t size, const char*, size_t) -{ - cache_.dealloc(memory, size); -} - -const char* SimpleStringCacheAllocator::name() const -{ - return "SimpleStringCacheAllocator"; -} - -const char* SimpleStringCacheAllocator::alloc_name() const -{ - return originalAllocator_->alloc_name(); -} - -const char* SimpleStringCacheAllocator::free_name() const -{ - return originalAllocator_->free_name(); -} - -TestMemoryAllocator* SimpleStringCacheAllocator::actualAllocator() -{ - return originalAllocator_->actualAllocator(); -} - -TestMemoryAllocator* SimpleStringCacheAllocator::originalAllocator() -{ - return originalAllocator_; -} - diff --git a/tests/CppUTest/AllTests.cpp b/tests/CppUTest/AllTests.cpp index 6e97ea169..0ae63fdc7 100644 --- a/tests/CppUTest/AllTests.cpp +++ b/tests/CppUTest/AllTests.cpp @@ -27,6 +27,7 @@ #include "CppUTest/CommandLineTestRunner.h" #include "CppUTest/TestMemoryAllocator.h" +#include "CppUTest/SimpleStringInternalCache.h" #define SHOW_MEMORY_REPORT 0 diff --git a/tests/CppUTest/SimpleStringInternalCacheTest.cpp b/tests/CppUTest/SimpleStringInternalCacheTest.cpp new file mode 100644 index 000000000..e59406fe1 --- /dev/null +++ b/tests/CppUTest/SimpleStringInternalCacheTest.cpp @@ -0,0 +1,390 @@ +/* + * 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 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 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/SimpleStringInternalCache.h" +#include "CppUTest/TestTestingFixture.h" + +class TestFunctionWithCache : public ExecFunction +{ +public: + void (*testFunction)(SimpleStringInternalCache*, size_t); + SimpleStringInternalCache* parameter; + size_t allocationSize; + + void exec() _override + { + testFunction(parameter, allocationSize); + } +}; + +TEST_GROUP(SimpleStringInternalCache) +{ + SimpleStringInternalCache cache; + MemoryAccountant accountant; + MemoryLeakAllocator* defaultAllocator; + AccountingTestMemoryAllocator* allocator; + + TestFunctionWithCache testFunction; + TestTestingFixture fixture; + + void setup() + { + fixture.setTestFunction(&testFunction); + testFunction.parameter = &cache; + + defaultAllocator = new MemoryLeakAllocator(defaultMallocAllocator()); + allocator = new AccountingTestMemoryAllocator(accountant, defaultAllocator); + cache.setAllocator(defaultAllocator); + } + + void teardown() + { + cache.clearAllIncludingCurrentlyUsedMemory(); + accountant.clear(); + delete allocator; + delete defaultAllocator; + } + + void createCacheForSize(size_t size, size_t amount) + { + for (size_t i = 0; i < amount; i++) { + char* memory = cache.alloc(size); + cache.dealloc(memory, size); + } + } +}; + +TEST(SimpleStringInternalCache, cacheHitWithOneEntry) +{ + createCacheForSize(10, 1); + cache.setAllocator(allocator); + + char* mem = cache.alloc(10); + mem[0] = 'B'; + mem[3] = 'A'; + mem[9] = 'S'; + + cache.setAllocator(allocator->originalAllocator()); + + LONGS_EQUAL(0, accountant.totalAllocationsOfSize(10)); + CHECK(!cache.hasFreeBlocksOfSize(10)); + + cache.setAllocator(allocator); +} + +TEST(SimpleStringInternalCache, cacheHitWithTwoEntries) +{ + createCacheForSize(10, 2); + cache.setAllocator(allocator); + + cache.alloc(10); + cache.alloc(10); + + cache.setAllocator(allocator->originalAllocator()); + + LONGS_EQUAL(0, accountant.totalAllocationsOfSize(10)); + CHECK(!cache.hasFreeBlocksOfSize(10)); + + cache.setAllocator(allocator); +} + +TEST(SimpleStringInternalCache, allocatingMoreThanCacheAvailable) +{ + createCacheForSize(10, 1); + cache.setAllocator(allocator); + + cache.alloc(10); + cache.alloc(10); + + cache.setAllocator(allocator->originalAllocator()); + + LONGS_EQUAL(1, accountant.totalAllocationsOfSize(32)); + CHECK(!cache.hasFreeBlocksOfSize(10)); + + cache.setAllocator(allocator); +} + + +TEST(SimpleStringInternalCache, allocationWillReuseTheAllocatedBlocks) +{ + cache.setAllocator(allocator); + + char* mem = cache.alloc(10); + cache.dealloc(mem, 10); + mem = cache.alloc(10); + cache.dealloc(mem, 10); + + LONGS_EQUAL(1, accountant.totalAllocationsOfSize(32)); +} + + +TEST(SimpleStringInternalCache, multipleDifferentSizeAllocationsAndDeallocations) +{ + cache.setAllocator(allocator); + + char* mem10 = cache.alloc(10); + char* mem11 = cache.alloc(11); + + char* mem100 = cache.alloc(100); + cache.dealloc(mem100, 100); + + char* mem101 = cache.alloc(101); + char* mem102 = cache.alloc(102); + char* mem103 = cache.alloc(103); + cache.dealloc(mem101, 102); + cache.dealloc(mem102, 103); + cache.dealloc(mem103, 104); + + cache.alloc(105); + cache.alloc(106); + cache.alloc(107); + + cache.dealloc(mem10, 10); + cache.dealloc(mem11, 11); + + LONGS_EQUAL(2, accountant.totalAllocationsOfSize(32)); + LONGS_EQUAL(3, accountant.totalAllocationsOfSize(128)); +} + +TEST(SimpleStringInternalCache, deallocOfCachedMemoryWillNotDealloc) +{ + cache.setAllocator(allocator); + + char* mem = cache.alloc(10); + cache.dealloc(mem, 10); + + LONGS_EQUAL(0, accountant.totalDeallocationsOfSize(32)); +} + +TEST(SimpleStringInternalCache, clearCacheWillRemoveAllCachedMemoryButNotAllUsedMemory) +{ + cache.setAllocator(allocator); + + char* mem = cache.alloc(10); + cache.dealloc(mem, 10); + + mem = cache.alloc(60); + + cache.clearCache(); + + LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(32)); + LONGS_EQUAL(0, accountant.totalDeallocationsOfSize(64)); +} + +TEST(SimpleStringInternalCache, clearAllIncludingCurrentlyUsedMemory) +{ + cache.setAllocator(allocator); + + cache.alloc(60); + + cache.clearAllIncludingCurrentlyUsedMemory(); + + LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(64)); +} + + + +TEST(SimpleStringInternalCache, allocatingLargerStringThanCached) +{ + cache.setAllocator(allocator); + + char* mem = cache.alloc(1234); + cache.dealloc(mem, 1234); + + LONGS_EQUAL(1, accountant.totalAllocationsOfSize(1234)); + LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(1234)); +} + +TEST(SimpleStringInternalCache, allocatingMultipleLargerStringThanCached) +{ + cache.setAllocator(allocator); + + char* mem = cache.alloc(1234); + char* mem2 = cache.alloc(1234); + char* mem3 = cache.alloc(1234); + + cache.dealloc(mem2, 1234); + cache.dealloc(mem, 1234); + cache.dealloc(mem3, 1234); + + LONGS_EQUAL(3, accountant.totalAllocationsOfSize(1234)); + LONGS_EQUAL(3, accountant.totalDeallocationsOfSize(1234)); +} + + +TEST(SimpleStringInternalCache, clearAllIncludingCurrentlyUsedMemoryAlsoReleasesLargeNonCachesMemory) +{ + cache.setAllocator(allocator); + + cache.alloc(1234); + cache.alloc(1234); + cache.alloc(1234); + + cache.clearAllIncludingCurrentlyUsedMemory(); + + LONGS_EQUAL(3, accountant.totalAllocationsOfSize(1234)); + LONGS_EQUAL(3, accountant.totalDeallocationsOfSize(1234)); +} + +static void _deallocatingStringMemoryThatWasntAllocatedWithCache(SimpleStringInternalCache* cache, size_t allocationSize) +{ + char* mem = defaultMallocAllocator()->alloc_memory(allocationSize, __FILE__, __LINE__); + mem[0] = 'B'; + mem[1] = 'a'; + mem[2] = 's'; + mem[3] = '\0'; + cache->dealloc(mem, allocationSize); + defaultMallocAllocator()->free_memory(mem, allocationSize, __FILE__, __LINE__); +} + +TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarning) +{ + testFunction.testFunction = _deallocatingStringMemoryThatWasntAllocatedWithCache; + testFunction.allocationSize = 123; + + cache.setAllocator(allocator); + fixture.runAllTests(); + + fixture.assertPrintContains("\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" + "This is likely due statics and will cause problems.\n" + "Only warning once to avoid recursive warnings.\n" + "String we are deallocating: \"Bas\"\n"); + +} + +static void _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache(SimpleStringInternalCache* cache, size_t allocationSize) +{ + char* mem = defaultMallocAllocator()->alloc_memory(allocationSize, __FILE__, __LINE__); + mem[0] = '\0'; + cache->dealloc(mem, allocationSize); + cache->dealloc(mem, allocationSize); + defaultMallocAllocator()->free_memory(mem, allocationSize, __FILE__, __LINE__); +} + +TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarningButOnlyOnce) +{ + testFunction.testFunction = _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache; + testFunction.allocationSize = 123; + + cache.setAllocator(allocator); + fixture.runAllTests(); + + LONGS_EQUAL(1, fixture.getOutput().count("WARNING")); +} + +TEST(SimpleStringInternalCache, deallocatingLargeMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarning) +{ + testFunction.testFunction = _deallocatingStringMemoryThatWasntAllocatedWithCache; + testFunction.allocationSize = 12345; + + cache.setAllocator(allocator); + fixture.runAllTests(); + + fixture.assertPrintContains("\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" + "This is likely due statics and will cause problems.\n" + "Only warning once to avoid recursive warnings.\n" + "String we are deallocating: \"Bas\"\n"); + +} + +TEST(SimpleStringInternalCache, deallocatingLargeMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarningButOnlyOnce) +{ + testFunction.testFunction = _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache; + testFunction.allocationSize = 12345; + + cache.setAllocator(allocator); + fixture.runAllTests(); + + LONGS_EQUAL(1, fixture.getOutput().count("WARNING")); +} + +TEST_GROUP(SimpleStringCacheAllocator) +{ + SimpleStringCacheAllocator* allocator; + SimpleStringInternalCache cache; + MemoryAccountant accountant; + AccountingTestMemoryAllocator* accountingAllocator; + + void setup() + { + accountingAllocator = new AccountingTestMemoryAllocator(accountant, defaultMallocAllocator()); + allocator = new SimpleStringCacheAllocator(cache, accountingAllocator); + } + + void teardown() + { + cache.clearCache(); + delete allocator; + delete accountingAllocator; + } +}; + +TEST(SimpleStringCacheAllocator, allocationIsCached) +{ + char* mem = allocator->alloc_memory(10, __FILE__, __LINE__); + allocator->free_memory(mem, 10, __FILE__, __LINE__); + + size_t totalAllocations = accountant.totalAllocations(); + size_t totalDeallocations = accountant.totalDeallocations(); + + mem = allocator->alloc_memory(10, __FILE__, __LINE__); + allocator->free_memory(mem, 10, __FILE__, __LINE__); + + LONGS_EQUAL(totalAllocations, accountant.totalAllocations()); + LONGS_EQUAL(totalDeallocations, accountant.totalDeallocations()); +} + +TEST(SimpleStringCacheAllocator, originalAllocator) +{ + POINTERS_EQUAL(defaultMallocAllocator(), allocator->actualAllocator()); + STRCMP_EQUAL(defaultMallocAllocator()->alloc_name(), allocator->alloc_name()); + STRCMP_EQUAL(defaultMallocAllocator()->free_name(), allocator->free_name()); +} + +TEST(SimpleStringCacheAllocator, name) +{ + STRCMP_EQUAL("SimpleStringCacheAllocator", allocator->name()); +} + + + +TEST_GROUP(GlobalSimpleStringCache) +{ +}; + +TEST(GlobalSimpleStringCache, installsAndRemovedCache) +{ + TestMemoryAllocator* originalStringAllocator = SimpleString::getStringAllocator(); + { + GlobalSimpleStringCache cache; + STRCMP_EQUAL("SimpleStringCacheAllocator", SimpleString::getStringAllocator()->name()); + POINTERS_EQUAL(cache.getAllocator(), SimpleString::getStringAllocator()); + } + POINTERS_EQUAL(originalStringAllocator, SimpleString::getStringAllocator()); +} + diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index e01bddd72..fa1f779bb 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -1263,312 +1263,3 @@ TEST(SimpleString, BracketsFormattedHexStringFromForULongLong) #endif -class TestFunctionWithCache : public ExecFunction -{ -public: - void (*testFunction)(SimpleStringInternalCache*, size_t); - SimpleStringInternalCache* parameter; - size_t allocationSize; - - void exec() _override - { - testFunction(parameter, allocationSize); - } -}; - -TEST_GROUP(SimpleStringInternalCache) -{ - SimpleStringInternalCache cache; - MemoryAccountant accountant; - MemoryLeakAllocator* defaultAllocator; - AccountingTestMemoryAllocator* allocator; - - TestFunctionWithCache testFunction; - TestTestingFixture fixture; - - void setup() - { - fixture.setTestFunction(&testFunction); - testFunction.parameter = &cache; - - defaultAllocator = new MemoryLeakAllocator(defaultMallocAllocator()); - allocator = new AccountingTestMemoryAllocator(accountant, defaultAllocator); - cache.setAllocator(defaultAllocator); - } - - void teardown() - { - cache.clearAllIncludingCurrentlyUsedMemory(); - accountant.clear(); - delete allocator; - delete defaultAllocator; - } - - void createCacheForSize(size_t size, size_t amount) - { - for (size_t i = 0; i < amount; i++) { - char* memory = cache.alloc(size); - cache.dealloc(memory, size); - } - } -}; - -TEST(SimpleStringInternalCache, cacheHitWithOneEntry) -{ - createCacheForSize(10, 1); - cache.setAllocator(allocator); - - char* mem = cache.alloc(10); - mem[0] = 'B'; - mem[3] = 'A'; - mem[9] = 'S'; - - cache.setAllocator(allocator->originalAllocator()); - - LONGS_EQUAL(0, accountant.totalAllocationsOfSize(10)); - CHECK(!cache.hasFreeBlocksOfSize(10)); - - cache.setAllocator(allocator); -} - -TEST(SimpleStringInternalCache, cacheHitWithTwoEntries) -{ - createCacheForSize(10, 2); - cache.setAllocator(allocator); - - cache.alloc(10); - cache.alloc(10); - - cache.setAllocator(allocator->originalAllocator()); - - LONGS_EQUAL(0, accountant.totalAllocationsOfSize(10)); - CHECK(!cache.hasFreeBlocksOfSize(10)); - - cache.setAllocator(allocator); -} - -TEST(SimpleStringInternalCache, allocatingMoreThanCacheAvailable) -{ - createCacheForSize(10, 1); - cache.setAllocator(allocator); - - cache.alloc(10); - cache.alloc(10); - - cache.setAllocator(allocator->originalAllocator()); - - LONGS_EQUAL(1, accountant.totalAllocationsOfSize(32)); - CHECK(!cache.hasFreeBlocksOfSize(10)); - - cache.setAllocator(allocator); -} - - -TEST(SimpleStringInternalCache, allocationWillReuseTheAllocatedBlocks) -{ - cache.setAllocator(allocator); - - char* mem = cache.alloc(10); - cache.dealloc(mem, 10); - mem = cache.alloc(10); - cache.dealloc(mem, 10); - - LONGS_EQUAL(1, accountant.totalAllocationsOfSize(32)); -} - - -TEST(SimpleStringInternalCache, multipleDifferentSizeAllocationsAndDeallocations) -{ - cache.setAllocator(allocator); - - char* mem10 = cache.alloc(10); - char* mem11 = cache.alloc(11); - - char* mem100 = cache.alloc(100); - cache.dealloc(mem100, 100); - - char* mem101 = cache.alloc(101); - char* mem102 = cache.alloc(102); - char* mem103 = cache.alloc(103); - cache.dealloc(mem101, 102); - cache.dealloc(mem102, 103); - cache.dealloc(mem103, 104); - - cache.alloc(105); - cache.alloc(106); - cache.alloc(107); - - cache.dealloc(mem10, 10); - cache.dealloc(mem11, 11); - - LONGS_EQUAL(2, accountant.totalAllocationsOfSize(32)); - LONGS_EQUAL(3, accountant.totalAllocationsOfSize(128)); -} - -TEST(SimpleStringInternalCache, deallocOfCachedMemoryWillNotDealloc) -{ - cache.setAllocator(allocator); - - char* mem = cache.alloc(10); - cache.dealloc(mem, 10); - - LONGS_EQUAL(0, accountant.totalDeallocationsOfSize(32)); -} - -TEST(SimpleStringInternalCache, clearCacheWillRemoveAllCachedMemoryButNotAllUsedMemory) -{ - cache.setAllocator(allocator); - - char* mem = cache.alloc(10); - cache.dealloc(mem, 10); - - mem = cache.alloc(60); - - cache.clearCache(); - - LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(32)); - LONGS_EQUAL(0, accountant.totalDeallocationsOfSize(64)); -} - -TEST(SimpleStringInternalCache, clearAllIncludingCurrentlyUsedMemory) -{ - cache.setAllocator(allocator); - - cache.alloc(60); - - cache.clearAllIncludingCurrentlyUsedMemory(); - - LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(64)); -} - - - -TEST(SimpleStringInternalCache, allocatingLargerStringThanCached) -{ - cache.setAllocator(allocator); - - char* mem = cache.alloc(1234); - cache.dealloc(mem, 1234); - - LONGS_EQUAL(1, accountant.totalAllocationsOfSize(1234)); - LONGS_EQUAL(1, accountant.totalDeallocationsOfSize(1234)); -} - -TEST(SimpleStringInternalCache, allocatingMultipleLargerStringThanCached) -{ - cache.setAllocator(allocator); - - char* mem = cache.alloc(1234); - char* mem2 = cache.alloc(1234); - char* mem3 = cache.alloc(1234); - - cache.dealloc(mem2, 1234); - cache.dealloc(mem, 1234); - cache.dealloc(mem3, 1234); - - LONGS_EQUAL(3, accountant.totalAllocationsOfSize(1234)); - LONGS_EQUAL(3, accountant.totalDeallocationsOfSize(1234)); -} - - -TEST(SimpleStringInternalCache, clearAllIncludingCurrentlyUsedMemoryAlsoReleasesLargeNonCachesMemory) -{ - cache.setAllocator(allocator); - - cache.alloc(1234); - cache.alloc(1234); - cache.alloc(1234); - - cache.clearAllIncludingCurrentlyUsedMemory(); - - LONGS_EQUAL(3, accountant.totalAllocationsOfSize(1234)); - LONGS_EQUAL(3, accountant.totalDeallocationsOfSize(1234)); -} - -static void _deallocatingStringMemoryThatWasntAllocatedWithCache(SimpleStringInternalCache* cache, size_t allocationSize) -{ - char* mem = defaultMallocAllocator()->alloc_memory(allocationSize, __FILE__, __LINE__); - mem[0] = 'B'; - mem[1] = 'a'; - mem[2] = 's'; - mem[3] = '\0'; - cache->dealloc(mem, allocationSize); - defaultMallocAllocator()->free_memory(mem, allocationSize, __FILE__, __LINE__); -} - -TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarning) -{ - testFunction.testFunction = _deallocatingStringMemoryThatWasntAllocatedWithCache; - testFunction.allocationSize = 123; - - cache.setAllocator(allocator); - fixture.runAllTests(); - - fixture.assertPrintContains("\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" - "This is likely due statics and will cause problems.\n" - "Only warning once to avoid recursive warnings.\n" - "String we are deallocating: \"Bas\"\n"); - -} - -static void _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache(SimpleStringInternalCache* cache, size_t allocationSize) -{ - char* mem = defaultMallocAllocator()->alloc_memory(allocationSize, __FILE__, __LINE__); - mem[0] = '\0'; - cache->dealloc(mem, allocationSize); - cache->dealloc(mem, allocationSize); - defaultMallocAllocator()->free_memory(mem, allocationSize, __FILE__, __LINE__); -} - -TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarningButOnlyOnce) -{ - testFunction.testFunction = _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache; - testFunction.allocationSize = 123; - - cache.setAllocator(allocator); - fixture.runAllTests(); - - LONGS_EQUAL(1, fixture.getOutput().count("WARNING")); -} - -TEST(SimpleStringInternalCache, deallocatingLargeMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarning) -{ - testFunction.testFunction = _deallocatingStringMemoryThatWasntAllocatedWithCache; - testFunction.allocationSize = 12345; - - cache.setAllocator(allocator); - fixture.runAllTests(); - - fixture.assertPrintContains("\nWARNING: Attempting to deallocate a String buffer that was allocated while not caching. Ignoring it!\n" - "This is likely due statics and will cause problems.\n" - "Only warning once to avoid recursive warnings.\n" - "String we are deallocating: \"Bas\"\n"); - -} - -TEST(SimpleStringInternalCache, deallocatingLargeMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarningButOnlyOnce) -{ - testFunction.testFunction = _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache; - testFunction.allocationSize = 12345; - - cache.setAllocator(allocator); - fixture.runAllTests(); - - LONGS_EQUAL(1, fixture.getOutput().count("WARNING")); -} - -TEST_GROUP(GlobalSimpleStringCache) -{ -}; - -TEST(GlobalSimpleStringCache, installsAndRemovedCache) -{ - TestMemoryAllocator* originalStringAllocator = SimpleString::getStringAllocator(); - { - GlobalSimpleStringCache cache; - STRCMP_EQUAL("SimpleStringCacheAllocator", SimpleString::getStringAllocator()->name()); - POINTERS_EQUAL(cache.getAllocator(), SimpleString::getStringAllocator()); - } - POINTERS_EQUAL(originalStringAllocator, SimpleString::getStringAllocator()); -} - diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 2d482d6a0..9cd9feff2 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -764,52 +764,3 @@ TEST(GlobalMemoryAccountant, checkWhetherNewArrayAllocatorIsNotChanged) fixture.assertPrintContains("GlobalMemoryAccountant: New Array memory allocator has been changed while accounting for memory"); } -TEST_GROUP(SimpleStringCacheAllocator) -{ - SimpleStringCacheAllocator* allocator; - SimpleStringInternalCache cache; - MemoryAccountant accountant; - AccountingTestMemoryAllocator* accountingAllocator; - - void setup() - { - accountingAllocator = new AccountingTestMemoryAllocator(accountant, defaultMallocAllocator()); - allocator = new SimpleStringCacheAllocator(cache, accountingAllocator); - } - - void teardown() - { - cache.clearCache(); - delete allocator; - delete accountingAllocator; - } -}; - -TEST(SimpleStringCacheAllocator, allocationIsCached) -{ - char* mem = allocator->alloc_memory(10, __FILE__, __LINE__); - allocator->free_memory(mem, 10, __FILE__, __LINE__); - - size_t totalAllocations = accountant.totalAllocations(); - size_t totalDeallocations = accountant.totalDeallocations(); - - mem = allocator->alloc_memory(10, __FILE__, __LINE__); - allocator->free_memory(mem, 10, __FILE__, __LINE__); - - LONGS_EQUAL(totalAllocations, accountant.totalAllocations()); - LONGS_EQUAL(totalDeallocations, accountant.totalDeallocations()); -} - -TEST(SimpleStringCacheAllocator, originalAllocator) -{ - POINTERS_EQUAL(defaultMallocAllocator(), allocator->actualAllocator()); - STRCMP_EQUAL(defaultMallocAllocator()->alloc_name(), allocator->alloc_name()); - STRCMP_EQUAL(defaultMallocAllocator()->free_name(), allocator->free_name()); -} - -TEST(SimpleStringCacheAllocator, name) -{ - STRCMP_EQUAL("SimpleStringCacheAllocator", allocator->name()); -} - - diff --git a/tests/CppUTestExt/AllTests.cpp b/tests/CppUTestExt/AllTests.cpp index 09d5713da..d593b7604 100644 --- a/tests/CppUTestExt/AllTests.cpp +++ b/tests/CppUTestExt/AllTests.cpp @@ -27,6 +27,7 @@ #include "CppUTest/CommandLineTestRunner.h" #include "CppUTest/TestRegistry.h" +#include "CppUTest/SimpleStringInternalCache.h" #include "CppUTestExt/MemoryReporterPlugin.h" #include "CppUTestExt/MockSupportPlugin.h" From f4d8f5514e732e26d8255eec5c829d83acaacb81 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 8 May 2020 15:41:19 +0800 Subject: [PATCH 0487/1093] Changes to all project files and build files? --- CppUTest.dep | 583 -------------- CppUTest.dsp | 6 +- CppUTest.vcproj | 26 + CppUTest.vcxproj | 2 + build/bld.inf | 1 + .../CCStudio/CppUTestExtRunAllTests1.pjt | 1 + .../CCStudio/CppUTestExtRunAllTests2.pjt | 1 + platforms/CCStudio/CppUTestRunAllTests1.pjt | 1 + platforms/CCStudio/CppUTestRunAllTests2.pjt | 3 +- platforms/Eclipse-Cygwin/.project | 17 +- platforms/iar/CppUTest.ewp | 3 + src/CppUTest/CMakeLists.txt | 3 +- tests/AllTests.dep | 748 ------------------ tests/CppUTest/CMakeLists.txt | 1 + 14 files changed, 61 insertions(+), 1335 deletions(-) delete mode 100644 CppUTest.dep delete mode 100644 tests/AllTests.dep diff --git a/CppUTest.dep b/CppUTest.dep deleted file mode 100644 index b3dbf6f43..000000000 --- a/CppUTest.dep +++ /dev/null @@ -1,583 +0,0 @@ -# Microsoft Developer Studio Generated Dependency File, included by CppUTest.mak - -.\src\CppUTestExt\CodeMemoryReportFormatter.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestMemoryAllocator.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\CppUTestExt\CodeMemoryReportFormatter.h"\ - ".\include\CppUTestExt\MemoryReportAllocator.h"\ - ".\include\CppUTestExt\MemoryReportFormatter.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\CommandLineArguments.cpp : \ - ".\include\CppUTest\CommandLineArguments.h"\ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestFilter.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\CommandLineTestRunner.cpp : \ - ".\include\CppUTest\CommandLineArguments.h"\ - ".\include\CppUTest\CommandLineTestRunner.h"\ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\JunitTestOutput.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestFilter.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestRegistry.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\JUnitTestOutput.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\JunitTestOutput.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\MemoryLeakDetector.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetector.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleMutex.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestMemoryAllocator.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\MemoryLeakWarningPlugin.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetector.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleMutex.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestMemoryAllocator.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\src\CppUTestExt\MemoryReportAllocator.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestMemoryAllocator.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\CppUTestExt\MemoryReportAllocator.h"\ - ".\include\CppUTestExt\MemoryReportFormatter.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\src\CppUTestExt\MemoryReporterPlugin.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestMemoryAllocator.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\CppUTestExt\CodeMemoryReportFormatter.h"\ - ".\include\CppUTestExt\MemoryReportAllocator.h"\ - ".\include\CppUTestExt\MemoryReporterPlugin.h"\ - ".\include\CppUTestExt\MemoryReportFormatter.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\src\CppUTestExt\MemoryReportFormatter.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestMemoryAllocator.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\CppUTestExt\MemoryReportAllocator.h"\ - ".\include\CppUTestExt\MemoryReportFormatter.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -".\src\CppUTestExt\MockActualCall.cpp" : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\cpputestext\mockactualcall.h"\ - ".\include\CppUTestExt\MockCheckedActualCall.h"\ - ".\include\CppUTestExt\MockCheckedExpectedCall.h"\ - ".\include\cpputestext\mockexpectedcall.h"\ - ".\include\CppUTestExt\MockExpectedCallsList.h"\ - ".\include\CppUTestExt\MockFailure.h"\ - ".\include\CppUTestExt\MockNamedValue.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -".\src\CppUTestExt\MockExpectedCall.cpp" : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\CppUTestExt\MockCheckedExpectedCall.h"\ - ".\include\cpputestext\mockexpectedcall.h"\ - ".\include\CppUTestExt\MockNamedValue.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -".\src\CppUTestExt\MockExpectedCallsList.cpp" : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\CppUTestExt\MockCheckedExpectedCall.h"\ - ".\include\cpputestext\mockexpectedcall.h"\ - ".\include\CppUTestExt\MockExpectedCallsList.h"\ - ".\include\CppUTestExt\MockNamedValue.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -".\src\CppUTestExt\MockFailure.cpp" : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\cpputestext\mockexpectedcall.h"\ - ".\include\CppUTestExt\MockExpectedCallsList.h"\ - ".\include\CppUTestExt\MockFailure.h"\ - ".\include\CppUTestExt\MockNamedValue.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -".\src\CppUTestExt\MockNamedValue.cpp" : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\CppUTestExt\MockNamedValue.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -".\src\CppUTestExt\MockSupport.cpp" : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\cpputestext\mockactualcall.h"\ - ".\include\CppUTestExt\MockCheckedActualCall.h"\ - ".\include\CppUTestExt\MockCheckedExpectedCall.h"\ - ".\include\cpputestext\mockexpectedcall.h"\ - ".\include\CppUTestExt\MockExpectedCallsList.h"\ - ".\include\CppUTestExt\MockFailure.h"\ - ".\include\CppUTestExt\MockNamedValue.h"\ - ".\include\CppUTestExt\MockSupport.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -".\src\CppUTestExt\MockSupport_c.cpp" : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\cpputestext\mockactualcall.h"\ - ".\include\CppUTestExt\MockCheckedActualCall.h"\ - ".\include\CppUTestExt\MockCheckedExpectedCall.h"\ - ".\include\cpputestext\mockexpectedcall.h"\ - ".\include\CppUTestExt\MockExpectedCallsList.h"\ - ".\include\CppUTestExt\MockFailure.h"\ - ".\include\CppUTestExt\MockNamedValue.h"\ - ".\include\CppUTestExt\MockSupport.h"\ - ".\include\CppUTestExt\MockSupport_c.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -".\src\CppUTestExt\MockSupportPlugin.cpp" : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\cpputestext\mockactualcall.h"\ - ".\include\CppUTestExt\MockCheckedActualCall.h"\ - ".\include\CppUTestExt\MockCheckedExpectedCall.h"\ - ".\include\cpputestext\mockexpectedcall.h"\ - ".\include\CppUTestExt\MockExpectedCallsList.h"\ - ".\include\CppUTestExt\MockFailure.h"\ - ".\include\CppUTestExt\MockNamedValue.h"\ - ".\include\CppUTestExt\MockSupport.h"\ - ".\include\CppUTestExt\MockSupportPlugin.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -".\src\CppUTestExt\OrderedTest.cpp" : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestFilter.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestRegistry.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\CppUTestExt\OrderedTest.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\SimpleMutex.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleMutex.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\SimpleString.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestMemoryAllocator.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\TestFailure.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\TestFilter.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFilter.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\TestHarness_c.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetector.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestHarness_c.h"\ - ".\include\CppUTest\TestMemoryAllocator.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\TestMemoryAllocator.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetector.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestMemoryAllocator.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\TestOutput.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\TestPlugin.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\TestRegistry.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestFilter.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestRegistry.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\TestResult.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\SRC\CPPUTEST\Utest.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestFilter.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestRegistry.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - - -.\src\Platforms\VisualCpp\UtestPlatform.cpp : \ - ".\include\CppUTest\CppUTestConfig.h"\ - ".\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - ".\include\CppUTest\MemoryLeakWarningPlugin.h"\ - ".\include\CppUTest\PlatformSpecificFunctions.h"\ - ".\include\CppUTest\PlatformSpecificFunctions_c.h"\ - ".\include\CppUTest\SimpleString.h"\ - ".\include\CppUTest\StandardCLibrary.h"\ - ".\include\CppUTest\TestFailure.h"\ - ".\include\CppUTest\TestHarness.h"\ - ".\include\CppUTest\TestOutput.h"\ - ".\include\CppUTest\TestPlugin.h"\ - ".\include\CppUTest\TestResult.h"\ - ".\include\CppUTest\Utest.h"\ - ".\include\CppUTest\UtestMacros.h"\ - ".\include\platforms\visualcpp\platform.h"\ - ".\include\platforms\visualcpp\stdint.h"\ - diff --git a/CppUTest.dsp b/CppUTest.dsp index a454fad93..2ad0d9564 100644 --- a/CppUTest.dsp +++ b/CppUTest.dsp @@ -170,6 +170,10 @@ SOURCE=.\SRC\CPPUTEST\SimpleString.cpp # End Source File # Begin Source File +SOURCE=.\SRC\CPPUTEST\SimpleStringInternalCache.cpp +# End Source File +# Begin Source File + SOURCE=.\SRC\CPPUTEST\TeamCityTestOutput.cpp # End Source File # Begin Source File @@ -322,7 +326,7 @@ SOURCE=.\include\CppUTest\SimpleString.h # End Source File # Begin Source File -SOURCE=.\include\CppUTest\SimpleStringExtensions.h +SOURCE=.\include\CppUTest\SimpleStringInternalCache.h # End Source File # Begin Source File diff --git a/CppUTest.vcproj b/CppUTest.vcproj index 1ea73723f..99a32833e 100644 --- a/CppUTest.vcproj +++ b/CppUTest.vcproj @@ -626,6 +626,28 @@ /> + + + + + + + + @@ -1009,6 +1031,10 @@ RelativePath="include\CppUTest\SimpleString.h" > + + diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index 81c69d384..88333b510 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -233,6 +233,7 @@ + @@ -280,6 +281,7 @@ + diff --git a/build/bld.inf b/build/bld.inf index 7894587e7..c2305acfe 100644 --- a/build/bld.inf +++ b/build/bld.inf @@ -36,6 +36,7 @@ PRJ_EXPORTS ..\include\CppUTest\Failure.h \epoc32\include\CppUTest\Failure.h ..\include\CppUTest\TestRegistry.h \epoc32\include\CppUTest\TestRegistry.h ..\include\CppUTest\SimpleString.h \epoc32\include\CppUTest\SimpleString.h +..\include\CppUTest\SimpleStringInternalCache.h \epoc32\include\CppUTest\SimpleStringInternalCache.h ..\include\CppUTest\MemoryLeakWarning.h \epoc32\include\CppUTest\MemoryLeakWarning.h ..\include\CppUTest\CommandLineTestRunner.h \epoc32\include\CppuTest\CommandLineTestRunner.h ..\include\CppUTest\TestOutput.h \epoc32\include\CppuTest\TestOutput.h diff --git a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt index 4161d35c3..2afdd31e3 100644 --- a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt +++ b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt @@ -18,6 +18,7 @@ Source="..\..\src\CppUTest\MemoryLeakDetector.cpp" Source="..\..\src\CppUTest\MemoryLeakWarningPlugin.cpp" Source="..\..\src\CppUTest\SimpleMutex.cpp" Source="..\..\src\CppUTest\SimpleString.cpp" +Source="..\..\src\CppUTest\SimpleStringInternalCache.cpp" Source="..\..\src\CppUTest\TeamCityTestOutput.cpp" Source="..\..\src\CppUTest\TestFailure.cpp" Source="..\..\src\CppUTest\TestFilter.cpp" diff --git a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt index 66cf04e2d..b9a40b195 100644 --- a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt +++ b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt @@ -18,6 +18,7 @@ Source="..\..\src\CppUTest\MemoryLeakDetector.cpp" Source="..\..\src\CppUTest\MemoryLeakWarningPlugin.cpp" Source="..\..\src\CppUTest\SimpleMutex.cpp" Source="..\..\src\CppUTest\SimpleString.cpp" +Source="..\..\src\CppUTest\SimpleStringInternalCache.cpp" Source="..\..\src\CppUTest\TeamCityTestOutput.cpp" Source="..\..\src\CppUTest\TestFailure.cpp" Source="..\..\src\CppUTest\TestFilter.cpp" diff --git a/platforms/CCStudio/CppUTestRunAllTests1.pjt b/platforms/CCStudio/CppUTestRunAllTests1.pjt index bd08bc024..18a4470b4 100644 --- a/platforms/CCStudio/CppUTestRunAllTests1.pjt +++ b/platforms/CCStudio/CppUTestRunAllTests1.pjt @@ -18,6 +18,7 @@ Source="..\..\src\CppUTest\MemoryLeakDetector.cpp" Source="..\..\src\CppUTest\MemoryLeakWarningPlugin.cpp" Source="..\..\src\CppUTest\SimpleMutex.cpp" Source="..\..\src\CppUTest\SimpleString.cpp" +Source="..\..\src\CppUTest\SimpleStringInternalCache.cpp" Source="..\..\src\CppUTest\TeamCityTestOutput.cpp" Source="..\..\src\CppUTest\TestFailure.cpp" Source="..\..\src\CppUTest\TestFilter.cpp" diff --git a/platforms/CCStudio/CppUTestRunAllTests2.pjt b/platforms/CCStudio/CppUTestRunAllTests2.pjt index 279afff4c..cf20cd588 100644 --- a/platforms/CCStudio/CppUTestRunAllTests2.pjt +++ b/platforms/CCStudio/CppUTestRunAllTests2.pjt @@ -18,6 +18,7 @@ Source="..\..\src\CppUTest\MemoryLeakDetector.cpp" Source="..\..\src\CppUTest\MemoryLeakWarningPlugin.cpp" Source="..\..\src\CppUTest\SimpleMutex.cpp" Source="..\..\src\CppUTest\SimpleString.cpp" +Source="..\..\src\CppUTest\SimpleStringInternalCache.cpp" Source="..\..\src\CppUTest\TeamCityTestOutput.cpp" Source="..\..\src\CppUTest\TestFailure.cpp" Source="..\..\src\CppUTest\TestFilter.cpp" @@ -31,7 +32,7 @@ Source="..\..\src\CppUTest\TestTestingFixture.cpp" Source="..\..\src\CppUTest\Utest.cpp" Source="..\..\src\CppUTestExt\MockSupportPlugin.cpp" Source="..\..\src\Platforms\C2000\UtestPlatform.cpp" -Source="..\..\tests\SimpleStringTest.cpp" +Source="..\..\tests\SimpleStringInternalCacheTest.cpp" Source="..\..\tests\TestFilterTest.cpp" Source="..\..\tests\TestHarness_cTest.cpp" Source="..\..\tests\TestHarness_cTestCFile.c" diff --git a/platforms/Eclipse-Cygwin/.project b/platforms/Eclipse-Cygwin/.project index 8f4fc691f..1414f9d75 100644 --- a/platforms/Eclipse-Cygwin/.project +++ b/platforms/Eclipse-Cygwin/.project @@ -784,6 +784,11 @@ 1 PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/SetPluginTest.cpp + + tests/SimpleStringInternalCacheTest.cpp + 1 + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/SimpleStringInternalCacheTest.cpp + tests/SimpleStringTest.cpp 1 @@ -1014,6 +1019,11 @@ 1 PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/include/CppUTest/SimpleString.h + + include/CppUTest/SimpleStringInternalCache.h + 1 + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/include/CppUTest/SimpleStringInternalCache.h + include/CppUTest/StandardCLibrary.h 1 @@ -1504,10 +1514,15 @@ 1 PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/src/CppUTest/MemoryLeakWarningPlugin.cpp - + src/CppUTest/SimpleString.cpp 1 PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/src/CppUTest/SimpleString.cpp + + src/CppUTest/SimpleStringInternalCache.cpp + 1 + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/src/CppUTest/SimpleStringInternalCache.cpp src/CppUTest/TestFailure.cpp diff --git a/platforms/iar/CppUTest.ewp b/platforms/iar/CppUTest.ewp index c8084ff3b..cef9176ad 100644 --- a/platforms/iar/CppUTest.ewp +++ b/platforms/iar/CppUTest.ewp @@ -1945,6 +1945,9 @@ $PROJ_DIR$\..\..\src\CppUTest\SimpleString.cpp + + $PROJ_DIR$\..\..\src\CppUTest\SimpleStringInternalCache.cpp + $PROJ_DIR$\..\..\src\CppUTest\TeamCityTestOutput.cpp diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index a87862e89..bb564f085 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -5,6 +5,7 @@ add_library(CppUTest TestRegistry.cpp CommandLineTestRunner.cpp SimpleString.cpp + SimpleStringInternalCache.cpp TestMemoryAllocator.cpp TestResult.cpp JUnitTestOutput.cpp @@ -42,7 +43,7 @@ set(CppUTest_headers ${CppUTestRootDirectory}/include/CppUTest/PlatformSpecificFunctions_c.h ${CppUTestRootDirectory}/include/CppUTest/TestOutput.h ${CppUTestRootDirectory}/include/CppUTest/CppUTestConfig.h - ${CppUTestRootDirectory}/include/CppUTest/SimpleString.h + ${CppUTestRootDirectory}/include/CppUTest/SimpleStringInternalCache.h ${CppUTestRootDirectory}/include/CppUTest/TestPlugin.h ${CppUTestRootDirectory}/include/CppUTest/JUnitTestOutput.h ${CppUTestRootDirectory}/include/CppUTest/TeamCityTestOutput.h diff --git a/tests/AllTests.dep b/tests/AllTests.dep deleted file mode 100644 index e6a436ec3..000000000 --- a/tests/AllTests.dep +++ /dev/null @@ -1,748 +0,0 @@ -# Microsoft Developer Studio Generated Dependency File, included by AllTests.mak - -.\CppUTest\AllocationInCFile.c : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorMallocMacros.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - ".\CppUTest\AllocationInCFile.h"\ - - -.\CppUTest\AllocationInCppFile.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - ".\CppUTest\AllocationInCppFile.h"\ - - -.\CppUTest\CppUTestExt\AllTests.cpp : \ - "..\include\CppUTest\CommandLineArguments.h"\ - "..\include\CppUTest\CommandLineTestRunner.h"\ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestMemoryAllocator.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\CppUTestExt\MemoryReportAllocator.h"\ - "..\include\CppUTestExt\MemoryReporterPlugin.h"\ - "..\include\CppUTestExt\MockNamedValue.h"\ - "..\include\CppUTestExt\MockSupportPlugin.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\CheatSheetTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTestExt\CodeMemoryReportFormatterTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestMemoryAllocator.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\CppUTestExt\CodeMemoryReportFormatter.h"\ - "..\include\CppUTestExt\MemoryReportAllocator.h"\ - "..\include\CppUTestExt\MemoryReportFormatter.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\CommandLineArgumentsTest.cpp : \ - "..\include\CppUTest\CommandLineArguments.h"\ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\CommandLineTestRunnerTest.cpp : \ - "..\include\CppUTest\CommandLineArguments.h"\ - "..\include\CppUTest\CommandLineTestRunner.h"\ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\TestTestingFixture.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTestExt\GTest2ConvertorTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\TestTestingFixture.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\JUnitOutputTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\JunitTestOutput.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\PlatformSpecificFunctions.h"\ - "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\MemoryLeakDetectorTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetector.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\PlatformSpecificFunctions.h"\ - "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestMemoryAllocator.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\MemoryLeakOperatorOverloadsTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetector.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\PlatformSpecificFunctions.h"\ - "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestHarness_c.h"\ - "..\include\CppUTest\TestMemoryAllocator.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\TestTestingFixture.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - ".\CppUTest\AllocationInCFile.h"\ - ".\CppUTest\AllocationInCppFile.h"\ - - -.\CppUTest\MemoryLeakWarningTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetector.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\PlatformSpecificFunctions.h"\ - "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ - "..\include\CppUTest\SimpleMutex.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestHarness_c.h"\ - "..\include\CppUTest\TestMemoryAllocator.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\TestTestingFixture.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTestExt\MemoryReportAllocatorTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestMemoryAllocator.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\CppUTestExt\MemoryReportAllocator.h"\ - "..\include\CppUTestExt\MemoryReportFormatter.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTestExt\MemoryReporterPluginTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestMemoryAllocator.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\CppUTestExt\MemoryReportAllocator.h"\ - "..\include\CppUTestExt\MemoryReporterPlugin.h"\ - "..\include\CppUTestExt\MemoryReportFormatter.h"\ - "..\include\cpputestext\mockactualcall.h"\ - "..\include\CppUTestExt\MockCheckedActualCall.h"\ - "..\include\CppUTestExt\MockCheckedExpectedCall.h"\ - "..\include\cpputestext\mockexpectedcall.h"\ - "..\include\CppUTestExt\MockExpectedCallsList.h"\ - "..\include\CppUTestExt\MockFailure.h"\ - "..\include\CppUTestExt\MockNamedValue.h"\ - "..\include\CppUTestExt\MockSupport.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTestExt\MemoryReportFormatterTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestMemoryAllocator.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\CppUTestExt\MemoryReportAllocator.h"\ - "..\include\CppUTestExt\MemoryReportFormatter.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTestExt\MockActualCallTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\cpputestext\mockactualcall.h"\ - "..\include\CppUTestExt\MockCheckedActualCall.h"\ - "..\include\CppUTestExt\MockCheckedExpectedCall.h"\ - "..\include\cpputestext\mockexpectedcall.h"\ - "..\include\CppUTestExt\MockExpectedCallsList.h"\ - "..\include\CppUTestExt\MockFailure.h"\ - "..\include\CppUTestExt\MockNamedValue.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - ".\CppUTestExt\MockFailureTest.h"\ - - -.\CppUTestExt\MockCheatSheetTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\cpputestext\mockactualcall.h"\ - "..\include\CppUTestExt\MockCheckedActualCall.h"\ - "..\include\CppUTestExt\MockCheckedExpectedCall.h"\ - "..\include\cpputestext\mockexpectedcall.h"\ - "..\include\CppUTestExt\MockExpectedCallsList.h"\ - "..\include\CppUTestExt\MockFailure.h"\ - "..\include\CppUTestExt\MockNamedValue.h"\ - "..\include\CppUTestExt\MockSupport.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTestExt\MockExpectedCallTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\CppUTestExt\MockCheckedExpectedCall.h"\ - "..\include\cpputestext\mockexpectedcall.h"\ - "..\include\CppUTestExt\MockFailure.h"\ - "..\include\CppUTestExt\MockNamedValue.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - ".\CppUTestExt\MockFailureTest.h"\ - - -.\CppUTestExt\MockExpectedFunctionsListTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\CppUTestExt\MockCheckedExpectedCall.h"\ - "..\include\cpputestext\mockexpectedcall.h"\ - "..\include\CppUTestExt\MockExpectedCallsList.h"\ - "..\include\CppUTestExt\MockFailure.h"\ - "..\include\CppUTestExt\MockNamedValue.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - ".\CppUTestExt\MockFailureTest.h"\ - - -.\CppUTestExt\MockFailureTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\CppUTestExt\MockCheckedExpectedCall.h"\ - "..\include\cpputestext\mockexpectedcall.h"\ - "..\include\CppUTestExt\MockExpectedCallsList.h"\ - "..\include\CppUTestExt\MockFailure.h"\ - "..\include\CppUTestExt\MockNamedValue.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - ".\CppUTestExt\MockFailureTest.h"\ - - -.\CppUTestExt\MockPluginTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\cpputestext\mockactualcall.h"\ - "..\include\CppUTestExt\MockCheckedActualCall.h"\ - "..\include\CppUTestExt\MockCheckedExpectedCall.h"\ - "..\include\cpputestext\mockexpectedcall.h"\ - "..\include\CppUTestExt\MockExpectedCallsList.h"\ - "..\include\CppUTestExt\MockFailure.h"\ - "..\include\CppUTestExt\MockNamedValue.h"\ - "..\include\CppUTestExt\MockSupport.h"\ - "..\include\CppUTestExt\MockSupportPlugin.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - ".\CppUTestExt\MockFailureTest.h"\ - - -.\CppUTestExt\MockSupport_cTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestHarness_c.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\TestTestingFixture.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\CppUTestExt\MockSupport_c.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - ".\CppUTestExt\MockSupport_cTestCFile.h"\ - - -.\CppUTestExt\MockSupport_cTestCFile.c : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTestExt\MockSupport_c.h"\ - ".\CppUTestExt\MockSupport_cTestCFile.h"\ - - -.\CppUTestExt\MockSupportTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\cpputestext\mockactualcall.h"\ - "..\include\CppUTestExt\MockCheckedActualCall.h"\ - "..\include\CppUTestExt\MockCheckedExpectedCall.h"\ - "..\include\cpputestext\mockexpectedcall.h"\ - "..\include\CppUTestExt\MockExpectedCallsList.h"\ - "..\include\CppUTestExt\MockFailure.h"\ - "..\include\CppUTestExt\MockNamedValue.h"\ - "..\include\CppUTestExt\MockSupport.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - ".\CppUTestExt\MockFailureTest.h"\ - - -.\CppUTestExt\OrderedTestTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\TestTestingFixture.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\CppUTestExt\OrderedTest.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\OrderedTestTest_c.c : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestHarness_c.h"\ - ".\CppUTestExt\OrderedTestTest.h"\ - - -.\CppUTest\PluginTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\TestTestingFixture.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\PreprocessorTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\SetPluginTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\SimpleStringTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\PlatformSpecificFunctions.h"\ - "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestMemoryAllocator.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\TestFailureTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\TestFilterTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\TestHarness_cTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\PlatformSpecificFunctions.h"\ - "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestHarness_c.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\TestTestingFixture.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\TestHarness_cTestCFile.c : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestHarness_c.h"\ - - -.\CppUTest\TestInstallerTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\TestMemoryAllocatorTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\PlatformSpecificFunctions.h"\ - "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestMemoryAllocator.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\TestOutputTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\PlatformSpecificFunctions.h"\ - "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\TestRegistryTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\TestResultTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\PlatformSpecificFunctions.h"\ - "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - - -.\CppUTest\UtestTest.cpp : \ - "..\include\CppUTest\CppUTestConfig.h"\ - "..\include\CppUTest\MemoryLeakDetectorNewMacros.h"\ - "..\include\CppUTest\MemoryLeakWarningPlugin.h"\ - "..\include\CppUTest\PlatformSpecificFunctions.h"\ - "..\include\CppUTest\PlatformSpecificFunctions_c.h"\ - "..\include\CppUTest\SimpleString.h"\ - "..\include\CppUTest\StandardCLibrary.h"\ - "..\include\CppUTest\TestFailure.h"\ - "..\include\CppUTest\TestFilter.h"\ - "..\include\CppUTest\TestHarness.h"\ - "..\include\CppUTest\TestOutput.h"\ - "..\include\CppUTest\TestPlugin.h"\ - "..\include\CppUTest\TestRegistry.h"\ - "..\include\CppUTest\TestResult.h"\ - "..\include\CppUTest\TestTestingFixture.h"\ - "..\include\CppUTest\Utest.h"\ - "..\include\CppUTest\UtestMacros.h"\ - "..\include\platforms\visualcpp\stdint.h"\ - diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index c38cc8227..1773a749b 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -3,6 +3,7 @@ set(CppUTestTests_src SetPluginTest.cpp CheatSheetTest.cpp SimpleStringTest.cpp + SimpleStringTestInternalCache.cpp CommandLineArgumentsTest.cpp TestFailureTest.cpp TestFailureNaNTest.cpp From c9772b366f6461f62afb63a23f0b93a3c0750b9f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 8 May 2020 16:47:42 +0800 Subject: [PATCH 0488/1093] Spelling mistake in name --- tests/CppUTest/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 1773a749b..7dbc51e02 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -3,7 +3,7 @@ set(CppUTestTests_src SetPluginTest.cpp CheatSheetTest.cpp SimpleStringTest.cpp - SimpleStringTestInternalCache.cpp + SimpleStringInternalCacheTest.cpp CommandLineArgumentsTest.cpp TestFailureTest.cpp TestFailureNaNTest.cpp From 95e4bbf2f820906ce79aac0db08fdedf9a361025 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 8 May 2020 17:03:08 +0800 Subject: [PATCH 0489/1093] Mising files in the DOS Makefile --- platforms/Dos/sources.mk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platforms/Dos/sources.mk b/platforms/Dos/sources.mk index 3021cf840..d979b8424 100644 --- a/platforms/Dos/sources.mk +++ b/platforms/Dos/sources.mk @@ -7,6 +7,7 @@ CPPU_OBJECTS := \ $(CPPUTEST_HOME)/src/CppUTest/MemoryLeakWarningPlugin.o \ $(CPPUTEST_HOME)/src/CppUTest/SimpleMutex.o \ $(CPPUTEST_HOME)/src/CppUTest/SimpleString.o \ + $(CPPUTEST_HOME)/src/CppUTest/SimpleStringInternalCache.o \ $(CPPUTEST_HOME)/src/CppUTest/TeamCityTestOutput.o \ $(CPPUTEST_HOME)/src/CppUTest/TestFailure.o \ $(CPPUTEST_HOME)/src/CppUTest/TestFilter.o \ @@ -61,7 +62,8 @@ CPPU2_OBJECTS := \ CPPU3_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTest/MemoryLeakDetectorTest.o \ - $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringTest.o + $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringTest.o \ + $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringInternalCacheTest.o CPPU4_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ From 3e0c9c7610eb1428cb696eb64e630be575bbbb80 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 8 May 2020 18:10:45 +0800 Subject: [PATCH 0490/1093] Fixed DOS docker build --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 1205856d3..47a25b45d 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -109,7 +109,7 @@ if [ "x$BUILD" = "xdocker_ubuntu_gcc10" ]; then docker start -i cpputest_gcc10 fi -if [ "x$BUILD" = "xdocker_dos" ]; then +if [ "x$BUILD" = "xdocker_ubuntu_dos" ]; then $CPPUTEST_HOME/scripts/create_docker_images_and_containers dos docker start -i cpputest_dos fi From d2b25f0236ce0ef6975611626f7771368e5751e1 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 8 May 2020 18:51:48 +0800 Subject: [PATCH 0491/1093] For now, removed internal cache test... it failed the build but unclear why --- platforms/Dos/sources.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platforms/Dos/sources.mk b/platforms/Dos/sources.mk index d979b8424..35b7a0455 100644 --- a/platforms/Dos/sources.mk +++ b/platforms/Dos/sources.mk @@ -19,7 +19,7 @@ CPPU_OBJECTS := \ $(CPPUTEST_HOME)/src/CppUTest/TestTestingFixture.o \ $(CPPUTEST_HOME)/src/CppUTest/TestResult.o \ $(CPPUTEST_HOME)/src/CppUTest/Utest.o \ - $(CPPUTEST_HOME)/src/Platforms/Dos/UtestPlatform.o \ + $(CPPUTEST_HOME)/src/Platforms/Dos/UtestPlatform.o CPPUX_OBJECTS := \ $(CPPUTEST_HOME)/src/CppUTestExt/CodeMemoryReportFormatter.o \ @@ -62,8 +62,8 @@ CPPU2_OBJECTS := \ CPPU3_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTest/MemoryLeakDetectorTest.o \ - $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringTest.o \ - $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringInternalCacheTest.o + $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringTest.o +# $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringInternalCacheTest.o CPPU4_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ From 4950dc93e7e09e85cde2e41fac4aa75ded93725f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 8 May 2020 20:03:38 +0800 Subject: [PATCH 0492/1093] Renamed InternalCacheTest so it can be included in DOS --- Makefile.am | 2 +- platforms/CCStudio/CppUTestRunAllTests2.pjt | 2 +- platforms/Dos/sources.mk | 5 ++--- platforms/Eclipse-Cygwin/.project | 4 ++-- tests/CppUTest/CMakeLists.txt | 2 +- ...StringInternalCacheTest.cpp => SimpleStringCacheTest.cpp} | 0 6 files changed, 7 insertions(+), 8 deletions(-) rename tests/CppUTest/{SimpleStringInternalCacheTest.cpp => SimpleStringCacheTest.cpp} (100%) diff --git a/Makefile.am b/Makefile.am index 440d9e133..97c357ae8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -173,7 +173,7 @@ CppUTestTests_SOURCES = \ tests/CppUTest/PreprocessorTest.cpp \ tests/CppUTest/SetPluginTest.cpp \ tests/CppUTest/SimpleStringTest.cpp \ - tests/CppUTest/SimpleStringInternalCacheTest.cpp \ + tests/CppUTest/SimpleStringCacheTest.cpp \ tests/CppUTest/SimpleMutexTest.cpp \ tests/CppUTest/TeamCityOutputTest.cpp \ tests/CppUTest/TestFailureNaNTest.cpp \ diff --git a/platforms/CCStudio/CppUTestRunAllTests2.pjt b/platforms/CCStudio/CppUTestRunAllTests2.pjt index cf20cd588..256969796 100644 --- a/platforms/CCStudio/CppUTestRunAllTests2.pjt +++ b/platforms/CCStudio/CppUTestRunAllTests2.pjt @@ -32,7 +32,7 @@ Source="..\..\src\CppUTest\TestTestingFixture.cpp" Source="..\..\src\CppUTest\Utest.cpp" Source="..\..\src\CppUTestExt\MockSupportPlugin.cpp" Source="..\..\src\Platforms\C2000\UtestPlatform.cpp" -Source="..\..\tests\SimpleStringInternalCacheTest.cpp" +Source="..\..\tests\SimpleStringCacheTest.cpp" Source="..\..\tests\TestFilterTest.cpp" Source="..\..\tests\TestHarness_cTest.cpp" Source="..\..\tests\TestHarness_cTestCFile.c" diff --git a/platforms/Dos/sources.mk b/platforms/Dos/sources.mk index 35b7a0455..dcd4be57c 100644 --- a/platforms/Dos/sources.mk +++ b/platforms/Dos/sources.mk @@ -8,7 +8,6 @@ CPPU_OBJECTS := \ $(CPPUTEST_HOME)/src/CppUTest/SimpleMutex.o \ $(CPPUTEST_HOME)/src/CppUTest/SimpleString.o \ $(CPPUTEST_HOME)/src/CppUTest/SimpleStringInternalCache.o \ - $(CPPUTEST_HOME)/src/CppUTest/TeamCityTestOutput.o \ $(CPPUTEST_HOME)/src/CppUTest/TestFailure.o \ $(CPPUTEST_HOME)/src/CppUTest/TestFilter.o \ $(CPPUTEST_HOME)/src/CppUTest/TestHarness_c.o \ @@ -62,8 +61,8 @@ CPPU2_OBJECTS := \ CPPU3_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTest/MemoryLeakDetectorTest.o \ - $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringTest.o -# $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringInternalCacheTest.o + $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringTest.o \ + $(CPPUTEST_HOME)/tests/CppUTest/SimpleStringCacheTest.o CPPU4_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/AllTests.o \ diff --git a/platforms/Eclipse-Cygwin/.project b/platforms/Eclipse-Cygwin/.project index 1414f9d75..bed0ca0b5 100644 --- a/platforms/Eclipse-Cygwin/.project +++ b/platforms/Eclipse-Cygwin/.project @@ -785,9 +785,9 @@ PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/SetPluginTest.cpp - tests/SimpleStringInternalCacheTest.cpp + tests/SimpleStringCacheTest.cpp 1 - PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/SimpleStringInternalCacheTest.cpp + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/SimpleStringCacheTest.cpp tests/SimpleStringTest.cpp diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 7dbc51e02..abca09b97 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -3,7 +3,7 @@ set(CppUTestTests_src SetPluginTest.cpp CheatSheetTest.cpp SimpleStringTest.cpp - SimpleStringInternalCacheTest.cpp + SimpleStringCacheTest.cpp CommandLineArgumentsTest.cpp TestFailureTest.cpp TestFailureNaNTest.cpp diff --git a/tests/CppUTest/SimpleStringInternalCacheTest.cpp b/tests/CppUTest/SimpleStringCacheTest.cpp similarity index 100% rename from tests/CppUTest/SimpleStringInternalCacheTest.cpp rename to tests/CppUTest/SimpleStringCacheTest.cpp From 854a50d320cad20944e844b71e51efe86d74ce28 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 08:15:11 +0800 Subject: [PATCH 0493/1093] Generate MinGW makefile --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 47a25b45d..144568d18 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -158,7 +158,7 @@ if [ "x$BUILD" = "xcmake_windows" ]; then fi cmake --version - cmake "${BUILD_ARGS[@]}" .. + cmake -G 'MinGW Makefiles' "${BUILD_ARGS[@]}" .. # make # ctest -V fi From c3fcccc9e644b7b5324cbd98d0f1db692d767d4e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 08:28:45 +0800 Subject: [PATCH 0494/1093] Trying unix makefiles --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 144568d18..3fd9a7f94 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -158,7 +158,7 @@ if [ "x$BUILD" = "xcmake_windows" ]; then fi cmake --version - cmake -G 'MinGW Makefiles' "${BUILD_ARGS[@]}" .. + cmake -G 'Unix Makefiles' "${BUILD_ARGS[@]}" .. # make # ctest -V fi From e242153eb505f1a83fe9e451d9a0d8794d33c8f7 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 08:41:59 +0800 Subject: [PATCH 0495/1093] Make for Windows --- scripts/travis_ci_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 3fd9a7f94..a48e826fb 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -159,7 +159,7 @@ if [ "x$BUILD" = "xcmake_windows" ]; then cmake --version cmake -G 'Unix Makefiles' "${BUILD_ARGS[@]}" .. -# make -# ctest -V + make + ctest -V fi From f9e2710b3e5872662b1780e99f8b858e1677ef3a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 10:33:26 +0800 Subject: [PATCH 0496/1093] travis config file --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8765df923..beb43d1f1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,7 +37,7 @@ jobs: # Windows - compiler: clang os: windows - env: BUILD=cmake_windows + env: BUILD=cmake_windows CPP_STR=17 # Linux - compiler: gcc From 7e7669ac0f28f49463a3277108b00bf841ae5b96 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 10:39:58 +0800 Subject: [PATCH 0497/1093] Typo --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index beb43d1f1..c9995ef8d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,7 +37,7 @@ jobs: # Windows - compiler: clang os: windows - env: BUILD=cmake_windows CPP_STR=17 + env: BUILD=cmake_windows CPP_STD=17 # Linux - compiler: gcc From bad252be3e6ec5bdeac61a8fd2cc22a50a4cdd7c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 11:02:53 +0800 Subject: [PATCH 0498/1093] Check for gettimeofday. Not exists when not in Linux env --- CMakeLists.txt | 5 +++++ src/Platforms/Gcc/UtestPlatform.cpp | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e6653fff..545134575 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,11 @@ if(HAVE_FORK) add_definitions(-DCPPUTEST_HAVE_FORK) endif(HAVE_FORK) +check_function_exists(gettimeofday HAVE_GETTIMEOFDAY) +if(HAVE_FORK) + add_definitions(-DCPPUTEST_HAVE_GETTIMEOFDAY=1) +endif(HAVE_GETTIMEOFDAY) + check_function_exists(strdup HAVE_STRDUP) if(HAVE_STRDUP) add_definitions(-DCPPUTEST_HAVE_STRDUP=1) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index df7b66cd2..178c3c7e9 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -34,7 +34,10 @@ #undef strdup #undef strndup +#ifdef CPPUTEST_HAVE_GETTIMEOFDAY #include +#endif + #include #include #include @@ -191,10 +194,14 @@ void (*PlatformSpecificRestoreJumpBuffer)() = PlatformSpecificRestoreJumpBufferI static long TimeInMillisImplementation() { +#ifdef CPPUTEST_HAVE_GETTIMEOFDAY struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); return (tv.tv_sec * 1000) + (long)((double)tv.tv_usec * 0.001); +#else + return 0; +#endif } static const char* TimeStringImplementation() From 93afc815fccb67e6069b7238911acbdaa73f8a9f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 11:13:23 +0800 Subject: [PATCH 0499/1093] Added #ifdef before include --- src/Platforms/Gcc/UtestPlatform.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 178c3c7e9..24ae213a6 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -37,6 +37,9 @@ #ifdef CPPUTEST_HAVE_GETTIMEOFDAY #include #endif +#ifdef CPPUTEST_HAVE_FORK +#include +#endif #include #include @@ -45,7 +48,6 @@ #include #include #include -#include #include #ifndef __MINGW32__ #include From 4b504688b0fb56e171c907d76d56c28c917ad661 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 11:16:43 +0800 Subject: [PATCH 0500/1093] Moved thess includes under HAVE_FORK --- src/Platforms/Gcc/UtestPlatform.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 24ae213a6..11a184694 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -39,6 +39,8 @@ #endif #ifdef CPPUTEST_HAVE_FORK #include +#include +#include #endif #include @@ -49,10 +51,6 @@ #include #include #include -#ifndef __MINGW32__ -#include -#include -#endif #include #include "CppUTest/PlatformSpecificFunctions.h" From 28cb56ed276afbdecfcb9ee74faeba4a645cac5a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 11:58:37 +0800 Subject: [PATCH 0501/1093] Checks for pthread --- CMakeLists.txt | 7 ++++++- configure.ac | 2 +- src/Platforms/Gcc/UtestPlatform.cpp | 27 ++++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 545134575..337cfc88c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,10 +25,15 @@ if(HAVE_FORK) endif(HAVE_FORK) check_function_exists(gettimeofday HAVE_GETTIMEOFDAY) -if(HAVE_FORK) +if(HAVE_GETTIMEOFDAY) add_definitions(-DCPPUTEST_HAVE_GETTIMEOFDAY=1) endif(HAVE_GETTIMEOFDAY) +check_function_exists(pthread_mutex_lock HAVE_PTHREAD_MUTEX_LOCK) +if(HAVE_PTHREAD_MUTEX_LOCK) + add_definitions(-DCPPUTEST_HAVE_PTHREAD_MUTEX_LOCK=1) +endif(HAVE_PTHREAD_MUTEX_LOCK) + check_function_exists(strdup HAVE_STRDUP) if(HAVE_STRDUP) add_definitions(-DCPPUTEST_HAVE_STRDUP=1) diff --git a/configure.ac b/configure.ac index 8d3988566..c354f0441 100644 --- a/configure.ac +++ b/configure.ac @@ -62,7 +62,7 @@ AC_TYPE_LONG_LONG_INT # Checks for library functions. AC_FUNC_FORK -AC_CHECK_FUNCS([gettimeofday memset strstr strdup]) +AC_CHECK_FUNCS([gettimeofday memset strstr strdup pthread_mutex_lock]) AC_CHECK_PROG([CPPUTEST_HAS_GCC], [gcc], [yes], [no]) AC_CHECK_PROG([CPPUTEST_HAS_CLANG], [clang], [yes], [no]) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 11a184694..69a1a2921 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -51,7 +51,10 @@ #include #include #include + +#ifdef CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK #include +#endif #include "CppUTest/PlatformSpecificFunctions.h" @@ -285,29 +288,51 @@ int (*PlatformSpecificAtExit)(void(*func)(void)) = atexit; /// this was undefin static PlatformSpecificMutex PThreadMutexCreate(void) { +#ifdef CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK pthread_mutex_t *mutex = new pthread_mutex_t; pthread_mutex_init(mutex, NULLPTR); - return (PlatformSpecificMutex)mutex; +#else + return 0; +#endif + } +#ifdef CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK static void PThreadMutexLock(PlatformSpecificMutex mtx) { pthread_mutex_lock((pthread_mutex_t *)mtx); } +#else +static void PThreadMutexLock(PlatformSpecificMutex) +{ +} +#endif +#ifdef CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK static void PThreadMutexUnlock(PlatformSpecificMutex mtx) { pthread_mutex_unlock((pthread_mutex_t *)mtx); } +#else +static void PThreadMutexUnlock(PlatformSpecificMutex) +{ +} +#endif +#ifdef CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK static void PThreadMutexDestroy(PlatformSpecificMutex mtx) { pthread_mutex_t *mutex = (pthread_mutex_t *)mtx; pthread_mutex_destroy(mutex); delete mutex; } +#else +static void PThreadMutexDestroy(PlatformSpecificMutex) +{ +} +#endif PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void) = PThreadMutexCreate; void (*PlatformSpecificMutexLock)(PlatformSpecificMutex) = PThreadMutexLock; From 4eb83dfa6605fd63905a7b30c56415534b165e5a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 12:05:26 +0800 Subject: [PATCH 0502/1093] Use localtime_s on windows --- CMakeLists.txt | 5 +++++ src/Platforms/Gcc/UtestPlatform.cpp | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 337cfc88c..5675b0467 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,11 @@ if(HAVE_STRDUP) add_definitions(-DCPPUTEST_HAVE_STRDUP=1) endif(HAVE_STRDUP) +check_function_exists(localtime_s HAVE_LOCALTIME_S) +if(HAVE_LOCALTIME_S) + add_definitions(-DCPPUTEST_HAVE_LOCALTIME_S=1) +endif(HAVE_LOCALTIME_S) + if (MINGW) # Apply workaround for MinGW timespec redefinition (pthread.h / time.h) include(CheckStructHasMember) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 69a1a2921..8c8b191ce 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -211,7 +211,11 @@ static const char* TimeStringImplementation() { time_t tm = time(NULLPTR); static char dateTime[80]; +#ifdef CPPUTEST_HAVE_LOCALTIME_S + struct tm *tmp = localtime_s(&tm); +#else struct tm *tmp = localtime(&tm); +#endif strftime(dateTime, 80, "%Y-%m-%dT%H:%M:%S", tmp); return dateTime; } @@ -294,7 +298,7 @@ static PlatformSpecificMutex PThreadMutexCreate(void) pthread_mutex_init(mutex, NULLPTR); return (PlatformSpecificMutex)mutex; #else - return 0; + return NULLPTR; #endif } From b8f4dfbe6f895f36a9d78644cdd6e277db46bbc9 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 12:13:43 +0800 Subject: [PATCH 0503/1093] Use WIN32 instead --- CMakeLists.txt | 5 ----- src/Platforms/Gcc/UtestPlatform.cpp | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5675b0467..337cfc88c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,11 +39,6 @@ if(HAVE_STRDUP) add_definitions(-DCPPUTEST_HAVE_STRDUP=1) endif(HAVE_STRDUP) -check_function_exists(localtime_s HAVE_LOCALTIME_S) -if(HAVE_LOCALTIME_S) - add_definitions(-DCPPUTEST_HAVE_LOCALTIME_S=1) -endif(HAVE_LOCALTIME_S) - if (MINGW) # Apply workaround for MinGW timespec redefinition (pthread.h / time.h) include(CheckStructHasMember) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 8c8b191ce..30ec06585 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -211,7 +211,7 @@ static const char* TimeStringImplementation() { time_t tm = time(NULLPTR); static char dateTime[80]; -#ifdef CPPUTEST_HAVE_LOCALTIME_S +#ifdef _WIN32 struct tm *tmp = localtime_s(&tm); #else struct tm *tmp = localtime(&tm); From 17c34d4803ff564c4417f474f02c343854861ba6 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 12:28:47 +0800 Subject: [PATCH 0504/1093] localtime_s in windows --- src/Platforms/Gcc/UtestPlatform.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 30ec06585..e41d7dda7 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -209,12 +209,14 @@ static long TimeInMillisImplementation() static const char* TimeStringImplementation() { - time_t tm = time(NULLPTR); + time_t theTime = time(NULLPTR); static char dateTime[80]; #ifdef _WIN32 - struct tm *tmp = localtime_s(&tm); + static struct tm lastlocaltime; + localtime_s(&lastlocaltime, &theTime); + struct tm *tmp = &lastlocaltime; #else - struct tm *tmp = localtime(&tm); + struct tm *tmp = localtime(&theTime); #endif strftime(dateTime, 80, "%Y-%m-%dT%H:%M:%S", tmp); return dateTime; From 2d8a9eded7c695d4af373857ec0e67d081964af5 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 12:42:06 +0800 Subject: [PATCH 0505/1093] fopen_s for windows --- src/Platforms/Gcc/UtestPlatform.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index e41d7dda7..3aa1c2b92 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -237,7 +237,13 @@ int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_ static PlatformSpecificFile PlatformSpecificFOpenImplementation(const char* filename, const char* flag) { +#ifdef _WIN32 + FILE* file; + fopen_s(&file, filename, flag); + return file; +#else return fopen(filename, flag); +#endif } static void PlatformSpecificFPutsImplementation(const char* str, PlatformSpecificFile file) From e8a1022d8f2b5366ec3530d1ea83fc1179286eed Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 12:53:36 +0800 Subject: [PATCH 0506/1093] also use attribute unused for clang --- include/CppUTest/TestHarness_c.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 2f1ae775b..d859c4ff6 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -241,7 +241,7 @@ int cpputest_malloc_get_count(void); */ #ifndef PUNUSED -#if defined(__GNUC__) +#if defined(__GNUC__) || defined(__clang__) # define PUNUSED(x) PUNUSED_ ##x __attribute__((unused)) #else # define PUNUSED(x) x From 9285e937ae90651db969ab097e9c8778f7282168 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 13:20:26 +0800 Subject: [PATCH 0507/1093] Trying travis visual C++ build --- .travis.yml | 4 ++-- scripts/travis_ci_build.sh | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index c9995ef8d..60e58280d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,9 +35,9 @@ jobs: os: osx # Windows - - compiler: clang + - compiler: vc os: windows - env: BUILD=cmake_windows CPP_STD=17 + env: BUILD=vc_windows CPP_STD=17 # Linux - compiler: gcc diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index a48e826fb..4f9474131 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -147,9 +147,18 @@ if [ "x$BUILD" = "xautotools_dist" ]; then fi fi +if [ "x$BUILD" = "xvc_windows" ]; then + BUILD_ARGS=("-DWERROR=ON") + + if [ -n "$CPP_STD" ]; then + BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=$CPP_STD") + fi + + cmake --version + cmake "${BUILD_ARGS[@]}" .. +fi + if [ "x$BUILD" = "xcmake_windows" ]; then - pwd - ls choco install make BUILD_ARGS=("-DWERROR=ON") From 6485b7526512c277fadf3954991a0302e0727fc5 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 13:35:09 +0800 Subject: [PATCH 0508/1093] Resolving warnings in builds --- include/CppUTest/SimpleString.h | 6 +++--- include/CppUTest/StandardCLibrary.h | 2 +- src/CppUTest/SimpleString.cpp | 12 ++++++------ src/CppUTest/TestMemoryAllocator.cpp | 22 +++++++++++----------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 2fb125824..645444646 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -109,10 +109,10 @@ class SimpleString void deallocateInternalBuffer(); void setInternalBufferAsEmptyString(); - void setInternalBufferToNewBuffer(size_t size); - void setInternalBufferTo(char* buffer, size_t size); + void setInternalBufferToNewBuffer(size_t bufferSize); + void setInternalBufferTo(char* buffer, size_t bufferSize); void copyBufferToNewInternalBuffer(const char* otherBuffer); - void copyBufferToNewInternalBuffer(const char* otherBuffer, size_t size); + void copyBufferToNewInternalBuffer(const char* otherBuffer, size_t bufferSize); void copyBufferToNewInternalBuffer(const SimpleString& otherBuffer); char *buffer_; diff --git a/include/CppUTest/StandardCLibrary.h b/include/CppUTest/StandardCLibrary.h index 00dfb3387..a2171eafe 100644 --- a/include/CppUTest/StandardCLibrary.h +++ b/include/CppUTest/StandardCLibrary.h @@ -30,7 +30,7 @@ /* Needed for ... */ #include -//Kludge to get a va_copy in VC++ V6 and in GCC 98 +/* Kludge to get a va_copy in VC++ V6 and in GCC 98 */ #ifndef va_copy #ifdef __GNUC__ #define va_copy __va_copy diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index f0479f8c1..02137dce5 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -247,28 +247,28 @@ void SimpleString::setInternalBufferAsEmptyString() buffer_ = getEmptyString(); } -void SimpleString::copyBufferToNewInternalBuffer(const char* otherBuffer, size_t size) +void SimpleString::copyBufferToNewInternalBuffer(const char* otherBuffer, size_t bufferSize) { deallocateInternalBuffer(); - bufferSize_ = size; + bufferSize_ = bufferSize; buffer_ = copyToNewBuffer(otherBuffer, bufferSize_); } -void SimpleString::setInternalBufferToNewBuffer(size_t size) +void SimpleString::setInternalBufferToNewBuffer(size_t bufferSize) { deallocateInternalBuffer(); - bufferSize_ = size; + bufferSize_ = bufferSize; buffer_ = allocStringBuffer(bufferSize_, __FILE__, __LINE__); buffer_[0] = '\0'; } -void SimpleString::setInternalBufferTo(char* buffer, size_t size) +void SimpleString::setInternalBufferTo(char* buffer, size_t bufferSize) { deallocateInternalBuffer(); - bufferSize_ = size; + bufferSize_ = bufferSize; buffer_ = buffer; } diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 0b2829280..2f96874fb 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -552,22 +552,22 @@ size_t MemoryAccountant::maximumAllocationAtATimeOfSize(size_t size) const size_t MemoryAccountant::totalAllocations() const { - size_t totalAllocations = 0; + size_t theTotalAllocations = 0; for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) - totalAllocations += node->allocations_; + theTotalAllocations += node->allocations_; - return totalAllocations; + return theTotalAllocations; } size_t MemoryAccountant::totalDeallocations() const { - size_t totalDeallocations = 0; + size_t theTotalDeallocations = 0; for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) - totalDeallocations += node->deallocations_; + theTotalDeallocations += node->deallocations_; - return totalDeallocations; + return theTotalDeallocations; } SimpleString MemoryAccountant::reportNoAllocations() const @@ -606,16 +606,16 @@ SimpleString MemoryAccountant::report() const if (head_ == NULLPTR) return reportNoAllocations(); - SimpleString report = reportTitle() + reportHeader(); + SimpleString accountantReport = reportTitle() + reportHeader(); for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) - report += StringFromFormat(MEMORY_ACCOUNTANT_ROW_FORMAT, stringSize(node->size_).asCharString(), (int) node->allocations_, (int) node->deallocations_, (int) node->maxAllocations_); + accountantReport += StringFromFormat(MEMORY_ACCOUNTANT_ROW_FORMAT, stringSize(node->size_).asCharString(), (int) node->allocations_, (int) node->deallocations_, (int) node->maxAllocations_); - return report + reportFooter(); + return accountantReport + reportFooter(); } -AccountingTestMemoryAllocator::AccountingTestMemoryAllocator(MemoryAccountant& accountant, TestMemoryAllocator* originalAllocator) - : accountant_(accountant), originalAllocator_(originalAllocator), head_(NULLPTR) +AccountingTestMemoryAllocator::AccountingTestMemoryAllocator(MemoryAccountant& accountant, TestMemoryAllocator* origAllocator) + : accountant_(accountant), originalAllocator_(origAllocator), head_(NULLPTR) { } From 468a3e278954f872f1f5a2372d51fe9c3e9eae7f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 14:38:43 +0800 Subject: [PATCH 0509/1093] Removing more warnings --- cmake/Modules/CppUTestConfigurationOptions.cmake | 5 +++++ src/CppUTest/SimpleStringInternalCache.cpp | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index fc711d83a..92241e889 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -54,6 +54,11 @@ if (COVERAGE AND NOT MSVC) set(CMAKE_BUILD_TYPE "Debug") endif (COVERAGE AND NOT MSVC) +if (MINGW) + set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} -std=c99") + set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -std=c99") +endif(MINGW) + if (CMAKE_CXX_STANDARD) set(CMAKE_CXX_EXTENSIONS OFF) elseif (C++11) diff --git a/src/CppUTest/SimpleStringInternalCache.cpp b/src/CppUTest/SimpleStringInternalCache.cpp index 77bcbca0b..f339fa4c7 100644 --- a/src/CppUTest/SimpleStringInternalCache.cpp +++ b/src/CppUTest/SimpleStringInternalCache.cpp @@ -264,10 +264,10 @@ TestMemoryAllocator* GlobalSimpleStringCache::getAllocator() return allocator_; } -SimpleStringCacheAllocator::SimpleStringCacheAllocator(SimpleStringInternalCache& cache, TestMemoryAllocator* originalAllocator) - : cache_(cache), originalAllocator_(originalAllocator) +SimpleStringCacheAllocator::SimpleStringCacheAllocator(SimpleStringInternalCache& cache, TestMemoryAllocator* origAllocator) + : cache_(cache), originalAllocator_(origAllocator) { - cache_.setAllocator(originalAllocator); + cache_.setAllocator(origAllocator); } SimpleStringCacheAllocator::~SimpleStringCacheAllocator() From 1db9a653f53b2116ca2cde06d76c104630e3d8ad Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 14:55:16 +0800 Subject: [PATCH 0510/1093] Passed standard to mingw build, should avoid warnings --- scripts/appveyor_ci_build.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index b5f42b93c..9bb238a61 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -27,7 +27,7 @@ function Invoke-CygwinCommand($command, $directory = '.') $cygwin_directory = (. "${cygwin_bin}\cygpath.exe" (Resolve-Path $directory)) $command_wrapped = "${cygwin_bin}\bash.exe --login -c 'cd $cygwin_directory ; $command'" - + Write-Host "Executing <$command> in <$cygwin_directory>" Invoke-Expression $command_wrapped @@ -72,19 +72,19 @@ switch -Wildcard ($env:Platform) 'MinGW*' { $mingw_path = Get-MinGWBin - + if ($env:Platform -like 'MinGWClang*') { $toolchain_filename = Get-ClangToolchainFilename $toolchain_path = (Join-Path (Split-Path $MyInvocation.MyCommand.Path) "..\cmake\$toolchain_filename") - $toolchain = "-DCMAKE_TOOLCHAIN_FILE=$toolchain_path" + $toolchain = "-DCMAKE_TOOLCHAIN_FILE=$toolchain_path" } # Add mingw to the path Add-PathFolder $mingw_path Invoke-BuildCommand "cmake --version" - Invoke-BuildCommand "cmake -G 'MinGW Makefiles' $toolchain .." 'cpputest_build' + Invoke-BuildCommand "cmake -G 'MinGW Makefiles' -DCMAKE_CXX_STANDARD=17 $toolchain .." 'cpputest_build' Invoke-BuildCommand "mingw32-make all" 'cpputest_build' Remove-PathFolder $mingw_path From b569f6f9678210dc5d5fba57b378abe6384db61b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 16:41:08 +0800 Subject: [PATCH 0511/1093] didn't work --- cmake/Modules/CppUTestConfigurationOptions.cmake | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 92241e889..fc711d83a 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -54,11 +54,6 @@ if (COVERAGE AND NOT MSVC) set(CMAKE_BUILD_TYPE "Debug") endif (COVERAGE AND NOT MSVC) -if (MINGW) - set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} -std=c99") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -std=c99") -endif(MINGW) - if (CMAKE_CXX_STANDARD) set(CMAKE_CXX_EXTENSIONS OFF) elseif (C++11) From b961c91f7653368dca56e8d273d969c458986031 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 16:42:40 +0800 Subject: [PATCH 0512/1093] Address sanitizer on clang linux will turn off memory leak checker automatically --- include/CppUTest/CppUTestConfig.h | 9 ++++++++- tests/CppUTest/MemoryLeakWarningTest.cpp | 4 ++-- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index f7994c092..3f24aaa0e 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -188,6 +188,13 @@ #if CPPUTEST_SANITIZE_ADDRESS #define CPPUTEST_SANITIZE_ADDRESS 1 #define CPPUTEST_DO_NOT_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) + #if defined(__linux__) && defined(__clang__) + #if CPPUTEST_USE_MEM_LEAK_DETECTION + #warning Compiling with Address Sanitizer with clang on linux will cause duplicate symbols for operator new. Turning off memory leak detection. Compile with -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED to get rid of this warning. + #undef CPPUTEST_USE_MEM_LEAK_DETECTION + #define CPPUTEST_USE_MEM_LEAK_DETECTION 0 + #endif + #endif #else #define CPPUTEST_SANITIZER_ADDRESS 0 #define CPPUTEST_DO_NOT_SANITIZE_ADDRESS @@ -239,7 +246,7 @@ /* * Support for "long long" type. * - * Not supported when CPUTEST_LONG_LONG_DISABLED is set. + * Not supported when CPPUTEST_LONG_LONG_DISABLED is set. * Can be overridden by using CPPUTEST_USE_LONG_LONG * * CPPUTEST_HAVE_LONG_LONG_INT is set by configure diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index ed19a0b3f..71c020994 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -266,7 +266,7 @@ TEST(MemoryLeakWarningGlobalDetectorTest, MemoryWarningPluginCanBeSetToDestroyTh CHECK(DummyMemoryLeakDetector::wasDeleted()); } -#ifndef CPPUTEST_MEM_LEAK_DETECTION_DISABLED +#if CPPUTEST_USE_MEM_LEAK_DETECTION TEST(MemoryLeakWarningGlobalDetectorTest, crashOnLeakWithOperatorNew) { @@ -390,7 +390,7 @@ TEST(MemoryLeakWarningGlobalDetectorTest, turnOffNewOverloadsNoThrowCausesNoAddi #endif } -#ifndef CPPUTEST_MEM_LEAK_DETECTION_DISABLED +#if CPPUTEST_USE_MEM_LEAK_DETECTION static int mutexLockCount = 0; static int mutexUnlockCount = 0; diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index f5a69d655..80c574492 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -20,7 +20,7 @@ TEST(BasicBehavior, CanDeleteNullPointers) delete [] (char*) NULLPTR; } -#ifndef CPPUTEST_MEM_LEAK_DETECTION_DISABLED +#if CPPUTEST_USE_MEM_LEAK_DETECTION CPPUTEST_DO_NOT_SANITIZE_ADDRESS static void deleteArrayInvalidatesMemory() From d5061ca3ba1657f309f6bfd004652567f54046c3 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 19:30:21 +0800 Subject: [PATCH 0513/1093] MSBuild work in travis CI Windows? --- scripts/travis_ci_build.sh | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 4f9474131..7d05e109d 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -148,14 +148,17 @@ if [ "x$BUILD" = "xautotools_dist" ]; then fi if [ "x$BUILD" = "xvc_windows" ]; then - BUILD_ARGS=("-DWERROR=ON") + msbuild -v + msbuild CppUTest.vcxproj +# BUILD_ARGS=("-DWERROR=ON") - if [ -n "$CPP_STD" ]; then - BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=$CPP_STD") - fi - cmake --version - cmake "${BUILD_ARGS[@]}" .. +# if [ -n "$CPP_STD" ]; then +# BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=$CPP_STD") +# fi + +# cmake --version +# cmake "${BUILD_ARGS[@]}" .. fi if [ "x$BUILD" = "xcmake_windows" ]; then From 265bd1c88e05c70b9dde6996b5396fa21d809148 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 20:00:02 +0800 Subject: [PATCH 0514/1093] Dotnet build? --- scripts/travis_ci_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 7d05e109d..1fca8c3d9 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -148,8 +148,8 @@ if [ "x$BUILD" = "xautotools_dist" ]; then fi if [ "x$BUILD" = "xvc_windows" ]; then - msbuild -v - msbuild CppUTest.vcxproj + dotnet build -v + dotnet build CppUTest.vcxproj # BUILD_ARGS=("-DWERROR=ON") From 0f25881513a668b5732d01a9fef5b10183e3b71d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 9 May 2020 21:15:53 +0800 Subject: [PATCH 0515/1093] Lets see if this works --- scripts/travis_ci_build.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 1fca8c3d9..ac3a4f9ed 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -148,8 +148,7 @@ if [ "x$BUILD" = "xautotools_dist" ]; then fi if [ "x$BUILD" = "xvc_windows" ]; then - dotnet build -v - dotnet build CppUTest.vcxproj + dotnet build $CPPUTEST_HOME/CppUTest.vcxproj # BUILD_ARGS=("-DWERROR=ON") From b2f4f2b369186be8b9babc287bcf2f1ff5c2cbcf Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 07:48:44 +0800 Subject: [PATCH 0516/1093] VCBuild? --- scripts/travis_ci_build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index ac3a4f9ed..2c6b89fed 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -148,6 +148,7 @@ if [ "x$BUILD" = "xautotools_dist" ]; then fi if [ "x$BUILD" = "xvc_windows" ]; then + vcbuild dotnet build $CPPUTEST_HOME/CppUTest.vcxproj # BUILD_ARGS=("-DWERROR=ON") From c76624f02e729690a3f3760c037e4687e3c741cb Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 07:56:56 +0800 Subject: [PATCH 0517/1093] MSBuld? --- scripts/travis_ci_build.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 2c6b89fed..09987f005 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -148,6 +148,8 @@ if [ "x$BUILD" = "xautotools_dist" ]; then fi if [ "x$BUILD" = "xvc_windows" ]; then + export PATH=$MSBUILD_PATH:$PATH + msbuild vcbuild dotnet build $CPPUTEST_HOME/CppUTest.vcxproj # BUILD_ARGS=("-DWERROR=ON") From afcd4b35db5bab0dd832a3130049d7052a34000c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 08:15:34 +0800 Subject: [PATCH 0518/1093] MSBUILD_PATH --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 60e58280d..185e38392 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,9 +35,10 @@ jobs: os: osx # Windows - - compiler: vc + - compiler: msbuild os: windows env: BUILD=vc_windows CPP_STD=17 + - MSBUILD_PATH="c:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin" # Linux - compiler: gcc From d6db497eb714eac1bbf115c531e4d995f94585ab Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 08:44:36 +0800 Subject: [PATCH 0519/1093] .exe ? --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 09987f005..cc9ee2ff0 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -149,7 +149,7 @@ fi if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH - msbuild + MSBuild.exe vcbuild dotnet build $CPPUTEST_HOME/CppUTest.vcxproj # BUILD_ARGS=("-DWERROR=ON") From 535055a47bdfcecb1eb29316d129b5375aa0dc68 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 08:49:35 +0800 Subject: [PATCH 0520/1093] Passing project file works? --- scripts/travis_ci_build.sh | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index cc9ee2ff0..3b33e5442 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -149,18 +149,7 @@ fi if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH - MSBuild.exe - vcbuild - dotnet build $CPPUTEST_HOME/CppUTest.vcxproj -# BUILD_ARGS=("-DWERROR=ON") - - -# if [ -n "$CPP_STD" ]; then -# BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=$CPP_STD") -# fi - -# cmake --version -# cmake "${BUILD_ARGS[@]}" .. + MSBuild.exe //ToolsVersion:14.0 $CPPUTEST/CppUTest.vcxproj' fi if [ "x$BUILD" = "xcmake_windows" ]; then From 7b335d5fc45fd8ce46b1744609c5de24a8e27845 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 08:51:43 +0800 Subject: [PATCH 0521/1093] Too much quote --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 3b33e5442..d3a4dac57 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -149,7 +149,7 @@ fi if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH - MSBuild.exe //ToolsVersion:14.0 $CPPUTEST/CppUTest.vcxproj' + MSBuild.exe //ToolsVersion:14.0 $CPPUTEST/CppUTest.vcxproj fi if [ "x$BUILD" = "xcmake_windows" ]; then From c066e0f5682f791a906c84510b887402c3cc273d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 08:53:48 +0800 Subject: [PATCH 0522/1093] Corrected home --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index d3a4dac57..f959b3522 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -149,7 +149,7 @@ fi if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH - MSBuild.exe //ToolsVersion:14.0 $CPPUTEST/CppUTest.vcxproj + MSBuild.exe //ToolsVersion:14.0 $CPPUTEST_HOME/CppUTest.vcxproj fi if [ "x$BUILD" = "xcmake_windows" ]; then From 6a80ced07d7399f481597cb6a14db7511e1d2451 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 11:39:04 +0800 Subject: [PATCH 0523/1093] Changed to tool 15 --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index f959b3522..c56278732 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -149,7 +149,7 @@ fi if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH - MSBuild.exe //ToolsVersion:14.0 $CPPUTEST_HOME/CppUTest.vcxproj + MSBuild.exe //ToolsVersion:15.0 $CPPUTEST_HOME/CppUTest.vcxproj fi if [ "x$BUILD" = "xcmake_windows" ]; then From 4e26d33c8ca856fea2780df5ec96081e9499d6bf Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 11:42:08 +0800 Subject: [PATCH 0524/1093] Try 4.0 tool chain ? --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index c56278732..0cb5dd530 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -149,7 +149,7 @@ fi if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH - MSBuild.exe //ToolsVersion:15.0 $CPPUTEST_HOME/CppUTest.vcxproj + MSBuild.exe //ToolsVersion:4.0 $CPPUTEST_HOME/CppUTest.vcxproj fi if [ "x$BUILD" = "xcmake_windows" ]; then From adc5b75313e9ee83297491b804f7f796449f811e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 11:48:10 +0800 Subject: [PATCH 0525/1093] Will this work? --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 185e38392..0e408f39c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,6 +39,7 @@ jobs: os: windows env: BUILD=vc_windows CPP_STD=17 - MSBUILD_PATH="c:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin" + - VCTargetsPath="C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\VC\VCTargets" # Linux - compiler: gcc From 0c04e981e38a311b9fa60cae5c159ab35df6ee11 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 11:58:43 +0800 Subject: [PATCH 0526/1093] Retry 15.0 --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 0cb5dd530..c56278732 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -149,7 +149,7 @@ fi if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH - MSBuild.exe //ToolsVersion:4.0 $CPPUTEST_HOME/CppUTest.vcxproj + MSBuild.exe //ToolsVersion:15.0 $CPPUTEST_HOME/CppUTest.vcxproj fi if [ "x$BUILD" = "xcmake_windows" ]; then From 4e63659197b7d6ea4e41502773bfd0b274494ffa Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 12:05:33 +0800 Subject: [PATCH 0527/1093] Back to 4.0 and removed VC6imports --- CppUTest.vcxproj | 4 ---- scripts/travis_ci_build.sh | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index 88333b510..e39220c90 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -47,19 +47,15 @@ - - - - diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index c56278732..0cb5dd530 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -149,7 +149,7 @@ fi if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH - MSBuild.exe //ToolsVersion:15.0 $CPPUTEST_HOME/CppUTest.vcxproj + MSBuild.exe //ToolsVersion:4.0 $CPPUTEST_HOME/CppUTest.vcxproj fi if [ "x$BUILD" = "xcmake_windows" ]; then From c5c7877bd91bd9fccfe76042ede682cf61483191 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 12:18:35 +0800 Subject: [PATCH 0528/1093] Try CMake --- scripts/travis_ci_build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 0cb5dd530..d331545b6 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -149,7 +149,8 @@ fi if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH - MSBuild.exe //ToolsVersion:4.0 $CPPUTEST_HOME/CppUTest.vcxproj + cmake .. +# MSBuild.exe //ToolsVersion:4.0 $CPPUTEST_HOME/CppUTest.vcxproj fi if [ "x$BUILD" = "xcmake_windows" ]; then From 33b04b9f9d56d90a8c4955e78e36c24581ddb6f7 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 12:21:04 +0800 Subject: [PATCH 0529/1093] Check the output --- scripts/travis_ci_build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index d331545b6..eab3f172a 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -150,6 +150,7 @@ fi if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH cmake .. + ls -la # MSBuild.exe //ToolsVersion:4.0 $CPPUTEST_HOME/CppUTest.vcxproj fi From a2423bf31f59ec9d8ec258a38e8694982cd34e71 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 12:27:46 +0800 Subject: [PATCH 0530/1093] Findout the CMake output --- scripts/travis_ci_build.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index eab3f172a..2a2665944 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -151,6 +151,9 @@ if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH cmake .. ls -la + ls -la .. + pwd + ls -la $CPPUTEST_HOME # MSBuild.exe //ToolsVersion:4.0 $CPPUTEST_HOME/CppUTest.vcxproj fi From 98f4b92335a47cbc1b75b2bdbd01a60243367596 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 12:56:18 +0800 Subject: [PATCH 0531/1093] build the generated project file? --- scripts/travis_ci_build.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 2a2665944..9d5ed9ee8 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -151,10 +151,7 @@ if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH cmake .. ls -la - ls -la .. - pwd - ls -la $CPPUTEST_HOME -# MSBuild.exe //ToolsVersion:4.0 $CPPUTEST_HOME/CppUTest.vcxproj + MSBuild.exe ALL_BUILD.vcxproj fi if [ "x$BUILD" = "xcmake_windows" ]; then From 540a5bc4b8499aaf3e1564623f906923cac65349 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 13:12:43 +0800 Subject: [PATCH 0532/1093] Check for the test executable files --- scripts/travis_ci_build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 9d5ed9ee8..7598dc9da 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -152,6 +152,7 @@ if [ "x$BUILD" = "xvc_windows" ]; then cmake .. ls -la MSBuild.exe ALL_BUILD.vcxproj + ls -la fi if [ "x$BUILD" = "xcmake_windows" ]; then From b86fb0ac6e5c6a18804f231b065fc47543ec8215 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 13:36:37 +0800 Subject: [PATCH 0533/1093] Finding the executable --- scripts/travis_ci_build.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 7598dc9da..b35f8e17d 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -153,6 +153,8 @@ if [ "x$BUILD" = "xvc_windows" ]; then ls -la MSBuild.exe ALL_BUILD.vcxproj ls -la + ls -la Debug + ls -la Testing fi if [ "x$BUILD" = "xcmake_windows" ]; then From 2b431f07816a419d609706fa443cdef239facd2e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 13:48:02 +0800 Subject: [PATCH 0534/1093] Searching for executable --- scripts/travis_ci_build.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index b35f8e17d..3625a44e5 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -152,9 +152,7 @@ if [ "x$BUILD" = "xvc_windows" ]; then cmake .. ls -la MSBuild.exe ALL_BUILD.vcxproj - ls -la - ls -la Debug - ls -la Testing + ls -laR fi if [ "x$BUILD" = "xcmake_windows" ]; then From d7ac6dcc033a0312a7d925a2b2bfadbb49f7d79e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 14:10:57 +0800 Subject: [PATCH 0535/1093] Found them, executing the tests build on Windows --- scripts/travis_ci_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 3625a44e5..1883ccec9 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -150,9 +150,9 @@ fi if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH cmake .. - ls -la MSBuild.exe ALL_BUILD.vcxproj - ls -laR + ./tests/CppUTest/CppUTestTests.exe + ./tests/CppUTestExt/CppUTestExtTests.exe fi if [ "x$BUILD" = "xcmake_windows" ]; then From 3b47946c30c338f2d49e2453755c2d0be0e17174 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 17:58:15 +0800 Subject: [PATCH 0536/1093] NULLPTR for NoStdC --- src/Platforms/GccNoStdC/UtestPlatform.cpp | 54 +++++++++++------------ 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/Platforms/GccNoStdC/UtestPlatform.cpp b/src/Platforms/GccNoStdC/UtestPlatform.cpp index 134ffdbd4..1584d8f32 100644 --- a/src/Platforms/GccNoStdC/UtestPlatform.cpp +++ b/src/Platforms/GccNoStdC/UtestPlatform.cpp @@ -35,46 +35,46 @@ #include "CppUTest/PlatformSpecificFunctions.h" -void (*PlatformSpecificRunTestInASeperateProcess)(UtestShell*, TestPlugin*, TestResult*) = NULL; -int (*PlatformSpecificFork)() = NULL; -int (*PlatformSpecificWaitPid)(int, int*, int) = NULL; +void (*PlatformSpecificRunTestInASeperateProcess)(UtestShell*, TestPlugin*, TestResult*) = NULLPTR; +int (*PlatformSpecificFork)() = NULLPTR; +int (*PlatformSpecificWaitPid)(int, int*, int) = NULLPTR; TestOutput::WorkingEnvironment PlatformSpecificGetWorkingEnvironment() { return TestOutput::eclipse; } -void (*PlatformSpecificLongJmp)() = NULL; -int (*PlatformSpecificSetJmp)(void (*)(void*), void*) = NULL; -void (*PlatformSpecificRestoreJumpBuffer)() = NULL; +void (*PlatformSpecificLongJmp)() = NULLPTR; +int (*PlatformSpecificSetJmp)(void (*)(void*), void*) = NULLPTR; +void (*PlatformSpecificRestoreJumpBuffer)() = NULLPTR; -long (*GetPlatformSpecificTimeInMillis)() = NULL; -const char* (*GetPlatformSpecificTimeString)() = NULL; +long (*GetPlatformSpecificTimeInMillis)() = NULLPTR; +const char* (*GetPlatformSpecificTimeString)() = NULLPTR; /* IO operations */ -PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag) = NULL; -void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = NULL; -void (*PlatformSpecificFClose)(PlatformSpecificFile file) = NULL; +PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag) = NULLPTR; +void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = NULLPTR; +void (*PlatformSpecificFClose)(PlatformSpecificFile file) = NULLPTR; -int (*PlatformSpecificPutchar)(int c) = NULL; -void (*PlatformSpecificFlush)(void) = NULL; +int (*PlatformSpecificPutchar)(int c) = NULLPTR; +void (*PlatformSpecificFlush)(void) = NULLPTR; -int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_list va_args_list) = NULL; +int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_list va_args_list) = NULLPTR; /* Dynamic Memory operations */ -void* (*PlatformSpecificMalloc)(size_t) = NULL; -void* (*PlatformSpecificRealloc)(void*, size_t) = NULL; -void (*PlatformSpecificFree)(void*) = NULL; -void* (*PlatformSpecificMemCpy)(void*, const void*, size_t) = NULL; -void* (*PlatformSpecificMemset)(void*, int, size_t) = NULL; +void* (*PlatformSpecificMalloc)(size_t) = NULLPTR; +void* (*PlatformSpecificRealloc)(void*, size_t) = NULLPTR; +void (*PlatformSpecificFree)(void*) = NULLPTR; +void* (*PlatformSpecificMemCpy)(void*, const void*, size_t) = NULLPTR; +void* (*PlatformSpecificMemset)(void*, int, size_t) = NULLPTR; -double (*PlatformSpecificFabs)(double) = NULL; -int (*PlatformSpecificIsNan)(double) = NULL; -int (*PlatformSpecificIsInf)(double) = NULL; -int (*PlatformSpecificAtExit)(void(*func)(void)) = NULL; +double (*PlatformSpecificFabs)(double) = NULLPTR; +int (*PlatformSpecificIsNan)(double) = NULLPTR; +int (*PlatformSpecificIsInf)(double) = NULLPTR; +int (*PlatformSpecificAtExit)(void(*func)(void)) = NULLPTR; -PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void) = NULL; -void (*PlatformSpecificMutexLock)(PlatformSpecificMutex mtx) = NULL; -void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex mtx) = NULL; -void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex mtx) = NULL; +PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void) = NULLPTR; +void (*PlatformSpecificMutexLock)(PlatformSpecificMutex mtx) = NULLPTR; +void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex mtx) = NULLPTR; +void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex mtx) = NULLPTR; From f6f3bd29419f3c661bdefd2a595dd128a59bbebd Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 18:00:47 +0800 Subject: [PATCH 0537/1093] Different architectures in the build --- .travis.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0e408f39c..30608a6cc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,6 +48,15 @@ jobs: env: BUILD=autotools - compiler: clang env: BUILD=autotools + - arch: ppc64le + compiler: gcc + env: BUILD=autotools + - arch: s390x + compiler: gcc + env: BUILD=autotools + - arch: arm64 + compiler: gcc + env: BUILD=autotools # Extended builds, different C++ version and build tools - stage: extended build & test From ad6770bf733a84bc7b015a1d86844a1aac708829 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 18:45:44 +0800 Subject: [PATCH 0538/1093] Moved the platform to cron --- .travis.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 30608a6cc..6c35e93d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,15 +48,6 @@ jobs: env: BUILD=autotools - compiler: clang env: BUILD=autotools - - arch: ppc64le - compiler: gcc - env: BUILD=autotools - - arch: s390x - compiler: gcc - env: BUILD=autotools - - arch: arm64 - compiler: gcc - env: BUILD=autotools # Extended builds, different C++ version and build tools - stage: extended build & test @@ -145,6 +136,15 @@ jobs: env: BUILD=extensive_check - compiler: clang env: BUILD=extensive_check + - arch: ppc64le + compiler: gcc + env: BUILD=autotools + - arch: s390x + compiler: gcc + env: BUILD=autotools + - arch: arm64 + compiler: gcc + env: BUILD=autotools # Deploy to github releases - stage: deploy latest From 3639e45eceff7814272e4fbc64cfd3dd80ac5d3c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 19:46:23 +0800 Subject: [PATCH 0539/1093] No C++98 padantic --- build/MakefileWorker.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index fd10791f7..8844c84f1 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -176,7 +176,7 @@ endif # Default warnings ifndef CPPUTEST_WARNINGFLAGS - CPPUTEST_WARNINGFLAGS = -Wall -Wextra -Werror -Wshadow -Wswitch-default -Wswitch-enum -Wconversion -Wno-long-long + CPPUTEST_WARNINGFLAGS = -Wall -Wextra -Werror -Wshadow -Wswitch-default -Wswitch-enum -Wconversion -Wno-long-long -Wno-c++98-compat-pedantic ifeq ($(CPPUTEST_PEDANTIC_ERRORS), Y) CPPUTEST_WARNINGFLAGS += -pedantic-errors endif From 00b625c846420eaa08e00b0765ba414db6d9680b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 19:47:08 +0800 Subject: [PATCH 0540/1093] Changed __no_return__ to _no_return_ to avoid compiler warning --- include/CppUTest/CppUTestConfig.h | 6 +++--- src/Platforms/Gcc/UtestPlatform.cpp | 4 ++-- tests/CppUTest/AllocationInCppFile.h | 2 +- tests/CppUTest/UtestPlatformTest.cpp | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 3f24aaa0e..16fbd0824 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -94,7 +94,7 @@ /* Should be the only #include here. Standard C library wrappers */ #include "StandardCLibrary.h" -/* Create a __no_return__ macro, which is used to flag a function as not returning. +/* Create a _no_return_ macro, which is used to flag a function as not returning. * Used for functions that always throws for instance. * * This is needed for compiling with clang, without breaking other compilers. @@ -104,9 +104,9 @@ #endif #if __has_attribute(noreturn) - #define __no_return__ __attribute__((noreturn)) + #define _no_return_ __attribute__((noreturn)) #else - #define __no_return__ + #define _no_return_ #endif #if __has_attribute(format) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 3aa1c2b92..7717f22d1 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -172,11 +172,11 @@ static int PlatformSpecificSetJmpImplementation(void (*function) (void* data), v } /* - * MacOSX clang 3.0 doesn't seem to recognize longjmp and thus complains about __no_return_. + * MacOSX clang 3.0 doesn't seem to recognize longjmp and thus complains about _no_return_. * The later clang compilers complain when it isn't there. So only way is to check the clang compiler here :( */ #if !((__clang_major__ == 3) && (__clang_minor__ == 0)) -__no_return__ +_no_return_ #endif static void PlatformSpecificLongJmpImplementation() { diff --git a/tests/CppUTest/AllocationInCppFile.h b/tests/CppUTest/AllocationInCppFile.h index c4642b598..f3b47766a 100644 --- a/tests/CppUTest/AllocationInCppFile.h +++ b/tests/CppUTest/AllocationInCppFile.h @@ -12,7 +12,7 @@ char* newArrayAllocationWithoutMacro(); class ClassThatThrowsAnExceptionInTheConstructor { public: - ClassThatThrowsAnExceptionInTheConstructor() __no_return__; + ClassThatThrowsAnExceptionInTheConstructor() _no_return_; }; #endif diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index da56eb13e..bba56e9e7 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -60,7 +60,7 @@ static void _failFunction() FAIL("This test fails"); } -static void _exitNonZeroFunction() __no_return__; +static void _exitNonZeroFunction() _no_return_; static void _exitNonZeroFunction() { /* destructor of static objects will be called. If StringCache was there then the allocator will report invalid deallocations of static SimpleString */ From bf18899519fe2b82d3b699573a5525119979051a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 19:49:09 +0800 Subject: [PATCH 0541/1093] changed __check_format__ to _check_format_ to avoid compiler warning --- include/CppUTest/CppUTestConfig.h | 4 ++-- include/CppUTest/MemoryLeakDetector.h | 2 +- include/CppUTest/SimpleString.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 16fbd0824..d7b05985a 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -110,9 +110,9 @@ #endif #if __has_attribute(format) - #define __check_format__(type, format_parameter, other_parameters) __attribute__ ((format (type, format_parameter, other_parameters))) + #define _check_format_(type, format_parameter, other_parameters) __attribute__ ((format (type, format_parameter, other_parameters))) #else - #define __check_format__(type, format_parameter, other_parameters) /* type, format_parameter, other_parameters */ + #define _check_format_(type, format_parameter, other_parameters) /* type, format_parameter, other_parameters */ #endif /* diff --git a/include/CppUTest/MemoryLeakDetector.h b/include/CppUTest/MemoryLeakDetector.h index f2c046619..4057ca806 100644 --- a/include/CppUTest/MemoryLeakDetector.h +++ b/include/CppUTest/MemoryLeakDetector.h @@ -58,7 +58,7 @@ struct SimpleStringBuffer SimpleStringBuffer(); void clear(); - void add(const char* format, ...) __check_format__(printf, 2, 3); + void add(const char* format, ...) _check_format_(printf, 2, 3); void addMemoryDump(const void* memory, size_t memorySize); char* toString(); diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 645444646..e56e6947c 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -203,7 +203,7 @@ SimpleString HexStringFrom(const void* value); SimpleString HexStringFrom(void (*value)()); SimpleString StringFrom(double value, int precision = 6); SimpleString StringFrom(const SimpleString& other); -SimpleString StringFromFormat(const char* format, ...) __check_format__(printf, 1, 2); +SimpleString StringFromFormat(const char* format, ...) _check_format_(printf, 1, 2); SimpleString VStringFromFormat(const char* format, va_list args); SimpleString StringFromBinary(const unsigned char* value, size_t size); SimpleString StringFromBinaryOrNull(const unsigned char* value, size_t size); From cb8af788f9baa3ff2e54684175fd34b079aab033 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 19:53:53 +0800 Subject: [PATCH 0542/1093] Added warning flags for clang builds --- build/MakefileWorker.mk | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index 8844c84f1..6c7c90ab6 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -176,7 +176,7 @@ endif # Default warnings ifndef CPPUTEST_WARNINGFLAGS - CPPUTEST_WARNINGFLAGS = -Wall -Wextra -Werror -Wshadow -Wswitch-default -Wswitch-enum -Wconversion -Wno-long-long -Wno-c++98-compat-pedantic + CPPUTEST_WARNINGFLAGS = -Wall -Wextra -Werror -Wshadow -Wswitch-default -Wswitch-enum -Wconversion -Wno-long-long ifeq ($(CPPUTEST_PEDANTIC_ERRORS), Y) CPPUTEST_WARNINGFLAGS += -pedantic-errors endif @@ -195,7 +195,10 @@ ifeq ($(COMPILER_NAME),$(CLANG_STR)) # -Wno-weak-vtables -> The TEST_GROUP macro declares a class and will automatically inline its methods. Thats ok as they are only in one translation unit. Unfortunately, the warning can't detect that, so it must be disabled. # -Wno-old-style-casts -> We only use old style casts by decision # -Wno-c++11-long-long -> When it detects long long, then we can use it and no need for a warning about that - CPPUTEST_CXX_WARNINGFLAGS += -Weverything -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables -Wno-old-style-cast -Wno-c++11-long-long +# -Wno-c++98-compat-pedantic -> Incompatibilities with C++98, these are happening through #define. +# -Wno-reserved-id-macro -> Macro uses __ in MINGW... can't change that. +# -Wno-keyword-macro -> new overload + CPPUTEST_CXX_WARNINGFLAGS += -Weverything -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables -Wno-old-style-cast -Wno-c++11-long-long -Wno-c++98-compat-pedantic -Wno-reserved-id-macro -Wno-keyword-macro CPPUTEST_C_WARNINGFLAGS += -Weverything -Wno-padded # Clang "7" or newer (Xcode 7 or newer command-line tools) introduced new warnings by default that don't exist on previous versions of clang and cause errors when present. From e852acd8166c94baa638d0f1f5f0d53a67e8225e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 10 May 2020 20:08:59 +0800 Subject: [PATCH 0543/1093] Remove VC6. Cannot install the compiler anymore --- CppUTest.dsp | 369 ------ CppUTest.dsw | 44 - CppUTest.mak | 892 --------------- examples/AllTests/AllTests.dsp | 141 --- examples/ApplicationLib/ApplicationLib.dsp | 124 -- examples/CppUTestExample.dsw | 44 - makeVc6.bat | 16 - tests/AllTests.dsp | 389 ------- tests/AllTests.mak | 1188 -------------------- 9 files changed, 3207 deletions(-) delete mode 100644 CppUTest.dsp delete mode 100644 CppUTest.dsw delete mode 100644 CppUTest.mak delete mode 100644 examples/AllTests/AllTests.dsp delete mode 100644 examples/ApplicationLib/ApplicationLib.dsp delete mode 100644 examples/CppUTestExample.dsw delete mode 100644 makeVc6.bat delete mode 100644 tests/AllTests.dsp delete mode 100644 tests/AllTests.mak diff --git a/CppUTest.dsp b/CppUTest.dsp deleted file mode 100644 index 2ad0d9564..000000000 --- a/CppUTest.dsp +++ /dev/null @@ -1,369 +0,0 @@ -# Microsoft Developer Studio Project File - Name="CppUTest" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=CppUTest - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "CppUTest.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "CppUTest.mak" CFG="CppUTest - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "CppUTest - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "CppUTest - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "CppUTest - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I ".\include\Platforms\VisualCpp" /I ".\include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "CPPUTEST_MEM_LEAK_DETECTION_DISABLED" /D "CPPUTEST_USE_LONG_LONG" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"lib\CppUTest.lib" - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I ".\include\Platforms\VisualCpp" /I ".\include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "CPPUTEST_MEM_LEAK_DETECTION_DISABLED" /D "CPPUTEST_USE_LONG_LONG" /FR /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"lib\CppUTestd.lib" - -!ENDIF - -# Begin Target - -# Name "CppUTest - Win32 Release" -# Name "CppUTest - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\src\CppUTestExt\CodeMemoryReportFormatter.cpp -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\GTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\MemoryReportAllocator.cpp -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\MemoryReporterPlugin.cpp -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\MemoryReportFormatter.cpp -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\MockActualCall.cpp" -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\MockExpectedCall.cpp" -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\MockExpectedCallsList.cpp" -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\MockFailure.cpp" -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\MockNamedValue.cpp" -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\MockSupport.cpp" -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\MockSupportPlugin.cpp" -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\MockSupport_c.cpp" -# End Source File -# Begin Source File - -SOURCE=.\src\CppUTestExt\OrderedTest.cpp" -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\CommandLineArguments.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\CommandLineTestRunner.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\JUnitTestOutput.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\MemoryLeakDetector.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\MemoryLeakWarningPlugin.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\SimpleMutex.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\SimpleString.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\SimpleStringInternalCache.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\TeamCityTestOutput.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\TestFailure.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\TestFilter.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\TestHarness_c.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\TestMemoryAllocator.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\TestOutput.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\TestPlugin.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\TestRegistry.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\TestResult.cpp -# End Source File -# Begin Source File - -SOURCE=.\SRC\CPPUTEST\Utest.cpp -# End Source File -# Begin Source File - -SOURCE=.\src\Platforms\VisualCpp\UtestPlatform.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\include\CppUTestExt\CodeMemoryReportFormatter.h" -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\GMock.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\GTestConvertor.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\MemoryReportAllocator.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\MemoryReporterPlugin.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\MemoryReportFormatter.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\MockCheckedActualCall.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\MockCheckedExpectedCall.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\MockExpectedCallsList.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\MockFailure.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\MockNamedValue.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\MockSupport.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\MockSupportPlugin.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\MockSupport_c.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTestExt\OrderedTest.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\CommandLineTestRunner.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\EqualsFailure.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\Failure.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\JunitTestOutput.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\MemoryLeakWarning.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\MemoryLeakWarningPlugin.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\MockTestOutput.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\NullTest.h -# End Source File -# Begin Source File - -SOURCE=.\src\Platforms\VisualCpp\Platform.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\RealTestOutput.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\SimpleString.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\SimpleStringInternalCache.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\TestHarness.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\TestHarness_c.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\TestInstaller.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\TestOutput.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\TestPlugin.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\TestRegistry.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\TestResult.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\Utest.h -# End Source File -# Begin Source File - -SOURCE=.\include\CppUTest\VirtualCall.h -# End Source File -# End Group -# End Target -# End Project diff --git a/CppUTest.dsw b/CppUTest.dsw deleted file mode 100644 index cab2e26f9..000000000 --- a/CppUTest.dsw +++ /dev/null @@ -1,44 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "AllTests"=.\tests\AllTests.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name CppUTest - End Project Dependency -}}} - -############################################################################### - -Project: "CppUTest"=.\CppUTest.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/CppUTest.mak b/CppUTest.mak deleted file mode 100644 index 21d6373b5..000000000 --- a/CppUTest.mak +++ /dev/null @@ -1,892 +0,0 @@ -# Microsoft Developer Studio Generated NMAKE File, Based on CppUTest.dsp -!IF "$(CFG)" == "" -CFG=CppUTest - Win32 Debug -!MESSAGE No configuration specified. Defaulting to CppUTest - Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "CppUTest - Win32 Release" && "$(CFG)" != "CppUTest - Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "CppUTest.mak" CFG="CppUTest - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "CppUTest - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "CppUTest - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "CppUTest - Win32 Release" - -OUTDIR=.\Release -INTDIR=.\Release -# Begin Custom Macros -OutDir=.\Release -# End Custom Macros - -ALL : "$(OUTDIR)\CppUTest.lib" - - -CLEAN : - -@erase "$(INTDIR)\CodeMemoryReportFormatter.obj" - -@erase "$(INTDIR)\GTest.obj" - -@erase "$(INTDIR)\CommandLineArguments.obj" - -@erase "$(INTDIR)\CommandLineTestRunner.obj" - -@erase "$(INTDIR)\JUnitTestOutput.obj" - -@erase "$(INTDIR)\TeamCityTestOutput.obj" - -@erase "$(INTDIR)\MemoryLeakDetector.obj" - -@erase "$(INTDIR)\MemoryLeakWarningPlugin.obj" - -@erase "$(INTDIR)\MemoryReportAllocator.obj" - -@erase "$(INTDIR)\MemoryReporterPlugin.obj" - -@erase "$(INTDIR)\MemoryReportFormatter.obj" - -@erase "$(INTDIR)\MockActualCall.obj" - -@erase "$(INTDIR)\MockExpectedCall.obj" - -@erase "$(INTDIR)\MockExpectedCallsList.obj" - -@erase "$(INTDIR)\MockFailure.obj" - -@erase "$(INTDIR)\MockNamedValue.obj" - -@erase "$(INTDIR)\MockSupport.obj" - -@erase "$(INTDIR)\MockSupport_c.obj" - -@erase "$(INTDIR)\MockSupportPlugin.obj" - -@erase "$(INTDIR)\OrderedTest.obj" - -@erase "$(INTDIR)\SimpleMutex.obj" - -@erase "$(INTDIR)\SimpleString.obj" - -@erase "$(INTDIR)\TestFailure.obj" - -@erase "$(INTDIR)\TestFilter.obj" - -@erase "$(INTDIR)\TestHarness_c.obj" - -@erase "$(INTDIR)\TestMemoryAllocator.obj" - -@erase "$(INTDIR)\TestOutput.obj" - -@erase "$(INTDIR)\TestPlugin.obj" - -@erase "$(INTDIR)\TestRegistry.obj" - -@erase "$(INTDIR)\TestResult.obj" - -@erase "$(INTDIR)\Utest.obj" - -@erase "$(INTDIR)\UtestPlatform.obj" - -@erase "$(INTDIR)\vc60.idb" - -@erase "$(OUTDIR)\CppUTest.lib" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP_PROJ=/nologo /ML /W3 /GX /O2 /I ".\include\Platforms\VisualCpp" /I ".\include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "CPPUTEST_MEM_LEAK_DETECTION_DISABLED" /D "CPPUTEST_USE_LONG_LONG" /Fp"$(INTDIR)\CppUTest.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\CppUTest.bsc" -BSC32_SBRS= \ - -LIB32=link.exe -lib -LIB32_FLAGS=/nologo /out:"$(OUTDIR)\CppUTest.lib" -LIB32_OBJS= \ - "$(INTDIR)\CodeMemoryReportFormatter.obj" \ - "$(INTDIR)\MemoryReportAllocator.obj" \ - "$(INTDIR)\MemoryReporterPlugin.obj" \ - "$(INTDIR)\MemoryReportFormatter.obj" \ - "$(INTDIR)\MockActualCall.obj" \ - "$(INTDIR)\MockExpectedCall.obj" \ - "$(INTDIR)\MockExpectedCallsList.obj" \ - "$(INTDIR)\MockFailure.obj" \ - "$(INTDIR)\MockNamedValue.obj" \ - "$(INTDIR)\MockSupport.obj" \ - "$(INTDIR)\MockSupportPlugin.obj" \ - "$(INTDIR)\MockSupport_c.obj" \ - "$(INTDIR)\OrderedTest.obj" \ - "$(INTDIR)\CommandLineArguments.obj" \ - "$(INTDIR)\CommandLineTestRunner.obj" \ - "$(INTDIR)\JUnitTestOutput.obj" \ - "$(INTDIR)\TeamCityTestOutput.obj" \ - "$(INTDIR)\MemoryLeakDetector.obj" \ - "$(INTDIR)\MemoryLeakWarningPlugin.obj" \ - "$(INTDIR)\SimpleMutex.obj" \ - "$(INTDIR)\SimpleString.obj" \ - "$(INTDIR)\TestFailure.obj" \ - "$(INTDIR)\TestFilter.obj" \ - "$(INTDIR)\TestHarness_c.obj" \ - "$(INTDIR)\TestMemoryAllocator.obj" \ - "$(INTDIR)\TestOutput.obj" \ - "$(INTDIR)\TestPlugin.obj" \ - "$(INTDIR)\TestRegistry.obj" \ - "$(INTDIR)\TestResult.obj" \ - "$(INTDIR)\Utest.obj" \ - "$(INTDIR)\UtestPlatform.obj" - -"$(OUTDIR)\CppUTest.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - -OUTDIR=.\Debug -INTDIR=.\Debug -# Begin Custom Macros -OutDir=.\Debug -# End Custom Macros - -ALL : ".\lib\CppUTest.lib" "$(OUTDIR)\CppUTest.bsc" - - -CLEAN : - -@erase "$(INTDIR)\CodeMemoryReportFormatter.obj" - -@erase "$(INTDIR)\CodeMemoryReportFormatter.sbr" - -@erase "$(INTDIR)\CommandLineArguments.obj" - -@erase "$(INTDIR)\CommandLineArguments.sbr" - -@erase "$(INTDIR)\CommandLineTestRunner.obj" - -@erase "$(INTDIR)\CommandLineTestRunner.sbr" - -@erase "$(INTDIR)\JUnitTestOutput.obj" - -@erase "$(INTDIR)\JUnitTestOutput.sbr" - -@erase "$(INTDIR)\TeamCityTestOutput.obj" - -@erase "$(INTDIR)\TeamCityTestOutput.sbr" - -@erase "$(INTDIR)\MemoryLeakDetector.obj" - -@erase "$(INTDIR)\MemoryLeakDetector.sbr" - -@erase "$(INTDIR)\MemoryLeakWarningPlugin.obj" - -@erase "$(INTDIR)\MemoryLeakWarningPlugin.sbr" - -@erase "$(INTDIR)\MemoryReportAllocator.obj" - -@erase "$(INTDIR)\MemoryReportAllocator.sbr" - -@erase "$(INTDIR)\MemoryReporterPlugin.obj" - -@erase "$(INTDIR)\MemoryReporterPlugin.sbr" - -@erase "$(INTDIR)\MemoryReportFormatter.obj" - -@erase "$(INTDIR)\MemoryReportFormatter.sbr" - -@erase "$(INTDIR)\MockActualCall.obj" - -@erase "$(INTDIR)\MockActualCall.sbr" - -@erase "$(INTDIR)\MockExpectedCall.obj" - -@erase "$(INTDIR)\MockExpectedCall.sbr" - -@erase "$(INTDIR)\MockExpectedCallsList.obj" - -@erase "$(INTDIR)\MockExpectedCallsList.sbr" - -@erase "$(INTDIR)\MockFailure.obj" - -@erase "$(INTDIR)\MockFailure.sbr" - -@erase "$(INTDIR)\MockNamedValue.obj" - -@erase "$(INTDIR)\MockNamedValue.sbr" - -@erase "$(INTDIR)\MockSupport.obj" - -@erase "$(INTDIR)\MockSupport.sbr" - -@erase "$(INTDIR)\MockSupport_c.obj" - -@erase "$(INTDIR)\MockSupport_c.sbr" - -@erase "$(INTDIR)\MockSupportPlugin.obj" - -@erase "$(INTDIR)\MockSupportPlugin.sbr" - -@erase "$(INTDIR)\OrderedTest.obj" - -@erase "$(INTDIR)\OrderedTest.sbr" - -@erase "$(INTDIR)\SimpleMutex.obj" - -@erase "$(INTDIR)\SimpleMutex.sbr" - -@erase "$(INTDIR)\SimpleString.obj" - -@erase "$(INTDIR)\SimpleString.sbr" - -@erase "$(INTDIR)\TestFailure.obj" - -@erase "$(INTDIR)\TestFailure.sbr" - -@erase "$(INTDIR)\TestFilter.obj" - -@erase "$(INTDIR)\TestFilter.sbr" - -@erase "$(INTDIR)\TestHarness_c.obj" - -@erase "$(INTDIR)\TestHarness_c.sbr" - -@erase "$(INTDIR)\TestMemoryAllocator.obj" - -@erase "$(INTDIR)\TestMemoryAllocator.sbr" - -@erase "$(INTDIR)\TestOutput.obj" - -@erase "$(INTDIR)\TestOutput.sbr" - -@erase "$(INTDIR)\TestPlugin.obj" - -@erase "$(INTDIR)\TestPlugin.sbr" - -@erase "$(INTDIR)\TestRegistry.obj" - -@erase "$(INTDIR)\TestRegistry.sbr" - -@erase "$(INTDIR)\TestResult.obj" - -@erase "$(INTDIR)\TestResult.sbr" - -@erase "$(INTDIR)\Utest.obj" - -@erase "$(INTDIR)\Utest.sbr" - -@erase "$(INTDIR)\UtestPlatform.obj" - -@erase "$(INTDIR)\UtestPlatform.sbr" - -@erase "$(INTDIR)\vc60.idb" - -@erase "$(INTDIR)\vc60.pdb" - -@erase "$(OUTDIR)\CppUTest.bsc" - -@erase ".\lib\CppUTest.lib" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP_PROJ=/nologo /MDd /W3 /GX /ZI /Od /I ".\include\Platforms\VisualCpp" /I ".\include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "CPPUTEST_MEM_LEAK_DETECTION_DISABLED" /D "CPPUTEST_USE_LONG_LONG" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\CppUTest.bsc" -BSC32_SBRS= \ - "$(INTDIR)\CodeMemoryReportFormatter.sbr" \ - "$(INTDIR)\MemoryReportAllocator.sbr" \ - "$(INTDIR)\MemoryReporterPlugin.sbr" \ - "$(INTDIR)\MemoryReportFormatter.sbr" \ - "$(INTDIR)\MockActualCall.sbr" \ - "$(INTDIR)\MockExpectedCall.sbr" \ - "$(INTDIR)\MockExpectedCallsList.sbr" \ - "$(INTDIR)\MockFailure.sbr" \ - "$(INTDIR)\MockNamedValue.sbr" \ - "$(INTDIR)\MockSupport.sbr" \ - "$(INTDIR)\MockSupportPlugin.sbr" \ - "$(INTDIR)\MockSupport_c.sbr" \ - "$(INTDIR)\OrderedTest.sbr" \ - "$(INTDIR)\CommandLineArguments.sbr" \ - "$(INTDIR)\CommandLineTestRunner.sbr" \ - "$(INTDIR)\JUnitTestOutput.sbr" \ - "$(INTDIR)\TeamCityTestOutput.sbr" \ - "$(INTDIR)\MemoryLeakDetector.sbr" \ - "$(INTDIR)\MemoryLeakWarningPlugin.sbr" \ - "$(INTDIR)\SimpleMutex.sbr" \ - "$(INTDIR)\SimpleString.sbr" \ - "$(INTDIR)\TestFailure.sbr" \ - "$(INTDIR)\TestFilter.sbr" \ - "$(INTDIR)\TestHarness_c.sbr" \ - "$(INTDIR)\TestMemoryAllocator.sbr" \ - "$(INTDIR)\TestOutput.sbr" \ - "$(INTDIR)\TestPlugin.sbr" \ - "$(INTDIR)\TestRegistry.sbr" \ - "$(INTDIR)\TestResult.sbr" \ - "$(INTDIR)\Utest.sbr" \ - "$(INTDIR)\UtestPlatform.sbr" - -"$(OUTDIR)\CppUTest.bsc" : "$(OUTDIR)" $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - -LIB32=link.exe -lib -LIB32_FLAGS=/nologo /out:"lib\CppUTest.lib" -LIB32_OBJS= \ - "$(INTDIR)\CodeMemoryReportFormatter.obj" \ - "$(INTDIR)\MemoryReportAllocator.obj" \ - "$(INTDIR)\MemoryReporterPlugin.obj" \ - "$(INTDIR)\MemoryReportFormatter.obj" \ - "$(INTDIR)\MockActualCall.obj" \ - "$(INTDIR)\MockExpectedCall.obj" \ - "$(INTDIR)\MockExpectedCallsList.obj" \ - "$(INTDIR)\MockFailure.obj" \ - "$(INTDIR)\MockNamedValue.obj" \ - "$(INTDIR)\MockSupport.obj" \ - "$(INTDIR)\MockSupportPlugin.obj" \ - "$(INTDIR)\MockSupport_c.obj" \ - "$(INTDIR)\OrderedTest.obj" \ - "$(INTDIR)\CommandLineArguments.obj" \ - "$(INTDIR)\CommandLineTestRunner.obj" \ - "$(INTDIR)\JUnitTestOutput.obj" \ - "$(INTDIR)\TeamCityTestOutput.obj" \ - "$(INTDIR)\MemoryLeakDetector.obj" \ - "$(INTDIR)\MemoryLeakWarningPlugin.obj" \ - "$(INTDIR)\SimpleMutex.obj" \ - "$(INTDIR)\SimpleString.obj" \ - "$(INTDIR)\TestFailure.obj" \ - "$(INTDIR)\TestFilter.obj" \ - "$(INTDIR)\TestHarness_c.obj" \ - "$(INTDIR)\TestMemoryAllocator.obj" \ - "$(INTDIR)\TestOutput.obj" \ - "$(INTDIR)\TestPlugin.obj" \ - "$(INTDIR)\TestRegistry.obj" \ - "$(INTDIR)\TestResult.obj" \ - "$(INTDIR)\Utest.obj" \ - "$(INTDIR)\UtestPlatform.obj" - -".\lib\CppUTest.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ENDIF - -.c{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.c{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - - -!IF "$(NO_EXTERNAL_DEPS)" != "1" -!IF EXISTS("CppUTest.dep") -!INCLUDE "CppUTest.dep" -!ELSE -!MESSAGE Warning: cannot find "CppUTest.dep" -!ENDIF -!ENDIF - - -!IF "$(CFG)" == "CppUTest - Win32 Release" || "$(CFG)" == "CppUTest - Win32 Debug" -SOURCE=.\src\CppUTestExt\CodeMemoryReportFormatter.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\CodeMemoryReportFormatter.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\CodeMemoryReportFormatter.obj" "$(INTDIR)\CodeMemoryReportFormatter.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\CommandLineArguments.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\CommandLineArguments.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\CommandLineArguments.obj" "$(INTDIR)\CommandLineArguments.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\CommandLineTestRunner.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\CommandLineTestRunner.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\CommandLineTestRunner.obj" "$(INTDIR)\CommandLineTestRunner.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\JUnitTestOutput.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\JUnitTestOutput.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\JUnitTestOutput.obj" "$(INTDIR)\JUnitTestOutput.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\TeamCityTestOutput.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\TeamCityTestOutput.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\TeamCityTestOutput.obj" "$(INTDIR)\TeamCityTestOutput.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\MemoryLeakDetector.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MemoryLeakDetector.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MemoryLeakDetector.obj" "$(INTDIR)\MemoryLeakDetector.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\MemoryLeakWarningPlugin.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MemoryLeakWarningPlugin.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MemoryLeakWarningPlugin.obj" "$(INTDIR)\MemoryLeakWarningPlugin.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\src\CppUTestExt\MemoryReportAllocator.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MemoryReportAllocator.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MemoryReportAllocator.obj" "$(INTDIR)\MemoryReportAllocator.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\src\CppUTestExt\MemoryReporterPlugin.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MemoryReporterPlugin.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MemoryReporterPlugin.obj" "$(INTDIR)\MemoryReporterPlugin.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\src\CppUTestExt\MemoryReportFormatter.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MemoryReportFormatter.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MemoryReportFormatter.obj" "$(INTDIR)\MemoryReportFormatter.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=".\src\CppUTestExt\MockActualCall.cpp" - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MockActualCall.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MockActualCall.obj" "$(INTDIR)\MockActualCall.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=".\src\CppUTestExt\MockExpectedCall.cpp" - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MockExpectedCall.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MockExpectedCall.obj" "$(INTDIR)\MockExpectedCall.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=".\src\CppUTestExt\MockExpectedCallsList.cpp" - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MockExpectedCallsList.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MockExpectedCallsList.obj" "$(INTDIR)\MockExpectedCallsList.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=".\src\CppUTestExt\MockFailure.cpp" - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MockFailure.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MockFailure.obj" "$(INTDIR)\MockFailure.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=".\src\CppUTestExt\MockNamedValue.cpp" - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MockNamedValue.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MockNamedValue.obj" "$(INTDIR)\MockNamedValue.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=".\src\CppUTestExt\MockSupport.cpp" - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MockSupport.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MockSupport.obj" "$(INTDIR)\MockSupport.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=".\src\CppUTestExt\MockSupport_c.cpp" - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MockSupport_c.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MockSupport_c.obj" "$(INTDIR)\MockSupport_c.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=".\src\CppUTestExt\MockSupportPlugin.cpp" - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\MockSupportPlugin.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\MockSupportPlugin.obj" "$(INTDIR)\MockSupportPlugin.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=".\src\CppUTestExt\OrderedTest.cpp" - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\OrderedTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\OrderedTest.obj" "$(INTDIR)\OrderedTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\SimpleMutex.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\SimpleMutex.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\SimpleMutex.obj" "$(INTDIR)\SimpleMutex.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\SimpleString.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\SimpleString.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\SimpleString.obj" "$(INTDIR)\SimpleString.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\TestFailure.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\TestFailure.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\TestFailure.obj" "$(INTDIR)\TestFailure.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\TestFilter.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\TestFilter.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\TestFilter.obj" "$(INTDIR)\TestFilter.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\TestHarness_c.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\TestHarness_c.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\TestHarness_c.obj" "$(INTDIR)\TestHarness_c.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\TestMemoryAllocator.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\TestMemoryAllocator.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\TestMemoryAllocator.obj" "$(INTDIR)\TestMemoryAllocator.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\TestOutput.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\TestOutput.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\TestOutput.obj" "$(INTDIR)\TestOutput.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\TestPlugin.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\TestPlugin.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\TestPlugin.obj" "$(INTDIR)\TestPlugin.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\TestRegistry.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\TestRegistry.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\TestRegistry.obj" "$(INTDIR)\TestRegistry.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\TestResult.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\TestResult.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\TestResult.obj" "$(INTDIR)\TestResult.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\SRC\CPPUTEST\Utest.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\Utest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\Utest.obj" "$(INTDIR)\Utest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\src\Platforms\VisualCpp\UtestPlatform.cpp - -!IF "$(CFG)" == "CppUTest - Win32 Release" - - -"$(INTDIR)\UtestPlatform.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "CppUTest - Win32 Debug" - - -"$(INTDIR)\UtestPlatform.obj" "$(INTDIR)\UtestPlatform.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - - -!ENDIF - diff --git a/examples/AllTests/AllTests.dsp b/examples/AllTests/AllTests.dsp deleted file mode 100644 index 517b5bf08..000000000 --- a/examples/AllTests/AllTests.dsp +++ /dev/null @@ -1,141 +0,0 @@ -# Microsoft Developer Studio Project File - Name="AllTests" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=AllTests - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "AllTests.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "AllTests.mak" CFG="AllTests - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "AllTests - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "AllTests - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "AllTests - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "..\..\include" /I "..\ApplicationLib" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "CPPUTEST_MEM_LEAK_DETECTION_DISABLED" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 ..\..\lib\CppUTest.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /incremental:yes /machine:I386 -# Begin Special Build Tool -TargetPath=.\Release\AllTests.exe -SOURCE="$(InputPath)" -PostBuild_Cmds=$(TargetPath) -# End Special Build Tool - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I "..\..\include" /I "..\ApplicationLib" /FI"CppUTest/MemoryLeakDetectorMallocMacros.h" /FI"CppUTest/MemoryLeakDetectorNewMacros.h" /D "_CONSOLE" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "CPPUTEST_MEM_LEAK_DETECTION_DISABLED" /FR /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 ..\..\lib\CppUTestd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# SUBTRACT LINK32 /incremental:no -# Begin Special Build Tool -TargetPath=.\Debug\AllTests.exe -SOURCE="$(InputPath)" -PostBuild_Cmds=$(TargetPath) -v -# End Special Build Tool - -!ENDIF - -# Begin Target - -# Name "AllTests - Win32 Release" -# Name "AllTests - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\AllTests.cpp -# End Source File -# Begin Source File - -SOURCE=.\CircularBufferTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\EventDispatcherTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\HelloTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\MockDocumentationTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\PrinterTest.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\AllTests.h -# End Source File -# Begin Source File - -SOURCE=.\MockPrinter.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/examples/ApplicationLib/ApplicationLib.dsp b/examples/ApplicationLib/ApplicationLib.dsp deleted file mode 100644 index a0887d230..000000000 --- a/examples/ApplicationLib/ApplicationLib.dsp +++ /dev/null @@ -1,124 +0,0 @@ -# Microsoft Developer Studio Project File - Name="ApplicationLib" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=ApplicationLib - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "ApplicationLib.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "ApplicationLib.mak" CFG="ApplicationLib - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "ApplicationLib - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "ApplicationLib - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "ApplicationLib - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "ApplicationLib - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I "../../include" /I "../../include/Platforms/VisualCpp" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "ApplicationLib - Win32 Release" -# Name "ApplicationLib - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\CircularBuffer.cpp -# End Source File -# Begin Source File - -SOURCE=.\EventDispatcher.cpp -# End Source File -# Begin Source File - -SOURCE=.\hello.c -# End Source File -# Begin Source File - -SOURCE=.\Printer.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\CircularBuffer.h -# End Source File -# Begin Source File - -SOURCE=.\ExamplesNewOverrides.h -# End Source File -# Begin Source File - -SOURCE=.\hello.h -# End Source File -# Begin Source File - -SOURCE=.\Printer.h -# End Source File -# End Group -# End Target -# End Project diff --git a/examples/CppUTestExample.dsw b/examples/CppUTestExample.dsw deleted file mode 100644 index 98f732660..000000000 --- a/examples/CppUTestExample.dsw +++ /dev/null @@ -1,44 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "AllTests"=.\AllTests\AllTests.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name ApplicationLib - End Project Dependency -}}} - -############################################################################### - -Project: "ApplicationLib"=.\ApplicationLib\ApplicationLib.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/makeVc6.bat b/makeVc6.bat deleted file mode 100644 index d60d91830..000000000 --- a/makeVc6.bat +++ /dev/null @@ -1,16 +0,0 @@ -rem **** -rem * Command line build - For CppUTest - Run from dsw directory -rem * -rem * A single parameter is supported and it is the last parameter of msdev -rem * for example: -rem * /clean -rem * make sure to use the slash -rem * this needs to be in your path -rem ****PATH=C:\Program Files\Microsoft Visual Studio\VC98\Bin;%PATH% - -msdev CppUTest.dsp /MAKE "CppUTest - Debug" %1 -msdev tests\AllTests.dsp /MAKE "AllTests - Debug" %1 -if "%1" EQU "/clean" goto end -if "%1" EQU "/CLEAN" goto end -tests\Debug\AllTests -:end diff --git a/tests/AllTests.dsp b/tests/AllTests.dsp deleted file mode 100644 index 41994b0a9..000000000 --- a/tests/AllTests.dsp +++ /dev/null @@ -1,389 +0,0 @@ -# Microsoft Developer Studio Project File - Name="AllTests" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=AllTests - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "AllTests.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "AllTests.mak" CFG="AllTests - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "AllTests - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "AllTests - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "AllTests - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /Ob0 /I "..\include" /I "..\include\Platforms\VisualCpp" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "CPPUTEST_MEM_LEAK_DETECTION_DISABLED" /D "CPPUTEST_USE_LONG_LONG" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /incremental:yes /machine:I386 -# Begin Special Build Tool -TargetPath=.\Release\AllTests.exe -SOURCE="$(InputPath)" -PostBuild_Cmds=$(TargetPath) -# End Special Build Tool - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I "..\include" /I "..\include\Platforms\VisualCpp" /FI"CppUTest/MemoryLeakDetectorMallocMacros.h" /FI"CppUTest/MemoryLeakDetectorNewMacros.h" /D "_CONSOLE" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "CPPUTEST_MEM_LEAK_DETECTION_DISABLED" /D "CPPUTEST_USE_LONG_LONG" /FR /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 ..\lib\CppUTestd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# SUBTRACT LINK32 /incremental:no -# Begin Special Build Tool -TargetPath=.\Debug\AllTests.exe -SOURCE="$(InputPath)" -PostBuild_Cmds=$(TargetPath) -v -# End Special Build Tool - -!ENDIF - -# Begin Target - -# Name "AllTests - Win32 Release" -# Name "AllTests - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\CppUTest\AllocationInCFile.c -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\AllocationInCppFile.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\AllocLetTestFree.c -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\AllocLetTestFreeTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\AllTests.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\CheatSheetTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\CodeMemoryReporterTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\CommandLineArgumentsTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\CommandLineTestRunnerTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\ExpectedFunctionsListTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\GMockTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\GTest1Test.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\GTest2ConvertorTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\JUnitOutputTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\MemoryLeakDetectorTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\MemoryLeakWarningTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\MemoryOperatorOverloadTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MemoryReportAllocatorTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MemoryReporterPluginTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MemoryReportFormatterTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MockActualCallTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MockCheatSheetTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MockExpectedCallTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MockFailureReporterForTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MockFailureReporterForTest.h -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MockFailureTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MockNamedValueTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MockPluginTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MockSupport_cTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MockSupport_cTestCFile.c -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MockSupport_cTestCFile.h -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\MockSupportTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\OrderedTestTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\OrderedTestTest_c.c -# End Source File -# Begin Source File - -SOURCE=.\CppUTestExt\OrderedTestTest.h -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\PluginTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\PreprocessorTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\SetPluginTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\SimpleMutexTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\SimpleStringTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\TestFailureNaNTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\TestFailureTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\TestFilterTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\TestHarness_cTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\TestHarness_cTestCFile.c -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\TestInstallerTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\TestMemoryAllocatorTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\TestOutputTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\TestRegistryTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\TestResultTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\TestUtestMacro.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\UtestPlatformTest.cpp -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\UtestTest.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\CppUTest\AllocationInCFile.h -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\AllocationInCppFile.h -# End Source File -# Begin Source File - -SOURCE=.\CppUTest\AllTests.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\CommandLineArguments.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\CppUTestConfig.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\MemoryLeakDetector.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\MemoryLeakDetectorMallocMacros.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\MemoryLeakDetectorNewMacros.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\PlatformSpecificFunctions.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\PlatformSpecificFunctions_c.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\SimpleMutex.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\StandardCLibrary.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\TestFailure.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\TestFilter.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\TestMemoryAllocator.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\TestTestingFixture.h -# End Source File -# Begin Source File - -SOURCE=..\include\CppUTest\UtestMacros.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/tests/AllTests.mak b/tests/AllTests.mak deleted file mode 100644 index 33f60e52f..000000000 --- a/tests/AllTests.mak +++ /dev/null @@ -1,1188 +0,0 @@ -# Microsoft Developer Studio Generated NMAKE File, Based on AllTests.dsp -!IF "$(CFG)" == "" -CFG=AllTests - Win32 Debug -!MESSAGE No configuration specified. Defaulting to AllTests - Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "AllTests - Win32 Release" && "$(CFG)" != "AllTests - Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "AllTests.mak" CFG="AllTests - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "AllTests - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "AllTests - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "AllTests - Win32 Release" - -OUTDIR=.\Release -INTDIR=.\Release -# Begin Custom Macros -OutDir=.\Release -# End Custom Macros - -!IF "$(RECURSE)" == "0" - -ALL : "$(OUTDIR)\AllTests.exe" - -!ELSE - -ALL : "CppUTest - Win32 Release" "$(OUTDIR)\AllTests.exe" - -!ENDIF - -!IF "$(RECURSE)" == "1" -CLEAN :"CppUTest - Win32 ReleaseCLEAN" -!ELSE -CLEAN : -!ENDIF - -@erase "$(INTDIR)\AllocationInCFile.obj" - -@erase "$(INTDIR)\AllocationInCppFile.obj" - -@erase "$(INTDIR)\AllTests.obj" - -@erase "$(INTDIR)\CheatSheetTest.obj" - -@erase "$(INTDIR)\CodeMemoryReportFormatterTest.obj" - -@erase "$(INTDIR)\CommandLineArgumentsTest.obj" - -@erase "$(INTDIR)\CommandLineTestRunnerTest.obj" - -@erase "$(INTDIR)\GMockTest.obj" - -@erase "$(INTDIR)\GTest1Test.obj" - -@erase "$(INTDIR)\GTest2ConvertorTest.obj" - -@erase "$(INTDIR)\JUnitOutputTest.obj" - -@erase "$(INTDIR)\MemoryLeakDetectorTest.obj" - -@erase "$(INTDIR)\MemoryLeakOperatorOverloadsTest.obj" - -@erase "$(INTDIR)\MemoryLeakWarningTest.obj" - -@erase "$(INTDIR)\MemoryReportAllocatorTest.obj" - -@erase "$(INTDIR)\MemoryReporterPluginTest.obj" - -@erase "$(INTDIR)\MemoryReportFormatterTest.obj" - -@erase "$(INTDIR)\MockActualCallTest.obj" - -@erase "$(INTDIR)\MockCheatSheetTest.obj" - -@erase "$(INTDIR)\MockExpectedCallTest.obj" - -@erase "$(INTDIR)\MockExpectedFunctionsListTest.obj" - -@erase "$(INTDIR)\MockFailureTest.obj" - -@erase "$(INTDIR)\MockPluginTest.obj" - -@erase "$(INTDIR)\MockSupport_cTest.obj" - -@erase "$(INTDIR)\MockSupport_cTestCFile.obj" - -@erase "$(INTDIR)\MockSupportTest.obj" - -@erase "$(INTDIR)\OrderedTestTest.obj" - -@erase "$(INTDIR)\OrderedTestTest_c.obj" - -@erase "$(INTDIR)\PluginTest.obj" - -@erase "$(INTDIR)\PreprocessorTest.obj" - -@erase "$(INTDIR)\SetPluginTest.obj" - -@erase "$(INTDIR)\SimpleStringTest.obj" - -@erase "$(INTDIR)\TestFailureTest.obj" - -@erase "$(INTDIR)\TestFilterTest.obj" - -@erase "$(INTDIR)\TestHarness_cTest.obj" - -@erase "$(INTDIR)\TestHarness_cTestCFile.obj" - -@erase "$(INTDIR)\TestInstallerTest.obj" - -@erase "$(INTDIR)\TestMemoryAllocatorTest.obj" - -@erase "$(INTDIR)\TestOutputTest.obj" - -@erase "$(INTDIR)\TestRegistryTest.obj" - -@erase "$(INTDIR)\TestResultTest.obj" - -@erase "$(INTDIR)\UtestTest.obj" - -@erase "$(INTDIR)\vc60.idb" - -@erase "$(OUTDIR)\AllTests.exe" - -@erase "$(OUTDIR)\AllTests.ilk" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP_PROJ=/nologo /ML /W3 /GX /O2 /I "..\include" /I "..\include\Platforms\VisualCpp" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "CPPUTEST_MEM_LEAK_DETECTION_DISABLED" /D "CPPUTEST_USE_LONG_LONG" /Fp"$(INTDIR)\AllTests.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\AllTests.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\AllTests.pdb" /machine:I386 /out:"$(OUTDIR)\AllTests.exe" -LINK32_OBJS= \ - "$(INTDIR)\AllocationInCFile.obj" \ - "$(INTDIR)\AllocationInCppFile.obj" \ - "$(INTDIR)\AllTests.obj" \ - "$(INTDIR)\CheatSheetTest.obj" \ - "$(INTDIR)\CodeMemoryReportFormatterTest.obj" \ - "$(INTDIR)\CommandLineArgumentsTest.obj" \ - "$(INTDIR)\CommandLineTestRunnerTest.obj" \ - "$(INTDIR)\GMockTest.obj" \ - "$(INTDIR)\GTest1Test.obj" \ - "$(INTDIR)\GTest2ConvertorTest.obj" \ - "$(INTDIR)\JUnitOutputTest.obj" \ - "$(INTDIR)\MemoryLeakDetectorTest.obj" \ - "$(INTDIR)\MemoryLeakOperatorOverloadsTest.obj" \ - "$(INTDIR)\MemoryLeakWarningTest.obj" \ - "$(INTDIR)\MemoryReportAllocatorTest.obj" \ - "$(INTDIR)\MemoryReporterPluginTest.obj" \ - "$(INTDIR)\MemoryReportFormatterTest.obj" \ - "$(INTDIR)\MockActualCallTest.obj" \ - "$(INTDIR)\MockCheatSheetTest.obj" \ - "$(INTDIR)\MockExpectedCallTest.obj" \ - "$(INTDIR)\MockExpectedFunctionsListTest.obj" \ - "$(INTDIR)\MockFailureTest.obj" \ - "$(INTDIR)\MockPluginTest.obj" \ - "$(INTDIR)\MockSupport_cTest.obj" \ - "$(INTDIR)\MockSupport_cTestCFile.obj" \ - "$(INTDIR)\MockSupportTest.obj" \ - "$(INTDIR)\OrderedTestTest.obj" \ - "$(INTDIR)\OrderedTestTest_c.obj" \ - "$(INTDIR)\PluginTest.obj" \ - "$(INTDIR)\PreprocessorTest.obj" \ - "$(INTDIR)\SetPluginTest.obj" \ - "$(INTDIR)\SimpleStringTest.obj" \ - "$(INTDIR)\TestFailureTest.obj" \ - "$(INTDIR)\TestFilterTest.obj" \ - "$(INTDIR)\TestHarness_cTest.obj" \ - "$(INTDIR)\TestHarness_cTestCFile.obj" \ - "$(INTDIR)\TestInstallerTest.obj" \ - "$(INTDIR)\TestMemoryAllocatorTest.obj" \ - "$(INTDIR)\TestOutputTest.obj" \ - "$(INTDIR)\TestRegistryTest.obj" \ - "$(INTDIR)\TestResultTest.obj" \ - "$(INTDIR)\UtestTest.obj" \ - "..\Release\CppUTest.lib" - -"$(OUTDIR)\AllTests.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -TargetPath=.\Release\AllTests.exe -SOURCE="$(InputPath)" -DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep - -ALL : $(DS_POSTBUILD_DEP) - -# Begin Custom Macros -OutDir=.\Release -# End Custom Macros - -$(DS_POSTBUILD_DEP) : "CppUTest - Win32 Release" "$(OUTDIR)\AllTests.exe" - .\Release\AllTests.exe - echo Helper for Post-build step > "$(DS_POSTBUILD_DEP)" - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - -OUTDIR=.\Debug -INTDIR=.\Debug -# Begin Custom Macros -OutDir=.\Debug -# End Custom Macros - -!IF "$(RECURSE)" == "0" - -ALL : "$(OUTDIR)\AllTests.exe" "$(OUTDIR)\AllTests.bsc" - -!ELSE - -ALL : "CppUTest - Win32 Debug" "$(OUTDIR)\AllTests.exe" "$(OUTDIR)\AllTests.bsc" - -!ENDIF - -!IF "$(RECURSE)" == "1" -CLEAN :"CppUTest - Win32 DebugCLEAN" -!ELSE -CLEAN : -!ENDIF - -@erase "$(INTDIR)\AllocationInCFile.obj" - -@erase "$(INTDIR)\AllocationInCFile.sbr" - -@erase "$(INTDIR)\AllocationInCppFile.obj" - -@erase "$(INTDIR)\AllocationInCppFile.sbr" - -@erase "$(INTDIR)\AllTests.obj" - -@erase "$(INTDIR)\AllTests.sbr" - -@erase "$(INTDIR)\CheatSheetTest.obj" - -@erase "$(INTDIR)\CheatSheetTest.sbr" - -@erase "$(INTDIR)\CodeMemoryReportFormatterTest.obj" - -@erase "$(INTDIR)\CodeMemoryReportFormatterTest.sbr" - -@erase "$(INTDIR)\CommandLineArgumentsTest.obj" - -@erase "$(INTDIR)\CommandLineArgumentsTest.sbr" - -@erase "$(INTDIR)\CommandLineTestRunnerTest.obj" - -@erase "$(INTDIR)\CommandLineTestRunnerTest.sbr" - -@erase "$(INTDIR)\GMockTest.obj" - -@erase "$(INTDIR)\GMockTest.sbr" - -@erase "$(INTDIR)\GTest1Test.obj" - -@erase "$(INTDIR)\GTest1Test.sbr" - -@erase "$(INTDIR)\GTest2ConvertorTest.obj" - -@erase "$(INTDIR)\GTest2ConvertorTest.sbr" - -@erase "$(INTDIR)\JUnitOutputTest.obj" - -@erase "$(INTDIR)\JUnitOutputTest.sbr" - -@erase "$(INTDIR)\MemoryLeakDetectorTest.obj" - -@erase "$(INTDIR)\MemoryLeakDetectorTest.sbr" - -@erase "$(INTDIR)\MemoryLeakOperatorOverloadsTest.obj" - -@erase "$(INTDIR)\MemoryLeakOperatorOverloadsTest.sbr" - -@erase "$(INTDIR)\MemoryLeakWarningTest.obj" - -@erase "$(INTDIR)\MemoryLeakWarningTest.sbr" - -@erase "$(INTDIR)\MemoryReportAllocatorTest.obj" - -@erase "$(INTDIR)\MemoryReportAllocatorTest.sbr" - -@erase "$(INTDIR)\MemoryReporterPluginTest.obj" - -@erase "$(INTDIR)\MemoryReporterPluginTest.sbr" - -@erase "$(INTDIR)\MemoryReportFormatterTest.obj" - -@erase "$(INTDIR)\MemoryReportFormatterTest.sbr" - -@erase "$(INTDIR)\MockActualCallTest.obj" - -@erase "$(INTDIR)\MockActualCallTest.sbr" - -@erase "$(INTDIR)\MockCheatSheetTest.obj" - -@erase "$(INTDIR)\MockCheatSheetTest.sbr" - -@erase "$(INTDIR)\MockExpectedCallTest.obj" - -@erase "$(INTDIR)\MockExpectedCallTest.sbr" - -@erase "$(INTDIR)\MockExpectedFunctionsListTest.obj" - -@erase "$(INTDIR)\MockExpectedFunctionsListTest.sbr" - -@erase "$(INTDIR)\MockFailureTest.obj" - -@erase "$(INTDIR)\MockFailureTest.sbr" - -@erase "$(INTDIR)\MockPluginTest.obj" - -@erase "$(INTDIR)\MockPluginTest.sbr" - -@erase "$(INTDIR)\MockSupport_cTest.obj" - -@erase "$(INTDIR)\MockSupport_cTest.sbr" - -@erase "$(INTDIR)\MockSupport_cTestCFile.obj" - -@erase "$(INTDIR)\MockSupport_cTestCFile.sbr" - -@erase "$(INTDIR)\MockSupportTest.obj" - -@erase "$(INTDIR)\MockSupportTest.sbr" - -@erase "$(INTDIR)\OrderedTestTest.obj" - -@erase "$(INTDIR)\OrderedTestTest.sbr" - -@erase "$(INTDIR)\OrderedTestTest_c.obj" - -@erase "$(INTDIR)\OrderedTestTest_c.sbr" - -@erase "$(INTDIR)\PluginTest.obj" - -@erase "$(INTDIR)\PluginTest.sbr" - -@erase "$(INTDIR)\PreprocessorTest.obj" - -@erase "$(INTDIR)\PreprocessorTest.sbr" - -@erase "$(INTDIR)\SetPluginTest.obj" - -@erase "$(INTDIR)\SetPluginTest.sbr" - -@erase "$(INTDIR)\SimpleStringTest.obj" - -@erase "$(INTDIR)\SimpleStringTest.sbr" - -@erase "$(INTDIR)\TestFailureTest.obj" - -@erase "$(INTDIR)\TestFailureTest.sbr" - -@erase "$(INTDIR)\TestFilterTest.obj" - -@erase "$(INTDIR)\TestFilterTest.sbr" - -@erase "$(INTDIR)\TestHarness_cTest.obj" - -@erase "$(INTDIR)\TestHarness_cTest.sbr" - -@erase "$(INTDIR)\TestHarness_cTestCFile.obj" - -@erase "$(INTDIR)\TestHarness_cTestCFile.sbr" - -@erase "$(INTDIR)\TestInstallerTest.obj" - -@erase "$(INTDIR)\TestInstallerTest.sbr" - -@erase "$(INTDIR)\TestMemoryAllocatorTest.obj" - -@erase "$(INTDIR)\TestMemoryAllocatorTest.sbr" - -@erase "$(INTDIR)\TestOutputTest.obj" - -@erase "$(INTDIR)\TestOutputTest.sbr" - -@erase "$(INTDIR)\TestRegistryTest.obj" - -@erase "$(INTDIR)\TestRegistryTest.sbr" - -@erase "$(INTDIR)\TestResultTest.obj" - -@erase "$(INTDIR)\TestResultTest.sbr" - -@erase "$(INTDIR)\UtestTest.obj" - -@erase "$(INTDIR)\UtestTest.sbr" - -@erase "$(INTDIR)\vc60.idb" - -@erase "$(INTDIR)\vc60.pdb" - -@erase "$(OUTDIR)\AllTests.bsc" - -@erase "$(OUTDIR)\AllTests.exe" - -@erase "$(OUTDIR)\AllTests.ilk" - -@erase "$(OUTDIR)\AllTests.pdb" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP_PROJ=/nologo /MDd /W3 /GX /ZI /Od /I "..\include" /I "..\include\Platforms\VisualCpp" /FI"CppUTest/MemoryLeakDetectorMallocMacros.h" /FI"CppUTest/MemoryLeakDetectorNewMacros.h" /D "_CONSOLE" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "CPPUTEST_MEM_LEAK_DETECTION_DISABLED" /D "CPPUTEST_USE_LONG_LONG" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\AllTests.bsc" -BSC32_SBRS= \ - "$(INTDIR)\AllocationInCFile.sbr" \ - "$(INTDIR)\AllocationInCppFile.sbr" \ - "$(INTDIR)\AllTests.sbr" \ - "$(INTDIR)\CheatSheetTest.sbr" \ - "$(INTDIR)\CodeMemoryReportFormatterTest.sbr" \ - "$(INTDIR)\CommandLineArgumentsTest.sbr" \ - "$(INTDIR)\CommandLineTestRunnerTest.sbr" \ - "$(INTDIR)\GMockTest.sbr" \ - "$(INTDIR)\GTest1Test.sbr" \ - "$(INTDIR)\GTest2ConvertorTest.sbr" \ - "$(INTDIR)\JUnitOutputTest.sbr" \ - "$(INTDIR)\MemoryLeakDetectorTest.sbr" \ - "$(INTDIR)\MemoryLeakOperatorOverloadsTest.sbr" \ - "$(INTDIR)\MemoryLeakWarningTest.sbr" \ - "$(INTDIR)\MemoryReportAllocatorTest.sbr" \ - "$(INTDIR)\MemoryReporterPluginTest.sbr" \ - "$(INTDIR)\MemoryReportFormatterTest.sbr" \ - "$(INTDIR)\MockActualCallTest.sbr" \ - "$(INTDIR)\MockCheatSheetTest.sbr" \ - "$(INTDIR)\MockExpectedCallTest.sbr" \ - "$(INTDIR)\MockExpectedFunctionsListTest.sbr" \ - "$(INTDIR)\MockFailureTest.sbr" \ - "$(INTDIR)\MockPluginTest.sbr" \ - "$(INTDIR)\MockSupport_cTest.sbr" \ - "$(INTDIR)\MockSupport_cTestCFile.sbr" \ - "$(INTDIR)\MockSupportTest.sbr" \ - "$(INTDIR)\OrderedTestTest.sbr" \ - "$(INTDIR)\OrderedTestTest_c.sbr" \ - "$(INTDIR)\PluginTest.sbr" \ - "$(INTDIR)\PreprocessorTest.sbr" \ - "$(INTDIR)\SetPluginTest.sbr" \ - "$(INTDIR)\SimpleStringTest.sbr" \ - "$(INTDIR)\TestFailureTest.sbr" \ - "$(INTDIR)\TestFilterTest.sbr" \ - "$(INTDIR)\TestHarness_cTest.sbr" \ - "$(INTDIR)\TestHarness_cTestCFile.sbr" \ - "$(INTDIR)\TestInstallerTest.sbr" \ - "$(INTDIR)\TestMemoryAllocatorTest.sbr" \ - "$(INTDIR)\TestOutputTest.sbr" \ - "$(INTDIR)\TestRegistryTest.sbr" \ - "$(INTDIR)\TestResultTest.sbr" \ - "$(INTDIR)\UtestTest.sbr" - -"$(OUTDIR)\AllTests.bsc" : "$(OUTDIR)" $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - -LINK32=link.exe -LINK32_FLAGS=..\lib\CppUTest.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\AllTests.pdb" /debug /machine:I386 /out:"$(OUTDIR)\AllTests.exe" /pdbtype:sept -LINK32_OBJS= \ - "$(INTDIR)\AllocationInCFile.obj" \ - "$(INTDIR)\AllocationInCppFile.obj" \ - "$(INTDIR)\AllTests.obj" \ - "$(INTDIR)\CheatSheetTest.obj" \ - "$(INTDIR)\CodeMemoryReportFormatterTest.obj" \ - "$(INTDIR)\CommandLineArgumentsTest.obj" \ - "$(INTDIR)\CommandLineTestRunnerTest.obj" \ - "$(INTDIR)\GMockTest.obj" \ - "$(INTDIR)\GTest1Test.obj" \ - "$(INTDIR)\GTest2ConvertorTest.obj" \ - "$(INTDIR)\JUnitOutputTest.obj" \ - "$(INTDIR)\MemoryLeakDetectorTest.obj" \ - "$(INTDIR)\MemoryLeakOperatorOverloadsTest.obj" \ - "$(INTDIR)\MemoryLeakWarningTest.obj" \ - "$(INTDIR)\MemoryReportAllocatorTest.obj" \ - "$(INTDIR)\MemoryReporterPluginTest.obj" \ - "$(INTDIR)\MemoryReportFormatterTest.obj" \ - "$(INTDIR)\MockActualCallTest.obj" \ - "$(INTDIR)\MockCheatSheetTest.obj" \ - "$(INTDIR)\MockExpectedCallTest.obj" \ - "$(INTDIR)\MockExpectedFunctionsListTest.obj" \ - "$(INTDIR)\MockFailureTest.obj" \ - "$(INTDIR)\MockPluginTest.obj" \ - "$(INTDIR)\MockSupport_cTest.obj" \ - "$(INTDIR)\MockSupport_cTestCFile.obj" \ - "$(INTDIR)\MockSupportTest.obj" \ - "$(INTDIR)\OrderedTestTest.obj" \ - "$(INTDIR)\OrderedTestTest_c.obj" \ - "$(INTDIR)\PluginTest.obj" \ - "$(INTDIR)\PreprocessorTest.obj" \ - "$(INTDIR)\SetPluginTest.obj" \ - "$(INTDIR)\SimpleStringTest.obj" \ - "$(INTDIR)\TestFailureTest.obj" \ - "$(INTDIR)\TestFilterTest.obj" \ - "$(INTDIR)\TestHarness_cTest.obj" \ - "$(INTDIR)\TestHarness_cTestCFile.obj" \ - "$(INTDIR)\TestInstallerTest.obj" \ - "$(INTDIR)\TestMemoryAllocatorTest.obj" \ - "$(INTDIR)\TestOutputTest.obj" \ - "$(INTDIR)\TestRegistryTest.obj" \ - "$(INTDIR)\TestResultTest.obj" \ - "$(INTDIR)\UtestTest.obj" \ - "..\lib\CppUTest.lib" - -"$(OUTDIR)\AllTests.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -TargetPath=.\Debug\AllTests.exe -SOURCE="$(InputPath)" -DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep - -ALL : $(DS_POSTBUILD_DEP) - -# Begin Custom Macros -OutDir=.\Debug -# End Custom Macros - -$(DS_POSTBUILD_DEP) : "CppUTest - Win32 Debug" "$(OUTDIR)\AllTests.exe" "$(OUTDIR)\AllTests.bsc" - .\Debug\AllTests.exe -v - echo Helper for Post-build step > "$(DS_POSTBUILD_DEP)" - -!ENDIF - -.c{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.c{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - - -!IF "$(NO_EXTERNAL_DEPS)" != "1" -!IF EXISTS("AllTests.dep") -!INCLUDE "AllTests.dep" -!ELSE -!MESSAGE Warning: cannot find "AllTests.dep" -!ENDIF -!ENDIF - - -!IF "$(CFG)" == "AllTests - Win32 Release" || "$(CFG)" == "AllTests - Win32 Debug" -SOURCE=.\CppUTest\AllocationInCFile.c - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\AllocationInCFile.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\AllocationInCFile.obj" "$(INTDIR)\AllocationInCFile.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\AllocationInCppFile.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\AllocationInCppFile.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\AllocationInCppFile.obj" "$(INTDIR)\AllocationInCppFile.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTestExt\AllTests.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\AllTests.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\AllTests.obj" "$(INTDIR)\AllTests.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTest\CheatSheetTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\CheatSheetTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\CheatSheetTest.obj" "$(INTDIR)\CheatSheetTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTestExt\CodeMemoryReportFormatterTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\CodeMemoryReportFormatterTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\CodeMemoryReportFormatterTest.obj" "$(INTDIR)\CodeMemoryReportFormatterTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTest\CommandLineArgumentsTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\CommandLineArgumentsTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\CommandLineArgumentsTest.obj" "$(INTDIR)\CommandLineArgumentsTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\CommandLineTestRunnerTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\CommandLineTestRunnerTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\CommandLineTestRunnerTest.obj" "$(INTDIR)\CommandLineTestRunnerTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTestExt\GMockTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\GMockTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\GMockTest.obj" "$(INTDIR)\GMockTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\GTest1Test.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\GTest1Test.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\GTest1Test.obj" "$(INTDIR)\GTest1Test.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\GTest2ConvertorTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\GTest2ConvertorTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\GTest2ConvertorTest.obj" "$(INTDIR)\GTest2ConvertorTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTest\JUnitOutputTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\JUnitOutputTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\JUnitOutputTest.obj" "$(INTDIR)\JUnitOutputTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\MemoryLeakDetectorTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MemoryLeakDetectorTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MemoryLeakDetectorTest.obj" "$(INTDIR)\MemoryLeakDetectorTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\MemoryLeakOperatorOverloadsTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MemoryLeakOperatorOverloadsTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MemoryLeakOperatorOverloadsTest.obj" "$(INTDIR)\MemoryLeakOperatorOverloadsTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\MemoryLeakWarningTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MemoryLeakWarningTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MemoryLeakWarningTest.obj" "$(INTDIR)\MemoryLeakWarningTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTestExt\MemoryReportAllocatorTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MemoryReportAllocatorTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MemoryReportAllocatorTest.obj" "$(INTDIR)\MemoryReportAllocatorTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\MemoryReporterPluginTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MemoryReporterPluginTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MemoryReporterPluginTest.obj" "$(INTDIR)\MemoryReporterPluginTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\MemoryReportFormatterTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MemoryReportFormatterTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MemoryReportFormatterTest.obj" "$(INTDIR)\MemoryReportFormatterTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\MockActualCallTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MockActualCallTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MockActualCallTest.obj" "$(INTDIR)\MockActualCallTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\MockCheatSheetTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MockCheatSheetTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MockCheatSheetTest.obj" "$(INTDIR)\MockCheatSheetTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\MockExpectedCallTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MockExpectedCallTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MockExpectedCallTest.obj" "$(INTDIR)\MockExpectedCallTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\MockExpectedFunctionsListTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MockExpectedFunctionsListTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MockExpectedFunctionsListTest.obj" "$(INTDIR)\MockExpectedFunctionsListTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\MockFailureTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MockFailureTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MockFailureTest.obj" "$(INTDIR)\MockFailureTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\MockPluginTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MockPluginTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MockPluginTest.obj" "$(INTDIR)\MockPluginTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\MockSupport_cTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MockSupport_cTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MockSupport_cTest.obj" "$(INTDIR)\MockSupport_cTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\MockSupport_cTestCFile.c - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MockSupport_cTestCFile.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MockSupport_cTestCFile.obj" "$(INTDIR)\MockSupport_cTestCFile.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\MockSupportTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\MockSupportTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\MockSupportTest.obj" "$(INTDIR)\MockSupportTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\OrderedTestTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\OrderedTestTest.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\OrderedTestTest.obj" "$(INTDIR)\OrderedTestTest.sbr" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -SOURCE=.\CppUTestExt\OrderedTestTest_c.c - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\OrderedTestTest_c.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\OrderedTestTest_c.obj" "$(INTDIR)\OrderedTestTest_c.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\PluginTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\PluginTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\PluginTest.obj" "$(INTDIR)\PluginTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\PreprocessorTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\PreprocessorTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\PreprocessorTest.obj" "$(INTDIR)\PreprocessorTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\SetPluginTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\SetPluginTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\SetPluginTest.obj" "$(INTDIR)\SetPluginTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\SimpleStringTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\SimpleStringTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\SimpleStringTest.obj" "$(INTDIR)\SimpleStringTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\TestFailureTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\TestFailureTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\TestFailureTest.obj" "$(INTDIR)\TestFailureTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\TestFilterTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\TestFilterTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\TestFilterTest.obj" "$(INTDIR)\TestFilterTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\TestHarness_cTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\TestHarness_cTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\TestHarness_cTest.obj" "$(INTDIR)\TestHarness_cTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\TestHarness_cTestCFile.c - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\TestHarness_cTestCFile.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\TestHarness_cTestCFile.obj" "$(INTDIR)\TestHarness_cTestCFile.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\TestInstallerTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\TestInstallerTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\TestInstallerTest.obj" "$(INTDIR)\TestInstallerTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\TestMemoryAllocatorTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\TestMemoryAllocatorTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\TestMemoryAllocatorTest.obj" "$(INTDIR)\TestMemoryAllocatorTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\TestOutputTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\TestOutputTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\TestOutputTest.obj" "$(INTDIR)\TestOutputTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\TestRegistryTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\TestRegistryTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\TestRegistryTest.obj" "$(INTDIR)\TestRegistryTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\TestResultTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\TestResultTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\TestResultTest.obj" "$(INTDIR)\TestResultTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -SOURCE=.\CppUTest\UtestTest.cpp - -!IF "$(CFG)" == "AllTests - Win32 Release" - - -"$(INTDIR)\UtestTest.obj" : $(SOURCE) "$(INTDIR)" - - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - - -"$(INTDIR)\UtestTest.obj" "$(INTDIR)\UtestTest.sbr" : $(SOURCE) "$(INTDIR)" - - -!ENDIF - -!IF "$(CFG)" == "AllTests - Win32 Release" - -"CppUTest - Win32 Release" : - cd "\DEV\05_CPPUTEST\CPPUTEST" - $(MAKE) /$(MAKEFLAGS) /F .\CppUTest.mak CFG="CppUTest - Win32 Release" - cd ".\tests" - -"CppUTest - Win32 ReleaseCLEAN" : - cd "\DEV\05_CPPUTEST\CPPUTEST" - $(MAKE) /$(MAKEFLAGS) /F .\CppUTest.mak CFG="CppUTest - Win32 Release" RECURSE=1 CLEAN - cd ".\tests" - -!ELSEIF "$(CFG)" == "AllTests - Win32 Debug" - -"CppUTest - Win32 Debug" : - cd "\DEV\05_CPPUTEST\CPPUTEST" - $(MAKE) /$(MAKEFLAGS) /F .\CppUTest.mak CFG="CppUTest - Win32 Debug" - cd ".\tests" - -"CppUTest - Win32 DebugCLEAN" : - cd "\DEV\05_CPPUTEST\CPPUTEST" - $(MAKE) /$(MAKEFLAGS) /F .\CppUTest.mak CFG="CppUTest - Win32 Debug" RECURSE=1 CLEAN - cd ".\tests" - -!ENDIF - - -!ENDIF - From 27b224b712fff8a8c4d81298a0ba641ad265456e Mon Sep 17 00:00:00 2001 From: offa Date: Sun, 10 May 2020 14:28:59 +0200 Subject: [PATCH 0544/1093] Missing SimpleString.h added to public header. --- src/CppUTest/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index bb564f085..81eda28df 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -43,6 +43,7 @@ set(CppUTest_headers ${CppUTestRootDirectory}/include/CppUTest/PlatformSpecificFunctions_c.h ${CppUTestRootDirectory}/include/CppUTest/TestOutput.h ${CppUTestRootDirectory}/include/CppUTest/CppUTestConfig.h + ${CppUTestRootDirectory}/include/CppUTest/SimpleString.h ${CppUTestRootDirectory}/include/CppUTest/SimpleStringInternalCache.h ${CppUTestRootDirectory}/include/CppUTest/TestPlugin.h ${CppUTestRootDirectory}/include/CppUTest/JUnitTestOutput.h From 0e997ea2e7a08394485d1d7131b633a2b3bdb174 Mon Sep 17 00:00:00 2001 From: offa Date: Sun, 10 May 2020 14:50:38 +0200 Subject: [PATCH 0545/1093] zero as null pointer constant warning fixed. --- tests/CppUTest/UtestTest.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index b200408e2..cf6ad1c16 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -438,7 +438,7 @@ TEST(UtestShellPointerArrayTest, empty) { UtestShellPointerArray tests(NULLPTR); tests.shuffle(0); - CHECK(NULL == tests.getFirstTest()); + CHECK(NULLPTR == tests.getFirstTest()); } TEST(UtestShellPointerArrayTest, testsAreInOrder) @@ -499,5 +499,3 @@ TEST(UtestShellPointerArrayTest, reverse) CHECK(tests.get(1) == test1); CHECK(tests.get(2) == test0); } - - From c1f8c5b9b21d68f07ec83137cd9e1c6f034ce5d1 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 11 May 2020 08:32:55 +0800 Subject: [PATCH 0546/1093] Fixing this darn cron job --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 6c35e93d0..5d4b303e1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,6 +41,8 @@ jobs: - MSBUILD_PATH="c:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin" - VCTargetsPath="C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\VC\VCTargets" + - compiler: clang + env: BUILD=extensive_check # Linux - compiler: gcc env: BUILD=cmake CPP_STD=17 From 7c454b502982790330be8ce139edbc3c5a528618 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 11 May 2020 08:52:44 +0800 Subject: [PATCH 0547/1093] Removed the __USE_MINGW_ANSI_STDIO. Need to resolve in a different way --- include/CppUTest/CppUTestConfig.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index d7b05985a..2172fc350 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -324,10 +324,6 @@ typedef struct cpputest_ulonglong cpputest_ulonglong; #define _destructor_override #endif -/* MinGW-w64 prefers to act like Visual C++, but we want the ANSI behaviors instead */ -#undef __USE_MINGW_ANSI_STDIO -#define __USE_MINGW_ANSI_STDIO 1 - #ifdef __clang__ #pragma clang diagnostic pop #endif From 2df5b55f3f753344d8a6ce62a53fbc7dfc399e53 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 11 May 2020 09:18:43 +0800 Subject: [PATCH 0548/1093] Fixed a warning on signedness? --- examples/ApplicationLib/CircularBuffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/ApplicationLib/CircularBuffer.cpp b/examples/ApplicationLib/CircularBuffer.cpp index 06018af20..9a82db613 100644 --- a/examples/ApplicationLib/CircularBuffer.cpp +++ b/examples/ApplicationLib/CircularBuffer.cpp @@ -31,7 +31,7 @@ CircularBuffer::CircularBuffer(int _capacity) : index(0), outdex(0), capacity(_capacity), empty(true), full(false) { - buffer = new int[this->capacity]; + buffer = new int[(size_t) this->capacity]; } CircularBuffer::~CircularBuffer() From ddf9c971440cf8de1888fe06b749c8f268be456b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 11 May 2020 09:54:59 +0800 Subject: [PATCH 0549/1093] Removed extensive build from the quick build. It passed. Finally --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5d4b303e1..6c35e93d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,8 +41,6 @@ jobs: - MSBUILD_PATH="c:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin" - VCTargetsPath="C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\VC\VCTargets" - - compiler: clang - env: BUILD=extensive_check # Linux - compiler: gcc env: BUILD=cmake CPP_STD=17 From 4956ff594e209ad0a0bc5e51fd01c8850b406c50 Mon Sep 17 00:00:00 2001 From: offa Date: Mon, 11 May 2020 13:47:08 +0200 Subject: [PATCH 0550/1093] Option for build time test discover added. --- CMakeLists.txt | 1 + tests/CppUTest/CMakeLists.txt | 4 +++- tests/CppUTestExt/CMakeLists.txt | 5 ++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 337cfc88c..d351019e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,6 +70,7 @@ option(WERROR "Compile with warnings as errors" OFF) option(TESTS "Compile and make tests for the code?" ON) option(TESTS_DETAILED "Run each test separately instead of grouped?" OFF) +option(TESTS_BUILD_DISCOVER "Build time test discover" ON) option(EXAMPLES "Compile and make exaples?" OFF) diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index abca09b97..54fe351a4 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -55,4 +55,6 @@ add_executable(CppUTestTests ${CppUTestTests_src}) cpputest_normalize_test_output_location(CppUTestTests) target_link_libraries(CppUTestTests CppUTest ${THREAD_LIB}) -cpputest_buildtime_discover_tests(CppUTestTests) +if (TESTS_BUILD_DISCOVER) + cpputest_buildtime_discover_tests(CppUTestTests) +endif() diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index b83ceb2cf..304b23759 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -37,4 +37,7 @@ endif (MINGW) add_executable(CppUTestExtTests ${CppUTestExtTests_src}) cpputest_normalize_test_output_location(CppUTestExtTests) target_link_libraries(CppUTestExtTests CppUTest CppUTestExt ${THREAD_LIB} ${CPPUNIT_EXTERNAL_LIBRARIES}) -cpputest_buildtime_discover_tests(CppUTestExtTests) + +if (TESTS_BUILD_DISCOVER) + cpputest_buildtime_discover_tests(CppUTestExtTests) +endif() From 760679ccad32af8c73873ee0b6884902360e5423 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 13 May 2020 09:46:38 +0800 Subject: [PATCH 0551/1093] Users of the version that is described here have probably died of old age --- README_UsersOfPriorVersions.txt | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 README_UsersOfPriorVersions.txt diff --git a/README_UsersOfPriorVersions.txt b/README_UsersOfPriorVersions.txt deleted file mode 100644 index 8fbb2ba7e..000000000 --- a/README_UsersOfPriorVersions.txt +++ /dev/null @@ -1,27 +0,0 @@ -If you were a user of CppTestTools you will have a few changes to make. - -CppUTest is the unit test harness from CppTestTools -CppFit is the FIT implementaions from CppTestTools - (CppFit is a separate download) - -Sorry, this is not a complete set of instructions for converting, but -here are some suggestions. - -In each test file - change namespace for SetUp and TearDown to TEST_GROUP(GroupName) - (GroupName is the class name by convention) - delete IMPORT_TEST_GROUP - (TEST_GROUP has this built in now) - #include "UnitTestHarness/somefile.h" should be - #include "CppUTest/somefile.h" - -Your Makefiles have to change: - Change DOTO to OBJS - Replace CPP_TEST_TOOLS with CPP_U_TEST - Replace MakefileHelpers with build - Change -I$(CPP_TEST_TOOLS) to -I$(CPP_U_TEST)/include\ - For libraries using fixtures add -I$(CPP_FIT)/include - Add the RunAllTests.sh script to your AllTests directory - - - \ No newline at end of file From d0bda8a62a83f7d0409bea1dee28f227e11f48b7 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 13 May 2020 09:57:59 +0800 Subject: [PATCH 0552/1093] Updated the install instructions... a bit --- README_InstallCppUTest.txt | 44 +++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/README_InstallCppUTest.txt b/README_InstallCppUTest.txt index ebe0f9efa..d61ef46d8 100644 --- a/README_InstallCppUTest.txt +++ b/README_InstallCppUTest.txt @@ -1,10 +1,10 @@ 1. Unzip into , resulting in - /CppUTest/ + /CppUTest/ + + MAKE SURE DOES NOT HAVE SPACES IN IT + MAKE SURE DOES NOT HAVE SPACES IN IT + MAKE SURE DOES NOT HAVE SPACES IN IT - MAKE SURE DOES NOT HAVE SPACES IN IT - MAKE SURE DOES NOT HAVE SPACES IN IT - MAKE SURE DOES NOT HAVE SPACES IN IT - 2. Build CppUTest and examples 2a. For unix/gcc (including cygwin) @@ -12,59 +12,59 @@ > ../configure > make > make tdd # This is to run the CppUTest unit tests - + 2b. For Microsoft Visual C++ V6 Double click /CppUTest/CppUTest.dsw Run without debugging, see the test results in the command window Exit MS Visual C++ - - To run the examples: + + To run the examples: Double click /CppUTest/example/CppUTestExample.dsw Run without debugging, see the test results in the command window You should define the environment variable CPP_U_TEST to point to CppUTest to run these. - - NOTE: To create your own project, you need to have CppUTest and your project + + NOTE: To create your own project, you need to have CppUTest and your project compiled with the same compile and link settings 2c. For ARMCC from Keil MDK-ARM (building CppUTest library only) > make all -C platforms/armcc Please see README and Makefile in platforms/armcc to adjust options, default CPU architecture is ARM7TDMI and default CPU execution mode is THUMB. - + 3c. For Microsoft Visual Studio 2008 Double click /CppUTest/CppUTest.sln - + If Visual studio reports that the solution file was created with a newer version of Visual Studio, then try 3d - + Then press control-F5 to "Start without debugging" - + See CppUTest build and run its tests. - + 3d. For Older Microsoft Visual Studio .NET Double click /CppUTest/CppUTest.dsw Allow VS.NET to convert the files by clicking "yes to all" Run without debugging, see the test results in the command window Exit MS VS.NET - + Allow VS.NET to convert the files by clicking "yes to all" Run without debugging, see the test results in the command window - - NOTE: To create your own project, you need to have CppUTest and your project + + NOTE: To create your own project, you need to have CppUTest and your project compiled with the same compile and link settings - -4. to setup the support scripts. These scripts work in various unix systems + +4. to setup the support scripts. These scripts work in various unix systems and cygwin. (these are quite handy) If you are using windows install some tool like cygwin, msys or MKSToolkit to run these scripts. > cd /CppUTest > ./scripts/InstallScripts.sh -This command adds some symbolic links to /usr/local/bin, so you have +This command adds some symbolic links to /usr/local/bin, so you have to run it as root. sudo ./InstallScripts.sh - + MSYS - http://www.mingw.org/msys.shtml CYGWIN - http://www.cygwin.com/ MKSToolkit - http://mkstoolkit.com/ From b9a15f130bee53fde954d5e776ea6c2018f35beb Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 13 May 2020 09:58:15 +0800 Subject: [PATCH 0553/1093] Removed the .mak file, so this doesn't work now --- makeAndRun.bat | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 makeAndRun.bat diff --git a/makeAndRun.bat b/makeAndRun.bat deleted file mode 100644 index 534ede1ea..000000000 --- a/makeAndRun.bat +++ /dev/null @@ -1,16 +0,0 @@ -rem **** -rem * for this command line build to work independent of where it was created -rem * -rem * Generate Project/Export Makefiles -rem * -rem * then do these edits to the generated files -rem * CppUTest.dep - change the relitive path to ....\program files to \program files -rem * AllTests.mak - At the end of the makefile where the depended upon CppUTest is made -rem* Change cd "\absolute\path\CppUTest" to cd .. -PATH=C:\Program Files\Microsoft Visual Studio\VC98\Bin;%PATH% -rem nmake /f CppUTest.mak CFG="CppUTest - Win32 Debug" all -cd tests -nmake /f AllTests.mak all -cd Debug -AllTests -v -cd ..\.. From a85fc69460b2199031b160d41cb0ab28f1236d7a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 13 May 2020 10:00:27 +0800 Subject: [PATCH 0554/1093] More update --- README_InstallCppUTest.txt | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/README_InstallCppUTest.txt b/README_InstallCppUTest.txt index d61ef46d8..bb67cc2a8 100644 --- a/README_InstallCppUTest.txt +++ b/README_InstallCppUTest.txt @@ -14,18 +14,8 @@ > make tdd # This is to run the CppUTest unit tests 2b. For Microsoft Visual C++ V6 - Double click /CppUTest/CppUTest.dsw - Run without debugging, see the test results in the command window - Exit MS Visual C++ - - To run the examples: - Double click /CppUTest/example/CppUTestExample.dsw - Run without debugging, see the test results in the command window - You should define the environment variable CPP_U_TEST to point to CppUTest - to run these. - - NOTE: To create your own project, you need to have CppUTest and your project - compiled with the same compile and link settings + We couldn't install the compiler anymore. We removed the project files. + You will need to make your own 2c. For ARMCC from Keil MDK-ARM (building CppUTest library only) > make all -C platforms/armcc From b967d1613b3b653b71ac620185c785c051585e7d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 13 May 2020 10:03:34 +0800 Subject: [PATCH 0555/1093] Removed change log --- ChangeLog | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3985c9c82..399179154 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,18 +1,4 @@ -Addition to Release 3.7 and Release 3.7.1: - -* -v and -ojunit together -* Better memory leak printing -* MEMCMP_EQUAL -* STRNCMP_EQUAL -* Memory Leak Detector multi-threading support -* Mock Output parameters -* Better Windows support -* Many Mock improvements -* Many small fixes and improvements -* Less platform specific dependencies -* More platforms supported - -For further changelog check the github page: +For changelog check the github page: https://github.com/cpputest/cpputest From c23d3f57b424c6df67c90cb043b93cddcfb10936 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 13 May 2020 12:46:16 +0800 Subject: [PATCH 0556/1093] Some small mistakes in variants --- src/Platforms/GccNoStdC/UtestPlatform.cpp | 2 ++ tests/CppUTest/MemoryOperatorOverloadTest.cpp | 7 +++++++ tests/CppUTest/SimpleStringTest.cpp | 12 ++++++------ tests/CppUTest/TestHarness_cTest.cpp | 4 ++-- tests/RunAllTests.sh | 4 ---- 5 files changed, 17 insertions(+), 12 deletions(-) delete mode 100755 tests/RunAllTests.sh diff --git a/src/Platforms/GccNoStdC/UtestPlatform.cpp b/src/Platforms/GccNoStdC/UtestPlatform.cpp index 1584d8f32..5898e61b1 100644 --- a/src/Platforms/GccNoStdC/UtestPlatform.cpp +++ b/src/Platforms/GccNoStdC/UtestPlatform.cpp @@ -78,3 +78,5 @@ void (*PlatformSpecificMutexLock)(PlatformSpecificMutex mtx) = NULLPTR; void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex mtx) = NULLPTR; void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex mtx) = NULLPTR; +void (*PlatformSpecificSrand)(unsigned int) = NULLPTR; +int (*PlatformSpecificRand)(void) = NULLPTR; diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index 80c574492..399c01f12 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -166,9 +166,16 @@ TEST(MemoryLeakOverridesToBeUsedInProductionCode, UseNativeMallocByTemporarlySwi #undef malloc #undef free #endif + +#if CPPUTEST_USE_STD_C_LIB void* memory = malloc(10); LONGS_EQUAL(memLeaks, memLeakDetector->totalMemoryLeaks(mem_leak_period_checking)); free (memory); +#else + void* memory = PlatformSpecificMalloc(10); + LONGS_EQUAL(memLeaks, memLeakDetector->totalMemoryLeaks(mem_leak_period_checking)); + PlatformSpecificFree (memory); +#endif #ifdef CPPUTEST_USE_MALLOC_MACROS #include "CppUTest/MemoryLeakDetectorMallocMacros.h" diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index fa1f779bb..a9e7a4289 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -532,10 +532,10 @@ TEST(SimpleString, copyInBufferNormal) { SimpleString str("Hello World"); size_t bufferSize = str.size()+1; - char* buffer = (char*) malloc(bufferSize); + char* buffer = (char*) PlatformSpecificMalloc(bufferSize); str.copyToBuffer(buffer, bufferSize); STRCMP_EQUAL(str.asCharString(), buffer); - free(buffer); + PlatformSpecificFree(buffer); } TEST(SimpleString, copyInBufferWithEmptyBuffer) @@ -550,21 +550,21 @@ TEST(SimpleString, copyInBufferWithBiggerBufferThanNeeded) { SimpleString str("Hello"); size_t bufferSize = 20; - char* buffer= (char*) malloc(bufferSize); + char* buffer= (char*) PlatformSpecificMalloc(bufferSize); str.copyToBuffer(buffer, bufferSize); STRCMP_EQUAL(str.asCharString(), buffer); - free(buffer); + PlatformSpecificFree(buffer); } TEST(SimpleString, copyInBufferWithSmallerBufferThanNeeded) { SimpleString str("Hello"); size_t bufferSize = str.size(); - char* buffer= (char*) malloc(bufferSize); + char* buffer= (char*) PlatformSpecificMalloc(bufferSize); str.copyToBuffer(buffer, bufferSize); STRNCMP_EQUAL(str.asCharString(), buffer, (bufferSize-1)); LONGS_EQUAL(0, buffer[bufferSize-1]); - free(buffer); + PlatformSpecificFree(buffer); } TEST(SimpleString, ContainsNull) diff --git a/tests/CppUTest/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp index 61881f360..6ceefcaac 100644 --- a/tests/CppUTest/TestHarness_cTest.cpp +++ b/tests/CppUTest/TestHarness_cTest.cpp @@ -338,7 +338,7 @@ TEST(TestHarness_c, checkLongLongInt) static void _failLongLongIntTextMethod() { cpputest_longlong dummy_longlong; - CHECK_EQUAL_C_LONGLONG_TEXT(dummy_longlong, dummy_longlong); + CHECK_EQUAL_C_LONGLONG_TEXT(dummy_longlong, dummy_longlong, "Text"); } // LCOV_EXCL_LINE TEST(TestHarness_c, checkLongLongIntText) @@ -366,7 +366,7 @@ TEST(TestHarness_c, checkUnsignedLongLongInt) static void _failUnsignedLongLongIntTextMethod() { cpputest_ulonglong dummy_ulonglong; - CHECK_EQUAL_C_ULONGLONG_TEXT(dummy_ulonglong, dummy_ulonglong); + CHECK_EQUAL_C_ULONGLONG_TEXT(dummy_ulonglong, dummy_ulonglong, "Text"); } // LCOV_EXCL_LINE TEST(TestHarness_c, checkUnsignedLongLongIntText) diff --git a/tests/RunAllTests.sh b/tests/RunAllTests.sh deleted file mode 100755 index 3d756a540..000000000 --- a/tests/RunAllTests.sh +++ /dev/null @@ -1,4 +0,0 @@ -#/bin/bash -#put any pre-test execution commands here. -echo Running all tests -./AllTests $1 From d29cc8245cf305e8fc6eceb208f536854479ee78 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 13 May 2020 12:59:18 +0800 Subject: [PATCH 0557/1093] Makefile for testing the Makefileworker --- Makefile_using_MakefileWorker | 99 ++++++++++++++++------------------- 1 file changed, 44 insertions(+), 55 deletions(-) diff --git a/Makefile_using_MakefileWorker b/Makefile_using_MakefileWorker index c5aa4dc6d..0aa7395b8 100644 --- a/Makefile_using_MakefileWorker +++ b/Makefile_using_MakefileWorker @@ -11,12 +11,13 @@ endif CPPUTEST_HOME = . OLD_MAKE = oldmake +MAKE_CMD = make -f $(CPPUTEST_HOME)/Makefile_using_MakefileWorker CPPUTEST_ENABLE_DEBUG = Y SRC_DIRS = \ src/CppUTest \ src/Platforms/$(CPP_PLATFORM) - + TEST_SRC_DIRS = \ tests/CppUTest @@ -27,75 +28,63 @@ include $(CPPUTEST_HOME)/build/MakefileWorker.mk #these are a sample of the other alternative flag settings .PHONY: test_all -test_all: start test_old_make +test_all: start @echo Building with the default flags. - make clean - $(TIME) make + $(MAKE_CMD) clean + $(TIME) $(MAKE_CMD) ./$(TEST_TARGET) -r - make clean - @echo Building with the STDC++ new disabled. - $(TIME) make CPPUTEST_USE_STD_CPP_LIB=Y extensions - make CPPUTEST_USE_STD_CPP_LIB=Y cleanExtensions + $(MAKE_CMD) clean + @echo Building with the STDC++ new disabled. + $(TIME) $(MAKE_CMD) CPPUTEST_USE_STD_CPP_LIB=Y extensions + $(MAKE_CMD) CPPUTEST_USE_STD_CPP_LIB=Y cleanExtensions @echo Building with Memory Leak Detection disabled - $(TIME) make CPPUTEST_USE_MEM_LEAK_DETECTION=N extensions - make CPPUTEST_USE_MEM_LEAK_DETECTION=N cleanExtensions + $(TIME) $(MAKE_CMD) CPPUTEST_USE_MEM_LEAK_DETECTION=N extensions + $(MAKE_CMD) CPPUTEST_USE_MEM_LEAK_DETECTION=N cleanExtensions @echo Building with Memory Leak Detection disabled and STD C++ disabled - $(TIME) make CPPUTEST_USE_MEM_LEAK_DETECTION=N CPPUTEST_USE_STD_CPP_LIB=Y extensions - make CPPUTEST_USE_MEM_LEAK_DETECTION=N CPPUTEST_USE_STD_CPP_LIB=Y cleanExtensions + $(TIME) $(MAKE_CMD) CPPUTEST_USE_MEM_LEAK_DETECTION=N CPPUTEST_USE_STD_CPP_LIB=Y extensions + $(MAKE_CMD) CPPUTEST_USE_MEM_LEAK_DETECTION=N CPPUTEST_USE_STD_CPP_LIB=Y cleanExtensions @echo Building with debug disabled - $(TIME) make CPPUTEST_ENABLE_DEBUG=N extensions - make CPPUTEST_ENABLE_DEBUG=N cleanExtensions + $(TIME) $(MAKE_CMD) CPPUTEST_ENABLE_DEBUG=N extensions + $(MAKE_CMD) CPPUTEST_ENABLE_DEBUG=N cleanExtensions @echo Building with overridden CXXFLAGS and CFLAGS and CPPFLAGS - $(TIME) make CLFAGS="" CXXFLAGS="" CPPFLAGS="-Iinclude" - make CFLAGS="" CXXFLAGS="" clean + $(TIME) $(MAKE_CMD) CLFAGS="" CXXFLAGS="" CPPFLAGS="-Iinclude" + $(MAKE_CMD) CFLAGS="" CXXFLAGS="" clean @echo Building without Standard C library includes - $(TIME) make CPPUTEST_USE_STD_C_LIB=N all_no_tests - make CPPUTEST_USE_STD_C_LIB=N clean + $(TIME) $(MAKE_CMD) CPPUTEST_USE_STD_C_LIB=N all_no_tests + $(MAKE_CMD) CPPUTEST_USE_STD_C_LIB=N clean @echo Building with a different TARGET_PLATFORM - make TARGET_PLATFORM=real_platform + $(MAKE_CMD) TARGET_PLATFORM=real_platform @echo Building with overridden CXXFLAGS and CFLAGS and memory leak and STDC++ disabled - $(TIME) make CLFAGS="" CXXFLAGS="" CPPFLAGS="-Iinclude -DCPPUTEST_STD_CPP_LIB_DISABLED -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED" - make CFLAGS="" CXXFLAGS="" CPPFLAGS="-DCPPUTEST_STD_CPP_LIB_DISABLED -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED" clean - @echo Building examples - make cleanExamples - $(TIME) make examples - make cleanExamples + $(TIME) $(MAKE_CMD) CLFAGS="" CXXFLAGS="" CPPFLAGS="-Iinclude -DCPPUTEST_STD_CPP_LIB_DISABLED -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED" + $(MAKE_CMD) CFLAGS="" CXXFLAGS="" CPPFLAGS="-DCPPUTEST_STD_CPP_LIB_DISABLED -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED" clean + @echo Building examples + $(MAKE_CMD) cleanExamples + $(TIME) $(MAKE_CMD) examples + $(MAKE_CMD) cleanExamples @echo Testing JUnit output - $(TIME) make + $(TIME) $(MAKE_CMD) $(SILENCE)./$(TEST_TARGET) -ojunit > junit_run_output $(SILENCE)if [ -s junit_run_output ]; then echo "JUnit run has output. Build failed!"; exit 1; fi - make clean - make CPPUTEST_MAP_FILE=map.txt - make clean + $(MAKE_CMD) clean + $(MAKE_CMD) CPPUTEST_MAP_FILE=map.txt + $(MAKE_CMD) clean @echo Testing GCOV usage - $(TIME) make CPPUTEST_USE_GCOV=Y everythingInstall - make gcov - make -f Makefile_CppUTestExt gcov - make -C examples gcov - make cleanEverythingInstall + $(TIME) $(MAKE_CMD) CPPUTEST_USE_GCOV=Y everythingInstall + $(MAKE_CMD) gcov + $(MAKE) -f Makefile_CppUTestExt gcov + $(MAKE) -C examples gcov + $(MAKE_CMD) cleanEverythingInstall @echo Testing VPATH usage - $(TIME) make CPPUTEST_USE_GCOV=Y CPPUTEST_USE_VPATH=Y everythingInstall - make CPPUTEST_USE_VPATH=Y gcov - make CPPUTEST_USE_VPATH=Y -f Makefile_CppUTestExt gcov - make CPPUTEST_USE_VPATH=Y -C examples gcov - make clean cleanExamples + $(TIME) $(MAKE_CMD) CPPUTEST_USE_GCOV=Y CPPUTEST_USE_VPATH=Y everythingInstall + $(MAKE_CMD) CPPUTEST_USE_VPATH=Y gcov + $(MAKE) CPPUTEST_USE_VPATH=Y -f Makefile_CppUTestExt gcov + $(MAKE) CPPUTEST_USE_VPATH=Y -C examples gcov + $(MAKE_CMD) clean cleanExamples @echo Testing VPATH usage - $(TIME) make CPPUTEST_USE_VPATH=Y everythingInstall - make CPPUTEST_USE_VPATH=Y cleanEverythingInstall - make flags - make debug - -HAS_OLD_MAKE = $(shell $(OLD_MAKE) -v 2>/dev/null) - -test_old_make: - $(SILENCE)if [ "$(HAS_OLD_MAKE)" = "" ]; then \ - echo "Old make with the name $(OLD_MAKE) not found. Skipping testing with old make version"; \ - else \ - $(OLD_MAKE) -f Makefile_for_old_make clean && \ - $(OLD_MAKE) -f Makefile_for_old_make && \ - $(OLD_MAKE) -f Makefile_for_old_make extensions && \ - $(OLD_MAKE) -f Makefile_for_old_make clean; \ - fi + $(TIME) $(MAKE_CMD) CPPUTEST_USE_VPATH=Y everythingInstall + $(MAKE_CMD) CPPUTEST_USE_VPATH=Y cleanEverythingInstall + $(MAKE_CMD) flags + $(MAKE_CMD) debug .PHONY: examples examples: $(TEST_TARGET) extensions From b359a5f0d1f2fb14e4b9490e5711ea542a73aca8 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 13 May 2020 13:02:00 +0800 Subject: [PATCH 0558/1093] Makefileworker test_all added to build --- .travis.yml | 2 ++ scripts/travis_ci_build.sh | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index 6c35e93d0..5d133e31d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,6 +48,8 @@ jobs: env: BUILD=autotools - compiler: clang env: BUILD=autotools + - compiler: gcc + env: BUILD=makefileworker # Extended builds, different C++ version and build tools - stage: extended build & test diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 1883ccec9..ab3d863d2 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -12,6 +12,10 @@ if [ "x$BUILD" = "xautotools" ]; then make tdd fi +if [ "x$BUILD" = "xmakefileworker" ]; then + make -C $CPPUTEST_HOME -f Makefile_using_MakefileWorker +fi + if [ "x$BUILD" = "xcmake" ]; then BUILD_ARGS=("-DWERROR=ON") From b64389f17a239593d701c1e710342e9fb00c3a0b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 13 May 2020 13:58:53 +0800 Subject: [PATCH 0559/1093] test all please --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index ab3d863d2..0b996a837 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -13,7 +13,7 @@ if [ "x$BUILD" = "xautotools" ]; then fi if [ "x$BUILD" = "xmakefileworker" ]; then - make -C $CPPUTEST_HOME -f Makefile_using_MakefileWorker + make -C $CPPUTEST_HOME -f Makefile_using_MakefileWorker test_all fi if [ "x$BUILD" = "xcmake" ]; then From 20e443a9a71ad42fc7e657bf89c9eac97274e465 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 13 May 2020 17:10:55 +0800 Subject: [PATCH 0560/1093] Makefileworker build moved to cron --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5d133e31d..f0f56226d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,8 +48,6 @@ jobs: env: BUILD=autotools - compiler: clang env: BUILD=autotools - - compiler: gcc - env: BUILD=makefileworker # Extended builds, different C++ version and build tools - stage: extended build & test @@ -147,6 +145,8 @@ jobs: - arch: arm64 compiler: gcc env: BUILD=autotools + - compiler: gcc + env: BUILD=makefileworker # Deploy to github releases - stage: deploy latest From 8744d0cbaf788973f913ac104d0008891e40093d Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 13 May 2020 13:50:43 +0200 Subject: [PATCH 0561/1093] CMake coverage generation (incl. html report) added. --- cmake/Modules/CppUTestConfigurationOptions.cmake | 15 ++++++++++++++- gcovr.cfg | 6 ++++++ scripts/travis_ci_build.sh | 3 +-- 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 gcovr.cfg diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index fc711d83a..43147cb5d 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -52,7 +52,20 @@ if (COVERAGE AND NOT MSVC) set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} --coverage") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} --coverage") set(CMAKE_BUILD_TYPE "Debug") -endif (COVERAGE AND NOT MSVC) + find_program(GCOVR gcovr DOC "gcovr executable") + + if (NOT GCOVR) + message(SEND_ERROR "gcovr not found") + endif() + + add_custom_target(coverage ${GCOVR} + --root ${PROJECT_SOURCE_DIR} + --output "${CMAKE_BINARY_DIR}/coverage/coverage.html" + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + COMMENT "Generate coverage data" + VERBATIM + ) +endif() if (CMAKE_CXX_STANDARD) set(CMAKE_CXX_EXTENSIONS OFF) diff --git a/gcovr.cfg b/gcovr.cfg new file mode 100644 index 000000000..1f027724a --- /dev/null +++ b/gcovr.cfg @@ -0,0 +1,6 @@ +filter = src/ +filter = include/ +html = yes +html-details = yes +output = coverage.html +print-summary = yes diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 1883ccec9..f0a88cc02 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -60,7 +60,7 @@ if [ "x$BUILD" = "xtest_report" ]; then fi if [ "x$BUILD" = "xcmake_coverage" ]; then - pip install --user cpp-coveralls + pip install --user cpp-coveralls gcovr cmake .. -DCMAKE_BUILD_TYPE=Debug -DC++11=ON -DCOVERAGE=ON -DLONGLONG=ON make @@ -168,4 +168,3 @@ if [ "x$BUILD" = "xcmake_windows" ]; then make ctest -V fi - From 40e1208847fccbb6a14fd97858c346905e2bf178 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 19 May 2020 12:26:56 +0800 Subject: [PATCH 0562/1093] Added new C++ standard to the check_all build and added a CompatabilityTest file for e.g. StdC++ compatability --- Makefile.am | 7 ++++ configure.ac | 38 ++++++++++++++++++++- platforms/CCStudio/CppUTestRunAllTests1.pjt | 1 + platforms/Dos/sources.mk | 1 + platforms/Eclipse-Cygwin/.project | 15 ++++++++ platforms/iar/CppUTestTest.ewp | 3 ++ tests/AllTests.vcproj | 23 +++++++++++++ tests/AllTests.vcxproj | 1 + tests/CppUTest/CMakeLists.txt | 1 + tests/CppUTest/CompatabilityTests.cpp | 26 ++++++++++++++ 10 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 tests/CppUTest/CompatabilityTests.cpp diff --git a/Makefile.am b/Makefile.am index 97c357ae8..a770a68b8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -162,6 +162,7 @@ CppUTestTests_SOURCES = \ tests/CppUTest/AllocLetTestFreeTest.cpp \ tests/CppUTest/AllTests.cpp \ tests/CppUTest/CheatSheetTest.cpp \ + tests/CppUTest/CompatabilityTests.cpp \ tests/CppUTest/CommandLineArgumentsTest.cpp \ tests/CppUTest/CommandLineTestRunnerTest.cpp \ tests/CppUTest/DummyMemoryLeakDetector.cpp \ @@ -339,6 +340,12 @@ check_basic: @echo "Building with the Std C++ 14 turned on. Compiler acts differently then." make distclean; $(srcdir)/configure --enable-std-cpp14; make + @echo "Building with the Std C++ 17 turned on. Compiler acts differently then." + make distclean; $(srcdir)/configure --enable-std-cpp17; make + + @echo "Building with the Std C++ 20 turned on. Compiler acts differently then." + make distclean; $(srcdir)/configure --enable-std-cpp20; make + @echo "Building without the Standard C library" make distclean; $(srcdir)/configure --disable-std-c; make diff --git a/configure.ac b/configure.ac index c354f0441..5c68f8a0c 100644 --- a/configure.ac +++ b/configure.ac @@ -85,7 +85,7 @@ fi AC_LANG_PUSH([C++]) ##################################################################################### -##### C++ 14 checks +##### C++ checks # FLag -std=c++1y CXXFLAGS="-Werror -std=c++1y" @@ -99,6 +99,24 @@ AC_MSG_CHECKING([whether CXX supports -std=c++14]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP14FLAG="-std=c++14" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" +# FLag std=c++17 +CXXFLAGS="-Werror -std=c++17" +AC_MSG_CHECKING([whether CXX supports -std=c++17]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP17FLAG="-std=c++17" ], [AC_MSG_RESULT([no])]) +CXXFLAGS="$saved_cxxflags" + +# FLag std=c++20 +CXXFLAGS="-Werror -std=c++2a" +AC_MSG_CHECKING([whether CXX supports -std=c++2a]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP20FLAG="-std=c++2a" ], [AC_MSG_RESULT([no])]) +CXXFLAGS="$saved_cxxflags" + +# FLag std=c++20 +CXXFLAGS="-Werror -std=c++20" +AC_MSG_CHECKING([whether CXX supports -std=c++20]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP20FLAG="-std=c++20" ], [AC_MSG_RESULT([no])]) +CXXFLAGS="$saved_cxxflags" + ##################################################################################### ##### C++ version checks @@ -373,6 +391,12 @@ AC_ARG_ENABLE([std-cpp11], [AC_HELP_STRING([--enable-std-cpp11], [enable the use AC_ARG_ENABLE([std-cpp14], [AC_HELP_STRING([--enable-std-cpp14], [enable the use of Standard C++ 14 (if the compiler supports that)])], [use_std_cpp14=${enableval}], [use_std_cpp14=no]) +AC_ARG_ENABLE([std-cpp17], [AC_HELP_STRING([--enable-std-cpp17], [enable the use of Standard C++ 17 (if the compiler supports that)])], + [use_std_cpp17=${enableval}], [use_std_cpp17=no]) + +AC_ARG_ENABLE([std-cpp20], [AC_HELP_STRING([--enable-std-cpp20], [enable the use of Standard C++ 20 (if the compiler supports that)])], + [use_std_cpp20=${enableval}], [use_std_cpp20=no]) + AC_ARG_ENABLE([cpputest-flags], [AC_HELP_STRING([--disable-cpputest-flags], [disable CFLAGS/CPPFLAGS/CXXFLAGS set by CppUTest])], [cpputest_flags=${enableval}], [cpputest_flags=yes]) @@ -441,6 +465,18 @@ if test "x${use_std_cpp14}" = xyes; then cpp_standard_used="C++14" fi +# Using the C++17 standard? +if test "x${use_std_cpp17}" = xyes; then + CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP17FLAG}" + cpp_standard_used="C++17" +fi + +# Using the C++20 standard? +if test "x${use_std_cpp20}" = xyes; then + CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP20FLAG}" + cpp_standard_used="C++20" +fi + # Dealing with memory leak detection if test "x${memory_leak_detection}" = xno; then AC_DEFINE([MEM_LEAK_DETECTION_DISABLED], 1, [memory leak detection disabled]) diff --git a/platforms/CCStudio/CppUTestRunAllTests1.pjt b/platforms/CCStudio/CppUTestRunAllTests1.pjt index 18a4470b4..9625021ee 100644 --- a/platforms/CCStudio/CppUTestRunAllTests1.pjt +++ b/platforms/CCStudio/CppUTestRunAllTests1.pjt @@ -36,6 +36,7 @@ Source="..\..\tests\AllocationInCppFile.cpp" Source="..\..\tests\AllocLetTestFree.c" Source="..\..\tests\AllocLetTestFreeTest.cpp" Source="..\..\tests\CheatSheetTest.cpp" +Source="..\..\tests\CompatabilityTests.cpp" Source="..\..\tests\CommandLineArgumentsTest.cpp" Source="..\..\tests\CommandLineTestRunnerTest.cpp" Source="..\..\tests\JUnitOutputTest.cpp" diff --git a/platforms/Dos/sources.mk b/platforms/Dos/sources.mk index dcd4be57c..7515febe6 100644 --- a/platforms/Dos/sources.mk +++ b/platforms/Dos/sources.mk @@ -41,6 +41,7 @@ CPPU1_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTest/AllocLetTestFree.o \ $(CPPUTEST_HOME)/tests/CppUTest/AllocLetTestFreeTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/CheatSheetTest.o \ + $(CPPUTEST_HOME)/tests/CppUTest/CompatabilityTests.o \ $(CPPUTEST_HOME)/tests/CppUTest/CommandLineArgumentsTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/CommandLineTestRunnerTest.o \ $(CPPUTEST_HOME)/tests/CppUTest/JUnitOutputTest.o diff --git a/platforms/Eclipse-Cygwin/.project b/platforms/Eclipse-Cygwin/.project index bed0ca0b5..5dcd2654c 100644 --- a/platforms/Eclipse-Cygwin/.project +++ b/platforms/Eclipse-Cygwin/.project @@ -724,6 +724,11 @@ 1 PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/CheatSheetTest.cpp + + tests/CompatabilityTests.cpp + 1 + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/CompatabilityTests.cpp + tests/CommandLineArgumentsTest.cpp 1 @@ -1884,6 +1889,16 @@ 1 PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/Debug/CodeMemoryReportFormatterTest.sbr + + tests/Debug/CompatabilityTests.obj + 1 + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/Debug/CompatabilityTests.obj + + + tests/Debug/CompatabilityTests.sbr + 1 + PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/tests/Debug/CompatabilityTests.sbr + tests/Debug/CommandLineArgumentsTest.obj 1 diff --git a/platforms/iar/CppUTestTest.ewp b/platforms/iar/CppUTestTest.ewp index 7e060041f..d9200406c 100644 --- a/platforms/iar/CppUTestTest.ewp +++ b/platforms/iar/CppUTestTest.ewp @@ -1942,6 +1942,9 @@ $PROJ_DIR$\..\..\tests\CppUTest\CheatSheetTest.cpp + + $PROJ_DIR$\..\..\tests\CppUTest\CompatabilityTests.cpp + $PROJ_DIR$\..\..\tests\CppUTest\CommandLineArgumentsTest.cpp diff --git a/tests/AllTests.vcproj b/tests/AllTests.vcproj index 6193a77c2..16ab375c9 100644 --- a/tests/AllTests.vcproj +++ b/tests/AllTests.vcproj @@ -354,6 +354,29 @@ /> + + + + + + + + diff --git a/tests/AllTests.vcxproj b/tests/AllTests.vcxproj index 193be1dcb..4dc79fb44 100644 --- a/tests/AllTests.vcxproj +++ b/tests/AllTests.vcxproj @@ -247,6 +247,7 @@ + diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 54fe351a4..9ac1ea715 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -4,6 +4,7 @@ set(CppUTestTests_src CheatSheetTest.cpp SimpleStringTest.cpp SimpleStringCacheTest.cpp + CompatabilityTests.cpp CommandLineArgumentsTest.cpp TestFailureTest.cpp TestFailureNaNTest.cpp diff --git a/tests/CppUTest/CompatabilityTests.cpp b/tests/CppUTest/CompatabilityTests.cpp new file mode 100644 index 000000000..85136e221 --- /dev/null +++ b/tests/CppUTest/CompatabilityTests.cpp @@ -0,0 +1,26 @@ + +#include "CppUTest/TestHarness.h" + +#if CPPUTEST_USE_STD_CPP_LIB + +#include + +TEST_GROUP(StandardCppLibrary) +{ +}; + +#if defined(__cplusplus) && __cplusplus >= 201103L && 0 + +TEST(StandardCppLibrary, UniquePtrConversationToBool) +{ + auto const aNull = std::unique_ptr(nullptr); + CHECK_FALSE(aNull); + + auto const notNull = std::make_unique(1); + CHECK_TRUE(notNull); +}; + +#endif + +#endif + From c40a99ccacb750599cdbfeb52c7a553270ea6b6e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 19 May 2020 12:55:49 +0800 Subject: [PATCH 0563/1093] Removing gcc10 from build, served its purpose --- .travis.yml | 1 - docker/Dockerfile.gcc10 | 9 --------- scripts/travis_ci_build.sh | 5 ----- 3 files changed, 15 deletions(-) delete mode 100644 docker/Dockerfile.gcc10 diff --git a/.travis.yml b/.travis.yml index f0f56226d..13272ab6b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -127,7 +127,6 @@ jobs: # Docker images. Need to be cleared at times - env: BUILD=docker_ubuntu_autotools - - env: BUILD=docker_ubuntu_gcc10 - env: BUILD=docker_ubuntu_dos - env: BUILD=autotools_dist diff --git a/docker/Dockerfile.gcc10 b/docker/Dockerfile.gcc10 deleted file mode 100644 index ea0785f54..000000000 --- a/docker/Dockerfile.gcc10 +++ /dev/null @@ -1,9 +0,0 @@ -FROM okannen/gcc-10 - -RUN apt-get update && \ - apt-get install -y --no-install-recommends file git make automake autoconf libtool && \ - update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100 - -WORKDIR /cpputest_build - -CMD autoreconf -i ../cpputest && ../cpputest/configure && make tdd diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index c7f752dee..0f24e190d 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -108,11 +108,6 @@ if [ "x$BUILD" = "xdocker_ubuntu_autotools" ]; then docker start -i cpputest_ubuntu fi -if [ "x$BUILD" = "xdocker_ubuntu_gcc10" ]; then - $CPPUTEST_HOME/scripts/create_docker_images_and_containers gcc10 - docker start -i cpputest_gcc10 -fi - if [ "x$BUILD" = "xdocker_ubuntu_dos" ]; then $CPPUTEST_HOME/scripts/create_docker_images_and_containers dos docker start -i cpputest_dos From 4b60db6d7b487a7f97be42373df4a123eaa25a15 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 19 May 2020 17:06:19 +0800 Subject: [PATCH 0564/1093] Changed CHECK_FALSE to work with explicit constructors --- include/CppUTest/UtestMacros.h | 4 ++-- tests/CppUTest/CompatabilityTests.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 4987287f4..8e144996b 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -102,10 +102,10 @@ CHECK_TRUE_LOCATION(condition, "CHECK", #condition, NULLPTR, __FILE__, __LINE__) #define CHECK_TEXT(condition, text) \ - CHECK_TRUE_LOCATION(condition, "CHECK", #condition, text, __FILE__, __LINE__) + CHECK_TRUE_LOCATION((bool)(condition), "CHECK", #condition, text, __FILE__, __LINE__) #define CHECK_TRUE(condition)\ - CHECK_TRUE_LOCATION(condition, "CHECK_TRUE", #condition, NULLPTR, __FILE__, __LINE__) + CHECK_TRUE_LOCATION((bool) (condition), "CHECK_TRUE", #condition, NULLPTR, __FILE__, __LINE__) #define CHECK_TRUE_TEXT(condition, text)\ CHECK_TRUE_LOCATION(condition, "CHECK_TRUE", #condition, text, __FILE__, __LINE__) diff --git a/tests/CppUTest/CompatabilityTests.cpp b/tests/CppUTest/CompatabilityTests.cpp index 85136e221..082edf16c 100644 --- a/tests/CppUTest/CompatabilityTests.cpp +++ b/tests/CppUTest/CompatabilityTests.cpp @@ -9,7 +9,7 @@ TEST_GROUP(StandardCppLibrary) { }; -#if defined(__cplusplus) && __cplusplus >= 201103L && 0 +#if defined(__cplusplus) && __cplusplus >= 201103L TEST(StandardCppLibrary, UniquePtrConversationToBool) { From 5a1a556a14d9df2d301d25a25ba513adb0af9880 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 19 May 2020 20:11:34 +0800 Subject: [PATCH 0565/1093] Removed extra semi column --- tests/CppUTest/CompatabilityTests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/CompatabilityTests.cpp b/tests/CppUTest/CompatabilityTests.cpp index 082edf16c..e98f8f4fd 100644 --- a/tests/CppUTest/CompatabilityTests.cpp +++ b/tests/CppUTest/CompatabilityTests.cpp @@ -18,7 +18,7 @@ TEST(StandardCppLibrary, UniquePtrConversationToBool) auto const notNull = std::make_unique(1); CHECK_TRUE(notNull); -}; +} #endif From e6031444a2e3eccd5d53013059b755db25a13f17 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 09:03:14 +0800 Subject: [PATCH 0566/1093] Changed make_unique from C++14 to C++17 --- tests/CppUTest/CompatabilityTests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/CompatabilityTests.cpp b/tests/CppUTest/CompatabilityTests.cpp index e98f8f4fd..7bce1100d 100644 --- a/tests/CppUTest/CompatabilityTests.cpp +++ b/tests/CppUTest/CompatabilityTests.cpp @@ -9,7 +9,7 @@ TEST_GROUP(StandardCppLibrary) { }; -#if defined(__cplusplus) && __cplusplus >= 201103L +#if defined(__cplusplus) && __cplusplus >= 201402L TEST(StandardCppLibrary, UniquePtrConversationToBool) { From ba0e726623b3639beffa8e2c691787719db32acb Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 09:50:36 +0800 Subject: [PATCH 0567/1093] Fixed the clang #if --- include/CppUTest/CppUTestConfig.h | 2 +- include/CppUTest/MemoryLeakDetectorNewMacros.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 2172fc350..7c7371fe3 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -42,7 +42,7 @@ #ifdef __clang__ #pragma clang diagnostic push - #if __clang_major__ >= 3 && __clang_minor__ >= 6 + #if (__clang_major__ == 3 && __clang_minor__ >= 6) || __clang_major__ >= 4 #pragma clang diagnostic ignored "-Wreserved-id-macro" #endif #endif diff --git a/include/CppUTest/MemoryLeakDetectorNewMacros.h b/include/CppUTest/MemoryLeakDetectorNewMacros.h index fb7b87a03..4f4699cbe 100644 --- a/include/CppUTest/MemoryLeakDetectorNewMacros.h +++ b/include/CppUTest/MemoryLeakDetectorNewMacros.h @@ -70,7 +70,7 @@ #ifdef __clang__ #pragma clang diagnostic push - #if __clang_major__ >= 3 && __clang_minor__ >= 6 + #if (__clang_major__ == 3 && __clang_minor__ >= 6) || __clang_major__ >= 4 #pragma clang diagnostic ignored "-Wkeyword-macro" #endif #endif From 3a73e45d1a95c92e51f8b6f70a49e3f668ea1b64 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 13:08:33 +0800 Subject: [PATCH 0568/1093] Added example Makefile for examples for when CppUTest is installed --- examples/ApplicationLib/CircularBuffer.cpp | 1 + .../Makefile_ExamplesWithCppUTestInstalled.mk | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 examples/Makefile_ExamplesWithCppUTestInstalled.mk diff --git a/examples/ApplicationLib/CircularBuffer.cpp b/examples/ApplicationLib/CircularBuffer.cpp index 9a82db613..3aa794cef 100644 --- a/examples/ApplicationLib/CircularBuffer.cpp +++ b/examples/ApplicationLib/CircularBuffer.cpp @@ -27,6 +27,7 @@ #include "CircularBuffer.h" #include "Printer.h" +#include CircularBuffer::CircularBuffer(int _capacity) : index(0), outdex(0), capacity(_capacity), empty(true), full(false) diff --git a/examples/Makefile_ExamplesWithCppUTestInstalled.mk b/examples/Makefile_ExamplesWithCppUTestInstalled.mk new file mode 100644 index 000000000..d6a2ca688 --- /dev/null +++ b/examples/Makefile_ExamplesWithCppUTestInstalled.mk @@ -0,0 +1,26 @@ + +CPPFLAGS += -I /usr/local/include +LD_LIBRARIES = -L/usr/local/lib -lcpputest -lcpputestext + +VPATH = ApplicationLib AllTests + +APPLIB_OBJECTS = CircularBuffer.o EventDispatcher.o hello.o Printer.o +TEST_OBJECTS = AllTests.o CircularBufferTest.o EventDispatcherTest.o FEDemoTest.o HelloTest.o MockDocumentationTest.o PrinterTest.o + +CPPFLAGS += -I ApplicationLib + +TEST_TARGET = CppUTestExamples +APPLIB = applicationLib.a + +$(TEST_TARGET): $(TEST_OBJECTS) applicationLib.a + $(CXX) -o $@ $^ $(LD_LIBRARIES) $(LDFLAGS) + ./$(TEST_TARGET) + +$(APPLIB): $(APPLIB_OBJECTS) + $(AR) $(ARFLAGS) $@ $^ + +clean: + rm -f -rf *.o + rm -f $(TEST_TARGET) + rm -f $(APPLIB) + From fd68c9cb86e6343f2d0b64be916d40c3a9f71b51 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 13:13:04 +0800 Subject: [PATCH 0569/1093] Added examples example Makefile to the build --- .travis.yml | 2 ++ scripts/travis_ci_build.sh | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/.travis.yml b/.travis.yml index 13272ab6b..a1e5f028e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,6 +48,8 @@ jobs: env: BUILD=autotools - compiler: clang env: BUILD=autotools + - compiler: clang + env: BUILD=autotools_install_and_test_examples # Extended builds, different C++ version and build tools - stage: extended build & test diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 0f24e190d..dc6bdc11d 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -146,6 +146,14 @@ if [ "x$BUILD" = "xautotools_dist" ]; then fi fi +if [ "x$BUILD" = "xautotools_install_and_test_examples" ]; then + autoreconf -i .. + ../configure + + make install + make -C examples -f examples/Makefile_ExamplesWithCppUTestInstalled.mk +fi + if [ "x$BUILD" = "xvc_windows" ]; then export PATH=$MSBUILD_PATH:$PATH cmake .. From 7bbfa4f67b9f1deb0793467e14f1438cf54d42c7 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 13:22:34 +0800 Subject: [PATCH 0570/1093] Install sudo --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index dc6bdc11d..54cebbc36 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -150,7 +150,7 @@ if [ "x$BUILD" = "xautotools_install_and_test_examples" ]; then autoreconf -i .. ../configure - make install + sudo make install make -C examples -f examples/Makefile_ExamplesWithCppUTestInstalled.mk fi From 55472f7d7714e97352255c529558a95c5d95489a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 13:34:31 +0800 Subject: [PATCH 0571/1093] Do not compile in sudo mode --- scripts/travis_ci_build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 54cebbc36..ca49f377d 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -150,6 +150,7 @@ if [ "x$BUILD" = "xautotools_install_and_test_examples" ]; then autoreconf -i .. ../configure + make tdd sudo make install make -C examples -f examples/Makefile_ExamplesWithCppUTestInstalled.mk fi From bebbc452e152904b716d9ba43354015329d9edad Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 14:11:25 +0800 Subject: [PATCH 0572/1093] Find the example Makefile please --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index ca49f377d..d1d70284d 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -152,7 +152,7 @@ if [ "x$BUILD" = "xautotools_install_and_test_examples" ]; then make tdd sudo make install - make -C examples -f examples/Makefile_ExamplesWithCppUTestInstalled.mk + make -C examples -f $CPPTEST_HOME/examples/Makefile_ExamplesWithCppUTestInstalled.mk fi if [ "x$BUILD" = "xvc_windows" ]; then From 2ebb1952e7e4b1f3b84a86fe8d878d7e2f0ceb7d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 14:17:19 +0800 Subject: [PATCH 0573/1093] Typo, carless --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index d1d70284d..21b1e8489 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -152,7 +152,7 @@ if [ "x$BUILD" = "xautotools_install_and_test_examples" ]; then make tdd sudo make install - make -C examples -f $CPPTEST_HOME/examples/Makefile_ExamplesWithCppUTestInstalled.mk + make -C examples -f $CPPUTEST_HOME/examples/Makefile_ExamplesWithCppUTestInstalled.mk fi if [ "x$BUILD" = "xvc_windows" ]; then From 6542ee0f8312ce54d057ca0fc068615506d7d941 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 14:23:23 +0800 Subject: [PATCH 0574/1093] Also added to -C --- scripts/travis_ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 21b1e8489..c2682431f 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -152,7 +152,7 @@ if [ "x$BUILD" = "xautotools_install_and_test_examples" ]; then make tdd sudo make install - make -C examples -f $CPPUTEST_HOME/examples/Makefile_ExamplesWithCppUTestInstalled.mk + make -C $CPPUTEST_HOME/examples -f $CPPUTEST_HOME/examples/Makefile_ExamplesWithCppUTestInstalled.mk fi if [ "x$BUILD" = "xvc_windows" ]; then From 0094e4058247dae96104e4ea66e81054fc04bf44 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 15:08:25 +0800 Subject: [PATCH 0575/1093] Added some debugging info --- scripts/travis_ci_build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index c2682431f..42057e8d5 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -152,6 +152,7 @@ if [ "x$BUILD" = "xautotools_install_and_test_examples" ]; then make tdd sudo make install + ls -la /usr/local/lib make -C $CPPUTEST_HOME/examples -f $CPPUTEST_HOME/examples/Makefile_ExamplesWithCppUTestInstalled.mk fi From 801c9d19bce709ab3dfc7d9be433033646275bbd Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 15:28:24 +0800 Subject: [PATCH 0576/1093] Case sensitive library? --- examples/Makefile_ExamplesWithCppUTestInstalled.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Makefile_ExamplesWithCppUTestInstalled.mk b/examples/Makefile_ExamplesWithCppUTestInstalled.mk index d6a2ca688..e42992fb9 100644 --- a/examples/Makefile_ExamplesWithCppUTestInstalled.mk +++ b/examples/Makefile_ExamplesWithCppUTestInstalled.mk @@ -1,6 +1,6 @@ CPPFLAGS += -I /usr/local/include -LD_LIBRARIES = -L/usr/local/lib -lcpputest -lcpputestext +LD_LIBRARIES = -L/usr/local/lib -lCppUTest -lCppUTestExt VPATH = ApplicationLib AllTests From 530cc7f965531f3e5272f45a74aa720384b5f73e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 15:41:34 +0800 Subject: [PATCH 0577/1093] Removed the debug info --- scripts/travis_ci_build.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 42057e8d5..c2682431f 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -152,7 +152,6 @@ if [ "x$BUILD" = "xautotools_install_and_test_examples" ]; then make tdd sudo make install - ls -la /usr/local/lib make -C $CPPUTEST_HOME/examples -f $CPPUTEST_HOME/examples/Makefile_ExamplesWithCppUTestInstalled.mk fi From 3460d60ed706f8841616bf59f165d8830befb5ac Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 May 2020 15:42:37 +0800 Subject: [PATCH 0578/1093] Moved the examples test to the daily cron build --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a1e5f028e..e7b1e3145 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,8 +48,6 @@ jobs: env: BUILD=autotools - compiler: clang env: BUILD=autotools - - compiler: clang - env: BUILD=autotools_install_and_test_examples # Extended builds, different C++ version and build tools - stage: extended build & test @@ -148,6 +146,8 @@ jobs: env: BUILD=autotools - compiler: gcc env: BUILD=makefileworker + - compiler: clang + env: BUILD=autotools_install_and_test_examples # Deploy to github releases - stage: deploy latest From 39878a796d7064de7ade40206e0651d6a6e73230 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 25 May 2020 13:41:03 +0800 Subject: [PATCH 0579/1093] Updated installation instructions --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 175e30dd9..85a5b2580 100644 --- a/README.md +++ b/README.md @@ -23,13 +23,15 @@ You'll need to do the following to get started: Building from source (unix-based, cygwin, MacOSX): -* Download latest version -* autogen.sh -* make a build directory and change to it `mkdir a_build_dir && cd a_build_dir` -* configure `../configure` -* `make` -* `make check` -* You can use `make install` if you want to install CppUTest system-wide +{% highlight bash %} +$ git clone git://github.com/cpputest/cpputest.git +$ cd cpputest_build +$ autoreconf .. -i +$ ../configure +$ make +{% endhighlight %} + +You can use `make install` if you want to install CppUTest system-wide You can also use CMake, which also works for Windows Visual Studio. @@ -61,6 +63,7 @@ TEST(FirstTestGroup, FirstTest) ## Command line switches +* -h help, shows the latest help, including the parameters we've implemented after updating this README page. * -v verbose, print each test name as it runs * -r# repeat the tests some number of times, default is one, default if # is not specified is 2. This is handy if you are experiencing memory leaks related to statics and caches. * -s# random shuffle the test execution order. # is an integer used for seeding the random number generator. # is optional, and if omitted, the seed value is chosen automatically, which results in a different order every time. The seed value is printed to console to make it possible to reproduce a previously generated execution order. Handy for detecting problems related to dependencies between tests. From 223731f999b85a310f1ba6c548c80695a314dd56 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 25 May 2020 13:42:42 +0800 Subject: [PATCH 0580/1093] Highlight bash clearly not working --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 85a5b2580..c3c6af2be 100644 --- a/README.md +++ b/README.md @@ -23,13 +23,11 @@ You'll need to do the following to get started: Building from source (unix-based, cygwin, MacOSX): -{% highlight bash %} -$ git clone git://github.com/cpputest/cpputest.git -$ cd cpputest_build -$ autoreconf .. -i -$ ../configure -$ make -{% endhighlight %} +* git clone git://github.com/cpputest/cpputest.git +* cd cpputest_build +* autoreconf .. -i +* ../configure +* make You can use `make install` if you want to install CppUTest system-wide From bed2f86146086e53e774e2b2ec048398665989fd Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 26 May 2020 15:06:54 +0800 Subject: [PATCH 0581/1093] Removed out of date doc and the docs directory --- docs/WalkThrough_VS21010.docx | Bin 1666898 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/WalkThrough_VS21010.docx diff --git a/docs/WalkThrough_VS21010.docx b/docs/WalkThrough_VS21010.docx deleted file mode 100644 index 1927edb26243f030ab48b3ca6864f074b700d0e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1666898 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 u`O@!8_AwHbqnK{){#XL=z4a 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%0Dfm;e3Y%(#P!yx?r`6}dA3HX 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 z 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

f;g@>IZT4rc+CzW%XT9 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

~pr_-)gm*F0d+*TxNiP4)!$b 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

BgAYlc~bK&r_TTkX2q8y{-)=~Jo#OLc=? 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�PgVU(3 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%0A%6*1N7G~8$P%92gEyGp#+Hcz62-H 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


ok2npJWA%MKD`xx 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 z�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

KzH8VPd{)^*iKw$DcFf2BxYntu7v%7|HVA6?0 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

P%y(y{FQ7RNAp#;ICjZ#x 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

QTN^0GjLf@Q|^$OI0tUxA5 z7PA3%Kz(p{qOlD6YJ9fh_cei_z+u1tuDmuirYSEy6 zdG)bYO73IDZo3&foRoB(39BpHNnK5uQTI%PSs7hG?G(`_vwg{Yj4G8biNDQA3kJf8 zY&%J*)SnlHql{t>nPW&Cu(^P7u!DiB_dc|*qyAwv8)CY_%=4pLEzVfaT6Zo><0Tv; z=>uNi1lRYcq1R6osBb2Q5@FwH+OfyH@bV5Jq`BoSFL~c0b{^*Mv< z>hS3lT*{uuSm_6R{48e_x`Kx7$Ki1LCl39ht^W%m1rtY+(!7x4q74*oMdBE~9fYlk zdZXu^8w&UaL`*FbAi6PJE5-b{)rj`uvV)69j$yVldi+MM*e~(%eL?zl+$f29swr`* zi+Rq8Ek$MX*k0=40bLf(Gx=$o>!2>_r4^+ie`>1<2w{|~0O4vgd?!Y3bac?)k*?oj zmhPTyM7bTIW^m9e_ zF0-Gr;AWR7c;eg#gF(I5e?lPuqkB9W2={SoIYj(h#gEt>@J!Y!^d$d{WZDCf%#;Y_ zRQ*3JQ6PUD_IE7uwov6CPW^API57bLWae%t?tuUOpmrdG0H2>G{!g_F;BEAZ1DupGv}aOu+Jl_bvJ$Un3( zwn!L_Il_F@{h`L$vB1bhDfOHbz3MTtqR}kt2=)L-Lj2FP{UG$Y6)^4H|X&}zjVLg%B1mecE`_siATcV+5*qZ&+xu)Y)|Iw3` zAa;Q36lcKczN242nAX1m_Q0c*8KpR!N$~ zb_gJ=uc|qEK5so)l0f|uOEf)c;S7OvGV@58vlN2 zqTeq~1=JdKkO$cQ0xcE`)o5+BDLWTK!boUgOm6-AF3pBXBwy?H=7ew_HRQf>=Zx*x2Hp3yfB4jTb?KxRb+V6vWu}rdS-biR^-fCPM5t7J z>j15TwT^BkYYYpym#3Uhvk)NUR;AYUsG%HOuFb19y|(5KiLx|pHPqjw8-ZRivvcLT z`Tc%mN8`jm#=P8a!GJi@Ac+MdBK!Bp~9|Uz2(Wmyq zc2ZJO?gpFQXE%IB79`|$Aa>ER~bVOmw!Ibq9{-$qAx%R9Zs`cvZjik{+;iw7`*IMy4b zXVnzZn~RHSgq<>}gr#jgpEz$SW=#?6pd~H^o-DoAqrtu?CFth+eHu2cpUD6l^{&00 zv^M@pO|?_Q`G+>wsUW;5&a&aJE!Q>OZm2O_lh@(C{|IxkQlh4FZZ9q_rlh0{4i0V` z!%T0#PC!3H|DFuO4NV$e|8Xikf*$(%s>6W1rzM3^BziUCv}yt_#eQ6}-nd(3U?8Dw zuJKZv0pU$WSkI|5n!Qg4P0C>VTH!N#$&U?HkSm|ePUqR5t;zZ}C^8Z!nJJJYp)VEs z?dR2D9xrXRdvT0Nl5~&J-reu&y#_x6@kFQsE-4CNL0js@SZmnhO|*|gS5Y%?gmB4! z#6XQjARnVIt|X6ZBh&1L_$;{=FvVg2s8co ztQ3d{iYLLP!uqLaxroAB8p=r;c=^;hRg3F{QG-IjybzogtSD_)QuwKlcWj9YDh0AA zXbk#esYP*L@GqJGqqLtA#J8#5GvK2#nMR!gh+(>?=Itxsa19CuPUO$GDqNy)zmS;x zgt|!u_LMMj=U&ngl`M^&4}Q{kIUMadaIWfNstU0bh(cxnS)R$_RAYLYen-8M54R00 z`OeSYAzUCo)~HVC{Usl1I``VpboC4NTiz>vtD+J0+_kklJ0fqr__97~wYto;C1tBy zojF-*EyCidBRayWje)Ks4gnjT#nWd}Rwz?d?hG=eLBV&m4Tjj2kUWg^I2LF{Iu_zb zmh}2u)C1F)d%A5H6bIr3uOdTYRM*{FG?uxw2*=kfl;s>Iy!2g6J|aXkMG=BXc9TDW zT;8}@WF7`9F|(IK)Ek0O5vibD$R4_nb)_V(;L)g!iAv%zHmWnI#y62g9J3jb1Q73O zg@AP@#2k9`82(LFfZ)-x{QZnQvU)=B=0#gKWCdV4sDXiffB=#LH5CX=EeP7x-D0{gbtVAe0~WM?s1)ki0@&t z`wpRb%(R(KJ<4O`o99p2t>7l+9|o8MP-shQq3$J!`kV$VpMQ{cdN@Hg7rpPII|{$RVO~9=&5MJy&Y^zolxKHUty;ibTo<>w2`P;PLJHESTRsPbhV^sdV~I&gI5>jgI5({h5>@H`)fR2RAV?E?=jX;E&} z{5^R{-5ty@@A<9YJiMn<0nJ}Rgk(y5r?+{8(3KCEBOlFzjy0f1dCbx?r%7>==d_zW z_Mkf&=sWSkyZ2Hp8?cf?W|e_7kp+5klSs{DTpMGCfk1~#B z!WrJOtV!9<(rNKTTy9faIqz{*bw!BM|A6f2GJ}2-jsetZ90(A{3|>Wz(5?-}%|_!G zO0#HC4p^bz-((YG`}G-*=N$R;*;wjOn*{4Jkn_~vtkI#-q6?KH9*b%EnU0TKDqCvN z{*Buh#=u~XM{Iqj#mSwc~?G6yH`&k$r< zmBToKsBx$9t6j8{@$>=hd%<;Bz=j(r8Qf+Q*?5v<5iDo_G6Zk(_~U^PUA%bAzYzaWi{FHs}l}- zQlDh#JN7-3RS$ijw;rMkcmv6p6u32uM_Og{NC zR{V)^gFDT`AW&m9DAC&tpsCpH40qvaaJ)X^v6!z+WHAb`atGAh)vL{MxNLunMR+*4 z55^+rg&Dt5vbz%_d)^XSTc|iuonVQ+X3=P%#Uk+G5Saa?jBhjiVGUdL%~`~@%?Ozf&TBf=!_3fQs4XD-fw$_RvFc4DlDKZ}`cG}ECB>IPyOC$R=ce`I+4C_i7|cW_fi0WF`hov}iHOts6-U44%M)NO zT`W{v;CXOl=YM!EX85obP%77E=S;Dt7QdiJ%nP+_XuNXsoCKB2{C0eZmP4)kJuczU z(N*v-MDu`5BCV6QBSW<%&mzZ2r3<9%Au2+yF9l2C{@w$Qli7^TR`?N-9l+TB)=YzV z8wGrD;~<3p_z177-vxm!Mswn&+3WnA`fH)gj2Eah7}ck$nomk#mI%4?J}h#*_@r9avz!Ep84{qr;*#HHO4W8*y3=|YUCIjB=Ljt#`==H z7*xhkT(B4D(no(t6vZ(M}9Y3NrG3MH)6zZjIw%htwkv5+SF`>G0m z{1D?GsJaM`iaUQ$cdab@3;StZDsXa|&}rteMj=;*D_54+bw>g(sE4(LyK>Ne^OTF~ zKO<@MHYisQhQ!ZcHFw`y34(n+)~$JX#3Ali;riG-)grj^SH_)$QQ0er>Gols`}f5@ zS2(tz(|h4Olkv1@$zw1{Y#j9_9a$mkd-WQ~^^2w}L)#6TgQ_w0*+Qp&jq;L3v$RkR zTFzB#Eq7VX+k(PZo>oIzR!1Kr!}PW4teNeZMI4rcY@)_UK~N+kqvN*1T(HJP*Wvf` zmXuiUKvhRk(TV=2Il!XKrN_KZ`Gb>?LY^rMPEAeyPWl}fFavxTk<_S|nOe+R>nf{q zMBiVq++&lpjx`~Mb=vX^$?Sgn6|*nQDfIs3ZFWVnf`@5{L>0NnrYfRzCACHwGdpjK z4a@RU-h1@%N2>F4ur}T;YSZ$ls=1?G4>@12jenQnhHLq$60iIIj~gWq*GU&qmy`4U zQ=NImj@d?h*;pA$lW0Mm+=W(Yj-&ojOdm0eTGA{0&Y=EZ3oV3eILt7@56>qx8oVw; zq8u&HO?YVyyYqEe;i-J<^DRNfMkN7Jhz-vGn~bLGr`O2v@V2P{kI3LZw)Y$K-$wi= zy`BgHWepqA3iTd>IlZEZxWX!CZ@I7_W{Ikq9e~q$2QA&%6_~#_Hf#Uia+o+S~*3GSX0%qDYZO?yLkIv>SvZ{q|pD;Y9 z2Q@^QJ$Fif?hKcjl!`{>U^xqp^KujpG{f=2oKH36|1`H5^a*vY0)?TNHYjRzW?pRyszj>AYlj7 zI!@rvpgrt*hRbn#3^%$f>O8+0k?W?zUksj!a7`z6bWAr~8 z_cz6H3vQNrJKidZE=rIF&3a4Vc--CDAjrrnzqT-Z(D_O zqMH1fG0j!l(4WJWJPBy}nu(fhY$o8SC))cY5bM5iU0{feNGpB&%-AwgBGf3+aU)ip zw_&P+w?M`vI#}(wM|GLa<`7T%PiM)wAl$kJ8Mnz>><_ixK~EMsX6ER6h9<11yPEP+ zTx?3!#wjL^{27Ej31UAzWMMK5`=bJM+jrHe14J!ra|GA0BPnNtuNR(ATQ}wnWfvX# z-$fFM80<1vWN@-daQ>Iw>nhvs9B7&-amLn&%sB3_H5gjZdpNhj4Z^?u(*OMOM1U#caC-9{-4ZwMVr}L5bQZ)m ze-z30xXi^uUw@fsWWHIt=msUG?=apqATufougl(w>T4Md2lmelYj%anw8%d z)CxFOWJnz45dTiXGYPe)BT7&UoNN@*($Nir7hH6R1+ig9gp%kWDUz3UL_FmDA=jRIkf#hEn zPvyIggIk6N0;85VJQmr;PsQj1JDy&L5jlKt@38IfR*W2S0q23gKM7TM{k=L+#UXJVtL=4l6GkIWxCC9c zanoEF;UyLcVTRX};C}_4vN&{G(C!m4AB`{-kc`cJp$>MHtc3 z(>(g%lYz`4-0aZQ>4jm!qw*9{B#A=B=zym-^S04a^Zb52nW7?+B}YH}i7hdsu!y1Y ztmW`V_;^pFiKEYe*So=G@_SAGwk_G$Vm>L|`a&+Ft3v5W=^|i?@S)dN6U*PQ4QKt2 zhE5UT$WsJQAJ9wA(!v}9-l!uXPCVX4S-(2`efE+;s1w<-M6r9FKNm~xpv=UVz`w({ zzprb$roZMfOU@%Wx8FKsl9ghx0*imSt7tELADTMaqCBzgORvo+m&^wPnDyX39?pI^y7n($4e2ujA?bsbx%9ZzlC z&(`2k<$Y3#uQAuO5+bipXZg&|bb4v$s`$L}$wX>uf1zTexGDK5H&%FjG|SMAegWNOj@$a_Y0IeQT|XkO z@3~mYv}#HCsgj&Xj>MXKZ)_uP_S5c%#{9Y1g_ zP%^lSlyWs;zdw&Q?J6*;O>1RNppoY$iw8!d7(!?NA1;7(gHlUwb@lUP`wFIp$Ia`R zA>>Y`jt1Hgz=K-TkNCo5^&7-LKT&i4xD$yp6(+Cz+^&9%a&!8kN87;->4PQ>-}`y3 zA+1C)cC%gs9h42yKMY(N>5_I16+(Yc+$=K9@)(0(s$V+ptYp;*HawKHe)VZ{2FxZw zybNtC7CuH{m#s5xxBI^(&mlG8i{jfoM}dA=k>O+- zN}ZNFCt6j_Wn*yC$k3!ah)V8(KczE>@5;{1Ge^hfJ1gC7=Ddc?#JF%DVCAFEc5gD1 zylWI1i;9AtkegedWo>wO-Zbu2tapSu2cHz3`93ST-MQ`XeKa9w11z699fD9Hmdx}Q zswfI|rt8iuRZz5`9)O!P!U|lz+rAZM4qN(=jsbqk|biVD?Dbuzl+aXJi83D4)P?05jKw?sc!sohHV>ahy;m^*XM9J z`k}$DW}Fg+6dQ_xB%z|BA-{;_+P$G5Cr3%)Jj;5MA7tO8=P`?h1WRyzM?HWj@CGlC zek4Q~<*b)MovOuO^qqL?hb8hXvM+)GO3*h@6i+QY2@I<0>=Y_lQp%MB6n-}PsCF4~ z(sQVu-^bBU-1qV>Q4W>mn--0S6r$WHtS=-8W_o;)o zx;@W~O$?%PEeJd{KlD7K?d2adhaB&&w_Si#8e&q&crAUmuEOTn)LTST8T|N*o_AyR zDAb6Ww0`9Rj;g;5%A#Z+F9iH7uXXi7C*V8=Eys%u0&d5CYeQ0bi&UG+ePa(_b*}s_ zEu3gELu{`FBs*-b?^y9gbc#HteyTt3^n^N+BHBNclQ>7usC9aSU)T2u{zBwzhY}x! z@BUH+jCD+acg*0H6qZR&O`yu=zWT3li^=kBE#W0hlXFdPfp0^(h7n6UzLg9#_bcMh zH$VU&+yw-f`XV0%Jsfao=Bc--3UejmLROwD&1LYfFD0Va%9CSWZI*xOdk&;2-Io1i zgpolzbA8uX%xwWrE49Xl!+W%$ z9p6;CZJ;-u(cW?#3)G;cn{H@0ayTEAWvEZ2p?M5mI#FdfU+D*ETVmqJ=i;L0iiN9} zrg8q}1`Byx3a{9cCV!{*_v-^URNAaFPH00I{mYo&)a$Li>jmKv$rh;qnJWQ}}+J3wT7 zc#bX}LigR<7Z%nAl~ZA!&1Su`&TeP@$efo6K;vE(Q12otkV(5T$w_{yi-%PDkM9%~$Ls=VyzT@ILQ23D{_y zT$}*RK{`i6%N2gNnc|}t6}9K#P?W$GAHVo_2jNLet~mbjU`Nl0>IEA%ObbetNN9=H zh~Fq13kyp{dHJcive?$f4J$`=#*M4M%e{n1dVS{5IV~JH%WtG@*vq1P~+%PcnvRwS_{AKRR%1RkwaQ_y`FL3+f+)5%NWzEaj#vg%+{w zmpODZ@kN|WHF(_+_81x%xXATL2EyvHm)wOq`sv9xo^rqhS7S{74XpXZlMs7)#skmc zwOrIhuKSp_9lr-t6e9=;3?u%moDBVH2dMx~GRX=CDG4c^M*j`%R~*$N9)lW-9U2b_ z^VGHeLE{ys2KgTPsD931TsUmuP}UFEel&Tg9M=_#3iRddaZE_l+g)vH1{M|nlm+el z?)|pAp4YORs6vjl~L>v>Y2U$BjLZQZ~2gFk^6#uI3>m``PE6Mt&N4?K(b z1=#YwiHF&j8=enRPg`hkt8q3nPPDB-N}r|fKwW<4kf2sT3Q6wk6vo0zFh^IEyl1Bo z&NhK5`?rS>8E*bji$g)iP(5`6XA%QM$jkfWf>OXy>$Q{YF*hxy8nyxlgx z(x$3Y$EOJan%Bzvh-6ZH)W6+#XxLpfRaw}sLWOcBa^KG15jF+X3PcUevwrY}sQ_qA z0l5&e^Ftj)1^jrF6qJn-I#xRici*6Q4Cc*1j-KNz^qTc=CdqHF7!E>{ut4NHC+OV| z%WZcXazO9VA>9hI=HNo`!F4OO7%i8?a)t6_jgnc^FCeTIRaWI?XC!v6JicGB*>@dG z;8OJur1v%`%{!(y-xHn4?()6rcj&Kvtqfi-lzGAa#PQ`SuHpW)@%PH9QC!TzDFF;> zap))bi5mi)xI%<~9L5NW48L+$CEv>j@D=R_SC8Im>v&izLyu;FcoI@l$KP>m0OyYJ zwvO);mJNCWPa#~?QQ_&b{R^%DcrS*K^^8is#hP$e0U<0}T`QI8J zVri&QY#KWb&A#0RYRCKUN&0)LTp&S;i`a2K^V<_c$p&!$dn+d3QB>gOa32){Uj4s& zLyn3GfzcV3C8jtS=cQYwPx7z(eC)|GLbt`b2Hg^VERe4{|9g~#(7$9Q@^6pEI{!}v zgCp48G91&*=cTR7-R+DClfXcze-oA@tRP)C{R!iue?oo4gkl+YbLDioEPm|KOhSo7 zJUbjhMd8cTa%ExTj#oWeT5xSQR+7n#yuj?6qMlGzt zfC?A$fe9TQjx*6)7J1m;i~48FJ5^@wi=m~*^TQ zEwjK(?%hneJ@^t2axi_`jhB+Dh?-$K;rG65Yz{!YU}$1>M9y_?YvOeE56Bk<10AM| z1*{7bL2u#D;*iA&D{w3kss%h>)HP>}dH{Q~zOv6;AEzfJ0{RarOF|javun`MYmXaZ z+;9=#)SM)2(6dBf@*AFo!n^k}|G?>Uypn})u{|Oz0$H8?BIqJ>GO7CQx#0;sb+KE_ z8ySFtSB=o%j)WQQexo7n5gUI4bv~7pqXs32qpRgDmFaIyAOyv9VVh_P*ZW?N{SLoQ zO-}+p%*gv{^N)_2(k=D%T31&{4NgbLHiu^f+y)3`VdGi=HK~L*YJ~UCsE+#zS}O$D z*PjtXP@ZaGiWTsh>n{qd9)vBqIZjPZ zuJa2JuIUHpDB+EWidan?LU!`?W$RqOm#cCYBF2a&5!U_wdMv2ik{iPUuTUIvPm=hS z&Tj_2zpA@N#a`iC5lkUifGDeCO-y0|?Al)@|cXv0664DJ0-8pm&Qqn3Z zQYzijAR$PnbVzqdciw}j|L=G2T9-quGbi8J?~do$TMu{^Hfex|ELS#cg@dCi(v@FE zvuO%gPFLEuuYD5ocD8pf*D)P3CYrzu+7^k7x;2>kmdF%5@!ZU>MN-0PzHmkShK1 z@3@w91<1{*G~bV6s1_y){u+5Mni)~rJGy3(tRkHk>*LF4Yh)DMNy6Y5#3cN(<&ngU++Z0~Rceoq2C%S$KksLaSF|FF4<$n7uX*W_Tv) z7G7p!qamTMs!FMp*S2f9g4MXdgyRGQ{h$VR>;B1@d~zl;)G&N5Zv8BE&YYh8-e64V zIQy9O#jvScoCg@t|Kj-g$l;ui8NubbUnc2f3c#Bd1p2IzacEhoZ%%C{vEUh08dplh z*RQu~ul1`g#j2`K{5YDxU6>ZvgJS^%h+nb#u;tBHFj2@D)dW>8T9N>44?fqxYDKWR z9(gMd*)g}l0zO^#v~+SF>&VlNf+6eYg*qY#UadAxpIVEA8@x}BU(VLie{OYq7Hh zVBa;@C%7%KJT+4)CjzPu{@n&mX7*F@aTqR6YG z6|W9?vUG0dR*aENllFE{zx{Y4`4K?XGF(0`yCI<8-#Xk97rQdvPsOb!Sf9U(Tn^0`&ryGVcT|}4^=P3n_O^iDqpBf`T#95;Liv$3rL;`mIt%^X z^4D#O_72xcVR%?lL6#uy?@fJ+6s?`80%~C1rJSh>K#8!^GtL6(P=74{!P-Q8V4v@g zC+{%S%lW<(YmN()2z|>Ry=9TDk<8aC%@q8DJ2Ea%1~AT~ej8_n2gGv;`$9;*?cs~6 zxv4%$-7ot6#07(C!=&KypHrTv2jq*9oTei@Ll7l5?u-or*XgMjg4zVP{xg zZDnWJPCxO=UBJgXwA44cx{MoFou`!kuu3Aul$4cGRaE^8`!%$76)-(}YG2xQgD!Sm z0E-RuB5vCypL{JzvxNT`|MutbPXJPyXlzjA+jmYkL6Hf2_98~-lcn#JSu#G|#~i`n zvF;An3$N|PYyuLHRuDW(Uo<}#OLOOuLF*ZrFoH-Pf$`hG3S?x$vTPInMwWxH^1?2< zN*8D6@}QxehCXA~@9Xfq7osd5As1TaDL^V>EFRbiAa65;|M_BQ=%ZN;p!jW$N{0CV zm!PD;IO`Nc$3Z?_=Ina%W4g4)&sE`Iyz#23SV-?x=eJoAZvukdi_;n5pUIzdEbgFb zx-w1qx0z>yr2%@iDL1wVZzMG;Q15ViVSy$ACNxFBdEb%JoZsdfC*inZb4rxND1N($ zq~TYl>wx0*o04StQYn-5XB86ZXSq1D|Lv~ep4Im&6mfE{^x z>D`#|Yr3joHBlenA0480?zTV8tRDB<6|!vYDJ=Edf&_RCgydR@*Q{Aj9&G+l`8oH^ zGK2ZFW1r8reC*~V%TaXqQ59W9fD(FsD%BfvGoFFkxF9zO4I|B$yeJ)oH_4aO!F6_7 z**+{>WG@T*CTqZy z1XSQ%Tl2?SPm9d_-P7VX2@2Ut=!*32Qb7}m~Vc{fk(ASF~}Li{^|mz zSedaxXo{?Fdk_}D@@M5AF}Z7+vc9d0Zyk->rVE=bL1<6rY+_5lEg#*TFIhV&xkn*e z90Y7SVu+%mv(>l~MBW9PDVsC*pBff*IO1T>+MyFXKsP91*KsmmLUyZGyJ(^BNoqQO z6&JgLQB3?A^=$<|BH~pv%*`%{Y@PCZ`bkSJ@7FH6Yq?AXblQbm5GPaZVK9!vJ*8u- z?s2Mqxwdm(8vggU6#&}rn_6&!tExiZYdSMJ`BC3Ezgtjx=DYu`>HXH$bivjuq(VPS z&!&R&oa&tVlAQXjp&vz5BnU?e6n+T0tiD|?sX}!up?KZM-Ek-&>L?*Hz^D@E69jm4 zzwdyY1O#MjKkKl|p=f9~42m8V(I{-iYSil9Dzj?CCiXoVyDcz{3M)Ds>_DxLm1s2dKYRlhd2 zZ+C;l0s=OE1w#^}|Anw=lLJ|tYPi4>dC9oGnv=dtxRN?@=Bwj03J}NnrbnhdrOgvJ zGmeJF0gbsXM>$H4TYd|Tr&rCzw-z(IrA<0Vy9MrSv&7SX5eztra)5%3#>Ym@=M@*Y zj4XP*PYmUXcKNv=NcqpJ(|#RT)h6!M?W zprwN*uxQ_2&ELsSP-0I5F~w}9By1Y_m6a7*bIU0v94j%npRsi(Iu(CwJ}A1tt*86! zrdX!u_pSm_Kc|Hj=#x21NGyV028>@{@!$uxKd&eG1#4p{tBo$nz~%mL7-j}!+Pbc; zE+r+Udsyi772wna2JEoGV+g>r{B5}6NWpv~lDIvHeZc)ECCHh^h1<69ze|Ae_g7ma zHn>PCN(#Su$_=-7y?#Wyjot9u)^?_WQE`=$g8l6JlXVyiMKBTuzoMdqL1E-2fPDJKSkuf*4(b^JSP@{9dT-dF`!A6Y%o-b&KkpG#A}nyj48YQ*QFD+tklInQ9a ziYh<~l;aa`)}ZYfO3E{-8+yB|1AL=(m!~)!gsrr3b z@s7-8rk^#hB6ayKU3fUwZu!#Y%<*`H2x#N4^89;E;d{hJSYaO*Kb?tc?-GL1 zcao{Yv)@Ihg1K9J9)^asQs6v|wa=!|el4&t#jq%o{DT<+R|0%N%od%7FEGOYdPIQ9 zL|KCHQnQa{kjwxwr~yujs{qf8*Fw0Xqf>&ov0hYIkI<(n4k^(v;qhdoahe7_?)i}c zq>xGL@D*~qZ)+!E*pajF5v0C@HX={_wMNau>&bFwK%`#p{TrC0V&?CnN+g&&S0HC*{+ zGFSWou7fV;UKTA0Zo@z7&2K?e(vu*1spz~`cTgV1_Q{=|%7iXVkm3`#G)mgnx;y=OV#=cJ{2 z&dojV830e-o79w<5hOq&vFv^x_-Qz=P%`>%GaL2x;C&CT(*EbLlm(0u<7RR- zg5E?n7A7Vxh+OP9NySh@!mM1)xJLytPBL`stE>6v(XFkmPOOu<7XJWaFesmep@IO* z3jym}WX5eOcG#{mzr~zTBN|7u$c~Sv_}O*j2`_Eci!rQzCr%j^#~T-(h<>l75Df*8 z(w(6m!T^*>Jtvb5*+7(38;O4gR+H!>aR4_yKE9L}&864v^@Rc6B&+am?FLHAfc4`{ z@oj9#EDaO^Cw#{6OP0f;#CQ^n^sV$stA13u9G-4g0d1V33!gns-^Im+H)g`HrtQ_s zy=oWQZOHzM5U-Z)A`Q=-=R*&<0VQp5IsIZQAxM+tD1t$fU{HlP2)~k~ePcmFtDGRO z!EZ*pE*C=%$Z2?Z<6?eb$#Vfx*D{fSyM*C@ICeVIXk@C1Z~i z5!@l#AAyul+!#N-d^6Ur*8s5(A2OpsN8TP{xx@M%wP9&afQm3?Bk@%>XWG9+7j+XR z1N;xHrlPpw-zh^JlJf2JtF zj0l(9?`h6^m8_o^!290?ToSJMiR47vWfSr-R}K9gDZ%wzQOKfc~|>=uD=l_McX0}wV!r8smUFKT=bRv%5uWbYfZ zc4&uc3Rbu$P(Kck6fH3@{;J}hwbQ$-_k@K9c4#3&yr@$iNh|_yAN_x2DI5Y(!neBL zv-IDpl?CW3VISLEfgQD3Xm9>v0sehX+meSi@LNOuE%qd!j@9-TFWUkNG065ke{RCi z@$j%TY;)Z_N}moGigP34=p@2`?L7el#MewEos`h&f@zv7U!yxRV%%{|{%61ac5y)n z2E@enB4i^a;0ewvjJmH!y(*4G0rvAver$3w$&eR$L<9-|{=%dCEnTVrFB-{*Bxx~A zZTe0`rMDv)y?M!GPJH?f$kE~!5o?K`Kvk;)Q&aK1 zY9rv^%Aukwoc*+!xuwT&t5zR!N1%sL@d~$vqM@N7fC;uO7}Ohy3oFHwe@hpyocmRA-exSivT0_vt_u2 zcZ{&RrM0xTGKH&jS;gOof#M6e_}C}jrjy0NIN|ORYj4&u=F07DeZyd0v6=EWrP}@BYL=rZ+hf!!cmpCvg#~UnXiRf7u?f5k*^;NQSlcE|40l@MR2*f+1bTP|Y3b zo@0wEC_1+&e<4kQYSgh#^Cz)6>z(do1IzWxet&g&Q&TDao(A!>8%g z0drry7AtWqQig|LxXBA(To}E0@o{48NJbyELdS|m^kIr(5yGk2YE_nOVGwb`Z1$%L zDA+So;V(rPRXE0s3rsMT zY#FaxKQd^#)2d>le`|s-Rac*Y0d)W(TmE%XD4KC;L_pxBK?9_i9L`jmyo&x=a^^>- zI92)m7ntReaC0v;B|S)4&Z>K4@hhAw(=#$kBeGzC`m=)Q%VTQJB%b^Ps9*M43cIQ9 zp`?;uQLayGn#W|8HQy3PJKfPr#2ti-X1*QBK^adWI~1+0JyA_E`~w_$a==p0yR_0r`4odlvYi7D6=boS&EM%XD}1{l&5Kw=r7x==Py zx|OUku%}ZgUiPw=qd6GvcJ8bxci2;29OGK`HTSu)*LHD@2L4JOd;rmg#d3mGD5^@X z7*w9Z)j+mldO`YV>%~NvsY7aJMk&-7bJNV0RZH_!EcRU70gpyX;52a63yq0Q0QLIW=rlVl& z2g9XUyVR&qt62DABk_3C8&O9qQ{y619xN)#lgwM4 zqu>oP-<&VU7FKS-{p>!Mzgmjq&~OjNCTR%eAWN2x5i(^ZP}XBQoZS2o1V&EQEN>UP z>kE;NrO4_iX!)$4OL+`e-sO!kyoD!CkM%0+Wem128gZk^oJ<$gVcf3|c~MeMlvE~# ztvF;iwqlUl3@*TQo0_PV@PJ6l$TCl*>J}5l7iZB!_~yOz4{BT_>BKj$w-&FGH5-_V zh-W6h^+yd*jy@A``1ze?gL#8Y9%&~iwf{8Dk4Z@Q{*4u-;d;zT4LjKzM@x~6{7y8j z4CrLsUv+)m`O+J2{&{R_u`O)yJ>T~2)n2Dkf>tip7vGWR0{N}`lFLN}F|A$K-75av zt~ojk}B&;Nug*(4?9ZmI(pKl58(XN%>F^bF8FkS4;$ zT!JG%w0-H8e$bLOWhjI8um#65$wr12--pU5X9!4sm4Dg};&{vU5{bfqyi|aPW?;sm zM$y>%Av-c0j;BIn(ON^%J#6*w+jt0nN-uo;wDd zuD-sWUGHbj(A?AYAbtiTpZk*n!~RY83!p z&`GTX$`8;fCECpmwbZU0r=x=WcoE!wjCq#sSoM`D+hPZLTwLDW5JN8V3kqzC`KJKd zDX<&|;v&2KS9wfx5)ukUz#hux@#{mWhg;-}G(q!BVoGZJ)c)dObVMU;ZEZPmynSyY zY#_*@NJ$U(lvkar6QMktrEt>R;d)~DgY|E@33?J}OcC?72&5r>?>|KFF^fK=;ovr6 z{W~Cm>p9Z_3fb+TkK??q%e$>%($j{lXi<;-pn$Is>G|6%k!HYAa3Imh`{8ZYFTqXL z6_>b|O()~}TrEfxzC$j_z>;AMsKJ?1uc9p3c-RURl8AF|03C=B4==fa(C|}{-0!iE z^&WyUEBO7mxGjC!DmZ#%sqV8!m#T#iP_T{Qd)Lnzmu_y>lFqfY#f1kU)QIY(P? zHUhU9OAZp}1T_)zhj#2~sD743L zi4Z4(ex~IDLtbYwCj0iP#_)2u0E5G59|D z-HIl(oPL*XC(wKenob?ci{^z%nS0SX36de}Xlh>phf*P^NtOYgit$32z8Zh?^`TPf#7u*S<5$_2HHXQ5DbK~IA=R+l8QXm8y>4ub81b8+goOwN3~TDq zUw}@g=^k)ekwK+!*CS~Gfk5yqbVC3$^ckgAJ6fb`x~J4@F!CzyReCUpE)Dy$^Fd?}Q6_UUg{{y$fO_jdha>B~lnaexmHWMZy4ajh!xc^}IaN=4`l*~H% zACdZ6X=`YhWFh#>;Qa5QP0J zlAqmMJB?>^k-^?tLOhlO8WJs==5ev06HvUhZ$6=F$cehtIG`JZ4K6Wc_;NEatRHkz zXkU(fDVtLPhyCK#T$h>Q!ju|Ydhq!MDrW)$3R85yrPTj~#g}ZspKfi?>kCkRE&P3; zf189(I8zL97PhzQVb4U;2?eKO-8;>5Ze=#(OX)axA{N9&clow8EX!rj_f?+=A-*6U z@!R+aKR|B^#UOiJQ|P}y$4zBZ?(+zT@$@^cN+23eVoFbpw^qBxlh2y&wQ9BBebLa?$K*dGs-~6IJ1pMSCVk~a+1cUmcB@JWlv28J_tSkVo)+XJiMqKrBu8q zR8&JVKz6-$MQY^bz+TcmkS0RLFN_iP+q;m7k8HyB7&2J9wDn|5BpYAP43`$rQnVTm zc@u;4jqOHtC^O459G{7=X@tGSxtZ|mWBT#8S~jH@@=)go(TO0jC+ zm^eurEaZqz)wGX&W7#oA8~wnW{LBRFoBMgQOUMo3J%=0AP~3sx3}D%aBa1P7{W#Iw*AqWKFiMP`3!K zt<;nEpLWbRRW1Y^*1HWjRMVn9SYmOKSkN|wf^pw#lyYFtcjXp}&SwIyJB<3RK{Lyt z1_OP4ydCK^vNDwqvVDOQ?)-#kp3*2|&~$mpNfAh_N1}bJ_Kt1^E_j5I$3; z;jde=2?IFXZYH#v$m(GR-v-j4m~DItTGy3mrPu`5OnIQtahMkP(SO^vku1NCGzLoCD9Jeu1=}h-E;w0AesasHF)$?6~vx zRTu_H*muKeY>`HxFh(n^th&JWpcj?m8~kgm_9dUk{bb^`6qpI&r3c|fzpgJM2}pdB zWt1KvV`D4TwQ|XsOD@dmx{TaAh|1oCdf)DrS={nhAs{4tU7#pU8>*2Y?|E;|Wg#!S z02oEhXLCN9_=+p{P75LM3iO#6!?V;kiI^j-kq=`4fXtJ3y78TDS-D3G;R+4e6!s9} ze+aP7@MkDYii>5o*PUa>9d`0uOlF_0pTRHdRY;(Sxe1w_8oE#uATfiSG?Z>4NY@a} zS9srnp;+_mLSuT*BD}7uOI=jR3WgXPw>6%D2>(RLJ`2G%WCz>M>6_w3#yP0v86lPR z@8Xn?d$i<@SR!*VS$M`Tg8fZ@ywi@UGg5eDd32s(RA4k`c&ZaOq3gl$De!4wt7nt% zXaZexMm}L#<*SN!4r$zgqa-gTxZKcu$hUe2h_xm)1y=MlF^9%vtt--$+ixdQzUs(X zJPO_O{q{9%O_VB%_7^P0KH#hYJUi%IEkOFbC?aUE3)F1@)C+fK3Qc;XcPk!&{}K_>DS|&G5e#SzC$)MtL>SdNKmcsX9>@G_VPn zon?lfF6UwDzp>AHf8gddj>c0yj^1VtB{cdZoasSsC~R&8EkCjlk@u)A=P9$({UIv9 zl6L@?RDLInpd=y~xodwe`%_KlM7^d@R`6cSvw{ga1cE)mOQY>vm8DNvX7gLwq}>n+ zqPX=qtSv3KlTs5RLRQdU^yS%#qvFRPDQ6|vcFZCh3l6Kc)MJP5P`#}4E%#R=`oK}`d1=xe#1v~C zhut8rMrg>#tO1rA%li_QhvW8Ti*p(Wh}BUlOIa}|1gs3*ioe)RjkWl-p^4RA4&Jtn zTYmaAG|$R`PF5LNx+`1iAQ4nP) z(?4BaNEBaM`drqMS;Cl5nQe?Wi0im@!$#IdH%RQIV-Uf^3iTo+Fq>O`oozY!P3$>BmvOiSpJbk?Sg}hy#|V)u)ocxQ zqRfTgtFGkUZA7QX{x8kv*_qo))aZ79+2qS7m>)mp8edzm6HN8+ZzRTCb;sDME}tEO zMBy)*gknj!oJ&@a!Eiar%u;?$JZ{|!TxCqQrpJ00OKd~*?ORV?gpni(c8j+n{IJyX zm<*@Lh&Pg6H+aLBJraOgMs}pg>N+G7%=+n_>egj7c_LkON`ZA12+L38?xWKC;$a)a zGB-@y!-Y$^$bEtBtd1-Z7*jIuRf?cwHAyy*h8nR=6-6KOylVx4v`3)jLkQ|c2uwT| z|Jzp%^3ovcz^ROC5L`T+w7>aK$oX(s8IOWEWjHaS23CmPOjv^Je(}dL@<-9WeybUE zU+3IR+UIOL5&{y*cu1u>hw`>UBZ&9~3gn^n7O7ZO;i8FPH2lHLX>?Ns-OxNuCCq~t z7r^k)2uNuudTgsEA9XV!0-BETGU!7I`<*x`R{YXR^@qguB4%4D5uvhQqO}@at?6bs z>L8GQeG@a4;1|^&m=Y};Y|YHgn#di-UC#LVFbXj57D=D!ajSWt>H8jUiVW@e$4pbQ z(33(nOGU-N9carOY~mS?!=InTzwCx&Pg49@$Q6lT=MY2?yk%{Jb&d!>QmY6B0x%bN zcIq%dmHGYcOc^&YuxxRV-}sL06W{ydUN{T@-M$kT*+unNMd5_Kjt6~cpWwpcM6&EO ziPBV${jIW9^z{`@UtXR*nN@%Q#Lj!0`Uwi)UvgNEr2WO!AP3j|6hNlvmPYMpPk>|m z?j-PyE>YfIGMC>6{b=JpBTy#A3a#m=ygiMXrG{!y14%$ewR@MhChIJ1etr_k7y9yW zUrZETtP!$jOFs$U{};(X302Ue-LnF}+!6BTI z34WG1r4V&n7+RDGE5x7>(sQpAmbI<*<0Xe68X27A3}ZK^vu%@h*waKpCZ~00#YsHk_@L zIf47%JpOX`_x>dJSxOwM9d}0@v4o+rNe;96p9Jh)A?V%1_qGo$Z2ue>_a1?p+W%fp>|*v%fdl{d%rPfe>Kezd|{p55;b%L_-a zLWu62gza@8)i)FNx_2K9R+*?g$Qeb-0|W#9*2#g+B5E$T32vhT-pbM!^`sNU;|k^} z`2*5fBzz@CFS>gcLuOCtA^taVz|s{)XawfBWw(1YUAN6uZxCuL+7*K{Wd%1oJ|+<* zsh^5k2>S>?`VGNOhJ}pnH9bO=S`K28LAnla-K_Sa?6ZCj07xC4PuoTQF$dnJ1*UOB ztjAyIVRpB)WHPZx6iP~Ot&#U|*&Pd~@~}BG;+GW2Ft)K6xYs%_nn03vop83LMcqs* zZsr&wU~oo*lBV-sCy+6^BYT7!A{#fB7@GEyulX|=f5cLDHs{I1^hP>eI9t8L%mcX4@5!qGOqDkeKrXjYgc@_PFJ_pW(ZIl9 zzI`GqrI7|k`ZJOM&_guL?pv|}u{+PC9jyjxySx*WBJb5rVjc^k0PBMb-*@!SKLUuu zQbhf~)FfKE{pp^Xca@eq1Squez$}qIsBr!(7D?dT$Qk;xO%&e7z-Zsn&C;2M{ks+L z&)bN50cVH-`A<SrKbCB?$DJbu4K-1Eh}b?{Bzg9MTO zcLQ-D#Za;W1n3{-N`n*zPH*dTqz3N+Er9nyfYAeB@(i-wm4+6t`5IlUgy3t2TDvTO z{&#a41?^vO^HczdW=iUhkMDbB;zSDhK9k;2QN=+0QUps7-cf;OVfF4wJ?WM~ZQ~Pp zi`)`103%MDOpi1G`@dUmKa^eUYx<)k7T2!KW%j1?rOY%=psX&wKE+X_qr=cwqu2?6 zlB?l8y?w-qjb)iPjioH9OD=qQHY>HCLW+ap=}z!xC>LPQ^s1n?9@ldj2(MOH2}D<-fNH6pDlL z`LO@$BwW?GOtwGk>Dq<-{Lyx0fMa^fMO|#g{T$;1{Qqs6oJh)B6NMhy#*j{a;-{GT zh3P$mMj2X~v-|d%9c!g$Is=P4MW5ik%|-0G#@w6i8)EHdT=8TuEa&u$Oo3OIn7@R> zKi5wBDF5H*h|_Y-)Ei@P+2mYtS}R_qkgFEA=-?8#(pDTYwqPx_AQFm$Ux)d<1;Vej zWY3Fb6&0Z^5+zPw6J4ce^=hi{f+nE zBi}#x=O3WBkCV=~=3JC?XKcLbBVnNNtBJK(Du4wW4u)JzAYS?!<*d$xf<`-${&VNH z^_H{2T|XdeB!#%|q`Xx7hnvgd*;0Rb-HVKr!uhXWanESZn!ep?r>;jaCSRtlpGtT> z>5Jy$3TzK(zC9_`_GMg7MxUl9mr3-yEwvlqED$`IM`qxDcNv#D<|08pAZXFe|KS`z zQEem+)b)29Q>LxMl=v%MBx_5um!_6`XNYRW`e!XHDexCo%cg#r!mlCt%ISU5ge2e5 zh-sshx?bJ$x~Z-|*5GHONgEztp5GPuSz|r5H&Ex=T`gHK8`k&3PP_Xi zc~dhXuZwD*-KACmI`O`l-uX}W<_QG~uHBRP!!XER%m+IA&2d|Qwc4sUT=fJKRNNMQt(>W|0>_GAyhQbw1h98|d-B7Fg+R1^OsN9;*Y*kBp zV!|O^fxMGd1UCl9lGuH=3;LfS@j(D-G<@me>*^RCg|SZvdy=X5g88RG9ql^0p{~N3 zj7GELu;?J+^yuyCoi&^I=oBP;PK2~=35NigH7fAR2cg@aZ(NT}Wn2Z=ta`$~IOf_RMW`%F)i)PQ2_DB}%{n6`x`A$e=uxY z(o*mp_7V_h}UgP2WX<8ImL%`yfDoTqOgQ zede&i(=0-&H;UDXFBn5qv7Wv;HN&#TNR(Db{^-dVB%nk>lN`+_7nk|`{mZCf#~Vne z^IHFo=zNpA$LZd;rn5%Jri-TetHGVG-P@1RCE2{;&8+38!y6s-sd4*phxySb1Go$ub>ou3V$LXX- zQB<%6kq)+*)im*aa%ota_8b_P>LHP5Yi~>WRPiHg0@7!go{ut4%zGP5V}J9#=Hae&9Noi@b_leDdPoJ8S z^4InAj)*PI_3Hu2A0qI;aHoe9E0Y~X45P9}=(Zo>??7+;g0;0~WYuMFvM8eg4f z3osZ!Z{Oc5-8yg%Oin};?i?%RWT=HlV_$330Abq~vuIWVPWZOB6t}hieNYAy)B+21 z(C?N(E`*jfB%7}|>d_>qp_r;CP{EcSBK#?;+&BX7%HdEjMUkV;E z?;&xw5;~x|i(nx9?-#uv-F1&hV!r;oSnCEtfI}IPy==k0=X=xB)1#xK95t3}6h$ny zUqfj)E{qN(ye2Ah_Q3u>{Ew{ZZq4iy{G8DKHW_dwRVotCvM<61R~cs`0b?54Q-n&Z z?k7`gr-xf3K1#7CSLY_H#>_&El?FFKlWc6IOF_K~M6yl-20j2tM5499zs9BRq6o-KGe44!7;GsNdT z38a$LPA^>O{^|DB3|o1OD_C;O&ORcR*ZPVG6 znPOSUPL~{~so&D}v^fr*xG$x@y4IJFcWx*|)xPJiB})ANr)i4;f|=MmG!E9W*EITL-IYP-h#-^=Z? zt}iq$iffjhhWG`9e8NXQmule+o<$003VMw>m;o(@i_Q^@fp8fLUZM)n4Sto}>2|Fw z6T%y5J||{Yyio3zznDX55X3^6nN2pGo6&wYy20`oR*#{kvQh)cZmfo9B(8vxTN7A7Gsz3T28OG$GQeEGU!QSFy=$3}6CWd_JYlH=;p*5a?Z z_vO+rqdu=Y)_`^_6U79YNN@ul?;44?5?q8=o=l~)QWv=-=xquZ4oK~`hoJdBg~F7^ zz3Vp91cR4>%tN7}p-VcvNz(aTtCaG!SAkJXxMD@gHYZB0Ut%j0o;(+-I$j;2`^N7? zlKpgw-9Pd|?Q|knBLgdo0LzKWCdGNNPdqGAKDKo)n)f$;E=e1xOnf7sxA9oSXvL z31W&S2t-ma2p_Q+M|WhMS(hh9QTezGBVNRp+GBo5SS3hJ)_}@e1?s3v&uQwzIZ3wt1|s zAjQqc$;B@)UYwc(T;=ioRb+s3T&yjv++d0@`-FkL7{B+rn48{Tn9|MK-W-PS3=;+T z1m*q{bw>*~4^tO&7(=JK`@>OxKZ><0*v=F<)CH!dr7{-SjeNgb+tkIu+QAa0g>)?p z*oX9RzPk(99OmTi)%M@RWE}17%^loePWuv@fqjqe57V%AvonXu+Z|^3OPcV6{pE-0 zi7%JvI1h8EV1fJ*PRargH`o{XU6edhFtJ<^@Lh;D4r}Iqw4xeA3{w81#`*AqI2-U{1HTw-@=0!eOWbk!d;LrlzKF z>7OBoNW&vxdgppvzA&nShTVGG%j3;%QgZJY(FH*pt$DMZi8b-6!F0^%FH1utUoi-HTU~I2vIKroT+G@DlO$Z1C52~ z{k-t^FZw_Qb!Dvf1M-u_MgYx%Ul=>`+$m64L`38pWyL1-WH{U5;~_#{T;GX6p3!%t z4z;kz80Q`UM_!dMxg@~HM`Xph%UR7d&8mkpfoX)Q^G6BS^U%CYr6SZLz`6hN%Z`EW z@i(to9oy3)M|zU%nj()4HdUdowLpPT*vE?7^3fz?ca!DdT;;S@QTFjyG~=gl7M>xe zhKjSeb1Svi+d_FjtF$zCPg8J%=$L%1*c^mEv+DMCK#Q7h_bM=;SUQdYeBfMHbv zNR_+sV*Nb;C?xAd;wOplG6E(QKfd5|ADuGMJEhE)WMwm%{5$1v%_1w87aC4%|TLx&~^b|S{hdR_<_@Me5P(J9Zj_L;KDQr2NDFl1R*S5Sv{rSDiVl{(6R@F>>b%?IbAXL(A^^-y#zd&az? zUm!?Uem?}oCJ(j}Ly7_0t8w!^2|V8cS8mexxa|{mprj6`j=cul@;@cD+5 zhsZ%$A>zCgjEjox{(0kv8G3TenwzhM!bBN%|KVd%;|gWdSyKg9laO@|lg3_*TQR=b zDSY98tSf2Djh&0#_-+o_RV-#2II(b;G)%Xp@(Y;TGA1dZ$T{K9Y^q=jFZGwn8vR+i zT4|QlKXPJmbUw67)XSU&^iq7vk8AXMOxQkRq|R#o?97q$HYIUR{n(Wd#Gv;GWgE}4 zm`zVgmcts+NbsO~zO~ub@hWNO=bfv}?wzo6&n@wXHuocVXzMg&9OiCG_1CqeX>{FA z;}{cEbB~xARKSKn6PCQws0mvUQ3*>*#bsLd#O;Yl37bMN20jittgu|Z_O)%Css$I* z@^A~T3G>&%q}1-Bttn=u3W6L**Z zwSnLtzxt&f<+`OkPP4^KyU`J<&=xwGz|HL*{(q=@%iy@0pleK8F*7qWGg{0{7NfZ>GG`59H|$KIXknVoy@obH}J-K+P!KdYN$l&k36 z37XW-CW6jCe!Dwg1-CC>Zzlq-cJNnXumCQQO?}4Aln~jkmqC}8KpRc&lAIrqau_s4 z`1~A*s@m{qfkBNSXfMO$fspM&{ES+*Cj4U_)|U)(&P;C8*?iV5eD?bLED?glM$Vr~wXt4TZ3+p|!AV>1^dj0G*OM00Z~mxNVpERFuM#|Umz4%{zn0QJ4rn|O zVh0U85SU2wTC^c3+;ApNEd2Wo&MAB)i>iXJyX9$S`BYQ6@0OIpVH?l z`@&{@(0P0QPV-3DRdCfeZ84}){xv*?OO+3Qir>bs>jo1{6Rx93-Jk59dRN~6pxSL= zp%H8IZZ)&<+cr`ezgAVzsLsSisnM5jVUKNyOy%H!n93`861qz@h2Y?zYc5e=bhD@px6L=n13uIHPDG?}!Z&6AEz6n7~P3gIRXmXUJdgtgurZnY7KO zRmQOWdl*-qM;++@;XH`Q!2OKS)P^xd6ms>gBVg4~7V&FAC!tyL9KX%F-b^qEgvpbU ze?HUcu zn*5cgXK|q1syuGI_xJ+Ag2L!nmq+D~Ss%^ly(Qy~zymxYDN-3!Dh1l|Z3 zbuUy<&M%t9%zFUk4}NM&#G+>vRZ5P6W}FG?RBvi#1eNK23>6!Cd3=BwkpF5D|J^jyR#~xR1SAk0yj{sR=S5p zjdGMAayLW!+AdrRm2TJ#Bs$AmuVcnm-JcT2f-S7yE?&dCZfxpn^k3)7l%o`!``aHD zAH{7z^7aFNFf~}ED^z4v_E%A+PD|~dKNlo$3-aFVs~6UMcZYgfZdhZKLB#^43B41^ zYs;BK%hvjnLv6cikO2vg4MI2U_c^ZH)@eBZHpev41gXyrGdG$dk5VJOPZST6x~A61 z1h5K&$WR;m$u-s$VnuXw`TX>LlmD{!iKYjhRefTUs+|Y}GeuK)Q$lYVT0h8{A-9-W z^EO15&7Q=w^_8a5;83EClwr3TPTm!i^@qa&>F=4<5~Kepv8ClC16^v(cMZC!s_)l9 zNAjyXJ-iGCg_U^ZR_jSoIT5kmUj&1_Q8%TJu>n#(3C` zRhpePCvkmVH-Je}!{Bj@ONEXf8&SP;BTDDrFy{@$LV+eUJTALb6{cT72$Pu}fW7^! z@9SdZ6DrOfW#+BEuH>)PH=^!ikcnh^B6tnw&RY|bh6L5L-XvH;w(>O!@={*k@O z60KyPxlU9za}2?@oqRlqWnxvFppjWtfEVT#_HNzLtirjY%<2LM1O|S!_u+;9s%!xz zFY^4EV|Zpzo@UCOO)}zM<-lR`mcG_@qGFYK+eVU%C6m#Zz+a6zrToSi2IPNw*VB1j zKw^ZHZkIEGr0G-*7JBUw%I3d^;=S6xL+hlAM}0k2EWg#_+xbf-Zjy6!U{t^D9glAs zGGsxFWg*#YwN@FdV2fly(0#|G_l~wugz?jO(9qU^B}oB>nP{jQ?`u=?Y)+zA3Awn< zUvb+RRYtBXp_d$ARBLcFAJ&W;RN+@Sw7^)gOUf;>8FENx-S?a8?BXViFRFTM*^?D| zerDl+*j!|r^rCqPVf3^4Ic{X2c_J+G*6Hx~{8$8qWcHoe`P#>1^qP_>WHC_TRMkN= z+3QKw0Nt$v7O4bsPH=jSSp@_HI5^a+%qUu55VG8)aycbxHe5+>PEWZV_Jm|*r-0er z*SL1?Fu;ICSAk?nx#51m#6^9dLNbR(4R~)Qj2+!BksyWdy}1F6WSpDt#{I^(PrYwS z0V-2D3hj8sw>d({Tm*z&9UQa^__nw}R#uk~eqGGGoSAs1=Bj~Wj%M?HAR&EATN{7| zgoB%fB6d|=Tw`RCi-|L^slMYNDkcV=*^X5ACG0W(^V0kzS>rrpnQy2tnBZN!4csCkR38VvRw+yJ6h`GBN3#&|{#g7_o z&Y!!C$T^qokpvf`z7??}H9>JlL+3AX|MlqO(`-x=0I*vhI`d8+UZOaEhrI+zRw`ls z`rJIEPvw=^OvPM>uKcdzFGQWXsd*UvbIH_=6gRSh_-Q5TP)Mtor@{K1xx>_eW*SSF zUu`H0qhCW1I3yir3_9A*{yM7*eq(hRQ;! zbc-c1WfMmwxI&(km8^e>0*u)(2JOZwyH(-BY<#g>bZ0#fh>;3a4n_0JLhP6xE>MwH zTT#YAIfa1kPeI$=%atN_v)tAXfI$e9pc2_P3FyUMZQ`+tzR#Lq%wK6-!zPI;6_ki5 zLk=7k4#>xH`Cx;|Ms(R&)S-N&182S-EITbR`0{8+B!U2!qvks##E1GbhIiQ^qla}9ml{hfw~zY)@kNyCwRf{1t|AWQfd;NI>gf{m zBpu*mtsDgXXa~Ob5h4v*f3{>uk}XrYRdR?(WVMc^dX3M#92NXcKWk2KQHC$l6^!42 zjFg&!Pf)utiV3<1MU40kr2v1-V}_k76CZH)v`AhCD#5PM*E7p*2v77Ui1ieyL*MJH z6c`xIcQ=OV6#-2QhyW2K29n8u=L}exvmZh*@)rSzGBPsAf?^;jLf}czflW=U1w8Xc zLtqpw+{W6}+QKkEbBh=N6D^c+g1RE^0uOA449WzJZGrf}&7@?k2ka;%2R`WS{9&YI z{1&B80vv;M4*)uJIKX&rg7KeRRD95fB8=5qm>r{2LZCdcXb?hSv1sgbGC+h-5=j7i z`VWGzYf?Z&00LlvE$nvHN<_XgELNOe1UQx$@jS92|7hDDInlNvd-*)ke`(G5A zEJlDuzXOc_jUuH9PR^d*&|75kpM}^V6flQhV*lu*OjP~vXOkxEK^tlomW?9R|FcHOpnp2>7oRgvQXHdYV_>#x?h&u77H}FGU$a~Z2;}Kf z7Fa`j*M8O_NY!~f{G?QGx7;zay@P9=GUtIuTn0`R1Vss@AX*hNEb~N+GzPO>>v$P9 zf36Xqp}QqReF1sejAtV%2YLld<08{QQu5PSCKRR0kmbK809XtgVy2RAby9}GU6pl_#^`FZ zTK0!vY&IKHc~jW+P$D>T`_T{T!ha7)5s*2-UQXS7y{f|HF|RB13j>zcb{ns~qgNZ4 z&jYkX$H@cSC>jUz-yH`7pYB^cFNg|-om2DefWGF%tZu&y)vu^z`E(F>(p9!&MndHe zYyiO@`M1{af!LgEto$P(uQ)w#F5@t7g@g;V3nPRU$dFw*$0WD>PRGr! zBzbw`s04s|%0FKNEugY;XtX3&4o_gAH8{`0?sRTHxjg2l&oJ}qjEVSvGr2^0`8d6+ zSIlW!ZDe}tvJj7J9>bCa4%kly*pVKkoAHDPss8VALAC}@I5Cc8-T*#rfgPm8et#n* zoHx>~&i{5gRJqQuoBdGEwFi+9m4Ott9{AiIeWGDXK_9ozFv-IvMd?JEWZj^z_*!{efBL92#F!Op=dO&;^Ryy*oyq1MV}FZ^s;UBIiRiSre(N;Ki=NCf zh!9_<2Aal>!u>6FPvIw3=()x<#>C0AY(r|a7}{D5>E*w%XpITY3?%il42(-i2AvX% zl69IAyhz*$SsZMDNgOH2RE=J9#G_Rj{UfAjijh%HwZKpPke>#KvYKPe&6$JSAn9b% zuBAiMD1Sgq16UN=Q;9>ZX=;jUGoPn_P}Z29$r7?qxvWgu$*{5lb7e*_vQq?((@!EV zYATSpU&@ zfC)NqdkzWs#*W33AA!!2z86q6Hez$VMe0bzoCGy`zm+st1z|cPc1o>sjK%DDo&sj9CalF9Gg_3>tfK%0l^$S1URi%W`ihnu0`){aoGQGFC`+ zG!MN(jxQAT9)O5&X7%H^%P6?3m(A9AUFs!$s5c>A&W@i;Nmiqkv=6^kw@7pLSmI92A^~q7b(I6k+^R{V{ zcX&4<5Z00bSVa04u~z`$s6_N{0~I26JuRSa zflyau=Q0$U1Q{TO{cmr(#S5fP%P?L{60fcZLH%#*Nx}jx={&mPd&CEJ#0P@uZ)i$2 zAaDjAi4&jqbj~#xq4>Y>dhQGT0&Yjdi6|gnj{Evc?9WeB`5hLJ{{xP5s?d8yt>p=0 zZvWaSKoif5z*yKo0tI@(0;T7P5N?VCC2|9$V^I|};s6Ier2+0^Ua+1vSin{XApr*L ztH^Tl2%HWI?dsE8A_C{DV*-$$rT!6aKMUO|7^zy$uU6-X#kg`WcO8o;e%%dOurQ zBb5KpPXRgNjjh&AV&Y5pt_>36&+$s4Z)cbx=fwQ^KF6(Iqn^6BmS${cwt$Fc6i{8N zL%wCpR<#iPKAJE1qioSR!qU|L&kJ@t!m1??JGdpnt;%$)P}-I~OXA zPcXG0<_h-gLJ8%;CD0(UNFc zEZG$|k2Zrq!0U6Ll9(Rv@Sww2ComcX{1tQM$p1TV{y}Y86{mB`!Fp_D{HG#{^+QZF z)aMk#Y1Xr2&5Nu3Q#=0+CzN%e_0i}GyxkEzfZhe&?ILm4pJT4k0I|6)Gu$Z>4hVg8 zrPRG7Sd5tnyYJnhf2XlDS+qeQ=2=t6tD`M~2Q00%GjsY7viI04z>LtBytNtcVna3B zBkaXphGdML6su0e!Zn7kWy`LUV{rT;aLkKbelQ!ct4{Br8qnh0YNTEnH&&sgZgFLi zH4EAgh4D);^z%%mZam>wmzk~C^-{6%ur4Se-(4)A=RBhS)AiQ@+hV=GVRvf>awr+jW)B) zFuAF^qoSjxR*e>^@*OjWoePVyOXce_$)#3VgefI%P`@NTzoofz1U**ml<{CC{*N5P zbU9%O(>h5DQI9&YLxe^=n9Yg;Y?xM6gM*4X!f|JsS!snul{{D{#j$rANM9+FrI)sAEtmC7ypq1c8rzBI(p{R=E@m!~ZFjbxX-}r^rQQ8XQw$BI)rrQ2`q?B1K9vVSinWUlIf-vqVst?7bFhjo6D8i+LAA$EbUHP$v2y`IP>eKm20 zJ8B-y`PE@>q2HbDe%imcbdT!Vr`)~d8p#M6w$V7812)ATC@Cz*s^mMD=&tOmRlD4O zedwT2cFlHUlr2zvrL5m{`& z`c+HN$W(ZSR!>&QV+iI=$61<8xDMJvm?!#UIKwPO-qsRD)_qAOK6-ttQ~W@%phXLh z1c#O0R{cpk%Y6`5Ko^4j54}O}7;!U81=h$Tg1nJAN65`_w*Q*1)pv5$XG@dO2{E+x zFm`D*Rk?3>ixP=xLi`Kx)f7!tPp6ZFOTnl4iT}^H#QeHmYs{Z%fXtRN=&FY#k1UyqKU7= zP%$UURmQWIEJy5P2FR#x(ZlEsTCJgC%o)p<@S*8{{h-RZ=MB38SpfS# z^eg`OM7-vd!K6eSim{g<cw<^SzhqE7+UdUX6%Te7PJ;J=u5$e0XHX?d`>|r)Rgv$(9OUVN^L=U?dQ2lv}hlE-6YW@IC5>Vf6Bb2)`Lh`< z9WCwonFPGC`NOxl5T zftk51Wd*6-dB2vZS(?Y_!LP*7Lh_djGV_ajAQgrC53Sgro_>so9&bJQ;6`m@5u^z0 z_|A83LbV1KTQ24GMgVIzG_*K3@L^2I{G42tOg~)C*iZ;MOy0ZB?1Jr9#O`hw-ZDau zLM>FON0(~q)W@NM3O&7<#H#tCpI&&X+ZkufAB~Qh(mVpVwCxXG(gVhAFzr$BaFl3 zy2MEPpKBoj9y$c8mOfjwS2iq8l<1!sN(0c3C(daL{vUtFFa&5;W8*SiOC&oM)?OpZ zKQtu+@Q(>MCnamVH%9=K#vwUM8g&p5l)`_c2^H1DQ)bS8^N$Ds1vMn06QlOcblV|k zH&@S}?E5-G^M;@YDv199G;?mHguJuBg+SZ?C>3bn4)(J!G8MtV-qP_PdP4^&Vhir% zkpJ9Df1oYcCHvGT^)de0%0MTM54hY|&0d3%{p`uWUg2W-^ZQ=#a6Gbr7*O~w%4yf1 zjb!_u``zoB*gvRhKWIW0$)NW-4hddRJ~bcVHpIYD2?BrkhrvIep!$Xs`u|gtP(aJq zbJW@TUa#zHqdZ;}zxIi8Dhd(*)9QN3_EJy!3yb_eB(7oXXty#I%_XgoQW17$|pfia+ zx{>%51-V-@r6Z1&R&_R2TweKL!@TAc6KGq#kZEQ=Xk=@Q>N`SwKG!yyERN}^{~hgh zf5zW6@s-0Ej)tSNN^o}{bidj`T#z3?1W$Aw>NW9Wdv;9 znCK;auq+D)V;KJL6EP^CB<6ddAO4k0(;cC-1Y81M(YL4ZN^`8TdNeMB-w2&v`?zdF zJKOnW`U*3$))%3w%+mx)_@yPZFNGBT4NL}t1Ct_!FEj?O1Er6XmoR6k=asx>te z+tkt1Ie|W>aIA8(i8kW)ljYr@41}Sgv=qqTs;6}fgch8txdOaEQh`$VsR(jit~KO8 zb2)xdZby04QCg}`KZD{!C1(O6|BTuxQNnuFJaP<|AC!mFcQCYJYj7Tl4kEcnod$HO zM%)z1+AdVI5*A)(8JEu`O^~94ZQAK?ti-@#&mrowPy*w9-LM- zS`OKF`E9*A|E`Vg=Tlq!IkSG=P*e;nL83D{yQ%xrcD4(Hhleif9BVNr{)g|+l13N% z-rf@i6QA{4IZLzFE@Tave3r`>4o-vSxXCH>H{%CR?DXczr`@ZtR<=g4;u;|m%DpNL zShMe!s_5G7hhHnkR(egdn3tMfq!vNGmh|U2%!Wl_mMVnp9Y2hUaibR6Y@H7WlSaN@ zRBQqlg?fyt2+Wu(F^;vHU13;Dvei;N?z|p8O{O%&CD`%1=t+`gPUJia#QU9zb(`{e zWTm>B?28&fD02`dZt9O(a=&nGh%9m^wwX?6@5gc3{LTAo|BwA##ZARtO{hxUy&I=K zu&L$1;7kAbaC(j9!UXAiURFsGPgPH(9WbL4K;N1!58ZV>1*U9oQPM1tqrth%C+=S5l`8EF{M1$ zzp$aVIRmb!IkB5TDDs)h3;l_%QJUXRp(16IDxL@v-N5g}fR8@Ph|-}^SaE3K~t zhx0KK-Nj~?n}N(AVDDW9rfR*y;XPO7v?)y$LBCdhpgxr_wiIkwjzh*A2!DOJ@enURCm+;)L%xYE? zmZ63r{!O!`j)P?IH89cOsR@-kOH0k2cHve0b49U9eO^}ByA}FL>N+pOR2T7+?gChg zr+p2Ly;E07-uk@~7zfXo| zQeSY1-4bp3Y~tbLYfYht$T}zM`!)1d0FU}@Mtc_aX^ZO;_wMpMYDSx-Q83%88qrA* z+KpZSh5a~DiRK30wy8+2Op&q@VrpK1CV11fmK9GW6AVhT9NQfxhEY65y9(qTDRr0u zx9gbI$H#Et|uuhQf{5ExrPqzdFtH76k(84Sq?VoQH4TK?N41iJA zAzM#{TmkEU&=VOGuxNwmpU08tjp8c`45kX0xhWcL(d&!hE9Lp{)aXN&iHSG0ayK<0^;X9xDb z1DZzxpmXO(pn(kXP}c74?d~~e2m{nI+UI*eX)K+a>lV{yGUU;LbsQc_lyC+N%T z$VZ9$i?Q=4iSOoTb4?9>mJF)iR(5hgP?3H>f8wFJDkI_jl4;M6S4aUsqmUSKy84Z7 zhXbg`{-u^IM0FGlUAQJOX~a}jnoE3L?x5arf1 z$>Wh^cKO|K90g@m+*&L`i9`#fpfdKC|3z@aYpH(oO50i6=E^MW?m%qeoBs*DMt07a~z9QpL}^5gBI-q-qbsk83V-e6Yer;AJ1 zeYz@fU{O0!-#+5Pl7H{x>C?B{TKVL{*;(j#-fkG2oEsG>^wH5ef0x}}N%eWER0t%X zWwi)9{E}|0E=94r`(ZUefc0g&D~NiNPuS@-%T~`{%l{I-slVQSw^=oNU|uG|km>jv zL=PC8I-6R{epj*#i<3en0JxpKGA^EEwR!mvUhHkVzP^=27PNdZkt}u2)BlObX85Zc|7l9V6AnI-NQ{UAB~`u{Qor$7~Q|r4XuG77z@1N_YUFhOEf4 z{UA$Vo(mk9EO0R-e=^d~NB5@VP^Z1`xJX;yj z5m>b3D1Zizax-l|Jrn<*9v^7Uey>zk_Ws8o-ru}VskkcL`$1c38^8ITlN?9pf4_dN zRu0aMkVNiBn&;wolVH5L&-df;;|H&#KI{|F;Arb}#fpp@sTiwXd2fY;TFNq57a-%Z zRs~B15gdj$pz~Ul+Nij%ZimCF-MJmw0B-DEm=B8s*@U+Ge>G1+V5(+n7Si*(vylVS z&MoMU8r|!uYrAb{>wC99)?B`AYS{8*+%t+0dOtfegn7CETWD4<~xKhbGlf6av4eD*r4ytIzjyKllt@R2x(L^WE6pWf7HC8{Lxc!EAJzR%mg=ZQ*q z;z5j`fE)bYoBcrF@Dmeco~L;THuv%aUfSU(Fu$~mr3}pt48rd)07xjQlA|f8ovO;ek7m^ zJ68?-eStCSEr9G6jpQ8Mq*>d_xhg7rTG{0qAGXlF21`1N0^WB8JUoKRa1Hq}EkdGQ zxmu~lgU~V(G5btFD`fj^kSlw&F{@pb_&&$kFpjegV<9q#6PUk>*=)`$uxyk5Bm8L8 zj6)*kJnaJMd@mM^ZIA-kyn+~1MZU4P@*ru`essi4q*>+gXqkGd#j)cB$_|TV-|ava zx<#TI^jEVAWL9jY#hvh{emqEm4vlzdOIoMB-~trI@`cH zI-?cDCSbKhKeg(B^I2s%0z%d`GWHui(sQX&HS9fhn{_1yJPND`36}5 z1r+@MHww+A9+aWl$V#5PNHP_&47KHB*&`~i6fj&6*-u;z9DO8Q@aYv@IV5VP_x1b)t`(-KcyI8vvbgr zw&xNVsn0bgoQAYIg!uf*xtJiQ#i6)7Ua0q`(J;jfs~K2QPzUJ27R2Egi9H`@X%ECv zP{^JO=0?PEuR9H!vabwt9Y^w0VeE3m>`UUK$)E{$e1c_Jo9E;xX3rbY{hlp~rc|q< zahiT04n|uZr?oa>lcXOdEIdk--ZeeSyHTM~SSQjSw1`Zr9_Wf|5EIS2e@G~xi7|?U zV%-T59HQE}3C9UXZHY)+B5EV=4+P3_#h@lpyaCsJXS&r*6b%IS!44+XttU?OwrP z9iCXx)JhED5O|bVTSqb@Lz{myNLxd9Ldyk;?Zeo1^0T*#H{yp0lWW;ab=nkUIWDFC z!J@%vsAHU(%NMGaz(F@D%Q+yRH~N^}8D#l2vhQ-Kzx16qXjyVYdUl~L@L(i`;)rm_ z)(Ugl9hLjKL$V5TlQc0Zfv*aNs`E!^Lnk4nR4HE_Ju6^4Z1cE?>->fW?z^S`gfK1i zA(+gNew(KC(ULTm`fZ5<^!Iq77JbHH|M3RgwiUe2%c>f(lp^#FY>Q+PNE8JOLz^Wb zC}HE62-8;b<;;;g;{CI63K`q*3VP%IK+j-8e@uB~?(XCiz6=MEVncz#fZIo17>HS? z?%>FAtAnJ$;YXsQg_)>ABZx}O4qjv_aM|C)6gHko72dH&hFzs?w39kZYQvx@4L^G6 zb()tri4l?v6QRj*TYQ<*5T%lm$5GEDL!cnxjbiCmTl9Jo#MBwqjfp7nY^tue#f3ef zpKpvQr%dg5`wiCo$rHCFJ7l7MYj`*inwYa0QfEMr>zt)kaVq5OC&IB{qQwhcg}Mb< z)EYIAH$iF$sZmgYN{O&VO0JM!8`8+A3w>H6_W;kDP=!(d84ey;?wPHbrhD}fRZ zLMX_`hHO}{CX}(Hvv~@dK**$XMhLIp)3$h|%&i#vkjJqf!;z{}4^lh&?x$t>IU&=Nh{_h>rb_@X(gjye{_`R^*7CnPJ|K!%{XwUj0B2n zI|(ozNUwNe!ljBMEy}nOgRi(gR(ggT_-_w zx&=i+OOiBvAr?(YIFfOyG>p24#D4{JA{i74G#;$Pm;xXn8NQR>Q-g$EcC|Gj7j>)J zCPC0g6~a5sr%5#}zdPcTIO92DkD*cvgGDU(Op&XA16=#(%%sCbe12DcpU<{zy*?G; z#`qq2DyWeylR}<|ONdLgLBZkB78rDLz=DJj_MjAnOB04nxYGe=3iA`X=mgQ`Yy_-+ zZPc)^#*oyeU!nO&q*4&-kCl@$#!!rX_?0|515FhG+ldRJT=`$_A>&y3i852b!o1!@ zknqEA!D(TIrG!Bn$5iZHC)AWZb}iC|)*6BnT>6+PXvryP;%b};UBZ#esMVuEgHyx! zu-Mi#L+gIMYy_AhH>2=gTow%tRcI+WxdE^OjAcV-NW(U2M=*f^0ssOCHp13KdJ^+M znGl#LDijXDqQ+HKmP};<5ZdY0iZjg3Gmddd`TNi=d!+CpJlpZ_FS!>4QUXrPR$tX| z!4_Yc6Qh7h@CRa1YE+~WAwdLYF)3WK&{4vyZ6%frn(Hu35(W524$R?H_TveNTL(i- zZt-!OJtYv#4QuX7`gqWY*Nj7&oY9QZ^q0Jqsp=Yvz}FR* z(<^e$;og2e+gUCL?REx4IpGMFzXee zC%_@duP_^d5pW?XlyT*y71F!Rl^tN>7BLS@A|RPGdO(Pez}iM@h;B~WrXJAen_J@> z;<6vI8j3ALr`6=F6|6Uf)#R>h`yHxDkpZ9!1p#b2YjBQldgS$8Smos$;@pN|H@U;JlTk$&Ma((A^8OsHIlw7{;fZr^^)i^Fm30u5WbiYNof4|RQ{ks zm{Fp19rJO^P!bKyCTiSJs2t`fgxwv~T>cDH(iz0O1DQ*bCFlv|+6M6JB2(yM)~f*& zT}($IA;<>SnwFmfaahLicNx{|AQ&T~IK($vA>cbyR)~&|`F-46*tka{`MRThCmY9Tk~`13J@mThI0k{Hv|p|(D8*Ex}*R$jY&ESA7Uu>8Y-B%cV&K= zA)9k(O{^8D@%w1ft=(c|=QiSb_MHCPxh{~6y~z+#xG*CI5!Q;;mX>6ckkSSg`q@f; z&>6rf5&jDTe?~4L5;0l~y_hB%V+b87qTUGpeg#D!2DWu@DSTZ{e*v?mTT+=JNFl0iwN38xT_~yHZ=!f2A$7ORc{<55a+cB< zdJY(2{GEYB4(|b0HH6Zju_cxWrBxnz%m1c-%3aBbx-YU=3|5-U_{iYMsIS>kZnJ8IV1 z3`-MFL8QqIhyprUP96pf6__}~GLvW>*x?~MelH6lBZ2qlj56COL{f_=>Vn(Hgp7)U z3?p=aSt}2R?a~GLfcv%EA%~9YXX>wasTFWhp&d0-28i}G3raa6JEi5`{3Ii#gs&*C zEi@-A?)2~ome^g7qeL;QZf)4%XpCry@??K%NaDW(79clMfzpO(O#XlY;~Ek|ag@JT z&@MWNs)YT+GC}3|GZZl{7dn_%orfR#Nhr?IW{0g5PJ_-@bXkSyx*r|KHoA;;NiFy+ zB65S5)aRI#cyB+1bc>?!+lk8K;6bq45=GpmZE;m9jS2^UiU$17YV_%Y(RN+OOqLo;v!q&i69Fs?#jb?0ZDJpP^ssaKY|m1*3*xDFR+u`1p+!ez~V5z zi)K^os6-&i$s0Lcgx&lz3#H455?pog7D)>RUJCx8+5N@K+wY;xCC1Om`(ly-a5E*T z20HR_amSwuj9$klNsDe!$1tOG8TySTd`mdZe~*AVwPbJWc}AOvtmMsfkS3aO(1tM0 z3`58T+(*2vPvsV#T27Nl(0vGau>W|ZJd?!kPJvB%m?@ucGaWg1#===VDQXUi%rCS- zrl=!?iF7LRoAuNiPXD*`X3vLQohQ48^P3vJR4zqAuVc|VvHO!L+4hc;QYpdS>%RtL zkbh-M)Qo{Cz0-`iTnW2AdiuDBk0uqTvL2zjjCK2QQ%u8L9-JI(I{R(o1{Wwr@J zFo=nbGU$m6m8ZKMp|tYq`uAGUXT+0K2sV*b;5+Q7jW}X(CMbtMZ_&Pzvjkbt^X+-q zR=5C+D-9@0m3{}9sij%c$S`JZ91I+@@K7mM2OJK!(RZl_p); z?P`YLC}K3Hrf6W=xzkk__&;@&(c7lyT67~+6UT-LzmldsyD~70q-xmx(yjIwQJ*4Z z3Zj;pT=hauL9>1*Qv-j-BI^IgshUw?AtM<2qK;bd}_K{18XSiIh z7<&%J#J^D|m?Y49lv*6$DPHwoDGG7A!FK+2tB_xZx5_`=>YM}QM9`@B?EVRn)VfTh z2)@aEzyG!A^?gVUu9zsAIFL0<7z~iSJXaRU$!d_aulo78*B(##(ag#vMeF|2UVn0y z(_luFw<9ObS{*K)!Di$pUQBnn7s)3_LGpnFzosJg5+9qYmiG-*-FQN%Q?VZVWAJC; zVf&wIeEb$~V@;;#gH)tlF>u@}R1W)_3Nr!$RJB%e>!T<=uC>ptkEoFTh>QNE#R zPwKGhr@?N*Fdi&fJbH_U1#?@L)1aJm9Php=J}LQ}rcQYj_xrqh!cB+!WUoR=uAjR0 zeq$WJIA}>o$5%BWgQtSVcRMn>bxEX%%i(F}-;NR94MEUF_By$swh8y@lr%s8$Uh_4 zGrrZxFrVZ|OSUt;WG40P`Zu|1!sw-KLctwzKw!Y{JF}*k$@lMc{bq=12qSCzlA=jK zO0?->=Qeg#eU5$aiqcA>M?uk)dd=B85xLr@&((staa1SM{3H0L@Ya!OUPvZ34T5CSr-vG} zwIR(Y8pnD`2!0FsrOtg)(057po5E6osbdCmdVr~O5>;fznJ{0}-8q~Wi{I91ve8Ylc&@-b%Rd9IEr+(7o_$nx4SJ=m6 z;*9n7ya-4lm|5yMLoxodxJwWp6`3GI#X0wwU<{uZuWfDG0xOQ5rL<>+-;NZ{{n-Sq zXQ5K7ZQoO6EiFlPQ#Pv+0)p#jhG+&xcNvSWoaa6E6!=~3Rzv&XPJa1|E*R{4io$Lw zA*ZI+%-VkQaxwilyBd?yEQ}J5Zl_ajbTeJApKlA8s&^*L`5FvzMpCC@a;`jAycE1w zq#g$tGUCJK0rKX8Q9X_$@m|N)G4f>!vX9g{khfNPTvtAK-E%sQ_s`Qi^3^D`{a8&L zUi8@fwpYq=7nkU?f;crn;rY;K-duAsp^26Yb(L}83&5UNO3*gQ-;qzw6K1wy?R|w& z>S$_-JCJlgb^cB+cjk7qf2~>b%8HdMdPSz%kY3q82)1uI#9#+iu7!U=XNmBwB+Sog zlhiFkdPg-`cc{NR6}p&$V`EZF1u{|4y7yYoKh{#|q>z(U@^bbZU;jlw$TMUd>?n=q zSA%a3)fisCmpUo09Z^G<8dRx+pwFRxKaDilVz}w*#8%Ne_V!VU3+HDPPazGeM`gx# zUT)sJm_Pt2qqd&a49b%P1)1d-JWReu-roG~v-P!uLt%*n7yhlsd1Im6+^^_52j9Df z1QPtq#7-9kC7Q=M3{nM5DTX6BzEPKPq1s$M9g8y19lCjpPf}}u=QyZmCRX9H6(!&ICFalwU9_d z#&GdR#6<*9@vC<`z_cK8@eMcV)3rg20|RRjd*^emg9{`EDFyg^!iI8BRdit%HLyw8 z*W4qp`dl;(KNzSjd~5KiIK1QRZxxK^UG6Hvz-#mMQfMB(q1LJ(0%p>7mGnuIXzi>_ z2PkX^yE3@z+jZs1zkbMym^u^|$U8!r*KD@2{8@{s=TyM$HX1Dw0M@;AA>ZHYjnv`v zZSk5&spa$M!}6bO^}h*?-KD(TXwy57F=hVW0Lwr$zcAaDz3G0vQ8h%-jA_3^8>Wu` z{6M)9H_)qW@%&FLI6_5^FMP04zmZ?`D^fYUNR{wWJCxcnCbV*y8!J8f(=n8CAN%>i z3MFr>P_j^kQoWWOR<5ImHo5P-=jJf(p|RWJQb{E$+@W4sx@-GqH+3B1Rzo_ME%of8 z!)&FjX4vJAFL*k#_tK+BmiDjFZnx-m^}D%H4p$tE|KY&zjL_Bi*6W&N7h zifCRtviZbq)K=8-#Y5{>Xj!jftNImhd128>S{$qz&~?BpHSeL$HOe%*xm2$=-0F>6 znpEwx`j~Wl(5HCyd)v&N9D5uGg~2;ljC2pHTa`55_I-oM?{;H=JH2|q-OVfB-J)XW zsXKy#cFby7Y33fR8iRv&%xD<(T`cv5C)Pb5*``ipySmZs>pijVgmz})g5H@y2y%rr zeq`9vC+bYw1xKVAy~}lc!;AHY{;XC!8*_KF@o^`Yywl>zO()Tr1)W;@PK&2DojxTw&LDhB*s!oqZb?*PVX2-9066L9or{Q9cnL6sZzUG&}llWaBq*@xLf&_z?%N)L6)*ucH0G-F0cia>8>3wR|6 z(14itU-X~E^%f0*C)=x@aL^$D&EZD-5o6JcymX#f9MUnlaxfeV%R6*-9Zkt zv&L6?!`>M0pMi=gL4{2vx}X@}F-zoW-iYZqbG}Rn5%pMKFH)ql@*FP9$3upKUgW-I zH6TuD0Ysx70I?OMl-{P{L`sn=V6+)$E@YRmz}MMQEfxh=lT;2zm@_DuiH-W5yPo6q-zGy_`KW=j0 z5OLwyY*&Ghya)CluU^w0R1i6FWUc#-9@JuK)^zme2b$i`6X)S;_C8jlMB9n`k4+@k zKE9x5{d=cAarB8|lr?kUrinXueR}MRh-P<1yr_mQk3H!6BE0FWZNK+cBOCW+vg2`=~a#N#>xY;cM?I( zip%m~%Of6c=oNPJ{T&|sa>vp3#lwy)`*>j6t~-kF#c;r%9im9mrHcnw{=3$*HRdgS zy(&+N+({=6yVdNGTRxw*VN}?ug)g@q{N(h*_f;ivzfP{v`laYi!^39W{m(k%Hhf$` zKH!`D+qWHhyWd~Bs7Z0ywkRLP|%)<;SZ_>s~@hR z^xyl>XFBaK^@+`V?N`}qZx_+W$rU4mlA_jg&-~kNwR+4^@4CmV-&JJAQ{A3w)<)g>+K)T>?|S8Bz51{Klws2^h2Nv#1=>FD*w^Y43oz@O%THJkn(eNH49-FkQ zYbB!CJ}u_%SIaIN+ziw9Pu^3b*Y7DupYBOk5v_lWKmC5~P}Bx0gxyaYE=yyci%>Cg zE#&b+mg`R_F~^sc9q4GPj?E%o7|@0l9z&%S1J25*h@AgohK@kgzyk<#<iVDrihAb^v^a(_Pl^jZ&_RCGb-=t&x2n_P!tdUh+D5C^ zrTQ%wKz#@V%$)t$K`HEQj<)MytIv`Y^7mhP&+PqW;8XXP{71pRE+ws9yL{TBouz&+ zTd+WI{(5DKR{!(1&TY=0IX!dsrjmt%^Im{qq9H9>d6KBqtk@Ik)-bmUYdvAlkuP_A zR`7NK>gc?G-gNgYZFfUT9$8|QgQ7C!mmWTM~8Il`ophV?mReS_G^7U z2y^dY|HjkdSdb?j`DNBmx4-#xJn{a-8SOsmZ8b+6WgaOY(Meo%23Je zuHJU!ogaSp>+v`HE}lH5)$>1p^IA)o6T51Z`}xr^p)|-SS7^gt&%1iA+IxT1VlcrT z4p~E}WVIgLhtZbN!s%O2v^>7?4flZQH(^78YlfB#!Ik^Y`Eu-SFE5$!+AT#v%p3EV zLx6-K!{Bgw`D2~?|A2f7H7NrfmW&ll#xLSq^^t{J`W|1}uUnnnpRDg&R;m<6G1QJA zm9c;0Ywmx|i7A1y6+2G2A8>2+rFSjmA&g=y*-5(vo@;b`?r;& zil}sVOXY4q`@IIC$*O2A*Ux)TB{voPw95bbu4^SKQnmK8u95pssOBX_H&vqb@Wrmd zt;UA^`bb6bd3Gu3WzYsXOnkZ}&TL%nqpSa2``z?7?S*V{(OI(JFN=dK&!`7s$}UK@)Rvu;Ov<{!^&N1(YhIC&mjda z*3YZ*mCIXzcV?`@bULJ9*OHeeFuA-##wiiam$G z>r@eqS9cx`FlA&LzH)EBo7tJkOD@q){UF!N-)o`J@Fue zf3lGoxT-WB;ktFnL^WvMOG{s;?H>pbm#6GY^xQZVqQL;i2kh+f%r&vyDM;`t2T~q zrF#@1#aj=bzPI_!5$+BXe|WbwR=0L@VgfOG_ryB?RujM9+PbLww<)#SLw(5*_)!hm zwZR}wdRmZ!R}h|I=9&~J2y4vUQ4Zq+ZvgR?KM%%W;InBukqB4|4I?^u77ZW5;6v77 zARtDVvCwfl*^A+Uaxgl85P_JWBs6iTj(g_EL9(gifWmacpHPswJ;!vH&kPt=4tUoI zq84gHJGs=0U091_S*(mDl(n>PCF62e%b6HRCe{#n6|`Wp617x)>wU+GjwG+BFRAW@ zg^{mh4CUVHXcZ~ZnPF*etL)4cLc5?PLzm$#4o$)_`nMplGAvnKlo8fUg4*0%?Ds$Z z`fj`HqwiOLGGop5H7ASKk2;g**d-Mg7yIYxO^LtmI=z0`kuu@slM5XzS*4`FLZUT~ z5*_*tbG_d7fh9-1O+R{Qqr1yJH|s#bOr2VnN;EN&?>BXzw-En^Z z*OncHBGQx7ReEovfD)|e4XimLFR2rEwXP%Yc=7F5?)vEVnv@VYeu$o1MR=MYvc@Mm|^aum++x#bfXw~WFBK#4g!Z9EG`1wHBhpS@C z)qm9WR=>&Hp;OY))t|rRezJZ!Vgu{IgoMhtBFbUJpu4BpWV;er`y8?_| zMWSz0?|r=XINfafwsp@%Rt0e>6cp^v%wrP?#wkUIF`$9NX-^ z<*u7(S(m(n4sUD{j<{S!t9H9(e(#S~9_OBY*P^H9w7RQCG49I25ZKb|MB>l4g@;5v zu~6B@=VJoiz?bcQzTqPQ+2hye1bDbsqQN*R;74vb4bSJ|8C?3q^T7N}E zk2%HxZ}fmM(;$wAiaCJHBH{!gu!@6#UpSwTmt@(+ML#D2$UMP*W>}Y(M~LkQiJhcg z{2da7p;pYHp{7L@C_*vnWK{8b!)Nqsepinctiu!E{n(BpY@oY%>tR!d zwd`K238$%lFIe2HWb%&D?RyMkKDQ2?{@=20ciHKqwsro$4j(hkEgw(0w+izHc+wlu zmP_kf+BSK!(|?zaZLFX0BvR70RHeJ`Qa{dkGUjHw!<3IF|9Aj>&*--I3}z{vUY-AG zMOx&Dfm%{2j^z!frn{-iw-d)nG`J1SOfj{4-;vX8fq zq#~{UGpyBH>jg^Uhhe5fo1xzhZFNuGmdsNC)qi=(m@UT|w>-J# zHTP5Bl});Y&nMHIwn*c9pLF$Kx4mrXcQi^-TnSj>Ot z#nr6a(qhY{!y5G+@+TN=+xBOW}$-;x#aVWs`VfDU?bn*#U|b4UCgF1D5Bx;Kovc+m)|wNV1xo zlaqE9o#f!%9aKDDV%O zC13pe(z#Pdj~zZ-pg_LJ=(0sZL-DB`8OC^qLGumrS)PHy1T2LhUMi4l64i}>H+BtO z)uIMkA1{Z=R=R+gc5-CNnWWJ2Y0HQn0m4j}U63csJcEOyqbzOj(=d}0h)gd^8CJ0)~ugRo?$n8%T& zG=$2e#DiHJB>c#x&~MqhM#fc8;e%g04zmGzMv#iumN5{q@bVSBXs=XT~FkB z@ggE%0_n`w^A&Sh9mG9^uZET-ic(sha6&q9P5y0q!;xiXzF)tnMh(w{Vb_HnM*9zD zw(NrV8U+;B>TtKC>l%ef0Q(pN!4D6>_b^k&L>zNz+{2rJg#ZGWBMjf@Nt>(!0zKSxvQ2G_s&DhKHQlhtHTDsyrL@>{vzd%HEIn*Rx>@9Q_ znJ*-N>G0Cwk<>=$1F_s~QyEJYo=$Vs!98iVfC#1NisW5*_y{|Q4t5pujGo&y$oNV@ zJ}AQlaf^wLJ{@BZ;W!79OGQu|3ZV-^3bzvJ#Bs~>B-%X1T!^mB6(0`*6Br>qK8-`@ z5apNqWr@go5gnhM5FH7?sf}nO5gpf>N*?p3ptqruD&77? z?K|%n|K5`Oqj?|&Qc#rwec2lYV1qLk3*s?`Gf|tr-^ycs6q3)J< zaR>|y$?PKRUL3Pw5s;auC~ASm-07lgLaIX?$XSL<0z04r7AKZJ@x(9V{@1+(RObO4 z?!k|SVfd$^PSL|+WG9ZfNC2sX4;}~`%?fsiI}%HvzzqctAj4bm@e%%P0O3MY3aJbz zkHrFO<1vrfdIbwLqL*|H1>FHIsXfk=Qw8<~{Rbf|l_L@;->M-v5cmH~P67Do=@hpT z+;gx*vlCm1I?w;jfj3tk2VIv=YTabK$gO;DAs$V9r1|OMN$_SHNC?k6L^+$SPQe>T z_353rSWjzrmUo(CmA5<@bflUkP?K_LTNK~?ux3A}a;2a;_^KTY6IJ>{e@WYxG%8?{ z%3GM$Q@{A^J&zNZROvQ=M!-!{g48*CI;2o8|LIv6#u;G%N5@P8lxX?*U?#5I3vde0 zF4zEc`aD2k;!H1^je{f5LsMWUB)NEYo2Ib*IRkKDg)m#vwT9_8sf|zH^8}o(7$krj zh6Y};2sn%nvfdl(&h!{#qXP!p8K-2&9~;K}uBYb$jsm`gg_&JePNY@(+g5YuIZN#GX1 zOxQy7pV|;>uE+R5Gt`Xr!aM%-WWv%>Y5?R25QZ3QDBT6nB#1-^B3yCo4A=zF3|Wlq zh67tsPgEo_REUU>ij>x%MWZ_-Oc`Ko*3%VyaZl8!Kna4ChE~)SZep#4xtJlyGPo9^ zTwe3iZ=xpLkOD8a*ic&kvLE663EyXj1t|U)2D-}HmOFbw+1AL04&2y%7)4KD5GYNm zjib7%_??xqYQS4j$DNP~sYA3-FcWF=Is%puWOw;q8c`Zo{*A5-^HKdG)96`MS{#56<)B?a zKI)&ia|)Hlb0z#!C_s!yE7XHk&0NXAPXo*9+ImYwn!L150LY}^FMqo0vQ4*3dw8*3 zQuipW+c6B`PMbR#{sVXPsnC%}R5F1FRt}<>#h*EOgz4@B9>X0a^X1_Hg8>`}_xNNM zX^u4=GX=Dm49F14UPl3H*l%oxPXGi2FKyTJXiGQ5jlM97##(kt@em6VMoR+p1!w(+ zYT{rMp!WDqYRKx1G?{*5<-iBVvBhK`Y~?sc1-2W8zodf zb!&k`G6xY$h!HFJix>b#9K;-Xla$o2x|m%~6qV*gdGZMcv@vP>+~cG9;GbjGC_!=f z4renh-o)92rzJ`EQ83pd+=@ArwX1>C9Cvm-dD6USy$c2~-%prdf)w&frkj9_9S$Xm zGLw~Bat0kus3(VyUZdU%sSHyv&% z5C-GX-C8yPD$<1vMgN3u1N|N^oJk$4rLkZh3@D%rXU$nV-Tu)qWaEXJ0pZDwfx%-0 z&^e(D4R3rLh_M-9i;4mORN(+s8C3tE@nj-qEc7gl)j^QLJ`8MXCSg7j;0u~9G!iEe z7t%t&62FwiCzya000Uc_hgL*4a?RXg%3UIfutpp1E#YVgxUzSWA7cN6F}{S&KAgI; zneq;M!2xMpjVv4h+gd;`%xN&T(-WQGh00`7>#B*RxXs#wBh`_^EH23jP|aztEmR`f zKc&aVh9Ls3G!F2=46i$R7}TQzJ0SZ$Tm{ZgoS=}jH8xC|2OB9`P`(($DWGOorkEZI zaHolMYw%GtrCSR{aVu?<^!1j7^yNqVl@_!`r9Z>QZ%~2<2vjEG^p9HN8@kY!S%_s! zD*9Y^;rz!^e3@5Rma^1#PGvyu8{3 z5m_qQ68Ob6Q$OB%UT4|N(ye-BjhTNcLcEppK**R{7pullCGyh1 zurLb_jFTL6eOR=T=%a(wiCxsgMW{WFVBIrcF-~flGX!sE-RM-mHyb)AVpX^Jn3zfZ zAoq;$c^C<&;D3S02`_;~Vssr0>XvX5ll zAe!ItfMlR)z_0n8o0*R51j*;dhl?jraU^=)#3iZ5*zhVI0REx2C3?$pl#EMcW z6ckgay-OJg6mhJLc4A3mV??lyT1+{^R}Cau%%rhfB0L$)#|lJj+2xTUMtZeauR`F( z39tvfoE>C9KnmyD4a{S;R!{f|&R{3}JW`zZDC`Wr_deN{a(1#8ec-}2kUHCkO6u4t zN4tpa4}Lmuf<}Nb^8RCdAk|BfWwqr4OeC!BY7cCH7%grj1uRG%(E5Vxk#1L%Wrtnb zN=VncrL&K&9(Uyok5GNfXbv z!y(5(Wv6<)BNZN5nB@a|Dw5a_Q^`+bmN$!(8K#)ya;@DOpGIMZ%phP8FbEg~u3-d1 z=o#mOhYz1S|2sX>kcoEEvor+@+z?)-6g_vJiEIrkgMdN6AYc&4A_PKcFep*9P?LI9 z=~uThQ3jod#UD7aH$JgkbaW=NHLMH*1_6VBK_H6|2swNH_e>uQNLP9gv}{C)tvmMO z;MD|!fI+|@U=Yah2!znn&Y8P1uuYZ|wk$up%JC2z1q}iQ0fRuUKp>^f{WU|IzixdU zzN-58$CH|_?$L8ahcDlID4MdqE{8~(48+6Z0m7!y4}84XN^kY_xPEn=M3nnOnKy@Y zQgdE>eqCdVlnKD%vPm01>+@~+t0QhNttmH-y>ETJ$#)#O5}ub8s+7~Ts2*ul{@@i^ zng*?i#0&Fs_d1aAEpOqUA=rJHrF>5n^!75Z>{PW%nb8&Hq#c$k5@Q#>VymyTcCJ`~ zbl^a;*44LLx3}i$ZjV=LcpCKf7vY~`vq>c@4We=+NlN1ZDO>I-uTKA-Nz3S)E7KiP z+AVS`^p$s5J&q5V+`7x$_S(eTNTeHm*$?3k`n2d#r+(wN*VB)b>G5FW`c*CK_jQ-4 zWARK2kBrdRrX89+?AcLs>b-iKH6o?V&0}fGG@hJ{pusTOm=lMW?mO_$NsrbEC{N=b zFfa2G>pVJc(xb%A%bb)PCiBGla!NBS8HC+O-j!Q@g|(AW1u|kjx4})1)@3(4cqmTA z$89=vM;SDTLx&EO3%@;G?ePi?_pSIq_x>XMQ|xl7WCh}#3(`^<4>Cu4`HZL^FMRlh zKZEL*g9QIv|CE3Qy%S58D!XjMhQ76U?XhXyvc~oMrX(>9+|o+oQMFXZJ6e7{bNzu^ z@3{PckXG(YmmxH~O4WMwjm~i|*x>j`&lvx7ncyVOW^t()o1L&^*y;=yOvUiD)Ln+; zQX7mva4@+RwSYq#)<$*j9G7^|olL(gcWC`8`r%XheH3Dw#*iTe(#Ttr`HS#Ru{oxa zl|HFChdS-!L7;7-xNm#({Bj4ZY4!fHf3*l?R!Yao7+UEwD$d#9p*b%N{BFNeWxIEd z(z%;H>oqg{^-c!{j#^47FFZ22S^qEl2A`gPf^s8wXDxdtZOtZ`cL)AP#>U!j=7Ec9| z$T)~rJeVDtJ!J6YIK)~!)n9#(AvC-dQ%-QaaUh9M`_P<0FGzI^=M|0vlRy}v)~2iv zf1QC%XYh3fKYcciedOKc%v3u7EAv$SRUbe@!m!h!;m=LMH@BDVF50F;125?gSiFU* z&w6>m?x#{ZBnoNDR@+|TbWu;DRnX}b;zjAxA!P;79O`C@*Abp-%!Y%v-Cp|8hBd0p zW2N0wHf`uzr>;7DATFXl{c^6`_A8EbkC;4Vl~+9m=oSLNLe-J!jn}uD{M^#nx@~XF zfCr|p+Om>5mGNNT2R-lpfMwtL`u9Vd`D?LeC{7f`c*CJ_2RO^lcFSXeWTY#52yZX^XG$S9~fS@(Yxz6_N`T0 zZQd9krQ$ap=-9FJp^fWR=|1TZYV#*UW-g7Y_hv~kBq6@^&_{lGPLyj*FwL5a{d{^(y@uN#a!!fgJIWDs+VPv}h?HjnK+b5_S%440+h=FcDe;F0)lj4j1KoU`Fp za;LP1lweWbLSOQ6LO+$#E>S4`t=337yu#Bc0=UY?Ig=wEpD?60vrCVMYEAtW@M;dV zOV4%iS1N;ESF%(@!iGc1$t4dRaM!!NWUW$7XHtu-ePrX(rgi#4Yg-Mj(*t)*7~jiL zj{&=dK(J(5lp@Z()hu0s7xvSoq87R1Ejf#1+bV^nP zltKT$-PF^eGKz-%CdMO67$rU zUNXO;jARuC;)A6QCf2?E;act)b7^o`?J1Z>(Zn{Q`zwPwmSTEeiy$AiTc&ekpqrGn zI(*Pc&rJQ$OOtBer4Dae9be{d!sM_Y4#~ebYUl95MCGpQ(9jn{UMOT-D?f99k9WNs zoHO(z_fum&sjUwG_{umhxSY!P#?u6fFPJtg2j`|H^ss+!8pYXU-qjJ%D*`6ku2QPQ zkTD$&&wcHoK8el#`AMHzSFV6hbExUfKVx1;zbINVI`QDf(uvLLK17~UvQ}O9kDE3o zx*I+s4bo=oV6I;{_oR*q@`y<-CojL9XWy?-(H%*5FJ@r zE&g;;V(P^issJyPa;BFo9T`7k_GVBXnmY@7#hh!C`O*jC8Awp6+6~l{k7uX`wM$w> zG%J#*)_gw~-J$gY@tQHS5Mw^+6e5$M7kh0Y3>0OX@-cbd!5I001BWNkl@a9V*NB8ePB#wVlL2+R4D5dVGk`7Rk^`$5A52qaXfZ1OwsOXl`0!FC zwVpOxCx0Ce=wN|i$*RWd(ZsjAK#tW-`L~y})P1)aLg;D@IVip3?xn&{P+~6jqdXD%N=U;>ff;M$j7OpiSBY|Q?(J_Ue8|)&5;^) z8h`o`(Kmi{Y_If9gu-gpjh?0&)C{vU@$l?5?9Nw)4C_6Om0-?9tfp;j&De1X{4a!ERs?@1!=y?DZoMEQ6*LT!fmeO#* z==6Fil?teU!wu?e_U0d!(KZ-Xvwp-Bcioz_9>Ca7FskLM7CV(wjezwSuv-WSi^`hD zYis52me@75x+(wma=H4?k@>DMlYhLkU4VW(Q?&hI{+jSI0S*;1h55C`8LTaHe~6Fl6qcJ!Fdk_T$Pfb9v&1QyeHxk}E;*r4mX8O3%7j!9 zI5Ka<@R{){qRZe1!f1Cj70R5Lb$H$zuT95u{}dYbAK5+^nvfG=H9F-w1TZAzw$|$p za+dEGg_X$tizt8COo~CkAYc%<<`Bs8^}*3&hp#!%j6nv09DzWI;%2gyBP!yWQ6g){ zgRDELzGf=G7-A5}7y|UL#osibyLJ&c_xpuw*EnO@RY1Uu2Uh`fBhny{ zDF`GdC%F{;A!G`}>|}D`kKfOqJDrr2l$}D2tke-O<3Z~9m|TNE&PCwDAAf{|_gzh@uT?* z+)%LKKl0@-kflRHR+vO912Y(81+Z7bGfT#UT=yy4D?!kdH3(cS1QHYC3Kt1gVWqH2 z2nwQ&BY#bfB*ywDI#UiFJXoh;%hYKun|tZvpCNhjUzW@em@z43r9J&XTx@uBB{L+X9kHBAc?G|J zkU@ji3~OCz=SQpOjlrQxe{MtcX6Lka1Tb{X2O zo7T`O;W9)fJ7*(sRn`aPs_uDx*oyCm(3j|&U=T0}SO^RsI(YEV;aP-7zkdCEIQyq$ zSTqeu4I4IGyLL^DIx!hoB_u5S^gz^OjiN>Vp4DG&xbcqeHx=RAxcO7#%Xh1BYTm59 z;dWwbih37MjWUgS#Bjd;&PG+Vy4E4nrP#_i#i_{VHY{n>*2%{KW7C8F`#Zb}~#hT0&IlM$FT^M`--e{9Pyo71A?$>RsNZ(6=_#gD6hp0@m_ zZ{qj-no23^`t3ku5>JIbU0L!m0vZyE7cZWXjibV$h0mNi!y?bb?=4ibzB+S??@lJh ztMDic3^^ebu30bg^xnkNIYE~!(c$W>56F}jFAiMP;++Z2-g_|0Hf+tXo+~venZ|)(mMHqgJfiRY~nyp7>yoh`8k|RM}^<1PsH}AdmwPnEAtu6DLkg z|Ne)|>Qc0LndHC!P|4V}509=ARpI7TiX)ZRkQXcG_Me;PMtd) z8jg)4drHfZnxWga?4i`cHM_U3$)m;T_48(}rxB%a&H9CGsa7H-$i|CfW6Ci{CbF%e z?VE@GHfzc@?(5UKOLN8+>Z^u>$z>E)szRfl?NU7MhdRumdHDm&U?AyM?aY*UTTW7j zWxjL1A7JiJRy)Yp(S6*Q`&s;kJSe9pz`yc#z5`5G0GP4TrqGs@|8YAAFG& zrDs&*6LzV6KlHr&14+2Gk!luEbx%T^Y8ba9u0!vpKaF1<*CS@h&#J?aaL}7z5V#f* z=yc~@1D<>;jUFBrQBGaD5L%>YxvI5O2gCV@k@Mt$w*L3UZjCBmoj$~nI)_wpWjvt4 z;Lkt*Jb(Utqh@W>F&Kbv(L#k!9-!W?$fdCr%$5xaMas9AgAH|Z+t%{!dp=e;kQyF|AP%T79fv#yR&n#G zbB~l!P0KyGjXG<@?V-Xc>(jF}yLanZ)M0)K>RQP(ghV!{8w?e{)#%=+r&6918ZVTx zXgs)#emc8p*Qdr07`EaC2X(9WmOjNtDjWU5uPPQ z+5{OYgFr4pASR~Kn{U5ev}m!k>l;z7TCox(FH667?_Qz_3k%!1b0k-%zxA4eqt0%SSHb zVMCodTcmyrpGIO!XUhh}a1K$SnjBFUsb4L6J;obrW9n@Dsqh-*4{Y6grl!J{R5My+ zgi_BwuW+bdaCixIcF^|WLDA~XIPO%#Un0hXKnkmq3A)n<2cmHZ^glmv$~twUY@pe4 z_4wqavDXboEG(y>i4T=GN>_C}P!SIf>3M(8H+HCUG#ye=5tY@KqbGH3(IdjrIih77 z_2RH^RGVj_6~*Je_)@7hUCk+U$~A9taxnsTbh>loC!c1;VKRYIzC3k02(%!eQGu@1 ziPLyMk-z``n^LZ1NFY{jw>v{C1FOEcr%pI?iUtNsDjZc_ZQYxAMtbVZt5dx(6?*PW z`D)Y)Z>8a6?*Ual23=}>I>n>)|1M0Qtj29moM>lJ#VpWG`7$GRWYi^vxQ@6_G z8U%790%OO2p6P?Z)~#FT&YepiINOf<3_jwM{xbs~QPevZ-KNS%=mCJb zZ+hy#e5wbnHirt0n(v*u?9+s0I8TmL*crp-`yKSDg-@q0qc|q`!U`*oEqi%`2&<5@ z_*et))p#~lXy%@=Cz=9Fw6%0ZgmTK%Eu1Fjx}I!%drD4>12OPQD|%Cn3Sz#BrbBq| z5M8hO)+zJ8Tu;yJMmn%vZJj4OQF4u${9~s7swMf^Wi2oS1_6V>l^`&4!P;NettcK= zG9t1pogdKbJ}4+SEezv!Z>49Ag6R8>6uv5(z6g)X(h{LY?M4M}^gNqmvr5bNoBny> zk8~a&tHTH5>(r{57KIH>wjq%H>w|1F%?L6G7z6?!5M8kbz3hyYOXi+Ed$wks#sLR| z0ObQErFSq0#KWXreFU;(JTR++t6#B31A{=?5TMn3t-4LFWH3mZ97B~05Xh48AQ#we zR5S<}1Q>y)tvX&6B!XN)NlD4U!B_i{maAfXP8Dj#gPdA3MlXXv&Ojh5ejJS~D_E$| z*57_JXN@_dlC>6DGai@?qa0PqMj3-Z&O@MJLHgN-0LRxkPt)s2qpTSZt|I`AsRn_o zhCsf&c?#sqcSC`EH{OuHV8H@ue7@+ascQu1cm&LNkmIY!C}xKy{nA&od(jr9QrgSaOrez$%Jy*_IH^MIa{ z6R(+8Y78+5WEg?rLx-fREV_T54Hhh1Tp|>wRf1kGn7B1nHkgP@Tpow4_o#7D)nuN1dGo?>f; zw|r*8ifKJtcCO#DvuDvj0|uwmZ~4JesLN!NKj0JxS$11uG!LBLb-DKM}5jYIhcPQ zIjZZUw_=b`@rkk2`#;dRLCek!UR=Cm{{b#p?#cW4N7kA)>ZD|C;mgt78w7GG0-f%> zYw*xl(xtqdA4ri5%nEH;rtEc&VYZJ4*d1EDXobVuv4a#{mX-`&A#wj6`@Yq?v=orn zK(F80^eJO*4Fb6xfrc@SUVrQDnzd@B(GWT_Aj%8pPSG{PvqDpr5HPC>oH3-)?J|!n z;(>=-&3y3#{H7_wn&A(8sUGXvT;J}Sw}PKF;$wze=$IiYqLNxn+eA9wycqjj*3JqJ!dZ)U9gf+~72Z0-->D&Y3Vp0tP{s=h7gBy#Lp@U@^4{j(_RJJ~- zh=~hs28T4_kp25b{*G-@3<3s$3?g9856r%QCY~E*&3JIxXXR2Nphl5WmPt1V7zCUM z@Cahg4`d)U=LeaBL)PpUC6U{jU=T0}WFZ2x7n<_}z-#vX#mO=Shpbs2m`T1tz#x$2 z2zUk?^Z5h8!mJXm5Qi*UAK;m26AS_dfviJd_QG}g`-=)%-(QrR926WZ5|fjXOq`%F zIHb=Xvd&)(XM=!2Agd8D=LdqYSs7#s4%x9j*s*J0R<{bn-ym?EAW*e(Ik8mM2O;_R z^9R9sL-JamKQJo;2FR=o#81+NLw5XrvhBgwNsBdR8U(T#0XjeU>jJ*mjsne;|2T&) zwli^qLwbF{Gak5;F1U|;=RUuSBH~QuY7j68jz#x#L z5D3bX|HjA;=MTL^<3Xk?<~AQ0%5+R~149`MXk{R)1h4&~;E)0;`BHAM!suuaxE>LZ zA56X;EjKo2B?9&;!RI{L3()(1JOwv09gf$TxRtPZjV=bR?x{OMz^pdfd0 zQgBFKI!o~0FUrR8U{3$ax2rMkQ7r=jw50D1A5`Bm{h5l+%z%l3N}Du;fI%R=2$%sO zy@*{C^q2m=KqtwxGWhe4b1qlVRT>X=e=%fB*FNflcVnA+clv@cZ(GseeLxGPn0Tca-ngoMDu0`O#AAG(){=mesBl73ZmurnMisvQ-f`dbn zF8xKDMM1%N{LT-u>0#6OnN!{OjSsJ+I;h?YWB>U;B>`~H#0ItBU9VLA5zo}3@qpF` zGz0`p%uRqBT@3>1K;YZ&=DC#n`KKSQSEpJ!id`{js@p~ML$+_s#7~#oAA-BWpSER& zTIX_4>fb`YoDKLL^%d>YNPIbFCSMTv`@(tp3asR$i}ce?^vw|S;KiCx#X_Pe#dp1rQEiXHW@%1XWS_d)enz{Kp((a10eTrC8qemDQv z(Zh>oym7S@2qd>$)je+vU-8}GrhzgulBS1&xXI7lGkjW$v0eRl34FOmb)C4Rt8Ze8 z_g6S#rO5Z1%(&skqL(hwkf5^Y_i$1JEq3k_)g^}41Z6sPQO|z34$-}dztrygd|N~- z^}oN5FbJ5K8gG+l5Xkiibi1qBe~0(YZZqfu%Bj4RG+kv_8%@{7g9mq~xNCs|!QF~O zDems>6n7}@QrxvT6p9yjcXxNb@VwXeH`&bY%x2Cl=jU7;01izwBu*+RuZe156Baxb&|<^2rCi3 z={x$DX1N{;bhWVeXzBFS(YSv^eCcg!){nS7X*Bsv{fi_x_mab#aGw`-0koh%_HaYF9i-sO6uod*{@_ zJ$2vl{#&Z=zYBmyQwFQg>DHl@o(dRFt>@ZzM@_8a8Vy~nskrRKDgNG9YnJBsX1xTH z*HJ5`X_ZP}({8q~a6cV3M&?+;HR-8&MlUM-2Dwhumm;~8_aVgc^H$%6=IZgk?iR7J zu=sW+(tq~H@*=0kZmYUxEDMhGdlS}pGG_mN_(Ik;5X4)*H#?spJ~d%6QZn^htHESO z|78AjU^P-)6gaDVjti^Mp6v;5bbR}xd*%}QdVeG%h$+V7v9TnUn%DFRjM0|slHk=^ zD3k3KmUZnTR*FYgyZ_WbDPo}I-KHxKwm2N<9S%iit1Nyre{WT7p8R?qRSN_TTd>#I zEXs`0=eG(v9(TSX#7w=3Y|oFz+B^>W2vRt*#_`H=@qy5yy|X|6bL6t~^1HKH6QRHL z%aO47(WKZC3;M^2wgAFfqZgbwy1#?U6BSxw4Km{$vr{aLcTP5xfzPK#@I)*qDa zWjk)3&UndgQ{0_fTy0#l9YtDPI#_mEUda^7vlQ;ay_{zO@_Ej%Y{nO|4n;QF>Fx3^ z+aq`F0`0F4Obt8X7xn?<9!NS#*U);w|7oK*FSIcC4XUN?yj2fWu&|v;VAJ~o#HP@0 zP`}p8!dT{`*8a-xds!$J?CuFw|GhmSvQLrlT4h9Cp6Ksuu*Bbn@|}VZm6dc2+xSG} zcPY#Ls>#<^n=M||x$ZzyKX5gvzr_id7( z#fxNS_l|(Xpb~2NmD;lJiSXg)PjtFlf|&xyHe<*Xi2F=Km=8$N z2ak)_*i2j@)iClSsLz6)QsrX&HV$v`Kjk|2rV$YLAA5qGigk>r-)XxVoh|ldf6+G; zE0(f3|L39d0wJ59H)8OeFxrft&I`V`|JX-$a?M?QJyO^8QsMo!PE@@b8##wUa-*E> z{TYiMC)@du!sRXdI%tD1e>`Ww#VEXtS;Ic&b01h<{C-2TZyV2A*&ilM=1LwR;V@y`K1C2$Gw{QGf?2AOltGMs)Ja9MdgQ6Dw* z@tv(`_x=l+%2=!uA)JIB7(PF$ifYgXm(E$(N1(SYz!W>g-=eXlvY%a4&&f9qpO%0G z>=7eDauDczyG>KKs@r`bs~pDT`#@eZGJUuonO}j66~VlqLDTMNp8p1nD?qOq2Ug8_ zT!lxgNX8KUt1h)tge+eOE}*gFPb>J!F$^ZKvM_UeE_4rP<_6Q4*vhYX1m`Cn4>TJjlE1(H@w;*8P>0P9Wi?3^9 zmtPa12YxP$Qb2V@*fjIEcf95Dr&o|yn!Uc+U;8Im?jM890-2!fL^?#hHo1cr|ET(| zF52aJ0L}dgNUPTR2pR$h&GWNGo-UvJU5ax==w5NhysZuX2$-(?5IRyZQKrb3&ACbp znNrL{p!y~C$=CC|>7MiNaRIh%<5s1Y#Dp$d-CT_M^SSiQu}Y@7dD{>U`eaR|b_g$rObL%2N|M@H(6gJQvwU+_13a|fVilr%JtKq*FG|sHcYb_*t`&FI@3Nd?tP>u&b8zT$ojqDS zCFDlwOGY{)wRFLxz%LwNYIu zN(Jtkiv3k^AE0&ZgI)S%eMrUGKXWV2{%XcTt+t7gEP}h@yTPijQfLTs>gNurN#@(g zfY0U%XBm8siST7gx^xPkdp;`j(4c0Jib#HESo7FFq?_thcbxN1P*80ORV;zp+?wN+ zfBQtWNsH}v0JhBOyZAf*18{bA?5Vl&}<3IQPTBn)ptr+yX1hFBA(cHokrzc_Myt{+?Fy#k$7QY zDvsk(CDb;qGVF}a`~fJ}{T zcQ_x=5BZ;NIuXrvNO{A2yM3Z3L31|0+5Xq~0_nK-OK!0<`hN`G2SlshZ2Q*-NkSU{&AF)8Hu>oNb#j8j^4?dPx5f3EWZXd1 z{PnqYhQae`2H`KKX~u!))i)z69Ll&SZUlsRm`wq=yD;LHJ8S81`0B#snCCrzGloIp zwTdKdRzpkc@{q4#11wpYC203+89nHK3ik)f%#YsbA|FOGI4#|N3i88uC+|!eNiov; zo(8Tm4d^^?{(miiHm4)2&SREfi9M-ir@P;7iGAE6-*P;J^?c{r887oO>7_c4i?^di z)g2vf4(aa$7p}WVdglX70=_IkzZ(Bpx}{v%&y~1cYL=^~Ka;*SC^SFUfRT6lH*6bk zN-}H%mui$nCrNX_G&pZI-Gnh9_fZU5hXu1`dm{QgB`9M z-MhWyHjM-~mG>q5i+KFpKv7`@jbD)HZjYqUObQ79CD_Jv;c9cJFP5>Zn{3;kB2~Q|?MN_LsTGC{RY# z|3L{WJUrCgK9H60xBZ)3@(J$HT9)t%c$kl=ISN9(JP$3*3?*C&k?!qy<3)vlA<3Ui zpW0#m7Y(@h$r$Vke5bIA;)dVRg;_DhNbzDgN961}TGw-iZOzF4IQT=ndccE^O}*Y3 z4Vtt6a7&S)TF@Z9-yldqgZbA%I$>d77s>1eC^zl|L1D4u2eE`Y<79gn%LV!Tq&V~Y z09>$`$9?DC2ecHTMyJCCSc`Qpniv;oQqs4f500L*9C6x*mVmBr%NA`yB$fjOajZB@7u=szJm9)nWmn>crjeW7|?t> zj6$PTPb{cMh4if0>T&9^UdXR^3cP?)=#bj@SY@|z_G^JMX?9`K=v0XYlxRO`-lOA* z$4EVgeA{{Gc;d-~v^8-(WvR>XCt+H6JCoUOuCZPB8*ROO=@@W1 zKPm^oAF*EymR)=adjbQzqD(NEUfG>oGZTF|Nwqq&DGJ{1 zn~Vc>U%gYlzs0Wm6+e*TzCFCYcx2)2w7PSjMY@qlucJeGE=VWoKDs8ooVdK)RI8Ug za~#vugg=fPy)U<6JkUl|=p|;rIFg;w^P+rp`x~T~fcB>aJ^&V0*j7nBtkto^KQ~uI z2o`roi5CYU7ph0-lmCbhBaCAl1pU?-BKfB@1a}dr7E?!`>M~Eys_dcBLYlNT&`?<29rN?hHv_YI+S*^Y?#my4I^v=U)LnBuvp0^;&FW1N&t?k^B{ zRUqGs{ek?mpJkD0cEG>Dkc}nJo2GY zaXr*%wHny3c<8hXcvs4{63w_;HUjW7c|H@KwoTRo*u*?@{Xm7?9eS(?k}PaB?6hny zHR7eXq47H|6SJ95)BKToB6OpI>C0v^6=L}M@i{eBes7P3r1+cUfqS`czZyroKJ6R~ z-)I$`V?~^D?_`-EB@{GAAxt??3oDtIk99lr{R^CY9A_z51_^*1>_bS=Ih(FH2QgwH6(Q4SXZ?jV7-Ih#pYop3T1MMK#98GJ^3e- zKD@E_m3LiPvF%-~@9~4B5=m`NM5|at?k`$crBqqx9%P4YbtmVm`MuaN9zkfHa37l6 zQ9LJfq{B5sW{L?i7y?mJf7zo=?Df+bh5On5@)m{hy`KWIVbX%qk@s5HXw~LTQCuDK zZ1%g`lfW0I%hGATaz9bAW$hWGS%R2!FZ{{?eJl{`^J{+VQfq5#dNqgWy`KAyUdq$U zC6HKf*~fA@o3jj|?1)p%<%mAL29Uf$u~0p8^0j1`%IC@6PI)kl&f)QqzO~~hNHV#n zondP=TLDJD%J~LiL=f-LwZYI$yr9Y1`OMGc=qJ*1*H~i^{)pO+;jANr z{7zYC$>e9WzSqQmN6_*~MO81jH5d}8QQob7JJZmH62L>3^4~C=kTB?+YK{6tCFIHa z$LJWVpsg9Y)FK-`5eaMF?7FZDI9Q=#cTfKeTB@KNyD--vlF2yqNL}P*KW&}W0_)}f{){CM403N%47>vR8-~0!q2Lf{_9U4-0o3`n6O7HE8n6?DFs~wPpjU4YyElV)|eM65g zLEkWjtWss3jgbOGD!2x##y%#ppil5`MtS-?%%dNV*ao|xL6@5v9r6)fi4cF_s#$38 z{Kt!#Ys!0uyv4xj`{}HfB*xpc!D#@lky|X|`uj5GeYq2SDMk9R@%z#ukZOiF93%CC zDZqK*P3i7PYm;@?e53@w@ja^Q`4raigz~Ru?)8y=0_M8Ou94o^_@QD|h1V&hh&lvU z;{tBUpM&zvqk)Xpn-(G%3z_}4uxOVqmrq9>hAs&y1lR(eR5q#=uzg)5DIFld0?*yo znKGxK;)JAEy#+Qyqt*Br=<;j8@wK>|JawDi3|Cl5(rh|1RcLAJt2& zMuta9eITCv)8RP{Fp)$y7x3}FLFEAKfbSr~mz4Jz8qC+ZkwY=z1w3n9SbRS)RNYF!k3dCG>0AM6c1>@R$1h{#lPsii zsC^li5p{fz&`2FSApH_-{jNuXFQ>Zh60Ufpczu?`XD}RiN_|^38bgw=Ce_>66ZAZQ zVu-R^+DYjUsp*0t=snrjx9Sl$F_o)PZH-Ze$&*4UcR z;g=h*K3unKdKy&z7;N`atueDr(AaAG;00Q3eOuqT_X_lZI0_I?u(;^1@KIv1@1blW z;_xg1JyjYl@vh#`m&6%yAeW>kqccNi{cMiHi=(ZW&lGexJz00MjVM82WRti#z$-is zhCm{NVnPkL*yQa(35D&<@5NTa4)+dBE>4j^98%ApshBLS; zUL`B_TAeYA)KeQJUpG{|b~@d;{#QgUq*Hh3~*E5B-1to}W_< zNLzo&JK#B9c++xp2@=@*gj<^|Q9QOm1!=VoibD@B_kd+r7F7-tvXaPEaW7f$(Kw%& zT4!l)dsajYwzBGndA4POa&c+)8>c*Ti`=dBdGB6=D;&n}_=QtN)1&;C4G3j{!&!m*CI8o5nGmwz0rCjiY#q&-^rQ14Bn`Pz zW$BM(t1`}uZ(6o*&*BP(zzp$^FUa(z;8NlzGTl??^X%0o2 z)6~*(bjVR+$jV1QGh6WHx|FhF`WW&AVKRcp^g@bmz6HOLYqRxvko?4A8{nM6N&4Q# z^cSdq3S?AOmEw1Y7|v~IFH<2?%5_ znfR%uh7#p9ZR!*EC>;w)x%epEslgCekwK$j28Vsep5DA0o@2!=2J$ z+kJV8CJ= zST8SAcBeqhXIDJ@NiU~}%VhK-uEn!mx1c*p_uJy}wt7zD)=Et(okU_aWO%pAQT*^jr>I)3C$WZC87vM?M^|fKw>PWL~ zOYSi4DJ73o*;9FwceOwzsePnfzmV)oJ*_lCL4u!n&c>?cp~{Lx!z{jBHCS86Z+aAU z?Xu=2B2Q~-SZ^2!>979AC-bajWuzVyQn~thlqd1c&-U*`wTQcTy-DE_{@&ldJMB~l zTUX~#|J1Q};{)4I^1liP+!#0Dpxr16rJPP6Vvv>I6GLJ}6*7&7|ABEL^;FPgUg zs}AJ$Rg&n^D=cj=CM{VsE5Cgeha2{Pj2s>wv9z?A1eE2IQbGmi5%3#&_a;G(PRi;l zPei|yIGHM$P>$!xJV8Gag7h&7#mwHJ8&4C!M)9 zn{bUS>@zx#HP*>$>3U{x#9r&7+%-b&<|{M_NU1#7rZV~`6Nkf~fS3S$Nj zRXdF*jUgG&M9^Js9K4~!!pe{}T7!o4zAR1z74B-Ak2Iu$JIm-gnL7Iv&)|&@1&03X z{`SkNT&+mXE*c`mUe8lWEB}B=3)O9Lh6BN$&{Rg+v|OxdO#$~bo!58ij3VUzDS+d? ztQ!@N+YWa%C_$HiCn}qvj@)S%T{(`&=A}D!?CUpS+Fp#d`D;Tc;u1tFS9OP_vyP<% zZG}LJ=Y$G53D7ksLO3ciC_Yh~WsP0m;yTT86-~j&%Q2ClVk*N znsMoZa21G&>V^pDmH6Miz+&RyuTK88Z0a(>L`f=wPc3d*sa5ZOQT6;8S*2Cvr4A3@ z>jAQWAPRHyn%^heXtoW1U0e9Jkxy-%0?nU3)!*tPA?ZW{vgR-?!gUe6^hjDP)i-N= z(kS!U*Ju#DLSZpd&knz)bg-~l&*iC&)aGr9y_Szl~O#K z$#LO?aj!nbxLOnB4V^7Ns7#|a@&z25vFt{ka$D;X%sC7F)~mYS5aR=7q9vgBpcJvz znM0U38MtzRaycw@jNb#c=g$eM<+Auab`t)!mAq$-4O$@Y)>zm(wMhcC;*tbu5UCGT zJho}ZN-1U3n1|Lu9y{8;3|kv;N2{qiNeMGx*U5PF>V_>>)fJ)6SS%S)bD`m}SJWM| zkc<&0tY&Yp3d-a=&~OUz0Gi1`fE?l-*bF3(y;prt!NqdAVb(ejSK0t8KzY=FL74Lt z-`g4sqcmZLD~ob7o!DEPq@TaJirhX`fVxJuvho8{ZYTkU5VPo_ztN_MFo&$ax^oqB zD-|u{$6z5@!GsKG_fepdG-pSNP8-gVPQ@;U;L{Egyi9`OX-`!!|R$7qN*u-i6gUW(erf4kWLr?awdtqbSDV< zyE}UD_9d3f%5n{iby2!bOiy=2rxa_iB1J)SJar?o28Pn~nMFZ=Au9#9o6ibjMd%#Qf8Fm#d;p?58{0$T^YKt19~@>AAu zW*(BK%4hLGtY_yVB3lm1j+UWpVn2~A9Jd4-fI?*j?c(LVb7;4k2 z&b{* zPhXx}K33PFqlIQgmpg^-9z97*YbD0HZV;M0One0XfSD^*1xdgJ>{Y3llK#V{ha2dh z%UbC;H6Gky3us`?x|zmEj4T|KPz=J_>K|8H~>N+fWAQ85D8rYzM)HU!f$w&K(AZZFoI``nx6~*cP1_ax+#i^Bg^7((cX$1AfH`Q1JXi)WpPF2V)=92Ty=%c`Ut1*;$V3@SgmQ=E4!q*_m zns3z;Vi?oWAru>7QKynIaV55Yh8Z3A(%CqQ#))ru85lTm3959y99XpCnK{k}ucIT<_gifgVn#*{_D6O84OTFSa^=}V%3*a)!s%*XDV1EG7EwknBW*}Uw zfZlAkzUa9p_wS$l2u|1O?%`5@&{5F++WW?Qf^d~fquT7O?hd%$(fVAqo~{;^Fls$m zp$MVE#AJ2q+m0^DzwNJ&oK!J5iO+W8Pe)Rpd1!g6C$!Y6%b%SD%i4|SobR3LuDFkCsBClGMWVdJ&ZD*a^!t)ps5s%*I8&uBr5~xI(7Td= zWy6l>#>v^viv4CS;$sN~l?9CT0_br(t7H8+mxJ7X>w}Xs5d=IDNuZv2e;qz)$+&W- z6u?vtouYZTu;+(D13`>HYymF5DZX@Hj_M_IEdg52F#M;|JuM*1qX|@)n%b zeGdV@&eb>xJ};nwl^&Ss3vE+EoRbO_T)aWP1Xk+P`A$5H8bpEz*!TovFMjrEBWtMw zH<{cig2pxdL4#84Dw_*Pk4L0C4@q1`Y=7T=X8#>w|oT3_6 zk`zDqR&_hT?_jU-Jf0_t<@uMAt|7R%I8|3x1?HiUlGtBg1d^ljUbt|}QKBZBbpKmL zGVWh3K#@X!iX{51AJ0xP!2?h0{qn_}o?%4*yXuU@MqtT&X1Cn{=w~MfjTIKe>yg_O z5cw^`6;dr-M)Mob&MWkr3(d=itQ#QjmUNfLew{N;YW?$f7Q2bl;o2OUDUbzEP#&%; zRf6a!2~xvNQ3);=sRWB_45~jjX;jhkZ?s|YA#=!GU4dK{#RSo;m8E4~hjHQYAsz{r zN%2~Wq=%plvzNt6Cb3M%(oa&Gn5tAxk5V1XK;_`R_M6=T&&gBrOLG@^_s54T!Cv<} zl!t=I@-HBt^P?~eAqa;WM&Rkv`tjD*FiKFoXE79dK%HR)<^C0o_SY%+D~5a23dQd5M0-3J`i0;!|bf@n{?<8!Jie_qIona zp*N^8c8c>GCT{~|TzDy@7IYciA9xNsV5|v}#lIv|i!*K|vQ#b@#mp3GaL3PJGcVO* ze~6Kd-yYl2TW8LB5Z0L%DBl?(wM1p|<3eZHn>+hVbS!VI6pBCT;);~C1$lXuOc$6B%zTv z@RB{m7OjIob^2qBm`!D#Z@*8pR`ov>;m|5?WRQm;#RP)z+K^+rAv@e7IlEw^Gp)h} zyI}a=*Xg(<%!)S*I4;x?Y_Naje0psIggD1i(bPA_ush8-zZjI6kaceZUYO%psAusoTdeCdTQ~U#D6OtXPvw&>s;fS&AZhM2d0C?YpQSrk$qDg z1&1+?_=hVhrs3Knsc^NpP#=5wt=WPqY*!p#WQ7N7ER1v_8G4{HXrt$0C0IL&4942v z??2QU@|bKB!L*YGt8JR@mlDQdlSqfwK;2Z=mhK6*1O^yn5eXKMe6hu;fmpI>sC?GI z%IgFSLXZj9zXA)*s|*WqS)D>eu?i>5!`TgKqz-sQ&y54e(p}KD2jeo4>W)e*s}qiR zJ%ogQY^U*Rid?LAevt-#;y+Tzpa;mRFb^VFhZ@|_{$^lL0yn`M=&jC#lbDNBDHg(CwB%RF@|w;q|~e30^%*|uV06Nj#2>K zCoy<`DfAMWaUB-2w{|OXtx7xYSZJ+qi#_-XBIw0iNK)m~R_fVtrYt~?Mv>rgw zZ?_M$n$%M&;XCzYnO6S)T7X}Y^45Pj4MNmLZK>h)U%IK^c~;aI?Z}&E4$f)ZfTN** z8A+|7_cDv7U&Bhj>1Cj$h*5X~aZaGmP!yq3p7;$kCB~OIeTRR}ds2Z}Mt*j<(5hGu z=hpE57{+a}Y<#6zoNVKiPyeAf-`0iyA+^!FAdSqb*0ClA-U6p~9hJ({lHpD19OoSn z56wSZjUFGxD@ykY)Sf4c83V|16fJ*$w?qE3^4^`CIOBt zesLsV$djV*KPR=()&;K8{zd{ zs!MS?y&^37`aJQ4o`tG5!=2F}i^1pzjVhpxfYJwf8!+9^${hvINd$=l%6(q{!*Wf@ zFoSIZj{7HxkTU=j(gZ0;bbA6QJkZ8Ofe9HBY6&otJE7Jlbe1Ux zjBX|RZ}IgjeISO(cn*9U`K*_2#_IL_PEOrg$NXsOdP$ePJaEgnc%Hx5&QO|&bz^*7 z{z2}?<=-v?5|RUo%9^xQRJ65E=CiT(QvB)!74%Fe1#371F9|5f08lG}_V+gd=eRvc zBf4w8FVEuU`1a1|fG_qX>w>I}$ZMX($2lae8k_0&$97$6Wv}In-&nbc(yTmzME}OP zmZHOKN^GjkpF#_~{89_txb}kroEDoK|NdwxOI`Oyr(I%;9+^5=n^s0*y6r_|V@;MT zr5~Pg7p{We+ ?h@~-lN?vH(Ob?uRfc$~JD6KL4aXS(qW!Kwqn1bG4_5qEpPaST- zslrLEM`Kxa+QGQwyC&F4XzDe>t_D0*alb;{rkG%UmVRNE1|E(}E(;~#s1@0^%z3c} zoN^cRFLr4~M@Jhv>{CG0VRcbb7?=^@l2a>?uNq*iW2gTfHD#+&W)BLbAt4!i%DNU7 zS=#uKWj8ffX+9(K#4V!z{nwrGIIi#u#G1&(#nqk{oe_aUjVK&gKNKbR5MGnMcPzX< zlPV-9Cp|p@X6NSo1xw1x8iYgC#8bcy9{v|FcxwHGBo9tYD;&SL^clRAD|bb$2{2$> z5(BTzC8QdhHJ_;@^xq+pA!HpOS*O!Js@T4PAX;+? z3}(ji_Kd>keG_^aka+e13Eou47v3bBNeg}GV$B9=%G^=G?B%wUOHZh|!x|*Fwh(waG!{75}dS7OyTOfQ{DY)F3f)!X+Zc_`Cn#l;& z5OA=hriE~rI=_4xYv{Ef!}rD_5)9a;z7vdN7K56ao`zE-B7wSd_uj({uh4{AG%Qho zmqRJ^0=Cj<-(Y^?SaoLE4ME|pSQSG@Ly;%;Bm3?Imspb`tg0JpxcJyYUR^|-ZTlCe z7$X5;cHWK>sbuE1vz<9ZwsHt_1~BZ;lM6+ly3Tv z459B#`KjZki_a76j20HL+z6omj{G>$ z=|_1c!A@kjCtm$1x2}ygeB27fuN{=xuGLQ!dUCk|{8(4FZ=<&@7T2kN>EOu|NsWd+ z8Tk1b@nAE>Nh@nA4Wh;UWMG@7eoA=xmNFzM*aswoyo7!bXMkiX1e?mg+}XX(<(&M) zga)p-O?Hp29M7j5yRNQ=r|KNT$jcePnU8`_<7>kZ4S15bv7e)6(@ty1svQvMd!k>A zN{bIDUD+&OetthcqerA@tGe@1YXjMz{|YS{kl{>DY@mB*Pg^ugbU(H3KcOv6z(`^% zZ=paVTCJWQZKyb`W#hghbARX;MMHx#kOi|ss;~LROEPI3hR{B?Jqv?f1`gnaOb%Ke ze8tZXw4jGhJ_(9Iw1oMYQr;za`4(OQtY@z3(0NEZYG%-g}@CbtQi8@;?00ukbBp~%YnGvxV?h|I5f%2o5(NTb8$6wr4eDOUi>)_ z4BE(i9KYZtG-!>*e{-wb)*5`wEm5I4Mf)*JD*Xj-O}=e3*3)U5r_O@9oTqghan%bB z|Ih+>6Fs+trX)}!xn2{rbP?1}Nl?ng1Y=kfG=FIcg-a7hIu%rPP~Zt1e5V;q&5o0* zCFU6$SR@0FS08$m8-)TW9%-RHxP{z3i~BB}b!ggUd{~%-1bPcny>O@Uol)Nf}2_H^>4Nc1xe?1C%-AYPCKDf7#-^;lkL^Lnd-( zz@!qskPq2Ft{6d>ehgdBi+6cmCYSrHA-gAEx)YX30# zA00V>eu9+Z2NRg?c=(IU*h^@9jREWEl`^*k`!GTK9aSPOO9I3dV#+deMW z180VtxnfVf?jPZo@>R68!H(5H0fNu5$8DiR652RF)EEu&8yZjAqs^bdAKa%3!w$UhMj|#CPpy+6ix&W=r1*DJKe{GW1Wh37ud5=Pk^5E5_10wGl_(l$ zbJ%P6?Wt00bs(!Lpzc2A51x=cl6FhuCYFzW&W;h&M>1Uk%yWoR)Q|5&&qk))WS>oB zBC|(ZKC_&y{z5jf&9oY5(z_vLXWYPeFnC%i=6C5#Mav4^pKE#bvOp!$X2HB&h+|cb z^Hb5cJP$eVeNsGNI4d&>(I75W5O{~1gT8(-{|2)KOgUM4XZlrYvzqH)IxW4QnqP_8 zLr%?Zw33Nm#Y%`?gAEBA@DNa(|2?S)>P5Up`3@ol{p42#Svn%vGvFTaKc0xkBs~#x zEB|?^WMw(3(x&!s3QY0ie}8SZ$9Z-+eA&o>^5wl*Z)J8#xx)dmH|-1j!2Z1oeqKnl zKy)Zc1(#m*%X{s=S&pGYT_0V~E0*}!kc4w!alM>&-KUcwGq_vN2HEaYyGYRxfzKP` zMVpYcuD#caO4%H+g>TOQ+C_n@uU+joQ15`V(wW8s4ezI!NxgFe&esU1v9*h1j5C&h z2{9FZnmYyGH;{k(T!}cCkC&W1jiz$bTo{m0vZyoI&?d91! z+}a+q*vdgYroy421DK`Nw>Gf+;_*QKjl4uzo_BdxmQ$hcNW7<{hs1|KKWGY4)HV;o zsK9T{GE&9*Bpx^%7OQtXc}0l+l=^!q39XN>YbeX0<(k)-*)2m7r->%_bsscqH1nyO zN(^#pgFgv^9yQkf>AIOZZeLq@Iob`lDfB6!X4Ouf#j#HiFl&%mqj@-m;4;s^*^#%; zvNDXgHRtqhnBgwfOCo=NP}u{rCzKq4Wm46CdenhFc~leUz#_tUTOxzXua zG2nfz+tZUc!axEpIHuNoQfFpnM!mQ%h=OdU{zR3InIp(9pQ<{5EY?i{HJdK8@LZ&= z0@lD-@tnIZ?)<)Q$Aa#V*b6MDV_3FK-#N|8Tam7VE;36_P*V@hPU^# zne%YSLDhx|fvXjW$3sCFT$L|TEB9KUVh{Gg)c+=axh*VowRulgGeg&BKvhX@NILU+ ziH~f%^K;FHaYn>m6KB=$uiC5FfR7}Df@vDM!8Y(uBBODhFeEtV2mda^IG64rQv2ce z-!pP3R8fC=hy?=Nd&MS4KYiN%>}kNtLAV7akrFA7bqR%mSobBos>Q+E5SqBZ9@x%! zx$5{2WyzsYFL9GJpM2xDL*c>AEgGO;6u$aRQrKg*w0K>Dg}~>?hfnYwp|SV|V6LkM zHz8;a%K>n$-K9|KT?5q^QNcIb!$$wcAA&dvO8%mzKdy}e_3%pJTdu_~#KUR>pe_Mw z|H}*@wh0G|T!=~{{L0M!Fw&BrWyw4kwTfZ>m}u~bIGx-fm(Wr1_K%6^q5Ts81w77$ zPZSeV=o?Snz0=Fn%gs$qRr1Rar_X?2*)~g8YrVth(-7eB|BIieU+)Lu3I$Y{e*yZ0 ziaQwV^z}!GZ?-XYqW4C;_botQ@?SoS z*@f%Ci%CDpFJhRA%7l9B3qn1M z^M)Ej2?*BeQ#PPjS2K6Js0c);_|CJR;JlnZ_6W$>s@%sh9(nqsiGdCQ^HytId&_fR z#Rmo_&IuWFGE~$_K=PcixVQ!%ETY{C03<-&udMZ0g-yk>JZT|(rBmC|Z>8O-K=vy+ zrn@NmSTF40vtkLmuIGy2y3{tr$Fg(PB9e7`B+?}`kv?{ z|Glp7*-fb6l$jniVOT%->@H7TStXNgpeZXEiaWubH!A4Rs8NkaS2fC&RTpx7jbVbl z^m>6dw0<#_>dR2S*yU+0rQ{#75od|YfetAPAJ+?b=W?5iBJF%1Lww8=0sk|qzWj%> z;HwzR*s+^gfo6EhN?*0RSTNCQ7aFTe={#xJ7{LT|^4A)i%>K2b{&v;AuZNQ6u+`mg zR!Hm7e}d_wKA{chG)D5vO`NrZE~xkSPF6OaXgB|fx07zg=O=2wSulM(yeE(bE|MtUI6&`1>XCY@_&n4%F3cPyLw)&)~Hcc8bUZmGSYNJK@)(@L@NG zFQa+7Z=|9gUAwK)rDc4dr20Q@;=3tY?(+dLAjPlt@YTp*`8RNmjociGabfAFg40qn_&NvJ6>V=YEPME1sj|4Y<)|{qG*Z?5{ z|1~NmPSpQ*XE+)M3W?oplZaGtZH^z*tvhx>5fwpDLdR3J`|+<@LRzg?s5zCmPmyV1 z{-^=5^FEdgL}(y;C%Xb>7Mtm+j^7k_H@2Y`n#7c-WD4Ay8*#7p5$8(B*g!D9u_uDE z&|0Tr)Y;kG-3DifehS;zFs%azR(m5Epv?)UiTwI{WQd5iS^m&4eNewic(A7mj$@b$ z=rp+r(250VeVIfBz~AhD^gc#o{jg#nj9$PT7#x$`+bKLg*ka8+uv=0Gu`7W=aMbK! zBT)lm&cDfLHP?5gF*yHJH`mx3OB~(^!Pz zNI!D!?$O)}*6Ojy|K;8MZLeaIzBOOILVKW#TZZ|wK^2etHk)r!xUrB{b9d^VF3nr4 zgFf;y;r=Nf8b1*^w`+||MoX;J6{hYdPOqXT`2k620egWEUhn#~cdtSItxJ5J?*SR1G%Cn9-Ty7}j2$UNE*BTq zQ&3?^$$^1uDluN;}WpA}&BchB-@6&$^{1Ny9D+lqzAE^UHWZ5ZnHlfE)u` z82gtFRHDQdhA9QqKNLvrm$I2%=O5}{VU@Ie34L4GKh6+}yifr=Iyw>(;J@gGCi95n zF2|_&z45;A9*m`@GK7)F+^M!jx-mj{d;Vmfiv7}NOXcZkE`;~ z3do3h{}vE^%Q8|r_vE{~wA01p>cu)2s>mBd+%V`q%;N4Xz}EG)IaO}(3>kinJgGlB zgnV~w2$Jii+d9_MI_{1lUGR-*Rkm3UJl#Wx{Hq2>r{MW~q^T>-e1i(eSQp8(v#7RX z5C~WASG-^*35Q$c|28=&@&~`;_fmtWaFFvxOjxkj4_Nfd*+t z0g+Q3Br1IH42UzO`Tn2bC;NX)y#-JlUDq{=ySux)1$TFcV8Puj1PGA9-QC^Y9R?@3 zCP08-L4pK#xy|$bU)7zefvPj758XrembKR22d-uT-W0>N@Zhn)_^CkjP1vx+<>h)# z=Iu=F^UbcaVFa9(11K!Z?q+8P>#YtwbiU=c#T!10^(Cxmig4~nP4~%$!rR<@U$-f( zPfDuavhrpb^q3skBIf!$*hjHi$b6eiR*X1-{5vNGf;l}x5)&=U&Y>I5Yy#mMXFrO_gDP2LnxGm>D6 z01&hJF92KFohzzZ+R=^ohcE^DmZIYyJ-xXM^LmQcZ_W; z{u-HvzMaS2kZaf(;@OJgcinEn3V%Eet~G35qpfSwVe0WN9DZ~At1<`;U@9p8MVipH zkov9_a^&l8Tlrg_qXZ$~%a3BNZ=$Hki#7rOF$&Z$6aiaj62HaHZ+n%lgM*X6JSLbx zV!W*$-#^~BP2b!SW3x%Eo*MU9-@#iYIs5;NysWEbvi-ANOaLgXlLIh6R4myb~q{4}L)# zE}IBjPw=Qlm_w&>$Wp@?HxgHQXbE4XAuzx%$(;oM@g(ZxTYfJV+_Wp~4uK_UTgluyHiC`fK~ zLQ&~kpWDXu^O0|2WzSW;;1>J4&>js^^sMCq`qfIS3WaI%Fr46jMh}3PtjJR~JB!s5 z#Mb@W`EQ2kPbVfPzdat&-&@MmZ~FK6`(3vV{<9^|U{aWpfU%UJ$OW`QFVJH3ZLbX< z3vXWlT!>)~;7Ht>5rKadbjG7gI?nHnLMa&;*pnQTF`ydI!^30yH}l83j?QjkMreI2 zvPeoGTcL#kPNxM0@LCdZf7{WWH=Z}zKM9$bn0c7@2^iSf9RV#g*@68M)epjhrDDW* zZ01GBC)d4RYY4(co$F*V31|$hTeS{Fd`i z*cd&?eQA4DqTe0O2|S+ONvXD#7NjsHJ!7nP-xKIqSuIVY^){zpLSN2YcPYfg-X3p` z&ySAZUjBV^c6PQZ{jx<|!5fF84$U5ucRvW0`;KliL;O#0_xI;5X>8g;2M9Q)sM~H? zUf$>tLjtG<&z0NdQ@IM3`DS_zTyb<_DoQ-sW`&~g3+U|UU03wRp3saaT7PxF;~$?> z7iMQ?M@B||{d&s#de-@L*8Q*d&iLE6HB{SDsP*)a)tU0q(r#WF<_ zU+1T%rw6(*v$CEpRcfWPo7|oQ%+2NF%}6Z~?9lHB*I7s#6OFi?!ppoYeua<7Hzg;JRmji2&*hl;ZU-|qY* z!tHDRHRD=G(4akl!N>1L-bMlE;3|k7q%@Jvt~gUv%s*3h;%y)3o05; zp_8l5`ntc+@`u(+WIAq$_oF%r1tfhu;?FsL6fa z=PKN0a#s9n?Jl$RYy32a01{;YFI!Ilfr5YpX=UmO;~7AcV;#DQ@An9`akj#6?`TB! z=AwdtgFmEocjFXeM)mPJFcevG$==YI?iYd1v1d}s6dkIa)8`Kt6u5ud{r!Yot<*Ji z7e>d>0e+H{%T$*f1UpwK74CJqb`%dchg1Lo)`!VdEY;M;;*BGy9E)*a0sNJ^5K#Xi@o)Nk1YU+sBiiIq^sQ+=udOHow+2JFsZn$zqfcgk z;h#Xklc=!X2M}oEffZcOYgQz#zD>_WvP6g0_NYE>(s*eJ^2L;MWR7xwj$$*fGpW3A z^4}zs`H1jmoaKwz;PLD;vk`QM&zb9xIAb#arosAV;M1249X&mSW-$WDb3eqJYs7v>)0D+7Nmz-_K?lr?MeT*C({huYxU7pJQW&=K?zyH=BDe@KoU0I$kE;G2FU@Q~piU>~S&xoa$dTBdd6XB$oF?JjAeHW9t z!tkX2F(qHpbud~NzGuo{h6dsguW=CV6WCe*6}8{Rp3h4U6SDy=5M`eo$_j#w8ePq0 z4&M1J&z2Cv+ZNRou?e{D3(I3mETwnL$BhZ-?85e$Ck|iXccKUuagsG}TW~#c&DMZi z%7T1-@MS(nK+g16Eo5MfN0&DM+uW13Tgb%V;fmAmgxyLwWC%9Iv*JNUkcqN<4$RCC@4fOf8+ z(O{o02$%CYs#;Q+nyzgEVhui)&$E$MT3q(s-8Dk8sdDXrZUbYeaTF+_Vq-x7iW@f1 zC5~Jf$OXEUus}C;M8`~keNS5mtc*x^vGr}q$GLbD5vaCEfCc8jxSZ>}ElkoV^P;XZ z9HY9JfpAp+F%}&N-y@`Uf59KL#St0z6mNcOI=l0!?p|E{CP=pyVD48SAm(s9V;oJr2&e^yTqd5nH*@^j(3fVydkFlb?#Fm$MkKYEC~c;wktq} zGIE*Sauy)?)nLdk;E^~r60qm{(Z}3SD^)}~5aK?G{ zttzo#0ENg;8^q#5+n)}?Ha%OqTx>%|BHcfm4R*@|@goGk>5@^xMrw_r8~M-d6ePK0 z6E5B>aDTrhT>C_wVYB~;8f7?Aj6sO#EYW|USv+Mi!O;- zUExov)}fHMWnMw;>Q5-_O6Ljh#SUp?(4)9Ojtj;_AQ8Q<|3lv6Kx_3smS;RN1~18? z&jwyqT}jUNd9Ac~eA8~xy~#K>CNQb0NLbU=^6$O0akUAK243#e@y$t<_}_^?;dX?+ zj6AQI@&Cx6En z-XRz*2jhI$L{O88YD7poQ;MwJ9RWtBBIYdrgqdFeCWe8|NGPrN@F z4xWhT^Y-;!ldf-T3u6Eb(7BDjiDF0i8lpF*S8x0zCjBS;jwZeKv- zf8^U2E&AVCL7WDc39KYCOM{tUmT*he>*5$e?$(5^Rv-YfKqGXG@IOZuHL+aQ8GV0XadvO>2c5V1hplJomZ zQ$t69L=arxBTK-}A0@)Vx1gU8M(M%-ALtI_HH;|kOY0`}R1g{CU|>D&)< z6y5dntd%m}yQk1Iz{)iga2%vK?Yw09l{LCu9#DLxmGYytVx7-FV>y&`8Fp(uB)s{! z6{2pI>sOt&%=bZ+qU;|VmdNDm(`Re_d;^e9Doy6eS2pJqD1E= z+<6?`E4B4M@cj~0o=QU}5~X5eXRdZ5{xBI!ieHESCk!4*k;(Q@zN?vsj1?wume(oc zW#ad;ee2E3z<>$q@dI%SCi)-c*R`dK85;K zt^dntxP)_it!vOky+}#dKVj|jv}^CDT-pr$>Z2RU!}*B8qsMiuN@t=VQwXjW2X}{< zjNxymGF#)@FAd29Dfs20OAnaGb_A#SEPZZB)z-?;F%i(|rM>{x?XRA|?>|@oln_ir z3AVU1XaSy0b@neaf8uzX_DW9D3_tx>)?(vC5oJR86u?wVTj6{W`4iB`9xXky#?2ka z@iT$Ysz7lARgpnf&lGY;=#6^OApgGS94g^$Bap`mb9Z@lVeB z20GAp?Cw@o)?&8vJfx`}g{BH$ZvKK=D}S|FScs2EGgOmP#6QDx_ooUh zyYoc1*HOuFftd8VD&+>#d*jAxxRiY6A<=Z7K>LGZG1gP+|I!dqSCl>X6p>6fvC6O* zzV2tHS2)v6vXEi}9sK7|oTl2y0y`ws`d;^ibkoKFp#;*qP+|+mAIy(V^tew$%ME)E z=}gt<#oOItQ&-|UX?sNYwhY$@Ym;*E=kc|@)Q+fd>!p=>wuTL@qwyC#jyV zTD!GN*eWde1)#emK5|w#z)4WtCLAJ|R;yL_M}bg=c%tMd&>Ll!bvqA!#z3M0*3>K5E*t zO`nCi0*KkLpV0>o1`HtT1_GKnZ0*VK;~L51bdT3Ids81Q#t%H+9EsoZR$Kv-^=b zZe2!^35L@2L#WiSAhlbPOV5<3?PyxRN|?vI$jpfsg9SBD%L?wvu55eAibiFy%k` zx96{u-eM2yRplP$cLYaphO*3QGB6}z;8o=FfXlCWo2SA(Yj$^Hpxk+J&bc9=O5#5S z>Xy+H*vvu(Z}8ep@9*XSG^TA6g6%H6pAAnH%EZ6*kpG{gK8^C426<}az??Ijh{}8MR z1TrLV2WJ520*lZ>Caw`Zz=7}|J>L~9P1ElpO#UZS|32Vh!PD(-6a5tYhtz_+<JvD%HHP^(EwEhbBsd@7=LNCh+!rJ<$E|N6-;oh^14KahbSr_J z%i3UA3k^8nf>i3_)Zkl*;|$)0bXGLrdI5$UpsZP->$HL6-L7D~Dn9%_(GLZG?fROn z-_zE5)pm89z1#`N=aE0G{FsOj`b zyhTv|cYonLQFvZvox*D#+0~$I!NH-u@TW3E6I5SmmGG9j%yA4(up$N)`Ts)pMPpcD zrKQ)Mh*u?owGxlgY)ZkLhM^@BW3c$mz7yOZ`|5t!x= ze2CMFKD0hplB{?W18t@e7qSy&ck>{*DyWDrc3 z?HUo!VdQAy6UeqQrPN~=E8!1+?VB#t*vLY!Fc$5jYIdY$Aj#MlrvM<}cPnrG zpw0g_184j*^J=_kyLw#swVq)iLmY;MvS30~$yc@sR(dQW&+_Wy!E{QnQOTfnDh^e=w9Gww`cF%X>#D9R9g+<7j;R-2EHNPV>Ip-Bm|0B95B z&(%KGQkxqg^(f~M-RbZ`TLDFHaCH$9Fmr%((-Vlgd>l;_UU;o;s~l!gPi4E}d{sMb zZ$(p`BfMf?keMGEeZ)W)-lK1Z$WS)TGtvk%RGU_=grQ{93;4KN4}qqsu)78Nk^rz7 z@QXtgAivOj$!lBm<5(?;Fl|KekL#_V)dkxuBda|=KdJ{M}A`|nD<{AFSFYmD1@5DP%e~l1F z76-+<0-pd`@_jh)uoK&o^UTuHyKlr`jGNsC%4N6ZZT1b`MQ>%xe7+vx;m1M3|1Yrs z0duW+DiU<03-qbgKaOpRZT)63pD3sa=`D=`jH4G|91HYk;l}-rWgt$1<8{9QP~L3$ z#wTOZ)Ae(lA&cv0ulIO0|gtP!QusCQ|bk6P-O2w3!tGP7OaUt z;3tICzy|p1%UoN=X)XVTe++&2>zZfux5XbQ!OGAZt65!f{+|(`oQXw$BZrKXW11Ga z2|tkktT*X*|AX|btD_@OqE8bA@VdGb=i86D9Q;Qqv*@8kwQ7cqWWu`jt{QVtNU+R- zuT;z&BUJmCuEFJ)e$QuE`LgF1PXEr%&USYf3!z^mbyZ>;Uh;g9ykXxHh)_^>Iy!wV zTmSCS2HL{8C*vd{`JMeza9tgTYH(0cRo{c}+5=lQ-rK{;V7%CLb$aF)zRPJP7XzYz zRB_9VI~F!xPE~qDCsf(+bgJcpKOIR-Kl3tE8|%VAv^&L?Z2xn)zjbE01o{2L1LOq= z1hE9~4vOKyfE2<6xoDhcIr%~TMexsA>UM&d?Bu(D72B&!y3UjDT0Zh1LO z{o{kwGy>3rN*k1u-Hq=j{aN96WcUvKaPGR-il6~qsq{{Ke|K$q(jpJzFc*}G(Zx;# z@kjTV%tW@>&R7um4LUwp@ZW?%$pi%OQjk%Vu9GwkQdfe8L3$qmUX&0?5|0EJyATlX zZ(LyHi;KG@yOWirof*5GlbMYb7n`fIO{BW294Zpg`%$P0^3p)X5_C5N1XKzF6fmOr zx#Jf2h3G1;?*RdUHvImEOl3wR1_t3h6;x#4*O7=}5V0gK*YW-vlF{>&`0Q!x;to++ zHzf}Y33>uU(pDZ8?sl%8b}r5kNPf0v?v@rVu0DQT9GqP2oE+?2d=#8qf*b;ZoP0=* zc1|YtNLq3dTpu_%dHD*c+%bSvklt630*-OFv$6Grs6n3+1V+*R8+ErbdtaEs)6U5X z;=>&}BJc^~`zKm1)}CL?+^rx!xxT$mNB-|r>^v+S&48)y5bfZWcwiXeefXo9yR)6M z4Fs4NsE>TVw*QX*>~3KNaq|{@{D0G=T!5ZL&YlprQ)&Ic7~K0bZ97j#D~O7-1^WLh z_VR{2@kcbpS$=tQWK+eQS45ylhb*xl4%%_LfJj=X!i8bdK`z?quPCYI)0Q4t8&+h# z0qr0%MZ88KQUGc!d<}6(=SD4b_&Paxcee4g=1@=QyNF;5!vjSG84HpXr!K&>^+pgM9L;7&`c2ck zcazq1C1*wh$+Bro3l=wGnh`l(PgXs$fq`Z`=HuNaR>@bC_`#I`qZtp!z2V%bhJ>8;$INyTwJD9(sVU5KQY? zAgCS9qOe=icJ8CGkJVlTCZ~eHU#-B$^C9$E!DAM=wk~=$y#~|0@kD?<+KguJL-+xo z`=P?+cd|jNV=5f>l!K^YukE}8--hSn!$H2uU7lSuQD7HPah#wP+2qJ5?eouTsUD6X zaR4(mLKBmaWEqOnS)!7oC@ccSxo<=|{HeoUK5j7$Du+u(B#1H<^?GGQhf0Xf$NX~9 zEyFHC%28S41F!WN(_B#6%=cQBNF()lj0*U~?vPJ5=G&3=yR;MG_cdemxV^KjKmU1~ z1wmifdG!@-Eb6w)?>3(mOy^K0A(e*Tf=_WA_?JdlUyO)axrDr_GAREN*>xGUWhWd>+MXl#~Y``h7$dK`;H>far z!N!MB_PfcQ<6qc{vY5uv9pS+9M0>KF36=SaAhO%NV3@EDR1?_Kx#F<0_&uKG27SPpATFBQNG(LzSgHtkxf%u_^lhRtO2 z7!YOo&>lUHT48(mS0(1bLUMM&Zdq&f%pQI#Y#+^9OtO{+$tL9q<JWm*n8taI}Y)** z$&#mC<&1efackT^GBRzZ_$kR^Q7-~Z4OxWlTKEjQDSt%>f~OrPxPvDQOW4 zsFz-&uNK7~58NfH{1K^*y%FtFGhq=OS9=nl4Qj+}{q7)D?x z=QUDkeI#cs9*lK@K%XMK zITxqJ=;l>TvkIXQ{E4IN4p)>AORbdF_X@Al_z_{K&XOK1O;;9O5mzU)az609Ykm7K^~-Nw(}u8w7X9fZu5A@;4WLkZg69h&D4o)xrh zn`{WkN?rMcfDj%nM`V~XLl1NHO``UO4oWJhv$@?h#V5XG1$lh;Y5>zqjFeRPij(MuigMNI;IEHj!%CC8dh&?t3hh5omNFpllbO*-{ zigNWzF>5|pP_c11VjZ}<}4 zK3wr%?h+ykt<0Am@j(;TjP%0?zT`ElfqE8&leGGVerz&FDubzGB^;F)PS7)(UjOMu362&yXQ}DyLR2ZJO4-qBfJ|dta9Q7A zK+{3MDnMx7IdoajT@dS(D8oE{T*IhIfzefbBa9Wr))ivp+0Xbf&?Fvmuo~rRQnHvd@g`gv@DVWK6TLp~u zVD>MTCDP3^@Z1_ANPNmkF^M{jYaEs5wB%s+jb`Tb6x$WO_;9ScBywCD3QA0<95vQf z*NO4-I}<-kMd@f=xS2E^63et=%U&)stjdNgDlGvPJ6?x@Gz^~4?$P6kYP<;{N^J$O z;-l-BIzpbBwJhTmI#Nl81NDO=O>uFM+1ELfEVe(VaBghBNPYOL3+GW2^3o^`gb<`@ z&t7`#H7iGdb?Sdi7-bq7kur2TiczUA>FiBQOdwqkva5A-$3_>KW0fAbMMzibTQzTy zhr_uf4$ET3w%L03_}4-EQACI4{=|NJarstPSsA%m%Fl1LAbe2S-*Df7_)XEf3ngoa z%eu|dc<+yrtks`ht|Hr?%$>RSSJ!L(rMKt-cpa?taS`evACR^&T~7Q6apcw~(v4D6 zZE#L~ee}xc>j`>=eLPF0!CVXcRM5gX*W=VUrpeS)IQ*ZI6^M@$Cr)+sQkPI*_aSxC zKB>TL$V#N?#8-W7s*xSTD)(5n3k2*D>+|h>Y_P!;Ye9!KbAR)A{%NYiTIruN32Z3$h~!M56I zyvEk08i5r0F^WplT9wEJed$K5K*z+9ThE`?v{leGF{P=P7xs+!@yu+VjoDupxd!rj z@{?u>BlNX zJFlqq$F-hf(ljbNn+$#q>UnT@ZqGwYj>|QpfcPsR~VAWbQyKNTP$R;y8MS&Bd6XAo~kr1x|9Dv=pkf zdnMd>$9IB4kfQRnrR=!$HgRc2hJIFC$t;(0nY;+aOvHtJjlGt@!(Y^&Q8y%gdzP(~ zfA&Aj26>TdOMDf;>7J!uG&jXYONMBJWxt^#UdY!r-z|1j|LW-#wSg+GwKr`4>0Y~W zHD=!z#ls6jD2OGwqeNW#5~tawf=YFDLY|X2m(|1buZAy7j`#sJ1}(Y;g9}Kr(>~O# znPjzVOe0IzNnx?-YK3w-ck(3ukEV`{<_$ebhi4PMS->(9M9Q#yZ9d?mu#0IPK;cWpbi-0zp+zZCaQk-xjCE8deVM5CA zGx^UEp{4os!(8Q)58r$_2)X+fr1GZ1PI`du;*siMB%~9FJ|}8KNVOKcE;pA|LqZD? zK~U8FZ@=N>5?4pVoM$TdWK{#KZ8{ToMLbAKb&vc~p0i>x)x+6vvB@Y{)yyv#8!kA? z$|kuiyh!|M>6a!Paa+D?RbumaFnx#h(S}#OO%@4h(k_ZCNcydz{(?f$8o0qDpY!2_QBMI}_zB%x1*SEe2rXW^ETS|y$atsQ?NrmfH(NFGrn;4PU&RuF6r zLDe8&J#`Clii5J~C{a^N3{$axixr?*%}FutNH<2+OP8V7yhN@TX6f!|y;(rGLSYvM z1#f#7^()ce;t!VWjW+E>--I-e#O5SaiWQ&5i{FHB(jwakj_zd8C4#0sg80X;T=`YP z-rrYz<60_wC1Vo#;?Ux%h-)xHXhn_EuE%|gcNtwmMLVSghe~6fAa&`D(|LvniZFD^-Ug{5gS5jB6K7HT}(d422SB6T{epB!*Z5E1kDmdYnge9+Q9t80kaVl_EaZw3~XnvUtdJnX&n!9 zl;Dm5RQfKP4R^yUf@rJHiB1?$z2p(jE@K+5r4QnYR?-2Z+T|oIvi%t1~3- z)WF151+=o%g5*Oxn?LDN^=cy5NLZPE1B@$T@ zN~(3%i!Irk@GV^u1G#aqc&-=MGsD$rbCF&5yvzzL^;sjFQScp6c^5HP3NgUeO%X!8 znf4mK%*a*A3-E2@6ckAla*DWYvN7zVg5BX)f7IF`d(ipGSfy`LWHO4@HLx zKqcjcCMOE(YpxJnLV5hSj z;761aC6M0rSFy90@ZyR)0edpR;_D&m%KZ!aFcYi`Zyc7o?0P5hGYYkrX^7B0^sk#m znp9#In}<7ew8b+dARH8E!MXBxDA1w%Es56;jXn)6A*Xn=?dy}l4x>6lb1uKOMR1O6 zedg|}tRR71R4~O|>0BL9gtaEsm&k9gzHZ@$VR>wdkBUuC0zHhv!&$FToY__EwRVqA z;sf42mU$e4Mq)fURWV{}IGMScK-8S+3OV zPjRMqmLh5vLhN-!m8S)Yr4r#(J!B)9!d(}zuqOR3{Bqkkt6t3u&y8F^H3M$oCYCE4 zMfRLuO{s=Rkan<5=xX`I_dA(f28DAz0H&S4p;-Q4vR^2Zs|dvZ{4b#3w;Mf($~p7b!~D z4$!C~(-yr&YQG66NzV%n7s$;1_T%qOyr`>{OM!B=QM-g=yv)6OPK_P^?wFb+{)9%@ zEc2Da`)_SEd9L4Dt&-RJcbz{Dc|Ie0=ZXigbO#Z+-7Zf)1B37%|A}tE>$^(~kc+N$ zcKhM)4fp#m{XGscK@b>^;oN0|55ts+HzP9Yd(4DY$C<_5k6|N9e4F|^7G{N5t?t00 zmw?;U<=|wZ1GZPlAB%)QU*S3khU^Z5vk;@@;V+QP998PvW+>S6DqMns+t8+Fod&@U z3Rk(wMszj_TuTPRdoRfrw-W59_86(Jkgb%uk;bR^?4sH6J;AkFcg0Y5>BDJ|Y)FhN zi)ai_%}|PQEW{E`oCx@F746CKtbPAz9D?dQ$ZQa#e8(CR_tQE<9|6v`Dj70JQWb6Q zP?8A2QjuIhd5)l<6)9=lxsk)3g4I57ho*gMn4t$Op3q)~iv~rj+0c70h1NZ$1CD5( zk;p+wyA$V?^n%gTD?laXy~9X>;V1ets|J?MhKSKA6@wKl z7|r19ZtO-k_yR>pbXk{MTA7e0Gj94c{kRkN71xZX9VnE0WD~c-%M??CEc8JrWy-JC z%os@D{$k98WXlpy$;tUBIt2-tuv|t2GUu>F=b~C4+KnlJe9^j)rf5L$P=Sj3jH}pq zk(sTWM04<4*h)-B%`l>Z7G=9djo>t&$|ABKvwe-xikYOQ9@6`Q;Z(;1@!z&UP-y&M zj={v2ltI4_-QP3?X9QyrRON1f??5S zQ>rc#)fzQyjS=Mfv^`uy^_hQ6btYyWHMwWTHRQWD90cOQvk`5v68k#D{mHN!5a2{~ z%OuYT7FpKeD-Cf!saYuS`o4O+c!=THv>2A@+= zU0!BRT~@x>McRcQ$dvP07Ye*7P8ux1p@B2-UCVl_IE%+4Ws21sfz2_6NSMmAD4!z? zN(7M_f4DMa(viAS0Jdgud<(ypj?Hx;h7a;e6a%gg0qPAw>?ppabjdKf=|g5_zd4fl zT>+<(EGle-L0*+r^=L?*2l5&=LYb*pVXTv)bs09)A=e$7j&!Nvb81s$)XmCyn z`f`OQ?(V3RL7Iy(3`{NBbP!-R79!`t5lOQ<+5UTOP=u&?!RD=!E12a?IR9CLiXz-e zdCQwmPLY#?xsr) zHwBM(aDUDlrTcb%qZ<`=8qv_Dxxm=T&>rG|M8?QWRmn%k&{jxvRSsxzkWiNrMV4!% zEN6BYa|HVyv7v;Mbtp@LC>>W7i{;t?_e_S0z9T+`dHVid#xv+`e3Xe{wKN6aFfB>L z=(|)Z3R(y>_SBr-Fv2B4Qle^HMm)r&Ch8dt0ZVwzy$Tl#VU+e@kZNW=Hzz_Ag2O{r zQK?FReY*N6%hDG4eme=L=I{@T(xJMcGe}42LF;j1$TWd`_smQeiWu?x&QeJfnObEzyO_JjfW99yFy)J;6lF$qU5 z1~oHQXOyhlOpa>_4RKBWqBI$G2(+uD68zy2Xrx!brW_js^~;nSh+7n-ZnlG8F$5^j&Hi{hZH37pL&p~M6b$B2;w2`*KvIqQ zWc5o==VT_L7G}O8=%qAKaQW6GXkjacLHIlmLj?(oO>~XR6*TEL9SlXfV#$RLgM6^s zKa?sBhkY;7lb3?k9`MfaXdidz8l%!=jj%{^4A?RgB8w8z+$dHj*ZXA5T*hk?X4q?;7 z0nG+w0#QDyrO8=rEkd`%AY(Q^V~)d?bE(lqWL|7=K^Viv{-_s~w=*I+nOVSUdX|r` zDIK7+bG>&W$4ES4HUc{sT@i;_4ZjY&Jl#ok8R_csT8?87wpRV%GaC%~_Ii~c zm!|zw$E@rZW1OPB+Hm=E%(#nlok@WMx%Gzamc)oTvTwyn2?yOkoJ0CFpEkJof}@im zZ(&z}mD>mDUh2)Z0gJe-snYITLLGDf}EvWhkQ3idoN?0QU^E z?N(_bSzH1f{J9u?-aY}cwdP3J^o#|EyTxtXlxxGansQnoK6(LRxaWO(QdUx$^LbvP zS<5(w0TG-ZVX`U+)PBMNEs3l>?8A3OUCx4J{pBj$r}? zuva{sED##j(1)_CE<8Czunxazi37*m{i|&H&0G4X_t;PdSYgiEB-|3ToegH4grey*$3{N z@{q$KER--N+ciPieaT4ObRdp0JDvk4TOm9xNM>qI+;w<1!;%1fE_oG09b%2KOdWzMsO*{Zm-D7m(6>2_Z?w7`5K~8SCl_>@@#+VkGdVI8CB~FjdaDm_Cu1=>`Vzf>Li37(Yaq}Q z*oSzC>(KYz(lu$x7C@v)a3rBe#Cl{ZZsMhp%!x(wzVH)gb6C#&Zxd;*O~}|pywW}y zN4UyYC65w}C8ilVAX0Z!^cFMwU}EeD0(Xd94Q>>yHb)B3j5<+6YXuz_fC5Nd;4CnS5yg zT^3wOzz?tr^(Ul<@d%9}Gf>Cwu!xoLxRnBK;slh%?a;t=} z3!b(Thr)|}fbMihU^%I*A*~n=FILKk4&4Jw#&IgFaVv(GzO@9kH(U#Xm^ddJ%XL_p z$R@oI?jY3-lUrl%v**|e<%$}IKv}trOkGT(X~lVXLg9D=I@4={A?4k2C56EMX#ozk z9jC&{zjD~0tjC~#)S}2y36r2H#l&&0pTksWvo11?43B4!^-i+5Cl6zn z__ZP!w~CT#_NU@YA#>2u&@U_u?umVw{kVL1{z@3(+TDC%c>Uo8VS1zQ@Jz0_i+Tb! z!U$+9f2NkF#5yR&k%%YPHJS-UCz#3;rW>$Af>OmZ#EYzla%4rv5X-F>VsxiG!$pQI z(?1Mp@Z@BUWphs-G6_NXE;5*e;uYH|>2XjbN#^y?pu?gmV#&H9ya3pRa8V+LishaP zjzS?Agc~(H<7kjdd&$^I2jNsd!0~ zfTbOOI>&=Nc{5CyGQB|eS}H3cEju)pdPH^16e}O3${0ResoPRk#Jei9YI!+m6RkXE zUHSvQs1#gY)e$;CWu=jQ(vj5};M^gL6m%kh_qK7^ioUq;;85QXXba*C?C`-_PX5Nk z_IG+i#V+U&0QD33u3##c?2E)fayA4cl%GNiG2$eQ%S_{xII6aPMa!6naCZyaUr>ZI z;{4+|lvK<@d#HFQWm-9KgosPXykJ0Y+p z$C-efdmoNsTCLR;)RgcB6ksii$$vRaM&{TtnK2Pa-x`GK2<~pd36S9K?(Qxd2@u@f-QC@Nd2(Ga#>BC0Ylx~3J&_r?82;4RMG)?F8_n89DR&t#d<;l1`(ORXGZ&q8-9FU|8nxrrEG0)$EV{%>J zGGVijPm|YBCF*wOY=+gQqesJ9eUVn&j|g+^%P_)U!SZRUAs42O9Q0dTc!?A+{IxQdx$h4I3mOU`JkGlvgz*+0Mz_0L z0yE&fcVNwgli1X}53@f#0X0{RilHu1%?uqN%cd1q|8v{#CT%DpnSe@Ock{J9kO1JcKm+eM=2B<6?+ga5eNJyd00tSv`uS*&% zgtwAyt}&g>=4y%i{V#AzLU$>M;;YEbFhdQWzi_Aso;|D{Z2o8IeE;Op7$Q9gAV|9Y zs_RB7+frlXS))FW0}dWr%{nZTtHJ4toC!XLO&Lj7*sCA3Zj}9W&yHmW*{;avHze0hn9JZrZ?V1*QmDV{{|DotyBg{ zpX9!qXZ{=a=oen(8ymy(Y)r1raGn(F>>SyG<0!O2b1FnSbDiBZ3Gp;|0~2^q)FC`- ziHZ@VQ{+CCD^zZ}Mj{UDOZa|%wV~g+*whF81Z0eB2qdOm3@xQRKHYI+2m))VHc-=C z#GXOzRGxSf3YXj@%sFv@Oc{>6d{jxs)BuvawsLH0m zcu){N#Q>(sSN#$u0FcS=ucTqiP_kbgAbZH4%QCuw6fsG_#pDQk$lqb9__o3Wjx81) zo`4=m%zqBy6_lmSbw#fJCx#+fKB^=leJIN3bs0YX8qG93Nx&E$o#bMf@4Y_c^$((x zH?rs-5pQ2km9L@X`P5QH=s4zd!(uId-zimpiO79ztEea-R3@=Ran!W$J+D6fV{u^s ze*~E>yv$HWCF2pJsoRlw_N~8X1_$^@?N0U{b7ZoCE-hao|KQZ+Q*4d2;l5C+`Nk?2 z8SH@2_zD!0e2JY_+FL(GAlK3&QeO+=(vhzn86b#;WnMkg$t~R2*+pU)<;`dxxkkcu z(qOxM>nLfI>*$A$?iGag6>;e|_ELl@XyMXxq(D8#;Y4T(v_efx5T~*u>qS)(BJ@SD z?jyXG>;0b6f>J!ny|+!an5$Y}7smoJ;4JV2!pMVD@=_>Yi8iNFRrk?Z+QQ8Vdh2wI z^io$?4oC{~P(Y$6Zh!xRsJ|aybr;A{r@@D@sOvUJCSoFUM^#e`H9+d?dmQu)iiZ=k zjp|NB=nm(x<)#|LT=<%`_c|VjPG&~@`*gNKz^;)xd{tnNfqdr5)BIOoBpGR?8kn&^ zT~mV4R`x09c0E6~e=sN52W2kN{bHpUEuU&vcF3h0l5y8H4nw5tn~3OLLI4@*?Zc8F z3lSQ37=9-1igdr}L_LAV4^UTE^_bqbGqJ$p*+w5F14VfWM4-allzk&T(D)Vkk6Ata4s*^~}iWq@ay zQ-(~*m8-yToMwFn$7nH@S=i6eC^Qr@>1=((Pk0ga@@9?XK*TOG1^wB&P?rThjyiR_ zOqqV+6!alEf2kEV3h-!tH`*BvQ!HnO{u+iv$Kegshi|b+JY6d7{KdCn zm1t*lN>@o}iQcTuf%DBXa%|oAh;Zm@W*m)aPnw1(Y_h#|lgltl_wh3Qz%*a3WuCd-k~X8K_Q9BYPQ zBc)brbCw~+h5_~Ho}`GeB02H_@_^B*#_|<#B}Dqvj;#c5L5sNMI&HZIIAfUpi6D8o zkD)^#I3r!n&WS|fL_f~F*hnH)oqI&cOH!DEDN?8awmdhG-(qyGa?#y!LG}HC@g#O8p#6$PC+m;#ERchvI8$na%3Yc+t8 zH3W5mx{+EsCRR$S_T;FtWQM3xNt@Es(X%Eur}>FRL@F1mIg03tudry5ZXU^X$<=lm z^~(w3Rm%nvrL~ruQn-;0iR(2{H89kKGlu(9`j{cbpIUW&qQ#A#2B^O_OV(TSt{=4& z5;Xf<*bLDOSxn)36z$at(j+$)&J0l$|8Q7rO#KtjxnK__(A6IAq@!ac+=N?;&2C0eE zJ)Ehr&yfRmt{WL*?CTP&`eQ3V^p*WH1dL^DnaveJ;mhgY%u`~o0Uz%Vl;q_4i{CTU zY{cwF+d4+aonQE596Z*PmqXKc;?s{KV(*GM<+6);3T|q%L+cE$5BCA+*{kB;Pf6JU~+O}Ud?`MsV^2#v3}k3oZ(VI8WoD4qfGsm5e`Ond56 zn_@l%Cn^TUY9bM7Ni4pf#dZ0#iA8QfY}v@55m_$j_`lfb{~A4&5W+kfTV(L`;Gs$1 ztB3ftJn4D0PMXn-Am$&&`u}|bUom0}sLQvU_AjUzwBivNCjZ}k&5+^p3j_zPpk@{N zdyUmP5N$*IIfIXtamI7r(nQ1Cnrzp#TAw#jUfz7PwDX&Sq6950G*F@|I^56-VxqL>CH#-@x@7biS+@bZIFZ!UVx=j9;_-`!pEh7W!D7?2S34iq z*;PMl&<*D8Tpd1F<#;ETG?}(tZ!XihKQ(`sdESke;N{6{O!LwF&c;R6?0-*;$y}f> z6Iqarl=0hQYNh`Q=kxN`W6j&et0g~x7R@l}={YZ3x1!_bvN%_K_XyeZ;qCc2KKVOJ z=?V7WHgv-6&2F9D-0BT`L4_USm)K@c%A~j<36jqs;(g-n7~ru!YZA7|JjN$xkx8cO zBTyHKjlMjU@6+ZtmsyoIlLXLw(Ky@7cB*kbccHVUPFp~t|M#%{Op(yj!qWfNoZZb3Gl%v=4qfA!omMfzbF zNli6gj%wxsCpUO{(^Hi&{342L1eAwvwM9Kh!qVw*dYu>9aMxE?Qjlli-mMyY=Sh&_ zQugqy$Xypi%RTk7H_~ty61`LF5D8RvW+R6cTl<-p&+QxlW?CW{48<%%R-DO=*h{@VP z)`MYzyb4{OUbg`)O*^&g+rjqcd3Xe+f)ZkomPvaC;lVmodVKTq^Iff`4ZGlhuzq0L8(&fA)}{OshOTTbhl$?jbg2vrKiScSOAM#3gPAi2+}h{d zPUml?ra6~|;((i81v;nBoXa3u9)qK}qN2@hB-+WNhc37GNOF)4Gok?KLgRYZnbE2J zV_ipIa-`wL_ca=ervWMpi*46`|w8F=Ix~#xzIsvKnPPBrWU)g-tds9 zC}fYwY`vPtklpmlRG+eT0zOpxVDGNloJJZ4M5{Ra*?og3R{j9?)L~Op3lc&?LP9$2 z1*i)Y5UDIv#w9pO(3OJNu(!AO*|4IgY-NA3(Q$nAaqne`ZJmlS$DQEVk=wNu<+~sfXl}(g%8W4NS&zg&QPeSir?EBMOACZ78 zgV5!ZM+UKA*7Gi+S+k`DE4cd~K5|3SjC@_Jw*v_ouqXE&t(S`RkM}{c6zQOfBGi0Q z94Z@|Kc#Em-o1a7$hocEqqwZZUw9_qa4@=?k1rp%u=}TBgb5I}c|kCmtv0RS3aQnn zy=<;(qceE!A75K$%FeO=Ma<$K^!2r-`_m|JR`0AT?QzpKBszik%|hf9p=ce2x<<_c zn~mZ9yltp^;aW2?V|pl`7J>e?m=tC*c7kTdp}yXEVcYq#nGX7Vc5NksI8;+aI=N6TPocX?2Ou`fcqnQW|N8?WPaku}q~x4Z{=G5qNB_m~5!?2F!1H z<-0su9B*#~&};O3gN_(uxo9^uqim~Omo)vMgea?Fvd6QyO5RR26CM0hd1Dk4VSV>^ zxUO*8e7Y)C>jb>tacb%d=ovJ~7c4twbu$*ngI@wqr}42~diP?2U!KBTE^c9AHAdYn z>@@kv-9l=nnfOD^YgOBjml5@8yRdh9au$l-y5kccRDe5R_Sx@8N3Y;O;B_5CY?`-R zszVR&on{(edm0oM=Xug+Hq~PF_?1=DM4tuPiYq$rc(JC0mzJb}hz!8Qe!cr7qVX6m zEJy;^xKjAp*6v%-Zz5p%=>|mIU)BPNuuU@wrXN-)hFl<# zBS~h-qbgbf>)o7*0xlu1`=na;_59aq@NEjxCALsnsTk`BQ*F7#vv0GrL{n~b>@r970cs9$6Yq-?rvQ32=}L^?>f@f= zI4qMS+ zhc~GS9Z)dY(Z=W6AHf&UGw#`l*HML=hJm)$e&6TtWneI%i8=Fyj9XnL1XFd6rcItR zP=Aycktgl-)crUcD1A|(B<0G-Q1-e?pF8R#rQyUDO#E#_>s9-J;rA(K)}46;>Sgl} z>(&^~rJF)tna+pjp&DlQAog}WR8rL7ahYJ8o-mu1yMBh{*Oq24XE}gUq`z+_rzIMOeTrI>H8m}XPk{^z9238l`pn-yumBbg0Pq3 z9eU+0uGwbB2RbAxSsrkS>h2O8?N4Z{xYD|sKiH+iDdD$jYWen}tmdBZ2c(+OL;IAMJMy428s$5Wb{rBB90!j-CF`LwFQ>y zZM*OGr5$>y37PX3PIFaRA#x_t=}<0--Fq86#@Vhr3ndFHRzKt$*NNeM0dVe~T+!KJ zSKk}DRGALhw!lPwv{pJc6a9{=y$u~r^_6#o@~>tyP?^3rwQR+_9bD+4;2O$N9afQR zBmL^fDaEmd<&8-Xadpe7*rYY|Iup#f;N)@e{3+mJg@=i& z(l7`y?Y7<9`5}UMtaRxcm6EJ(mZQ*4rr~*(DB=G%o!8R%S@!*BvK9XVECBHgvG}EWT8$B%q&{M zJO+lo0F2k89sAeWozQi5!^n8=q%~*dkb1RetF51tGt2wAARXmz=fALv$f9y-`n7)S zoEscOZ!4K$>-(=_ecNCcVJEh91-9;;t8W$drPmCqIZXdH6=!d-`Re-$vp^8ET6&Gw zb4(`4|MFf08h(G7sX@V|fG(A3aeT@JIa7v2=YOklBbbPSkQm{uiu>w)Ps>{}^1|W4ba5phG-&++9)6vk_m~tN6>7^lUlGCTg3$+gZq3d~3 zcM+uS1~A^^HQ7vTj`cyXg@2sQdawU%(Tt6a&E)gka2TT(l-ESSo!IY(ej;KBn7iLj z`R(xIdP@hoppIC65b<#|(7^e+m7XuLpC+M~R7L6Nqq`t2{l!9S1d_zP# ze<+jJEVue!&ld3Q7QkiNV< zKQqvd1>Zi$aYToiL5%49Hm{i{4mL=cJO_^gne+g6{j>?2VOA3@m4BR7mh-#^E5XIyX$1ueVB-q-fo~7HLklao&0{YX((&G zim8PNe*^E=z4+ZY$TU-J&Ic7Sv%S(vli1E5ZK|=Bu~W_M7l#a>&t+tub-=kHp7YzNkXt@Nm`?MsLE%cz(IY?5!Jsu-!-|Myz83` z-F4wcpp$%X5_PWiaPK>x*woAxWcSB(MfA5T3foqDV(a$$b`(gqh{YNf~*6Ev!2xBd(_%KtgyGq z5cxkfv>NYS|29tV(`hv2Jhoe@bqJPopj&2Pt=pf-_@vW5E@j8zZE3i!ro$pU3XAa| z5jc1-zlEkgn5g={T8QqY;Cre$Q9!1se*xK+k??|<@#u3V?ZEpt-AET>GW0dlE3mw> zgHHKa_In-}fJbWD=w1gme9H6hX@KQ}$NLJjROUXu_7NLw+_jZdhriN|XZR3#bjfWe zZ4b9^o>j(Qs!j?yuHY9j*L?P(;ZMTjY&kX8OYYV^0y8S*8m)C)9ja`y&rdLH%UQ3> zpOw|?)+)qx4F`b$ZGaDzAK%u2yV(0~ikMChybx6qKhlx+#vP?^BYO1HxNBh+06gE) z(UhV6`eAlDXvQzc%R#577bLL$u=vqCEbTjyrK7<^APYsYn9Bou8!PQk4xHqBz~{B9 zG5(d^XVIqP`jDS%srTE>>WtvkgSQ?2KzPcrr}!5Dp!dG09o}WzlHXm6Cc>Wg83f0! z7cEX=AWF$e&d-b;6+^$JW|#!3Q@l3Y?7is5&5b7LB9u%V?Bk4O`Ixtm z>=)^?-(2jk5b?uZ$k#T#b{xbat%0pEtX-Rsc|3$xF1~i@GVZ!~u|8T_GV)z)>&9Um zBYH@pK_Gu7t;|k1TWu_bKe}8V1s)pAXZLHzK!4tn4I{6z4Kd(Hk$fiq93-ow) z?5ZYpQ9tZN3Fz>hZ5&a)3r4#t%jQv6>9l^M@U`!2G4O(`RvePrsWYa)u-u*X8#V|l zSDY|c-+JXpRD+M^0HvfUM=H*a?w`T1u4KR>&?RMuyFSbq$M{G`)Gs9z+cYP-R;WuN z&*pnZJ|h-19Wd;t3)wYn0YitCcWy>mf8GHvj7 znXH;T_GDJv`o-_{UZwd?+ti1EM4IWfL;J~a@0($To5>xIdW3pe=% zfm$uc-T>4VK?%C{l67>8Qt%90Ru?R3Kt-y%SUzqJ6XKPSUi#>54J}tfRI8ajXb|nr z=}N)f!t9l1aYpp1=Xbl@JgL$~fPP8?eD1`0LPywIUD@!sF;DtpPm}^rBOfs|8+MWE z-0STpX@X253ml!oACY@;6w(G=`nl+;RIaV}GH#XQT8VyjSt1Te)9wpLMW)LlyI6zp zJ|{*c2?Rx&%+>>eodgvLc7*qT@p%GdDMBfC+t>As->fGdy6#&W;`U{ptr*J7hWXaj zcJ$_c*V5KFaAlYpCklM2>y?8h{?p-<-?i@Ou|4B;J$dYi%tZ%^KKlgkM*Jv*1IjMO z=-VjQSU)3`XOrd0kg15zg9EXR5y*uC?6Mo6q{#&qp{PEexUD zdw&SuMBvB-IY&7N7f?_Ac-HLFNx^H3f4F#ylS6~ zR94UW`9b4kXlCjBa1u-^@8n+0OjPIBhkD)Dy&Usq8v3z6`XTYC!$|0XW4?bjpGz`X z{*pNccv(&F(iYHCVXyBU%JOnp%!ewEu`sh|M+6*d7h?@!wt_D1#lf{atUeqa=EjH`6Pd40S+Ty(yi z!*@K-C*a-Av{Hp15n@0~L_~d7`g>xB@>Uz3-+lLjqe=fPH#&!fj?#?Gm58)mdt(r6 z3GH4Efs>i#9NXUetTq}O>P+EFN2d;9fO~D#S{79PCGa!KAKMJH{DgD*e8|aNf*byb zWixy|jPZ8pz5u)jVwFXz`Sj;Alw0E2lY!NZMKe5byX&pt#(ppMREqVj&~4awvj(9A z`#1pQhZ>sR;0lUn6O=#G41w?JFn8SgBc{48Yjsu5utmW$Ysx~c?ZokH3%yn^|6TaE;2sc7dQLLNKkmI&Aym0N3hvR>PaDG&%c9Y2gjYL>~6$(uLKVhdS zI5rZfA1o$(Lu-Fl)Pr;X2j=@1D)*HUf)J<9=bBMRt|9$@!)k))!rePalhMp==L6`n zw+)5f+rLp7u}c%z!B=1=)+~no+niN2Ic`|K;&e&zv@~35&C=c@MIKBrgymBbQlb|t zmW6`*Q8?`#$^E}NQ$OI`fXtp1qr={>Sv#36<`YMNmD@+|>CP7SO2sz}XxAD2Tc z5sdW5go{hGL%E(Y@OVV~+RTYKkfy*g)2K=0srSJ%I0{Bps%TY{)Mi*ghxZL~_0??% z%&B?l?OCo6(wnpt61Lb`>OU{^7wJ>-)OyZ!eTjH>EdtZ831sK8PG)%Ta~%a(Vl@+e z^VPfh=m=#1>)NsP4<-8LuTdG~-vnv$!v-Oun4ODkNA&KNUf5UWnT=iyN*Jf^>nRAN zR!1R5o~r#H(9}R=lhj1ujLq=wch$r(>? zYuT#|z`P)rfxZn6LMLCQ>=xJ6*>*_LE?-#a!7Hw8#JD50N*oO>O3b1z`?!^iN#6M;yF--NydAi~Qw*`y}3uj=SeQdAIjy z>06(?#S>X)OrRm*NmnT+HT)}8y-?2n_*D@`Vt58>x_e=baZfjRU>o?JtB`wLX-5jVWT8joIv;qxbq7wE;p-p$0#fr9%B}0SZwa{4kZcs6$*HJ4x+>5MGraDCq)dJnTVdQr{J;QoRxKsAO#evq))o5R^5|B*KP z3JXzEQu0|tI-4nw#IMy5C7bI1`Z-gZxivx{m4+Q6LTpxE)9ARj~ zKC}_*?cIxf*R9y(O`xO#%Mlu;rI?Dhziv28kzG3s9Dpwm;l3k#11zx1AdBPtaqZjz zaHGw)?cfhqbkyqx=@K!uCSf1lg)oOkY;8?Q=tp%7a}eMXNtz87^H+~MmN_C}7XOiK z!vM!#prNJtbmOA64CG&gV-xsSWKJFgTn1b=NRl?5h5)|Y`v5tQ$787%Uoay;w+nlv z3)`AE*E&ovQl30Zp5T{UxOA)aNQd2IXf_5ko%1n^VTZ*-ORas96bjm+9~lw2ko3ud zFcnQJ|5`?ehyY$cfBww%uszeB!To1G3!)2xp#>yXXb|u?eYSwG``J0c;rgu*>v^}~ z?~ljxQ0lckCT=zX2u*2naa1;35-J0P?+YcMR^~;eS^xT?WA&@MC#nh zy2F^AT2CWlE9d{A8q|i^Uix`59xIMRRi9It}X(nAyCPrMf5JJq}aoi0txqqYA9PE|x;|O%Sv7+4VK8baF zVM}ghXvLj5JnBqlV&wRbj-3Ly_@bluc%`T%Z%EdMk)lR8%OG$$0Lz zHsz!SGeFv>*HSQ0M@K6|9?w#PQi%^4k`StJW2N#ULPM-nuPc7qZv=!MJu!FElxD6ei>WA0qE4)UF0X^TuVBN|-((&BQ z)3qfzRt#KUIj6{<#uFp5;zQNOxpgO08^FH~k?MovH{(2pHYNl)Awgjs%f|aVyXlJA zFdMwESy*qEgx>&DC`I5@uy5~rNT1!?0I*VD2wRGBaKg=7*ey@2VhHuSfc@(S&So5o z+^OU0&-nB+i4df_L0FDcg}zF1rM8!GD5b+Ce+adAf0TV9FBfi0&HU9hW_`?}J z;4zuTxQX}*!8?Y}cFF52H0Bry3dAIs%4Vh`qL&gmTQShUrJ|xwQuT#}?oE8lVCKw| znW`7rL$>A)5-vml2K=-EvXe#))~n?YK8oj$ZATSHm*OLt=l=T^v2b%9o4!v9ZeJF= zg}vG^fF24lACW{+?6qjeDXQeDXq7fbC`9y%`*OXA23E}Z_CE^eV+mC#$m&t!`d}27 z$)60VU{(Yn63yawA52h98(7l)0t-Tkc`-4|=ga5uf6;ELJrQg>JWL6pJn2%&Rlk_B znu^Veeq0AyO(qYNB3dd;iONsuv#UetX)GBl4`Nw%`4*!$M=p=c#SN%@>fC6TfSIB>^1*^jGf*pqezMf9>8yxNXB%z zB?NK0{S@Ub2Kbn##H7(D8Wp1rpd1{0gI4{Sj6RV;fH(oeEP-EyxsiENe~PQd;V0Ya zr89t7^i#|Xy1_708*!`JK75b~p;s7weugH|FHpa%l74@fQ!x#_i-4RHW&JjO*R~l& zzFX>LYkQ>5F)v`krWsz2ST(3T*#}Y9DqZBn87Q4??+jNz+zMXJK4q}p0_fh%}A_3i@$JCK>*p+M$cHh&ZuTN7j>vn2HyWer1 zUu3A8aAG>bq@}Wr#+UHr3R^F>sP}|~N&-2iD2Kb#k%x$}EL;;DiwOG%dkWe4Q3ERz zM9w6F7!WfP-t_#rum9=@Uh)P<;S6l_VRoIm83fcs)YC%=H-6!vGR{A5S3@Fr#QuFb znai*hahZu9?k@_o0tp<-$NXc!JUh%;5AM&KL;A{im=ntVvF*QRXwm3D!Y3y5??bO^;GW>@_7Y9}nB* zxC0ETFGU?Gmb#il`%1xiewFv&97;&(q+?{w@Wv0^`-Ws*VbgMbb3W|aP@^0k{g~sT zaF?4-EY99;8z@oWG@Jb_#*&47f+HgNS{_C4PT!CT{-~asT3$O_O!k0Uh^& zTR0{p5?|OU@WS-BmwgZJYU?EJ@5K1&;lUEOdxhNwD-p2}#XZho3V|IrpKA11>@LwS z)+{iQsOUxHOc@bX3)$4x>GFwD%LzHOc?5k1rgFS2NZ3f^cdEhq{0oH~ZMHJ-RkptA zUZvIK2_h9SUBzxL41YrBch38aN%l=RldRpY@MMs=V79FnDRPBP%dBdl2>0e|GG}2P zK528pIgpm2a8m|hfBp1zq_j*3fvh<72Jm6Y_&dj6wDQ5BiIV*AW{uq5@V^6@hVTP( z{$`rN{BsaY?{y`PygVb?$9VhlV2+u-`5Izl8L^M9EYm~k(-&wd=y7_Qfe%9Yq&wP(JGzKb}J6$ zRiG_LA|4}-SDSCr2=}JTlHT`^5}i-rLV_vhNsADZRbPSgu&v9>L>^0i#`a zBP0jyF7Ak(+}N|sJu>x=tMYzWb)Md@FqMHHMkO`(1qe}2VJbmuBANA(J36r7L zUY&Thtt0vbj=L$X`JQD+W>5wqzOnkj(iT0LQRYl_JsyZazpZq_>pp~3nZk(7*u4a7 zsqQD^-x*s04;T2po>)d%p3N z0)k5D0z>hw7CG!a@=d*o<)HaVrph4iqnMM1b+ev;7u@}o(#30BKPa-z+xbv-!-XRU zf1$-=Trh}aoLL9Nbb3r`8imcFkA7TZsU-b#9Bi-V@MU~pG3KG$5itOXZnXF=4!|e# zT2iBb)A(n*)_Ha%eS=TUI110kE=6Ca_*aD#*;g_MKF8bgc1 z1ZiQY*D$@v=%f4|)>!f4^=#*%+T=KHI{dZ@ZYb2gvl zO$Xj|(u?|Q0wcmBSz*d}Ij+x0e-gw;AcQW$D@!)xr+ADFImc+|wtL%#jJ{z5qu*Ws1Rq=96X1r(egVUkWFYuDd4QXS})0Atmm%I32W{cW1;bBl}I z;(nKcrRoNqFXsfB?D{U(IkGk!RqPj%-Sw92;!eSmV$bGLW9uTYe340+&^&k)PFUfd zRd1VqjDG{9y|18SoFKG4tr~)ih=~EWSn(q2nW5n+RRu=a3q0%)&VFDMB)n()T;P4s zA9?lIncF+gz?`PB8n*nQPqwK?Y1K~;i!nsqlkoTjdIgRAf_keMgh0b6^Vtr|!a5T1 z6B1Ir>ibT|T01<;A0LZ71~YiW{f^VRuIDT8FE@DyA9o`aht$`$qd&KAq7gp~p=(j2 zdn#m+Au)Je;mPsuHvKa$bnkg^yW{avRClu+bp`YwkuGG{nOu@f66tGc_IFv#+;>&;Bb0%n& z%sdvi9~2nbG(x<|;VldvN*GlY(Z}MYw;Lm}JH_M}elyHZMm~@fIb#3&B#~OYLB<@! zah9Anv(hAOy~xwhCtotuD9Ky1dWDs_4jND7Bv@b;VF_J*>G)XTei*UNIYEY2eJ3e% zJSd+qd@{Fa{q9(}ffy2iil5G#s$zfX{QNwA(CM@Ml1x9FPW_Nm zI3D8YFW;h}KLX)8ZPaU|oP1$pwUE=wQ30MDNvARvzw5-ZU&xbisu)2Qf>piBqWbGq zu;t6xyr(7BwOHJ@Vh6N=3=UD2ei$i;$QIKC%`0-hT$@$?LXP^+?xD%iEj$#M1~6=? z=E4WPm!X;^!d>nr>8mX=b4oHfO-Vz5pU)` z6IV#b7h_H0NwjTdS=cLT_uHCWeXf!kK3etyK3?D7I4Rp-&iS&uZr&fXdGKvzj0d>% z17xN)-nPeNwAD4xjiFc)xzzPa4xyxc{}a${hH zk+Q-tx~L~wWZcmT1#b>JJsmFBGXCydf9&c@b0N^^+PMVq(`7werX~P3>fdHB2&~=F!5Mq1t)DEj zvQnkdt^AuStjGJ8kreA3~(;&}RdWBL}=rbRtRps65MWMgo z+=S`Z;>`2k4ZlwJnIViTt&+XWO}Z~|H#@*fS=HGhi;*45JEww=N;nIV>HW+e8c4!< zcyrOXtd(r#y=y&34+W(;96yh*`UfduMK~33>3$i-*e%E8c{-RSEDAF|Q3N#TATuQS zHmBnO3yK7jHfdunXVb*8pGdn!DEq4bJ^4>A{`+6u#XN8sn!4re&jz*xFK0#kqL7~< z*?aE!^BhZ=50h_qG_DWCwAP4<;jO$}c9JeG)&bSeas?j}%GtGpfZ~;px0uvEzcb^ONNdXQqFo7%=og{NA$K&{i(5;cKDGs;o_^!<0grZ17ZwsS}03vr= z$8&dW9o0ER{+e>hBnCR3=N5wEjv=xOX>bP8+@EfvznATD#F9WRJwJ)_#M8R$p+CuT zXSO{kpNz^~XiGwm-uPqm2tiRO4=sn~lG*Sv26;v>G>xYrhOWJzzotH_7jnYH91FO# zzx*B|Jk4IfejRq)cHnXzjh`Mo*^+nDfson%!I<)0%Y);Pw9((>U#a4@AQ+&>DDezS zs_0~A>GJf?c!1hj+>}JBx=(C(_TN=Q5TB+{Z4I0NfjWMae zf<+-LzW-2j9Qiaggu#cbRrcGwZb^G+f9fK#2oEKDFHOzv8nm5*Dx)n!!KE%a)9kil zYu7u!)CXAh3EXeR@i;9$zgGR13t;o9CQSWLhMi4KGF7SF_UZe*@QfvuiuRo+ks`92 z=)A>r#ruJvH&D~S@=KQamlw`Qp&< zZOFx{?mXk-me&~7Rie7%!?)t|T;(7*6=nvUV)hPP>6n%OlX&i2BOKi-Pr zKaJtvnGJaVuo7^P3Z1TT9`(iS6gr#LD8hY-l##B2x4Osq&}h5?yjb|-AwROtDCqID z@I-4U8Y(@_Mw&bBC-4RDn>1P`y@OCVKdKvAul4pO_yjVSjwpu`o4(2}l9OTnzg;qZ zL4O1d7MMRN=K|#9dwnPZ_)L0&Vlcqt7OUkq7@)e+4_;2Jlb^k(y{W_wE+Blve;rzB zYj2@S<}GjuAtH%x4k7X99yit$m1{b-mlirn_%w883)puDs(bKnCVBF8H#+9$3|SYf zAGeYPFNe`U4@ZbFM^E!9g3% zYcQ=>XPyS3O_uyT$Bu;9N{k8)K_&40ElY;ymG$s*BG%-oNO+I~GWv)Sr z(ba@Qhs$YN+DgTfUh%z)b8o|4ET&|P=FkFJ)d5J9A=Zx>Qs@mg5|dy{|G};g*TTP z)+Sk1?{z>w9RB(ss8d=x*oFNp>UgfBB7j?Z=ARR#G_v2)#Y&EPkp^Gkx3(=YDt!Rv z82R6zr}~5@)r|%QKMpkqQdSc1^kVUmfUV!OlK+2 z&&56aZ_9Q&cVvS<+)46LVM7T>$-P4ZY8{wBpQ&pwA?cYi<&1;~Ui5H7R8p#Qe?FvZ z^WM7m>1YFkzsTNpSIPI%DPVWmy%l-}OY`wb#*OlN-SP9)um4qMlW_b6=ArR7Qo8$E zbDX9LR4Hwg()?Wam;KTQ?~k1gZ&?0S`|9VVh54a|io>Z!?8r)z`&JtX$ z>yg>Mb+TnzE2ZuOlkRE&*`n14ElSb8P1MERYVb~1ZpvKtPXUL3}mk2I4e z1>a@k7Dfd0Xn73`Vyn{DLQpo`aBk)|N=Fmkh3PTWf{#zjeYHDnf|Nb(f7ed6->vZO z+^bk6DE-ZMtohNT%ueKe0=m(b_OSS^L7UgQ;`_AAAz%&K+sr|tb=inM{xEh0K_7{0 z;6_XD+^e_Lj0_j^V`5p=-@r0hV3~omwRn-pea?dasiGAFphgjfHk$@=7(?qQ7sX>$ zKLpKCKKs$&(+n$%i~puGkohFD931T7fX8){$DhvNA`f<2iNH@v z??~Bw8~3yNzDZh~%-S$*U>OBXB(FA4hlK2>Lfym5qxxQbaJh3r`_Z_{X=|(Zf=af; zLq0`1kd>*hPI?y~*;ztK@JV&H7s^UJ(tUlrc!*l-A~Af=#4LbSTm)p*I@yMW?`Sms z;MvJ{DG`||t&{z2zRb|j16@M!@A$k61M~hh_J7!W%c!cpFKkp0kdTy+Mnbx~QIJ&W z?ydup`( zK3y2}EBJ%>j}NuWiHxKj5>jJLPb2P&sy%D$5q2!;i1|Xmh#SHLH6O$I@`>X;zJjRQ zChlkQ!~7U6&vJ3R$4ze>zclcTKIn2%01Gmy35S!nE+1dDnLz;#X0Fy@VZi&CyKKsw z8wV;Iihza2?JKFfdqL)|#qP21wFFznwT|QrYX>{9b65rLCtwQR70KY7;9PoZc1GCB zX2nZi{e)0IhGzW9gp-Hs`qom-RW}TS^jEZX~0|9;p}U5S2=eSJHdCNg_!ehe=&YR@;yclKI-2)dt^j_xyv+8@+G zTvd-pUqt>ZSAX+?yq0oQ%XjqmO;&nxSFPU_o|37@E-UhW;r0|^8sPU2`d<0C^|7o( z2Yy_^&WjGIXN`lt^Hx;zyb@SCl<|n0uqB;j^l@o}4>n()plpBYqfG^pX=9n} zLb%!L{&fn1jGZ%7^wD-~YpTfgNjM|L({7N`5AGK1N;Ln^lPQIrI`M6UgN2(oe%T`- zz(r-^3$;HovF<&lI9ej_q-0q;Ub>vaN`GBt=srX}$A9)#qxQ1$Xlkk%i`916w(yc5 zHdb7t%0U-=mPkw#Zsns#baFyJZp<}u zEEpbfow-=RU6;0= zD(~;hkt9@~`KFOai8m}#nEz^(=RhF&jz$+BkW7s+tzVuWv|b_goI8}6Md&;8RsqLB zirsU4TQ{-Z{m(H=DrybyFca~x7cm9XCOuo96Hz3poJ`_d*@sHBN_-g(Ju3Jkm_gK0 z3crUAKTQP9t*jlijWg*O+YJdZe6+e&p3oRi_p^KL6IM0sWcKuvWyLHqHyeSqb6>C{ zc>FSU&GZ{N(9Z14?W))Ms;nU}cJTszBy0qt8)ooqaEaE`M}irP?xRG=K$PGqUX~v= zte&{7H966C2`o&~r~GpbI8#?*m<5v*;VMYdXK1KgSI#5vcXnP3X|Wl-h}86eRD<^i zwZ1zF8l@1I{|FwMd2ebc#@kbw2WwMe=kKIHKYc28YPl3&PlnW#>ZG|s2ONpg`Y;4p z^HH#QN|49lsCs{j;001#VdvRrd>x{$#VnIvc0~cv1_FOc29Tm?SmY$-;J)+Y;-;rx zJMMqZ=9Z_ba!#r5w#ri{cHUc?tLYt&`#}mEfmf^zDO|LqfU?rinQx31V82K=(4EsU zpovgI((tTO-e|B=qGV~s*1Gpjx7OZnV1KZaMI;xJw(9f(C!pJ%=-xG=a7_ZaP5k!)FstnfX7av^MY4E zZ0UT*YQyUvZEeM-rRfP(>Y;ZY4OZJulmYDPV5TGq_J73~z`Z`e0c%_HP3Qf*hV&YC z(ZeVT=;MUY=p>`^4!@j{AGfHJ6%%upxfPn`R0)Pk*x|@3Dh~A9 zD-r3~Wertcr#E@{m1P${5EG-98$q;IMVHUS&!Nk-i0tAs$5pQDrmJWu)0djA-j5s| z{@@h&}G08~mSEdF|)_hG4Z_OtQK@6{g z9!AX{GD8N0tR6eE{ZxPAgn$N3E7{-B`t!nD{LgBdY}Y;JPcpcWXz`ri6YU9FaHpnA z)N!%B!wG$JeT9SRpZU8pbWBwI2Aw;#Y(rSXtVrnWzybdRNVF-zR^<3f6^+nCjl7Fmsg6Sz^`nl?G^yERVK*v$;1^lh95H9$LklY`ywo>yudG);^*6kqCe zy=ge>R20pltpV}XbfjmnVN>xF@;;=Ilzw1+rd_B)_P6=B7-mE$zg|QWH0r8-lo%%U zTf&79v#qA!)cag}yY-&}MO^fcAFCh~xfFNKyO<(F3wl;RJLGtL5V4p&)@tz&!;+ij zPp4z!uP*E~=XXBtS{gY`=94kTlKk6$1f*~5M&>M?)E1|u;)2*s&CSgP1=dDJRO*AE z<~&Y9u1<@D+$Wp6?NSsU5;={pg}Ey1JDOlW;x)b>P$)>+yTAFG>8J$sWTm7v^*9*NK{}d)kcEug93CEUu<&a-VnjgwA-+2_quVnJm!K&A8v+ zbn>Oh?Olk#jY;vvO2Rme+nRz{=3ykMcZmq(;Bn(2K=&kRaF zYtYepu(5hG645ktb^pXSr9njfJ;}&857+c;L2(Pi8|stHKUzNBLrFGEzOdgl%$?`8 zyCTsn3vs^4Gnis73mizx)=@jAaCehG+%}>`Rit%Bw!#;sEN3?Ia zJn0KAH_fsC_6Rix$7+2V)EtzRX{!HYJ~wVfq0b{=Ild)x$4Es%1pyp9ZQD=TJ3OB4 z9i4nVtGgcR>j=U}BibnI<7>Uxbo^Wd+#gSM z+31PFGeUC+5c`*Z~V17FKX;xfQYTV$8fMr#z*=3q&(ZeT0M$y|}(5sk;z$H;Mw z|J*5`6~ypUHXjQCEsXVj8yVyhCccn^P6^ySQV+y+tOkt&V_R=7w45$U_pT*O%Q(Ch z)0YJjuhAY8{wll{g0x#r(CGr#1u+~Mf;6^lj+0H}qN3Jw@N%HnmD%W|3VlA0b@>ZA zC%eV7l5i{Hf=7WU70o&0+&`P3OpVy9IO-XX`LO+xEl(NM3Sj)0Hrp>&9x9JIQ zCm!#iRD!!w$uyNms=ijbi)ScC2|)t zgOeOLS0^VYSb!3q9|(ClS9SbRqZgB|Xb%mbxq=vG7yaUa#uI#)mgix}f;PQeTy$VD zQ8FzhKg9*-8KRb-AKpbrYm_*Rjrn*lg$4>=L%SzG1|>rj2O{t& zs=)YCO9Zu!E@E>*G=cQkM^7N$Ue1D;Z=0!q<1&@6#1vXvnhEbik4EXKqjW6ID2W$z zm~j>V{`(5?4N>H!MzbSkL4dwv4s)9~(kGoS2hPnTO=I8%HJ6CvKj{1S4?~SFQpY}- z;Q0?|4}&wdHRXR`{u?2wF$6540~3Nh#jGf99%mpSZ#@CCnDieU(a{OW*1!MLrN8}p zf`kW#o~6bh7sSZl{)P*JZPHX?EUrhQM_qXM)o+pgv3OJ}B`O5VwiMlJ;(ohmuL-rjuMSK=7)Ltw(m z?gBe|&wR7jd0U%Qp%@QO^&u#*v$VojQ2mtbB-F8N4YUJk%4*Kcrb(75T%BYIcy!bM z_sUd+oXK?NrWIShpsh2pa{C$ILCdD`e!Ek<0iq{ zU8clS)4~~#%e)A!+Ye-0w#CNEiQ&@aLMkkFx#|wm8KAKOwxT)LXJ~(bzLR9)Y&G?- z^T|#k=8J#PyjS|DY>_9v`8cimIA<;AU~G6)iFh?!`9BQ+Mu^0!lu&%XD89P7nwOUs zZ{X}m_o+p;%jQQ;E}lOKD6M;zds-2&bE^G4g z)Aj$GC1AV+G>ah#UXpY7rKDwKTy|!sW@kmb&Kwth2$}6HOxv;;ZY12(sJ+wk!krnf zqPT%D(0=AVnA#mcv!w;!Tm&41=Z`LpPe;`&=>}9{2WM{o|qV!8M=5R-s^JS59^{>u1 z>Vbe%9Q#gA0HnNkD8{YWlmNll@N%Iu90_X3Z*X3K~)8FgRSLP+~l<|Hea@B**Vf2GWQ1A zhg-%Xi>HJO-eM#^(AWL}V$5p0I8vWBW)w4HfVbN@G zrKF00NT>{g#1O;kzNc^s;@tF=Dg`mj(VQCgD$PRr!;KjzG5EEm`lw`!s6V}gGRD>^ zk!Mld`dknj)d)1u(tK^^>aksF&uS*|GfGnOze~}d^(X_llUYqKdtytuGAt8g_~2qfP3Ic8jaL;2`Z=ARD(EN2)9=MR>lMDrw??qKw)=N9Ovabfi zqEQSq3z|oyG;<13{CTBq)f3vbKb&SZE~je>0T-}f{9IEmn+2}ZsAi9qoR&YnKK#fj zWDycdyp)Z5N+yaY$O7)4V(~cMngSU9>5Muj?ej0CQf;#>xp`jNMVSVcP1)Ixl8=Yu z?bb=gjXkqAB1@V&vQSLTx~!O9nXWfTqTPtkuaY2N=*?urz@%zSLBK^xLP<(V zD$MiAyN3`hafD)>jRTO5;}Zya;=KSh6aUWp;OmZl3xd9$%7QU{FHmrh_t@~nJY+l# zKh^V#FO-J9bL@|+_ssm>%_w}!B*t>;$kGx7-u#L0mRaI$rjg6#@b#99;%Z?CJ3o@7D9QD!B=e?g%)XPgt?H8K8 zf{EB)@-~o_DX(ymvX&CV+Dv0eg_9==^7?oki)}R%@hd@`(?{P+Y8{C!g7$;-`x5&( zi)aAn$>Wli%+gt~h+E+nu%Ly}S(T=}2E}U0o>h3#>Xa7rv6j`LZLe*+T5u~z_dog`NHeD^Fm%hjmKicEqKj-pOv8fdI2A}B zpu{-+FQBg01TZMQ^%mqY*dfSubJ)-ys@U#Injp_DepC97gOxPX2x9DA_AuF5@ zj+tzilRdY&BIM@n5E-3HP`Sy@>b z19*pxcu@hPY^REV!|3hsi|v?jy`8^*wd!mIMPR+@}&NO-uAe!4EVUwCZn zhRu2w+Nxt5mDMg80D_jtwhphbzLTV}fz@?BTmywjX|yj{#xh2x)Zs4RvFE_tHA|vY z#yP!1>EoY|nvz>5^Eua0J5BSuIgK@FJE>(^RuDq3Hx-3>!e6@bf75`Qyf3l|E~I%z z@mYhQ=%(hk72C2VXCMW|ZQ1{P&7IaSrMPl7A6L0S!w5$bt2(BTL>LE7^7|db zvB?I#Jn$j0t?3lu-FGikn4Ckht$8!&Dm|@>MT>GqN2X>iVM_O1Flz+yKFyWL{7B+*d>`jFpZP=-jrE}4PIS)(54WO3 z16(SEr|kEdI$6L#W$Z!vD&GNLl+dz$dkRr_dwqXe-Z@)p_y_2vE=q%a;EU4E0E_A! z`>M=>+)m=&Jll{<_{<{X46@T#c*}>L!Z*qJQ>XH$AbGSAHfMk5%%Hr2|j14A_nX0s(WXMNw z6xU6}$dF(LCxxcDa!GGwF`gtHwY{N(lHx`m6zZ2GD0}yB_Y6tzc7!(hvl@jhgj$(9 zo!@`)4fdTab|v+V$ku;}9l#t=HK>kJqEkrSV2PHM!Wy{?h3n`s%Ovwzncv%Qvn zz?Aew?ba(qH~RJAf3*Mtq;^NNmEoyQaE&j(%@3MeqgO2*x3tk=E6`Y$BTPG?ge}O$ zeoHZ)m%9p8z6+lV1H>I#ivqR<5m=+U8v4D>dz8Jls7Kj?=u>nM8#fO9@3w4a>;)J% zctTYz!CA?ra$*&9A~f;{eX`MVEKQCE85C0p2k(8nS0c9B%^DYEV1qQWkeiX?c>ATm z5-bP$x5s?Hucjp728sX6B2f8$QA5lBIOQ$?8Ot|io1RL%JWtjA6?XHkuS6ooTE6Qr zA38ZfG8np-N3*GEmWLMKOZIjLZcJ2*^cinqR@7uQ&!8|Kh>qhLhXwL{E7iHpgn}UPSeZA zAGJ8ku5Sni;63w)%88_*NMGc#JBx4>SX6Ch9nV$e7-tGIZ-Dq=68W(s?f zeXK+U+F20bB9d?0?toY_e~OI}v*OmP>6=mhn-ZKV-?rAu$!wE3lh|q8(0Ui7xkvif zSC{8Sg@rW^3u2s{k%jG%`gg~5i%ErqbW~$m6TN<`td4t)YrqNJh=LG2nl(cEyc%g9 zoMbv)ht(ccSXSm>V?*-rp)3JUEt@UnnqFke9pg13z0Q3ev$(2~&W91&`e2<2F>9NW zWai6_xv@0H2Z13$TJr(g&BAe*QL+^uYa4Pr7%+7Ju-52G8PyeJdtnL69yu7@_$4JK z4|*;a+htIM>*BC9#j^9Hn^0IkiL-+ApYEVm_*(8r#(Hn1T&|8jfToEG>kqQ9$5R;0 zGk-59;5{z0+0rjPpgaqyp2JMe^4j)K#I0a#$3Ogo$+Gudh)YrRraAsZxOlaCQz{f-B1zt#IFD4y4cp^UjV z;;lRBntc!yAoeS%bcD6a9IEI0vMCR^sd{kdurK7B3s7P*Ckni z*qQ6$X8a=`+BMt)iW(L}8|k6rd3T07lvr>4n42K$8+%5pQD9I>I95_o7#U|61t(T$ z;Xs>~ly}brO+cQS*=^@maRiV9Ov?V1$CiNvT9s-avxi23$#4$cYjCC+r3XdSWd{(j z-0cg7QjK${9FC6>?|#y8SSN{@+Kt?)epfLFtc3gH_}dn51kC^0xt~04#6uw1Fuf>g zlWCT((sOeC5#fnNG3nriMH$7qq>94L#}_B2x3e3TCzns9_F{&Q#fA^B`$6eEA5V2# zUIg8{M-?6!E=7W*C53^CKQ@}i`##vj7m3-vt0En6jp*Vv*YNKz<}h{Joj-HwV4-ZV zRN{TGS-AX+w274em?RMeI=_7u9wz$F1SOC$WbYRvF7Y344kX_@evy#*W-N2BLUL*8 z{J6=+tE02CqqE~vMsPupx)99qT3KT~nRM=a zqTzcfY#R1*UvV^RxOz!H)|mI?kf&26fm=W(ZM!}kGE#R^iTuwj@=*~2{pj$#x2vzK z#R9P8@mBqL1 zm}xhBvlT*CW3GKH$IwpcfZ+bKO)(8(Q+Id)L06(t{}Xis<-ylyD+~3+0?M@a5hwIq zE{VpyjRUq(>JAp1#zXn%)wqTD#Ds*d8Z-?c(o-A`JGu@plr{WCLIm&EtMZ}5ew(d! z8;Plwk%UVdP4@m4YKROGMU+*Y1qfu~dGYi5>dN;6C!f2O#U~EqW;V0X))>P(Zy6><6}=S&P*EZ18j;yPu`39C2(#q^DY|jD+#5wJgtsS= zA%#qfG9LLl3%Fw?Y_!WF(WtaAsv9;*{T=d%lJI7=2Pigqi4R}7qKgen^FBrN`3kC- zU!}J}Bir)u=@VDfT>_sq;WaDG#1pmLVH@x@mIdL|!&2AiHI#l*XGMT?A9b}tq57#Q0>uGTRhJqWur%-Eh!o{VxC z(LRd)2A49h4CYz)som$+6l6Sq>U?iX$m!PltmKVoo>T@>2vp*3REU$Bb`SCE?~s+U z1m$144=warFYahr$cU_bQ)X~06lmr)m=ujHuI*ARTDQ06jpY0xmUY2~?S9LnNH>j> z;o1y;E*ihls{r-YV#SM*mzOdGuXcEM3)*v^Id4tkZrk!ht1x3LhFS_MTT5{S0WHy%det1KY+ax!gW|XIiS)9E#FUYA^~rH63b?#-m7FT zax=418sJxOoEzsZSCE0S>enW$4*)KG=+{S6<3OTk1Xka!m|hoG+GkNdL&f>3@$K{e z0yPSZ#Pizw9VF0YfgX7NEGEQPluskIP~|mPKU-{PE;g#emman^zm-O=}jw zy~EYV#HB&a5bZx0uD$&m!+YbozNTQ3oBx|~Ad}x_8Sg~+_H-m9xM(>KJt3NK-F7_y zY9S`A220c*NU{a!oWr(g&f(7rlOnTYCjEjl@qY6qu(;n##dfaJ@Q_QK>LtF4tuxpfjcp*zgs+V(#-cMXOuEJX7K^|`B`?msFPzSiL{ zxLDE}hin@(F8g(-y1|Agr?z_d?XBl?VQFJxF5>|so%2N#G>Sz)}Tp{!* z=kBtHr-!Gxs)|Q{Q_cQ{?{Yu!RG&hpaQ8J_P4TtA;66-t`BhMBmRxqBFuQA68n?0S z^XxG+!|gW`3NlXjFERwdCk5Y7qP=&&Uc88AV`VZ@Hq?D6y>SOPJxOe4wuldhbM;ln zGI4)s>fQb4;pDRi@pmZ$Zr*Jt7~JhBtwHW!^3=cuJ5?h=t4C}~uGD+uY;^C4wv&sW z=q;^^r~lx?7)!|saC~@I+EnXm{%>Z26(8&9rXe~uBb1J@>gt*=T8Jwf8zfC+;4RMa zJ7&FAB-|}^48iYvSFT?*WOWfVE6*nxxT@OxBfWG^ojXDpcPRUA z<*SwSe&Z=$n&`P}5h+(Ri$Z9UA|Rh1;%&WzQ_8bD!$LO}cn49HCF4_+{U5g;le{;)a6~D9=Z?f?Mi@A2BS5 zA0-^hZr<7YXUrv=drW&CnSb!^nH{1qM#`z9P=@Oa>o6-CpVrH!@+&yD9>I;>ob;on_KAK z;wEe#nuSZiWl2^t?Gb4VP+PsmEHxAsllEAluTcLDR0#o5h$GEFxbJN3ixx!>OBo`M z*~_W3F3l+|o!)QHR_9xI#nyp*F~&mcoa8`S0|TKSd*k}2UW|pODxs>gdS9|L-T$o{ zztd1Cap9sI5&h zMsh_}v};`OJGQz2&ztlelbl5Rm#{Bd{_MKY?Tzc=aQAj_cM}XCwuEK=q>m3w4O@=3 zw7A++uO76yX)c zM(+(?_A4+|oE%y5Z8bh-B%a|Q>nr%GUF{a@GHySKmf&*-4?}^wfW1o^U^nbDMR_4p8=wb%Pz%4 zx$cWa)kYHDv52gbWow^BLi5j01Er2Jkxl+RpTl-*=uJ1Xy8Ck3cc;)Mq!-+Oc*U;U zwO-t%l@!v%0Nr@=OfnfDY75B#Xt?Np#OtHju!c)$IXJq4NsNEX=?t%SN)+;4uMF|n z4#Q!(>T8@pYN>1UdEV!`<;YKYy)Ld~;s4yKm|BTbDX2x4=O%A${ap($6k1T6mVnr6 zlJves!G2PYvwB1M_bn~&cV<*RQ-U6>9-+U;gKbGGz3WV^@~umm3L)Dr zvpwCgmZh*GzVL6|K|l)W8YU>(ZCc$Cy@z*l)?})2I6mWW-9NF*fEB*1Ba>afe)k?0 zejax0oQ;>)MPEb>SQ(vG@nTu9h%`RUM}yHZQ0zCN#{TCo$G*xU&PMh80h?(qciskH zdrS_yuFmAmIgS{{C~Kgs;{NmEe^cYAIGjWXsgL0+RFACh$GVW0g!*v54poaPjRNHG z>2T*FdS>}Y8Cgi)2+G#eBX7jL8LG=;2>HJTQ8Rs!`nnyyur+;j1B#yNxoP22=fW$u zNb0+%5)rE`oflRLPfp`M$&hYh()B4Ge}J9D{4~JocD6eU?epEGkILDtOUr7Q1WzG1 zD+d5y%81^66-lOXuj+c@QXd(TBRD>jOwuJ;g@ zUuQ-&)4~*`73Uak_UfZ0ZUKFGwrG*r4KDghnEwsRHrizRSc*Q@$-m%GOpg22rHPgS z(E;c*2vGkEeG7{#H6}MY;dSAY);K!nk$S#$x77mvbt9xh+DaM@jiE~PtfG+hkq4CI z8kS?Bz{R)RbFP$j<8Qo zFyUwfH)u(AhFJl%6;G*`f06rdR|r~K_oO&m+#<6iFxEIek8>0&vY5oZ(iRiS7#BZ^ z1AXu4=%~bqR}Xtn`y%1>=I=VBiDDBg&E9#Bd+xPK4|+Euj?GnqT{sip%|9~!wK({3 zs62m4NszJ>W%8!}g38x7C}@Sd50K0<0(b+{N62$roV*MLid1$J`S%++Pc^11vf3v5 zFC8?N)XH*IPB#J}Jtz!dc0GW)o$#jNf;gDI&Ax!ihq)b-Jz<30E}_`3nQ8r*Gs^eQ z#3tFIaaB?N*{TE;=(qjUcMjlE_a@6$dMP*qWmb}slGU@%6D*WZV0QZq+57ZDQMEI{ z^~XIgdHI_d3)nR2FiXevo{5}&dkk0gApAk)ipzFd_h4ERd?V%EC&ss=Miqi6Rc|a( z6oPj1<&0N|QqT{OoLfzBpyO}`>=kp}dh`tqfTsSaB=|IcV~}Vg>wxqmz#qNAi;%%- z2&XY|PAn$bv#nFedBi9pc$gDwasxC~I-ghlw_CRT6HV(0*q9n7>TwL3sbRGnEH>~g ziEDPw&b8Gl*XVn5w@SBY~>{t72qv1NnQ~+g3%I^>w<+IxY@i;Y59n|&){2WTzpszwesOHtglN)yw_l3d$sy4Tb$+PAFpmu}_h`5*imH#< zn`HR-Z{4R-l13Dgk4wkn(ZvNDS8}l+qs7?T*f^@CG4^#0W~4ohds%&Se~X0k4+4mA z$477S(5KPh58wJ8c3rZB#^}| zORH)|SjVeOd^3Pg02fZVMf{QcS85nQ|B$t=_&@8D9?+S9u+d7B@7NHN^&I(&L8e(P zbgF21%C-Xs_&34J_Ei8@6NcMQDq1(|GrjA5#|FoGAZNq8IU4v)3JTQa0Y@O}HoCq( zhV%}nkH6SBeP!|XLz;S+xQ+HOE0ia2+xW&3V$& z9LH*n-L_CeTP(bk4d*2S8pY9AI7cvHVKXdzX<2b2>7&jc}u13m6Vf*3GD$sjHMiA&O)$Lmec#J9QcQXrnoxrGY>ny#d`whIY6u=2 zDbyxxHk8(XOR@h9z>krrT#;2b^jsS1kDL4IUBKAU=CAxZVrpB-%zANW~xva?x`cXbxxmcwja^ zTu$w{vbdab>Qmi z;ACsu%V#g``sDC*lfC{&!@?0-K%eHPd>6-6!SSbKOKZ|WHmX}aU>34}=>fp2L_q|Y z&ZK5`*NIbl%CZ5oPHU+?s4Hpa|GyZU|5 zylg!SpZ$3_p$4{59uvFpaq!V9VQ)4)ICs$cSv{liuyX&$c6~@u9TB_1@r+NyMOk`< zdj~pP^}3K$q@av4OyBq9=+kg{{Xw}|LtY-&GFdODs&)-2-K9%Jsy8i*7T6yQSUfCo zUM~*$6;zb4cdQyJxLRV^@?7)$Kp%))=iY0Gc0B#vQDI7opla_Q^Ld7Ej%W=QPXj1_ zogx$U^Jfjr)Vu8UbZQn&y)LjU%WmC)rFkE%j9sr%iXAs>?wqXUQ6P!KMcAYBh2P{Q zci~*i}?28}wvAKi$guU$F z?0wLjtDRmmU>kuRjC*dAloh7THQ1lFT9#aFc6zK{Y|YO&RP!{3nUTW9Ac+2}`9N_l zC*Hl#oCZk49`TY3>vqxx0c&P}TdhcbyBR@c~dXnr_4;;i^`Rz4)PrrJp zc?1nlzkIdoFMKt+6$0@PKYwS(zlI<7z0_6?+J%(P_0K>h649hI$_%_t=1i-Mvj5cr zxXc))vqF3UwLCw@jSVO3$X!tYj^}7f-@MX5z?1#frTWeEY}U|cc4IDgHC_FiXs#{L zphP}W+OKZ#g)YCEWz5%K7_-1F2AdOQE=V1=X72CC<xpqrrol7_Z#sg>Jdd%}|ZjC3>Lb+~>wXuv<8fAwEu z;l_u*GK&o8w;Ahle^2DUf!;yP#Qo_-0k)Fvl7N34r%T3H5axL(KzOqdQC$F7a}a)Y z-)^|G^>B|3vWrqX>FbsBGAdODAGh1lD+N{JA@bPtYgdS-=wB#eA}dI|KVf zR3>cK;4W17f{jkQ*wr~$jmJqO8*c-D3^?%prjJdq+5^pT;C=%#L3wAN6cjl(mkZt~ z7g0IA#hMc}j7vP%5ng+pF^Cujf@!sFB`)c$eJa4d@ha~4MG=-qac+HoZ4#E4QI|77 zk$S^m;Uq92kU!M@{#r!?<;j6sD)RKLT$DA!uAs%7`CC|&n3E&cO?y;E2+R~Ofjm1q zQV&9}s_2anB&JZczE@yHMeipBCilX4hLz!+zJs*2S6Vl3>uUQq<8| zOh3#TRw-KN2#;(t?jVN6+%Hgm1`QKP%BZ_DtmX&L6V)Jwxe8c^O`+%aIy>Ha>5ktl zvZKh>#~@orFAXyCK&dwlel&332!{cTfEGeWTVrV~uy86PFP)ffQh!4`QAL#bit5GH zi&S!9Ql(SvYGE3H(x_Q>e2Y(5~dw4yUR8+ zGz8xnh=BBlXiyINrcsm$*55MwL=eu5P_-dy45oZcaC4FSIKVFnpWv=168HL`oU0O@ zkKlS`Oj!Pg`;f|1F&j(ZgDYm7y=Mrewa^fjJDt-vIn+XZn1s+KWd7! z0pcoZK+F`rDNB}JqAg|qBOd&{SQZI@egl_c|t0a(q+iNBwUk* zF>pBZ__N@>m7oKjXzov0-s;pk^2dY`Qe`;Lk`Vg6 z^*kmPz7d6lI|4QAP#Ru1iIZ;zJdqbW54qvmB&eG1;DX(0LK;BhC7~4t=&buW2n5 zLUaQgcMxy~{a*8sjFFg`zxrFy_qV5ukBnY0JmBZAbaV}j~>`7Pu_ptdN5H-UhJhqzJ@)3sO+MyKoIe%>hEVm$|L*9bO2)IOCK7rc^P{Q~8 z3k45%r=Br=`geFv(Tox3I^Dx|xaBZC2h8%@OMzB6pWLMa^j?7@2o5M}3BExIbBcrc z97z7b@HzG^y90(c^K9K3mjn{9HD(o(gm6m*@A&1caz>|pMTQ%dudk$U@qM=29sa+} zOrVHG@7vk?Y#6sDkj1Z!jGO=Zwe~G>FA`EQx7vNXjW&3{r}b9y5tvq4_xcok+Cafr z!dvt5jm@aNb;wFBJXR1^o(}GS>vKf3FM-el&ei44Cvfc`pjm|Wl%re$)v!emkx+EJ z5%tnnT>95IfpbhCcdo}-S0OSB7*s&^k0`^wuuFQeG2F)$)>T$1__p$ID`xaREn08vvcOJ^q`1%?HX$y@{-14e4RNwb&@&Xg`P?9wO#qmQY_`LPjW&gbC>40c!zao$h zgJlw*eucf^fz{=|{3y#s zy6SIM561-I6jMdhMepOiu0fmxE`M%er0UVjl%D~+Ok2*VFv<{QBcHLCU*_b0!2?Xbn|w$wh*S> z?d|Hf7E|*R6SbzDST0~pOw8d2r;H6M_+ZMeKicTGh@8?Q^VT7f5C=6=0x;-J4X=&n z7cTyTpJ)TBOxn={ff9En^4ThDRfL8*=WQL2m1KU0ovp2^jarfyb0+@nDw=R|E5i{9 z;9=8+uE{Y5^bVDFUC6SdK$zWw<#~2p^-$@}&`RonHK$E2xz$14<-F0y=Jt(O8^d3j zo+?J=p_sjOGcwAkt{$6Y4h37 zh|#78)QXvHM@?BxRc3Cc=?XhU+&!u%E2=1KfCZgXc&a%#1}qZ1emab)@>EN|Ey&ji zvEn)3rbuX78b#Bypzf3kP>i*yTwFw%`&<%VO{H*-FV=^Wp6#ZH>1By2>M0U(a&ktY zH3nFzczeaxjY`OCWN_d@?km1syti}haV}7@Zg$?GJK@wlAzr_DcmF_?$iSpTLAE5@ z1}(|_t@e*~BJU>Mpt+;%0QqrybRj~{l<2!$oy9Y;i|R7@XGOfJpxxLU^)5|O`X<@A(O;7%El7JBckfC?4Nb zYZ)0+)S3n?yhQg7-9>D^rbTdWVKEo;;Uhsus+0iQdr%?QSff$g_8!7O_akEH#yT;u z!5$37bJNwPR4Hj2ta}DMb6j>){&0}O#ROQ35fgIC19sIZKD$Ra6aWrFUOw%!G~@Cq z2D9cw5uIFp+Do+Wv3^&#D+-G;7+CJAVkgxG(0irbqWmq{ zD)T~?=@ecW8IC5IQkMO~)o_N5c17{}h(_Ngy|Rha*i>#nRx&12zs*%Hn|g#(wgIua@=jx3r04K|Qye z%BR1b(I4~^G|bs;9?wty;Gevl?*dJ(Bj1|B6kv++hXu(gzju_gtg{UZ{>C#u6@rKb zDrL#0w?RO?!#+M$xS-+}BW$0eqj!-^G^=^>NHc;qe>`AdH*y{6`4PXgLPPi=mft=O z5Sy+aR9%0`_mr;>h6i}44H7KO@3f)i=~lN_r|dg!P{D7nZ|x8MfJ$4*WtKE`DHe>b zY?ScdqD6(+GS{$rnrVqmG3j%-7Ab$HptQ80Nc^e_c~`{CSd}g$o)g9r5!3nHUb;UF zf!x*gV)0jU*)#fZ6gBa&Kc2&TEh-gtb&uJ-k?@j%S0Q+8Ef<@H20nA0uz_^LN00oV z1i%4hMZgsaQ=*Qp-?L!%GZ{4e5NA&{hv_e?>cIVtiz(C7)^u|ULVs3Qr6|MzY)Uup zlVJ81Z-&b5REHj zTyQ4npk!5cu2^9K!mywt@b|zNzt6tUYa2%{w1O{6<-XE%KjdoAQ~q9QMJD8!-`wmC zs(O1REBhL=y!VmOhkhw&?i;&{pL^+b4Z{N0?@te2IyzYXw`njDb<1mg?0Zw0xr$1U z><$+{uesH;iXL2mLLTVJPvP#D{i~$1G)jpBck-did3E@csVrZ}xHbR99<)fPlyxLH zuP~N{J3Xg72%D--kX@Qifm86`<@2Sp5o}L>bm;}wrpRk)s^H>D1+6K*`GAT)^f%zE zdwPfe;*|ZIGV`X<&TXrr^G#9CN10Q2nZlIo zLQ-Pl$a2@YdZ#l(=HIKw?ryF0#QeNHa0+qur@v(X2fSBT6mq%__QpkO4W^x869yhH zynC|gf#$Vja(Od>qtEa;!CYLpS`{YG3=Iu!ZHw4u2M3KxdgFBM>z+|CCCZ7${LMvt zVT}Monbg-!2LzVxYcDi;xb&+NtVr-9>*ADS;ES1z3leY{v!thsT}l>Jke0PfH&<*b z)UKCRQk$FUdmFg)5sYi5ZhhBI#`n%Y5e5!niM*Tps6hOE9-o_y#N&i}C@5QxDk&lPcktz_u*jW$8uD@&;@uOMqoS?I*)ZMprWM!|DRx{D&Z<=| z5hlFX_Q0X})Z&zJ6F55}lAuYJc#68=Fo=y2*^zUKjX7T5IkBny@+XUj)N7>52jy4R zm6RI4gs*8g<_4VxDD{6LpgEggHs7O+y+B8^WIr{U(O>ZHvS~N~yL8E1((I)@n<%}= z$uaH^YfhtFeSL3y5T=oJKtB`H(xhMGCgk6>?fW-0RIllc*%Q> z;NR#dpi-$5c1}11%BNyc2M>WYAbkw5bl?-&pXMFP0bE!zR+mG3h-9}y)MUO&G*QBe zW_irdlim4|Gzt?O&U~3GB!ts$w%Z33ZojzrN%qzS3NPy6@qWKJ+QO~5W4T_3m0?f9#X*z% zur?tKM(NvQVr1w?L02&bJ4#sXfwAf8L>#PWn!M+u7DH_q!FJy6383jP8&xbK=@kal zpPvNpHuv*}=F@Ik2z5BTY{FXt)#_lZvjwqn^2C(I_!4 z?wo%AtyJgz1QhqlM>{dIMk`@^TaS#O^U3SVANQ!&C`@|~9&}lLiRd>>D}_97p~+D; zDy#kiVi&uoTF(wZQzBI8tdZ-{Pq!)4hz~WvCY3->_Ilue$*6ZlfwRJ?wWy16m|j>g z2Jefhp*&T_simHH_oilM{ngY^DN^)5Ozk_YRg8g8J{C_ZWJmd+(NY%wVEzkPWM<=ZYOyv;V+MmtDVcM ztK~{!s4kG*t0fm41v5Hvm;zL@fYi`q%*%Wi-u9_tJ4hc+bUmT9GQu0M5KZ6a?7WT z@{F?RKUe@IFqdsA<`A+<-;S>cj;o-)CU%fI^2h*1Wt;pW<*D0cKdMff?e0LO*L~@Y zQst>uOpQk`EXz?3Jt&p?{kFU+^T%=K$1%2Zkw$je$U21@ET1!RsQ@XKKCp%PvX`FV z9<^`lMGJ+Q0^yI)DpYS%qY$bQBU6)ffE$C1_=xCe)ggiaJS=SVcp5%x|DQ#?3cBrS zwZ)j~}9P8XF1p7HYWuJg8oTHe{6 zhXa*m-F7_y0zmlINZ`IocX`q1+LX&O{E=R~LttmV{6j$r`mAGggjvR>Cv8{qmnPKnf#1Ff&E{a064;5dI{GKRj-lp zI}}aZ6~CwFyM}dp{5C#5snZzU;MrmP?#ESKpwvG1 zw-+5!U=i-1iiD76**4#~+CORzNO6kzKg%f!Ywq^haIVPZ=LL@x*2s0e_dY3k?I;3u zrsG45-5IARoM;y|BO)Dypj7?eicMT*SC7#64OyqxtN|Fvx2jJOF9btSp#Mg*?NF*N zo@f1aBbw7>h&}&>9U&#VQjC?q*LrL>ll#gYDqSz7R!WEC4wXW~{gDITigbO=>Ibnk zbod&tm9C17j{*T|Tys>4g6!hnc4I=?DyN0gCHK z1*tCkT96!;li4s$AQCCsq^YH4HOVF8js*Uf2Kg=O(~Yu|Z_krZ7BD70KmZ_ze$5*b zXo;@^;y22_G%kFUEoYGs8ES!43}E-4Uz|UrezTSTjd#eNfIxgWI}>Y_d9U_J{*wFR zOA7_?LMW&m{+sLc+mOW8FA44~*S0;Eqvr;Z%(rY4VCEm+e)@XU(tEw!!CRlV@nHfM z%)MYofO4|_xRndoCtRrTT6>#a!Ypdp3lS43EFxaCSGL`ZEOvf4atXUeAM3o&>mb{- zb-wM>uvl-DQM8@aj8eDX$+uTDo*r<&E>CWF+>Vo^JH%|{zvebBg&|j|DE`I#MQa37 zc`n15ONJl^Kj(H@PC(OsbD#zzouqZ?PV%Dg4&QeDVlgwURx8ugbiY!3eBNpOanN5r znqOY{;%;QLaK@%EThSVy_<8t@&Ev%wQhiESfW3lQc}cUmV>qh=!`C+U^9;je~{E9in6TwLX7cnw5_$4Ya#j%VQ_Fvc#WYQFlV zAkCo=5mSl4eR5wWoTz7dRH2YF%%f%->+VjhVfS-Rt~p>dftUCkr6hd*)8iZTe6r1A z>>|gf_S$RefOAHEofXlPfleo-#p9>2LLmw54mbvaR~EYl)7bAlKteamkG55czRX0*-a6USD9yk11soWjkTap|kNn(daHc%f}$?I6C z>^JD0y*3LtE?*i-@|waVX+JNVJ8#pD;)f4(-uSs3ZUNfKv|inwwCGc*0;S9h z^Dftfad!%qL};Z*Y|@;eEz^&I)}NfMQaIv-O{dUDwx83{WLN)dx&o{vGl|}xD;joN zYmMV+YAUA{e8zD^=)DYr3CEMJg)D7%Jt2}nr>>@+O&RbwPm_a&iI&myRG00V(4#GT z$VZhIH_EdM6+(w;CRTL?>Iy98%-=_GqDgg#gWfUfKfY9v$AyR0PW+rEh!?v%bb?bI zCQ&}jmoQ0h@7r*7=6X1`aW}~`o&;Sth@*0A>oL0Q4BS$SJd3}8ecv&$3%Mv%VxUNd z+(V|507a19aCx6cuvPD_?(1;l>diAO?q(QWuFUv@G>B9q+_3*JK8|#+6x_av)|wfq zr{F2JFD3$MAdenemCKHopsKEUP(R~D~3thW5i zO_uaK@URvRCXdI~_;q8t&Dzn?_GYJ(tbFp}csdac{!&Wy z0UQ(sk$6I6T(oG#HN1LW67tosu(N9^)N+2WZ1G?%fYMDoz-`0~rd;$58tv6 z^G<_Fi~<0n(~=RJ;IpKjxU8c!(Bdy^TwoNY)U4!RwwGX(ooX{@U77IrDm#M|_2e@7 zdFFl`&vKB?csevKb|1DCup5z1XQjVWWfFW3>z&am&8@^0EWN}0TudTpBxD@DUl_5< z8F@olDKSC~HRZTOPM4WM=cu@|ScFBPb>B)M$5LXEz^lgYdIf7HL8N{JZIn1Bc1rp= z4*Duh*X#Kh(|~jOZFtA!I8cNLYq8tn7wCF<-cn2s&hw}s9OK|q5t$f<7_{hN1pwZb z&krc4S9smU<*WczHX-PLrN*y!w9Xj|G}(xrX#6huJFOhVbgCcmQp=vu^Vf1F1Yr7694|@zn4t&)8*c%HIVhbPxs4}9 za1?_~9WDnPt_6cyBzy^%;o;e0lXQ2T1WC4ZU`!dtCmRu^_s>{L2t7gSr(eszoR5Vz z%FsB-6Z4;#Dp&2lX}Ogtu)a5}y89R&e3j-g$j-QqKd%vT5(B9=a8kZNic>RLE**V> zwj;uPeZL%}M&cmU@!d-e-Rt+s*2X32 zdQpX%8xh;W#hzudrPs5!)2PTKySureeB?WCvTg$J+c?WZA(w1lpHzh7mD@=^PKe3m za*{e;C7W?*5D}XyOI9tap;ktLWj^CjOYSoO5fiP<5ghp!2;%jHgVQ0%+ zV)_Y5sw4uZui!>bY8T(@$RFL)(&mhX&b=N%#L=DKGuCzgGT!ovL5Ui20{A&T< zt>%YsoKjnV@4sAfpYuA*B*|(;5F3sXc4ToVscx0yf__gj5vfO*6F;bC8&G`y+Om#x ze`J2{O6Eq*dGGr|gIKIwSbrpb_TK20+JYlP!CZhGQl{PhqOtjskh^xs^Z6XcQ%8T^ zjRdLAtF7vG{JN>35W9%W%;y~Q@|V^quCO%}O(64j#KYiST>mz6?S7ca#Or#fbAX&c zEWzC#BjS-p@9pdU!j{R-){qDGM^6Vhp*DVclFEdu)f&TQtBR!)v-|&L&*G&6cY$(( z_8eXiwVl-Y1-gt30zm7(r3nTBc3Oam!3(gcx!$l+WqLW)m^28l7?1&W^Z#AIM}hZ4 zp~fC@^Y+`7JEazmlAS3Vz}A>}w+tYMLC;J|lAH0&`&$(Uu*`Szz5QIIn8ul<0uxsP z7~m8q!xb~hW|3qfPY5aaIDa{iPB5J8AGdAwa)bExOE=W0O4#RANrVwvT+(FP_N zs{EHn)Mk`_gKAp{c$!YpRlvTQU^j05V$`s9|B|BtffxZSmYT|iVH5va0wtRPyE+AF zY5%`wJ!D*77me4A4e>ks;ae#^nJ_w74GZL_U}9FkzOq+d=^KB3x=1Jl%$-Lq@32a@-*Ks^tg^pYW#c}mf&6@##JM;>omjh)diS%{cZD=|F%etDDV;)H1!yT zrV^PyU{1wGKDHnBNbC_%D5ED+B{VBNbI!e{&tcwclaWyXH0D6*t17s}a~{u^;D`e2 zwhwcy=8b)|CGJ{_^3h*&m8&uA3Uj+SmcM$G;qP4>H}AR}H5QuAu&>S>X zHo%K9n&oq75asi$H5T$oxU^i22|0Vd;+OJ}LASnoyr9G6Q!P_}uNn*EIGKhOL!3DW zAXGiRr{$^;4_YV}HnS>(d{gE2{#oko)?gE&Ju5na_s#A{^)a=E*li{H0> zZl71->ZhZT+|>_kM`AWrhES}Jvk_S z&Urq#>kDTK6JF;_u8H?iW|xoMhy!UArR3vqy=!(s7n5TFHs!&)ob=FtcQP~q9)QDf zeiDaTVm`xlEXEzrei*?>9ru|Wlc*?OOf7xgLh6hA&%3j_iPI{(I6x>ZndKFj(YvdZ z&Nib<822}537NaGx_CoN9?ggtkcaT^T9KY%N*k3nCpd0!2J^9n!DgL(*>c0{eH}muDkmh4*B*!@d?jKuvR~*!k zMh%1OA+GgsMhyeMfCA0c+~cKAr zsRL_yam8f;k_=1+TI+ACToxpVB+j41>!X4`9G@e5g40reH~k-k<;S1Xqfi;f|7Y_7 zI9Unu3XMIS9nc>$um5|vi&ys-n7-?n@)YGGsI=TDsLk1QO>MB!-ktR|ev@Bb<&nGSGWP%x4DM@Ia4lYPMPRm})Msek<*B-4Eu zD0Q*G_OuhU-6o<<$JVWJ2UJ&(`V&Bt_uk42K8@ZsUySdo$+^XwTJ;W$QG zq&8b_TNwYHAm^FzV*7*%%>^qzws2i0=w3ITN#vaJT8tOcnr{@mRR?`7eEuil1uXK$ zLpz(`c*hW&_q?2N47TkL9}?mVbkcJux{~i1rjlgZmwcjk0Yg*(|C^e>lKIVRQW#2&2k2fLf_D$2ud5q3 zTuxaC+&L?^TT&V)k~CDD&+5prK@vWbNOA{`vX3@YHr8HW8x0wgH5)Vh9{`Q80iTfw z3Wx<;y6pqH2=q_l719E=KWuM*ZsU2|tC84j-ePox^D{wG^1{rWM%8h>=g`P-c{#@Z ztTn0J6*DCnPqy6;lmeJn&flJI1#S^cU1$1BD?3_@Miacf&kAYU=u;jrw4KCq53y>k zacV27e?F|1mHIkLHhuXwk?&!!UdP3%P_;UAo87{NJnu;Qlj#0^Tr8JFeQi-)_b$vAaW?s(-224bLu7U zRmuwMtg>!(G5wunhZlV$=^>bU---f8JKuV`x;HNpC%1xe%{z7`4jna4Vi*eR8{dU) zA3q$f8oixeyI-@2CwIf%-%hNWC+RLf4v6d%zOLV>TQ;-23>h@59JuEFy0T9Jd&H{T ztWTe+E`Oe&^S&gzbsZZkNl|6(`y_*Y4hK0*`Aq5irwUn>z{3U|*1hAOuf}Ik9WRf% zzFrp{k2B8j-Us8AUbNbq7aSUiUp?J6S!n2R-tW?Am@b~SA#mTj0tGVNk1@eBv=+|W ztq!Ue*Iyjt2h-A|@a)HQo<~&RuvnvJX&=`dmtA`^UGGm5_Z=LBA*@=T`#P=OmK!ip z4HZ|k0ruSw0A^@y7@=k@`F+tSbI?-x7}c{@D{S|_r?F}!@GU;N@`c;BveTpY<#MFX zJ)cG(jK=5QS~@|iL2T!=h;_@APUT0WwdQxxQ*%M{nB~isc@u`yOn02+o7+gwAqvd| zR+fgfw(&A$W=*F>t?Kf`_s@rlFU-GwKwF2ELq?l^<%2GdNBWWd!H7qi;Ah282&U-e z7aih_7lMcKNnSUHL)48&E)HD;_WL`b4{4CkNMw0{C}KDQxfPYBgjKz~MK{lioyz9= znp9ychr2t^s&?aMK3T2xhWqUX%ck_^@7GaU1%U!KA@~Xa6X`0KId#U?k`P`Dm)sm!Qk)_HYnrj zWo0~7PX!SxLoj-C79FbuS1_ z9sK%Y6VywctvmOq2>eqtRvTSu=?Rtmdtlest@d6}&d6kQeQlIk7vmD^qpDC~xGrEU zAc!tt8z8JIT!@OM_0Kx(>aD^3k84RGlF5pN2M&bb8Py7k5$xqvXfHQHdx=0~0e261 z?Y0`l^O6?LiqULO^_3Nw^x~;{uBJ5Y)^t&&nwgCSevESJ{RNc_tjlTaOePI73Yt!j z=C`g5h1x`J`len!SJz~_k?3uP`xjz?13qUo0{nfWj7%)7>gnpiv3y0(S)ALAT%K4$ zT_QN_vkrgIEueqe_MMgYFo|WKrr6vRWwZdYe$vz9bN#Re^M?5OUCBBlQLXxFE%lK! zSQ%b}+bAeY?w;KQq&DHlj!WGGUEdKhhXoPzNDz=(D-;hm$9+2?B)&@gVVU@ zS`RfOCbn<4$PI4<}VulG{Q*m^) z*W<4mqettK20WmVumWusXL2I5yC`n4Nb2-@i|!C)k@tm(a*blZ!sc*NMHs^d?`@ls z0kU(PZ!lLjJuRKW$mF;fR6Y@r9UEgU$1cH+`30G9pD1CerMZ;$`+YIhy1@XOaZp@$ zI~GSW>AKv(seP-GRc1NC`l-gz3_KCHy+RiV-AWV$B~v(o$LxbeFE*z@zV z-Z`BJ1$Et^rmUJA?cV7PiLl<9^~3dxa*LvRP+DSoahiM z>K~=7?p|F?*A8~Q(wQGBgYQn;@NUo{P8}asN`N4W0Dae_(1R=y5G;wAiK$*Ynj1eL z>)WM{lGqqE>_ZaQq`^Z6=FDRmcilTA2x1V}zg2G7@0!}fZ!B16zU{cn_J??e0pfUD zomz6Jdg^l~>2OZqP-4=a$@);+6_HM+58Q|{308b(V`O0g81v6~G}T={Vswc2%K;92 zD(D3Kfb;p|za=58w*C^Kf6w;z0MJgw#lgOT1s2AEyJG`Q%KNenr^Hiv1p`N;-%dD_ zEN}LAtv4wvElu1WjddnOg}7E0sjU^)n>wGr4%b)Ko;}Mie{``KCx74L1%dKi)cJEDHqj-_PChX=lsQz{E^5sF-8&`S#xz0zobz_+~vO zp+i5RfMfk7H~$fzKoD-25Q>`+RfCqJG@_!=|9usnDVX1e!G+Z(VHC|S(!Wgz==`Zv zz@v;#&*)>0|WV=+BOL4o-I`af}Ef#8n!`X=A@UQAR?%xdY_jZi+ zaQ;9okHvPJ=s(q6#Cq`i{j3fAObauJPK%R{xkwR7q!o#17-;>Y+b`wmS}Vrp_Ee*l z5DPW-m-l#$ArZ?W90gL+{SC>y27&%S^TTFlX4RlyzT(l8 zdB6>(FD&G6bpL2vc`}N*faR^v81buXUt`BIgdxR@F83)hih~i-ur2RvF>~kt(VgK3 zv_7;VOQkN;(|qlkwt_5%*;$?E{%MRpIN(OrlbMz}nZ7-?yRB!T;vQquSfX7sBi(}L z&kCmL_6h_9tR^PNr}zuqFbfeDvI?3F5ci9jjSUbbXj(`}NEvB-I;up7?uujW4c1JK zP`%Nkc;3lY3{tNYg=s#&Th-}gXX%7GH;yd!cGJTX>Aqf~Bpr{Rnz!pKNDWcQIyP`3 z>NUzN9O{%NBh<6kUhb8VZ|l5xAGO-Wir|>&5T=F+zjWUiDVMqkc#~_>66dc{mR?`i zsh0hAEb0QW#2k9m2UA6Nu`5MP1we$$F|@={WCbOq`I#9zz-Wynk&*uZ_!*|t>ha%! zeh-uoKngOn!|9FW^nfQ8I2UH}=kc{RBwV+Cb62=lMUAz6BhZy_M5^j&wzbZY`oepa<@cl*wqF1c;3Fm^Em*;? z>nAG#3I_cr1MtBI!WeDhi}?Wz^yiBV$Z@u|Go-OHGBnepF|*P$F`}ck`Dqd=D=h*G zjq&FySTRvSc_1JVFF?PAL4p8s7Qi6^zd%qnqH6X)KyZD3zQFMmaF~Eh2nR7KA&52T zZ_wBrSGH_~e`N`&I`BCH+=dE&_mS?95C| z9e~Q<$Jhb6aDV068R`AGF`k2&l@SorBRmw~AE-b7C|DaiIP2LN0cqKM{wWUgS5?gH z4J`ElMeTqZyXqnV*^qy-RrKtBn*B5Z>cTt-2IN8feZ8Zdff3OCr~m2y6%(+wvNHPV z0Q4}H&Ps&Ibe<#LwY}kRTYJV1SS4_c-$Qkh={z@BARf62|<3wR0W@YiH}rpO<#12q&wW z7fze0EDV?Kx5f|gs|=DK#u*tMAM5m-uD?>pt_T|Cbx1{U?d%ni_M#NL-mo#d-Gi4`=1eyJOg|rI!ivSU+^61xB zR?>j4G~y}SOlG3}&%kC4Cx{62u<3Frwo@o_;o!ByqDaP~B2Gb2Pf!QFQw>vCp>dtx z1%Uij(7~5VdY6kI21a>p_kcf%5kqzl(_rZEv#QaH>KPq_=u7NMl!t)NFr+X!pic5d z=g~k<%uAEz&3#o6AiKO-13|~T$)^j!_j{X>G1Qd7LW*pQ*segsropl1P{b*Ue)B=* z@9{>wWyzSEvISBq`>J=RouMIbna^@G0)lBg$5Du%HQA03F+$5rDc-lwYF1c^m!755 zrf#z(D0~}~`3V()^srb`-9$1wETy-)!ivALXXS#xLa;Gq>X0JP5RAkm1)Zu;*i)Qz zCrO@PoVjeu*iH0;a7X!#U+U~5?S5IDUzBKkpFZcwl^;F&T#|S(7pMh^i0ZP5AI*nNTO-?HK{1fD1uEZz0B zwrFT5rhP-g5cn#Y9@A7)u{@cO9x*W#)_poOZc>cffl|mj-W#P=) zM9o^>)q*Z-Qp~79rJS^@!SXMP~x>DmTlr*1W8Gkx($2fO5 zd?{O^o7R#x1(q1A$}c$kn&uASh-@ph%VkPxmV;fPiWLLj;EN0E(-t)xj6UQc#0zD1<5aq9zMc@c};;Zzx_G z$?$-f`Y@KPLOgmP#DtV|FZ>4PH$wJWHeejgspMPi!Q&ZMLk!xr5ZVOoJzLO3=*VoldE>j~teOH{%212MW=DdP~> zXr%FWeZq_5_o;(8r^vTr>_}s4#C{2b(TG_#D}se7fY9yP^=|Fc`ENF5W2cOvvB_EI zi5xg^`00h6P*Y6y=NiKOh~C9SXJiq2%A=r_NQNIwz{~F{fNEEz2qa4!U$%{y67eZE z-)5Fqg7@NY0@4Vn6AOh3wb7mG_wS+UkW;b|mE=oaLDR3rNQ_0m@7HBgrxGsx4np@N zmbW!7$!{qPiy9yg4Zl&#>LVVOjjnr_C&PM0oaRP_7aGzniMEHvConXqA&>@><@Nh~ zgh$qd65gSxq6gzlt3WinLp3}lSsKSb^ib%0dp=f7xzOk+OAC4xqM7tFt#xKUMoGKc z&>R@ugA$Ajf~P6ed{t;0Qh;tAon7KuwZmSnQa&RNt1`}x_(4#L%NdnhxH zq3gYk4f~5kcsd$W_4+k2vO7}SR|LrbeHntnkmN1PeL0$bD~yV*Dj-n0n`n5vypJHs zr*|%J-EguY^clHt$;odM3XH&LQjqWy5Mj3NKW2LzFqUoew_-GD=??-!fJU<>54KYP z5ee{22&k^NACbguH7avfJ#@n>AhFq`5wh^$kZ}3*mIQfzMZ|HIF@+MwoCbh0?ec+3 z01Iz56e%lyhX&h98J^9dD7f-DJlb`+H{$OBV!P3IfjYF?>+dEe4PijLni!U4BnH9% zVxO0I33cT3OOcnlO)jMNKo&^o3m8K+LD17q7_41NxmA<0s%H*CsV_qXD_s_3a1;XV zw{?$jHki*|B?&uw-J!6!3F+Ao^$zykS_YtPOUf_DcKCsp%_3B=-1?$a2x( zL%dfqX^B5#qg)6BDWE${V}Tel1a6~R3lx78pjq}^bdB1nM$xEf$Y~>6L9|(T4sYxU z6xOU*E=tNLeWp5St*BxOvIqCnGQZwWA$K4Q$o54CdXY6{qY&xgozKxfYUM zKs5Kojnk@4s7s*rDxo}x`<$pr9&Sy6eMsPNFBVSQm;p?e;WzitZWl0>;H|`x!vf)5 zb`1DHcND0Ctgbwoo@bjd{-J+7KHg^MU>V<*`*dFys1p;wYwin6cuob6BlYokEksQTMZPxJU9sPgT})T_}WD>MIxb3P!J4M z{)e9>U*P^PM2Wc|bzgP=i_b2kYan|;cQ6CNdY9R$qF8t~J!9bWC;U2tiT1CeAJ3xtVdjs3NRT%T931S z3Yv&9k|ZH~6)R#)`lg6G*cDPre?=66?7jtUv9T{~E50bPHBROX6iB27lE=4H7%IlS zkdM@q7f6Dr_-&{fHP?&wm=Z#3xbGDO+yV%kx_UCY#bc;{K8hpfhrCSV-i)lXC72g! z=5V~Y7&nV0Dv?q5M3F&Ix-w_CyO3ka5fTn|yuw%Y_q}mG!=G&;icgC4_Xg=e{O~jd?I57113p;7wVO^!R zTC%2fouCptrf|1S{ns!e9DHHZe7!+*f~3~M&Tp^6&%kEt#ro? zk!wh@HpJ=tG`={w5$+NS%6JAail9nH`xPBU;&S#~De*MZiUSkRxi;x8hf*Y>VdMKp zp8IeGFrrn&d~M=4D?%6mDMN=V!&6L(9TVd|+L1HBP|Go=Zzv+{WWp!bWIFrKh}1(W z0G!0Ewap4C@B<$|H3Jr--Vf_*M~DE61h2n^+!b7lfW~k=z7%VOCf$})u9#h}Tfy(5 z9-eU$MB%jZv1AhR%Q-xHT-QJlmmX$1PQ?IMfosARdjTan>6fRj^DLPbhb9pIH()I2 zIJA~;O0vj>h_q00``V!oSX1ra-eb>wZFBVuz8(}n%1%jg!?{8!u@;JHI|w)|lBD9Z z0E_c-vB~H{vVaXCi_C_Q80q0#qLnbx$YkPy8&Jh%qYCRa-CX-tQ!&%j|BL}&@W)5W zrREkx!RzAl)(2Vojo+Q5D~k6a>j|ScWDX?24=aWxlC*b%9ZL@%a?xN}Rs zJFYmwg$9UB`3h3}PH30U?d(9fWwh^Ab1uL zI2DBIJR&>hRB~VQE6Mzp&4dj}S3+TeePERM32#YCg! z@g+n~TSwM2gO5R6V4|9*LM$QzumqBk;Vtv{TLi~hZgV4Fmn+hQs~H_s%i^iVz|sP8*1iPJJ0o$2 zG;b;dI-L#cXg*dK85^R#K=9W$!rzf@wp8h?vK~G>tl1@*+Q@6ha0Xn5>6Y7(LV6S5 zKWw}yuYPN89Pf5Q2z`YeiI@*mUuU~^?Zk%d_=&w}Z6i21e2Vcx#szcuFw9}#5TF6} z)r>V%S`VCO3(-uk1Vx(q4dVqkwW^>4SJIS#y>EZ#;X**=+si(L2dXkLL?B)nGo9?_ zd{#s#V_v?>Sjk53(iQIJ&2Q~>6Bof%D2vnQZbqnxcqHzjWX5bn&hXFokA9zYSmUo1 zDX=>gGGhb8S_hBsu3E1#4*q@$<)NY1w1j;}?jMEHp!wB2jdw&2RdPn%oPs;Qzi!+n z=Qg%IZ{$24RGMnVq`>shi03_fhwTq+6k`X~TxD{TCSpr|F92$y?+dN_F^+UED_}_h zoy!_NkghxzenS-k(xIQr+EU;G75=2P6>o)2tWGRl5|4YKm@On_T$-%UT}LHlyG0Hf za4!hi@@*Lrfsc6s#(&zBq?OH$5|Z>QOs0gh%Twq<{d%nOPjxY5FL`EH)J!bGbsf2Q6idG z^7TW<^?K(??U7=zyzuUMdv2rf!tqVY^IOkN`Pb3OP8|%AmoAy?+iWOuQ#C*|g`|og zUji5GgCvDpe9wbWiS$tvfpFVQT(DWf z6luDAh>sYVmpg8hIrQZ&;QIcg(NC8vs`rJ3cdMpny;r;`S^K31Fa^i~kNPjxtNsi~ zC@=xMtoS%Zi|GctZr0Xs>ro@i%|DB9aTo~;>$M?&S7Cm)u>I*+zhHTNtlVGB=xl{0 z`~nSBAvT*As21~<>b3cLit{Q#U6Qe>>sJ+4I<9<#NP88i$;v`PG#xGqBCNi$Bgld> zw4{%ZWJ5z2#H@yPFbv^@^{n_zsL4b)obf}4QGOiX8O!zQ7rH5XlsH71K70-_P`@M? zz9ae2u5Z#rHCVA!$|{CrbidFK?8GkQDun=&X0Joxe6;3-2?|I}n5t1*h%!Id8oTJO zYF|wxyXdp*h6ux&=c(YBLCjE{V$YEdEk$_|FAQdBHEpIG1v43hDd^1lUWVVg^CNGQ z1gG(LYBebg`7$oDT`#ou2bM1NZHv@C5FXPWTm;~FpWD%QBNod=@)2*5oc(*^*!%l-r67VsHoXT=bw6gxnjBum^6Y(}dQ!Pb)_ld-@^$B5 z6nd?n2ImD5j1&@zM&t3;aNm|b=ltgGJ6hfjQz(x!&bR|LPJWvuaWAV6`OO~<3I7p+ zh}__77GaYuaHovB-&C;v-T-BICu!Ikhk^Cp=>5(_pCrz9Ch-Ql`}Y$#Ptp{a`wi0+;Kj z!K%T^{aHdp2^6MX8bugi`=Z7M&vNMrGweKFe^hcTflctqhvhWx+oH0-*n$-o%#qV8 z+q_%fRR;I4!_x11xwGoaNR{8u(?~J5-MbsA4#&8_3(1N8q%eisigZ9)t@>CZy^^7t zOvR;ywu=1uI;1N`{Pu;n-4K3ylh6wKo_Wz-}I=6GdVx%OUBu~n-i@02tk-+DeI_};W|2E1=qpO_{D)J zOpfuA&3}uc+vf-vx`?h)A`^|uw6|r~2-6q@0mY#c-fcPWXHly(0cz0 ze!P*}CEqNL{A)asU@{lG(EwgJv(tvbpU%Djq|z|-SESaXOb%JLpqS13maA@gB8X_Q zaV+NC1v{fnZyfuxEu$`d`YU(QeqomD>5pwGln<`lEgIkZ;9+E_O=se=y1T=(MGTEE zkyy9=F8N-mQk}1Y)vz_w_%O)zdYJrE}bQOF4^CAG0O|^ zQibm^em+x~-bYJUVti$J^w!MXMDc65=0s!PHDv1l!Ci2W>+3X>&Y9RA@xv3BAUO?nA2v`?o@<6; zze6`0BF|?xfsEdH%fm)Dk0*)C&SjI(^%oRz+2GYwD&!KY7j1_>AAFP7nHN%UwW$m5 zF01K02QGGEN&_pgWXVu76rOa0G;CL$9nV>TooJ@3ZhCMTFqoEa)WtFjdLz`-R*Qj=JkHfxOou?kBU!E-fjiW2r)xpgdY8)|O|gavX7iS~iaMGnFRnUyllZ zH?piU=cHU;6}5DBTtlUDo3X@IKAuPJmbCXwRKU6hkFRd#glr#de_t0l^TFzU z%Ti&rSw(LcoZ4+|w@xdg^SM9$SYN#5FQE2dDPUkikcWHPZb zp&wHB=>LFgwFg#TaE7JM*1Em$QMpo1fn%)2>a23K2U{PuK*MrhX>tF4t3lK>?<|mwYt&{jz+sQ#TQ-W*?`a)0r#JNH5<;!jRhpwjW|G3W2?)lUIzmr9s9g>? z=*mp(<_@ve=_@M{`?}c>(8U=wysOYLCYGhfIV#zvv%JCW6h$F$Y3YNC z!2~9L%R_bX*X<95j_^Uu1Ufz*`{7+)J7?k?CI`_2foKoDqfvEvEW-YFn5e=y0fFjc5!u4_rx zQI25OO@C|7dmYL$TO~${o=?8&4T#oiWd77stWWzQFh@o_o}w4RTGzq4V0@cF?IQ8L zxoM-d7M|s~<^38q=w=*tG-m}&d?vZsk%!)+;n^b}3+414dsk!b+2|t_MUC&~A<%@_ zv(?xTWvxA}FzIe}{guk2cBjI;$vzJ?Xi+f9DF{!Jp`+^ZdyFmt%9!}BCR2dP&up~( zY%Ef7e0YlBhP1NSEAl(?a{WUOF)Z;N4Qo+Q*L75g-n|&xBI)l6q4kWM1Df1Uh4A7( z&W(aJ)97;wN^Izr;Av#AC}6(j?`MZ5)ev&|Ud+b%4GZctW4N`E!Z2tW%S*80aE5}= zGC^941^!Br*21+JbKHwxtB-JL4mnNRb74PlA0Ivii9m>Lbt33W`+sD;V~{9Ku&%qt zwr$(CXN_&!w%6FUZQHhO+cxfe``mpZZrtD9kzG-pUH#;nSy}Ko*E>)p@7;=gy33O) z1v6uO(LePkR^J~0X-w&iO5~{rOJdU7<&H1YRZ$t=qbXB~ytvRJS z5vlEYj<=xYYo$}B7l(cB6Foh2b4~%1WeiN4ua;NG!%VysLC48tg&$(TH0%DC^HmxKXzDx9O-`&Xx_ju{+ zuOYg+EZKRrk;+5xri|HZd_hrP6or4LvJ#*KS{RN)X5(v3pEmRADu3R?Yj$ZhC_L>( z;M8vnO*MLWj!X}7TYRT~G|8jSZL>7HDr|&v_Psz`m98kFOshV2_>?W;p$3}7TL0!* z5ZR`31NlZa477r9(wDMb_}=$taQwVkyKZ^l9TwOA^}vGWpp;FW5q0?>xhY>BvJZ@T zH_#G=4P-yJr5FBDFg63O3+ZD}jz9}}4gE(2y|Jqc!$B4GZeB&;A^kNwhGgoiK*9wg z4_WWfDl&}>hmUfO+;!DLx%W>Go4RgOz}9#0`OY8njuq43`!)C}Qd zb7&||SYxhKd;WBgD*Nt`r3Pp*x#U`517>v?N>RC1sf-=T&qNA0z*r}5se2||7qcnl zjAEmp*2D7gsl0r8cYk5HB1Q=?R}@ahw6$|0s6wcl(5Q6Z27Eno^17C)m3D+{)dWi z1~b)eo#$i$Syb<$1h|H$e}+RN%79hz#yI{S2Q1*LVGC&b=f)pL=JT7CH(SsJN<3y^ z`f&)Wb5yxpIRT)@>NQTfbmy4-x~2czKw3hcHQ<&-h4B}BMBXYGVjJb+-lQLC&q1*^H2W0;H4Dh;qP z7W8F$j(UQVgRcS)(ktUEBOLB5<3?ePbA!#S-NML9QC$$By7#hRL7cUO`igwF+e1ls zY9X(n0GZ5!sHkf}5J9_5R)dW5>TB1+%Y{+++wS{BHsltK?i8Cu#4)atkSJ=K>xvZ1 zQNHn{|W31Mbt4?sNxe%D>;BKeb(e!fZT$gSg zwI$ai7>hi6W5v294vvCWA6|Y^iv5duaRbsCSo>#KX!6%_zy_fn|9)tNXr(^xtIt_-<@?p1 zC}BIkgPf({a&=efjA#=)2{c637Q4!HYX1qlU9j8`5wR-aY?XmsY~a#LQ?}b$pM6q#)Q$!BQ6wlR>ssa3{e4M;RU)CK-wd}b| z)?RTTW|5kC(! z6OHBu>duB-{;R(D_smK+zIyeK%A}#XA-qf*P4p7P(mJM#CTV8OCP%xYkID0lZMQFVy)*>$k=F0_3um%8W2WW`n`c;&)=`m?NLs`2les(jQ7z7C)F;aQ@5_JnE&mHXp#mmQlanXsI~kTl z5j(^xvqkOVUP^n7?OQb=4uArNA6~rre3Lw+NfoFu8Z$*9)XGrDyqpaq6r@6jm=J^ImI4jebo(d8@Nd!*j5IDv;h|X zi%cW6byKS58)X8t!D}Ull#>AM`?2E{y_M*`R)d>&Zg&ThaTRVyisZZbZ`Hpb$D<0A z?>9X^+g@*kl>ix)81o{k;M1C;HT3nsu6<%%cHb7O@dqN~NxS1wA0*B4xZwRYEm<3k zwIcrd(!Sh$2aDxC#`TdYEbf2HfYE{95r^+Xyk6Hnq9jv{a;myEOOW3siQ{a4@bN;Z z18*y|UnVc`u-WC07r__F5!wxx$JVVWrGgvtfWU0`G;<`KG`LP9P;n%Ehbh3SxN#u& z;Qq1m!eg}B+eSU%tDk-zVmVV1B$cxRGne`g;Q8Q%!^R~Bu?=8l!P4<5x49S_=$>RC z89D$WDIwrU)zR|#*zafI);w@*?b5k4LmIil!d$Ya+P-6=+Ord0-8Lz~D7eZ-tC{l+M4hMFIL_F-*v69&V3?syG%mZ~(V$v`o<%^pEC zvtuGJc@4OV9zPr$o3Lwf%(b>a3exfX!j5#lDz4vvN&z*hJ`NjDajcQ1<@k)Ea0ix` zBG^8T-9C<;Ls2g7r>Y%VMRC*|wX$lvn@|@&9j0%~t32umyesI8F1KpGt!O1*JRJve z7p6p;GGRqHpHE%UUo^)iz)FqdT23Or8dP_7K?WP%Uz?hPbd-2i=R}=Ha@beu)uuNK45#`C+q>f7h4C@14yRu z^e&G=4Gsk{E%31;<~ZP>>>Tz=mTwByTRAK-s$NyjwhdRgvRpCyk8x>*Fq{(IET2}8 zG?U~>Gc))RH&2${+9ft%MNF4tUd_EuNED+(Txh2t0{C|3>r;*1LfBw)BN`xon+tg~ z{vCNSlTM*8S&eEbZQO#x^2fX7@%)tG_6mXss3Csqja@bKvxQh7&l(>kC0N09&YRa# zcDD?n9qVT86Yfh-}YNOFM@>D=-Dh1{4aG;G19A0St)12s__cF%}D^D2$ zWkbv2EOtXXla|M2;p#q}i9d7!*si5T!pR(@e;vN#hm70gc=Fr>hc{Ri;`gCKwb_zrcOOEW(<8_F1Q#mN-@k&!B#0N2_F0x@9 z)lCDGmmufce)jKoCNQC;Q%fOKPHKsS<>;Tia8xY}?CpT?*8317fL9c?4ITO-A~|M( z?9+y$YN!)-W7&D5oFUmGk37VB%2LF4c1_b^rtl8to0vo|;3_-6zhHDU6C^KTjknSE zuxs}!$MV94Uj+N|Hy-g~u>+UH3_E;~w!p$3sgb*6>w0iy=CRr%p{9*b;W!DRl zZ3+JSxb+D8ibw*1Uv;) zhz#lOLdR@-EZ_@3tUbcEL&Jl{t)$sD2c*oH24s0o2-ve^77)@~6l~@w^JCvkU6>oF z`4pT@c_*f@*mhQB==fN`qAab7^vYa+1Mzlt_FOS-l9d>vBFwpsQoSuUoyK_G%6W5! z_ZR!O1!lV>jQ@PF1tMm1@Tw5Nw!k<~c#E;tf@f~wMgKas^b!x%uDJ2Spwx%QE&?j= z8zgeCn0nf7kZc4n*|8z(@puNAEw9%q2rnt(76dzv+X$A%`V9aWCn>b}qhJc~88SiQ zG$^w}&2K4Pr5re=KP&>rtTrD>UdQp^BGz1tJjNSNjXd}Cqk{oCtoP2S&3BUzl^0YY zur6beQYp$5o8lmdZ76psI}aa#lQ4XnL_tb06qJW*X2&4UQ0u9LZWnVOnkB(MN+@0w zi%{dT`o~Q0ZzJtZ=6}%Uejrvy>9aU&*jm^!*8OJD0pM@iknL_^H@$xO_;n>od^)fZ z2~LB-CRm|-{U#C2n@R%Z)G!hAZC)@K+;DHDPoht8f40SGjmwAJK#SHTN2^i)DpJ`kUI`8AJm1^ z3i6EQ>n5f1tl;_91#GbBwjM_es8KPyRU(RFB2kns8h{>P(+kq1y+eu%w(Tmo zATkB|M*M^c()J()q!v^d1hx&4RSy7D5NIqUdlb?=xY3hk_QJ0Ttd8Zx_Px6m1OWcV zN8`(-=HSjBQKr`r+l5X3KrICZolAM1lLg|o7sw-vk7VF>#AL|vn9(9uy zAV`6I-{ppY#dnS4Q50B;d_X7Jz{j03#Hks!O3nROCGYHi-?zGN*gxxm2R$5$HG+*gNG{CY40u5bFde(wBG| zCp8*!08^+DrXCdLb9W0R&m$v;@g%t|H;V zJhM7u5E$O-J1txXHJcMHMj^RSGxJtGCdp+^IxVL7xIYC$2i-{qVRst!d{N9DMVhIZ2&UGEs3z;!aG$fdW*p(q?lq(J>>3LCbS4b(`U1>(u@oX8osjvj0fc*UU$}Un*{3K** zIb+V&dq#dGINX061kR$Dq?wo-quZ$*aA_PTr(axYfzRR+UtMSws)9smmPdjpVo^_S zZPJRb?aatJ>l7Ke$(lgow}R%9?Xz0rMx&$3KpdD+nn~7a<-%}h+6iq6lg?p{Q~orG z?CT&igYpBqxc;`N`8|Maz&%%?7dgnt`k^6zb61UT^+Rfr!4lkFlZ2eG>_T8u2Og>2 zn6593niz^lrNyI4n`^A(TC30`N5^J4>O}0_{%v>(B!BYYL-(S0k|P#CI*kEwpT=}6 zA4QVA&U`S^6J*E};&E~&=ADKlh2#YGF>pEbnSvZtfiA*>&fby>i~=Foem??phffqj z(2I20M^M_-f_x0SJ1Sv(+o?q{%CR2C%01TZTHd)@zRon?2l1l6@4m#lor);T<5rAT z_^Vo!465}Bg-+EdfXIU{uYoeu5crNrmYZrI30D~tH<~6EqRK%m8jT0ASwIjjeojDB zaPPJ4U!7)_%%=74kcQ-pac~#gch7oxb>Lw5bD#Njilbs+uO}#AiO|msxMBgEg^T(h z7r+LZi3hr-mR9XwC>fEjkDniKz{G^XL6X_H;ahr$!JHvYVZcF8xB-RTAO}+n&({NC zf*2b@4`Xw;($e=qJJ>s5*#ed!(>}xsM^Pi59`B;J5#&;1OdO74-)Di9Wd2bKLOS<< z9J3{@Gb!XS)(c_}?qnFvypt%}+L;7#HTg1NGROF zIye@N51^U0eVP-%`mBLVRTo471!q)l4m+|9^d`xQLg;Wvho*#BdR(t_=%$RFYjgT@ zI}9{`hGPx^*v@j|#gbF6p+!}+zG*O95`VlomOoO|2lvwSxt!C9fReCd-1Hh!URzaM zN`uoG8#S#G`}br87T&zU3Z#?kV7%Novyh`X{3U$U?snbsyv!k4AogmCz-v@#9Bi(i zZw=^2=~XV8DT`FOtZ4F|t^=>#bzpIPFAXe3YmpsNVwGqeft5f8$C!yENm%Sk_T#Y| zdxT=+!iUoNY2pdvK-j!=fcF%ODr`ArlxYRDSX8z9kurrtx-(6IpnhTs@y`XNY$a#sj86`(k!`{ec(Ad zc6yM}LGD|1$fj0~(RNc*k{FLM(ea+r?Y?rsZ0L^W{<66Ddho;JcOLeEMyZEzn!bvU zOH~z)`C8i?L`#ZJoH_I5tXIZmG7t{!(aqR=*>tWZVw4tM(+c{PA@PXLC_2$r^jT_S z@MOi_GMuIpcFLgrKu^3%!Ui%?yJ$0u9(!jX8-|IM5|+Q_Y*G|%v^4{p_)9k zaImAKQ*y+F+esF9?}9Aj8bhS0`s`j~Qpu>~#gV|lfq?-50sMRaM)_fM3%k9YFLk_J z52PDX5(4}in#5p2p-jc|^_0f`y~mHAA0Hnc9-JIJmEih#EUn5TNa6M3vCOsC%VM%9 zBaXpdwkg^@ZkG$UE;9`qNL}~+{-qDS3+cuqxk3i98G{?F6wn&3UjJC6sOAi0Y?d>aaf`(|BVSTsJB(R@eW%fPeU0&y>Q zmkPKTIu_Wtk|NiEj=NNK{(`hwLdjq*1XyE#kHuNoDagf$Ihc=}JgUi?eVR@|js}jL zxNvLen?F#+3@~w|#oDSi5#lgIvZJb$r{%A6Fgkj}uuBE+P|Rc7G&xM2);Vy89Muh$ z2H|xq$82!MRQaK?`&AO5EXf$vw5^!@w4%K5+nORwQ&3{DspEzs5(E01A_A!9p(WDH z@6dKPYuA@pLzeGav}5>Okvh$%9!oCT;~%6b^c5qavVi0v4mUIfF+XOTDO4LYjfvGr zO2KxG#NdLLp_8Iem)t%Eib&;PW|l~bm%&!IRm-8q<31P zEhAfwOBkswEUdx_Vt9US@|j$gCWTOq}2^GVVEPUW~K{G_B|ReA`D7* zH-3&$w?ApNld(tL%gj%9NI05QF9Zk9h63IU++Li+>q)9`+-1sm1!8hyyvvh zIKrO4KZ09zyi`+zk1CbLUQ?_xNd45qfrBhb6|S(5tC`Uhfm3$2+fB=tEK;MxQBs_q z_=uNl!|r6pRb&V->6 z8MAS%HFk&9bMj%p^_KetN7>1<_UhR|)RbWF4lIS>XD!T4Q~T6!a0M~9Z-=E%F+7g# zF6=~hdjnOww(M6BpJ_+tX(1{^j0)DPVbUYSeq6bw}&2*}W*3DqsIbgM=c+okO+wowA zf)r6ACaf+tjaHRERn^=J_csH@C5wydgLMGmEcsXh+m*sH(4>j!h{x)uae2A3e8oQeI(n$BZ9^4NxGah4q^ zP)j*?KWvUx$Jz!|KAtjonyEYL%|FQ^opZr>1e%RtAV0dH&E=5z6mRDCbaZy)u&uTI;331D8-pz41Qww%VG=0w>+=( z%UVjJsZ}4ysY^`v@Yz{4RIOb0Ql*tZNk4)b*EPgJ_gS+Xaa|!t3)cAkFfw#3x^F+K z(_I#?ygh0QHSpv+de(D;$|krnin@-YzlJnD;U9k&4#3~{v7%qKBC&P4+HkqALBicY zx`e&}(N!(h6|{pJlZOn49;wrYc<{3PA;1nhz0>MGb#$=@tQ%|YyI&a65%?*9vYMHY zg4Hll7X-x|2e!sIGofmrc6p6(^EHT}L`Md41Q*)npib%ebXr7dtHRz03YE=1SpG=4 zTaMaZubkyxJqU?5Izen|uh!9T`(hD~Cv(r{Uhz&hQr#a`H4Y4|j5mJnUqH1bou6g! zr&Z{QB(hA~1e+K(XeU`;l^L2+H9?yaU081S?R_FeUENl6`@NRGJX)@8P9C8|iw$LQ z%AwqOsbzFBHM|X2j-8|&CXUUww_CjcD$sX*Fk{_9$zGv%?ELbL>ras;#mQj(QH785 zqY>QMpv{g0Pwo|D?GjmaqHzi!B=hldMZHLcrNVMGPFl8q-VkRWAk#+Kf*A8wPP)4d z-1+_cmasD*=hqMhWE>&9+cSb4k_V6c_7Qi3#_ABg|2{=D2#Vl4Vtjn=F=vijeo`>0 zuADLJ%`3ziJk^g6FRjd8*jAh5PiVClJCJcDH65bvv@b`sSA&hfeEJl82;4fP2l;xp zg{mxeB*iOgX!kksw1*^6|I&oL6eS$y|8d6=A#Wu{&mnlbk8|B^bY7uzJcbJDj&}1+ z?za(KtEs}0)OD}1i+#Z4iHt3XuJg={PGV2U6OE0_=zIjhXqY_og3MA@;crnxLQL%~ z?!3P-t-Ek0Pv9P2AlQ}FkvzVhK|CqRY&pK0M+YGL0TZtN<%dv|bk>~q+%n~x2^(GG zDm6G~DuZ<|cWx(tpl;;KHpFV9!&Roc=9i@#(<{D)9Q}Zc_;)b`|M>n;2Zi|VAzGcd z{@ve1E4j{p=vP>O^a6n#sa&%|q^PmdiGhkvtcd5BzqngOO6;*BX}-*0sZ?0=l0-;D z5jP6)S&Jl)cPF^Z3w^2+hdxP(w(cyaDIMAIUXq!@YAUwdsTRN&6vHM*bUh`eusb@; zOQk%T_|xJA^0iMpaEpd0n;mO!2M`_dUTWlm&UxYZWYMVWBMgybKZuuV7EzMR!7RdD z+lp46^6}clD{4Zjz4kfb)1R4ZC)HSE+bv4OYk7d>DPl>(DP2>c$yl54X8u<4M>8>_ z#tNm`q@tQx>)Ypt3I1jGs|U>h2C3Dp(|#!;>0T1MW(l{$88<5U783H z1W*>re+1)61w!}J=ClJZF-JtEZLIcSpkg*{YtP^>L*@Q34c3+?#@u@gF3V6HsqX*Q z0+i2TX@4leW~^ZaMEPDMv#i>Gw&A@~h;zCZXf@rK{PAwmaqRG5yB^gn?);HdDU;F> zLBg7;&S}PGJ6^b^l7QHU9<(~TljMm-pElh4RBX!i9@5e=uQ=X#UPz02cwo6;%N*?6 z3aYs|a^LdYyZRf&%QV3+t-c*RWsI%XG|rNEe&K(h0EC8NG34IezzefcjlzldmjKn@%_F5i z>C3*MY3QfW4rx|dy(!`O?XGBX?mnUPs7;zg2UMU1t@?*(V%yj=u>!B{*=W z7{0ZT?Yi~ueRpwwApdTV;Gbvu@Us}SauE?@9a7+V*2ius@$hy?;B02VmhY~YLJ>&! zU-0F(z}JK7ia*M8vTky^q0TG>HSH7n1#fX_VCdq=U@3s$PwVBY*NBHCYB&W&zg?1F z+AhQZG}fW2I;w)`T2U!s!>R}IwvtStnJR=D{?8&LLM`cbkLz0tSPCkWiVpQrA-u4> z6#gwUyx&n?$II1lWBRP;ja755f3Z^sKm~K8~DBf4n@SW=8x)et3X?JkSPl;;BLWyKBOJbZ~WE*3ie5 zS_2LO#*O8iRt<>uFKbp}c}e{IU;wL`1gK%Za*hO`e@T>IC%2P3!^1^YMTGZh(x6fU ztt6p5{w+1(pA5nw!nuZ3dcl$uTmWbH(L!#wS%W(CM4(-J@GgVJkNJ$qKf7-Ne@HW% zB7{|CqdiGtY=cWL?@j-84G1-e z8!?l;u7De2j2qLb1R9TH$uVV}X#^|AIG9Kz?(ZcLlMrhl-3F47s>ft=PZV-*k0CDp z7dW+mlh?6vQZkA~XGWp~#?{Q3IjovI0WW*(q4g9-6M@m;@cn2NO#7?BNFnT)-8Tz> zd_{!xrYxL@4QXjGzcfH&%zJ8ZwVEnNJN8J+?fv|*;$k$Nv{U0{ zO=_IBOy9Fas9s4uMo6MwDS?`7*0*-Ntj!C;fg7gRC{CQv%{w&El=tvJm88BhCuA`5 z2(L6l1}Lxi4-1x4racAE#l@Bl)BX$>mzviGL*J|^6S8IFR!>loS*GMkvg*qI-RQ7< zyl~IMOhEzhvN1rYe*db*`!uSjGD57JblZqJjzr6blf_HYhG0>hS_@cGKIy_Qq^E%Ig2vG&Ejg#-y1Spvm+V>uRlAmyiCKkPYQn* z18_q1=Y8g>f@|698ljE!@tbZu@$Fr!=YHxZB62)4&tdVq?ZwfR*Yn4BDnM5{VAe9} z76;HS{&8fdB(ANbKu3!>-N6Fma+v+a`2$h=qn&B3Id0!pr^c6Hbwh494oPye&b~3)rTr66^YB37MWyMH=f2rEYEe zx>jYvvoe23+PnjdHMscOXjv#qwkC~g>Z@!twJ0%{D@|8L3wJ!)`D&Lt3MZDQ#IMCe9D4@&%1`O=Mfpvs|11h?ouh6`yfZe&@ z|A`PDInS*QWmb#_H)O@2pX9VE7>*?Iis8ZFaXcRA!ewo^yfzL60H6!fNwH6inva)D zJ<9Yd-;of+7G>W+Pkg$l-L$}@iCF{lo*b)=e+K*O=x4M_iqk(~XKgryq3gyeT9!ZZ zubJY0?BwRML3g>HQ|MI`jCyCov$uGk-L+`2*_rW%94}+WFVDBem4XUMVJ@E8dpVpw zio<{_2{Y76I-s`jWaLUNoLsD-qv!GX+HAMtmP^{pjr~=0x+=hKR&OJfO2`ZVItf%R z$M#7CkpcJ?@&32E$*|LGxh{sYh-x*L9`yVk*My5Wy8F3bSc74?Mf)~Z%{-?7id{CNc6ctCv?0rL zX+uzEj>p>MGgDMWR9Gb`+k-Ie@S}$L*S$Ik4Ig5@(Z>7~WzZer0=Sp>({=Onh zAyI`HNBoeZcMa18kSA48J%Zvzk2(6Z$7iEH?JAZK7dCVE`x+J&V2d=HQ)*kC>Q8Yh zxYs4f)A+HG;q>QLWk@ly;1&a&p{(;FlrzP;#h4mPyh^$!dt}sg7}E6ZJNQXH5LQTS z!aX!oW{!rJ{3L71BCv3qDUScq4%`Fn^|~rKFK?g6$>Tr>oW2&<;fF8iboX6fWyZ}^ zr}NvnGrrVdlMe4*EJ0LR&$erhgI$-hJ9J7zUAY;)dD{6mrdO`%;#w+ z33^xO`n{57E-N}`gu@vGKr%zUA^J8U2I3@Gn_YUyM{FktOD0IL^s%`Bpcd;`*pRIA zTvAY(G$B^?9uGK|yT;{bEeMy9oD_QvIOieCH>WR(6EeQ@D&`kalB#BZ?_vq>#K8Qj z=uIjgTz7*GxrU?K5^k!x^OT0BcgB~UGUy;{k67=<|o^6+X-$}9haw+l4V^T z$Z#&SL57WL#EY2O-jxp`_3vK9Wg)&BjAoim&uiQyxAk94Ohgv`4}b2#dt1=ruZ8

F*(ukREFtSiRocm2Ma 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 mI0 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�ZMgALo(df$@bD% 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 e>Hvoc{Sw?g@V&fIeAU*s(s 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

`ybeT25QwiKQ{&-6PlZNr(O4I&utw@1{wzyY;` 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

  • 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%0AoRWc37WX?_nwTe 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Í*2s1MJwfAA%d^G;7E;Y6Fre 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 Date: Tue, 26 May 2020 15:08:17 +0800 Subject: [PATCH 0582/1093] Removed VS2010 doc and moved it to the pages repository --- platforms/Eclipse-Cygwin/.project | 5 ----- 1 file changed, 5 deletions(-) diff --git a/platforms/Eclipse-Cygwin/.project b/platforms/Eclipse-Cygwin/.project index 5dcd2654c..488e625d5 100644 --- a/platforms/Eclipse-Cygwin/.project +++ b/platforms/Eclipse-Cygwin/.project @@ -384,11 +384,6 @@ 1 PARENT-2-PROJECT_LOC/cpputest_build/Makefile - - docs/WalkThrough_VS21010.docx - 1 - PARENT-2-ECLIPSE_HOME/00_Dev/05_CppUTest/cpputest/docs/WalkThrough_VS21010.docx - examples/.cdtproject 1 From 684ba7a12eacbd7bac3d65bb34deffce2edd987e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 26 May 2020 15:31:11 +0800 Subject: [PATCH 0583/1093] Changed version to 4.0 --- CMakeLists.txt | 4 ++-- configure.ac | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d351019e5..88e0cfb5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ project(CppUTest) -set(CppUTest_version_major 3) -set(CppUTest_version_minor 8) +set(CppUTest_version_major 4) +set(CppUTest_version_minor 0) # 2.6.3 is needed for ctest support # 3.1 is needed for target_sources diff --git a/configure.ac b/configure.ac index 5c68f8a0c..a6cd8328e 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.68]) -AC_INIT([CppUTest], [3.8], [https://github.com/cpputest/cpputest]) +AC_INIT([CppUTest], [4.0], [https://github.com/cpputest/cpputest]) AC_CONFIG_AUX_DIR([.]) AM_INIT_AUTOMAKE([subdir-objects]) AC_CONFIG_SRCDIR([src/CppUTest/Utest.cpp]) From 096d4022f0e94eac16e77a653a9c437fc6b7d482 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 26 May 2020 16:52:01 +0800 Subject: [PATCH 0584/1093] Cached CMake package files also need version update --- build/cmake_package_files/CppUTestConfigVersion.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/cmake_package_files/CppUTestConfigVersion.cmake b/build/cmake_package_files/CppUTestConfigVersion.cmake index ca617baf7..69a28a705 100644 --- a/build/cmake_package_files/CppUTestConfigVersion.cmake +++ b/build/cmake_package_files/CppUTestConfigVersion.cmake @@ -7,14 +7,14 @@ # PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version, # but only if the requested major version is the same as the current one. # The variable CVF_VERSION must be set before calling configure_file(). -set(PACKAGE_VERSION "3.8") +set(PACKAGE_VERSION "4.0") if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) set(PACKAGE_VERSION_COMPATIBLE FALSE) else() - if("3.8" MATCHES "^([0-9]+)\\.") + if("4.0" MATCHES "^([0-9]+)\\.") set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}") else() - set(CVF_VERSION_MAJOR "3.8") + set(CVF_VERSION_MAJOR "4.0") endif() if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR) set(PACKAGE_VERSION_COMPATIBLE TRUE) From d0bb53ce3d37617ba57caa85c4ad7c97c62d96dc Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 30 May 2020 08:12:00 +0800 Subject: [PATCH 0585/1093] Updated slack link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c3c6af2be..8ccc04569 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Coverage: [![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) Slack channel: -[Join if link not expired](https://join.slack.com/t/cpputest/shared_invite/zt-dvhne8z8-i_sOcxMF3oYvjoN~qpwiDw) +[Join if link not expired](https://join.slack.com/t/cpputest/shared_invite/zt-epq97u9h-6yBQHHl2cvUADjEENtdASw) ## Getting Started From 80ae50f3743b39cf3d4a533594be5a60494b8a7d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 12 Jun 2020 12:05:13 +0800 Subject: [PATCH 0586/1093] Lets see if this fixes the compilation problems in mingw without secure functions --- src/Platforms/Gcc/UtestPlatform.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 7717f22d1..430da5b16 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -211,7 +211,7 @@ static const char* TimeStringImplementation() { time_t theTime = time(NULLPTR); static char dateTime[80]; -#ifdef _WIN32 +#if defined(_WIN32) && defined(MINGW_HAS_SECURE_API) static struct tm lastlocaltime; localtime_s(&lastlocaltime, &theTime); struct tm *tmp = &lastlocaltime; @@ -237,7 +237,7 @@ int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_ static PlatformSpecificFile PlatformSpecificFOpenImplementation(const char* filename, const char* flag) { -#ifdef _WIN32 +#if defined(_WIN32) && defined(MINGW_HAS_SECURE_API) FILE* file; fopen_s(&file, filename, flag); return file; From e0c050d8b614294b2215a62e64628470fab67f20 Mon Sep 17 00:00:00 2001 From: georgev93 Date: Fri, 26 Jun 2020 19:07:14 -0400 Subject: [PATCH 0587/1093] Call cmake_minimum_required() before project() in CMakeLists.txt. From https://cmake.org/cmake/help/latest/command/cmake_minimum_required.html: Note: Call the cmake_minimum_required() command at the beginning of the top-level CMakeLists.txt file even before calling the project() command. It is important to establish version and policy settings before invoking other commands whose behavior they may affect. See also policy CMP0000. --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 88e0cfb5f..d36c6491e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,12 +1,12 @@ +# 2.6.3 is needed for ctest support +# 3.1 is needed for target_sources +cmake_minimum_required(VERSION 3.1) + project(CppUTest) set(CppUTest_version_major 4) set(CppUTest_version_minor 0) -# 2.6.3 is needed for ctest support -# 3.1 is needed for target_sources -cmake_minimum_required(VERSION 3.1) - ############### # Conan support ############### From 9929a19132277fdb0db931a1a8c638673fc1914b Mon Sep 17 00:00:00 2001 From: georgev93 Date: Sat, 27 Jun 2020 11:17:39 -0400 Subject: [PATCH 0588/1093] Cast DWORD (unsigned long) to long when returning in VisualCppTimeInMillis() to avoid a sign conversion warning --- src/Platforms/VisualCpp/UtestPlatform.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index 6e3ab35c4..eab6b1f7b 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -88,10 +88,10 @@ static long VisualCppTimeInMillis() else { #ifdef TIMERR_NOERROR - return timeGetTime(); + return (long)timeGetTime(); #else #if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_VISTA) || (_WIN32_WINNT < _WIN32_WINNT_VISTA) - return GetTickCount(); + return (long)GetTickCount(); #else return (long)GetTickCount64(); #endif From 71ce544650fc261a3765046bfb91f9091ae603a0 Mon Sep 17 00:00:00 2001 From: kjarvel Date: Wed, 9 Sep 2020 12:34:28 +0200 Subject: [PATCH 0589/1093] * IAR support + CMake - Updated ewp project to version 7.80.4, excluded memory leak test - Increased flash size in icf files - Removed obsolete .zip file. - UtestPlatform.cpp - added rand and srand - CMake support in ewarm-*.toolchain.cmake --- cmake/ewarm-linux.toolchain.cmake | 24 ++++++++++++++++++++++++ cmake/ewarm-win.toolchain.cmake | 24 ++++++++++++++++++++++++ platforms/IAR-STR912.zip | Bin 686710 -> 0 bytes 3 files changed, 48 insertions(+) create mode 100644 cmake/ewarm-linux.toolchain.cmake create mode 100644 cmake/ewarm-win.toolchain.cmake delete mode 100644 platforms/IAR-STR912.zip diff --git a/cmake/ewarm-linux.toolchain.cmake b/cmake/ewarm-linux.toolchain.cmake new file mode 100644 index 000000000..954991ccb --- /dev/null +++ b/cmake/ewarm-linux.toolchain.cmake @@ -0,0 +1,24 @@ +### BEGIN CMAKE_TOOLCHAIN_FILE +# "Generic" is used when cross compiling +set(CMAKE_SYSTEM_NAME Generic) + +# Set the EW installation root directory +#(Avoid spaces in the path or you need to escape them) +set(EW_ROOT_DIR "/opt/iarsystems/bxarm/arm/") + +# Compiler flags needed to compile for this CPU +set(CPU_FLAGS "--cpu Cortex-M3") + +# Set up the CMake variables for compiler and assembler +# (The reason for both C and CXX variables is that CMake +# treats C and C++ tools individually) +set(CMAKE_C_COMPILER "${EW_ROOT_DIR}/bin/iccarm" "${CPU_FLAGS} --dlib_config normal") +set(CMAKE_CXX_COMPILER "${EW_ROOT_DIR}/bin/iccarm" "${CPU_FLAGS} --dlib_config normal") +set(CMAKE_ASM_COMPILER "${EW_ROOT_DIR}/bin/iasmarm" "${CPU_FLAGS}") + +# For CppUTest, set the IAR variable +set(IAR True) + +# Build with cmake -H. -Bbuild -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=cmake/ewarm-linux.toolchain.cmake + +### END CMAKE_TOOLCHAIN_FILE diff --git a/cmake/ewarm-win.toolchain.cmake b/cmake/ewarm-win.toolchain.cmake new file mode 100644 index 000000000..219ed065c --- /dev/null +++ b/cmake/ewarm-win.toolchain.cmake @@ -0,0 +1,24 @@ +### BEGIN CMAKE_TOOLCHAIN_FILE +# "Generic" is used when cross compiling +set(CMAKE_SYSTEM_NAME Generic) + +# Set the EW installation root directory +#(Avoid spaces in the path or you need to escape them) +set(EW_ROOT_DIR "E:/Program Files\ (x86)/IAR\ Systems/Embedded\ Workbench\ Arm 8.50.5/arm") + +# Compiler flags needed to compile for this CPU +set(CPU_FLAGS "--cpu Cortex-M3") + +# Set up the CMake variables for compiler and assembler +# (The reason for both C and CXX variables is that CMake +# treats C and C++ tools individually) +set(CMAKE_C_COMPILER "${EW_ROOT_DIR}/bin/iccarm.exe" "${CPU_FLAGS} --dlib_config normal") +set(CMAKE_CXX_COMPILER "${EW_ROOT_DIR}/bin/iccarm.exe" "${CPU_FLAGS} --dlib_config normal") +set(CMAKE_ASM_COMPILER "${EW_ROOT_DIR}/bin/iasmarm.exe" "${CPU_FLAGS}") + +# For CppUTest, set the IAR variable +set(IAR True) + +# Build with cmake -H. -Bbuild -G "NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE=cmake/ewarm-win.toolchain.cmake + +### END CMAKE_TOOLCHAIN_FILE diff --git a/platforms/IAR-STR912.zip b/platforms/IAR-STR912.zip deleted file mode 100644 index f5e69943ec1af6cfb0308bd17a16b85d11d76722..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 686710 zcmeFaWprIhvL!5LW@ct)28)?2W@faQ!Lpc{CCg%FW@ctt%*+;ys;Z~!bxn13y*KlH zzpT4-*Inzbvy~@LWJYA{9U*xsU=S#PUw&MhHF$pg@Q*iW02}}bK}A|6WkpU#CVCZR zNC4pYfzMJ=!=I&`U7-O0L5_d{06>o4-{jvxP~IIe{3-%vy>(s1mm&FlYb&B5f%U|R_m*#)cm2Fl{2v_gc zi5OcVGtZCHGNkV+z9i}(vG#cxJHfIdAgLV_wNQ64%}jA~F>z_+@OT6o?~FaR6?JbZ z%|^ff9@Sv`#-bP7KO%0#fTU1|B5K~bF(nyqr~a8o?ppKn6$qFDq#Bb%pg&^`42m>l z5QV5cd8{Lsd`PDFbT!qqn|1+{+Ojhx!B|ebGa_^yv)uK!2QX;$(#cIP4O&68Bc=HS zfAt{}?R
    NlIEnv9VmD& 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

    C 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

    wH(;B3&oYd-lf)` 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 Date: Wed, 9 Sep 2020 12:47:28 +0200 Subject: [PATCH 0590/1093] * IAR support + CMake - Updated ewp project to version 7.80.4, excluded memory leak test - Increased flash size in icf files - Removed obsolete .zip file. - UtestPlatform.cpp - added rand and srand - CMake support in ewarm-*.toolchain.cmake --- CMakeLists.txt | 10 +++--- .../CppUTestConfigurationOptions.cmake | 11 ++++++ platforms/iar/CppUTestExtTest.ewp | 24 ++++++++----- platforms/iar/CppUTestExtTest.icf | 2 +- platforms/iar/CppUTestTest.ewp | 34 +++++++++++++------ platforms/iar/CppUTestTest.icf | 2 +- src/Platforms/Iar/UtestPlatform.cpp | 3 +- 7 files changed, 61 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d36c6491e..309ead1d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,10 +34,12 @@ if(HAVE_PTHREAD_MUTEX_LOCK) add_definitions(-DCPPUTEST_HAVE_PTHREAD_MUTEX_LOCK=1) endif(HAVE_PTHREAD_MUTEX_LOCK) -check_function_exists(strdup HAVE_STRDUP) -if(HAVE_STRDUP) - add_definitions(-DCPPUTEST_HAVE_STRDUP=1) -endif(HAVE_STRDUP) +if (NOT IAR) + check_function_exists(strdup HAVE_STRDUP) + if(HAVE_STRDUP) + add_definitions(-DCPPUTEST_HAVE_STRDUP=1) + endif(HAVE_STRDUP) +endif(NOT IAR) if (MINGW) # Apply workaround for MinGW timespec redefinition (pthread.h / time.h) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 43147cb5d..aec86f282 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -5,6 +5,14 @@ if (MSVC) if(STDC_WANT_SECURE_LIB) ADD_DEFINITIONS(-DSTDC_WANT_SECURE_LIB) endif(STDC_WANT_SECURE_LIB) +elseif (IAR) + set(CPP_PLATFORM Iar) + unset(CMAKE_CXX_EXTENSION_COMPILE_OPTION) + set(TESTS_BUILD_DISCOVER OFF) + # Set up the CMake variables for the linker + set(LINKER_SCRIPT "${CppUTestRootDirectory}/platforms/iar/CppUTestTest.icf") + set(CMAKE_C_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") + set(CMAKE_CXX_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") elseif (STD_C) if(NOT CPP_PLATFORM) set(CPP_PLATFORM Gcc) @@ -31,6 +39,9 @@ if (MEMORY_LEAK_DETECTION) if (MSVC) set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} /FI \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} /FI \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") + elseif (IAR) + set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} --preinclude \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") + set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} --preinclude \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") else (MSVC) set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} -include \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -include \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorNewMacros.h\"") diff --git a/platforms/iar/CppUTestExtTest.ewp b/platforms/iar/CppUTestExtTest.ewp index 5693a97d1..b0f9aa397 100644 --- a/platforms/iar/CppUTestExtTest.ewp +++ b/platforms/iar/CppUTestExtTest.ewp @@ -77,7 +77,7 @@ @@ -1603,7 +1608,7 @@ ILINK 0 - 17 + 18 1 0 + diff --git a/platforms/iar/CppUTestExt.ewp b/platforms/iar/CppUTestExt.ewp index baafa6ab2..f529fd5b5 100644 --- a/platforms/iar/CppUTestExt.ewp +++ b/platforms/iar/CppUTestExt.ewp @@ -77,7 +77,7 @@ @@ -951,7 +956,7 @@ @@ -1603,7 +1608,7 @@ ILINK 0 - 17 + 18 1 0 + diff --git a/platforms/iar/CppUTestExtTest.ewp b/platforms/iar/CppUTestExtTest.ewp index b0f9aa397..094d28547 100644 --- a/platforms/iar/CppUTestExtTest.ewp +++ b/platforms/iar/CppUTestExtTest.ewp @@ -101,7 +101,7 @@ \n but was "); + fixture->assertPrintContains("expected \n\tbut was "); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } @@ -439,7 +439,7 @@ TEST(TestHarness_c, checkCharText) CHECK_EQUAL_C_CHAR_TEXT('a', 'a', "Text"); fixture->setTestFunction(_failCharTextMethod); fixture->runAllTests(); - fixture->assertPrintContains("expected \n but was "); + fixture->assertPrintContains("expected \n\tbut was "); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: CharTestText"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); @@ -456,7 +456,7 @@ TEST(TestHarness_c, checkUnsignedByte) CHECK_EQUAL_C_UBYTE(254, 254); fixture->setTestFunction(_failUnsignedByteMethod); fixture->runAllTests(); - fixture->assertPrintContains("expected <254>\n but was <253>"); + fixture->assertPrintContains("expected <254>\n\tbut was <253>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } @@ -472,7 +472,7 @@ TEST(TestHarness_c, checkUnsignedByteText) CHECK_EQUAL_C_UBYTE_TEXT(254, 254, "Text"); fixture->setTestFunction(_failUnsignedByteTextMethod); fixture->runAllTests(); - fixture->assertPrintContains("expected <254>\n but was <253>"); + fixture->assertPrintContains("expected <254>\n\tbut was <253>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: UnsignedByteTestText"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); @@ -489,7 +489,7 @@ TEST(TestHarness_c, checkSignedByte) CHECK_EQUAL_C_SBYTE(-3, -3); fixture->setTestFunction(_failSignedByteMethod); fixture->runAllTests(); - fixture->assertPrintContains("expected <-3>\n but was <-5>"); + fixture->assertPrintContains("expected <-3>\n\tbut was <-5>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } @@ -505,7 +505,7 @@ TEST(TestHarness_c, checkSignedByteText) CHECK_EQUAL_C_SBYTE_TEXT(-3, -3, "Text"); fixture->setTestFunction(_failSignedByteTextMethod); fixture->runAllTests(); - fixture->assertPrintContains("expected <-3>\n but was <-5>"); + fixture->assertPrintContains("expected <-3>\n\tbut was <-5>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: SignedByteTestText"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); @@ -559,7 +559,7 @@ TEST(TestHarness_c, checkPointer) CHECK_EQUAL_C_POINTER(NULLPTR, NULLPTR); fixture->setTestFunction(_failPointerMethod); fixture->runAllTests(); - fixture->assertPrintContains("expected <0x0>\n but was <0x1>"); + fixture->assertPrintContains("expected <0x0>\n\tbut was <0x1>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } @@ -575,7 +575,7 @@ TEST(TestHarness_c, checkPointerText) CHECK_EQUAL_C_POINTER_TEXT(NULLPTR, NULLPTR, "Text"); fixture->setTestFunction(_failPointerTextMethod); fixture->runAllTests(); - fixture->assertPrintContains("expected <0x0>\n but was <0x1>"); + fixture->assertPrintContains("expected <0x0>\n\tbut was <0x1>"); fixture->assertPrintContains("arness_c"); fixture->assertPrintContains("Message: PointerTestText"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); @@ -644,6 +644,44 @@ TEST(TestHarness_c, checkFail) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } +static bool cpputestHasCrashed; + +static void crashMethod() +{ + cpputestHasCrashed = true; +} + +TEST(TestHarness_c, doesNotCrashIfNotSetToCrash) +{ + cpputestHasCrashed = false; + UtestShell::setCrashMethod(crashMethod); + fixture->setTestFunction(_failMethod); + + fixture->runAllTests(); + + CHECK_FALSE(cpputestHasCrashed); + LONGS_EQUAL(1, fixture->getFailureCount()); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); + + UtestShell::resetCrashMethod(); +} + +TEST(TestHarness_c, doesCrashIfSetToCrash) +{ + cpputestHasCrashed = false; + UtestShell::setCrashOnFail(); + UtestShell::setCrashMethod(crashMethod); + fixture->setTestFunction(_failMethod); + + fixture->runAllTests(); + + CHECK(cpputestHasCrashed); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); + + UtestShell::restoreDefaultTestTerminator(); + UtestShell::resetCrashMethod(); +} + static void _CheckMethod() { HasTheDestructorBeenCalledChecker checker; From aacb708bdf65216b226367616ba3970bcd9ce866 Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 21 Oct 2020 15:28:00 +0200 Subject: [PATCH 0618/1093] Clang 11 ci build added. --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index e7b1e3145..1ce211e3e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -93,14 +93,14 @@ jobs: - sourceline: 'ppa:ubuntu-toolchain-r/test' - compiler: clang env: BUILD=cmake CPP_STD=17 - - CC=clang-10 - - CXX=clang++-10 + - CC=clang-11 + - CXX=clang++-11 addons: apt: sources: - - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main' + - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main' key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key' - packages: ['clang-10', 'libc++-10-dev', 'libc++abi-10-dev'] + packages: ['clang-11', 'libc++-11-dev', 'libc++abi-11-dev'] # Specific other tests - compiler: gcc From 995c1dc0aaac18f39f9ebd1e687573379d625ffb Mon Sep 17 00:00:00 2001 From: offa Date: Thu, 22 Oct 2020 15:28:06 +0200 Subject: [PATCH 0619/1093] Missing overrides added. --- include/CppUTest/TestHarness_c.h | 4 +-- include/CppUTest/UtestMacros.h | 4 +-- include/CppUTestExt/OrderedTest.h | 3 +-- tests/CppUTest/AllocLetTestFreeTest.cpp | 4 +-- tests/CppUTest/CheatSheetTest.cpp | 5 ++-- tests/CppUTest/CommandLineArgumentsTest.cpp | 5 ++-- tests/CppUTest/CommandLineTestRunnerTest.cpp | 19 +++++++------ tests/CppUTest/JUnitOutputTest.cpp | 4 +-- tests/CppUTest/MemoryLeakDetectorTest.cpp | 16 +++++------ tests/CppUTest/MemoryLeakWarningTest.cpp | 12 ++++----- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 6 ++--- tests/CppUTest/PluginTest.cpp | 10 +++---- tests/CppUTest/SetPluginTest.cpp | 16 +++++------ tests/CppUTest/SimpleMutexTest.cpp | 4 +-- tests/CppUTest/SimpleStringCacheTest.cpp | 9 +++---- tests/CppUTest/SimpleStringTest.cpp | 9 +++---- tests/CppUTest/TeamCityOutputTest.cpp | 4 +-- tests/CppUTest/TestFailureTest.cpp | 4 +-- tests/CppUTest/TestHarness_cTest.cpp | 1 - tests/CppUTest/TestInstallerTest.cpp | 5 ++-- tests/CppUTest/TestMemoryAllocatorTest.cpp | 25 +++++++++-------- tests/CppUTest/TestOutputTest.cpp | 21 +++++++-------- tests/CppUTest/TestRegistryTest.cpp | 6 ++--- tests/CppUTest/TestResultTest.cpp | 4 +-- tests/CppUTest/UtestTest.cpp | 8 +++--- tests/CppUTestExt/CodeMemoryReporterTest.cpp | 4 +-- .../CppUTestExt/ExpectedFunctionsListTest.cpp | 4 +-- tests/CppUTestExt/GMockTest.cpp | 6 ++--- tests/CppUTestExt/GTest1Test.cpp | 4 +-- tests/CppUTestExt/GTest2ConvertorTest.cpp | 4 +-- .../CppUTestExt/MemoryReportFormatterTest.cpp | 4 +-- .../CppUTestExt/MemoryReporterPluginTest.cpp | 27 +++++++++---------- tests/CppUTestExt/MockActualCallTest.cpp | 4 +-- tests/CppUTestExt/MockCallTest.cpp | 3 +-- tests/CppUTestExt/MockCheatSheetTest.cpp | 3 +-- .../CppUTestExt/MockComparatorCopierTest.cpp | 13 +++++---- tests/CppUTestExt/MockExpectedCallTest.cpp | 12 ++++----- .../CppUTestExt/MockFailureReporterForTest.h | 3 +-- tests/CppUTestExt/MockFailureTest.cpp | 4 +-- tests/CppUTestExt/MockHierarchyTest.cpp | 3 +-- tests/CppUTestExt/MockNamedValueTest.cpp | 10 +++---- tests/CppUTestExt/MockParameterTest.cpp | 3 +-- tests/CppUTestExt/MockPluginTest.cpp | 11 ++++---- tests/CppUTestExt/MockReturnValueTest.cpp | 3 +-- tests/CppUTestExt/MockStrictOrderTest.cpp | 2 +- tests/CppUTestExt/MockSupportTest.cpp | 5 ++-- tests/CppUTestExt/MockSupport_cTest.cpp | 2 +- tests/CppUTestExt/OrderedTestTest.cpp | 6 ++--- 48 files changed, 163 insertions(+), 185 deletions(-) diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index d859c4ff6..26f6203c5 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -164,12 +164,12 @@ TEST_GROUP(group_name) #define TEST_GROUP_C_SETUP_WRAPPER(group_name) \ - void setup() { \ + void setup() _override { \ group_##group_name##_setup_wrapper_c(); \ } #define TEST_GROUP_C_TEARDOWN_WRAPPER(group_name) \ - void teardown() { \ + void teardown() _override { \ group_##group_name##_teardown_wrapper_c(); \ } diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 0474589fc..e9ef5c6e4 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -50,10 +50,10 @@ TEST_GROUP_BASE(testGroup, Utest) #define TEST_SETUP() \ - virtual void setup() + virtual void setup() _override #define TEST_TEARDOWN() \ - virtual void teardown() + virtual void teardown() _override #define TEST(testGroup, testName) \ /* External declarations for strict compilers */ \ diff --git a/include/CppUTestExt/OrderedTest.h b/include/CppUTestExt/OrderedTest.h index a3687fa99..bf9a1469d 100644 --- a/include/CppUTestExt/OrderedTest.h +++ b/include/CppUTestExt/OrderedTest.h @@ -71,7 +71,7 @@ class OrderedTestInstaller extern TEST_##testGroup##_##testName##_TestShell TEST_##testGroup##_##testName##_Instance; \ class TEST_##testGroup##_##testName##_Test : public TEST_GROUP_##CppUTestGroup##testGroup \ { public: TEST_##testGroup##_##testName##_Test () : TEST_GROUP_##CppUTestGroup##testGroup () {} \ - void testBody(); }; \ + void testBody() _override; }; \ class TEST_##testGroup##_##testName##_TestShell : public OrderedTestShell { \ virtual Utest* createTest() _override { return new TEST_##testGroup##_##testName##_Test; } \ } TEST_##testGroup##_##testName##_Instance; \ @@ -85,4 +85,3 @@ class OrderedTestInstaller } #endif - diff --git a/tests/CppUTest/AllocLetTestFreeTest.cpp b/tests/CppUTest/AllocLetTestFreeTest.cpp index ef4edcef8..4c48ce48e 100644 --- a/tests/CppUTest/AllocLetTestFreeTest.cpp +++ b/tests/CppUTest/AllocLetTestFreeTest.cpp @@ -16,12 +16,12 @@ TEST_GROUP(AllocLetTestFree) { AllocLetTestFree allocLetTestFree; - void setup() + void setup() _override { allocLetTestFree = AllocLetTestFree_Create(); } - void teardown() + void teardown() _override { AllocLetTestFree_Destroy(allocLetTestFree); } diff --git a/tests/CppUTest/CheatSheetTest.cpp b/tests/CppUTest/CheatSheetTest.cpp index fd44b8609..1c0e4d6bf 100644 --- a/tests/CppUTest/CheatSheetTest.cpp +++ b/tests/CppUTest/CheatSheetTest.cpp @@ -9,14 +9,14 @@ static void stub(){} TEST_GROUP(CheatSheet) { /* declare a setup method for the test group. Optional. */ - void setup () + void setup() _override { /* Set method real_one to stub. Automatically restore in teardown */ UT_PTR_SET(real_one, stub); } /* Declare a teardown method for the test group. Optional */ - void teardown() + void teardown() _override { } }; /* Do not forget semicolumn */ @@ -33,4 +33,3 @@ TEST(CheatSheet, TestName) /* Check a string */ STRCMP_EQUAL("HelloWorld", "HelloWorld"); } - diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index a490df322..0171efcec 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -50,12 +50,12 @@ TEST_GROUP(CommandLineArguments) CommandLineArguments* args; OptionsPlugin* plugin; - void setup() + void setup() _override { plugin = new OptionsPlugin("options"); args = NULLPTR; } - void teardown() + void teardown() _override { delete args; delete plugin; @@ -550,4 +550,3 @@ TEST(CommandLineArguments, setOptCrashOnFail) CHECK(newArgumentParser(argc, argv)); CHECK(args->isCrashingOnFail()); } - diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index 122961ead..39a49cf2e 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -47,7 +47,7 @@ class DummyPluginWhichCountsThePlugins : public TestPlugin { } - virtual bool parseArguments(int, const char *const *, int) + virtual bool parseArguments(int, const char *const *, int) _override { /* Remove ourselves from the count */ amountOfPlugins = registry_->countPlugins() - 1; @@ -69,19 +69,19 @@ class CommandLineTestRunnerWithStringBufferOutput : public CommandLineTestRunner fakeConsoleOutputWhichIsReallyABuffer(NULLPTR), fakeTCOutputWhichIsReallyABuffer(NULLPTR) {} - TestOutput* createConsoleOutput() + TestOutput* createConsoleOutput() _override { fakeConsoleOutputWhichIsReallyABuffer = new StringBufferTestOutput; return fakeConsoleOutputWhichIsReallyABuffer; } - TestOutput* createJUnitOutput(const SimpleString&) + TestOutput* createJUnitOutput(const SimpleString&) _override { fakeJUnitOutputWhichIsReallyABuffer_ = new StringBufferTestOutput; return fakeJUnitOutputWhichIsReallyABuffer_; } - TestOutput* createTeamCityOutput() + TestOutput* createTeamCityOutput() _override { fakeTCOutputWhichIsReallyABuffer = new StringBufferTestOutput; return fakeTCOutputWhichIsReallyABuffer; @@ -95,14 +95,14 @@ TEST_GROUP(CommandLineTestRunner) UtestShell *test2; DummyPluginWhichCountsThePlugins* pluginCountingPlugin; - void setup() + void setup() _override { test1 = new UtestShell("group1", "test1", "file1", 1); test2 = new UtestShell("group2", "test2", "file2", 2); registry.addTest(test1); pluginCountingPlugin = new DummyPluginWhichCountsThePlugins("PluginCountingPlugin", ®istry); } - void teardown() + void teardown() _override { delete pluginCountingPlugin; delete test2; @@ -398,7 +398,7 @@ class RunIgnoredUtest : public Utest { public: static bool Checker; - void testBody() + void testBody() _override { Checker = true; } @@ -420,13 +420,13 @@ TEST_GROUP(RunIgnoredTest) RunIgnoredUtestShell *runIgnoredTest; DummyPluginWhichCountsThePlugins* pluginCountingPlugin; - void setup() + void setup() _override { runIgnoredTest = new RunIgnoredUtestShell("group", "test", "file", 1); registry.addTest(runIgnoredTest); pluginCountingPlugin = new DummyPluginWhichCountsThePlugins("PluginCountingPlugin", ®istry); } - void teardown() + void teardown() _override { delete pluginCountingPlugin; delete runIgnoredTest; @@ -453,4 +453,3 @@ TEST(RunIgnoredTest, IgnoreTestWillGetRunIfOptionSpecified) CHECK_TRUE( RunIgnoredUtest::Checker ); } - diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index c94e8a91c..6fac9764c 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -336,7 +336,7 @@ TEST_GROUP(JUnitOutputTest) JUnitTestOutputTestRunner *testCaseRunner; FileForJUnitOutputTests* outputFile; - void setup() + void setup() _override { UT_PTR_SET(PlatformSpecificFOpen, mockFOpen); UT_PTR_SET(PlatformSpecificFPuts, mockFPuts); @@ -346,7 +346,7 @@ TEST_GROUP(JUnitOutputTest) testCaseRunner = new JUnitTestOutputTestRunner(*result); } - void teardown() + void teardown() _override { delete testCaseRunner; delete result; diff --git a/tests/CppUTest/MemoryLeakDetectorTest.cpp b/tests/CppUTest/MemoryLeakDetectorTest.cpp index 53e457c9e..e22fbada1 100644 --- a/tests/CppUTest/MemoryLeakDetectorTest.cpp +++ b/tests/CppUTest/MemoryLeakDetectorTest.cpp @@ -56,12 +56,12 @@ class NewAllocatorForMemoryLeakDetectionTest: public TestMemoryAllocator int alloc_called; int free_called; - char* alloc_memory(size_t size, const char*, size_t) + char* alloc_memory(size_t size, const char*, size_t) _override { alloc_called++; return TestMemoryAllocator::alloc_memory(size, "file", 1); } - void free_memory(char* memory, size_t size, const char* file, size_t line) + void free_memory(char* memory, size_t size, const char* file, size_t line) _override { free_called++; TestMemoryAllocator::free_memory(memory, size, file, line); @@ -81,24 +81,24 @@ class AllocatorForMemoryLeakDetectionTest: public TestMemoryAllocator int allocMemoryLeakNodeCalled; int freeMemoryLeakNodeCalled; - char* alloc_memory(size_t size, const char* file, size_t line) + char* alloc_memory(size_t size, const char* file, size_t line) _override { alloc_called++; return TestMemoryAllocator::alloc_memory(size, file, line); } - void free_memory(char* memory, size_t size, const char* file, size_t line) + void free_memory(char* memory, size_t size, const char* file, size_t line) _override { free_called++; TestMemoryAllocator::free_memory(memory, size, file, line); } - char* allocMemoryLeakNode(size_t size) + char* allocMemoryLeakNode(size_t size) _override { allocMemoryLeakNodeCalled++; return TestMemoryAllocator::alloc_memory(size, __FILE__, __LINE__); } - void freeMemoryLeakNode(char* memory) + void freeMemoryLeakNode(char* memory) _override { freeMemoryLeakNodeCalled++; TestMemoryAllocator::free_memory(memory, 0, __FILE__, __LINE__); @@ -111,7 +111,7 @@ TEST_GROUP(MemoryLeakDetectorTest) MemoryLeakFailureForTest *reporter; AllocatorForMemoryLeakDetectionTest* testAllocator; - void setup() + void setup() _override { reporter = new MemoryLeakFailureForTest; detector = new MemoryLeakDetector(reporter); @@ -120,7 +120,7 @@ TEST_GROUP(MemoryLeakDetectorTest) detector->startChecking(); reporter->message = new SimpleString(); } - void teardown() + void teardown() _override { delete reporter->message; delete detector; diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index 71c020994..849e400ec 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -74,7 +74,7 @@ TEST_GROUP(MemoryLeakWarningTest) DummyMemoryLeakFailure dummy; TestTestingFixture* fixture; - void setup() + void setup() _override { fixture = new TestTestingFixture(); detector = new MemoryLeakDetector(&dummy); @@ -87,7 +87,7 @@ TEST_GROUP(MemoryLeakWarningTest) leak2 = NULLPTR; } - void teardown() + void teardown() _override { detector->deallocMemory(allocator, leak1); detector->deallocMemory(allocator, leak2); @@ -195,7 +195,7 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) cpputestHasCrashed = true; } - void setup() + void setup() _override { memoryAllocatorStash.save(); detector = MemoryLeakWarningPlugin::getGlobalDetector(); @@ -210,7 +210,7 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) cpputestHasCrashed = false; } - void teardown() + void teardown() _override { MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); @@ -407,7 +407,7 @@ static void StubMutexUnlock(PlatformSpecificMutex) TEST_GROUP(MemoryLeakWarningThreadSafe) { - void setup() + void setup() _override { UT_PTR_SET(PlatformSpecificMutexLock, StubMutexLock); UT_PTR_SET(PlatformSpecificMutexUnlock, StubMutexUnlock); @@ -416,7 +416,7 @@ TEST_GROUP(MemoryLeakWarningThreadSafe) mutexUnlockCount = 0; } - void teardown() + void teardown() _override { } }; diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index 384786424..ec83f371d 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -121,7 +121,7 @@ TEST(BasicBehavior, freeInvalidatesMemory) TEST_GROUP(MemoryLeakOverridesToBeUsedInProductionCode) { MemoryLeakDetector* memLeakDetector; - void setup() + void setup() _override { memLeakDetector = MemoryLeakWarningPlugin::getGlobalDetector(); } @@ -373,7 +373,7 @@ TEST_GROUP(OutOfMemoryTestsForOperatorNew) { TestMemoryAllocator* no_memory_allocator; GlobalMemoryAllocatorStash memoryAllocatorStash; - void setup() + void setup() _override { memoryAllocatorStash.save(); no_memory_allocator = new NullUnknownAllocator; @@ -381,7 +381,7 @@ TEST_GROUP(OutOfMemoryTestsForOperatorNew) setCurrentNewArrayAllocator(no_memory_allocator); } - void teardown() + void teardown() _override { memoryAllocatorStash.restore(); delete no_memory_allocator; diff --git a/tests/CppUTest/PluginTest.cpp b/tests/CppUTest/PluginTest.cpp index 1231e7791..0251a849a 100644 --- a/tests/CppUTest/PluginTest.cpp +++ b/tests/CppUTest/PluginTest.cpp @@ -44,13 +44,13 @@ class DummyPlugin: public TestPlugin { } - virtual void preTestAction(UtestShell&, TestResult&) + virtual void preTestAction(UtestShell&, TestResult&) _override { preAction++; preActionSequence = sequenceNumber++; } - virtual void postTestAction(UtestShell&, TestResult&) + virtual void postTestAction(UtestShell&, TestResult&) _override { postAction++; postActionSequence = sequenceNumber++; @@ -70,7 +70,7 @@ class DummyPluginWhichAcceptsParameters: public DummyPlugin { } - virtual bool parseArguments(int ac, const char *const *av, int index) + virtual bool parseArguments(int ac, const char *const *av, int index) _override { SimpleString argument (av[index]); if (argument == "-paccept") @@ -88,7 +88,7 @@ TEST_GROUP(PluginTest) TestTestingFixture *genFixture; TestRegistry* registry; - void setup() + void setup() _override { firstPlugin = new DummyPlugin(GENERIC_PLUGIN); secondPlugin = new DummyPluginWhichAcceptsParameters(GENERIC_PLUGIN2); @@ -99,7 +99,7 @@ TEST_GROUP(PluginTest) sequenceNumber = 1; } - void teardown() + void teardown() _override { delete firstPlugin; delete secondPlugin; diff --git a/tests/CppUTest/SetPluginTest.cpp b/tests/CppUTest/SetPluginTest.cpp index c26a51258..33e0324b4 100644 --- a/tests/CppUTest/SetPluginTest.cpp +++ b/tests/CppUTest/SetPluginTest.cpp @@ -29,7 +29,7 @@ TEST_GROUP(SetPointerPluginTest) StringBufferTestOutput* output_; TestResult* result_; - void setup() + void setup() _override { myRegistry_ = new TestRegistry(); plugin_ = new SetPointerPlugin("TestSetPlugin"); @@ -39,7 +39,7 @@ TEST_GROUP(SetPointerPluginTest) result_ = new TestResult(*output_); } - void teardown() + void teardown() _override { myRegistry_->setCurrentRegistry(NULLPTR); delete myRegistry_; @@ -68,7 +68,7 @@ class FunctionPointerUtest : public Utest class FunctionPointerUtestShell: public UtestShell { public: - virtual Utest* createTest() + virtual Utest* createTest() _override { return new FunctionPointerUtest(); } @@ -98,7 +98,7 @@ class MaxFunctionPointerUtest : public Utest { } - void setup() + void setup() _override { for (int i = 0; i < numOfFpSets; ++i) { @@ -116,7 +116,7 @@ class MaxFunctionPointerUtestShell: public UtestShell { } - virtual Utest* createTest() + virtual Utest* createTest() _override { return new MaxFunctionPointerUtest(numOfFpSets); } @@ -140,11 +140,11 @@ static double stub_double = 4.0; class SetDoublePointerUtest : public Utest { public: - void setup() + void setup() _override { UT_PTR_SET(orig_double_ptr, &stub_double); } - void testBody() + void testBody() _override { CHECK(orig_double_ptr == &stub_double); } @@ -153,7 +153,7 @@ class SetDoublePointerUtest : public Utest class SetDoublePointerUtestShell: public UtestShell { public: - Utest * createTest() + Utest * createTest() _override { return new SetDoublePointerUtest(); } diff --git a/tests/CppUTest/SimpleMutexTest.cpp b/tests/CppUTest/SimpleMutexTest.cpp index 17d86a18d..0ee06a05d 100644 --- a/tests/CppUTest/SimpleMutexTest.cpp +++ b/tests/CppUTest/SimpleMutexTest.cpp @@ -59,7 +59,7 @@ static void StubMutexDestroy(PlatformSpecificMutex) TEST_GROUP(SimpleMutexTest) { - void setup() + void setup() _override { UT_PTR_SET(PlatformSpecificMutexCreate, StubMutexCreate); UT_PTR_SET(PlatformSpecificMutexLock, StubMutexLock); @@ -72,7 +72,7 @@ TEST_GROUP(SimpleMutexTest) mutexUnlockCount = 0; } - void teardown() + void teardown() _override { } }; diff --git a/tests/CppUTest/SimpleStringCacheTest.cpp b/tests/CppUTest/SimpleStringCacheTest.cpp index e59406fe1..e44a44da6 100644 --- a/tests/CppUTest/SimpleStringCacheTest.cpp +++ b/tests/CppUTest/SimpleStringCacheTest.cpp @@ -52,7 +52,7 @@ TEST_GROUP(SimpleStringInternalCache) TestFunctionWithCache testFunction; TestTestingFixture fixture; - void setup() + void setup() _override { fixture.setTestFunction(&testFunction); testFunction.parameter = &cache; @@ -62,7 +62,7 @@ TEST_GROUP(SimpleStringInternalCache) cache.setAllocator(defaultAllocator); } - void teardown() + void teardown() _override { cache.clearAllIncludingCurrentlyUsedMemory(); accountant.clear(); @@ -330,13 +330,13 @@ TEST_GROUP(SimpleStringCacheAllocator) MemoryAccountant accountant; AccountingTestMemoryAllocator* accountingAllocator; - void setup() + void setup() _override { accountingAllocator = new AccountingTestMemoryAllocator(accountant, defaultMallocAllocator()); allocator = new SimpleStringCacheAllocator(cache, accountingAllocator); } - void teardown() + void teardown() _override { cache.clearCache(); delete allocator; @@ -387,4 +387,3 @@ TEST(GlobalSimpleStringCache, installsAndRemovedCache) } POINTERS_EQUAL(originalStringAllocator, SimpleString::getStringAllocator()); } - diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index a9e7a4289..8a5d8f50d 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -67,14 +67,14 @@ TEST_GROUP(GlobalSimpleStringMemoryAccountant) TestTestingFixture fixture; GlobalSimpleStringMemoryAccountant accountant; - void setup() + void setup() _override { stash.save(); testFunction.parameter_ = &accountant; fixture.setTestFunction(&testFunction); } - void teardown() + void teardown() _override { stash.restore(); } @@ -157,12 +157,12 @@ TEST_GROUP(SimpleString) { JustUseNewStringAllocator justNewForSimpleStringTestAllocator; GlobalSimpleStringAllocatorStash stash; - void setup() + void setup() _override { stash.save(); SimpleString::setStringAllocator(&justNewForSimpleStringTestAllocator); } - void teardown() + void teardown() _override { stash.restore(); } @@ -1262,4 +1262,3 @@ TEST(SimpleString, BracketsFormattedHexStringFromForULongLong) } #endif - diff --git a/tests/CppUTest/TeamCityOutputTest.cpp b/tests/CppUTest/TeamCityOutputTest.cpp index f8cb86db8..f1aa80c83 100644 --- a/tests/CppUTest/TeamCityOutputTest.cpp +++ b/tests/CppUTest/TeamCityOutputTest.cpp @@ -51,7 +51,7 @@ TEST_GROUP(TeamCityOutputTest) TestFailure *f, *f2, *f3; TestResult* result; - void setup() + void setup() _override { mock = new TeamCityOutputToBuffer(); tcout = mock; @@ -64,7 +64,7 @@ TEST_GROUP(TeamCityOutputTest) millisTime = 0; UT_PTR_SET(GetPlatformSpecificTimeInMillis, MockGetPlatformSpecificTimeInMillis); } - void teardown() + void teardown() _override { delete tcout; delete tst; diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index 1f8c148f3..5fe53fc6c 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -38,11 +38,11 @@ TEST_GROUP(TestFailure) { UtestShell* test; - void setup() + void setup() _override { test = new UtestShell("groupname", "testname", failFileName, failLineNumber-1); } - void teardown() + void teardown() _override { delete test; } diff --git a/tests/CppUTest/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp index 6ceefcaac..8ddf2047e 100644 --- a/tests/CppUTest/TestHarness_cTest.cpp +++ b/tests/CppUTest/TestHarness_cTest.cpp @@ -805,4 +805,3 @@ TEST(TestHarness_c, callocShouldReturnNULLWhenOutOfMemory) cpputest_malloc_set_not_out_of_memory(); } #endif - diff --git a/tests/CppUTest/TestInstallerTest.cpp b/tests/CppUTest/TestInstallerTest.cpp index ec646700d..320136823 100644 --- a/tests/CppUTest/TestInstallerTest.cpp +++ b/tests/CppUTest/TestInstallerTest.cpp @@ -42,13 +42,13 @@ TEST_GROUP(TestInstaller) TestInstaller* testInstaller; TestRegistry* myRegistry; TestInstallerTestUtestShell shell; - void setup() + void setup() _override { myRegistry = new TestRegistry(); myRegistry->setCurrentRegistry(myRegistry); testInstaller = new TestInstaller(shell, "TestInstaller", "test", __FILE__, __LINE__); } - void teardown() + void teardown() _override { myRegistry->setCurrentRegistry(NULLPTR); testInstaller->unDo(); @@ -60,4 +60,3 @@ TEST_GROUP(TestInstaller) TEST(TestInstaller, Create) { } - diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 9cd9feff2..8d46badd7 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -36,13 +36,13 @@ TEST_GROUP(TestMemoryAllocatorTest) TestMemoryAllocator* allocator; GlobalMemoryAllocatorStash memoryAllocatorStash; - void setup() + void setup() _override { allocator = NULLPTR; memoryAllocatorStash.save(); } - void teardown() + void teardown() _override { memoryAllocatorStash.restore(); delete allocator; @@ -149,12 +149,12 @@ TEST_GROUP(MemoryLeakAllocator) { MemoryLeakAllocator* allocator; - void setup() + void setup() _override { allocator = new MemoryLeakAllocator(defaultMallocAllocator()); } - void teardown() + void teardown() _override { delete allocator; } @@ -214,14 +214,14 @@ TEST_GROUP(FailableMemoryAllocator) TestTestingFixture fixture; GlobalMemoryAllocatorStash stash; - void setup() + void setup() _override { stash.save(); testFunction.allocator_ = failableMallocAllocator = new FailableMemoryAllocator("Failable Malloc Allocator", "malloc", "free"); fixture.setTestFunction(&testFunction); setCurrentMallocAllocator(failableMallocAllocator); } - void teardown() + void teardown() _override { failableMallocAllocator->checkAllFailedAllocsWereDone(); failableMallocAllocator->clearFailedAllocs(); @@ -351,13 +351,13 @@ TEST_GROUP(TestMemoryAccountant) TestTestingFixture fixture; MemoryAccountantExecFunction testFunction; - void setup() + void setup() _override { testFunction.parameter_ = &accountant; fixture.setTestFunction(&testFunction); } - void teardown() + void teardown() _override { accountant.clear(); } @@ -545,12 +545,12 @@ TEST_GROUP(AccountingTestMemoryAllocator) MemoryAccountant accountant; AccountingTestMemoryAllocator *allocator; - void setup() + void setup() _override { allocator = new AccountingTestMemoryAllocator(accountant, getCurrentMallocAllocator()); } - void teardown() + void teardown() _override { accountant.clear(); delete allocator; @@ -628,14 +628,14 @@ TEST_GROUP(GlobalMemoryAccountant) GlobalMemoryAccountantExecFunction testFunction; GlobalMemoryAllocatorStash stash; - void setup() + void setup() _override { testFunction.parameter_ = &accountant; fixture.setTestFunction(&testFunction); stash.save(); } - void teardown() + void teardown() _override { stash.restore(); } @@ -763,4 +763,3 @@ TEST(GlobalMemoryAccountant, checkWhetherNewArrayAllocatorIsNotChanged) fixture.runAllTests(); fixture.assertPrintContains("GlobalMemoryAccountant: New Array memory allocator has been changed while accounting for memory"); } - diff --git a/tests/CppUTest/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp index 034dae73e..da5b031f6 100644 --- a/tests/CppUTest/TestOutputTest.cpp +++ b/tests/CppUTest/TestOutputTest.cpp @@ -51,7 +51,7 @@ TEST_GROUP(TestOutput) TestFailure *f3; TestResult* result; - void setup() + void setup() _override { mock = new StringBufferTestOutput(); printer = mock; @@ -66,7 +66,7 @@ TEST_GROUP(TestOutput) TestOutput::setWorkingEnvironment(TestOutput::eclipse); } - void teardown() + void teardown() _override { TestOutput::setWorkingEnvironment(TestOutput::detectEnvironment); delete printer; @@ -285,32 +285,32 @@ TEST(TestOutput, printTestsEndedWithNoTestsRunOrIgnored) class CompositeTestOutputTestStringBufferTestOutput : public StringBufferTestOutput { public: - virtual void printTestsStarted() + virtual void printTestsStarted() _override { output += "Test Start\n"; } - virtual void printTestsEnded(const TestResult& result) + virtual void printTestsEnded(const TestResult& result) _override { output += StringFromFormat("Test End %d\n", (int) result.getTestCount()); } - void printCurrentGroupStarted(const UtestShell& test) + void printCurrentGroupStarted(const UtestShell& test) _override { output += StringFromFormat("Group %s Start\n", test.getGroup().asCharString()); } - void printCurrentGroupEnded(const TestResult& res) + void printCurrentGroupEnded(const TestResult& res) _override { output += StringFromFormat("Group End %d\n", (int) res.getTestCount()); } - virtual void printCurrentTestStarted(const UtestShell&) + virtual void printCurrentTestStarted(const UtestShell&) _override { output += "s"; } - void flush() + void flush() _override { output += "flush"; } @@ -339,7 +339,7 @@ TEST_GROUP(CompositeTestOutput) TestResult* result; UtestShell* test; - void setup() + void setup() _override { output1 = new CompositeTestOutputTestStringBufferTestOutput; output2 = new CompositeTestOutputTestStringBufferTestOutput; @@ -349,7 +349,7 @@ TEST_GROUP(CompositeTestOutput) test = new UtestShell("Group", "Name", "file", 10); } - void teardown() + void teardown() _override { delete test; delete result; @@ -470,4 +470,3 @@ TEST(CompositeTestOutput, deletePreviousInstanceWhenSettingNew) // CHECK NO MEMORY LEAKS } - diff --git a/tests/CppUTest/TestRegistryTest.cpp b/tests/CppUTest/TestRegistryTest.cpp index b727f8c33..eb4f50145 100644 --- a/tests/CppUTest/TestRegistryTest.cpp +++ b/tests/CppUTest/TestRegistryTest.cpp @@ -42,7 +42,7 @@ class MockTest: public UtestShell UtestShell(group, "Name", "File", testLineNumber), hasRun_(false) { } - virtual void runOneTest(TestPlugin*, TestResult&) + virtual void runOneTest(TestPlugin*, TestResult&) _override { hasRun_ = true; } @@ -118,7 +118,7 @@ TEST_GROUP(TestRegistry) MockTest* test4; TestResult *result; MockTestResult *mockResult; - void setup() + void setup() _override { output = new StringBufferTestOutput(); mockResult = new MockTestResult(*output); @@ -131,7 +131,7 @@ TEST_GROUP(TestRegistry) myRegistry->setCurrentRegistry(myRegistry); } - void teardown() + void teardown() _override { myRegistry->setCurrentRegistry(NULLPTR); delete myRegistry; diff --git a/tests/CppUTest/TestResultTest.cpp b/tests/CppUTest/TestResultTest.cpp index c60fff12b..82035438f 100644 --- a/tests/CppUTest/TestResultTest.cpp +++ b/tests/CppUTest/TestResultTest.cpp @@ -45,14 +45,14 @@ TEST_GROUP(TestResult) TestResult* res; - void setup() + void setup() _override { mock = new StringBufferTestOutput(); printer = mock; res = new TestResult(*printer); UT_PTR_SET(GetPlatformSpecificTimeInMillis, MockGetPlatformSpecificTimeInMillis); } - void teardown() + void teardown() _override { delete printer; delete res; diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 53b35a25d..195097719 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -371,12 +371,12 @@ TEST_BASE(MyOwnTest) } bool inTest; - void setup() + void setup() _override { CHECK(!inTest); inTest = true; } - void teardown() + void teardown() _override { CHECK(inTest); inTest = false; @@ -451,7 +451,7 @@ TEST_GROUP(UtestShellPointerArrayTest) UtestShell* test1; UtestShell* test2; - void setup() + void setup() _override { test0 = new IgnoredUtestShell(); test1 = new IgnoredUtestShell(); @@ -461,7 +461,7 @@ TEST_GROUP(UtestShellPointerArrayTest) test1->addTest(test2); } - void teardown() + void teardown() _override { delete test0; delete test1; diff --git a/tests/CppUTestExt/CodeMemoryReporterTest.cpp b/tests/CppUTestExt/CodeMemoryReporterTest.cpp index a17a50160..2ed2fef2d 100644 --- a/tests/CppUTestExt/CodeMemoryReporterTest.cpp +++ b/tests/CppUTestExt/CodeMemoryReporterTest.cpp @@ -45,7 +45,7 @@ TEST_GROUP(CodeMemoryReportFormatter) TestResult* testResult; CodeMemoryReportFormatter* formatter; - void setup() + void setup() _override { cAllocator = defaultMallocAllocator(); newAllocator = defaultNewAllocator(); @@ -57,7 +57,7 @@ TEST_GROUP(CodeMemoryReportFormatter) testResult = new TestResult(testOutput); } - void teardown() + void teardown() _override { delete testResult; delete formatter; diff --git a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp index 61cd42a7c..2d7b08111 100644 --- a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp +++ b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp @@ -38,7 +38,7 @@ TEST_GROUP(MockExpectedCallsList) MockCheckedExpectedCall* call2; MockCheckedExpectedCall* call3; MockCheckedExpectedCall* call4; - void setup() + void setup() _override { list = new MockExpectedCallsList; call1 = new MockCheckedExpectedCall; @@ -49,7 +49,7 @@ TEST_GROUP(MockExpectedCallsList) call2->withName("bar"); call3->withName("boo"); } - void teardown() + void teardown() _override { delete call1; delete call2; diff --git a/tests/CppUTestExt/GMockTest.cpp b/tests/CppUTestExt/GMockTest.cpp index a3698ef2d..f41bc1c12 100644 --- a/tests/CppUTestExt/GMockTest.cpp +++ b/tests/CppUTestExt/GMockTest.cpp @@ -37,12 +37,12 @@ TEST_GROUP(GMock) { TestTestingFixture *fixture; - void setup() + void setup() _override { fixture = new TestTestingFixture; } - void teardown() + void teardown() _override { delete fixture; @@ -90,5 +90,3 @@ TEST(GMock, GMockNiceMocksWorkFine) } #endif - - diff --git a/tests/CppUTestExt/GTest1Test.cpp b/tests/CppUTestExt/GTest1Test.cpp index 77e037fe2..a22639cea 100644 --- a/tests/CppUTestExt/GTest1Test.cpp +++ b/tests/CppUTestExt/GTest1Test.cpp @@ -156,12 +156,12 @@ static void _failMethodEXPECT_STREQ() TEST_GROUP(gtestMacros) { TestTestingFixture* fixture; - void setup() + void setup() _override { fixture = new TestTestingFixture(); afterCheck = false; } - void teardown() + void teardown() _override { delete fixture; } diff --git a/tests/CppUTestExt/GTest2ConvertorTest.cpp b/tests/CppUTestExt/GTest2ConvertorTest.cpp index f65e5ea1e..f4ca1b051 100644 --- a/tests/CppUTestExt/GTest2ConvertorTest.cpp +++ b/tests/CppUTestExt/GTest2ConvertorTest.cpp @@ -34,13 +34,13 @@ class GTestTestingFixtureTest : public testing::Test { bool setup_was_called; char* freed_during_teardown; - void SetUp() + void SetUp() _override { setup_was_called = true; freed_during_teardown = NULL; } - void TearDown() + void TearDown() _override { delete [] freed_during_teardown; } diff --git a/tests/CppUTestExt/MemoryReportFormatterTest.cpp b/tests/CppUTestExt/MemoryReportFormatterTest.cpp index 7a32b1a89..61bd15040 100644 --- a/tests/CppUTestExt/MemoryReportFormatterTest.cpp +++ b/tests/CppUTestExt/MemoryReportFormatterTest.cpp @@ -40,13 +40,13 @@ TEST_GROUP(NormalMemoryReportFormatter) TestResult* testResult; NormalMemoryReportFormatter formatter; - void setup() + void setup() _override { memory01 = (char*) 0x01; testResult = new TestResult(testOutput); } - void teardown() + void teardown() _override { delete testResult; } diff --git a/tests/CppUTestExt/MemoryReporterPluginTest.cpp b/tests/CppUTestExt/MemoryReporterPluginTest.cpp index 72bcb69b2..29e407cd7 100644 --- a/tests/CppUTestExt/MemoryReporterPluginTest.cpp +++ b/tests/CppUTestExt/MemoryReporterPluginTest.cpp @@ -52,37 +52,37 @@ class TemporaryDefaultNewAllocator class MockMemoryReportFormatter : public MemoryReportFormatter { public: - virtual void report_testgroup_start(TestResult* result, UtestShell& test) + virtual void report_testgroup_start(TestResult* result, UtestShell& test) _override { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_testgroup_start").withParameter("result", result).withParameter("test", &test); } - virtual void report_testgroup_end(TestResult* result, UtestShell& test) + virtual void report_testgroup_end(TestResult* result, UtestShell& test) _override { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_testgroup_end").withParameter("result", result).withParameter("test", &test); } - virtual void report_test_start(TestResult* result, UtestShell& test) + virtual void report_test_start(TestResult* result, UtestShell& test) _override { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_test_start").withParameter("result", result).withParameter("test", &test); } - virtual void report_test_end(TestResult* result, UtestShell& test) + virtual void report_test_end(TestResult* result, UtestShell& test) _override { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_test_end").withParameter("result", result).withParameter("test", &test); } - virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t, char* , const char* , size_t ) + virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t, char* , const char* , size_t ) _override { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_alloc_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", allocator); } - virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* , const char* , size_t ) + virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* , const char* , size_t ) _override { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_free_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", allocator); @@ -94,21 +94,21 @@ static MockMemoryReportFormatter formatterForPluginTest; class MemoryReporterPluginUnderTest : public MemoryReporterPlugin { public: - MemoryReportFormatter* createMemoryFormatter(const SimpleString& type) + MemoryReportFormatter* createMemoryFormatter(const SimpleString& type) _override { - mock("reporter").actualCall("createMemoryFormatter").onObject(this).withParameter("type", type.asCharString()); - return new MockMemoryReportFormatter; + mock("reporter").actualCall("createMemoryFormatter").onObject(this).withParameter("type", type.asCharString()); + return new MockMemoryReportFormatter; } }; class TestMemoryAllocatorComparator : public MockNamedValueComparator { public: - bool isEqual(const void* object1, const void* object2) + bool isEqual(const void* object1, const void* object2) _override { return ((const TestMemoryAllocator*)object1)->name() == ((const TestMemoryAllocator*)object2)->name(); } - SimpleString valueToString(const void* object) + SimpleString valueToString(const void* object) _override { return ((const TestMemoryAllocator*)object)->name(); } @@ -124,7 +124,7 @@ TEST_GROUP(MemoryReporterPlugin) TestResult* result; UtestShell* test; - void setup() + void setup() _override { previousNewAllocator = getCurrentNewAllocator(); result = new TestResult(output); @@ -138,7 +138,7 @@ TEST_GROUP(MemoryReporterPlugin) reporter->parseArguments(1, cmd_line, 0); mock("reporter").enable(); } - void teardown() + void teardown() _override { setCurrentNewAllocator(previousNewAllocator); mock().clear(); @@ -314,4 +314,3 @@ TEST(MemoryReporterPlugin, shouldntCrashCreateInvalidMemoryReportFormatterWithou realReporter.preTestAction(*test, *result); realReporter.postTestAction(*test, *result); } - diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index e8f398fcc..56e65f5ba 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -38,14 +38,14 @@ TEST_GROUP(MockCheckedActualCall) MockExpectedCallsList* list; MockFailureReporter* reporter; - void setup() + void setup() _override { emptyList = new MockExpectedCallsList; list = new MockExpectedCallsList; reporter = MockFailureReporterForTest::getReporter(); } - void teardown() + void teardown() _override { CHECK_NO_MOCK_FAILURE(); diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index 4bfc372f1..1aeff22c2 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -31,7 +31,7 @@ TEST_GROUP(MockCallTest) { - void teardown() + void teardown() _override { mock().checkExpectations(); mock().clear(); @@ -500,4 +500,3 @@ TEST(MockCallTest, mockExpectationShouldIncreaseNumberOfChecks) fixture.runAllTests(); LONGS_EQUAL(3, fixture.getCheckCount()); } - diff --git a/tests/CppUTestExt/MockCheatSheetTest.cpp b/tests/CppUTestExt/MockCheatSheetTest.cpp index f5a97df85..10218f509 100644 --- a/tests/CppUTestExt/MockCheatSheetTest.cpp +++ b/tests/CppUTestExt/MockCheatSheetTest.cpp @@ -39,7 +39,7 @@ static void productionCodeBarCalls() /* Actual test */ TEST_GROUP(MockCheatSheet) { - void teardown() + void teardown() _override { /* Check expectations. Alternatively use MockSupportPlugin */ mock().checkExpectations(); @@ -73,4 +73,3 @@ TEST(MockCheatSheet, bar) /* And the production code call */ productionCodeBarCalls(); } - diff --git a/tests/CppUTestExt/MockComparatorCopierTest.cpp b/tests/CppUTestExt/MockComparatorCopierTest.cpp index 5c3ba60d6..d2cfd5879 100644 --- a/tests/CppUTestExt/MockComparatorCopierTest.cpp +++ b/tests/CppUTestExt/MockComparatorCopierTest.cpp @@ -30,7 +30,7 @@ TEST_GROUP(MockComparatorCopierTest) { - void teardown() + void teardown() _override { mock().checkExpectations(); mock().clear(); @@ -55,13 +55,13 @@ class MyTypeForTesting class MyTypeForTestingComparator : public MockNamedValueComparator { public: - virtual bool isEqual(const void* object1, const void* object2) + virtual bool isEqual(const void* object1, const void* object2) _override { const MyTypeForTesting* obj1 = (const MyTypeForTesting*) object1; const MyTypeForTesting* obj2 = (const MyTypeForTesting*) object2; return *(obj1->value) == *(obj2->value); } - virtual SimpleString valueToString(const void* object) + virtual SimpleString valueToString(const void* object) _override { const MyTypeForTesting* obj = (const MyTypeForTesting*) object; return StringFrom(*(obj->value)); @@ -71,7 +71,7 @@ class MyTypeForTestingComparator : public MockNamedValueComparator class MyTypeForTestingCopier : public MockNamedValueCopier { public: - virtual void copy(void* dst_, const void* src_) + virtual void copy(void* dst_, const void* src_) _override { MyTypeForTesting* dst = (MyTypeForTesting*) dst_; const MyTypeForTesting* src = (const MyTypeForTesting*) src_; @@ -567,11 +567,11 @@ TEST(MockComparatorCopierTest, installCopiersWorksHierarchically) class StubComparator : public MockNamedValueComparator { public: - virtual bool isEqual(const void*, const void*) + virtual bool isEqual(const void*, const void*) _override { return true; } - virtual SimpleString valueToString(const void*) + virtual SimpleString valueToString(const void*) _override { return ""; } @@ -598,4 +598,3 @@ TEST(MockComparatorCopierTest, shouldSupportConstParameters) mock().checkExpectations(); } - diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index c953d1b39..0fb52cd97 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -47,13 +47,13 @@ class TypeForTestingExpectedFunctionCall class TypeForTestingExpectedFunctionCallComparator : public MockNamedValueComparator { public: - virtual bool isEqual(const void* object1, const void* object2) + virtual bool isEqual(const void* object1, const void* object2) _override { const TypeForTestingExpectedFunctionCall* obj1 = (const TypeForTestingExpectedFunctionCall*) object1; const TypeForTestingExpectedFunctionCall* obj2 = (const TypeForTestingExpectedFunctionCall*) object2; return *(obj1->value) == *(obj2->value); } - virtual SimpleString valueToString(const void* object) + virtual SimpleString valueToString(const void* object) _override { const TypeForTestingExpectedFunctionCall* obj = (const TypeForTestingExpectedFunctionCall*) object; return StringFrom(*(obj->value)); @@ -63,7 +63,7 @@ class TypeForTestingExpectedFunctionCallComparator : public MockNamedValueCompar class TypeForTestingExpectedFunctionCallCopier : public MockNamedValueCopier { public: - virtual void copy(void* dst_, const void* src_) + virtual void copy(void* dst_, const void* src_) _override { TypeForTestingExpectedFunctionCall* dst = (TypeForTestingExpectedFunctionCall*) dst_; const TypeForTestingExpectedFunctionCall* src = (const TypeForTestingExpectedFunctionCall*) src_; @@ -73,7 +73,7 @@ class TypeForTestingExpectedFunctionCallCopier : public MockNamedValueCopier TEST_GROUP(MockNamedValueHandlerRepository) { - void teardown() + void teardown() _override { CHECK_NO_MOCK_FAILURE(); MockFailureReporterForTest::clearReporter(); @@ -155,13 +155,13 @@ TEST_GROUP(MockExpectedCall) { MockCheckedExpectedCall* call; MockNamedValueComparatorsAndCopiersRepository* originalComparatorRepository; - void setup() + void setup() _override { originalComparatorRepository = MockNamedValue::getDefaultComparatorsAndCopiersRepository(); call = new MockCheckedExpectedCall(1); call->withName("funcName"); } - void teardown() + void teardown() _override { MockNamedValue::setDefaultComparatorsAndCopiersRepository(originalComparatorRepository); delete call; diff --git a/tests/CppUTestExt/MockFailureReporterForTest.h b/tests/CppUTestExt/MockFailureReporterForTest.h index 387f22b4f..19ca631d3 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.h +++ b/tests/CppUTestExt/MockFailureReporterForTest.h @@ -38,7 +38,7 @@ class MockFailureReporterForTest : public MockFailureReporter public: SimpleString mockFailureString; - virtual void failTest(const MockFailure& failure); + virtual void failTest(const MockFailure& failure) _override; static MockFailureReporterForTest* getReporter(); static void clearReporter(); private: @@ -68,4 +68,3 @@ class MockExpectedCallsListForTest : public MockExpectedCallsList }; #endif - diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index 1582c3fcb..404d93e89 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -40,14 +40,14 @@ TEST_GROUP(MockFailureTest) MockCheckedExpectedCall* call2; MockCheckedExpectedCall* call3; - void setup () + void setup () _override { list = new MockExpectedCallsList; call1 = new MockCheckedExpectedCall; call2 = new MockCheckedExpectedCall; call3 = new MockCheckedExpectedCall; } - void teardown () + void teardown () _override { delete list; delete call1; diff --git a/tests/CppUTestExt/MockHierarchyTest.cpp b/tests/CppUTestExt/MockHierarchyTest.cpp index 962ae7981..2147472e9 100644 --- a/tests/CppUTestExt/MockHierarchyTest.cpp +++ b/tests/CppUTestExt/MockHierarchyTest.cpp @@ -30,7 +30,7 @@ TEST_GROUP(MockHierarchyTest) { - void teardown() + void teardown() _override { mock().clear(); } @@ -151,4 +151,3 @@ TEST(MockHierarchyTest, reporterIsInheritedInHierarchicalMocks) MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "differentScope::foobar", expectations); CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } - diff --git a/tests/CppUTestExt/MockNamedValueTest.cpp b/tests/CppUTestExt/MockNamedValueTest.cpp index ef739c39a..ad8406e48 100644 --- a/tests/CppUTestExt/MockNamedValueTest.cpp +++ b/tests/CppUTestExt/MockNamedValueTest.cpp @@ -83,12 +83,12 @@ TEST(ComparatorsAndCopiersRepository, InstallComparatorsAndCopiersFromRepository source.installCopier("MyType", copier); source.installComparator("MyType", comparator); - + target.installComparatorsAndCopiers(source); - + POINTERS_EQUAL(&comparator, target.getComparatorForType("MyType")); POINTERS_EQUAL(&copier, target.getCopierForType("MyType")); - + source.clear(); target.clear(); } @@ -96,12 +96,12 @@ TEST(ComparatorsAndCopiersRepository, InstallComparatorsAndCopiersFromRepository TEST_GROUP(MockNamedValue) { MockNamedValue * value; - void setup() + void setup() _override { value = new MockNamedValue("param"); } - void teardown() + void teardown() _override { delete value; } diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 7373fe0bc..2adcbb029 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -31,7 +31,7 @@ TEST_GROUP(MockParameterTest) { - void teardown() + void teardown() _override { mock().checkExpectations(); mock().clear(); @@ -930,4 +930,3 @@ TEST(MockParameterTest, expectMultipleMultipleCallsWithParameters) mock().checkExpectations(); } - diff --git a/tests/CppUTestExt/MockPluginTest.cpp b/tests/CppUTestExt/MockPluginTest.cpp index a9f947367..39819ea6e 100644 --- a/tests/CppUTestExt/MockPluginTest.cpp +++ b/tests/CppUTestExt/MockPluginTest.cpp @@ -40,13 +40,13 @@ TEST_GROUP(MockPlugin) MockSupportPlugin plugin; - void setup() + void setup() _override { test = new UtestShell("group", "name", "file", 1); result = new TestResult(output); } - void teardown() + void teardown() _override { delete test; delete result; @@ -92,11 +92,11 @@ TEST(MockPlugin, checkExpectationsWorksAlsoWithHierachicalObjects) class DummyComparator : public MockNamedValueComparator { public: - bool isEqual(const void* object1, const void* object2) + bool isEqual(const void* object1, const void* object2) _override { return object1 == object2; } - SimpleString valueToString(const void*) + SimpleString valueToString(const void*) _override { return "string"; } @@ -120,7 +120,7 @@ TEST(MockPlugin, installComparatorRecordsTheComparatorButNotInstallsItYet) class DummyCopier : public MockNamedValueCopier { public: - void copy(void* dst, const void* src) + void copy(void* dst, const void* src) _override { *(int*)dst = *(const int*)src; } @@ -174,4 +174,3 @@ TEST(MockPlugin, shouldNotFailAgainWhenTestAlreadyFailed) fixture.runAllTests(); fixture.assertPrintContains("1 failures, 1 tests, 1 ran, 2 checks,"); } - diff --git a/tests/CppUTestExt/MockReturnValueTest.cpp b/tests/CppUTestExt/MockReturnValueTest.cpp index da412830a..0abe85b90 100644 --- a/tests/CppUTestExt/MockReturnValueTest.cpp +++ b/tests/CppUTestExt/MockReturnValueTest.cpp @@ -30,7 +30,7 @@ TEST_GROUP(MockReturnValueTest) { - void teardown() + void teardown() _override { mock().checkExpectations(); mock().clear(); @@ -745,4 +745,3 @@ TEST(MockReturnValueTest, whenCallingDisabledOrIgnoredActualCallsThenTheyDontRet CHECK(!mock().hasReturnValue()); } - diff --git a/tests/CppUTestExt/MockStrictOrderTest.cpp b/tests/CppUTestExt/MockStrictOrderTest.cpp index 400471d21..f41478ad2 100644 --- a/tests/CppUTestExt/MockStrictOrderTest.cpp +++ b/tests/CppUTestExt/MockStrictOrderTest.cpp @@ -30,7 +30,7 @@ TEST_GROUP(MockStrictOrderTest) { - void teardown() + void teardown() _override { mock().clear(); } diff --git a/tests/CppUTestExt/MockSupportTest.cpp b/tests/CppUTestExt/MockSupportTest.cpp index 2fb889559..7f39a55ff 100644 --- a/tests/CppUTestExt/MockSupportTest.cpp +++ b/tests/CppUTestExt/MockSupportTest.cpp @@ -37,7 +37,7 @@ TEST_GROUP(MockSupportTest) MockExpectedCallsListForTest expectations; MockFailureReporterInstaller failureReporterInstaller; - void teardown() + void teardown() _override { mock().checkExpectations(); CHECK_NO_MOCK_FAILURE(); @@ -173,7 +173,7 @@ TEST_GROUP(MockSupportTestWithFixture) { TestTestingFixture fixture; - void teardown() + void teardown() _override { mock().clear(); MockFailureReporterForTest::clearReporter(); @@ -284,4 +284,3 @@ TEST(MockSupportTestWithFixture, failedMockShouldFailAgainWhenRepeated) fixture.flushOutputAndResetResult(); } } - diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 3aff93d7d..1d1a5aa99 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -43,7 +43,7 @@ extern "C" { TEST_GROUP(MockSupport_c) { - void teardown() + void teardown() _override { mock_c()->clear(); } diff --git a/tests/CppUTestExt/OrderedTestTest.cpp b/tests/CppUTestExt/OrderedTestTest.cpp index 31fa74084..74225d1ee 100644 --- a/tests/CppUTestExt/OrderedTestTest.cpp +++ b/tests/CppUTestExt/OrderedTestTest.cpp @@ -44,7 +44,7 @@ TEST_GROUP(TestOrderedTest) ExecFunctionTestShell normalTest3; OrderedTestShell* orderedTestCache; - void setup() + void setup() _override { orderedTestCache = OrderedTestShell::getOrderedTestHead(); OrderedTestShell::setOrderedTestHead(NULLPTR); @@ -53,7 +53,7 @@ TEST_GROUP(TestOrderedTest) fixture->getRegistry()->unDoLastAddTest(); } - void teardown() + void teardown() _override { delete fixture; OrderedTestShell::setOrderedTestHead(orderedTestCache); @@ -169,7 +169,7 @@ int OrderedTestTestingFixture::count_ = 0; TEST_GROUP(TestOrderedTestMacros) { - void setup() + void setup() _override { OrderedTestTestingFixture::checkRun(TestRegistry::getCurrentRegistry()->getCurrentRepetition()); } From 8cbab286a3bdf734dffb291654d993662bd6421a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Fri, 13 Nov 2020 07:13:17 +0100 Subject: [PATCH 0620/1093] Errors for string comparisons show non-printable control characters as C escape codes --- include/CppUTest/SimpleString.h | 3 ++ include/CppUTest/TestFailure.h | 7 +-- src/CppUTest/SimpleString.cpp | 63 ++++++++++++++++++++++ src/CppUTest/TestFailure.cpp | 83 +++++++++++++---------------- tests/CppUTest/SimpleStringTest.cpp | 13 +++++ tests/CppUTest/TestFailureTest.cpp | 8 +-- 6 files changed, 120 insertions(+), 57 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 50c2b5d9a..916b1e073 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -83,6 +83,8 @@ class SimpleString SimpleString subStringFromTill(char startChar, char lastExcludedChar) const; void copyToBuffer(char* buffer, size_t bufferSize) const; + SimpleString printable() const; + const char *asCharString() const; size_t size() const; bool isEmpty() const; @@ -219,6 +221,7 @@ SimpleString BracketsFormattedHexStringFrom(cpputest_longlong value); SimpleString BracketsFormattedHexStringFrom(cpputest_ulonglong value); SimpleString BracketsFormattedHexStringFrom(signed char value); SimpleString BracketsFormattedHexString(SimpleString hexString); +SimpleString PrintableStringFromOrNull(const char * expected); /* * ARM compiler has only partial support for C++11. diff --git a/include/CppUTest/TestFailure.h b/include/CppUTest/TestFailure.h index 8b93fe332..373274d29 100644 --- a/include/CppUTest/TestFailure.h +++ b/include/CppUTest/TestFailure.h @@ -63,13 +63,8 @@ class TestFailure protected: - enum DifferenceFormat - { - DIFFERENCE_STRING, DIFFERENCE_BINARY - }; - SimpleString createButWasString(const SimpleString& expected, const SimpleString& actual); - SimpleString createDifferenceAtPosString(const SimpleString& actual, size_t position, DifferenceFormat format = DIFFERENCE_STRING); + SimpleString createDifferenceAtPosString(const SimpleString& actual, size_t offset, size_t reportedPosition); SimpleString createUserText(const SimpleString& text); SimpleString testName_; diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 02137dce5..d1347c303 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -422,6 +422,64 @@ void SimpleString::replace(const char* to, const char* with) setInternalBufferAsEmptyString(); } +SimpleString SimpleString::printable() const +{ + const char* shortEscapeCodes[] = + { + "\\a", + "\\b", + "\\t", + "\\n", + "\\v", + "\\f", + "\\r" + }; + + size_t str_size = size(); + size_t new_str_size = str_size; + + for (size_t i = 0; i < str_size; i++) + { + unsigned char c = (unsigned char) buffer_[i]; + if ((c >= 0x07) && (c <= 0x0D)) + { + new_str_size += 1; + } + else if ((c < 0x20) || (c == 0x7F)) + { + new_str_size += 3; + } + } + + SimpleString result; + result.setInternalBufferToNewBuffer(new_str_size + 1); + + size_t j = 0; + for (size_t i = 0; i < str_size; i++) + { + unsigned char c = (unsigned char) buffer_[i]; + if ((c >= 0x07) && (c <= 0x0D)) + { + StrNCpy(&result.buffer_[j], shortEscapeCodes[c - 0x07], 2); + j += 2; + } + else if ((c < 0x20) || (c == 0x7F)) + { + SimpleString hexEscapeCode = StringFromFormat("\\x%02X ", c); + StrNCpy(&result.buffer_[j], hexEscapeCode.asCharString(), 4); + j += 4; + } + else + { + result.buffer_[j] = (char) c; + j++; + } + } + result.buffer_[j] = 0; + + return result; +} + SimpleString SimpleString::lowerCase() const { SimpleString str(*this); @@ -601,6 +659,11 @@ SimpleString StringFromOrNull(const char * expected) return (expected) ? StringFrom(expected) : "(null)"; } +SimpleString PrintableStringFromOrNull(const char * expected) +{ + return (expected) ? StringFrom(expected).printable() : "(null)"; +} + SimpleString StringFrom(int value) { return StringFromFormat("%d", value); diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index a6400878b..bdcdaa544 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -31,35 +31,6 @@ #include "CppUTest/SimpleString.h" #include "CppUTest/PlatformSpecificFunctions.h" -static SimpleString removeAllPrintableCharactersFrom(const SimpleString& str) -{ - size_t bufferSize = str.size()+1; - char* buffer = (char*) PlatformSpecificMalloc(bufferSize); - str.copyToBuffer(buffer, bufferSize); - - for (size_t i = 0; i < bufferSize-1; i++) - if (buffer[i] != '\t' && buffer[i] != '\n') - buffer[i] = ' '; - - SimpleString result(buffer); - PlatformSpecificFree(buffer); - return result; -} - -static SimpleString addMarkerToString(const SimpleString& str, int markerPos) -{ - size_t bufferSize = str.size()+1; - char* buffer = (char*) PlatformSpecificMalloc(bufferSize); - str.copyToBuffer(buffer, bufferSize); - - buffer[markerPos] = '^'; - - SimpleString result(buffer); - PlatformSpecificFree(buffer); - return result; - -} - TestFailure::TestFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& theMessage) : testName_(test->getFormattedName()), testNameOnly_(test->getName()), fileName_(fileName), lineNumber_(lineNumber), testFileName_(test->getFile()), testLineNumber_(test->getLineNumber()), message_(theMessage) { @@ -135,25 +106,21 @@ SimpleString TestFailure::createButWasString(const SimpleString& expected, const return StringFromFormat("expected <%s>\n\tbut was <%s>", expected.asCharString(), actual.asCharString()); } -SimpleString TestFailure::createDifferenceAtPosString(const SimpleString& actual, size_t position, DifferenceFormat format) +SimpleString TestFailure::createDifferenceAtPosString(const SimpleString& actual, size_t offset, size_t reportedPosition) { SimpleString result; const size_t extraCharactersWindow = 20; const size_t halfOfExtraCharactersWindow = extraCharactersWindow / 2; - const size_t actualOffset = (format == DIFFERENCE_STRING) ? position : (position * 3 + 1); SimpleString paddingForPreventingOutOfBounds (" ", halfOfExtraCharactersWindow); SimpleString actualString = paddingForPreventingOutOfBounds + actual + paddingForPreventingOutOfBounds; - SimpleString differentString = StringFromFormat("difference starts at position %lu at: <", (unsigned long) position); + SimpleString differentString = StringFromFormat("difference starts at position %lu at: <", (unsigned long) reportedPosition); result += "\n"; - result += StringFromFormat("\t%s%s>\n", differentString.asCharString(), actualString.subString(actualOffset, extraCharactersWindow).asCharString()); + result += StringFromFormat("\t%s%s>\n", differentString.asCharString(), actualString.subString(offset, extraCharactersWindow).asCharString()); - SimpleString markString = actualString.subString(actualOffset, halfOfExtraCharactersWindow+1); - markString = removeAllPrintableCharactersFrom(markString); - markString = addMarkerToString(markString, halfOfExtraCharactersWindow); - result += StringFromFormat("\t%s%s", SimpleString(" ", differentString.size()).asCharString(), markString.asCharString()); + result += StringFromFormat("\t%s^", SimpleString(" ", (differentString.size() + halfOfExtraCharactersWindow)).asCharString()); return result; } @@ -208,12 +175,18 @@ CheckEqualFailure::CheckEqualFailure(UtestShell* test, const char* fileName, siz { message_ = createUserText(text); + SimpleString printableExpected = PrintableStringFromOrNull(expected.asCharString()); + SimpleString printableActual = PrintableStringFromOrNull(actual.asCharString()); + + message_ += createButWasString(printableExpected, printableActual); + size_t failStart; - for (failStart = 0; actual.asCharString()[failStart] == expected.asCharString()[failStart]; failStart++) + for (failStart = 0; actual.at(failStart) == expected.at(failStart); failStart++) ; - message_ += createButWasString(expected, actual); - message_ += createDifferenceAtPosString(actual, failStart); - + size_t failStartPrintable; + for (failStartPrintable = 0; printableActual.at(failStartPrintable) == printableExpected.at(failStartPrintable); failStartPrintable++) + ; + message_ += createDifferenceAtPosString(printableActual, failStartPrintable, failStart); } ComparisonFailure::ComparisonFailure(UtestShell *test, const char *fileName, size_t lineNumber, const SimpleString& checkString, const SimpleString &comparisonString, const SimpleString &text) @@ -331,13 +304,19 @@ StringEqualFailure::StringEqualFailure(UtestShell* test, const char* fileName, s { message_ = createUserText(text); - message_ += createButWasString(StringFromOrNull(expected), StringFromOrNull(actual)); + SimpleString printableExpected = PrintableStringFromOrNull(expected); + SimpleString printableActual = PrintableStringFromOrNull(actual); + + message_ += createButWasString(printableExpected, printableActual); if((expected) && (actual)) { size_t failStart; for (failStart = 0; actual[failStart] == expected[failStart]; failStart++) ; - message_ += createDifferenceAtPosString(actual, failStart); + size_t failStartPrintable; + for (failStartPrintable = 0; printableActual.at(failStartPrintable) == printableExpected.at(failStartPrintable); failStartPrintable++) + ; + message_ += createDifferenceAtPosString(printableActual, failStartPrintable, failStart); } } @@ -346,13 +325,21 @@ StringEqualNoCaseFailure::StringEqualNoCaseFailure(UtestShell* test, const char* { message_ = createUserText(text); - message_ += createButWasString(StringFromOrNull(expected), StringFromOrNull(actual)); + SimpleString printableExpected = PrintableStringFromOrNull(expected); + SimpleString printableActual = PrintableStringFromOrNull(actual); + + message_ += createButWasString(printableExpected, printableActual); if((expected) && (actual)) { size_t failStart; for (failStart = 0; SimpleString::ToLower(actual[failStart]) == SimpleString::ToLower(expected[failStart]); failStart++) ; - message_ += createDifferenceAtPosString(actual, failStart); + size_t failStartPrintable; + for (failStartPrintable = 0; + SimpleString::ToLower(printableActual.at(failStartPrintable)) == SimpleString::ToLower(printableExpected.at(failStartPrintable)); + failStartPrintable++) + ; + message_ += createDifferenceAtPosString(printableActual, failStartPrintable, failStart); } } @@ -362,13 +349,15 @@ BinaryEqualFailure::BinaryEqualFailure(UtestShell* test, const char* fileName, s { message_ = createUserText(text); - message_ += createButWasString(StringFromBinaryOrNull(expected, size), StringFromBinaryOrNull(actual, size)); + SimpleString actualHex = StringFromBinaryOrNull(actual, size); + + message_ += createButWasString(StringFromBinaryOrNull(expected, size), actualHex); if ((expected) && (actual)) { size_t failStart; for (failStart = 0; actual[failStart] == expected[failStart]; failStart++) ; - message_ += createDifferenceAtPosString(StringFromBinary(actual, size), failStart, DIFFERENCE_BINARY); + message_ += createDifferenceAtPosString(actualHex, (failStart * 3 + 1), failStart); } } diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 8a5d8f50d..f8a5a9c97 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -294,6 +294,14 @@ TEST(SimpleString, lowerCase) STRCMP_EQUAL("AbCdEfG1234", s1.asCharString()); } +TEST(SimpleString, printable) +{ + SimpleString s1("ABC\01\06\a\n\r\b\t\v\f\x0E\x1F\x7F""abc"); + SimpleString s2(s1.printable()); + STRCMP_EQUAL("ABC\\x01\\x06\\a\\n\\r\\b\\t\\v\\f\\x0E\\x1F\\x7Fabc", s2.asCharString()); + STRCMP_EQUAL("ABC\01\06\a\n\r\b\t\v\f\x0E\x1F\x7F""abc", s1.asCharString()); +} + TEST(SimpleString, Addition) { SimpleString s1("hello!"); @@ -578,6 +586,11 @@ TEST(SimpleString, NULLReportsNullString) STRCMP_EQUAL("(null)", StringFromOrNull((char*) NULLPTR).asCharString()); } +TEST(SimpleString, NULLReportsNullStringPrintable) +{ + STRCMP_EQUAL("(null)", PrintableStringFromOrNull((char*) NULLPTR).asCharString()); +} + TEST(SimpleString, Booleans) { SimpleString s1(StringFrom(true)); diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index 5fe53fc6c..a33bad543 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -212,10 +212,10 @@ TEST(TestFailure, StringsEqualFailureWithNewLinesAndTabs) "StringWith\t\nDifferentString", "StringWith\t\ndifferentString", ""); - FAILURE_EQUAL("expected \n" - "\tbut was \n" - "\tdifference starts at position 12 at: \n" - "\t \t\n^", f); + FAILURE_EQUAL("expected \n" + "\tbut was \n" + "\tdifference starts at position 12 at: \n" + "\t ^", f); } TEST(TestFailure, StringsEqualFailureInTheMiddle) From eff6de184b60403ee02b973e0e506098bdfe4f7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Mon, 16 Nov 2020 23:51:08 +0100 Subject: [PATCH 0621/1093] Refactored SimpleString::printable --- include/CppUTest/SimpleString.h | 4 +++ src/CppUTest/SimpleString.cpp | 62 +++++++++++++++++++++------------ 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 916b1e073..6cacf9559 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -127,6 +127,10 @@ class SimpleString static bool isDigit(char ch); static bool isSpace(char ch); static bool isUpper(char ch); + static bool isControl(char ch); + static bool isControlWithShortEscapeSequence(char ch); + + size_t getPrintableSize() const; }; class SimpleStringCollection diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index d1347c303..1f2928f2d 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -424,7 +424,7 @@ void SimpleString::replace(const char* to, const char* with) SimpleString SimpleString::printable() const { - const char* shortEscapeCodes[] = + static const char* shortEscapeCodes[] = { "\\a", "\\b", @@ -435,35 +435,20 @@ SimpleString SimpleString::printable() const "\\r" }; - size_t str_size = size(); - size_t new_str_size = str_size; - - for (size_t i = 0; i < str_size; i++) - { - unsigned char c = (unsigned char) buffer_[i]; - if ((c >= 0x07) && (c <= 0x0D)) - { - new_str_size += 1; - } - else if ((c < 0x20) || (c == 0x7F)) - { - new_str_size += 3; - } - } - SimpleString result; - result.setInternalBufferToNewBuffer(new_str_size + 1); + result.setInternalBufferToNewBuffer(getPrintableSize() + 1); + size_t str_size = size(); size_t j = 0; for (size_t i = 0; i < str_size; i++) { - unsigned char c = (unsigned char) buffer_[i]; - if ((c >= 0x07) && (c <= 0x0D)) + char c = buffer_[i]; + if (isControlWithShortEscapeSequence(c)) { - StrNCpy(&result.buffer_[j], shortEscapeCodes[c - 0x07], 2); + StrNCpy(&result.buffer_[j], shortEscapeCodes[(unsigned char)(c - '\a')], 2); j += 2; } - else if ((c < 0x20) || (c == 0x7F)) + else if (isControl(c)) { SimpleString hexEscapeCode = StringFromFormat("\\x%02X ", c); StrNCpy(&result.buffer_[j], hexEscapeCode.asCharString(), 4); @@ -471,7 +456,7 @@ SimpleString SimpleString::printable() const } else { - result.buffer_[j] = (char) c; + result.buffer_[j] = c; j++; } } @@ -480,6 +465,27 @@ SimpleString SimpleString::printable() const return result; } +size_t SimpleString::getPrintableSize() const +{ + size_t str_size = size(); + size_t printable_str_size = str_size; + + for (size_t i = 0; i < str_size; i++) + { + char c = buffer_[i]; + if (isControlWithShortEscapeSequence(c)) + { + printable_str_size += 1; + } + else if (isControl(c)) + { + printable_str_size += 3; + } + } + + return printable_str_size; +} + SimpleString SimpleString::lowerCase() const { SimpleString str(*this); @@ -644,6 +650,16 @@ bool SimpleString::isUpper(char ch) return 'A' <= ch && 'Z' >= ch; } +bool SimpleString::isControl(char ch) +{ + return ch < ' ' || ch == char(0x7F); +} + +bool SimpleString::isControlWithShortEscapeSequence(char ch) +{ + return '\a' <= ch && '\r' >= ch; +} + SimpleString StringFrom(bool value) { return SimpleString(StringFromFormat("%s", value ? "true" : "false")); From 544bc436d26588f57a736ce15adca2e87853a33f Mon Sep 17 00:00:00 2001 From: Stefan Eicher Date: Wed, 16 Dec 2020 11:20:33 +0100 Subject: [PATCH 0622/1093] add missing PlatformSpecificSrand and PlatformSpecificRand --- src/Platforms/armcc/UtestPlatform.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Platforms/armcc/UtestPlatform.cpp b/src/Platforms/armcc/UtestPlatform.cpp index 2e531c0c3..021db2c52 100644 --- a/src/Platforms/armcc/UtestPlatform.cpp +++ b/src/Platforms/armcc/UtestPlatform.cpp @@ -159,6 +159,9 @@ void (*PlatformSpecificFree)(void* memory) = free; void* (*PlatformSpecificMemCpy)(void*, const void*, size_t) = memcpy; void* (*PlatformSpecificMemset)(void*, int, size_t) = memset; +void (*PlatformSpecificSrand)(unsigned int) = srand; +int (*PlatformSpecificRand)(void) = rand; + static int IsNanImplementation(double d) { return isnan(d); From 89bf9d2141f427787186aa50f2b62f65e10a3a63 Mon Sep 17 00:00:00 2001 From: Stefan Eicher Date: Wed, 16 Dec 2020 11:26:20 +0100 Subject: [PATCH 0623/1093] =?UTF-8?q?fix=20missing=C2=A0=20${CMAKE=5FCURRE?= =?UTF-8?q?NT=5FLIST=5FDIR}?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/CppUTest/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 81eda28df..a4dd95af8 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -24,7 +24,7 @@ add_library(CppUTest if (CPP_PLATFORM) target_sources(CppUTest PRIVATE - ../Platforms/${CPP_PLATFORM}/UtestPlatform.cpp + ${CMAKE_CURRENT_LIST_DIR}/../Platforms/${CPP_PLATFORM}/UtestPlatform.cpp ) endif(CPP_PLATFORM) From 54d5992abc52d913de01cf94b4c46a864a19c5d3 Mon Sep 17 00:00:00 2001 From: Frank Yang Date: Fri, 18 Dec 2020 21:39:30 +0800 Subject: [PATCH 0624/1093] fix typo "exaples" to "examples" --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 309ead1d7..5b039f977 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,7 +74,7 @@ option(TESTS "Compile and make tests for the code?" ON) option(TESTS_DETAILED "Run each test separately instead of grouped?" OFF) option(TESTS_BUILD_DISCOVER "Build time test discover" ON) -option(EXAMPLES "Compile and make exaples?" OFF) +option(EXAMPLES "Compile and make examples?" OFF) option(VERBOSE_CONFIG "Print configuration to stdout during generation" ON) From 12ec9230fba90e4e6a1e14dc6f42a9d7f4be1338 Mon Sep 17 00:00:00 2001 From: fazl <5173704+fazl@users.noreply.github.com> Date: Wed, 23 Dec 2020 16:39:52 +0100 Subject: [PATCH 0625/1093] Update README.txt fixing chmod command syntax --- scripts/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/README.txt b/scripts/README.txt index 2ca147527..c6adab6f0 100644 --- a/scripts/README.txt +++ b/scripts/README.txt @@ -14,7 +14,7 @@ Like this: You might have to add the execute privilege to the shell scripts. Like this: - chmod *.sh + chmod +x *.sh Using NewClass for example: cd to the directory where you want the files located From 81eddebe02ca76a6cce60a221be381df03d3a376 Mon Sep 17 00:00:00 2001 From: fazl <5173704+fazl@users.noreply.github.com> Date: Sun, 27 Dec 2020 13:32:09 +0100 Subject: [PATCH 0626/1093] Fix reference to CMakeLists.txt (add missing s) There is no CMakeList.txt file so I guess it was a typo on line 37.. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 649eb3998..312cc6ad9 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ You can use `make install` if you want to install CppUTest system-wide You can also use CMake, which also works for Windows Visual Studio. * Download latest version -* cmake CMakeList.txt +* cmake CMakeLists.txt * make Then to get started, you'll need to do the following: From 21c04768bbd7e82caff3aa2493e507f7b73d7e4f Mon Sep 17 00:00:00 2001 From: Carsten Frank Date: Wed, 20 Jan 2021 08:12:48 +0100 Subject: [PATCH 0627/1093] Fix Gcov filter - Filenames with 'File' --- scripts/filterGcov.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/filterGcov.sh b/scripts/filterGcov.sh index 2f6ec1d41..b3ff67fee 100755 --- a/scripts/filterGcov.sh +++ b/scripts/filterGcov.sh @@ -22,7 +22,7 @@ getRidOfCruft() { sed '-e s/^Lines.*://g' \ '-e s/^[0-9]\./ &/g' \ '-e s/^[0-9][0-9]\./ &/g' \ - '-e s/of.*File/ /g' \ + '-e s/of.\w[^'File']*File/ /g' \ "-e s/'//g" \ '-e s/^.*\/usr\/.*$//g' \ '-e s/^.*\.$//g' From dcfc4c26e5dc704cc291040b7b01135bcc975381 Mon Sep 17 00:00:00 2001 From: Diana Date: Mon, 1 Feb 2021 14:51:59 +0000 Subject: [PATCH 0628/1093] add missing clang check --- src/Platforms/Gcc/UtestPlatform.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 430da5b16..90192ff91 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -175,8 +175,10 @@ static int PlatformSpecificSetJmpImplementation(void (*function) (void* data), v * MacOSX clang 3.0 doesn't seem to recognize longjmp and thus complains about _no_return_. * The later clang compilers complain when it isn't there. So only way is to check the clang compiler here :( */ -#if !((__clang_major__ == 3) && (__clang_minor__ == 0)) -_no_return_ +#ifdef __clang__ + #if !((__clang_major__ == 3) && (__clang_minor__ == 0)) + _no_return_ + #endif #endif static void PlatformSpecificLongJmpImplementation() { From 860a5a65735a2599db72b7651ebfdaf8f06415bc Mon Sep 17 00:00:00 2001 From: offa Date: Mon, 8 Feb 2021 18:01:28 +0100 Subject: [PATCH 0629/1093] Conan integration example added. --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index 312cc6ad9..a4df81cb2 100644 --- a/README.md +++ b/README.md @@ -200,6 +200,33 @@ TEST(ClassName, Create) There are some scripts that are helpful in creating your initial h, cpp, and Test files. See scripts/README.TXT +## Conan + +CppUTest is available through [conan-center](https://conan.io/center/cpputest). + +##### conanfile.txt + +```ini +[requires] +cpputest/4.0 + +[generators] +cmake_find_package +cmake_paths +``` + +##### CMake + +```cmake +find_package(CppUTest REQUIRED) + +add_executable(example_test ExampleTest.cpp) + +target_link_libraries(example_test PRIVATE + CppUTest::CppUTest + CppUTest::CppUTestExt) +``` + ## Integration as external CMake project From e80293d486e017db9855f94a864e63eb89361be6 Mon Sep 17 00:00:00 2001 From: offa Date: Mon, 8 Feb 2021 18:05:54 +0100 Subject: [PATCH 0630/1093] Readme badges consolidated. --- README.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a4df81cb2..24d0e538e 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,15 @@ CppUTest ======== -CppUTest unit testing and mocking framework for C/C++ +[![Build Status](https://travis-ci.org/cpputest/cpputest.png?branch=master)](https://travis-ci.org/cpputest/cpputest) +[![Build status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) +[![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) -[More information on the project page](http://cpputest.github.com) -Travis Linux build status: -[![Build Status](https://travis-ci.org/cpputest/cpputest.png?branch=master)](https://travis-ci.org/cpputest/cpputest) +CppUTest unit testing and mocking framework for C/C++ -AppVeyor Windows build status: -[![Build status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) +[More information on the project page](http://cpputest.github.com) -Coverage: -[![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) Slack channel: [Join if link not expired](https://join.slack.com/t/cpputest/shared_invite/zt-epq97u9h-6yBQHHl2cvUADjEENtdASw) From cd54065a5935f14376ecf08a0407d9426246405b Mon Sep 17 00:00:00 2001 From: offa Date: Mon, 8 Feb 2021 18:10:22 +0100 Subject: [PATCH 0631/1093] Conan shield added. --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 24d0e538e..bbc73fb8e 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ CppUTest [![Build Status](https://travis-ci.org/cpputest/cpputest.png?branch=master)](https://travis-ci.org/cpputest/cpputest) [![Build status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) [![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) +[![Conan Center](https://img.shields.io/badge/conan-center-blue.svg)][conan-center] CppUTest unit testing and mocking framework for C/C++ @@ -199,7 +200,7 @@ Test files. See scripts/README.TXT ## Conan -CppUTest is available through [conan-center](https://conan.io/center/cpputest). +CppUTest is available through [conan-center][conan-center]. ##### conanfile.txt @@ -248,3 +249,5 @@ It can be used then like so: add_executable(run_tests UnitTest1.cpp UnitTest2.cpp) target_link_libraries(run_tests PRIVATE CppUTest CppUTestExt) ``` + +[conan-center]: https://conan.io/center/cpputest From c12a0bb2ce83487e2cb5a38b0da767c530b81b6d Mon Sep 17 00:00:00 2001 From: offa Date: Thu, 11 Feb 2021 16:36:33 +0100 Subject: [PATCH 0632/1093] Conan package badge changed, showing the version now. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bbc73fb8e..743a4626a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ CppUTest [![Build Status](https://travis-ci.org/cpputest/cpputest.png?branch=master)](https://travis-ci.org/cpputest/cpputest) [![Build status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) [![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) -[![Conan Center](https://img.shields.io/badge/conan-center-blue.svg)][conan-center] +[![ConanCenter package](https://repology.org/badge/version-for-repo/conancenter/cpputest.svg)](https://conan.io/center/cpputest) CppUTest unit testing and mocking framework for C/C++ From 7fc2a5e18e5567df67a135d6a7fe6311f92a9660 Mon Sep 17 00:00:00 2001 From: Mark Furland Date: Tue, 2 Mar 2021 10:05:43 -0500 Subject: [PATCH 0633/1093] make test shows test binary return codes Previously if your tests segfaulted, `make test` would return successfully, and print a simple warning in white text mixed in with all the other output. This checks the return code from the test binary and prints a warning if it's nonzero. --- build/MakefileWorker.mk | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index 6c7c90ab6..b11a95fc2 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -494,11 +494,14 @@ $(TARGET_LIB): $(OBJ) $(SILENCE)$(AR) $(ARFLAGS) $@ $^ $(SILENCE)$(RANLIB) $@ +TEST_RUN_RETURN_CODE_FILE:=$(shell mktemp /tmp/cpputestResult.XXX) test: $(TEST_TARGET) - $(RUN_TEST_TARGET) | tee $(TEST_OUTPUT) + ($(RUN_TEST_TARGET); echo $$? > $(TEST_RUN_RETURN_CODE_FILE)) | tee $(TEST_OUTPUT) + @ret=$$(cat $(TEST_RUN_RETURN_CODE_FILE)); rm $(TEST_RUN_RETURN_CODE_FILE); if [ "$$ret" -ne 0 ]; then echo "$$(tput setaf 1)$(TEST_TARGET) returned $${ret}$$(tput sgr0)"; fi; exit $$ret vtest: $(TEST_TARGET) - $(RUN_TEST_TARGET) -v | tee $(TEST_OUTPUT) + ($(RUN_TEST_TARGET) -v; echo $$? > $(TEST_RUN_RETURN_CODE_FILE)) | tee $(TEST_OUTPUT) + @ret=$$(cat $(TEST_RUN_RETURN_CODE_FILE)); rm $(TEST_RUN_RETURN_CODE_FILE); if [ "$$ret" -ne 0 ]; then echo "$$(tput setaf 1)$(TEST_TARGET) returned $${ret}$$(tput sgr0)"; fi; exit $$ret $(CPPUTEST_OBJS_DIR)/%.o: %.cc @echo compiling $(notdir $<) From fa714ee67d5bb00d34a52d4c8a0a55fd1cd301da Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 2 Mar 2021 17:10:30 +0100 Subject: [PATCH 0634/1093] CodeQL Github Action build added. --- .github/workflows/codeql.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 000000000..bcd82f13b --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,30 @@ +name: codeql + +on: + push: + pull_request: + schedule: + - cron: '0 5 * * 3' + +jobs: + codeql: + runs-on: ubuntu-20.04 + env: + CC: gcc-10 + CXX: g++-10 + name: "CodeQL" + steps: + - name: Checkout + uses: actions/checkout@master + - name: CodeQL Initialization + uses: github/codeql-action/init@v1 + with: + languages: cpp + queries: +security-and-quality + - name: Build + run: | + mkdir _build && cd _build + cmake -DWERROR=ON -DCMAKE_CXX_STANDARD=17 .. + make -j2 + - name: CodeQL Analysis + uses: github/codeql-action/analyze@v1 From 62a6e20bbf9596c63549e83f51a6709e36fb9467 Mon Sep 17 00:00:00 2001 From: Mark Furland Date: Tue, 2 Mar 2021 17:10:11 -0500 Subject: [PATCH 0635/1093] Fix clang version check and remove clang 12 warning The clang version check in build/MakefileWorker.mk only worked for apple clang, so this changes the version checking to work with apple, debian, and ubuntu clang version strings. Additionally, clang 12 added -Wpoison-system-directories, which warns if you if you include stuff from /usr/local/include when doing a cross compile. Apple clang thinks it's always doing a cross compile for some reason, so that always complains. Closes #1456 --- build/MakefileWorker.mk | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index 6c7c90ab6..0e5cbfd20 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -201,10 +201,11 @@ ifeq ($(COMPILER_NAME),$(CLANG_STR)) CPPUTEST_CXX_WARNINGFLAGS += -Weverything -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables -Wno-old-style-cast -Wno-c++11-long-long -Wno-c++98-compat-pedantic -Wno-reserved-id-macro -Wno-keyword-macro CPPUTEST_C_WARNINGFLAGS += -Weverything -Wno-padded -# Clang "7" or newer (Xcode 7 or newer command-line tools) introduced new warnings by default that don't exist on previous versions of clang and cause errors when present. -CLANG_VERSION := $(shell echo $(CC_VERSION_OUTPUT) | grep -o 'clang-[0-9][0-9][0-9]*.') -CLANG_VERSION_NUM := $(subst .,,$(subst clang-,,$(CLANG_VERSION))) -CLANG_VERSION_NUM_GT_700 := $(shell [[ $(CLANG_VERSION_NUM) -ge 700 ]] && echo Y) +# Clang 7 and 12 introduced new warnings by default that don't exist on previous versions of clang and cause errors when present. +CLANG_VERSION := $(shell echo $(CC_VERSION_OUTPUT) | sed -n 's/.* \([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p') +CLANG_VERSION_NUM := $(subst .,,$(CLANG_VERSION)) +CLANG_VERSION_NUM_GT_700 := $(shell [ "$(CLANG_VERSION_NUM)" -ge 700 ] && echo Y || echo N) +CLANG_VERSION_NUM_GT_1200 := $(shell [ "$(CLANG_VERSION_NUM)" -ge 1200 ] && echo Y || echo N) ifeq ($(CLANG_VERSION_NUM_GT_700), Y) # -Wno-reserved-id-macro -> Many CppUTest macros start with __, which is a reserved namespace @@ -212,6 +213,11 @@ ifeq ($(CLANG_VERSION_NUM_GT_700), Y) CPPUTEST_CXX_WARNINGFLAGS += -Wno-reserved-id-macro -Wno-keyword-macro CPPUTEST_C_WARNINGFLAGS += -Wno-reserved-id-macro -Wno-keyword-macro endif +ifeq ($(CLANG_VERSION_NUM_GT_1200), Y) +# -Wno-poison-system-directories -> Apparently apple clang thinks everything is a cross compile, making this useless + CPPUTEST_CXX_WARNINGFLAGS += -Wno-poison-system-directories + CPPUTEST_C_WARNINGFLAGS += -Wno-poison-system-directories +endif endif # Uhm. Maybe put some warning flags for SunStudio here? From 48bc7b6a45c75312b5d3ac0aad201c2ae0f6a040 Mon Sep 17 00:00:00 2001 From: "Steve Hill (Wireless)" Date: Wed, 3 Mar 2021 16:55:55 +0000 Subject: [PATCH 0636/1093] Change conditional compilation to (hopefully) fix the cron builds --- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index ec83f371d..973c46098 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -128,7 +128,7 @@ TEST_GROUP(MemoryLeakOverridesToBeUsedInProductionCode) }; -#if ! defined CPPUTEST_MEM_LEAK_DETECTION_DISABLED || ! CPPUTEST_MEM_LEAK_DETECTION_DISABLED +#if CPPUTEST_USE_MEM_LEAK_DETECTION #ifdef CPPUTEST_USE_NEW_MACROS #undef new From f50d7bbbc6923563ae4915cec8a343610d0c4e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eugenio=20Mir=C3=B3?= Date: Tue, 20 Apr 2021 10:46:54 -0300 Subject: [PATCH 0637/1093] fix project page link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 743a4626a..b47c71f0d 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ CppUTest CppUTest unit testing and mocking framework for C/C++ -[More information on the project page](http://cpputest.github.com) +[More information on the project page](https://cpputest.github.io) Slack channel: From 9eb6645dcd090e172c91fb38888142ef0458634e Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 5 May 2021 16:51:22 +0200 Subject: [PATCH 0638/1093] Disable warnings on test cases, actually testing the errors. --- src/CppUTest/Utest.cpp | 16 +++++++++++++++- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 15 +++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 90d3532b0..2d8061e6b 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -30,6 +30,10 @@ #include "CppUTest/PlatformSpecificFunctions.h" #include "CppUTest/TestOutput.h" +#if defined(__GNUC__) && __GNUC__ >= 11 +# define NEEDS_DISABLE_NULL_WARNING +#endif /* GCC >= 11 */ + bool doubles_equal(double d1, double d2, double threshold) { if (PlatformSpecificIsNan(d1) || PlatformSpecificIsNan(d2) || PlatformSpecificIsNan(threshold)) @@ -158,10 +162,20 @@ UtestShell::~UtestShell() } // LCOV_EXCL_START - actually covered but not in .gcno due to race condition +#ifdef NEEDS_DISABLE_NULL_WARNING +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wnonnull" +#endif /* NEEDS_DISABLE_NULL_WARNING */ + static void defaultCrashMethod() { - UtestShell* ptr = (UtestShell*) NULLPTR; ptr->countTests(); + UtestShell* ptr = (UtestShell*) NULLPTR; + ptr->countTests(); } + +#ifdef NEEDS_DISABLE_NULL_WARNING +# pragma GCC diagnostic pop +#endif /* NEEDS_DISABLE_NULL_WARNING */ // LCOV_EXCL_STOP static void (*pleaseCrashMeRightNow) () = defaultCrashMethod; diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index 973c46098..5e3b4db22 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -10,6 +10,11 @@ #include "CppUTest/TestHarness_c.h" #include "AllocationInCFile.h" +#if defined(__GNUC__) && __GNUC__ >= 11 +# define NEEDS_DISABLE_FREE_NON_HEEP_WARNING +#endif /* GCC >= 11 */ + + TEST_GROUP(BasicBehavior) { }; @@ -60,12 +65,22 @@ TEST(BasicBehavior, DeleteWithSizeParameterWorks) } #endif +#ifdef NEEDS_DISABLE_FREE_NON_HEEP_WARNING +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wfree-nonheap-object" +#endif /* NEEDS_DISABLE_FREE_NON_HEEP_WARNING */ + static void deleteUnallocatedMemory() { delete (char*) 0x1234678; FAIL("Should never come here"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE +#ifdef NEEDS_DISABLE_FREE_NON_HEEP_WARNING +# pragma GCC diagnostic pop +#endif /* NEEDS_DISABLE_FREE_NON_HEEP_WARNING */ + + TEST(BasicBehavior, deleteWillNotThrowAnExceptionWhenDeletingUnallocatedMemoryButCanStillCauseTestFailures) { /* From 5b3353da5e65695d64fb3ce3fa0e3971973ae820 Mon Sep 17 00:00:00 2001 From: arthur Date: Sat, 3 Jul 2021 17:25:02 +0200 Subject: [PATCH 0639/1093] Fix compile gcc from cygwin Let CMake handle the windows library suffix (.lib or .a) --- src/CppUTest/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index a4dd95af8..aa0d25900 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -69,7 +69,7 @@ set_target_properties(CppUTest PROPERTIES PUBLIC_HEADER "${CppUTest_headers}") if (WIN32) - target_link_libraries(CppUTest winmm.lib) + target_link_libraries(CppUTest winmm) endif (WIN32) install(TARGETS CppUTest EXPORT CppUTestTargets From 4117e83ab0d97279d02d92cb8d8e533859400380 Mon Sep 17 00:00:00 2001 From: Filip Demski Date: Mon, 19 Jul 2021 14:23:00 +0200 Subject: [PATCH 0640/1093] Added check for waitpid availability --- CMakeLists.txt | 5 +++++ src/Platforms/Gcc/UtestPlatform.cpp | 5 +++-- tests/CppUTest/UtestPlatformTest.cpp | 3 ++- tests/CppUTest/UtestTest.cpp | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b039f977..7ed077c60 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,11 @@ if(HAVE_FORK) add_definitions(-DCPPUTEST_HAVE_FORK) endif(HAVE_FORK) +check_function_exists(waitpid HAVE_WAITPID) +if(HAVE_WAITPID) + add_definitions(-DCPPUTEST_HAVE_WAITPID) +endif(HAVE_WAITPID) + check_function_exists(gettimeofday HAVE_GETTIMEOFDAY) if(HAVE_GETTIMEOFDAY) add_definitions(-DCPPUTEST_HAVE_GETTIMEOFDAY=1) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 90192ff91..06d226447 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -37,7 +37,7 @@ #ifdef CPPUTEST_HAVE_GETTIMEOFDAY #include #endif -#ifdef CPPUTEST_HAVE_FORK +#if defined(CPPUTEST_HAVE_FORK) && defined(CPPUTEST_HAVE_WAITPID) #include #include #include @@ -61,7 +61,8 @@ static jmp_buf test_exit_jmp_buf[10]; static int jmp_buf_index = 0; -#ifndef CPPUTEST_HAVE_FORK +// There is a possibility that a compiler provides fork but not waitpid. +#if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin*, TestResult* result) { diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index bba56e9e7..408c06dcf 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -44,7 +44,8 @@ TEST_GROUP(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess) TestTestingFixture fixture; }; -#ifndef CPPUTEST_HAVE_FORK +// There is a possibility that a compiler provides fork but not waitpid. +#if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, DummyFailsWithMessage) { diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 195097719..cfb14f0c6 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -243,7 +243,8 @@ TEST(UtestShell, RunInSeparateProcessTest) fixture.assertPrintContains("Failed in separate process"); } -#ifndef CPPUTEST_HAVE_FORK +// There is a possibility that a compiler provides fork but not waitpid. +#if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) IGNORE_TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) {} From a1fc044a06332299a85caa1baf19f9ee50220dff Mon Sep 17 00:00:00 2001 From: Filip Demski Date: Tue, 20 Jul 2021 12:54:31 +0200 Subject: [PATCH 0641/1093] Added waitpid check to configure.ac --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index a6cd8328e..7447dc543 100644 --- a/configure.ac +++ b/configure.ac @@ -62,7 +62,7 @@ AC_TYPE_LONG_LONG_INT # Checks for library functions. AC_FUNC_FORK -AC_CHECK_FUNCS([gettimeofday memset strstr strdup pthread_mutex_lock]) +AC_CHECK_FUNCS([waitpid gettimeofday memset strstr strdup pthread_mutex_lock]) AC_CHECK_PROG([CPPUTEST_HAS_GCC], [gcc], [yes], [no]) AC_CHECK_PROG([CPPUTEST_HAS_CLANG], [clang], [yes], [no]) From ff2b504af1fdfe5954530ead49ffd81151897d78 Mon Sep 17 00:00:00 2001 From: Enes Dolap Date: Fri, 6 Aug 2021 15:11:40 +0300 Subject: [PATCH 0642/1093] fix c2000 compile errors and added platform specific functions for c2000. --- include/CppUTest/PlatformSpecificFunctions_c.h | 2 ++ src/Platforms/C2000/UtestPlatform.cpp | 16 +++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/include/CppUTest/PlatformSpecificFunctions_c.h b/include/CppUTest/PlatformSpecificFunctions_c.h index b39d88fd3..35425ad0a 100644 --- a/include/CppUTest/PlatformSpecificFunctions_c.h +++ b/include/CppUTest/PlatformSpecificFunctions_c.h @@ -82,6 +82,8 @@ extern void* (*PlatformSpecificMemset)(void* mem, int c, size_t size); typedef void* PlatformSpecificMutex; extern PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void); +extern void (*PlatformSpecificSrand)(unsigned int); +extern int (*PlatformSpecificRand)(void); extern void (*PlatformSpecificMutexLock)(PlatformSpecificMutex mtx); extern void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex mtx); extern void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex mtx); diff --git a/src/Platforms/C2000/UtestPlatform.cpp b/src/Platforms/C2000/UtestPlatform.cpp index 543ed1eb0..ec53d81ec 100644 --- a/src/Platforms/C2000/UtestPlatform.cpp +++ b/src/Platforms/C2000/UtestPlatform.cpp @@ -36,8 +36,8 @@ #undef realloc #undef strdup #undef strndup - #define far // eliminate "meaningless type qualifier" warning +extern "C" { #include #include #include @@ -45,8 +45,8 @@ #include #include #include +} #undef far - #include "CppUTest/PlatformSpecificFunctions.h" static jmp_buf test_exit_jmp_buf[10]; @@ -176,22 +176,22 @@ extern void (*PlatformSpecificFlush)(void) = CL2000Flush; static void* C2000Malloc(size_t size) { - return (void*)far_malloc((unsigned long)size); + return (void*)malloc((unsigned long)size); } static void* C2000Realloc (void* memory, size_t size) { - return (void*)far_realloc((long)memory, (unsigned long)size); + return (void*)realloc(memory, (unsigned long)size); } static void C2000Free(void* memory) { - far_free((long)memory); + free(memory); } static void* C2000MemCpy(void* s1, const void* s2, size_t size) { - return (void*)far_memlcpy((long)s1, (long)s2, size); + return (void*)memcpy(s1, s2, size); } static void* C2000Memset(void* mem, int c, size_t size) @@ -247,8 +247,10 @@ static void DummyMutexDestroy(PlatformSpecificMutex mtx) } PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void) = DummyMutexCreate; +void (*PlatformSpecificSrand)(unsigned int) = srand; +int (*PlatformSpecificRand)(void) = rand; void (*PlatformSpecificMutexLock)(PlatformSpecificMutex) = DummyMutexLock; void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex) = DummyMutexUnlock; void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex) = DummyMutexDestroy; -} \ No newline at end of file +} From 3a5ed43468a94127ef6884a05a512ccf83eccf47 Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 31 Aug 2021 17:13:54 +0200 Subject: [PATCH 0643/1093] Update GH Action branch. --- .github/workflows/codeql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index bcd82f13b..7756a3c62 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -15,7 +15,7 @@ jobs: name: "CodeQL" steps: - name: Checkout - uses: actions/checkout@master + uses: actions/checkout@main - name: CodeQL Initialization uses: github/codeql-action/init@v1 with: From a72afe8e24f31ff2389098ba195aa85b6786802d Mon Sep 17 00:00:00 2001 From: geerjasaumya <77062378+geerjasaumya@users.noreply.github.com> Date: Fri, 1 Oct 2021 07:54:41 +0530 Subject: [PATCH 0644/1093] Update README_CppUTest_for_C.txt --- README_CppUTest_for_C.txt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README_CppUTest_for_C.txt b/README_CppUTest_for_C.txt index 578c348e8..8674364ce 100644 --- a/README_CppUTest_for_C.txt +++ b/README_CppUTest_for_C.txt @@ -7,10 +7,9 @@ common problems to solve. ---++ Using extern "C" When including C-header files or when declaring C-variables and routines -in a .cpp file, you'll have to surround them with an extern "C". This is -because the C++ linker works different than the C linker and you need to -instruct the compiler about this. If you do NOT do this, you will probably -get a linker error, like unresolved symbols, for a routine that you did +in a .cpp file, you'll need to enclose them within an extern "C". This is +because the C++ linker works differently than the C linker and you need to +instruct the compiler about this else you may encounter a linker error. Like unresolved symbols for a routine that you did implement. An example: @@ -25,10 +24,10 @@ extern "C" { CppUTest comes with a file called TestHarness_c.h which contains a couple of routines that can be used in C code, like C-versions of the CHECK-macro's. -The file also contains malloc and free routines that can be used for using +The file also contains malloc and free routines that can be used for accessing the CppUTest memory leak detector. These routines should be used instead of the normal malloc/free. This can be achieved by #defining them somewhere, for -examples as a compiler option: -Dmalloc=cpputest_malloc. +example as a compiler option: -Dmalloc=cpputest_malloc. It's important to remember that TestHarness_c.h is a C-header file. It can be used in C code, but when using in C++ code, you need to use extern "C" before From d0462293760f1fd3735e9183099a5e55ec1f649a Mon Sep 17 00:00:00 2001 From: offa Date: Mon, 18 Oct 2021 17:35:57 +0200 Subject: [PATCH 0645/1093] Fix reserved identifier usage --- tests/CppUTest/MemoryLeakWarningTest.cpp | 18 +- tests/CppUTest/SimpleStringCacheTest.cpp | 12 +- tests/CppUTest/SimpleStringTest.cpp | 12 +- tests/CppUTest/TestHarness_cTest.cpp | 144 ++++++------- tests/CppUTest/TestMemoryAllocatorTest.cpp | 32 +-- tests/CppUTest/TestUTestMacro.cpp | 238 ++++++++++----------- tests/CppUTest/TestUTestStringMacro.cpp | 101 +++++---- tests/CppUTest/UtestPlatformTest.cpp | 21 +- tests/CppUTest/UtestTest.cpp | 46 ++-- tests/CppUTestExt/GTest1Test.cpp | 24 +-- tests/CppUTestExt/IEEE754PluginTest.cpp | 20 +- tests/CppUTestExt/MockFakeLongLong.cpp | 32 +-- tests/CppUTestExt/MockPluginTest.cpp | 4 +- 13 files changed, 351 insertions(+), 353 deletions(-) diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index 849e400ec..e219da682 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -99,7 +99,7 @@ TEST_GROUP(MemoryLeakWarningTest) } }; -static void _testTwoLeaks() +static void testTwoLeaks_() { leak1 = detector->allocMemory(allocator, 10); leak2 = (long*) (void*) detector->allocMemory(allocator, 4); @@ -109,7 +109,7 @@ static void _testTwoLeaks() TEST(MemoryLeakWarningTest, TwoLeaks) { - fixture->setTestFunction(_testTwoLeaks); + fixture->setTestFunction(testTwoLeaks_); fixture->runAllTests(); LONGS_EQUAL(1, fixture->getFailureCount()); @@ -119,7 +119,7 @@ TEST(MemoryLeakWarningTest, TwoLeaks) TEST(MemoryLeakWarningTest, TwoLeaks) { - fixture->setTestFunction(_testTwoLeaks); + fixture->setTestFunction(testTwoLeaks_); fixture->runAllTests(); LONGS_EQUAL(0, fixture->getFailureCount()); @@ -128,7 +128,7 @@ TEST(MemoryLeakWarningTest, TwoLeaks) #endif -static void _testLeakWarningWithPluginDisabled() +static void testLeakWarningWithPluginDisabled_() { memPlugin->expectLeaksInTest(1); leak1 = (char*) cpputest_malloc_location_with_leak_detection(10, __FILE__, __LINE__); @@ -136,7 +136,7 @@ static void _testLeakWarningWithPluginDisabled() TEST(MemoryLeakWarningTest, LeakWarningWithPluginDisabled) { - fixture->setTestFunction(_testLeakWarningWithPluginDisabled); + fixture->setTestFunction(testLeakWarningWithPluginDisabled_); MemoryLeakWarningPlugin::saveAndDisableNewDeleteOverloads(); @@ -151,7 +151,7 @@ TEST(MemoryLeakWarningTest, LeakWarningWithPluginDisabled) MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); } -static void _testIgnore2() +static void testIgnore2_() { memPlugin->expectLeaksInTest(2); leak1 = detector->allocMemory(allocator, 10); @@ -160,12 +160,12 @@ static void _testIgnore2() TEST(MemoryLeakWarningTest, Ignore2) { - fixture->setTestFunction(_testIgnore2); + fixture->setTestFunction(testIgnore2_); fixture->runAllTests(); LONGS_EQUAL(0, fixture->getFailureCount()); } -static void _failAndLeakMemory() +static void failAndLeakMemory_() { leak1 = detector->allocMemory(allocator, 10); FAIL(""); @@ -173,7 +173,7 @@ static void _failAndLeakMemory() TEST(MemoryLeakWarningTest, FailingTestDoesNotReportMemoryLeaks) { - fixture->setTestFunction(_failAndLeakMemory); + fixture->setTestFunction(failAndLeakMemory_); fixture->runAllTests(); LONGS_EQUAL(1, fixture->getFailureCount()); } diff --git a/tests/CppUTest/SimpleStringCacheTest.cpp b/tests/CppUTest/SimpleStringCacheTest.cpp index e44a44da6..1fd08d229 100644 --- a/tests/CppUTest/SimpleStringCacheTest.cpp +++ b/tests/CppUTest/SimpleStringCacheTest.cpp @@ -251,7 +251,7 @@ TEST(SimpleStringInternalCache, clearAllIncludingCurrentlyUsedMemoryAlsoReleases LONGS_EQUAL(3, accountant.totalDeallocationsOfSize(1234)); } -static void _deallocatingStringMemoryThatWasntAllocatedWithCache(SimpleStringInternalCache* cache, size_t allocationSize) +static void deallocatingStringMemoryThatWasntAllocatedWithCache_(SimpleStringInternalCache* cache, size_t allocationSize) { char* mem = defaultMallocAllocator()->alloc_memory(allocationSize, __FILE__, __LINE__); mem[0] = 'B'; @@ -264,7 +264,7 @@ static void _deallocatingStringMemoryThatWasntAllocatedWithCache(SimpleStringInt TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarning) { - testFunction.testFunction = _deallocatingStringMemoryThatWasntAllocatedWithCache; + testFunction.testFunction = deallocatingStringMemoryThatWasntAllocatedWithCache_; testFunction.allocationSize = 123; cache.setAllocator(allocator); @@ -277,7 +277,7 @@ TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWa } -static void _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache(SimpleStringInternalCache* cache, size_t allocationSize) +static void deallocatingStringMemoryTwiceThatWasntAllocatedWithCache_(SimpleStringInternalCache* cache, size_t allocationSize) { char* mem = defaultMallocAllocator()->alloc_memory(allocationSize, __FILE__, __LINE__); mem[0] = '\0'; @@ -288,7 +288,7 @@ static void _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache(SimpleStri TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarningButOnlyOnce) { - testFunction.testFunction = _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache; + testFunction.testFunction = deallocatingStringMemoryTwiceThatWasntAllocatedWithCache_; testFunction.allocationSize = 123; cache.setAllocator(allocator); @@ -299,7 +299,7 @@ TEST(SimpleStringInternalCache, deallocatingMemoryThatWasntAllocatedWhileCacheWa TEST(SimpleStringInternalCache, deallocatingLargeMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarning) { - testFunction.testFunction = _deallocatingStringMemoryThatWasntAllocatedWithCache; + testFunction.testFunction = deallocatingStringMemoryThatWasntAllocatedWithCache_; testFunction.allocationSize = 12345; cache.setAllocator(allocator); @@ -314,7 +314,7 @@ TEST(SimpleStringInternalCache, deallocatingLargeMemoryThatWasntAllocatedWhileCa TEST(SimpleStringInternalCache, deallocatingLargeMemoryThatWasntAllocatedWhileCacheWasInPlaceProducesWarningButOnlyOnce) { - testFunction.testFunction = _deallocatingStringMemoryTwiceThatWasntAllocatedWithCache; + testFunction.testFunction = deallocatingStringMemoryTwiceThatWasntAllocatedWithCache_; testFunction.allocationSize = 12345; cache.setAllocator(allocator); diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index f8a5a9c97..de5ee0518 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -105,19 +105,19 @@ TEST(GlobalSimpleStringMemoryAccountant, stop) POINTERS_EQUAL(originalAllocator, SimpleString::getStringAllocator()); } -static void _stopAccountant(GlobalSimpleStringMemoryAccountant* accountant) +static void stopAccountant_(GlobalSimpleStringMemoryAccountant* accountant) { accountant->stop(); } TEST(GlobalSimpleStringMemoryAccountant, stopWithoutStartWillFail) { - testFunction.testFunction_ = _stopAccountant; + testFunction.testFunction_ = stopAccountant_; fixture.runAllTests(); fixture.assertPrintContains("Global SimpleString allocator stopped without starting"); } -static void _changeAllocatorBetweenStartAndStop(GlobalSimpleStringMemoryAccountant* accountant) +static void changeAllocatorBetweenStartAndStop_(GlobalSimpleStringMemoryAccountant* accountant) { TestMemoryAllocator* originalAllocator = SimpleString::getStringAllocator(); accountant->start(); @@ -127,7 +127,7 @@ static void _changeAllocatorBetweenStartAndStop(GlobalSimpleStringMemoryAccounta TEST(GlobalSimpleStringMemoryAccountant, stopFailsWhenAllocatorWasChangedInBetween) { - testFunction.testFunction_ = _changeAllocatorBetweenStartAndStop; + testFunction.testFunction_ = changeAllocatorBetweenStartAndStop_; fixture.runAllTests(); fixture.assertPrintContains("GlobalStrimpleStringMemoryAccountant: allocator has changed between start and stop!"); } @@ -847,7 +847,7 @@ TEST(SimpleString, CollectionWritingToEmptyString) #ifdef CPPUTEST_64BIT -TEST(SimpleString, _64BitAddressPrintsCorrectly) +TEST(SimpleString, 64BitAddressPrintsCorrectly) { char* p = (char*) 0x0012345678901234; SimpleString expected("0x12345678901234"); @@ -878,7 +878,7 @@ TEST(SimpleString, BracketsFormattedHexStringFromForLongOnDifferentPlatform) /* * This test case cannot pass on 32 bit systems. */ -IGNORE_TEST(SimpleString, _64BitAddressPrintsCorrectly) +IGNORE_TEST(SimpleString, 64BitAddressPrintsCorrectly) { } diff --git a/tests/CppUTest/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp index 8ddf2047e..08be8400e 100644 --- a/tests/CppUTest/TestHarness_cTest.cpp +++ b/tests/CppUTest/TestHarness_cTest.cpp @@ -84,7 +84,7 @@ TEST_GROUP(TestHarness_c) } }; -static void _failBoolMethod() +static void failBoolMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_BOOL(1, 0); @@ -94,14 +94,14 @@ TEST(TestHarness_c, checkBool) { CHECK_EQUAL_C_BOOL(1, 1); CHECK_EQUAL_C_BOOL(1, 2); - fixture->setTestFunction(_failBoolMethod); + fixture->setTestFunction(failBoolMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected \n but was "); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failBoolTextMethod() +static void failBoolTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_BOOL_TEXT(1, 0, "BoolTestText"); @@ -111,7 +111,7 @@ TEST(TestHarness_c, checkBoolText) { CHECK_EQUAL_C_BOOL_TEXT(1, 1, "Text"); CHECK_EQUAL_C_BOOL_TEXT(1, 2, "Text"); - fixture->setTestFunction(_failBoolTextMethod); + fixture->setTestFunction(failBoolTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected \n but was "); fixture->assertPrintContains("arness_c"); @@ -119,7 +119,7 @@ TEST(TestHarness_c, checkBoolText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failIntMethod() +static void failIntMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_INT(1, 2); @@ -128,14 +128,14 @@ static void _failIntMethod() TEST(TestHarness_c, checkInt) { CHECK_EQUAL_C_INT(2, 2); - fixture->setTestFunction(_failIntMethod); + fixture->setTestFunction(failIntMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failIntTextMethod() +static void failIntTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_INT_TEXT(1, 2, "IntTestText"); @@ -144,7 +144,7 @@ static void _failIntTextMethod() TEST(TestHarness_c, checkIntText) { CHECK_EQUAL_C_INT_TEXT(2, 2, "Text"); - fixture->setTestFunction(_failIntTextMethod); + fixture->setTestFunction(failIntTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); @@ -152,7 +152,7 @@ TEST(TestHarness_c, checkIntText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failUnsignedIntMethod() +static void failUnsignedIntMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_UINT(1, 2); @@ -161,14 +161,14 @@ static void _failUnsignedIntMethod() TEST(TestHarness_c, checkUnsignedInt) { CHECK_EQUAL_C_UINT(2, 2); - fixture->setTestFunction(_failUnsignedIntMethod); + fixture->setTestFunction(failUnsignedIntMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failUnsignedIntTextMethod() +static void failUnsignedIntTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_UINT_TEXT(1, 2, "UnsignedIntTestText"); @@ -177,7 +177,7 @@ static void _failUnsignedIntTextMethod() TEST(TestHarness_c, checkUnsignedIntText) { CHECK_EQUAL_C_UINT_TEXT(2, 2, "Text"); - fixture->setTestFunction(_failUnsignedIntTextMethod); + fixture->setTestFunction(failUnsignedIntTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); @@ -185,7 +185,7 @@ TEST(TestHarness_c, checkUnsignedIntText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failLongIntMethod() +static void failLongIntMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_LONG(1, 2); @@ -194,14 +194,14 @@ static void _failLongIntMethod() TEST(TestHarness_c, checkLongInt) { CHECK_EQUAL_C_LONG(2, 2); - fixture->setTestFunction(_failLongIntMethod); + fixture->setTestFunction(failLongIntMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failLongIntTextMethod() +static void failLongIntTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_LONG_TEXT(1, 2, "LongIntTestText"); @@ -210,7 +210,7 @@ static void _failLongIntTextMethod() TEST(TestHarness_c, checkLongIntText) { CHECK_EQUAL_C_LONG_TEXT(2, 2, "Text"); - fixture->setTestFunction(_failLongIntTextMethod); + fixture->setTestFunction(failLongIntTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); @@ -218,7 +218,7 @@ TEST(TestHarness_c, checkLongIntText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failUnsignedLongIntMethod() +static void failUnsignedLongIntMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_ULONG(1, 2); @@ -227,14 +227,14 @@ static void _failUnsignedLongIntMethod() TEST(TestHarness_c, checkUnsignedLongInt) { CHECK_EQUAL_C_ULONG(2, 2); - fixture->setTestFunction(_failUnsignedLongIntMethod); + fixture->setTestFunction(failUnsignedLongIntMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failUnsignedLongIntTextMethod() +static void failUnsignedLongIntTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_ULONG_TEXT(1, 2, "UnsignedLongIntTestText"); @@ -243,7 +243,7 @@ static void _failUnsignedLongIntTextMethod() TEST(TestHarness_c, checkUnsignedLongIntText) { CHECK_EQUAL_C_ULONG_TEXT(2, 2, "Text"); - fixture->setTestFunction(_failUnsignedLongIntTextMethod); + fixture->setTestFunction(failUnsignedLongIntTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); @@ -253,7 +253,7 @@ TEST(TestHarness_c, checkUnsignedLongIntText) #ifdef CPPUTEST_USE_LONG_LONG -static void _failLongLongIntMethod() +static void failLongLongIntMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_LONGLONG(1, 2); @@ -262,14 +262,14 @@ static void _failLongLongIntMethod() TEST(TestHarness_c, checkLongLongInt) { CHECK_EQUAL_C_LONGLONG(2, 2); - fixture->setTestFunction(_failLongLongIntMethod); + fixture->setTestFunction(failLongLongIntMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failLongLongIntTextMethod() +static void failLongLongIntTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_LONGLONG_TEXT(1, 2, "LongLongTestText"); @@ -278,7 +278,7 @@ static void _failLongLongIntTextMethod() TEST(TestHarness_c, checkLongLongIntText) { CHECK_EQUAL_C_LONGLONG_TEXT(2, 2, "Text"); - fixture->setTestFunction(_failLongLongIntTextMethod); + fixture->setTestFunction(failLongLongIntTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); @@ -286,7 +286,7 @@ TEST(TestHarness_c, checkLongLongIntText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failUnsignedLongLongIntMethod() +static void failUnsignedLongLongIntMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_ULONGLONG(1, 2); @@ -295,14 +295,14 @@ static void _failUnsignedLongLongIntMethod() TEST(TestHarness_c, checkUnsignedLongLongInt) { CHECK_EQUAL_C_ULONGLONG(2, 2); - fixture->setTestFunction(_failUnsignedLongLongIntMethod); + fixture->setTestFunction(failUnsignedLongLongIntMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failUnsignedLongLongIntTextMethod() +static void failUnsignedLongLongIntTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_ULONGLONG_TEXT(1, 2, "UnsignedLongLongTestText"); @@ -311,7 +311,7 @@ static void _failUnsignedLongLongIntTextMethod() TEST(TestHarness_c, checkUnsignedLongLongIntText) { CHECK_EQUAL_C_ULONGLONG_TEXT(2, 2, "Text"); - fixture->setTestFunction(_failUnsignedLongLongIntTextMethod); + fixture->setTestFunction(failUnsignedLongLongIntTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1 (0x1)>\n but was <2 (0x2)>"); fixture->assertPrintContains("arness_c"); @@ -321,7 +321,7 @@ TEST(TestHarness_c, checkUnsignedLongLongIntText) #else -static void _failLongLongIntMethod() +static void failLongLongIntMethod_() { cpputest_longlong dummy_longlong; CHECK_EQUAL_C_LONGLONG(dummy_longlong, dummy_longlong); @@ -329,13 +329,13 @@ static void _failLongLongIntMethod() TEST(TestHarness_c, checkLongLongInt) { - fixture->setTestFunction(_failLongLongIntMethod); + fixture->setTestFunction(failLongLongIntMethod_); fixture->runAllTests(); fixture->assertPrintContains("is not supported"); fixture->assertPrintContains("arness_c"); } -static void _failLongLongIntTextMethod() +static void failLongLongIntTextMethod_() { cpputest_longlong dummy_longlong; CHECK_EQUAL_C_LONGLONG_TEXT(dummy_longlong, dummy_longlong, "Text"); @@ -343,13 +343,13 @@ static void _failLongLongIntTextMethod() TEST(TestHarness_c, checkLongLongIntText) { - fixture->setTestFunction(_failLongLongIntTextMethod); + fixture->setTestFunction(failLongLongIntTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("is not supported"); fixture->assertPrintContains("arness_c"); } -static void _failUnsignedLongLongIntMethod() +static void failUnsignedLongLongIntMethod_() { cpputest_ulonglong dummy_ulonglong; CHECK_EQUAL_C_ULONGLONG(dummy_ulonglong, dummy_ulonglong); @@ -357,13 +357,13 @@ static void _failUnsignedLongLongIntMethod() TEST(TestHarness_c, checkUnsignedLongLongInt) { - fixture->setTestFunction(_failUnsignedLongLongIntMethod); + fixture->setTestFunction(failUnsignedLongLongIntMethod_); fixture->runAllTests(); fixture->assertPrintContains("is not supported"); fixture->assertPrintContains("arness_c"); } -static void _failUnsignedLongLongIntTextMethod() +static void failUnsignedLongLongIntTextMethod_() { cpputest_ulonglong dummy_ulonglong; CHECK_EQUAL_C_ULONGLONG_TEXT(dummy_ulonglong, dummy_ulonglong, "Text"); @@ -371,7 +371,7 @@ static void _failUnsignedLongLongIntTextMethod() TEST(TestHarness_c, checkUnsignedLongLongIntText) { - fixture->setTestFunction(_failUnsignedLongLongIntTextMethod); + fixture->setTestFunction(failUnsignedLongLongIntTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("is not supported"); fixture->assertPrintContains("arness_c"); @@ -379,7 +379,7 @@ TEST(TestHarness_c, checkUnsignedLongLongIntText) #endif -static void _failRealMethod() +static void failRealMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_REAL(1.0, 2.0, 0.5); @@ -388,14 +388,14 @@ static void _failRealMethod() TEST(TestHarness_c, checkReal) { CHECK_EQUAL_C_REAL(1.0, 1.1, 0.5); - fixture->setTestFunction(_failRealMethod); + fixture->setTestFunction(failRealMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1>\n but was <2>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failRealTextMethod() +static void failRealTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_REAL_TEXT(1.0, 2.0, 0.5, "RealTestText"); @@ -404,7 +404,7 @@ static void _failRealTextMethod() TEST(TestHarness_c, checkRealText) { CHECK_EQUAL_C_REAL_TEXT(1.0, 1.1, 0.5, "Text"); - fixture->setTestFunction(_failRealTextMethod); + fixture->setTestFunction(failRealTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <1>\n but was <2>"); fixture->assertPrintContains("arness_c"); @@ -412,7 +412,7 @@ TEST(TestHarness_c, checkRealText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failCharMethod() +static void failCharMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_CHAR('a', 'c'); @@ -421,14 +421,14 @@ static void _failCharMethod() TEST(TestHarness_c, checkChar) { CHECK_EQUAL_C_CHAR('a', 'a'); - fixture->setTestFunction(_failCharMethod); + fixture->setTestFunction(failCharMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected \n but was "); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failCharTextMethod() +static void failCharTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_CHAR_TEXT('a', 'c', "CharTestText"); @@ -437,7 +437,7 @@ static void _failCharTextMethod() TEST(TestHarness_c, checkCharText) { CHECK_EQUAL_C_CHAR_TEXT('a', 'a', "Text"); - fixture->setTestFunction(_failCharTextMethod); + fixture->setTestFunction(failCharTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected \n but was "); fixture->assertPrintContains("arness_c"); @@ -445,7 +445,7 @@ TEST(TestHarness_c, checkCharText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failUnsignedByteMethod() +static void failUnsignedByteMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_UBYTE(254, 253); @@ -454,14 +454,14 @@ static void _failUnsignedByteMethod() TEST(TestHarness_c, checkUnsignedByte) { CHECK_EQUAL_C_UBYTE(254, 254); - fixture->setTestFunction(_failUnsignedByteMethod); + fixture->setTestFunction(failUnsignedByteMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <254>\n but was <253>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failUnsignedByteTextMethod() +static void failUnsignedByteTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_UBYTE_TEXT(254, 253, "UnsignedByteTestText"); @@ -470,7 +470,7 @@ static void _failUnsignedByteTextMethod() TEST(TestHarness_c, checkUnsignedByteText) { CHECK_EQUAL_C_UBYTE_TEXT(254, 254, "Text"); - fixture->setTestFunction(_failUnsignedByteTextMethod); + fixture->setTestFunction(failUnsignedByteTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <254>\n but was <253>"); fixture->assertPrintContains("arness_c"); @@ -478,7 +478,7 @@ TEST(TestHarness_c, checkUnsignedByteText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failSignedByteMethod() +static void failSignedByteMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_SBYTE(-3, -5); @@ -487,14 +487,14 @@ static void _failSignedByteMethod() TEST(TestHarness_c, checkSignedByte) { CHECK_EQUAL_C_SBYTE(-3, -3); - fixture->setTestFunction(_failSignedByteMethod); + fixture->setTestFunction(failSignedByteMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <-3>\n but was <-5>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failSignedByteTextMethod() +static void failSignedByteTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_SBYTE_TEXT(-3, -5, "SignedByteTestText"); @@ -503,7 +503,7 @@ static void _failSignedByteTextMethod() TEST(TestHarness_c, checkSignedByteText) { CHECK_EQUAL_C_SBYTE_TEXT(-3, -3, "Text"); - fixture->setTestFunction(_failSignedByteTextMethod); + fixture->setTestFunction(failSignedByteTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <-3>\n but was <-5>"); fixture->assertPrintContains("arness_c"); @@ -511,7 +511,7 @@ TEST(TestHarness_c, checkSignedByteText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failStringMethod() +static void failStringMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_STRING("Hello", "Hello World"); @@ -520,7 +520,7 @@ static void _failStringMethod() TEST(TestHarness_c, checkString) { CHECK_EQUAL_C_STRING("Hello", "Hello"); - fixture->setTestFunction(_failStringMethod); + fixture->setTestFunction(failStringMethod_); fixture->runAllTests(); StringEqualFailure failure(UtestShell::getCurrent(), "file", 1, "Hello", "Hello World", ""); @@ -529,7 +529,7 @@ TEST(TestHarness_c, checkString) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failStringTextMethod() +static void failStringTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_STRING_TEXT("Hello", "Hello World", "StringTestText"); @@ -538,7 +538,7 @@ static void _failStringTextMethod() TEST(TestHarness_c, checkStringText) { CHECK_EQUAL_C_STRING_TEXT("Hello", "Hello", "Text"); - fixture->setTestFunction(_failStringTextMethod); + fixture->setTestFunction(failStringTextMethod_); fixture->runAllTests(); StringEqualFailure failure(UtestShell::getCurrent(), "file", 1, "Hello", "Hello World", ""); @@ -548,7 +548,7 @@ TEST(TestHarness_c, checkStringText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failPointerMethod() +static void failPointerMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_POINTER(NULLPTR, (void *)0x1); @@ -557,14 +557,14 @@ static void _failPointerMethod() TEST(TestHarness_c, checkPointer) { CHECK_EQUAL_C_POINTER(NULLPTR, NULLPTR); - fixture->setTestFunction(_failPointerMethod); + fixture->setTestFunction(failPointerMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <0x0>\n but was <0x1>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failPointerTextMethod() +static void failPointerTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_POINTER_TEXT(NULLPTR, (void *)0x1, "PointerTestText"); @@ -573,7 +573,7 @@ static void _failPointerTextMethod() TEST(TestHarness_c, checkPointerText) { CHECK_EQUAL_C_POINTER_TEXT(NULLPTR, NULLPTR, "Text"); - fixture->setTestFunction(_failPointerTextMethod); + fixture->setTestFunction(failPointerTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <0x0>\n but was <0x1>"); fixture->assertPrintContains("arness_c"); @@ -581,7 +581,7 @@ TEST(TestHarness_c, checkPointerText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failBitsMethod() +static void failBitsMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_BITS(0x0001, (unsigned short)0x0003, 0xFFFF); @@ -590,14 +590,14 @@ static void _failBitsMethod() TEST(TestHarness_c, checkBits) { CHECK_EQUAL_C_BITS(0xABCD, (unsigned short)0xABCD, 0xFFFF); - fixture->setTestFunction(_failBitsMethod); + fixture->setTestFunction(failBitsMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <00000000 00000001>\n\tbut was <00000000 00000011>"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failBitsTextMethod() +static void failBitsTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_EQUAL_C_BITS_TEXT(0x0001, (unsigned short)0x0003, 0xFFFF, "BitsTestText"); @@ -606,7 +606,7 @@ static void _failBitsTextMethod() TEST(TestHarness_c, checkBitsText) { CHECK_EQUAL_C_BITS_TEXT(0xABCD, (unsigned short)0xABCD, 0xFFFF, "Text"); - fixture->setTestFunction(_failBitsTextMethod); + fixture->setTestFunction(failBitsTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("expected <00000000 00000001>\n\tbut was <00000000 00000011>"); fixture->assertPrintContains("arness_c"); @@ -614,7 +614,7 @@ TEST(TestHarness_c, checkBitsText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failTextMethod() +static void failTextMethod_() { HasTheDestructorBeenCalledChecker checker; FAIL_TEXT_C("Booo"); @@ -622,14 +622,14 @@ static void _failTextMethod() TEST(TestHarness_c, checkFailText) { - fixture->setTestFunction(_failTextMethod); + fixture->setTestFunction(failTextMethod_); fixture->runAllTests(); fixture->assertPrintContains("Booo"); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _failMethod() +static void failMethod_() { HasTheDestructorBeenCalledChecker checker; FAIL_C(); @@ -637,14 +637,14 @@ static void _failMethod() TEST(TestHarness_c, checkFail) { - fixture->setTestFunction(_failMethod); + fixture->setTestFunction(failMethod_); fixture->runAllTests(); LONGS_EQUAL(1, fixture->getFailureCount()); fixture->assertPrintContains("arness_c"); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _CheckMethod() +static void CheckMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_C(false); @@ -653,13 +653,13 @@ static void _CheckMethod() TEST(TestHarness_c, checkCheck) { CHECK_C(true); - fixture->setTestFunction(_CheckMethod); + fixture->setTestFunction(CheckMethod_); fixture->runAllTests(); LONGS_EQUAL(1, fixture->getFailureCount()); CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -static void _CheckTextMethod() +static void CheckTextMethod_() { HasTheDestructorBeenCalledChecker checker; CHECK_C_TEXT(false, "CheckTestText"); @@ -668,7 +668,7 @@ static void _CheckTextMethod() TEST(TestHarness_c, checkCheckText) { CHECK_C_TEXT(true, "Text"); - fixture->setTestFunction(_CheckTextMethod); + fixture->setTestFunction(CheckTextMethod_); fixture->runAllTests(); LONGS_EQUAL(1, fixture->getFailureCount()); fixture->assertPrintContains("Message: CheckTestText"); diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 8d46badd7..39c432b6f 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -261,7 +261,7 @@ TEST(FailableMemoryAllocator, FailSecondAndFourthMalloc) free(memory3); } -static void _failingAllocIsNeverDone(FailableMemoryAllocator* failableMallocAllocator) +static void failingAllocIsNeverDone_(FailableMemoryAllocator* failableMallocAllocator) { failableMallocAllocator->failAllocNumber(1); failableMallocAllocator->failAllocNumber(2); @@ -273,7 +273,7 @@ static void _failingAllocIsNeverDone(FailableMemoryAllocator* failableMallocAllo TEST(FailableMemoryAllocator, CheckAllFailingAllocsWereDone) { - testFunction.testFunction_ = _failingAllocIsNeverDone; + testFunction.testFunction_ = failingAllocIsNeverDone_; fixture.runAllTests(); @@ -306,7 +306,7 @@ TEST(FailableMemoryAllocator, FailThirdAllocationAtGivenLine) LONGS_EQUAL(3, allocation); } -static void _failingLocationAllocIsNeverDone(FailableMemoryAllocator* failableMallocAllocator) +static void failingLocationAllocIsNeverDone_(FailableMemoryAllocator* failableMallocAllocator) { failableMallocAllocator->failNthAllocAt(1, "TestMemoryAllocatorTest.cpp", __LINE__); failableMallocAllocator->checkAllFailedAllocsWereDone(); @@ -314,7 +314,7 @@ static void _failingLocationAllocIsNeverDone(FailableMemoryAllocator* failableMa TEST(FailableMemoryAllocator, CheckAllFailingLocationAllocsWereDone) { - testFunction.testFunction_ = _failingLocationAllocIsNeverDone; + testFunction.testFunction_ = failingLocationAllocIsNeverDone_; fixture.runAllTests(); @@ -465,7 +465,7 @@ TEST(TestMemoryAccountant, reportAllocationsWithSizeZero) } -static void _failUseCacheSizesAfterAllocation(MemoryAccountant* accountant) +static void failUseCacheSizesAfterAllocation_(MemoryAccountant* accountant) { size_t cacheSizes[] = {0}; @@ -475,7 +475,7 @@ static void _failUseCacheSizesAfterAllocation(MemoryAccountant* accountant) TEST(TestMemoryAccountant, withCacheSizesFailsWhenAlreadyAllocatedMemory) { - testFunction.testFunction_ = _failUseCacheSizesAfterAllocation; + testFunction.testFunction_ = failUseCacheSizesAfterAllocation_; fixture.runAllTests(); @@ -695,19 +695,19 @@ TEST(GlobalMemoryAccountant, reportWithCacheSizes) #endif -static void _failStopWithoutStartingWillFail(GlobalMemoryAccountant* accountant) +static void failStopWithoutStartingWillFail_(GlobalMemoryAccountant* accountant) { accountant->stop(); } TEST(GlobalMemoryAccountant, StopCantBeCalledWithoutStarting) { - testFunction.testFunction_ = _failStopWithoutStartingWillFail; + testFunction.testFunction_ = failStopWithoutStartingWillFail_; fixture.runAllTests(); fixture.assertPrintContains("GlobalMemoryAccount: Stop called without starting"); } -static void _failStartingTwiceWillFail(GlobalMemoryAccountant* accountant) +static void failStartingTwiceWillFail_(GlobalMemoryAccountant* accountant) { accountant->start(); accountant->start(); @@ -715,14 +715,14 @@ static void _failStartingTwiceWillFail(GlobalMemoryAccountant* accountant) TEST(GlobalMemoryAccountant, startTwiceWillFail) { - testFunction.testFunction_ = _failStartingTwiceWillFail; + testFunction.testFunction_ = failStartingTwiceWillFail_; fixture.runAllTests(); accountant.stop(); fixture.assertPrintContains("Global allocator start called twice!"); } -static void _failChangeMallocMemoryAllocator(GlobalMemoryAccountant* accountant) +static void failChangeMallocMemoryAllocator_(GlobalMemoryAccountant* accountant) { accountant->start(); setCurrentMallocAllocator(defaultMallocAllocator()); @@ -731,12 +731,12 @@ static void _failChangeMallocMemoryAllocator(GlobalMemoryAccountant* accountant) TEST(GlobalMemoryAccountant, checkWhetherMallocAllocatorIsNotChanged) { - testFunction.testFunction_ = _failChangeMallocMemoryAllocator; + testFunction.testFunction_ = failChangeMallocMemoryAllocator_; fixture.runAllTests(); fixture.assertPrintContains("GlobalMemoryAccountant: Malloc memory allocator has been changed while accounting for memory"); } -static void _failChangeNewMemoryAllocator(GlobalMemoryAccountant* accountant) +static void failChangeNewMemoryAllocator_(GlobalMemoryAccountant* accountant) { accountant->start(); setCurrentNewAllocator(defaultNewAllocator()); @@ -745,12 +745,12 @@ static void _failChangeNewMemoryAllocator(GlobalMemoryAccountant* accountant) TEST(GlobalMemoryAccountant, checkWhetherNewAllocatorIsNotChanged) { - testFunction.testFunction_ = _failChangeNewMemoryAllocator; + testFunction.testFunction_ = failChangeNewMemoryAllocator_; fixture.runAllTests(); fixture.assertPrintContains("GlobalMemoryAccountant: New memory allocator has been changed while accounting for memory"); } -static void _failChangeNewArrayMemoryAllocator(GlobalMemoryAccountant* accountant) +static void failChangeNewArrayMemoryAllocator_(GlobalMemoryAccountant* accountant) { accountant->start(); setCurrentNewArrayAllocator(defaultNewArrayAllocator()); @@ -759,7 +759,7 @@ static void _failChangeNewArrayMemoryAllocator(GlobalMemoryAccountant* accountan TEST(GlobalMemoryAccountant, checkWhetherNewArrayAllocatorIsNotChanged) { - testFunction.testFunction_ = _failChangeNewArrayMemoryAllocator; + testFunction.testFunction_ = failChangeNewArrayMemoryAllocator_; fixture.runAllTests(); fixture.assertPrintContains("GlobalMemoryAccountant: New Array memory allocator has been changed while accounting for memory"); } diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index 8a6792e86..be7e0c5fe 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -48,7 +48,7 @@ TEST_GROUP(UnitTestMacros) TestTestingFixture fixture; }; -static void _failingTestMethodWithFAIL() +static void failingTestMethodWithFAIL_() { FAIL("This test fails"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -56,13 +56,13 @@ static void _failingTestMethodWithFAIL() TEST(UnitTestMacros, FAILMakesTheTestFailPrintsTheRightResultAndStopsExecuting) { - fixture.runTestWithMethod(_failingTestMethodWithFAIL); + fixture.runTestWithMethod(failingTestMethodWithFAIL_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("This test fails"); } TEST(UnitTestMacros, FAILWillPrintTheFileThatItFailed) { - fixture.runTestWithMethod(_failingTestMethodWithFAIL); + fixture.runTestWithMethod(failingTestMethodWithFAIL_); CHECK_TEST_FAILS_PROPER_WITH_TEXT(__FILE__); } @@ -80,7 +80,7 @@ IGNORE_TEST(UnitTestMacros, FAILworksInAnIgnoredTest) FAIL("die!"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _UNSIGNED_LONGS_EQUALTestMethod() +static void UNSIGNED_LONGS_EQUALTestMethod_() { UNSIGNED_LONGS_EQUAL(1, 1); UNSIGNED_LONGS_EQUAL(1, 0); @@ -88,7 +88,7 @@ static void _UNSIGNED_LONGS_EQUALTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGS_EQUAL) { - fixture.runTestWithMethod(_UNSIGNED_LONGS_EQUALTestMethod); + fixture.runTestWithMethod(UNSIGNED_LONGS_EQUALTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0)>"); } @@ -104,14 +104,14 @@ IGNORE_TEST(UnitTestMacros, UNSIGNED_LONGS_EQUALWorksInAnIgnoredTest) UNSIGNED_LONGS_EQUAL(1, 0); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _UNSIGNED_LONGS_EQUAL_TEXTTestMethod() +static void UNSIGNED_LONGS_EQUAL_TEXTTestMethod_() { UNSIGNED_LONGS_EQUAL_TEXT(1, 0, "Failed because it failed"); } // LCOV_EXCL_LINE TEST(UnitTestMacros, TestUNSIGNED_LONGS_EQUAL_TEXT) { - fixture.runTestWithMethod(_UNSIGNED_LONGS_EQUAL_TEXTTestMethod); + fixture.runTestWithMethod(UNSIGNED_LONGS_EQUAL_TEXTTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -130,7 +130,7 @@ IGNORE_TEST(UnitTestMacros, UNSIGNED_LONGS_EQUAL_TEXTWorksInAnIgnoredTest) #ifdef CPPUTEST_USE_LONG_LONG -static void _LONGLONGS_EQUALTestMethod() +static void LONGLONGS_EQUALTestMethod_() { LONGLONGS_EQUAL(1, 1); LONGLONGS_EQUAL(1, 0); @@ -138,7 +138,7 @@ static void _LONGLONGS_EQUALTestMethod() TEST(UnitTestMacros, TestLONGLONGS_EQUAL) { - fixture.runTestWithMethod(_LONGLONGS_EQUALTestMethod); + fixture.runTestWithMethod(LONGLONGS_EQUALTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0)>"); } @@ -154,14 +154,14 @@ IGNORE_TEST(UnitTestMacros, LONGLONGS_EQUALWorksInAnIgnoredTest) LONGLONGS_EQUAL(1, 0); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _LONGLONGS_EQUAL_TEXTTestMethod() +static void LONGLONGS_EQUAL_TEXTTestMethod_() { LONGLONGS_EQUAL_TEXT(1, 0, "Failed because it failed"); } // LCOV_EXCL_LINE TEST(UnitTestMacros, TestLONGLONGS_EQUAL_TEXT) { - fixture.runTestWithMethod(_LONGLONGS_EQUAL_TEXTTestMethod); + fixture.runTestWithMethod(LONGLONGS_EQUAL_TEXTTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -178,7 +178,7 @@ IGNORE_TEST(UnitTestMacros, LONGLONGS_EQUAL_TEXTWorksInAnIgnoredTest) LONGLONGS_EQUAL_TEXT(1, 0, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _UNSIGNED_LONGLONGS_EQUALTestMethod() +static void UNSIGNED_LONGLONGS_EQUALTestMethod_() { UNSIGNED_LONGLONGS_EQUAL(1, 1); UNSIGNED_LONGLONGS_EQUAL(1, 0); @@ -186,7 +186,7 @@ static void _UNSIGNED_LONGLONGS_EQUALTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGLONGS_EQUAL) { - fixture.runTestWithMethod(_UNSIGNED_LONGLONGS_EQUALTestMethod); + fixture.runTestWithMethod(UNSIGNED_LONGLONGS_EQUALTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0)>"); } @@ -202,14 +202,14 @@ IGNORE_TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALWorksInAnIgnoredTest) UNSIGNED_LONGLONGS_EQUAL(1, 0); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _UNSIGNED_LONGLONGS_EQUAL_TEXTTestMethod() +static void UNSIGNED_LONGLONGS_EQUAL_TEXTTestMethod_() { UNSIGNED_LONGLONGS_EQUAL_TEXT(1, 0, "Failed because it failed"); } // LCOV_EXCL_LINE TEST(UnitTestMacros, TestUNSIGNED_LONGLONGS_EQUAL_TEXT) { - fixture.runTestWithMethod(_UNSIGNED_LONGLONGS_EQUAL_TEXTTestMethod); + fixture.runTestWithMethod(UNSIGNED_LONGLONGS_EQUAL_TEXTTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 (0x0)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -228,31 +228,31 @@ IGNORE_TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUAL_TEXTWorksInAnIgnoredTest) #else -static void _LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod() +static void LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod_() { LONGLONGS_EQUAL(1, 1); } // LCOV_EXCL_LINE -static void _UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod() +static void UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod() { UNSIGNED_LONGLONGS_EQUAL(1, 1); } // LCOV_EXCL_LINE TEST(UnitTestMacros, LONGLONGS_EQUALFailsWithUnsupportedFeature) { - fixture.runTestWithMethod(_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod); + fixture.runTestWithMethod(LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("\"CPPUTEST_USE_LONG_LONG\" is not supported"); } TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeature) { - fixture.runTestWithMethod(_UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod); + fixture.runTestWithMethod(UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("\"CPPUTEST_USE_LONG_LONG\" is not supported"); } #endif /* CPPUTEST_USE_LONG_LONG */ -static void _failingTestMethodWithCHECK() +static void failingTestMethodWithCHECK_() { CHECK(false); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -260,7 +260,7 @@ static void _failingTestMethodWithCHECK() TEST(UnitTestMacros, FailureWithCHECK) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK); + fixture.runTestWithMethod(failingTestMethodWithCHECK_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK(false) failed"); } @@ -275,7 +275,7 @@ IGNORE_TEST(UnitTestMacros, CHECKWorksInAnIgnoredTest) CHECK(false); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithCHECK_TEXT() +static void failingTestMethodWithCHECK_TEXT_() { CHECK_TEXT(false, "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -283,7 +283,7 @@ static void _failingTestMethodWithCHECK_TEXT() TEST(UnitTestMacros, FailureWithCHECK_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_TEXT); + fixture.runTestWithMethod(failingTestMethodWithCHECK_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK(false) failed"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); } @@ -299,7 +299,7 @@ IGNORE_TEST(UnitTestMacros, CHECK_TEXTWorksInAnIgnoredTest) CHECK_TEXT(false, "false"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithCHECK_TRUE() +static void failingTestMethodWithCHECK_TRUE_() { CHECK_TRUE(false); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -307,7 +307,7 @@ static void _failingTestMethodWithCHECK_TRUE() TEST(UnitTestMacros, FailureWithCHECK_TRUE) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_TRUE); + fixture.runTestWithMethod(failingTestMethodWithCHECK_TRUE_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK_TRUE(false) failed"); } @@ -322,7 +322,7 @@ IGNORE_TEST(UnitTestMacros, CHECK_TRUEWorksInAnIgnoredTest) CHECK_TRUE(false); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithCHECK_TRUE_TEXT() +static void failingTestMethodWithCHECK_TRUE_TEXT_() { CHECK_TRUE_TEXT(false, "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -330,7 +330,7 @@ static void _failingTestMethodWithCHECK_TRUE_TEXT() TEST(UnitTestMacros, FailureWithCHECK_TRUE_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_TRUE_TEXT); + fixture.runTestWithMethod(failingTestMethodWithCHECK_TRUE_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK_TRUE(false) failed"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); } @@ -346,7 +346,7 @@ IGNORE_TEST(UnitTestMacros, CHECK_TRUE_TEXTWorksInAnIgnoredTest) CHECK_TRUE_TEXT(false, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithCHECK_FALSE() +static void failingTestMethodWithCHECK_FALSE_() { CHECK_FALSE(true); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -354,7 +354,7 @@ static void _failingTestMethodWithCHECK_FALSE() TEST(UnitTestMacros, FailureWithCHECK_FALSE) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_FALSE); + fixture.runTestWithMethod(failingTestMethodWithCHECK_FALSE_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK_FALSE(true) failed"); } @@ -369,7 +369,7 @@ IGNORE_TEST(UnitTestMacros, CHECK_FALSEWorksInAnIgnoredTest) CHECK_FALSE(true); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithCHECK_FALSE_TEXT() +static void failingTestMethodWithCHECK_FALSE_TEXT_() { CHECK_FALSE_TEXT(true, "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -377,7 +377,7 @@ static void _failingTestMethodWithCHECK_FALSE_TEXT() TEST(UnitTestMacros, FailureWithCHECK_FALSE_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_FALSE_TEXT); + fixture.runTestWithMethod(failingTestMethodWithCHECK_FALSE_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK_FALSE(true)"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); } @@ -393,7 +393,7 @@ IGNORE_TEST(UnitTestMacros, CHECK_FALSE_TEXTWorksInAnIgnoredTest) CHECK_FALSE_TEXT(true, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithCHECK_EQUAL() +static void failingTestMethodWithCHECK_EQUAL_() { CHECK_EQUAL(1, 2); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -401,12 +401,12 @@ static void _failingTestMethodWithCHECK_EQUAL() TEST(UnitTestMacros, FailureWithCHECK_EQUAL) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_EQUAL); + fixture.runTestWithMethod(failingTestMethodWithCHECK_EQUAL_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <2>"); } -static void _failingTestMethodWithCHECK_COMPARE() +static void failingTestMethodWithCHECK_COMPARE_() { double small = 0.5, big = 0.8; CHECK_COMPARE(small, >=, big); @@ -415,7 +415,7 @@ static void _failingTestMethodWithCHECK_COMPARE() TEST(UnitTestMacros, FailureWithCHECK_COMPARE) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_COMPARE); + fixture.runTestWithMethod(failingTestMethodWithCHECK_COMPARE_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK_COMPARE(0.5 >= 0.8)"); } @@ -430,7 +430,7 @@ IGNORE_TEST(UnitTestMacros, CHECK_COMPAREWorksInAnIgnoredTest) CHECK_COMPARE(1, >, 2); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithCHECK_COMPARE_TEXT() +static void failingTestMethodWithCHECK_COMPARE_TEXT_() { double small = 0.5, big = 0.8; CHECK_COMPARE_TEXT(small, >=, big, "small bigger than big"); @@ -439,7 +439,7 @@ static void _failingTestMethodWithCHECK_COMPARE_TEXT() TEST(UnitTestMacros, FailureWithCHECK_COMPARE_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_COMPARE_TEXT); + fixture.runTestWithMethod(failingTestMethodWithCHECK_COMPARE_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK_COMPARE(0.5 >= 0.8)"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("small bigger than big"); } @@ -456,7 +456,7 @@ IGNORE_TEST(UnitTestMacros, CHECK_COMPARE_TEXTWorksInAnIgnoredTest) } // LCOV_EXCL_LINE static int countInCountingMethod; -static int _countingMethod() +static int countingMethod_() { return countInCountingMethod++; } @@ -480,36 +480,36 @@ TEST(UnitTestMacros, UNSIGNED_LONGS_EQUAL_macroExpressionSafety) TEST(UnitTestMacros, passingCheckEqualWillNotBeEvaluatedMultipleTimesWithCHECK_EQUAL) { countInCountingMethod = 0; - CHECK_EQUAL(0, _countingMethod()); + CHECK_EQUAL(0, countingMethod_()); LONGS_EQUAL(1, countInCountingMethod); } -static void _failing_CHECK_EQUAL_WithActualBeingEvaluatesMultipleTimesWillGiveAWarning() +static void failing_CHECK_EQUAL_WithActualBeingEvaluatesMultipleTimesWillGiveAWarning_() { - CHECK_EQUAL(12345, _countingMethod()); + CHECK_EQUAL(12345, countingMethod_()); } // LCOV_EXCL_LINE TEST(UnitTestMacros, failing_CHECK_EQUAL_WithActualBeingEvaluatesMultipleTimesWillGiveAWarning) { - fixture.runTestWithMethod(_failing_CHECK_EQUAL_WithActualBeingEvaluatesMultipleTimesWillGiveAWarning); + fixture.runTestWithMethod(failing_CHECK_EQUAL_WithActualBeingEvaluatesMultipleTimesWillGiveAWarning_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("WARNING:\n\tThe \"Actual Parameter\" parameter is evaluated multiple times resulting in different values.\n\tThus the value in the error message is probably incorrect."); } -static void _failing_CHECK_EQUAL_WithExpectedBeingEvaluatesMultipleTimesWillGiveAWarning() +static void failing_CHECK_EQUAL_WithExpectedBeingEvaluatesMultipleTimesWillGiveAWarning_() { - CHECK_EQUAL(_countingMethod(), 12345); + CHECK_EQUAL(countingMethod_(), 12345); } // LCOV_EXCL_LINE TEST(UnitTestMacros, failing_CHECK_EQUAL_WithExpectedBeingEvaluatesMultipleTimesWillGiveAWarning) { - fixture.runTestWithMethod(_failing_CHECK_EQUAL_WithExpectedBeingEvaluatesMultipleTimesWillGiveAWarning); + fixture.runTestWithMethod(failing_CHECK_EQUAL_WithExpectedBeingEvaluatesMultipleTimesWillGiveAWarning_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("WARNING:\n\tThe \"Expected Parameter\" parameter is evaluated multiple times resulting in different values.\n\tThus the value in the error message is probably incorrect."); } TEST(UnitTestMacros, failing_CHECK_EQUAL_withParamatersThatDontChangeWillNotGiveAnyWarning) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_EQUAL); + fixture.runTestWithMethod(failingTestMethodWithCHECK_EQUAL_); fixture.assertPrintContainsNot("WARNING"); } @@ -524,7 +524,7 @@ IGNORE_TEST(UnitTestMacros, CHECK_EQUALWorksInAnIgnoredTest) CHECK_EQUAL(1, 2); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithCHECK_EQUAL_TEXT() +static void failingTestMethodWithCHECK_EQUAL_TEXT_() { CHECK_EQUAL_TEXT(1, 2, "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -532,7 +532,7 @@ static void _failingTestMethodWithCHECK_EQUAL_TEXT() TEST(UnitTestMacros, FailureWithCHECK_EQUAL_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_EQUAL_TEXT); + fixture.runTestWithMethod(failingTestMethodWithCHECK_EQUAL_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <2>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -549,7 +549,7 @@ IGNORE_TEST(UnitTestMacros, CHECK_EQUAL_TEXTWorksInAnIgnoredTest) CHECK_EQUAL_TEXT(1, 2, "Failed because it failed"); // LCOV_EXCL_LINE; } // LCOV_EXCL_LINE -static void _failingTestMethodWithCHECK_EQUAL_ZERO() +static void failingTestMethodWithCHECK_EQUAL_ZERO_() { CHECK_EQUAL_ZERO(1); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -557,7 +557,7 @@ static void _failingTestMethodWithCHECK_EQUAL_ZERO() TEST(UnitTestMacros, FailureWithCHECK_EQUAL_ZERO) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_EQUAL_ZERO); + fixture.runTestWithMethod(failingTestMethodWithCHECK_EQUAL_ZERO_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <0>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <1>"); } @@ -565,26 +565,26 @@ TEST(UnitTestMacros, FailureWithCHECK_EQUAL_ZERO) TEST(UnitTestMacros, passingCheckEqualWillNotBeEvaluatedMultipleTimesWithCHECK_EQUAL_ZERO) { countInCountingMethod = 0; - CHECK_EQUAL_ZERO(_countingMethod()); + CHECK_EQUAL_ZERO(countingMethod_()); LONGS_EQUAL(1, countInCountingMethod); } -static void _failing_CHECK_EQUAL_ZERO_WithActualBeingEvaluatesMultipleTimesWillGiveAWarning() +static void failing_CHECK_EQUAL_ZERO_WithActualBeingEvaluatesMultipleTimesWillGiveAWarning_() { countInCountingMethod = 1; - CHECK_EQUAL_ZERO(_countingMethod()); + CHECK_EQUAL_ZERO(countingMethod_()); } // LCOV_EXCL_LINE TEST(UnitTestMacros, failing_CHECK_EQUAL_ZERO_WithActualBeingEvaluatesMultipleTimesWillGiveAWarning) { - fixture.runTestWithMethod(_failing_CHECK_EQUAL_ZERO_WithActualBeingEvaluatesMultipleTimesWillGiveAWarning); + fixture.runTestWithMethod(failing_CHECK_EQUAL_ZERO_WithActualBeingEvaluatesMultipleTimesWillGiveAWarning_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("WARNING:\n\tThe \"Actual Parameter\" parameter is evaluated multiple times resulting in different values.\n\tThus the value in the error message is probably incorrect."); } TEST(UnitTestMacros, failing_CHECK_EQUAL_ZERO_withParamatersThatDontChangeWillNotGiveAnyWarning) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_EQUAL_ZERO); + fixture.runTestWithMethod(failingTestMethodWithCHECK_EQUAL_ZERO_); fixture.assertPrintContainsNot("WARNING"); } @@ -599,7 +599,7 @@ TEST(UnitTestMacros, CHECK_EQUAL_ZERO_BehavesAsProperMacro) else CHECK_EQUAL_ZERO(0); } -static void _failingTestMethodWithCHECK_EQUAL_ZERO_TEXT() +static void failingTestMethodWithCHECK_EQUAL_ZERO_TEXT_() { CHECK_EQUAL_ZERO_TEXT(1, "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -607,7 +607,7 @@ static void _failingTestMethodWithCHECK_EQUAL_ZERO_TEXT() TEST(UnitTestMacros, FailureWithCHECK_EQUAL_ZERO_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithCHECK_EQUAL_ZERO_TEXT); + fixture.runTestWithMethod(failingTestMethodWithCHECK_EQUAL_ZERO_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <0>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <1>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -624,7 +624,7 @@ IGNORE_TEST(UnitTestMacros, CHECK_EQUAL_ZERO_TEXTWorksInAnIgnoredTest) CHECK_EQUAL_ZERO_TEXT(1, "Failed because it failed"); // LCOV_EXCL_LINE; } // LCOV_EXCL_LINE -static void _failingTestMethodWithLONGS_EQUAL() +static void failingTestMethodWithLONGS_EQUAL_() { LONGS_EQUAL(1, 0xff); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -632,12 +632,12 @@ static void _failingTestMethodWithLONGS_EQUAL() TEST(UnitTestMacros, FailureWithLONGS_EQUALS) { - fixture.runTestWithMethod(_failingTestMethodWithLONGS_EQUAL); + fixture.runTestWithMethod(failingTestMethodWithLONGS_EQUAL_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected < 1 (0x1)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <255 (0xff)>"); } -static void _failingTestMethodWithLONGS_EQUALWithSymbolicParameters() +static void failingTestMethodWithLONGS_EQUALWithSymbolicParameters_() { #define _MONDAY 1 int day_of_the_week = _MONDAY+1; @@ -647,7 +647,7 @@ static void _failingTestMethodWithLONGS_EQUALWithSymbolicParameters() TEST(UnitTestMacros, FailureWithLONGS_EQUALShowsSymbolicParameters) { - fixture.runTestWithMethod(_failingTestMethodWithLONGS_EQUALWithSymbolicParameters); + fixture.runTestWithMethod(failingTestMethodWithLONGS_EQUALWithSymbolicParameters_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("LONGS_EQUAL(_MONDAY, day_of_the_week) failed"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <2 (0x2)>"); @@ -665,7 +665,7 @@ IGNORE_TEST(UnitTestMacros, LONGS_EQUALWorksInAnIgnoredTest) LONGS_EQUAL(11, 22); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithLONGS_EQUAL_TEXT() +static void failingTestMethodWithLONGS_EQUAL_TEXT_() { LONGS_EQUAL_TEXT(1, 0xff, "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -673,7 +673,7 @@ static void _failingTestMethodWithLONGS_EQUAL_TEXT() TEST(UnitTestMacros, FailureWithLONGS_EQUALS_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithLONGS_EQUAL_TEXT); + fixture.runTestWithMethod(failingTestMethodWithLONGS_EQUAL_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected < 1 (0x1)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <255 (0xff)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -690,7 +690,7 @@ IGNORE_TEST(UnitTestMacros, LONGS_EQUAL_TEXTWorksInAnIgnoredTest) LONGS_EQUAL_TEXT(11, 22, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithBYTES_EQUAL() +static void failingTestMethodWithBYTES_EQUAL_() { BYTES_EQUAL('a', 'b'); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -698,7 +698,7 @@ static void _failingTestMethodWithBYTES_EQUAL() TEST(UnitTestMacros, FailureWithBYTES_EQUAL) { - fixture.runTestWithMethod(_failingTestMethodWithBYTES_EQUAL); + fixture.runTestWithMethod(failingTestMethodWithBYTES_EQUAL_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <97 (0x61)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <98 (0x62)>"); } @@ -714,7 +714,7 @@ IGNORE_TEST(UnitTestMacros, BYTES_EQUALWorksInAnIgnoredTest) BYTES_EQUAL('q', 'w'); // LCOV_EXCL_LINE; } // LCOV_EXCL_LINE -static void _failingTestMethodWithBYTES_EQUAL_TEXT() +static void failingTestMethodWithBYTES_EQUAL_TEXT_() { BYTES_EQUAL_TEXT('a', 'b', "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -722,7 +722,7 @@ static void _failingTestMethodWithBYTES_EQUAL_TEXT() TEST(UnitTestMacros, FailureWithBYTES_EQUAL_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithBYTES_EQUAL_TEXT); + fixture.runTestWithMethod(failingTestMethodWithBYTES_EQUAL_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <97 (0x61)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <98 (0x62)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -739,7 +739,7 @@ IGNORE_TEST(UnitTestMacros, BYTES_EQUAL_TEXTWorksInAnIgnoredTest) BYTES_EQUAL_TEXT('q', 'w', "Failed because it failed"); // LCOV_EXCL_LINE; } // LCOV_EXCL_LINE -static void _failingTestMethodWithSIGNED_BYTES_EQUAL() +static void failingTestMethodWithSIGNED_BYTES_EQUAL_() { SIGNED_BYTES_EQUAL(-1, -2); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -747,7 +747,7 @@ static void _failingTestMethodWithSIGNED_BYTES_EQUAL() TEST(UnitTestMacros, FailureWithSIGNED_BYTES_EQUAL) { - fixture.runTestWithMethod(_failingTestMethodWithSIGNED_BYTES_EQUAL); + fixture.runTestWithMethod(failingTestMethodWithSIGNED_BYTES_EQUAL_); #if CPPUTEST_CHAR_BIT == 16 CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-1 (0xffff)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-2 (0xfffe)>"); @@ -768,7 +768,7 @@ IGNORE_TEST(UnitTestMacros, CHARS_EQUALWorksInAnIgnoredTest) SIGNED_BYTES_EQUAL(-7, 19); // LCOV_EXCL_LINE; } // LCOV_EXCL_LINE -static void _failingTestMethodWithSIGNED_BYTES_EQUAL_TEXT() +static void failingTestMethodWithSIGNED_BYTES_EQUAL_TEXT_() { SIGNED_BYTES_EQUAL_TEXT(-127, -126, "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -776,7 +776,7 @@ static void _failingTestMethodWithSIGNED_BYTES_EQUAL_TEXT() TEST(UnitTestMacros, FailureWithSIGNED_BYTES_EQUAL_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithSIGNED_BYTES_EQUAL_TEXT); + fixture.runTestWithMethod(failingTestMethodWithSIGNED_BYTES_EQUAL_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-127 (0x81)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-126 (0x82)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -793,7 +793,7 @@ IGNORE_TEST(UnitTestMacros, SIGNED_BYTES_EQUAL_TEXTWorksInAnIgnoredTest) SIGNED_BYTES_EQUAL_TEXT(-7, 19, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithPOINTERS_EQUAL() +static void failingTestMethodWithPOINTERS_EQUAL_() { POINTERS_EQUAL((void*)0xa5a5, (void*)0xf0f0); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -801,7 +801,7 @@ static void _failingTestMethodWithPOINTERS_EQUAL() TEST(UnitTestMacros, FailureWithPOINTERS_EQUAL) { - fixture.runTestWithMethod(_failingTestMethodWithPOINTERS_EQUAL); + fixture.runTestWithMethod(failingTestMethodWithPOINTERS_EQUAL_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <0xa5a5>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0xf0f0>"); } @@ -817,7 +817,7 @@ IGNORE_TEST(UnitTestMacros, POINTERS_EQUALWorksInAnIgnoredTest) POINTERS_EQUAL((void*) 0xbeef, (void*) 0xdead); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithPOINTERS_EQUAL_TEXT() +static void failingTestMethodWithPOINTERS_EQUAL_TEXT_() { POINTERS_EQUAL_TEXT((void*)0xa5a5, (void*)0xf0f0, "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -825,7 +825,7 @@ static void _failingTestMethodWithPOINTERS_EQUAL_TEXT() TEST(UnitTestMacros, FailureWithPOINTERS_EQUAL_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithPOINTERS_EQUAL_TEXT); + fixture.runTestWithMethod(failingTestMethodWithPOINTERS_EQUAL_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <0xa5a5>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0xf0f0>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -843,7 +843,7 @@ IGNORE_TEST(UnitTestMacros, POINTERS_EQUAL_TEXTWorksInAnIgnoredTest) } // LCOV_EXCL_LINE -static void _failingTestMethodWithFUNCTIONPOINTERS_EQUAL() +static void failingTestMethodWithFUNCTIONPOINTERS_EQUAL_() { FUNCTIONPOINTERS_EQUAL((void (*)())0xa5a5, (void (*)())0xf0f0); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -851,7 +851,7 @@ static void _failingTestMethodWithFUNCTIONPOINTERS_EQUAL() TEST(UnitTestMacros, FailureWithFUNCTIONPOINTERS_EQUAL) { - fixture.runTestWithMethod(_failingTestMethodWithFUNCTIONPOINTERS_EQUAL); + fixture.runTestWithMethod(failingTestMethodWithFUNCTIONPOINTERS_EQUAL_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <0xa5a5>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0xf0f0>"); } @@ -867,7 +867,7 @@ IGNORE_TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUALWorksInAnIgnoredTest) FUNCTIONPOINTERS_EQUAL((void (*)())0xbeef, (void (*)())0xdead); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithFUNCTIONPOINTERS_EQUAL_TEXT() +static void failingTestMethodWithFUNCTIONPOINTERS_EQUAL_TEXT_() { FUNCTIONPOINTERS_EQUAL_TEXT((void (*)())0xa5a5, (void (*)())0xf0f0, "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -875,7 +875,7 @@ static void _failingTestMethodWithFUNCTIONPOINTERS_EQUAL_TEXT() TEST(UnitTestMacros, FailureWithFUNCTIONPOINTERS_EQUAL_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithFUNCTIONPOINTERS_EQUAL_TEXT); + fixture.runTestWithMethod(failingTestMethodWithFUNCTIONPOINTERS_EQUAL_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <0xa5a5>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0xf0f0>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -895,7 +895,7 @@ IGNORE_TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUAL_TEXTWorksInAnIgnoredTest) -static void _failingTestMethodWithDOUBLES_EQUAL() +static void failingTestMethodWithDOUBLES_EQUAL_() { DOUBLES_EQUAL(0.12, 44.1, 0.3); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -903,7 +903,7 @@ static void _failingTestMethodWithDOUBLES_EQUAL() TEST(UnitTestMacros, FailureWithDOUBLES_EQUAL) { - fixture.runTestWithMethod(_failingTestMethodWithDOUBLES_EQUAL); + fixture.runTestWithMethod(failingTestMethodWithDOUBLES_EQUAL_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <0.12>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <44.1>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("threshold used was <0.3>"); @@ -920,7 +920,7 @@ IGNORE_TEST(UnitTestMacros, DOUBLES_EQUALWorksInAnIgnoredTest) DOUBLES_EQUAL(100.0, 0.0, 0.2); // LCOV_EXCL_LINE; } // LCOV_EXCL_LINE -static void _failingTestMethodWithDOUBLES_EQUAL_TEXT() +static void failingTestMethodWithDOUBLES_EQUAL_TEXT_() { DOUBLES_EQUAL_TEXT(0.12, 44.1, 0.3, "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -928,7 +928,7 @@ static void _failingTestMethodWithDOUBLES_EQUAL_TEXT() TEST(UnitTestMacros, FailureWithDOUBLES_EQUAL_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithDOUBLES_EQUAL_TEXT); + fixture.runTestWithMethod(failingTestMethodWithDOUBLES_EQUAL_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <0.12>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <44.1>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("threshold used was <0.3>"); @@ -948,7 +948,7 @@ IGNORE_TEST(UnitTestMacros, DOUBLES_EQUAL_TEXTWorksInAnIgnoredTest) static bool lineOfCodeExecutedAfterCheck = false; -static void _passingTestMethod() +static void passingTestMethod_() { CHECK(true); lineOfCodeExecutedAfterCheck = true; @@ -956,35 +956,35 @@ static void _passingTestMethod() TEST(UnitTestMacros, SuccessPrintsNothing) { - fixture.runTestWithMethod(_passingTestMethod); + fixture.runTestWithMethod(passingTestMethod_); LONGS_EQUAL(0, fixture.getFailureCount()); fixture.assertPrintContains(".\nOK (1 tests"); CHECK(lineOfCodeExecutedAfterCheck); } -static void _methodThatOnlyPrints() +static void methodThatOnlyPrints_() { UT_PRINT("Hello World!"); } TEST(UnitTestMacros, PrintPrintsWhateverPrintPrints) { - fixture.runTestWithMethod(_methodThatOnlyPrints); + fixture.runTestWithMethod(methodThatOnlyPrints_); LONGS_EQUAL(0, fixture.getFailureCount()); fixture.assertPrintContains("Hello World!"); fixture.assertPrintContains(__FILE__); } -static void _methodThatOnlyPrintsUsingSimpleStringFromFormat() +static void methodThatOnlyPrintsUsingSimpleStringFromFormat_() { UT_PRINT(StringFromFormat("Hello %s %d", "World!", 2009)); } TEST(UnitTestMacros, PrintPrintsSimpleStringsForExampleThoseReturnedByFromString) { - fixture.runTestWithMethod(_methodThatOnlyPrintsUsingSimpleStringFromFormat); + fixture.runTestWithMethod(methodThatOnlyPrintsUsingSimpleStringFromFormat_); fixture.assertPrintContains("Hello World! 2009"); } @@ -1035,7 +1035,7 @@ IGNORE_TEST(UnitTestMacros, MEMCMP_EQUALWorksInAnIgnoredTest) MEMCMP_EQUAL("TEST", "test", 5); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _MEMCMP_EQUALFailingTestMethodWithUnequalInput() +static void MEMCMP_EQUALFailingTestMethodWithUnequalInput_() { unsigned char expectedData[] = { 0x00, 0x01, 0x02, 0x03 }; unsigned char actualData[] = { 0x00, 0x01, 0x03, 0x03 }; @@ -1046,13 +1046,13 @@ static void _MEMCMP_EQUALFailingTestMethodWithUnequalInput() TEST(UnitTestMacros, MEMCMP_EQUALFailureWithUnequalInput) { - fixture.runTestWithMethod(_MEMCMP_EQUALFailingTestMethodWithUnequalInput); + fixture.runTestWithMethod(MEMCMP_EQUALFailingTestMethodWithUnequalInput_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <00 01 02 03>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <00 01 03 03>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("difference starts at position 2"); } -static void _MEMCMP_EQUALFailingTestMethodWithNullExpected() +static void MEMCMP_EQUALFailingTestMethodWithNullExpected_() { unsigned char actualData[] = { 0x00, 0x01, 0x02, 0x03 }; @@ -1062,12 +1062,12 @@ static void _MEMCMP_EQUALFailingTestMethodWithNullExpected() TEST(UnitTestMacros, MEMCMP_EQUALFailureWithNullExpected) { - fixture.runTestWithMethod(_MEMCMP_EQUALFailingTestMethodWithNullExpected); + fixture.runTestWithMethod(MEMCMP_EQUALFailingTestMethodWithNullExpected_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <(null)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <00 01 02 03>"); } -static void _MEMCMP_EQUALFailingTestMethodWithNullActual() +static void MEMCMP_EQUALFailingTestMethodWithNullActual_() { unsigned char expectedData[] = { 0x00, 0x01, 0x02, 0x03 }; @@ -1077,7 +1077,7 @@ static void _MEMCMP_EQUALFailingTestMethodWithNullActual() TEST(UnitTestMacros, MEMCMP_EQUALFailureWithNullActual) { - fixture.runTestWithMethod(_MEMCMP_EQUALFailingTestMethodWithNullActual); + fixture.runTestWithMethod(MEMCMP_EQUALFailingTestMethodWithNullActual_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <00 01 02 03>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <(null)>"); } @@ -1100,7 +1100,7 @@ TEST(UnitTestMacros, MEMCMP_EQUALNullPointerIgnoredInActualWhenSize0) MEMCMP_EQUAL(expectedData, NULLPTR, 0); } -static void _failingTestMethodWithMEMCMP_EQUAL_TEXT() +static void failingTestMethodWithMEMCMP_EQUAL_TEXT_() { unsigned char expectedData[] = { 0x00, 0x01, 0x02, 0x03 }; unsigned char actualData[] = { 0x00, 0x01, 0x03, 0x03 }; @@ -1111,7 +1111,7 @@ static void _failingTestMethodWithMEMCMP_EQUAL_TEXT() TEST(UnitTestMacros, FailureWithMEMCMP_EQUAL_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithMEMCMP_EQUAL_TEXT); + fixture.runTestWithMethod(failingTestMethodWithMEMCMP_EQUAL_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <00 01 02 03>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <00 01 03 03>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("difference starts at position 2"); @@ -1140,7 +1140,7 @@ IGNORE_TEST(UnitTestMacros, BITS_EQUALWorksInAnIgnoredTest) BITS_EQUAL(0x00, 0xFF, 0xFF); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _BITS_EQUALFailingTestMethodWithUnequalInput() +static void BITS_EQUALFailingTestMethodWithUnequalInput_() { BITS_EQUAL(0x00, 0xFF, 0xFF); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -1148,7 +1148,7 @@ static void _BITS_EQUALFailingTestMethodWithUnequalInput() TEST(UnitTestMacros, BITS_EQUALFailureWithUnequalInput) { - fixture.runTestWithMethod(_BITS_EQUALFailingTestMethodWithUnequalInput); + fixture.runTestWithMethod(BITS_EQUALFailingTestMethodWithUnequalInput_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("00000000>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("11111111>"); } @@ -1158,7 +1158,7 @@ TEST(UnitTestMacros, BITS_EQUALZeroMaskEqual) BITS_EQUAL(0x00, 0xFF, 0x00); } -static void _failingTestMethodWithBITS_EQUAL_TEXT() +static void failingTestMethodWithBITS_EQUAL_TEXT_() { BITS_EQUAL_TEXT(0x00, 0xFFFFFFFF, 0xFF, "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -1166,7 +1166,7 @@ static void _failingTestMethodWithBITS_EQUAL_TEXT() TEST(UnitTestMacros, FailureWithBITS_EQUAL_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithBITS_EQUAL_TEXT); + fixture.runTestWithMethod(failingTestMethodWithBITS_EQUAL_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -1188,7 +1188,7 @@ enum class ScopedIntEnum { A, B }; -static void _ENUMS_EQUAL_INTWithScopedIntEnumTestMethod() +static void ENUMS_EQUAL_INTWithScopedIntEnumTestMethod_() { ENUMS_EQUAL_INT(ScopedIntEnum::B, ScopedIntEnum::B); ENUMS_EQUAL_INT(ScopedIntEnum::B, ScopedIntEnum::A); @@ -1196,7 +1196,7 @@ static void _ENUMS_EQUAL_INTWithScopedIntEnumTestMethod() TEST(UnitTestMacros, TestENUMS_EQUAL_INTWithScopedIntEnum) { - fixture.runTestWithMethod(_ENUMS_EQUAL_INTWithScopedIntEnumTestMethod); + fixture.runTestWithMethod(ENUMS_EQUAL_INTWithScopedIntEnumTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0>"); } @@ -1212,14 +1212,14 @@ IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_INTWithScopedIntEnumWorksInAnIgnoredTest ENUMS_EQUAL_INT(ScopedIntEnum::B, ScopedIntEnum::A); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _ENUMS_EQUAL_INT_TEXTWithScopedIntEnumTestMethod() +static void ENUMS_EQUAL_INT_TEXTWithScopedIntEnumTestMethod_() { ENUMS_EQUAL_INT_TEXT(ScopedIntEnum::B, ScopedIntEnum::A, "Failed because it failed"); } // LCOV_EXCL_LINE TEST(UnitTestMacros, TestENUMS_EQUAL_INT_TEXTWithScopedIntEnum) { - fixture.runTestWithMethod(_ENUMS_EQUAL_INT_TEXTWithScopedIntEnumTestMethod); + fixture.runTestWithMethod(ENUMS_EQUAL_INT_TEXTWithScopedIntEnumTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -1240,7 +1240,7 @@ enum class ScopedLongEnum : long { A, B }; -static void _ENUMS_EQUAL_TYPEWithScopedLongEnumTestMethod() +static void ENUMS_EQUAL_TYPEWithScopedLongEnumTestMethod_() { ENUMS_EQUAL_TYPE(long, ScopedLongEnum::B, ScopedLongEnum::B); ENUMS_EQUAL_TYPE(long, ScopedLongEnum::B, ScopedLongEnum::A); @@ -1248,7 +1248,7 @@ static void _ENUMS_EQUAL_TYPEWithScopedLongEnumTestMethod() TEST(UnitTestMacros, TestENUMS_EQUAL_TYPEWithScopedLongEnum) { - fixture.runTestWithMethod(_ENUMS_EQUAL_TYPEWithScopedLongEnumTestMethod); + fixture.runTestWithMethod(ENUMS_EQUAL_TYPEWithScopedLongEnumTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0>"); } @@ -1264,14 +1264,14 @@ IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_TYPEWithScopedLongEnumWorksInAnIgnoredTe ENUMS_EQUAL_TYPE(long, ScopedLongEnum::B, ScopedLongEnum::A); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _ENUMS_EQUAL_TYPE_TEXTWithScopedLongEnumTestMethod() +static void ENUMS_EQUAL_TYPE_TEXTWithScopedLongEnumTestMethod_() { ENUMS_EQUAL_TYPE_TEXT(long, ScopedLongEnum::B, ScopedLongEnum::A, "Failed because it failed"); } // LCOV_EXCL_LINE TEST(UnitTestMacros, TestENUMS_EQUAL_TYPE_TEXTWithScopedLongEnum) { - fixture.runTestWithMethod(_ENUMS_EQUAL_TYPE_TEXTWithScopedLongEnumTestMethod); + fixture.runTestWithMethod(ENUMS_EQUAL_TYPE_TEXTWithScopedLongEnumTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -1294,7 +1294,7 @@ enum UnscopedEnum { UNSCOPED_ENUM_A, UNSCOPED_ENUM_B }; -static void _ENUMS_EQUAL_INTWithUnscopedEnumTestMethod() +static void ENUMS_EQUAL_INTWithUnscopedEnumTestMethod_() { ENUMS_EQUAL_INT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_B); ENUMS_EQUAL_INT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A); @@ -1302,7 +1302,7 @@ static void _ENUMS_EQUAL_INTWithUnscopedEnumTestMethod() TEST(UnitTestMacros, TestENUMS_EQUAL_INTWithUnscopedEnum) { - fixture.runTestWithMethod(_ENUMS_EQUAL_INTWithUnscopedEnumTestMethod); + fixture.runTestWithMethod(ENUMS_EQUAL_INTWithUnscopedEnumTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0>"); } @@ -1318,14 +1318,14 @@ IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_INTWithUnscopedEnumWorksInAnIgnoredTest) ENUMS_EQUAL_INT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _ENUMS_EQUAL_INT_TEXTWithUnscopedEnumTestMethod() +static void ENUMS_EQUAL_INT_TEXTWithUnscopedEnumTestMethod_() { ENUMS_EQUAL_INT_TEXT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A, "Failed because it failed"); } // LCOV_EXCL_LINE TEST(UnitTestMacros, TestENUMS_EQUAL_INT_TEXTWithUnscopedEnum) { - fixture.runTestWithMethod(_ENUMS_EQUAL_INT_TEXTWithUnscopedEnumTestMethod); + fixture.runTestWithMethod(ENUMS_EQUAL_INT_TEXTWithUnscopedEnumTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -1343,7 +1343,7 @@ IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_EQUAL_INT_TEXTWithUnscopedEnumWorksInAnI } // LCOV_EXCL_LINE #if CPPUTEST_USE_STD_CPP_LIB -static void _failingTestMethod_NoThrowWithCHECK_THROWS() +static void failingTestMethod_NoThrowWithCHECK_THROWS_() { CHECK_THROWS(int, (void) (1+2)); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -1351,13 +1351,13 @@ static void _failingTestMethod_NoThrowWithCHECK_THROWS() TEST(UnitTestMacros, FailureWithCHECK_THROWS_whenDoesntThrow) { - fixture.runTestWithMethod(_failingTestMethod_NoThrowWithCHECK_THROWS); + fixture.runTestWithMethod(failingTestMethod_NoThrowWithCHECK_THROWS_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected to throw int"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but threw nothing"); LONGS_EQUAL(1, fixture.getCheckCount()); } -static void _succeedingTestMethod_CorrectThrowWithCHECK_THROWS() +static void succeedingTestMethod_CorrectThrowWithCHECK_THROWS_() { CHECK_THROWS(int, throw 4); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -1365,11 +1365,11 @@ static void _succeedingTestMethod_CorrectThrowWithCHECK_THROWS() TEST(UnitTestMacros, SuccessWithCHECK_THROWS) { - fixture.runTestWithMethod(_succeedingTestMethod_CorrectThrowWithCHECK_THROWS); + fixture.runTestWithMethod(succeedingTestMethod_CorrectThrowWithCHECK_THROWS_); LONGS_EQUAL(1, fixture.getCheckCount()); } -static void _failingTestMethod_WrongThrowWithCHECK_THROWS() +static void failingTestMethod_WrongThrowWithCHECK_THROWS_() { CHECK_THROWS(int, throw 4.3); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -1377,7 +1377,7 @@ static void _failingTestMethod_WrongThrowWithCHECK_THROWS() TEST(UnitTestMacros, FailureWithCHECK_THROWS_whenWrongThrow) { - fixture.runTestWithMethod(_failingTestMethod_WrongThrowWithCHECK_THROWS); + fixture.runTestWithMethod(failingTestMethod_WrongThrowWithCHECK_THROWS_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected to throw int"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but threw a different type"); LONGS_EQUAL(1, fixture.getCheckCount()); diff --git a/tests/CppUTest/TestUTestStringMacro.cpp b/tests/CppUTest/TestUTestStringMacro.cpp index 5d558bb08..4407ff045 100644 --- a/tests/CppUTest/TestUTestStringMacro.cpp +++ b/tests/CppUTest/TestUTestStringMacro.cpp @@ -36,128 +36,128 @@ TEST_GROUP(UnitTestStringMacros) TestTestingFixture fixture; }; -static void _STRCMP_EQUALWithActualIsNULLTestMethod() +static void STRCMP_EQUALWithActualIsNULLTestMethod_() { STRCMP_EQUAL("ok", NULLPTR); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUALAndActualIsNULL) { - fixture.runTestWithMethod(_STRCMP_EQUALWithActualIsNULLTestMethod); + fixture.runTestWithMethod(STRCMP_EQUALWithActualIsNULLTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <(null)>"); } -static void _STRCMP_EQUALWithExpectedIsNULLTestMethod() +static void STRCMP_EQUALWithExpectedIsNULLTestMethod_() { STRCMP_EQUAL(NULLPTR, "ok"); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUALAndExpectedIsNULL) { - fixture.runTestWithMethod(_STRCMP_EQUALWithExpectedIsNULLTestMethod); + fixture.runTestWithMethod(STRCMP_EQUALWithExpectedIsNULLTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <(null)>"); } -static void _STRCMP_CONTAINSWithActualIsNULLTestMethod() +static void STRCMP_CONTAINSWithActualIsNULLTestMethod_() { STRCMP_CONTAINS("ok", NULLPTR); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINSAndActualIsNULL) { - fixture.runTestWithMethod(_STRCMP_CONTAINSWithActualIsNULLTestMethod); + fixture.runTestWithMethod(STRCMP_CONTAINSWithActualIsNULLTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); } -static void _STRCMP_CONTAINSWithExpectedIsNULLTestMethod() +static void STRCMP_CONTAINSWithExpectedIsNULLTestMethod_() { STRCMP_CONTAINS(NULLPTR, "ok"); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINSAndExpectedIsNULL) { - fixture.runTestWithMethod(_STRCMP_CONTAINSWithExpectedIsNULLTestMethod); + fixture.runTestWithMethod(STRCMP_CONTAINSWithExpectedIsNULLTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain <>"); } -static void _STRNCMP_EQUALWithActualIsNULLTestMethod() +static void STRNCMP_EQUALWithActualIsNULLTestMethod_() { STRNCMP_EQUAL("ok", NULLPTR, 2); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUALAndActualIsNULL) { - fixture.runTestWithMethod(_STRNCMP_EQUALWithActualIsNULLTestMethod); + fixture.runTestWithMethod(STRNCMP_EQUALWithActualIsNULLTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <(null)>"); } -static void _STRNCMP_EQUALWithExpectedIsNULLTestMethod() +static void STRNCMP_EQUALWithExpectedIsNULLTestMethod_() { STRNCMP_EQUAL(NULLPTR, "ok", 2); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUALAndExpectedIsNULL) { - fixture.runTestWithMethod(_STRNCMP_EQUALWithExpectedIsNULLTestMethod); + fixture.runTestWithMethod(STRNCMP_EQUALWithExpectedIsNULLTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <(null)>"); } -static void _STRCMP_NOCASE_EQUALWithActualIsNULLTestMethod() +static void STRCMP_NOCASE_EQUALWithActualIsNULLTestMethod_() { STRCMP_NOCASE_EQUAL("ok", NULLPTR); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUALAndActualIsNULL) { - fixture.runTestWithMethod(_STRCMP_NOCASE_EQUALWithActualIsNULLTestMethod); + fixture.runTestWithMethod(STRCMP_NOCASE_EQUALWithActualIsNULLTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <(null)>"); } -static void _STRCMP_NOCASE_EQUALWithExpectedIsNULLTestMethod() +static void STRCMP_NOCASE_EQUALWithExpectedIsNULLTestMethod_() { STRCMP_NOCASE_EQUAL(NULLPTR, "ok"); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUALAndExpectedIsNULL) { - fixture.runTestWithMethod(_STRCMP_NOCASE_EQUALWithExpectedIsNULLTestMethod); + fixture.runTestWithMethod(STRCMP_NOCASE_EQUALWithExpectedIsNULLTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <(null)>"); } -static void _STRCMP_NOCASE_EQUALWithUnequalInputTestMethod() +static void STRCMP_NOCASE_EQUALWithUnequalInputTestMethod_() { STRCMP_NOCASE_EQUAL("no", "ok"); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUALAndUnequalInput) { - fixture.runTestWithMethod(_STRCMP_NOCASE_EQUALWithUnequalInputTestMethod); + fixture.runTestWithMethod(STRCMP_NOCASE_EQUALWithUnequalInputTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); } -static void _STRCMP_NOCASE_CONTAINSWithActualIsNULLTestMethod() +static void STRCMP_NOCASE_CONTAINSWithActualIsNULLTestMethod_() { STRCMP_NOCASE_CONTAINS("ok", NULLPTR); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_CONTAINSAndActualIsNULL) { - fixture.runTestWithMethod(_STRCMP_NOCASE_CONTAINSWithActualIsNULLTestMethod); + fixture.runTestWithMethod(STRCMP_NOCASE_CONTAINSWithActualIsNULLTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); } -static void _STRCMP_NOCASE_CONTAINSWithExpectedIsNULLTestMethod() +static void STRCMP_NOCASE_CONTAINSWithExpectedIsNULLTestMethod_() { STRCMP_NOCASE_CONTAINS(NULLPTR, "ok"); } // LCOV_EXCL_LINE TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_CONTAINSAndExpectedIsNULL) { - fixture.runTestWithMethod(_STRCMP_NOCASE_CONTAINSWithExpectedIsNULLTestMethod); + fixture.runTestWithMethod(STRCMP_NOCASE_CONTAINSWithExpectedIsNULLTestMethod_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain <>"); } -static void _failingTestMethodWithSTRCMP_EQUAL() +static void failingTestMethodWithSTRCMP_EQUAL_() { STRCMP_EQUAL("hello", "hell"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -165,7 +165,7 @@ static void _failingTestMethodWithSTRCMP_EQUAL() TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUAL) { - fixture.runTestWithMethod(_failingTestMethodWithSTRCMP_EQUAL); + fixture.runTestWithMethod(failingTestMethodWithSTRCMP_EQUAL_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); } @@ -181,7 +181,7 @@ IGNORE_TEST(UnitTestStringMacros, STRCMP_EQUALWorksInAnIgnoredTest) STRCMP_EQUAL("Hello", "World"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithSTRCMP_EQUAL_TEXT() +static void failingTestMethodWithSTRCMP_EQUAL_TEXT_() { STRCMP_EQUAL_TEXT("hello", "hell", "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -189,7 +189,7 @@ static void _failingTestMethodWithSTRCMP_EQUAL_TEXT() TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUAL_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithSTRCMP_EQUAL_TEXT); + fixture.runTestWithMethod(failingTestMethodWithSTRCMP_EQUAL_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -206,7 +206,7 @@ IGNORE_TEST(UnitTestStringMacros, STRCMP_EQUAL_TEXTWorksInAnIgnoredTest) STRCMP_EQUAL_TEXT("Hello", "World", "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithSTRNCMP_EQUAL() +static void failingTestMethodWithSTRNCMP_EQUAL_() { STRNCMP_EQUAL("hello", "hallo", 5); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -214,7 +214,7 @@ static void _failingTestMethodWithSTRNCMP_EQUAL() TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUAL) { - fixture.runTestWithMethod(_failingTestMethodWithSTRNCMP_EQUAL); + fixture.runTestWithMethod(failingTestMethodWithSTRNCMP_EQUAL_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); } @@ -230,7 +230,7 @@ IGNORE_TEST(UnitTestStringMacros, STRNCMP_EQUALWorksInAnIgnoredTest) STRNCMP_EQUAL("Hello", "World", 3); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithSTRNCMP_EQUAL_TEXT() +static void failingTestMethodWithSTRNCMP_EQUAL_TEXT_() { STRNCMP_EQUAL_TEXT("hello", "hallo", 5, "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -238,7 +238,7 @@ static void _failingTestMethodWithSTRNCMP_EQUAL_TEXT() TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUAL_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithSTRNCMP_EQUAL_TEXT); + fixture.runTestWithMethod(failingTestMethodWithSTRNCMP_EQUAL_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -255,7 +255,7 @@ IGNORE_TEST(UnitTestStringMacros, STRNCMP_EQUAL_TEXTWorksInAnIgnoredTest) STRNCMP_EQUAL_TEXT("Hello", "World", 3, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithSTRCMP_NOCASE_EQUAL() +static void failingTestMethodWithSTRCMP_NOCASE_EQUAL_() { STRCMP_NOCASE_EQUAL("hello", "Hell"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -263,7 +263,7 @@ static void _failingTestMethodWithSTRCMP_NOCASE_EQUAL() TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUAL) { - fixture.runTestWithMethod(_failingTestMethodWithSTRCMP_NOCASE_EQUAL); + fixture.runTestWithMethod(failingTestMethodWithSTRCMP_NOCASE_EQUAL_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); } @@ -279,7 +279,7 @@ IGNORE_TEST(UnitTestStringMacros, STRCMP_NOCASE_EQUALWorksInAnIgnoredTest) STRCMP_NOCASE_EQUAL("Hello", "World"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithSTRCMP_NOCASE_EQUAL_TEXT() +static void failingTestMethodWithSTRCMP_NOCASE_EQUAL_TEXT_() { STRCMP_NOCASE_EQUAL_TEXT("hello", "hell", "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -287,7 +287,7 @@ static void _failingTestMethodWithSTRCMP_NOCASE_EQUAL_TEXT() TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUAL_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithSTRCMP_NOCASE_EQUAL_TEXT); + fixture.runTestWithMethod(failingTestMethodWithSTRCMP_NOCASE_EQUAL_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -304,7 +304,7 @@ IGNORE_TEST(UnitTestStringMacros, STRCMP_NOCASE_EQUAL_TEXTWorksInAnIgnoredTest) STRCMP_NOCASE_EQUAL_TEXT("Hello", "World", "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithSTRCMP_CONTAINS() +static void failingTestMethodWithSTRCMP_CONTAINS_() { STRCMP_CONTAINS("hello", "world"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -312,7 +312,7 @@ static void _failingTestMethodWithSTRCMP_CONTAINS() TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINS) { - fixture.runTestWithMethod(_failingTestMethodWithSTRCMP_CONTAINS); + fixture.runTestWithMethod(failingTestMethodWithSTRCMP_CONTAINS_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("actual "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); } @@ -328,7 +328,7 @@ IGNORE_TEST(UnitTestStringMacros, STRCMP_CONTAINSWorksInAnIgnoredTest) STRCMP_CONTAINS("Hello", "World"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithSTRCMP_CONTAINS_TEXT() +static void failingTestMethodWithSTRCMP_CONTAINS_TEXT_() { STRCMP_CONTAINS_TEXT("hello", "world", "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -336,7 +336,7 @@ static void _failingTestMethodWithSTRCMP_CONTAINS_TEXT() TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINS_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithSTRCMP_CONTAINS_TEXT); + fixture.runTestWithMethod(failingTestMethodWithSTRCMP_CONTAINS_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("actual "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -353,7 +353,7 @@ IGNORE_TEST(UnitTestStringMacros, STRCMP_CONTAINS_TEXTWorksInAnIgnoredTest) STRCMP_CONTAINS_TEXT("Hello", "World", "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithSTRCMP_NOCASE_CONTAINS() +static void failingTestMethodWithSTRCMP_NOCASE_CONTAINS_() { STRCMP_NOCASE_CONTAINS("hello", "WORLD"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -361,7 +361,7 @@ static void _failingTestMethodWithSTRCMP_NOCASE_CONTAINS() TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_CONTAINS) { - fixture.runTestWithMethod(_failingTestMethodWithSTRCMP_NOCASE_CONTAINS); + fixture.runTestWithMethod(failingTestMethodWithSTRCMP_NOCASE_CONTAINS_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("actual "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); } @@ -377,7 +377,7 @@ IGNORE_TEST(UnitTestStringMacros, STRCMP_NO_CASE_CONTAINSWorksInAnIgnoredTest) STRCMP_NOCASE_CONTAINS("Hello", "World"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithSTRCMP_NOCASE_CONTAINS_TEXT() +static void failingTestMethodWithSTRCMP_NOCASE_CONTAINS_TEXT_() { STRCMP_NOCASE_CONTAINS_TEXT("hello", "WORLD", "Failed because it failed"); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -385,7 +385,7 @@ static void _failingTestMethodWithSTRCMP_NOCASE_CONTAINS_TEXT() TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_CONTAINS_TEXT) { - fixture.runTestWithMethod(_failingTestMethodWithSTRCMP_NOCASE_CONTAINS_TEXT); + fixture.runTestWithMethod(failingTestMethodWithSTRCMP_NOCASE_CONTAINS_TEXT_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("actual "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Failed because it failed"); @@ -410,7 +410,7 @@ TEST(UnitTestStringMacros, NFirstCharsComparison) STRNCMP_EQUAL("Hello World!", "Hello", 5); } -static void _compareNFirstCharsWithUpperAndLowercase() +static void compareNFirstCharsWithUpperAndLowercase_() { STRNCMP_EQUAL("hello world!", "HELLO WORLD!", 12); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -418,13 +418,13 @@ static void _compareNFirstCharsWithUpperAndLowercase() TEST(UnitTestStringMacros, CompareNFirstCharsWithUpperAndLowercase) { - fixture.runTestWithMethod(_compareNFirstCharsWithUpperAndLowercase); + fixture.runTestWithMethod(compareNFirstCharsWithUpperAndLowercase_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("difference starts at position 0"); } -static void _compareNFirstCharsWithDifferenceInTheMiddle() +static void compareNFirstCharsWithDifferenceInTheMiddle_() { STRNCMP_EQUAL("Hello World!", "Hello Peter!", 12); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -432,13 +432,13 @@ static void _compareNFirstCharsWithDifferenceInTheMiddle() TEST(UnitTestStringMacros, CompareNFirstCharsWithDifferenceInTheMiddle) { - fixture.runTestWithMethod(_compareNFirstCharsWithDifferenceInTheMiddle); + fixture.runTestWithMethod(compareNFirstCharsWithDifferenceInTheMiddle_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("difference starts at position 6"); } -static void _compareNFirstCharsWithEmptyString() +static void compareNFirstCharsWithEmptyString_() { STRNCMP_EQUAL("", "Not empty string", 5); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -446,13 +446,13 @@ static void _compareNFirstCharsWithEmptyString() TEST(UnitTestStringMacros, CompareNFirstCharsWithEmptyString) { - fixture.runTestWithMethod(_compareNFirstCharsWithEmptyString); + fixture.runTestWithMethod(compareNFirstCharsWithEmptyString_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("difference starts at position 0"); } -static void _compareNFirstCharsWithLastCharDifferent() +static void compareNFirstCharsWithLastCharDifferent_() { STRNCMP_EQUAL("Not empty string?", "Not empty string!", 17); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE @@ -460,9 +460,8 @@ static void _compareNFirstCharsWithLastCharDifferent() TEST(UnitTestStringMacros, CompareNFirstCharsWithLastCharDifferent) { - fixture.runTestWithMethod(_compareNFirstCharsWithLastCharDifferent); + fixture.runTestWithMethod(compareNFirstCharsWithLastCharDifferent_); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); CHECK_TEST_FAILS_PROPER_WITH_TEXT("difference starts at position 16"); } - diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index 408c06dcf..52021dee6 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -56,13 +56,13 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, DummyFailsWit #else -static void _failFunction() +static void failFunction_() { FAIL("This test fails"); } -static void _exitNonZeroFunction() _no_return_; -static void _exitNonZeroFunction() +static void exitNonZeroFunction_() _no_return_; +static void exitNonZeroFunction_() { /* destructor of static objects will be called. If StringCache was there then the allocator will report invalid deallocations of static SimpleString */ SimpleString::setStringAllocator(SimpleString::getStringAllocator()->actualAllocator()); @@ -101,7 +101,7 @@ extern "C" { #include #include -static void _stoppedTestFunction() +static void stoppedTestFunction_() { kill(getpid(), SIGSTOP); } @@ -116,7 +116,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, TestInSeparat TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, FailureInSeparateProcessWorks) { fixture.setRunTestsInSeperateProcess(); - fixture.setTestFunction(_failFunction); + fixture.setTestFunction(failFunction_); fixture.runAllTests(); fixture.assertPrintContains("Failed in separate process"); fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out"); @@ -124,7 +124,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, FailureInSepa #if (! CPPUTEST_SANITIZE_ADDRESS) -static int _accessViolationTestFunction() +static int accessViolationTestFunction_() { return *(volatile int*) NULLPTR; } @@ -132,7 +132,7 @@ static int _accessViolationTestFunction() TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, AccessViolationInSeparateProcessWorks) { fixture.setRunTestsInSeperateProcess(); - fixture.setTestFunction((void(*)())_accessViolationTestFunction); + fixture.setTestFunction((void(*)())accessViolationTestFunction_); fixture.runAllTests(); fixture.assertPrintContains("Failed in separate process - killed by signal 11"); fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran"); @@ -143,7 +143,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, AccessViolati TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, StoppedInSeparateProcessWorks) { fixture.setRunTestsInSeperateProcess(); - fixture.setTestFunction(_stoppedTestFunction); + fixture.setTestFunction(stoppedTestFunction_); fixture.runAllTests(); fixture.assertPrintContains("Stopped in separate process - continuing"); fixture.assertPrintContains("Errors (1 failures, 1 tests, 1 ran"); @@ -198,9 +198,9 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, MultipleTests { fixture.setRunTestsInSeperateProcess(); fixture.runTestWithMethod(NULLPTR); - fixture.runTestWithMethod(_stoppedTestFunction); + fixture.runTestWithMethod(stoppedTestFunction_); fixture.runTestWithMethod(NULLPTR); - fixture.runTestWithMethod(_exitNonZeroFunction); + fixture.runTestWithMethod(exitNonZeroFunction_); fixture.runTestWithMethod(NULLPTR); fixture.assertPrintContains("Failed in separate process"); fixture.assertPrintContains("Stopped in separate process"); @@ -209,4 +209,3 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, MultipleTests #endif #endif - diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index cfb14f0c6..a53eb68fd 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -35,22 +35,22 @@ TEST_GROUP(UtestShell) TestTestingFixture fixture; }; -static void _failMethod() +static void failMethod_() { FAIL("This test fails"); } -static void _passingTestMethod() +static void passingTestMethod_() { CHECK(true); } -static void _passingCheckEqualTestMethod() +static void passingCheckEqualTestMethod_() { CHECK_EQUAL(1, 1); } -static void _exitTestMethod() +static void exitTestMethod_() { TEST_EXIT; FAIL("Should not get here"); @@ -78,14 +78,14 @@ TEST(UtestShell, compareDoubles) TEST(UtestShell, FailWillIncreaseTheAmountOfChecks) { - fixture.setTestFunction(_failMethod); + fixture.setTestFunction(failMethod_); fixture.runAllTests(); LONGS_EQUAL(1, fixture.getCheckCount()); } TEST(UtestShell, PassedCheckEqualWillIncreaseTheAmountOfChecks) { - fixture.setTestFunction(_passingCheckEqualTestMethod); + fixture.setTestFunction(passingCheckEqualTestMethod_); fixture.runAllTests(); LONGS_EQUAL(1, fixture.getCheckCount()); } @@ -98,8 +98,8 @@ IGNORE_TEST(UtestShell, IgnoreTestAccessingFixture) TEST(UtestShell, MacrosUsedInSetup) { IGNORE_ALL_LEAKS_IN_TEST(); - fixture.setSetup(_failMethod); - fixture.setTestFunction(_passingTestMethod); + fixture.setSetup(failMethod_); + fixture.setTestFunction(passingTestMethod_); fixture.runAllTests(); LONGS_EQUAL(1, fixture.getFailureCount()); } @@ -107,15 +107,15 @@ TEST(UtestShell, MacrosUsedInSetup) TEST(UtestShell, MacrosUsedInTearDown) { IGNORE_ALL_LEAKS_IN_TEST(); - fixture.setTeardown(_failMethod); - fixture.setTestFunction(_passingTestMethod); + fixture.setTeardown(failMethod_); + fixture.setTestFunction(passingTestMethod_); fixture.runAllTests(); LONGS_EQUAL(1, fixture.getFailureCount()); } TEST(UtestShell, ExitLeavesQuietly) { - fixture.setTestFunction(_exitTestMethod); + fixture.setTestFunction(exitTestMethod_); fixture.runAllTests(); LONGS_EQUAL(0, fixture.getFailureCount()); } @@ -132,7 +132,7 @@ TEST(UtestShell, FailWillNotCrashIfNotEnabled) cpputestHasCrashed = false; UtestShell::setCrashMethod(crashMethod); - fixture.setTestFunction(_failMethod); + fixture.setTestFunction(failMethod_); fixture.runAllTests(); CHECK_FALSE(cpputestHasCrashed); @@ -147,7 +147,7 @@ TEST(UtestShell, FailWillCrashIfEnabled) UtestShell::setCrashOnFail(); UtestShell::setCrashMethod(crashMethod); - fixture.setTestFunction(_failMethod); + fixture.setTestFunction(failMethod_); fixture.runAllTests(); CHECK(cpputestHasCrashed); @@ -160,7 +160,7 @@ TEST(UtestShell, FailWillCrashIfEnabled) static int teardownCalled = 0; -static void _teardownMethod() +static void teardownMethod_() { teardownCalled++; } @@ -169,15 +169,15 @@ TEST(UtestShell, TeardownCalledAfterTestFailure) { teardownCalled = 0; IGNORE_ALL_LEAKS_IN_TEST(); - fixture.setTeardown(_teardownMethod); - fixture.setTestFunction(_failMethod); + fixture.setTeardown(teardownMethod_); + fixture.setTestFunction(failMethod_); fixture.runAllTests(); LONGS_EQUAL(1, fixture.getFailureCount()); LONGS_EQUAL(1, teardownCalled); } static int stopAfterFailure = 0; -static void _stopAfterFailureMethod() +static void stopAfterFailureMethod_() { FAIL("fail"); stopAfterFailure++; @@ -187,7 +187,7 @@ TEST(UtestShell, TestStopsAfterTestFailure) { IGNORE_ALL_LEAKS_IN_TEST(); stopAfterFailure = 0; - fixture.setTestFunction(_stopAfterFailureMethod); + fixture.setTestFunction(stopAfterFailureMethod_); fixture.runAllTests(); CHECK(fixture.hasTestFailed()); LONGS_EQUAL(1, fixture.getFailureCount()); @@ -197,9 +197,9 @@ TEST(UtestShell, TestStopsAfterTestFailure) TEST(UtestShell, TestStopsAfterSetupFailure) { stopAfterFailure = 0; - fixture.setSetup(_stopAfterFailureMethod); - fixture.setTeardown(_stopAfterFailureMethod); - fixture.setTestFunction(_failMethod); + fixture.setSetup(stopAfterFailureMethod_); + fixture.setTeardown(stopAfterFailureMethod_); + fixture.setTestFunction(failMethod_); fixture.runAllTests(); LONGS_EQUAL(2, fixture.getFailureCount()); LONGS_EQUAL(0, stopAfterFailure); @@ -271,7 +271,7 @@ TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) static bool destructorWasCalledOnFailedTest = false; -static void _destructorCalledForLocalObjects() +static void destructorCalledForLocalObjects_() { SetBooleanOnDestructorCall pleaseCallTheDestructor(destructorWasCalledOnFailedTest); destructorWasCalledOnFailedTest = false; @@ -280,7 +280,7 @@ static void _destructorCalledForLocalObjects() TEST(UtestShell, DestructorIsCalledForLocalObjectsWhenTheTestFails) { - fixture.setTestFunction(_destructorCalledForLocalObjects); + fixture.setTestFunction(destructorCalledForLocalObjects_); fixture.runAllTests(); CHECK(destructorWasCalledOnFailedTest); } diff --git a/tests/CppUTestExt/GTest1Test.cpp b/tests/CppUTestExt/GTest1Test.cpp index a22639cea..41a130886 100644 --- a/tests/CppUTestExt/GTest1Test.cpp +++ b/tests/CppUTestExt/GTest1Test.cpp @@ -117,37 +117,37 @@ TEST(gtest, SimpleGoogleTestGetCalled) static bool afterCheck; -static void _failMethodEXPECT_EQ() +static void failMethodEXPECT_EQ_() { EXPECT_EQ(1, 2); afterCheck = true; } -static void _failMethodASSERT_EQ() +static void failMethodASSERT_EQ_() { ASSERT_EQ(1, 2); afterCheck = true; } -static void _failMethodEXPECT_TRUE() +static void failMethodEXPECT_TRUE_() { EXPECT_TRUE(false); afterCheck = true; } -static void _failMethodASSERT_TRUE() +static void failMethodASSERT_TRUE_() { ASSERT_TRUE(false); afterCheck = true; } -static void _failMethodEXPECT_FALSE() +static void failMethodEXPECT_FALSE_() { EXPECT_FALSE(true); afterCheck = true; } -static void _failMethodEXPECT_STREQ() +static void failMethodEXPECT_STREQ_() { EXPECT_STREQ("hello", "world"); afterCheck = true; @@ -178,32 +178,32 @@ TEST_GROUP(gtestMacros) TEST(gtestMacros, EXPECT_EQFails) { - testFailureWith(_failMethodEXPECT_EQ); + testFailureWith(failMethodEXPECT_EQ_); } TEST(gtestMacros, EXPECT_TRUEFails) { - testFailureWith(_failMethodEXPECT_TRUE); + testFailureWith(failMethodEXPECT_TRUE_); } TEST(gtestMacros, EXPECT_FALSEFails) { - testFailureWith(_failMethodEXPECT_FALSE); + testFailureWith(failMethodEXPECT_FALSE_); } TEST(gtestMacros, EXPECT_STREQFails) { - testFailureWith(_failMethodEXPECT_STREQ); + testFailureWith(failMethodEXPECT_STREQ_); } TEST(gtestMacros, ASSERT_EQFails) { - testFailureWith(_failMethodASSERT_EQ); + testFailureWith(failMethodASSERT_EQ_); } TEST(gtestMacros, ASSERT_TRUEFails) { - testFailureWith(_failMethodASSERT_TRUE); + testFailureWith(failMethodASSERT_TRUE_); } #endif diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index 133f4d0b1..6802dab37 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -39,7 +39,7 @@ extern "C" #include "IEEE754PluginTest_c.h" } -TEST_GROUP(FE__with_Plugin) +TEST_GROUP(FE_with_Plugin) { TestTestingFixture fixture; IEEE754ExceptionsPlugin ieee754Plugin; @@ -49,28 +49,28 @@ TEST_GROUP(FE__with_Plugin) } }; -TEST(FE__with_Plugin, should_fail____when__FE_DIVBYZERO__is_set) +TEST(FE_with_Plugin, should_fail_when_FE_DIVBYZERO_is_set) { fixture.setTestFunction(set_divisionbyzero_c); fixture.runAllTests(); fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_DIVBYZERO) failed"); } -TEST(FE__with_Plugin, should_fail____when__FE_OVERFLOW___is_set) +TEST(FE_with_Plugin, should_fail_when_FE_OVERFLOW_is_set) { fixture.setTestFunction(set_overflow_c); fixture.runAllTests(); fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_OVERFLOW) failed"); } -TEST(FE__with_Plugin, should_fail____when__FE_UNDERFLOW__is_set) +TEST(FE_with_Plugin, should_fail_when_FE_UNDERFLOW_is_set) { fixture.setTestFunction(set_underflow_c); fixture.runAllTests(); fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_UNDERFLOW) failed"); } -TEST(FE__with_Plugin, should_fail____when__FE_INEXACT____is_set_and_enabled) +TEST(FE_with_Plugin, should_fail_when_FE_INEXACT_is_set_and_enabled) { IEEE754ExceptionsPlugin::enableInexact(); fixture.setTestFunction(set_inexact_c); @@ -78,7 +78,7 @@ TEST(FE__with_Plugin, should_fail____when__FE_INEXACT____is_set_and_enabled) fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_INEXACT) failed"); } -TEST(FE__with_Plugin, should_succeed_when__FE_INEXACT____is_set_and_disabled) +TEST(FE_with_Plugin, should_succeed_when_FE_INEXACT_is_set_and_disabled) { IEEE754ExceptionsPlugin::enableInexact(); IEEE754ExceptionsPlugin::disableInexact(); @@ -87,7 +87,7 @@ TEST(FE__with_Plugin, should_succeed_when__FE_INEXACT____is_set_and_disabled) fixture.assertPrintContains("OK"); } -TEST(FE__with_Plugin, should_succeed_with_5_checks_when_no_flags_are_set) +TEST(FE_with_Plugin, should_succeed_with_5_checks_when_no_flags_are_set) { IEEE754ExceptionsPlugin::enableInexact(); fixture.setTestFunction(set_nothing_c); @@ -96,14 +96,14 @@ TEST(FE__with_Plugin, should_succeed_with_5_checks_when_no_flags_are_set) IEEE754ExceptionsPlugin::disableInexact(); } -TEST(FE__with_Plugin, should_check_five_times_when_all_flags_are_set) +TEST(FE_with_Plugin, should_check_five_times_when_all_flags_are_set) { fixture.setTestFunction(set_everything_c); fixture.runAllTests(); LONGS_EQUAL(5, fixture.getCheckCount()); } -TEST(FE__with_Plugin, should_fail_only_once_when_all_flags_are_set) +TEST(FE_with_Plugin, should_fail_only_once_when_all_flags_are_set) { fixture.setTestFunction(set_everything_c); fixture.runAllTests(); @@ -116,7 +116,7 @@ static void set_everything_but_already_failed(void) CHECK(1 == 2); } -TEST(FE__with_Plugin, should_not_fail_again_when_test_has_already_failed) +TEST(FE_with_Plugin, should_not_fail_again_when_test_has_already_failed) { fixture.setTestFunction(set_everything_but_already_failed); fixture.runAllTests(); diff --git a/tests/CppUTestExt/MockFakeLongLong.cpp b/tests/CppUTestExt/MockFakeLongLong.cpp index cc6b3462e..05ae48d3b 100644 --- a/tests/CppUTestExt/MockFakeLongLong.cpp +++ b/tests/CppUTestExt/MockFakeLongLong.cpp @@ -44,7 +44,7 @@ TEST_GROUP(FakeLongLongs) #define CHECK_TEST_FAILS_PROPER_WITH_TEXT(text) fixture.checkTestFailsWithProperTestLocation(text, __FILE__, __LINE__) -static void _actualCallWithFakeLongLongParameter() +static void actualCallWithFakeLongLongParameter_() { cpputest_longlong value = {0}; @@ -55,12 +55,12 @@ static void _actualCallWithFakeLongLongParameter() TEST(FakeLongLongs, ActualCallWithFakeLongLongParameterFAILS) { - fixture.runTestWithMethod(_actualCallWithFakeLongLongParameter); + fixture.runTestWithMethod(actualCallWithFakeLongLongParameter); mock().clear(); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Long Long type is not supported"); } -static void _actualCallWithFakeUnsignedLongLongParameter() +static void actualCallWithFakeUnsignedLongLongParameter_() { cpputest_ulonglong value = {0}; @@ -71,12 +71,12 @@ static void _actualCallWithFakeUnsignedLongLongParameter() TEST(FakeLongLongs, ActualCallWithFakeUnsignedLongLongParameterFAILS) { - fixture.runTestWithMethod(_actualCallWithFakeUnsignedLongLongParameter); + fixture.runTestWithMethod(actualCallWithFakeUnsignedLongLongParameter_); mock().clear(); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Unsigned Long Long type is not supported"); } -static void _actualCallWithFakeLongLongReturn() +static void actualCallWithFakeLongLongReturn_() { mock().expectOneCall("foo").andReturnValue(0); mock().actualCall("foo").returnLongLongIntValue(); @@ -85,12 +85,12 @@ static void _actualCallWithFakeLongLongReturn() TEST(FakeLongLongs, ActualCallWithFakeLongLongReturnFAILS) { - fixture.runTestWithMethod(_actualCallWithFakeLongLongReturn); + fixture.runTestWithMethod(actualCallWithFakeLongLongReturn_); mock().clear(); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Long Long type is not supported"); } -static void _actualCallWithFakeUnsignedLongLongReturn() +static void actualCallWithFakeUnsignedLongLongReturn_() { mock().expectOneCall("foo").andReturnValue(0); mock().actualCall("foo").returnUnsignedLongLongIntValue(); @@ -99,12 +99,12 @@ static void _actualCallWithFakeUnsignedLongLongReturn() TEST(FakeLongLongs, ActualCallWithFakeUnsignedLongLongReturnFAILS) { - fixture.runTestWithMethod(_actualCallWithFakeUnsignedLongLongReturn); + fixture.runTestWithMethod(actualCallWithFakeUnsignedLongLongReturn_); mock().clear(); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Unsigned Long Long type is not supported"); } -static void _expectOneCallWithFakeLongLongParameter() +static void expectOneCallWithFakeLongLongParameter_() { cpputest_longlong value = {0}; @@ -115,12 +115,12 @@ static void _expectOneCallWithFakeLongLongParameter() TEST(FakeLongLongs, ExpectedCallWithFakeLongLongParameterFAILS) { - fixture.runTestWithMethod(_expectOneCallWithFakeLongLongParameter); + fixture.runTestWithMethod(expectOneCallWithFakeLongLongParameter_); mock().clear(); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Long Long type is not supported"); } -static void _expectOneCallWithFakeUnsignedLongLongParameter() +static void expectOneCallWithFakeUnsignedLongLongParameter_() { cpputest_ulonglong value = {0}; @@ -131,12 +131,12 @@ static void _expectOneCallWithFakeUnsignedLongLongParameter() TEST(FakeLongLongs, ExpectedCallWithFakeUnsignedLongLongParameterFAILS) { - fixture.runTestWithMethod(_expectOneCallWithFakeUnsignedLongLongParameter); + fixture.runTestWithMethod(expectOneCallWithFakeUnsignedLongLongParameter_); mock().clear(); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Unsigned Long Long type is not supported"); } -static void _expectOneCallWithFakeLongLongReturn() +static void expectOneCallWithFakeLongLongReturn_() { cpputest_longlong value = {0}; @@ -147,12 +147,12 @@ static void _expectOneCallWithFakeLongLongReturn() TEST(FakeLongLongs, ExpectedCallWithFakeLongLongReturnFAILS) { - fixture.runTestWithMethod(_expectOneCallWithFakeLongLongReturn); + fixture.runTestWithMethod(expectOneCallWithFakeLongLongReturn_); mock().clear(); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Long Long type is not supported"); } -static void _expectOneCallWithFakeUnsignedLongLongReturn() +static void expectOneCallWithFakeUnsignedLongLongReturn_() { cpputest_ulonglong value = {0}; @@ -163,7 +163,7 @@ static void _expectOneCallWithFakeUnsignedLongLongReturn() TEST(FakeLongLongs, ExpectedCallWithFakeUnsignedLongLongReturnFAILS) { - fixture.runTestWithMethod(_expectOneCallWithFakeUnsignedLongLongReturn); + fixture.runTestWithMethod(expectOneCallWithFakeUnsignedLongLongReturn_); mock().clear(); CHECK_TEST_FAILS_PROPER_WITH_TEXT("Unsigned Long Long type is not supported"); } diff --git a/tests/CppUTestExt/MockPluginTest.cpp b/tests/CppUTestExt/MockPluginTest.cpp index 39819ea6e..2e48ac8e4 100644 --- a/tests/CppUTestExt/MockPluginTest.cpp +++ b/tests/CppUTestExt/MockPluginTest.cpp @@ -160,7 +160,7 @@ TEST(MockPlugin, preTestActionWillEnableMultipleComparatorsToTheGlobalMockSuppor plugin.clear(); } -static void _failTwiceFunction() +static void failTwiceFunction_() { mock().expectOneCall("foobar"); FAIL("This failed"); @@ -170,7 +170,7 @@ TEST(MockPlugin, shouldNotFailAgainWhenTestAlreadyFailed) { TestTestingFixture fixture; fixture.installPlugin(&plugin); - fixture.setTestFunction(_failTwiceFunction); + fixture.setTestFunction(failTwiceFunction_); fixture.runAllTests(); fixture.assertPrintContains("1 failures, 1 tests, 1 ran, 2 checks,"); } From e360330b47c5791df6757360c3aa58a2000d2f0b Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Mon, 1 Nov 2021 13:50:49 +1000 Subject: [PATCH 0646/1093] Update SimpleString.cpp the Borland compiler does not like the expression (*s1++ = *s2++) as part of a while condition, This commit rewrites the while loop, moving the assignment out of the while test expression. --- src/CppUTest/SimpleString.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 1f2928f2d..20862fb0d 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -196,8 +196,10 @@ char* SimpleString::StrNCpy(char* s1, const char* s2, size_t n) if((NULLPTR == s1) || (0 == n)) return result; - while ((*s1++ = *s2++) && --n != 0) - ; + *s1 = *s2; + while ((--n != 0) && *s1){ + *++s1 = *++s2; + } return result; } From 908a794035873efad04128425c4d96c0c451eef2 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Thu, 4 Nov 2021 06:34:42 +1000 Subject: [PATCH 0647/1093] Update SimpleString.cpp Borland 5.4 does not like (str = StrStr(str, substr.getBuffer())) in a while condition. This rewrites the while() moving the assignment out of the while condition --- src/CppUTest/SimpleString.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 20862fb0d..aa4338b5b 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -358,9 +358,15 @@ size_t SimpleString::count(const SimpleString& substr) const { size_t num = 0; const char* str = getBuffer(); - while (*str && (str = StrStr(str, substr.getBuffer()))) { + const char* strpart; + if (*str){ + strpart = StrStr(str, substr.getBuffer()); + } + while (*str && strpart) { + str = strpart; str++; num++; + strpart = StrStr(str, substr.getBuffer()); } return num; } From 4d75573f132890536478f2dc807bd8467b5615d6 Mon Sep 17 00:00:00 2001 From: Thomas Willson Date: Wed, 27 Oct 2021 16:36:43 -0700 Subject: [PATCH 0648/1093] More reliable `gettimeofday` detection. `src/Platforms/Gcc/UTestPlatform.cpp:38` relies on it being defined in `sys/time.h` but that header is not present with TI-CGT-ARM despite the test succeeding. Updated the adjacent tests with the same problem. --- CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ed077c60..d79c810f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,23 +18,24 @@ endif() # Check for functions before setting a lot of stuff include(CheckFunctionExists) +include(CheckSymbolExists) set (CMAKE_REQUIRED_INCLUDES "unistd.h") -check_function_exists(fork HAVE_FORK) +check_symbol_exists(fork "unistd.h" HAVE_FORK) if(HAVE_FORK) add_definitions(-DCPPUTEST_HAVE_FORK) endif(HAVE_FORK) -check_function_exists(waitpid HAVE_WAITPID) +check_symbol_exists(waitpid "sys/wait.h" HAVE_WAITPID) if(HAVE_WAITPID) add_definitions(-DCPPUTEST_HAVE_WAITPID) endif(HAVE_WAITPID) -check_function_exists(gettimeofday HAVE_GETTIMEOFDAY) +check_symbol_exists(gettimeofday "sys/time.h" HAVE_GETTIMEOFDAY) if(HAVE_GETTIMEOFDAY) add_definitions(-DCPPUTEST_HAVE_GETTIMEOFDAY=1) endif(HAVE_GETTIMEOFDAY) -check_function_exists(pthread_mutex_lock HAVE_PTHREAD_MUTEX_LOCK) +check_symbol_exists(pthread_mutex_lock "pthread.h" HAVE_PTHREAD_MUTEX_LOCK) if(HAVE_PTHREAD_MUTEX_LOCK) add_definitions(-DCPPUTEST_HAVE_PTHREAD_MUTEX_LOCK=1) endif(HAVE_PTHREAD_MUTEX_LOCK) From 76956b6f32f913fdb0d70516c6b7eaa3e7a5eadb Mon Sep 17 00:00:00 2001 From: lokimon <1200251+lokimon@users.noreply.github.com> Date: Thu, 4 Nov 2021 20:41:09 -0500 Subject: [PATCH 0649/1093] add -ll argument for retrieving test locations (file names and line numbers) --- include/CppUTest/CommandLineArguments.h | 2 ++ include/CppUTest/TestRegistry.h | 1 + src/CppUTest/CommandLineArguments.cpp | 8 ++++++- src/CppUTest/CommandLineTestRunner.cpp | 7 ++++++ src/CppUTest/TestRegistry.cpp | 20 +++++++++++++++++ tests/CppUTest/CommandLineTestRunnerTest.cpp | 10 +++++++++ tests/CppUTest/TestRegistryTest.cpp | 23 ++++++++++++++++++++ 7 files changed, 70 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index c178602bd..f5661f009 100644 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -47,6 +47,7 @@ class CommandLineArguments bool isColor() const; bool isListingTestGroupNames() const; bool isListingTestGroupAndCaseNames() const; + bool isListingTestLocations() const; bool isRunIgnored() const; size_t getRepeatCount() const; bool isShuffling() const; @@ -80,6 +81,7 @@ class CommandLineArguments bool runTestsAsSeperateProcess_; bool listTestGroupNames_; bool listTestGroupAndCaseNames_; + bool listTestLocations_; bool runIgnored_; bool reversing_; bool crashOnFail_; diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index 36617a2c7..e57e52ccd 100644 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -55,6 +55,7 @@ class TestRegistry virtual void reverseTests(); virtual void listTestGroupNames(TestResult& result); virtual void listTestGroupAndCaseNames(TestResult& result); + virtual void listTestLocations(TestResult& result); virtual void setNameFilters(const TestFilter* filters); virtual void setGroupFilters(const TestFilter* filters); virtual void installPlugin(TestPlugin* plugin); diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index c113a2f28..572688d08 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -30,7 +30,7 @@ #include "CppUTest/PlatformSpecificFunctions.h" CommandLineArguments::CommandLineArguments(int ac, const char *const *av) : - ac_(ac), av_(av), needHelp_(false), verbose_(false), veryVerbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnored_(false), reversing_(false), crashOnFail_(false), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) + ac_(ac), av_(av), needHelp_(false), verbose_(false), veryVerbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), listTestLocations_(false), runIgnored_(false), reversing_(false), crashOnFail_(false), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) { } @@ -65,6 +65,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument == "-b") reversing_ = true; else if (argument == "-lg") listTestGroupNames_ = true; else if (argument == "-ln") listTestGroupAndCaseNames_ = true; + else if (argument == "-ll") listTestLocations_ = true; else if (argument == "-ri") runIgnored_ = true; else if (argument == "-f") crashOnFail_ = true; else if (argument.startsWith("-r")) setRepeatCount(ac_, av_, i); @@ -171,6 +172,11 @@ bool CommandLineArguments::isListingTestGroupAndCaseNames() const return listTestGroupAndCaseNames_; } +bool CommandLineArguments::isListingTestLocations() const +{ + return listTestLocations_; +} + bool CommandLineArguments::isRunIgnored() const { return runIgnored_; diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index ec2cb3847..69569de8e 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -120,6 +120,13 @@ int CommandLineTestRunner::runAllTests() return 0; } + if (arguments_->isListingTestLocations()) + { + TestResult tr(*output_); + registry_->listTestLocations(tr); + return 0; + } + if (arguments_->isReversing()) registry_->reverseTests(); diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index aa99c531e..3bf3eab8b 100644 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -123,6 +123,26 @@ void TestRegistry::listTestGroupAndCaseNames(TestResult& result) result.print(groupAndNameList.asCharString()); } +void TestRegistry::listTestLocations(TestResult& result) +{ + SimpleString testLocations; + + for (UtestShell *test = tests_; test != NULLPTR; test = test->getNext()) { + SimpleString testLocation; + testLocation += test->getGroup(); + testLocation += "."; + testLocation += test->getName(); + testLocation += "."; + testLocation += test->getFile(); + testLocation += "."; + testLocation += StringFromFormat("%d\n",test->getLineNumber()); + + testLocations += testLocation; + } + + result.print(testLocations.asCharString()); +} + bool TestRegistry::endOfGroup(UtestShell* test) { return (!test || !test->getNext() || test->getGroup() != test->getNext()->getGroup()); diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index 39a49cf2e..29b74526d 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -269,6 +269,16 @@ TEST(CommandLineTestRunner, listTestGroupAndCaseNamesShouldWorkProperly) STRCMP_CONTAINS("group1.test1", commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().asCharString()); } +TEST(CommandLineTestRunner, listTestLocationsShouldWorkProperly) +{ + const char* argv[] = { "tests.exe", "-ll" }; + + CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); + commandLineTestRunner.runAllTestsMain(); + + STRCMP_CONTAINS("group1.test1", commandLineTestRunner.fakeConsoleOutputWhichIsReallyABuffer->getOutput().asCharString()); +} + TEST(CommandLineTestRunner, randomShuffleSeedIsPrintedAndRandFuncIsExercised) { // more than 1 item in test list ensures that shuffle algorithm calls rand_() diff --git a/tests/CppUTest/TestRegistryTest.cpp b/tests/CppUTest/TestRegistryTest.cpp index eb4f50145..b3d26220a 100644 --- a/tests/CppUTest/TestRegistryTest.cpp +++ b/tests/CppUTest/TestRegistryTest.cpp @@ -361,6 +361,29 @@ TEST(TestRegistry, listTestGroupAndCaseNames_shouldListBackwardsGroupATestaAfter STRCMP_EQUAL("GROUP_A.test_aa GROUP_B.test_b GROUP_A.test_a", s.asCharString()); } +TEST(TestRegistry, listTestLocations_shouldListBackwardsGroupATestaAfterGroupAtestaa) +{ + test1->setGroupName("GROUP_A"); + test1->setTestName("test_a"); + test1->setFileName("cpptest_simple/my_tests/testa.cpp"); + test1->setLineNumber(100); + myRegistry->addTest(test1); + test2->setGroupName("GROUP_B"); + test2->setTestName("test_b"); + test2->setFileName("cpptest_simple/my tests/testb.cpp"); + test2->setLineNumber(200); + myRegistry->addTest(test2); + test3->setGroupName("GROUP_A"); + test3->setTestName("test_aa"); + test3->setFileName("cpptest_simple/my_tests/testaa.cpp"); + test3->setLineNumber(300); + myRegistry->addTest(test3); + + myRegistry->listTestLocations(*result); + SimpleString s = output->getOutput(); + STRCMP_EQUAL("GROUP_A.test_aa.cpptest_simple/my_tests/testaa.cpp.300\nGROUP_B.test_b.cpptest_simple/my tests/testb.cpp.200\nGROUP_A.test_a.cpptest_simple/my_tests/testa.cpp.100\n", s.asCharString()); +} + TEST(TestRegistry, shuffleEmptyListIsNoOp) { CHECK_TRUE(myRegistry->getFirstTest() == NULLPTR); From 1d4c4585da55219550f8f4771d9d6b1af74026bd Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 5 Nov 2021 20:02:40 +0100 Subject: [PATCH 0650/1093] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b47c71f0d..4809434db 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ CppUTest ======== -[![Build Status](https://travis-ci.org/cpputest/cpputest.png?branch=master)](https://travis-ci.org/cpputest/cpputest) +[![Build Status](https://travis-ci.com/cpputest/cpputest.png?branch=master)](https://travis-ci.com/cpputest/cpputest) [![Build status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) [![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) [![ConanCenter package](https://repology.org/badge/version-for-repo/conancenter/cpputest.svg)](https://conan.io/center/cpputest) From cc57e8018615c917bfc89dedebff40187fed820e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 7 Nov 2021 19:15:53 +0100 Subject: [PATCH 0651/1093] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4809434db..654feaf65 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ CppUTest ======== -[![Build Status](https://travis-ci.com/cpputest/cpputest.png?branch=master)](https://travis-ci.com/cpputest/cpputest) +[![Build Status](https://app.travis-ci.com/cpputest/cpputest.svg?branch=master)](https://app.travis-ci.com/github/cpputest/cpputest) [![Build status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) [![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) [![ConanCenter package](https://repology.org/badge/version-for-repo/conancenter/cpputest.svg)](https://conan.io/center/cpputest) From bfb97f2e3394f3062695e7f9f81cbab0fc3d96f1 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 21 Nov 2021 16:50:30 +0100 Subject: [PATCH 0652/1093] Fix a warning related to printing line numbers that is causing the build to fail --- src/CppUTest/TestRegistry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 3bf3eab8b..89b2bed3f 100644 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -135,7 +135,7 @@ void TestRegistry::listTestLocations(TestResult& result) testLocation += "."; testLocation += test->getFile(); testLocation += "."; - testLocation += StringFromFormat("%d\n",test->getLineNumber()); + testLocation += StringFromFormat("%d\n",(int) test->getLineNumber()); testLocations += testLocation; } From b7ed7df3b0044b295334682bd6edd04819eb8f0e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 23 Nov 2021 08:24:16 +0100 Subject: [PATCH 0653/1093] Fixed a missing _ in the test name --- tests/CppUTest/TestUTestMacro.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index be7e0c5fe..4084c8bec 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -233,7 +233,7 @@ static void LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod_() LONGLONGS_EQUAL(1, 1); } // LCOV_EXCL_LINE -static void UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod() +static void UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod_() { UNSIGNED_LONGLONGS_EQUAL(1, 1); } // LCOV_EXCL_LINE From 78ca9e21d85795a48842a7481d1598c119565678 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Sat, 27 Nov 2021 06:58:03 +1000 Subject: [PATCH 0654/1093] initialising strpart to NULL fix for a GitHub Code Scanning / CodeQL fail --- src/CppUTest/SimpleString.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index aa4338b5b..cb0ca0b60 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -358,7 +358,7 @@ size_t SimpleString::count(const SimpleString& substr) const { size_t num = 0; const char* str = getBuffer(); - const char* strpart; + const char* strpart = NULL; if (*str){ strpart = StrStr(str, substr.getBuffer()); } From 5744787d5dee68da5b1c0b2140bbcec46f4a3cdd Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Sat, 27 Nov 2021 21:32:32 +1000 Subject: [PATCH 0655/1093] Required to compile with Borland Compiler v5.4 In the expression a? true : false; True and False have to be the same type. The Borland Compiler v5.4 is unable to automaticly promote the char array "(null)" to a SimpleString in this expression. --- src/CppUTest/SimpleString.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index cb0ca0b60..6cf2c9ad8 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -680,7 +680,7 @@ SimpleString StringFrom(const char *value) SimpleString StringFromOrNull(const char * expected) { - return (expected) ? StringFrom(expected) : "(null)"; + return (expected) ? StringFrom(expected) : StringFrom("(null)"); } SimpleString PrintableStringFromOrNull(const char * expected) From 334fb0409d61b0062a80144192cea83269dafa36 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Wed, 1 Dec 2021 19:33:52 +1000 Subject: [PATCH 0656/1093] Required to compile with Borland Compiler v5.4 part4 In the expression a? true : false; True and False have to be the same type. The Borland Compiler v5.4 is unable to automatically promote the char array "(null)" to a SimpleString in this expression. --- src/CppUTest/SimpleString.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 6cf2c9ad8..482e358e3 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -685,7 +685,7 @@ SimpleString StringFromOrNull(const char * expected) SimpleString PrintableStringFromOrNull(const char * expected) { - return (expected) ? StringFrom(expected).printable() : "(null)"; + return (expected) ? StringFrom(expected).printable() : StringFrom("(null)"); } SimpleString StringFrom(int value) From 49d10054571901835edc8c94769f42f66a947806 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Thu, 2 Dec 2021 14:07:45 +1000 Subject: [PATCH 0657/1093] Required to compile with Borland Compiler v5.4 part5 In the expression a? true : false; True and False have to be the same type. The Borland Compiler v5.4 is unable to automatically promote the char array "(null)" to a SimpleString in this expression. --- src/CppUTest/SimpleString.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 482e358e3..ff1075fb2 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -984,7 +984,7 @@ SimpleString StringFromBinary(const unsigned char* value, size_t size) SimpleString StringFromBinaryOrNull(const unsigned char* value, size_t size) { - return (value) ? StringFromBinary(value, size) : "(null)"; + return (value) ? StringFromBinary(value, size) : StringFrom("(null)"); } SimpleString StringFromBinaryWithSize(const unsigned char* value, size_t size) From b44eee0dec4decbc2b051c9b0453b1606afad760 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Fri, 3 Dec 2021 19:35:39 +1000 Subject: [PATCH 0658/1093] Required to compile with Borland Compiler v5.4 part6 In the expression a? true : false; True and False have to be the same type. The Borland Compiler v5.4 is unable to automatically promote the char array "(null)" to a SimpleString in this expression. --- src/CppUTest/SimpleString.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index ff1075fb2..f5823c0c6 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -1001,7 +1001,7 @@ SimpleString StringFromBinaryWithSize(const unsigned char* value, size_t size) SimpleString StringFromBinaryWithSizeOrNull(const unsigned char* value, size_t size) { - return (value) ? StringFromBinaryWithSize(value, size) : "(null)"; + return (value) ? StringFromBinaryWithSize(value, size) : StringFrom("(null)"); } SimpleString StringFromMaskedBits(unsigned long value, unsigned long mask, size_t byteCount) From 81609780a27afd35bfc52ec23a994b9c682cde6e Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Tue, 7 Dec 2021 07:15:32 +1000 Subject: [PATCH 0659/1093] Required to compile with Borland Compiler v5.4 part7 In the expression a? true : false; True and False have to be the same type. The Borland Compiler v5.4 is unable to automatically promote the char array "other" to a SimpleString in this expression. Updating src/CppUTest/TestMemoryAllocator.cpp --- src/CppUTest/TestMemoryAllocator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 2f96874fb..88d31132a 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -598,7 +598,7 @@ SimpleString MemoryAccountant::reportFooter() const SimpleString MemoryAccountant::stringSize(size_t size) const { - return (size == 0) ? "other" : StringFromFormat("%5d", (int) size); + return (size == 0) ? StringFrom("other") : StringFromFormat("%5d", (int) size); } SimpleString MemoryAccountant::report() const From c3bf7148f54ffab5d3ea724501e0ce46bd6e47e9 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Wed, 8 Dec 2021 19:31:41 +1000 Subject: [PATCH 0660/1093] Required to compile with Borland Compiler v5.4 part8 In the expression a? true : false; True and False have to be the same type. The Borland Compiler v5.4 is unable to automatically promote the char array "" to a SimpleString in this expression. Updating src/CppUTestExt/MockExpectedCall.cpp --- src/CppUTestExt/MockExpectedCall.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index de931dcbd..905115b5d 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -248,7 +248,7 @@ MockExpectedCall& MockCheckedExpectedCall::withUnmodifiedOutputParameter(const S SimpleString MockCheckedExpectedCall::getInputParameterType(const SimpleString& name) { MockNamedValue * p = inputParameters_->getValueByName(name); - return (p) ? p->getType() : ""; + return (p) ? p->getType() : StringFrom(""); } bool MockCheckedExpectedCall::hasInputParameterWithName(const SimpleString& name) From c6ce77f52507fda38b2011fe08e7ddb9385466a8 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Sun, 12 Dec 2021 20:10:36 +1000 Subject: [PATCH 0661/1093] Required to compile with Borland Compiler v5.4 part9 In the expression a? true : false; True and False have to be the same type. The Borland Compiler v5.4 is unable to automatically promote the char array "failed" to a SimpleString in this expression. Updating src/CppUTestExt/MockExpectedCall.cpp --- src/CppUTestExt/MockExpectedCall.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index 905115b5d..a2cc8823e 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -368,7 +368,7 @@ void MockCheckedExpectedCall::outputParameterWasPassed(const SimpleString& name) SimpleString MockCheckedExpectedCall::getInputParameterValueString(const SimpleString& name) { MockNamedValue * p = inputParameters_->getValueByName(name); - return (p) ? StringFrom(*p) : "failed"; + return (p) ? StringFrom(*p) : StringFrom("failed"); } bool MockCheckedExpectedCall::hasInputParameter(const MockNamedValue& parameter) From bb781ef66209832969a9437be8ccb66551391de4 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Mon, 13 Dec 2021 20:50:04 +1000 Subject: [PATCH 0662/1093] cpputest_longlong for long long long long is compiler specific and we already have a cpputest_longlong typedef that takes care of this for us. --- include/CppUTest/UtestMacros.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index e9ef5c6e4..46d3bc7a3 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -239,7 +239,7 @@ UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) #define LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - do { UtestShell::getCurrent()->assertLongLongsEqual((long long)expected, (long long)actual, text, file, line); } while(0) + do { UtestShell::getCurrent()->assertLongLongsEqual((cpputest_ulonglong)expected, (cpputest_ulonglong)actual, text, file, line); } while(0) #define UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ do { UtestShell::getCurrent()->assertUnsignedLongLongsEqual((unsigned long long)expected, (unsigned long long)actual, text, file, line); } while(0) From af5ff20786011e7221c4591d088c6efcab8362a9 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Mon, 13 Dec 2021 20:59:58 +1000 Subject: [PATCH 0663/1093] Update UtestMacros.h --- include/CppUTest/UtestMacros.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 46d3bc7a3..920c2076e 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -239,7 +239,7 @@ UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) #define LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - do { UtestShell::getCurrent()->assertLongLongsEqual((cpputest_ulonglong)expected, (cpputest_ulonglong)actual, text, file, line); } while(0) + do { UtestShell::getCurrent()->assertLongLongsEqual((cpputest_longlong)expected, (cpputest_longlong)actual, text, file, line); } while(0) #define UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ do { UtestShell::getCurrent()->assertUnsignedLongLongsEqual((unsigned long long)expected, (unsigned long long)actual, text, file, line); } while(0) From f336fc3b85c1d4fa6fadb3d8046c7cefef437f43 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Tue, 14 Dec 2021 12:33:08 +1000 Subject: [PATCH 0664/1093] cpputest_ulonglong for unsigned long long unsigned long long is compiler specific and we already have a cpputest_ulonglong typedef that takes care of this for us. --- include/CppUTest/UtestMacros.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 920c2076e..e47bfa649 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -242,7 +242,7 @@ do { UtestShell::getCurrent()->assertLongLongsEqual((cpputest_longlong)expected, (cpputest_longlong)actual, text, file, line); } while(0) #define UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - do { UtestShell::getCurrent()->assertUnsignedLongLongsEqual((unsigned long long)expected, (unsigned long long)actual, text, file, line); } while(0) + do { UtestShell::getCurrent()->assertUnsignedLongLongsEqual((cpputest_ulonglong)expected, (cpputest_ulonglong)actual, text, file, line); } while(0) #define BYTES_EQUAL(expected, actual)\ LONGS_EQUAL((expected) & 0xff,(actual) & 0xff) From 26a3b9901e34231e8bdd346854fafda9b282c348 Mon Sep 17 00:00:00 2001 From: Alan Rosenthal Date: Thu, 16 Dec 2021 14:19:46 -0500 Subject: [PATCH 0665/1093] Add CPPUTEST_CXX_PREFIX and CPPUTEST_CC_PREFIX to MakefileWorker.mk This change allows a user to specify a compiler prefix such as `arm-none-eabi-`. More importantly, this allows a developer to add the prefix `ccache ` to speed up testing. --- build/MakefileWorker.mk | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index 297f45457..49bff830b 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -62,6 +62,8 @@ # CPPUTEST_CPPFLAGS - flags for the C++ AND C preprocessor # CPPUTEST_CFLAGS - flags for the C complier # CPPUTEST_LDFLAGS - Linker flags +# CPPUTEST_CXX_PREFIX - prefix for the C++ compiler +# CPPUTEST_CC_PREFIX - prefix for the C compiler #---------- # Some behavior is weird on some platforms. Need to discover the platform. @@ -512,17 +514,17 @@ vtest: $(TEST_TARGET) $(CPPUTEST_OBJS_DIR)/%.o: %.cc @echo compiling $(notdir $<) $(SILENCE)mkdir -p $(dir $@) - $(SILENCE)$(COMPILE.cpp) $(DEP_FLAGS) $(OUTPUT_OPTION) $< + $(SILENCE)$(CPPUTEST_CXX_PREFIX)$(COMPILE.cpp) $(DEP_FLAGS) $(OUTPUT_OPTION) $< $(CPPUTEST_OBJS_DIR)/%.o: %.cpp @echo compiling $(notdir $<) $(SILENCE)mkdir -p $(dir $@) - $(SILENCE)$(COMPILE.cpp) $(DEP_FLAGS) $(OUTPUT_OPTION) $< + $(SILENCE)$(CPPUTEST_CXX_PREFIX)$(COMPILE.cpp) $(DEP_FLAGS) $(OUTPUT_OPTION) $< $(CPPUTEST_OBJS_DIR)/%.o: %.c @echo compiling $(notdir $<) $(SILENCE)mkdir -p $(dir $@) - $(SILENCE)$(COMPILE.c) $(DEP_FLAGS) $(OUTPUT_OPTION) $< + $(SILENCE)$(CPPUTEST_CC_PREFIX)$(COMPILE.c) $(DEP_FLAGS) $(OUTPUT_OPTION) $< ifneq "$(MAKECMDGOALS)" "clean" -include $(DEP_FILES) From 83d4af92f10f15dfcf8418b25546b7e27b999342 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Fri, 17 Dec 2021 21:42:36 +1000 Subject: [PATCH 0666/1093] Update CMakeLists.txt --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d79c810f9..3875c7c41 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,7 +68,11 @@ endif() option(STD_C "Use the standard C library" ON) option(STD_CPP "Use the standard C++ library" ON) option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) +if(BORLAND) +option(MEMORY_LEAK_DETECTION "Enable memory leak detection" OFF) +else(BORLAND) option(MEMORY_LEAK_DETECTION "Enable memory leak detection" ON) +endif(BORLAND) option(EXTENSIONS "Use the CppUTest extension library" ON) option(LONGLONG "Support long long" OFF) option(MAP_FILE "Enable the creation of a map file" OFF) From d08635e93e794caccc033e3df0ec6e6319e963d7 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Sun, 19 Dec 2021 21:42:05 +1000 Subject: [PATCH 0667/1093] rollback changes to CMakeLists.txt --- CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3875c7c41..d79c810f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,11 +68,7 @@ endif() option(STD_C "Use the standard C library" ON) option(STD_CPP "Use the standard C++ library" ON) option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) -if(BORLAND) -option(MEMORY_LEAK_DETECTION "Enable memory leak detection" OFF) -else(BORLAND) option(MEMORY_LEAK_DETECTION "Enable memory leak detection" ON) -endif(BORLAND) option(EXTENSIONS "Use the CppUTest extension library" ON) option(LONGLONG "Support long long" OFF) option(MAP_FILE "Enable the creation of a map file" OFF) From bb73b29760d27510a1f540b18187b9d381aa2da1 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:13:33 +1000 Subject: [PATCH 0668/1093] Create src/Platforms/Borland/UtestPlatforms.cpp This is currently a direct copy of src/Platforms/Gcc/UtestPlatforms.cpp. I have to start with something and this file mostly works. I will follow up with the required changes latter. As per the first reply in #1493 this is the first step in getting a working Borland/UtestPlatforms.cpp --- src/Platforms/Borland/UtestPlatform.cpp | 357 ++++++++++++++++++++++++ 1 file changed, 357 insertions(+) create mode 100644 src/Platforms/Borland/UtestPlatform.cpp diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp new file mode 100644 index 000000000..7b9b66993 --- /dev/null +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -0,0 +1,357 @@ +/* + * 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 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 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 DAMA + */ + +#include +#include "CppUTest/TestHarness.h" +#undef malloc +#undef free +#undef calloc +#undef realloc +#undef strdup +#undef strndup + +#ifdef CPPUTEST_HAVE_GETTIMEOFDAY +#include +#endif +#if defined(CPPUTEST_HAVE_FORK) && defined(CPPUTEST_HAVE_WAITPID) +#include +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK +#include +#endif + +#include "CppUTest/PlatformSpecificFunctions.h" + +static jmp_buf test_exit_jmp_buf[10]; +static int jmp_buf_index = 0; + +// There is a possibility that a compiler provides fork but not waitpid. +#if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) + +static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin*, TestResult* result) +{ + result->addFailure(TestFailure(shell, "-p doesn't work on this platform, as it is lacking fork.\b")); +} + +static int PlatformSpecificForkImplementation(void) +{ + return 0; +} + +static int PlatformSpecificWaitPidImplementation(int, int*, int) +{ + return 0; +} + +#else + +static void SetTestFailureByStatusCode(UtestShell* shell, TestResult* result, int status) +{ + if (WIFEXITED(status) && WEXITSTATUS(status) != 0) { + result->addFailure(TestFailure(shell, "Failed in separate process")); + } else if (WIFSIGNALED(status)) { + SimpleString message("Failed in separate process - killed by signal "); + message += StringFrom(WTERMSIG(status)); + result->addFailure(TestFailure(shell, message)); + } else if (WIFSTOPPED(status)) { + result->addFailure(TestFailure(shell, "Stopped in separate process - continuing")); + } +} + +static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin* plugin, TestResult* result) +{ + const pid_t syscallError = -1; + pid_t cpid; + pid_t w; + int status = 0; + + cpid = PlatformSpecificFork(); + + if (cpid == syscallError) { + result->addFailure(TestFailure(shell, "Call to fork() failed")); + return; + } + + if (cpid == 0) { /* Code executed by child */ + const size_t initialFailureCount = result->getFailureCount(); // LCOV_EXCL_LINE + shell->runOneTestInCurrentProcess(plugin, *result); // LCOV_EXCL_LINE + _exit(initialFailureCount < result->getFailureCount()); // LCOV_EXCL_LINE + } else { /* Code executed by parent */ + size_t amountOfRetries = 0; + do { + w = PlatformSpecificWaitPid(cpid, &status, WUNTRACED); + if (w == syscallError) { + // OS X debugger causes EINTR + if (EINTR == errno) { + if (amountOfRetries > 30) { + result->addFailure(TestFailure(shell, "Call to waitpid() failed with EINTR. Tried 30 times and giving up! Sometimes happens in debugger")); + return; + } + amountOfRetries++; + } + else { + result->addFailure(TestFailure(shell, "Call to waitpid() failed")); + return; + } + } else { + SetTestFailureByStatusCode(shell, result, status); + if (WIFSTOPPED(status)) kill(w, SIGCONT); + } + } while ((w == syscallError) || (!WIFEXITED(status) && !WIFSIGNALED(status))); + } +} + +static pid_t PlatformSpecificForkImplementation(void) +{ + return fork(); +} + +static pid_t PlatformSpecificWaitPidImplementation(int pid, int* status, int options) +{ + return waitpid(pid, status, options); +} + +#endif + +TestOutput::WorkingEnvironment PlatformSpecificGetWorkingEnvironment() +{ + return TestOutput::eclipse; +} + +void (*PlatformSpecificRunTestInASeperateProcess)(UtestShell* shell, TestPlugin* plugin, TestResult* result) = + GccPlatformSpecificRunTestInASeperateProcess; +int (*PlatformSpecificFork)(void) = PlatformSpecificForkImplementation; +int (*PlatformSpecificWaitPid)(int, int*, int) = PlatformSpecificWaitPidImplementation; + +extern "C" { + +static int PlatformSpecificSetJmpImplementation(void (*function) (void* data), void* data) +{ + if (0 == setjmp(test_exit_jmp_buf[jmp_buf_index])) { + jmp_buf_index++; + function(data); + jmp_buf_index--; + return 1; + } + return 0; +} + +/* + * MacOSX clang 3.0 doesn't seem to recognize longjmp and thus complains about _no_return_. + * The later clang compilers complain when it isn't there. So only way is to check the clang compiler here :( + */ +#ifdef __clang__ + #if !((__clang_major__ == 3) && (__clang_minor__ == 0)) + _no_return_ + #endif +#endif +static void PlatformSpecificLongJmpImplementation() +{ + jmp_buf_index--; + longjmp(test_exit_jmp_buf[jmp_buf_index], 1); +} + +static void PlatformSpecificRestoreJumpBufferImplementation() +{ + jmp_buf_index--; +} + +void (*PlatformSpecificLongJmp)() = PlatformSpecificLongJmpImplementation; +int (*PlatformSpecificSetJmp)(void (*)(void*), void*) = PlatformSpecificSetJmpImplementation; +void (*PlatformSpecificRestoreJumpBuffer)() = PlatformSpecificRestoreJumpBufferImplementation; + +///////////// Time in millis + +static long TimeInMillisImplementation() +{ +#ifdef CPPUTEST_HAVE_GETTIMEOFDAY + struct timeval tv; + struct timezone tz; + gettimeofday(&tv, &tz); + return (tv.tv_sec * 1000) + (long)((double)tv.tv_usec * 0.001); +#else + return 0; +#endif +} + +static const char* TimeStringImplementation() +{ + time_t theTime = time(NULLPTR); + static char dateTime[80]; +#if defined(_WIN32) && defined(MINGW_HAS_SECURE_API) + static struct tm lastlocaltime; + localtime_s(&lastlocaltime, &theTime); + struct tm *tmp = &lastlocaltime; +#else + struct tm *tmp = localtime(&theTime); +#endif + strftime(dateTime, 80, "%Y-%m-%dT%H:%M:%S", tmp); + return dateTime; +} + +long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; +const char* (*GetPlatformSpecificTimeString)() = TimeStringImplementation; + +/* Wish we could add an attribute to the format for discovering mis-use... but the __attribute__(format) seems to not work on va_list */ +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wformat-nonliteral" +#endif + +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wused-but-marked-unused" +#endif +int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_list va_args_list) = vsnprintf; + +static PlatformSpecificFile PlatformSpecificFOpenImplementation(const char* filename, const char* flag) +{ +#if defined(_WIN32) && defined(MINGW_HAS_SECURE_API) + FILE* file; + fopen_s(&file, filename, flag); + return file; +#else + return fopen(filename, flag); +#endif +} + +static void PlatformSpecificFPutsImplementation(const char* str, PlatformSpecificFile file) +{ + fputs(str, (FILE*)file); +} + +static void PlatformSpecificFCloseImplementation(PlatformSpecificFile file) +{ + fclose((FILE*)file); +} + +static void PlatformSpecificFlushImplementation() +{ + fflush(stdout); +} + +PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = PlatformSpecificFOpenImplementation; +void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; +void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; + +int (*PlatformSpecificPutchar)(int) = putchar; +void (*PlatformSpecificFlush)() = PlatformSpecificFlushImplementation; + +void* (*PlatformSpecificMalloc)(size_t size) = malloc; +void* (*PlatformSpecificRealloc)(void*, size_t) = realloc; +void (*PlatformSpecificFree)(void* memory) = free; +void* (*PlatformSpecificMemCpy)(void*, const void*, size_t) = memcpy; +void* (*PlatformSpecificMemset)(void*, int, size_t) = memset; + +/* GCC 4.9.x introduces -Wfloat-conversion, which causes a warning / error + * in GCC's own (macro) implementation of isnan() and isinf(). + */ +#if defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ > 8)) +#pragma GCC diagnostic ignored "-Wfloat-conversion" +#endif + +static int IsNanImplementation(double d) +{ + return isnan(d); +} + +static int IsInfImplementation(double d) +{ + return isinf(d); +} + +double (*PlatformSpecificFabs)(double) = fabs; +void (*PlatformSpecificSrand)(unsigned int) = srand; +int (*PlatformSpecificRand)(void) = rand; +int (*PlatformSpecificIsNan)(double) = IsNanImplementation; +int (*PlatformSpecificIsInf)(double) = IsInfImplementation; +int (*PlatformSpecificAtExit)(void(*func)(void)) = atexit; /// this was undefined before + +static PlatformSpecificMutex PThreadMutexCreate(void) +{ +#ifdef CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK + pthread_mutex_t *mutex = new pthread_mutex_t; + + pthread_mutex_init(mutex, NULLPTR); + return (PlatformSpecificMutex)mutex; +#else + return NULLPTR; +#endif + +} + +#ifdef CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK +static void PThreadMutexLock(PlatformSpecificMutex mtx) +{ + pthread_mutex_lock((pthread_mutex_t *)mtx); +} +#else +static void PThreadMutexLock(PlatformSpecificMutex) +{ +} +#endif + +#ifdef CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK +static void PThreadMutexUnlock(PlatformSpecificMutex mtx) +{ + pthread_mutex_unlock((pthread_mutex_t *)mtx); +} +#else +static void PThreadMutexUnlock(PlatformSpecificMutex) +{ +} +#endif + +#ifdef CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK +static void PThreadMutexDestroy(PlatformSpecificMutex mtx) +{ + pthread_mutex_t *mutex = (pthread_mutex_t *)mtx; + pthread_mutex_destroy(mutex); + delete mutex; +} +#else +static void PThreadMutexDestroy(PlatformSpecificMutex) +{ +} +#endif + +PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void) = PThreadMutexCreate; +void (*PlatformSpecificMutexLock)(PlatformSpecificMutex) = PThreadMutexLock; +void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex) = PThreadMutexUnlock; +void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex) = PThreadMutexDestroy; + +} From 8d9cc22ed67ba3838466f5cb59405619d742f995 Mon Sep 17 00:00:00 2001 From: Marco Patzer Date: Sat, 25 Dec 2021 00:00:35 +0100 Subject: [PATCH 0669/1093] Add option for less verbose output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows the user to define MORE_SILENCE in the Makefile and get rid of output like “compiling …”, “Building archive …”, etc. The idea is that a successful test run should have minimal output. --- build/MakefileWorker.mk | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index 49bff830b..bf92cb85e 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -493,13 +493,21 @@ TEST_DEPS = $(TEST_OBJS) $(MOCKS_OBJS) $(PRODUCTION_CODE_START) $(TARGET_LIB) $( test-deps: $(TEST_DEPS) $(TEST_TARGET): $(TEST_DEPS) +ifndef MORE_SILENCE @echo Linking $@ +endif $(SILENCE)$(CXX) -o $@ $^ $(LD_LIBRARIES) $(LDFLAGS) $(TARGET_LIB): $(OBJ) +ifndef MORE_SILENCE @echo Building archive $@ +endif $(SILENCE)mkdir -p $(dir $@) +ifndef MORE_SILENCE $(SILENCE)$(AR) $(ARFLAGS) $@ $^ +else + $(SILENCE)$(AR) $(ARFLAGS) $@ $^ >/dev/null +endif $(SILENCE)$(RANLIB) $@ TEST_RUN_RETURN_CODE_FILE:=$(shell mktemp /tmp/cpputestResult.XXX) @@ -512,17 +520,23 @@ vtest: $(TEST_TARGET) @ret=$$(cat $(TEST_RUN_RETURN_CODE_FILE)); rm $(TEST_RUN_RETURN_CODE_FILE); if [ "$$ret" -ne 0 ]; then echo "$$(tput setaf 1)$(TEST_TARGET) returned $${ret}$$(tput sgr0)"; fi; exit $$ret $(CPPUTEST_OBJS_DIR)/%.o: %.cc +ifndef MORE_SILENCE @echo compiling $(notdir $<) +endif $(SILENCE)mkdir -p $(dir $@) $(SILENCE)$(CPPUTEST_CXX_PREFIX)$(COMPILE.cpp) $(DEP_FLAGS) $(OUTPUT_OPTION) $< $(CPPUTEST_OBJS_DIR)/%.o: %.cpp +ifndef MORE_SILENCE @echo compiling $(notdir $<) +endif $(SILENCE)mkdir -p $(dir $@) $(SILENCE)$(CPPUTEST_CXX_PREFIX)$(COMPILE.cpp) $(DEP_FLAGS) $(OUTPUT_OPTION) $< $(CPPUTEST_OBJS_DIR)/%.o: %.c +ifndef MORE_SILENCE @echo compiling $(notdir $<) +endif $(SILENCE)mkdir -p $(dir $@) $(SILENCE)$(CPPUTEST_CC_PREFIX)$(COMPILE.c) $(DEP_FLAGS) $(OUTPUT_OPTION) $< @@ -532,7 +546,9 @@ endif .PHONY: clean clean: +ifndef MORE_SILENCE @echo Making clean +endif $(SILENCE)$(RM) $(STUFF_TO_CLEAN) $(SILENCE)rm -rf gcov $(CPPUTEST_OBJS_DIR) $(CPPUTEST_LIB_DIR) $(SILENCE)find . -name "*.gcno" | xargs rm -f From c3ac2cd135affaafe87c3c74e0c75613f1ec8299 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Sun, 2 Jan 2022 21:03:41 +1000 Subject: [PATCH 0670/1093] Update UtestPlatform.cpp --- src/Platforms/Borland/UtestPlatform.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 7b9b66993..af5b900bf 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -172,15 +172,6 @@ static int PlatformSpecificSetJmpImplementation(void (*function) (void* data), v return 0; } -/* - * MacOSX clang 3.0 doesn't seem to recognize longjmp and thus complains about _no_return_. - * The later clang compilers complain when it isn't there. So only way is to check the clang compiler here :( - */ -#ifdef __clang__ - #if !((__clang_major__ == 3) && (__clang_minor__ == 0)) - _no_return_ - #endif -#endif static void PlatformSpecificLongJmpImplementation() { jmp_buf_index--; From 3794eea530558fc230356b66fc2a72999ea41055 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Mon, 3 Jan 2022 08:09:08 +1000 Subject: [PATCH 0671/1093] Update UtestPlatform.cpp Remove two #pragma clang directives --- src/Platforms/Borland/UtestPlatform.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index af5b900bf..2f4d301fb 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -219,14 +219,6 @@ static const char* TimeStringImplementation() long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; const char* (*GetPlatformSpecificTimeString)() = TimeStringImplementation; -/* Wish we could add an attribute to the format for discovering mis-use... but the __attribute__(format) seems to not work on va_list */ -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wformat-nonliteral" -#endif - -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wused-but-marked-unused" -#endif int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_list va_args_list) = vsnprintf; static PlatformSpecificFile PlatformSpecificFOpenImplementation(const char* filename, const char* flag) From f08a56b16a6bdb5e143e99d82473bbd0347b2c0d Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Mon, 3 Jan 2022 19:15:05 +1000 Subject: [PATCH 0672/1093] Update UtestPlatform.cpp removed gcc pragma directive --- src/Platforms/Borland/UtestPlatform.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 2f4d301fb..b4da89c5f 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -260,13 +260,6 @@ void (*PlatformSpecificFree)(void* memory) = free; void* (*PlatformSpecificMemCpy)(void*, const void*, size_t) = memcpy; void* (*PlatformSpecificMemset)(void*, int, size_t) = memset; -/* GCC 4.9.x introduces -Wfloat-conversion, which causes a warning / error - * in GCC's own (macro) implementation of isnan() and isinf(). - */ -#if defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ > 8)) -#pragma GCC diagnostic ignored "-Wfloat-conversion" -#endif - static int IsNanImplementation(double d) { return isnan(d); From 82c1b169664d7dd1c12061ddf9b49962f5959263 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Mon, 3 Jan 2022 21:14:44 +1000 Subject: [PATCH 0673/1093] Update UtestPlatform.cpp removed reference to a MinGW specific function that Borland 5.4 does not have --- src/Platforms/Borland/UtestPlatform.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index b4da89c5f..590598823 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -205,13 +205,7 @@ static const char* TimeStringImplementation() { time_t theTime = time(NULLPTR); static char dateTime[80]; -#if defined(_WIN32) && defined(MINGW_HAS_SECURE_API) - static struct tm lastlocaltime; - localtime_s(&lastlocaltime, &theTime); - struct tm *tmp = &lastlocaltime; -#else struct tm *tmp = localtime(&theTime); -#endif strftime(dateTime, 80, "%Y-%m-%dT%H:%M:%S", tmp); return dateTime; } From 756bdf31ec6faeab007d5a5d192459340a2095f8 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:02:13 +1000 Subject: [PATCH 0674/1093] Update UtestPlatform.cpp remove reference to a MinGW specific function --- src/Platforms/Borland/UtestPlatform.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 590598823..656adda2c 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -217,13 +217,7 @@ int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_ static PlatformSpecificFile PlatformSpecificFOpenImplementation(const char* filename, const char* flag) { -#if defined(_WIN32) && defined(MINGW_HAS_SECURE_API) - FILE* file; - fopen_s(&file, filename, flag); - return file; -#else return fopen(filename, flag); -#endif } static void PlatformSpecificFPutsImplementation(const char* str, PlatformSpecificFile file) From 762fbbd4db335881d57b2684f2dcbf3e2911c909 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Tue, 4 Jan 2022 21:14:41 +1000 Subject: [PATCH 0675/1093] Update UtestPlatform.cpp removed reference to GCC compiler --- src/Platforms/Borland/UtestPlatform.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 656adda2c..9f82b1114 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -62,9 +62,10 @@ static jmp_buf test_exit_jmp_buf[10]; static int jmp_buf_index = 0; // There is a possibility that a compiler provides fork but not waitpid. +// TODO consider using spawn() and cwait()? #if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) -static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin*, TestResult* result) +static void BorlandPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin*, TestResult* result) { result->addFailure(TestFailure(shell, "-p doesn't work on this platform, as it is lacking fork.\b")); } @@ -94,7 +95,7 @@ static void SetTestFailureByStatusCode(UtestShell* shell, TestResult* result, in } } -static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin* plugin, TestResult* result) +static void BorlandPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin* plugin, TestResult* result) { const pid_t syscallError = -1; pid_t cpid; @@ -155,7 +156,7 @@ TestOutput::WorkingEnvironment PlatformSpecificGetWorkingEnvironment() } void (*PlatformSpecificRunTestInASeperateProcess)(UtestShell* shell, TestPlugin* plugin, TestResult* result) = - GccPlatformSpecificRunTestInASeperateProcess; + BorlandPlatformSpecificRunTestInASeperateProcess; int (*PlatformSpecificFork)(void) = PlatformSpecificForkImplementation; int (*PlatformSpecificWaitPid)(int, int*, int) = PlatformSpecificWaitPidImplementation; From 5a3da3483878e3905a55226ee3337c9d9f49d0eb Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Wed, 5 Jan 2022 07:19:26 +1000 Subject: [PATCH 0676/1093] Update UtestPlatform.cpp isnan() is spelt differently in the Borland headers. --- src/Platforms/Borland/UtestPlatform.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 9f82b1114..5c64737e5 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -22,7 +22,7 @@ * 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 DAMA + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -251,7 +252,7 @@ void* (*PlatformSpecificMemset)(void*, int, size_t) = memset; static int IsNanImplementation(double d) { - return isnan(d); + return _isnan(d); } static int IsInfImplementation(double d) From 378d3ae723cf9fca4176f72e211c22fe8a9f9b40 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Fri, 7 Jan 2022 21:26:06 +1000 Subject: [PATCH 0677/1093] Update UtestPlatform.cpp isinf() is not available. but with some Boolean logic we can calculate the same thing. --- src/Platforms/Borland/UtestPlatform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 5c64737e5..c1f8472f5 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -257,7 +257,7 @@ static int IsNanImplementation(double d) static int IsInfImplementation(double d) { - return isinf(d); + return !(_finite(d) || _isnan(d)); } double (*PlatformSpecificFabs)(double) = fabs; From 532c021933ac7200507ca3293409234561ad7e27 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Sat, 8 Jan 2022 08:13:19 +1000 Subject: [PATCH 0678/1093] Update CppUTestConfigurationOptions.cmake the src/Platform/Borland/UTestPlatform.cpp is now used when the cmake generator is "Borland Makefiles" --- cmake/Modules/CppUTestConfigurationOptions.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index d426254f8..2d8610c39 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -13,6 +13,8 @@ elseif (IAR) set(LINKER_SCRIPT "${CppUTestRootDirectory}/platforms/iar/CppUTestTest.icf") set(CMAKE_C_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") set(CMAKE_CXX_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") +elseif (BORLAND) + set(CPP_PLATFORM Borland) elseif (STD_C) if(NOT CPP_PLATFORM) set(CPP_PLATFORM Gcc) From bb116f5669a4659327322206ac77e6003437f419 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Sat, 8 Jan 2022 21:02:19 +1000 Subject: [PATCH 0679/1093] Update CppUTestConfigurationOptions.cmake turn memory leak detection off --- cmake/Modules/CppUTestConfigurationOptions.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 2d8610c39..b9b724d3b 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -15,6 +15,7 @@ elseif (IAR) set(CMAKE_CXX_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") elseif (BORLAND) set(CPP_PLATFORM Borland) + set(MEMORY_LEAK_DETECTION False) elseif (STD_C) if(NOT CPP_PLATFORM) set(CPP_PLATFORM Gcc) From 1275d84e861fe597785c506483a9471f0c341114 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Sat, 8 Jan 2022 21:14:31 +1000 Subject: [PATCH 0680/1093] Update CppUTestConfig.h this just removed the fenv.h requirement. This was simple, the other option is to workout how the control87 functions map and do something fancy but I just wanted the quickest and least trouble route to a working cpputest. --- include/CppUTest/CppUTestConfig.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 7c7371fe3..c2846df7b 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -208,7 +208,7 @@ #if CPPUTEST_USE_STD_C_LIB && \ (!defined(_MSC_VER) || (_MSC_VER >= 1800)) && \ (!defined(__APPLE__)) && \ - (!defined(__ghs__) || !defined(__ColdFire__)) + (!defined(__ghs__) || !defined(__ColdFire__)) && (!defined(__BCPLUSPLUS__)) #define CPPUTEST_HAVE_FENV #if defined(__WATCOMC__) || defined(__ARMEL__) || defined(__m68k__) #define CPPUTEST_FENV_IS_WORKING_PROPERLY 0 From 3b545130321263a1d48094ab540a441b03a07c92 Mon Sep 17 00:00:00 2001 From: offa Date: Fri, 14 Jan 2022 15:42:45 +0100 Subject: [PATCH 0681/1093] Fix nullptr for modern compiler --- src/CppUTest/SimpleString.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index f5823c0c6..02898cd4d 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -358,7 +358,7 @@ size_t SimpleString::count(const SimpleString& substr) const { size_t num = 0; const char* str = getBuffer(); - const char* strpart = NULL; + const char* strpart = NULLPTR; if (*str){ strpart = StrStr(str, substr.getBuffer()); } From e303ad246d9d82b8ab81d5c8a525cad12bdaa057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Thu, 27 Jan 2022 15:35:04 +0100 Subject: [PATCH 0682/1093] Fix warning when compiling with MinGW-w64 that complains about wrong format specifier "%ll" for long longs passed to StringFromFormat --- include/CppUTest/CppUTestConfig.h | 6 ++++++ include/CppUTest/SimpleString.h | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index c2846df7b..654784d50 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -109,6 +109,12 @@ #define _no_return_ #endif +#if defined(__MINGW32__) +#define CPPUTEST_CHECK_FORMAT_TYPE __MINGW_PRINTF_FORMAT +#else +#define CPPUTEST_CHECK_FORMAT_TYPE printf +#endif + #if __has_attribute(format) #define _check_format_(type, format_parameter, other_parameters) __attribute__ ((format (type, format_parameter, other_parameters))) #else diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 6cacf9559..73777b888 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -209,7 +209,7 @@ SimpleString HexStringFrom(const void* value); SimpleString HexStringFrom(void (*value)()); SimpleString StringFrom(double value, int precision = 6); SimpleString StringFrom(const SimpleString& other); -SimpleString StringFromFormat(const char* format, ...) _check_format_(printf, 1, 2); +SimpleString StringFromFormat(const char* format, ...) _check_format_(CPPUTEST_CHECK_FORMAT_TYPE, 1, 2); SimpleString VStringFromFormat(const char* format, va_list args); SimpleString StringFromBinary(const unsigned char* value, size_t size); SimpleString StringFromBinaryOrNull(const unsigned char* value, size_t size); From 29ba1230564b977c041c3dd9b6445a5eab487c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Fri, 13 Nov 2020 06:37:06 +0100 Subject: [PATCH 0683/1093] Added options to CMake scripts for appending architecture size and debug indication to generated library names --- CMakeLists.txt | 24 ++++++++++++++++++++++-- examples/AllTests/CMakeLists.txt | 2 +- src/CppUTest/CMakeLists.txt | 16 ++++++++++------ src/CppUTestExt/CMakeLists.txt | 14 +++++++++----- tests/CppUTest/CMakeLists.txt | 2 +- tests/CppUTestExt/CMakeLists.txt | 2 +- 6 files changed, 44 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d79c810f9..bf026d20c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,6 +84,9 @@ option(EXAMPLES "Compile and make examples?" OFF) option(VERBOSE_CONFIG "Print configuration to stdout during generation" ON) +option(LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" OFF) +option(LIBNAME_POSTFIX_DEBUG "Add indication of debug compilation to the library name?" OFF) + if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "What kind of build this is" FORCE) endif(NOT CMAKE_BUILD_TYPE) @@ -94,6 +97,19 @@ set(CppUTest_PKGCONFIG_FILE cpputest.pc) set(CppUTestRootDirectory ${PROJECT_SOURCE_DIR}) +set( CppUTestLibName "CppUTest" ) +set( CppUTestExtLibName "CppUTestExt" ) + +if(LIBNAME_POSTFIX_BITSIZE) + if( "${CMAKE_SIZEOF_VOID_P}" STREQUAL "8" ) + set( CppUTestLibName "${CppUTestLibName}64" ) + set( CppUTestExtLibName "${CppUTestExtLibName}64" ) + elseif( "${CMAKE_SIZEOF_VOID_P}" STREQUAL "4" ) + set( CppUTestLibName "${CppUTestLibName}32" ) + set( CppUTestExtLibName "${CppUTestExtLibName}32" ) + endif() +endif(LIBNAME_POSTFIX_BITSIZE) + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CppUTestRootDirectory}/cmake/Modules) include("${CppUTestRootDirectory}/cmake/Modules/CppUTestConfigurationOptions.cmake") @@ -179,10 +195,10 @@ if(PkgHelpers_AVAILABLE) INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} PATH_VARS INCLUDE_DIR CMAKE_CURRENT_BINARY_DIR) if (EXTENSIONS) - export(TARGETS CppUTest CppUTestExt + export(TARGETS ${CppUTestLibName} ${CppUTestExtLibName} FILE "${CMAKE_CURRENT_BINARY_DIR}/CppUTestTargets.cmake") else() - export(TARGETS CppUTest + export(TARGETS ${CppUTestLibName} FILE "${CMAKE_CURRENT_BINARY_DIR}/CppUTestTargets.cmake") endif() write_basic_package_version_file( @@ -224,6 +240,10 @@ Features configured in CppUTest: Compile and run self-tests ${TESTS} Run self-tests separately ${TESTS_DETAILED} +Library name options: + Add architecture bitsize (32/64) ${LIBNAME_POSTFIX_BITSIZE} + Add debug compilation indicator ${LIBNAME_POSTFIX_DEBUG} + ------------------------------------------------------- ") endif() diff --git a/examples/AllTests/CMakeLists.txt b/examples/AllTests/CMakeLists.txt index 95910e869..7b37c3afd 100644 --- a/examples/AllTests/CMakeLists.txt +++ b/examples/AllTests/CMakeLists.txt @@ -11,5 +11,5 @@ add_executable(ExampleTests ) cpputest_normalize_test_output_location(ExampleTests) -target_link_libraries(ExampleTests ApplicationLib CppUTest CppUTestExt) +target_link_libraries(ExampleTests ApplicationLib ${CppUTestLibName} ${CppUTestExtLibName}) cpputest_buildtime_discover_tests(ExampleTests) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index aa0d25900..01605d879 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(CppUTest +add_library(${CppUTestLibName} CommandLineArguments.cpp MemoryLeakWarningPlugin.cpp TestHarness_c.cpp @@ -20,16 +20,20 @@ add_library(CppUTest Utest.cpp ) +if(LIBNAME_POSTFIX_DEBUG) + set_target_properties(${CppUTestLibName} PROPERTIES DEBUG_POSTFIX "d") +endif() + #[[Set CPP_PLATFORM in a parent CMakeLists.txt if reusing one of the provided platforms, else supply the missing definitions]] if (CPP_PLATFORM) - target_sources(CppUTest + target_sources(${CppUTestLibName} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../Platforms/${CPP_PLATFORM}/UtestPlatform.cpp ) endif(CPP_PLATFORM) #[[Arrange for the include directory to be added to the include paths of any CMake target depending on CppUTest.]] -target_include_directories(CppUTest +target_include_directories(${CppUTestLibName} PUBLIC $ $ @@ -65,13 +69,13 @@ set(CppUTest_headers ${CppUTestRootDirectory}/include/CppUTest/SimpleMutex.h ) -set_target_properties(CppUTest PROPERTIES +set_target_properties(${CppUTestLibName} PROPERTIES PUBLIC_HEADER "${CppUTest_headers}") if (WIN32) - target_link_libraries(CppUTest winmm) + target_link_libraries(${CppUTestLibName} winmm) endif (WIN32) -install(TARGETS CppUTest +install(TARGETS ${CppUTestLibName} EXPORT CppUTestTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index 72507f8a5..20c410009 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -40,19 +40,23 @@ set(CppUTestExt_headers ${CppUTestRootDirectory}/include/CppUTestExt/MockSupport.h ) -add_library(CppUTestExt STATIC ${CppUTestExt_src} ${CppUTestExt_headers}) -target_link_libraries(CppUTestExt ${CPPUNIT_EXTERNAL_LIBRARIES}) +add_library(${CppUTestExtLibName} STATIC ${CppUTestExt_src} ${CppUTestExt_headers}) +target_link_libraries(${CppUTestExtLibName} ${CPPUNIT_EXTERNAL_LIBRARIES}) + +if(LIBNAME_POSTFIX_DEBUG) + set_target_properties(${CppUTestExtLibName} PROPERTIES DEBUG_POSTFIX "d") +endif() #[[Arrange for the include directory to be added to the include paths of any CMake target depending on CppUTestExt.]] -target_include_directories(CppUTestExt +target_include_directories(${CppUTestExtLibName} PUBLIC $ $ ) -set_target_properties(CppUTestExt PROPERTIES +set_target_properties(${CppUTestExtLibName} PROPERTIES PUBLIC_HEADER "${CppUTestExt_headers}") -install(TARGETS CppUTestExt +install(TARGETS ${CppUTestExtLibName} EXPORT CppUTestTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 9ac1ea715..c9ed939e5 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -54,7 +54,7 @@ endif () add_executable(CppUTestTests ${CppUTestTests_src}) cpputest_normalize_test_output_location(CppUTestTests) -target_link_libraries(CppUTestTests CppUTest ${THREAD_LIB}) +target_link_libraries(CppUTestTests ${CppUTestLibName} ${THREAD_LIB}) if (TESTS_BUILD_DISCOVER) cpputest_buildtime_discover_tests(CppUTestTests) diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 304b23759..f25707bf7 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -36,7 +36,7 @@ endif (MINGW) add_executable(CppUTestExtTests ${CppUTestExtTests_src}) cpputest_normalize_test_output_location(CppUTestExtTests) -target_link_libraries(CppUTestExtTests CppUTest CppUTestExt ${THREAD_LIB} ${CPPUNIT_EXTERNAL_LIBRARIES}) +target_link_libraries(CppUTestExtTests ${CppUTestLibName} ${CppUTestExtLibName} ${THREAD_LIB} ${CPPUNIT_EXTERNAL_LIBRARIES}) if (TESTS_BUILD_DISCOVER) cpputest_buildtime_discover_tests(CppUTestExtTests) From ce6e92281c8f2838ce11978a25b4495fc0ad6ed2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Mon, 31 Jan 2022 02:48:14 +0100 Subject: [PATCH 0684/1093] Clarification of the message displayed when an actual call fails because some expectations are partially fulfilled but some of their parameters have not been fulfilled --- include/CppUTestExt/MockExpectedCallsList.h | 3 +- include/CppUTestExt/MockFailure.h | 3 +- src/CppUTestExt/MockActualCall.cpp | 2 +- src/CppUTestExt/MockExpectedCallsList.cpp | 11 ++-- src/CppUTestExt/MockFailure.cpp | 17 +++--- .../CppUTestExt/ExpectedFunctionsListTest.cpp | 18 ++++++ .../CppUTestExt/MockComparatorCopierTest.cpp | 2 +- tests/CppUTestExt/MockFailureTest.cpp | 56 +++++++++++++------ tests/CppUTestExt/MockHierarchyTest.cpp | 2 +- tests/CppUTestExt/MockParameterTest.cpp | 8 +-- 10 files changed, 84 insertions(+), 38 deletions(-) diff --git a/include/CppUTestExt/MockExpectedCallsList.h b/include/CppUTestExt/MockExpectedCallsList.h index 74c920dee..bdd7bb48c 100644 --- a/include/CppUTestExt/MockExpectedCallsList.h +++ b/include/CppUTestExt/MockExpectedCallsList.h @@ -75,7 +75,8 @@ class MockExpectedCallsList virtual SimpleString unfulfilledCallsToString(const SimpleString& linePrefix = "") const; virtual SimpleString fulfilledCallsToString(const SimpleString& linePrefix = "") const; - virtual SimpleString missingParametersToString() const; + virtual SimpleString callsWithMissingParametersToString(const SimpleString& linePrefix, + const SimpleString& missingParametersPrefix) const; protected: virtual void pruneEmptyNodeFromList(); diff --git a/include/CppUTestExt/MockFailure.h b/include/CppUTestExt/MockFailure.h index af2578575..b36a074c2 100644 --- a/include/CppUTestExt/MockFailure.h +++ b/include/CppUTestExt/MockFailure.h @@ -93,7 +93,8 @@ class MockUnexpectedOutputParameterFailure : public MockFailure class MockExpectedParameterDidntHappenFailure : public MockFailure { public: - MockExpectedParameterDidntHappenFailure(UtestShell* test, const SimpleString& functionName, const MockExpectedCallsList& expectations); + MockExpectedParameterDidntHappenFailure(UtestShell* test, const SimpleString& functionName, const MockExpectedCallsList& allExpectations, + const MockExpectedCallsList& matchingExpectations); }; class MockNoWayToCompareCustomTypeFailure : public MockFailure diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 495886657..1b5e0394f 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -398,7 +398,7 @@ void MockCheckedActualCall::checkExpectations() } if (potentiallyMatchingExpectations_.hasUnmatchingExpectationsBecauseOfMissingParameters()) { - MockExpectedParameterDidntHappenFailure failure(getTest(), getName(), allExpectations_); + MockExpectedParameterDidntHappenFailure failure(getTest(), getName(), allExpectations_, potentiallyMatchingExpectations_); failTest(failure); } else { diff --git a/src/CppUTestExt/MockExpectedCallsList.cpp b/src/CppUTestExt/MockExpectedCallsList.cpp index f66f46b66..d92e297c5 100644 --- a/src/CppUTestExt/MockExpectedCallsList.cpp +++ b/src/CppUTestExt/MockExpectedCallsList.cpp @@ -344,14 +344,17 @@ SimpleString MockExpectedCallsList::fulfilledCallsToString(const SimpleString& l return stringOrNoneTextWhenEmpty(str, linePrefix); } -SimpleString MockExpectedCallsList::missingParametersToString() const +SimpleString MockExpectedCallsList::callsWithMissingParametersToString(const SimpleString& linePrefix, + const SimpleString& missingParametersPrefix) const { SimpleString str; for (MockExpectedCallsListNode* p = head_; p; p = p->next_) - if (! p->expectedCall_->isMatchingActualCall()) - str = appendStringOnANewLine(str, "", p->expectedCall_->missingParametersToString()); + { + str = appendStringOnANewLine(str, linePrefix, p->expectedCall_->callToString()); + str = appendStringOnANewLine(str, linePrefix + missingParametersPrefix, p->expectedCall_->missingParametersToString()); + } - return stringOrNoneTextWhenEmpty(str, ""); + return stringOrNoneTextWhenEmpty(str, linePrefix); } bool MockExpectedCallsList::hasUnmatchingExpectationsBecauseOfMissingParameters() const diff --git a/src/CppUTestExt/MockFailure.cpp b/src/CppUTestExt/MockFailure.cpp index 5882ee534..10f475693 100644 --- a/src/CppUTestExt/MockFailure.cpp +++ b/src/CppUTestExt/MockFailure.cpp @@ -199,20 +199,21 @@ MockUnexpectedOutputParameterFailure::MockUnexpectedOutputParameterFailure(Utest message_ += parameter.getName(); } -MockExpectedParameterDidntHappenFailure::MockExpectedParameterDidntHappenFailure(UtestShell* test, const SimpleString& functionName, const MockExpectedCallsList& expectations) : MockFailure(test) +MockExpectedParameterDidntHappenFailure::MockExpectedParameterDidntHappenFailure(UtestShell* test, const SimpleString& functionName, + const MockExpectedCallsList& allExpectations, + const MockExpectedCallsList& matchingExpectations) : MockFailure(test) { - MockExpectedCallsList expectationsForFunction; - expectationsForFunction.addExpectationsRelatedTo(functionName, expectations); - message_ = "Mock Failure: Expected parameter for function \""; message_ += functionName; message_ += "\" did not happen.\n"; - addExpectationsAndCallHistoryRelatedTo(functionName, expectations); + message_ += "\tEXPECTED calls with MISSING parameters related to function: "; + message_ += functionName; + message_ += "\n"; + message_ += matchingExpectations.callsWithMissingParametersToString("\t\t", "\tMISSING parameters: "); + message_ += "\n"; - message_ += "\n\tMISSING parameters that didn't happen:\n"; - message_ += "\t\t"; - message_ += expectationsForFunction.missingParametersToString(); + addExpectationsAndCallHistoryRelatedTo(functionName, allExpectations); } MockNoWayToCompareCustomTypeFailure::MockNoWayToCompareCustomTypeFailure(UtestShell* test, const SimpleString& typeName) : MockFailure(test) diff --git a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp index 2d7b08111..b2416c890 100644 --- a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp +++ b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp @@ -253,6 +253,24 @@ TEST(MockExpectedCallsList, callToStringForUnfulfilledFunctions) STRCMP_EQUAL(expectedString.asCharString(), list->unfulfilledCallsToString().asCharString()); } +TEST(MockExpectedCallsList, callsWithMissingParametersToString) +{ + call1->withName("foo").withParameter("boo", 0); + call2->withName("bar").withParameter("baa", 10).withParameter("baz", "blah"); + call2->inputParameterWasPassed("baa"); + + list->addExpectedCall(call1); + list->addExpectedCall(call2); + + SimpleString expectedString; + expectedString = StringFromFormat("-%s\n-#%s\n-%s\n-#%s", + call1->callToString().asCharString(), + call1->missingParametersToString().asCharString(), + call2->callToString().asCharString(), + call2->missingParametersToString().asCharString()); + STRCMP_EQUAL(expectedString.asCharString(), list->callsWithMissingParametersToString("-", "#").asCharString()); +} + TEST(MockExpectedCallsList, callToStringForFulfilledFunctions) { call1->withName("foo"); diff --git a/tests/CppUTestExt/MockComparatorCopierTest.cpp b/tests/CppUTestExt/MockComparatorCopierTest.cpp index d2cfd5879..83f06615f 100644 --- a/tests/CppUTestExt/MockComparatorCopierTest.cpp +++ b/tests/CppUTestExt/MockComparatorCopierTest.cpp @@ -229,7 +229,7 @@ TEST(MockComparatorCopierTest, customTypeOutputParameterMissing) MockExpectedCallsListForTest expectations; expectations.addFunction("foo")->withOutputParameterOfTypeReturning("MyTypeForTesting", "output", &expectedObject); - MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "foo", expectations); + MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "foo", expectations, expectations); mock().expectOneCall("foo").withOutputParameterOfTypeReturning("MyTypeForTesting", "output", &expectedObject); mock().actualCall("foo"); diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index 404d93e89..3236736c8 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -39,6 +39,8 @@ TEST_GROUP(MockFailureTest) MockCheckedExpectedCall* call1; MockCheckedExpectedCall* call2; MockCheckedExpectedCall* call3; + MockCheckedExpectedCall* call4; + MockCheckedExpectedCall* call5; void setup () _override { @@ -46,6 +48,8 @@ TEST_GROUP(MockFailureTest) call1 = new MockCheckedExpectedCall; call2 = new MockCheckedExpectedCall; call3 = new MockCheckedExpectedCall; + call4 = new MockCheckedExpectedCall; + call5 = new MockCheckedExpectedCall; } void teardown () _override { @@ -53,15 +57,19 @@ TEST_GROUP(MockFailureTest) delete call1; delete call2; delete call3; + delete call4; + delete call5; CHECK_NO_MOCK_FAILURE(); MockFailureReporterForTest::clearReporter(); } - void addAllToList() + void addCallsToList( unsigned int count ) { - list->addExpectedCall(call1); - list->addExpectedCall(call2); - list->addExpectedCall(call3); + if(count >= 1) list->addExpectedCall(call1); + if(count >= 2) list->addExpectedCall(call2); + if(count >= 3) list->addExpectedCall(call3); + if(count >= 4) list->addExpectedCall(call4); + if(count >= 5) list->addExpectedCall(call5); } void checkUnexpectedNthCallMessage(unsigned int count, const char* expectedOrdinal) @@ -114,7 +122,7 @@ TEST(MockFailureTest, expectedCallDidNotHappen) call2->withName("world").withParameter("boo", 2).withParameter("hello", "world"); call3->withName("haphaphap"); call3->callWasMade(1); - addAllToList(); + addCallsToList(3); MockExpectedCallsDidntHappenFailure failure(UtestShell::getCurrent(), *list); STRCMP_EQUAL("Mock Failure: Expected call WAS NOT fulfilled.\n" @@ -144,7 +152,7 @@ TEST(MockFailureTest, MockUnexpectedInputParameterFailure) call1->withName("foo").withParameter("boo", 2); call2->withName("foo").withParameter("boo", 3.3); call3->withName("unrelated"); - addAllToList(); + addCallsToList(3); MockNamedValue actualParameter("bar"); actualParameter.setValue(2); @@ -167,7 +175,7 @@ TEST(MockFailureTest, MockUnexpectedOutputParameterFailure) call1->withName("foo").withOutputParameterReturning("boo", &out1, sizeof(out1)); call2->withName("foo").withOutputParameterReturning("boo", &out2, sizeof(out2)); call3->withName("unrelated"); - addAllToList(); + addCallsToList(3); MockNamedValue actualParameter("bar"); actualParameter.setValue((void *)0x123); @@ -189,7 +197,7 @@ TEST(MockFailureTest, MockUnexpectedUnmodifiedOutputParameterFailure) call1->withName("foo").withOutputParameterReturning("boo", &out1, sizeof(out1)); call2->withName("foo").withUnmodifiedOutputParameter("boo"); call3->withName("unrelated"); - addAllToList(); + addCallsToList(3); MockNamedValue actualParameter("bar"); actualParameter.setValue((void *)0x123); @@ -210,7 +218,7 @@ TEST(MockFailureTest, MockUnexpectedParameterValueFailure) call1->withName("foo").withParameter("boo", 2); call2->withName("foo").withParameter("boo", 10); call3->withName("unrelated"); - addAllToList(); + addCallsToList(3); MockNamedValue actualParameter("boo"); actualParameter.setValue(20); @@ -229,21 +237,35 @@ TEST(MockFailureTest, MockUnexpectedParameterValueFailure) TEST(MockFailureTest, MockExpectedParameterDidntHappenFailure) { call1->withName("foo").withParameter("bar", 2).withParameter("boo", "str"); + call1->inputParameterWasPassed("bar"); call2->withName("foo").withParameter("bar", 10).withParameter("boo", "bleh"); call2->callWasMade(1); call2->inputParameterWasPassed("bar"); call2->inputParameterWasPassed("boo"); - call3->withName("unrelated"); - addAllToList(); + call3->withName("foo").withParameter("bar", 2).withParameter("boo", "blah").withParameter("baa", 0u); + call3->inputParameterWasPassed("bar"); + call4->withName("foo").withParameter("bar", 20); + call5->withName("unrelated"); + addCallsToList(5); + + MockExpectedCallsList matchingCalls; + matchingCalls.addExpectedCall(call1); + matchingCalls.addExpectedCall(call3); - MockExpectedParameterDidntHappenFailure failure(UtestShell::getCurrent(), "foo", *list); + MockExpectedParameterDidntHappenFailure failure(UtestShell::getCurrent(), "foo", *list, matchingCalls); STRCMP_EQUAL("Mock Failure: Expected parameter for function \"foo\" did not happen.\n" + "\tEXPECTED calls with MISSING parameters related to function: foo\n" + "\t\tfoo -> int bar: <2 (0x2)>, const char* boo: (expected 1 call, called 0 times)\n" + "\t\t\tMISSING parameters: const char* boo\n" + "\t\tfoo -> int bar: <2 (0x2)>, const char* boo: , unsigned int baa: <0 (0x0)> (expected 1 call, called 0 times)\n" + "\t\t\tMISSING parameters: const char* boo, unsigned int baa\n" "\tEXPECTED calls that WERE NOT fulfilled related to function: foo\n" "\t\tfoo -> int bar: <2 (0x2)>, const char* boo: (expected 1 call, called 0 times)\n" + "\t\tfoo -> int bar: <2 (0x2)>, const char* boo: , unsigned int baa: <0 (0x0)> (expected 1 call, called 0 times)\n" + "\t\tfoo -> int bar: <20 (0x14)> (expected 1 call, called 0 times)\n" "\tEXPECTED calls that WERE fulfilled related to function: foo\n" - "\t\tfoo -> int bar: <10 (0xa)>, const char* boo: (expected 1 call, called 1 time)\n" - "\tMISSING parameters that didn't happen:\n" - "\t\tint bar, const char* boo", failure.getMessage().asCharString()); + "\t\tfoo -> int bar: <10 (0xa)>, const char* boo: (expected 1 call, called 1 time)", + failure.getMessage().asCharString()); } TEST(MockFailureTest, MockNoWayToCompareCustomTypeFailure) @@ -259,7 +281,7 @@ TEST(MockFailureTest, MockUnexpectedObjectFailure) call2->callWasMade(1); call2->wasPassedToObject(); call3->withName("unrelated"); - addAllToList(); + addCallsToList(3); MockUnexpectedObjectFailure failure(UtestShell::getCurrent(), "foo", (void*)0x1, *list); STRCMP_EQUAL(StringFromFormat ( @@ -279,7 +301,7 @@ TEST(MockFailureTest, MockExpectedObjectDidntHappenFailure) call2->callWasMade(1); call2->wasPassedToObject(); call3->withName("unrelated"); - addAllToList(); + addCallsToList(3); MockExpectedObjectDidntHappenFailure failure(UtestShell::getCurrent(), "foo", *list); STRCMP_EQUAL(StringFromFormat( diff --git a/tests/CppUTestExt/MockHierarchyTest.cpp b/tests/CppUTestExt/MockHierarchyTest.cpp index 2147472e9..dc240cf45 100644 --- a/tests/CppUTestExt/MockHierarchyTest.cpp +++ b/tests/CppUTestExt/MockHierarchyTest.cpp @@ -132,7 +132,7 @@ TEST(MockHierarchyTest, checkExpectationsWorksHierarchicallyForLastCallNotFinish MockExpectedCallsListForTest expectations; expectations.addFunction("first::foobar")->withParameter("boo", 1); - MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "first::foobar", expectations); + MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "first::foobar", expectations, expectations); mock("first").expectOneCall("foobar").withParameter("boo", 1); mock("first").actualCall("foobar"); diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 2adcbb029..828d4e59b 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -535,7 +535,7 @@ TEST(MockParameterTest, calledWithoutParameters) MockExpectedCallsListForTest expectations; expectations.addFunction("foo")->withParameter("p1", 1); - MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "foo", expectations); + MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "foo", expectations, expectations); mock().expectOneCall("foo").withParameter("p1", 1); mock().actualCall("foo"); @@ -566,7 +566,7 @@ TEST(MockParameterTest, ignoreOtherParametersButExpectedParameterDidntHappen) MockExpectedCallsListForTest expectations; expectations.addFunction("foo")->withParameter("p1", 1).ignoreOtherParameters(); - MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "foo", expectations); + MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "foo", expectations, expectations); mock().expectOneCall("foo").withParameter("p1", 1).ignoreOtherParameters(); mock().actualCall("foo").withParameter("p2", 2).withParameter("p3", 3).withParameter("p4", 4); @@ -613,7 +613,7 @@ TEST(MockParameterTest, newCallStartsWhileNotAllParametersWerePassed) MockExpectedCallsListForTest expectations; expectations.addFunction("foo")->withParameter("p1", 1); - MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "foo", expectations); + MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "foo", expectations, expectations); mock().expectOneCall("foo").withParameter("p1", 1); mock().actualCall("foo"); @@ -703,7 +703,7 @@ TEST(MockParameterTest, outputParameterMissing) mock().actualCall("foo"); expectations.addFunction("foo")->withOutputParameterReturning("output", &output, sizeof(output)); - MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "foo", expectations); + MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "foo", expectations, expectations); mock().checkExpectations(); CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); From 2c70f86fe5c7fd06c6ae6b0c76ea78d4a7e69dc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Mon, 7 Feb 2022 15:27:14 +0100 Subject: [PATCH 0685/1093] Divided helper method in MockFailureTest in two --- tests/CppUTestExt/MockFailureTest.cpp | 35 ++++++++++++++++----------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index 3236736c8..dfa32fb5e 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -63,13 +63,20 @@ TEST_GROUP(MockFailureTest) MockFailureReporterForTest::clearReporter(); } - void addCallsToList( unsigned int count ) + void addThreeCallsToList() { - if(count >= 1) list->addExpectedCall(call1); - if(count >= 2) list->addExpectedCall(call2); - if(count >= 3) list->addExpectedCall(call3); - if(count >= 4) list->addExpectedCall(call4); - if(count >= 5) list->addExpectedCall(call5); + list->addExpectedCall(call1); + list->addExpectedCall(call2); + list->addExpectedCall(call3); + } + + void addFiveCallsToList() + { + list->addExpectedCall(call1); + list->addExpectedCall(call2); + list->addExpectedCall(call3); + list->addExpectedCall(call4); + list->addExpectedCall(call5); } void checkUnexpectedNthCallMessage(unsigned int count, const char* expectedOrdinal) @@ -122,7 +129,7 @@ TEST(MockFailureTest, expectedCallDidNotHappen) call2->withName("world").withParameter("boo", 2).withParameter("hello", "world"); call3->withName("haphaphap"); call3->callWasMade(1); - addCallsToList(3); + addThreeCallsToList(); MockExpectedCallsDidntHappenFailure failure(UtestShell::getCurrent(), *list); STRCMP_EQUAL("Mock Failure: Expected call WAS NOT fulfilled.\n" @@ -152,7 +159,7 @@ TEST(MockFailureTest, MockUnexpectedInputParameterFailure) call1->withName("foo").withParameter("boo", 2); call2->withName("foo").withParameter("boo", 3.3); call3->withName("unrelated"); - addCallsToList(3); + addThreeCallsToList(); MockNamedValue actualParameter("bar"); actualParameter.setValue(2); @@ -175,7 +182,7 @@ TEST(MockFailureTest, MockUnexpectedOutputParameterFailure) call1->withName("foo").withOutputParameterReturning("boo", &out1, sizeof(out1)); call2->withName("foo").withOutputParameterReturning("boo", &out2, sizeof(out2)); call3->withName("unrelated"); - addCallsToList(3); + addThreeCallsToList(); MockNamedValue actualParameter("bar"); actualParameter.setValue((void *)0x123); @@ -197,7 +204,7 @@ TEST(MockFailureTest, MockUnexpectedUnmodifiedOutputParameterFailure) call1->withName("foo").withOutputParameterReturning("boo", &out1, sizeof(out1)); call2->withName("foo").withUnmodifiedOutputParameter("boo"); call3->withName("unrelated"); - addCallsToList(3); + addThreeCallsToList(); MockNamedValue actualParameter("bar"); actualParameter.setValue((void *)0x123); @@ -218,7 +225,7 @@ TEST(MockFailureTest, MockUnexpectedParameterValueFailure) call1->withName("foo").withParameter("boo", 2); call2->withName("foo").withParameter("boo", 10); call3->withName("unrelated"); - addCallsToList(3); + addThreeCallsToList(); MockNamedValue actualParameter("boo"); actualParameter.setValue(20); @@ -246,7 +253,7 @@ TEST(MockFailureTest, MockExpectedParameterDidntHappenFailure) call3->inputParameterWasPassed("bar"); call4->withName("foo").withParameter("bar", 20); call5->withName("unrelated"); - addCallsToList(5); + addFiveCallsToList(); MockExpectedCallsList matchingCalls; matchingCalls.addExpectedCall(call1); @@ -281,7 +288,7 @@ TEST(MockFailureTest, MockUnexpectedObjectFailure) call2->callWasMade(1); call2->wasPassedToObject(); call3->withName("unrelated"); - addCallsToList(3); + addThreeCallsToList(); MockUnexpectedObjectFailure failure(UtestShell::getCurrent(), "foo", (void*)0x1, *list); STRCMP_EQUAL(StringFromFormat ( @@ -301,7 +308,7 @@ TEST(MockFailureTest, MockExpectedObjectDidntHappenFailure) call2->callWasMade(1); call2->wasPassedToObject(); call3->withName("unrelated"); - addCallsToList(3); + addThreeCallsToList(); MockExpectedObjectDidntHappenFailure failure(UtestShell::getCurrent(), "foo", *list); STRCMP_EQUAL(StringFromFormat( From 28d25fd55fad735fba01520b76c73430517b70dc Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Tue, 1 Mar 2022 06:48:22 +1000 Subject: [PATCH 0686/1093] Update CppUTestConfigurationOptions.cmake Add cxx flags for Borland 5.4 compiler to not report warnings W8008 (if condition always false) and 8066 (unreachable code) --- cmake/Modules/CppUTestConfigurationOptions.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index b9b724d3b..f2fa5b2c6 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -16,6 +16,7 @@ elseif (IAR) elseif (BORLAND) set(CPP_PLATFORM Borland) set(MEMORY_LEAK_DETECTION False) + set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") elseif (STD_C) if(NOT CPP_PLATFORM) set(CPP_PLATFORM Gcc) From 2a7eb089b4c51e5a34a8458b2503a797e785d6be Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Thu, 17 Mar 2022 20:05:28 +1000 Subject: [PATCH 0687/1093] Update CppUTestConfigurationOptions.cmake setting LONGLONG to OFF --- cmake/Modules/CppUTestConfigurationOptions.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index f2fa5b2c6..f67550d92 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -16,6 +16,7 @@ elseif (IAR) elseif (BORLAND) set(CPP_PLATFORM Borland) set(MEMORY_LEAK_DETECTION False) + set(LONGLONG OFF) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") elseif (STD_C) if(NOT CPP_PLATFORM) From 3756d31e09e039662ee81e4672634ba8d7b15bea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Thu, 17 Mar 2022 18:21:25 +0100 Subject: [PATCH 0688/1093] Add support for generating a test failure when an unexpected exception is thrown --- include/CppUTest/TestFailure.h | 13 +++++++++++ include/CppUTest/Utest.h | 2 ++ src/CppUTest/TestFailure.cpp | 36 ++++++++++++++++++++++++++++++ src/CppUTest/Utest.cpp | 34 +++++++++++++++++++++++++--- tests/CppUTest/TestFailureTest.cpp | 17 ++++++++++++++ tests/CppUTest/UtestTest.cpp | 36 ++++++++++++++++++++++++++++++ 6 files changed, 135 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/TestFailure.h b/include/CppUTest/TestFailure.h index 373274d29..2752d545f 100644 --- a/include/CppUTest/TestFailure.h +++ b/include/CppUTest/TestFailure.h @@ -38,6 +38,10 @@ #include "SimpleString.h" +#if CPPUTEST_USE_STD_CPP_LIB +#include +#endif + class UtestShell; class TestOutput; @@ -182,4 +186,13 @@ class FeatureUnsupportedFailure : public TestFailure FeatureUnsupportedFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& featureName, const SimpleString& text); }; +#if CPPUTEST_USE_STD_CPP_LIB +class UnexpectedExceptionFailure : public TestFailure +{ +public: + UnexpectedExceptionFailure(UtestShell* test); + UnexpectedExceptionFailure(UtestShell* test, const std::exception &e); +}; +#endif + #endif diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index b100355cf..9fb4143f4 100644 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -165,6 +165,8 @@ class UtestShell virtual void failWith(const TestFailure& failure); virtual void failWith(const TestFailure& failure, const TestTerminator& terminator); + virtual void addFailure(const TestFailure& failure); + protected: UtestShell(); UtestShell(const char *groupName, const char *testName, const char *fileName, size_t lineNumber, UtestShell *nextTest); diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index bdcdaa544..95db641b3 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -31,6 +31,13 @@ #include "CppUTest/SimpleString.h" #include "CppUTest/PlatformSpecificFunctions.h" +#if CPPUTEST_USE_STD_CPP_LIB +#include +#if defined(__GNUC__) +#include +#endif +#endif + TestFailure::TestFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& theMessage) : testName_(test->getFormattedName()), testNameOnly_(test->getName()), fileName_(fileName), lineNumber_(lineNumber), testFileName_(test->getFile()), testLineNumber_(test->getLineNumber()), message_(theMessage) { @@ -378,3 +385,32 @@ FeatureUnsupportedFailure::FeatureUnsupportedFailure(UtestShell* test, const cha message_ += StringFromFormat("The feature \"%s\" is not supported in this environment or with the feature set selected when building the library.", featureName.asCharString()); } + +#if CPPUTEST_USE_STD_CPP_LIB +UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test) +: TestFailure(test, "Unexpected exception of unknown type was thrown.") +{ +} + +#if defined(__GNUC__) +static SimpleString demangle(const char* name) +{ + int status = -1; + + std::unique_ptr demangledName { + abi::__cxa_demangle(name, nullptr, nullptr, &status), + std::free + }; + + return (status==0) ? demangledName.get() : name ; +} +#define DEMANGLE(name) demangle(name).asCharString() +#else +#define DEMANGLE(name) (name) +#endif + +UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test, const std::exception &e) +: TestFailure(test, StringFromFormat("Unexpected exception of type '%s' was thrown: %s", DEMANGLE(typeid(e).name()), e.what())) +{ +} +#endif diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 2d8061e6b..0d29a03fe 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -375,11 +375,16 @@ void UtestShell::failWith(const TestFailure& failure) void UtestShell::failWith(const TestFailure& failure, const TestTerminator& terminator) { - hasFailed_ = true; - getTestResult()->addFailure(failure); + addFailure(failure); terminator.exitCurrentTest(); } // LCOV_EXCL_LINE +void UtestShell::addFailure(const TestFailure& failure) +{ + hasFailed_ = true; + getTestResult()->addFailure(failure); +} + void UtestShell::exitTest(const TestTerminator& terminator) { terminator.exitCurrentTest(); @@ -646,6 +651,18 @@ void Utest::run() { PlatformSpecificRestoreJumpBuffer(); } +#if CPPUTEST_USE_STD_CPP_LIB + catch (const std::exception& e) + { + PlatformSpecificRestoreJumpBuffer(); + current->addFailure(UnexpectedExceptionFailure(current, e)); + } + catch (...) + { + PlatformSpecificRestoreJumpBuffer(); + current->addFailure(UnexpectedExceptionFailure(current)); + } +#endif try { current->printVeryVerbose("\n-------- before teardown: "); @@ -656,7 +673,18 @@ void Utest::run() { PlatformSpecificRestoreJumpBuffer(); } - +#if CPPUTEST_USE_STD_CPP_LIB + catch (const std::exception& e) + { + PlatformSpecificRestoreJumpBuffer(); + current->addFailure(UnexpectedExceptionFailure(current, e)); + } + catch (...) + { + PlatformSpecificRestoreJumpBuffer(); + current->addFailure(UnexpectedExceptionFailure(current)); + } +#endif } #else diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index a33bad543..5262fb57c 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -426,3 +426,20 @@ TEST(TestFailure, FeatureUnsupported) FeatureUnsupportedFailure f(test, failFileName, failLineNumber, "SOME_FEATURE", ""); FAILURE_EQUAL("The feature \"SOME_FEATURE\" is not supported in this environment or with the feature set selected when building the library.", f); } + +#if CPPUTEST_USE_STD_CPP_LIB +TEST(TestFailure, UnexpectedExceptionFailure_UnknownException) +{ + UnexpectedExceptionFailure f(test); + FAILURE_EQUAL("Unexpected exception of unknown type was thrown.", f); +} + +TEST(TestFailure, UnexpectedExceptionFailure_StandardException) +{ + std::runtime_error e("Some error"); + UnexpectedExceptionFailure f(test, e); + STRCMP_CONTAINS("Unexpected exception of type '", f.getMessage().asCharString()); + STRCMP_CONTAINS("runtime_error", f.getMessage().asCharString()); + STRCMP_CONTAINS("' was thrown: Some error", f.getMessage().asCharString()); +} +#endif \ No newline at end of file diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index a53eb68fd..d8726512a 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -205,6 +205,42 @@ TEST(UtestShell, TestStopsAfterSetupFailure) LONGS_EQUAL(0, stopAfterFailure); } +#if CPPUTEST_USE_STD_CPP_LIB +static void thrownUnknownExceptionMethod_() +{ + throw 33; + stopAfterFailure++; +} + +TEST(UtestShell, TestStopsAfterUnknownExceptionIsThrown) +{ + stopAfterFailure = 0; + fixture.setTestFunction(thrownUnknownExceptionMethod_); + fixture.runAllTests(); + LONGS_EQUAL(1, fixture.getFailureCount()); + fixture.assertPrintContains("Unexpected exception of unknown type was thrown"); + LONGS_EQUAL(0, stopAfterFailure); +} + +static void thrownStandardExceptionMethod_() +{ + throw std::runtime_error("exception text"); + stopAfterFailure++; +} + +TEST(UtestShell, TestStopsAfterStandardExceptionIsThrown) +{ + stopAfterFailure = 0; + fixture.setTestFunction(thrownStandardExceptionMethod_); + fixture.runAllTests(); + LONGS_EQUAL(1, fixture.getFailureCount()); + fixture.assertPrintContains("Unexpected exception of type '"); + fixture.assertPrintContains("runtime_error"); + fixture.assertPrintContains("' was thrown: exception text"); + LONGS_EQUAL(0, stopAfterFailure); +} +#endif + TEST(UtestShell, veryVebose) { UtestShell shell("Group", "name", __FILE__, __LINE__); From ee2bf0f1948d1a1efb2540ed8954da4cc509ad73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Fri, 18 Mar 2022 19:48:23 +0100 Subject: [PATCH 0689/1093] Add command-line option to enable letting unexpected exceptions to pass through --- include/CppUTest/CommandLineArguments.h | 2 + include/CppUTest/Utest.h | 5 ++ src/CppUTest/CommandLineArguments.cpp | 16 +++++-- src/CppUTest/CommandLineTestRunner.cpp | 2 + src/CppUTest/Utest.cpp | 53 +++++++++++++++++---- tests/CppUTest/CommandLineArgumentsTest.cpp | 10 +++- tests/CppUTest/UtestTest.cpp | 46 ++++++++++++++++++ 7 files changed, 122 insertions(+), 12 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index f5661f009..8bd2a2848 100644 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -53,6 +53,7 @@ class CommandLineArguments bool isShuffling() const; bool isReversing() const; bool isCrashingOnFail() const; + bool isRethrowingExceptions() const; size_t getShuffleSeed() const; const TestFilter* getGroupFilters() const; const TestFilter* getNameFilters() const; @@ -85,6 +86,7 @@ class CommandLineArguments bool runIgnored_; bool reversing_; bool crashOnFail_; + bool rethrowExceptions_; bool shuffling_; bool shufflingPreSeeded_; size_t repeat_; diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 9fb4143f4..5ae9e0edc 100644 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -99,6 +99,9 @@ class UtestShell static void setCrashOnFail(); static void restoreDefaultTestTerminator(); + static void setRethrowExceptions(bool rethrowExceptions); + static bool isRethrowingExceptions(); + public: UtestShell(const char* groupName, const char* testName, const char* fileName, size_t lineNumber); virtual ~UtestShell(); @@ -190,6 +193,8 @@ class UtestShell static TestResult* testResult_; static const TestTerminator *currentTestTerminator_; + + static bool rethrowExceptions_; }; diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 572688d08..a61458aee 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -30,7 +30,10 @@ #include "CppUTest/PlatformSpecificFunctions.h" CommandLineArguments::CommandLineArguments(int ac, const char *const *av) : - ac_(ac), av_(av), needHelp_(false), verbose_(false), veryVerbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), listTestLocations_(false), runIgnored_(false), reversing_(false), crashOnFail_(false), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) + ac_(ac), av_(av), needHelp_(false), verbose_(false), veryVerbose_(false), color_(false), runTestsAsSeperateProcess_(false), + listTestGroupNames_(false), listTestGroupAndCaseNames_(false), listTestLocations_(false), runIgnored_(false), reversing_(false), + crashOnFail_(false), rethrowExceptions_(false), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), + groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) { } @@ -68,6 +71,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument == "-ll") listTestLocations_ = true; else if (argument == "-ri") runIgnored_ = true; else if (argument == "-f") crashOnFail_ = true; + else if (argument == "-e") rethrowExceptions_ = true; else if (argument.startsWith("-r")) setRepeatCount(ac_, av_, i); else if (argument.startsWith("-g")) addGroupFilter(ac_, av_, i); else if (argument.startsWith("-t")) correctParameters = addGroupDotNameFilter(ac_, av_, i); @@ -96,7 +100,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) const char* CommandLineArguments::usage() const { return "use -h for more extensive help\n" - "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-f]\n" + "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-f] [-e]\n" " [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-t groupName.testName]...\n" " [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]...\n" " [-o{normal, junit, teamcity}] [-k packageName]\n"; @@ -139,7 +143,8 @@ const char* CommandLineArguments::help() const " -b - run the tests backwards, reversing the normal way\n" " -s [seed] - shuffle tests randomly. Seed is optional\n" " -r# - repeat the tests some number (#) of times, or twice if # is not specified.\n" - " -f - Cause the tests to crash on failure (to allow the test to be debugged if necessary)\n"; + " -f - Cause the tests to crash on failure (to allow the test to be debugged if necessary)\n" + " -e - rethrow unexpected exceptions on failure (to allow the test to be debugged if necessary)\n"; } bool CommandLineArguments::needHelp() const @@ -203,6 +208,11 @@ bool CommandLineArguments::isCrashingOnFail() const return crashOnFail_; } +bool CommandLineArguments::isRethrowingExceptions() const +{ + return rethrowExceptions_; +} + bool CommandLineArguments::isShuffling() const { return shuffling_; diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 69569de8e..4663ced00 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -96,6 +96,8 @@ void CommandLineTestRunner::initializeTestRun() if (arguments_->runTestsInSeperateProcess()) registry_->setRunTestsInSeperateProcess(); if (arguments_->isRunIgnored()) registry_->setRunIgnored(); if (arguments_->isCrashingOnFail()) UtestShell::setCrashOnFail(); + + UtestShell::setRethrowExceptions( arguments_->isRethrowingExceptions() ); } int CommandLineTestRunner::runAllTests() diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 0d29a03fe..bcbe99f77 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -140,6 +140,8 @@ static const CrashingTestTerminator crashingTestTerminator; const TestTerminator *UtestShell::currentTestTerminator_ = &normalTestTerminator; +bool UtestShell::rethrowExceptions_ = false; + /******************************** */ UtestShell::UtestShell() : @@ -229,16 +231,25 @@ void UtestShell::runOneTestInCurrentProcess(TestPlugin* plugin, TestResult& resu UtestShell::setTestResult(&result); UtestShell::setCurrentTest(this); - result.printVeryVerbose("\n---- before createTest: "); - Utest* testToRun = createTest(); - result.printVeryVerbose("\n---- after createTest: "); + Utest* testToRun = nullptr; + try + { + result.printVeryVerbose("\n---- before createTest: "); + testToRun = createTest(); + result.printVeryVerbose("\n---- after createTest: "); - result.printVeryVerbose("\n------ before runTest: "); - testToRun->run(); - result.printVeryVerbose("\n------ after runTest: "); + result.printVeryVerbose("\n------ before runTest: "); + testToRun->run(); + result.printVeryVerbose("\n------ after runTest: "); - UtestShell::setCurrentTest(savedTest); - UtestShell::setTestResult(savedResult); + UtestShell::setCurrentTest(savedTest); + UtestShell::setTestResult(savedResult); + } + catch(...) + { + destroyTest(testToRun); + throw; + } result.printVeryVerbose("\n---- before destroyTest: "); destroyTest(testToRun); @@ -616,6 +627,16 @@ void UtestShell::restoreDefaultTestTerminator() currentTestTerminator_ = &normalTestTerminator; } +void UtestShell::setRethrowExceptions(bool rethrowExceptions) +{ + rethrowExceptions_ = rethrowExceptions; +} + +bool UtestShell::isRethrowingExceptions() +{ + return rethrowExceptions_; +} + ExecFunctionTestShell::~ExecFunctionTestShell() { } @@ -656,11 +677,19 @@ void Utest::run() { PlatformSpecificRestoreJumpBuffer(); current->addFailure(UnexpectedExceptionFailure(current, e)); + if (current->isRethrowingExceptions()) + { + throw; + } } catch (...) { PlatformSpecificRestoreJumpBuffer(); current->addFailure(UnexpectedExceptionFailure(current)); + if (current->isRethrowingExceptions()) + { + throw; + } } #endif @@ -678,11 +707,19 @@ void Utest::run() { PlatformSpecificRestoreJumpBuffer(); current->addFailure(UnexpectedExceptionFailure(current, e)); + if (current->isRethrowingExceptions()) + { + throw; + } } catch (...) { PlatformSpecificRestoreJumpBuffer(); current->addFailure(UnexpectedExceptionFailure(current)); + if (current->isRethrowingExceptions()) + { + throw; + } } #endif } diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index 0171efcec..d1e0d261a 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -466,7 +466,7 @@ TEST(CommandLineArguments, printUsage) { STRCMP_EQUAL( "use -h for more extensive help\n" - "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-f]\n" + "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-f] [-e]\n" " [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-t groupName.testName]...\n" " [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]...\n" " [-o{normal, junit, teamcity}] [-k packageName]\n", @@ -550,3 +550,11 @@ TEST(CommandLineArguments, setOptCrashOnFail) CHECK(newArgumentParser(argc, argv)); CHECK(args->isCrashingOnFail()); } + +TEST(CommandLineArguments, setOptRethrowExceptions) +{ + int argc = 2; + const char* argv[] = { "tests.exe", "-e"}; + CHECK(newArgumentParser(argc, argv)); + CHECK(args->isRethrowingExceptions()); +} diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index d8726512a..1e3b6fd5c 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -239,6 +239,52 @@ TEST(UtestShell, TestStopsAfterStandardExceptionIsThrown) fixture.assertPrintContains("' was thrown: exception text"); LONGS_EQUAL(0, stopAfterFailure); } + +TEST(UtestShell, UnknownExceptionIsRethrownIfEnabled) +{ + bool exceptionRethrown = false; + stopAfterFailure = 0; + UtestShell::setRethrowExceptions(true); + fixture.setTestFunction(thrownUnknownExceptionMethod_); + try + { + fixture.runAllTests(); + stopAfterFailure++; + } + catch(...) + { + exceptionRethrown = true; + } + CHECK_TRUE(exceptionRethrown); + LONGS_EQUAL(1, fixture.getFailureCount()); + fixture.assertPrintContains("Unexpected exception of unknown type was thrown"); + LONGS_EQUAL(0, stopAfterFailure); + UtestShell::setRethrowExceptions(false); +} + +TEST(UtestShell, StandardExceptionIsRethrownIfEnabled) +{ + bool exceptionRethrown = false; + stopAfterFailure = 0; + UtestShell::setRethrowExceptions(true); + fixture.setTestFunction(thrownStandardExceptionMethod_); + try + { + fixture.runAllTests(); + stopAfterFailure++; + } + catch(const std::exception &) + { + exceptionRethrown = true; + } + CHECK_TRUE(exceptionRethrown); + LONGS_EQUAL(1, fixture.getFailureCount()); + fixture.assertPrintContains("Unexpected exception of type '"); + fixture.assertPrintContains("runtime_error"); + fixture.assertPrintContains("' was thrown: exception text"); + LONGS_EQUAL(0, stopAfterFailure); + UtestShell::setRethrowExceptions(false); +} #endif TEST(UtestShell, veryVebose) From ff3817ffadd6347f426e42aa0408fee4a1ba7a95 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Sat, 19 Mar 2022 21:14:21 +1000 Subject: [PATCH 0690/1093] Update UtestPlatform.cpp Create std::nothrow constant --- src/Platforms/Borland/UtestPlatform.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index c1f8472f5..45a17022d 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -59,6 +59,8 @@ #include "CppUTest/PlatformSpecificFunctions.h" +const std::nothrow_t std::nothrow; + static jmp_buf test_exit_jmp_buf[10]; static int jmp_buf_index = 0; From ce36c40bf64be8f850ce32fe8e1d0f17fd82ce95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Sat, 19 Mar 2022 14:57:00 +0100 Subject: [PATCH 0691/1093] Remove unnecessary #ifdefs --- src/CppUTest/Utest.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index bcbe99f77..8d1e3133c 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -672,7 +672,6 @@ void Utest::run() { PlatformSpecificRestoreJumpBuffer(); } -#if CPPUTEST_USE_STD_CPP_LIB catch (const std::exception& e) { PlatformSpecificRestoreJumpBuffer(); @@ -691,7 +690,6 @@ void Utest::run() throw; } } -#endif try { current->printVeryVerbose("\n-------- before teardown: "); @@ -702,7 +700,6 @@ void Utest::run() { PlatformSpecificRestoreJumpBuffer(); } -#if CPPUTEST_USE_STD_CPP_LIB catch (const std::exception& e) { PlatformSpecificRestoreJumpBuffer(); @@ -721,7 +718,6 @@ void Utest::run() throw; } } -#endif } #else From 0e4eadfabaedde57315936b495050a0fbdf27af4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Sat, 19 Mar 2022 14:59:50 +0100 Subject: [PATCH 0692/1093] Move failure generation before PlatformSpecificRestoreJumpBuffer() for future stacktrace capture support --- src/CppUTest/Utest.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 8d1e3133c..c3f41b8fd 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -672,10 +672,10 @@ void Utest::run() { PlatformSpecificRestoreJumpBuffer(); } - catch (const std::exception& e) + catch (const std::exception &e) { - PlatformSpecificRestoreJumpBuffer(); current->addFailure(UnexpectedExceptionFailure(current, e)); + PlatformSpecificRestoreJumpBuffer(); if (current->isRethrowingExceptions()) { throw; @@ -683,8 +683,8 @@ void Utest::run() } catch (...) { - PlatformSpecificRestoreJumpBuffer(); current->addFailure(UnexpectedExceptionFailure(current)); + PlatformSpecificRestoreJumpBuffer(); if (current->isRethrowingExceptions()) { throw; @@ -700,10 +700,10 @@ void Utest::run() { PlatformSpecificRestoreJumpBuffer(); } - catch (const std::exception& e) + catch (const std::exception &e) { - PlatformSpecificRestoreJumpBuffer(); current->addFailure(UnexpectedExceptionFailure(current, e)); + PlatformSpecificRestoreJumpBuffer(); if (current->isRethrowingExceptions()) { throw; @@ -711,8 +711,8 @@ void Utest::run() } catch (...) { - PlatformSpecificRestoreJumpBuffer(); current->addFailure(UnexpectedExceptionFailure(current)); + PlatformSpecificRestoreJumpBuffer(); if (current->isRethrowingExceptions()) { throw; From e2265ea3e42f407db9616261703ef5b2a89273a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Sat, 19 Mar 2022 15:29:47 +0100 Subject: [PATCH 0693/1093] Fix compilation error with VS toolset v90 --- src/CppUTest/Utest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index c3f41b8fd..f8ceea62a 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -231,7 +231,7 @@ void UtestShell::runOneTestInCurrentProcess(TestPlugin* plugin, TestResult& resu UtestShell::setTestResult(&result); UtestShell::setCurrentTest(this); - Utest* testToRun = nullptr; + Utest* testToRun = NULLPTR; try { result.printVeryVerbose("\n---- before createTest: "); From cd778db8663dc991ac48d72a3020a5f648f80bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Tue, 22 Mar 2022 19:38:33 +0100 Subject: [PATCH 0694/1093] Made rethrowing unexpected exceptions the default behavior --- src/CppUTest/CommandLineArguments.cpp | 6 +++--- tests/CppUTest/CommandLineArgumentsTest.cpp | 3 ++- tests/CppUTest/UtestTest.cpp | 12 ++++++++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index a61458aee..dcfcfb4b1 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -32,7 +32,7 @@ CommandLineArguments::CommandLineArguments(int ac, const char *const *av) : ac_(ac), av_(av), needHelp_(false), verbose_(false), veryVerbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), listTestLocations_(false), runIgnored_(false), reversing_(false), - crashOnFail_(false), rethrowExceptions_(false), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), + crashOnFail_(false), rethrowExceptions_(true), shuffling_(false), shufflingPreSeeded_(false), repeat_(1), shuffleSeed_(0), groupFilters_(NULLPTR), nameFilters_(NULLPTR), outputType_(OUTPUT_ECLIPSE) { } @@ -71,7 +71,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument == "-ll") listTestLocations_ = true; else if (argument == "-ri") runIgnored_ = true; else if (argument == "-f") crashOnFail_ = true; - else if (argument == "-e") rethrowExceptions_ = true; + else if (argument == "-e") rethrowExceptions_ = false; else if (argument.startsWith("-r")) setRepeatCount(ac_, av_, i); else if (argument.startsWith("-g")) addGroupFilter(ac_, av_, i); else if (argument.startsWith("-t")) correctParameters = addGroupDotNameFilter(ac_, av_, i); @@ -144,7 +144,7 @@ const char* CommandLineArguments::help() const " -s [seed] - shuffle tests randomly. Seed is optional\n" " -r# - repeat the tests some number (#) of times, or twice if # is not specified.\n" " -f - Cause the tests to crash on failure (to allow the test to be debugged if necessary)\n" - " -e - rethrow unexpected exceptions on failure (to allow the test to be debugged if necessary)\n"; + " -e - do not rethrow unexpected exceptions on failure\n"; } bool CommandLineArguments::needHelp() const diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index d1e0d261a..f1bcfaf38 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -504,6 +504,7 @@ TEST(CommandLineArguments, checkDefaultArguments) CHECK(args->isEclipseOutput()); CHECK(SimpleString("") == args->getPackageName()); CHECK(!args->isCrashingOnFail()); + CHECK(args->isRethrowingExceptions()); } TEST(CommandLineArguments, setPackageName) @@ -556,5 +557,5 @@ TEST(CommandLineArguments, setOptRethrowExceptions) int argc = 2; const char* argv[] = { "tests.exe", "-e"}; CHECK(newArgumentParser(argc, argv)); - CHECK(args->isRethrowingExceptions()); + CHECK_FALSE(args->isRethrowingExceptions()); } diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 1e3b6fd5c..46f33cbb1 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -214,12 +214,15 @@ static void thrownUnknownExceptionMethod_() TEST(UtestShell, TestStopsAfterUnknownExceptionIsThrown) { + bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); + UtestShell::setRethrowExceptions(false); stopAfterFailure = 0; fixture.setTestFunction(thrownUnknownExceptionMethod_); fixture.runAllTests(); LONGS_EQUAL(1, fixture.getFailureCount()); fixture.assertPrintContains("Unexpected exception of unknown type was thrown"); LONGS_EQUAL(0, stopAfterFailure); + UtestShell::setRethrowExceptions(initialRethrowExceptions); } static void thrownStandardExceptionMethod_() @@ -230,6 +233,8 @@ static void thrownStandardExceptionMethod_() TEST(UtestShell, TestStopsAfterStandardExceptionIsThrown) { + bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); + UtestShell::setRethrowExceptions(false); stopAfterFailure = 0; fixture.setTestFunction(thrownStandardExceptionMethod_); fixture.runAllTests(); @@ -238,10 +243,12 @@ TEST(UtestShell, TestStopsAfterStandardExceptionIsThrown) fixture.assertPrintContains("runtime_error"); fixture.assertPrintContains("' was thrown: exception text"); LONGS_EQUAL(0, stopAfterFailure); + UtestShell::setRethrowExceptions(initialRethrowExceptions); } TEST(UtestShell, UnknownExceptionIsRethrownIfEnabled) { + bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); bool exceptionRethrown = false; stopAfterFailure = 0; UtestShell::setRethrowExceptions(true); @@ -259,11 +266,12 @@ TEST(UtestShell, UnknownExceptionIsRethrownIfEnabled) LONGS_EQUAL(1, fixture.getFailureCount()); fixture.assertPrintContains("Unexpected exception of unknown type was thrown"); LONGS_EQUAL(0, stopAfterFailure); - UtestShell::setRethrowExceptions(false); + UtestShell::setRethrowExceptions(initialRethrowExceptions); } TEST(UtestShell, StandardExceptionIsRethrownIfEnabled) { + bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); bool exceptionRethrown = false; stopAfterFailure = 0; UtestShell::setRethrowExceptions(true); @@ -283,7 +291,7 @@ TEST(UtestShell, StandardExceptionIsRethrownIfEnabled) fixture.assertPrintContains("runtime_error"); fixture.assertPrintContains("' was thrown: exception text"); LONGS_EQUAL(0, stopAfterFailure); - UtestShell::setRethrowExceptions(false); + UtestShell::setRethrowExceptions(initialRethrowExceptions); } #endif From 3eae836c429f4793debb1861109b192d0dbd64a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Tue, 22 Mar 2022 19:44:47 +0100 Subject: [PATCH 0695/1093] Add command line argument for continuous integration mode --- src/CppUTest/CommandLineArguments.cpp | 6 ++++-- tests/CppUTest/CommandLineArgumentsTest.cpp | 17 ++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index dcfcfb4b1..27cdee9f9 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -72,6 +72,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument == "-ri") runIgnored_ = true; else if (argument == "-f") crashOnFail_ = true; else if (argument == "-e") rethrowExceptions_ = false; + else if (argument == "-ci") rethrowExceptions_ = false; else if (argument.startsWith("-r")) setRepeatCount(ac_, av_, i); else if (argument.startsWith("-g")) addGroupFilter(ac_, av_, i); else if (argument.startsWith("-t")) correctParameters = addGroupDotNameFilter(ac_, av_, i); @@ -100,7 +101,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) const char* CommandLineArguments::usage() const { return "use -h for more extensive help\n" - "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-f] [-e]\n" + "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-f] [-e] [-ci]\n" " [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-t groupName.testName]...\n" " [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]...\n" " [-o{normal, junit, teamcity}] [-k packageName]\n"; @@ -144,7 +145,8 @@ const char* CommandLineArguments::help() const " -s [seed] - shuffle tests randomly. Seed is optional\n" " -r# - repeat the tests some number (#) of times, or twice if # is not specified.\n" " -f - Cause the tests to crash on failure (to allow the test to be debugged if necessary)\n" - " -e - do not rethrow unexpected exceptions on failure\n"; + " -e - do not rethrow unexpected exceptions on failure\n" + " -ci - continuous integration mode (equivalent to -e)\n"; } bool CommandLineArguments::needHelp() const diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index f1bcfaf38..72a629d8a 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -466,7 +466,7 @@ TEST(CommandLineArguments, printUsage) { STRCMP_EQUAL( "use -h for more extensive help\n" - "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-f] [-e]\n" + "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-f] [-e] [-ci]\n" " [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-t groupName.testName]...\n" " [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]...\n" " [-o{normal, junit, teamcity}] [-k packageName]\n", @@ -507,6 +507,21 @@ TEST(CommandLineArguments, checkDefaultArguments) CHECK(args->isRethrowingExceptions()); } +TEST(CommandLineArguments, checkContinuousIntegrationMode) +{ + int argc = 2; + const char* argv[] = { "tests.exe", "-ci" }; + CHECK(newArgumentParser(argc, argv)); + CHECK(!args->isVerbose()); + LONGS_EQUAL(1, args->getRepeatCount()); + CHECK(NULLPTR == args->getGroupFilters()); + CHECK(NULLPTR == args->getNameFilters()); + CHECK(args->isEclipseOutput()); + CHECK(SimpleString("") == args->getPackageName()); + CHECK(!args->isCrashingOnFail()); + CHECK_FALSE(args->isRethrowingExceptions()); +} + TEST(CommandLineArguments, setPackageName) { int argc = 3; From dc72531cea8a6ddfc1c0837dcb47e337fae373a9 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Wed, 23 Mar 2022 11:50:44 +1000 Subject: [PATCH 0696/1093] Update CMakeLists.txt Adding CMake options HAS_INF and HAS_NAN --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index bf026d20c..908b5428c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,6 +87,9 @@ option(VERBOSE_CONFIG "Print configuration to stdout during generation" ON) option(LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" OFF) option(LIBNAME_POSTFIX_DEBUG "Add indication of debug compilation to the library name?" OFF) +option(HAS_INF "Compiler has Inf value for float" ON) +option(HAS_NAN "Compiler has NaN value for float" ON) + if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "What kind of build this is" FORCE) endif(NOT CMAKE_BUILD_TYPE) From 8f4dcc7892bf564dd0229b212e94146eb9ace881 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Wed, 23 Mar 2022 11:54:53 +1000 Subject: [PATCH 0697/1093] Update CppUTestConfigurationOptions.cmake Setting HAS_INF and HAS_NAN to OFF for Borland compiler Setting CPPUTEST_HAS_INF and CPPUTEST_HAS_NAN to 1 if HAS_INF and HAS_NAN are on respectively --- cmake/Modules/CppUTestConfigurationOptions.cmake | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index f67550d92..ebac80da2 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -15,9 +15,11 @@ elseif (IAR) set(CMAKE_CXX_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") elseif (BORLAND) set(CPP_PLATFORM Borland) - set(MEMORY_LEAK_DETECTION False) + set(MEMORY_LEAK_DETECTION OFF) set(LONGLONG OFF) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") + set(HAS_INF OFF) + set(HAS_NAN OFF) elseif (STD_C) if(NOT CPP_PLATFORM) set(CPP_PLATFORM Gcc) @@ -61,6 +63,14 @@ if (LONGLONG) set(CPPUTEST_USE_LONG_LONG 1) endif (LONGLONG) +if (HAS_INF) + set(CPPUTEST_HAS_INF 1) +endif (HAS_INF) + +if (HAS_NAN) + set(CPPUTEST_HAS_NAN 1) +endif (HAS_NAN) + if (MAP_FILE AND NOT MSVC) set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -Wl,-Map,$<.map.txt") endif (MAP_FILE AND NOT MSVC) From 400d82eef5aab4bbb6e99642298b5f4fa250428e Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Wed, 23 Mar 2022 11:56:39 +1000 Subject: [PATCH 0698/1093] Update config.h.cmake Adding and setting CPPUTEST_HAS_INF and CPPUTEST_HAS_NAN --- config.h.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config.h.cmake b/config.h.cmake index e8a4b9fd4..7c38251c5 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -4,6 +4,9 @@ #cmakedefine CPPUTEST_MEM_LEAK_DETECTION_DISABLED #cmakedefine CPPUTEST_USE_LONG_LONG +#cmakedefine CPPUTEST_HAS_INF +#cmakedefine CPPUTEST_HAS_NAN + #cmakedefine CPPUTEST_STD_C_LIB_DISABLED #cmakedefine CPPUTEST_STD_CPP_LIB_DISABLED From b6225a8bffdd1deecca4d3ef83be200f9755fad1 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Thu, 24 Mar 2022 17:33:28 +1000 Subject: [PATCH 0699/1093] Update UtestTest.cpp Split TEST(UtestShell, compareDoubles) into - TEST(UtestShell, compareDoubles) for finite only tests, - TEST(UtestShell, compareDoublesNaN) for tests against NaN and - TEST(UtestShell, compareDoublesInf) for tests against Inf. These last two are guarded by CPPUTEST_HAS_NAN and CPPUTEST_HAS_INF defines respectively --- tests/CppUTest/UtestTest.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index a53eb68fd..396fdaae7 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -60,21 +60,33 @@ static volatile double zero = 0.0; TEST(UtestShell, compareDoubles) { - double not_a_number = zero / zero; - double infinity = 1 / zero; CHECK(doubles_equal(1.0, 1.001, 0.01)); + CHECK(!doubles_equal(1.0, 1.1, 0.05)); + double a = 1.2345678; + CHECK(doubles_equal(a, a, 0.000000001)); +} + +#ifdef CPPUTEST_HAS_NAN +TEST(UtestShell, compareDoublesNaN) +{ + double not_a_number = zero / zero; CHECK(!doubles_equal(not_a_number, 1.001, 0.01)); CHECK(!doubles_equal(1.0, not_a_number, 0.01)); CHECK(!doubles_equal(1.0, 1.001, not_a_number)); - CHECK(!doubles_equal(1.0, 1.1, 0.05)); +} +#endif + +#ifdef CPPUTEST_HAS_INF +TEST(UtestShell, compareDoublesInf) +{ + double infinity = 1 / zero; CHECK(!doubles_equal(infinity, 1.0, 0.01)); CHECK(!doubles_equal(1.0, infinity, 0.01)); CHECK(doubles_equal(1.0, -1.0, infinity)); CHECK(doubles_equal(infinity, infinity, 0.01)); CHECK(doubles_equal(infinity, infinity, infinity)); - double a = 1.2345678; - CHECK(doubles_equal(a, a, 0.000000001)); } +#endif TEST(UtestShell, FailWillIncreaseTheAmountOfChecks) { From 5096e2d11ad8f11c36e8573758b89c9fea87ba01 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Fri, 25 Mar 2022 16:20:18 +1000 Subject: [PATCH 0700/1093] Update CppUTestConfigurationOptions.cmake Creating CPPUTEST_NO_INF and CPPUTEST_NO_NAN for use with the Borland compiler --- cmake/Modules/CppUTestConfigurationOptions.cmake | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index ebac80da2..bd8924d2b 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -63,13 +63,13 @@ if (LONGLONG) set(CPPUTEST_USE_LONG_LONG 1) endif (LONGLONG) -if (HAS_INF) - set(CPPUTEST_HAS_INF 1) -endif (HAS_INF) +if (NOT HAS_INF) + set(CPPUTEST_NO_INF 1) +endif (NOT HAS_INF) -if (HAS_NAN) - set(CPPUTEST_HAS_NAN 1) -endif (HAS_NAN) +if (NOT HAS_NAN) + set(CPPUTEST_NO_NAN 1) +endif (NOT HAS_NAN) if (MAP_FILE AND NOT MSVC) set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -Wl,-Map,$<.map.txt") From d71873f73b54e5b8af920db9525a758ab130abb6 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Fri, 25 Mar 2022 16:21:53 +1000 Subject: [PATCH 0701/1093] Update config.h.cmake setting defines for CPPUTEST_NO_XXX instead of CPPUTEST_HAS_XXX --- config.h.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.h.cmake b/config.h.cmake index 7c38251c5..5ebbab1fe 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -4,8 +4,8 @@ #cmakedefine CPPUTEST_MEM_LEAK_DETECTION_DISABLED #cmakedefine CPPUTEST_USE_LONG_LONG -#cmakedefine CPPUTEST_HAS_INF -#cmakedefine CPPUTEST_HAS_NAN +#cmakedefine CPPUTEST_NO_INF +#cmakedefine CPPUTEST_NO_NAN #cmakedefine CPPUTEST_STD_C_LIB_DISABLED #cmakedefine CPPUTEST_STD_CPP_LIB_DISABLED From 12c9b342fb6b978da7375593383978c815b1a39a Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Fri, 25 Mar 2022 16:25:01 +1000 Subject: [PATCH 0702/1093] Update CppUTestConfig.h Adding #defines for CPPUTEST_HAS_XXX to be 1 if we have XXX and 0 if we don't. XXX is NAN or INF --- include/CppUTest/CppUTestConfig.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 654784d50..e9cf8f5cb 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -334,5 +334,17 @@ typedef struct cpputest_ulonglong cpputest_ulonglong; #pragma clang diagnostic pop #endif +/* Borland v5.4 does not have a NaN or Inf value */ +#if defined(CPPUTEST_NO_INF) +#define CPPUTEST_HAS_INF 0 +#else +#define CPPUTEST_HAS_INF 1 +#endif +#if defined(CPPUTEST_NO_NAN) +#define CPPUTEST_HAS_NAN 0 +#else +#define CPPUTEST_HAS_NAN 1 +#endif + #endif From 98f917f769e5e5b7cce9a1e3608ecb49bc2cac45 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Fri, 25 Mar 2022 16:48:15 +1000 Subject: [PATCH 0703/1093] Update UtestTest.cpp making the #if conditional on CPPUTEST_HAS_XXX being 1 --- tests/CppUTest/UtestTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 396fdaae7..fabf6bf98 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -66,7 +66,7 @@ TEST(UtestShell, compareDoubles) CHECK(doubles_equal(a, a, 0.000000001)); } -#ifdef CPPUTEST_HAS_NAN +#if CPPUTEST_HAS_NAN == 1 TEST(UtestShell, compareDoublesNaN) { double not_a_number = zero / zero; @@ -76,7 +76,7 @@ TEST(UtestShell, compareDoublesNaN) } #endif -#ifdef CPPUTEST_HAS_INF +#if CPPUTEST_HAS_INF == 1 TEST(UtestShell, compareDoublesInf) { double infinity = 1 / zero; From 6c2667859df3df6b2c12d3b962cd38d5fd0a5934 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Sat, 26 Mar 2022 08:40:34 +1000 Subject: [PATCH 0704/1093] Update TestFailureNaNTest.cpp The Borland v5.4 compiler does not do NaN or Inf so we need to guard all the tests in this file with CPPUTEST_HAS_NAN && CPPUTEST_HAS_INF --- tests/CppUTest/TestFailureNaNTest.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/CppUTest/TestFailureNaNTest.cpp b/tests/CppUTest/TestFailureNaNTest.cpp index e17e359a2..4c9e715bd 100644 --- a/tests/CppUTest/TestFailureNaNTest.cpp +++ b/tests/CppUTest/TestFailureNaNTest.cpp @@ -35,6 +35,8 @@ const int failLineNumber = 2; const char* failFileName = "fail.cpp"; } +#if CPPUTEST_HAS_NAN == 1 && CPPUTEST_HAS_INF == 1 + static double zero = 0.0; static double one = 1.0; static double not_a_number = zero / zero; @@ -115,3 +117,5 @@ TEST(TestFailureNanAndInf, DoublesEqualThresholdIsInf) "\tbut was threshold used was \n" "\tCannot make comparisons with Nan", f); } + +#endif From 90e24b4ffc646380a00099912c69c505066b4670 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Sun, 27 Mar 2022 10:43:54 +0200 Subject: [PATCH 0705/1093] Avoid try..catch if Standard C++ library is disabled --- src/CppUTest/Utest.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index f8ceea62a..09fef8da9 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -232,8 +232,11 @@ void UtestShell::runOneTestInCurrentProcess(TestPlugin* plugin, TestResult& resu UtestShell::setCurrentTest(this); Utest* testToRun = NULLPTR; + +#if CPPUTEST_USE_STD_CPP_LIB try { +#endif result.printVeryVerbose("\n---- before createTest: "); testToRun = createTest(); result.printVeryVerbose("\n---- after createTest: "); @@ -244,12 +247,14 @@ void UtestShell::runOneTestInCurrentProcess(TestPlugin* plugin, TestResult& resu UtestShell::setCurrentTest(savedTest); UtestShell::setTestResult(savedResult); +#if CPPUTEST_USE_STD_CPP_LIB } catch(...) { destroyTest(testToRun); throw; } +#endif result.printVeryVerbose("\n---- before destroyTest: "); destroyTest(testToRun); From 818e7e2d9df8008004a0417f106ca48a00fb6047 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 27 Mar 2022 21:34:37 -0700 Subject: [PATCH 0706/1093] Avoid hijacking user's warning options --- cmake/Modules/CppUTestConfigurationOptions.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index bd8924d2b..742faa5a5 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -33,7 +33,9 @@ else (MSVC) set(CPP_PLATFORM GccNoStdC) endif (MSVC) -include("${CppUTestRootDirectory}/cmake/Modules/CppUTestWarningFlags.cmake") +if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) + include("${CppUTestRootDirectory}/cmake/Modules/CppUTestWarningFlags.cmake") +endif () if (NOT STD_CPP) set(CPPUTEST_STD_CPP_LIB_DISABLED 1) From 0693c5a1caf9ad22c7b6204a4e56c19fbc7064e0 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 27 Mar 2022 22:02:48 -0700 Subject: [PATCH 0707/1093] Attach config.h to CppUTest target --- CMakeLists.txt | 8 ++++++-- src/CppUTestExt/CMakeLists.txt | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 908b5428c..792d8428b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,15 +124,19 @@ include(GNUInstallDirs) enable_testing() +add_subdirectory(src/CppUTest) + configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" "${PROJECT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" ) -include_directories(${PROJECT_BINARY_DIR}) +target_include_directories(${CppUTestLibName} + PUBLIC + $ +) add_definitions(-DHAVE_CONFIG_H) include_directories(${CppUTestRootDirectory}/include) -add_subdirectory(src/CppUTest) if (EXTENSIONS) add_subdirectory(src/CppUTestExt) diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index 20c410009..0cd5850b8 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -43,6 +43,8 @@ set(CppUTestExt_headers add_library(${CppUTestExtLibName} STATIC ${CppUTestExt_src} ${CppUTestExt_headers}) target_link_libraries(${CppUTestExtLibName} ${CPPUNIT_EXTERNAL_LIBRARIES}) +target_link_libraries(${CppUTestExtLibName} PUBLIC ${CppUTestLibName}) + if(LIBNAME_POSTFIX_DEBUG) set_target_properties(${CppUTestExtLibName} PROPERTIES DEBUG_POSTFIX "d") endif() From 03424c03c61cb44c9fa573a6df273601a945352e Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 27 Mar 2022 22:07:57 -0700 Subject: [PATCH 0708/1093] Remove redundant global include directories --- CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 792d8428b..f386ed359 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,8 +136,6 @@ target_include_directories(${CppUTestLibName} ) add_definitions(-DHAVE_CONFIG_H) -include_directories(${CppUTestRootDirectory}/include) - if (EXTENSIONS) add_subdirectory(src/CppUTestExt) endif (EXTENSIONS) From ba94b807e8f97712e948d8c4b40d1a103cafb07b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 27 Mar 2022 22:50:59 -0700 Subject: [PATCH 0709/1093] Attach platform includes to target --- cmake/Modules/CppUTestConfigurationOptions.cmake | 1 - src/CppUTest/CMakeLists.txt | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 742faa5a5..d2b5752c3 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -1,6 +1,5 @@ if (MSVC) set(CPP_PLATFORM VisualCpp) - include_directories(${CppUTestRootDirectory}/include/Platforms/${CPP_PLATFORM}) option(STDC_WANT_SECURE_LIB "Use MSVC safe functions" ON) if(STDC_WANT_SECURE_LIB) ADD_DEFINITIONS(-DSTDC_WANT_SECURE_LIB) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 01605d879..955e5d3fc 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -30,6 +30,10 @@ if (CPP_PLATFORM) PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../Platforms/${CPP_PLATFORM}/UtestPlatform.cpp ) + target_include_directories(${CppUTestLibName} + PUBLIC + $ + ) endif(CPP_PLATFORM) #[[Arrange for the include directory to be added to the include paths of any CMake target depending on CppUTest.]] From 47a4661974c8b5827ccc61faf30337047b39785b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 27 Mar 2022 23:02:12 -0700 Subject: [PATCH 0710/1093] Attach defines to target --- CMakeLists.txt | 121 +++++++++++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 50 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f386ed359..edb6c18dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,55 +16,6 @@ if (EXISTS "${CMAKE_BINARY_DIR}/conanbuildinfo.cmake") conan_basic_setup() endif() -# Check for functions before setting a lot of stuff -include(CheckFunctionExists) -include(CheckSymbolExists) -set (CMAKE_REQUIRED_INCLUDES "unistd.h") -check_symbol_exists(fork "unistd.h" HAVE_FORK) -if(HAVE_FORK) - add_definitions(-DCPPUTEST_HAVE_FORK) -endif(HAVE_FORK) - -check_symbol_exists(waitpid "sys/wait.h" HAVE_WAITPID) -if(HAVE_WAITPID) - add_definitions(-DCPPUTEST_HAVE_WAITPID) -endif(HAVE_WAITPID) - -check_symbol_exists(gettimeofday "sys/time.h" HAVE_GETTIMEOFDAY) -if(HAVE_GETTIMEOFDAY) - add_definitions(-DCPPUTEST_HAVE_GETTIMEOFDAY=1) -endif(HAVE_GETTIMEOFDAY) - -check_symbol_exists(pthread_mutex_lock "pthread.h" HAVE_PTHREAD_MUTEX_LOCK) -if(HAVE_PTHREAD_MUTEX_LOCK) - add_definitions(-DCPPUTEST_HAVE_PTHREAD_MUTEX_LOCK=1) -endif(HAVE_PTHREAD_MUTEX_LOCK) - -if (NOT IAR) - check_function_exists(strdup HAVE_STRDUP) - if(HAVE_STRDUP) - add_definitions(-DCPPUTEST_HAVE_STRDUP=1) - endif(HAVE_STRDUP) -endif(NOT IAR) - -if (MINGW) - # Apply workaround for MinGW timespec redefinition (pthread.h / time.h) - include(CheckStructHasMember) - check_struct_has_member("struct timespec" tv_sec time.h HAVE_STRUCT_TIMESPEC) - if (HAVE_STRUCT_TIMESPEC) - add_definitions(-D_TIMESPEC_DEFINED=1) - endif() - - if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - # Apply workaround for static/shared libraries on MinGW C/C++ compiler - # Issue occurs with CMake >= 3.9.0, it doesn't filter out gcc,gcc_s,gcc_eh from - # the implicit library list anymore, so the C++ linker is getting passed the static - # gcc_eh library since that's what the C linker uses by default. Only solution appears - # to be to force static linkage. - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") - endif() -endif() - option(STD_C "Use the standard C library" ON) option(STD_CPP "Use the standard C++ library" ON) option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) @@ -126,6 +77,73 @@ enable_testing() add_subdirectory(src/CppUTest) +# Check for functions before setting a lot of stuff +include(CheckFunctionExists) +include(CheckSymbolExists) +set (CMAKE_REQUIRED_INCLUDES "unistd.h") +check_symbol_exists(fork "unistd.h" HAVE_FORK) +if(HAVE_FORK) + target_compile_definitions(${CppUTestLibName} + PUBLIC + CPPUTEST_HAVE_FORK + ) +endif(HAVE_FORK) + +check_symbol_exists(waitpid "sys/wait.h" HAVE_WAITPID) +if(HAVE_WAITPID) + target_compile_definitions(${CppUTestLibName} + PUBLIC + CPPUTEST_HAVE_WAITPID + ) +endif(HAVE_WAITPID) + +check_symbol_exists(gettimeofday "sys/time.h" HAVE_GETTIMEOFDAY) +if(HAVE_GETTIMEOFDAY) + target_compile_definitions(${CppUTestLibName} + PUBLIC + CPPUTEST_HAVE_GETTIMEOFDAY=1 + ) +endif(HAVE_GETTIMEOFDAY) + +check_symbol_exists(pthread_mutex_lock "pthread.h" HAVE_PTHREAD_MUTEX_LOCK) +if(HAVE_PTHREAD_MUTEX_LOCK) + target_compile_definitions(${CppUTestLibName} + PUBLIC + CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK=1 + ) +endif(HAVE_PTHREAD_MUTEX_LOCK) + +if (NOT IAR) + check_function_exists(strdup HAVE_STRDUP) + if(HAVE_STRDUP) + target_compile_definitions(${CppUTestLibName} + PUBLIC + CPPUTEST_HAVE_STRDUP=1 + ) + endif(HAVE_STRDUP) +endif(NOT IAR) + +if (MINGW) + # Apply workaround for MinGW timespec redefinition (pthread.h / time.h) + include(CheckStructHasMember) + check_struct_has_member("struct timespec" tv_sec time.h HAVE_STRUCT_TIMESPEC) + if (HAVE_STRUCT_TIMESPEC) + target_compile_definitions(${CppUTestLibName} + PUBLIC + _TIMESPEC_DEFINED=1 + ) + endif() + + if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + # Apply workaround for static/shared libraries on MinGW C/C++ compiler + # Issue occurs with CMake >= 3.9.0, it doesn't filter out gcc,gcc_s,gcc_eh from + # the implicit library list anymore, so the C++ linker is getting passed the static + # gcc_eh library since that's what the C linker uses by default. Only solution appears + # to be to force static linkage. + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") + endif() +endif() + configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" "${PROJECT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" @@ -134,7 +152,10 @@ target_include_directories(${CppUTestLibName} PUBLIC $ ) -add_definitions(-DHAVE_CONFIG_H) +target_compile_definitions(${CppUTestLibName} + PUBLIC + $ +) if (EXTENSIONS) add_subdirectory(src/CppUTestExt) From e2ebac4a88d5923186edf3c7c7075008b0b05492 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 27 Mar 2022 23:22:51 -0700 Subject: [PATCH 0711/1093] Attach example includes to library --- examples/AllTests/CMakeLists.txt | 7 +++++-- examples/ApplicationLib/CMakeLists.txt | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/AllTests/CMakeLists.txt b/examples/AllTests/CMakeLists.txt index 7b37c3afd..07d04e691 100644 --- a/examples/AllTests/CMakeLists.txt +++ b/examples/AllTests/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../ApplicationLib) - add_executable(ExampleTests AllTests.cpp CircularBufferTest.cpp @@ -10,6 +8,11 @@ add_executable(ExampleTests PrinterTest.cpp ) +target_include_directories(ExampleTests + PRIVATE + ../ApplicationLib +) + cpputest_normalize_test_output_location(ExampleTests) target_link_libraries(ExampleTests ApplicationLib ${CppUTestLibName} ${CppUTestExtLibName}) cpputest_buildtime_discover_tests(ExampleTests) diff --git a/examples/ApplicationLib/CMakeLists.txt b/examples/ApplicationLib/CMakeLists.txt index 987a4eaf3..564e1201f 100644 --- a/examples/ApplicationLib/CMakeLists.txt +++ b/examples/ApplicationLib/CMakeLists.txt @@ -4,3 +4,8 @@ add_library(ApplicationLib hello.c Printer.cpp ) +target_include_directories(ExampleTests + PUBLIC + . +) + From 7548fe7e94735f454e4b0cc82fff67827cd0a83b Mon Sep 17 00:00:00 2001 From: Alan Rosenthal Date: Tue, 29 Mar 2022 15:55:35 -0400 Subject: [PATCH 0712/1093] Add flag `CPPUTEST_USE_GCOV_NO_GCNO_FILES` to prevent .gcno files from being generated. This is useful if comparing .gcda files generated during UT run to files built during normal build stage, rather than files built during UT --- build/MakefileWorker.mk | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index 297f45457..776f5e699 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -46,6 +46,7 @@ # of the test harness # CPPUTEST_USE_GCOV - Turn on coverage analysis # Clean then build with this flag set to Y, then 'make gcov' +# CPPUTEST_USE_GCOV_NO_GCNO_FILES - Disable gcov's .gcno files from being generated # CPPUTEST_MAPFILE - generate a map file # CPPUTEST_WARNINGFLAGS - overly picky by default # OTHER_MAKEFILE_TO_INCLUDE - a hook to use this makefile to make @@ -170,6 +171,11 @@ ifndef CPPUTEST_USE_GCOV CPPUTEST_USE_GCOV = N endif +# Skip generating gcov's .gcno files, off by default +ifndef CPPUTEST_USE_GCOV_NO_GCNO_FILES + CPPUTEST_USE_GCOV_NO_GCNO_FILES = N +endif + ifndef CPPUTEST_PEDANTIC_ERRORS CPPUTEST_PEDANTIC_ERRORS = Y endif @@ -323,8 +329,12 @@ endif ifeq ($(CPPUTEST_USE_GCOV), Y) - CPPUTEST_CXXFLAGS += -fprofile-arcs -ftest-coverage - CPPUTEST_CFLAGS += -fprofile-arcs -ftest-coverage + CPPUTEST_CXXFLAGS += -fprofile-arcs + CPPUTEST_CFLAGS += -fprofile-arcs + ifneq ($(CPPUTEST_USE_GCOV_NO_GCNO_FILES), Y) + CPPUTEST_CXXFLAGS += -ftest-coverage + CPPUTEST_CFLAGS += -ftest-coverage + endif endif CPPUTEST_CXXFLAGS += $(CPPUTEST_WARNINGFLAGS) $(CPPUTEST_CXX_WARNINGFLAGS) From eddd80bb2f74b638eeed3c3af1e4d7f8f53a5c55 Mon Sep 17 00:00:00 2001 From: Phillip Shelton <39154868+pjshelton@users.noreply.github.com> Date: Fri, 1 Apr 2022 10:42:41 +1000 Subject: [PATCH 0713/1093] Update UtestPlatform.cpp Adjusting PlatformSpecificVSNprintf to use a BorlandVSNprintf fuctions that adds the final '\0' to the last element of the buffer. --- src/Platforms/Borland/UtestPlatform.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 45a17022d..21214f035 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -217,7 +217,14 @@ static const char* TimeStringImplementation() long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; const char* (*GetPlatformSpecificTimeString)() = TimeStringImplementation; -int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_list va_args_list) = vsnprintf; +static int BorlandVSNprintf(char *str, size_t size, const char* format, va_list args) +{ + int result = vsnprintf( str, size, format, args); + str[size-1] = 0; + return result; +} + +int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_list va_args_list) = BorlandVSNprintf; static PlatformSpecificFile PlatformSpecificFOpenImplementation(const char* filename, const char* flag) { From 80f3ca063f3ccf4090ee81b52388bb3ffa8b21be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Wed, 6 Apr 2022 07:15:22 +0200 Subject: [PATCH 0714/1093] Refactor exception type name demangling to remove macro functions --- src/CppUTest/TestFailure.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index 95db641b3..07386e64b 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -392,9 +392,10 @@ UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test) { } -#if defined(__GNUC__) -static SimpleString demangle(const char* name) +static SimpleString getExceptionTypeName(const std::exception &e) { + const char *name = typeid(e).name(); +#if defined(__GNUC__) int status = -1; std::unique_ptr demangledName { @@ -402,15 +403,14 @@ static SimpleString demangle(const char* name) std::free }; - return (status==0) ? demangledName.get() : name ; -} -#define DEMANGLE(name) demangle(name).asCharString() + return (status==0) ? demangledName.get() : name; #else -#define DEMANGLE(name) (name) + return name; #endif +} UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test, const std::exception &e) -: TestFailure(test, StringFromFormat("Unexpected exception of type '%s' was thrown: %s", DEMANGLE(typeid(e).name()), e.what())) +: TestFailure(test, StringFromFormat("Unexpected exception of type '%s' was thrown: %s", getExceptionTypeName(e).asCharString(), e.what())) { } #endif From ff3b589fde97312cbda2b6c74ecf31fd10cfbf7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Fri, 18 Mar 2022 18:38:06 +0100 Subject: [PATCH 0715/1093] Add missing options to printed help text and cleanup --- src/CppUTest/CommandLineArguments.cpp | 58 ++++++++++++--------- tests/CppUTest/CommandLineArgumentsTest.cpp | 8 +-- 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 27cdee9f9..d9292e73c 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -101,10 +101,10 @@ bool CommandLineArguments::parse(TestPlugin* plugin) const char* CommandLineArguments::usage() const { return "use -h for more extensive help\n" - "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-f] [-e] [-ci]\n" - " [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-t groupName.testName]...\n" - " [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]...\n" - " [-o{normal, junit, teamcity}] [-k packageName]\n"; + "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ll] [-ri] [-r[<#>]] [-f] [-e] [-ci]\n" + " [-g|sg|xg|xsg ]... [-n|sn|xn|xsn ]... [-t .]...\n" + " [-b] [-s []] [\"[IGNORE_]TEST(, )\"]...\n" + " [-o{normal|eclipse|junit|teamcity}] [-k ]\n"; } const char* CommandLineArguments::help() const @@ -113,9 +113,10 @@ const char* CommandLineArguments::help() const "Thanks for using CppUTest.\n" "\n" "Options that do not run tests but query:\n" - " -h - this wonderful help screen. Joy!\n" - " -lg - print a list of group names, separated by spaces\n" - " -ln - print a list of test names in the form of group.name, separated by spaces\n" + " -h - this wonderful help screen. Joy!\n" + " -lg - print a list of group names, separated by spaces\n" + " -ln - print a list of test names in the form of group.name, separated by spaces\n" + " -ll - print a list of test names in the form of group.name.test_file_path.line\n" "\n" "Options that change the output format:\n" " -c - colorize output, print green if OK, or red if failed\n" @@ -123,30 +124,35 @@ const char* CommandLineArguments::help() const " -vv - very verbose, print internal information during test run\n" "\n" "Options that change the output location:\n" - " -oteamcity - output to xml files (as the name suggests, for TeamCity)\n" - " -ojunit - output to JUnit ant plugin style xml files (for CI systems)\n" - " -k package name - Add a package name in JUnit output (for classification in CI systems)\n" + " -onormal - no output to files\n" + " -oeclipse - equivalent to -onormal\n" + " -oteamcity - output to xml files (as the name suggests, for TeamCity)\n" + " -ojunit - output to JUnit ant plugin style xml files (for CI systems)\n" + " -k - add a package name in JUnit output (for classification in CI systems)\n" "\n" "\n" "Options that control which tests are run:\n" - " -g group - only run test whose group contains the substring group\n" - " -n name - only run test whose name contains the substring name\n" - " -t group.name - only run test whose name contains the substring group and name\n" - " -sg group - only run test whose group exactly matches the string group\n" - " -sn name - only run test whose name exactly matches the string name\n" - " -xg group - exclude tests whose group contains the substring group (v3.8)\n" - " -xn name - exclude tests whose name contains the substring name (v3.8)\n" - " TEST(group,name) - only run test whose group and name matches the strings group and name.\n" - " This can be used to copy-paste output from the -v option on the command line.\n" + " -g - only run tests whose group contains \n" + " -n - only run tests whose name contains \n" + " -t . - only run tests whose group and name contain and \n" + " -sg - only run tests whose group exactly matches \n" + " -sn - only run tests whose name exactly matches \n" + " -xg - exclude tests whose group contains \n" + " -xn - exclude tests whose name contains \n" + " -xsg - exclude tests whose group exactly matches \n" + " -xsn - exclude tests whose name exactly matches \n" + " \"[IGNORE_]TEST(, )\"\n" + " - only run test whose group and name exactly matches and \n" + " (this can be used to copy-paste output from the -v option on the command line)\n" "\n" "Options that control how the tests are run:\n" - " -p - run tests in a separate process.\n" - " -b - run the tests backwards, reversing the normal way\n" - " -s [seed] - shuffle tests randomly. Seed is optional\n" - " -r# - repeat the tests some number (#) of times, or twice if # is not specified.\n" - " -f - Cause the tests to crash on failure (to allow the test to be debugged if necessary)\n" - " -e - do not rethrow unexpected exceptions on failure\n" - " -ci - continuous integration mode (equivalent to -e)\n"; + " -p - run tests in a separate process\n" + " -b - run the tests backwards, reversing the normal way\n" + " -s [] - shuffle tests randomly (randomization seed is optional, must be greater than 0)\n" + " -r[<#>] - repeat the tests <#> times (or twice if <#> is not specified)\n" + " -f - Cause the tests to crash on failure (to allow the test to be debugged if necessary)\n" + " -e - do not rethrow unexpected exceptions on failure\n" + " -ci - continuous integration mode (equivalent to -e)\n"; } bool CommandLineArguments::needHelp() const diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index 72a629d8a..f7bf8772e 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -466,10 +466,10 @@ TEST(CommandLineArguments, printUsage) { STRCMP_EQUAL( "use -h for more extensive help\n" - "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ri] [-r#] [-f] [-e] [-ci]\n" - " [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [-t groupName.testName]...\n" - " [-b] [-s [randomizerSeed>0]] [\"TEST(groupName, testName)\"]...\n" - " [-o{normal, junit, teamcity}] [-k packageName]\n", + "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ll] [-ri] [-r[<#>]] [-f] [-e] [-ci]\n" + " [-g|sg|xg|xsg ]... [-n|sn|xn|xsn ]... [-t .]...\n" + " [-b] [-s []] [\"[IGNORE_]TEST(, )\"]...\n" + " [-o{normal|eclipse|junit|teamcity}] [-k ]\n", args->usage()); } From 7690856568d943e7fe931ac6bd9e79bd01296f3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Mon, 11 Apr 2022 07:21:28 +0200 Subject: [PATCH 0716/1093] Add -st|xt|xst options for strict and exclude test "dot" group matching combinations --- include/CppUTest/CommandLineArguments.h | 2 +- src/CppUTest/CommandLineArguments.cpp | 26 +++++++-- tests/CppUTest/CommandLineArgumentsTest.cpp | 62 +++++++++++++++++++++ 3 files changed, 84 insertions(+), 6 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index 8bd2a2848..e0ed3f213 100644 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -100,7 +100,7 @@ class CommandLineArguments void setRepeatCount(int ac, const char *const *av, int& index); bool setShuffle(int ac, const char *const *av, int& index); void addGroupFilter(int ac, const char *const *av, int& index); - bool addGroupDotNameFilter(int ac, const char *const *av, int& index); + bool addGroupDotNameFilter(int ac, const char *const *av, int& index, const SimpleString& parameterName, bool strict, bool exclude); void addStrictGroupFilter(int ac, const char *const *av, int& index); void addExcludeGroupFilter(int ac, const char *const *av, int& index); void addExcludeStrictGroupFilter(int ac, const char *const *av, int& index); diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index d9292e73c..d63929849 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -75,7 +75,10 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument == "-ci") rethrowExceptions_ = false; else if (argument.startsWith("-r")) setRepeatCount(ac_, av_, i); else if (argument.startsWith("-g")) addGroupFilter(ac_, av_, i); - else if (argument.startsWith("-t")) correctParameters = addGroupDotNameFilter(ac_, av_, i); + else if (argument.startsWith("-t")) correctParameters = addGroupDotNameFilter(ac_, av_, i, "-t", false, false); + else if (argument.startsWith("-st")) correctParameters = addGroupDotNameFilter(ac_, av_, i, "-st", true, false); + else if (argument.startsWith("-xt")) correctParameters = addGroupDotNameFilter(ac_, av_, i, "-xt", false, true); + else if (argument.startsWith("-xst")) correctParameters = addGroupDotNameFilter(ac_, av_, i, "-xst", true, true); else if (argument.startsWith("-sg")) addStrictGroupFilter(ac_, av_, i); else if (argument.startsWith("-xg")) addExcludeGroupFilter(ac_, av_, i); else if (argument.startsWith("-xsg")) addExcludeStrictGroupFilter(ac_, av_, i); @@ -293,16 +296,29 @@ void CommandLineArguments::addGroupFilter(int ac, const char *const *av, int& i) groupFilters_ = groupFilter->add(groupFilters_); } -bool CommandLineArguments::addGroupDotNameFilter(int ac, const char *const *av, int& i) +bool CommandLineArguments::addGroupDotNameFilter(int ac, const char *const *av, int& i, const SimpleString& parameterName, + bool strict, bool exclude) { - SimpleString groupDotName = getParameterField(ac, av, i, "-t"); + SimpleString groupDotName = getParameterField(ac, av, i, parameterName); SimpleStringCollection collection; groupDotName.split(".", collection); if (collection.size() != 2) return false; - groupFilters_ = (new TestFilter(collection[0].subString(0, collection[0].size()-1)))->add(groupFilters_); - nameFilters_ = (new TestFilter(collection[1]))->add(nameFilters_); + TestFilter* groupFilter = new TestFilter(collection[0].subString(0, collection[0].size()-1)); + TestFilter* nameFilter = new TestFilter(collection[1]); + if (strict) + { + groupFilter->strictMatching(); + nameFilter->strictMatching(); + } + if (exclude) + { + groupFilter->invertMatching(); + nameFilter->invertMatching(); + } + groupFilters_ = groupFilter->add(groupFilters_); + nameFilters_ = nameFilter->add(nameFilters_); return true; } diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index f7bf8772e..64f9a51fe 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -206,6 +206,7 @@ TEST(CommandLineArguments, setCompleteGroupDotNameFilterInvalidArgument) const char* argv[] = { "tests.exe", "-t", "groupname" }; CHECK_FALSE(newArgumentParser(argc, argv)); } + TEST(CommandLineArguments, setCompleteGroupDotNameFilter) { int argc = 3; @@ -215,6 +216,67 @@ TEST(CommandLineArguments, setCompleteGroupDotNameFilter) CHECK_EQUAL(TestFilter("name"), *args->getNameFilters()); } +TEST(CommandLineArguments, setCompleteStrictGroupDotNameFilterInvalidArgument) +{ + int argc = 3; + const char* argv[] = { "tests.exe", "-st", "groupname" }; + CHECK_FALSE(newArgumentParser(argc, argv)); +} + +TEST(CommandLineArguments, setCompleteStrictGroupDotNameFilter) +{ + int argc = 3; + const char* argv[] = { "tests.exe", "-st", "group.name" }; + CHECK(newArgumentParser(argc, argv)); + TestFilter groupFilter("group"); + groupFilter.strictMatching(); + CHECK_EQUAL(groupFilter, *args->getGroupFilters()); + TestFilter nameFilter("name"); + nameFilter.strictMatching(); + CHECK_EQUAL(nameFilter, *args->getNameFilters()); +} + +TEST(CommandLineArguments, setCompleteExcludeGroupDotNameFilterInvalidArgument) +{ + int argc = 3; + const char* argv[] = { "tests.exe", "-xt", "groupname" }; + CHECK_FALSE(newArgumentParser(argc, argv)); +} + +TEST(CommandLineArguments, setCompleteExcludeGroupDotNameFilter) +{ + int argc = 3; + const char* argv[] = { "tests.exe", "-xt", "group.name" }; + CHECK(newArgumentParser(argc, argv)); + TestFilter groupFilter("group"); + groupFilter.invertMatching(); + CHECK_EQUAL(groupFilter, *args->getGroupFilters()); + TestFilter nameFilter("name"); + nameFilter.invertMatching(); + CHECK_EQUAL(nameFilter, *args->getNameFilters()); +} + +TEST(CommandLineArguments, setCompleteExcludeStrictGroupDotNameFilterInvalidArgument) +{ + int argc = 3; + const char* argv[] = { "tests.exe", "-xst", "groupname" }; + CHECK_FALSE(newArgumentParser(argc, argv)); +} + +TEST(CommandLineArguments, setCompleteExcludeStrictGroupDotNameFilter) +{ + int argc = 3; + const char* argv[] = { "tests.exe", "-xst", "group.name" }; + CHECK(newArgumentParser(argc, argv)); + TestFilter groupFilter("group"); + groupFilter.strictMatching(); + groupFilter.invertMatching(); + CHECK_EQUAL(groupFilter, *args->getGroupFilters()); + TestFilter nameFilter("name"); + nameFilter.strictMatching(); + nameFilter.invertMatching(); + CHECK_EQUAL(nameFilter, *args->getNameFilters()); +} TEST(CommandLineArguments, setGroupFilterSameParameter) { From 1ce0ddadabd57fc70f43bdd6d1830ed7ac6d675a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Thu, 14 Apr 2022 14:40:05 +0200 Subject: [PATCH 0717/1093] Add usage and help texts for new options --- src/CppUTest/CommandLineArguments.cpp | 7 +++++-- tests/CppUTest/CommandLineArgumentsTest.cpp | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index d63929849..cfeeac0eb 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -105,7 +105,7 @@ const char* CommandLineArguments::usage() const { return "use -h for more extensive help\n" "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ll] [-ri] [-r[<#>]] [-f] [-e] [-ci]\n" - " [-g|sg|xg|xsg ]... [-n|sn|xn|xsn ]... [-t .]...\n" + " [-g|sg|xg|xsg ]... [-n|sn|xn|xsn ]... [-t|st|xt|xst .]...\n" " [-b] [-s []] [\"[IGNORE_]TEST(, )\"]...\n" " [-o{normal|eclipse|junit|teamcity}] [-k ]\n"; } @@ -140,12 +140,15 @@ const char* CommandLineArguments::help() const " -t . - only run tests whose group and name contain and \n" " -sg - only run tests whose group exactly matches \n" " -sn - only run tests whose name exactly matches \n" + " -st . - only run tests whose group and name exactly match and \n" " -xg - exclude tests whose group contains \n" " -xn - exclude tests whose name contains \n" + " -xt . - exclude tests whose group and name contain and \n" " -xsg - exclude tests whose group exactly matches \n" " -xsn - exclude tests whose name exactly matches \n" + " -xst . - exclude tests whose group and name exactly match and \n" " \"[IGNORE_]TEST(, )\"\n" - " - only run test whose group and name exactly matches and \n" + " - only run tests whose group and name exactly match and \n" " (this can be used to copy-paste output from the -v option on the command line)\n" "\n" "Options that control how the tests are run:\n" diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index 64f9a51fe..ea576a647 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -529,7 +529,7 @@ TEST(CommandLineArguments, printUsage) STRCMP_EQUAL( "use -h for more extensive help\n" "usage [-h] [-v] [-vv] [-c] [-p] [-lg] [-ln] [-ll] [-ri] [-r[<#>]] [-f] [-e] [-ci]\n" - " [-g|sg|xg|xsg ]... [-n|sn|xn|xsn ]... [-t .]...\n" + " [-g|sg|xg|xsg ]... [-n|sn|xn|xsn ]... [-t|st|xt|xst .]...\n" " [-b] [-s []] [\"[IGNORE_]TEST(, )\"]...\n" " [-o{normal|eclipse|junit|teamcity}] [-k ]\n", args->usage()); From 2730b80b478af072161cbdf0728340059c3491e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Gonz=C3=A1lez?= Date: Sun, 17 Apr 2022 10:58:30 +0200 Subject: [PATCH 0718/1093] Fix compilation with some not fully C++11 compliant compilers --- src/CppUTest/TestFailure.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index 07386e64b..ff627fe60 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -398,10 +398,9 @@ static SimpleString getExceptionTypeName(const std::exception &e) #if defined(__GNUC__) int status = -1; - std::unique_ptr demangledName { + std::unique_ptr demangledName( abi::__cxa_demangle(name, nullptr, nullptr, &status), - std::free - }; + std::free ); return (status==0) ? demangledName.get() : name; #else From b67f2502eb75e70f0f7263774fe80f1eb6382afb Mon Sep 17 00:00:00 2001 From: offa Date: Sun, 1 May 2022 14:18:47 +0200 Subject: [PATCH 0719/1093] Update CodeQL to v2 --- .github/workflows/codeql.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 7756a3c62..d01af5d7b 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -17,7 +17,7 @@ jobs: - name: Checkout uses: actions/checkout@main - name: CodeQL Initialization - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: cpp queries: +security-and-quality @@ -27,4 +27,4 @@ jobs: cmake -DWERROR=ON -DCMAKE_CXX_STANDARD=17 .. make -j2 - name: CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 From d07ac166d9c20e13f4614b3b44a36a54b7cba7cc Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 6 May 2022 18:47:57 -0700 Subject: [PATCH 0720/1093] Detect `long long` support in CMake --- CMakeLists.txt | 6 ++++++ config.h.cmake | 1 + include/CppUTest/CppUTestConfig.h | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index edb6c18dd..a177e57ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -144,6 +144,12 @@ if (MINGW) endif() endif() +include(CheckTypeSize) +check_type_size("long long" SIZEOF_LONGLONG) +if(HAVE_SIZEOF_LONGLONG) + set(CPPUTEST_HAVE_LONG_LONG_INT ON) +endif() + configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" "${PROJECT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" diff --git a/config.h.cmake b/config.h.cmake index 5ebbab1fe..11da82b59 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -3,6 +3,7 @@ #cmakedefine CPPUTEST_MEM_LEAK_DETECTION_DISABLED #cmakedefine CPPUTEST_USE_LONG_LONG +#cmakedefine CPPUTEST_HAVE_LONG_LONG_INT #cmakedefine CPPUTEST_NO_INF #cmakedefine CPPUTEST_NO_NAN diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index e9cf8f5cb..f55149695 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -255,7 +255,7 @@ * Not supported when CPPUTEST_LONG_LONG_DISABLED is set. * Can be overridden by using CPPUTEST_USE_LONG_LONG * - * CPPUTEST_HAVE_LONG_LONG_INT is set by configure + * CPPUTEST_HAVE_LONG_LONG_INT is set by configure or CMake. * LLONG_MAX is set in limits.h. This is a crude attempt to detect long long support when no configure is used * */ From 737c253ec0b347285721e523bcfcb16dc27c74ca Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 6 May 2022 19:25:35 -0700 Subject: [PATCH 0721/1093] Detect fenv.h in CMake Addresses #1571 (at least for CMake) --- CMakeLists.txt | 3 +++ config.h.cmake | 1 + include/CppUTest/CppUTestConfig.h | 5 ++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index edb6c18dd..05331fe36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -77,6 +77,9 @@ enable_testing() add_subdirectory(src/CppUTest) +include(CheckIncludeFileCXX) +check_include_file_cxx("fenv.h" CPPUTEST_HAVE_FENV) + # Check for functions before setting a lot of stuff include(CheckFunctionExists) include(CheckSymbolExists) diff --git a/config.h.cmake b/config.h.cmake index 5ebbab1fe..b2778e17b 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -4,6 +4,7 @@ #cmakedefine CPPUTEST_MEM_LEAK_DETECTION_DISABLED #cmakedefine CPPUTEST_USE_LONG_LONG +#cmakedefine CPPUTEST_HAVE_FENV #cmakedefine CPPUTEST_NO_INF #cmakedefine CPPUTEST_NO_NAN diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index e9cf8f5cb..4e72b42d5 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -211,11 +211,14 @@ * Predominantly works on non-Visual C++ compilers and Visual C++ 2008 and newer */ -#if CPPUTEST_USE_STD_C_LIB && \ +#if !defined(CPPUTEST_HAVE_FENV) && CPPUTEST_USE_STD_C_LIB && \ (!defined(_MSC_VER) || (_MSC_VER >= 1800)) && \ (!defined(__APPLE__)) && \ (!defined(__ghs__) || !defined(__ColdFire__)) && (!defined(__BCPLUSPLUS__)) #define CPPUTEST_HAVE_FENV +#endif + +#ifdef CPPUTEST_HAVE_FENV #if defined(__WATCOMC__) || defined(__ARMEL__) || defined(__m68k__) #define CPPUTEST_FENV_IS_WORKING_PROPERLY 0 #else From 766190b4d257062960f819a34ec6cb7f546ee522 Mon Sep 17 00:00:00 2001 From: Tero Paloheimo Date: Wed, 11 May 2022 14:27:17 +0300 Subject: [PATCH 0722/1093] Fix compilation with disabled memory leak detection When memory leak detection is disabled compilation fails due to unique_ptr not being found. Adding the memory header fixes the problem. --- src/CppUTest/TestFailure.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index ff627fe60..26176b4b6 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -35,6 +35,7 @@ #include #if defined(__GNUC__) #include +#include #endif #endif From 71a49282f35de7424822cf15bdd8983847134952 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 16 May 2022 06:19:47 -0500 Subject: [PATCH 0723/1093] Hello World CircleCI file. Looking for replacing TravisCI as the 'free' build time was quickly spend and has not build for 6 months. Such a crap. Never sell your company and fuck over open source developers --- .circleci/config.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .circleci/config.yaml diff --git a/.circleci/config.yaml b/.circleci/config.yaml new file mode 100644 index 000000000..b219d7358 --- /dev/null +++ b/.circleci/config.yaml @@ -0,0 +1,16 @@ +version: 2.1 + +jobs: + say-hello: + docker: + - image: cimg/base:stable + steps: + - checkout + - run: + name: "Say hello" + command: "echo Hello, World!" + +workflows: + say-hello-workflow: + jobs: + - say-hello From 93b6954e2e3afbef9951d8e928ea58931876d439 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 17 May 2022 06:15:54 -0500 Subject: [PATCH 0724/1093] Renamed the cicleCI config --- .circleci/{config.yaml => config.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .circleci/{config.yaml => config.yml} (100%) diff --git a/.circleci/config.yaml b/.circleci/config.yml similarity index 100% rename from .circleci/config.yaml rename to .circleci/config.yml From 42b6550e111a7f853937132d041c1de4ac2453fd Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 17 May 2022 06:20:06 -0500 Subject: [PATCH 0725/1093] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 654feaf65..ee9e08ccb 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ CppUTest ======== -[![Build Status](https://app.travis-ci.com/cpputest/cpputest.svg?branch=master)](https://app.travis-ci.com/github/cpputest/cpputest) -[![Build status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) +[![Travis Build Status (deprecated)](https://app.travis-ci.com/cpputest/cpputest.svg?branch=master)](https://app.travis-ci.com/github/cpputest/cpputest) +[![AppveyorBuild status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) [![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) [![ConanCenter package](https://repology.org/badge/version-for-repo/conancenter/cpputest.svg)](https://conan.io/center/cpputest) From 2f74a594cb14c0c71b822d075d5d94015a0aa004 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 17 May 2022 06:25:05 -0500 Subject: [PATCH 0726/1093] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ee9e08ccb..93ba73b0a 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ CppUTest [![Travis Build Status (deprecated)](https://app.travis-ci.com/cpputest/cpputest.svg?branch=master)](https://app.travis-ci.com/github/cpputest/cpputest) [![AppveyorBuild status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) +[![CircleCI status](https://circleci.com/gh/cpputest/cpputest.svg?style=svg)](https://app.circleci.com/pipelines/github/cpputest) [![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) [![ConanCenter package](https://repology.org/badge/version-for-repo/conancenter/cpputest.svg)](https://conan.io/center/cpputest) From b645f83669dbdd596950a8cc2a729ede5c65529f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 17 May 2022 06:31:40 -0500 Subject: [PATCH 0727/1093] Added a pull for a clang image to circleCI --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b219d7358..192370fee 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,9 +1,9 @@ version: 2.1 jobs: - say-hello: + latest-clang: docker: - - image: cimg/base:stable + - image: silkeh/clang:latest steps: - checkout - run: @@ -13,4 +13,4 @@ jobs: workflows: say-hello-workflow: jobs: - - say-hello + - latest-clang From cb28850d5dc4f1e853297da5e043d72c820f40d8 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 18 May 2022 06:39:44 -0500 Subject: [PATCH 0728/1093] First attempt to add a basic clang build --- .circleci/config.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 192370fee..c217eb738 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,16 +1,17 @@ version: 2.1 jobs: - latest-clang: + latest-clang-autotools: docker: - image: silkeh/clang:latest steps: - checkout - - run: - name: "Say hello" - command: "echo Hello, World!" + - environment: + - BUILD=autotools + - CXX=clang + - run ./scripts/travis_ci_build.sh workflows: - say-hello-workflow: + basic-build-and-test: jobs: - - latest-clang + - latest-clang-autotools From 5fd10d33ee31013726ef3b1df77c6d08d54841d2 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 18 May 2022 06:50:05 -0500 Subject: [PATCH 0729/1093] Fixed the config syntax --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c217eb738..559d55377 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,12 +4,12 @@ jobs: latest-clang-autotools: docker: - image: silkeh/clang:latest + environment: + BUILD: autotools + CXX: clang steps: - checkout - - environment: - - BUILD=autotools - - CXX=clang - - run ./scripts/travis_ci_build.sh + - run: ./scripts/travis_ci_build.sh workflows: basic-build-and-test: From 32dad72f42aca810829a43536872de24cf833ee7 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 18 May 2022 07:32:46 -0500 Subject: [PATCH 0730/1093] Changed the current dir for executing the scripts --- .circleci/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 559d55377..5b5a1c581 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,9 +7,10 @@ jobs: environment: BUILD: autotools CXX: clang + CPPUTEST_BUILD_DIR: ./cpputest_build steps: - checkout - - run: ./scripts/travis_ci_build.sh + - run: mkdir -p $CPPUTEST_BUILD_DIR && cd $CPPUTEST_BUILD_DIR && ../scripts/travis_ci_build.sh workflows: basic-build-and-test: From 8d90f3ff57b0163cdb1d58ee6729578fbfbfd485 Mon Sep 17 00:00:00 2001 From: PAA1TI Date: Fri, 20 May 2022 13:18:42 +0000 Subject: [PATCH 0731/1093] Encode newlines --- src/CppUTest/JUnitTestOutput.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index e85999144..21b4ed5bc 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -209,7 +209,8 @@ SimpleString JUnitTestOutput::encodeXmlText(const SimpleString& textbody) buf.replace("\"", """); buf.replace("<", "<"); buf.replace(">", ">"); - buf.replace("\n", "{newline}"); + buf.replace("\r", " "); + buf.replace("\n", " "); return buf; } From f3fac73264df99dc2187aa18f7fdead52227839f Mon Sep 17 00:00:00 2001 From: PAA1TI Date: Mon, 23 May 2022 07:46:23 +0000 Subject: [PATCH 0732/1093] Fix tests for the encoding of newlines --- tests/CppUTest/JUnitOutputTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index 6fac9764c..6cbd2f314 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -544,7 +544,7 @@ TEST(JUnitOutputTest, testFailureWithNewlineInIt) outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); - STRCMP_EQUAL("\n", outputFile->line(6)); + STRCMP_EQUAL("\n", outputFile->line(6)); } TEST(JUnitOutputTest, testFailureWithDifferentFileAndLine) @@ -755,5 +755,5 @@ TEST(JUnitOutputTest, UTPRINTOutputInJUnitOutputWithSpecials) .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("The <rain> in "Spain"{newline}Goes \\mainly\\ down the Dr&in{newline}\n", outputFile->lineFromTheBack(3)); + STRCMP_EQUAL("The <rain> in "Spain" Goes \\mainly\\ down the Dr&in \n", outputFile->lineFromTheBack(3)); } From daf83b83955435593ac084f0a5d4460c252398dd Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 24 May 2022 17:21:19 +0200 Subject: [PATCH 0733/1093] Disable use-after-free warning (gcc12+) for some tests which check this behaviour --- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index 5e3b4db22..cb725402a 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -10,9 +10,14 @@ #include "CppUTest/TestHarness_c.h" #include "AllocationInCFile.h" -#if defined(__GNUC__) && __GNUC__ >= 11 -# define NEEDS_DISABLE_FREE_NON_HEEP_WARNING -#endif /* GCC >= 11 */ +#if defined(__GNUC__) +# if __GNUC__ >= 11 +# define NEEDS_DISABLE_FREE_NON_HEEP_WARNING +# endif /* GCC >= 11 */ +# if __GNUC__ >= 12 +# define NEEDS_DISABLE_USE_AFTER_FREE +# endif /* GCC >= 12 */ +#endif /* GCC */ TEST_GROUP(BasicBehavior) @@ -27,6 +32,11 @@ TEST(BasicBehavior, CanDeleteNullPointers) #if CPPUTEST_USE_MEM_LEAK_DETECTION +#ifdef NEEDS_DISABLE_USE_AFTER_FREE +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wuse-after-free" +#endif /* NEEDS_DISABLE_USE_AFTER_FREE */ + CPPUTEST_DO_NOT_SANITIZE_ADDRESS static void deleteArrayInvalidatesMemory() { @@ -36,11 +46,6 @@ static void deleteArrayInvalidatesMemory() CHECK(memory[5] != 0xCB); } -TEST(BasicBehavior, deleteArrayInvalidatesMemory) -{ - deleteArrayInvalidatesMemory(); -} - CPPUTEST_DO_NOT_SANITIZE_ADDRESS static void deleteInvalidatesMemory() { @@ -50,6 +55,15 @@ static void deleteInvalidatesMemory() CHECK(*memory != 0xAD); } +#ifdef NEEDS_DISABLE_USE_AFTER_FREE +# pragma GCC diagnostic pop +#endif /* NEEDS_DISABLE_USE_AFTER_FREE */ + +TEST(BasicBehavior, deleteArrayInvalidatesMemory) +{ + deleteArrayInvalidatesMemory(); +} + TEST(BasicBehavior, deleteInvalidatesMemory) { deleteInvalidatesMemory(); From 817041b1f6d744d65edee18a2f6f1e1ecd2930c4 Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 24 May 2022 17:47:57 +0200 Subject: [PATCH 0734/1093] Fix compilation on clang --- include/CppUTest/CppUTestConfig.h | 10 ++++++---- tests/CppUTest/AllocationInCppFile.h | 2 +- tests/CppUTest/TestFailureTest.cpp | 4 ++-- tests/CppUTest/UtestPlatformTest.cpp | 2 +- tests/CppUTest/UtestTest.cpp | 26 +++++++++++++++++++------- 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index fb96d5630..98bf14f7e 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -103,10 +103,12 @@ #define __has_attribute(x) 0 #endif -#if __has_attribute(noreturn) - #define _no_return_ __attribute__((noreturn)) +#if defined (__cplusplus) && __cplusplus >= 201103L + #define _no_return_ [[noreturn]] +#elif __has_attribute(noreturn) + #define _no_return_ __attribute__((noreturn)) #else - #define _no_return_ + #define _no_return_ #endif #if defined(__MINGW32__) @@ -195,7 +197,7 @@ #define CPPUTEST_SANITIZE_ADDRESS 1 #define CPPUTEST_DO_NOT_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) #if defined(__linux__) && defined(__clang__) - #if CPPUTEST_USE_MEM_LEAK_DETECTION + #if CPPUTEST_USE_MEM_LEAK_DETECTION #warning Compiling with Address Sanitizer with clang on linux will cause duplicate symbols for operator new. Turning off memory leak detection. Compile with -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED to get rid of this warning. #undef CPPUTEST_USE_MEM_LEAK_DETECTION #define CPPUTEST_USE_MEM_LEAK_DETECTION 0 diff --git a/tests/CppUTest/AllocationInCppFile.h b/tests/CppUTest/AllocationInCppFile.h index f3b47766a..6246cf13e 100644 --- a/tests/CppUTest/AllocationInCppFile.h +++ b/tests/CppUTest/AllocationInCppFile.h @@ -12,7 +12,7 @@ char* newArrayAllocationWithoutMacro(); class ClassThatThrowsAnExceptionInTheConstructor { public: - ClassThatThrowsAnExceptionInTheConstructor() _no_return_; + _no_return_ ClassThatThrowsAnExceptionInTheConstructor(); }; #endif diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index 5262fb57c..5fa3fb2df 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -407,7 +407,7 @@ TEST(TestFailure, BitsEqualChar) BitsEqualFailure f(test, failFileName, failLineNumber, 0x01, 0x03, 0xFF, sizeof(char), ""); FAILURE_EQUAL("expected <00000001>\n\tbut was <00000011>", f); } -#endif +#endif /* CPPUTEST_CHAR_BIT */ TEST(TestFailure, BitsEqual16Bit) { @@ -442,4 +442,4 @@ TEST(TestFailure, UnexpectedExceptionFailure_StandardException) STRCMP_CONTAINS("runtime_error", f.getMessage().asCharString()); STRCMP_CONTAINS("' was thrown: Some error", f.getMessage().asCharString()); } -#endif \ No newline at end of file +#endif /* CPPUTEST_USE_STD_CPP_LIB */ diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index 52021dee6..4e88ae6b9 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -61,7 +61,7 @@ static void failFunction_() FAIL("This test fails"); } -static void exitNonZeroFunction_() _no_return_; +_no_return_ static void exitNonZeroFunction_(); static void exitNonZeroFunction_() { /* destructor of static objects will be called. If StringCache was there then the allocator will report invalid deallocations of static SimpleString */ diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 9c3e64e23..3ebf3c846 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -30,6 +30,10 @@ #include "CppUTest/TestTestingFixture.h" #include "CppUTest/PlatformSpecificFunctions.h" +#ifdef __clang__ +# define NEEDS_DISABLE_UNREACHABLE_CODE +#endif /* clang */ + TEST_GROUP(UtestShell) { TestTestingFixture fixture; @@ -218,12 +222,26 @@ TEST(UtestShell, TestStopsAfterSetupFailure) } #if CPPUTEST_USE_STD_CPP_LIB -static void thrownUnknownExceptionMethod_() +#ifdef NEEDS_DISABLE_UNREACHABLE_CODE +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunreachable-code" +#endif /* NEEDS_DISABLE_UNREACHABLE_CODE */ +_no_return_ static void thrownUnknownExceptionMethod_() { throw 33; stopAfterFailure++; } +_no_return_ static void thrownStandardExceptionMethod_() +{ + throw std::runtime_error("exception text"); + stopAfterFailure++; +} + +#ifdef NEEDS_DISABLE_UNREACHABLE_CODE +# pragma GCC diagnostic pop +#endif /* NEEDS_DISABLE_UNREACHABLE_CODE */ + TEST(UtestShell, TestStopsAfterUnknownExceptionIsThrown) { bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); @@ -237,12 +255,6 @@ TEST(UtestShell, TestStopsAfterUnknownExceptionIsThrown) UtestShell::setRethrowExceptions(initialRethrowExceptions); } -static void thrownStandardExceptionMethod_() -{ - throw std::runtime_error("exception text"); - stopAfterFailure++; -} - TEST(UtestShell, TestStopsAfterStandardExceptionIsThrown) { bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); From 473be2b351ff2d64823e4e84cd3f62fcce9dc999 Mon Sep 17 00:00:00 2001 From: Mark Furland Date: Wed, 1 Jun 2022 16:19:26 -0400 Subject: [PATCH 0735/1093] Ignore apple clang warnings properly Apple clang is different than normal clang for reasons. We need to ignore some stuff specifically for apple clang. I did some testing with https://github.com/sickcodes/Docker-OSX to figure out what versions of apple clang need what warnings surpressed. None of these warnings happen with normal clang. 10.15: "Catalina" Apple clang version 11.0.3 (clang-1103.0.32.62) Xcode_11.5 No extra warning suppression required Apple clang version 12.0.0 (clang-1200.0.32.2) Xcode_12 Apple clang version 12.0.0 (clang-1200.0.32.27) Xcode_12.2 Apple clang version 12.0.0 (clang-1200.0.32.28) Xcode_12.3 Apple clang version 12.0.0 (clang-1200.0.32.29) Xcode_12.4 poison-system-directories 11: "Big Sur" Apple clang version 12.0.5 (clang-1205.0.22.9) Xcode_12.5 Apple clang version 12.0.5 (clang-1205.0.22.11) Xcode 12.5.1 suggest-override suggest-destructor-override poison-system-directories 12: "Monterey" Apple clang version 13.1.6 (clang-1316.0.21.2.5) Xcode ??? suggest-override suggest-destructor-override --- build/MakefileWorker.mk | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index 5f62e643b..2434aa85e 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -214,6 +214,7 @@ CLANG_VERSION := $(shell echo $(CC_VERSION_OUTPUT) | sed -n 's/.* \([0-9]*\.[0-9 CLANG_VERSION_NUM := $(subst .,,$(CLANG_VERSION)) CLANG_VERSION_NUM_GT_700 := $(shell [ "$(CLANG_VERSION_NUM)" -ge 700 ] && echo Y || echo N) CLANG_VERSION_NUM_GT_1200 := $(shell [ "$(CLANG_VERSION_NUM)" -ge 1200 ] && echo Y || echo N) +CLANG_VERSION_NUM_GT_1205 := $(shell [ "$(CLANG_VERSION_NUM)" -ge 1205 ] && echo Y || echo N) ifeq ($(CLANG_VERSION_NUM_GT_700), Y) # -Wno-reserved-id-macro -> Many CppUTest macros start with __, which is a reserved namespace @@ -221,10 +222,20 @@ ifeq ($(CLANG_VERSION_NUM_GT_700), Y) CPPUTEST_CXX_WARNINGFLAGS += -Wno-reserved-id-macro -Wno-keyword-macro CPPUTEST_C_WARNINGFLAGS += -Wno-reserved-id-macro -Wno-keyword-macro endif + +ifeq ($(UNAME_OS),$(MACOSX_STR)) +#apple clang has some special behavior ifeq ($(CLANG_VERSION_NUM_GT_1200), Y) # -Wno-poison-system-directories -> Apparently apple clang thinks everything is a cross compile, making this useless CPPUTEST_CXX_WARNINGFLAGS += -Wno-poison-system-directories CPPUTEST_C_WARNINGFLAGS += -Wno-poison-system-directories +endif # clang 1200 + +ifeq ($(CLANG_VERSION_NUM_GT_1205), Y) +# Not sure why apple clang throws these warnings on cpputest code when clang doesn't + CPPUTEST_CXX_WARNINGFLAGS += -Wno-suggest-override -Wno-suggest-destructor-override + CPPUTEST_C_WARNINGFLAGS += -Wno-suggest-override -Wno-suggest-destructor-override +endif endif endif From cb84e765922223be64074c86568cc9e52c9aa280 Mon Sep 17 00:00:00 2001 From: Mark Furland Date: Wed, 25 May 2022 11:31:34 -0400 Subject: [PATCH 0736/1093] stop creating temp files that aren't cleaned up When I got 7fc2a5e18e5567df67a135d6a7fe6311f92a9660 merged I stored the return code from the test binary in a temp file and then deleted the temp file. But that temp file was created every time MakefileWorker.mk was sourced, not just when the targets were run. This commit changes it so the temp file is only created if the relevant targets are being run so it will always get deleted. --- build/MakefileWorker.mk | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index 5f62e643b..2fd1fdee1 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -520,13 +520,14 @@ else endif $(SILENCE)$(RANLIB) $@ -TEST_RUN_RETURN_CODE_FILE:=$(shell mktemp /tmp/cpputestResult.XXX) test: $(TEST_TARGET) - ($(RUN_TEST_TARGET); echo $$? > $(TEST_RUN_RETURN_CODE_FILE)) | tee $(TEST_OUTPUT) + @$(eval TEST_RUN_RETURN_CODE_FILE=$(shell mktemp /tmp/cpputestResult.XXX)) + @($(RUN_TEST_TARGET); echo $$? > $(TEST_RUN_RETURN_CODE_FILE)) | tee $(TEST_OUTPUT) @ret=$$(cat $(TEST_RUN_RETURN_CODE_FILE)); rm $(TEST_RUN_RETURN_CODE_FILE); if [ "$$ret" -ne 0 ]; then echo "$$(tput setaf 1)$(TEST_TARGET) returned $${ret}$$(tput sgr0)"; fi; exit $$ret vtest: $(TEST_TARGET) - ($(RUN_TEST_TARGET) -v; echo $$? > $(TEST_RUN_RETURN_CODE_FILE)) | tee $(TEST_OUTPUT) + @$(eval TEST_RUN_RETURN_CODE_FILE=$(shell mktemp /tmp/cpputestResult.XXX)) + @($(RUN_TEST_TARGET) -v; echo $$? > $(TEST_RUN_RETURN_CODE_FILE)) | tee $(TEST_OUTPUT) @ret=$$(cat $(TEST_RUN_RETURN_CODE_FILE)); rm $(TEST_RUN_RETURN_CODE_FILE); if [ "$$ret" -ne 0 ]; then echo "$$(tput setaf 1)$(TEST_TARGET) returned $${ret}$$(tput sgr0)"; fi; exit $$ret $(CPPUTEST_OBJS_DIR)/%.o: %.cc From 05df4bec1605480f8d39af301cc2a5a81c79ba3b Mon Sep 17 00:00:00 2001 From: Emil Jaregran Date: Sun, 3 Jul 2022 22:40:55 +0200 Subject: [PATCH 0737/1093] Fix typos in MakefileWorker.mk --- build/MakefileWorker.mk | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index 5f62e643b..c883c000a 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -76,14 +76,14 @@ MINGW_STR = MINGW CYGWIN_STR = CYGWIN LINUX_STR = Linux SUNOS_STR = SunOS -UNKNWOWN_OS_STR = Unknown +UNKNOWN_OS_STR = Unknown # Compilers CC_VERSION_OUTPUT ="$(shell $(CXX) -v 2>&1)" CLANG_STR = clang SUNSTUDIO_CXX_STR = SunStudio -UNAME_OS = $(UNKNWOWN_OS_STR) +UNAME_OS = $(UNKNOWN_OS_STR) ifeq ($(findstring $(MINGW_STR),$(UNAME_OUTPUT)),$(MINGW_STR)) UNAME_OS = $(MINGW_STR) @@ -200,7 +200,7 @@ ifeq ($(COMPILER_NAME),$(CLANG_STR)) # -Wno-disabled-macro-expansion -> Have to disable the macro expansion warning as the operator new overload warns on that. # -Wno-padded -> I sort-of like this warning but if there is a bool at the end of the class, it seems impossible to remove it! (except by making padding explicit) # -Wno-global-constructors Wno-exit-time-destructors -> Great warnings, but in CppUTest it is impossible to avoid as the automatic test registration depends on the global ctor and dtor -# -Wno-weak-vtables -> The TEST_GROUP macro declares a class and will automatically inline its methods. Thats ok as they are only in one translation unit. Unfortunately, the warning can't detect that, so it must be disabled. +# -Wno-weak-vtables -> The TEST_GROUP macro declares a class and will automatically inline its methods. That's ok as they are only in one translation unit. Unfortunately, the warning can't detect that, so it must be disabled. # -Wno-old-style-casts -> We only use old style casts by decision # -Wno-c++11-long-long -> When it detects long long, then we can use it and no need for a warning about that # -Wno-c++98-compat-pedantic -> Incompatibilities with C++98, these are happening through #define. @@ -243,7 +243,7 @@ else endif endif -# Default dir for the outout library +# Default dir for the output library ifndef CPPUTEST_LIB_DIR ifndef TARGET_PLATFORM CPPUTEST_LIB_DIR = lib @@ -257,7 +257,7 @@ ifndef CPPUTEST_MAP_FILE CPPUTEST_MAP_FILE = N endif -# No extentions is default +# No extensions is default ifndef CPPUTEST_USE_EXTENSIONS CPPUTEST_USE_EXTENSIONS = N endif From b7f9b6b8439f2c4659243f1a86ad777e5ab4369d Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 5 Jul 2022 21:26:59 -0700 Subject: [PATCH 0738/1093] Mac autotools build --- .github/workflows/basic.yml | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/basic.yml diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml new file mode 100644 index 000000000..6497e0793 --- /dev/null +++ b/.github/workflows/basic.yml @@ -0,0 +1,41 @@ +--- +name: Basic builds + +on: + push: + pull_request: + +jobs: + mac-gcc-autotools: + runs-on: macos-latest + env: + BUILD: autotools + CC: gcc + CXX: g++ + name: "basic build & test" + steps: + - name: Checkout + uses: actions/checkout@main + - name: Build + run: | + brew install automake + autoreconf -i . + ./configure + make tdd + + mac-clang-autotools: + runs-on: macos-latest + env: + BUILD: autotools + CC: clang + CXX: clang++ + name: "basic build & test" + steps: + - name: Checkout + uses: actions/checkout@main + - name: Build + run: | + brew install automake + autoreconf -i . + ./configure + make tdd From 9ac65090c1fa71ce59479e63ba62385578b530c7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 5 Jul 2022 22:03:26 -0700 Subject: [PATCH 0739/1093] Windows build --- .github/workflows/basic.yml | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 6497e0793..645c09c4c 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -9,10 +9,9 @@ jobs: mac-gcc-autotools: runs-on: macos-latest env: - BUILD: autotools CC: gcc CXX: g++ - name: "basic build & test" + name: "Mac GCC Autotools" steps: - name: Checkout uses: actions/checkout@main @@ -26,10 +25,9 @@ jobs: mac-clang-autotools: runs-on: macos-latest env: - BUILD: autotools CC: clang CXX: clang++ - name: "basic build & test" + name: "Mac Clang Autotools" steps: - name: Checkout uses: actions/checkout@main @@ -39,3 +37,17 @@ jobs: autoreconf -i . ./configure make tdd + + windows: + runs-on: windows-latest + env: + CPP_STD: 17 + name: "Windows msbuild" + steps: + - name: Checkout + uses: actions/checkout@main + - name: Build + run: | + cmake -B build -S . + cmake --build build + ctest --test-dir build From b24434b76a02a66af25b9303cb2d88ca6c9130ba Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 5 Jul 2022 22:16:46 -0700 Subject: [PATCH 0740/1093] Linux builds --- .github/workflows/basic.yml | 49 ++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 645c09c4c..5d05ac835 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -40,14 +40,57 @@ jobs: windows: runs-on: windows-latest - env: - CPP_STD: 17 name: "Windows msbuild" steps: - name: Checkout uses: actions/checkout@main - name: Build run: | - cmake -B build -S . + cmake -B build -S . -DCMAKE_CXX_STANDARD=17 + cmake --build build + ctest --test-dir build + + linux-gcc-cmake: + runs-on: ubuntu-latest + env: + CC: gcc + CXX: g++ + name: "Linux GCC CMake" + steps: + - name: Checkout + uses: actions/checkout@main + - name: Build + run: | + cmake -B build -S . -DCMAKE_CXX_STANDARD=17 cmake --build build ctest --test-dir build + + linux-gcc-autotools: + runs-on: ubuntu-latest + env: + CC: gcc + CXX: g++ + name: "Linux GCC autotools" + steps: + - name: Checkout + uses: actions/checkout@main + - name: Build + run: | + autoreconf -i . + ./configure + make tdd + + linux-clang-autotools: + runs-on: ubuntu-latest + env: + CC: clang + CXX: clang++ + name: "Linux Clang autotools" + steps: + - name: Checkout + uses: actions/checkout@main + - name: Build + run: | + autoreconf -i . + ./configure + make tdd From 3bfd5292f67fb9cd85d8c9842a8cf7726f3d7db5 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 5 Jul 2022 22:24:28 -0700 Subject: [PATCH 0741/1093] Mac CMake build --- .github/workflows/basic.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 5d05ac835..30cfda177 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -38,6 +38,18 @@ jobs: ./configure make tdd + mac-cmake: + runs-on: macos-latest + name: "Mac CMake" + steps: + - name: Checkout + uses: actions/checkout@main + - name: Build + run: | + cmake -B build -S . -DCMAKE_CXX_STANDARD=17 + cmake --build build + ctest --test-dir build + windows: runs-on: windows-latest name: "Windows msbuild" From 627d16b21c2a2e1cbf9653f6230d26c1a70d536a Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 6 Jul 2022 20:01:14 -0700 Subject: [PATCH 0742/1093] Parameterize CMake build --- .github/workflows/basic.yml | 88 +++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 34 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 30cfda177..c5518963b 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -38,44 +38,64 @@ jobs: ./configure make tdd - mac-cmake: - runs-on: macos-latest - name: "Mac CMake" - steps: - - name: Checkout - uses: actions/checkout@main - - name: Build - run: | - cmake -B build -S . -DCMAKE_CXX_STANDARD=17 - cmake --build build - ctest --test-dir build - - windows: - runs-on: windows-latest - name: "Windows msbuild" - steps: - - name: Checkout - uses: actions/checkout@main - - name: Build - run: | - cmake -B build -S . -DCMAKE_CXX_STANDARD=17 - cmake --build build - ctest --test-dir build - - linux-gcc-cmake: - runs-on: ubuntu-latest - env: - CC: gcc - CXX: g++ - name: "Linux GCC CMake" + cmake: + strategy: + matrix: + include: + # Windows + - os: windows-latest + cpp_version: 17 + # Linux + # CMake different C++ versions with clang + - os: ubuntu-latest + cpp_version: 11 + cxx: clang++ + cc: clang + - os: ubuntu-latest + cpp_version: 14 + cxx: clang++ + cc: clang + - os: ubuntu-latest + cpp_version: 17 + cxx: clang++ + cc: clang + # CMake different C++ versions with gcc + - os: ubuntu-latest + cpp_version: 11 + cxx: g++ + cc: gcc + - os: ubuntu-latest + cpp_version: 14 + cxx: g++ + cc: gcc + - os: ubuntu-latest + cpp_version: 17 + cxx: g++ + cc: gcc + # Mac OSX + - os: macos-latest + cpp_version: 17 + cxx: clang++ + cc: clang + - os: macos-latest + cpp_version: 14 + cxx: g++ + cc: gcc + runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@main + - if: ${{ matrix.cxx }} + run: echo "CXX=${{ matrix.cxx }}" >> $GITHUB_ENV + - if: ${{ matrix.cc }} + run: echo "CC=${{ matrix.cc }}" >> $GITHUB_ENV + - name: Configure + run: cmake -B build -S . -DCMAKE_CXX_STANDARD=${{ matrix.cpp_version }} + if: ${{ matrix.cpp_version }} - name: Build - run: | - cmake -B build -S . -DCMAKE_CXX_STANDARD=17 - cmake --build build - ctest --test-dir build + run: cmake --build build + - name: Test + run: ctest --test-dir build linux-gcc-autotools: runs-on: ubuntu-latest From 2dc882f8c90e60cd99c2ca334a38f950a3f95f19 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 6 Jul 2022 21:42:12 -0700 Subject: [PATCH 0743/1093] Parameterize automake build --- .github/workflows/basic.yml | 83 +++++++++++++------------------------ 1 file changed, 28 insertions(+), 55 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index c5518963b..2ac92c9c2 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -6,37 +6,40 @@ on: pull_request: jobs: - mac-gcc-autotools: - runs-on: macos-latest - env: - CC: gcc - CXX: g++ - name: "Mac GCC Autotools" - steps: - - name: Checkout - uses: actions/checkout@main - - name: Build - run: | - brew install automake - autoreconf -i . - ./configure - make tdd - - mac-clang-autotools: - runs-on: macos-latest - env: - CC: clang - CXX: clang++ - name: "Mac Clang Autotools" + automake: + strategy: + matrix: + include: + # Mac OSX + - os: macos-latest + cc: gcc + cxx: g++ + - os: macos-latest + cc: clang + cxx: clang++ + # Linux + - os: ubuntu-latest + cc: gcc + cxx: g++ + - os: ubuntu-latest + cc: clang + cxx: clang++ + runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@main - - name: Build + - run: brew install automake + if: ${{ startswith(matrix.os, 'macos') }} + - if: ${{ matrix.cxx }} + run: echo "CXX=${{ matrix.cxx }}" >> $GITHUB_ENV + - if: ${{ matrix.cc }} + run: echo "CC=${{ matrix.cc }}" >> $GITHUB_ENV + - name: Configure run: | - brew install automake autoreconf -i . ./configure - make tdd + - name: Build and test + run: make tdd cmake: strategy: @@ -96,33 +99,3 @@ jobs: run: cmake --build build - name: Test run: ctest --test-dir build - - linux-gcc-autotools: - runs-on: ubuntu-latest - env: - CC: gcc - CXX: g++ - name: "Linux GCC autotools" - steps: - - name: Checkout - uses: actions/checkout@main - - name: Build - run: | - autoreconf -i . - ./configure - make tdd - - linux-clang-autotools: - runs-on: ubuntu-latest - env: - CC: clang - CXX: clang++ - name: "Linux Clang autotools" - steps: - - name: Checkout - uses: actions/checkout@main - - name: Build - run: | - autoreconf -i . - ./configure - make tdd From 2a2f41d56ff3d0b5839cce7bc14f5c48f0c3105b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 6 Jul 2022 21:54:35 -0700 Subject: [PATCH 0744/1093] generate test report --- .github/workflows/extended.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/extended.yml diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml new file mode 100644 index 000000000..6773ef72e --- /dev/null +++ b/.github/workflows/extended.yml @@ -0,0 +1,25 @@ +name: Extended builds + +on: + push: + pull_request: + +jobs: + test_report: + runs-on: ubuntu-latest + env: + CC: gcc + CXX: g++ + steps: + - name: Install tools + run: sudo apt-get install -y ant-optional + - name: Checkout + uses: actions/checkout@main + - run: | + autoreconf -i . + ./configure + make check + ./CppUTestTests -ojunit + ./CppUTestExtTests -ojunit + cp ./scripts/generate_junit_report_ant.xml . + ant -f generate_junit_report_ant.xml From 2a7d864a08595b1f66f385ea5f02c0a93294639e Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 6 Jul 2022 22:02:35 -0700 Subject: [PATCH 0745/1093] generate coverage report --- .github/workflows/extended.yml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 6773ef72e..347ab5343 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -7,9 +7,6 @@ on: jobs: test_report: runs-on: ubuntu-latest - env: - CC: gcc - CXX: g++ steps: - name: Install tools run: sudo apt-get install -y ant-optional @@ -23,3 +20,16 @@ jobs: ./CppUTestExtTests -ojunit cp ./scripts/generate_junit_report_ant.xml . ant -f generate_junit_report_ant.xml + + cmake_coverage: + runs-on: ubuntu-latest + steps: + - name: Install tools + run: pip install --user cpp-coveralls gcovr + - name: Checkout + uses: actions/checkout@main + - run: | + cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DC++11=ON -DCOVERAGE=ON -DLONGLONG=ON + cmake --build build + ctest --test-dir build + coveralls -b build -r . -i "src" -i "include" --gcov-options="-lbc" || true From e8e2b83e20ea8b36d56575f4ff6c882d6e005736 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 21 May 2022 15:43:30 -0700 Subject: [PATCH 0746/1093] Add missing include A complete type definition of `SimpleString` is needed for the `TestPlugin::name_` member. --- include/CppUTest/TestPlugin.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/CppUTest/TestPlugin.h b/include/CppUTest/TestPlugin.h index 2b2ed932b..72ad941c1 100644 --- a/include/CppUTest/TestPlugin.h +++ b/include/CppUTest/TestPlugin.h @@ -28,6 +28,8 @@ #ifndef D_TestPlugin_h #define D_TestPlugin_h +#include "SimpleString.h" + class UtestShell; class TestResult; From 8e63e0b6e6c9ae5f0d752a288d4001897a451ecb Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 8 Jul 2022 18:45:56 -0700 Subject: [PATCH 0747/1093] Use NULLPTR --- src/CppUTest/TestFailure.cpp | 2 +- tests/CppUTest/CompatabilityTests.cpp | 2 +- tests/CppUTest/SimpleStringTest.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index 26176b4b6..355e3ddd1 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -400,7 +400,7 @@ static SimpleString getExceptionTypeName(const std::exception &e) int status = -1; std::unique_ptr demangledName( - abi::__cxa_demangle(name, nullptr, nullptr, &status), + abi::__cxa_demangle(name, NULLPTR, NULLPTR, &status), std::free ); return (status==0) ? demangledName.get() : name; diff --git a/tests/CppUTest/CompatabilityTests.cpp b/tests/CppUTest/CompatabilityTests.cpp index 7bce1100d..060881d24 100644 --- a/tests/CppUTest/CompatabilityTests.cpp +++ b/tests/CppUTest/CompatabilityTests.cpp @@ -13,7 +13,7 @@ TEST_GROUP(StandardCppLibrary) TEST(StandardCppLibrary, UniquePtrConversationToBool) { - auto const aNull = std::unique_ptr(nullptr); + auto const aNull = std::unique_ptr(NULLPTR); CHECK_FALSE(aNull); auto const notNull = std::make_unique(1); diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index de5ee0518..cf65d6053 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -697,7 +697,7 @@ TEST(SimpleString, Sizes) TEST(SimpleString, nullptr_type) { - SimpleString s(StringFrom(nullptr)); + SimpleString s(StringFrom(NULLPTR)); STRCMP_EQUAL("(null)", s.asCharString()); } From 032b7bcf2524abfcfed3bf6d4bbdd1b47685ade4 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 8 Jul 2022 18:48:50 -0700 Subject: [PATCH 0748/1093] guard C++11 feature --- src/CppUTest/TestFailure.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index 355e3ddd1..1eb5bb619 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -396,7 +396,7 @@ UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test) static SimpleString getExceptionTypeName(const std::exception &e) { const char *name = typeid(e).name(); -#if defined(__GNUC__) +#if defined(__GNUC__) && (__cplusplus >= 201103L) int status = -1; std::unique_ptr demangledName( From a18d455505285e57eb07517f47a90e80dec77683 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 8 Jul 2022 18:49:43 -0700 Subject: [PATCH 0749/1093] Build C++98 in CI --- .github/workflows/basic.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 2ac92c9c2..76267f551 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -50,6 +50,10 @@ jobs: cpp_version: 17 # Linux # CMake different C++ versions with clang + - os: ubuntu-latest + cpp_version: 98 + cxx: clang++ + cc: clang - os: ubuntu-latest cpp_version: 11 cxx: clang++ @@ -63,6 +67,10 @@ jobs: cxx: clang++ cc: clang # CMake different C++ versions with gcc + - os: ubuntu-latest + cpp_version: 98 + cxx: g++ + cc: gcc - os: ubuntu-latest cpp_version: 11 cxx: g++ From 5674117f3fb09c2fbb14848307c13192a9ef79bd Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 10 Jul 2022 23:43:42 -0700 Subject: [PATCH 0750/1093] Enable coveralls --- .github/workflows/extended.yml | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 347ab5343..885bc897e 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -25,11 +25,28 @@ jobs: runs-on: ubuntu-latest steps: - name: Install tools - run: pip install --user cpp-coveralls gcovr + run: | + pip install --user gcovr + sudo apt install lcov - name: Checkout uses: actions/checkout@main - - run: | - cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DC++11=ON -DCOVERAGE=ON -DLONGLONG=ON - cmake --build build - ctest --test-dir build - coveralls -b build -r . -i "src" -i "include" --gcov-options="-lbc" || true + - name: Configure + run: > + cmake + -S . + -B cpputest_build + -D CMAKE_BUILD_TYPE=Debug + -D C++11=ON + -D COVERAGE=ON + -D LONGLONG=ON + - name: Build + run: cmake --build cpputest_build + - name: Test + run: ctest --test-dir cpputest_build + - name: Coverage + run: lcov --capture --directory . --output-file lcov.info + - name: Coveralls + uses: coverallsapp/github-action@master + with: + path-to-lcov: lcov.info + github-token: ${{ secrets.GITHUB_TOKEN }} From 42a406ec0dbe72d1311d07aa037f43ea9122b73e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 28 Jul 2022 17:47:32 +0200 Subject: [PATCH 0751/1093] Update README.md Added github actions build --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 93ba73b0a..8a0a63fe2 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,15 @@ CppUTest ======== -[![Travis Build Status (deprecated)](https://app.travis-ci.com/cpputest/cpputest.svg?branch=master)](https://app.travis-ci.com/github/cpputest/cpputest) +[![Github basic build](https://github.com/cpputest/cpputest/actions/workflows/basic.yml/badge.svg)](https://github.com/cpputest/cpputest/actions/workflows/basic.yml/badge.svg) [![AppveyorBuild status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) [![CircleCI status](https://circleci.com/gh/cpputest/cpputest.svg?style=svg)](https://app.circleci.com/pipelines/github/cpputest) [![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) [![ConanCenter package](https://repology.org/badge/version-for-repo/conancenter/cpputest.svg)](https://conan.io/center/cpputest) +Obsolete: +[![Travis Build Status (deprecated)](https://app.travis-ci.com/cpputest/cpputest.svg?branch=master)](https://app.travis-ci.com/github/cpputest/cpputest) + CppUTest unit testing and mocking framework for C/C++ From 0c24cf197498bbf16f983cde104c8c5f21452831 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 28 Jul 2022 17:49:47 +0200 Subject: [PATCH 0752/1093] Update README.md Added more build badges --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8a0a63fe2..bcce51f5a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ CppUTest ======== -[![Github basic build](https://github.com/cpputest/cpputest/actions/workflows/basic.yml/badge.svg)](https://github.com/cpputest/cpputest/actions/workflows/basic.yml/badge.svg) +[![Github basic build](https://github.com/cpputest/cpputest/actions/workflows/basic.yml/badge.svg)](https://github.com/cpputest/cpputest/actions/workflows/basic.yml) +[![Github extended build](https://github.com/cpputest/cpputest/actions/workflows/extended.yml/badge.svg)](https://github.com/cpputest/cpputest/actions/workflows/extended.yml) [![AppveyorBuild status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) [![CircleCI status](https://circleci.com/gh/cpputest/cpputest.svg?style=svg)](https://app.circleci.com/pipelines/github/cpputest) [![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) From 9305e4b13fa0cb76fd85afa34b3004456e61dd85 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 9 Jul 2022 07:31:45 -0700 Subject: [PATCH 0753/1093] Restore DOS build in CI --- .github/workflows/extended.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 347ab5343..d9f0bb591 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -33,3 +33,25 @@ jobs: cmake --build build ctest --test-dir build coveralls -b build -r . -i "src" -i "include" --gcov-options="-lbc" || true + + make_dos: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@main + - name: Install tools + run: | + sudo apt-get install -y dosbox + git clone https://github.com/cpputest/watcom-compiler.git watcom + echo "WATCOM=$GITHUB_WORKSPACE/watcom" >> $GITHUB_ENV + echo "CC=wcl" >> $GITHUB_ENV + echo "CXX=wcl" >> $GITHUB_ENV + echo "$GITHUB_WORKSPACE/watcom/binl" >> $GITHUB_PATH + echo "CPPUTEST_HOME=$GITHUB_WORKSPACE" >> $GITHUB_ENV + - name: Build + run: | + $CC --version + make -f $CPPUTEST_HOME/platforms/Dos/Makefile clean + make -f $CPPUTEST_HOME/platforms/Dos/Makefile + - name: Test + run: $CPPUTEST_HOME/platforms/Dos/alltests.sh From 8265cc43d4efee3a67287c937796d672131dfba2 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 9 Jul 2022 07:57:18 -0700 Subject: [PATCH 0754/1093] Repair dosbox terminal --- .github/workflows/extended.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index d9f0bb591..ecbfda529 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -54,4 +54,6 @@ jobs: make -f $CPPUTEST_HOME/platforms/Dos/Makefile clean make -f $CPPUTEST_HOME/platforms/Dos/Makefile - name: Test + env: + TERM: linux run: $CPPUTEST_HOME/platforms/Dos/alltests.sh From d90e18d2c29988ecaa46485246be797e5bddb466 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 2 Apr 2022 13:06:57 -0700 Subject: [PATCH 0755/1093] Don't hijack the user's config type - When used as a subproject, don't assign a default `CMAKE_BUILD_CONFIG`. The default (i.e. empty) build type is valid and should not be overridden. - Avoid setting a build type when using a [multi-configuration generator](https://cmake.org/cmake/help/latest/prop_gbl/GENERATOR_IS_MULTI_CONFIG.html) in which case there is not a single build config. - Print a message so that users know that a default build type has been assigned implicitly. --- CMakeLists.txt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fdb3527f6..5502666b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,9 +41,17 @@ option(LIBNAME_POSTFIX_DEBUG "Add indication of debug compilation to the library option(HAS_INF "Compiler has Inf value for float" ON) option(HAS_NAN "Compiler has NaN value for float" ON) -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "What kind of build this is" FORCE) -endif(NOT CMAKE_BUILD_TYPE) +if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) # Don't change users' build type. + # Multi-configuration generators don't have a single build type. + get_property( + GENERATOR_IS_MULTI_CONFIG GLOBAL + PROPERTY GENERATOR_IS_MULTI_CONFIG + ) + if(NOT GENERATOR_IS_MULTICONFIG AND NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "What kind of build this is" FORCE) + message("No CMAKE_BUILD_TYPE set. Assigning: ${CMAKE_BUILD_TYPE}") + endif() +endif() # Pkg-config file include(FindPkgConfig) From e8722af9face627d8c72c094fb6944e3d2900c69 Mon Sep 17 00:00:00 2001 From: offa Date: Sat, 30 Jul 2022 14:50:00 +0200 Subject: [PATCH 0756/1093] Remove preprocessor comments --- tests/CppUTest/TestFailureTest.cpp | 4 ++-- tests/CppUTest/UtestTest.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index 5fa3fb2df..60a465b66 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -407,7 +407,7 @@ TEST(TestFailure, BitsEqualChar) BitsEqualFailure f(test, failFileName, failLineNumber, 0x01, 0x03, 0xFF, sizeof(char), ""); FAILURE_EQUAL("expected <00000001>\n\tbut was <00000011>", f); } -#endif /* CPPUTEST_CHAR_BIT */ +#endif TEST(TestFailure, BitsEqual16Bit) { @@ -442,4 +442,4 @@ TEST(TestFailure, UnexpectedExceptionFailure_StandardException) STRCMP_CONTAINS("runtime_error", f.getMessage().asCharString()); STRCMP_CONTAINS("' was thrown: Some error", f.getMessage().asCharString()); } -#endif /* CPPUTEST_USE_STD_CPP_LIB */ +#endif diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 3ebf3c846..7fe88c5a8 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -32,7 +32,7 @@ #ifdef __clang__ # define NEEDS_DISABLE_UNREACHABLE_CODE -#endif /* clang */ +#endif TEST_GROUP(UtestShell) { @@ -225,7 +225,7 @@ TEST(UtestShell, TestStopsAfterSetupFailure) #ifdef NEEDS_DISABLE_UNREACHABLE_CODE # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wunreachable-code" -#endif /* NEEDS_DISABLE_UNREACHABLE_CODE */ +#endif _no_return_ static void thrownUnknownExceptionMethod_() { throw 33; @@ -240,7 +240,7 @@ _no_return_ static void thrownStandardExceptionMethod_() #ifdef NEEDS_DISABLE_UNREACHABLE_CODE # pragma GCC diagnostic pop -#endif /* NEEDS_DISABLE_UNREACHABLE_CODE */ +#endif TEST(UtestShell, TestStopsAfterUnknownExceptionIsThrown) { From 2caa162a9195fcf220d6ad82317a83b04b22c5b3 Mon Sep 17 00:00:00 2001 From: offa Date: Sat, 30 Jul 2022 14:53:22 +0200 Subject: [PATCH 0757/1093] Move NEEDS_DISABLE_UNREACHABLE_CODE to CppUTestConfig.h --- include/CppUTest/CppUTestConfig.h | 1 + tests/CppUTest/UtestTest.cpp | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 98bf14f7e..3187dd4f6 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -41,6 +41,7 @@ */ #ifdef __clang__ + #define NEEDS_DISABLE_UNREACHABLE_CODE 1 #pragma clang diagnostic push #if (__clang_major__ == 3 && __clang_minor__ >= 6) || __clang_major__ >= 4 #pragma clang diagnostic ignored "-Wreserved-id-macro" diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 7fe88c5a8..0bc73cdb3 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -30,10 +30,6 @@ #include "CppUTest/TestTestingFixture.h" #include "CppUTest/PlatformSpecificFunctions.h" -#ifdef __clang__ -# define NEEDS_DISABLE_UNREACHABLE_CODE -#endif - TEST_GROUP(UtestShell) { TestTestingFixture fixture; From 89ec6e3e27521dfd0a7a80181450d836413ed19c Mon Sep 17 00:00:00 2001 From: offa Date: Sat, 30 Jul 2022 15:07:54 +0200 Subject: [PATCH 0758/1093] Use workaround to disable warning instead of pragmas --- tests/CppUTest/UtestTest.cpp | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 0bc73cdb3..a070f8f58 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -218,25 +218,36 @@ TEST(UtestShell, TestStopsAfterSetupFailure) } #if CPPUTEST_USE_STD_CPP_LIB -#ifdef NEEDS_DISABLE_UNREACHABLE_CODE -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wunreachable-code" -#endif -_no_return_ static void thrownUnknownExceptionMethod_() + +/* + * Prevents -Wunreachable-code; should always return true + */ +static bool avoidUnreachableCodeWarning() { - throw 33; - stopAfterFailure++; + do + { + return true; + } + while(0); } -_no_return_ static void thrownStandardExceptionMethod_() +static void thrownUnknownExceptionMethod_() { - throw std::runtime_error("exception text"); + if (avoidUnreachableCodeWarning()) + { + throw 33; + } stopAfterFailure++; } -#ifdef NEEDS_DISABLE_UNREACHABLE_CODE -# pragma GCC diagnostic pop -#endif +static void thrownStandardExceptionMethod_() +{ + if (avoidUnreachableCodeWarning()) + { + throw std::runtime_error("exception text"); + } + stopAfterFailure++; +} TEST(UtestShell, TestStopsAfterUnknownExceptionIsThrown) { From 014ee02d533a6fcdb3e5159c092ea914778cefed Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 6 Aug 2022 10:11:42 -0700 Subject: [PATCH 0759/1093] Remove extensions from CppUTest tests Since CppUTest can build without CppUTestExt, it we should be able to test without it as well. This header was unreferenced. --- tests/CppUTest/CommandLineTestRunnerTest.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index 29b74526d..f9a960647 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -32,7 +32,6 @@ #include "CppUTest/TestPlugin.h" #include "CppUTest/JUnitTestOutput.h" #include "CppUTest/PlatformSpecificFunctions.h" -#include "CppUTestExt/MockSupport.h" class DummyPluginWhichCountsThePlugins : public TestPlugin From 1fe559389008f74af5fdec8f061bbac4dd9aa3da Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 14 May 2022 12:08:51 -0700 Subject: [PATCH 0760/1093] Check for infinity in CMake --- CMakeLists.txt | 3 +++ cmake/Modules/CppUTestConfigurationOptions.cmake | 5 ----- config.h.cmake | 2 +- include/CppUTest/CppUTestConfig.h | 4 +++- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fdb3527f6..55e9c94f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -153,6 +153,9 @@ if(HAVE_SIZEOF_LONGLONG) set(CPPUTEST_HAVE_LONG_LONG_INT ON) endif() +include(CheckCXXSymbolExists) +check_cxx_symbol_exists(INFINITY "math.h" CPPUTEST_HAS_INF) + configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" "${PROJECT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index d2b5752c3..822997ec4 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -17,7 +17,6 @@ elseif (BORLAND) set(MEMORY_LEAK_DETECTION OFF) set(LONGLONG OFF) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") - set(HAS_INF OFF) set(HAS_NAN OFF) elseif (STD_C) if(NOT CPP_PLATFORM) @@ -64,10 +63,6 @@ if (LONGLONG) set(CPPUTEST_USE_LONG_LONG 1) endif (LONGLONG) -if (NOT HAS_INF) - set(CPPUTEST_NO_INF 1) -endif (NOT HAS_INF) - if (NOT HAS_NAN) set(CPPUTEST_NO_NAN 1) endif (NOT HAS_NAN) diff --git a/config.h.cmake b/config.h.cmake index d9e707e64..9da13830e 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -6,7 +6,7 @@ #cmakedefine CPPUTEST_HAVE_LONG_LONG_INT #cmakedefine CPPUTEST_HAVE_FENV -#cmakedefine CPPUTEST_NO_INF +#cmakedefine01 CPPUTEST_HAS_INF #cmakedefine CPPUTEST_NO_NAN #cmakedefine CPPUTEST_STD_C_LIB_DISABLED diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index fb96d5630..03a9e24b2 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -337,12 +337,14 @@ typedef struct cpputest_ulonglong cpputest_ulonglong; #pragma clang diagnostic pop #endif -/* Borland v5.4 does not have a NaN or Inf value */ +#ifndef CPPUTEST_HAS_INF #if defined(CPPUTEST_NO_INF) #define CPPUTEST_HAS_INF 0 #else #define CPPUTEST_HAS_INF 1 #endif +#endif + #if defined(CPPUTEST_NO_NAN) #define CPPUTEST_HAS_NAN 0 #else From d525915b6e62a413c6a51353cfe20ff77bd75f17 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 14 May 2022 14:13:36 -0700 Subject: [PATCH 0761/1093] Make INF check backwards compatible --- CMakeLists.txt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 55e9c94f6..8e4e0837e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -153,8 +153,18 @@ if(HAVE_SIZEOF_LONGLONG) set(CPPUTEST_HAVE_LONG_LONG_INT ON) endif() -include(CheckCXXSymbolExists) -check_cxx_symbol_exists(INFINITY "math.h" CPPUTEST_HAS_INF) +if(DEFINED HAS_INF) + message(DEPRECATION + "The HAS_INF cache variable has been deprecated. " + "CPPUTEST_HAS_INF is assessed automatically, " + "but can be assigned manually." + ) + set(CPPUTEST_HAS_INF ${HAS_INF}) +endif() +if(NOT DEFINED CPPUTEST_HAS_INF) + include(CheckCXXSymbolExists) + check_cxx_symbol_exists(INFINITY "math.h" CPPUTEST_HAS_INF) +endif() configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" From af6e54ce85e1085fa947d1965f46915413ad9ad7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 14 May 2022 23:11:12 -0700 Subject: [PATCH 0762/1093] Reduce scope of CPPUTEST_HAS_INF This is only used for tests and doesn't need to be exposed to users. --- config.h.cmake | 1 - include/CppUTest/CppUTestConfig.h | 8 -------- tests/CppUTest/CMakeLists.txt | 4 ++++ 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/config.h.cmake b/config.h.cmake index 9da13830e..b61c4b2df 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -6,7 +6,6 @@ #cmakedefine CPPUTEST_HAVE_LONG_LONG_INT #cmakedefine CPPUTEST_HAVE_FENV -#cmakedefine01 CPPUTEST_HAS_INF #cmakedefine CPPUTEST_NO_NAN #cmakedefine CPPUTEST_STD_C_LIB_DISABLED diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 03a9e24b2..a6c2c506f 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -337,14 +337,6 @@ typedef struct cpputest_ulonglong cpputest_ulonglong; #pragma clang diagnostic pop #endif -#ifndef CPPUTEST_HAS_INF -#if defined(CPPUTEST_NO_INF) -#define CPPUTEST_HAS_INF 0 -#else -#define CPPUTEST_HAS_INF 1 -#endif -#endif - #if defined(CPPUTEST_NO_NAN) #define CPPUTEST_HAS_NAN 0 #else diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index c9ed939e5..ce1484f6c 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -55,6 +55,10 @@ endif () add_executable(CppUTestTests ${CppUTestTests_src}) cpputest_normalize_test_output_location(CppUTestTests) target_link_libraries(CppUTestTests ${CppUTestLibName} ${THREAD_LIB}) +target_compile_definitions(CppUTestTests + PRIVATE + CPPUTEST_HAS_INF=$ +) if (TESTS_BUILD_DISCOVER) cpputest_buildtime_discover_tests(CppUTestTests) From 0a68bdf3e8fa74af40b82c5c25c6c826fc2d002a Mon Sep 17 00:00:00 2001 From: offa Date: Mon, 15 Aug 2022 16:16:31 +0200 Subject: [PATCH 0763/1093] Remove unused define --- include/CppUTest/CppUTestConfig.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 3187dd4f6..98bf14f7e 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -41,7 +41,6 @@ */ #ifdef __clang__ - #define NEEDS_DISABLE_UNREACHABLE_CODE 1 #pragma clang diagnostic push #if (__clang_major__ == 3 && __clang_minor__ >= 6) || __clang_major__ >= 4 #pragma clang diagnostic ignored "-Wreserved-id-macro" From 21dd7175a83669b4700f45ae806fb885478bcfc3 Mon Sep 17 00:00:00 2001 From: offa Date: Mon, 15 Aug 2022 16:21:07 +0200 Subject: [PATCH 0764/1093] Improve '-Wunreachable-code' workaround --- tests/CppUTest/UtestTest.cpp | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index a070f8f58..6597856c8 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -219,21 +219,12 @@ TEST(UtestShell, TestStopsAfterSetupFailure) #if CPPUTEST_USE_STD_CPP_LIB -/* - * Prevents -Wunreachable-code; should always return true - */ -static bool avoidUnreachableCodeWarning() -{ - do - { - return true; - } - while(0); -} +// Prevents -Wunreachable-code; should always be 'true' +static bool avoidUnreachableCodeWarning = true; static void thrownUnknownExceptionMethod_() { - if (avoidUnreachableCodeWarning()) + if (avoidUnreachableCodeWarning) { throw 33; } @@ -242,7 +233,7 @@ static void thrownUnknownExceptionMethod_() static void thrownStandardExceptionMethod_() { - if (avoidUnreachableCodeWarning()) + if (avoidUnreachableCodeWarning) { throw std::runtime_error("exception text"); } From eb1f0379369ae8330e849327a3c499a8324897fc Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 17 Aug 2022 20:59:43 +0200 Subject: [PATCH 0765/1093] Rename variable and add test case --- tests/CppUTest/UtestTest.cpp | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 6597856c8..b346fe228 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -220,11 +220,11 @@ TEST(UtestShell, TestStopsAfterSetupFailure) #if CPPUTEST_USE_STD_CPP_LIB // Prevents -Wunreachable-code; should always be 'true' -static bool avoidUnreachableCodeWarning = true; +static bool shouldThrowException = true; static void thrownUnknownExceptionMethod_() { - if (avoidUnreachableCodeWarning) + if (shouldThrowException) { throw 33; } @@ -233,7 +233,7 @@ static void thrownUnknownExceptionMethod_() static void thrownStandardExceptionMethod_() { - if (avoidUnreachableCodeWarning) + if (shouldThrowException) { throw std::runtime_error("exception text"); } @@ -245,6 +245,7 @@ TEST(UtestShell, TestStopsAfterUnknownExceptionIsThrown) bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); UtestShell::setRethrowExceptions(false); stopAfterFailure = 0; + shouldThrowException = true; fixture.setTestFunction(thrownUnknownExceptionMethod_); fixture.runAllTests(); LONGS_EQUAL(1, fixture.getFailureCount()); @@ -258,6 +259,7 @@ TEST(UtestShell, TestStopsAfterStandardExceptionIsThrown) bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); UtestShell::setRethrowExceptions(false); stopAfterFailure = 0; + shouldThrowException = true; fixture.setTestFunction(thrownStandardExceptionMethod_); fixture.runAllTests(); LONGS_EQUAL(1, fixture.getFailureCount()); @@ -268,12 +270,35 @@ TEST(UtestShell, TestStopsAfterStandardExceptionIsThrown) UtestShell::setRethrowExceptions(initialRethrowExceptions); } +TEST(UtestShell, NoExceptionIsRethrownIfEnabledButNotThrown) +{ + bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); + bool exceptionRethrown = false; + stopAfterFailure = 0; + UtestShell::setRethrowExceptions(true); + shouldThrowException = false; + fixture.setTestFunction(thrownUnknownExceptionMethod_); + try + { + fixture.runAllTests(); + } + catch(...) + { + exceptionRethrown = true; + } + CHECK_FALSE(exceptionRethrown); + LONGS_EQUAL(0, fixture.getFailureCount()); + LONGS_EQUAL(1, stopAfterFailure); + UtestShell::setRethrowExceptions(initialRethrowExceptions); +} + TEST(UtestShell, UnknownExceptionIsRethrownIfEnabled) { bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); bool exceptionRethrown = false; stopAfterFailure = 0; UtestShell::setRethrowExceptions(true); + shouldThrowException = true; fixture.setTestFunction(thrownUnknownExceptionMethod_); try { @@ -297,6 +322,7 @@ TEST(UtestShell, StandardExceptionIsRethrownIfEnabled) bool exceptionRethrown = false; stopAfterFailure = 0; UtestShell::setRethrowExceptions(true); + shouldThrowException = true; fixture.setTestFunction(thrownStandardExceptionMethod_); try { From 6e35cba60796e322d0431a0b6c742497f0d5030c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 18 Aug 2022 18:47:36 -0700 Subject: [PATCH 0766/1093] Revert "Reduce scope of CPPUTEST_HAS_INF" This reverts commit af6e54ce85e1085fa947d1965f46915413ad9ad7. --- config.h.cmake | 1 + include/CppUTest/CppUTestConfig.h | 8 ++++++++ tests/CppUTest/CMakeLists.txt | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/config.h.cmake b/config.h.cmake index b61c4b2df..9da13830e 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -6,6 +6,7 @@ #cmakedefine CPPUTEST_HAVE_LONG_LONG_INT #cmakedefine CPPUTEST_HAVE_FENV +#cmakedefine01 CPPUTEST_HAS_INF #cmakedefine CPPUTEST_NO_NAN #cmakedefine CPPUTEST_STD_C_LIB_DISABLED diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index a45f8bdc6..a536d5b1d 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -339,6 +339,14 @@ typedef struct cpputest_ulonglong cpputest_ulonglong; #pragma clang diagnostic pop #endif +#ifndef CPPUTEST_HAS_INF +#if defined(CPPUTEST_NO_INF) +#define CPPUTEST_HAS_INF 0 +#else +#define CPPUTEST_HAS_INF 1 +#endif +#endif + #if defined(CPPUTEST_NO_NAN) #define CPPUTEST_HAS_NAN 0 #else diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index ce1484f6c..c9ed939e5 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -55,10 +55,6 @@ endif () add_executable(CppUTestTests ${CppUTestTests_src}) cpputest_normalize_test_output_location(CppUTestTests) target_link_libraries(CppUTestTests ${CppUTestLibName} ${THREAD_LIB}) -target_compile_definitions(CppUTestTests - PRIVATE - CPPUTEST_HAS_INF=$ -) if (TESTS_BUILD_DISCOVER) cpputest_buildtime_discover_tests(CppUTestTests) From 1efa7a151b647151cc1865b63aee828b52b7d141 Mon Sep 17 00:00:00 2001 From: offa Date: Fri, 19 Aug 2022 15:38:02 +0200 Subject: [PATCH 0767/1093] Move 'extern "C"' to header --- tests/CppUTestExt/IEEE754PluginTest.cpp | 5 +---- tests/CppUTestExt/IEEE754PluginTest_c.h | 8 ++++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index 6802dab37..2f745b065 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -34,10 +34,7 @@ #ifdef CPPUTEST_HAVE_FENV #if CPPUTEST_FENV_IS_WORKING_PROPERLY -extern "C" -{ - #include "IEEE754PluginTest_c.h" -} +#include "IEEE754PluginTest_c.h" TEST_GROUP(FE_with_Plugin) { diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.h b/tests/CppUTestExt/IEEE754PluginTest_c.h index 2f65ba7a5..8b56ff28f 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.h +++ b/tests/CppUTestExt/IEEE754PluginTest_c.h @@ -25,9 +25,17 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#ifdef __cplusplus +extern "C" { +#endif + void set_divisionbyzero_c(void); void set_overflow_c(void); void set_underflow_c(void); void set_inexact_c(void); void set_nothing_c(void); void set_everything_c(void); + +#ifdef __cplusplus +} +#endif From 18a43ddc3584477514c18eb2b4e4d2b880a504ab Mon Sep 17 00:00:00 2001 From: offa Date: Fri, 19 Aug 2022 15:39:22 +0200 Subject: [PATCH 0768/1093] Add missing include guards --- tests/CppUTest/DummyMemoryLeakDetector.h | 4 ++++ tests/CppUTestExt/IEEE754PluginTest_c.h | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/tests/CppUTest/DummyMemoryLeakDetector.h b/tests/CppUTest/DummyMemoryLeakDetector.h index a6c1932c9..093d0860f 100644 --- a/tests/CppUTest/DummyMemoryLeakDetector.h +++ b/tests/CppUTest/DummyMemoryLeakDetector.h @@ -25,6 +25,9 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#ifndef DUMMYMEMORYLEAKDETECTOR_H +#define DUMMYMEMORYLEAKDETECTOR_H + class DummyMemoryLeakDetector : public MemoryLeakDetector { public: @@ -49,3 +52,4 @@ class DummyMemoryLeakFailure : public MemoryLeakFailure static bool memoryLeakFailureWasDelete; }; +#endif /* DUMMYMEMORYLEAKDETECTOR_H */ diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.h b/tests/CppUTestExt/IEEE754PluginTest_c.h index 8b56ff28f..abe8817da 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.h +++ b/tests/CppUTestExt/IEEE754PluginTest_c.h @@ -25,6 +25,9 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#ifndef IEEE754PLUGINTEST_C_H +#define IEEE754PLUGINTEST_C_H + #ifdef __cplusplus extern "C" { #endif @@ -39,3 +42,5 @@ void set_everything_c(void); #ifdef __cplusplus } #endif + +#endif /* IEEE754PLUGINTEST_C_H */ From 8d24455f6d24b6d30810c73d56ee74dec4cdaf55 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 13 Jul 2022 19:40:51 -0700 Subject: [PATCH 0769/1093] Remove `-Weverything` flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > Since `-Weverything` enables every diagnostic, we generally don’t > recommend using it. `-Wall -Wextra` are a better choice for most projects. > Using `-Weverything` means that updating your compiler is more difficult > because you’re exposed to experimental diagnostics which might be of > lower quality than the default ones. https://clang.llvm.org/docs/UsersManual.html?highlight=weverything#diagnostics-enable-everything --- build/MakefileWorker.mk | 4 ++-- cmake/Modules/CppUTestWarningFlags.cmake | 1 - configure.ac | 7 ------- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index c883c000a..692c2c063 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -206,8 +206,8 @@ ifeq ($(COMPILER_NAME),$(CLANG_STR)) # -Wno-c++98-compat-pedantic -> Incompatibilities with C++98, these are happening through #define. # -Wno-reserved-id-macro -> Macro uses __ in MINGW... can't change that. # -Wno-keyword-macro -> new overload - CPPUTEST_CXX_WARNINGFLAGS += -Weverything -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables -Wno-old-style-cast -Wno-c++11-long-long -Wno-c++98-compat-pedantic -Wno-reserved-id-macro -Wno-keyword-macro - CPPUTEST_C_WARNINGFLAGS += -Weverything -Wno-padded + CPPUTEST_CXX_WARNINGFLAGS += -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables -Wno-old-style-cast -Wno-c++11-long-long -Wno-c++98-compat-pedantic -Wno-reserved-id-macro -Wno-keyword-macro + CPPUTEST_C_WARNINGFLAGS += -Wno-padded # Clang 7 and 12 introduced new warnings by default that don't exist on previous versions of clang and cause errors when present. CLANG_VERSION := $(shell echo $(CC_VERSION_OUTPUT) | sed -n 's/.* \([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p') diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index 3b8f2d7f2..b94c007f1 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -29,7 +29,6 @@ else (MSVC) endif (NOT GMOCK AND NOT REAL_GTEST) set(WARNING_C_FLAGS - Weverything Wall Wextra pedantic diff --git a/configure.ac b/configure.ac index 7447dc543..cd4089e4e 100644 --- a/configure.ac +++ b/configure.ac @@ -178,13 +178,6 @@ CFLAGS="$saved_cflags" ##################################################################################### -##### More of these warnings -# FLag -Weverything. -CFLAGS="-Werror -Weverything -Wno-unused-macros" -AC_MSG_CHECKING([whether CC and CXX supports -Weverything]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Weverything"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Weverything" ], [AC_MSG_RESULT([no])]) -CFLAGS="$saved_cflags" - # FLag -Wall. CFLAGS="-Werror -Wall" AC_MSG_CHECKING([whether CC and CXX supports -Wall]) From 4970bcf25f51e2c3ea0c487ec5b9d41680e68b12 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 13 May 2022 19:21:36 -0700 Subject: [PATCH 0770/1093] Detect absence of fenv.h in CMake --- CMakeLists.txt | 5 ++--- config.h.cmake | 2 +- examples/AllTests/FEDemoTest.cpp | 2 +- include/CppUTest/CppUTestConfig.h | 17 ++++++++++------- src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 2 +- tests/CppUTestExt/IEEE754PluginTest.cpp | 2 +- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 78742528a..d3e9eccc8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,12 +85,11 @@ enable_testing() add_subdirectory(src/CppUTest) -include(CheckIncludeFileCXX) -check_include_file_cxx("fenv.h" CPPUTEST_HAVE_FENV) - # Check for functions before setting a lot of stuff include(CheckFunctionExists) +include(CheckCXXSymbolExists) include(CheckSymbolExists) +check_cxx_symbol_exists(FE_DIVBYZERO "fenv.h" CPPUTEST_HAVE_FENV) set (CMAKE_REQUIRED_INCLUDES "unistd.h") check_symbol_exists(fork "unistd.h" HAVE_FORK) if(HAVE_FORK) diff --git a/config.h.cmake b/config.h.cmake index 9da13830e..f0f575c4f 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -5,8 +5,8 @@ #cmakedefine CPPUTEST_USE_LONG_LONG #cmakedefine CPPUTEST_HAVE_LONG_LONG_INT -#cmakedefine CPPUTEST_HAVE_FENV #cmakedefine01 CPPUTEST_HAS_INF +#cmakedefine01 CPPUTEST_HAVE_FENV #cmakedefine CPPUTEST_NO_NAN #cmakedefine CPPUTEST_STD_C_LIB_DISABLED diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index 8737ca9a4..35ccd8551 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -29,7 +29,7 @@ #include "CppUTest/TestHarness.h" #include "CppUTest/TestRegistry.h" -#ifdef CPPUTEST_HAVE_FENV +#if CPPUTEST_HAVE_FENV #include "CppUTestExt/IEEE754ExceptionsPlugin.h" /* diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index a536d5b1d..7ee9040c8 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -212,15 +212,18 @@ * Handling of IEEE754 floating point exceptions via fenv.h * Predominantly works on non-Visual C++ compilers and Visual C++ 2008 and newer */ - -#if !defined(CPPUTEST_HAVE_FENV) && CPPUTEST_USE_STD_C_LIB && \ - (!defined(_MSC_VER) || (_MSC_VER >= 1800)) && \ - (!defined(__APPLE__)) && \ - (!defined(__ghs__) || !defined(__ColdFire__)) && (!defined(__BCPLUSPLUS__)) -#define CPPUTEST_HAVE_FENV +#ifndef CPPUTEST_HAVE_FENV + #if CPPUTEST_USE_STD_C_LIB && \ + (!defined(_MSC_VER) || (_MSC_VER >= 1800)) && \ + (!defined(__APPLE__)) && \ + (!defined(__ghs__) || !defined(__ColdFire__)) && (!defined(__BCPLUSPLUS__)) + #define CPPUTEST_HAVE_FENV 1 + #else + #define CPPUTEST_HAVE_FENV 0 + #endif #endif -#ifdef CPPUTEST_HAVE_FENV +#if CPPUTEST_HAVE_FENV #if defined(__WATCOMC__) || defined(__ARMEL__) || defined(__m68k__) #define CPPUTEST_FENV_IS_WORKING_PROPERLY 0 #else diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index c2815a3ad..98f769a4a 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -28,7 +28,7 @@ #include "CppUTest/TestHarness.h" #include "CppUTestExt/IEEE754ExceptionsPlugin.h" -#ifdef CPPUTEST_HAVE_FENV +#if CPPUTEST_HAVE_FENV extern "C" { #include diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index 6802dab37..8b488c141 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -31,7 +31,7 @@ #include "CppUTest/TestTestingFixture.h" #include "CppUTestExt/IEEE754ExceptionsPlugin.h" -#ifdef CPPUTEST_HAVE_FENV +#if CPPUTEST_HAVE_FENV #if CPPUTEST_FENV_IS_WORKING_PROPERLY extern "C" From 885f6876f1ee6855e7386b94c3e23d727c42dc70 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 16 May 2022 20:33:49 -0700 Subject: [PATCH 0771/1093] Introduce CPPUTEST_FENV_DISABLED macro --- include/CppUTest/CppUTestConfig.h | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 7ee9040c8..6b7e6c67b 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -212,14 +212,21 @@ * Handling of IEEE754 floating point exceptions via fenv.h * Predominantly works on non-Visual C++ compilers and Visual C++ 2008 and newer */ +#ifndef CPPUTEST_FENV_DISABLED + #if !CPPUTEST_USE_STD_C_LIB || \ + (defined(_MSC_VER) && (_MSC_VER < 1800)) || \ + defined(__APPLE__) || \ + (defined(__ghs__) && defined(__ColdFire__)) || \ + defined(__BCPLUSPLUS__) + #define CPPUTEST_FENV_DISABLED + #endif +#endif + #ifndef CPPUTEST_HAVE_FENV - #if CPPUTEST_USE_STD_C_LIB && \ - (!defined(_MSC_VER) || (_MSC_VER >= 1800)) && \ - (!defined(__APPLE__)) && \ - (!defined(__ghs__) || !defined(__ColdFire__)) && (!defined(__BCPLUSPLUS__)) - #define CPPUTEST_HAVE_FENV 1 - #else + #ifdef CPPUTEST_FENV_DISABLED #define CPPUTEST_HAVE_FENV 0 + #else + #define CPPUTEST_HAVE_FENV 1 #endif #endif From fbb8526750aa370e642da7c21a98d6efdf7a3f37 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 14 May 2022 11:30:00 -0700 Subject: [PATCH 0772/1093] Check for NAN in CMake --- CMakeLists.txt | 17 +++++++++++++++-- .../Modules/CppUTestConfigurationOptions.cmake | 5 ----- config.h.cmake | 2 +- include/CppUTest/CppUTestConfig.h | 2 ++ 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 78742528a..a08020502 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ # 2.6.3 is needed for ctest support # 3.1 is needed for target_sources -cmake_minimum_required(VERSION 3.1) +# 3.8 is needed for try_compile improvements (CMP0067) +cmake_minimum_required(VERSION 3.8) project(CppUTest) @@ -39,7 +40,6 @@ option(LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library option(LIBNAME_POSTFIX_DEBUG "Add indication of debug compilation to the library name?" OFF) option(HAS_INF "Compiler has Inf value for float" ON) -option(HAS_NAN "Compiler has NaN value for float" ON) if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) # Don't change users' build type. # Multi-configuration generators don't have a single build type. @@ -124,6 +124,19 @@ if(HAVE_PTHREAD_MUTEX_LOCK) ) endif(HAVE_PTHREAD_MUTEX_LOCK) +if(DEFINED HAS_NAN) + message(DEPRECATION + "The HAS_NAN cache variable has been deprecated. " + "CPPUTEST_HAS_NAN is assessed automatically, " + "but can be assigned manually." + ) + set(CPPUTEST_HAS_NAN ${HAS_NAN}) +endif() +if(NOT DEFINED CPPUTEST_HAS_NAN) + include(CheckCXXSymbolExists) + check_cxx_symbol_exists(NAN "math.h" CPPUTEST_HAS_NAN) +endif() + if (NOT IAR) check_function_exists(strdup HAVE_STRDUP) if(HAVE_STRDUP) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 822997ec4..b29f446a7 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -17,7 +17,6 @@ elseif (BORLAND) set(MEMORY_LEAK_DETECTION OFF) set(LONGLONG OFF) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") - set(HAS_NAN OFF) elseif (STD_C) if(NOT CPP_PLATFORM) set(CPP_PLATFORM Gcc) @@ -63,10 +62,6 @@ if (LONGLONG) set(CPPUTEST_USE_LONG_LONG 1) endif (LONGLONG) -if (NOT HAS_NAN) - set(CPPUTEST_NO_NAN 1) -endif (NOT HAS_NAN) - if (MAP_FILE AND NOT MSVC) set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -Wl,-Map,$<.map.txt") endif (MAP_FILE AND NOT MSVC) diff --git a/config.h.cmake b/config.h.cmake index 9da13830e..a55bdfba4 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -7,7 +7,7 @@ #cmakedefine CPPUTEST_HAVE_FENV #cmakedefine01 CPPUTEST_HAS_INF -#cmakedefine CPPUTEST_NO_NAN +#cmakedefine01 CPPUTEST_HAS_NAN #cmakedefine CPPUTEST_STD_C_LIB_DISABLED #cmakedefine CPPUTEST_STD_CPP_LIB_DISABLED diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index a536d5b1d..ae0dabbcb 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -347,11 +347,13 @@ typedef struct cpputest_ulonglong cpputest_ulonglong; #endif #endif +#ifndef CPPUTEST_HAS_NAN #if defined(CPPUTEST_NO_NAN) #define CPPUTEST_HAS_NAN 0 #else #define CPPUTEST_HAS_NAN 1 #endif +#endif #endif From 077848e8927e19c58ce1c6c4cb2de6fe711f9388 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 16:33:56 -0700 Subject: [PATCH 0773/1093] Delete removed INF option --- CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a08020502..d839053b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,8 +39,6 @@ option(VERBOSE_CONFIG "Print configuration to stdout during generation" ON) option(LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" OFF) option(LIBNAME_POSTFIX_DEBUG "Add indication of debug compilation to the library name?" OFF) -option(HAS_INF "Compiler has Inf value for float" ON) - if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) # Don't change users' build type. # Multi-configuration generators don't have a single build type. get_property( From 9fa075dcd0af9f93c8b9afba92413bd3b97bec79 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 22 May 2022 22:12:15 -0700 Subject: [PATCH 0774/1093] Support test discovery when cross-compiling --- cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake | 7 ++++++- cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake index 49b297319..14de2a1a6 100644 --- a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake +++ b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake @@ -11,7 +11,12 @@ function (cpputest_buildtime_discover_tests EXECUTABLE) add_custom_command (TARGET ${EXECUTABLE} POST_BUILD - COMMAND ${CMAKE_COMMAND} -DTESTS_DETAILED:BOOL=${TESTS_DETAILED} -DEXECUTABLE=$ -P ${DISCOVER_SCRIPT} + COMMAND + ${CMAKE_COMMAND} + -D "TESTS_DETAILED:BOOL=${TESTS_DETAILED}" + -D "EXECUTABLE=$" + -D "EMULATOR=$" + -P "${DISCOVER_SCRIPT}" VERBATIM WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Discovering Tests in ${EXECUTABLE}" diff --git a/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake b/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake index 01eb45b3c..f31cc3bb3 100644 --- a/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake +++ b/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake @@ -41,7 +41,7 @@ function (JOIN VALUES GLUE OUTPUT) endfunction() function (buildtime_discover_tests EXECUTABLE DISCOVER_ARG OUTPUT) - execute_process(COMMAND ${EXECUTABLE} ${DISCOVER_ARG} + execute_process(COMMAND ${EMULATOR} ${EXECUTABLE} ${DISCOVER_ARG} OUTPUT_VARIABLE _TMP_OUTPUT ERROR_VARIABLE DISCOVER_ERR RESULT_VARIABLE DISCOVER_ERR) From f564a0f4878d371f07141410224130f082c8f38a Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 4 Jun 2022 13:14:31 -0700 Subject: [PATCH 0775/1093] Run tests with emulator --- cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake b/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake index f31cc3bb3..c5d96c031 100644 --- a/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake +++ b/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake @@ -75,14 +75,14 @@ if (TESTS_DETAILED) set(lastgroup "${groupname}") endif (NOT ("${groupname}" STREQUAL "${lastgroup}")) message("... ${testname}") - buildtime_add_test(${EXECUTABLE_SHORT_NAME}.${testfullname} ${EXECUTABLE} -sg ${groupname} -sn ${testname}) + buildtime_add_test(${EXECUTABLE_SHORT_NAME}.${testfullname} ${EMULATOR} ${EXECUTABLE} -sg ${groupname} -sn ${testname}) endforeach() else (TESTS_DETAILED) set(DISCOVER_ARG "-lg") buildtime_discover_tests("${EXECUTABLE}" "${DISCOVER_ARG}" TestList_Groups) foreach(group ${TestList_Groups}) message("TestGroup: ${group}") - buildtime_add_test(${EXECUTABLE_SHORT_NAME}.${group} "${EXECUTABLE}" -sg ${group}) + buildtime_add_test(${EXECUTABLE_SHORT_NAME}.${group} ${EMULATOR} "${EXECUTABLE}" -sg ${group}) endforeach() endif (TESTS_DETAILED) From 745376bc5115f502c98d735fdc16468c8bff5204 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 4 Jun 2022 14:46:44 -0700 Subject: [PATCH 0776/1093] Cleanup discovery module --- .../CppUTestBuildTimeDiscoverTests.cmake | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake index 14de2a1a6..56c586452 100644 --- a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake +++ b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake @@ -1,24 +1,17 @@ -# Create target to discover tests -function (cpputest_buildtime_discover_tests EXECUTABLE) - # The path to the discover script depends on execution mode: - # - internal (building CppUTest it self). - # - imported (installed, imported, and executed by a client of the CppUTest lib) - if (PROJECT_NAME STREQUAL "CppUTest") # internal - (path is relative to source dir) - SET(DISCOVER_SCRIPT ${PROJECT_SOURCE_DIR}/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake) - else (PROJECT_NAME STREQUAL "CppUTest") # Installed (path is relative to install directory) - SET(DISCOVER_SCRIPT ${CppUTest_DIR}/Scripts/CppUTestBuildTimeDiscoverTests.cmake) - endif (PROJECT_NAME STREQUAL "CppUTest") +set(_DISCOVER_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/../Scripts/CppUTestBuildTimeDiscoverTests.cmake") - add_custom_command (TARGET ${EXECUTABLE} - POST_BUILD +# Create target to discover tests +function (cpputest_buildtime_discover_tests tgt) + add_custom_command( + TARGET ${tgt} POST_BUILD COMMAND ${CMAKE_COMMAND} -D "TESTS_DETAILED:BOOL=${TESTS_DETAILED}" - -D "EXECUTABLE=$" - -D "EMULATOR=$" - -P "${DISCOVER_SCRIPT}" - VERBATIM + -D "EXECUTABLE=$" + -D "EMULATOR=$" + -P "${_DISCOVER_SCRIPT}" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - COMMENT "Discovering Tests in ${EXECUTABLE}" - VERBATIM) + COMMENT "Discovering Tests in ${tgt}" + VERBATIM + ) endfunction () From 993777e03c27f3d2ec95b4a38d1e0c80a66f8e2b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 9 Jul 2022 17:08:42 -0700 Subject: [PATCH 0777/1093] Demonstrate emulation in CI --- .github/workflows/extended.yml | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 8351252ba..9f42e32e7 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -73,4 +73,26 @@ jobs: - name: Test env: TERM: linux - run: $CPPUTEST_HOME/platforms/Dos/alltests.sh \ No newline at end of file + run: $CPPUTEST_HOME/platforms/Dos/alltests.sh + + cmake_wine: + runs-on: ubuntu-latest + env: + CC: x86_64-w64-mingw32-gcc + CXX: x86_64-w64-mingw32-g++ + steps: + - name: Install tools + run: sudo apt-get install -y mingw-w64 wine64 + - name: Checkout + uses: actions/checkout@main + - name: Configure + run: > + cmake + -B build + -S . + -D CMAKE_SYSTEM_NAME=Windows + -D CMAKE_CROSSCOMPILING_EMULATOR=wine + - name: Build + run: cmake --build build --verbose + - name: Test + run: ctest --test-dir build From 7203c2a2d3f497454759853fa92b4e61d489c6e7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 20 Aug 2022 12:30:14 -0700 Subject: [PATCH 0778/1093] Add an XCode build --- .github/workflows/basic.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 76267f551..858eed431 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -84,6 +84,8 @@ jobs: cxx: g++ cc: gcc # Mac OSX + - os: macos-latest + cpp_version: 98 - os: macos-latest cpp_version: 17 cxx: clang++ From 4c14392a94a17a89f66c9519e05b97e7110cda86 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 9 Jul 2022 18:09:52 -0700 Subject: [PATCH 0779/1093] Restore -Werror to CI builds --- .github/workflows/basic.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 858eed431..71fe5d9c8 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -103,9 +103,14 @@ jobs: - if: ${{ matrix.cc }} run: echo "CC=${{ matrix.cc }}" >> $GITHUB_ENV - name: Configure - run: cmake -B build -S . -DCMAKE_CXX_STANDARD=${{ matrix.cpp_version }} + run: > + cmake + -B build + -S . + -D CMAKE_CXX_STANDARD=${{ matrix.cpp_version }} + -D WERROR=ON if: ${{ matrix.cpp_version }} - name: Build - run: cmake --build build + run: cmake --build build --verbose - name: Test run: ctest --test-dir build From 73e0bdcf7097f1530f33d05e63f222f3143f8aea Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 14 May 2022 13:22:56 -0700 Subject: [PATCH 0780/1093] Leverage native project versioning --- CMakeLists.txt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 78742528a..d0d71c65c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,10 +2,9 @@ # 3.1 is needed for target_sources cmake_minimum_required(VERSION 3.1) -project(CppUTest) - -set(CppUTest_version_major 4) -set(CppUTest_version_minor 0) +project(CppUTest + VERSION 4.0 +) ############### # Conan support @@ -211,7 +210,7 @@ set (prefix "${CMAKE_INSTALL_PREFIX}") set (exec_prefix "\${prefix}") set (libdir "\${exec_prefix}/${LIB_INSTALL_DIR}") set (includedir "\${prefix}/${INCLUDE_INSTALL_DIR}") -set (PACKAGE_VERSION "${CppUTest_version_major}.${CppUTest_version_minor}") +set (PACKAGE_VERSION "${PROJECT_VERSION}") configure_file (cpputest.pc.in ${CMAKE_CURRENT_BINARY_DIR}/${CppUTest_PKGCONFIG_FILE} @ONLY) @@ -235,7 +234,7 @@ if(PkgHelpers_AVAILABLE) PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake - VERSION ${CppUTest_version_major}.${CppUTest_version_minor} + VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake @@ -259,7 +258,7 @@ if(PkgHelpers_AVAILABLE) endif() write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfigVersion.cmake - VERSION ${CppUTest_version_major}.${CppUTest_version_minor} + VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion ) set(CppUTest_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE PATH "The directory containing a CMake configuration file for CppUTest.") else() @@ -271,7 +270,7 @@ endif() if(VERBOSE_CONFIG) message(" ------------------------------------------------------- -CppUTest Version ${CppUTest_version_major}.${CppUTest_version_minor} +CppUTest Version ${PROJECT_VERSION} Current compiler options: CC: ${CMAKE_C_COMPILER} From 7ee452f1c6b2af77a8348c3653032185fbd97477 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 14 May 2022 13:42:03 -0700 Subject: [PATCH 0781/1093] Remove unecessary custom C++11 logic Users can/should just set `CMAKE_CXX_STANDARD`. --- .github/workflows/extended.yml | 2 +- CMakeLists.txt | 2 - .../CppUTestConfigurationOptions.cmake | 12 +++-- cmake/Modules/CppUTestWarningFlags.cmake | 2 +- cmake/Modules/FindCXX11.cmake | 54 ------------------- 5 files changed, 9 insertions(+), 63 deletions(-) delete mode 100644 cmake/Modules/FindCXX11.cmake diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 9f42e32e7..93f1aef9a 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -36,7 +36,7 @@ jobs: -S . -B cpputest_build -D CMAKE_BUILD_TYPE=Debug - -D C++11=ON + -D CMAKE_CXX_STANDARD=11 -D COVERAGE=ON -D LONGLONG=ON - name: Build diff --git a/CMakeLists.txt b/CMakeLists.txt index bfee2403f..00dc24a33 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,6 @@ option(EXTENSIONS "Use the CppUTest extension library" ON) option(LONGLONG "Support long long" OFF) option(MAP_FILE "Enable the creation of a map file" OFF) option(COVERAGE "Enable running with coverage" OFF) -option(C++11 "Compile with C++11 support" OFF) option(WERROR "Compile with warnings as errors" OFF) option(TESTS "Compile and make tests for the code?" ON) @@ -297,7 +296,6 @@ Features configured in CppUTest: Using Standard C library: ${STD_C} Using Standard C++ library: ${STD_CPP} - Using C++11 library: ${C++11} Generating map file: ${MAP_FILE} Compiling with coverage: ${COVERAGE} diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index b29f446a7..0d68e8499 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -87,13 +87,15 @@ endif() if (CMAKE_CXX_STANDARD) set(CMAKE_CXX_EXTENSIONS OFF) -elseif (C++11) - find_package(CXX11 REQUIRED) - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} ${CXX11_FLAGS}") -else() - # No standard specified endif () +if(DEFINED C++11) + message(WARNING + "The C++11 option is no longer supported. " + "Set the CMAKE_CXX_STANDARD explicitly." + ) +endif() + set(GMOCK_HOME $ENV{GMOCK_HOME}) if (DEFINED ENV{GMOCK_HOME}) # GMock pulls in gtest. diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index b94c007f1..e21f0a727 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -62,7 +62,7 @@ else (MSVC) Wno-old-style-cast ) - if (C++11 OR (DEFINED CMAKE_CXX_STANDARD AND NOT CMAKE_CXX_STANDARD EQUAL 98)) + if (DEFINED CMAKE_CXX_STANDARD AND NOT CMAKE_CXX_STANDARD EQUAL 98) set(WARNING_CXX_FLAGS ${WARNING_CXX_FLAGS} Wno-c++98-compat diff --git a/cmake/Modules/FindCXX11.cmake b/cmake/Modules/FindCXX11.cmake deleted file mode 100644 index 8718ec107..000000000 --- a/cmake/Modules/FindCXX11.cmake +++ /dev/null @@ -1,54 +0,0 @@ -# - Finds if the compiler has C++11 support -# This module can be used to detect compiler flags for using C++11, and checks -# a small subset of the language. -# -# The following variables are set: -# CXX11_FLAGS - flags to add to the CXX compiler for C++11 support -# CXX11_FOUND - true if the compiler supports C++11 -# -# TODO: When compilers starts implementing the whole C++11, check the full set - -include(CheckCXXSourceCompiles) -include(FindPackageHandleStandardArgs) - -set(CXX11_FLAG_CANDIDATES - # Eveerything that automatically accepts C++11 - " " - # gcc, clang and Intel Linux - "-std=c++11" - # Intel windows - "/Qstd=c++0x" - "/Qstd=c++11" - ) - -set(CXX11_TEST_SOURCE -" -#if defined(_MSC_VER) - #if _MSC_VER < 1800 - #error \"Can not compile with C++11\" - #endif -#elif __cplusplus < 201103L - #error \"Can not compile with C++11\" -#endif - -int main() -{} -") - -foreach(FLAG ${CXX11_FLAG_CANDIDATES}) - set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") - set(CMAKE_REQUIRED_FLAGS "${FLAG}") - unset(CXX11_FLAG_DETECTED CACHE) - message(STATUS "Try C++11 flag = [${FLAG}]") - check_cxx_source_compiles("${CXX11_TEST_SOURCE}" CXX11_FLAG_DETECTED) - set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}") - if(CXX11_FLAG_DETECTED) - set(CXX11_FLAGS_INTERNAL "${FLAG}") - break() - endif(CXX11_FLAG_DETECTED) -endforeach(FLAG ${CXX11_FLAG_CANDIDATES}) - -set(CXX11_FLAGS "${CXX11_FLAGS_INTERNAL}") - -find_package_handle_standard_args(CXX11 DEFAULT_MSG CXX11_FLAGS) -mark_as_advanced(CXX11_FLAGS) From 5e63012ea3256ce731e2ea0db7abaf19730c3032 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 14 May 2022 14:24:53 -0700 Subject: [PATCH 0782/1093] Make C++11 change backwards compatible --- .../Modules/CppUTestConfigurationOptions.cmake | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 0d68e8499..cb1ca3074 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -85,17 +85,20 @@ if (COVERAGE AND NOT MSVC) ) endif() -if (CMAKE_CXX_STANDARD) - set(CMAKE_CXX_EXTENSIONS OFF) -endif () - if(DEFINED C++11) - message(WARNING - "The C++11 option is no longer supported. " - "Set the CMAKE_CXX_STANDARD explicitly." + message(DEPRECATION + "The C++11 option is deprecated. " + "Set CMAKE_CXX_STANDARD explicitly." ) + if(C++11 AND NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 11) + endif() endif() +if (CMAKE_CXX_STANDARD) + set(CMAKE_CXX_EXTENSIONS OFF) +endif () + set(GMOCK_HOME $ENV{GMOCK_HOME}) if (DEFINED ENV{GMOCK_HOME}) # GMock pulls in gtest. From 7cb44b6c3b90d1f14458f5461523f452af0f9229 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 23 May 2022 20:24:37 -0700 Subject: [PATCH 0783/1093] Add error handling to discovery module --- .../CppUTestBuildTimeDiscoverTests.cmake | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake index 56c586452..7bd53fce2 100644 --- a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake +++ b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake @@ -2,6 +2,24 @@ set(_DISCOVER_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/../Scripts/CppUTestBuildTimeDisc # Create target to discover tests function (cpputest_buildtime_discover_tests tgt) + if(NOT TARGET ${tgt}) + message(FATAL_ERROR + "Cannot discover tests for target \"${tgt}\" " + "which is not built by this project." + ) + endif() + + get_property(target_type + TARGET ${tgt} + PROPERTY TYPE + ) + if(NOT target_type STREQUAL "EXECUTABLE") + message(FATAL_ERROR + "Cannot discover tests for target \"${tgt}\" " + "which is not an executable." + ) + endif() + add_custom_command( TARGET ${tgt} POST_BUILD COMMAND From be20ced2d3fff5872682056fe6961c0fe6faf559 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 13 May 2022 20:16:00 -0700 Subject: [PATCH 0784/1093] Simplify config macros --- CMakeLists.txt | 71 +++++++++++++------------------------------------- config.h.cmake | 7 +++++ 2 files changed, 25 insertions(+), 53 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bfee2403f..f6deb745d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,38 +87,10 @@ include(CheckFunctionExists) include(CheckCXXSymbolExists) include(CheckSymbolExists) check_cxx_symbol_exists(FE_DIVBYZERO "fenv.h" CPPUTEST_HAVE_FENV) -set (CMAKE_REQUIRED_INCLUDES "unistd.h") -check_symbol_exists(fork "unistd.h" HAVE_FORK) -if(HAVE_FORK) - target_compile_definitions(${CppUTestLibName} - PUBLIC - CPPUTEST_HAVE_FORK - ) -endif(HAVE_FORK) - -check_symbol_exists(waitpid "sys/wait.h" HAVE_WAITPID) -if(HAVE_WAITPID) - target_compile_definitions(${CppUTestLibName} - PUBLIC - CPPUTEST_HAVE_WAITPID - ) -endif(HAVE_WAITPID) - -check_symbol_exists(gettimeofday "sys/time.h" HAVE_GETTIMEOFDAY) -if(HAVE_GETTIMEOFDAY) - target_compile_definitions(${CppUTestLibName} - PUBLIC - CPPUTEST_HAVE_GETTIMEOFDAY=1 - ) -endif(HAVE_GETTIMEOFDAY) - -check_symbol_exists(pthread_mutex_lock "pthread.h" HAVE_PTHREAD_MUTEX_LOCK) -if(HAVE_PTHREAD_MUTEX_LOCK) - target_compile_definitions(${CppUTestLibName} - PUBLIC - CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK=1 - ) -endif(HAVE_PTHREAD_MUTEX_LOCK) +check_cxx_symbol_exists(fork "unistd.h" CPPUTEST_HAVE_FORK) +check_cxx_symbol_exists(waitpid "sys/wait.h" CPPUTEST_HAVE_WAITPID) +check_cxx_symbol_exists(gettimeofday "sys/time.h" CPPUTEST_HAVE_GETTIMEOFDAY) +check_cxx_symbol_exists(pthread_mutex_lock "pthread.h" CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK) if(DEFINED HAS_NAN) message(DEPRECATION @@ -129,18 +101,24 @@ if(DEFINED HAS_NAN) set(CPPUTEST_HAS_NAN ${HAS_NAN}) endif() if(NOT DEFINED CPPUTEST_HAS_NAN) - include(CheckCXXSymbolExists) check_cxx_symbol_exists(NAN "math.h" CPPUTEST_HAS_NAN) endif() +if(DEFINED HAS_INF) + message(DEPRECATION + "The HAS_INF cache variable has been deprecated. " + "CPPUTEST_HAS_INF is assessed automatically, " + "but can be assigned manually." + ) + set(CPPUTEST_HAS_INF ${HAS_INF}) +endif() +if(NOT DEFINED CPPUTEST_HAS_INF) + include(CheckCXXSymbolExists) + check_cxx_symbol_exists(INFINITY "math.h" CPPUTEST_HAS_INF) +endif() + if (NOT IAR) - check_function_exists(strdup HAVE_STRDUP) - if(HAVE_STRDUP) - target_compile_definitions(${CppUTestLibName} - PUBLIC - CPPUTEST_HAVE_STRDUP=1 - ) - endif(HAVE_STRDUP) + check_function_exists(strdup CPPUTEST_HAVE_STRDUP) endif(NOT IAR) if (MINGW) @@ -170,19 +148,6 @@ if(HAVE_SIZEOF_LONGLONG) set(CPPUTEST_HAVE_LONG_LONG_INT ON) endif() -if(DEFINED HAS_INF) - message(DEPRECATION - "The HAS_INF cache variable has been deprecated. " - "CPPUTEST_HAS_INF is assessed automatically, " - "but can be assigned manually." - ) - set(CPPUTEST_HAS_INF ${HAS_INF}) -endif() -if(NOT DEFINED CPPUTEST_HAS_INF) - include(CheckCXXSymbolExists) - check_cxx_symbol_exists(INFINITY "math.h" CPPUTEST_HAS_INF) -endif() - configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" "${PROJECT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" diff --git a/config.h.cmake b/config.h.cmake index e8d26ddcf..5fb80553e 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -4,6 +4,13 @@ #cmakedefine CPPUTEST_MEM_LEAK_DETECTION_DISABLED #cmakedefine CPPUTEST_USE_LONG_LONG #cmakedefine CPPUTEST_HAVE_LONG_LONG_INT +#cmakedefine CPPUTEST_HAVE_STRDUP + +#cmakedefine CPPUTEST_HAVE_FORK +#cmakedefine CPPUTEST_HAVE_WAITPID +#cmakedefine CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK + +#cmakedefine CPPUTEST_HAVE_GETTIMEOFDAY #cmakedefine01 CPPUTEST_HAS_INF #cmakedefine01 CPPUTEST_HAS_NAN From d5f36280848adb9120beb3ebaa04b62b2d94628c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 4 Jun 2022 12:32:38 -0700 Subject: [PATCH 0785/1093] simplify more --- CMakeLists.txt | 30 ++++++++++-------------------- config.h.cmake | 6 ++++++ 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f6deb745d..38ad6bde1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,10 +82,11 @@ enable_testing() add_subdirectory(src/CppUTest) -# Check for functions before setting a lot of stuff -include(CheckFunctionExists) +# Check for symbols before setting a lot of stuff include(CheckCXXSymbolExists) -include(CheckSymbolExists) +include(CheckTypeSize) +include(CheckStructHasMember) +set(CMAKE_REQUIRED_FLAGS ${CMAKE_CXX_FLAGS}) check_cxx_symbol_exists(FE_DIVBYZERO "fenv.h" CPPUTEST_HAVE_FENV) check_cxx_symbol_exists(fork "unistd.h" CPPUTEST_HAVE_FORK) check_cxx_symbol_exists(waitpid "sys/wait.h" CPPUTEST_HAVE_WAITPID) @@ -118,20 +119,15 @@ if(NOT DEFINED CPPUTEST_HAS_INF) endif() if (NOT IAR) - check_function_exists(strdup CPPUTEST_HAVE_STRDUP) + check_cxx_symbol_exists(strdup "string.h" CPPUTEST_HAVE_STRDUP) endif(NOT IAR) +check_type_size("long long" SIZEOF_LONGLONG LANGUAGE CXX) +if(HAVE_SIZEOF_LONGLONG) + set(CPPUTEST_HAVE_LONG_LONG_INT ON) +endif() if (MINGW) - # Apply workaround for MinGW timespec redefinition (pthread.h / time.h) - include(CheckStructHasMember) - check_struct_has_member("struct timespec" tv_sec time.h HAVE_STRUCT_TIMESPEC) - if (HAVE_STRUCT_TIMESPEC) - target_compile_definitions(${CppUTestLibName} - PUBLIC - _TIMESPEC_DEFINED=1 - ) - endif() - + check_struct_has_member("struct timespec" tv_sec time.h CPPUTEST_HAVE_STRUCT_TIMESPEC LANGUAGE CXX) if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") # Apply workaround for static/shared libraries on MinGW C/C++ compiler # Issue occurs with CMake >= 3.9.0, it doesn't filter out gcc,gcc_s,gcc_eh from @@ -142,12 +138,6 @@ if (MINGW) endif() endif() -include(CheckTypeSize) -check_type_size("long long" SIZEOF_LONGLONG) -if(HAVE_SIZEOF_LONGLONG) - set(CPPUTEST_HAVE_LONG_LONG_INT ON) -endif() - configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" "${PROJECT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" diff --git a/config.h.cmake b/config.h.cmake index 5fb80553e..f8c029aae 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -16,6 +16,12 @@ #cmakedefine01 CPPUTEST_HAS_NAN #cmakedefine01 CPPUTEST_HAVE_FENV +#cmakedefine CPPUTEST_HAVE_STRUCT_TIMESPEC +#ifdef CPPUTEST_HAVE_STRUCT_TIMESPEC +// Apply workaround for MinGW timespec redefinition (pthread.h / time.h) +#define _TIMESPEC_DEFINED 1 +#endif + #cmakedefine CPPUTEST_STD_C_LIB_DISABLED #cmakedefine CPPUTEST_STD_CPP_LIB_DISABLED From ee637dec09c4902b76aecb98b296ef1c3f58ffcf Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 24 Aug 2022 11:00:11 -0700 Subject: [PATCH 0786/1093] omit system header coverage --- .github/workflows/extended.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 93f1aef9a..dc9c6a700 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -44,7 +44,7 @@ jobs: - name: Test run: ctest --test-dir cpputest_build - name: Coverage - run: lcov --capture --directory . --output-file lcov.info + run: lcov --capture --directory . --no-external --output-file lcov.info - name: Coveralls uses: coverallsapp/github-action@master with: From 73b48dc59367b0f1cd34da284f3a05233e0213e3 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 26 Aug 2022 15:46:51 +0200 Subject: [PATCH 0787/1093] Ran the autoupdate tool to update the configure.ac --- configure.ac | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/configure.ac b/configure.ac index cd4089e4e..2b86025e5 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ -AC_PREREQ([2.68]) -AC_INIT([CppUTest], [4.0], [https://github.com/cpputest/cpputest]) +AC_PREREQ([2.71]) +AC_INIT([CppUTest],[4.0],[https://github.com/cpputest/cpputest]) AC_CONFIG_AUX_DIR([.]) AM_INIT_AUTOMAKE([subdir-objects]) AC_CONFIG_SRCDIR([src/CppUTest/Utest.cpp]) @@ -8,8 +8,11 @@ AC_CONFIG_HEADERS([config.h]) AX_PREFIX_CONFIG_H(generated/CppUTestGeneratedConfig.h) AC_CONFIG_FILES([cpputest.pc]) AC_CONFIG_MACRO_DIR([m4]) -AC_LIBTOOL_DLOPEN -AC_PROG_LIBTOOL +_LT_SET_OPTION([LT_INIT],[dlopen]) +m4_warn([obsolete],[AC_LIBTOOL_DLOPEN: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) + +LT_INIT AC_CANONICAL_HOST @@ -369,46 +372,46 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_LD_MAP_GEN LDFLAGS="$saved_ldflags" # Different features -AC_ARG_ENABLE([std-c], [AC_HELP_STRING([--disable-std-c], [disable the use of Standard C Library (warning: requires implementing Platforms/GccNoStdC) ])], +AC_ARG_ENABLE([std-c], [AS_HELP_STRING([--disable-std-c],[disable the use of Standard C Library (warning: requires implementing Platforms/GccNoStdC) ])], [use_std_c=${enableval}], [use_std_c=yes]) -AC_ARG_ENABLE([std-cpp], [AC_HELP_STRING([--disable-std-cpp], [disable the use of Standard C++ Library])], +AC_ARG_ENABLE([std-cpp], [AS_HELP_STRING([--disable-std-cpp],[disable the use of Standard C++ Library])], [use_std_cpp=${enableval}], [use_std_cpp=${default_use_std_cpp}]) -AC_ARG_ENABLE([std-cpp98], [AC_HELP_STRING([--enable-std-cpp98], [enable the use of Standard C++ 98 (if the compiler supports that)])], +AC_ARG_ENABLE([std-cpp98], [AS_HELP_STRING([--enable-std-cpp98],[enable the use of Standard C++ 98 (if the compiler supports that)])], [use_std_cpp98=${enableval}], [use_std_cpp98=no]) -AC_ARG_ENABLE([std-cpp11], [AC_HELP_STRING([--enable-std-cpp11], [enable the use of Standard C++ 11 (if the compiler supports that)])], +AC_ARG_ENABLE([std-cpp11], [AS_HELP_STRING([--enable-std-cpp11],[enable the use of Standard C++ 11 (if the compiler supports that)])], [use_std_cpp11=${enableval}], [use_std_cpp11=no]) -AC_ARG_ENABLE([std-cpp14], [AC_HELP_STRING([--enable-std-cpp14], [enable the use of Standard C++ 14 (if the compiler supports that)])], +AC_ARG_ENABLE([std-cpp14], [AS_HELP_STRING([--enable-std-cpp14],[enable the use of Standard C++ 14 (if the compiler supports that)])], [use_std_cpp14=${enableval}], [use_std_cpp14=no]) -AC_ARG_ENABLE([std-cpp17], [AC_HELP_STRING([--enable-std-cpp17], [enable the use of Standard C++ 17 (if the compiler supports that)])], +AC_ARG_ENABLE([std-cpp17], [AS_HELP_STRING([--enable-std-cpp17],[enable the use of Standard C++ 17 (if the compiler supports that)])], [use_std_cpp17=${enableval}], [use_std_cpp17=no]) -AC_ARG_ENABLE([std-cpp20], [AC_HELP_STRING([--enable-std-cpp20], [enable the use of Standard C++ 20 (if the compiler supports that)])], +AC_ARG_ENABLE([std-cpp20], [AS_HELP_STRING([--enable-std-cpp20],[enable the use of Standard C++ 20 (if the compiler supports that)])], [use_std_cpp20=${enableval}], [use_std_cpp20=no]) -AC_ARG_ENABLE([cpputest-flags], [AC_HELP_STRING([--disable-cpputest-flags], [disable CFLAGS/CPPFLAGS/CXXFLAGS set by CppUTest])], +AC_ARG_ENABLE([cpputest-flags], [AS_HELP_STRING([--disable-cpputest-flags],[disable CFLAGS/CPPFLAGS/CXXFLAGS set by CppUTest])], [cpputest_flags=${enableval}], [cpputest_flags=yes]) -AC_ARG_ENABLE([memory-leak-detection], [AC_HELP_STRING([--disable-memory-leak-detection], [disable memory leak detection])], +AC_ARG_ENABLE([memory-leak-detection], [AS_HELP_STRING([--disable-memory-leak-detection],[disable memory leak detection])], [memory_leak_detection=${enableval}], [memory_leak_detection=yes]) -AC_ARG_ENABLE([extensions], [AC_HELP_STRING([--disable-extensions], [disable CppUTest extension library])], +AC_ARG_ENABLE([extensions], [AS_HELP_STRING([--disable-extensions],[disable CppUTest extension library])], [cpputest_ext=${enableval}], [cpputest_ext=yes]) -AC_ARG_ENABLE([longlong], [AC_HELP_STRING([--disable-longlong], [disable support for long long type])], +AC_ARG_ENABLE([longlong], [AS_HELP_STRING([--disable-longlong],[disable support for long long type])], [use_longlong=${enableval}], [use_longlong=yes]) -AC_ARG_ENABLE([generate-map-file], [AC_HELP_STRING([--enable-generate-map-file], [enable the creation of a map file])], +AC_ARG_ENABLE([generate-map-file], [AS_HELP_STRING([--enable-generate-map-file],[enable the creation of a map file])], [generate_map_file=${enableval}], [generate_map_file=no]) -AC_ARG_ENABLE([coverage], [AC_HELP_STRING([--enable-coverage], [enable running with coverage])], +AC_ARG_ENABLE([coverage], [AS_HELP_STRING([--enable-coverage],[enable running with coverage])], [coverage=${enableval}], [coverage=no]) -AC_ARG_ENABLE([sanitize-address], [AC_HELP_STRING([--enable-sanitize-address], [enable running with address sanitizer])], +AC_ARG_ENABLE([sanitize-address], [AS_HELP_STRING([--enable-sanitize-address],[enable running with address sanitizer])], [sanitize_address=${enableval}], [sanitize_address=no]) ############################## Setting options ############################### From 767f897c586129cb449cb4758c9d286fd3742716 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 26 Aug 2022 15:52:25 +0200 Subject: [PATCH 0788/1093] Revert "Ran the autoupdate tool to update the configure.ac" This reverts commit 73b48dc59367b0f1cd34da284f3a05233e0213e3. --- configure.ac | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/configure.ac b/configure.ac index 2b86025e5..cd4089e4e 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ -AC_PREREQ([2.71]) -AC_INIT([CppUTest],[4.0],[https://github.com/cpputest/cpputest]) +AC_PREREQ([2.68]) +AC_INIT([CppUTest], [4.0], [https://github.com/cpputest/cpputest]) AC_CONFIG_AUX_DIR([.]) AM_INIT_AUTOMAKE([subdir-objects]) AC_CONFIG_SRCDIR([src/CppUTest/Utest.cpp]) @@ -8,11 +8,8 @@ AC_CONFIG_HEADERS([config.h]) AX_PREFIX_CONFIG_H(generated/CppUTestGeneratedConfig.h) AC_CONFIG_FILES([cpputest.pc]) AC_CONFIG_MACRO_DIR([m4]) -_LT_SET_OPTION([LT_INIT],[dlopen]) -m4_warn([obsolete],[AC_LIBTOOL_DLOPEN: Remove this warning and the call to _LT_SET_OPTION when you -put the 'dlopen' option into LT_INIT's first parameter.]) - -LT_INIT +AC_LIBTOOL_DLOPEN +AC_PROG_LIBTOOL AC_CANONICAL_HOST @@ -372,46 +369,46 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_LD_MAP_GEN LDFLAGS="$saved_ldflags" # Different features -AC_ARG_ENABLE([std-c], [AS_HELP_STRING([--disable-std-c],[disable the use of Standard C Library (warning: requires implementing Platforms/GccNoStdC) ])], +AC_ARG_ENABLE([std-c], [AC_HELP_STRING([--disable-std-c], [disable the use of Standard C Library (warning: requires implementing Platforms/GccNoStdC) ])], [use_std_c=${enableval}], [use_std_c=yes]) -AC_ARG_ENABLE([std-cpp], [AS_HELP_STRING([--disable-std-cpp],[disable the use of Standard C++ Library])], +AC_ARG_ENABLE([std-cpp], [AC_HELP_STRING([--disable-std-cpp], [disable the use of Standard C++ Library])], [use_std_cpp=${enableval}], [use_std_cpp=${default_use_std_cpp}]) -AC_ARG_ENABLE([std-cpp98], [AS_HELP_STRING([--enable-std-cpp98],[enable the use of Standard C++ 98 (if the compiler supports that)])], +AC_ARG_ENABLE([std-cpp98], [AC_HELP_STRING([--enable-std-cpp98], [enable the use of Standard C++ 98 (if the compiler supports that)])], [use_std_cpp98=${enableval}], [use_std_cpp98=no]) -AC_ARG_ENABLE([std-cpp11], [AS_HELP_STRING([--enable-std-cpp11],[enable the use of Standard C++ 11 (if the compiler supports that)])], +AC_ARG_ENABLE([std-cpp11], [AC_HELP_STRING([--enable-std-cpp11], [enable the use of Standard C++ 11 (if the compiler supports that)])], [use_std_cpp11=${enableval}], [use_std_cpp11=no]) -AC_ARG_ENABLE([std-cpp14], [AS_HELP_STRING([--enable-std-cpp14],[enable the use of Standard C++ 14 (if the compiler supports that)])], +AC_ARG_ENABLE([std-cpp14], [AC_HELP_STRING([--enable-std-cpp14], [enable the use of Standard C++ 14 (if the compiler supports that)])], [use_std_cpp14=${enableval}], [use_std_cpp14=no]) -AC_ARG_ENABLE([std-cpp17], [AS_HELP_STRING([--enable-std-cpp17],[enable the use of Standard C++ 17 (if the compiler supports that)])], +AC_ARG_ENABLE([std-cpp17], [AC_HELP_STRING([--enable-std-cpp17], [enable the use of Standard C++ 17 (if the compiler supports that)])], [use_std_cpp17=${enableval}], [use_std_cpp17=no]) -AC_ARG_ENABLE([std-cpp20], [AS_HELP_STRING([--enable-std-cpp20],[enable the use of Standard C++ 20 (if the compiler supports that)])], +AC_ARG_ENABLE([std-cpp20], [AC_HELP_STRING([--enable-std-cpp20], [enable the use of Standard C++ 20 (if the compiler supports that)])], [use_std_cpp20=${enableval}], [use_std_cpp20=no]) -AC_ARG_ENABLE([cpputest-flags], [AS_HELP_STRING([--disable-cpputest-flags],[disable CFLAGS/CPPFLAGS/CXXFLAGS set by CppUTest])], +AC_ARG_ENABLE([cpputest-flags], [AC_HELP_STRING([--disable-cpputest-flags], [disable CFLAGS/CPPFLAGS/CXXFLAGS set by CppUTest])], [cpputest_flags=${enableval}], [cpputest_flags=yes]) -AC_ARG_ENABLE([memory-leak-detection], [AS_HELP_STRING([--disable-memory-leak-detection],[disable memory leak detection])], +AC_ARG_ENABLE([memory-leak-detection], [AC_HELP_STRING([--disable-memory-leak-detection], [disable memory leak detection])], [memory_leak_detection=${enableval}], [memory_leak_detection=yes]) -AC_ARG_ENABLE([extensions], [AS_HELP_STRING([--disable-extensions],[disable CppUTest extension library])], +AC_ARG_ENABLE([extensions], [AC_HELP_STRING([--disable-extensions], [disable CppUTest extension library])], [cpputest_ext=${enableval}], [cpputest_ext=yes]) -AC_ARG_ENABLE([longlong], [AS_HELP_STRING([--disable-longlong],[disable support for long long type])], +AC_ARG_ENABLE([longlong], [AC_HELP_STRING([--disable-longlong], [disable support for long long type])], [use_longlong=${enableval}], [use_longlong=yes]) -AC_ARG_ENABLE([generate-map-file], [AS_HELP_STRING([--enable-generate-map-file],[enable the creation of a map file])], +AC_ARG_ENABLE([generate-map-file], [AC_HELP_STRING([--enable-generate-map-file], [enable the creation of a map file])], [generate_map_file=${enableval}], [generate_map_file=no]) -AC_ARG_ENABLE([coverage], [AS_HELP_STRING([--enable-coverage],[enable running with coverage])], +AC_ARG_ENABLE([coverage], [AC_HELP_STRING([--enable-coverage], [enable running with coverage])], [coverage=${enableval}], [coverage=no]) -AC_ARG_ENABLE([sanitize-address], [AS_HELP_STRING([--enable-sanitize-address],[enable running with address sanitizer])], +AC_ARG_ENABLE([sanitize-address], [AC_HELP_STRING([--enable-sanitize-address], [enable running with address sanitizer])], [sanitize_address=${enableval}], [sanitize_address=no]) ############################## Setting options ############################### From 2f2632f949ead1940ff4bae34644a8d10125daec Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 26 Aug 2022 16:02:17 +0200 Subject: [PATCH 0789/1093] Fixed separate process termination signal --- tests/CppUTest/UtestTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index b346fe228..06737aa64 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -397,8 +397,8 @@ TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) fixture.runAllTests(); fixture.assertPrintContains("Failed in separate process - killed by signal"); - /* Signal 11 usually happens, but with clang3.7 on Linux, it produced signal 4 */ - CHECK(fixture.getOutput().contains("signal 11") || fixture.getOutput().contains("signal 4")); + /* Signal 11 usually happens, but with clang3.7 on Linux, it produced signal 4. Mac now produces signal 5 */ + CHECK(fixture.getOutput().contains("signal 11") || fixture.getOutput().contains("signal 4") || fixture.getOutput().contains("signal 5")); } #endif From 52949320d24d61792084a5fed0cc6c8a01fc400c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 26 Aug 2022 16:10:14 +0200 Subject: [PATCH 0790/1093] Commented out the running of the circleCI for now --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5b5a1c581..0e447d44b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,7 +10,7 @@ jobs: CPPUTEST_BUILD_DIR: ./cpputest_build steps: - checkout - - run: mkdir -p $CPPUTEST_BUILD_DIR && cd $CPPUTEST_BUILD_DIR && ../scripts/travis_ci_build.sh +# - run: mkdir -p $CPPUTEST_BUILD_DIR && cd $CPPUTEST_BUILD_DIR && ../scripts/travis_ci_build.sh workflows: basic-build-and-test: From 02805c91eabbaafd784c2eeeb6901ce06d7bbb00 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 24 Aug 2022 12:48:12 -0700 Subject: [PATCH 0791/1093] Install in CI --- .github/workflows/extended.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index dc9c6a700..1dc1d3077 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -96,3 +96,15 @@ jobs: run: cmake --build build --verbose - name: Test run: ctest --test-dir build + + cmake_install: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@main + - name: Install + run: | + cmake -B cpputest_build/ -S . -DCMAKE_BUILD_TYPE=RelWithDebInfo + cmake --build cpputest_build/ -j + ctest --test-dir cpputest_build/ + sudo cmake --install cpputest_build/ From e6bed39a8b33dbb28b922a69c3fef1866d809367 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 24 Aug 2022 12:52:02 -0700 Subject: [PATCH 0792/1093] Test install in CI --- .github/workflows/extended.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 1dc1d3077..af9085bb5 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -108,3 +108,8 @@ jobs: cmake --build cpputest_build/ -j ctest --test-dir cpputest_build/ sudo cmake --install cpputest_build/ + - name: Use + run: | + cmake -B build -S examples + cmake --build build -j + ctest --test-dir build From fc90059228786911da628a0e03bb9fe4a757ca44 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 24 Aug 2022 12:59:46 -0700 Subject: [PATCH 0793/1093] Make examples a CMake project --- examples/AllTests/CMakeLists.txt | 11 ++++++++--- examples/CMakeLists.txt | 18 ++++++++++++++++++ src/CppUTest/CMakeLists.txt | 3 +++ src/CppUTestExt/CMakeLists.txt | 3 +++ 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/examples/AllTests/CMakeLists.txt b/examples/AllTests/CMakeLists.txt index 07d04e691..603bb7a1e 100644 --- a/examples/AllTests/CMakeLists.txt +++ b/examples/AllTests/CMakeLists.txt @@ -10,9 +10,14 @@ add_executable(ExampleTests target_include_directories(ExampleTests PRIVATE - ../ApplicationLib + . ) -cpputest_normalize_test_output_location(ExampleTests) -target_link_libraries(ExampleTests ApplicationLib ${CppUTestLibName} ${CppUTestExtLibName}) +target_link_libraries(ExampleTests + PRIVATE + ApplicationLib + CppUTest::CppUTestExt +) + +include(CppUTestBuildTimeDiscoverTests) cpputest_buildtime_discover_tests(ExampleTests) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index d4b547439..5f443c803 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,2 +1,20 @@ +cmake_minimum_required(VERSION 3.8) + +project(CppUTestExample) + +if (CMAKE_VERSION GREATER_EQUAL "3.21") + # PROJECT_IS_TOP_LEVEL is defined automatically +elseif(CMAKE_CURRENT_BINARY_DIR STREQUAL CMAKE_BINARY_DIR) + set(PROJECT_IS_TOP_LEVEL TRUE) +else() + set(PROJECT_IS_TOP_LEVEL FALSE) +endif() + +if(PROJECT_IS_TOP_LEVEL) + find_package(CppUTest 4.0 REQUIRED) +endif() + +include(CTest) + add_subdirectory(AllTests) add_subdirectory(ApplicationLib) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 955e5d3fc..70af5572c 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -79,6 +79,9 @@ set_target_properties(${CppUTestLibName} PROPERTIES if (WIN32) target_link_libraries(${CppUTestLibName} winmm) endif (WIN32) + +add_library(CppUTest::CppUTest ALIAS ${CppUTestLibName}) + install(TARGETS ${CppUTestLibName} EXPORT CppUTestTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index 0cd5850b8..d875bcf01 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -58,6 +58,9 @@ target_include_directories(${CppUTestExtLibName} set_target_properties(${CppUTestExtLibName} PROPERTIES PUBLIC_HEADER "${CppUTestExt_headers}") + +add_library(CppUTest::CppUTestExt ALIAS ${CppUTestExtLibName}) + install(TARGETS ${CppUTestExtLibName} EXPORT CppUTestTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} From 834f76264d9702d6bf1e241ad90a39ee3831b924 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 31 Aug 2022 13:12:02 -0700 Subject: [PATCH 0794/1093] Add CMake modules to path --- CppUTestConfig.cmake.install.in | 1 + 1 file changed, 1 insertion(+) diff --git a/CppUTestConfig.cmake.install.in b/CppUTestConfig.cmake.install.in index 3e6b91e00..3c79ea3aa 100644 --- a/CppUTestConfig.cmake.install.in +++ b/CppUTestConfig.cmake.install.in @@ -1,6 +1,7 @@ @PACKAGE_INIT@ set_and_check(CppUTest_INCLUDE_DIRS "@PACKAGE_INCLUDE_INSTALL_DIR@") +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/Modules") include("${CMAKE_CURRENT_LIST_DIR}/CppUTestTargets.cmake") set(CppUTest_LIBRARIES CppUTest CppUTestExt) include("${CMAKE_CURRENT_LIST_DIR}/Modules/CppUTestBuildTimeDiscoverTests.cmake") From a5f1c6fbb7d02bfd7848ddb2bf77721b83bdb5f9 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 31 Aug 2022 13:56:39 -0700 Subject: [PATCH 0795/1093] Repair CMake install --- CMakeLists.txt | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d4cc77a5..920474940 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,9 +192,11 @@ include(CMakePackageConfigHelpers OPTIONAL RESULT_VARIABLE PkgHelpers_AVAILABLE) # guard against older versions of cmake which do not provide it if(PkgHelpers_AVAILABLE) + set(CPPUTEST_CONFIG_DEST "${LIB_INSTALL_DIR}/CppUTest/cmake") + configure_package_config_file(CppUTestConfig.cmake.install.in ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfig.cmake - INSTALL_DESTINATION ${LIB_INSTALL_DIR}/CppUTest/cmake + INSTALL_DESTINATION "${CPPUTEST_CONFIG_DEST}" PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake @@ -202,24 +204,20 @@ if(PkgHelpers_AVAILABLE) COMPATIBILITY SameMajorVersion ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake - DESTINATION ${LIB_INSTALL_DIR}/CppUTest/cmake ) - install(EXPORT CppUTestTargets - DESTINATION ${LIB_INSTALL_DIR}/CppUTest/cmake) + DESTINATION "${CPPUTEST_CONFIG_DEST}" ) + install( + EXPORT CppUTestTargets + NAMESPACE CppUTest:: + DESTINATION "${CPPUTEST_CONFIG_DEST}" + ) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake - DESTINATION ${LIB_INSTALL_DIR}/CppUTest/cmake/Scripts) + DESTINATION "${CPPUTEST_CONFIG_DEST}/Scripts") install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake - DESTINATION ${LIB_INSTALL_DIR}/CppUTest/cmake/Modules) + DESTINATION "${CPPUTEST_CONFIG_DEST}/Modules") configure_package_config_file(CppUTestConfig.cmake.build.in ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfig.cmake INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} PATH_VARS INCLUDE_DIR CMAKE_CURRENT_BINARY_DIR) - if (EXTENSIONS) - export(TARGETS ${CppUTestLibName} ${CppUTestExtLibName} - FILE "${CMAKE_CURRENT_BINARY_DIR}/CppUTestTargets.cmake") - else() - export(TARGETS ${CppUTestLibName} - FILE "${CMAKE_CURRENT_BINARY_DIR}/CppUTestTargets.cmake") - endif() write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfigVersion.cmake VERSION ${PROJECT_VERSION} From 0e138d3b844a38adac8e6cc9e681c7f622f39642 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 31 Aug 2022 14:04:31 -0700 Subject: [PATCH 0796/1093] Simplify header install --- src/CppUTest/CMakeLists.txt | 74 +++++++++++++------------- src/CppUTestExt/CMakeLists.txt | 95 ++++++++++++++++------------------ 2 files changed, 82 insertions(+), 87 deletions(-) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 70af5572c..ffa9603a9 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -18,6 +18,33 @@ add_library(${CppUTestLibName} TestTestingFixture.cpp SimpleMutex.cpp Utest.cpp + ${PROJECT_SOURCE_DIR}/include/CppUTest/CommandLineArguments.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/PlatformSpecificFunctions.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/TestMemoryAllocator.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/CommandLineTestRunner.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/PlatformSpecificFunctions_c.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/TestOutput.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/CppUTestConfig.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/SimpleString.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/SimpleStringInternalCache.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/TestPlugin.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/JUnitTestOutput.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/TeamCityTestOutput.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/StandardCLibrary.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/TestRegistry.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/MemoryLeakDetector.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/TestFailure.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/TestResult.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/TestFilter.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/TestTestingFixture.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorNewMacros.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/TestHarness.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/Utest.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/MemoryLeakWarningPlugin.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/TestHarness_c.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/UtestMacros.h + ${PROJECT_SOURCE_DIR}/include/CppUTest/SimpleMutex.h ) if(LIBNAME_POSTFIX_DEBUG) @@ -39,52 +66,23 @@ endif(CPP_PLATFORM) #[[Arrange for the include directory to be added to the include paths of any CMake target depending on CppUTest.]] target_include_directories(${CppUTestLibName} PUBLIC - $ - $ + $ + $ ) -set(CppUTest_headers - ${CppUTestRootDirectory}/include/CppUTest/CommandLineArguments.h - ${CppUTestRootDirectory}/include/CppUTest/PlatformSpecificFunctions.h - ${CppUTestRootDirectory}/include/CppUTest/TestMemoryAllocator.h - ${CppUTestRootDirectory}/include/CppUTest/CommandLineTestRunner.h - ${CppUTestRootDirectory}/include/CppUTest/PlatformSpecificFunctions_c.h - ${CppUTestRootDirectory}/include/CppUTest/TestOutput.h - ${CppUTestRootDirectory}/include/CppUTest/CppUTestConfig.h - ${CppUTestRootDirectory}/include/CppUTest/SimpleString.h - ${CppUTestRootDirectory}/include/CppUTest/SimpleStringInternalCache.h - ${CppUTestRootDirectory}/include/CppUTest/TestPlugin.h - ${CppUTestRootDirectory}/include/CppUTest/JUnitTestOutput.h - ${CppUTestRootDirectory}/include/CppUTest/TeamCityTestOutput.h - ${CppUTestRootDirectory}/include/CppUTest/StandardCLibrary.h - ${CppUTestRootDirectory}/include/CppUTest/TestRegistry.h - ${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetector.h - ${CppUTestRootDirectory}/include/CppUTest/TestFailure.h - ${CppUTestRootDirectory}/include/CppUTest/TestResult.h - ${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorMallocMacros.h - ${CppUTestRootDirectory}/include/CppUTest/TestFilter.h - ${CppUTestRootDirectory}/include/CppUTest/TestTestingFixture.h - ${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorNewMacros.h - ${CppUTestRootDirectory}/include/CppUTest/TestHarness.h - ${CppUTestRootDirectory}/include/CppUTest/Utest.h - ${CppUTestRootDirectory}/include/CppUTest/MemoryLeakWarningPlugin.h - ${CppUTestRootDirectory}/include/CppUTest/TestHarness_c.h - ${CppUTestRootDirectory}/include/CppUTest/UtestMacros.h - ${CppUTestRootDirectory}/include/CppUTest/SimpleMutex.h -) - -set_target_properties(${CppUTestLibName} PROPERTIES - PUBLIC_HEADER "${CppUTest_headers}") - if (WIN32) target_link_libraries(${CppUTestLibName} winmm) endif (WIN32) add_library(CppUTest::CppUTest ALIAS ${CppUTestLibName}) -install(TARGETS ${CppUTestLibName} +install( + TARGETS ${CppUTestLibName} EXPORT CppUTestTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CppUTest" - PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CppUTest") +) +install( + DIRECTORY "${PROJECT_SOURCE_DIR}/include/CppUTest" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" +) diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index d875bcf01..aca020bd6 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -1,46 +1,42 @@ -set(CppUTestExt_src - CodeMemoryReportFormatter.cpp - GTest.cpp - IEEE754ExceptionsPlugin.cpp - MemoryReporterPlugin.cpp - MockFailure.cpp - MockSupportPlugin.cpp - MockActualCall.cpp - MockSupport_c.cpp - MemoryReportAllocator.cpp - MockExpectedCall.cpp - MockNamedValue.cpp - OrderedTest.cpp - MemoryReportFormatter.cpp - MockExpectedCallsList.cpp - MockSupport.cpp +add_library(${CppUTestExtLibName} STATIC + CodeMemoryReportFormatter.cpp + GTest.cpp + IEEE754ExceptionsPlugin.cpp + MemoryReporterPlugin.cpp + MockFailure.cpp + MockSupportPlugin.cpp + MockActualCall.cpp + MockSupport_c.cpp + MemoryReportAllocator.cpp + MockExpectedCall.cpp + MockNamedValue.cpp + OrderedTest.cpp + MemoryReportFormatter.cpp + MockExpectedCallsList.cpp + MockSupport.cpp + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/CodeMemoryReportFormatter.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/IEEE754ExceptionsPlugin.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MemoryReportAllocator.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockExpectedCall.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockCheckedExpectedCall.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockExpectedCallsList.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockSupportPlugin.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MemoryReportFormatter.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockFailure.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockSupport.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockSupport_c.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/GMock.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/GTest.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/GTestSupport.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MemoryReporterPlugin.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/OrderedTest.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/GTestConvertor.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockActualCall.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockCheckedActualCall.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockNamedValue.h + ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockSupport.h ) -set(CppUTestExt_headers - ${CppUTestRootDirectory}/include/CppUTestExt/CodeMemoryReportFormatter.h - ${CppUTestRootDirectory}/include/CppUTestExt/IEEE754ExceptionsPlugin.h - ${CppUTestRootDirectory}/include/CppUTestExt/MemoryReportAllocator.h - ${CppUTestRootDirectory}/include/CppUTestExt/MockExpectedCall.h - ${CppUTestRootDirectory}/include/CppUTestExt/MockCheckedExpectedCall.h - ${CppUTestRootDirectory}/include/CppUTestExt/MockExpectedCallsList.h - ${CppUTestRootDirectory}/include/CppUTestExt/MockSupportPlugin.h - ${CppUTestRootDirectory}/include/CppUTestExt/MemoryReportFormatter.h - ${CppUTestRootDirectory}/include/CppUTestExt/MockFailure.h - ${CppUTestRootDirectory}/include/CppUTestExt/MockSupport.h - ${CppUTestRootDirectory}/include/CppUTestExt/MockSupport_c.h - ${CppUTestRootDirectory}/include/CppUTestExt/GMock.h - ${CppUTestRootDirectory}/include/CppUTestExt/GTest.h - ${CppUTestRootDirectory}/include/CppUTestExt/GTestSupport.h - ${CppUTestRootDirectory}/include/CppUTestExt/MemoryReporterPlugin.h - ${CppUTestRootDirectory}/include/CppUTestExt/OrderedTest.h - ${CppUTestRootDirectory}/include/CppUTestExt/GTestConvertor.h - ${CppUTestRootDirectory}/include/CppUTestExt/MockActualCall.h - ${CppUTestRootDirectory}/include/CppUTestExt/MockCheckedActualCall.h - ${CppUTestRootDirectory}/include/CppUTestExt/MockNamedValue.h - ${CppUTestRootDirectory}/include/CppUTestExt/MockSupport.h -) - -add_library(${CppUTestExtLibName} STATIC ${CppUTestExt_src} ${CppUTestExt_headers}) target_link_libraries(${CppUTestExtLibName} ${CPPUNIT_EXTERNAL_LIBRARIES}) target_link_libraries(${CppUTestExtLibName} PUBLIC ${CppUTestLibName}) @@ -52,18 +48,19 @@ endif() #[[Arrange for the include directory to be added to the include paths of any CMake target depending on CppUTestExt.]] target_include_directories(${CppUTestExtLibName} PUBLIC - $ - $ + $ + $ ) -set_target_properties(${CppUTestExtLibName} PROPERTIES - PUBLIC_HEADER "${CppUTestExt_headers}") - add_library(CppUTest::CppUTestExt ALIAS ${CppUTestExtLibName}) -install(TARGETS ${CppUTestExtLibName} +install( + TARGETS ${CppUTestExtLibName} EXPORT CppUTestTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CppUTestExt" - PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CppUTestExt") +) +install( + DIRECTORY "${PROJECT_SOURCE_DIR}/include/CppUTestExt" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" +) From 04e8c1e8801f980f12726d876d03a33c88468d11 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 31 Aug 2022 14:26:09 -0700 Subject: [PATCH 0797/1093] Disable install configuration when used as a subproject --- CMakeLists.txt | 118 ++++++++++++++++++--------------- src/CppUTest/CMakeLists.txt | 22 +++--- src/CppUTestExt/CMakeLists.txt | 22 +++--- 3 files changed, 88 insertions(+), 74 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 920474940..f0741e29b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,14 @@ project(CppUTest VERSION 4.0 ) +if (CMAKE_VERSION GREATER_EQUAL "3.21") + # PROJECT_IS_TOP_LEVEL is defined automatically +elseif(CMAKE_CURRENT_BINARY_DIR STREQUAL CMAKE_BINARY_DIR) + set(PROJECT_IS_TOP_LEVEL TRUE) +else() + set(PROJECT_IS_TOP_LEVEL FALSE) +endif() + ############### # Conan support ############### @@ -165,68 +173,70 @@ if (EXAMPLES) add_subdirectory(examples) endif(EXAMPLES) -set (INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") -set (LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") -set (INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") +if(PROJECT_IS_TOP_LEVEL) + set (INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") + set (LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") + set (INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") -# Pkg-config file. -set (prefix "${CMAKE_INSTALL_PREFIX}") -set (exec_prefix "\${prefix}") -set (libdir "\${exec_prefix}/${LIB_INSTALL_DIR}") -set (includedir "\${prefix}/${INCLUDE_INSTALL_DIR}") -set (PACKAGE_VERSION "${PROJECT_VERSION}") + # Pkg-config file. + set (prefix "${CMAKE_INSTALL_PREFIX}") + set (exec_prefix "\${prefix}") + set (libdir "\${exec_prefix}/${LIB_INSTALL_DIR}") + set (includedir "\${prefix}/${INCLUDE_INSTALL_DIR}") + set (PACKAGE_VERSION "${PROJECT_VERSION}") -configure_file (cpputest.pc.in + configure_file (cpputest.pc.in ${CMAKE_CURRENT_BINARY_DIR}/${CppUTest_PKGCONFIG_FILE} @ONLY) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CppUTest_PKGCONFIG_FILE} + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CppUTest_PKGCONFIG_FILE} DESTINATION ${LIB_INSTALL_DIR}/pkgconfig - ) + ) -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" DESTINATION "${INCLUDE_INSTALL_DIR}/CppUTest" - ) - -# Try to include helper module -include(CMakePackageConfigHelpers OPTIONAL - RESULT_VARIABLE PkgHelpers_AVAILABLE) -# guard against older versions of cmake which do not provide it -if(PkgHelpers_AVAILABLE) - set(CPPUTEST_CONFIG_DEST "${LIB_INSTALL_DIR}/CppUTest/cmake") - - configure_package_config_file(CppUTestConfig.cmake.install.in - ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfig.cmake - INSTALL_DESTINATION "${CPPUTEST_CONFIG_DEST}" - PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR) - write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake - VERSION ${PROJECT_VERSION} - COMPATIBILITY SameMajorVersion ) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake - DESTINATION "${CPPUTEST_CONFIG_DEST}" ) - install( - EXPORT CppUTestTargets - NAMESPACE CppUTest:: - DESTINATION "${CPPUTEST_CONFIG_DEST}" ) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake - DESTINATION "${CPPUTEST_CONFIG_DEST}/Scripts") - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake - DESTINATION "${CPPUTEST_CONFIG_DEST}/Modules") - configure_package_config_file(CppUTestConfig.cmake.build.in - ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfig.cmake - INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} - PATH_VARS INCLUDE_DIR CMAKE_CURRENT_BINARY_DIR) - write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfigVersion.cmake - VERSION ${PROJECT_VERSION} - COMPATIBILITY SameMajorVersion ) - set(CppUTest_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE PATH "The directory containing a CMake configuration file for CppUTest.") -else() - message("If you wish to use find_package(CppUTest) in your own project to find CppUTest library" - " please update cmake to version which provides CMakePackageConfighelpers module" - " or write generators for CppUTestConfig.cmake by yourself.") + + # Try to include helper module + include(CMakePackageConfigHelpers OPTIONAL + RESULT_VARIABLE PkgHelpers_AVAILABLE) + # guard against older versions of cmake which do not provide it + if(PkgHelpers_AVAILABLE) + set(CPPUTEST_CONFIG_DEST "${LIB_INSTALL_DIR}/CppUTest/cmake") + + configure_package_config_file(CppUTestConfig.cmake.install.in + ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfig.cmake + INSTALL_DESTINATION "${CPPUTEST_CONFIG_DEST}" + PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR) + write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion ) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake + DESTINATION "${CPPUTEST_CONFIG_DEST}" ) + install( + EXPORT CppUTestTargets + NAMESPACE CppUTest:: + DESTINATION "${CPPUTEST_CONFIG_DEST}" + ) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake + DESTINATION "${CPPUTEST_CONFIG_DEST}/Scripts") + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake + DESTINATION "${CPPUTEST_CONFIG_DEST}/Modules") + configure_package_config_file(CppUTestConfig.cmake.build.in + ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfig.cmake + INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} + PATH_VARS INCLUDE_DIR CMAKE_CURRENT_BINARY_DIR) + write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion ) + set(CppUTest_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE PATH "The directory containing a CMake configuration file for CppUTest.") + else() + message("If you wish to use find_package(CppUTest) in your own project to find CppUTest library" + " please update cmake to version which provides CMakePackageConfighelpers module" + " or write generators for CppUTestConfig.cmake by yourself.") + endif() endif() if(VERBOSE_CONFIG) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index ffa9603a9..0df107c8e 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -76,13 +76,15 @@ endif (WIN32) add_library(CppUTest::CppUTest ALIAS ${CppUTestLibName}) -install( - TARGETS ${CppUTestLibName} - EXPORT CppUTestTargets - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} -) -install( - DIRECTORY "${PROJECT_SOURCE_DIR}/include/CppUTest" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" -) +if(PROJECT_IS_TOP_LEVEL) + install( + TARGETS ${CppUTestLibName} + EXPORT CppUTestTargets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + install( + DIRECTORY "${PROJECT_SOURCE_DIR}/include/CppUTest" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + ) +endif() diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index aca020bd6..f1fdbe3e4 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -54,13 +54,15 @@ target_include_directories(${CppUTestExtLibName} add_library(CppUTest::CppUTestExt ALIAS ${CppUTestExtLibName}) -install( - TARGETS ${CppUTestExtLibName} - EXPORT CppUTestTargets - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} -) -install( - DIRECTORY "${PROJECT_SOURCE_DIR}/include/CppUTestExt" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" -) +if(PROJECT_IS_TOP_LEVEL) + install( + TARGETS ${CppUTestExtLibName} + EXPORT CppUTestTargets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + install( + DIRECTORY "${PROJECT_SOURCE_DIR}/include/CppUTestExt" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + ) +endif() From bb08d7a8a446930cfec4a8696bce43af17913758 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 31 Aug 2022 14:30:19 -0700 Subject: [PATCH 0798/1093] Repair module search path --- CMakeLists.txt | 12 +++++++----- cmake/Modules/CppUTestConfigurationOptions.cmake | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f0741e29b..78fd25085 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,13 +76,15 @@ if(LIBNAME_POSTFIX_BITSIZE) endif() endif(LIBNAME_POSTFIX_BITSIZE) -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CppUTestRootDirectory}/cmake/Modules) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules") +if(NOT PROJECT_IS_TOP_LEVEL) + set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE) +endif() -include("${CppUTestRootDirectory}/cmake/Modules/CppUTestConfigurationOptions.cmake") +include(CppUTestConfigurationOptions) include(CTest) -#include("${CppUTestRootDirectory}/cmake/Modules/CheckFunctionExists.cmake") -include("${CppUTestRootDirectory}/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake") -include("${CppUTestRootDirectory}/cmake/Modules/CppUTestNormalizeTestOutputLocation.cmake") +include(CppUTestBuildTimeDiscoverTests) +include(CppUTestNormalizeTestOutputLocation) include(GNUInstallDirs) enable_testing() diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index cb1ca3074..52b24485b 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -31,7 +31,7 @@ else (MSVC) endif (MSVC) if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) - include("${CppUTestRootDirectory}/cmake/Modules/CppUTestWarningFlags.cmake") + include(CppUTestWarningFlags) endif () if (NOT STD_CPP) From 8a46f2a46418473c7dec08349874b0da4dfbc96a Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 31 Aug 2022 14:32:49 -0700 Subject: [PATCH 0799/1093] Use native project _SOURCE_DIR variable --- CMakeLists.txt | 2 -- .../Modules/CppUTestConfigurationOptions.cmake | 18 +++++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 78fd25085..a038fd57e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,8 +61,6 @@ endif() include(FindPkgConfig) set(CppUTest_PKGCONFIG_FILE cpputest.pc) -set(CppUTestRootDirectory ${PROJECT_SOURCE_DIR}) - set( CppUTestLibName "CppUTest" ) set( CppUTestExtLibName "CppUTestExt" ) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 52b24485b..c6e43ddd2 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -9,7 +9,7 @@ elseif (IAR) unset(CMAKE_CXX_EXTENSION_COMPILE_OPTION) set(TESTS_BUILD_DISCOVER OFF) # Set up the CMake variables for the linker - set(LINKER_SCRIPT "${CppUTestRootDirectory}/platforms/iar/CppUTestTest.icf") + set(LINKER_SCRIPT "${CppUTest_SOURCE_DIR}/platforms/iar/CppUTestTest.icf") set(CMAKE_C_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") set(CMAKE_CXX_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") elseif (BORLAND) @@ -43,16 +43,16 @@ endif (NOT STD_CPP) if (MEMORY_LEAK_DETECTION) if (MSVC) - set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} /FI \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} /FI \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") + set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} /FI \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") + set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} /FI \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") elseif (IAR) - set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} --preinclude \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} --preinclude \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorNewMacros.h\"") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} --preinclude \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") + set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} --preinclude \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") + set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} --preinclude \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorNewMacros.h\"") + set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} --preinclude \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") else (MSVC) - set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} -include \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -include \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorNewMacros.h\"") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -include \"${CppUTestRootDirectory}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") + set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} -include \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") + set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -include \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorNewMacros.h\"") + set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -include \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") endif (MSVC) else (MEMORY_LEAK_DETECTION) set(CPPUTEST_MEM_LEAK_DETECTION_DISABLED 1) From 045eb0beb8a29f0aa273a24df9dea9980f143eb5 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 31 Aug 2022 14:37:49 -0700 Subject: [PATCH 0800/1093] Update README --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bcce51f5a..fe5763d22 100644 --- a/README.md +++ b/README.md @@ -252,7 +252,10 @@ It can be used then like so: ```cmake add_executable(run_tests UnitTest1.cpp UnitTest2.cpp) -target_link_libraries(run_tests PRIVATE CppUTest CppUTestExt) + +target_link_libraries(example_test PRIVATE + CppUTest::CppUTest + CppUTest::CppUTestExt) ``` [conan-center]: https://conan.io/center/cpputest From 7610deb0700c4abf05ad15d0a62c0be509df5930 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 18:39:29 -0700 Subject: [PATCH 0801/1093] Scope WERROR --- .github/workflows/basic.yml | 1 - CMakeLists.txt | 10 +++++++--- cmake/Modules/CppUTestWarningFlags.cmake | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 71fe5d9c8..e3fa97857 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -108,7 +108,6 @@ jobs: -B build -S . -D CMAKE_CXX_STANDARD=${{ matrix.cpp_version }} - -D WERROR=ON if: ${{ matrix.cpp_version }} - name: Build run: cmake --build build --verbose diff --git a/CMakeLists.txt b/CMakeLists.txt index a038fd57e..df959618f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,9 +7,9 @@ project(CppUTest VERSION 4.0 ) -if (CMAKE_VERSION GREATER_EQUAL "3.21") +if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.21") # PROJECT_IS_TOP_LEVEL is defined automatically -elseif(CMAKE_CURRENT_BINARY_DIR STREQUAL CMAKE_BINARY_DIR) +elseif (CMAKE_CURRENT_BINARY_DIR STREQUAL CMAKE_BINARY_DIR) set(PROJECT_IS_TOP_LEVEL TRUE) else() set(PROJECT_IS_TOP_LEVEL FALSE) @@ -24,6 +24,7 @@ if (EXISTS "${CMAKE_BINARY_DIR}/conanbuildinfo.cmake") conan_basic_setup() endif() +include(CMakeDependentOption) option(STD_C "Use the standard C library" ON) option(STD_CPP "Use the standard C++ library" ON) option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) @@ -32,7 +33,10 @@ option(EXTENSIONS "Use the CppUTest extension library" ON) option(LONGLONG "Support long long" OFF) option(MAP_FILE "Enable the creation of a map file" OFF) option(COVERAGE "Enable running with coverage" OFF) -option(WERROR "Compile with warnings as errors" OFF) +cmake_dependent_option(CPPUTEST_WERROR + "Compile with warnings as errors" + ON "PROJECT_IS_TOP_LEVEL" OFF +) option(TESTS "Compile and make tests for the code?" ON) option(TESTS_DETAILED "Run each test separately instead of grouped?" OFF) diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index e21f0a727..86eaab9f7 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -44,9 +44,9 @@ else (MSVC) Wno-long-long ) - if (WERROR) + if (CPPUTEST_WERROR) list(APPEND WARNING_C_FLAGS Werror) - endif (WERROR) + endif () set(WARNING_C_ONLY_FLAGS From ba9de9841bff440e6ca32d3f053742d09a2c69d2 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 31 Aug 2022 17:54:49 -0700 Subject: [PATCH 0802/1093] Resolve appveyor warnings --- config.h.cmake | 2 +- include/CppUTest/MemoryLeakDetector.h | 2 +- scripts/appveyor_ci_build.ps1 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config.h.cmake b/config.h.cmake index f8c029aae..38e45c4df 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -18,7 +18,7 @@ #cmakedefine CPPUTEST_HAVE_STRUCT_TIMESPEC #ifdef CPPUTEST_HAVE_STRUCT_TIMESPEC -// Apply workaround for MinGW timespec redefinition (pthread.h / time.h) +/* Apply workaround for MinGW timespec redefinition (pthread.h / time.h) */ #define _TIMESPEC_DEFINED 1 #endif diff --git a/include/CppUTest/MemoryLeakDetector.h b/include/CppUTest/MemoryLeakDetector.h index 4057ca806..fb8a61921 100644 --- a/include/CppUTest/MemoryLeakDetector.h +++ b/include/CppUTest/MemoryLeakDetector.h @@ -58,7 +58,7 @@ struct SimpleStringBuffer SimpleStringBuffer(); void clear(); - void add(const char* format, ...) _check_format_(printf, 2, 3); + void add(const char* format, ...) _check_format_(CPPUTEST_CHECK_FORMAT_TYPE, 2, 3); void addMemoryDump(const void* memory, size_t memorySize); char* toString(); diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index 9bb238a61..aab43f03e 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -77,7 +77,7 @@ switch -Wildcard ($env:Platform) { $toolchain_filename = Get-ClangToolchainFilename $toolchain_path = (Join-Path (Split-Path $MyInvocation.MyCommand.Path) "..\cmake\$toolchain_filename") - $toolchain = "-DCMAKE_TOOLCHAIN_FILE=$toolchain_path" + $toolchain = "-DCMAKE_TOOLCHAIN_FILE=$toolchain_path -DCPPUTEST_WERROR=OFF" } # Add mingw to the path From 0879af8cface886e69ce290c0c0251b495c3680d Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 17:10:09 -0700 Subject: [PATCH 0803/1093] Scope STD_C --- CMakeLists.txt | 4 ++-- cmake/Modules/CppUTestConfigurationOptions.cmake | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index df959618f..2a6eb19f0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,7 @@ if (EXISTS "${CMAKE_BINARY_DIR}/conanbuildinfo.cmake") endif() include(CMakeDependentOption) -option(STD_C "Use the standard C library" ON) +option(CPPUTEST_STD_C_LIB_DISABLED "Disable the standard C library") option(STD_CPP "Use the standard C++ library" ON) option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) option(MEMORY_LEAK_DETECTION "Enable memory leak detection" ON) @@ -261,7 +261,7 @@ Features configured in CppUTest: Support Long Long: ${LONGLONG} Use CppUTest flags: ${CPPUTEST_FLAGS} - Using Standard C library: ${STD_C} + Disable Standard C library: ${CPPUTEST_STD_C_LIB_DISABLED} Using Standard C++ library: ${STD_CPP} Generating map file: ${MAP_FILE} diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index c6e43ddd2..61254404d 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -17,7 +17,7 @@ elseif (BORLAND) set(MEMORY_LEAK_DETECTION OFF) set(LONGLONG OFF) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") -elseif (STD_C) +elseif (NOT CPPUTEST_STD_C_LIB_DISABLED) if(NOT CPP_PLATFORM) set(CPP_PLATFORM Gcc) endif(NOT CPP_PLATFORM) @@ -26,7 +26,6 @@ else (MSVC) set(MEMORY_LEAK_DETECTION False) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -nostdinc") set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -nostdinc") - set(CPPUTEST_STD_C_LIB_DISABLED 1) set(CPP_PLATFORM GccNoStdC) endif (MSVC) @@ -36,9 +35,9 @@ endif () if (NOT STD_CPP) set(CPPUTEST_STD_CPP_LIB_DISABLED 1) - if (STD_C AND NOT MSVC) + if (NOT CPPUTEST_STD_C_LIB_DISABLED AND NOT MSVC) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -nostdinc++") - endif (STD_C AND NOT MSVC) + endif () endif (NOT STD_CPP) if (MEMORY_LEAK_DETECTION) From d9bbe331d85c47e45119089551356ddc534f524a Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 17:14:48 -0700 Subject: [PATCH 0804/1093] Scope STD_CPP --- CMakeLists.txt | 5 +++-- cmake/Modules/CppUTestConfigurationOptions.cmake | 6 ++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a6eb19f0..fa0a273b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,8 @@ endif() include(CMakeDependentOption) option(CPPUTEST_STD_C_LIB_DISABLED "Disable the standard C library") -option(STD_CPP "Use the standard C++ library" ON) +cmake_dependent_option(CPPUTEST_STD_CPP_LIB_DISABLED "Use the standard C++ library" + OFF "NOT CPPUTEST_STD_C_LIB_DISABLED" ON) option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) option(MEMORY_LEAK_DETECTION "Enable memory leak detection" ON) option(EXTENSIONS "Use the CppUTest extension library" ON) @@ -262,7 +263,7 @@ Features configured in CppUTest: Use CppUTest flags: ${CPPUTEST_FLAGS} Disable Standard C library: ${CPPUTEST_STD_C_LIB_DISABLED} - Using Standard C++ library: ${STD_CPP} + Disable Standard C++ library: ${CPPUTEST_STD_CPP_LIB_DISABLED} Generating map file: ${MAP_FILE} Compiling with coverage: ${COVERAGE} diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 61254404d..cad852218 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -22,7 +22,6 @@ elseif (NOT CPPUTEST_STD_C_LIB_DISABLED) set(CPP_PLATFORM Gcc) endif(NOT CPP_PLATFORM) else (MSVC) - set(STD_CPP False) set(MEMORY_LEAK_DETECTION False) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -nostdinc") set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -nostdinc") @@ -33,12 +32,11 @@ if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) include(CppUTestWarningFlags) endif () -if (NOT STD_CPP) - set(CPPUTEST_STD_CPP_LIB_DISABLED 1) +if (CPPUTEST_STD_CPP_LIB_DISABLED) if (NOT CPPUTEST_STD_C_LIB_DISABLED AND NOT MSVC) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -nostdinc++") endif () -endif (NOT STD_CPP) +endif () if (MEMORY_LEAK_DETECTION) if (MSVC) From eeefd79db31d14ad4294aceed98dc3437dc7f746 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 17:35:11 -0700 Subject: [PATCH 0805/1093] Scope MEMORY_LEAK_DETECTION --- CMakeLists.txt | 5 +++-- cmake/Modules/CppUTestConfigurationOptions.cmake | 8 ++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fa0a273b9..fb81b1d4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,7 +29,8 @@ option(CPPUTEST_STD_C_LIB_DISABLED "Disable the standard C library") cmake_dependent_option(CPPUTEST_STD_CPP_LIB_DISABLED "Use the standard C++ library" OFF "NOT CPPUTEST_STD_C_LIB_DISABLED" ON) option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) -option(MEMORY_LEAK_DETECTION "Enable memory leak detection" ON) +cmake_dependent_option(CPPUTEST_MEM_LEAK_DETECTION_DISABLED "Enable memory leak detection" + OFF "NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED" ON) option(EXTENSIONS "Use the CppUTest extension library" ON) option(LONGLONG "Support long long" OFF) option(MAP_FILE "Enable the creation of a map file" OFF) @@ -257,7 +258,7 @@ Current compiler options: CppUTest LDFLAGS: ${CPPUTEST_LD_FLAGS} Features configured in CppUTest: - Memory Leak Detection: ${MEMORY_LEAK_DETECTION} + Memory Leak Detection Disabled: ${CPPUTEST_MEM_LEAK_DETECTION_DISABLED} Compiling Extensions: ${EXTENSIONS} Support Long Long: ${LONGLONG} Use CppUTest flags: ${CPPUTEST_FLAGS} diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index cad852218..ebd4bc53a 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -14,7 +14,6 @@ elseif (IAR) set(CMAKE_CXX_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") elseif (BORLAND) set(CPP_PLATFORM Borland) - set(MEMORY_LEAK_DETECTION OFF) set(LONGLONG OFF) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") elseif (NOT CPPUTEST_STD_C_LIB_DISABLED) @@ -22,7 +21,6 @@ elseif (NOT CPPUTEST_STD_C_LIB_DISABLED) set(CPP_PLATFORM Gcc) endif(NOT CPP_PLATFORM) else (MSVC) - set(MEMORY_LEAK_DETECTION False) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -nostdinc") set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -nostdinc") set(CPP_PLATFORM GccNoStdC) @@ -38,7 +36,7 @@ if (CPPUTEST_STD_CPP_LIB_DISABLED) endif () endif () -if (MEMORY_LEAK_DETECTION) +if (NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) if (MSVC) set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} /FI \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} /FI \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") @@ -51,9 +49,7 @@ if (MEMORY_LEAK_DETECTION) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -include \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorNewMacros.h\"") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -include \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") endif (MSVC) -else (MEMORY_LEAK_DETECTION) - set(CPPUTEST_MEM_LEAK_DETECTION_DISABLED 1) -endif (MEMORY_LEAK_DETECTION) +endif () if (LONGLONG) set(CPPUTEST_USE_LONG_LONG 1) From bf0f539d22846fb3eee8c0e394840b2cba850827 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 17:43:19 -0700 Subject: [PATCH 0806/1093] Scope EXTENSIONS --- CMakeLists.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb81b1d4c..0ec27445c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ cmake_dependent_option(CPPUTEST_STD_CPP_LIB_DISABLED "Use the standard C++ libra option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) cmake_dependent_option(CPPUTEST_MEM_LEAK_DETECTION_DISABLED "Enable memory leak detection" OFF "NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED" ON) -option(EXTENSIONS "Use the CppUTest extension library" ON) +option(CPPUTEST_EXTENSIONS "Use the CppUTest extension library" ON) option(LONGLONG "Support long long" OFF) option(MAP_FILE "Enable the creation of a map file" OFF) option(COVERAGE "Enable running with coverage" OFF) @@ -164,15 +164,15 @@ target_compile_definitions(${CppUTestLibName} $ ) -if (EXTENSIONS) +if (CPPUTEST_EXTENSIONS) add_subdirectory(src/CppUTestExt) -endif (EXTENSIONS) +endif () if (TESTS) add_subdirectory(tests/CppUTest) - if (EXTENSIONS) + if (CPPUTEST_EXTENSIONS) add_subdirectory(tests/CppUTestExt) - endif (EXTENSIONS) + endif () endif (TESTS) if (EXAMPLES) @@ -259,7 +259,7 @@ Current compiler options: Features configured in CppUTest: Memory Leak Detection Disabled: ${CPPUTEST_MEM_LEAK_DETECTION_DISABLED} - Compiling Extensions: ${EXTENSIONS} + Compiling Extensions: ${CPPUTEST_EXTENSIONS} Support Long Long: ${LONGLONG} Use CppUTest flags: ${CPPUTEST_FLAGS} From 28fbe44ff2eaa6df4c5329c62e0755eba25eb149 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 17:50:41 -0700 Subject: [PATCH 0807/1093] Scope LONGLONG --- .github/workflows/extended.yml | 1 - CMakeLists.txt | 9 +++++++-- cmake/Modules/CppUTestConfigurationOptions.cmake | 5 ----- config.h.cmake | 3 +-- include/CppUTest/CppUTestConfig.h | 2 +- 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index af9085bb5..0abedcc01 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -38,7 +38,6 @@ jobs: -D CMAKE_BUILD_TYPE=Debug -D CMAKE_CXX_STANDARD=11 -D COVERAGE=ON - -D LONGLONG=ON - name: Build run: cmake --build cpputest_build - name: Test diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ec27445c..50810b1b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,12 @@ option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) cmake_dependent_option(CPPUTEST_MEM_LEAK_DETECTION_DISABLED "Enable memory leak detection" OFF "NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED" ON) option(CPPUTEST_EXTENSIONS "Use the CppUTest extension library" ON) -option(LONGLONG "Support long long" OFF) + +include(CheckTypeSize) +check_type_size("long long" SIZEOF_LONGLONG) +cmake_dependent_option(CPPUTEST_USE_LONG_LONG "Support long long" + YES "HAVE_SIZEOF_LONGLONG" OFF) + option(MAP_FILE "Enable the creation of a map file" OFF) option(COVERAGE "Enable running with coverage" OFF) cmake_dependent_option(CPPUTEST_WERROR @@ -260,7 +265,7 @@ Current compiler options: Features configured in CppUTest: Memory Leak Detection Disabled: ${CPPUTEST_MEM_LEAK_DETECTION_DISABLED} Compiling Extensions: ${CPPUTEST_EXTENSIONS} - Support Long Long: ${LONGLONG} + Support Long Long: ${CPPUTEST_USE_LONG_LONG} Use CppUTest flags: ${CPPUTEST_FLAGS} Disable Standard C library: ${CPPUTEST_STD_C_LIB_DISABLED} diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index ebd4bc53a..9c919c7e1 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -14,7 +14,6 @@ elseif (IAR) set(CMAKE_CXX_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") elseif (BORLAND) set(CPP_PLATFORM Borland) - set(LONGLONG OFF) set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") elseif (NOT CPPUTEST_STD_C_LIB_DISABLED) if(NOT CPP_PLATFORM) @@ -51,10 +50,6 @@ if (NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) endif (MSVC) endif () -if (LONGLONG) - set(CPPUTEST_USE_LONG_LONG 1) -endif (LONGLONG) - if (MAP_FILE AND NOT MSVC) set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -Wl,-Map,$<.map.txt") endif (MAP_FILE AND NOT MSVC) diff --git a/config.h.cmake b/config.h.cmake index 38e45c4df..2cc68436d 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -2,8 +2,7 @@ #define CONFIG_H_ #cmakedefine CPPUTEST_MEM_LEAK_DETECTION_DISABLED -#cmakedefine CPPUTEST_USE_LONG_LONG -#cmakedefine CPPUTEST_HAVE_LONG_LONG_INT +#cmakedefine01 CPPUTEST_USE_LONG_LONG #cmakedefine CPPUTEST_HAVE_STRDUP #cmakedefine CPPUTEST_HAVE_FORK diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index af3706e28..bc90219ca 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -281,7 +281,7 @@ #endif #endif -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG typedef long long cpputest_longlong; typedef unsigned long long cpputest_ulonglong; #else From 9fd59ca555b44bbe1507f1f7228548c89c8c3fde Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 17:58:46 -0700 Subject: [PATCH 0808/1093] Scope MAP_FILE --- CMakeLists.txt | 5 +++-- cmake/Modules/CppUTestConfigurationOptions.cmake | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 50810b1b9..66ab2bfbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,8 @@ check_type_size("long long" SIZEOF_LONGLONG) cmake_dependent_option(CPPUTEST_USE_LONG_LONG "Support long long" YES "HAVE_SIZEOF_LONGLONG" OFF) -option(MAP_FILE "Enable the creation of a map file" OFF) +cmake_dependent_option(CPPUTEST_MAP_FILE "Enable the creation of a map file" + OFF "NOT MSVC" OFF) option(COVERAGE "Enable running with coverage" OFF) cmake_dependent_option(CPPUTEST_WERROR "Compile with warnings as errors" @@ -271,7 +272,7 @@ Features configured in CppUTest: Disable Standard C library: ${CPPUTEST_STD_C_LIB_DISABLED} Disable Standard C++ library: ${CPPUTEST_STD_CPP_LIB_DISABLED} - Generating map file: ${MAP_FILE} + Generating map file: ${CPPUTEST_MAP_FILE} Compiling with coverage: ${COVERAGE} Compile and run self-tests ${TESTS} diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 9c919c7e1..503216a43 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -50,9 +50,9 @@ if (NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) endif (MSVC) endif () -if (MAP_FILE AND NOT MSVC) +if (CPPUTEST_MAP_FILE AND NOT MSVC) set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -Wl,-Map,$<.map.txt") -endif (MAP_FILE AND NOT MSVC) +endif () if (COVERAGE AND NOT MSVC) set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} --coverage") From 3fb36cc7b2e69c9d96bb3386007f661fd9f0e03b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 18:01:28 -0700 Subject: [PATCH 0809/1093] Scope COVERAGE --- .github/workflows/extended.yml | 2 +- CMakeLists.txt | 5 +++-- cmake/Modules/CppUTestConfigurationOptions.cmake | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 0abedcc01..fde60052b 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -37,7 +37,7 @@ jobs: -B cpputest_build -D CMAKE_BUILD_TYPE=Debug -D CMAKE_CXX_STANDARD=11 - -D COVERAGE=ON + -D CPPUTEST_COVERAGE=ON - name: Build run: cmake --build cpputest_build - name: Test diff --git a/CMakeLists.txt b/CMakeLists.txt index 66ab2bfbe..5bfa09ce7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,8 @@ cmake_dependent_option(CPPUTEST_USE_LONG_LONG "Support long long" cmake_dependent_option(CPPUTEST_MAP_FILE "Enable the creation of a map file" OFF "NOT MSVC" OFF) -option(COVERAGE "Enable running with coverage" OFF) +cmake_dependent_option(CPPUTEST_COVERAGE "Enable running with coverage" + OFF "NOT MSVC" OFF) cmake_dependent_option(CPPUTEST_WERROR "Compile with warnings as errors" ON "PROJECT_IS_TOP_LEVEL" OFF @@ -273,7 +274,7 @@ Features configured in CppUTest: Disable Standard C++ library: ${CPPUTEST_STD_CPP_LIB_DISABLED} Generating map file: ${CPPUTEST_MAP_FILE} - Compiling with coverage: ${COVERAGE} + Compiling with coverage: ${CPPUTEST_COVERAGE} Compile and run self-tests ${TESTS} Run self-tests separately ${TESTS_DETAILED} diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 503216a43..73e50b747 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -54,7 +54,7 @@ if (CPPUTEST_MAP_FILE AND NOT MSVC) set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -Wl,-Map,$<.map.txt") endif () -if (COVERAGE AND NOT MSVC) +if (CPPUTEST_COVERAGE AND NOT MSVC) set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} --coverage") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} --coverage") set(CMAKE_BUILD_TYPE "Debug") From dd70ae595cdd7374bd8e160e5d53fe9510904478 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 18:51:34 -0700 Subject: [PATCH 0810/1093] Scope TESTS --- CMakeLists.txt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5bfa09ce7..086c9530c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,8 @@ if (EXISTS "${CMAKE_BINARY_DIR}/conanbuildinfo.cmake") conan_basic_setup() endif() +include(CTest) + include(CMakeDependentOption) option(CPPUTEST_STD_C_LIB_DISABLED "Disable the standard C library") cmake_dependent_option(CPPUTEST_STD_CPP_LIB_DISABLED "Use the standard C++ library" @@ -46,8 +48,8 @@ cmake_dependent_option(CPPUTEST_WERROR "Compile with warnings as errors" ON "PROJECT_IS_TOP_LEVEL" OFF ) - -option(TESTS "Compile and make tests for the code?" ON) +cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTest" + ${PROJECT_IS_TOP_LEVEL} "BUILD_TESTING" OFF) option(TESTS_DETAILED "Run each test separately instead of grouped?" OFF) option(TESTS_BUILD_DISCOVER "Build time test discover" ON) @@ -93,13 +95,10 @@ if(NOT PROJECT_IS_TOP_LEVEL) endif() include(CppUTestConfigurationOptions) -include(CTest) include(CppUTestBuildTimeDiscoverTests) include(CppUTestNormalizeTestOutputLocation) include(GNUInstallDirs) -enable_testing() - add_subdirectory(src/CppUTest) # Check for symbols before setting a lot of stuff @@ -175,12 +174,12 @@ if (CPPUTEST_EXTENSIONS) add_subdirectory(src/CppUTestExt) endif () -if (TESTS) +if (CPPUTEST_BUILD_TESTING) add_subdirectory(tests/CppUTest) if (CPPUTEST_EXTENSIONS) add_subdirectory(tests/CppUTestExt) endif () -endif (TESTS) +endif () if (EXAMPLES) add_subdirectory(examples) @@ -276,7 +275,7 @@ Features configured in CppUTest: Generating map file: ${CPPUTEST_MAP_FILE} Compiling with coverage: ${CPPUTEST_COVERAGE} - Compile and run self-tests ${TESTS} + Compile and run self-tests ${CPPUTEST_BUILD_TESTING} Run self-tests separately ${TESTS_DETAILED} Library name options: From 29926fd865d9cf22cbd28783949aafe4a24172c8 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 19:03:15 -0700 Subject: [PATCH 0811/1093] Scope TESTS_BUILD_DISCOVER --- CMakeLists.txt | 3 ++- cmake/Modules/CppUTestConfigurationOptions.cmake | 1 - tests/CppUTest/CMakeLists.txt | 2 +- tests/CppUTestExt/CMakeLists.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 086c9530c..8384b98f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,7 +51,8 @@ cmake_dependent_option(CPPUTEST_WERROR cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTest" ${PROJECT_IS_TOP_LEVEL} "BUILD_TESTING" OFF) option(TESTS_DETAILED "Run each test separately instead of grouped?" OFF) -option(TESTS_BUILD_DISCOVER "Build time test discover" ON) +cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" + ON "CPPUTEST_BUILD_TESTING;NOT IAR" OFF) option(EXAMPLES "Compile and make examples?" OFF) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 73e50b747..b22108f4d 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -7,7 +7,6 @@ if (MSVC) elseif (IAR) set(CPP_PLATFORM Iar) unset(CMAKE_CXX_EXTENSION_COMPILE_OPTION) - set(TESTS_BUILD_DISCOVER OFF) # Set up the CMake variables for the linker set(LINKER_SCRIPT "${CppUTest_SOURCE_DIR}/platforms/iar/CppUTestTest.icf") set(CMAKE_C_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index c9ed939e5..7347c9f32 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -56,6 +56,6 @@ add_executable(CppUTestTests ${CppUTestTests_src}) cpputest_normalize_test_output_location(CppUTestTests) target_link_libraries(CppUTestTests ${CppUTestLibName} ${THREAD_LIB}) -if (TESTS_BUILD_DISCOVER) +if (CPPUTEST_TEST_DISCOVERY) cpputest_buildtime_discover_tests(CppUTestTests) endif() diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index f25707bf7..4834c1ea3 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -38,6 +38,6 @@ add_executable(CppUTestExtTests ${CppUTestExtTests_src}) cpputest_normalize_test_output_location(CppUTestExtTests) target_link_libraries(CppUTestExtTests ${CppUTestLibName} ${CppUTestExtLibName} ${THREAD_LIB} ${CPPUNIT_EXTERNAL_LIBRARIES}) -if (TESTS_BUILD_DISCOVER) +if (CPPUTEST_TEST_DISCOVERY) cpputest_buildtime_discover_tests(CppUTestExtTests) endif() From 0d06f3d74e6417dfa980c7f0675c9fb928053fa6 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 19:10:54 -0700 Subject: [PATCH 0812/1093] Scope TESTS_DETAILED --- CMakeLists.txt | 4 ++-- cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8384b98f3..d7a1c3a57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,7 @@ cmake_dependent_option(CPPUTEST_WERROR ) cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTest" ${PROJECT_IS_TOP_LEVEL} "BUILD_TESTING" OFF) -option(TESTS_DETAILED "Run each test separately instead of grouped?" OFF) +option(CPPUTEST_TESTS_DETAILED "Run each test separately instead of grouped?" OFF) cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" ON "CPPUTEST_BUILD_TESTING;NOT IAR" OFF) @@ -277,7 +277,7 @@ Features configured in CppUTest: Compiling with coverage: ${CPPUTEST_COVERAGE} Compile and run self-tests ${CPPUTEST_BUILD_TESTING} - Run self-tests separately ${TESTS_DETAILED} + Run self-tests separately ${CPPUTEST_TESTS_DETAILED} Library name options: Add architecture bitsize (32/64) ${LIBNAME_POSTFIX_BITSIZE} diff --git a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake index 7bd53fce2..e9bbff495 100644 --- a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake +++ b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake @@ -24,7 +24,7 @@ function (cpputest_buildtime_discover_tests tgt) TARGET ${tgt} POST_BUILD COMMAND ${CMAKE_COMMAND} - -D "TESTS_DETAILED:BOOL=${TESTS_DETAILED}" + -D "TESTS_DETAILED:BOOL=${CPPUTEST_TESTS_DETAILED}" -D "EXECUTABLE=$" -D "EMULATOR=$" -P "${_DISCOVER_SCRIPT}" From dd38040322f579a7b0d33389d415468b99fef409 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 19:15:46 -0700 Subject: [PATCH 0813/1093] Scope EXAMPLES --- .github/workflows/extended.yml | 1 + CMakeLists.txt | 6 +++--- examples/AllTests/CMakeLists.txt | 4 ++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index fde60052b..666ee5e39 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -38,6 +38,7 @@ jobs: -D CMAKE_BUILD_TYPE=Debug -D CMAKE_CXX_STANDARD=11 -D CPPUTEST_COVERAGE=ON + -D CPPUTEST_EXAMPLES=OFF - name: Build run: cmake --build cpputest_build - name: Test diff --git a/CMakeLists.txt b/CMakeLists.txt index d7a1c3a57..802b12813 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,7 +54,7 @@ option(CPPUTEST_TESTS_DETAILED "Run each test separately instead of grouped?" OF cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" ON "CPPUTEST_BUILD_TESTING;NOT IAR" OFF) -option(EXAMPLES "Compile and make examples?" OFF) +option(CPPUTEST_EXAMPLES "Compile and make examples?" ${PROJECT_IS_TOP_LEVEL}) option(VERBOSE_CONFIG "Print configuration to stdout during generation" ON) @@ -182,9 +182,9 @@ if (CPPUTEST_BUILD_TESTING) endif () endif () -if (EXAMPLES) +if (CPPUTEST_EXAMPLES) add_subdirectory(examples) -endif(EXAMPLES) +endif() if(PROJECT_IS_TOP_LEVEL) set (INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") diff --git a/examples/AllTests/CMakeLists.txt b/examples/AllTests/CMakeLists.txt index 603bb7a1e..438525acd 100644 --- a/examples/AllTests/CMakeLists.txt +++ b/examples/AllTests/CMakeLists.txt @@ -13,6 +13,10 @@ target_include_directories(ExampleTests . ) +target_compile_options(ExampleTests + PRIVATE $<$:/wd4723> +) + target_link_libraries(ExampleTests PRIVATE ApplicationLib From 45410a64cfc641ddd9ee8a55a46ca9758188f028 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 19:22:18 -0700 Subject: [PATCH 0814/1093] Scope VERBOSE_CONFIG --- CMakeLists.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 802b12813..0573634b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,8 +55,7 @@ cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" ON "CPPUTEST_BUILD_TESTING;NOT IAR" OFF) option(CPPUTEST_EXAMPLES "Compile and make examples?" ${PROJECT_IS_TOP_LEVEL}) - -option(VERBOSE_CONFIG "Print configuration to stdout during generation" ON) +option(CPPUTEST_VERBOSE_CONFIG "Print configuration to stdout during generation" ${PROJECT_IS_TOP_LEVEL}) option(LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" OFF) option(LIBNAME_POSTFIX_DEBUG "Add indication of debug compilation to the library name?" OFF) @@ -252,7 +251,7 @@ if(PROJECT_IS_TOP_LEVEL) endif() endif() -if(VERBOSE_CONFIG) +if(CPPUTEST_VERBOSE_CONFIG) message(" ------------------------------------------------------- CppUTest Version ${PROJECT_VERSION} From 50f97c26f2c88cba5e32df54271a8bc9cbc1b0a7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 20:15:59 -0700 Subject: [PATCH 0815/1093] Scope LIBNAME_POSTFIX options --- CMakeLists.txt | 14 ++++++++------ src/CppUTest/CMakeLists.txt | 2 +- src/CppUTestExt/CMakeLists.txt | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0573634b7..58a1cd025 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,8 +57,10 @@ cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" option(CPPUTEST_EXAMPLES "Compile and make examples?" ${PROJECT_IS_TOP_LEVEL}) option(CPPUTEST_VERBOSE_CONFIG "Print configuration to stdout during generation" ${PROJECT_IS_TOP_LEVEL}) -option(LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" OFF) -option(LIBNAME_POSTFIX_DEBUG "Add indication of debug compilation to the library name?" OFF) +cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" + OFF "PROJECT_IS_TOP_LEVEL" OFF) +cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_DEBUG "Add indication of debug compilation to the library name?" + OFF "PROJECT_IS_TOP_LEVEL" OFF) if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) # Don't change users' build type. # Multi-configuration generators don't have a single build type. @@ -79,7 +81,7 @@ set(CppUTest_PKGCONFIG_FILE cpputest.pc) set( CppUTestLibName "CppUTest" ) set( CppUTestExtLibName "CppUTestExt" ) -if(LIBNAME_POSTFIX_BITSIZE) +if(CPPUTEST_LIBNAME_POSTFIX_BITSIZE) if( "${CMAKE_SIZEOF_VOID_P}" STREQUAL "8" ) set( CppUTestLibName "${CppUTestLibName}64" ) set( CppUTestExtLibName "${CppUTestExtLibName}64" ) @@ -87,7 +89,7 @@ if(LIBNAME_POSTFIX_BITSIZE) set( CppUTestLibName "${CppUTestLibName}32" ) set( CppUTestExtLibName "${CppUTestExtLibName}32" ) endif() -endif(LIBNAME_POSTFIX_BITSIZE) +endif() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules") if(NOT PROJECT_IS_TOP_LEVEL) @@ -279,8 +281,8 @@ Features configured in CppUTest: Run self-tests separately ${CPPUTEST_TESTS_DETAILED} Library name options: - Add architecture bitsize (32/64) ${LIBNAME_POSTFIX_BITSIZE} - Add debug compilation indicator ${LIBNAME_POSTFIX_DEBUG} + Add architecture bitsize (32/64) ${CPPUTEST_LIBNAME_POSTFIX_BITSIZE} + Add debug compilation indicator ${CPPUTEST_LIBNAME_POSTFIX_DEBUG} ------------------------------------------------------- ") diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 0df107c8e..fa0339429 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -47,7 +47,7 @@ add_library(${CppUTestLibName} ${PROJECT_SOURCE_DIR}/include/CppUTest/SimpleMutex.h ) -if(LIBNAME_POSTFIX_DEBUG) +if(CPPUTEST_LIBNAME_POSTFIX_DEBUG) set_target_properties(${CppUTestLibName} PROPERTIES DEBUG_POSTFIX "d") endif() diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index f1fdbe3e4..3a61ecd74 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -41,7 +41,7 @@ target_link_libraries(${CppUTestExtLibName} ${CPPUNIT_EXTERNAL_LIBRARIES}) target_link_libraries(${CppUTestExtLibName} PUBLIC ${CppUTestLibName}) -if(LIBNAME_POSTFIX_DEBUG) +if(CPPUTEST_LIBNAME_POSTFIX_DEBUG) set_target_properties(${CppUTestExtLibName} PROPERTIES DEBUG_POSTFIX "d") endif() From 5e7363e6cce269e0ea54609823fb43778f3ff5d5 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 20:23:29 -0700 Subject: [PATCH 0816/1093] Remove C++11 shim --- cmake/Modules/CppUTestConfigurationOptions.cmake | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index b22108f4d..8f53d5a55 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -72,16 +72,6 @@ if (CPPUTEST_COVERAGE AND NOT MSVC) ) endif() -if(DEFINED C++11) - message(DEPRECATION - "The C++11 option is deprecated. " - "Set CMAKE_CXX_STANDARD explicitly." - ) - if(C++11 AND NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 11) - endif() -endif() - if (CMAKE_CXX_STANDARD) set(CMAKE_CXX_EXTENSIONS OFF) endif () From 2d776ea4c020f5b3bfbd6fd9dcb9ed0ad9193fc5 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 19 Aug 2022 21:00:47 -0700 Subject: [PATCH 0817/1093] Remove HAS_NAN shim --- CMakeLists.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 58a1cd025..0dd110823 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,14 +114,6 @@ check_cxx_symbol_exists(waitpid "sys/wait.h" CPPUTEST_HAVE_WAITPID) check_cxx_symbol_exists(gettimeofday "sys/time.h" CPPUTEST_HAVE_GETTIMEOFDAY) check_cxx_symbol_exists(pthread_mutex_lock "pthread.h" CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK) -if(DEFINED HAS_NAN) - message(DEPRECATION - "The HAS_NAN cache variable has been deprecated. " - "CPPUTEST_HAS_NAN is assessed automatically, " - "but can be assigned manually." - ) - set(CPPUTEST_HAS_NAN ${HAS_NAN}) -endif() if(NOT DEFINED CPPUTEST_HAS_NAN) check_cxx_symbol_exists(NAN "math.h" CPPUTEST_HAS_NAN) endif() From 863999b2278b76ca2b3c93229e3fa6bdd33ea9f2 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 31 Aug 2022 09:41:27 -0700 Subject: [PATCH 0818/1093] Remove HAS_INF shim --- CMakeLists.txt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0dd110823..e32215271 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -118,16 +118,7 @@ if(NOT DEFINED CPPUTEST_HAS_NAN) check_cxx_symbol_exists(NAN "math.h" CPPUTEST_HAS_NAN) endif() -if(DEFINED HAS_INF) - message(DEPRECATION - "The HAS_INF cache variable has been deprecated. " - "CPPUTEST_HAS_INF is assessed automatically, " - "but can be assigned manually." - ) - set(CPPUTEST_HAS_INF ${HAS_INF}) -endif() if(NOT DEFINED CPPUTEST_HAS_INF) - include(CheckCXXSymbolExists) check_cxx_symbol_exists(INFINITY "math.h" CPPUTEST_HAS_INF) endif() From 88e1b375859311ab8557035f75fd32158b1a9f72 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 5 Sep 2022 22:51:50 -0700 Subject: [PATCH 0819/1093] Fix FindThreads usage https://cmake.org/cmake/help/latest/module/FindThreads.html --- src/CppUTestExt/CMakeLists.txt | 2 -- tests/CppUTest/CMakeLists.txt | 22 +++++++++------------- tests/CppUTestExt/CMakeLists.txt | 20 +++++++++++++------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index 3a61ecd74..aa0ec0b53 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -37,8 +37,6 @@ add_library(${CppUTestExtLibName} STATIC ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockSupport.h ) -target_link_libraries(${CppUTestExtLibName} ${CPPUNIT_EXTERNAL_LIBRARIES}) - target_link_libraries(${CppUTestExtLibName} PUBLIC ${CppUTestLibName}) if(CPPUTEST_LIBNAME_POSTFIX_DEBUG) diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 7347c9f32..d12534863 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -1,4 +1,4 @@ -set(CppUTestTests_src +add_executable(CppUTestTests AllTests.cpp SetPluginTest.cpp CheatSheetTest.cpp @@ -41,20 +41,16 @@ if (MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4723") endif (MSVC) -if (MINGW) - find_package (Threads REQUIRED) - set(THREAD_LIB "pthread") -endif (MINGW) - -if (${CMAKE_HOST_SYSTEM_NAME} MATCHES "OpenBSD") - set (THREADS_HAVE_PTHREAD_ARG 1) - find_package (Threads REQUIRED) - set (THREAD_LIB "pthread") -endif () +if(MINGW OR (${CMAKE_HOST_SYSTEM_NAME} MATCHES "OpenBSD")) + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads) + if(CMAKE_USE_PTHREADS_INIT) + target_link_libraries(CppUTestTests PRIVATE Threads::Threads) + endif() +endif() -add_executable(CppUTestTests ${CppUTestTests_src}) cpputest_normalize_test_output_location(CppUTestTests) -target_link_libraries(CppUTestTests ${CppUTestLibName} ${THREAD_LIB}) +target_link_libraries(CppUTestTests PRIVATE ${CppUTestLibName}) if (CPPUTEST_TEST_DISCOVERY) cpputest_buildtime_discover_tests(CppUTestTests) diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 4834c1ea3..53995febd 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -1,4 +1,4 @@ -set(CppUTestExtTests_src +add_executable(CppUTestExtTests AllTests.cpp CodeMemoryReporterTest.cpp GMockTest.cpp @@ -29,14 +29,20 @@ set(CppUTestExtTests_src OrderedTestTest.cpp ) -if (MINGW) - find_package (Threads REQUIRED) - set(THREAD_LIB "pthread") -endif (MINGW) +if(MINGW) + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads) + if(CMAKE_USE_PTHREADS_INIT) + target_link_libraries(CppUTestExtTests PRIVATE Threads::Threads) + endif() +endif() -add_executable(CppUTestExtTests ${CppUTestExtTests_src}) cpputest_normalize_test_output_location(CppUTestExtTests) -target_link_libraries(CppUTestExtTests ${CppUTestLibName} ${CppUTestExtLibName} ${THREAD_LIB} ${CPPUNIT_EXTERNAL_LIBRARIES}) +target_link_libraries(CppUTestExtTests + PRIVATE + ${CppUTestLibName} + ${CppUTestExtLibName} +) if (CPPUTEST_TEST_DISCOVERY) cpputest_buildtime_discover_tests(CppUTestExtTests) From 267f727771aba67c3506118f592db1b30e02913e Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Sep 2022 17:22:48 -0700 Subject: [PATCH 0820/1093] Disable discovery when cross-compiling w/o an emulator Test discovery depends on the ability to run the test executables on host. Without an emulator, there's no way to do that. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e32215271..466924629 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,7 +52,7 @@ cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTe ${PROJECT_IS_TOP_LEVEL} "BUILD_TESTING" OFF) option(CPPUTEST_TESTS_DETAILED "Run each test separately instead of grouped?" OFF) cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" - ON "CPPUTEST_BUILD_TESTING;NOT IAR" OFF) + ON "CPPUTEST_BUILD_TESTING;CMAKE_CROSSCOMPILING_EMULATOR OR NOT CMAKE_CROSSCOMPILING" OFF) option(CPPUTEST_EXAMPLES "Compile and make examples?" ${PROJECT_IS_TOP_LEVEL}) option(CPPUTEST_VERBOSE_CONFIG "Print configuration to stdout during generation" ${PROJECT_IS_TOP_LEVEL}) From 332ee83a1eaee03b1ab9af7039efc83f299ce434 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Sep 2022 17:20:59 -0700 Subject: [PATCH 0821/1093] Work around spurious green hills warning --- src/CppUTest/Utest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 09fef8da9..7209b420e 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -135,8 +135,8 @@ extern "C" { /******************************** */ -static const NormalTestTerminator normalTestTerminator; -static const CrashingTestTerminator crashingTestTerminator; +static const NormalTestTerminator normalTestTerminator = NormalTestTerminator(); +static const CrashingTestTerminator crashingTestTerminator = CrashingTestTerminator(); const TestTerminator *UtestShell::currentTestTerminator_ = &normalTestTerminator; From e3c377d8916ee33f7ede2195a5edf5ec21fd354e Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Sep 2022 17:26:30 -0700 Subject: [PATCH 0822/1093] Avoid unnecessary FindPkgConfig We don't need pkgconfig unless we're doing an install. --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e32215271..67850a65a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,10 +74,6 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) # Don't change users' build type. endif() endif() -# Pkg-config file -include(FindPkgConfig) -set(CppUTest_PKGCONFIG_FILE cpputest.pc) - set( CppUTestLibName "CppUTest" ) set( CppUTestExtLibName "CppUTestExt" ) @@ -175,6 +171,10 @@ if(PROJECT_IS_TOP_LEVEL) set (LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") set (INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") + # Pkg-config file + include(FindPkgConfig) + set(CppUTest_PKGCONFIG_FILE cpputest.pc) + # Pkg-config file. set (prefix "${CMAKE_INSTALL_PREFIX}") set (exec_prefix "\${prefix}") From 53dc66b3d530e7a95f25e5ea1fcc4cce1dc2641c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 1 Sep 2022 23:19:15 -0700 Subject: [PATCH 0823/1093] configure clang-format --- .clang-format | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000..a586a94d3 --- /dev/null +++ b/.clang-format @@ -0,0 +1,41 @@ +--- +Language: Cpp +Standard: Cpp03 +AccessModifierOffset: -4 +AlignAfterOpenBracket: BlockIndent +AllowShortBlocksOnASingleLine: Empty +AllowShortEnumsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Empty +AlwaysBreakBeforeMultilineStrings: true +BinPackParameters: false +BreakBeforeBraces: Custom +BraceWrapping: + AfterClass: true + AfterControlStatement: Never + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterStruct: true + AfterUnion: true + AfterExternBlock: false + BeforeCatch: true + BeforeElse: false + BeforeWhile: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakConstructorInitializers: AfterColon +ColumnLimit: 120 +NamespaceIndentation: All +NamespaceMacros: + - TEST_GROUP +FixNamespaceComments: false +IndentPPDirectives: BeforeHash +IndentWidth: 4 +IndentExternBlock: NoIndent +PackConstructorInitializers: CurrentLine +PointerAlignment: Left +SortIncludes: Never +SpaceBeforeParens: Custom +SpaceBeforeParensOptions: + AfterForeachMacros: false From 965bf4b3f8592d84b4a96e6df0dfc4f926a48cef Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 1 Sep 2022 22:44:35 -0700 Subject: [PATCH 0824/1093] Add clang-format to CI --- .github/workflows/basic.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index e3fa97857..8ec21424c 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -6,6 +6,16 @@ on: pull_request: jobs: + clang-format: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@main + - uses: DoozyX/clang-format-lint-action@v0.14 + with: + clangFormatVersion: 14 + source: examples + automake: strategy: matrix: From 2a4942eb93b823c9723d4797222d6d3315f3bef2 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 5 Sep 2022 09:22:53 -0700 Subject: [PATCH 0825/1093] run clang-format --- examples/AllTests/AllTests.h | 10 +-- examples/AllTests/CircularBufferTest.cpp | 72 +++++++++++---------- examples/AllTests/EventDispatcherTest.cpp | 26 ++++++-- examples/AllTests/FEDemoTest.cpp | 12 ++-- examples/AllTests/HelloTest.cpp | 33 +++++----- examples/AllTests/MockDocumentationTest.cpp | 30 ++++----- examples/AllTests/MockPrinter.h | 14 ++-- examples/AllTests/PrinterTest.cpp | 24 +++---- examples/ApplicationLib/CircularBuffer.cpp | 23 ++++--- examples/ApplicationLib/CircularBuffer.h | 4 +- examples/ApplicationLib/EventDispatcher.cpp | 7 +- examples/ApplicationLib/EventDispatcher.h | 5 +- examples/ApplicationLib/Printer.cpp | 10 +-- examples/ApplicationLib/Printer.h | 4 +- 14 files changed, 138 insertions(+), 136 deletions(-) diff --git a/examples/AllTests/AllTests.h b/examples/AllTests/AllTests.h index aebcc310d..23e8ca287 100644 --- a/examples/AllTests/AllTests.h +++ b/examples/AllTests/AllTests.h @@ -25,8 +25,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -IMPORT_TEST_GROUP( Printer); -IMPORT_TEST_GROUP( CircularBuffer); -IMPORT_TEST_GROUP( HelloWorld); -IMPORT_TEST_GROUP( EventDispatcher); -IMPORT_TEST_GROUP( MockDocumentation); +IMPORT_TEST_GROUP(Printer); +IMPORT_TEST_GROUP(CircularBuffer); +IMPORT_TEST_GROUP(HelloWorld); +IMPORT_TEST_GROUP(EventDispatcher); +IMPORT_TEST_GROUP(MockDocumentation); diff --git a/examples/AllTests/CircularBufferTest.cpp b/examples/AllTests/CircularBufferTest.cpp index 7554385ce..ebaddf2dc 100644 --- a/examples/AllTests/CircularBufferTest.cpp +++ b/examples/AllTests/CircularBufferTest.cpp @@ -30,27 +30,28 @@ #include "CircularBuffer.h" TEST_GROUP(CircularBuffer) -{ CircularBuffer* buffer; - -void setup() -{ - buffer = new CircularBuffer(); -} -void teardown() -{ - delete buffer; -} - -void fillTheQueue(int seed, int howMany) { - for (int i = 0; i < howMany; i++) - buffer->Put(seed + i); -} -void removeFromQueue(int howMany) -{ - for (int i = 0; i < howMany; i++) - buffer->Get(); -} + CircularBuffer* buffer; + + void setup() + { + buffer = new CircularBuffer(); + } + void teardown() + { + delete buffer; + } + + void fillTheQueue(int seed, int howMany) + { + for (int i = 0; i < howMany; i++) + buffer->Put(seed + i); + } + void removeFromQueue(int howMany) + { + for (int i = 0; i < howMany; i++) + buffer->Get(); + } }; TEST(CircularBuffer, EmptyAfterCreation) @@ -134,15 +135,14 @@ TEST(CircularBuffer, PutToFull) buffer->Put(9999); for (int i = 0; i < buffer->Capacity() - 1; i++) - LONGS_EQUAL(i+900+1, buffer->Get()); + LONGS_EQUAL(i + 900 + 1, buffer->Get()); LONGS_EQUAL(9999, buffer->Get()); CHECK(buffer->IsEmpty()); } -//Sometime people ask what tests the tests. -//Do you know the answer - +// Sometime people ask what tests the tests. +// Do you know the answer TEST(CircularBuffer, GetFromEmpty) { @@ -162,8 +162,7 @@ TEST(CircularBuffer, PrintEmpty) Printer* p = &mock; buffer->Print(p); - STRCMP_EQUAL("Circular buffer content:\n<>\n", - mock.getOutput().c_str()); + STRCMP_EQUAL("Circular buffer content:\n<>\n", mock.getOutput().c_str()); } TEST(CircularBuffer, PrintAfterOnePut) @@ -172,8 +171,7 @@ TEST(CircularBuffer, PrintAfterOnePut) buffer->Put(1); buffer->Print(&mock); - STRCMP_EQUAL("Circular buffer content:\n<1>\n", - mock.getOutput().c_str()); + STRCMP_EQUAL("Circular buffer content:\n<1>\n", mock.getOutput().c_str()); } TEST(CircularBuffer, PrintNotYetWrappedOrFull) @@ -184,8 +182,7 @@ TEST(CircularBuffer, PrintNotYetWrappedOrFull) buffer->Put(2); buffer->Put(3); buffer->Print(&mock); - STRCMP_EQUAL("Circular buffer content:\n<1, 2, 3>\n", - mock.getOutput().c_str()); + STRCMP_EQUAL("Circular buffer content:\n<1, 2, 3>\n", mock.getOutput().c_str()); } TEST(CircularBuffer, PrintNotYetWrappedAndIsFull) @@ -195,7 +192,8 @@ TEST(CircularBuffer, PrintNotYetWrappedAndIsFull) fillTheQueue(200, buffer->Capacity()); buffer->Print(&mock); - const char* expected = "Circular buffer content:\n" + const char* expected = + "Circular buffer content:\n" "<200, 201, 202, 203, 204>\n"; STRCMP_EQUAL(expected, mock.getOutput().c_str()); @@ -210,7 +208,8 @@ TEST(CircularBuffer, PrintWrappedAndIsFullOldestToNewest) buffer->Put(999); buffer->Print(&mock); - const char* expected = "Circular buffer content:\n" + const char* expected = + "Circular buffer content:\n" "<201, 202, 203, 204, 999>\n"; STRCMP_EQUAL(expected, mock.getOutput().c_str()); @@ -224,7 +223,8 @@ TEST(CircularBuffer, PrintWrappedAndFullOverwriteOldest) buffer->Put(9999); buffer->Print(&mock); - const char* expected = "Circular buffer content:\n" + const char* expected = + "Circular buffer content:\n" "<201, 202, 203, 204, 9999>\n"; STRCMP_EQUAL(expected, mock.getOutput().c_str()); @@ -240,7 +240,8 @@ TEST(CircularBuffer, PrintBoundary) fillTheQueue(300, buffer->Capacity() - 1); buffer->Print(&mock); - const char* expected = "Circular buffer content:\n" + const char* expected = + "Circular buffer content:\n" "<888, 300, 301, 302, 303>\n"; STRCMP_EQUAL(expected, mock.getOutput().c_str()); @@ -253,7 +254,8 @@ TEST(CircularBuffer, FillEmptyThenPrint) fillTheQueue(200, buffer->Capacity()); removeFromQueue(buffer->Capacity()); buffer->Print(&mock); - const char* expected = "Circular buffer content:\n" + const char* expected = + "Circular buffer content:\n" "<>\n"; STRCMP_EQUAL(expected, mock.getOutput().c_str()); diff --git a/examples/AllTests/EventDispatcherTest.cpp b/examples/AllTests/EventDispatcherTest.cpp index 4515ff559..09ff16415 100644 --- a/examples/AllTests/EventDispatcherTest.cpp +++ b/examples/AllTests/EventDispatcherTest.cpp @@ -34,7 +34,11 @@ class ObserverMock : public EventObserver public: virtual void notify(const Event& event, int timeOutInSeconds) { - mock().actualCall("notify").onObject(this).withParameterOfType("Event", "event", (void*) &event).withParameter("timeOutInSeconds", timeOutInSeconds); + mock() + .actualCall("notify") + .onObject(this) + .withParameterOfType("Event", "event", (void*)&event) + .withParameter("timeOutInSeconds", timeOutInSeconds); } virtual void notifyRegistration(EventObserver* newObserver) { @@ -55,7 +59,6 @@ class EventComparator : public MockNamedValueComparator } }; - TEST_GROUP(EventDispatcher) { Event event; @@ -76,7 +79,6 @@ TEST_GROUP(EventDispatcher) } }; - TEST(EventDispatcher, EventWithoutRegistrationsResultsIntoNoCalls) { dispatcher->dispatchEvent(event, 10); @@ -84,7 +86,11 @@ TEST(EventDispatcher, EventWithoutRegistrationsResultsIntoNoCalls) TEST(EventDispatcher, EventWithRegistrationForEventResultsIntoCallback) { - mock().expectOneCall("notify").onObject(&observer).withParameterOfType("Event", "event", &event).withParameter("timeOutInSeconds", 10); + mock() + .expectOneCall("notify") + .onObject(&observer) + .withParameterOfType("Event", "event", &event) + .withParameter("timeOutInSeconds", 10); event.type = IMPORTANT_EVENT; dispatcher->registerObserver(IMPORTANT_EVENT, &observer); @@ -100,8 +106,16 @@ TEST(EventDispatcher, DifferentEventWithRegistrationDoesNotResultIntoCallback) TEST(EventDispatcher, RegisterTwoObserversResultIntoTwoCallsAndARegistrationNotification) { - mock().expectOneCall("notify").onObject(&observer).withParameterOfType("Event", "event", &event).withParameter("timeOutInSeconds", 10); - mock().expectOneCall("notify").onObject(&observer2).withParameterOfType("Event", "event", &event).withParameter("timeOutInSeconds", 10); + mock() + .expectOneCall("notify") + .onObject(&observer) + .withParameterOfType("Event", "event", &event) + .withParameter("timeOutInSeconds", 10); + mock() + .expectOneCall("notify") + .onObject(&observer2) + .withParameterOfType("Event", "event", &event) + .withParameter("timeOutInSeconds", 10); mock().expectOneCall("notifyRegistration").onObject(&observer).withParameter("newObserver", &observer2); event.type = IMPORTANT_EVENT; diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index 35ccd8551..afe2ea446 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -30,7 +30,7 @@ #include "CppUTest/TestRegistry.h" #if CPPUTEST_HAVE_FENV -#include "CppUTestExt/IEEE754ExceptionsPlugin.h" + #include "CppUTestExt/IEEE754ExceptionsPlugin.h" /* * To see a demonstration of tests failing as a result of IEEE754ExceptionsPlugin @@ -42,7 +42,7 @@ extern "C" { #include } -#include + #include static volatile float f; @@ -63,14 +63,16 @@ IGNORE_TEST(FE_Demo, should_fail_when__FE_DIVBYZERO__is_set) IGNORE_TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) { f = 0.01f; - while (f > 0.0f) f *= f; + while (f > 0.0f) + f *= f; CHECK(f == 0.0f); } IGNORE_TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) { f = 1000.0f; - while (f < std::numeric_limits::infinity()) f *= f; + while (f < std::numeric_limits::infinity()) + f *= f; CHECK(f >= std::numeric_limits::infinity()); } @@ -78,7 +80,7 @@ IGNORE_TEST(FE_Demo, should_fail_when__FE_INEXACT____is_set) { IEEE754ExceptionsPlugin::enableInexact(); f = 10.0f; - DOUBLES_EQUAL((double) (f / 3.0f), (double) 3.333f, (double) 0.001f); + DOUBLES_EQUAL((double)(f / 3.0f), (double)3.333f, (double)0.001f); } TEST(FE_Demo, should_succeed_when_no_flags_are_set) diff --git a/examples/AllTests/HelloTest.cpp b/examples/AllTests/HelloTest.cpp index 84407906d..10311d96f 100644 --- a/examples/AllTests/HelloTest.cpp +++ b/examples/AllTests/HelloTest.cpp @@ -34,23 +34,24 @@ static SimpleString* buffer; TEST_GROUP(HelloWorld) -{ static int output_method(const char* output, ...) { - va_list arguments; - va_start(arguments, output); - *buffer = VStringFromFormat(output, arguments); - va_end(arguments); - return 1; -} -void setup() -{ - buffer = new SimpleString(); - UT_PTR_SET(PrintFormated, &output_method); -} -void teardown() -{ - delete buffer; -} + static int output_method(const char* output, ...) + { + va_list arguments; + va_start(arguments, output); + *buffer = VStringFromFormat(output, arguments); + va_end(arguments); + return 1; + } + void setup() + { + buffer = new SimpleString(); + UT_PTR_SET(PrintFormated, &output_method); + } + void teardown() + { + delete buffer; + } }; TEST(HelloWorld, PrintOk) diff --git a/examples/AllTests/MockDocumentationTest.cpp b/examples/AllTests/MockDocumentationTest.cpp index e2b79d726..244d5c4b3 100644 --- a/examples/AllTests/MockDocumentationTest.cpp +++ b/examples/AllTests/MockDocumentationTest.cpp @@ -25,7 +25,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include "CppUTest/TestHarness.h" #include "CppUTestExt/MockSupport.h" #include "CppUTestExt/MockSupport_c.h" @@ -36,15 +35,14 @@ TEST_GROUP(FirstTestGroup) TEST(FirstTestGroup, FirsTest) { -// FAIL("Fail me!"); + // FAIL("Fail me!"); } TEST(FirstTestGroup, SecondTest) { -// STRCMP_EQUAL("hello", "world"); + // STRCMP_EQUAL("hello", "world"); } - TEST_GROUP(MockDocumentation) { }; @@ -64,7 +62,7 @@ TEST(MockDocumentation, SimpleScenario) class ClassFromProductionCode { public: - virtual void importantFunction(){} + virtual void importantFunction() {} virtual ~ClassFromProductionCode() {} }; @@ -90,13 +88,13 @@ TEST(MockDocumentation, SimpleScenarioObject) static void parameters_function(int p1, const char* p2) { - void* object = (void*) 1; + void* object = (void*)1; mock().actualCall("function").onObject(object).withParameter("p1", p1).withParameter("p2", p2); } TEST(MockDocumentation, parameters) { - void* object = (void*) 1; + void* object = (void*)1; mock().expectOneCall("function").onObject(object).withParameter("p1", 2).withParameter("p2", "hah"); parameters_function(2, "hah"); } @@ -116,7 +114,7 @@ class MyTypeComparator : public MockNamedValueComparator TEST(MockDocumentation, ObjectParameters) { - void* object = (void*) 1; + void* object = (void*)1; MyTypeComparator comparator; mock().installComparator("myType", comparator); mock().expectOneCall("function").withParameterOfType("myType", "parameterName", object); @@ -138,22 +136,20 @@ TEST(MockDocumentation, setData) mock().setData("importantValue", 10); mock().setDataObject("importantObject", "ClassFromProductionCode", &object); - ClassFromProductionCode * pobject; + ClassFromProductionCode* pobject; int value = mock().getData("importantValue").getIntValue(); - pobject = (ClassFromProductionCode*) mock().getData("importantObject").getObjectPointer(); + pobject = (ClassFromProductionCode*)mock().getData("importantObject").getObjectPointer(); LONGS_EQUAL(10, value); POINTERS_EQUAL(pobject, &object); } -static void doSomethingThatWouldOtherwiseBlowUpTheMockingFramework() -{ -} +static void doSomethingThatWouldOtherwiseBlowUpTheMockingFramework() {} TEST(MockDocumentation, otherMockSupport) { mock().crashOnFailure(); -// mock().actualCall("unex"); + // mock().actualCall("unex"); mock().expectOneCall("foo"); mock().ignoreOtherCalls(); @@ -163,7 +159,6 @@ TEST(MockDocumentation, otherMockSupport) mock().enable(); mock().clear(); - } TEST(MockDocumentation, scope) @@ -174,7 +169,7 @@ TEST(MockDocumentation, scope) mock("xmlparser").actualCall("open"); } -static int equalMethod(const void* object1, const void* object2) +static int equalMethod(const void* object1, const void* object2) { return object1 == object2; } @@ -186,13 +181,12 @@ static const char* toStringMethod(const void*) TEST(MockDocumentation, CInterface) { - void* object = (void*) 0x1; + void* object = (void*)0x1; mock_c()->expectOneCall("foo")->withIntParameters("integer", 10)->andReturnDoubleValue(1.11); double d = mock_c()->actualCall("foo")->withIntParameters("integer", 10)->returnValue().value.doubleValue; DOUBLES_EQUAL(1.11, d, 0.00001); - mock_c()->installComparator("type", equalMethod, toStringMethod); mock_scope_c("scope")->expectOneCall("bar")->withParameterOfType("type", "name", object); mock_scope_c("scope")->actualCall("bar")->withParameterOfType("type", "name", object); diff --git a/examples/AllTests/MockPrinter.h b/examples/AllTests/MockPrinter.h index 90dd435d5..806aae13d 100644 --- a/examples/AllTests/MockPrinter.h +++ b/examples/AllTests/MockPrinter.h @@ -40,15 +40,11 @@ #include #include -class MockPrinter: public Printer +class MockPrinter : public Printer { public: - explicit MockPrinter() - { - } - virtual ~MockPrinter() - { - } + explicit MockPrinter() {} + virtual ~MockPrinter() {} virtual void Print(const char* s) { @@ -68,12 +64,10 @@ class MockPrinter: public Printer } private: - std::string savedOutput; MockPrinter(const MockPrinter&); MockPrinter& operator=(const MockPrinter&); - }; -#endif // D_MockPrinter_H +#endif // D_MockPrinter_H diff --git a/examples/AllTests/PrinterTest.cpp b/examples/AllTests/PrinterTest.cpp index 1f872597a..f88f9f52d 100644 --- a/examples/AllTests/PrinterTest.cpp +++ b/examples/AllTests/PrinterTest.cpp @@ -30,18 +30,19 @@ #include "MockPrinter.h" TEST_GROUP(Printer) -{ Printer* printer; -MockPrinter* mockPrinter; - -void setup() -{ - mockPrinter = new MockPrinter(); - printer = mockPrinter; -} -void teardown() { - delete printer; -} + Printer* printer; + MockPrinter* mockPrinter; + + void setup() + { + mockPrinter = new MockPrinter(); + printer = mockPrinter; + } + void teardown() + { + delete printer; + } }; TEST(Printer, PrintConstCharStar) @@ -65,4 +66,3 @@ TEST(Printer, StreamOperators) const char* expected = "n=1234"; CHECK_EQUAL(expected, mockPrinter->getOutput()); } - diff --git a/examples/ApplicationLib/CircularBuffer.cpp b/examples/ApplicationLib/CircularBuffer.cpp index 3aa794cef..5324891b4 100644 --- a/examples/ApplicationLib/CircularBuffer.cpp +++ b/examples/ApplicationLib/CircularBuffer.cpp @@ -29,10 +29,9 @@ #include "Printer.h" #include -CircularBuffer::CircularBuffer(int _capacity) : - index(0), outdex(0), capacity(_capacity), empty(true), full(false) +CircularBuffer::CircularBuffer(int _capacity) : index(0), outdex(0), capacity(_capacity), empty(true), full(false) { - buffer = new int[(size_t) this->capacity]; + buffer = new int[(size_t)this->capacity]; } CircularBuffer::~CircularBuffer() @@ -55,8 +54,10 @@ void CircularBuffer::Put(int i) empty = false; buffer[index] = i; index = Next(index); - if (full) outdex = Next(outdex); - else if (index == outdex) full = true; + if (full) + outdex = Next(outdex); + else if (index == outdex) + full = true; } int CircularBuffer::Get() @@ -67,7 +68,8 @@ int CircularBuffer::Get() if (!empty) { result = buffer[outdex]; outdex = Next(outdex); - if (outdex == index) empty = true; + if (outdex == index) + empty = true; } return result; } @@ -79,7 +81,8 @@ int CircularBuffer::Capacity() int CircularBuffer::Next(int i) { - if (++i >= capacity) i = 0; + if (++i >= capacity) + i = 0; return i; } @@ -90,12 +93,14 @@ void CircularBuffer::Print(Printer* p) int printIndex = outdex; int count = index - outdex; - if (!empty && (index <= outdex)) count = capacity - (outdex - index); + if (!empty && (index <= outdex)) + count = capacity - (outdex - index); for (int i = 0; i < count; i++) { p->Print(buffer[printIndex]); printIndex = Next(printIndex); - if (i + 1 != count) p->Print(", "); + if (i + 1 != count) + p->Print(", "); } p->Print(">\n"); } diff --git a/examples/ApplicationLib/CircularBuffer.h b/examples/ApplicationLib/CircularBuffer.h index e804c29ba..1239a143c 100644 --- a/examples/ApplicationLib/CircularBuffer.h +++ b/examples/ApplicationLib/CircularBuffer.h @@ -52,7 +52,6 @@ class CircularBuffer void Print(Printer*); private: - int index; int outdex; int* buffer; @@ -66,7 +65,6 @@ class CircularBuffer CircularBuffer(const CircularBuffer&); CircularBuffer& operator=(const CircularBuffer&); - }; -#endif // D_CircularBuffer_H +#endif // D_CircularBuffer_H diff --git a/examples/ApplicationLib/EventDispatcher.cpp b/examples/ApplicationLib/EventDispatcher.cpp index ef5ebbcba..142aae404 100644 --- a/examples/ApplicationLib/EventDispatcher.cpp +++ b/examples/ApplicationLib/EventDispatcher.cpp @@ -28,9 +28,7 @@ #include "EventDispatcher.h" using namespace std; -EventDispatcher::EventDispatcher() -{ -} +EventDispatcher::EventDispatcher() {} void EventDispatcher::registerObserver(EventType type, EventObserver* observer) { @@ -42,8 +40,7 @@ void EventDispatcher::registerObserver(EventType type, EventObserver* observer) void EventDispatcher::dispatchEvent(const Event& event, int timeoutSeconds) { - for (list >::iterator i = observerList_.begin(); i != observerList_.end(); i++) - { + for (list >::iterator i = observerList_.begin(); i != observerList_.end(); i++) { if (i->first == event.type) i->second->notify(event, timeoutSeconds); } diff --git a/examples/ApplicationLib/EventDispatcher.h b/examples/ApplicationLib/EventDispatcher.h index 06e2c687c..34f0843e8 100644 --- a/examples/ApplicationLib/EventDispatcher.h +++ b/examples/ApplicationLib/EventDispatcher.h @@ -45,14 +45,15 @@ class Event class EventObserver { public: - virtual void notify(const Event& event, int timeOutInSeconds)=0; - virtual void notifyRegistration(EventObserver* newObserver)=0; + virtual void notify(const Event& event, int timeOutInSeconds) = 0; + virtual void notifyRegistration(EventObserver* newObserver) = 0; virtual ~EventObserver() {} }; class EventDispatcher { std::list > observerList_; + public: EventDispatcher(); diff --git a/examples/ApplicationLib/Printer.cpp b/examples/ApplicationLib/Printer.cpp index af9c9266d..b73b41832 100644 --- a/examples/ApplicationLib/Printer.cpp +++ b/examples/ApplicationLib/Printer.cpp @@ -28,13 +28,9 @@ #include "Printer.h" #include -Printer::Printer() -{ -} +Printer::Printer() {} -Printer::~Printer() -{ -} +Printer::~Printer() {} void Printer::Print(const char* s) { @@ -44,7 +40,7 @@ void Printer::Print(const char* s) void Printer::Print(long int n) { - printf("%ld", n); + printf("%ld", n); } Printer& operator<<(Printer& p, const char* s) diff --git a/examples/ApplicationLib/Printer.h b/examples/ApplicationLib/Printer.h index dcfc59ccd..73f08e109 100644 --- a/examples/ApplicationLib/Printer.h +++ b/examples/ApplicationLib/Printer.h @@ -44,13 +44,11 @@ class Printer virtual void Print(long int); private: - Printer(const Printer&); Printer& operator=(const Printer&); - }; Printer& operator<<(Printer&, const char*); Printer& operator<<(Printer&, long int); -#endif // D_Printer_H +#endif // D_Printer_H From 66208e9c256a1a692585cea8a367f1b431922541 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 1 Sep 2022 23:23:28 -0700 Subject: [PATCH 0826/1093] ignore formatting in blames --- .git-blame-ignore-revs | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .git-blame-ignore-revs diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 000000000..30c51b94f --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,7 @@ +# Enable via `git config blame.ignoreRevsFile .git-blame-ignore-revs` + +# Fix line endings +e674cfe759b20c6b78becbc50d8f9f644d32ea8a + +# clang-format +2a4942eb93b823c9723d4797222d6d3315f3bef2 From 1242c913c592fa8ae5026f84102a3b7fc61c84ce Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Sep 2022 19:52:26 -0700 Subject: [PATCH 0827/1093] FindPkgConfig isn't used --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 67850a65a..1b4f29739 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,7 +172,6 @@ if(PROJECT_IS_TOP_LEVEL) set (INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") # Pkg-config file - include(FindPkgConfig) set(CppUTest_PKGCONFIG_FILE cpputest.pc) # Pkg-config file. From fe378a68a4d5034327661e56e324c35a72115b09 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Sep 2022 19:54:03 -0700 Subject: [PATCH 0828/1093] Cleanup --- CMakeLists.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b4f29739..818713017 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,7 +172,7 @@ if(PROJECT_IS_TOP_LEVEL) set (INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") # Pkg-config file - set(CppUTest_PKGCONFIG_FILE cpputest.pc) + set(CppUTest_PKGCONFIG_FILE ${CMAKE_CURRENT_BINARY_DIR}/cpputest.pc) # Pkg-config file. set (prefix "${CMAKE_INSTALL_PREFIX}") @@ -181,14 +181,14 @@ if(PROJECT_IS_TOP_LEVEL) set (includedir "\${prefix}/${INCLUDE_INSTALL_DIR}") set (PACKAGE_VERSION "${PROJECT_VERSION}") - configure_file (cpputest.pc.in - ${CMAKE_CURRENT_BINARY_DIR}/${CppUTest_PKGCONFIG_FILE} @ONLY) - - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CppUTest_PKGCONFIG_FILE} + configure_file (cpputest.pc.in "${CppUTest_PKGCONFIG_FILE}" @ONLY) + install( + FILES "${CppUTest_PKGCONFIG_FILE}" DESTINATION ${LIB_INSTALL_DIR}/pkgconfig ) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" + install( + FILES "${CMAKE_CURRENT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" DESTINATION "${INCLUDE_INSTALL_DIR}/CppUTest" ) From 20109cdc0908c60dfc9848ddcd5701a300ce1e76 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Sep 2022 21:30:54 -0700 Subject: [PATCH 0829/1093] Add GNU ARM embedded build --- .github/workflows/extended.yml | 17 +++++++++++++++++ cmake/arm-none-eabi-gcc.toolchain.cmake | 8 ++++++++ 2 files changed, 25 insertions(+) create mode 100644 cmake/arm-none-eabi-gcc.toolchain.cmake diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 666ee5e39..44b70c085 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -113,3 +113,20 @@ jobs: cmake -B build -S examples cmake --build build -j ctest --test-dir build + + arm-embedded: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@main + - uses: carlosperate/arm-none-eabi-gcc-action@v1 + - name: Configure + run: > + cmake + -B cpputest_build + -D CMAKE_TOOLCHAIN_FILE=cmake/arm-none-eabi-gcc.toolchain.cmake + - name: Build + run: cmake --build cpputest_build + - name: Test + # This won't do anything, because there is no way to run the tests. + run: ctest --test-dir cpputest_build diff --git a/cmake/arm-none-eabi-gcc.toolchain.cmake b/cmake/arm-none-eabi-gcc.toolchain.cmake new file mode 100644 index 000000000..ebcdb9645 --- /dev/null +++ b/cmake/arm-none-eabi-gcc.toolchain.cmake @@ -0,0 +1,8 @@ +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR cortex-m4) + +set(CMAKE_C_COMPILER arm-none-eabi-gcc) + +set(CMAKE_C_FLAGS_INIT "-mcpu=cortex-m4") +set(CMAKE_CXX_FLAGS_INIT "-mcpu=cortex-m4") +set(CMAKE_EXE_LINKER_FLAGS_INIT "-specs=nano.specs -specs=rdimon.specs") From 898e5290a91cf15a4d9879975685ec2546c864e7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Sep 2022 21:38:49 -0700 Subject: [PATCH 0830/1093] Repair build --- examples/AllTests/CMakeLists.txt | 4 +++- src/Platforms/Gcc/UtestPlatform.cpp | 2 +- tests/CppUTestExt/MockReturnValueTest.cpp | 12 ++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/examples/AllTests/CMakeLists.txt b/examples/AllTests/CMakeLists.txt index 438525acd..5b4df03df 100644 --- a/examples/AllTests/CMakeLists.txt +++ b/examples/AllTests/CMakeLists.txt @@ -24,4 +24,6 @@ target_link_libraries(ExampleTests ) include(CppUTestBuildTimeDiscoverTests) -cpputest_buildtime_discover_tests(ExampleTests) +if(CPPUTEST_TEST_DISCOVERY OR NOT DEFINED CPPUTEST_TEST_DISCOVERY) + cpputest_buildtime_discover_tests(ExampleTests) +endif() diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 06d226447..c68dc952b 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -204,7 +204,7 @@ static long TimeInMillisImplementation() struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); - return (tv.tv_sec * 1000) + (long)((double)tv.tv_usec * 0.001); + return (long)((tv.tv_sec * 1000) + (time_t)((double)tv.tv_usec * 0.001)); #else return 0; #endif diff --git a/tests/CppUTestExt/MockReturnValueTest.cpp b/tests/CppUTestExt/MockReturnValueTest.cpp index 0abe85b90..f8c271c94 100644 --- a/tests/CppUTestExt/MockReturnValueTest.cpp +++ b/tests/CppUTestExt/MockReturnValueTest.cpp @@ -145,7 +145,7 @@ TEST(MockReturnValueTest, UnsignedLongIntReturnValueCanBeRetrievedAsUnsignedLong TEST(MockReturnValueTest, UnsignedLongLongIntReturnValueCanBeRetrieved) { - unsigned long long int expected_value = ULLONG_MAX; + unsigned long long int expected_value = 2ULL; mock().expectOneCall("foo").andReturnValue(expected_value); UNSIGNED_LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getUnsignedLongLongIntValue()); } @@ -180,7 +180,7 @@ TEST(MockReturnValueTest, UnsignedLongIntReturnValueCanBeRetrievedAsLongLongInt) TEST(MockReturnValueTest, LongLongIntReturnValueCanBeRetrieved) { - long long int expected_value = LLONG_MAX; + long long int expected_value = 2LL; mock().expectOneCall("foo").andReturnValue(expected_value); LONGLONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getLongLongIntValue()); } @@ -288,7 +288,7 @@ TEST(MockReturnValueTest, WhenNoLongIntegerReturnValueIsExpectedButThereIsADefau TEST(MockReturnValueTest, WhenAUnsignedLongLongIntegerReturnValueIsExpectedAndAlsoThereIsADefaultShouldlIgnoreTheDefault) { - unsigned long long int default_return_value = ULLONG_MAX; + unsigned long long int default_return_value = 2ULL; unsigned long long int expected_return_value = default_return_value - 1; mock().expectOneCall("foo").andReturnValue(expected_return_value); LONGS_EQUAL(expected_return_value, mock().actualCall("foo").returnUnsignedLongLongIntValueOrDefault(default_return_value)); @@ -297,7 +297,7 @@ TEST(MockReturnValueTest, WhenAUnsignedLongLongIntegerReturnValueIsExpectedAndAl TEST(MockReturnValueTest, WhenNoUnsignedLongLongIntegerReturnValueIsExpectedButThereIsADefaultShouldlUseTheDefaultValue) { - unsigned long long int default_return_value = ULLONG_MAX; + unsigned long long int default_return_value = 2ULL; mock().expectOneCall("foo"); LONGS_EQUAL(default_return_value, mock().actualCall("foo").returnUnsignedLongLongIntValueOrDefault(default_return_value)); LONGS_EQUAL(default_return_value, mock().returnUnsignedLongLongIntValueOrDefault(default_return_value)); @@ -305,7 +305,7 @@ TEST(MockReturnValueTest, WhenNoUnsignedLongLongIntegerReturnValueIsExpectedButT TEST(MockReturnValueTest, WhenALongLongIntegerReturnValueIsExpectedAndAlsoThereIsADefaultShouldlIgnoreTheDefault) { - long long int default_return_value = LLONG_MAX; + long long int default_return_value = 2LL; long long int expected_return_value = default_return_value - 1; mock().expectOneCall("foo").andReturnValue(expected_return_value); LONGS_EQUAL(expected_return_value, mock().actualCall("foo").returnLongLongIntValueOrDefault(default_return_value)); @@ -314,7 +314,7 @@ TEST(MockReturnValueTest, WhenALongLongIntegerReturnValueIsExpectedAndAlsoThereI TEST(MockReturnValueTest, WhenNoLongLongIntegerReturnValueIsExpectedButThereIsADefaultShouldlUseTheDefaultValue) { - long long int default_return_value = LLONG_MAX; + long long int default_return_value = 2LL; mock().expectOneCall("foo"); LONGS_EQUAL(default_return_value, mock().actualCall("foo").returnLongLongIntValueOrDefault(default_return_value)); LONGS_EQUAL(default_return_value, mock().returnLongLongIntValueOrDefault(default_return_value)); From 4828edbf074c4b033b39dee8c2bc64703d81e07c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 1 Sep 2022 14:17:46 -0700 Subject: [PATCH 0831/1093] Detect missing exception support --- .github/workflows/extended.yml | 17 +++++++++++++++++ CMakeLists.txt | 9 ++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 44b70c085..91ab87c8e 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -97,6 +97,23 @@ jobs: - name: Test run: ctest --test-dir build + cmake_no_exceptions: + runs-on: ubuntu-latest + name: Disable exceptions + env: + CC: gcc + CXX: g++ + CXXFLAGS: -fno-exceptions + steps: + - name: Checkout + uses: actions/checkout@main + - name: Configure + run: cmake -B cpputest_build -S . + - name: Build + run: cmake --build cpputest_build --verbose + - name: Test + run: ctest --test-dir cpputest_build + cmake_install: runs-on: ubuntu-latest steps: diff --git a/CMakeLists.txt b/CMakeLists.txt index 24a39a57e..bc6d2addc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,8 +28,15 @@ include(CTest) include(CMakeDependentOption) option(CPPUTEST_STD_C_LIB_DISABLED "Disable the standard C library") + +include(CheckCXXSourceCompiles) +check_cxx_source_compiles( + "int main(int argc, char ** argv) { throw 20; }" + CPPUTEST_HAVE_EXCEPTIONS +) + cmake_dependent_option(CPPUTEST_STD_CPP_LIB_DISABLED "Use the standard C++ library" - OFF "NOT CPPUTEST_STD_C_LIB_DISABLED" ON) + OFF "NOT CPPUTEST_STD_C_LIB_DISABLED;CPPUTEST_HAVE_EXCEPTIONS" ON) option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) cmake_dependent_option(CPPUTEST_MEM_LEAK_DETECTION_DISABLED "Enable memory leak detection" OFF "NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED" ON) From da99c5ceaef429e9f9377e79b465b8bdc5ee99c5 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 1 Sep 2022 14:36:24 -0700 Subject: [PATCH 0832/1093] Disable examples without C++ standard library --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc6d2addc..efdb33252 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,8 +60,8 @@ cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTe option(CPPUTEST_TESTS_DETAILED "Run each test separately instead of grouped?" OFF) cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" ON "CPPUTEST_BUILD_TESTING;CMAKE_CROSSCOMPILING_EMULATOR OR NOT CMAKE_CROSSCOMPILING" OFF) - -option(CPPUTEST_EXAMPLES "Compile and make examples?" ${PROJECT_IS_TOP_LEVEL}) +cmake_dependent_option(CPPUTEST_EXAMPLES "Compile and make examples?" + ${PROJECT_IS_TOP_LEVEL} "NOT CPPUTEST_STD_CPP_LIB_DISABLED" OFF) option(CPPUTEST_VERBOSE_CONFIG "Print configuration to stdout during generation" ${PROJECT_IS_TOP_LEVEL}) cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" From 489c3ce7d2e8132a886aed01b6698c7461f79a8b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 1 Sep 2022 14:37:10 -0700 Subject: [PATCH 0833/1093] Resolve unused variable warning --- tests/CppUTest/TestFailureNaNTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/CppUTest/TestFailureNaNTest.cpp b/tests/CppUTest/TestFailureNaNTest.cpp index 4c9e715bd..f51107800 100644 --- a/tests/CppUTest/TestFailureNaNTest.cpp +++ b/tests/CppUTest/TestFailureNaNTest.cpp @@ -29,14 +29,14 @@ #include "CppUTest/TestOutput.h" #include "CppUTest/PlatformSpecificFunctions.h" +#if CPPUTEST_HAS_NAN == 1 && CPPUTEST_HAS_INF == 1 + namespace { const int failLineNumber = 2; const char* failFileName = "fail.cpp"; } -#if CPPUTEST_HAS_NAN == 1 && CPPUTEST_HAS_INF == 1 - static double zero = 0.0; static double one = 1.0; static double not_a_number = zero / zero; From 18123af84789f6d4a0be23170be6259e11710e51 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 7 Sep 2022 18:10:23 -0700 Subject: [PATCH 0834/1093] Omit tests from coverage This is in line with behavior from before CI broke: https://coveralls.io/builds/44525666 --- .github/workflows/extended.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 91ab87c8e..e129abc01 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -44,7 +44,9 @@ jobs: - name: Test run: ctest --test-dir cpputest_build - name: Coverage - run: lcov --capture --directory . --no-external --output-file lcov.info + run: | + lcov --capture --directory . --no-external --output-file lcov.info + lcov --remove lcov.info --output-file lcov.info '*/tests/*' - name: Coveralls uses: coverallsapp/github-action@master with: From a3f5970c68dfd190c41524f4eac7d7558878306e Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 5 Sep 2022 11:22:37 -0700 Subject: [PATCH 0835/1093] Use standard named constants --- tests/CppUTest/TestFailureNaNTest.cpp | 34 +++++++-------------------- tests/CppUTest/UtestTest.cpp | 24 +++++++++---------- 2 files changed, 20 insertions(+), 38 deletions(-) diff --git a/tests/CppUTest/TestFailureNaNTest.cpp b/tests/CppUTest/TestFailureNaNTest.cpp index f51107800..9b8627a07 100644 --- a/tests/CppUTest/TestFailureNaNTest.cpp +++ b/tests/CppUTest/TestFailureNaNTest.cpp @@ -31,22 +31,14 @@ #if CPPUTEST_HAS_NAN == 1 && CPPUTEST_HAS_INF == 1 +#include "math.h" + namespace { const int failLineNumber = 2; const char* failFileName = "fail.cpp"; } -static double zero = 0.0; -static double one = 1.0; -static double not_a_number = zero / zero; -static double infinity = one / zero; - -extern "C" { - static int IsNanForSystemsWithoutNan(double d) { return ((long)not_a_number == (long)d); } - static int IsInfForSystemsWithoutInf(double d) { return ((long)infinity == (long)d); } -} - TEST_GROUP(TestFailureNanAndInf) { UtestShell* test; @@ -54,16 +46,6 @@ TEST_GROUP(TestFailureNanAndInf) void setup() _override { test = new UtestShell("groupname", "testname", failFileName, failLineNumber-1); - if(PlatformSpecificIsNan(not_a_number) == false) - { - not_a_number = -1.0; - UT_PTR_SET(PlatformSpecificIsNan, IsNanForSystemsWithoutNan); - } - if(PlatformSpecificIsInf(infinity) == false) - { - infinity = -2.0; - UT_PTR_SET(PlatformSpecificIsInf, IsInfForSystemsWithoutInf); - } } void teardown() _override { @@ -74,7 +56,7 @@ TEST_GROUP(TestFailureNanAndInf) TEST(TestFailureNanAndInf, DoublesEqualExpectedIsNaN) { - DoublesEqualFailure f(test, failFileName, failLineNumber, not_a_number, 2.0, 3.0, ""); + DoublesEqualFailure f(test, failFileName, failLineNumber, NAN, 2.0, 3.0, ""); FAILURE_EQUAL("expected \n" "\tbut was <2> threshold used was <3>\n" "\tCannot make comparisons with Nan", f); @@ -82,7 +64,7 @@ TEST(TestFailureNanAndInf, DoublesEqualExpectedIsNaN) TEST(TestFailureNanAndInf, DoublesEqualActualIsNaN) { - DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, not_a_number, 3.0, ""); + DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, NAN, 3.0, ""); FAILURE_EQUAL("expected <1>\n" "\tbut was threshold used was <3>\n" "\tCannot make comparisons with Nan", f); @@ -90,7 +72,7 @@ TEST(TestFailureNanAndInf, DoublesEqualActualIsNaN) TEST(TestFailureNanAndInf, DoublesEqualThresholdIsNaN) { - DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, 2.0, not_a_number, ""); + DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, 2.0, NAN, ""); FAILURE_EQUAL("expected <1>\n" "\tbut was <2> threshold used was \n" "\tCannot make comparisons with Nan", f); @@ -98,21 +80,21 @@ TEST(TestFailureNanAndInf, DoublesEqualThresholdIsNaN) TEST(TestFailureNanAndInf, DoublesEqualExpectedIsInf) { - DoublesEqualFailure f(test, failFileName, failLineNumber, infinity, 2.0, 3.0, ""); + DoublesEqualFailure f(test, failFileName, failLineNumber, INFINITY, 2.0, 3.0, ""); FAILURE_EQUAL("expected \n" "\tbut was <2> threshold used was <3>", f); } TEST(TestFailureNanAndInf, DoublesEqualActualIsInf) { - DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, infinity, 3.0, ""); + DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, INFINITY, 3.0, ""); FAILURE_EQUAL("expected <1>\n" "\tbut was threshold used was <3>", f); } TEST(TestFailureNanAndInf, DoublesEqualThresholdIsInf) { - DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, not_a_number, infinity, ""); + DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, NAN, INFINITY, ""); FAILURE_EQUAL("expected <1>\n" "\tbut was threshold used was \n" "\tCannot make comparisons with Nan", f); diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 06737aa64..d22526009 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -30,6 +30,10 @@ #include "CppUTest/TestTestingFixture.h" #include "CppUTest/PlatformSpecificFunctions.h" +#if CPPUTEST_HAS_INF || CPPUTEST_HAS_NAN +#include "math.h" +#endif + TEST_GROUP(UtestShell) { TestTestingFixture fixture; @@ -56,8 +60,6 @@ static void exitTestMethod_() FAIL("Should not get here"); } -static volatile double zero = 0.0; - TEST(UtestShell, compareDoubles) { CHECK(doubles_equal(1.0, 1.001, 0.01)); @@ -69,22 +71,20 @@ TEST(UtestShell, compareDoubles) #if CPPUTEST_HAS_NAN == 1 TEST(UtestShell, compareDoublesNaN) { - double not_a_number = zero / zero; - CHECK(!doubles_equal(not_a_number, 1.001, 0.01)); - CHECK(!doubles_equal(1.0, not_a_number, 0.01)); - CHECK(!doubles_equal(1.0, 1.001, not_a_number)); + CHECK(!doubles_equal(NAN, 1.001, 0.01)); + CHECK(!doubles_equal(1.0, NAN, 0.01)); + CHECK(!doubles_equal(1.0, 1.001, NAN)); } #endif #if CPPUTEST_HAS_INF == 1 TEST(UtestShell, compareDoublesInf) { - double infinity = 1 / zero; - CHECK(!doubles_equal(infinity, 1.0, 0.01)); - CHECK(!doubles_equal(1.0, infinity, 0.01)); - CHECK(doubles_equal(1.0, -1.0, infinity)); - CHECK(doubles_equal(infinity, infinity, 0.01)); - CHECK(doubles_equal(infinity, infinity, infinity)); + CHECK(!doubles_equal(INFINITY, 1.0, 0.01)); + CHECK(!doubles_equal(1.0, INFINITY, 0.01)); + CHECK(doubles_equal(1.0, -1.0, INFINITY)); + CHECK(doubles_equal(INFINITY, INFINITY, 0.01)); + CHECK(doubles_equal(INFINITY, INFINITY, INFINITY)); } #endif From 4f8aeff6f61130349290dd4dbea59930c2d835d5 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 5 Sep 2022 13:08:25 -0700 Subject: [PATCH 0836/1093] Drop CPPUTEST_HAS_NAN, CPPUTEST_HAS_INF --- CMakeLists.txt | 8 -------- config.h.cmake | 2 -- include/CppUTest/CppUTestConfig.h | 17 ----------------- tests/CppUTest/TestFailureNaNTest.cpp | 6 ++++-- tests/CppUTest/UtestTest.cpp | 8 ++++---- 5 files changed, 8 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index efdb33252..49121c7ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -117,14 +117,6 @@ check_cxx_symbol_exists(waitpid "sys/wait.h" CPPUTEST_HAVE_WAITPID) check_cxx_symbol_exists(gettimeofday "sys/time.h" CPPUTEST_HAVE_GETTIMEOFDAY) check_cxx_symbol_exists(pthread_mutex_lock "pthread.h" CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK) -if(NOT DEFINED CPPUTEST_HAS_NAN) - check_cxx_symbol_exists(NAN "math.h" CPPUTEST_HAS_NAN) -endif() - -if(NOT DEFINED CPPUTEST_HAS_INF) - check_cxx_symbol_exists(INFINITY "math.h" CPPUTEST_HAS_INF) -endif() - if (NOT IAR) check_cxx_symbol_exists(strdup "string.h" CPPUTEST_HAVE_STRDUP) endif(NOT IAR) diff --git a/config.h.cmake b/config.h.cmake index 2cc68436d..dfbd83f0c 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -11,8 +11,6 @@ #cmakedefine CPPUTEST_HAVE_GETTIMEOFDAY -#cmakedefine01 CPPUTEST_HAS_INF -#cmakedefine01 CPPUTEST_HAS_NAN #cmakedefine01 CPPUTEST_HAVE_FENV #cmakedefine CPPUTEST_HAVE_STRUCT_TIMESPEC diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index bc90219ca..399198d30 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -349,21 +349,4 @@ typedef struct cpputest_ulonglong cpputest_ulonglong; #pragma clang diagnostic pop #endif -#ifndef CPPUTEST_HAS_INF -#if defined(CPPUTEST_NO_INF) -#define CPPUTEST_HAS_INF 0 -#else -#define CPPUTEST_HAS_INF 1 -#endif -#endif - -#ifndef CPPUTEST_HAS_NAN -#if defined(CPPUTEST_NO_NAN) -#define CPPUTEST_HAS_NAN 0 -#else -#define CPPUTEST_HAS_NAN 1 -#endif -#endif - - #endif diff --git a/tests/CppUTest/TestFailureNaNTest.cpp b/tests/CppUTest/TestFailureNaNTest.cpp index 9b8627a07..832aaff2d 100644 --- a/tests/CppUTest/TestFailureNaNTest.cpp +++ b/tests/CppUTest/TestFailureNaNTest.cpp @@ -29,9 +29,11 @@ #include "CppUTest/TestOutput.h" #include "CppUTest/PlatformSpecificFunctions.h" -#if CPPUTEST_HAS_NAN == 1 && CPPUTEST_HAS_INF == 1 +#if CPPUTEST_USE_STD_C_LIB +#include +#endif -#include "math.h" +#if defined(NAN) && defined(INFINITY) namespace { diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index d22526009..df232d15e 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -30,8 +30,8 @@ #include "CppUTest/TestTestingFixture.h" #include "CppUTest/PlatformSpecificFunctions.h" -#if CPPUTEST_HAS_INF || CPPUTEST_HAS_NAN -#include "math.h" +#if CPPUTEST_USE_STD_C_LIB +#include #endif TEST_GROUP(UtestShell) @@ -68,7 +68,7 @@ TEST(UtestShell, compareDoubles) CHECK(doubles_equal(a, a, 0.000000001)); } -#if CPPUTEST_HAS_NAN == 1 +#ifdef NAN TEST(UtestShell, compareDoublesNaN) { CHECK(!doubles_equal(NAN, 1.001, 0.01)); @@ -77,7 +77,7 @@ TEST(UtestShell, compareDoublesNaN) } #endif -#if CPPUTEST_HAS_INF == 1 +#ifdef INFINITY TEST(UtestShell, compareDoublesInf) { CHECK(!doubles_equal(INFINITY, 1.0, 0.01)); From faf3d1c140f67512f2f7fcc9a5eda42097b8fc42 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 7 Sep 2022 17:36:03 -0700 Subject: [PATCH 0837/1093] Use fputs over putchar When semihosting, repeatedly calling `fputs` for each character drives very high syscall overhead. --- include/CppUTest/PlatformSpecificFunctions_c.h | 2 ++ src/CppUTest/TestOutput.cpp | 5 +---- src/Platforms/Borland/UtestPlatform.cpp | 1 + src/Platforms/C2000/UtestPlatform.cpp | 1 + src/Platforms/Dos/UtestPlatform.cpp | 1 + src/Platforms/Gcc/UtestPlatform.cpp | 2 ++ src/Platforms/GccNoStdC/UtestPlatform.cpp | 1 + src/Platforms/Iar/UtestPlatform.cpp | 1 + src/Platforms/Keil/UtestPlatform.cpp | 1 + src/Platforms/Symbian/UtestPlatform.cpp | 2 ++ src/Platforms/VisualCpp/UtestPlatform.cpp | 1 + src/Platforms/armcc/UtestPlatform.cpp | 1 + tests/CppUTest/CommandLineTestRunnerTest.cpp | 9 +++++++-- 13 files changed, 22 insertions(+), 6 deletions(-) diff --git a/include/CppUTest/PlatformSpecificFunctions_c.h b/include/CppUTest/PlatformSpecificFunctions_c.h index 35425ad0a..d7705d5c5 100644 --- a/include/CppUTest/PlatformSpecificFunctions_c.h +++ b/include/CppUTest/PlatformSpecificFunctions_c.h @@ -62,6 +62,8 @@ extern int (*PlatformSpecificAtExit)(void(*func)(void)); /* IO operations */ typedef void* PlatformSpecificFile; +extern const PlatformSpecificFile PlatformSpecificStdOut; + extern PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag); extern void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file); extern void (*PlatformSpecificFClose)(PlatformSpecificFile file); diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index 21a3b08cc..71839e481 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -274,10 +274,7 @@ void TestOutput::printVeryVerbose(const char* str) void ConsoleTestOutput::printBuffer(const char* s) { - while (*s) { - PlatformSpecificPutchar(*s); - s++; - } + PlatformSpecificFPuts(s, PlatformSpecificStdOut); flush(); } diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 21214f035..3bba1b71a 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -246,6 +246,7 @@ static void PlatformSpecificFlushImplementation() fflush(stdout); } +const PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = PlatformSpecificFOpenImplementation; void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; diff --git a/src/Platforms/C2000/UtestPlatform.cpp b/src/Platforms/C2000/UtestPlatform.cpp index ec53d81ec..e964c3af6 100644 --- a/src/Platforms/C2000/UtestPlatform.cpp +++ b/src/Platforms/C2000/UtestPlatform.cpp @@ -145,6 +145,7 @@ static void C2000FClose(PlatformSpecificFile file) fclose((FILE*)file); } +const PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag) = C2000FOpen; void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = C2000FPuts; void (*PlatformSpecificFClose)(PlatformSpecificFile file) = C2000FClose; diff --git a/src/Platforms/Dos/UtestPlatform.cpp b/src/Platforms/Dos/UtestPlatform.cpp index 9367214bf..937a3c0d9 100644 --- a/src/Platforms/Dos/UtestPlatform.cpp +++ b/src/Platforms/Dos/UtestPlatform.cpp @@ -138,6 +138,7 @@ static void DosFClose(PlatformSpecificFile file) fclose((FILE*)file); } +const PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag) = DosFOpen; void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = DosFPuts; void (*PlatformSpecificFClose)(PlatformSpecificFile file) = DosFClose; diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index c68dc952b..1eaac9125 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -264,6 +264,8 @@ static void PlatformSpecificFlushImplementation() fflush(stdout); } +const PlatformSpecificFile PlatformSpecificStdOut = stdout; + PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = PlatformSpecificFOpenImplementation; void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; diff --git a/src/Platforms/GccNoStdC/UtestPlatform.cpp b/src/Platforms/GccNoStdC/UtestPlatform.cpp index 5898e61b1..81dab5471 100644 --- a/src/Platforms/GccNoStdC/UtestPlatform.cpp +++ b/src/Platforms/GccNoStdC/UtestPlatform.cpp @@ -52,6 +52,7 @@ long (*GetPlatformSpecificTimeInMillis)() = NULLPTR; const char* (*GetPlatformSpecificTimeString)() = NULLPTR; /* IO operations */ +const PlatformSpecificFile PlatformSpecificStdOut = NULLPTR; PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag) = NULLPTR; void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = NULLPTR; void (*PlatformSpecificFClose)(PlatformSpecificFile file) = NULLPTR; diff --git a/src/Platforms/Iar/UtestPlatform.cpp b/src/Platforms/Iar/UtestPlatform.cpp index 2493c06c5..4c576760d 100644 --- a/src/Platforms/Iar/UtestPlatform.cpp +++ b/src/Platforms/Iar/UtestPlatform.cpp @@ -151,6 +151,7 @@ static void PlatformSpecificFlushImplementation() { } +const PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = PlatformSpecificFOpenImplementation; void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; diff --git a/src/Platforms/Keil/UtestPlatform.cpp b/src/Platforms/Keil/UtestPlatform.cpp index 261b266f5..9639d91c1 100644 --- a/src/Platforms/Keil/UtestPlatform.cpp +++ b/src/Platforms/Keil/UtestPlatform.cpp @@ -155,6 +155,7 @@ extern "C" { } + const PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = PlatformSpecificFOpenImplementation; void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; diff --git a/src/Platforms/Symbian/UtestPlatform.cpp b/src/Platforms/Symbian/UtestPlatform.cpp index a4d5df7e0..9beae8b78 100644 --- a/src/Platforms/Symbian/UtestPlatform.cpp +++ b/src/Platforms/Symbian/UtestPlatform.cpp @@ -125,6 +125,8 @@ void* PlatformSpecificMemset(void* mem, int c, size_t size) return memset(mem, c, size); } +const PlatformSpecificFile PlatformSpecificStdOut = stdout; + PlatformSpecificFile PlatformSpecificFOpen(const char* filename, const char* flag) { return fopen(filename, flag); } diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index eab6b1f7b..1833611e9 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -158,6 +158,7 @@ static void VisualCppFClose(PlatformSpecificFile file) fclose((FILE*)file); } +const PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag) = VisualCppFOpen; void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = VisualCppFPuts; void (*PlatformSpecificFClose)(PlatformSpecificFile file) = VisualCppFClose; diff --git a/src/Platforms/armcc/UtestPlatform.cpp b/src/Platforms/armcc/UtestPlatform.cpp index 021db2c52..be501496b 100644 --- a/src/Platforms/armcc/UtestPlatform.cpp +++ b/src/Platforms/armcc/UtestPlatform.cpp @@ -146,6 +146,7 @@ static void PlatformSpecificFlushImplementation() fflush(stdout); } +const PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = PlatformSpecificFOpenImplementation; void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index f9a960647..a5ed12b93 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -341,9 +341,14 @@ struct FakeOutput return (PlatformSpecificFile) NULLPTR; } - static void fputs_fake(const char* str, PlatformSpecificFile) + static void fputs_fake(const char* str, PlatformSpecificFile f) { - currentFake->file += str; + if (f == PlatformSpecificStdOut) { + currentFake->console += str; + } + else { + currentFake->file += str; + } } static void fclose_fake(PlatformSpecificFile) From 80d807c1de79ee7307beae923ba2ad382bd17cd5 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 7 Sep 2022 18:02:24 -0700 Subject: [PATCH 0838/1093] Drop putchar --- include/CppUTest/PlatformSpecificFunctions_c.h | 1 - src/Platforms/Borland/UtestPlatform.cpp | 1 - src/Platforms/C2000/UtestPlatform.cpp | 18 ------------------ src/Platforms/Dos/UtestPlatform.cpp | 6 ------ src/Platforms/Gcc/UtestPlatform.cpp | 1 - src/Platforms/GccNoStdC/UtestPlatform.cpp | 1 - src/Platforms/Iar/UtestPlatform.cpp | 1 - src/Platforms/Keil/UtestPlatform.cpp | 1 - src/Platforms/Symbian/UtestPlatform.cpp | 4 ---- src/Platforms/VisualCpp/UtestPlatform.cpp | 1 - src/Platforms/armcc/UtestPlatform.cpp | 1 - tests/CppUTest/CommandLineTestRunnerTest.cpp | 12 +----------- 12 files changed, 1 insertion(+), 47 deletions(-) diff --git a/include/CppUTest/PlatformSpecificFunctions_c.h b/include/CppUTest/PlatformSpecificFunctions_c.h index d7705d5c5..db49313a5 100644 --- a/include/CppUTest/PlatformSpecificFunctions_c.h +++ b/include/CppUTest/PlatformSpecificFunctions_c.h @@ -68,7 +68,6 @@ extern PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const extern void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file); extern void (*PlatformSpecificFClose)(PlatformSpecificFile file); -extern int (*PlatformSpecificPutchar)(int c); extern void (*PlatformSpecificFlush)(void); /* Random operations */ diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 3bba1b71a..e26567eaf 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -251,7 +251,6 @@ PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = Platfo void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; -int (*PlatformSpecificPutchar)(int) = putchar; void (*PlatformSpecificFlush)() = PlatformSpecificFlushImplementation; void* (*PlatformSpecificMalloc)(size_t size) = malloc; diff --git a/src/Platforms/C2000/UtestPlatform.cpp b/src/Platforms/C2000/UtestPlatform.cpp index e964c3af6..a5d81d58e 100644 --- a/src/Platforms/C2000/UtestPlatform.cpp +++ b/src/Platforms/C2000/UtestPlatform.cpp @@ -150,29 +150,11 @@ PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = C2000FPuts; void (*PlatformSpecificFClose)(PlatformSpecificFile file) = C2000FClose; -static int CL2000Putchar(int c) -{ -#if USE_BUFFER_OUTPUT - if(idx < BUFFER_SIZE) { - buffer[idx] = (char) c; - idx++; - /* "buffer[idx]" instead of "c" eliminates "never used" warning */ - return (buffer[idx]); - } - else { - return EOF; - } -#else - return putchar(c); -#endif -} - static void CL2000Flush() { fflush(stdout); } -extern int (*PlatformSpecificPutchar)(int c) = CL2000Putchar; extern void (*PlatformSpecificFlush)(void) = CL2000Flush; static void* C2000Malloc(size_t size) diff --git a/src/Platforms/Dos/UtestPlatform.cpp b/src/Platforms/Dos/UtestPlatform.cpp index 937a3c0d9..383902d69 100644 --- a/src/Platforms/Dos/UtestPlatform.cpp +++ b/src/Platforms/Dos/UtestPlatform.cpp @@ -143,17 +143,11 @@ PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = DosFPuts; void (*PlatformSpecificFClose)(PlatformSpecificFile file) = DosFClose; -static int DosPutchar(int c) -{ - return putchar(c); -} - static void DosFlush() { fflush(stdout); } -extern int (*PlatformSpecificPutchar)(int c) = DosPutchar; extern void (*PlatformSpecificFlush)(void) = DosFlush; static void* DosMalloc(size_t size) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 1eaac9125..a33b397ca 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -270,7 +270,6 @@ PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = Platfo void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; -int (*PlatformSpecificPutchar)(int) = putchar; void (*PlatformSpecificFlush)() = PlatformSpecificFlushImplementation; void* (*PlatformSpecificMalloc)(size_t size) = malloc; diff --git a/src/Platforms/GccNoStdC/UtestPlatform.cpp b/src/Platforms/GccNoStdC/UtestPlatform.cpp index 81dab5471..40305c7b2 100644 --- a/src/Platforms/GccNoStdC/UtestPlatform.cpp +++ b/src/Platforms/GccNoStdC/UtestPlatform.cpp @@ -57,7 +57,6 @@ PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = NULLPTR; void (*PlatformSpecificFClose)(PlatformSpecificFile file) = NULLPTR; -int (*PlatformSpecificPutchar)(int c) = NULLPTR; void (*PlatformSpecificFlush)(void) = NULLPTR; int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_list va_args_list) = NULLPTR; diff --git a/src/Platforms/Iar/UtestPlatform.cpp b/src/Platforms/Iar/UtestPlatform.cpp index 4c576760d..fde094980 100644 --- a/src/Platforms/Iar/UtestPlatform.cpp +++ b/src/Platforms/Iar/UtestPlatform.cpp @@ -156,7 +156,6 @@ PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = Platfo void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; -int (*PlatformSpecificPutchar)(int) = putchar; void (*PlatformSpecificFlush)() = PlatformSpecificFlushImplementation; void* (*PlatformSpecificMalloc)(size_t size) = malloc; diff --git a/src/Platforms/Keil/UtestPlatform.cpp b/src/Platforms/Keil/UtestPlatform.cpp index 9639d91c1..8bff0c07a 100644 --- a/src/Platforms/Keil/UtestPlatform.cpp +++ b/src/Platforms/Keil/UtestPlatform.cpp @@ -160,7 +160,6 @@ extern "C" void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; - int (*PlatformSpecificPutchar)(int) = putchar; void (*PlatformSpecificFlush)() = PlatformSpecificFlushImplementation; void* (*PlatformSpecificMalloc)(size_t) = malloc; void* (*PlatformSpecificRealloc) (void*, size_t) = realloc; diff --git a/src/Platforms/Symbian/UtestPlatform.cpp b/src/Platforms/Symbian/UtestPlatform.cpp index 9beae8b78..5f4b4cb90 100644 --- a/src/Platforms/Symbian/UtestPlatform.cpp +++ b/src/Platforms/Symbian/UtestPlatform.cpp @@ -96,10 +96,6 @@ void PlatformSpecificFlush() { fflush(stdout); } -int PlatformSpecificPutchar(int c) { - return putchar(c); -} - double PlatformSpecificFabs(double d) { return fabs(d); } diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index 1833611e9..2967354a3 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -168,7 +168,6 @@ static void VisualCppFlush() fflush(stdout); } -int (*PlatformSpecificPutchar)(int c) = putchar; void (*PlatformSpecificFlush)(void) = VisualCppFlush; static void* VisualCppMalloc(size_t size) diff --git a/src/Platforms/armcc/UtestPlatform.cpp b/src/Platforms/armcc/UtestPlatform.cpp index be501496b..d91aa224c 100644 --- a/src/Platforms/armcc/UtestPlatform.cpp +++ b/src/Platforms/armcc/UtestPlatform.cpp @@ -151,7 +151,6 @@ PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = Platfo void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; -int (*PlatformSpecificPutchar)(int) = putchar; void (*PlatformSpecificFlush)() = PlatformSpecificFlushImplementation; void* (*PlatformSpecificMalloc)(size_t size) = malloc; diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index a5ed12b93..6a73a9406 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -302,13 +302,12 @@ extern "C" { typedef PlatformSpecificFile (*FOpenFunc)(const char*, const char*); typedef void (*FPutsFunc)(const char*, PlatformSpecificFile); typedef void (*FCloseFunc)(PlatformSpecificFile); - typedef int (*PutcharFunc)(int); } struct FakeOutput { FakeOutput() : SaveFOpen(PlatformSpecificFOpen), SaveFPuts(PlatformSpecificFPuts), - SaveFClose(PlatformSpecificFClose), SavePutchar(PlatformSpecificPutchar) + SaveFClose(PlatformSpecificFClose) { installFakes(); currentFake = this; @@ -325,12 +324,10 @@ struct FakeOutput PlatformSpecificFOpen = (FOpenFunc)fopen_fake; PlatformSpecificFPuts = (FPutsFunc)fputs_fake; PlatformSpecificFClose = (FCloseFunc)fclose_fake; - PlatformSpecificPutchar = (PutcharFunc)putchar_fake; } void restoreOriginals() { - PlatformSpecificPutchar = SavePutchar; PlatformSpecificFOpen = SaveFOpen; PlatformSpecificFPuts = SaveFPuts; PlatformSpecificFClose = SaveFClose; @@ -355,12 +352,6 @@ struct FakeOutput { } - static int putchar_fake(int c) - { - currentFake->console += StringFrom((char)c); - return c; - } - SimpleString file; SimpleString console; @@ -369,7 +360,6 @@ struct FakeOutput FOpenFunc SaveFOpen; FPutsFunc SaveFPuts; FCloseFunc SaveFClose; - PutcharFunc SavePutchar; }; FakeOutput* FakeOutput::currentFake = NULLPTR; From ec86e3a24f6b0b4854f26c1b9c629f0fe53343ae Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 7 Sep 2022 19:58:09 -0700 Subject: [PATCH 0839/1093] Restore C2000 output buffer I have no way to test this. --- src/Platforms/C2000/UtestPlatform.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Platforms/C2000/UtestPlatform.cpp b/src/Platforms/C2000/UtestPlatform.cpp index a5d81d58e..33cae4192 100644 --- a/src/Platforms/C2000/UtestPlatform.cpp +++ b/src/Platforms/C2000/UtestPlatform.cpp @@ -137,7 +137,17 @@ PlatformSpecificFile C2000FOpen(const char* filename, const char* flag) static void C2000FPuts(const char* str, PlatformSpecificFile file) { - fputs(str, (FILE*)file); +#if USE_BUFFER_OUTPUT + if (file == PlatformSpecificStdOut) { + while (*str && (idx < BUFFER_SIZE)) { + buf[idx++] = *str++; + } + } + else +#endif + { + fputs(str, (FILE*)file); + } } static void C2000FClose(PlatformSpecificFile file) From 9507eef8fc2ca39eecdb664b4ca4acc6b0341af0 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 8 Sep 2022 21:03:26 -0700 Subject: [PATCH 0840/1093] Use secure lib wherever available --- CMakeLists.txt | 6 +++++- cmake/Modules/CppUTestConfigurationOptions.cmake | 4 ---- src/CppUTest/CMakeLists.txt | 5 +++++ src/Platforms/Gcc/UtestPlatform.cpp | 4 ++-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 49121c7ad..9a70b8dcd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,11 @@ cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_BITSIZE "Add architecture bitsiz cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_DEBUG "Add indication of debug compilation to the library name?" OFF "PROJECT_IS_TOP_LEVEL" OFF) +include(CheckCXXSymbolExists) +check_cxx_symbol_exists(fopen_s "stdio.h" CPPUTEST_HAVE_SECURE_STDLIB) +cmake_dependent_option(CPPUTEST_USE_SECURE_STDLIB "Use MSVC safe functions" + ON "WIN32;CPPUTEST_HAVE_SECURE_STDLIB" OFF) + if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) # Don't change users' build type. # Multi-configuration generators don't have a single build type. get_property( @@ -107,7 +112,6 @@ include(GNUInstallDirs) add_subdirectory(src/CppUTest) # Check for symbols before setting a lot of stuff -include(CheckCXXSymbolExists) include(CheckTypeSize) include(CheckStructHasMember) set(CMAKE_REQUIRED_FLAGS ${CMAKE_CXX_FLAGS}) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 8f53d5a55..b79994458 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -1,9 +1,5 @@ if (MSVC) set(CPP_PLATFORM VisualCpp) - option(STDC_WANT_SECURE_LIB "Use MSVC safe functions" ON) - if(STDC_WANT_SECURE_LIB) - ADD_DEFINITIONS(-DSTDC_WANT_SECURE_LIB) - endif(STDC_WANT_SECURE_LIB) elseif (IAR) set(CPP_PLATFORM Iar) unset(CMAKE_CXX_EXTENSION_COMPILE_OPTION) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index fa0339429..621a891f3 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -70,6 +70,11 @@ target_include_directories(${CppUTestLibName} $ ) +target_compile_definitions(${CppUTestLibName} + PRIVATE + $<$:STDC_WANT_SECURE_LIB> +) + if (WIN32) target_link_libraries(${CppUTestLibName} winmm) endif (WIN32) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index c68dc952b..6e5f47654 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -214,7 +214,7 @@ static const char* TimeStringImplementation() { time_t theTime = time(NULLPTR); static char dateTime[80]; -#if defined(_WIN32) && defined(MINGW_HAS_SECURE_API) +#ifdef STDC_WANT_SECURE_LIB static struct tm lastlocaltime; localtime_s(&lastlocaltime, &theTime); struct tm *tmp = &lastlocaltime; @@ -240,7 +240,7 @@ int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_ static PlatformSpecificFile PlatformSpecificFOpenImplementation(const char* filename, const char* flag) { -#if defined(_WIN32) && defined(MINGW_HAS_SECURE_API) +#ifdef STDC_WANT_SECURE_LIB FILE* file; fopen_s(&file, filename, flag); return file; From 4ff018c98c161b94d0865003269491886a0cbecf Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 8 Sep 2022 18:30:06 -0700 Subject: [PATCH 0841/1093] Add Visual Studio Clang-CL build --- .github/workflows/basic.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 8ec21424c..33178f117 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -118,7 +118,22 @@ jobs: -B build -S . -D CMAKE_CXX_STANDARD=${{ matrix.cpp_version }} - if: ${{ matrix.cpp_version }} + - name: Build + run: cmake --build build --verbose + - name: Test + run: ctest --test-dir build + + visualstudio-clangcl: + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@main + - name: Configure + run: > + cmake + -B build + -G "Visual Studio 17 2022" + -T ClangCL - name: Build run: cmake --build build --verbose - name: Test From b409c6a2fb415043597c9bbc3444a3ce84c57b88 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 14 Sep 2022 22:22:02 -0700 Subject: [PATCH 0842/1093] Disable memory leak detection for Clang-CL --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a70b8dcd..77a426cc7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,11 +35,15 @@ check_cxx_source_compiles( CPPUTEST_HAVE_EXCEPTIONS ) +if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND (CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")) + set(is_clang_cl TRUE) +endif() + cmake_dependent_option(CPPUTEST_STD_CPP_LIB_DISABLED "Use the standard C++ library" OFF "NOT CPPUTEST_STD_C_LIB_DISABLED;CPPUTEST_HAVE_EXCEPTIONS" ON) option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) cmake_dependent_option(CPPUTEST_MEM_LEAK_DETECTION_DISABLED "Enable memory leak detection" - OFF "NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED" ON) + OFF "NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED;NOT is_clang_cl" ON) option(CPPUTEST_EXTENSIONS "Use the CppUTest extension library" ON) include(CheckTypeSize) From ed6600aaafe311f2a4455921c8d2a2f3616882e6 Mon Sep 17 00:00:00 2001 From: Monica Date: Thu, 15 Sep 2022 15:45:08 +0800 Subject: [PATCH 0843/1093] Add vcpkg installation instructions --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index fe5763d22..55d963397 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,17 @@ TEST(FirstTestGroup, FirstTest) } ``` +You can build and install cpputest using [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager: + +* git clone https://github.com/Microsoft/vcpkg.git +* cd vcpkg +* ./bootstrap-vcpkg.sh # ./bootstrap-vcpkg.bat for Windows +* ./vcpkg integrate install +* ./vcpkg install cpputest + +The cpputest port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. + + ## Command line switches * -h help, shows the latest help, including the parameters we've implemented after updating this README page. From cd318ded7421855fd122fdea02536f59e0010898 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 18 Sep 2022 13:15:09 -0700 Subject: [PATCH 0844/1093] Use full libc --- cmake/arm-none-eabi-gcc.toolchain.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/arm-none-eabi-gcc.toolchain.cmake b/cmake/arm-none-eabi-gcc.toolchain.cmake index ebcdb9645..b9ab5030e 100644 --- a/cmake/arm-none-eabi-gcc.toolchain.cmake +++ b/cmake/arm-none-eabi-gcc.toolchain.cmake @@ -5,4 +5,4 @@ set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_C_FLAGS_INIT "-mcpu=cortex-m4") set(CMAKE_CXX_FLAGS_INIT "-mcpu=cortex-m4") -set(CMAKE_EXE_LINKER_FLAGS_INIT "-specs=nano.specs -specs=rdimon.specs") +set(CMAKE_EXE_LINKER_FLAGS_INIT "-specs=rdimon.specs") From 504973eba0b7bf751c0687f6b5e8b7057a4b9f19 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 18 Sep 2022 14:11:12 -0700 Subject: [PATCH 0845/1093] Run tests with QEMU --- .github/workflows/extended.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index e129abc01..d75c1d587 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -139,13 +139,15 @@ jobs: - name: Checkout uses: actions/checkout@main - uses: carlosperate/arm-none-eabi-gcc-action@v1 + - name: Install QEMU + run: sudo apt-get install -y --no-install-recommends qemu-user-static - name: Configure run: > cmake -B cpputest_build -D CMAKE_TOOLCHAIN_FILE=cmake/arm-none-eabi-gcc.toolchain.cmake + -D CMAKE_CROSSCOMPILING_EMULATOR="qemu-arm-static;-cpu;cortex-m4" - name: Build run: cmake --build cpputest_build - name: Test - # This won't do anything, because there is no way to run the tests. run: ctest --test-dir cpputest_build From f0a5bac12a932d2258a121da7dfb2a3c77289a4a Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 18 Sep 2022 15:43:00 -0700 Subject: [PATCH 0846/1093] Hack in working QEMU --- .github/workflows/extended.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index d75c1d587..45a673886 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -140,7 +140,11 @@ jobs: uses: actions/checkout@main - uses: carlosperate/arm-none-eabi-gcc-action@v1 - name: Install QEMU - run: sudo apt-get install -y --no-install-recommends qemu-user-static + # The version in the ubuntu repositories (6.2) is broken. + run: | + wget -nv http://ftp.de.debian.org/debian/pool/main/q/qemu/qemu-user-static_7.1+dfsg-2_amd64.deb -O qemu.deb + sudo dpkg --install qemu.deb + rm -f qemu.deb - name: Configure run: > cmake From 351a358d0bc0e307105fadc9d864e62fb7b380fe Mon Sep 17 00:00:00 2001 From: offa Date: Mon, 19 Sep 2022 18:58:48 +0200 Subject: [PATCH 0847/1093] Fix compilation on C++20 --- examples/AllTests/FEDemoTest.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index afe2ea446..86d130468 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -44,8 +44,6 @@ extern "C" { #include -static volatile float f; - TEST_GROUP(FE_Demo) { void setup() @@ -56,13 +54,13 @@ TEST_GROUP(FE_Demo) IGNORE_TEST(FE_Demo, should_fail_when__FE_DIVBYZERO__is_set) { - f = 1.0f; + float f = 1.0f; CHECK((f /= 0.0f) >= std::numeric_limits::infinity()); } IGNORE_TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) { - f = 0.01f; + float f = 0.01f; while (f > 0.0f) f *= f; CHECK(f == 0.0f); @@ -70,7 +68,7 @@ IGNORE_TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) IGNORE_TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) { - f = 1000.0f; + float f = 1000.0f; while (f < std::numeric_limits::infinity()) f *= f; CHECK(f >= std::numeric_limits::infinity()); @@ -79,7 +77,7 @@ IGNORE_TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) IGNORE_TEST(FE_Demo, should_fail_when__FE_INEXACT____is_set) { IEEE754ExceptionsPlugin::enableInexact(); - f = 10.0f; + float f = 10.0f; DOUBLES_EQUAL((double)(f / 3.0f), (double)3.333f, (double)0.001f); } From 9f9a3f985b28c72b5ecbd26c42efea063af261ff Mon Sep 17 00:00:00 2001 From: offa Date: Mon, 19 Sep 2022 19:04:04 +0200 Subject: [PATCH 0848/1093] Fix strict prototypes of Clang 15 --- examples/ApplicationLib/hello.c | 2 +- include/CppUTest/TestHarness_c.h | 8 ++++---- tests/CppUTest/AllocationInCFile.c | 6 +++--- tests/CppUTestExt/IEEE754PluginTest_c.c | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/ApplicationLib/hello.c b/examples/ApplicationLib/hello.c index 6cbe03f44..4ac06a59e 100644 --- a/examples/ApplicationLib/hello.c +++ b/examples/ApplicationLib/hello.c @@ -28,7 +28,7 @@ #include #include "hello.h" -void printHelloWorld() +void printHelloWorld(void) { PrintFormated("Hello World!\n"); } diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 26f6203c5..645676dfc 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -141,19 +141,19 @@ /* For use in C file */ #define TEST_GROUP_C_SETUP(group_name) \ extern void group_##group_name##_setup_wrapper_c(void); \ - void group_##group_name##_setup_wrapper_c() + void group_##group_name##_setup_wrapper_c(void) #define TEST_GROUP_C_TEARDOWN(group_name) \ extern void group_##group_name##_teardown_wrapper_c(void); \ - void group_##group_name##_teardown_wrapper_c() + void group_##group_name##_teardown_wrapper_c(void) #define TEST_C(group_name, test_name) \ extern void test_##group_name##_##test_name##_wrapper_c(void);\ - void test_##group_name##_##test_name##_wrapper_c() + void test_##group_name##_##test_name##_wrapper_c(void) #define IGNORE_TEST_C(group_name, test_name) \ extern void ignore_##group_name##_##test_name##_wrapper_c(void);\ - void ignore_##group_name##_##test_name##_wrapper_c() + void ignore_##group_name##_##test_name##_wrapper_c(void) /* For use in C++ file */ diff --git a/tests/CppUTest/AllocationInCFile.c b/tests/CppUTest/AllocationInCFile.c index 5d1765c63..03165a958 100644 --- a/tests/CppUTest/AllocationInCFile.c +++ b/tests/CppUTest/AllocationInCFile.c @@ -4,12 +4,12 @@ /* This file is for simulating overloads of malloc */ -char* mallocAllocation() +char* mallocAllocation(void) { return (char*) malloc(10UL); } -char* strdupAllocation() +char* strdupAllocation(void) { #ifdef CPPUTEST_USE_STRDUP_MACROS return strdup("0123456789"); @@ -19,7 +19,7 @@ char* strdupAllocation() } -char* strndupAllocation() +char* strndupAllocation(void) { #ifdef CPPUTEST_USE_STRDUP_MACROS return strndup("0123456789", 10); diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.c b/tests/CppUTestExt/IEEE754PluginTest_c.c index 1cce8bde3..bf1bf4ca2 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.c +++ b/tests/CppUTestExt/IEEE754PluginTest_c.c @@ -58,7 +58,7 @@ void set_nothing_c(void) { } -void set_everything_c() +void set_everything_c(void) { set_divisionbyzero_c(); set_overflow_c(); From 54e9130a9b15a1867c44f68a833712acd8e84d93 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 19 Sep 2022 23:25:59 -0700 Subject: [PATCH 0849/1093] Repair config header installation --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 77a426cc7..8a959b790 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -155,7 +155,7 @@ target_include_directories(${CppUTestLibName} ) target_compile_definitions(${CppUTestLibName} PUBLIC - $ + HAVE_CONFIG_H ) if (CPPUTEST_EXTENSIONS) @@ -196,7 +196,7 @@ if(PROJECT_IS_TOP_LEVEL) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" - DESTINATION "${INCLUDE_INSTALL_DIR}/CppUTest" + DESTINATION "${INCLUDE_INSTALL_DIR}/generated" ) # Try to include helper module From 14a033c690966835b929a5e5961b6e6102f12760 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 21 Sep 2022 22:53:08 -0700 Subject: [PATCH 0850/1093] Remove `CPPUTEST_LIBNAME_POSTFIX_DEBUG` This duplicates the natively supported [`CMAKE_DEBUG_POSTFIX`](https://cmake.org/cmake/help/latest/variable/CMAKE_DEBUG_POSTFIX.html). --- CMakeLists.txt | 3 --- src/CppUTest/CMakeLists.txt | 4 ---- src/CppUTestExt/CMakeLists.txt | 4 ---- 3 files changed, 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 77a426cc7..6f3c20b92 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,8 +70,6 @@ option(CPPUTEST_VERBOSE_CONFIG "Print configuration to stdout during generation" cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" OFF "PROJECT_IS_TOP_LEVEL" OFF) -cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_DEBUG "Add indication of debug compilation to the library name?" - OFF "PROJECT_IS_TOP_LEVEL" OFF) include(CheckCXXSymbolExists) check_cxx_symbol_exists(fopen_s "stdio.h" CPPUTEST_HAVE_SECURE_STDLIB) @@ -271,7 +269,6 @@ Features configured in CppUTest: Library name options: Add architecture bitsize (32/64) ${CPPUTEST_LIBNAME_POSTFIX_BITSIZE} - Add debug compilation indicator ${CPPUTEST_LIBNAME_POSTFIX_DEBUG} ------------------------------------------------------- ") diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 621a891f3..ac0b13b80 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -47,10 +47,6 @@ add_library(${CppUTestLibName} ${PROJECT_SOURCE_DIR}/include/CppUTest/SimpleMutex.h ) -if(CPPUTEST_LIBNAME_POSTFIX_DEBUG) - set_target_properties(${CppUTestLibName} PROPERTIES DEBUG_POSTFIX "d") -endif() - #[[Set CPP_PLATFORM in a parent CMakeLists.txt if reusing one of the provided platforms, else supply the missing definitions]] if (CPP_PLATFORM) target_sources(${CppUTestLibName} diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index aa0ec0b53..d17eff532 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -39,10 +39,6 @@ add_library(${CppUTestExtLibName} STATIC target_link_libraries(${CppUTestExtLibName} PUBLIC ${CppUTestLibName}) -if(CPPUTEST_LIBNAME_POSTFIX_DEBUG) - set_target_properties(${CppUTestExtLibName} PROPERTIES DEBUG_POSTFIX "d") -endif() - #[[Arrange for the include directory to be added to the include paths of any CMake target depending on CppUTestExt.]] target_include_directories(${CppUTestExtLibName} PUBLIC From 45bf4fced167ebc5a4f817186535997c839705fa Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 21 Jun 2022 21:59:35 -0700 Subject: [PATCH 0851/1093] Add -Wsuggest-override --- cmake/Modules/CppUTestWarningFlags.cmake | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index 86eaab9f7..4ed9bd5af 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -64,12 +64,13 @@ else (MSVC) if (DEFINED CMAKE_CXX_STANDARD AND NOT CMAKE_CXX_STANDARD EQUAL 98) set(WARNING_CXX_FLAGS - ${WARNING_CXX_FLAGS} - Wno-c++98-compat - Wno-c++98-compat-pedantic - Wno-c++14-compat - Wno-inconsistent-missing-destructor-override - ) + ${WARNING_CXX_FLAGS} + Wno-c++98-compat + Wno-c++98-compat-pedantic + Wno-c++14-compat + Wno-inconsistent-missing-destructor-override + Wsuggest-override + ) endif () check_and_append_c_warning_flags(${WARNING_C_FLAGS}) From 48d6e04e2e6f09b5e23be13d77c9dd500bf180ce Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 26 Sep 2022 18:04:13 -0700 Subject: [PATCH 0852/1093] Satisfy Clang --- examples/AllTests/AllTests.cpp | 4 ++-- examples/AllTests/CircularBufferTest.cpp | 4 ++-- examples/AllTests/EventDispatcherTest.cpp | 12 ++++++------ examples/AllTests/FEDemoTest.cpp | 2 +- examples/AllTests/HelloTest.cpp | 4 ++-- examples/AllTests/MockDocumentationTest.cpp | 12 ++++++------ examples/AllTests/MockPrinter.h | 4 ++-- examples/AllTests/PrinterTest.cpp | 4 ++-- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/examples/AllTests/AllTests.cpp b/examples/AllTests/AllTests.cpp index 5ff9de3b1..75e5ef0b4 100644 --- a/examples/AllTests/AllTests.cpp +++ b/examples/AllTests/AllTests.cpp @@ -34,12 +34,12 @@ class MyDummyComparator : public MockNamedValueComparator { public: - virtual bool isEqual(const void* object1, const void* object2) + virtual bool isEqual(const void* object1, const void* object2) _override { return object1 == object2; } - virtual SimpleString valueToString(const void* object) + virtual SimpleString valueToString(const void* object) _override { return StringFrom(object); } diff --git a/examples/AllTests/CircularBufferTest.cpp b/examples/AllTests/CircularBufferTest.cpp index ebaddf2dc..7ada76fb3 100644 --- a/examples/AllTests/CircularBufferTest.cpp +++ b/examples/AllTests/CircularBufferTest.cpp @@ -33,11 +33,11 @@ TEST_GROUP(CircularBuffer) { CircularBuffer* buffer; - void setup() + void setup() _override { buffer = new CircularBuffer(); } - void teardown() + void teardown() _override { delete buffer; } diff --git a/examples/AllTests/EventDispatcherTest.cpp b/examples/AllTests/EventDispatcherTest.cpp index 09ff16415..81cca450c 100644 --- a/examples/AllTests/EventDispatcherTest.cpp +++ b/examples/AllTests/EventDispatcherTest.cpp @@ -32,7 +32,7 @@ class ObserverMock : public EventObserver { public: - virtual void notify(const Event& event, int timeOutInSeconds) + virtual void notify(const Event& event, int timeOutInSeconds) _override { mock() .actualCall("notify") @@ -40,7 +40,7 @@ class ObserverMock : public EventObserver .withParameterOfType("Event", "event", (void*)&event) .withParameter("timeOutInSeconds", timeOutInSeconds); } - virtual void notifyRegistration(EventObserver* newObserver) + virtual void notifyRegistration(EventObserver* newObserver) _override { mock().actualCall("notifyRegistration").onObject(this).withParameter("newObserver", newObserver); } @@ -49,11 +49,11 @@ class ObserverMock : public EventObserver class EventComparator : public MockNamedValueComparator { public: - virtual bool isEqual(const void* object1, const void* object2) + virtual bool isEqual(const void* object1, const void* object2) _override { return ((const Event*)object1)->type == ((const Event*)object2)->type; } - virtual SimpleString valueToString(const void* object) + virtual SimpleString valueToString(const void* object) _override { return StringFrom(((const Event*)object)->type); } @@ -67,12 +67,12 @@ TEST_GROUP(EventDispatcher) ObserverMock observer2; EventComparator eventComparator; - void setup() + void setup() _override { dispatcher = new EventDispatcher; mock().installComparator("Event", eventComparator); } - void teardown() + void teardown() _override { delete dispatcher; mock().removeAllComparatorsAndCopiers(); diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index afe2ea446..3de801fc0 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -48,7 +48,7 @@ static volatile float f; TEST_GROUP(FE_Demo) { - void setup() + void setup() _override { IEEE754ExceptionsPlugin::disableInexact(); } diff --git a/examples/AllTests/HelloTest.cpp b/examples/AllTests/HelloTest.cpp index 10311d96f..232e60113 100644 --- a/examples/AllTests/HelloTest.cpp +++ b/examples/AllTests/HelloTest.cpp @@ -43,12 +43,12 @@ TEST_GROUP(HelloWorld) va_end(arguments); return 1; } - void setup() + void setup() _override { buffer = new SimpleString(); UT_PTR_SET(PrintFormated, &output_method); } - void teardown() + void teardown() _override { delete buffer; } diff --git a/examples/AllTests/MockDocumentationTest.cpp b/examples/AllTests/MockDocumentationTest.cpp index 244d5c4b3..d82e5c800 100644 --- a/examples/AllTests/MockDocumentationTest.cpp +++ b/examples/AllTests/MockDocumentationTest.cpp @@ -69,7 +69,7 @@ class ClassFromProductionCode class ClassFromProductionCodeMock : public ClassFromProductionCode { public: - virtual void importantFunction() + virtual void importantFunction() _override { mock().actualCall("importantFunction").onObject(this); } @@ -102,11 +102,11 @@ TEST(MockDocumentation, parameters) class MyTypeComparator : public MockNamedValueComparator { public: - virtual bool isEqual(const void* object1, const void* object2) + virtual bool isEqual(const void* object1, const void* object2) _override { return object1 == object2; } - virtual SimpleString valueToString(const void* object) + virtual SimpleString valueToString(const void* object) _override { return StringFrom(object); } @@ -199,12 +199,12 @@ TEST(MockDocumentation, CInterface) TEST_GROUP(FooTestGroup) { - void setup() + void setup() _override { // Init stuff } - void teardown() + void teardown() _override { // Uninit stuff } @@ -222,7 +222,7 @@ TEST(FooTestGroup, MoreFoo) TEST_GROUP(BarTestGroup) { - void setup() + void setup() _override { // Init Bar } diff --git a/examples/AllTests/MockPrinter.h b/examples/AllTests/MockPrinter.h index 806aae13d..c13f1d1f3 100644 --- a/examples/AllTests/MockPrinter.h +++ b/examples/AllTests/MockPrinter.h @@ -46,12 +46,12 @@ class MockPrinter : public Printer explicit MockPrinter() {} virtual ~MockPrinter() {} - virtual void Print(const char* s) + virtual void Print(const char* s) _override { savedOutput.append(s); } - virtual void Print(long int value) + virtual void Print(long int value) _override { SimpleString buffer; buffer = StringFromFormat("%ld", value); diff --git a/examples/AllTests/PrinterTest.cpp b/examples/AllTests/PrinterTest.cpp index f88f9f52d..a2ba3978f 100644 --- a/examples/AllTests/PrinterTest.cpp +++ b/examples/AllTests/PrinterTest.cpp @@ -34,12 +34,12 @@ TEST_GROUP(Printer) Printer* printer; MockPrinter* mockPrinter; - void setup() + void setup() _override { mockPrinter = new MockPrinter(); printer = mockPrinter; } - void teardown() + void teardown() _override { delete printer; } From c749833e2fee965db3c3c7feb8da15b4c35bd412 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 26 Sep 2022 18:22:23 -0700 Subject: [PATCH 0853/1093] Satisfy GCC --- include/CppUTestExt/MockCheckedActualCall.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index fd6ebd0ff..68982780a 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -92,8 +92,9 @@ class MockCheckedActualCall : public MockActualCall virtual void * returnPointerValue() _override; virtual void * returnPointerValueOrDefault(void *) _override; - virtual void (*returnFunctionPointerValue())() _override; - virtual void (*returnFunctionPointerValueOrDefault(void (*)()))() _override; + typedef void (*FunctionPointerReturnValue)(); + virtual FunctionPointerReturnValue returnFunctionPointerValue() _override; + virtual FunctionPointerReturnValue returnFunctionPointerValueOrDefault(void (*)()) _override; virtual MockActualCall& onObject(const void* objectPtr) _override; @@ -213,8 +214,8 @@ class MockActualCallTrace : public MockActualCall virtual const void * returnConstPointerValue() _override; virtual const void * returnConstPointerValueOrDefault(const void * default_value) _override; - virtual void (*returnFunctionPointerValue())() _override; - virtual void (*returnFunctionPointerValueOrDefault(void (*)()))() _override; + virtual MockCheckedActualCall::FunctionPointerReturnValue returnFunctionPointerValue() _override; + virtual MockCheckedActualCall::FunctionPointerReturnValue returnFunctionPointerValueOrDefault(void (*)()) _override; virtual MockActualCall& onObject(const void* objectPtr) _override; @@ -289,8 +290,8 @@ class MockIgnoredActualCall: public MockActualCall virtual const void * returnConstPointerValue() _override { return NULLPTR; } virtual const void * returnConstPointerValueOrDefault(const void * value) _override { return value; } - virtual void (*returnFunctionPointerValue())() _override { return NULLPTR; } - virtual void (*returnFunctionPointerValueOrDefault(void (*value)()))() _override { return value; } + virtual MockCheckedActualCall::FunctionPointerReturnValue returnFunctionPointerValue() _override { return NULLPTR; } + virtual MockCheckedActualCall::FunctionPointerReturnValue returnFunctionPointerValueOrDefault(void (*value)()) _override { return value; } virtual MockActualCall& onObject(const void* ) _override { return *this; } From 507bd89339c79d4d1f191db684e5504948dfb595 Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 27 Sep 2022 15:46:02 +0000 Subject: [PATCH 0854/1093] Add volatile and replace compound assignment Co-authored-by: Chad Condon --- examples/AllTests/FEDemoTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index 86d130468..d6cda8c0c 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -60,9 +60,9 @@ IGNORE_TEST(FE_Demo, should_fail_when__FE_DIVBYZERO__is_set) IGNORE_TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) { - float f = 0.01f; + volatile float f = 0.01f; while (f > 0.0f) - f *= f; + f = f * f; CHECK(f == 0.0f); } From acfdb7bb9f0d6c2c0a156e7f391b1dcf99c259c1 Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 27 Sep 2022 15:46:11 +0000 Subject: [PATCH 0855/1093] Add volatile and replace compound assignment Co-authored-by: Chad Condon --- examples/AllTests/FEDemoTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index d6cda8c0c..fddc49782 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -68,9 +68,9 @@ IGNORE_TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) IGNORE_TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) { - float f = 1000.0f; + volatile float f = 1000.0f; while (f < std::numeric_limits::infinity()) - f *= f; + f = f * f; CHECK(f >= std::numeric_limits::infinity()); } From 95d10408757b7c1f380900e222af2089d1d48e2d Mon Sep 17 00:00:00 2001 From: Jayson Messenger Date: Wed, 5 Oct 2022 14:02:16 -0400 Subject: [PATCH 0856/1093] Allow specifying individual mock sources with MOCK_SRC_FILES --- build/MakefileWorker.mk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index c4d0439ad..febc9c970 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -24,6 +24,8 @@ # These do not go in a library. They are explicitly included in the test runner # MOCKS_SRC_DIRS - Directories containing mock source files to build into the test runner # These do not go in a library. They are explicitly included in the test runner +# MOCKS_SRC_FILES - Specific mock source files to build into the unit test runner +# These do not go in a library. They are explicitly included in the test runner #---------- # You can adjust these variables to influence how to build the test target # and where to put and name outputs @@ -410,7 +412,7 @@ TEST_OBJS = $(call src_to_o,$(TEST_SRC)) STUFF_TO_CLEAN += $(TEST_OBJS) -MOCKS_SRC += $(call get_src_from_dir_list, $(MOCKS_SRC_DIRS)) +MOCKS_SRC += $(call get_src_from_dir_list, $(MOCKS_SRC_DIRS)) $(MOCKS_SRC_FILES) MOCKS_OBJS = $(call src_to_o,$(MOCKS_SRC)) STUFF_TO_CLEAN += $(MOCKS_OBJS) From 1e2e7f1c31b39089aa2b5631e4ad11aaed620a19 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 27 Oct 2022 10:18:06 -0700 Subject: [PATCH 0857/1093] Disable CPPUTEST_FLAGS in downstream projects --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c1c8b7e34..2d859da22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,7 @@ endif() cmake_dependent_option(CPPUTEST_STD_CPP_LIB_DISABLED "Use the standard C++ library" OFF "NOT CPPUTEST_STD_C_LIB_DISABLED;CPPUTEST_HAVE_EXCEPTIONS" ON) -option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ON) +option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ${PROJECT_IS_TOP_LEVEL}) cmake_dependent_option(CPPUTEST_MEM_LEAK_DETECTION_DISABLED "Enable memory leak detection" OFF "NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED;NOT is_clang_cl" ON) option(CPPUTEST_EXTENSIONS "Use the CppUTest extension library" ON) From a366bb27a980b21e1691837ab36ea17a9bff49c0 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 27 Oct 2022 10:22:56 -0700 Subject: [PATCH 0858/1093] Switch options that require global flag manipulation --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d859da22..bf70ebede 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,7 +43,7 @@ cmake_dependent_option(CPPUTEST_STD_CPP_LIB_DISABLED "Use the standard C++ libra OFF "NOT CPPUTEST_STD_C_LIB_DISABLED;CPPUTEST_HAVE_EXCEPTIONS" ON) option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ${PROJECT_IS_TOP_LEVEL}) cmake_dependent_option(CPPUTEST_MEM_LEAK_DETECTION_DISABLED "Enable memory leak detection" - OFF "NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED;NOT is_clang_cl" ON) + OFF "CPPUTEST_FLAGS;NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED;NOT is_clang_cl" ON) option(CPPUTEST_EXTENSIONS "Use the CppUTest extension library" ON) include(CheckTypeSize) @@ -52,12 +52,12 @@ cmake_dependent_option(CPPUTEST_USE_LONG_LONG "Support long long" YES "HAVE_SIZEOF_LONGLONG" OFF) cmake_dependent_option(CPPUTEST_MAP_FILE "Enable the creation of a map file" - OFF "NOT MSVC" OFF) + OFF "CPPUTEST_FLAGS;NOT MSVC" OFF) cmake_dependent_option(CPPUTEST_COVERAGE "Enable running with coverage" - OFF "NOT MSVC" OFF) + OFF "CPPUTEST_FLAGS;NOT MSVC" OFF) cmake_dependent_option(CPPUTEST_WERROR "Compile with warnings as errors" - ON "PROJECT_IS_TOP_LEVEL" OFF + ON "CPPUTEST_FLAGS;PROJECT_IS_TOP_LEVEL" OFF ) cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTest" ${PROJECT_IS_TOP_LEVEL} "BUILD_TESTING" OFF) From 688116203001da6cbf4c789ef30e9e52f2b6b3fe Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 27 Oct 2022 18:36:09 -0700 Subject: [PATCH 0859/1093] Create CPPUTEST_PLATFORM cache variable --- CMakeLists.txt | 39 ++++++++++++++++++- .../CppUTestConfigurationOptions.cmake | 19 +++------ cmake/ewarm-win.toolchain.cmake | 3 -- src/CppUTest/CMakeLists.txt | 10 ++--- 4 files changed, 47 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c1c8b7e34..ab18d1285 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,6 +71,41 @@ option(CPPUTEST_VERBOSE_CONFIG "Print configuration to stdout during generation" cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" OFF "PROJECT_IS_TOP_LEVEL" OFF) +if(DEFINED CPP_PLATFORM) + message(DEPRECATION + "The CPP_PLATFORM variable has been deprecated. " + "Use CPPUTEST_PLATFORM instead." + ) +else() + if(MSVC) + set(CPP_PLATFORM VisualCpp) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "IAR") + set(CPP_PLATFORM Iar) + elseif(BORLAND) + set(CPP_PLATFORM Borland) + elseif(CPPUTEST_STD_C_LIB_DISABLED) + set(CPP_PLATFORM GccNoStdC) + else() + set(CPP_PLATFORM Gcc) + endif() +endif() +set(CPPUTEST_PLATFORM "${CPP_PLATFORM}" CACHE STRING "Platform implementation") +set_property( + CACHE CPPUTEST_PLATFORM + PROPERTY STRINGS + armcc + Borland + C2000 + Dos + Gcc + GccNoStdC + Iar + Keil + Symbian + VisualCpp + OFF +) + include(CheckCXXSymbolExists) check_cxx_symbol_exists(fopen_s "stdio.h" CPPUTEST_HAVE_SECURE_STDLIB) cmake_dependent_option(CPPUTEST_USE_SECURE_STDLIB "Use MSVC safe functions" @@ -123,9 +158,9 @@ check_cxx_symbol_exists(waitpid "sys/wait.h" CPPUTEST_HAVE_WAITPID) check_cxx_symbol_exists(gettimeofday "sys/time.h" CPPUTEST_HAVE_GETTIMEOFDAY) check_cxx_symbol_exists(pthread_mutex_lock "pthread.h" CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK) -if (NOT IAR) +if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "IAR") check_cxx_symbol_exists(strdup "string.h" CPPUTEST_HAVE_STRDUP) -endif(NOT IAR) +endif() check_type_size("long long" SIZEOF_LONGLONG LANGUAGE CXX) if(HAVE_SIZEOF_LONGLONG) set(CPPUTEST_HAVE_LONG_LONG_INT ON) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index b79994458..ddff41bc7 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -1,24 +1,15 @@ -if (MSVC) - set(CPP_PLATFORM VisualCpp) -elseif (IAR) - set(CPP_PLATFORM Iar) +if (CPPUTEST_PLATFORM STREQUAL "IAR") unset(CMAKE_CXX_EXTENSION_COMPILE_OPTION) # Set up the CMake variables for the linker set(LINKER_SCRIPT "${CppUTest_SOURCE_DIR}/platforms/iar/CppUTestTest.icf") set(CMAKE_C_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") set(CMAKE_CXX_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") -elseif (BORLAND) - set(CPP_PLATFORM Borland) +elseif (CPPUTEST_PLATFORM STREQUAL "BORLAND") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") -elseif (NOT CPPUTEST_STD_C_LIB_DISABLED) - if(NOT CPP_PLATFORM) - set(CPP_PLATFORM Gcc) - endif(NOT CPP_PLATFORM) -else (MSVC) +elseif (CPPUTEST_PLATFORM STREQUAL "GccNoStdC") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -nostdinc") set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -nostdinc") - set(CPP_PLATFORM GccNoStdC) -endif (MSVC) +endif () if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) include(CppUTestWarningFlags) @@ -34,7 +25,7 @@ if (NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) if (MSVC) set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} /FI \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} /FI \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") - elseif (IAR) + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "IAR") set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} --preinclude \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} --preinclude \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorNewMacros.h\"") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} --preinclude \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") diff --git a/cmake/ewarm-win.toolchain.cmake b/cmake/ewarm-win.toolchain.cmake index 13def43e4..f00ead0bc 100644 --- a/cmake/ewarm-win.toolchain.cmake +++ b/cmake/ewarm-win.toolchain.cmake @@ -16,9 +16,6 @@ set(CMAKE_C_COMPILER "${EW_ROOT_DIR}/bin/iccarm.exe" "${CPU_FLAGS} --dlib_config set(CMAKE_CXX_COMPILER "${EW_ROOT_DIR}/bin/iccarm.exe" "${CPU_FLAGS} --dlib_config normal") set(CMAKE_ASM_COMPILER "${EW_ROOT_DIR}/bin/iasmarm.exe" "${CPU_FLAGS}") -# For CppUTest, set the IAR variable -set(IAR True) - # Build with cmake -H. -Bbuild -G "NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE=cmake/ewarm-win.toolchain.cmake ### END CMAKE_TOOLCHAIN_FILE diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index ac0b13b80..b19a6fc4c 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -47,17 +47,17 @@ add_library(${CppUTestLibName} ${PROJECT_SOURCE_DIR}/include/CppUTest/SimpleMutex.h ) -#[[Set CPP_PLATFORM in a parent CMakeLists.txt if reusing one of the provided platforms, else supply the missing definitions]] -if (CPP_PLATFORM) +#[[Set CPPUTEST_PLATFORM in a parent CMakeLists.txt if reusing one of the provided platforms, else supply the missing definitions]] +if(CPPUTEST_PLATFORM) target_sources(${CppUTestLibName} PRIVATE - ${CMAKE_CURRENT_LIST_DIR}/../Platforms/${CPP_PLATFORM}/UtestPlatform.cpp + ${CMAKE_CURRENT_LIST_DIR}/../Platforms/${CPPUTEST_PLATFORM}/UtestPlatform.cpp ) target_include_directories(${CppUTestLibName} PUBLIC - $ + $ ) -endif(CPP_PLATFORM) +endif() #[[Arrange for the include directory to be added to the include paths of any CMake target depending on CppUTest.]] target_include_directories(${CppUTestLibName} From 5ab8425875ca79f094f01a913d87a86f942137bc Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 27 Oct 2022 18:47:28 -0700 Subject: [PATCH 0860/1093] add missing platforms --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index ab18d1285..b1250e678 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,6 +81,10 @@ else() set(CPP_PLATFORM VisualCpp) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "IAR") set(CPP_PLATFORM Iar) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "ARMCC") + set(CPP_PLATFORM armcc) + elseif(DOS) + set(CPP_PLATFORM Dos) elseif(BORLAND) set(CPP_PLATFORM Borland) elseif(CPPUTEST_STD_C_LIB_DISABLED) From 6a6c952d039feae7e720f6ed24cb4c95950fd33c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 11:16:50 -0700 Subject: [PATCH 0861/1093] Use presets --- .github/workflows/basic.yml | 43 +++++++++++++------------------------ CMakePresets.json | 25 +++++++++++++++++++++ 2 files changed, 40 insertions(+), 28 deletions(-) create mode 100644 CMakePresets.json diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 33178f117..50a145859 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -58,70 +58,57 @@ jobs: # Windows - os: windows-latest cpp_version: 17 + preset: defaults # Linux # CMake different C++ versions with clang - os: ubuntu-latest cpp_version: 98 - cxx: clang++ - cc: clang + preset: Clang - os: ubuntu-latest cpp_version: 11 - cxx: clang++ - cc: clang + preset: Clang - os: ubuntu-latest cpp_version: 14 - cxx: clang++ - cc: clang + preset: Clang - os: ubuntu-latest cpp_version: 17 - cxx: clang++ - cc: clang + preset: Clang # CMake different C++ versions with gcc - os: ubuntu-latest cpp_version: 98 - cxx: g++ - cc: gcc + preset: GNU - os: ubuntu-latest cpp_version: 11 - cxx: g++ - cc: gcc + preset: GNU - os: ubuntu-latest cpp_version: 14 - cxx: g++ - cc: gcc + preset: GNU - os: ubuntu-latest cpp_version: 17 - cxx: g++ - cc: gcc + preset: GNU # Mac OSX - os: macos-latest cpp_version: 98 + preset: defaults - os: macos-latest cpp_version: 17 - cxx: clang++ - cc: clang + preset: Clang - os: macos-latest cpp_version: 14 - cxx: g++ - cc: gcc + preset: GNU runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@main - - if: ${{ matrix.cxx }} - run: echo "CXX=${{ matrix.cxx }}" >> $GITHUB_ENV - - if: ${{ matrix.cc }} - run: echo "CC=${{ matrix.cc }}" >> $GITHUB_ENV - name: Configure run: > cmake - -B build - -S . + --preset ${{ matrix.preset }} -D CMAKE_CXX_STANDARD=${{ matrix.cpp_version }} - name: Build - run: cmake --build build --verbose + run: cmake --build cpputest_build --verbose - name: Test - run: ctest --test-dir build + run: ctest --test-dir cpputest_build visualstudio-clangcl: runs-on: windows-latest diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 000000000..3fa5ce432 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,25 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "defaults", + "binaryDir": "cpputest_build" + }, + { + "name": "GNU", + "inherits": ["defaults"], + "cacheVariables": { + "CMAKE_C_COMPILER": "gcc", + "CMAKE_CXX_COMPILER": "g++" + } + }, + { + "name": "Clang", + "inherits": ["defaults"], + "cacheVariables": { + "CMAKE_C_COMPILER": "clang", + "CMAKE_CXX_COMPILER": "clang++" + } + } + ] +} From 91df7ce08f69f3b6f10fbbedc0f97bdd41fa9253 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 11:30:56 -0700 Subject: [PATCH 0862/1093] Move ClangCL to preset --- .github/workflows/basic.yml | 19 +++---------------- CMakePresets.json | 6 ++++++ 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 50a145859..439aa95d6 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -59,6 +59,9 @@ jobs: - os: windows-latest cpp_version: 17 preset: defaults + - os: windows-latest + cpp_version: 17 + preset: ClangCL # Linux # CMake different C++ versions with clang - os: ubuntu-latest @@ -109,19 +112,3 @@ jobs: run: cmake --build cpputest_build --verbose - name: Test run: ctest --test-dir cpputest_build - - visualstudio-clangcl: - runs-on: windows-latest - steps: - - name: Checkout - uses: actions/checkout@main - - name: Configure - run: > - cmake - -B build - -G "Visual Studio 17 2022" - -T ClangCL - - name: Build - run: cmake --build build --verbose - - name: Test - run: ctest --test-dir build diff --git a/CMakePresets.json b/CMakePresets.json index 3fa5ce432..462e6e345 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -20,6 +20,12 @@ "CMAKE_C_COMPILER": "clang", "CMAKE_CXX_COMPILER": "clang++" } + }, + { + "name": "ClangCL", + "inherits": ["defaults"], + "generator": "Visual Studio 17 2022", + "toolset": "ClangCL" } ] } From 74aae02ab56253f36074d7b7e3e5fef27f941081 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 12:33:36 -0700 Subject: [PATCH 0863/1093] Move werror to presets --- .github/workflows/basic.yml | 2 +- CMakeLists.txt | 4 ---- CMakePresets.json | 22 +++++++++++++++++++--- cmake/Modules/CppUTestWarningFlags.cmake | 12 +----------- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 439aa95d6..d3ff41fc1 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -58,7 +58,7 @@ jobs: # Windows - os: windows-latest cpp_version: 17 - preset: defaults + preset: MSVC - os: windows-latest cpp_version: 17 preset: ClangCL diff --git a/CMakeLists.txt b/CMakeLists.txt index a2a069261..2d118440c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,10 +55,6 @@ cmake_dependent_option(CPPUTEST_MAP_FILE "Enable the creation of a map file" OFF "CPPUTEST_FLAGS;NOT MSVC" OFF) cmake_dependent_option(CPPUTEST_COVERAGE "Enable running with coverage" OFF "CPPUTEST_FLAGS;NOT MSVC" OFF) -cmake_dependent_option(CPPUTEST_WERROR - "Compile with warnings as errors" - ON "CPPUTEST_FLAGS;PROJECT_IS_TOP_LEVEL" OFF -) cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTest" ${PROJECT_IS_TOP_LEVEL} "BUILD_TESTING" OFF) option(CPPUTEST_TESTS_DETAILED "Run each test separately instead of grouped?" OFF) diff --git a/CMakePresets.json b/CMakePresets.json index 462e6e345..7dd37469a 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -10,7 +10,9 @@ "inherits": ["defaults"], "cacheVariables": { "CMAKE_C_COMPILER": "gcc", - "CMAKE_CXX_COMPILER": "g++" + "CMAKE_C_FLAGS": "-Werror", + "CMAKE_CXX_COMPILER": "g++", + "CMAKE_CXX_FLAGS": "-Werror" } }, { @@ -18,14 +20,28 @@ "inherits": ["defaults"], "cacheVariables": { "CMAKE_C_COMPILER": "clang", - "CMAKE_CXX_COMPILER": "clang++" + "CMAKE_C_FLAGS": "-Werror", + "CMAKE_CXX_COMPILER": "clang++", + "CMAKE_CXX_FLAGS": "-Werror" } }, { "name": "ClangCL", "inherits": ["defaults"], "generator": "Visual Studio 17 2022", - "toolset": "ClangCL" + "toolset": "ClangCL", + "cacheVariables": { + "CMAKE_C_FLAGS": "/WX", + "CMAKE_CXX_FLAGS": "/WX /EHsc" + } + }, + { + "name": "MSVC", + "inherits": ["defaults"], + "cacheVariables": { + "CMAKE_C_FLAGS": "/WX", + "CMAKE_CXX_FLAGS": "/WX /EHsc" + } } ] } diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index 4ed9bd5af..6181baaa2 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -1,10 +1,9 @@ if (MSVC) - set(CPPUTEST_C_WARNING_FLAGS "/WX") - set(CPPUTEST_CXX_WARNING_FLAGS "/WX /wd4290") else (MSVC) include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) + set(CMAKE_REQUIRED_FLAGS "-Wno-error") macro(check_and_append_c_warning_flags) foreach (flag ${ARGN}) check_c_compiler_flag("-${flag}" WARNING_C_FLAG_${flag}) @@ -24,10 +23,6 @@ else (MSVC) endforeach (flag) endmacro(check_and_append_cxx_warning_flags) - if (NOT GMOCK AND NOT REAL_GTEST) - list(APPEND WARNING_C_FLAGS Werror pedantic-errors) - endif (NOT GMOCK AND NOT REAL_GTEST) - set(WARNING_C_FLAGS Wall Wextra @@ -44,11 +39,6 @@ else (MSVC) Wno-long-long ) - if (CPPUTEST_WERROR) - list(APPEND WARNING_C_FLAGS Werror) - endif () - - set(WARNING_C_ONLY_FLAGS Wstrict-prototypes ) From 2a7578a1b55f6db32f6d637cae4bc4b5b4c0a669 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 13:05:34 -0700 Subject: [PATCH 0864/1093] Move MinGW to preset --- .github/workflows/extended.yml | 13 +++---------- CMakePresets.json | 10 ++++++++++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 45a673886..dd4981f49 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -79,9 +79,6 @@ jobs: cmake_wine: runs-on: ubuntu-latest - env: - CC: x86_64-w64-mingw32-gcc - CXX: x86_64-w64-mingw32-g++ steps: - name: Install tools run: sudo apt-get install -y mingw-w64 wine64 @@ -89,15 +86,11 @@ jobs: uses: actions/checkout@main - name: Configure run: > - cmake - -B build - -S . - -D CMAKE_SYSTEM_NAME=Windows - -D CMAKE_CROSSCOMPILING_EMULATOR=wine + cmake --preset MinGW - name: Build - run: cmake --build build --verbose + run: cmake --build cpputest_build --verbose - name: Test - run: ctest --test-dir build + run: ctest --test-dir cpputest_build cmake_no_exceptions: runs-on: ubuntu-latest diff --git a/CMakePresets.json b/CMakePresets.json index 7dd37469a..95b8edc79 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -42,6 +42,16 @@ "CMAKE_C_FLAGS": "/WX", "CMAKE_CXX_FLAGS": "/WX /EHsc" } + }, + { + "name": "MinGW", + "inherits": ["GNU"], + "cacheVariables": { + "CMAKE_C_COMPILER": "x86_64-w64-mingw32-gcc", + "CMAKE_CXX_COMPILER": "x86_64-w64-mingw32-g++", + "CMAKE_SYSTEM_NAME": "Windows", + "CMAKE_CROSSCOMPILING_EMULATOR": "wine" + } } ] } From 773b1677e7f1bb13190ba7deb52180917c4b6c4e Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 13:07:52 -0700 Subject: [PATCH 0865/1093] Move build type to presets --- CMakeLists.txt | 12 ------------ CMakePresets.json | 5 ++++- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d118440c..e46935fa2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -111,18 +111,6 @@ check_cxx_symbol_exists(fopen_s "stdio.h" CPPUTEST_HAVE_SECURE_STDLIB) cmake_dependent_option(CPPUTEST_USE_SECURE_STDLIB "Use MSVC safe functions" ON "WIN32;CPPUTEST_HAVE_SECURE_STDLIB" OFF) -if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) # Don't change users' build type. - # Multi-configuration generators don't have a single build type. - get_property( - GENERATOR_IS_MULTI_CONFIG GLOBAL - PROPERTY GENERATOR_IS_MULTI_CONFIG - ) - if(NOT GENERATOR_IS_MULTICONFIG AND NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "What kind of build this is" FORCE) - message("No CMAKE_BUILD_TYPE set. Assigning: ${CMAKE_BUILD_TYPE}") - endif() -endif() - set( CppUTestLibName "CppUTest" ) set( CppUTestExtLibName "CppUTestExt" ) diff --git a/CMakePresets.json b/CMakePresets.json index 95b8edc79..b63cab4df 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -3,7 +3,10 @@ "configurePresets": [ { "name": "defaults", - "binaryDir": "cpputest_build" + "binaryDir": "cpputest_build", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "RelWithDebInfo" + } }, { "name": "GNU", From 44549ac4446be7cd3541249ede380e5871cbef5c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 13:11:16 -0700 Subject: [PATCH 0866/1093] Move extended builds to presets --- .github/workflows/extended.yml | 12 +++--------- CMakePresets.json | 8 ++++++++ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index dd4981f49..9d8148106 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -96,14 +96,12 @@ jobs: runs-on: ubuntu-latest name: Disable exceptions env: - CC: gcc - CXX: g++ CXXFLAGS: -fno-exceptions steps: - name: Checkout uses: actions/checkout@main - name: Configure - run: cmake -B cpputest_build -S . + run: cmake --preset GNU - name: Build run: cmake --build cpputest_build --verbose - name: Test @@ -116,7 +114,7 @@ jobs: uses: actions/checkout@main - name: Install run: | - cmake -B cpputest_build/ -S . -DCMAKE_BUILD_TYPE=RelWithDebInfo + cmake --preset GNU cmake --build cpputest_build/ -j ctest --test-dir cpputest_build/ sudo cmake --install cpputest_build/ @@ -139,11 +137,7 @@ jobs: sudo dpkg --install qemu.deb rm -f qemu.deb - name: Configure - run: > - cmake - -B cpputest_build - -D CMAKE_TOOLCHAIN_FILE=cmake/arm-none-eabi-gcc.toolchain.cmake - -D CMAKE_CROSSCOMPILING_EMULATOR="qemu-arm-static;-cpu;cortex-m4" + run: cmake --preset arm-embedded - name: Build run: cmake --build cpputest_build - name: Test diff --git a/CMakePresets.json b/CMakePresets.json index b63cab4df..eb73f1a9b 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -55,6 +55,14 @@ "CMAKE_SYSTEM_NAME": "Windows", "CMAKE_CROSSCOMPILING_EMULATOR": "wine" } + }, + { + "name": "arm-embedded", + "inherits": ["defaults"], + "toolchainFile": "${sourceDir}/cmake/arm-none-eabi-gcc.toolchain.cmake", + "cacheVariables": { + "CMAKE_CROSSCOMPILING_EMULATOR": "qemu-arm-static;-cpu;cortex-m4" + } } ] } From d862cc1360953c00d705a0bed63c72571024535a Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 13:13:08 -0700 Subject: [PATCH 0867/1093] Move language extensions to presets --- CMakePresets.json | 3 ++- cmake/Modules/CppUTestConfigurationOptions.cmake | 4 ---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index eb73f1a9b..4acc0c6ab 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -5,7 +5,8 @@ "name": "defaults", "binaryDir": "cpputest_build", "cacheVariables": { - "CMAKE_BUILD_TYPE": "RelWithDebInfo" + "CMAKE_BUILD_TYPE": "RelWithDebInfo", + "CMAKE_CXX_EXTENSIONS": false } }, { diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index ddff41bc7..75b133bca 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -59,10 +59,6 @@ if (CPPUTEST_COVERAGE AND NOT MSVC) ) endif() -if (CMAKE_CXX_STANDARD) - set(CMAKE_CXX_EXTENSIONS OFF) -endif () - set(GMOCK_HOME $ENV{GMOCK_HOME}) if (DEFINED ENV{GMOCK_HOME}) # GMock pulls in gtest. From a9ec8f17fb6e901add4a7ec2e35c20518a1d9a4c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 13:16:30 -0700 Subject: [PATCH 0868/1093] Move coverage out of project --- .github/workflows/extended.yml | 9 +-------- CMakeLists.txt | 3 --- CMakePresets.json | 11 +++++++++++ .../CppUTestConfigurationOptions.cmake | 19 ------------------- 4 files changed, 12 insertions(+), 30 deletions(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 9d8148106..ce4f2cc3e 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -31,14 +31,7 @@ jobs: - name: Checkout uses: actions/checkout@main - name: Configure - run: > - cmake - -S . - -B cpputest_build - -D CMAKE_BUILD_TYPE=Debug - -D CMAKE_CXX_STANDARD=11 - -D CPPUTEST_COVERAGE=ON - -D CPPUTEST_EXAMPLES=OFF + run: cmake --preset coverage - name: Build run: cmake --build cpputest_build - name: Test diff --git a/CMakeLists.txt b/CMakeLists.txt index e46935fa2..061ff0aff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,8 +53,6 @@ cmake_dependent_option(CPPUTEST_USE_LONG_LONG "Support long long" cmake_dependent_option(CPPUTEST_MAP_FILE "Enable the creation of a map file" OFF "CPPUTEST_FLAGS;NOT MSVC" OFF) -cmake_dependent_option(CPPUTEST_COVERAGE "Enable running with coverage" - OFF "CPPUTEST_FLAGS;NOT MSVC" OFF) cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTest" ${PROJECT_IS_TOP_LEVEL} "BUILD_TESTING" OFF) option(CPPUTEST_TESTS_DETAILED "Run each test separately instead of grouped?" OFF) @@ -285,7 +283,6 @@ Features configured in CppUTest: Disable Standard C++ library: ${CPPUTEST_STD_CPP_LIB_DISABLED} Generating map file: ${CPPUTEST_MAP_FILE} - Compiling with coverage: ${CPPUTEST_COVERAGE} Compile and run self-tests ${CPPUTEST_BUILD_TESTING} Run self-tests separately ${CPPUTEST_TESTS_DETAILED} diff --git a/CMakePresets.json b/CMakePresets.json index 4acc0c6ab..43b99b880 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -64,6 +64,17 @@ "cacheVariables": { "CMAKE_CROSSCOMPILING_EMULATOR": "qemu-arm-static;-cpu;cortex-m4" } + }, + { + "name": "coverage", + "inherits": ["GNU"], + "cacheVariables": { + "CMAKE_C_FLAGS": "--coverage", + "CMAKE_CXX_FLAGS": "--coverage", + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_CXX_STANDARD": "11", + "CPPUTEST_EXAMPLES": false + } } ] } diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 75b133bca..ac0ec8247 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -40,25 +40,6 @@ if (CPPUTEST_MAP_FILE AND NOT MSVC) set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -Wl,-Map,$<.map.txt") endif () -if (CPPUTEST_COVERAGE AND NOT MSVC) - set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} --coverage") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} --coverage") - set(CMAKE_BUILD_TYPE "Debug") - find_program(GCOVR gcovr DOC "gcovr executable") - - if (NOT GCOVR) - message(SEND_ERROR "gcovr not found") - endif() - - add_custom_target(coverage ${GCOVR} - --root ${PROJECT_SOURCE_DIR} - --output "${CMAKE_BINARY_DIR}/coverage/coverage.html" - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - COMMENT "Generate coverage data" - VERBATIM - ) -endif() - set(GMOCK_HOME $ENV{GMOCK_HOME}) if (DEFINED ENV{GMOCK_HOME}) # GMock pulls in gtest. From 54ce379325af0fa5ed9b11f8e6d656b90166f58d Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 13:37:44 -0700 Subject: [PATCH 0869/1093] Move mapfile setting out of cache --- CMakeLists.txt | 4 -- CMakePresets.json | 40 +++++++++---------- .../CppUTestConfigurationOptions.cmake | 8 +--- tests/CppUTest/CMakeLists.txt | 9 +++++ tests/CppUTestExt/CMakeLists.txt | 9 +++++ 5 files changed, 39 insertions(+), 31 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 061ff0aff..0de1285fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,8 +51,6 @@ check_type_size("long long" SIZEOF_LONGLONG) cmake_dependent_option(CPPUTEST_USE_LONG_LONG "Support long long" YES "HAVE_SIZEOF_LONGLONG" OFF) -cmake_dependent_option(CPPUTEST_MAP_FILE "Enable the creation of a map file" - OFF "CPPUTEST_FLAGS;NOT MSVC" OFF) cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTest" ${PROJECT_IS_TOP_LEVEL} "BUILD_TESTING" OFF) option(CPPUTEST_TESTS_DETAILED "Run each test separately instead of grouped?" OFF) @@ -282,8 +280,6 @@ Features configured in CppUTest: Disable Standard C library: ${CPPUTEST_STD_C_LIB_DISABLED} Disable Standard C++ library: ${CPPUTEST_STD_CPP_LIB_DISABLED} - Generating map file: ${CPPUTEST_MAP_FILE} - Compile and run self-tests ${CPPUTEST_BUILD_TESTING} Run self-tests separately ${CPPUTEST_TESTS_DETAILED} diff --git a/CMakePresets.json b/CMakePresets.json index 43b99b880..d5e4f82f6 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -12,40 +12,36 @@ { "name": "GNU", "inherits": ["defaults"], + "environment": { + "CFLAGS": "-Werror", + "CXXFLAGS": "-Werror" + }, "cacheVariables": { "CMAKE_C_COMPILER": "gcc", - "CMAKE_C_FLAGS": "-Werror", - "CMAKE_CXX_COMPILER": "g++", - "CMAKE_CXX_FLAGS": "-Werror" + "CMAKE_CXX_COMPILER": "g++" } }, { "name": "Clang", - "inherits": ["defaults"], + "inherits": ["GNU"], "cacheVariables": { "CMAKE_C_COMPILER": "clang", - "CMAKE_C_FLAGS": "-Werror", - "CMAKE_CXX_COMPILER": "clang++", - "CMAKE_CXX_FLAGS": "-Werror" + "CMAKE_CXX_COMPILER": "clang++" } }, { - "name": "ClangCL", + "name": "MSVC", "inherits": ["defaults"], - "generator": "Visual Studio 17 2022", - "toolset": "ClangCL", - "cacheVariables": { - "CMAKE_C_FLAGS": "/WX", - "CMAKE_CXX_FLAGS": "/WX /EHsc" + "environment": { + "CFLAGS": "/WX", + "CXXFLAGS": "/WX" } }, { - "name": "MSVC", - "inherits": ["defaults"], - "cacheVariables": { - "CMAKE_C_FLAGS": "/WX", - "CMAKE_CXX_FLAGS": "/WX /EHsc" - } + "name": "ClangCL", + "inherits": ["MSVC"], + "generator": "Visual Studio 17 2022", + "toolset": "ClangCL" }, { "name": "MinGW", @@ -68,9 +64,11 @@ { "name": "coverage", "inherits": ["GNU"], + "environment": { + "CFLAGS": "--coverage", + "CXXFLAGS": "--coverage" + }, "cacheVariables": { - "CMAKE_C_FLAGS": "--coverage", - "CMAKE_CXX_FLAGS": "--coverage", "CMAKE_BUILD_TYPE": "Debug", "CMAKE_CXX_STANDARD": "11", "CPPUTEST_EXAMPLES": false diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index ac0ec8247..560295c0c 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -2,8 +2,8 @@ if (CPPUTEST_PLATFORM STREQUAL "IAR") unset(CMAKE_CXX_EXTENSION_COMPILE_OPTION) # Set up the CMake variables for the linker set(LINKER_SCRIPT "${CppUTest_SOURCE_DIR}/platforms/iar/CppUTestTest.icf") - set(CMAKE_C_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") - set(CMAKE_CXX_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT} --map mapfile.map") + set(CMAKE_C_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT}") + set(CMAKE_CXX_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT}") elseif (CPPUTEST_PLATFORM STREQUAL "BORLAND") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") elseif (CPPUTEST_PLATFORM STREQUAL "GccNoStdC") @@ -36,10 +36,6 @@ if (NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) endif (MSVC) endif () -if (CPPUTEST_MAP_FILE AND NOT MSVC) - set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -Wl,-Map,$<.map.txt") -endif () - set(GMOCK_HOME $ENV{GMOCK_HOME}) if (DEFINED ENV{GMOCK_HOME}) # GMock pulls in gtest. diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index d12534863..d81ab9823 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -52,6 +52,15 @@ endif() cpputest_normalize_test_output_location(CppUTestTests) target_link_libraries(CppUTestTests PRIVATE ${CppUTestLibName}) +if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") + target_link_options(CppUTestTests + PRIVATE + $<$:LINKER:-Map=$.map> + "$<$:/MAP>" + $<$:"SHELL:--map $.map"> + ) +endif() + if (CPPUTEST_TEST_DISCOVERY) cpputest_buildtime_discover_tests(CppUTestTests) endif() diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 53995febd..3e44ff034 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -44,6 +44,15 @@ target_link_libraries(CppUTestExtTests ${CppUTestExtLibName} ) +if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") + target_link_options(CppUTestExtTests + PRIVATE + $<$:LINKER:-Map=$.map> + "$<$:/MAP>" + $<$:"SHELL:--map $.map"> + ) +endif() + if (CPPUTEST_TEST_DISCOVERY) cpputest_buildtime_discover_tests(CppUTestExtTests) endif() From 4261d0ade631b7ec4dbdf17aa5fba21664caada7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 14:26:44 -0700 Subject: [PATCH 0870/1093] Move C++ stdlib to presets --- .github/workflows/extended.yml | 6 ++---- CMakePresets.json | 7 +++++++ cmake/Modules/CppUTestConfigurationOptions.cmake | 6 ------ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index ce4f2cc3e..cb48f64e6 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -85,16 +85,14 @@ jobs: - name: Test run: ctest --test-dir cpputest_build - cmake_no_exceptions: + cmake_no_std_cpp: runs-on: ubuntu-latest name: Disable exceptions - env: - CXXFLAGS: -fno-exceptions steps: - name: Checkout uses: actions/checkout@main - name: Configure - run: cmake --preset GNU + run: cmake --preset no-std-cpp - name: Build run: cmake --build cpputest_build --verbose - name: Test diff --git a/CMakePresets.json b/CMakePresets.json index d5e4f82f6..dc5cbb7bf 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -73,6 +73,13 @@ "CMAKE_CXX_STANDARD": "11", "CPPUTEST_EXAMPLES": false } + }, + { + "name": "no-std-cpp", + "inherits": ["GNU"], + "environment": { + "CXXFLAGS": "-Werror -fno-exceptions -fno-rtti -nostdinc++" + } } ] } diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 560295c0c..a4de1abd8 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -15,12 +15,6 @@ if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) include(CppUTestWarningFlags) endif () -if (CPPUTEST_STD_CPP_LIB_DISABLED) - if (NOT CPPUTEST_STD_C_LIB_DISABLED AND NOT MSVC) - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -nostdinc++") - endif () -endif () - if (NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) if (MSVC) set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} /FI \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") From 597c2b9bf7b4b573246e44d7fd0fea02c2010c6c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 15:29:12 -0700 Subject: [PATCH 0871/1093] Scope MinGW workarounds --- CMakeLists.txt | 12 ------------ CMakePresets.json | 3 +++ config.h.cmake | 6 ------ src/CppUTest/CMakeLists.txt | 7 +++++++ 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0de1285fd..c37ac0807 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,18 +150,6 @@ if(HAVE_SIZEOF_LONGLONG) set(CPPUTEST_HAVE_LONG_LONG_INT ON) endif() -if (MINGW) - check_struct_has_member("struct timespec" tv_sec time.h CPPUTEST_HAVE_STRUCT_TIMESPEC LANGUAGE CXX) - if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - # Apply workaround for static/shared libraries on MinGW C/C++ compiler - # Issue occurs with CMake >= 3.9.0, it doesn't filter out gcc,gcc_s,gcc_eh from - # the implicit library list anymore, so the C++ linker is getting passed the static - # gcc_eh library since that's what the C linker uses by default. Only solution appears - # to be to force static linkage. - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") - endif() -endif() - configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" "${PROJECT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" diff --git a/CMakePresets.json b/CMakePresets.json index dc5cbb7bf..012558a19 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -46,6 +46,9 @@ { "name": "MinGW", "inherits": ["GNU"], + "environment": { + "LDFLAGS": "-static" + }, "cacheVariables": { "CMAKE_C_COMPILER": "x86_64-w64-mingw32-gcc", "CMAKE_CXX_COMPILER": "x86_64-w64-mingw32-g++", diff --git a/config.h.cmake b/config.h.cmake index dfbd83f0c..ceef84562 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -13,12 +13,6 @@ #cmakedefine01 CPPUTEST_HAVE_FENV -#cmakedefine CPPUTEST_HAVE_STRUCT_TIMESPEC -#ifdef CPPUTEST_HAVE_STRUCT_TIMESPEC -/* Apply workaround for MinGW timespec redefinition (pthread.h / time.h) */ -#define _TIMESPEC_DEFINED 1 -#endif - #cmakedefine CPPUTEST_STD_C_LIB_DISABLED #cmakedefine CPPUTEST_STD_CPP_LIB_DISABLED diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index b19a6fc4c..661d8c29d 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -59,6 +59,11 @@ if(CPPUTEST_PLATFORM) ) endif() +if (MINGW) + include(CheckStructHasMember) + check_struct_has_member("struct timespec" tv_sec time.h HAVE_STRUCT_TIMESPEC LANGUAGE CXX) +endif() + #[[Arrange for the include directory to be added to the include paths of any CMake target depending on CppUTest.]] target_include_directories(${CppUTestLibName} PUBLIC @@ -69,6 +74,8 @@ target_include_directories(${CppUTestLibName} target_compile_definitions(${CppUTestLibName} PRIVATE $<$:STDC_WANT_SECURE_LIB> + # Apply workaround for MinGW timespec redefinition (pthread.h / time.h). + $<$:_TIMESPEC_DEFINED> ) if (WIN32) From 56e771ebfe93c3096d61becdab41d020c65008a4 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 15:35:06 -0700 Subject: [PATCH 0872/1093] Factor out install support --- CMakeLists.txt | 67 +------------------------------------- cmake/install.cmake | 78 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 66 deletions(-) create mode 100644 cmake/install.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index c37ac0807..c55e40d35 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -179,72 +179,7 @@ if (CPPUTEST_EXAMPLES) endif() if(PROJECT_IS_TOP_LEVEL) - set (INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") - set (LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") - set (INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") - - # Pkg-config file - set(CppUTest_PKGCONFIG_FILE ${CMAKE_CURRENT_BINARY_DIR}/cpputest.pc) - - # Pkg-config file. - set (prefix "${CMAKE_INSTALL_PREFIX}") - set (exec_prefix "\${prefix}") - set (libdir "\${exec_prefix}/${LIB_INSTALL_DIR}") - set (includedir "\${prefix}/${INCLUDE_INSTALL_DIR}") - set (PACKAGE_VERSION "${PROJECT_VERSION}") - - configure_file (cpputest.pc.in "${CppUTest_PKGCONFIG_FILE}" @ONLY) - install( - FILES "${CppUTest_PKGCONFIG_FILE}" - DESTINATION ${LIB_INSTALL_DIR}/pkgconfig - ) - - install( - FILES "${CMAKE_CURRENT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" - DESTINATION "${INCLUDE_INSTALL_DIR}/generated" - ) - - # Try to include helper module - include(CMakePackageConfigHelpers OPTIONAL - RESULT_VARIABLE PkgHelpers_AVAILABLE) - # guard against older versions of cmake which do not provide it - if(PkgHelpers_AVAILABLE) - set(CPPUTEST_CONFIG_DEST "${LIB_INSTALL_DIR}/CppUTest/cmake") - - configure_package_config_file(CppUTestConfig.cmake.install.in - ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfig.cmake - INSTALL_DESTINATION "${CPPUTEST_CONFIG_DEST}" - PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR) - write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake - VERSION ${PROJECT_VERSION} - COMPATIBILITY SameMajorVersion ) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake - DESTINATION "${CPPUTEST_CONFIG_DEST}" ) - install( - EXPORT CppUTestTargets - NAMESPACE CppUTest:: - DESTINATION "${CPPUTEST_CONFIG_DEST}" - ) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake - DESTINATION "${CPPUTEST_CONFIG_DEST}/Scripts") - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake - DESTINATION "${CPPUTEST_CONFIG_DEST}/Modules") - configure_package_config_file(CppUTestConfig.cmake.build.in - ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfig.cmake - INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} - PATH_VARS INCLUDE_DIR CMAKE_CURRENT_BINARY_DIR) - write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfigVersion.cmake - VERSION ${PROJECT_VERSION} - COMPATIBILITY SameMajorVersion ) - set(CppUTest_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE PATH "The directory containing a CMake configuration file for CppUTest.") - else() - message("If you wish to use find_package(CppUTest) in your own project to find CppUTest library" - " please update cmake to version which provides CMakePackageConfighelpers module" - " or write generators for CppUTestConfig.cmake by yourself.") - endif() + include(cmake/install.cmake) endif() if(CPPUTEST_VERBOSE_CONFIG) diff --git a/cmake/install.cmake b/cmake/install.cmake new file mode 100644 index 000000000..0ce77d6b5 --- /dev/null +++ b/cmake/install.cmake @@ -0,0 +1,78 @@ +set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") +set(LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") +set(INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") + +# Pkg-config file +set(CppUTest_PKGCONFIG_FILE ${CMAKE_CURRENT_BINARY_DIR}/cpputest.pc) + +# Pkg-config file. +set(prefix "${CMAKE_INSTALL_PREFIX}") +set(exec_prefix "\${prefix}") +set(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}") +set(includedir "\${prefix}/${INCLUDE_INSTALL_DIR}") +set(PACKAGE_VERSION "${PROJECT_VERSION}") + +configure_file(cpputest.pc.in "${CppUTest_PKGCONFIG_FILE}" @ONLY) +install( + FILES "${CppUTest_PKGCONFIG_FILE}" + DESTINATION ${LIB_INSTALL_DIR}/pkgconfig +) + +install( + FILES "${CMAKE_CURRENT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" + DESTINATION "${INCLUDE_INSTALL_DIR}/generated" +) + +# Try to include helper module +include(CMakePackageConfigHelpers OPTIONAL + RESULT_VARIABLE PkgHelpers_AVAILABLE +) + +# guard against older versions of cmake which do not provide it +if(NOT PkgHelpers_AVAILABLE) + message(WARNING + "If you wish to use find_package(CppUTest) in your own project to find CppUTest library" + " please update cmake to version which provides CMakePackageConfighelpers module" + " or write generators for CppUTestConfig.cmake by yourself." + ) + return() +endif() + +set(CPPUTEST_CONFIG_DEST "${LIB_INSTALL_DIR}/CppUTest/cmake") + +configure_package_config_file(CppUTestConfig.cmake.install.in + ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfig.cmake + INSTALL_DESTINATION "${CPPUTEST_CONFIG_DEST}" + PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR) +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion ) +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake + DESTINATION "${CPPUTEST_CONFIG_DEST}" ) +install( + EXPORT CppUTestTargets + NAMESPACE CppUTest:: + DESTINATION "${CPPUTEST_CONFIG_DEST}" +) +install( + FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Scripts/CppUTestBuildTimeDiscoverTests.cmake + DESTINATION "${CPPUTEST_CONFIG_DEST}/Scripts" +) +install( + FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake + DESTINATION "${CPPUTEST_CONFIG_DEST}/Modules" +) +configure_package_config_file(CppUTestConfig.cmake.build.in + ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfig.cmake + INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} + PATH_VARS INCLUDE_DIR CMAKE_CURRENT_BINARY_DIR +) +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion +) From 87eee6c63eed091c186312b8895422925e13e0ba Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 15:53:29 -0700 Subject: [PATCH 0873/1093] Organize src/test --- CMakeLists.txt | 16 +++++----------- src/CMakeLists.txt | 4 ++++ tests/CMakeLists.txt | 4 ++++ 3 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 src/CMakeLists.txt create mode 100644 tests/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index c55e40d35..85a3e48ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,8 +130,6 @@ include(CppUTestBuildTimeDiscoverTests) include(CppUTestNormalizeTestOutputLocation) include(GNUInstallDirs) -add_subdirectory(src/CppUTest) - # Check for symbols before setting a lot of stuff include(CheckTypeSize) include(CheckStructHasMember) @@ -153,7 +151,10 @@ endif() configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" "${PROJECT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" - ) +) + +add_subdirectory(src) + target_include_directories(${CppUTestLibName} PUBLIC $ @@ -163,15 +164,8 @@ target_compile_definitions(${CppUTestLibName} HAVE_CONFIG_H ) -if (CPPUTEST_EXTENSIONS) - add_subdirectory(src/CppUTestExt) -endif () - if (CPPUTEST_BUILD_TESTING) - add_subdirectory(tests/CppUTest) - if (CPPUTEST_EXTENSIONS) - add_subdirectory(tests/CppUTestExt) - endif () + add_subdirectory(tests) endif () if (CPPUTEST_EXAMPLES) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 000000000..8bee1d9b8 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,4 @@ +add_subdirectory(CppUTest) +if (CPPUTEST_EXTENSIONS) + add_subdirectory(CppUTestExt) +endif () diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 000000000..8bee1d9b8 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,4 @@ +add_subdirectory(CppUTest) +if (CPPUTEST_EXTENSIONS) + add_subdirectory(CppUTestExt) +endif () From 48d46751b49917f55103c443ccb6030e675ba1bb Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 16:18:40 -0700 Subject: [PATCH 0874/1093] Move IAR config into presets I have no way to test this. --- CMakePresets.json | 12 ++++++++++++ cmake/Modules/CppUTestConfigurationOptions.cmake | 8 +------- cmake/ewarm-linux.toolchain.cmake | 7 ++----- cmake/ewarm-win.toolchain.cmake | 4 ++-- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 012558a19..ff975cb48 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -83,6 +83,18 @@ "environment": { "CXXFLAGS": "-Werror -fno-exceptions -fno-rtti -nostdinc++" } + }, + { + "name": "IAR", + "inherits": ["defaults"], + "cacheVariables": { + "CMAKE_SYSTEM_NAME": "Generic", + "CMAKE_C_COMPILER": "iccarm", + "CMAKE_C_FLAGS_INIT": "--cpu Cortex-M4F --dlib_config normal", + "CMAKE_CXX_COMPILER": "iccarm", + "CMAKE_CXX_FLAGS_INIT": "--cpu Cortex-M4F --dlib_config normal", + "CMAKE_EXE_LINKER_FLAGS": "--semihosting --config ${sourceDir}/platforms/iar/CppUTestTest.icf" + } } ] } diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index a4de1abd8..99c723690 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -1,10 +1,4 @@ -if (CPPUTEST_PLATFORM STREQUAL "IAR") - unset(CMAKE_CXX_EXTENSION_COMPILE_OPTION) - # Set up the CMake variables for the linker - set(LINKER_SCRIPT "${CppUTest_SOURCE_DIR}/platforms/iar/CppUTestTest.icf") - set(CMAKE_C_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT}") - set(CMAKE_CXX_LINK_FLAGS "--semihosting --config ${LINKER_SCRIPT}") -elseif (CPPUTEST_PLATFORM STREQUAL "BORLAND") +if (CPPUTEST_PLATFORM STREQUAL "BORLAND") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") elseif (CPPUTEST_PLATFORM STREQUAL "GccNoStdC") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -nostdinc") diff --git a/cmake/ewarm-linux.toolchain.cmake b/cmake/ewarm-linux.toolchain.cmake index 4da31b5bd..5bd534718 100644 --- a/cmake/ewarm-linux.toolchain.cmake +++ b/cmake/ewarm-linux.toolchain.cmake @@ -1,5 +1,5 @@ ### BEGIN CMAKE_TOOLCHAIN_FILE -# "Generic" is used when cross compiling +# "Generic" is used when compiling for bare-metal set(CMAKE_SYSTEM_NAME Generic) # Set the EW installation root directory @@ -16,9 +16,6 @@ set(CMAKE_C_COMPILER "${EW_ROOT_DIR}/bin/iccarm" "${CPU_FLAGS} --dlib_config nor set(CMAKE_CXX_COMPILER "${EW_ROOT_DIR}/bin/iccarm" "${CPU_FLAGS} --dlib_config normal") set(CMAKE_ASM_COMPILER "${EW_ROOT_DIR}/bin/iasmarm" "${CPU_FLAGS}") -# For CppUTest, set the IAR variable -set(IAR True) - -# Build with cmake -H. -Bbuild -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=cmake/ewarm-linux.toolchain.cmake +# Build with cmake -S. -Bbuild -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=cmake/ewarm-linux.toolchain.cmake ### END CMAKE_TOOLCHAIN_FILE diff --git a/cmake/ewarm-win.toolchain.cmake b/cmake/ewarm-win.toolchain.cmake index f00ead0bc..178ad54f7 100644 --- a/cmake/ewarm-win.toolchain.cmake +++ b/cmake/ewarm-win.toolchain.cmake @@ -1,5 +1,5 @@ ### BEGIN CMAKE_TOOLCHAIN_FILE -# "Generic" is used when cross compiling +# "Generic" is used when compiling for bare-metal set(CMAKE_SYSTEM_NAME Generic) # Set the EW installation root directory @@ -16,6 +16,6 @@ set(CMAKE_C_COMPILER "${EW_ROOT_DIR}/bin/iccarm.exe" "${CPU_FLAGS} --dlib_config set(CMAKE_CXX_COMPILER "${EW_ROOT_DIR}/bin/iccarm.exe" "${CPU_FLAGS} --dlib_config normal") set(CMAKE_ASM_COMPILER "${EW_ROOT_DIR}/bin/iasmarm.exe" "${CPU_FLAGS}") -# Build with cmake -H. -Bbuild -G "NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE=cmake/ewarm-win.toolchain.cmake +# Build with cmake -S. -Bbuild -G "NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE=cmake/ewarm-win.toolchain.cmake ### END CMAKE_TOOLCHAIN_FILE From e7bc5fbf06cb817b0c2855cf37c58dfe62107991 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 17:46:29 -0700 Subject: [PATCH 0875/1093] Move no libc settings to presets --- .github/workflows/extended.yml | 14 ++++++++++++++ CMakePresets.json | 11 +++++++++++ cmake/Modules/CppUTestConfigurationOptions.cmake | 3 --- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index cb48f64e6..d534577d4 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -98,6 +98,20 @@ jobs: - name: Test run: ctest --test-dir cpputest_build + cmake_no_std_c: + runs-on: ubuntu-latest + name: Disable libc + steps: + - name: Checkout + uses: actions/checkout@main + - name: Configure + run: cmake --preset no-std-c + # FIXME: This is broken. + # - name: Build + # run: cmake --build cpputest_build --verbose + # - name: Test + # run: ctest --test-dir cpputest_build + cmake_install: runs-on: ubuntu-latest steps: diff --git a/CMakePresets.json b/CMakePresets.json index ff975cb48..e053bc964 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -84,6 +84,17 @@ "CXXFLAGS": "-Werror -fno-exceptions -fno-rtti -nostdinc++" } }, + { + "name": "no-std-c", + "inherits": ["GNU"], + "environment": { + "CXXFLAGS": "-nostdinc", + "CFLAGS": "-nostdinc" + }, + "cacheVariables": { + "CPPUTEST_STD_C_LIB_DISABLED": true + } + }, { "name": "IAR", "inherits": ["defaults"], diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 99c723690..dc1ed4f84 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -1,8 +1,5 @@ if (CPPUTEST_PLATFORM STREQUAL "BORLAND") set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") -elseif (CPPUTEST_PLATFORM STREQUAL "GccNoStdC") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -nostdinc") - set(CPPUTEST_LD_FLAGS "${CPPUTEST_LD_FLAGS} -nostdinc") endif () if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) From f845de272dbfef738dd8525f3f4e07884685bcd0 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 20 Sep 2022 00:39:37 -0700 Subject: [PATCH 0876/1093] Test w/o long long --- .github/workflows/extended.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 45a673886..b4d9cf78b 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -155,3 +155,19 @@ jobs: run: cmake --build cpputest_build - name: Test run: ctest --test-dir cpputest_build + + no-long-long: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@main + - name: Configure + run: > + cmake + -B cpputest_build + -D CPPUTEST_USE_LONG_LONG=NO + -D CMAKE_CXX_COMPILER=clang++ + - name: Build + run: cmake --build cpputest_build -j + - name: Test + run: ctest --test-dir cpputest_build -j From dac3c9c76f763b6711fea9d8d97f433ee76959c7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 30 Oct 2022 13:49:30 -0700 Subject: [PATCH 0877/1093] Include automake build --- .github/workflows/extended.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index b4d9cf78b..09be38d62 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -156,7 +156,19 @@ jobs: - name: Test run: ctest --test-dir cpputest_build - no-long-long: + automake-no-long-long: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@main + - name: Configure + run: | + autoreconf -i . + ./configure --disable-longlong + - name: Build and test + run: make tdd + + cmake-no-long-long: runs-on: ubuntu-latest steps: - name: Checkout From 1ee7b00ce5d34d4377267d99e821a30c1c2436db Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 27 Sep 2022 19:32:59 -0700 Subject: [PATCH 0878/1093] Use #if CPPUTEST_USE_LONG_LONG --- include/CppUTestExt/MockNamedValue.h | 2 +- include/CppUTestExt/MockSupport_c.h | 2 +- src/CppUTest/SimpleString.cpp | 2 +- src/CppUTest/Utest.cpp | 4 ++-- src/CppUTestExt/MockActualCall.cpp | 8 ++++---- src/CppUTestExt/MockExpectedCall.cpp | 4 ++-- src/CppUTestExt/MockNamedValue.cpp | 10 +++++----- src/CppUTestExt/MockSupport.cpp | 2 +- src/CppUTestExt/MockSupport_c.cpp | 10 +++++----- tests/CppUTest/SimpleStringTest.cpp | 6 +++--- tests/CppUTest/TestFailureTest.cpp | 4 ++-- tests/CppUTest/TestHarness_cTest.cpp | 2 +- tests/CppUTest/TestUTestMacro.cpp | 2 +- tests/CppUTestExt/MockActualCallTest.cpp | 8 ++++---- tests/CppUTestExt/MockExpectedCallTest.cpp | 6 +++--- tests/CppUTestExt/MockParameterTest.cpp | 6 +++--- tests/CppUTestExt/MockReturnValueTest.cpp | 6 +++--- tests/CppUTestExt/MockSupport_cTest.cpp | 4 ++-- tests/CppUTestExt/MockSupport_cTestCFile.c | 8 ++++---- 19 files changed, 48 insertions(+), 48 deletions(-) diff --git a/include/CppUTestExt/MockNamedValue.h b/include/CppUTestExt/MockNamedValue.h index 426b70c9d..413ef48ab 100644 --- a/include/CppUTestExt/MockNamedValue.h +++ b/include/CppUTestExt/MockNamedValue.h @@ -167,7 +167,7 @@ class MockNamedValue unsigned int unsignedIntValue_; long int longIntValue_; unsigned long int unsignedLongIntValue_; -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG cpputest_longlong longLongIntValue_; cpputest_ulonglong unsignedLongLongIntValue_; #else diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 32f2b7d40..5bc9fc1fb 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -61,7 +61,7 @@ typedef struct SMockValue_c unsigned int unsignedIntValue; long int longIntValue; unsigned long int unsignedLongIntValue; -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG cpputest_longlong longLongIntValue; cpputest_ulonglong unsignedLongLongIntValue; #else diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 02898cd4d..0a789d725 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -781,7 +781,7 @@ SimpleString StringFrom(const std::nullptr_t value) } #endif -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG SimpleString StringFrom(cpputest_longlong value) { diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 7209b420e..05718003f 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -486,7 +486,7 @@ void UtestShell::assertUnsignedLongsEqual(unsigned long expected, unsigned long void UtestShell::assertLongLongsEqual(cpputest_longlong expected, cpputest_longlong actual, const char* text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG if (expected != actual) failWith(LongLongsEqualFailure(this, fileName, lineNumber, expected, actual, text), testTerminator); #else @@ -499,7 +499,7 @@ void UtestShell::assertLongLongsEqual(cpputest_longlong expected, cpputest_longl void UtestShell::assertUnsignedLongLongsEqual(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* text, const char* fileName, size_t lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG if (expected != actual) failWith(UnsignedLongLongsEqualFailure(this, fileName, lineNumber, expected, actual, text), testTerminator); #else diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 1b5e0394f..0d93e1ce4 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -241,7 +241,7 @@ MockActualCall& MockCheckedActualCall::withLongIntParameter(const SimpleString& return *this; } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG MockActualCall& MockCheckedActualCall::withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) { @@ -472,7 +472,7 @@ long int MockCheckedActualCall::returnLongIntValueOrDefault(long int default_val return returnLongIntValue(); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG cpputest_ulonglong MockCheckedActualCall::returnUnsignedLongLongIntValue() { @@ -727,7 +727,7 @@ MockActualCall& MockActualCallTrace::withLongIntParameter(const SimpleString& na return *this; } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG MockActualCall& MockActualCallTrace::withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) { @@ -856,7 +856,7 @@ long int MockActualCallTrace::returnLongIntValueOrDefault(long int) return 0; } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG cpputest_longlong MockActualCallTrace::returnLongLongIntValue() { diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index a2cc8823e..867cb2706 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -125,7 +125,7 @@ MockExpectedCall& MockCheckedExpectedCall::withUnsignedLongIntParameter(const Si return *this; } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG MockExpectedCall& MockCheckedExpectedCall::withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) { @@ -514,7 +514,7 @@ MockExpectedCall& MockCheckedExpectedCall::andReturnValue(unsigned long int valu return *this; } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG MockExpectedCall& MockCheckedExpectedCall::andReturnValue(cpputest_longlong value) { diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 50fe209d1..b5eed42bb 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -82,7 +82,7 @@ void MockNamedValue::setValue(unsigned long int value) value_.unsignedLongIntValue_ = value; } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG void MockNamedValue::setValue(cpputest_longlong value) { @@ -246,7 +246,7 @@ unsigned long int MockNamedValue::getUnsignedLongIntValue() const } } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG cpputest_longlong MockNamedValue::getLongLongIntValue() const { @@ -393,7 +393,7 @@ bool MockNamedValue::equals(const MockNamedValue& p) const return (value_.longIntValue_ >= 0) && ((unsigned long)value_.longIntValue_ == p.value_.unsignedLongIntValue_); else if((type_ == "unsigned long int") && (p.type_ == "long int")) return (p.value_.longIntValue_ >= 0) && (value_.unsignedLongIntValue_ == (unsigned long) p.value_.longIntValue_); -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG else if ((type_ == "long long int") && (p.type_ == "int")) return value_.longLongIntValue_ == p.value_.intValue_; else if ((type_ == "int") && (p.type_ == "long long int")) @@ -444,7 +444,7 @@ bool MockNamedValue::equals(const MockNamedValue& p) const return value_.longIntValue_ == p.value_.longIntValue_; else if (type_ == "unsigned long int") return value_.unsignedLongIntValue_ == p.value_.unsignedLongIntValue_; -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG else if (type_ == "long long int") return value_.longLongIntValue_ == p.value_.longLongIntValue_; else if (type_ == "unsigned long long int") @@ -496,7 +496,7 @@ SimpleString MockNamedValue::toString() const return StringFrom(value_.longIntValue_) + " " + BracketsFormattedHexStringFrom(value_.longIntValue_); else if (type_ == "unsigned long int") return StringFrom(value_.unsignedLongIntValue_) + " " + BracketsFormattedHexStringFrom(value_.unsignedLongIntValue_); -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG else if (type_ == "long long int") return StringFrom(value_.longLongIntValue_) + " " + BracketsFormattedHexStringFrom(value_.longLongIntValue_); else if (type_ == "unsigned long long int") diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 45f58b4eb..f55c96af7 100644 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -546,7 +546,7 @@ unsigned long int MockSupport::unsignedLongIntReturnValue() return returnValue().getUnsignedLongIntValue(); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG cpputest_longlong MockSupport::longLongIntReturnValue() { diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index ddfd24070..0a4f0cbca 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -408,7 +408,7 @@ MockExpectedCall_c* withUnsignedLongIntParameters_c(const char* name, unsigned l return &gExpectedCall; } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG MockExpectedCall_c* withLongLongIntParameters_c(const char* name, cpputest_longlong value) { @@ -540,7 +540,7 @@ MockExpectedCall_c* andReturnUnsignedLongIntValue_c(unsigned long int value) return &gExpectedCall; } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG MockExpectedCall_c* andReturnLongLongIntValue_c(cpputest_longlong value) { @@ -623,7 +623,7 @@ static MockValue_c getMockValueCFromNamedValue(const MockNamedValue& namedValue) returnValue.type = MOCKVALUETYPE_UNSIGNED_LONG_INTEGER; returnValue.value.unsignedLongIntValue = namedValue.getUnsignedLongIntValue(); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG else if (SimpleString::StrCmp(namedValue.getType().asCharString(), "long long int") == 0) { returnValue.type = MOCKVALUETYPE_LONG_LONG_INTEGER; returnValue.value.longLongIntValue = namedValue.getLongLongIntValue(); @@ -722,7 +722,7 @@ MockActualCall_c* withActualUnsignedLongIntParameters_c(const char* name, unsign return &gActualCall; } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG MockActualCall_c* withActualLongLongIntParameters_c(const char* name, cpputest_longlong value) { @@ -876,7 +876,7 @@ unsigned long int returnUnsignedLongIntValueOrDefault_c(unsigned long int defaul return unsignedLongIntReturnValue_c(); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG cpputest_longlong longLongIntReturnValue_c() { diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index cf65d6053..f5372e7cb 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -640,7 +640,7 @@ TEST(SimpleString, UnsignedLongInts) CHECK(s == s2); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG TEST(SimpleString, LongLongInts) { @@ -710,7 +710,7 @@ TEST(SimpleString, HexStrings) SimpleString h1 = HexStringFrom(0xffffL); STRCMP_EQUAL("ffff", h1.asCharString()); -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG SimpleString h15 = HexStringFrom(0xffffLL); STRCMP_EQUAL("ffff", h15.asCharString()); #endif @@ -1246,7 +1246,7 @@ TEST(SimpleString, BracketsFormattedHexStringFromForLong) STRCMP_EQUAL("(0x1)", BracketsFormattedHexStringFrom(value).asCharString()); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG TEST(SimpleString, BracketsFormattedHexStringFromForLongLong) { diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index 60a465b66..e1c33d587 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -141,7 +141,7 @@ TEST(TestFailure, LongsEqualFailure) TEST(TestFailure, LongLongsEqualFailure) { -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG LongLongsEqualFailure f(test, failFileName, failLineNumber, 1, 2, ""); FAILURE_EQUAL("expected <1 (0x1)>\n\tbut was <2 (0x2)>", f); #else @@ -153,7 +153,7 @@ TEST(TestFailure, LongLongsEqualFailure) TEST(TestFailure, UnsignedLongLongsEqualFailure) { -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG UnsignedLongLongsEqualFailure f(test, failFileName, failLineNumber, 1, 2, ""); FAILURE_EQUAL("expected <1 (0x1)>\n\tbut was <2 (0x2)>", f); #else diff --git a/tests/CppUTest/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp index 08be8400e..1f9b86cde 100644 --- a/tests/CppUTest/TestHarness_cTest.cpp +++ b/tests/CppUTest/TestHarness_cTest.cpp @@ -251,7 +251,7 @@ TEST(TestHarness_c, checkUnsignedLongIntText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG static void failLongLongIntMethod_() { diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index 4084c8bec..dce3aa17d 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -128,7 +128,7 @@ IGNORE_TEST(UnitTestMacros, UNSIGNED_LONGS_EQUAL_TEXTWorksInAnIgnoredTest) UNSIGNED_LONGS_EQUAL_TEXT(1, 0, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG static void LONGLONGS_EQUALTestMethod_() { diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 56e65f5ba..8fe720177 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -164,7 +164,7 @@ TEST(MockCheckedActualCall, MockIgnoredActualCallWorksAsItShould) CHECK(1l == actual.returnLongIntValueOrDefault(1l)); CHECK(0 == actual.returnUnsignedIntValue()); CHECK(1u == actual.returnUnsignedIntValueOrDefault(1u)); -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG CHECK(0 == actual.returnLongLongIntValue()); CHECK(1ll == actual.returnLongLongIntValueOrDefault(1ll)); CHECK(0 == actual.returnUnsignedLongLongIntValue()); @@ -199,7 +199,7 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) actual.withUnsignedIntParameter("unsigned_int", (unsigned int) 1); actual.withUnsignedLongIntParameter("unsigned_long", (unsigned long)1); actual.withLongIntParameter("long_int", (long int) 1); -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG actual.withLongLongIntParameter("long_long_int", (long long int) 1); actual.withUnsignedLongLongIntParameter("unsigned_long_long_int", (unsigned long long int) 1); #endif @@ -217,7 +217,7 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) expectedString += " unsigned_int:1 (0x1)"; expectedString += " unsigned_long:1 (0x1)"; expectedString += " long_int:1 (0x1)"; -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG expectedString += " long_long_int:1 (0x1)"; expectedString += " unsigned_long_long_int:1 (0x1)"; #endif @@ -243,7 +243,7 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) CHECK(0 == actual.returnIntValueOrDefault(1)); CHECK(0 == actual.returnLongIntValue()); CHECK(0 == actual.returnLongIntValueOrDefault(1l)); -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG CHECK(0 == actual.returnLongLongIntValue()); CHECK(0 == actual.returnLongLongIntValueOrDefault(1ll)); CHECK(0 == actual.returnUnsignedLongLongIntValue()); diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 0fb52cd97..d8af458cc 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -232,7 +232,7 @@ TEST(MockExpectedCall, callWithLongIntegerParameter) STRCMP_CONTAINS("funcName -> long int paramName: <777 (0x309)>", call->callToString().asCharString()); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG TEST(MockExpectedCall, callWithUnsignedLongLongIntegerParameter) { @@ -780,7 +780,7 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.withUnsignedIntParameter("foo", (unsigned int) 1); ignored.withLongIntParameter("hey", (long int) 1); ignored.withUnsignedLongIntParameter("bah", (unsigned long int) 1); -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG ignored.withLongLongIntParameter("yo", (long long int) 1); ignored.withUnsignedLongLongIntParameter("grr", (unsigned long long int) 1); #endif @@ -802,7 +802,7 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.andReturnValue((int) 1); ignored.andReturnValue((unsigned long int) 1); ignored.andReturnValue((long int) 1); -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG ignored.andReturnValue((unsigned long long int) 1); ignored.andReturnValue((long long int) 1); #endif diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 828d4e59b..1bad85998 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -63,7 +63,7 @@ TEST(MockParameterTest, expectOneIntegerParameterAndValue) mock().checkExpectations(); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG TEST(MockParameterTest, expectOneUnsignedLongLongIntegerParameterAndValue) { @@ -152,7 +152,7 @@ TEST(MockParameterTest, mismatchedIntegerTypesLongAndUnsignedLongAreAllowed) mock().checkExpectations(); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG TEST(MockParameterTest, mismatchedIntegerTypesIntAndLongLongAreAllowed) { @@ -889,7 +889,7 @@ TEST(MockParameterTest, ignoreOtherCallsIgnoresWithAllKindsOfParameters) .withParameter("bar", 1u) .withParameter("foo", 1l) .withParameter("hey", 1ul) -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG .withParameter("ick", 1ll) .withParameter("grr", 1ull) #endif diff --git a/tests/CppUTestExt/MockReturnValueTest.cpp b/tests/CppUTestExt/MockReturnValueTest.cpp index f8c271c94..6bb4be15f 100644 --- a/tests/CppUTestExt/MockReturnValueTest.cpp +++ b/tests/CppUTestExt/MockReturnValueTest.cpp @@ -106,7 +106,7 @@ TEST(MockReturnValueTest, UnsignedIntReturnValueCanBeRetrievedAsUnsignedLongInt) UNSIGNED_LONGS_EQUAL(expected_value, mock().actualCall("foo").returnValue().getUnsignedLongIntValue()); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG TEST(MockReturnValueTest, PositiveIntReturnValueCanBeRetrievedAsUnsignedLongLongInt) { @@ -284,7 +284,7 @@ TEST(MockReturnValueTest, WhenNoLongIntegerReturnValueIsExpectedButThereIsADefau LONGS_EQUAL(default_return_value, mock().returnLongIntValueOrDefault(default_return_value)); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG TEST(MockReturnValueTest, WhenAUnsignedLongLongIntegerReturnValueIsExpectedAndAlsoThereIsADefaultShouldlIgnoreTheDefault) { @@ -518,7 +518,7 @@ TEST(MockReturnValueTest, UnsignedLongIntegerReturnValueSetsDifferentValuesWhile LONGS_EQUAL(another_ret_value, mock().returnValue().getUnsignedLongIntValue()); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG TEST(MockReturnValueTest, LongLongIntegerReturnValue) { diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 1d1a5aa99..d088b664b 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -164,7 +164,7 @@ TEST(MockSupport_c, doubleParameterWithTolerance) mock_c( )->actualCall("foo")->withDoubleParameters("p", 1.9); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG TEST(MockSupport_c, longLongIntParameter) { @@ -369,7 +369,7 @@ TEST(MockSupport_c, whenNoReturnValueIsGivenReturnUnsignedLongIntValueOrDefaultS LONGS_EQUAL(defaultValue, mock_c()->returnUnsignedLongIntValueOrDefault(defaultValue)); } -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG TEST(MockSupport_c, returnLongLongIntValue) { diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index 77e4bdabd..be68819f8 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -53,7 +53,7 @@ void all_mock_support_c_calls(void) withUnsignedIntParameters("unsigned", 1)-> withLongIntParameters("long int", (long int) -1)-> withUnsignedLongIntParameters("unsigned long int", (unsigned long int) 1)-> -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG withLongLongIntParameters("long long int", (long long int) -1)-> withUnsignedLongLongIntParameters("unsigned long long int", (unsigned long long int) 1)-> #endif @@ -72,7 +72,7 @@ void all_mock_support_c_calls(void) withUnsignedIntParameters("unsigned", 1)-> withLongIntParameters("long int", (long int) -1)-> withUnsignedLongIntParameters("unsigned long int", (unsigned long int) 1)-> -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG withLongLongIntParameters("long long int", (long long int) -1)-> withUnsignedLongLongIntParameters("unsigned long long int", (unsigned long long int) 1)-> #endif @@ -123,7 +123,7 @@ void all_mock_support_c_calls(void) mock_c()->actualCall("boo3")->unsignedLongIntReturnValue(); mock_c()->unsignedLongIntReturnValue(); -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG mock_c()->expectOneCall("mgrgrgr1")->andReturnLongLongIntValue(1); mock_c()->actualCall("mgrgrgr1")->longLongIntReturnValue(); mock_c()->longLongIntReturnValue(); @@ -189,7 +189,7 @@ void all_mock_support_c_calls(void) mock_c()->returnUnsignedIntValueOrDefault(1); mock_c()->returnLongIntValueOrDefault(-1L); mock_c()->returnUnsignedLongIntValueOrDefault(1L); -#ifdef CPPUTEST_USE_LONG_LONG +#if CPPUTEST_USE_LONG_LONG mock_c()->returnLongLongIntValueOrDefault(-1LL); mock_c()->returnUnsignedLongLongIntValueOrDefault(1ULL); #endif From 9b9519c775d7fe78aa4daaece8f50c0676b3fd30 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 27 Sep 2022 20:14:26 -0700 Subject: [PATCH 0879/1093] Ensure CPPUTEST_USE_LONG_LONG is defined --- include/CppUTest/CppUTestConfig.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 399198d30..2286b98e1 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -274,10 +274,11 @@ * LLONG_MAX is set in limits.h. This is a crude attempt to detect long long support when no configure is used * */ - -#if !defined(CPPUTEST_LONG_LONG_DISABLED) && !defined(CPPUTEST_USE_LONG_LONG) -#if defined(CPPUTEST_HAVE_LONG_LONG_INT) || defined(LLONG_MAX) +#ifndef CPPUTEST_USE_LONG_LONG +#if !defined(CPPUTEST_LONG_LONG_DISABLED) && (defined(CPPUTEST_HAVE_LONG_LONG_INT) || defined(LLONG_MAX)) #define CPPUTEST_USE_LONG_LONG 1 +#else +#define CPPUTEST_USE_LONG_LONG 0 #endif #endif From bc829cce5366783fbc950074883f05b8fb4254f1 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 27 Sep 2022 22:03:46 -0700 Subject: [PATCH 0880/1093] Reconcile C and C++ long long dummy typedefs We can't return C++ classes (i.e. with constructors) from functions with C linkage. --- include/CppUTest/CppUTestConfig.h | 23 ++++++++------------ include/CppUTest/UtestMacros.h | 2 ++ include/CppUTestExt/MockCheckedActualCall.h | 22 +++++++++++++++++-- src/CppUTestExt/MockActualCall.cpp | 18 ++++++++++------ src/CppUTestExt/MockNamedValue.cpp | 6 ++++-- src/CppUTestExt/MockSupport.cpp | 6 ++++-- src/CppUTestExt/MockSupport_c.cpp | 12 +++++++---- tests/CppUTest/SimpleStringTest.cpp | 4 ++-- tests/CppUTest/TestUTestMacro.cpp | 24 --------------------- 9 files changed, 61 insertions(+), 56 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 2286b98e1..48213a416 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -296,27 +296,22 @@ typedef unsigned long long cpputest_ulonglong; #define CPPUTEST_SIZE_OF_FAKE_LONG_LONG_TYPE 8 #endif -struct cpputest_longlong -{ #if defined(__cplusplus) - cpputest_longlong() {} - cpputest_longlong(int) {} +extern "C" { #endif + +typedef struct +{ char dummy[CPPUTEST_SIZE_OF_FAKE_LONG_LONG_TYPE]; -}; +} cpputest_longlong; -struct cpputest_ulonglong +typedef struct { -#if defined(__cplusplus) - cpputest_ulonglong() {} - cpputest_ulonglong(int) {} -#endif char dummy[CPPUTEST_SIZE_OF_FAKE_LONG_LONG_TYPE]; -}; +} cpputest_ulonglong; -#if !defined(__cplusplus) -typedef struct cpputest_longlong cpputest_longlong; -typedef struct cpputest_ulonglong cpputest_ulonglong; +#if defined(__cplusplus) +} /* extern "C" */ #endif #endif diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index e47bfa649..249ff7c40 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -226,6 +226,7 @@ #define UNSIGNED_LONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ do { UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, text, file, line); } while(0) +#if CPPUTEST_USE_LONG_LONG #define LONGLONGS_EQUAL(expected, actual)\ LONGLONGS_EQUAL_LOCATION(expected, actual, NULLPTR, __FILE__, __LINE__) @@ -243,6 +244,7 @@ #define UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ do { UtestShell::getCurrent()->assertUnsignedLongLongsEqual((cpputest_ulonglong)expected, (cpputest_ulonglong)actual, text, file, line); } while(0) +#endif // CPPUTEST_USE_LONG_LONG #define BYTES_EQUAL(expected, actual)\ LONGS_EQUAL((expected) & 0xff,(actual) & 0xff) diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index 68982780a..637661403 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -269,10 +269,28 @@ class MockIgnoredActualCall: public MockActualCall virtual long int returnLongIntValue() _override { return 0; } virtual long int returnLongIntValueOrDefault(long int value) _override { return value; } - virtual cpputest_ulonglong returnUnsignedLongLongIntValue() _override { return 0; } + virtual cpputest_ulonglong returnUnsignedLongLongIntValue() _override + { +#if CPPUTEST_USE_LONG_LONG + return 0; +#else + cpputest_ulonglong ret; + return ret; +#endif + } + virtual cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong value) _override { return value; } - virtual cpputest_longlong returnLongLongIntValue() _override { return 0; } + virtual cpputest_longlong returnLongLongIntValue() _override + { +#if CPPUTEST_USE_LONG_LONG + return 0; +#else + cpputest_longlong ret; + return ret; +#endif + } + virtual cpputest_longlong returnLongLongIntValueOrDefault(cpputest_longlong value) _override { return value; } virtual unsigned int returnUnsignedIntValue() _override { return 0; } diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 0d93e1ce4..fd165947c 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -505,7 +505,8 @@ cpputest_longlong MockCheckedActualCall::returnLongLongIntValueOrDefault(cpputes cpputest_ulonglong MockCheckedActualCall::returnUnsignedLongLongIntValue() { FAIL("Unsigned Long Long type is not supported"); - return cpputest_ulonglong(0); + cpputest_ulonglong ret; + return ret; } cpputest_ulonglong MockCheckedActualCall::returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong default_value) @@ -517,7 +518,8 @@ cpputest_ulonglong MockCheckedActualCall::returnUnsignedLongLongIntValueOrDefaul cpputest_longlong MockCheckedActualCall::returnLongLongIntValue() { FAIL("Long Long type is not supported"); - return cpputest_longlong(0); + cpputest_longlong ret; + return ret; } cpputest_longlong MockCheckedActualCall::returnLongLongIntValueOrDefault(cpputest_longlong default_value) @@ -883,25 +885,29 @@ cpputest_longlong MockActualCallTrace::returnLongLongIntValueOrDefault(cpputest_ cpputest_longlong MockActualCallTrace::returnLongLongIntValue() { FAIL("Long Long type is not supported"); - return cpputest_longlong(0); + cpputest_longlong ret; + return ret; } cpputest_ulonglong MockActualCallTrace::returnUnsignedLongLongIntValue() { FAIL("Unsigned Long Long type is not supported"); - return cpputest_ulonglong(0); + cpputest_ulonglong ret; + return ret; } cpputest_ulonglong MockActualCallTrace::returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong) { FAIL("Unsigned Long Long type is not supported"); - return cpputest_ulonglong(0); + cpputest_ulonglong ret; + return ret; } cpputest_longlong MockActualCallTrace::returnLongLongIntValueOrDefault(cpputest_longlong) { FAIL("Long Long type is not supported"); - return cpputest_longlong(0); + cpputest_longlong ret; + return ret; } #endif diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index b5eed42bb..5ef0dff79 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -289,13 +289,15 @@ cpputest_ulonglong MockNamedValue::getUnsignedLongLongIntValue() const cpputest_longlong MockNamedValue::getLongLongIntValue() const { FAIL("Long Long type is not supported"); - return cpputest_longlong(0); + cpputest_longlong ret; + return ret; } cpputest_ulonglong MockNamedValue::getUnsignedLongLongIntValue() const { FAIL("Unsigned Long Long type is not supported"); - return cpputest_ulonglong(0); + cpputest_ulonglong ret; + return ret; } #endif diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index f55c96af7..44e307c43 100644 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -579,13 +579,15 @@ cpputest_ulonglong MockSupport::returnUnsignedLongLongIntValueOrDefault(cpputest cpputest_longlong MockSupport::longLongIntReturnValue() { FAIL("Long Long type is not supported"); - return cpputest_longlong(0); + cpputest_longlong ret; + return ret; } cpputest_ulonglong MockSupport::unsignedLongLongIntReturnValue() { FAIL("Unsigned Long Long type is not supported"); - return cpputest_ulonglong(0); + cpputest_ulonglong ret; + return ret; } cpputest_longlong MockSupport::returnLongLongIntValueOrDefault(cpputest_longlong defaultValue) diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 0a4f0cbca..cd04f13b1 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -909,25 +909,29 @@ cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault_c(cpputest_ulonglong cpputest_longlong longLongIntReturnValue_c() { FAIL("Long Long type is not supported"); - return cpputest_longlong(0); + cpputest_longlong ret; + return ret; } cpputest_longlong returnLongLongIntValueOrDefault_c(cpputest_longlong) { FAIL("Long Long type is not supported"); - return cpputest_longlong(0); + cpputest_longlong ret; + return ret; } cpputest_ulonglong unsignedLongLongIntReturnValue_c() { FAIL("Unsigned Long Long type is not supported"); - return cpputest_ulonglong(0); + cpputest_ulonglong ret; + return ret; } cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault_c(cpputest_ulonglong) { FAIL("Unsigned Long Long type is not supported"); - return cpputest_ulonglong(0); + cpputest_ulonglong ret; + return ret; } #endif diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index f5372e7cb..f8c303daf 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -1263,13 +1263,13 @@ TEST(SimpleString, BracketsFormattedHexStringFromForULongLong) #else TEST(SimpleString, BracketsFormattedHexStringFromForLongLong) { - cpputest_longlong value = 1; + cpputest_longlong value; STRCMP_EQUAL("", BracketsFormattedHexStringFrom(value).asCharString()); } TEST(SimpleString, BracketsFormattedHexStringFromForULongLong) { - cpputest_ulonglong value = 1; + cpputest_ulonglong value; STRCMP_EQUAL("", BracketsFormattedHexStringFrom(value).asCharString()); } diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index dce3aa17d..27521d70f 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -226,30 +226,6 @@ IGNORE_TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUAL_TEXTWorksInAnIgnoredTest) UNSIGNED_LONGLONGS_EQUAL_TEXT(1, 0, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -#else - -static void LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod_() -{ - LONGLONGS_EQUAL(1, 1); -} // LCOV_EXCL_LINE - -static void UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod_() -{ - UNSIGNED_LONGLONGS_EQUAL(1, 1); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, LONGLONGS_EQUALFailsWithUnsupportedFeature) -{ - fixture.runTestWithMethod(LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod_); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("\"CPPUTEST_USE_LONG_LONG\" is not supported"); -} - -TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeature) -{ - fixture.runTestWithMethod(UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod_); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("\"CPPUTEST_USE_LONG_LONG\" is not supported"); -} - #endif /* CPPUTEST_USE_LONG_LONG */ static void failingTestMethodWithCHECK_() From 7e29786bcdbf4452131c137637350de33fbdabc4 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 18:03:02 -0700 Subject: [PATCH 0881/1093] Consolidate warning flags --- CMakeLists.txt | 3 + .../CppUTestConfigurationOptions.cmake | 14 --- cmake/Modules/CppUTestWarningFlags.cmake | 118 +++++++++--------- 3 files changed, 60 insertions(+), 75 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 85a3e48ec..350b39cd5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,6 +126,9 @@ if(NOT PROJECT_IS_TOP_LEVEL) endif() include(CppUTestConfigurationOptions) +if(PROJECT_IS_TOP_LEVEL) + include(CppUTestWarningFlags) +endif() include(CppUTestBuildTimeDiscoverTests) include(CppUTestNormalizeTestOutputLocation) include(GNUInstallDirs) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index dc1ed4f84..74af2ec2c 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -1,11 +1,3 @@ -if (CPPUTEST_PLATFORM STREQUAL "BORLAND") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -w-8008 -w-8066") -endif () - -if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) - include(CppUTestWarningFlags) -endif () - if (NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) if (MSVC) set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} /FI \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") @@ -28,14 +20,8 @@ if (DEFINED ENV{GMOCK_HOME}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTEST_USE_OWN_TR1_TUPLE=1") include_directories(${GMOCK_HOME}/include ${GMOCK_HOME}/gtest ${GMOCK_HOME}/gtest/include) add_subdirectory(${GMOCK_HOME} "${CMAKE_CURRENT_BINARY_DIR}/gmock") - - set(CPPUTEST_C_WARNING_FLAGS "") - set(CPPUTEST_CXX_WARNING_FLAGS "") endif (DEFINED ENV{GMOCK_HOME}) -set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} ${CPPUTEST_C_WARNING_FLAGS}") -set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} ${CPPUTEST_CXX_WARNING_FLAGS}") - if (CPPUTEST_FLAGS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CPPUTEST_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CPPUTEST_CXX_FLAGS}") diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index 6181baaa2..e549d2ce6 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -1,70 +1,66 @@ -if (MSVC) -else (MSVC) - include(CheckCCompilerFlag) - include(CheckCXXCompilerFlag) +unset(WARNING_COMMON_FLAGS) +unset(WARNING_C_FLAGS) +unset(WARNING_CXX_FLAGS) - set(CMAKE_REQUIRED_FLAGS "-Wno-error") - macro(check_and_append_c_warning_flags) - foreach (flag ${ARGN}) - check_c_compiler_flag("-${flag}" WARNING_C_FLAG_${flag}) - if (WARNING_C_FLAG_${flag}) - set(CPPUTEST_C_WARNING_FLAGS "${CPPUTEST_C_WARNING_FLAGS} -${flag}") - endif (WARNING_C_FLAG_${flag}) - endforeach (flag) - endmacro(check_and_append_c_warning_flags) - - macro(check_and_append_cxx_warning_flags) - foreach (flag ${ARGN}) - string(REPLACE "++" "xx" WARNING_CXX_FLAG_VAR "WARNING_CXX_FLAG_${flag}") - check_cxx_compiler_flag("-${flag}" ${WARNING_CXX_FLAG_VAR}) - if (${WARNING_CXX_FLAG_VAR}) - set(CPPUTEST_CXX_WARNING_FLAGS "${CPPUTEST_CXX_WARNING_FLAGS} -${flag}") - endif (${WARNING_CXX_FLAG_VAR}) - endforeach (flag) - endmacro(check_and_append_cxx_warning_flags) +if( + (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR + (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR + (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") +) + set(WARNING_COMMON_FLAGS + -Wall + -Wextra + -pedantic + -Wshadow + -Wswitch-default + -Wswitch-enum + -Wconversion + -Wsign-conversion + -Wno-padded + -Wno-disabled-macro-expansion + -Wno-reserved-id-macro + -Wno-keyword-macro + -Wno-long-long + ) set(WARNING_C_FLAGS - Wall - Wextra - pedantic - Wshadow - Wswitch-default - Wswitch-enum - Wconversion - Wsign-conversion - Wno-padded - Wno-disabled-macro-expansion - Wno-reserved-id-macro - Wno-keyword-macro - Wno-long-long - ) - - set(WARNING_C_ONLY_FLAGS - Wstrict-prototypes - ) + -Wstrict-prototypes + ) set(WARNING_CXX_FLAGS - ${WARNING_C_FLAGS} - Woverloaded-virtual - Wno-global-constructors - Wno-exit-time-destructors - Wno-weak-vtables - Wno-old-style-cast - ) + -Woverloaded-virtual + -Wno-global-constructors + -Wno-exit-time-destructors + -Wno-weak-vtables + -Wno-old-style-cast + ) - if (DEFINED CMAKE_CXX_STANDARD AND NOT CMAKE_CXX_STANDARD EQUAL 98) - set(WARNING_CXX_FLAGS - ${WARNING_CXX_FLAGS} - Wno-c++98-compat - Wno-c++98-compat-pedantic - Wno-c++14-compat - Wno-inconsistent-missing-destructor-override - Wsuggest-override + if(DEFINED CMAKE_CXX_STANDARD AND NOT CMAKE_CXX_STANDARD EQUAL 98) + list(APPEND WARNING_CXX_FLAGS + -Wno-c++98-compat + -Wno-c++98-compat-pedantic + -Wno-c++14-compat + -Wno-inconsistent-missing-destructor-override + -Wsuggest-override ) - endif () + endif() + + set(CMAKE_REQUIRED_FLAGS "-Wno-error") +endif() - check_and_append_c_warning_flags(${WARNING_C_FLAGS}) - check_and_append_c_warning_flags(${WARNING_C_ONLY_FLAGS}) - check_and_append_cxx_warning_flags(${WARNING_CXX_FLAGS}) +include(CheckCCompilerFlag) +foreach(flag IN LISTS WARNING_COMMON_FLAGS WARNING_C_FLAGS) + check_c_compiler_flag("${flag}" WARNING_C_FLAG_${flag}) + if(WARNING_C_FLAG_${flag}) + add_compile_options("$<$:${flag}>") + endif() +endforeach() -endif (MSVC) +include(CheckCXXCompilerFlag) +foreach(flag IN LISTS WARNING_C_FLAGS WARNING_CXX_ONLY_FLAGS) + string(REPLACE "++" "xx" WARNING_CXX_FLAG_VAR "WARNING_CXX_FLAG_${flag}") + check_cxx_compiler_flag("${flag}" ${WARNING_CXX_FLAG_VAR}) + if(${WARNING_CXX_FLAG_VAR}) + add_compile_options("$<$:${flag}>") + endif() +endforeach() From 5ace32674082aafb03a14bef0b4fd5c7ae2feb59 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 18:55:55 -0700 Subject: [PATCH 0882/1093] Remove unused LD flag variable --- CMakeLists.txt | 1 - cmake/Modules/CppUTestConfigurationOptions.cmake | 1 - 2 files changed, 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 350b39cd5..1eef35f8d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -189,7 +189,6 @@ Current compiler options: CXX: ${CMAKE_CXX_COMPILER} CppUTest CFLAGS: ${CPPUTEST_C_FLAGS} CppUTest CXXFLAGS: ${CPPUTEST_CXX_FLAGS} - CppUTest LDFLAGS: ${CPPUTEST_LD_FLAGS} Features configured in CppUTest: Memory Leak Detection Disabled: ${CPPUTEST_MEM_LEAK_DETECTION_DISABLED} diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 74af2ec2c..35824f42e 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -25,5 +25,4 @@ endif (DEFINED ENV{GMOCK_HOME}) if (CPPUTEST_FLAGS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CPPUTEST_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CPPUTEST_CXX_FLAGS}") - set(CMAKE_LD_FLAGS "${CMAKE_LD_FLAGS} ${CPPUTEST_LD_FLAGS}") endif (CPPUTEST_FLAGS) From 41a863aed21c771e57f688ff8e59026759a8b03c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 30 Oct 2022 14:38:21 -0700 Subject: [PATCH 0883/1093] Delete rogue flags --- tests/CppUTest/CMakeLists.txt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index d81ab9823..589382bae 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -36,11 +36,6 @@ add_executable(CppUTestTests TeamCityOutputTest.cpp ) -if (MSVC) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4723") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4723") -endif (MSVC) - if(MINGW OR (${CMAKE_HOST_SYSTEM_NAME} MATCHES "OpenBSD")) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads) From 365080696682fc092f5420c366b1130d1291351f Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 30 Oct 2022 14:56:15 -0700 Subject: [PATCH 0884/1093] Remove verbose config option There are already multiple "normal" ways to inspect a CMake project's configuration: - Read the CMakeCache.txt file - Use the CMake GUI (`cmake-gui`) - Use the CMake TUI (`ccmake`) - Use Visual Studio --- CMakeLists.txt | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1eef35f8d..f1a994e43 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,8 +58,6 @@ cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" ON "CPPUTEST_BUILD_TESTING;CMAKE_CROSSCOMPILING_EMULATOR OR NOT CMAKE_CROSSCOMPILING" OFF) cmake_dependent_option(CPPUTEST_EXAMPLES "Compile and make examples?" ${PROJECT_IS_TOP_LEVEL} "NOT CPPUTEST_STD_CPP_LIB_DISABLED" OFF) -option(CPPUTEST_VERBOSE_CONFIG "Print configuration to stdout during generation" ${PROJECT_IS_TOP_LEVEL}) - cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" OFF "PROJECT_IS_TOP_LEVEL" OFF) @@ -178,33 +176,3 @@ endif() if(PROJECT_IS_TOP_LEVEL) include(cmake/install.cmake) endif() - -if(CPPUTEST_VERBOSE_CONFIG) - message(" -------------------------------------------------------- -CppUTest Version ${PROJECT_VERSION} - -Current compiler options: - CC: ${CMAKE_C_COMPILER} - CXX: ${CMAKE_CXX_COMPILER} - CppUTest CFLAGS: ${CPPUTEST_C_FLAGS} - CppUTest CXXFLAGS: ${CPPUTEST_CXX_FLAGS} - -Features configured in CppUTest: - Memory Leak Detection Disabled: ${CPPUTEST_MEM_LEAK_DETECTION_DISABLED} - Compiling Extensions: ${CPPUTEST_EXTENSIONS} - Support Long Long: ${CPPUTEST_USE_LONG_LONG} - Use CppUTest flags: ${CPPUTEST_FLAGS} - - Disable Standard C library: ${CPPUTEST_STD_C_LIB_DISABLED} - Disable Standard C++ library: ${CPPUTEST_STD_CPP_LIB_DISABLED} - - Compile and run self-tests ${CPPUTEST_BUILD_TESTING} - Run self-tests separately ${CPPUTEST_TESTS_DETAILED} - -Library name options: - Add architecture bitsize (32/64) ${CPPUTEST_LIBNAME_POSTFIX_BITSIZE} - -------------------------------------------------------- -") -endif() From c3f2de27ccb2b8bf47a7aa569ccacdd3739333b2 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Mon, 31 Oct 2022 11:26:41 +0200 Subject: [PATCH 0885/1093] Improved performance of CHECK_COMPARE_LOCATION by moving comparison check above the SimpleString instantiation. --- include/CppUTest/UtestMacros.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index e47bfa649..9eb746551 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -153,11 +153,15 @@ CHECK_COMPARE_LOCATION(first, relop, second, text, __FILE__, __LINE__) #define CHECK_COMPARE_LOCATION(first, relop, second, text, file, line)\ - do { SimpleString conditionString;\ - conditionString += StringFrom(first); conditionString += " ";\ - conditionString += #relop; conditionString += " ";\ - conditionString += StringFrom(second);\ - UtestShell::getCurrent()->assertCompare((first) relop (second), "CHECK_COMPARE", conditionString.asCharString(), text, __FILE__, __LINE__);\ + do {\ + bool success = (first) relop (second);\ + if (!success) {\ + SimpleString conditionString;\ + conditionString += StringFrom(first); conditionString += " ";\ + conditionString += #relop; conditionString += " ";\ + conditionString += StringFrom(second);\ + UtestShell::getCurrent()->assertCompare(false, "CHECK_COMPARE", conditionString.asCharString(), text, __FILE__, __LINE__);\ + }\ } while(0) //This check checks for char* string equality using strcmp. From 46b3384db54e28500d727b43170e6d148f17a5b2 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Mon, 31 Oct 2022 12:02:14 +0200 Subject: [PATCH 0886/1093] Allow redirection of PlatformSpecificStdOut. --- include/CppUTest/PlatformSpecificFunctions_c.h | 2 +- src/Platforms/Borland/UtestPlatform.cpp | 2 +- src/Platforms/C2000/UtestPlatform.cpp | 2 +- src/Platforms/Dos/UtestPlatform.cpp | 2 +- src/Platforms/Gcc/UtestPlatform.cpp | 2 +- src/Platforms/GccNoStdC/UtestPlatform.cpp | 2 +- src/Platforms/Iar/UtestPlatform.cpp | 2 +- src/Platforms/Keil/UtestPlatform.cpp | 2 +- src/Platforms/Symbian/UtestPlatform.cpp | 2 +- src/Platforms/VisualCpp/UtestPlatform.cpp | 2 +- src/Platforms/armcc/UtestPlatform.cpp | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/CppUTest/PlatformSpecificFunctions_c.h b/include/CppUTest/PlatformSpecificFunctions_c.h index db49313a5..497bb4702 100644 --- a/include/CppUTest/PlatformSpecificFunctions_c.h +++ b/include/CppUTest/PlatformSpecificFunctions_c.h @@ -62,7 +62,7 @@ extern int (*PlatformSpecificAtExit)(void(*func)(void)); /* IO operations */ typedef void* PlatformSpecificFile; -extern const PlatformSpecificFile PlatformSpecificStdOut; +extern PlatformSpecificFile PlatformSpecificStdOut; extern PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag); extern void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file); diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index e26567eaf..6d7d2e04a 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -246,7 +246,7 @@ static void PlatformSpecificFlushImplementation() fflush(stdout); } -const PlatformSpecificFile PlatformSpecificStdOut = stdout; +PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = PlatformSpecificFOpenImplementation; void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; diff --git a/src/Platforms/C2000/UtestPlatform.cpp b/src/Platforms/C2000/UtestPlatform.cpp index 33cae4192..72c71f780 100644 --- a/src/Platforms/C2000/UtestPlatform.cpp +++ b/src/Platforms/C2000/UtestPlatform.cpp @@ -155,7 +155,7 @@ static void C2000FClose(PlatformSpecificFile file) fclose((FILE*)file); } -const PlatformSpecificFile PlatformSpecificStdOut = stdout; +PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag) = C2000FOpen; void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = C2000FPuts; void (*PlatformSpecificFClose)(PlatformSpecificFile file) = C2000FClose; diff --git a/src/Platforms/Dos/UtestPlatform.cpp b/src/Platforms/Dos/UtestPlatform.cpp index 383902d69..460a4f72d 100644 --- a/src/Platforms/Dos/UtestPlatform.cpp +++ b/src/Platforms/Dos/UtestPlatform.cpp @@ -138,7 +138,7 @@ static void DosFClose(PlatformSpecificFile file) fclose((FILE*)file); } -const PlatformSpecificFile PlatformSpecificStdOut = stdout; +PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag) = DosFOpen; void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = DosFPuts; void (*PlatformSpecificFClose)(PlatformSpecificFile file) = DosFClose; diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 040f8068a..3a50c6ace 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -264,7 +264,7 @@ static void PlatformSpecificFlushImplementation() fflush(stdout); } -const PlatformSpecificFile PlatformSpecificStdOut = stdout; +PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = PlatformSpecificFOpenImplementation; void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; diff --git a/src/Platforms/GccNoStdC/UtestPlatform.cpp b/src/Platforms/GccNoStdC/UtestPlatform.cpp index 40305c7b2..6f0dfeaac 100644 --- a/src/Platforms/GccNoStdC/UtestPlatform.cpp +++ b/src/Platforms/GccNoStdC/UtestPlatform.cpp @@ -52,7 +52,7 @@ long (*GetPlatformSpecificTimeInMillis)() = NULLPTR; const char* (*GetPlatformSpecificTimeString)() = NULLPTR; /* IO operations */ -const PlatformSpecificFile PlatformSpecificStdOut = NULLPTR; +PlatformSpecificFile PlatformSpecificStdOut = NULLPTR; PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag) = NULLPTR; void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = NULLPTR; void (*PlatformSpecificFClose)(PlatformSpecificFile file) = NULLPTR; diff --git a/src/Platforms/Iar/UtestPlatform.cpp b/src/Platforms/Iar/UtestPlatform.cpp index fde094980..295b47f10 100644 --- a/src/Platforms/Iar/UtestPlatform.cpp +++ b/src/Platforms/Iar/UtestPlatform.cpp @@ -151,7 +151,7 @@ static void PlatformSpecificFlushImplementation() { } -const PlatformSpecificFile PlatformSpecificStdOut = stdout; +PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = PlatformSpecificFOpenImplementation; void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; diff --git a/src/Platforms/Keil/UtestPlatform.cpp b/src/Platforms/Keil/UtestPlatform.cpp index 8bff0c07a..da219847d 100644 --- a/src/Platforms/Keil/UtestPlatform.cpp +++ b/src/Platforms/Keil/UtestPlatform.cpp @@ -155,7 +155,7 @@ extern "C" { } - const PlatformSpecificFile PlatformSpecificStdOut = stdout; + PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = PlatformSpecificFOpenImplementation; void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; diff --git a/src/Platforms/Symbian/UtestPlatform.cpp b/src/Platforms/Symbian/UtestPlatform.cpp index 5f4b4cb90..ad6ff4ee7 100644 --- a/src/Platforms/Symbian/UtestPlatform.cpp +++ b/src/Platforms/Symbian/UtestPlatform.cpp @@ -121,7 +121,7 @@ void* PlatformSpecificMemset(void* mem, int c, size_t size) return memset(mem, c, size); } -const PlatformSpecificFile PlatformSpecificStdOut = stdout; +PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile PlatformSpecificFOpen(const char* filename, const char* flag) { return fopen(filename, flag); diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index 2967354a3..8c0677986 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -158,7 +158,7 @@ static void VisualCppFClose(PlatformSpecificFile file) fclose((FILE*)file); } -const PlatformSpecificFile PlatformSpecificStdOut = stdout; +PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag) = VisualCppFOpen; void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = VisualCppFPuts; void (*PlatformSpecificFClose)(PlatformSpecificFile file) = VisualCppFClose; diff --git a/src/Platforms/armcc/UtestPlatform.cpp b/src/Platforms/armcc/UtestPlatform.cpp index d91aa224c..5796c0cfa 100644 --- a/src/Platforms/armcc/UtestPlatform.cpp +++ b/src/Platforms/armcc/UtestPlatform.cpp @@ -146,7 +146,7 @@ static void PlatformSpecificFlushImplementation() fflush(stdout); } -const PlatformSpecificFile PlatformSpecificStdOut = stdout; +PlatformSpecificFile PlatformSpecificStdOut = stdout; PlatformSpecificFile (*PlatformSpecificFOpen)(const char*, const char*) = PlatformSpecificFOpenImplementation; void (*PlatformSpecificFPuts)(const char*, PlatformSpecificFile) = PlatformSpecificFPutsImplementation; void (*PlatformSpecificFClose)(PlatformSpecificFile) = PlatformSpecificFCloseImplementation; From 28a6ea0ecde8bc73d44742593a139e081c9b806b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 31 Oct 2022 12:08:47 -0700 Subject: [PATCH 0887/1093] Enable build w/o libc We still have to figure out a way to test this. --- .github/workflows/extended.yml | 7 ++----- CMakePresets.json | 5 +++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index d534577d4..77116c1f1 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -106,11 +106,8 @@ jobs: uses: actions/checkout@main - name: Configure run: cmake --preset no-std-c - # FIXME: This is broken. - # - name: Build - # run: cmake --build cpputest_build --verbose - # - name: Test - # run: ctest --test-dir cpputest_build + - name: Build + run: cmake --build cpputest_build --verbose cmake_install: runs-on: ubuntu-latest diff --git a/CMakePresets.json b/CMakePresets.json index e053bc964..3614789bb 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -88,10 +88,11 @@ "name": "no-std-c", "inherits": ["GNU"], "environment": { - "CXXFLAGS": "-nostdinc", - "CFLAGS": "-nostdinc" + "CXXFLAGS": "-Werror -nostdinc", + "CFLAGS": "-Werror -nostdinc" }, "cacheVariables": { + "CMAKE_SYSTEM_NAME": "Generic", "CPPUTEST_STD_C_LIB_DISABLED": true } }, From ccae5bec8cfbd7e526f4bfd1981adcb3f2cf5c91 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 31 Oct 2022 12:18:01 -0700 Subject: [PATCH 0888/1093] Resolve GCC warnings --- include/CppUTestExt/MockCheckedActualCall.h | 4 ++-- src/CppUTestExt/MockActualCall.cpp | 12 ++++++------ src/CppUTestExt/MockNamedValue.cpp | 4 ++-- src/CppUTestExt/MockSupport.cpp | 4 ++-- src/CppUTestExt/MockSupport_c.cpp | 8 ++++---- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index 637661403..48c3807bb 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -274,7 +274,7 @@ class MockIgnoredActualCall: public MockActualCall #if CPPUTEST_USE_LONG_LONG return 0; #else - cpputest_ulonglong ret; + cpputest_ulonglong ret = {}; return ret; #endif } @@ -286,7 +286,7 @@ class MockIgnoredActualCall: public MockActualCall #if CPPUTEST_USE_LONG_LONG return 0; #else - cpputest_longlong ret; + cpputest_longlong ret = {}; return ret; #endif } diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index fd165947c..bd8cbddd0 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -505,7 +505,7 @@ cpputest_longlong MockCheckedActualCall::returnLongLongIntValueOrDefault(cpputes cpputest_ulonglong MockCheckedActualCall::returnUnsignedLongLongIntValue() { FAIL("Unsigned Long Long type is not supported"); - cpputest_ulonglong ret; + cpputest_ulonglong ret = {}; return ret; } @@ -518,7 +518,7 @@ cpputest_ulonglong MockCheckedActualCall::returnUnsignedLongLongIntValueOrDefaul cpputest_longlong MockCheckedActualCall::returnLongLongIntValue() { FAIL("Long Long type is not supported"); - cpputest_longlong ret; + cpputest_longlong ret = {}; return ret; } @@ -885,28 +885,28 @@ cpputest_longlong MockActualCallTrace::returnLongLongIntValueOrDefault(cpputest_ cpputest_longlong MockActualCallTrace::returnLongLongIntValue() { FAIL("Long Long type is not supported"); - cpputest_longlong ret; + cpputest_longlong ret = {}; return ret; } cpputest_ulonglong MockActualCallTrace::returnUnsignedLongLongIntValue() { FAIL("Unsigned Long Long type is not supported"); - cpputest_ulonglong ret; + cpputest_ulonglong ret = {}; return ret; } cpputest_ulonglong MockActualCallTrace::returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong) { FAIL("Unsigned Long Long type is not supported"); - cpputest_ulonglong ret; + cpputest_ulonglong ret = {}; return ret; } cpputest_longlong MockActualCallTrace::returnLongLongIntValueOrDefault(cpputest_longlong) { FAIL("Long Long type is not supported"); - cpputest_longlong ret; + cpputest_longlong ret = {}; return ret; } diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 5ef0dff79..f7bc0565f 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -289,14 +289,14 @@ cpputest_ulonglong MockNamedValue::getUnsignedLongLongIntValue() const cpputest_longlong MockNamedValue::getLongLongIntValue() const { FAIL("Long Long type is not supported"); - cpputest_longlong ret; + cpputest_longlong ret = {}; return ret; } cpputest_ulonglong MockNamedValue::getUnsignedLongLongIntValue() const { FAIL("Unsigned Long Long type is not supported"); - cpputest_ulonglong ret; + cpputest_ulonglong ret = {}; return ret; } diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 44e307c43..1c76c9a73 100644 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -579,14 +579,14 @@ cpputest_ulonglong MockSupport::returnUnsignedLongLongIntValueOrDefault(cpputest cpputest_longlong MockSupport::longLongIntReturnValue() { FAIL("Long Long type is not supported"); - cpputest_longlong ret; + cpputest_longlong ret = {}; return ret; } cpputest_ulonglong MockSupport::unsignedLongLongIntReturnValue() { FAIL("Unsigned Long Long type is not supported"); - cpputest_ulonglong ret; + cpputest_ulonglong ret = {}; return ret; } diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index cd04f13b1..52e7b9018 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -909,28 +909,28 @@ cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault_c(cpputest_ulonglong cpputest_longlong longLongIntReturnValue_c() { FAIL("Long Long type is not supported"); - cpputest_longlong ret; + cpputest_longlong ret = {}; return ret; } cpputest_longlong returnLongLongIntValueOrDefault_c(cpputest_longlong) { FAIL("Long Long type is not supported"); - cpputest_longlong ret; + cpputest_longlong ret = {}; return ret; } cpputest_ulonglong unsignedLongLongIntReturnValue_c() { FAIL("Unsigned Long Long type is not supported"); - cpputest_ulonglong ret; + cpputest_ulonglong ret = {}; return ret; } cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault_c(cpputest_ulonglong) { FAIL("Unsigned Long Long type is not supported"); - cpputest_ulonglong ret; + cpputest_ulonglong ret = {}; return ret; } From 891fc915fed062d4a2007232c0f7738285ab0d76 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 30 Oct 2022 13:44:57 -0700 Subject: [PATCH 0889/1093] Make leak detection work with CMake --- cmake/Modules/CppUTestConfigurationOptions.cmake | 15 --------------- src/CppUTest/CMakeLists.txt | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 35824f42e..ccf378e78 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -1,18 +1,3 @@ -if (NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) - if (MSVC) - set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} /FI \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} /FI \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") - elseif (CMAKE_CXX_COMPILER_ID STREQUAL "IAR") - set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} --preinclude \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} --preinclude \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorNewMacros.h\"") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} --preinclude \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") - else (MSVC) - set(CPPUTEST_C_FLAGS "${CPPUTEST_C_FLAGS} -include \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -include \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorNewMacros.h\"") - set(CPPUTEST_CXX_FLAGS "${CPPUTEST_CXX_FLAGS} -include \"${CppUTest_SOURCE_DIR}/include/CppUTest/MemoryLeakDetectorMallocMacros.h\"") - endif (MSVC) -endif () - set(GMOCK_HOME $ENV{GMOCK_HOME}) if (DEFINED ENV{GMOCK_HOME}) # GMock pulls in gtest. diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 661d8c29d..fc56ccac6 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -84,6 +84,22 @@ endif (WIN32) add_library(CppUTest::CppUTest ALIAS ${CppUTestLibName}) +if(NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) + if(MSVC) + set(force_include "/FI") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "IAR") + set(force_include "--preinclude ") + else() + set(force_include "-include") + endif() + target_compile_options(${CppUTestLibName} + PUBLIC + "$<$:${force_include}CppUTest/MemoryLeakDetectorMallocMacros.h>" + "$<$:${force_include}CppUTest/MemoryLeakDetectorNewMacros.h>" + ) +endif() + +# Installation if(PROJECT_IS_TOP_LEVEL) install( TARGETS ${CppUTestLibName} From 697cf1d70632190c31e65b812e84426d58eb1121 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 30 Oct 2022 22:46:06 -0700 Subject: [PATCH 0890/1093] Consolidate workflows --- .github/workflows/basic.yml | 42 ++++++++++++++- .github/workflows/extended.yml | 99 ---------------------------------- CMakePresets.json | 7 +++ 3 files changed, 48 insertions(+), 100 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index d3ff41fc1..ae45ab7d6 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -1,7 +1,7 @@ --- name: Basic builds -on: +"on": push: pull_request: @@ -80,6 +80,9 @@ jobs: - os: ubuntu-latest cpp_version: 98 preset: GNU + - os: ubuntu-latest + cpp_version: 98 + preset: no-long-long - os: ubuntu-latest cpp_version: 11 preset: GNU @@ -89,6 +92,20 @@ jobs: - os: ubuntu-latest cpp_version: 17 preset: GNU + - os: ubuntu-latest + cpp_version: 11 + preset: MinGW + apt_packages: mingw-w64 wine64 + - os: ubuntu-latest + cpp_version: 98 + preset: no-std-cpp + - os: ubuntu-latest + cpp_version: 11 + preset: coverage + apt_packages: lcov + - os: ubuntu-latest + cpp_version: 11 + preset: arm-embedded # Mac OSX - os: macos-latest cpp_version: 98 @@ -101,6 +118,18 @@ jobs: preset: GNU runs-on: ${{ matrix.os }} steps: + - name: Install tools + run: sudo apt install ${{ matrix.apt_packages }} + if: ${{ matrix.apt_packages }} + - uses: carlosperate/arm-none-eabi-gcc-action@v1 + if: ${{ matrix.preset == 'arm-embedded' }} + - name: Install QEMU + # The version in the ubuntu repositories (6.2) is broken. + run: | + wget -nv http://ftp.de.debian.org/debian/pool/main/q/qemu/qemu-user-static_7.1+dfsg-2_amd64.deb -O qemu.deb + sudo dpkg --install qemu.deb + rm -f qemu.deb + if: ${{ matrix.preset == 'arm-embedded' }} - name: Checkout uses: actions/checkout@main - name: Configure @@ -112,3 +141,14 @@ jobs: run: cmake --build cpputest_build --verbose - name: Test run: ctest --test-dir cpputest_build + - name: Coverage + run: | + lcov --capture --directory . --no-external --output-file lcov.info + lcov --remove lcov.info --output-file lcov.info '*/tests/*' + if: ${{ matrix.preset == 'coverage' }} + - name: Coveralls + uses: coverallsapp/github-action@master + with: + path-to-lcov: lcov.info + github-token: ${{ secrets.GITHUB_TOKEN }} + if: ${{ matrix.preset == 'coverage' }} diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index dc3a53aaa..f6247db27 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -21,31 +21,6 @@ jobs: cp ./scripts/generate_junit_report_ant.xml . ant -f generate_junit_report_ant.xml - cmake_coverage: - runs-on: ubuntu-latest - steps: - - name: Install tools - run: | - pip install --user gcovr - sudo apt install lcov - - name: Checkout - uses: actions/checkout@main - - name: Configure - run: cmake --preset coverage - - name: Build - run: cmake --build cpputest_build - - name: Test - run: ctest --test-dir cpputest_build - - name: Coverage - run: | - lcov --capture --directory . --no-external --output-file lcov.info - lcov --remove lcov.info --output-file lcov.info '*/tests/*' - - name: Coveralls - uses: coverallsapp/github-action@master - with: - path-to-lcov: lcov.info - github-token: ${{ secrets.GITHUB_TOKEN }} - make_dos: runs-on: ubuntu-latest steps: @@ -70,45 +45,6 @@ jobs: TERM: linux run: $CPPUTEST_HOME/platforms/Dos/alltests.sh - cmake_wine: - runs-on: ubuntu-latest - steps: - - name: Install tools - run: sudo apt-get install -y mingw-w64 wine64 - - name: Checkout - uses: actions/checkout@main - - name: Configure - run: > - cmake --preset MinGW - - name: Build - run: cmake --build cpputest_build --verbose - - name: Test - run: ctest --test-dir cpputest_build - - cmake_no_std_cpp: - runs-on: ubuntu-latest - name: Disable exceptions - steps: - - name: Checkout - uses: actions/checkout@main - - name: Configure - run: cmake --preset no-std-cpp - - name: Build - run: cmake --build cpputest_build --verbose - - name: Test - run: ctest --test-dir cpputest_build - - cmake_no_std_c: - runs-on: ubuntu-latest - name: Disable libc - steps: - - name: Checkout - uses: actions/checkout@main - - name: Configure - run: cmake --preset no-std-c - - name: Build - run: cmake --build cpputest_build --verbose - cmake_install: runs-on: ubuntu-latest steps: @@ -126,25 +62,6 @@ jobs: cmake --build build -j ctest --test-dir build - arm-embedded: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@main - - uses: carlosperate/arm-none-eabi-gcc-action@v1 - - name: Install QEMU - # The version in the ubuntu repositories (6.2) is broken. - run: | - wget -nv http://ftp.de.debian.org/debian/pool/main/q/qemu/qemu-user-static_7.1+dfsg-2_amd64.deb -O qemu.deb - sudo dpkg --install qemu.deb - rm -f qemu.deb - - name: Configure - run: cmake --preset arm-embedded - - name: Build - run: cmake --build cpputest_build - - name: Test - run: ctest --test-dir cpputest_build - automake-no-long-long: runs-on: ubuntu-latest steps: @@ -156,19 +73,3 @@ jobs: ./configure --disable-longlong - name: Build and test run: make tdd - - cmake-no-long-long: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@main - - name: Configure - run: > - cmake - -B cpputest_build - -D CPPUTEST_USE_LONG_LONG=NO - -D CMAKE_CXX_COMPILER=clang++ - - name: Build - run: cmake --build cpputest_build -j - - name: Test - run: ctest --test-dir cpputest_build -j diff --git a/CMakePresets.json b/CMakePresets.json index 3614789bb..488bd39a7 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -96,6 +96,13 @@ "CPPUTEST_STD_C_LIB_DISABLED": true } }, + { + "name": "no-long-long", + "inherits":["GNU"], + "cacheVariables": { + "CPPUTEST_USE_LONG_LONG": false + } + }, { "name": "IAR", "inherits": ["defaults"], From 18d4eea1288a9e445c3fd852793b92b1c5e2b6b3 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 30 Oct 2022 22:59:26 -0700 Subject: [PATCH 0891/1093] install --- .github/workflows/basic.yml | 12 ++++++++++++ .github/workflows/extended.yml | 17 ----------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index ae45ab7d6..3d353f68b 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -59,6 +59,7 @@ jobs: - os: windows-latest cpp_version: 17 preset: MSVC + # install: true - os: windows-latest cpp_version: 17 preset: ClangCL @@ -86,6 +87,7 @@ jobs: - os: ubuntu-latest cpp_version: 11 preset: GNU + install: true - os: ubuntu-latest cpp_version: 14 preset: GNU @@ -110,6 +112,7 @@ jobs: - os: macos-latest cpp_version: 98 preset: defaults + install: true - os: macos-latest cpp_version: 17 preset: Clang @@ -141,6 +144,15 @@ jobs: run: cmake --build cpputest_build --verbose - name: Test run: ctest --test-dir cpputest_build + - name: Install + run: sudo cmake --install cpputest_build/ + if: ${{ matrix.install }} + - name: Use install + run: | + cmake -B build -S examples + cmake --build build -j + ctest --test-dir build + if: ${{ matrix.install }} - name: Coverage run: | lcov --capture --directory . --no-external --output-file lcov.info diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index f6247db27..4d4881850 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -45,23 +45,6 @@ jobs: TERM: linux run: $CPPUTEST_HOME/platforms/Dos/alltests.sh - cmake_install: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@main - - name: Install - run: | - cmake --preset GNU - cmake --build cpputest_build/ -j - ctest --test-dir cpputest_build/ - sudo cmake --install cpputest_build/ - - name: Use - run: | - cmake -B build -S examples - cmake --build build -j - ctest --test-dir build - automake-no-long-long: runs-on: ubuntu-latest steps: From 7a170e9fc8cc5bf7b2a7e113982f8615d82ba369 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 30 Oct 2022 23:12:31 -0700 Subject: [PATCH 0892/1093] name jobs --- .github/workflows/basic.yml | 69 ++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 3d353f68b..9c7053fa4 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -55,84 +55,97 @@ jobs: strategy: matrix: include: - # Windows - - os: windows-latest + - name: windows defaults + os: windows-latest cpp_version: 17 preset: MSVC - # install: true - - os: windows-latest + - name: ClangCL + os: windows-latest cpp_version: 17 preset: ClangCL - # Linux - # CMake different C++ versions with clang - - os: ubuntu-latest + - name: Linux Clang 98 + os: ubuntu-latest cpp_version: 98 preset: Clang - - os: ubuntu-latest + - name: Linux Clang 11 + os: ubuntu-latest cpp_version: 11 preset: Clang - - os: ubuntu-latest + - name: Linux Clang 14 + os: ubuntu-latest cpp_version: 14 preset: Clang - - os: ubuntu-latest + - name: Linux Clang 17 + os: ubuntu-latest cpp_version: 17 preset: Clang - # CMake different C++ versions with gcc - - os: ubuntu-latest + - name: Linux GNU 98 + os: ubuntu-latest cpp_version: 98 preset: GNU - - os: ubuntu-latest + - name: No long long + os: ubuntu-latest cpp_version: 98 preset: no-long-long - - os: ubuntu-latest + - name: Linux GNU Install + os: ubuntu-latest cpp_version: 11 preset: GNU install: true - - os: ubuntu-latest + - name: Linux GNU 14 + os: ubuntu-latest cpp_version: 14 preset: GNU - - os: ubuntu-latest + - name: Linux GNU 17 + os: ubuntu-latest cpp_version: 17 preset: GNU - - os: ubuntu-latest + - name: MinGW + os: ubuntu-latest cpp_version: 11 preset: MinGW apt_packages: mingw-w64 wine64 - - os: ubuntu-latest + - name: No C++ Standard Library + os: ubuntu-latest cpp_version: 98 preset: no-std-cpp - - os: ubuntu-latest + - name: Coverage + os: ubuntu-latest cpp_version: 11 preset: coverage apt_packages: lcov - - os: ubuntu-latest + - name: GCC ARM embedded + os: ubuntu-latest cpp_version: 11 preset: arm-embedded - # Mac OSX - - os: macos-latest + - name: Mac install + os: macos-latest cpp_version: 98 preset: defaults install: true - - os: macos-latest + - name: Apple Clang 17 + os: macos-latest cpp_version: 17 preset: Clang - - os: macos-latest + - name: Mac GNU 14 + os: macos-latest cpp_version: 14 preset: GNU + name: ${{ matrix.name }} runs-on: ${{ matrix.os }} steps: - name: Install tools run: sudo apt install ${{ matrix.apt_packages }} if: ${{ matrix.apt_packages }} - uses: carlosperate/arm-none-eabi-gcc-action@v1 - if: ${{ matrix.preset == 'arm-embedded' }} + if: ${{ matrix.name == 'GCC ARM embedded' }} - name: Install QEMU # The version in the ubuntu repositories (6.2) is broken. run: | wget -nv http://ftp.de.debian.org/debian/pool/main/q/qemu/qemu-user-static_7.1+dfsg-2_amd64.deb -O qemu.deb sudo dpkg --install qemu.deb rm -f qemu.deb - if: ${{ matrix.preset == 'arm-embedded' }} + if: ${{ matrix.name == 'GCC ARM embedded' }} - name: Checkout uses: actions/checkout@main - name: Configure @@ -157,10 +170,10 @@ jobs: run: | lcov --capture --directory . --no-external --output-file lcov.info lcov --remove lcov.info --output-file lcov.info '*/tests/*' - if: ${{ matrix.preset == 'coverage' }} + if: ${{ matrix.name == 'Coverage' }} - name: Coveralls uses: coverallsapp/github-action@master with: path-to-lcov: lcov.info github-token: ${{ secrets.GITHUB_TOKEN }} - if: ${{ matrix.preset == 'coverage' }} + if: ${{ matrix.name == 'Coverage' }} From 71f71f442d58327a9b6f5f109fce3428741f3869 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 30 Oct 2022 23:20:29 -0700 Subject: [PATCH 0893/1093] C++20 builds --- .github/workflows/basic.yml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 9c7053fa4..17393404d 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -55,10 +55,15 @@ jobs: strategy: matrix: include: - - name: windows defaults + - name: MSVC defaults os: windows-latest cpp_version: 17 preset: MSVC + # install: true + - name: MSVC 20 + os: windows-latest + cpp_version: 20 + preset: MSVC - name: ClangCL os: windows-latest cpp_version: 17 @@ -79,6 +84,10 @@ jobs: os: ubuntu-latest cpp_version: 17 preset: Clang + - name: Linux Clang 20 + os: ubuntu-latest + cpp_version: 20 + preset: Clang - name: Linux GNU 98 os: ubuntu-latest cpp_version: 98 @@ -100,6 +109,10 @@ jobs: os: ubuntu-latest cpp_version: 17 preset: GNU + - name: Linux GNU 20 + os: ubuntu-latest + cpp_version: 20 + preset: GNU - name: MinGW os: ubuntu-latest cpp_version: 11 @@ -127,6 +140,10 @@ jobs: os: macos-latest cpp_version: 17 preset: Clang + - name: Apple Clang 20 + os: macos-latest + cpp_version: 20 + preset: Clang - name: Mac GNU 14 os: macos-latest cpp_version: 14 From 66d67417aedc6e9464a080731fb7a2214d9cd1f3 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 30 Oct 2022 23:44:21 -0700 Subject: [PATCH 0894/1093] DOS build --- .github/workflows/basic.yml | 30 ++++++++++++++++++++++++------ CMakePresets.json | 12 ++++++++++++ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 17393404d..3e496d816 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -148,12 +148,20 @@ jobs: os: macos-latest cpp_version: 14 preset: GNU + - name: OpenWatcom DOS + os: ubuntu-latest + cpp_version: 98 + preset: DOS + apt_packages: dosbox name: ${{ matrix.name }} runs-on: ${{ matrix.os }} steps: - - name: Install tools - run: sudo apt install ${{ matrix.apt_packages }} + ### SETUP + + - name: Install packages + run: sudo apt install -y ${{ matrix.apt_packages }} if: ${{ matrix.apt_packages }} + - uses: carlosperate/arm-none-eabi-gcc-action@v1 if: ${{ matrix.name == 'GCC ARM embedded' }} - name: Install QEMU @@ -163,17 +171,26 @@ jobs: sudo dpkg --install qemu.deb rm -f qemu.deb if: ${{ matrix.name == 'GCC ARM embedded' }} + + - name: Install OpenWatcom + uses: open-watcom/setup-watcom@v0 + with: + version: "2.0" + if: ${{ matrix.name == 'OpenWatcom DOS' }} + + ## BUILD AND TEST + - name: Checkout uses: actions/checkout@main - name: Configure - run: > - cmake - --preset ${{ matrix.preset }} - -D CMAKE_CXX_STANDARD=${{ matrix.cpp_version }} + run: cmake --preset ${{ matrix.preset }} -D CMAKE_CXX_STANDARD=${{ matrix.cpp_version }} - name: Build run: cmake --build cpputest_build --verbose - name: Test run: ctest --test-dir cpputest_build + + # POST PROCESSING + - name: Install run: sudo cmake --install cpputest_build/ if: ${{ matrix.install }} @@ -183,6 +200,7 @@ jobs: cmake --build build -j ctest --test-dir build if: ${{ matrix.install }} + - name: Coverage run: | lcov --capture --directory . --no-external --output-file lcov.info diff --git a/CMakePresets.json b/CMakePresets.json index 488bd39a7..549939c80 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -114,6 +114,18 @@ "CMAKE_CXX_FLAGS_INIT": "--cpu Cortex-M4F --dlib_config normal", "CMAKE_EXE_LINKER_FLAGS": "--semihosting --config ${sourceDir}/platforms/iar/CppUTestTest.icf" } + }, + { + "name": "DOS", + "inherits": ["defaults"], + "generator": "Watcom WMake", + "cacheVariables": { + "CMAKE_SYSTEM_NAME": "DOS", + "CMAKE_BUILD_TYPE": "MinRelSize", + "CMAKE_CXX_STANDARD": "98", + "CPPUTEST_MEM_LEAK_DETECTION_DISABLED": true, + "CPPUTEST_STD_CPP_LIB_DISABLED": true + } } ] } From 7cd6dcc79e26f1bf00337d5466cf8300eadfc154 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 1 Nov 2022 17:41:29 -0700 Subject: [PATCH 0895/1093] Check more --- .github/workflows/basic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 3e496d816..30ee0f3bc 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -49,7 +49,7 @@ jobs: autoreconf -i . ./configure - name: Build and test - run: make tdd + run: make check_all cmake: strategy: From f1c30da666d5557c9c46b535d929728b9bbf1ab1 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 1 Nov 2022 18:21:33 -0700 Subject: [PATCH 0896/1093] Check less --- .github/workflows/basic.yml | 2 +- .github/workflows/extended.yml | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 30ee0f3bc..3e496d816 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -49,7 +49,7 @@ jobs: autoreconf -i . ./configure - name: Build and test - run: make check_all + run: make tdd cmake: strategy: diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 4d4881850..7f2850cb5 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -21,6 +21,20 @@ jobs: cp ./scripts/generate_junit_report_ant.xml . ant -f generate_junit_report_ant.xml + gtest: + runs-on: ubuntu-latest + strategy: + matrix: + version: [15, 16, 17, 18] + steps: + - name: Checkout + uses: actions/checkout@main + - name: Configure + run: | + autoreconf -i . + ./configure + - name: Build and test + run: make check_gtest${{ matrix.version }} make_dos: runs-on: ubuntu-latest steps: From e0a04135db2e50edcd994ec371fb20db6b8661d7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 1 Nov 2022 18:29:21 -0700 Subject: [PATCH 0897/1093] Install Python 2 --- .github/workflows/extended.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 7f2850cb5..d690a6e19 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -27,6 +27,10 @@ jobs: matrix: version: [15, 16, 17, 18] steps: + - name: Install Python 2 + uses: actions/setup-python@v4 + with: + python-version: "2.7" - name: Checkout uses: actions/checkout@main - name: Configure From d759f2d44feed38557766ffd9abc5f6257fbbb97 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 2 Nov 2022 18:05:01 -0700 Subject: [PATCH 0898/1093] Keep C++98 compatibility macros out of C --- include/CppUTest/CppUTestConfig.h | 37 +++++++++++++------------------ include/CppUTest/TestHarness_c.h | 30 ++++++++++++------------- 2 files changed, 31 insertions(+), 36 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 48213a416..6f789e853 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -316,29 +316,24 @@ typedef struct #endif -/* Visual C++ 10.0+ (2010+) supports the override keyword, but doesn't define the C++ version as C++11 */ -#if defined(__cplusplus) && ((__cplusplus >= 201103L) || (defined(_MSC_VER) && (_MSC_VER >= 1600))) -#if !defined(__ghs__) -#define CPPUTEST_COMPILER_FULLY_SUPPORTS_CXX11 -#define _override override -#else -/* GreenHills is not compatible with other compilers with regards to where - * it expects the override specifier to be on methods that return function - * pointers. Given this, it is easiest to not use the override specifier. - */ -#define _override -#endif -#define NULLPTR nullptr -#else -#define _override -#define NULLPTR NULL +#ifdef __cplusplus + /* Visual C++ 10.0+ (2010+) supports the override keyword, but doesn't define the C++ version as C++11 */ + #if (__cplusplus >= 201103L) || (defined(_MSC_VER) && (_MSC_VER >= 1600)) + #define _override override + #define NULLPTR nullptr + #else + #define _override + #define NULLPTR NULL + #endif #endif -/* Visual C++ 11.0+ (2012+) supports the override keyword on destructors */ -#if defined(__cplusplus) && ((__cplusplus >= 201103L) || (defined(_MSC_VER) && (_MSC_VER >= 1700))) -#define _destructor_override override -#else -#define _destructor_override +#ifdef __cplusplus + /* Visual C++ 11.0+ (2012+) supports the override keyword on destructors */ + #if (__cplusplus >= 201103L) || (defined(_MSC_VER) && (_MSC_VER >= 1700)) + #define _destructor_override override + #else + #define _destructor_override + #endif #endif #ifdef __clang__ diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 645676dfc..6888b8a31 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -37,85 +37,85 @@ #include "CppUTestConfig.h" #define CHECK_EQUAL_C_BOOL(expected,actual) \ - CHECK_EQUAL_C_BOOL_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_BOOL_LOCATION(expected,actual,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_BOOL_TEXT(expected,actual,text) \ CHECK_EQUAL_C_BOOL_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_INT(expected,actual) \ - CHECK_EQUAL_C_INT_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_INT_LOCATION(expected,actual,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_INT_TEXT(expected,actual,text) \ CHECK_EQUAL_C_INT_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_UINT(expected,actual) \ - CHECK_EQUAL_C_UINT_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_UINT_LOCATION(expected,actual,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_UINT_TEXT(expected,actual,text) \ CHECK_EQUAL_C_UINT_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_LONG(expected,actual) \ - CHECK_EQUAL_C_LONG_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_LONG_LOCATION(expected,actual,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_LONG_TEXT(expected,actual,text) \ CHECK_EQUAL_C_LONG_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_ULONG(expected,actual) \ - CHECK_EQUAL_C_ULONG_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_ULONG_LOCATION(expected,actual,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_ULONG_TEXT(expected,actual,text) \ CHECK_EQUAL_C_ULONG_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_LONGLONG(expected,actual) \ - CHECK_EQUAL_C_LONGLONG_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_LONGLONG_LOCATION(expected,actual,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_LONGLONG_TEXT(expected,actual,text) \ CHECK_EQUAL_C_LONGLONG_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_ULONGLONG(expected,actual) \ - CHECK_EQUAL_C_ULONGLONG_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_ULONGLONG_LOCATION(expected,actual,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_ULONGLONG_TEXT(expected,actual,text) \ CHECK_EQUAL_C_ULONGLONG_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_REAL(expected,actual,threshold) \ - CHECK_EQUAL_C_REAL_LOCATION(expected,actual,threshold,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_REAL_LOCATION(expected,actual,threshold,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_REAL_TEXT(expected,actual,threshold,text) \ CHECK_EQUAL_C_REAL_LOCATION(expected,actual,threshold,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_CHAR(expected,actual) \ - CHECK_EQUAL_C_CHAR_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_CHAR_LOCATION(expected,actual,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_CHAR_TEXT(expected,actual,text) \ CHECK_EQUAL_C_CHAR_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_UBYTE(expected,actual) \ - CHECK_EQUAL_C_UBYTE_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_UBYTE_LOCATION(expected,actual,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_UBYTE_TEXT(expected,actual,text) \ CHECK_EQUAL_C_UBYTE_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_SBYTE(expected,actual) \ - CHECK_EQUAL_C_SBYTE_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_SBYTE_LOCATION(expected,actual,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_SBYTE_TEXT(expected,actual,text) \ CHECK_EQUAL_C_SBYTE_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_STRING(expected,actual) \ - CHECK_EQUAL_C_STRING_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_STRING_LOCATION(expected,actual,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_STRING_TEXT(expected,actual,text) \ CHECK_EQUAL_C_STRING_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_POINTER(expected,actual) \ - CHECK_EQUAL_C_POINTER_LOCATION(expected,actual,NULLPTR,__FILE__,__LINE__) + CHECK_EQUAL_C_POINTER_LOCATION(expected,actual,NULL,__FILE__,__LINE__) #define CHECK_EQUAL_C_POINTER_TEXT(expected,actual,text) \ CHECK_EQUAL_C_POINTER_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_BITS(expected, actual, mask) \ - CHECK_EQUAL_C_BITS_LOCATION(expected, actual, mask, sizeof(actual), NULLPTR, __FILE__, __LINE__) + CHECK_EQUAL_C_BITS_LOCATION(expected, actual, mask, sizeof(actual), NULL, __FILE__, __LINE__) #define CHECK_EQUAL_C_BITS_TEXT(expected, actual, mask, text) \ CHECK_EQUAL_C_BITS_LOCATION(expected, actual, mask, sizeof(actual), text, __FILE__, __LINE__) @@ -127,7 +127,7 @@ FAIL_C_LOCATION(__FILE__,__LINE__) #define CHECK_C(condition) \ - CHECK_C_LOCATION(condition, #condition, NULLPTR, __FILE__,__LINE__) + CHECK_C_LOCATION(condition, #condition, NULL, __FILE__,__LINE__) #define CHECK_C_TEXT(condition, text) \ CHECK_C_LOCATION(condition, #condition, text, __FILE__, __LINE__) From 2378c3c44214fe9b9c094f5748ed5908ab2327dd Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 4 Nov 2022 19:14:16 -0700 Subject: [PATCH 0899/1093] Don't guess CHAR_BIT --- CMakePresets.json | 4 ++-- include/CppUTest/CppUTestConfig.h | 11 +++++------ src/CppUTest/SimpleString.cpp | 4 ++-- tests/CppUTest/SimpleStringTest.cpp | 28 ++++++++++++++-------------- tests/CppUTest/TestFailureTest.cpp | 10 +++++----- tests/CppUTest/TestUTestMacro.cpp | 4 ++-- 6 files changed, 30 insertions(+), 31 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 549939c80..5a6f16bb7 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -88,8 +88,8 @@ "name": "no-std-c", "inherits": ["GNU"], "environment": { - "CXXFLAGS": "-Werror -nostdinc", - "CFLAGS": "-Werror -nostdinc" + "CXXFLAGS": "-DCHAR_BIT=8 -Werror -nostdinc", + "CFLAGS": "-DCHAR_BIT=8 -Werror -nostdinc" }, "cacheVariables": { "CMAKE_SYSTEM_NAME": "Generic", diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 6f789e853..2641bd7ea 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -249,13 +249,12 @@ #endif #endif -/* Handling of systems with a different byte-width (e.g. 16 bit). - * Since CHAR_BIT is defined in limits.h (ANSI C), use default of 8 when building without Std C library. +/* Handling of systems with a different byte-width (e.g. 16 bit). Since + * CHAR_BIT is defined in limits.h (ANSI C), the user must provide a definition + * when building without Std C library. */ -#if CPPUTEST_USE_STD_C_LIB -#define CPPUTEST_CHAR_BIT CHAR_BIT -#else -#define CPPUTEST_CHAR_BIT 8 +#if !CPPUTEST_USE_STD_C_LIB && !defined(CHAR_BIT) + #error "Provide a definition for CHAR_BIT" #endif /* Handling of systems with a different int-width (e.g. 16 bit). diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 0a789d725..46e98a539 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -723,7 +723,7 @@ SimpleString HexStringFrom(signed char value) SimpleString result = StringFromFormat("%x", value); if(value < 0) { size_t size = result.size(); - result = result.subString(size-(CPPUTEST_CHAR_BIT/4)); + result = result.subString(size-(CHAR_BIT/4)); } return result; } @@ -1007,7 +1007,7 @@ SimpleString StringFromBinaryWithSizeOrNull(const unsigned char* value, size_t s SimpleString StringFromMaskedBits(unsigned long value, unsigned long mask, size_t byteCount) { SimpleString result; - size_t bitCount = (byteCount > sizeof(unsigned long)) ? (sizeof(unsigned long) * CPPUTEST_CHAR_BIT) : (byteCount * CPPUTEST_CHAR_BIT); + size_t bitCount = (byteCount > sizeof(unsigned long)) ? (sizeof(unsigned long) * CHAR_BIT) : (byteCount * CHAR_BIT); const unsigned long msbMask = (((unsigned long) 1) << (bitCount - 1)); for (size_t i = 0; i < bitCount; i++) { diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index f8c303daf..4b65fb6c3 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -1130,7 +1130,7 @@ TEST(SimpleString, MemCmpFirstLastNotMatching) CHECK(0 != SimpleString::MemCmp(base, lastNotMatching, sizeof(base))); } -#if (CPPUTEST_CHAR_BIT == 16) +#if (CHAR_BIT == 16) TEST(SimpleString, MaskedBitsChar) { STRCMP_EQUAL("xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x00, 0x00, 1).asCharString()); @@ -1140,7 +1140,7 @@ TEST(SimpleString, MaskedBitsChar) STRCMP_EQUAL("xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x01, 0x01, 1).asCharString()); STRCMP_EQUAL("xxxxxxxx 11xx11xx", StringFromMaskedBits(0xFF, 0xCC, 1).asCharString()); } -#else +#elif (CHAR_BIT == 8) TEST(SimpleString, MaskedBitsChar) { STRCMP_EQUAL("xxxxxxxx", StringFromMaskedBits(0x00, 0x00, 1).asCharString()); @@ -1154,22 +1154,22 @@ TEST(SimpleString, MaskedBitsChar) TEST(SimpleString, MaskedBits16Bit) { - STRCMP_EQUAL("xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x0000, 0x0000, 2*8/CPPUTEST_CHAR_BIT).asCharString()); - STRCMP_EQUAL("00000000 00000000", StringFromMaskedBits(0x0000, 0xFFFF, 2*8/CPPUTEST_CHAR_BIT).asCharString()); - STRCMP_EQUAL("11111111 11111111", StringFromMaskedBits(0xFFFF, 0xFFFF, 2*8/CPPUTEST_CHAR_BIT).asCharString()); - STRCMP_EQUAL("1xxxxxxx xxxxxxxx", StringFromMaskedBits(0x8000, 0x8000, 2*8/CPPUTEST_CHAR_BIT).asCharString()); - STRCMP_EQUAL("xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x0001, 0x0001, 2*8/CPPUTEST_CHAR_BIT).asCharString()); - STRCMP_EQUAL("11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFF, 0xCCCC, 2*8/CPPUTEST_CHAR_BIT).asCharString()); + STRCMP_EQUAL("xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x0000, 0x0000, 2*8/CHAR_BIT).asCharString()); + STRCMP_EQUAL("00000000 00000000", StringFromMaskedBits(0x0000, 0xFFFF, 2*8/CHAR_BIT).asCharString()); + STRCMP_EQUAL("11111111 11111111", StringFromMaskedBits(0xFFFF, 0xFFFF, 2*8/CHAR_BIT).asCharString()); + STRCMP_EQUAL("1xxxxxxx xxxxxxxx", StringFromMaskedBits(0x8000, 0x8000, 2*8/CHAR_BIT).asCharString()); + STRCMP_EQUAL("xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x0001, 0x0001, 2*8/CHAR_BIT).asCharString()); + STRCMP_EQUAL("11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFF, 0xCCCC, 2*8/CHAR_BIT).asCharString()); } TEST(SimpleString, MaskedBits32Bit) { - STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x00000000, 0x00000000, 4*8/CPPUTEST_CHAR_BIT).asCharString()); - STRCMP_EQUAL("00000000 00000000 00000000 00000000", StringFromMaskedBits(0x00000000, 0xFFFFFFFF, 4*8/CPPUTEST_CHAR_BIT).asCharString()); - STRCMP_EQUAL("11111111 11111111 11111111 11111111", StringFromMaskedBits(0xFFFFFFFF, 0xFFFFFFFF, 4*8/CPPUTEST_CHAR_BIT).asCharString()); - STRCMP_EQUAL("1xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x80000000, 0x80000000, 4*8/CPPUTEST_CHAR_BIT).asCharString()); - STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x00000001, 0x00000001, 4*8/CPPUTEST_CHAR_BIT).asCharString()); - STRCMP_EQUAL("11xx11xx 11xx11xx 11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFFFFFF, 0xCCCCCCCC, 4*8/CPPUTEST_CHAR_BIT).asCharString()); + STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x00000000, 0x00000000, 4*8/CHAR_BIT).asCharString()); + STRCMP_EQUAL("00000000 00000000 00000000 00000000", StringFromMaskedBits(0x00000000, 0xFFFFFFFF, 4*8/CHAR_BIT).asCharString()); + STRCMP_EQUAL("11111111 11111111 11111111 11111111", StringFromMaskedBits(0xFFFFFFFF, 0xFFFFFFFF, 4*8/CHAR_BIT).asCharString()); + STRCMP_EQUAL("1xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x80000000, 0x80000000, 4*8/CHAR_BIT).asCharString()); + STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x00000001, 0x00000001, 4*8/CHAR_BIT).asCharString()); + STRCMP_EQUAL("11xx11xx 11xx11xx 11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFFFFFF, 0xCCCCCCCC, 4*8/CHAR_BIT).asCharString()); } TEST(SimpleString, StringFromOrdinalNumberOnes) diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index e1c33d587..3e8514b5a 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -390,18 +390,18 @@ TEST(TestFailure, BinaryEqualExpectedNull) TEST(TestFailure, BitsEqualWithText) { - BitsEqualFailure f(test, failFileName, failLineNumber, 0x0001, 0x0003, 0x00FF, 2*8/CPPUTEST_CHAR_BIT, "text"); + BitsEqualFailure f(test, failFileName, failLineNumber, 0x0001, 0x0003, 0x00FF, 2*8/CHAR_BIT, "text"); FAILURE_EQUAL("Message: text\n" "\texpected \n\tbut was ", f); } -#if (CPPUTEST_CHAR_BIT == 16) +#if (CHAR_BIT == 16) TEST(TestFailure, BitsEqualChar) { BitsEqualFailure f(test, failFileName, failLineNumber, 0x01, 0x03, 0xFF, sizeof(char), ""); FAILURE_EQUAL("expected \n\tbut was ", f); } -#else +#elif (CHAR_BIT == 8) TEST(TestFailure, BitsEqualChar) { BitsEqualFailure f(test, failFileName, failLineNumber, 0x01, 0x03, 0xFF, sizeof(char), ""); @@ -411,13 +411,13 @@ TEST(TestFailure, BitsEqualChar) TEST(TestFailure, BitsEqual16Bit) { - BitsEqualFailure f(test, failFileName, failLineNumber, 0x0001, 0x0003, 0xFFFF, 2*8/CPPUTEST_CHAR_BIT, ""); + BitsEqualFailure f(test, failFileName, failLineNumber, 0x0001, 0x0003, 0xFFFF, 2*8/CHAR_BIT, ""); FAILURE_EQUAL("expected <00000000 00000001>\n\tbut was <00000000 00000011>", f); } TEST(TestFailure, BitsEqual32Bit) { - BitsEqualFailure f(test, failFileName, failLineNumber, 0x00000001, 0x00000003, 0xFFFFFFFF, 4*8/CPPUTEST_CHAR_BIT, ""); + BitsEqualFailure f(test, failFileName, failLineNumber, 0x00000001, 0x00000003, 0xFFFFFFFF, 4*8/CHAR_BIT, ""); FAILURE_EQUAL("expected <00000000 00000000 00000000 00000001>\n\tbut was <00000000 00000000 00000000 00000011>", f); } diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index 27521d70f..42bcba757 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -724,10 +724,10 @@ static void failingTestMethodWithSIGNED_BYTES_EQUAL_() TEST(UnitTestMacros, FailureWithSIGNED_BYTES_EQUAL) { fixture.runTestWithMethod(failingTestMethodWithSIGNED_BYTES_EQUAL_); -#if CPPUTEST_CHAR_BIT == 16 +#if CHAR_BIT == 16 CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-1 (0xffff)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-2 (0xfffe)>"); -#else +#elif CHAR_BIT == 8 CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-1 (0xff)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-2 (0xfe)>"); #endif From 5562d56a9a9ab3b62f69b6a59fdb93c9bc84c769 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 4 Nov 2022 19:45:19 -0700 Subject: [PATCH 0900/1093] Allow detailed tests to be set at call site When `DETAILED` is passed to `cpputest_buildtime_discover_tests`, that value will take precedence over the `CPPUTEST_TESTS_DETAILED` variable. For the following invocations: ```cmake cpputest_buildtime_discover_tests(A) cpputest_buildtime_discover_tests(B DETAILED TRUE) cpputest_buildtime_discover_tests(C DETAILED FALSE) ``` - When `CPPUTEST_TESTS_DETAILED` is falsey, _B_ tests will be detailed. - When `CPPUTEST_TESTS_DETAILED` is truthy, _A_ and _B_ tests will be detailed. This is useful in cases like `TestOrderedTestMacros`, which fail when run in detailed-mode. --- .github/workflows/basic.yml | 4 ++++ CMakeLists.txt | 1 - CMakePresets.json | 9 ++++++++- .../CppUTestBuildTimeDiscoverTests.cmake | 18 +++++++++++++++++- examples/AllTests/CMakeLists.txt | 4 +++- tests/CppUTestExt/CMakeLists.txt | 5 ++++- 6 files changed, 36 insertions(+), 5 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 3e496d816..a2b6b0f47 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -96,6 +96,10 @@ jobs: os: ubuntu-latest cpp_version: 98 preset: no-long-long + - name: Detailed + os: ubuntu-latest + cpp_version: 98 + preset: detailed - name: Linux GNU Install os: ubuntu-latest cpp_version: 11 diff --git a/CMakeLists.txt b/CMakeLists.txt index f1a994e43..536361681 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,7 +53,6 @@ cmake_dependent_option(CPPUTEST_USE_LONG_LONG "Support long long" cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTest" ${PROJECT_IS_TOP_LEVEL} "BUILD_TESTING" OFF) -option(CPPUTEST_TESTS_DETAILED "Run each test separately instead of grouped?" OFF) cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" ON "CPPUTEST_BUILD_TESTING;CMAKE_CROSSCOMPILING_EMULATOR OR NOT CMAKE_CROSSCOMPILING" OFF) cmake_dependent_option(CPPUTEST_EXAMPLES "Compile and make examples?" diff --git a/CMakePresets.json b/CMakePresets.json index 549939c80..73367eca2 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -98,11 +98,18 @@ }, { "name": "no-long-long", - "inherits":["GNU"], + "inherits": ["GNU"], "cacheVariables": { "CPPUTEST_USE_LONG_LONG": false } }, + { + "name": "detailed", + "inherits": ["defaults"], + "cacheVariables": { + "CPPUTEST_TESTS_DETAILED": true + } + }, { "name": "IAR", "inherits": ["defaults"], diff --git a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake index e9bbff495..bf852f454 100644 --- a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake +++ b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake @@ -1,7 +1,23 @@ +option(CPPUTEST_TESTS_DETAILED "Run discovered tests individually") + set(_DISCOVER_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/../Scripts/CppUTestBuildTimeDiscoverTests.cmake") # Create target to discover tests function (cpputest_buildtime_discover_tests tgt) + set(options) + set(oneValueArgs DETAILED) + set(multiValueArgs) + cmake_parse_arguments( + "" + "${options}" + "${oneValueArgs}" + "${multiValueArgs}" + ${ARGN} + ) + if(NOT DEFINED _DETAILED) + set(_DETAILED ${CPPUTEST_TESTS_DETAILED}) + endif() + if(NOT TARGET ${tgt}) message(FATAL_ERROR "Cannot discover tests for target \"${tgt}\" " @@ -24,7 +40,7 @@ function (cpputest_buildtime_discover_tests tgt) TARGET ${tgt} POST_BUILD COMMAND ${CMAKE_COMMAND} - -D "TESTS_DETAILED:BOOL=${CPPUTEST_TESTS_DETAILED}" + -D "TESTS_DETAILED:BOOL=${_DETAILED}" -D "EXECUTABLE=$" -D "EMULATOR=$" -P "${_DISCOVER_SCRIPT}" diff --git a/examples/AllTests/CMakeLists.txt b/examples/AllTests/CMakeLists.txt index 5b4df03df..f4693e90b 100644 --- a/examples/AllTests/CMakeLists.txt +++ b/examples/AllTests/CMakeLists.txt @@ -25,5 +25,7 @@ target_link_libraries(ExampleTests include(CppUTestBuildTimeDiscoverTests) if(CPPUTEST_TEST_DISCOVERY OR NOT DEFINED CPPUTEST_TEST_DISCOVERY) - cpputest_buildtime_discover_tests(ExampleTests) + cpputest_buildtime_discover_tests(ExampleTests + DETAILED TRUE + ) endif() diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 3e44ff034..de02a222e 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -54,5 +54,8 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") endif() if (CPPUTEST_TEST_DISCOVERY) - cpputest_buildtime_discover_tests(CppUTestExtTests) + cpputest_buildtime_discover_tests(CppUTestExtTests + # TestOrderedTestMacros must run together + DETAILED FALSE + ) endif() From 57aac8eea4ea20bae7cd2e297dad7de5c35bdd3b Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Mon, 7 Nov 2022 17:22:38 +0200 Subject: [PATCH 0901/1093] Fixed compilation when exceptions are enabled but RTTI not. --- src/CppUTest/TestFailure.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index 1eb5bb619..6e3ca065b 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -395,6 +395,7 @@ UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test) static SimpleString getExceptionTypeName(const std::exception &e) { +#if defined(_CPPRTTI) || defined(__GXX_RTTI) const char *name = typeid(e).name(); #if defined(__GNUC__) && (__cplusplus >= 201103L) int status = -1; @@ -407,6 +408,9 @@ static SimpleString getExceptionTypeName(const std::exception &e) #else return name; #endif +#else + return "unknown-no-RTTI"; +#endif } UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test, const std::exception &e) From 8c7e75ec477e36f07a7e88527753232b8330be3b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 8 Nov 2022 06:16:40 +0000 Subject: [PATCH 0902/1093] Retain CHAR_BIT wrapper --- CMakePresets.json | 4 ++-- include/CppUTest/CppUTestConfig.h | 6 ++++-- src/CppUTest/SimpleString.cpp | 4 ++-- tests/CppUTest/SimpleStringTest.cpp | 28 ++++++++++++++-------------- tests/CppUTest/TestFailureTest.cpp | 10 +++++----- tests/CppUTest/TestUTestMacro.cpp | 4 ++-- 6 files changed, 29 insertions(+), 27 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 5a6f16bb7..0ccdc3364 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -88,8 +88,8 @@ "name": "no-std-c", "inherits": ["GNU"], "environment": { - "CXXFLAGS": "-DCHAR_BIT=8 -Werror -nostdinc", - "CFLAGS": "-DCHAR_BIT=8 -Werror -nostdinc" + "CXXFLAGS": "-DCPPUTEST_CHAR_BIT=8 -Werror -nostdinc", + "CFLAGS": "-DCPPUTEST_CHAR_BIT=8 -Werror -nostdinc" }, "cacheVariables": { "CMAKE_SYSTEM_NAME": "Generic", diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 2641bd7ea..fe99a32d8 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -253,8 +253,10 @@ * CHAR_BIT is defined in limits.h (ANSI C), the user must provide a definition * when building without Std C library. */ -#if !CPPUTEST_USE_STD_C_LIB && !defined(CHAR_BIT) - #error "Provide a definition for CHAR_BIT" +#if defined(CHAR_BIT) && !defined(CPPUTEST_CHAR_BIT) + #define CPPUTEST_CHAR_BIT CHAR_BIT +#else + #error "Provide a definition for CPPUTEST_CHAR_BIT" #endif /* Handling of systems with a different int-width (e.g. 16 bit). diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 46e98a539..0a789d725 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -723,7 +723,7 @@ SimpleString HexStringFrom(signed char value) SimpleString result = StringFromFormat("%x", value); if(value < 0) { size_t size = result.size(); - result = result.subString(size-(CHAR_BIT/4)); + result = result.subString(size-(CPPUTEST_CHAR_BIT/4)); } return result; } @@ -1007,7 +1007,7 @@ SimpleString StringFromBinaryWithSizeOrNull(const unsigned char* value, size_t s SimpleString StringFromMaskedBits(unsigned long value, unsigned long mask, size_t byteCount) { SimpleString result; - size_t bitCount = (byteCount > sizeof(unsigned long)) ? (sizeof(unsigned long) * CHAR_BIT) : (byteCount * CHAR_BIT); + size_t bitCount = (byteCount > sizeof(unsigned long)) ? (sizeof(unsigned long) * CPPUTEST_CHAR_BIT) : (byteCount * CPPUTEST_CHAR_BIT); const unsigned long msbMask = (((unsigned long) 1) << (bitCount - 1)); for (size_t i = 0; i < bitCount; i++) { diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 4b65fb6c3..b9ec3f1b1 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -1130,7 +1130,7 @@ TEST(SimpleString, MemCmpFirstLastNotMatching) CHECK(0 != SimpleString::MemCmp(base, lastNotMatching, sizeof(base))); } -#if (CHAR_BIT == 16) +#if (CPPUTEST_CHAR_BIT == 16) TEST(SimpleString, MaskedBitsChar) { STRCMP_EQUAL("xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x00, 0x00, 1).asCharString()); @@ -1140,7 +1140,7 @@ TEST(SimpleString, MaskedBitsChar) STRCMP_EQUAL("xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x01, 0x01, 1).asCharString()); STRCMP_EQUAL("xxxxxxxx 11xx11xx", StringFromMaskedBits(0xFF, 0xCC, 1).asCharString()); } -#elif (CHAR_BIT == 8) +#elif (CPPUTEST_CHAR_BIT == 8) TEST(SimpleString, MaskedBitsChar) { STRCMP_EQUAL("xxxxxxxx", StringFromMaskedBits(0x00, 0x00, 1).asCharString()); @@ -1154,22 +1154,22 @@ TEST(SimpleString, MaskedBitsChar) TEST(SimpleString, MaskedBits16Bit) { - STRCMP_EQUAL("xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x0000, 0x0000, 2*8/CHAR_BIT).asCharString()); - STRCMP_EQUAL("00000000 00000000", StringFromMaskedBits(0x0000, 0xFFFF, 2*8/CHAR_BIT).asCharString()); - STRCMP_EQUAL("11111111 11111111", StringFromMaskedBits(0xFFFF, 0xFFFF, 2*8/CHAR_BIT).asCharString()); - STRCMP_EQUAL("1xxxxxxx xxxxxxxx", StringFromMaskedBits(0x8000, 0x8000, 2*8/CHAR_BIT).asCharString()); - STRCMP_EQUAL("xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x0001, 0x0001, 2*8/CHAR_BIT).asCharString()); - STRCMP_EQUAL("11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFF, 0xCCCC, 2*8/CHAR_BIT).asCharString()); + STRCMP_EQUAL("xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x0000, 0x0000, 2*8/CPPUTEST_CHAR_BIT).asCharString()); + STRCMP_EQUAL("00000000 00000000", StringFromMaskedBits(0x0000, 0xFFFF, 2*8/CPPUTEST_CHAR_BIT).asCharString()); + STRCMP_EQUAL("11111111 11111111", StringFromMaskedBits(0xFFFF, 0xFFFF, 2*8/CPPUTEST_CHAR_BIT).asCharString()); + STRCMP_EQUAL("1xxxxxxx xxxxxxxx", StringFromMaskedBits(0x8000, 0x8000, 2*8/CPPUTEST_CHAR_BIT).asCharString()); + STRCMP_EQUAL("xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x0001, 0x0001, 2*8/CPPUTEST_CHAR_BIT).asCharString()); + STRCMP_EQUAL("11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFF, 0xCCCC, 2*8/CPPUTEST_CHAR_BIT).asCharString()); } TEST(SimpleString, MaskedBits32Bit) { - STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x00000000, 0x00000000, 4*8/CHAR_BIT).asCharString()); - STRCMP_EQUAL("00000000 00000000 00000000 00000000", StringFromMaskedBits(0x00000000, 0xFFFFFFFF, 4*8/CHAR_BIT).asCharString()); - STRCMP_EQUAL("11111111 11111111 11111111 11111111", StringFromMaskedBits(0xFFFFFFFF, 0xFFFFFFFF, 4*8/CHAR_BIT).asCharString()); - STRCMP_EQUAL("1xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x80000000, 0x80000000, 4*8/CHAR_BIT).asCharString()); - STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x00000001, 0x00000001, 4*8/CHAR_BIT).asCharString()); - STRCMP_EQUAL("11xx11xx 11xx11xx 11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFFFFFF, 0xCCCCCCCC, 4*8/CHAR_BIT).asCharString()); + STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x00000000, 0x00000000, 4*8/CPPUTEST_CHAR_BIT).asCharString()); + STRCMP_EQUAL("00000000 00000000 00000000 00000000", StringFromMaskedBits(0x00000000, 0xFFFFFFFF, 4*8/CPPUTEST_CHAR_BIT).asCharString()); + STRCMP_EQUAL("11111111 11111111 11111111 11111111", StringFromMaskedBits(0xFFFFFFFF, 0xFFFFFFFF, 4*8/CPPUTEST_CHAR_BIT).asCharString()); + STRCMP_EQUAL("1xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x80000000, 0x80000000, 4*8/CPPUTEST_CHAR_BIT).asCharString()); + STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x00000001, 0x00000001, 4*8/CPPUTEST_CHAR_BIT).asCharString()); + STRCMP_EQUAL("11xx11xx 11xx11xx 11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFFFFFF, 0xCCCCCCCC, 4*8/CPPUTEST_CHAR_BIT).asCharString()); } TEST(SimpleString, StringFromOrdinalNumberOnes) diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index 3e8514b5a..2d34a3274 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -390,18 +390,18 @@ TEST(TestFailure, BinaryEqualExpectedNull) TEST(TestFailure, BitsEqualWithText) { - BitsEqualFailure f(test, failFileName, failLineNumber, 0x0001, 0x0003, 0x00FF, 2*8/CHAR_BIT, "text"); + BitsEqualFailure f(test, failFileName, failLineNumber, 0x0001, 0x0003, 0x00FF, 2*8/CPPUTEST_CHAR_BIT, "text"); FAILURE_EQUAL("Message: text\n" "\texpected \n\tbut was ", f); } -#if (CHAR_BIT == 16) +#if (CPPUTEST_CHAR_BIT == 16) TEST(TestFailure, BitsEqualChar) { BitsEqualFailure f(test, failFileName, failLineNumber, 0x01, 0x03, 0xFF, sizeof(char), ""); FAILURE_EQUAL("expected \n\tbut was ", f); } -#elif (CHAR_BIT == 8) +#elif (CPPUTEST_CHAR_BIT == 8) TEST(TestFailure, BitsEqualChar) { BitsEqualFailure f(test, failFileName, failLineNumber, 0x01, 0x03, 0xFF, sizeof(char), ""); @@ -411,13 +411,13 @@ TEST(TestFailure, BitsEqualChar) TEST(TestFailure, BitsEqual16Bit) { - BitsEqualFailure f(test, failFileName, failLineNumber, 0x0001, 0x0003, 0xFFFF, 2*8/CHAR_BIT, ""); + BitsEqualFailure f(test, failFileName, failLineNumber, 0x0001, 0x0003, 0xFFFF, 2*8/CPPUTEST_CHAR_BIT, ""); FAILURE_EQUAL("expected <00000000 00000001>\n\tbut was <00000000 00000011>", f); } TEST(TestFailure, BitsEqual32Bit) { - BitsEqualFailure f(test, failFileName, failLineNumber, 0x00000001, 0x00000003, 0xFFFFFFFF, 4*8/CHAR_BIT, ""); + BitsEqualFailure f(test, failFileName, failLineNumber, 0x00000001, 0x00000003, 0xFFFFFFFF, 4*8/CPPUTEST_CHAR_BIT, ""); FAILURE_EQUAL("expected <00000000 00000000 00000000 00000001>\n\tbut was <00000000 00000000 00000000 00000011>", f); } diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index 42bcba757..165f240fd 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -724,10 +724,10 @@ static void failingTestMethodWithSIGNED_BYTES_EQUAL_() TEST(UnitTestMacros, FailureWithSIGNED_BYTES_EQUAL) { fixture.runTestWithMethod(failingTestMethodWithSIGNED_BYTES_EQUAL_); -#if CHAR_BIT == 16 +#if CPPUTEST_CHAR_BIT == 16 CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-1 (0xffff)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-2 (0xfffe)>"); -#elif CHAR_BIT == 8 +#elif CPPUTEST_CHAR_BIT == 8 CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-1 (0xff)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-2 (0xfe)>"); #endif From 74b2af88dfae19f8e82b5458da535144a72d7858 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Mon, 7 Nov 2022 19:59:51 +0200 Subject: [PATCH 0903/1093] Refactored RTTI feature detection and moved it to the config header. --- include/CppUTest/CppUTestConfig.h | 11 +++++++++++ src/CppUTest/TestFailure.cpp | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 6f789e853..129cec026 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -238,6 +238,17 @@ #endif #endif +/* + * Detection of run-time type information (RTTI) presence + */ +#ifndef CPPUTEST_HAVE_RTTI + #if defined(_CPPRTTI) || defined(__GXX_RTTI) || defined(__RTTI) || (defined(__cpp_rtti) && __cpp_rtti) + #define CPPUTEST_HAVE_RTTI 1 + #else + #define CPPUTEST_HAVE_RTTI 0 + #endif +#endif + /* * Detection of different 64 bit environments */ diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index 6e3ca065b..e2ae37776 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -395,7 +395,7 @@ UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test) static SimpleString getExceptionTypeName(const std::exception &e) { -#if defined(_CPPRTTI) || defined(__GXX_RTTI) +#if CPPUTEST_HAVE_RTTI const char *name = typeid(e).name(); #if defined(__GNUC__) && (__cplusplus >= 201103L) int status = -1; From 94d3d54790f6d4521f4b7e196924bb78674ad088 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 10 Nov 2022 12:50:48 -0800 Subject: [PATCH 0904/1093] Don't cast away const This was unnecessary undefined behavior. --- tests/CppUTestExt/MockExpectedCallTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index d8af458cc..f3946297d 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -326,7 +326,7 @@ TEST(MockExpectedCall, callWithMemoryBuffer) const unsigned char value[] = { 0x12, 0xFE, 0xA1 }; call->withParameter(paramName, value, sizeof(value)); STRCMP_EQUAL("const unsigned char*", call->getInputParameterType(paramName).asCharString()); - POINTERS_EQUAL( (void*) value, (void*) call->getInputParameter(paramName).getMemoryBuffer() ); + POINTERS_EQUAL(value, call->getInputParameter(paramName).getMemoryBuffer()); LONGS_EQUAL(sizeof(value), call->getInputParameter(paramName).getSize()); STRCMP_CONTAINS("funcName -> const unsigned char* paramName: ", call->callToString().asCharString()); } From edba33d58128d44e5ed7b5df8c8d207090cb4a1f Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 12 Nov 2022 11:19:47 -0800 Subject: [PATCH 0905/1093] Test Windows install MSVC is a multi-config generator. Though test discovery currently ignores this, installation does not, so we need to pass the config type to the `cmake --install` command. --- .github/workflows/basic.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index a2b6b0f47..79eaf08b2 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -55,11 +55,11 @@ jobs: strategy: matrix: include: - - name: MSVC defaults + - name: MSVC install os: windows-latest cpp_version: 17 preset: MSVC - # install: true + install: true - name: MSVC 20 os: windows-latest cpp_version: 20 @@ -195,9 +195,12 @@ jobs: # POST PROCESSING - - name: Install + - name: Install (*nix) run: sudo cmake --install cpputest_build/ - if: ${{ matrix.install }} + if: ${{ matrix.install && !startswith(matrix.os, 'windows')}} + - name: Install (Windows) + run: cmake --install cpputest_build/ --config=Debug + if: ${{ matrix.install && startswith(matrix.os, 'windows')}} - name: Use install run: | cmake -B build -S examples From 5409b9be2e7bcbf586e388e540e636a684ebd2ec Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 12 Nov 2022 14:16:51 -0800 Subject: [PATCH 0906/1093] validate pkgconfig --- .github/workflows/basic.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 79eaf08b2..298c1edd6 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -196,7 +196,9 @@ jobs: # POST PROCESSING - name: Install (*nix) - run: sudo cmake --install cpputest_build/ + run: | + sudo cmake --install cpputest_build/ + pkg-config --print-provides cpputest if: ${{ matrix.install && !startswith(matrix.os, 'windows')}} - name: Install (Windows) run: cmake --install cpputest_build/ --config=Debug From 4fce2e969a5e29abfeb446f40f04435684605904 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 12 Nov 2022 21:17:52 -0800 Subject: [PATCH 0907/1093] Test use without RTTI --- .github/workflows/basic.yml | 4 ++++ CMakePresets.json | 9 ++++++++- include/CppUTest/CppUTestConfig.h | 23 +++++++++++++++-------- src/CppUTest/TestFailure.cpp | 21 +++++++++++++++------ tests/CppUTest/TestFailureTest.cpp | 6 +++++- tests/CppUTest/UtestTest.cpp | 4 ++++ 6 files changed, 51 insertions(+), 16 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index a2b6b0f47..50eb32d31 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -126,6 +126,10 @@ jobs: os: ubuntu-latest cpp_version: 98 preset: no-std-cpp + - name: No RTTI + os: ubuntu-latest + cpp_version: 98 + preset: no-rtti - name: Coverage os: ubuntu-latest cpp_version: 11 diff --git a/CMakePresets.json b/CMakePresets.json index 27859f2ee..33e7473de 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -81,7 +81,14 @@ "name": "no-std-cpp", "inherits": ["GNU"], "environment": { - "CXXFLAGS": "-Werror -fno-exceptions -fno-rtti -nostdinc++" + "CXXFLAGS": "-Werror -fno-exceptions -nostdinc++" + } + }, + { + "name": "no-rtti", + "inherits": ["GNU"], + "environment": { + "CXXFLAGS": "-Werror -fno-rtti" } }, { diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index c9d01ff9d..5b86db8a1 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -238,14 +238,21 @@ #endif #endif -/* - * Detection of run-time type information (RTTI) presence - */ -#ifndef CPPUTEST_HAVE_RTTI - #if defined(_CPPRTTI) || defined(__GXX_RTTI) || defined(__RTTI) || (defined(__cpp_rtti) && __cpp_rtti) - #define CPPUTEST_HAVE_RTTI 1 - #else - #define CPPUTEST_HAVE_RTTI 0 +#ifdef __cplusplus + /* + * Detection of run-time type information (RTTI) presence. Since it's a + * standard language feature, assume it is enabled unless we see otherwise. + */ + #ifndef CPPUTEST_HAVE_RTTI + #if ((__cplusplus >= 202002L) && !__cpp_rtti) || \ + (defined(_MSC_VER) && !_CPPRTTI) || \ + (defined(__GNUC__) && !__GXX_RTTI) || \ + (defined(__ghs__) && !__RTTI) || \ + (defined(__WATCOMC__) && !_CPPRTTI) + #define CPPUTEST_HAVE_RTTI 0 + #else + #define CPPUTEST_HAVE_RTTI 1 + #endif #endif #endif diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index e2ae37776..299fd1541 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -393,9 +393,9 @@ UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test) { } +#if CPPUTEST_HAVE_RTTI static SimpleString getExceptionTypeName(const std::exception &e) { -#if CPPUTEST_HAVE_RTTI const char *name = typeid(e).name(); #if defined(__GNUC__) && (__cplusplus >= 201103L) int status = -1; @@ -408,13 +408,22 @@ static SimpleString getExceptionTypeName(const std::exception &e) #else return name; #endif -#else - return "unknown-no-RTTI"; -#endif } +#endif // CPPUTEST_HAVE_RTTI UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test, const std::exception &e) -: TestFailure(test, StringFromFormat("Unexpected exception of type '%s' was thrown: %s", getExceptionTypeName(e).asCharString(), e.what())) +: TestFailure( + test, +#if CPPUTEST_HAVE_RTTI + StringFromFormat( + "Unexpected exception of type '%s' was thrown: %s", + getExceptionTypeName(e).asCharString(), + e.what() + ) +#else + "Unexpected exception of unknown type was thrown." +#endif +) { } -#endif +#endif // CPPUTEST_USE_STD_CPP_LIB diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index 2d34a3274..818ac90e1 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -438,8 +438,12 @@ TEST(TestFailure, UnexpectedExceptionFailure_StandardException) { std::runtime_error e("Some error"); UnexpectedExceptionFailure f(test, e); +#if CPPUTEST_HAVE_RTTI STRCMP_CONTAINS("Unexpected exception of type '", f.getMessage().asCharString()); STRCMP_CONTAINS("runtime_error", f.getMessage().asCharString()); STRCMP_CONTAINS("' was thrown: Some error", f.getMessage().asCharString()); -} +#else + FAILURE_EQUAL("Unexpected exception of unknown type was thrown.", f); #endif +} +#endif // CPPUTEST_USE_STD_CPP_LIB diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index df232d15e..b8bb869b8 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -263,9 +263,13 @@ TEST(UtestShell, TestStopsAfterStandardExceptionIsThrown) fixture.setTestFunction(thrownStandardExceptionMethod_); fixture.runAllTests(); LONGS_EQUAL(1, fixture.getFailureCount()); +#if CPPUTEST_HAVE_RTTI fixture.assertPrintContains("Unexpected exception of type '"); fixture.assertPrintContains("runtime_error"); fixture.assertPrintContains("' was thrown: exception text"); +#else + fixture.assertPrintContains("Unexpected exception of unknown type was thrown"); +#endif LONGS_EQUAL(0, stopAfterFailure); UtestShell::setRethrowExceptions(initialRethrowExceptions); } From 094df52c8f6dae1dccb30d0d39dd1eb832ded85c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 13 Nov 2022 16:51:59 -0800 Subject: [PATCH 0908/1093] Call abort instead of invoking undefined behavior --- src/CppUTest/Utest.cpp | 14 +------------- tests/CppUTest/UtestTest.cpp | 3 +-- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 05718003f..381808036 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -163,23 +163,11 @@ UtestShell::~UtestShell() { } -// LCOV_EXCL_START - actually covered but not in .gcno due to race condition -#ifdef NEEDS_DISABLE_NULL_WARNING -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wnonnull" -#endif /* NEEDS_DISABLE_NULL_WARNING */ - static void defaultCrashMethod() { - UtestShell* ptr = (UtestShell*) NULLPTR; - ptr->countTests(); + abort(); } -#ifdef NEEDS_DISABLE_NULL_WARNING -# pragma GCC diagnostic pop -#endif /* NEEDS_DISABLE_NULL_WARNING */ -// LCOV_EXCL_STOP - static void (*pleaseCrashMeRightNow) () = defaultCrashMethod; void UtestShell::setCrashMethod(void (*crashme)()) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index b8bb869b8..018006528 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -401,8 +401,7 @@ TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) fixture.runAllTests(); fixture.assertPrintContains("Failed in separate process - killed by signal"); - /* Signal 11 usually happens, but with clang3.7 on Linux, it produced signal 4. Mac now produces signal 5 */ - CHECK(fixture.getOutput().contains("signal 11") || fixture.getOutput().contains("signal 4") || fixture.getOutput().contains("signal 5")); + CHECK(fixture.getOutput().contains("signal 6")); } #endif From 9c9d72e4a3fcd4a8b82c8d79d1f9c72154cf5869 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 13 Nov 2022 17:06:50 -0800 Subject: [PATCH 0909/1093] Wrap abort --- include/CppUTest/PlatformSpecificFunctions_c.h | 1 + src/CppUTest/Utest.cpp | 9 ++------- src/Platforms/Borland/UtestPlatform.cpp | 1 + src/Platforms/C2000/UtestPlatform.cpp | 1 + src/Platforms/Dos/UtestPlatform.cpp | 7 +++++++ src/Platforms/Gcc/UtestPlatform.cpp | 1 + src/Platforms/GccNoStdC/UtestPlatform.cpp | 1 + src/Platforms/Iar/UtestPlatform.cpp | 1 + src/Platforms/Keil/UtestPlatform.cpp | 1 + src/Platforms/Symbian/UtestPlatform.cpp | 1 + src/Platforms/VisualCpp/UtestPlatform.cpp | 1 + src/Platforms/armcc/UtestPlatform.cpp | 1 + 12 files changed, 19 insertions(+), 7 deletions(-) diff --git a/include/CppUTest/PlatformSpecificFunctions_c.h b/include/CppUTest/PlatformSpecificFunctions_c.h index 497bb4702..f8514d2a2 100644 --- a/include/CppUTest/PlatformSpecificFunctions_c.h +++ b/include/CppUTest/PlatformSpecificFunctions_c.h @@ -88,6 +88,7 @@ extern int (*PlatformSpecificRand)(void); extern void (*PlatformSpecificMutexLock)(PlatformSpecificMutex mtx); extern void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex mtx); extern void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex mtx); +extern void (*PlatformSpecificAbort)(void); #ifdef __cplusplus } diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 381808036..485e1596d 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -163,12 +163,7 @@ UtestShell::~UtestShell() { } -static void defaultCrashMethod() -{ - abort(); -} - -static void (*pleaseCrashMeRightNow) () = defaultCrashMethod; +static void (*pleaseCrashMeRightNow) () = PlatformSpecificAbort; void UtestShell::setCrashMethod(void (*crashme)()) { @@ -177,7 +172,7 @@ void UtestShell::setCrashMethod(void (*crashme)()) void UtestShell::resetCrashMethod() { - pleaseCrashMeRightNow = defaultCrashMethod; + pleaseCrashMeRightNow = PlatformSpecificAbort; } void UtestShell::crash() diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 6d7d2e04a..83a6468fc 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -328,5 +328,6 @@ PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void) = PThreadMutexCreate; void (*PlatformSpecificMutexLock)(PlatformSpecificMutex) = PThreadMutexLock; void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex) = PThreadMutexUnlock; void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex) = PThreadMutexDestroy; +void (*PlatformSpecificAbort)(void) = abort; } diff --git a/src/Platforms/C2000/UtestPlatform.cpp b/src/Platforms/C2000/UtestPlatform.cpp index 72c71f780..a4e6b5fc5 100644 --- a/src/Platforms/C2000/UtestPlatform.cpp +++ b/src/Platforms/C2000/UtestPlatform.cpp @@ -245,5 +245,6 @@ int (*PlatformSpecificRand)(void) = rand; void (*PlatformSpecificMutexLock)(PlatformSpecificMutex) = DummyMutexLock; void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex) = DummyMutexUnlock; void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex) = DummyMutexDestroy; +void (*PlatformSpecificAbort)(void) = abort; } diff --git a/src/Platforms/Dos/UtestPlatform.cpp b/src/Platforms/Dos/UtestPlatform.cpp index 460a4f72d..07aa969ba 100644 --- a/src/Platforms/Dos/UtestPlatform.cpp +++ b/src/Platforms/Dos/UtestPlatform.cpp @@ -234,4 +234,11 @@ void (*PlatformSpecificMutexLock)(PlatformSpecificMutex) = DummyMutexLock; void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex) = DummyMutexUnlock; void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex) = DummyMutexDestroy; +static void DosAbort() +{ + abort(); +} + +void (*PlatformSpecificAbort)(void) = DosAbort; + } diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 3a50c6ace..90df7bf0b 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -354,5 +354,6 @@ PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void) = PThreadMutexCreate; void (*PlatformSpecificMutexLock)(PlatformSpecificMutex) = PThreadMutexLock; void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex) = PThreadMutexUnlock; void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex) = PThreadMutexDestroy; +void (*PlatformSpecificAbort)(void) = abort; } diff --git a/src/Platforms/GccNoStdC/UtestPlatform.cpp b/src/Platforms/GccNoStdC/UtestPlatform.cpp index 6f0dfeaac..68413d195 100644 --- a/src/Platforms/GccNoStdC/UtestPlatform.cpp +++ b/src/Platforms/GccNoStdC/UtestPlatform.cpp @@ -80,3 +80,4 @@ void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex mtx) = NULLPTR; void (*PlatformSpecificSrand)(unsigned int) = NULLPTR; int (*PlatformSpecificRand)(void) = NULLPTR; +void (*PlatformSpecificAbort)(void) = NULLPTR; diff --git a/src/Platforms/Iar/UtestPlatform.cpp b/src/Platforms/Iar/UtestPlatform.cpp index 295b47f10..cf2e83eaf 100644 --- a/src/Platforms/Iar/UtestPlatform.cpp +++ b/src/Platforms/Iar/UtestPlatform.cpp @@ -202,4 +202,5 @@ void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex) = DummyMutexUnlock; void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex) = DummyMutexDestroy; void (*PlatformSpecificSrand)(unsigned int) = srand; int (*PlatformSpecificRand)(void) = rand; +void (*PlatformSpecificAbort)(void) = abort; } diff --git a/src/Platforms/Keil/UtestPlatform.cpp b/src/Platforms/Keil/UtestPlatform.cpp index da219847d..59fbae291 100644 --- a/src/Platforms/Keil/UtestPlatform.cpp +++ b/src/Platforms/Keil/UtestPlatform.cpp @@ -216,5 +216,6 @@ extern "C" void (*PlatformSpecificMutexLock)(PlatformSpecificMutex) = DummyMutexLock; void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex) = DummyMutexUnlock; void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex) = DummyMutexDestroy; + void (*PlatformSpecificAbort)(void) = abort; } diff --git a/src/Platforms/Symbian/UtestPlatform.cpp b/src/Platforms/Symbian/UtestPlatform.cpp index ad6ff4ee7..ff1d6b3aa 100644 --- a/src/Platforms/Symbian/UtestPlatform.cpp +++ b/src/Platforms/Symbian/UtestPlatform.cpp @@ -177,4 +177,5 @@ PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void) = DummyMutexCreate; void (*PlatformSpecificMutexLock)(PlatformSpecificMutex) = DummyMutexLock; void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex) = DummyMutexUnlock; void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex) = DummyMutexDestroy; +void (*PlatformSpecificAbort)(void) = abort; diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index 8c0677986..78b5fa5b4 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -231,3 +231,4 @@ PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void) = VisualCppMutexCreat void (*PlatformSpecificMutexLock)(PlatformSpecificMutex) = VisualCppMutexLock; void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex) = VisualCppMutexUnlock; void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex) = VisualCppMutexDestroy; +void (*PlatformSpecificAbort)(void) = abort; diff --git a/src/Platforms/armcc/UtestPlatform.cpp b/src/Platforms/armcc/UtestPlatform.cpp index 5796c0cfa..487ed67da 100644 --- a/src/Platforms/armcc/UtestPlatform.cpp +++ b/src/Platforms/armcc/UtestPlatform.cpp @@ -203,5 +203,6 @@ PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void) = DummyMutexCreate; void (*PlatformSpecificMutexLock)(PlatformSpecificMutex) = DummyMutexLock; void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex) = DummyMutexUnlock; void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex) = DummyMutexDestroy; +void (*PlatformSpecificAbort)(void) = abort; } From f4096966aaa2e5fc5c8779edab46c73491f5a35a Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 13 Nov 2022 17:07:31 -0800 Subject: [PATCH 0910/1093] Build without C standard lib --- .github/workflows/basic.yml | 4 ++++ include/CppUTest/CppUTestConfig.h | 10 ++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 50eb32d31..bae5cc383 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -130,6 +130,10 @@ jobs: os: ubuntu-latest cpp_version: 98 preset: no-rtti + - name: No C Standard Library + os: ubuntu-latest + cpp_version: 98 + preset: no-std-c - name: Coverage os: ubuntu-latest cpp_version: 11 diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 5b86db8a1..8e8e271cf 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -271,10 +271,12 @@ * CHAR_BIT is defined in limits.h (ANSI C), the user must provide a definition * when building without Std C library. */ -#if defined(CHAR_BIT) && !defined(CPPUTEST_CHAR_BIT) - #define CPPUTEST_CHAR_BIT CHAR_BIT -#else - #error "Provide a definition for CPPUTEST_CHAR_BIT" +#ifndef CPPUTEST_CHAR_BIT + #if defined(CHAR_BIT) + #define CPPUTEST_CHAR_BIT CHAR_BIT + #else + #error "Provide a definition for CPPUTEST_CHAR_BIT" + #endif #endif /* Handling of systems with a different int-width (e.g. 16 bit). From 791aaa6254b81697bd26ec1a15b2e006798a56f3 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 13 Nov 2022 18:32:40 -0800 Subject: [PATCH 0911/1093] I don't think we care which signal it was --- tests/CppUTest/UtestTest.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 018006528..5a338537f 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -400,8 +400,6 @@ TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) fixture.setRunTestsInSeperateProcess(); fixture.runAllTests(); fixture.assertPrintContains("Failed in separate process - killed by signal"); - - CHECK(fixture.getOutput().contains("signal 6")); } #endif From 4b53437730beb83f49150cebbe13076ac9ad90a4 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 6 Nov 2022 13:41:01 -0800 Subject: [PATCH 0912/1093] Remove test output "normalization" This is broken for multi-configuration generators. Debug and release builds, for example, need to output to different paths and run tests against those paths. The current implementation would overwrite one config's build with another and test that one, regardless of the config the user is trying to test. --- CMakeLists.txt | 2 -- .../Modules/CppUTestNormalizeTestOutputLocation.cmake | 10 ---------- tests/CppUTest/CMakeLists.txt | 4 ++-- tests/CppUTestExt/CMakeLists.txt | 4 ++-- 4 files changed, 4 insertions(+), 16 deletions(-) delete mode 100644 cmake/Modules/CppUTestNormalizeTestOutputLocation.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 536361681..39bd30edc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,8 +126,6 @@ include(CppUTestConfigurationOptions) if(PROJECT_IS_TOP_LEVEL) include(CppUTestWarningFlags) endif() -include(CppUTestBuildTimeDiscoverTests) -include(CppUTestNormalizeTestOutputLocation) include(GNUInstallDirs) # Check for symbols before setting a lot of stuff diff --git a/cmake/Modules/CppUTestNormalizeTestOutputLocation.cmake b/cmake/Modules/CppUTestNormalizeTestOutputLocation.cmake deleted file mode 100644 index acb5efb34..000000000 --- a/cmake/Modules/CppUTestNormalizeTestOutputLocation.cmake +++ /dev/null @@ -1,10 +0,0 @@ -# Override output properties to put test executable at specificied location -function (cpputest_normalize_test_output_location TEST_TARGET) - set_target_properties(${TEST_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - foreach(OUTPUT_CONFIG ${CMAKE_CONFIGURATION_TYPES}) - string(TOUPPER ${OUTPUT_CONFIG} OUTPUT_CONFIG) - set_target_properties(${TEST_TARGET} PROPERTIES - RUNTIME_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} ${CMAKE_CURRENT_BINARY_DIR}) - endforeach(OUTPUT_CONFIG) -endfunction () - diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 589382bae..c8736a305 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -44,7 +44,6 @@ if(MINGW OR (${CMAKE_HOST_SYSTEM_NAME} MATCHES "OpenBSD")) endif() endif() -cpputest_normalize_test_output_location(CppUTestTests) target_link_libraries(CppUTestTests PRIVATE ${CppUTestLibName}) if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") @@ -56,6 +55,7 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") ) endif() -if (CPPUTEST_TEST_DISCOVERY) +if(CPPUTEST_TEST_DISCOVERY) + include(CppUTestBuildTimeDiscoverTests) cpputest_buildtime_discover_tests(CppUTestTests) endif() diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index de02a222e..1534dce2b 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -37,7 +37,6 @@ if(MINGW) endif() endif() -cpputest_normalize_test_output_location(CppUTestExtTests) target_link_libraries(CppUTestExtTests PRIVATE ${CppUTestLibName} @@ -53,7 +52,8 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") ) endif() -if (CPPUTEST_TEST_DISCOVERY) +if(CPPUTEST_TEST_DISCOVERY) + include(CppUTestBuildTimeDiscoverTests) cpputest_buildtime_discover_tests(CppUTestExtTests # TestOrderedTestMacros must run together DETAILED FALSE From 64d8a0f594483a5dc65978a71df244158a46ba27 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 6 Nov 2022 13:59:33 -0800 Subject: [PATCH 0913/1093] Move private CMake out of public module path --- CMakeLists.txt | 4 ++-- .../CppUTestConfigurationOptions.cmake => gmock.cmake} | 0 cmake/{Modules/CppUTestWarningFlags.cmake => warnings.cmake} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename cmake/{Modules/CppUTestConfigurationOptions.cmake => gmock.cmake} (100%) rename cmake/{Modules/CppUTestWarningFlags.cmake => warnings.cmake} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 39bd30edc..2b555ce7f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -122,9 +122,9 @@ if(NOT PROJECT_IS_TOP_LEVEL) set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE) endif() -include(CppUTestConfigurationOptions) +include(cmake/gmock.cmake) if(PROJECT_IS_TOP_LEVEL) - include(CppUTestWarningFlags) + include(cmake/warnings.cmake) endif() include(GNUInstallDirs) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/gmock.cmake similarity index 100% rename from cmake/Modules/CppUTestConfigurationOptions.cmake rename to cmake/gmock.cmake diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/warnings.cmake similarity index 100% rename from cmake/Modules/CppUTestWarningFlags.cmake rename to cmake/warnings.cmake From 07d277600a51bc069a955cc81de26dd0e5abaec2 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 6 Nov 2022 14:02:39 -0800 Subject: [PATCH 0914/1093] Organize toolchains --- CMakePresets.json | 2 +- cmake/{ => Toolchains}/arm-none-eabi-gcc.toolchain.cmake | 0 cmake/{ => Toolchains}/clang+mingw-win32.toolchain.cmake | 0 cmake/{ => Toolchains}/clang+mingw-win64.toolchain.cmake | 0 cmake/{ => Toolchains}/ewarm-linux.toolchain.cmake | 2 +- cmake/{ => Toolchains}/ewarm-win.toolchain.cmake | 2 +- scripts/appveyor_ci_build.ps1 | 2 +- 7 files changed, 4 insertions(+), 4 deletions(-) rename cmake/{ => Toolchains}/arm-none-eabi-gcc.toolchain.cmake (100%) rename cmake/{ => Toolchains}/clang+mingw-win32.toolchain.cmake (100%) rename cmake/{ => Toolchains}/clang+mingw-win64.toolchain.cmake (100%) rename cmake/{ => Toolchains}/ewarm-linux.toolchain.cmake (93%) rename cmake/{ => Toolchains}/ewarm-win.toolchain.cmake (94%) diff --git a/CMakePresets.json b/CMakePresets.json index 33e7473de..c3ba4be6b 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -59,7 +59,7 @@ { "name": "arm-embedded", "inherits": ["defaults"], - "toolchainFile": "${sourceDir}/cmake/arm-none-eabi-gcc.toolchain.cmake", + "toolchainFile": "${sourceDir}/cmake/Toolchains/arm-none-eabi-gcc.toolchain.cmake", "cacheVariables": { "CMAKE_CROSSCOMPILING_EMULATOR": "qemu-arm-static;-cpu;cortex-m4" } diff --git a/cmake/arm-none-eabi-gcc.toolchain.cmake b/cmake/Toolchains/arm-none-eabi-gcc.toolchain.cmake similarity index 100% rename from cmake/arm-none-eabi-gcc.toolchain.cmake rename to cmake/Toolchains/arm-none-eabi-gcc.toolchain.cmake diff --git a/cmake/clang+mingw-win32.toolchain.cmake b/cmake/Toolchains/clang+mingw-win32.toolchain.cmake similarity index 100% rename from cmake/clang+mingw-win32.toolchain.cmake rename to cmake/Toolchains/clang+mingw-win32.toolchain.cmake diff --git a/cmake/clang+mingw-win64.toolchain.cmake b/cmake/Toolchains/clang+mingw-win64.toolchain.cmake similarity index 100% rename from cmake/clang+mingw-win64.toolchain.cmake rename to cmake/Toolchains/clang+mingw-win64.toolchain.cmake diff --git a/cmake/ewarm-linux.toolchain.cmake b/cmake/Toolchains/ewarm-linux.toolchain.cmake similarity index 93% rename from cmake/ewarm-linux.toolchain.cmake rename to cmake/Toolchains/ewarm-linux.toolchain.cmake index 5bd534718..e0053a7bf 100644 --- a/cmake/ewarm-linux.toolchain.cmake +++ b/cmake/Toolchains/ewarm-linux.toolchain.cmake @@ -16,6 +16,6 @@ set(CMAKE_C_COMPILER "${EW_ROOT_DIR}/bin/iccarm" "${CPU_FLAGS} --dlib_config nor set(CMAKE_CXX_COMPILER "${EW_ROOT_DIR}/bin/iccarm" "${CPU_FLAGS} --dlib_config normal") set(CMAKE_ASM_COMPILER "${EW_ROOT_DIR}/bin/iasmarm" "${CPU_FLAGS}") -# Build with cmake -S. -Bbuild -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=cmake/ewarm-linux.toolchain.cmake +# Build with cmake -S. -Bbuild -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/ewarm-linux.toolchain.cmake ### END CMAKE_TOOLCHAIN_FILE diff --git a/cmake/ewarm-win.toolchain.cmake b/cmake/Toolchains/ewarm-win.toolchain.cmake similarity index 94% rename from cmake/ewarm-win.toolchain.cmake rename to cmake/Toolchains/ewarm-win.toolchain.cmake index 178ad54f7..ab28b445f 100644 --- a/cmake/ewarm-win.toolchain.cmake +++ b/cmake/Toolchains/ewarm-win.toolchain.cmake @@ -16,6 +16,6 @@ set(CMAKE_C_COMPILER "${EW_ROOT_DIR}/bin/iccarm.exe" "${CPU_FLAGS} --dlib_config set(CMAKE_CXX_COMPILER "${EW_ROOT_DIR}/bin/iccarm.exe" "${CPU_FLAGS} --dlib_config normal") set(CMAKE_ASM_COMPILER "${EW_ROOT_DIR}/bin/iasmarm.exe" "${CPU_FLAGS}") -# Build with cmake -S. -Bbuild -G "NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE=cmake/ewarm-win.toolchain.cmake +# Build with cmake -S. -Bbuild -G "NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/ewarm-win.toolchain.cmake ### END CMAKE_TOOLCHAIN_FILE diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index aab43f03e..07d5e6f6f 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -76,7 +76,7 @@ switch -Wildcard ($env:Platform) if ($env:Platform -like 'MinGWClang*') { $toolchain_filename = Get-ClangToolchainFilename - $toolchain_path = (Join-Path (Split-Path $MyInvocation.MyCommand.Path) "..\cmake\$toolchain_filename") + $toolchain_path = (Join-Path (Split-Path $MyInvocation.MyCommand.Path) "..\cmake\Toolchains\$toolchain_filename") $toolchain = "-DCMAKE_TOOLCHAIN_FILE=$toolchain_path -DCPPUTEST_WERROR=OFF" } From abff03fe3f0aacd459be3c714b7774295b401bec Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 6 Nov 2022 14:17:57 -0800 Subject: [PATCH 0915/1093] Create new CppUTest CMake module --- cmake/Modules/CppUTest.cmake | 54 +++++++++++ .../CppUTestBuildTimeDiscoverTests.cmake | 4 + cmake/Modules/_CppUTestDiscovery.cmake | 94 +++++++++++++++++++ cmake/install.cmake | 5 +- examples/AllTests/CMakeLists.txt | 6 +- tests/CppUTest/CMakeLists.txt | 4 +- tests/CppUTestExt/CMakeLists.txt | 5 +- 7 files changed, 162 insertions(+), 10 deletions(-) create mode 100644 cmake/Modules/CppUTest.cmake create mode 100644 cmake/Modules/_CppUTestDiscovery.cmake diff --git a/cmake/Modules/CppUTest.cmake b/cmake/Modules/CppUTest.cmake new file mode 100644 index 000000000..7f1c7d5ad --- /dev/null +++ b/cmake/Modules/CppUTest.cmake @@ -0,0 +1,54 @@ +option(CPPUTEST_TESTS_DETAILED "Run discovered tests individually") + +function(cpputest_discover_tests target) + set(options) + set(oneValueArgs DETAILED) + set(multiValueArgs) + cmake_parse_arguments( + "" + "${options}" + "${oneValueArgs}" + "${multiValueArgs}" + ${ARGN} + ) + + # Validate arguments. + if(NOT TARGET ${target}) + message(FATAL_ERROR + "Cannot discover tests for target \"${target}\" " + "which is not built by this project." + ) + endif() + + get_property(target_type + TARGET ${target} + PROPERTY TYPE + ) + if(NOT target_type STREQUAL "EXECUTABLE") + message(FATAL_ERROR + "Cannot discover tests for target \"${target}\" " + "which is not an executable." + ) + endif() + + if(NOT DEFINED _DETAILED) + set(_DETAILED ${CPPUTEST_TESTS_DETAILED}) + endif() + + add_custom_command( + TARGET ${target} POST_BUILD + BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/CTestTestfile.cmake" + COMMAND + "${CMAKE_COMMAND}" + -D "TESTS_DETAILED:BOOL=${_DETAILED}" + -D "EXECUTABLE=$" + -D "EMULATOR=$" + -P "${_CPPUTEST_DISCOVERY_SCRIPT}" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + VERBATIM + ) +endfunction() + +set(_CPPUTEST_DISCOVERY_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/_CppUTestDiscovery.cmake + CACHE INTERNAL "CppUTest discovery scripts" +) diff --git a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake index bf852f454..cfffad56c 100644 --- a/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake +++ b/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake @@ -4,6 +4,10 @@ set(_DISCOVER_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/../Scripts/CppUTestBuildTimeDisc # Create target to discover tests function (cpputest_buildtime_discover_tests tgt) + message(DEPRECATION + "Use cpputest_discover_tests from the CppUTest module instead" + ) + set(options) set(oneValueArgs DETAILED) set(multiValueArgs) diff --git a/cmake/Modules/_CppUTestDiscovery.cmake b/cmake/Modules/_CppUTestDiscovery.cmake new file mode 100644 index 000000000..c5d96c031 --- /dev/null +++ b/cmake/Modules/_CppUTestDiscovery.cmake @@ -0,0 +1,94 @@ +# Create CTest entries for EXECUTABLE in CTestTestfile.cmake +# Overwrite CTestTestfile.cmake with update version. + +# Usage: +# +# This script is to be called from ../Modules/CppUTestBuildTimeDiscoverTests.cmake +# +# Notes on invocation and used variables: +# ${CMAKE_COMMAND} -DTESTS_DETAILED:BOOL= -DEXECUTABLE= -P +# +# TESTS_DETAILED c.f. top-level CMakeLists.txt +# FULLPATH-TO-EXECUTABLE - use $ or explicit +# The overwritten CTestTestfile.cmake is located in ${CMAKE_CURRENT_BINARY_DIR} +# +# Steps to generate ADD_TEST() commands build time +# - Read CTestTestfile.cmake +# - Create update entries +# - Remove duplicate entries +# - Write new CTestTestfile.cmake + +###################################################################### +# helpers +###################################################################### +function (buildtime_add_test) + # Create ADD_TEST() command string + # - Extract and remove testname from ARGV + # - Add inner quotes to test arguments + # - Add "ADD_TEST()", and first and last quote + # Append result to CTESTTESTS + list(GET ARGV 0 testname) + list(REMOVE_AT ARGV 0) + string (REPLACE ";" "\" \"" TEST_ARGS "${ARGV}") + set(test_to_add "ADD_TEST(${testname} \"${TEST_ARGS}\")") + list(APPEND CTESTTESTS ${test_to_add}) + SET(CTESTTESTS ${CTESTTESTS} PARENT_SCOPE) +endfunction() + +function (JOIN VALUES GLUE OUTPUT) + string (REPLACE ";" "${GLUE}" _TMP_STR "${VALUES}") + set (${OUTPUT} "${_TMP_STR}" PARENT_SCOPE) +endfunction() + +function (buildtime_discover_tests EXECUTABLE DISCOVER_ARG OUTPUT) + execute_process(COMMAND ${EMULATOR} ${EXECUTABLE} ${DISCOVER_ARG} + OUTPUT_VARIABLE _TMP_OUTPUT + ERROR_VARIABLE DISCOVER_ERR + RESULT_VARIABLE DISCOVER_ERR) + if(NOT ${DISCOVER_ERR} EQUAL 0) + message(SEND_ERROR "Executable \"${EXECUTABLE} ${DISCOVER_ARG}\" failed with output:\n" + "${DISCOVER_ERR}\n" + "Please check that the excutable was added.") + endif(NOT ${DISCOVER_ERR} EQUAL 0) + separate_arguments(_TMP_OUTPUT) + set(${OUTPUT} "${_TMP_OUTPUT}" PARENT_SCOPE) +endfunction() + + +###################################################################### +# Implementation +###################################################################### + +set(CTESTFNAME "${CMAKE_CURRENT_BINARY_DIR}/CTestTestfile.cmake") +file(STRINGS ${CTESTFNAME} CTESTTESTS) +get_filename_component(EXECUTABLE_SHORT_NAME ${EXECUTABLE} NAME_WE) + +if (TESTS_DETAILED) + set(DISCOVER_ARG "-ln") + buildtime_discover_tests("${EXECUTABLE}" "${DISCOVER_ARG}" TestList_GroupsAndNames) + set(lastgroup "") + foreach(testfullname ${TestList_GroupsAndNames}) + string(REGEX MATCH "^([^/.]+)" groupname ${testfullname}) + string(REGEX MATCH "([^/.]+)$" testname ${testfullname}) + if (NOT ("${groupname}" STREQUAL "${lastgroup}")) + message("TestGroup: ${groupname}:") + set(lastgroup "${groupname}") + endif (NOT ("${groupname}" STREQUAL "${lastgroup}")) + message("... ${testname}") + buildtime_add_test(${EXECUTABLE_SHORT_NAME}.${testfullname} ${EMULATOR} ${EXECUTABLE} -sg ${groupname} -sn ${testname}) + endforeach() +else (TESTS_DETAILED) + set(DISCOVER_ARG "-lg") + buildtime_discover_tests("${EXECUTABLE}" "${DISCOVER_ARG}" TestList_Groups) + foreach(group ${TestList_Groups}) + message("TestGroup: ${group}") + buildtime_add_test(${EXECUTABLE_SHORT_NAME}.${group} ${EMULATOR} "${EXECUTABLE}" -sg ${group}) + endforeach() +endif (TESTS_DETAILED) + + +# create separate CTest test for each CppUTestTests test + +list(REMOVE_DUPLICATES CTESTTESTS) +JOIN("${CTESTTESTS}" "\n" CTESTTESTS) +file(WRITE ${CTESTFNAME} "${CTESTTESTS}\n") diff --git a/cmake/install.cmake b/cmake/install.cmake index 0ce77d6b5..df8bee04d 100644 --- a/cmake/install.cmake +++ b/cmake/install.cmake @@ -63,7 +63,10 @@ install( DESTINATION "${CPPUTEST_CONFIG_DEST}/Scripts" ) install( - FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/CppUTest.cmake + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/_CppUTestDiscovery.cmake DESTINATION "${CPPUTEST_CONFIG_DEST}/Modules" ) configure_package_config_file(CppUTestConfig.cmake.build.in diff --git a/examples/AllTests/CMakeLists.txt b/examples/AllTests/CMakeLists.txt index f4693e90b..241b563bf 100644 --- a/examples/AllTests/CMakeLists.txt +++ b/examples/AllTests/CMakeLists.txt @@ -23,9 +23,7 @@ target_link_libraries(ExampleTests CppUTest::CppUTestExt ) -include(CppUTestBuildTimeDiscoverTests) if(CPPUTEST_TEST_DISCOVERY OR NOT DEFINED CPPUTEST_TEST_DISCOVERY) - cpputest_buildtime_discover_tests(ExampleTests - DETAILED TRUE - ) + include(CppUTest) + cpputest_discover_tests(ExampleTests) endif() diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index c8736a305..ee3139b35 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -56,6 +56,6 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") endif() if(CPPUTEST_TEST_DISCOVERY) - include(CppUTestBuildTimeDiscoverTests) - cpputest_buildtime_discover_tests(CppUTestTests) + include(CppUTest) + cpputest_discover_tests(CppUTestTests) endif() diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 1534dce2b..dedd8530d 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -53,9 +53,8 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") endif() if(CPPUTEST_TEST_DISCOVERY) - include(CppUTestBuildTimeDiscoverTests) - cpputest_buildtime_discover_tests(CppUTestExtTests - # TestOrderedTestMacros must run together + include(CppUTest) + cpputest_discover_tests(CppUTestExtTests DETAILED FALSE ) endif() From 8de69b71612c2510c672a452de3d468ca5257459 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 6 Nov 2022 14:39:17 -0800 Subject: [PATCH 0916/1093] Silence discovery output --- cmake/Modules/_CppUTestDiscovery.cmake | 3 --- 1 file changed, 3 deletions(-) diff --git a/cmake/Modules/_CppUTestDiscovery.cmake b/cmake/Modules/_CppUTestDiscovery.cmake index c5d96c031..8749bb63c 100644 --- a/cmake/Modules/_CppUTestDiscovery.cmake +++ b/cmake/Modules/_CppUTestDiscovery.cmake @@ -71,17 +71,14 @@ if (TESTS_DETAILED) string(REGEX MATCH "^([^/.]+)" groupname ${testfullname}) string(REGEX MATCH "([^/.]+)$" testname ${testfullname}) if (NOT ("${groupname}" STREQUAL "${lastgroup}")) - message("TestGroup: ${groupname}:") set(lastgroup "${groupname}") endif (NOT ("${groupname}" STREQUAL "${lastgroup}")) - message("... ${testname}") buildtime_add_test(${EXECUTABLE_SHORT_NAME}.${testfullname} ${EMULATOR} ${EXECUTABLE} -sg ${groupname} -sn ${testname}) endforeach() else (TESTS_DETAILED) set(DISCOVER_ARG "-lg") buildtime_discover_tests("${EXECUTABLE}" "${DISCOVER_ARG}" TestList_Groups) foreach(group ${TestList_Groups}) - message("TestGroup: ${group}") buildtime_add_test(${EXECUTABLE_SHORT_NAME}.${group} ${EMULATOR} "${EXECUTABLE}" -sg ${group}) endforeach() endif (TESTS_DETAILED) From dc30de2260d04b8724b2b1a3a5352af91c004d31 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 13 Nov 2022 15:00:21 -0800 Subject: [PATCH 0917/1093] Decouple C++ standard library and exception support Like RTTI, the exceptions can be disabled independently of the C++ standard library. It is common to disable both RTTI and exceptions while continuing to use remaining supported parts of the standard library in space or time constrained embedded systems. --- .github/workflows/basic.yml | 4 ++ CMakeLists.txt | 8 +-- CMakePresets.json | 12 +++- include/CppUTest/CppUTestConfig.h | 16 +++++ include/CppUTest/TestFailure.h | 4 +- include/CppUTest/UtestMacros.h | 4 +- src/CppUTest/MemoryLeakWarningPlugin.cpp | 6 +- src/CppUTest/TestFailure.cpp | 4 +- src/CppUTest/Utest.cpp | 12 ++-- tests/CppUTest/AllocationInCppFile.cpp | 2 +- tests/CppUTest/AllocationInCppFile.h | 2 +- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 18 +++-- tests/CppUTest/TestFailureTest.cpp | 6 +- tests/CppUTest/TestUTestMacro.cpp | 2 +- tests/CppUTest/UtestTest.cpp | 66 ++++++++++--------- 15 files changed, 106 insertions(+), 60 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index f63616900..146591e70 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -130,6 +130,10 @@ jobs: os: ubuntu-latest cpp_version: 98 preset: no-rtti + - name: No Exceptions + os: ubuntu-latest + cpp_version: 98 + preset: no-exceptions - name: No C Standard Library os: ubuntu-latest cpp_version: 98 diff --git a/CMakeLists.txt b/CMakeLists.txt index 536361681..7e8c76b9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,18 +29,12 @@ include(CTest) include(CMakeDependentOption) option(CPPUTEST_STD_C_LIB_DISABLED "Disable the standard C library") -include(CheckCXXSourceCompiles) -check_cxx_source_compiles( - "int main(int argc, char ** argv) { throw 20; }" - CPPUTEST_HAVE_EXCEPTIONS -) - if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND (CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")) set(is_clang_cl TRUE) endif() cmake_dependent_option(CPPUTEST_STD_CPP_LIB_DISABLED "Use the standard C++ library" - OFF "NOT CPPUTEST_STD_C_LIB_DISABLED;CPPUTEST_HAVE_EXCEPTIONS" ON) + OFF "NOT CPPUTEST_STD_C_LIB_DISABLED" ON) option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ${PROJECT_IS_TOP_LEVEL}) cmake_dependent_option(CPPUTEST_MEM_LEAK_DETECTION_DISABLED "Enable memory leak detection" OFF "CPPUTEST_FLAGS;NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED;NOT is_clang_cl" ON) diff --git a/CMakePresets.json b/CMakePresets.json index 33e7473de..0ca5f0d8f 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -81,7 +81,10 @@ "name": "no-std-cpp", "inherits": ["GNU"], "environment": { - "CXXFLAGS": "-Werror -fno-exceptions -nostdinc++" + "CXXFLAGS": "-Werror -nostdinc++" + }, + "cacheVariables": { + "CPPUTEST_STD_CPP_LIB_DISABLED": true } }, { @@ -91,6 +94,13 @@ "CXXFLAGS": "-Werror -fno-rtti" } }, + { + "name": "no-exceptions", + "inherits": ["GNU"], + "environment": { + "CXXFLAGS": "-Werror -fno-exceptions" + } + }, { "name": "no-std-c", "inherits": ["GNU"], diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 8e8e271cf..e9678dd1d 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -254,6 +254,22 @@ #define CPPUTEST_HAVE_RTTI 1 #endif #endif + + /* + * Detection of exception support. Since it's a standard language feature, + * assume it is enabled unless we see otherwise. + */ + #ifndef CPPUTEST_HAVE_EXCEPTIONS + #if ((__cplusplus >= 202002L) && !__cpp_exceptions) || \ + (defined(_MSC_VER) && !_CPPUNWIND) || \ + (defined(__GNUC__) && !__EXCEPTIONS) || \ + (defined(__ghs__) && !__EXCEPTION_HANDLING) || \ + (defined(__WATCOMC__) && !_CPPUNWIND) + #define CPPUTEST_HAVE_EXCEPTIONS 0 + #else + #define CPPUTEST_HAVE_EXCEPTIONS 1 + #endif + #endif #endif /* diff --git a/include/CppUTest/TestFailure.h b/include/CppUTest/TestFailure.h index 2752d545f..27e96c824 100644 --- a/include/CppUTest/TestFailure.h +++ b/include/CppUTest/TestFailure.h @@ -186,12 +186,14 @@ class FeatureUnsupportedFailure : public TestFailure FeatureUnsupportedFailure(UtestShell* test, const char* fileName, size_t lineNumber, const SimpleString& featureName, const SimpleString& text); }; -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS class UnexpectedExceptionFailure : public TestFailure { public: UnexpectedExceptionFailure(UtestShell* test); +#if CPPUTEST_USE_STD_CPP_LIB UnexpectedExceptionFailure(UtestShell* test, const std::exception &e); +#endif }; #endif diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index b591a55a1..85b2422a5 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -363,7 +363,7 @@ #define UT_PRINT(text) \ UT_PRINT_LOCATION(text, __FILE__, __LINE__) -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS #define CHECK_THROWS(expected, expression) \ do { \ SimpleString failure_msg("expected to throw "#expected "\nbut threw nothing"); \ @@ -382,7 +382,7 @@ UtestShell::getCurrent()->countCheck(); \ } \ } while(0) -#endif /* CPPUTEST_USE_STD_CPP_LIB */ +#endif /* CPPUTEST_HAVE_EXCEPTIONS */ #define UT_CRASH() do { UtestShell::crash(); } while(0) #define RUN_ALL_TESTS(ac, av) CommandLineTestRunner::RunAllTests(ac, av) diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 7d21c9595..3b288caa3 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -130,10 +130,12 @@ void cpputest_free_location_with_leak_detection(void* buffer, const char* file, #if CPPUTEST_USE_MEM_LEAK_DETECTION #undef new -#if CPPUTEST_USE_STD_CPP_LIB +#if !CPPUTEST_HAVE_EXCEPTIONS +#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) +#elif CPPUTEST_USE_STD_CPP_LIB #define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) if (memory == NULLPTR) throw std::bad_alloc() #else -#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) +#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) if (memory == NULLPTR) throw 7 #endif static void* threadsafe_mem_leak_operator_new (size_t size) UT_THROW(std::bad_alloc) diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index 299fd1541..cdd943c79 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -387,12 +387,13 @@ FeatureUnsupportedFailure::FeatureUnsupportedFailure(UtestShell* test, const cha message_ += StringFromFormat("The feature \"%s\" is not supported in this environment or with the feature set selected when building the library.", featureName.asCharString()); } -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test) : TestFailure(test, "Unexpected exception of unknown type was thrown.") { } +#if CPPUTEST_USE_STD_CPP_LIB #if CPPUTEST_HAVE_RTTI static SimpleString getExceptionTypeName(const std::exception &e) { @@ -427,3 +428,4 @@ UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test, const s { } #endif // CPPUTEST_USE_STD_CPP_LIB +#endif // CPPUTEST_HAVE_EXCEPTIONS diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 485e1596d..5821468ec 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -216,7 +216,7 @@ void UtestShell::runOneTestInCurrentProcess(TestPlugin* plugin, TestResult& resu Utest* testToRun = NULLPTR; -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS try { #endif @@ -230,7 +230,7 @@ void UtestShell::runOneTestInCurrentProcess(TestPlugin* plugin, TestResult& resu UtestShell::setCurrentTest(savedTest); UtestShell::setTestResult(savedResult); -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS } catch(...) { @@ -639,7 +639,7 @@ Utest::~Utest() { } -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS void Utest::run() { @@ -660,6 +660,7 @@ void Utest::run() { PlatformSpecificRestoreJumpBuffer(); } +#if CPPUTEST_USE_STD_CPP_LIB catch (const std::exception &e) { current->addFailure(UnexpectedExceptionFailure(current, e)); @@ -669,6 +670,7 @@ void Utest::run() throw; } } +#endif catch (...) { current->addFailure(UnexpectedExceptionFailure(current)); @@ -688,6 +690,7 @@ void Utest::run() { PlatformSpecificRestoreJumpBuffer(); } +#if CPPUTEST_USE_STD_CPP_LIB catch (const std::exception &e) { current->addFailure(UnexpectedExceptionFailure(current, e)); @@ -697,6 +700,7 @@ void Utest::run() throw; } } +#endif catch (...) { current->addFailure(UnexpectedExceptionFailure(current)); @@ -740,7 +744,7 @@ TestTerminator::~TestTerminator() void NormalTestTerminator::exitCurrentTest() const { - #if CPPUTEST_USE_STD_CPP_LIB + #if CPPUTEST_HAVE_EXCEPTIONS throw CppUTestFailedException(); #else TestTerminatorWithoutExceptions().exitCurrentTest(); diff --git a/tests/CppUTest/AllocationInCppFile.cpp b/tests/CppUTest/AllocationInCppFile.cpp index d85e66bb5..b1a662b1c 100644 --- a/tests/CppUTest/AllocationInCppFile.cpp +++ b/tests/CppUTest/AllocationInCppFile.cpp @@ -27,7 +27,7 @@ char* newArrayAllocationWithoutMacro() return new char[100]; } -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS ClassThatThrowsAnExceptionInTheConstructor::ClassThatThrowsAnExceptionInTheConstructor() { diff --git a/tests/CppUTest/AllocationInCppFile.h b/tests/CppUTest/AllocationInCppFile.h index 6246cf13e..c7c9d1572 100644 --- a/tests/CppUTest/AllocationInCppFile.h +++ b/tests/CppUTest/AllocationInCppFile.h @@ -7,7 +7,7 @@ char* newArrayAllocation(); char* newAllocationWithoutMacro(); char* newArrayAllocationWithoutMacro(); -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS class ClassThatThrowsAnExceptionInTheConstructor { diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index cb725402a..002ac83c3 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -419,16 +419,22 @@ TEST_GROUP(OutOfMemoryTestsForOperatorNew) #if CPPUTEST_USE_MEM_LEAK_DETECTION +#if CPPUTEST_HAVE_EXCEPTIONS + #if CPPUTEST_USE_STD_CPP_LIB +#define BAD_ALLOC std::bad_alloc +#else +#define BAD_ALLOC int +#endif TEST(OutOfMemoryTestsForOperatorNew, FailingNewOperatorThrowsAnExceptionWhenUsingStdCppNew) { - CHECK_THROWS(std::bad_alloc, new char); + CHECK_THROWS(BAD_ALLOC, new char); } TEST(OutOfMemoryTestsForOperatorNew, FailingNewArrayOperatorThrowsAnExceptionWhenUsingStdCppNew) { - CHECK_THROWS(std::bad_alloc, new char[10]); + CHECK_THROWS(BAD_ALLOC, new char[10]); } TEST_GROUP(TestForExceptionsInConstructor) @@ -461,7 +467,7 @@ TEST(OutOfMemoryTestsForOperatorNew, FailingNewArrayOperatorReturnsNull) #undef new -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS /* @@ -500,14 +506,15 @@ char* some_memory; TEST(OutOfMemoryTestsForOperatorNew, FailingNewOperatorThrowsAnExceptionWhenUsingStdCppNewWithoutOverride) { - CHECK_THROWS(std::bad_alloc, some_memory = new char); + CHECK_THROWS(BAD_ALLOC, some_memory = new char); } TEST(OutOfMemoryTestsForOperatorNew, FailingNewArrayOperatorThrowsAnExceptionWhenUsingStdCppNewWithoutOverride) { - CHECK_THROWS(std::bad_alloc, some_memory = new char[10]); + CHECK_THROWS(BAD_ALLOC, some_memory = new char[10]); } +#if CPPUTEST_USE_STD_CPP_LIB TEST(OutOfMemoryTestsForOperatorNew, FailingNewOperatorReturnsNullWithoutOverride) { POINTERS_EQUAL(NULLPTR, new (std::nothrow) char); @@ -517,6 +524,7 @@ TEST(OutOfMemoryTestsForOperatorNew, FailingNewArrayOperatorReturnsNullWithoutOv { POINTERS_EQUAL(NULLPTR, new (std::nothrow) char[10]); } +#endif #else diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index 818ac90e1..55860ba77 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -427,13 +427,15 @@ TEST(TestFailure, FeatureUnsupported) FAILURE_EQUAL("The feature \"SOME_FEATURE\" is not supported in this environment or with the feature set selected when building the library.", f); } -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS TEST(TestFailure, UnexpectedExceptionFailure_UnknownException) { UnexpectedExceptionFailure f(test); FAILURE_EQUAL("Unexpected exception of unknown type was thrown.", f); } +#endif +#if CPPUTEST_HAVE_EXCEPTIONS && CPPUTEST_USE_STD_CPP_LIB TEST(TestFailure, UnexpectedExceptionFailure_StandardException) { std::runtime_error e("Some error"); @@ -446,4 +448,4 @@ TEST(TestFailure, UnexpectedExceptionFailure_StandardException) FAILURE_EQUAL("Unexpected exception of unknown type was thrown.", f); #endif } -#endif // CPPUTEST_USE_STD_CPP_LIB +#endif diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index 165f240fd..c78d83ae1 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -1318,7 +1318,7 @@ IGNORE_TEST(UnitTestMacros, ENUMS_EQUAL_EQUAL_INT_TEXTWithUnscopedEnumWorksInAnI ENUMS_EQUAL_INT_TEXT(UNSCOPED_ENUM_B, UNSCOPED_ENUM_A, "Failed because it failed"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS static void failingTestMethod_NoThrowWithCHECK_THROWS_() { CHECK_THROWS(int, (void) (1+2)); diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 5a338537f..5a961c891 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -217,7 +217,7 @@ TEST(UtestShell, TestStopsAfterSetupFailure) LONGS_EQUAL(0, stopAfterFailure); } -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS // Prevents -Wunreachable-code; should always be 'true' static bool shouldThrowException = true; @@ -231,15 +231,6 @@ static void thrownUnknownExceptionMethod_() stopAfterFailure++; } -static void thrownStandardExceptionMethod_() -{ - if (shouldThrowException) - { - throw std::runtime_error("exception text"); - } - stopAfterFailure++; -} - TEST(UtestShell, TestStopsAfterUnknownExceptionIsThrown) { bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); @@ -254,26 +245,6 @@ TEST(UtestShell, TestStopsAfterUnknownExceptionIsThrown) UtestShell::setRethrowExceptions(initialRethrowExceptions); } -TEST(UtestShell, TestStopsAfterStandardExceptionIsThrown) -{ - bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); - UtestShell::setRethrowExceptions(false); - stopAfterFailure = 0; - shouldThrowException = true; - fixture.setTestFunction(thrownStandardExceptionMethod_); - fixture.runAllTests(); - LONGS_EQUAL(1, fixture.getFailureCount()); -#if CPPUTEST_HAVE_RTTI - fixture.assertPrintContains("Unexpected exception of type '"); - fixture.assertPrintContains("runtime_error"); - fixture.assertPrintContains("' was thrown: exception text"); -#else - fixture.assertPrintContains("Unexpected exception of unknown type was thrown"); -#endif - LONGS_EQUAL(0, stopAfterFailure); - UtestShell::setRethrowExceptions(initialRethrowExceptions); -} - TEST(UtestShell, NoExceptionIsRethrownIfEnabledButNotThrown) { bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); @@ -320,6 +291,36 @@ TEST(UtestShell, UnknownExceptionIsRethrownIfEnabled) UtestShell::setRethrowExceptions(initialRethrowExceptions); } +#if CPPUTEST_USE_STD_CPP_LIB +static void thrownStandardExceptionMethod_() +{ + if (shouldThrowException) + { + throw std::runtime_error("exception text"); + } + stopAfterFailure++; +} + +TEST(UtestShell, TestStopsAfterStandardExceptionIsThrown) +{ + bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); + UtestShell::setRethrowExceptions(false); + stopAfterFailure = 0; + shouldThrowException = true; + fixture.setTestFunction(thrownStandardExceptionMethod_); + fixture.runAllTests(); + LONGS_EQUAL(1, fixture.getFailureCount()); +#if CPPUTEST_HAVE_RTTI + fixture.assertPrintContains("Unexpected exception of type '"); + fixture.assertPrintContains("runtime_error"); + fixture.assertPrintContains("' was thrown: exception text"); +#else + fixture.assertPrintContains("Unexpected exception of unknown type was thrown"); +#endif + LONGS_EQUAL(0, stopAfterFailure); + UtestShell::setRethrowExceptions(initialRethrowExceptions); +} + TEST(UtestShell, StandardExceptionIsRethrownIfEnabled) { bool initialRethrowExceptions = UtestShell::isRethrowingExceptions(); @@ -345,7 +346,8 @@ TEST(UtestShell, StandardExceptionIsRethrownIfEnabled) LONGS_EQUAL(0, stopAfterFailure); UtestShell::setRethrowExceptions(initialRethrowExceptions); } -#endif +#endif // CPPUTEST_USE_STD_CPP_LIB +#endif // CPPUTEST_HAVE_EXCEPTIONS TEST(UtestShell, veryVebose) { @@ -406,7 +408,7 @@ TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) #endif -#if CPPUTEST_USE_STD_CPP_LIB +#if CPPUTEST_HAVE_EXCEPTIONS static bool destructorWasCalledOnFailedTest = false; From ed954d8a897a931d1807b2c921258bccc53e238e Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 6 Nov 2022 15:30:36 -0800 Subject: [PATCH 0918/1093] Rewrite discovery script --- cmake/Modules/CppUTest.cmake | 5 +- cmake/Modules/_CppUTestDiscovery.cmake | 143 ++++++++++--------------- 2 files changed, 58 insertions(+), 90 deletions(-) diff --git a/cmake/Modules/CppUTest.cmake b/cmake/Modules/CppUTest.cmake index 7f1c7d5ad..fdb164f78 100644 --- a/cmake/Modules/CppUTest.cmake +++ b/cmake/Modules/CppUTest.cmake @@ -35,14 +35,17 @@ function(cpputest_discover_tests target) set(_DETAILED ${CPPUTEST_TESTS_DETAILED}) endif() + set(CTEST_FILE "${CMAKE_CURRENT_BINARY_DIR}/CTestTestfile.cmake") + add_custom_command( TARGET ${target} POST_BUILD - BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/CTestTestfile.cmake" + BYPRODUCTS "${CTEST_FILE}" COMMAND "${CMAKE_COMMAND}" -D "TESTS_DETAILED:BOOL=${_DETAILED}" -D "EXECUTABLE=$" -D "EMULATOR=$" + -D "CTEST_FILE=${CTEST_FILE}" -P "${_CPPUTEST_DISCOVERY_SCRIPT}" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" VERBATIM diff --git a/cmake/Modules/_CppUTestDiscovery.cmake b/cmake/Modules/_CppUTestDiscovery.cmake index 8749bb63c..e712ffd14 100644 --- a/cmake/Modules/_CppUTestDiscovery.cmake +++ b/cmake/Modules/_CppUTestDiscovery.cmake @@ -1,91 +1,56 @@ -# Create CTest entries for EXECUTABLE in CTestTestfile.cmake -# Overwrite CTestTestfile.cmake with update version. - -# Usage: -# -# This script is to be called from ../Modules/CppUTestBuildTimeDiscoverTests.cmake -# -# Notes on invocation and used variables: -# ${CMAKE_COMMAND} -DTESTS_DETAILED:BOOL= -DEXECUTABLE= -P -# -# TESTS_DETAILED c.f. top-level CMakeLists.txt -# FULLPATH-TO-EXECUTABLE - use $ or explicit -# The overwritten CTestTestfile.cmake is located in ${CMAKE_CURRENT_BINARY_DIR} -# -# Steps to generate ADD_TEST() commands build time -# - Read CTestTestfile.cmake -# - Create update entries -# - Remove duplicate entries -# - Write new CTestTestfile.cmake - -###################################################################### -# helpers -###################################################################### -function (buildtime_add_test) - # Create ADD_TEST() command string - # - Extract and remove testname from ARGV - # - Add inner quotes to test arguments - # - Add "ADD_TEST()", and first and last quote - # Append result to CTESTTESTS - list(GET ARGV 0 testname) - list(REMOVE_AT ARGV 0) - string (REPLACE ";" "\" \"" TEST_ARGS "${ARGV}") - set(test_to_add "ADD_TEST(${testname} \"${TEST_ARGS}\")") - list(APPEND CTESTTESTS ${test_to_add}) - SET(CTESTTESTS ${CTESTTESTS} PARENT_SCOPE) -endfunction() - -function (JOIN VALUES GLUE OUTPUT) - string (REPLACE ";" "${GLUE}" _TMP_STR "${VALUES}") - set (${OUTPUT} "${_TMP_STR}" PARENT_SCOPE) -endfunction() - -function (buildtime_discover_tests EXECUTABLE DISCOVER_ARG OUTPUT) - execute_process(COMMAND ${EMULATOR} ${EXECUTABLE} ${DISCOVER_ARG} - OUTPUT_VARIABLE _TMP_OUTPUT - ERROR_VARIABLE DISCOVER_ERR - RESULT_VARIABLE DISCOVER_ERR) - if(NOT ${DISCOVER_ERR} EQUAL 0) - message(SEND_ERROR "Executable \"${EXECUTABLE} ${DISCOVER_ARG}\" failed with output:\n" - "${DISCOVER_ERR}\n" - "Please check that the excutable was added.") - endif(NOT ${DISCOVER_ERR} EQUAL 0) - separate_arguments(_TMP_OUTPUT) - set(${OUTPUT} "${_TMP_OUTPUT}" PARENT_SCOPE) +set(script) + +function(add_command NAME) + set(_args "") + # use ARGV* instead of ARGN, because ARGN splits arrays into multiple arguments + math(EXPR _last_arg ${ARGC}-1) + foreach(_n RANGE 1 ${_last_arg}) + set(_arg "${ARGV${_n}}") + if(_arg MATCHES "[^-./:a-zA-Z0-9_]") + set(_args "${_args} [==[${_arg}]==]") # form a bracket_argument + else() + set(_args "${_args} ${_arg}") + endif() + endforeach() + set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE) endfunction() - -###################################################################### -# Implementation -###################################################################### - -set(CTESTFNAME "${CMAKE_CURRENT_BINARY_DIR}/CTestTestfile.cmake") -file(STRINGS ${CTESTFNAME} CTESTTESTS) -get_filename_component(EXECUTABLE_SHORT_NAME ${EXECUTABLE} NAME_WE) - -if (TESTS_DETAILED) - set(DISCOVER_ARG "-ln") - buildtime_discover_tests("${EXECUTABLE}" "${DISCOVER_ARG}" TestList_GroupsAndNames) - set(lastgroup "") - foreach(testfullname ${TestList_GroupsAndNames}) - string(REGEX MATCH "^([^/.]+)" groupname ${testfullname}) - string(REGEX MATCH "([^/.]+)$" testname ${testfullname}) - if (NOT ("${groupname}" STREQUAL "${lastgroup}")) - set(lastgroup "${groupname}") - endif (NOT ("${groupname}" STREQUAL "${lastgroup}")) - buildtime_add_test(${EXECUTABLE_SHORT_NAME}.${testfullname} ${EMULATOR} ${EXECUTABLE} -sg ${groupname} -sn ${testname}) - endforeach() -else (TESTS_DETAILED) - set(DISCOVER_ARG "-lg") - buildtime_discover_tests("${EXECUTABLE}" "${DISCOVER_ARG}" TestList_Groups) - foreach(group ${TestList_Groups}) - buildtime_add_test(${EXECUTABLE_SHORT_NAME}.${group} ${EMULATOR} "${EXECUTABLE}" -sg ${group}) - endforeach() -endif (TESTS_DETAILED) - - -# create separate CTest test for each CppUTestTests test - -list(REMOVE_DUPLICATES CTESTTESTS) -JOIN("${CTESTTESTS}" "\n" CTESTTESTS) -file(WRITE ${CTESTFNAME} "${CTESTTESTS}\n") +if(NOT EXISTS "${EXECUTABLE}") + message(FATAL_ERROR + "Executable \"${EXECUTABLE}\" does not exist" + ) +endif() + +if(TESTS_DETAILED) + set(discovery_arg "-ln") + set(select_arg "-st") +else() + set(discovery_arg "-lg") + set(select_arg "-sg") +endif() + +execute_process( + COMMAND ${EMULATOR} "${EXECUTABLE}" ${discovery_arg} + OUTPUT_VARIABLE output + RESULT_VARIABLE result + ERROR_VARIABLE error +) +if(NOT ${result} EQUAL 0) + message(FATAL_ERROR + "Error executing ${EXECUTABLE}:\n" + "${error}" + ) +endif() +separate_arguments(output) +foreach(test IN LISTS output) + add_command( + add_test + "${test}" + ${EMULATOR} + "${EXECUTABLE}" + ${select_arg} + ${test} + ) +endforeach() + +file(WRITE "${CTEST_FILE}" "${script}") From 1ed5e67cfdf347f7f56d8aa4fd635bb1efa75463 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 6 Nov 2022 16:12:42 -0800 Subject: [PATCH 0919/1093] Support multiple calls to cpputest_discover_tests --- cmake/Modules/CppUTest.cmake | 39 +++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/cmake/Modules/CppUTest.cmake b/cmake/Modules/CppUTest.cmake index fdb164f78..bcfc8308f 100644 --- a/cmake/Modules/CppUTest.cmake +++ b/cmake/Modules/CppUTest.cmake @@ -35,21 +35,54 @@ function(cpputest_discover_tests target) set(_DETAILED ${CPPUTEST_TESTS_DETAILED}) endif() - set(CTEST_FILE "${CMAKE_CURRENT_BINARY_DIR}/CTestTestfile.cmake") + set(CTEST_INCLUDE_FILE "${CMAKE_CURRENT_BINARY_DIR}/${target}_include.cmake") + set(CTEST_GENERATED_FILE "${CMAKE_CURRENT_BINARY_DIR}/${target}.cmake") add_custom_command( TARGET ${target} POST_BUILD - BYPRODUCTS "${CTEST_FILE}" + BYPRODUCTS "${CTEST_GENERATED_FILE}" COMMAND "${CMAKE_COMMAND}" -D "TESTS_DETAILED:BOOL=${_DETAILED}" -D "EXECUTABLE=$" -D "EMULATOR=$" - -D "CTEST_FILE=${CTEST_FILE}" + -D "CTEST_FILE=${CTEST_GENERATED_FILE}" -P "${_CPPUTEST_DISCOVERY_SCRIPT}" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" VERBATIM ) + + file(WRITE "${CTEST_INCLUDE_FILE}" + "if(EXISTS \"${CTEST_GENERATED_FILE}\")\n" + " include(\"${CTEST_GENERATED_FILE}\")\n" + "else()\n" + " add_test(${target}_NOT_BUILT ${target}_NOT_BUILT)\n" + "endif()\n" + ) + + if(${CMAKE_VERSION} VERSION_LESS "3.10") + # We can only set one. + get_property(already_set + DIRECTORY + PROPERTY TEST_INCLUDE_FILE + SET + ) + if(${already_set}) + message(FATAL_ERROR + "Cannot discovery multiple tests from the same file" + ) + endif() + set_property( + DIRECTORY + PROPERTY TEST_INCLUDE_FILE "${CTEST_INCLUDE_FILE}" + ) + else() + set_property( + DIRECTORY APPEND + PROPERTY TEST_INCLUDE_FILES "${CTEST_INCLUDE_FILE}" + ) + endif() + endfunction() set(_CPPUTEST_DISCOVERY_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/_CppUTestDiscovery.cmake From 73fa9fb238c6215def363758a59567ebbf3c9e87 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 6 Nov 2022 16:32:41 -0800 Subject: [PATCH 0920/1093] Account for multi-config generators --- .github/workflows/basic.yml | 5 ++- cmake/Modules/CppUTest.cmake | 47 ++++++++++++++++++-------- cmake/Modules/_CppUTestDiscovery.cmake | 11 +++--- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index f63616900..f8ffb8a54 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -60,14 +60,17 @@ jobs: cpp_version: 17 preset: MSVC install: true + ctest_args: -C Debug - name: MSVC 20 os: windows-latest cpp_version: 20 preset: MSVC + ctest_args: -C Debug - name: ClangCL os: windows-latest cpp_version: 17 preset: ClangCL + ctest_args: -C Debug - name: Linux Clang 98 os: ubuntu-latest cpp_version: 98 @@ -199,7 +202,7 @@ jobs: - name: Build run: cmake --build cpputest_build --verbose - name: Test - run: ctest --test-dir cpputest_build + run: ctest --test-dir cpputest_build ${{ matrix.ctest_args }} # POST PROCESSING diff --git a/cmake/Modules/CppUTest.cmake b/cmake/Modules/CppUTest.cmake index bcfc8308f..c9614d854 100644 --- a/cmake/Modules/CppUTest.cmake +++ b/cmake/Modules/CppUTest.cmake @@ -1,9 +1,14 @@ +set(_CPPUTEST_DISCOVERY_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/_CppUTestDiscovery.cmake + CACHE INTERNAL "CppUTest discovery scripts" +) + option(CPPUTEST_TESTS_DETAILED "Run discovered tests individually") +option(CPPUTEST_JUNIT_REPORT "Output JUnit test reports") function(cpputest_discover_tests target) - set(options) + set(options JUNIT) set(oneValueArgs DETAILED) - set(multiValueArgs) + set(multiValueArgs EXTRA_ARGS) cmake_parse_arguments( "" "${options}" @@ -31,12 +36,34 @@ function(cpputest_discover_tests target) ) endif() + if(NOT DEFINED _EXTRA_ARGS) + set(_EXTRA_ARGS -v) + endif() + if(NOT DEFINED _DETAILED) set(_DETAILED ${CPPUTEST_TESTS_DETAILED}) endif() + if(_JUNIT OR CPPUTEST_JUNIT_REPORT) + list(APPEND _EXTRA_ARGS -ojunit) + endif() + set(CTEST_INCLUDE_FILE "${CMAKE_CURRENT_BINARY_DIR}/${target}_include.cmake") - set(CTEST_GENERATED_FILE "${CMAKE_CURRENT_BINARY_DIR}/${target}.cmake") + if(CMAKE_CONFIGURATION_TYPES) + set(CTEST_GENERATED_FILE "${CMAKE_CURRENT_BINARY_DIR}/${target}.$.cmake") + file(WRITE "${CTEST_INCLUDE_FILE}" + "if(EXISTS \"${CMAKE_CURRENT_BINARY_DIR}/${target}.\${CTEST_CONFIGURATION_TYPE}.cmake\")\n" + " include(\"${CMAKE_CURRENT_BINARY_DIR}/${target}.\${CTEST_CONFIGURATION_TYPE}.cmake\")\n" + "endif()\n" + ) + else() + set(CTEST_GENERATED_FILE "${CMAKE_CURRENT_BINARY_DIR}/${target}.cmake") + file(WRITE "${CTEST_INCLUDE_FILE}" + "if(EXISTS \"${CTEST_GENERATED_FILE}\")\n" + " include(\"${CTEST_GENERATED_FILE}\")\n" + "endif()\n" + ) + endif() add_custom_command( TARGET ${target} POST_BUILD @@ -46,20 +73,14 @@ function(cpputest_discover_tests target) -D "TESTS_DETAILED:BOOL=${_DETAILED}" -D "EXECUTABLE=$" -D "EMULATOR=$" + -D "ARGS=${run_args}" -D "CTEST_FILE=${CTEST_GENERATED_FILE}" -P "${_CPPUTEST_DISCOVERY_SCRIPT}" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + DEPENDS "${_CPPUTEST_DISCOVERY_SCRIPT}" VERBATIM ) - file(WRITE "${CTEST_INCLUDE_FILE}" - "if(EXISTS \"${CTEST_GENERATED_FILE}\")\n" - " include(\"${CTEST_GENERATED_FILE}\")\n" - "else()\n" - " add_test(${target}_NOT_BUILT ${target}_NOT_BUILT)\n" - "endif()\n" - ) - if(${CMAKE_VERSION} VERSION_LESS "3.10") # We can only set one. get_property(already_set @@ -84,7 +105,3 @@ function(cpputest_discover_tests target) endif() endfunction() - -set(_CPPUTEST_DISCOVERY_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/_CppUTestDiscovery.cmake - CACHE INTERNAL "CppUTest discovery scripts" -) diff --git a/cmake/Modules/_CppUTestDiscovery.cmake b/cmake/Modules/_CppUTestDiscovery.cmake index e712ffd14..c4e94003e 100644 --- a/cmake/Modules/_CppUTestDiscovery.cmake +++ b/cmake/Modules/_CppUTestDiscovery.cmake @@ -31,7 +31,7 @@ endif() execute_process( COMMAND ${EMULATOR} "${EXECUTABLE}" ${discovery_arg} - OUTPUT_VARIABLE output + OUTPUT_VARIABLE discovered_tests RESULT_VARIABLE result ERROR_VARIABLE error ) @@ -41,15 +41,16 @@ if(NOT ${result} EQUAL 0) "${error}" ) endif() -separate_arguments(output) -foreach(test IN LISTS output) +separate_arguments(discovered_tests) +foreach(test_name IN LISTS discovered_tests) add_command( add_test - "${test}" + "${test_name}" ${EMULATOR} "${EXECUTABLE}" + ${ARGS} ${select_arg} - ${test} + ${test_name} ) endforeach() From 90e2b97125e958521896a984252ddef6bde0e2b8 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 14 Nov 2022 01:11:30 -0800 Subject: [PATCH 0921/1093] Test without C standard library This gets the build without the C standard library under test by cheating at link time. None of CppUTest is built with libc (i.e. passing `-nostdinc`), but for testing we link to standard implementations of platform-specific functions. --- CMakeLists.txt | 57 ++++--- CMakePresets.json | 1 - include/CppUTest/StandardCLibrary.h | 7 + tests/CppUTest/CMakeLists.txt | 7 + tests/CppUTestExt/CMakeLists.txt | 7 + .../DummyUTestPlatform/DummyUTestPlatform.cpp | 140 ++++++++++++++++++ 6 files changed, 186 insertions(+), 33 deletions(-) create mode 100644 tests/DummyUTestPlatform/DummyUTestPlatform.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 536361681..fef901f78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,6 @@ option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ${PROJEC cmake_dependent_option(CPPUTEST_MEM_LEAK_DETECTION_DISABLED "Enable memory leak detection" OFF "CPPUTEST_FLAGS;NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED;NOT is_clang_cl" ON) option(CPPUTEST_EXTENSIONS "Use the CppUTest extension library" ON) - include(CheckTypeSize) check_type_size("long long" SIZEOF_LONGLONG) cmake_dependent_option(CPPUTEST_USE_LONG_LONG "Support long long" @@ -60,43 +59,37 @@ cmake_dependent_option(CPPUTEST_EXAMPLES "Compile and make examples?" cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" OFF "PROJECT_IS_TOP_LEVEL" OFF) -if(DEFINED CPP_PLATFORM) - message(DEPRECATION - "The CPP_PLATFORM variable has been deprecated. " - "Use CPPUTEST_PLATFORM instead." - ) -else() - if(MSVC) - set(CPP_PLATFORM VisualCpp) - elseif(CMAKE_CXX_COMPILER_ID STREQUAL "IAR") - set(CPP_PLATFORM Iar) - elseif(CMAKE_CXX_COMPILER_ID STREQUAL "ARMCC") - set(CPP_PLATFORM armcc) - elseif(DOS) - set(CPP_PLATFORM Dos) - elseif(BORLAND) - set(CPP_PLATFORM Borland) - elseif(CPPUTEST_STD_C_LIB_DISABLED) - set(CPP_PLATFORM GccNoStdC) +if(NOT DEFINED CPPUTEST_PLATFORM) + if(DEFINED CPP_PLATFORM) + message(DEPRECATION + "The CPP_PLATFORM variable has been deprecated. " + "Use CPPUTEST_PLATFORM instead." + ) + set(CPPUTEST_PLATFORM ${CPP_PLATFORM}) else() - set(CPP_PLATFORM Gcc) + if(CPPUTEST_STD_C_LIB_DISABLED) + set(CPPUTEST_PLATFORM OFF) + elseif(MSVC) + set(CPPUTEST_PLATFORM VisualCpp) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "IAR") + set(CPPUTEST_PLATFORM Iar) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "ARMCC") + set(CPPUTEST_PLATFORM armcc) + elseif(DOS) + set(CPPUTEST_PLATFORM Dos) + elseif(BORLAND) + set(CPPUTEST_PLATFORM Borland) + else() + set(CPPUTEST_PLATFORM Gcc) + endif() endif() + message(STATUS "Setting CPPUTEST_PLATFORM: ${CPPUTEST_PLATFORM}") endif() -set(CPPUTEST_PLATFORM "${CPP_PLATFORM}" CACHE STRING "Platform implementation") +set(CPPUTEST_PLATFORM "${CPPUTEST_PLATFORM}" CACHE STRING "Platform implementation") set_property( CACHE CPPUTEST_PLATFORM PROPERTY STRINGS - armcc - Borland - C2000 - Dos - Gcc - GccNoStdC - Iar - Keil - Symbian - VisualCpp - OFF + armcc Borland C2000 Dos Gcc Iar Keil Symbian VisualCpp OFF ) include(CheckCXXSymbolExists) diff --git a/CMakePresets.json b/CMakePresets.json index 33e7473de..f573960de 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -99,7 +99,6 @@ "CFLAGS": "-DCPPUTEST_CHAR_BIT=8 -Werror -nostdinc" }, "cacheVariables": { - "CMAKE_SYSTEM_NAME": "Generic", "CPPUTEST_STD_C_LIB_DISABLED": true } }, diff --git a/include/CppUTest/StandardCLibrary.h b/include/CppUTest/StandardCLibrary.h index 914f0acc9..c0ef7aa99 100644 --- a/include/CppUTest/StandardCLibrary.h +++ b/include/CppUTest/StandardCLibrary.h @@ -79,8 +79,15 @@ typedef long unsigned int size_t; #endif #define NULL (0) +#ifdef __cplusplus +extern "C" { +#endif extern void* malloc(size_t); extern void free(void *); +#ifdef __cplusplus +} +#endif + #define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd))) diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 589382bae..8b4b70580 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -36,6 +36,13 @@ add_executable(CppUTestTests TeamCityOutputTest.cpp ) +if(CPPUTEST_STD_C_LIB_DISABLED) + target_sources(CppUTestTests + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../DummyUTestPlatform/DummyUTestPlatform.cpp + ) +endif() + if(MINGW OR (${CMAKE_HOST_SYSTEM_NAME} MATCHES "OpenBSD")) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads) diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index de02a222e..7cf12de75 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -29,6 +29,13 @@ add_executable(CppUTestExtTests OrderedTestTest.cpp ) +if(CPPUTEST_STD_C_LIB_DISABLED) + target_sources(CppUTestExtTests + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../DummyUTestPlatform/DummyUTestPlatform.cpp + ) +endif() + if(MINGW) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads) diff --git a/tests/DummyUTestPlatform/DummyUTestPlatform.cpp b/tests/DummyUTestPlatform/DummyUTestPlatform.cpp new file mode 100644 index 000000000..fede3cbc9 --- /dev/null +++ b/tests/DummyUTestPlatform/DummyUTestPlatform.cpp @@ -0,0 +1,140 @@ +#include + +typedef char jmp_buf[200]; + +TestOutput::WorkingEnvironment PlatformSpecificGetWorkingEnvironment() +{ + return TestOutput::eclipse; +} + +void (*PlatformSpecificRunTestInASeperateProcess)(UtestShell* shell, TestPlugin* plugin, TestResult* result) = NULLPTR; +int (*PlatformSpecificFork)(void) = NULLPTR; +int (*PlatformSpecificWaitPid)(int pid, int* status, int options) = NULLPTR; + +static jmp_buf test_exit_jmp_buf[10]; +static int jmp_buf_index = 0; + +extern "C" int setjmp(jmp_buf); +static int fakeSetJmp(void (*function)(void* data), void* data) +{ + if (0 == setjmp(test_exit_jmp_buf[jmp_buf_index])) { + jmp_buf_index++; + function(data); + jmp_buf_index--; + return 1; + } + return 0; +} +int (*PlatformSpecificSetJmp)(void (*function)(void*), void* data) = fakeSetJmp; + +extern "C" void longjmp(jmp_buf, int); +static void fakeLongJmp(void) +{ + jmp_buf_index--; + longjmp(test_exit_jmp_buf[jmp_buf_index], 1); +} +void (*PlatformSpecificLongJmp)(void) = fakeLongJmp; + +static void fakeRestoreJumpBuffer() +{ + jmp_buf_index--; +} +void (*PlatformSpecificRestoreJumpBuffer)(void) = fakeRestoreJumpBuffer; + +static long fakeTimeInMillis(void) +{ + return 0; +} +long (*GetPlatformSpecificTimeInMillis)(void) = fakeTimeInMillis; + +static const char* fakeTimeString(void) +{ + return ""; +} +const char* (*GetPlatformSpecificTimeString)() = fakeTimeString; + +extern "C" int vsnprintf(char*, size_t, const char*, va_list); +int (*PlatformSpecificVSNprintf)(char* str, size_t size, const char* format, va_list va_args_list) = vsnprintf; + +extern "C" double fabs(double); +double (*PlatformSpecificFabs)(double d) = fabs; + +static int fakeIsNan(double d) +{ + return d != d; +} +int (*PlatformSpecificIsNan)(double d) = fakeIsNan; + +static int fakeIsInf(double d) +{ + return !fakeIsNan(d) && fakeIsNan(d - d); +} +int (*PlatformSpecificIsInf)(double d) = fakeIsInf; + +extern "C" int atexit(void (*func)(void)); +int (*PlatformSpecificAtExit)(void (*func)(void)) = atexit; + +extern "C" void* stdout; +PlatformSpecificFile PlatformSpecificStdOut = stdout; + +extern "C" void* fopen(const char*, const char*); +PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag) = fopen; + +extern "C" int fputs(const char*, void*); +static void fakeFPuts(const char* str, PlatformSpecificFile file) +{ + fputs(str, file); +} +void (*PlatformSpecificFPuts)(const char* str, PlatformSpecificFile file) = fakeFPuts; + +extern "C" int fclose(void* stream); +static void fakeFClose(PlatformSpecificFile file) +{ + fclose(file); +} +void (*PlatformSpecificFClose)(PlatformSpecificFile file) = fakeFClose; + +extern "C" int fflush(void* stream); +static void fakeFlush(void) +{ + fflush(stdout); +} +void (*PlatformSpecificFlush)(void) = fakeFlush; + +static void fakeSrand(unsigned int){}; +void (*PlatformSpecificSrand)(unsigned int) = fakeSrand; + +static int fakeRand(void) +{ + return 0; +} +int (*PlatformSpecificRand)(void) = fakeRand; + +extern "C" void* malloc(size_t); +void* (*PlatformSpecificMalloc)(size_t) = malloc; + +extern "C" void* realloc(void* ptr, size_t new_size); +void* (*PlatformSpecificRealloc)(void* memory, size_t size) = realloc; + +extern "C" void free(void*); +void (*PlatformSpecificFree)(void* memory) = free; + +extern "C" void* memcpy(void* dest, const void* src, size_t count); +void* (*PlatformSpecificMemCpy)(void* s1, const void* s2, size_t size) = memcpy; + +extern "C" void* memset(void* dest, int ch, size_t count); +void* (*PlatformSpecificMemset)(void* mem, int c, size_t size) = memset; + +static PlatformSpecificMutex fakeMutexCreate(void) +{ + return 0; +} +PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void) = fakeMutexCreate; + +static void fakeMutexFunc(PlatformSpecificMutex mtx) {} +void (*PlatformSpecificMutexLock)(PlatformSpecificMutex mtx) = fakeMutexFunc; +void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex mtx) = fakeMutexFunc; +void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex mtx) = fakeMutexFunc; + +extern "C" void abort(void); +void (*PlatformSpecificAbort)(void) = abort; From 0f701b941006caa78c9fc928135c06c56dca20d3 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 14 Nov 2022 18:50:54 -0800 Subject: [PATCH 0922/1093] Wrap std::bad_alloc --- include/CppUTest/CppUTestConfig.h | 91 +++++++++---------- .../CppUTest/MemoryLeakDetectorNewMacros.h | 12 +-- src/CppUTest/MemoryLeakWarningPlugin.cpp | 60 ++++++------ tests/CppUTest/MemoryOperatorOverloadTest.cpp | 14 +-- 4 files changed, 84 insertions(+), 93 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index e9678dd1d..1bd37aa05 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -123,58 +123,12 @@ #define _check_format_(type, format_parameter, other_parameters) /* type, format_parameter, other_parameters */ #endif -/* - * When we don't link Standard C++, then we won't throw exceptions as we assume the compiler might not support that! - */ - -#if CPPUTEST_USE_STD_CPP_LIB - #if defined(__cplusplus) && __cplusplus >= 201103L - #define UT_THROW(exception) - #define UT_NOTHROW noexcept - #else - #define UT_THROW(exception) throw (exception) - #define UT_NOTHROW throw() - #endif -#else - #define UT_THROW(exception) - #ifdef __clang__ - #define UT_NOTHROW throw() - #else - #define UT_NOTHROW - #endif -#endif - -/* - * Visual C++ doesn't define __cplusplus as C++11 yet (201103), however it doesn't want the throw(exception) either, but - * it does want throw(). - */ - -#ifdef _MSC_VER - #undef UT_THROW - #define UT_THROW(exception) -#endif - #if defined(__cplusplus) && __cplusplus >= 201103L #define DEFAULT_COPY_CONSTRUCTOR(classname) classname(const classname &) = default; #else #define DEFAULT_COPY_CONSTRUCTOR(classname) #endif -/* - * g++-4.7 with stdc++11 enabled On MacOSX! will have a different exception specifier for operator new (and thank you!) - * I assume they'll fix this in the future, but for now, we'll change that here. - * (This should perhaps also be done in the configure.ac) - */ - -#ifdef __GXX_EXPERIMENTAL_CXX0X__ -#ifdef __APPLE__ -#ifdef _GLIBCXX_THROW -#undef UT_THROW -#define UT_THROW(exception) _GLIBCXX_THROW(exception) -#endif -#endif -#endif - /* * Address sanitizer is a good thing... and it causes some conflicts with the CppUTest tests * To check whether it is on or off, we create a CppUTest define here. @@ -270,6 +224,51 @@ #define CPPUTEST_HAVE_EXCEPTIONS 1 #endif #endif + + #if CPPUTEST_HAVE_EXCEPTIONS + #if defined(__cplusplus) && __cplusplus >= 201103L + #define UT_THROW(exception) + #define UT_NOTHROW noexcept + #else + #define UT_THROW(exception) throw (exception) + #define UT_NOTHROW throw() + #endif + #else + #define UT_THROW(exception) + #ifdef __clang__ + #define UT_NOTHROW throw() + #else + #define UT_NOTHROW + #endif + #endif + + /* + * Visual C++ doesn't define __cplusplus as C++11 yet (201103), however it doesn't want the throw(exception) either, but + * it does want throw(). + */ + #ifdef _MSC_VER + #undef UT_THROW + #define UT_THROW(exception) + #endif + + /* + * g++-4.7 with stdc++11 enabled On MacOSX! will have a different exception specifier for operator new (and thank you!) + * I assume they'll fix this in the future, but for now, we'll change that here. + * (This should perhaps also be done in the configure.ac) + */ + #if defined(__GXX_EXPERIMENTAL_CXX0X__) && \ + defined(__APPLE__) && \ + defined(_GLIBCXX_THROW) + #undef UT_THROW + #define UT_THROW(exception) _GLIBCXX_THROW(exception) + #endif + + #if CPPUTEST_USE_STD_CPP_LIB + #define CPPUTEST_BAD_ALLOC std::bad_alloc + #else + class CppUTestBadAlloc {}; + #define CPPUTEST_BAD_ALLOC CppUTestBadAlloc + #endif #endif /* diff --git a/include/CppUTest/MemoryLeakDetectorNewMacros.h b/include/CppUTest/MemoryLeakDetectorNewMacros.h index b756a5d0e..eb62b30a5 100644 --- a/include/CppUTest/MemoryLeakDetectorNewMacros.h +++ b/include/CppUTest/MemoryLeakDetectorNewMacros.h @@ -56,12 +56,12 @@ * know about all allocations and report freeing of unallocated blocks. Hence, provide both overloads. */ - void* operator new(size_t size, const char* file, int line) UT_THROW (std::bad_alloc); - void* operator new(size_t size, const char* file, size_t line) UT_THROW (std::bad_alloc); - void* operator new[](size_t size, const char* file, int line) UT_THROW (std::bad_alloc); - void* operator new[](size_t size, const char* file, size_t line) UT_THROW (std::bad_alloc); - void* operator new(size_t size) UT_THROW(std::bad_alloc); - void* operator new[](size_t size) UT_THROW(std::bad_alloc); + void* operator new(size_t size, const char* file, int line) UT_THROW (CPPUTEST_BAD_ALLOC); + void* operator new(size_t size, const char* file, size_t line) UT_THROW (CPPUTEST_BAD_ALLOC); + void* operator new[](size_t size, const char* file, int line) UT_THROW (CPPUTEST_BAD_ALLOC); + void* operator new[](size_t size, const char* file, size_t line) UT_THROW (CPPUTEST_BAD_ALLOC); + void* operator new(size_t size) UT_THROW(CPPUTEST_BAD_ALLOC); + void* operator new[](size_t size) UT_THROW(CPPUTEST_BAD_ALLOC); void operator delete(void* mem, const char* file, int line) UT_NOTHROW; void operator delete(void* mem, const char* file, size_t line) UT_NOTHROW; diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 3b288caa3..a52c3fc97 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -130,15 +130,13 @@ void cpputest_free_location_with_leak_detection(void* buffer, const char* file, #if CPPUTEST_USE_MEM_LEAK_DETECTION #undef new -#if !CPPUTEST_HAVE_EXCEPTIONS -#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) -#elif CPPUTEST_USE_STD_CPP_LIB -#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) if (memory == NULLPTR) throw std::bad_alloc() +#if CPPUTEST_HAVE_EXCEPTIONS +#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) if (memory == NULLPTR) throw CPPUTEST_BAD_ALLOC() #else -#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) if (memory == NULLPTR) throw 7 +#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) #endif -static void* threadsafe_mem_leak_operator_new (size_t size) UT_THROW(std::bad_alloc) +static void* threadsafe_mem_leak_operator_new (size_t size) UT_THROW(CPPUTEST_BAD_ALLOC) { MemLeakScopedMutex lock; void* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size); @@ -152,7 +150,7 @@ static void* threadsafe_mem_leak_operator_new_nothrow (size_t size) UT_NOTHROW return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size); } -static void* threadsafe_mem_leak_operator_new_debug (size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) +static void* threadsafe_mem_leak_operator_new_debug (size_t size, const char* file, size_t line) UT_THROW(CPPUTEST_BAD_ALLOC) { MemLeakScopedMutex lock; void *memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size, file, line); @@ -160,7 +158,7 @@ static void* threadsafe_mem_leak_operator_new_debug (size_t size, const char* fi return memory; } -static void* threadsafe_mem_leak_operator_new_array (size_t size) UT_THROW(std::bad_alloc) +static void* threadsafe_mem_leak_operator_new_array (size_t size) UT_THROW(CPPUTEST_BAD_ALLOC) { MemLeakScopedMutex lock; void* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size); @@ -174,7 +172,7 @@ static void* threadsafe_mem_leak_operator_new_array_nothrow (size_t size) UT_NOT return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size); } -static void* threadsafe_mem_leak_operator_new_array_debug (size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) +static void* threadsafe_mem_leak_operator_new_array_debug (size_t size, const char* file, size_t line) UT_THROW(CPPUTEST_BAD_ALLOC) { MemLeakScopedMutex lock; void* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, file, line); @@ -197,7 +195,7 @@ static void threadsafe_mem_leak_operator_delete_array (void* mem) UT_NOTHROW } -static void* mem_leak_operator_new (size_t size) UT_THROW(std::bad_alloc) +static void* mem_leak_operator_new (size_t size) UT_THROW(CPPUTEST_BAD_ALLOC) { void* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); @@ -209,14 +207,14 @@ static void* mem_leak_operator_new_nothrow (size_t size) UT_NOTHROW return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size); } -static void* mem_leak_operator_new_debug (size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) +static void* mem_leak_operator_new_debug (size_t size, const char* file, size_t line) UT_THROW(CPPUTEST_BAD_ALLOC) { void *memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewAllocator(), size, file, line); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); return memory; } -static void* mem_leak_operator_new_array (size_t size) UT_THROW(std::bad_alloc) +static void* mem_leak_operator_new_array (size_t size) UT_THROW(CPPUTEST_BAD_ALLOC) { void* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); @@ -228,7 +226,7 @@ static void* mem_leak_operator_new_array_nothrow (size_t size) UT_NOTHROW return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size); } -static void* mem_leak_operator_new_array_debug (size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) +static void* mem_leak_operator_new_array_debug (size_t size, const char* file, size_t line) UT_THROW(CPPUTEST_BAD_ALLOC) { void* memory = MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, file, line); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); @@ -247,7 +245,7 @@ static void mem_leak_operator_delete_array (void* mem) UT_NOTHROW MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(getCurrentNewArrayAllocator(), (char*) mem); } -static void* normal_operator_new (size_t size) UT_THROW(std::bad_alloc) +static void* normal_operator_new (size_t size) UT_THROW(CPPUTEST_BAD_ALLOC) { void* memory = PlatformSpecificMalloc(size); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); @@ -259,14 +257,14 @@ static void* normal_operator_new_nothrow (size_t size) UT_NOTHROW return PlatformSpecificMalloc(size); } -static void* normal_operator_new_debug (size_t size, const char* /*file*/, size_t /*line*/) UT_THROW(std::bad_alloc) +static void* normal_operator_new_debug (size_t size, const char* /*file*/, size_t /*line*/) UT_THROW(CPPUTEST_BAD_ALLOC) { void* memory = PlatformSpecificMalloc(size); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); return memory; } -static void* normal_operator_new_array (size_t size) UT_THROW(std::bad_alloc) +static void* normal_operator_new_array (size_t size) UT_THROW(CPPUTEST_BAD_ALLOC) { void* memory = PlatformSpecificMalloc(size); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); @@ -278,7 +276,7 @@ static void* normal_operator_new_array_nothrow (size_t size) UT_NOTHROW return PlatformSpecificMalloc(size); } -static void* normal_operator_new_array_debug (size_t size, const char* /*file*/, size_t /*line*/) UT_THROW(std::bad_alloc) +static void* normal_operator_new_array_debug (size_t size, const char* /*file*/, size_t /*line*/) UT_THROW(CPPUTEST_BAD_ALLOC) { void* memory = PlatformSpecificMalloc(size); UT_THROW_BAD_ALLOC_WHEN_NULL(memory); @@ -295,36 +293,36 @@ static void normal_operator_delete_array (void* mem) UT_NOTHROW PlatformSpecificFree(mem); } -static void *(*operator_new_fptr)(size_t size) UT_THROW(std::bad_alloc) = mem_leak_operator_new; +static void *(*operator_new_fptr)(size_t size) UT_THROW(CPPUTEST_BAD_ALLOC) = mem_leak_operator_new; static void *(*operator_new_nothrow_fptr)(size_t size) UT_NOTHROW = mem_leak_operator_new_nothrow; -static void *(*operator_new_debug_fptr)(size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_debug; -static void *(*operator_new_array_fptr)(size_t size) UT_THROW(std::bad_alloc) = mem_leak_operator_new_array; +static void *(*operator_new_debug_fptr)(size_t size, const char* file, size_t line) UT_THROW(CPPUTEST_BAD_ALLOC) = mem_leak_operator_new_debug; +static void *(*operator_new_array_fptr)(size_t size) UT_THROW(CPPUTEST_BAD_ALLOC) = mem_leak_operator_new_array; static void *(*operator_new_array_nothrow_fptr)(size_t size) UT_NOTHROW = mem_leak_operator_new_array_nothrow; -static void *(*operator_new_array_debug_fptr)(size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_array_debug; +static void *(*operator_new_array_debug_fptr)(size_t size, const char* file, size_t line) UT_THROW(CPPUTEST_BAD_ALLOC) = mem_leak_operator_new_array_debug; static void (*operator_delete_fptr)(void* mem) UT_NOTHROW = mem_leak_operator_delete; static void (*operator_delete_array_fptr)(void* mem) UT_NOTHROW = mem_leak_operator_delete_array; -static void *(*saved_operator_new_fptr)(size_t size) UT_THROW(std::bad_alloc) = mem_leak_operator_new; +static void *(*saved_operator_new_fptr)(size_t size) UT_THROW(CPPUTEST_BAD_ALLOC) = mem_leak_operator_new; static void *(*saved_operator_new_nothrow_fptr)(size_t size) UT_NOTHROW = mem_leak_operator_new_nothrow; -static void *(*saved_operator_new_debug_fptr)(size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_debug; -static void *(*saved_operator_new_array_fptr)(size_t size) UT_THROW(std::bad_alloc) = mem_leak_operator_new_array; +static void *(*saved_operator_new_debug_fptr)(size_t size, const char* file, size_t line) UT_THROW(CPPUTEST_BAD_ALLOC) = mem_leak_operator_new_debug; +static void *(*saved_operator_new_array_fptr)(size_t size) UT_THROW(CPPUTEST_BAD_ALLOC) = mem_leak_operator_new_array; static void *(*saved_operator_new_array_nothrow_fptr)(size_t size) UT_NOTHROW = mem_leak_operator_new_array_nothrow; -static void *(*saved_operator_new_array_debug_fptr)(size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) = mem_leak_operator_new_array_debug; +static void *(*saved_operator_new_array_debug_fptr)(size_t size, const char* file, size_t line) UT_THROW(CPPUTEST_BAD_ALLOC) = mem_leak_operator_new_array_debug; static void (*saved_operator_delete_fptr)(void* mem) UT_NOTHROW = mem_leak_operator_delete; static void (*saved_operator_delete_array_fptr)(void* mem) UT_NOTHROW = mem_leak_operator_delete_array; static int save_counter = 0; -void* operator new(size_t size) UT_THROW(std::bad_alloc) +void* operator new(size_t size) UT_THROW(CPPUTEST_BAD_ALLOC) { return operator_new_fptr(size); } -void* operator new(size_t size, const char* file, int line) UT_THROW(std::bad_alloc) +void* operator new(size_t size, const char* file, int line) UT_THROW(CPPUTEST_BAD_ALLOC) { return operator_new_debug_fptr(size, file, (size_t)line); } -void* operator new(size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) +void* operator new(size_t size, const char* file, size_t line) UT_THROW(CPPUTEST_BAD_ALLOC) { return operator_new_debug_fptr(size, file, line); } @@ -351,17 +349,17 @@ void operator delete (void* mem, size_t) UT_NOTHROW } #endif -void* operator new[](size_t size) UT_THROW(std::bad_alloc) +void* operator new[](size_t size) UT_THROW(CPPUTEST_BAD_ALLOC) { return operator_new_array_fptr(size); } -void* operator new [](size_t size, const char* file, int line) UT_THROW(std::bad_alloc) +void* operator new [](size_t size, const char* file, int line) UT_THROW(CPPUTEST_BAD_ALLOC) { return operator_new_array_debug_fptr(size, file, (size_t)line); } -void* operator new [](size_t size, const char* file, size_t line) UT_THROW(std::bad_alloc) +void* operator new [](size_t size, const char* file, size_t line) UT_THROW(CPPUTEST_BAD_ALLOC) { return operator_new_array_debug_fptr(size, file, line); } diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index 002ac83c3..46a602c3c 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -421,20 +421,14 @@ TEST_GROUP(OutOfMemoryTestsForOperatorNew) #if CPPUTEST_HAVE_EXCEPTIONS -#if CPPUTEST_USE_STD_CPP_LIB -#define BAD_ALLOC std::bad_alloc -#else -#define BAD_ALLOC int -#endif - TEST(OutOfMemoryTestsForOperatorNew, FailingNewOperatorThrowsAnExceptionWhenUsingStdCppNew) { - CHECK_THROWS(BAD_ALLOC, new char); + CHECK_THROWS(CPPUTEST_BAD_ALLOC, new char); } TEST(OutOfMemoryTestsForOperatorNew, FailingNewArrayOperatorThrowsAnExceptionWhenUsingStdCppNew) { - CHECK_THROWS(BAD_ALLOC, new char[10]); + CHECK_THROWS(CPPUTEST_BAD_ALLOC, new char[10]); } TEST_GROUP(TestForExceptionsInConstructor) @@ -506,12 +500,12 @@ char* some_memory; TEST(OutOfMemoryTestsForOperatorNew, FailingNewOperatorThrowsAnExceptionWhenUsingStdCppNewWithoutOverride) { - CHECK_THROWS(BAD_ALLOC, some_memory = new char); + CHECK_THROWS(CPPUTEST_BAD_ALLOC, some_memory = new char); } TEST(OutOfMemoryTestsForOperatorNew, FailingNewArrayOperatorThrowsAnExceptionWhenUsingStdCppNewWithoutOverride) { - CHECK_THROWS(BAD_ALLOC, some_memory = new char[10]); + CHECK_THROWS(CPPUTEST_BAD_ALLOC, some_memory = new char[10]); } #if CPPUTEST_USE_STD_CPP_LIB From 2e034906cc90315c4ac5b4b2d37d80329c139fcb Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 20 Nov 2022 15:32:04 -0800 Subject: [PATCH 0923/1093] Repair JUnit output --- cmake/Modules/CppUTest.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Modules/CppUTest.cmake b/cmake/Modules/CppUTest.cmake index c9614d854..fdd8be4d9 100644 --- a/cmake/Modules/CppUTest.cmake +++ b/cmake/Modules/CppUTest.cmake @@ -73,7 +73,7 @@ function(cpputest_discover_tests target) -D "TESTS_DETAILED:BOOL=${_DETAILED}" -D "EXECUTABLE=$" -D "EMULATOR=$" - -D "ARGS=${run_args}" + -D "ARGS=${_EXTRA_ARGS}" -D "CTEST_FILE=${CTEST_GENERATED_FILE}" -P "${_CPPUTEST_DISCOVERY_SCRIPT}" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" From 36235cd0c8ee1be83bb9a7efbac5bcab27a90777 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 20 Nov 2022 15:37:59 -0800 Subject: [PATCH 0924/1093] JUnit report --- .github/workflows/extended.yml | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index d690a6e19..777281f4e 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -8,19 +8,18 @@ jobs: test_report: runs-on: ubuntu-latest steps: - - name: Install tools - run: sudo apt-get install -y ant-optional - name: Checkout uses: actions/checkout@main - - run: | - autoreconf -i . - ./configure - make check - ./CppUTestTests -ojunit - ./CppUTestExtTests -ojunit - cp ./scripts/generate_junit_report_ant.xml . - ant -f generate_junit_report_ant.xml - + - run: cmake --preset=defaults -DCPPUTEST_JUNIT_REPORT=TRUE + - run: cmake --build cpputest_build -j + - run: ctest --test-dir cpputest_build + - name: Test Report + uses: dorny/test-reporter@v1 + if: success() || failure() + with: + name: Tests + path: "cpputest_build/**/cpputest_*.xml" + reporter: java-junit gtest: runs-on: ubuntu-latest strategy: From 4cc92f77714d50133adbe11a7f744e11758cdb4f Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 20 Nov 2022 16:17:49 -0800 Subject: [PATCH 0925/1093] Set up for PRs This won't work until *after* it merges. https://github.com/dorny/test-reporter#recommended-setup-for-public-repositories --- .github/workflows/extended.yml | 10 ++++------ .github/workflows/test-report.yml | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/test-report.yml diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 777281f4e..10a229ea0 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -8,18 +8,16 @@ jobs: test_report: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@main + - uses: actions/checkout@main - run: cmake --preset=defaults -DCPPUTEST_JUNIT_REPORT=TRUE - run: cmake --build cpputest_build -j - run: ctest --test-dir cpputest_build - - name: Test Report - uses: dorny/test-reporter@v1 + - uses: actions/upload-artifact@v2 if: success() || failure() with: - name: Tests + name: test-results path: "cpputest_build/**/cpputest_*.xml" - reporter: java-junit + gtest: runs-on: ubuntu-latest strategy: diff --git a/.github/workflows/test-report.yml b/.github/workflows/test-report.yml new file mode 100644 index 000000000..12b8c07c3 --- /dev/null +++ b/.github/workflows/test-report.yml @@ -0,0 +1,17 @@ +--- +name: 'Test Report' +"on": + workflow_run: + workflows: ['Extended builds'] + types: + - completed +jobs: + report: + runs-on: ubuntu-latest + steps: + - uses: dorny/test-reporter@v1 + with: + artifact: test-results + name: JUnit Tests + path: "cpputest_build/**/cpputest_*.xml" + reporter: java-junit From 8f71bbc3655376acfee9cd892e9a11ae5db92664 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 22 Nov 2022 11:54:45 -0800 Subject: [PATCH 0926/1093] Update upload-artifact action Co-authored-by: offa --- .github/workflows/extended.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 10a229ea0..5cab2b39c 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -12,7 +12,7 @@ jobs: - run: cmake --preset=defaults -DCPPUTEST_JUNIT_REPORT=TRUE - run: cmake --build cpputest_build -j - run: ctest --test-dir cpputest_build - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 if: success() || failure() with: name: test-results From e7716899e8553382be906afea7ffd80cc2a7ff5b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 21 Nov 2022 19:03:19 -0800 Subject: [PATCH 0927/1093] Cygwin build --- .github/workflows/basic.yml | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index b9664b22a..cb02aa2c3 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -172,6 +172,10 @@ jobs: cpp_version: 98 preset: DOS apt_packages: dosbox + - name: Cygwin + os: windows-latest + cpp_version: 98 + preset: GNU name: ${{ matrix.name }} runs-on: ${{ matrix.os }} steps: @@ -197,10 +201,24 @@ jobs: version: "2.0" if: ${{ matrix.name == 'OpenWatcom DOS' }} - ## BUILD AND TEST - + - run: git config --global core.autocrlf input + if: ${{ matrix.name == 'Cygwin' }} - name: Checkout uses: actions/checkout@main + + - name: Install Cygwin + uses: cygwin/cygwin-install-action@master + with: + platform: x86 + packages: > + cmake + gcc-core + gcc-g++ + make + if: ${{ matrix.name == 'Cygwin' }} + + ## BUILD AND TEST + - name: Configure run: cmake --preset ${{ matrix.preset }} -D CMAKE_CXX_STANDARD=${{ matrix.cpp_version }} - name: Build From ebf017b52e40ea01adc0c40c3e2935132c2886ef Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 21 Nov 2022 19:56:45 -0800 Subject: [PATCH 0928/1093] Don't require standard --- .github/workflows/basic.yml | 45 +++++++++++++------------------------ 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index cb02aa2c3..2624c8ee7 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -57,124 +57,111 @@ jobs: include: - name: MSVC install os: windows-latest - cpp_version: 17 preset: MSVC install: true ctest_args: -C Debug - name: MSVC 20 os: windows-latest - cpp_version: 20 + cmake_args: -DCMAKE_CXX_STANDARD=20 preset: MSVC ctest_args: -C Debug - name: ClangCL os: windows-latest - cpp_version: 17 + cmake_args: -DCMAKE_CXX_STANDARD=17 preset: ClangCL ctest_args: -C Debug - name: Linux Clang 98 os: ubuntu-latest - cpp_version: 98 + cmake_args: -DCMAKE_CXX_STANDARD=98 preset: Clang - name: Linux Clang 11 os: ubuntu-latest - cpp_version: 11 + cmake_args: -DCMAKE_CXX_STANDARD=11 preset: Clang - name: Linux Clang 14 os: ubuntu-latest - cpp_version: 14 + cmake_args: -DCMAKE_CXX_STANDARD=14 preset: Clang - name: Linux Clang 17 os: ubuntu-latest - cpp_version: 17 + cmake_args: -DCMAKE_CXX_STANDARD=17 preset: Clang - name: Linux Clang 20 os: ubuntu-latest - cpp_version: 20 + cmake_args: -DCMAKE_CXX_STANDARD=20 preset: Clang - name: Linux GNU 98 os: ubuntu-latest - cpp_version: 98 + cmake_args: -DCMAKE_CXX_STANDARD=98 preset: GNU - name: No long long os: ubuntu-latest - cpp_version: 98 preset: no-long-long - name: Detailed os: ubuntu-latest - cpp_version: 98 preset: detailed - name: Linux GNU Install os: ubuntu-latest - cpp_version: 11 + cmake_args: -DCMAKE_CXX_STANDARD=11 preset: GNU install: true - name: Linux GNU 14 os: ubuntu-latest - cpp_version: 14 + cmake_args: -DCMAKE_CXX_STANDARD=14 preset: GNU - name: Linux GNU 17 os: ubuntu-latest - cpp_version: 17 + cmake_args: -DCMAKE_CXX_STANDARD=17 preset: GNU - name: Linux GNU 20 os: ubuntu-latest - cpp_version: 20 + cmake_args: -DCMAKE_CXX_STANDARD=20 preset: GNU - name: MinGW os: ubuntu-latest - cpp_version: 11 preset: MinGW apt_packages: mingw-w64 wine64 - name: No C++ Standard Library os: ubuntu-latest - cpp_version: 98 preset: no-std-cpp - name: No RTTI os: ubuntu-latest - cpp_version: 98 preset: no-rtti - name: No Exceptions os: ubuntu-latest - cpp_version: 98 preset: no-exceptions - name: No C Standard Library os: ubuntu-latest - cpp_version: 98 preset: no-std-c - name: Coverage os: ubuntu-latest - cpp_version: 11 preset: coverage apt_packages: lcov - name: GCC ARM embedded os: ubuntu-latest - cpp_version: 11 preset: arm-embedded - name: Mac install os: macos-latest - cpp_version: 98 preset: defaults install: true - name: Apple Clang 17 os: macos-latest - cpp_version: 17 + cmake_args: -DCMAKE_CXX_STANDARD=17 preset: Clang - name: Apple Clang 20 os: macos-latest - cpp_version: 20 + cmake_args: -DCMAKE_CXX_STANDARD=20 preset: Clang - name: Mac GNU 14 os: macos-latest - cpp_version: 14 + cmake_args: -DCMAKE_CXX_STANDARD=14 preset: GNU - name: OpenWatcom DOS os: ubuntu-latest - cpp_version: 98 preset: DOS apt_packages: dosbox - name: Cygwin os: windows-latest - cpp_version: 98 preset: GNU name: ${{ matrix.name }} runs-on: ${{ matrix.os }} @@ -220,7 +207,7 @@ jobs: ## BUILD AND TEST - name: Configure - run: cmake --preset ${{ matrix.preset }} -D CMAKE_CXX_STANDARD=${{ matrix.cpp_version }} + run: cmake --preset ${{ matrix.preset }} ${{ matrix.cmake_args }} - name: Build run: cmake --build cpputest_build --verbose - name: Test From 9fa3ab23be5778149d1ecb3e0586893fe453cb04 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 21 Nov 2022 20:01:29 -0800 Subject: [PATCH 0929/1093] Build faster --- .github/workflows/basic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 2624c8ee7..c4fb5d38e 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -209,7 +209,7 @@ jobs: - name: Configure run: cmake --preset ${{ matrix.preset }} ${{ matrix.cmake_args }} - name: Build - run: cmake --build cpputest_build --verbose + run: cmake --build cpputest_build --verbose -j - name: Test run: ctest --test-dir cpputest_build ${{ matrix.ctest_args }} From 6ee9aba75afa413bcd0e8089da71e6a8644ac177 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 25 Nov 2022 12:34:47 -0800 Subject: [PATCH 0930/1093] Improve floating point exception support check Compiler checks are not a reliable indicator of support for floating point exception status flags. Neither is checking that a program can _compile_ with `fenv.h`; linking can still fail (e.g. Open Watcom). This change checks `__STDC_IEC_559__` instead. This macro "expands to 1 if IEC 60559 is supported". --- CMakeLists.txt | 1 - config.h.cmake | 2 -- include/CppUTest/CppUTestConfig.h | 28 +++++-------------------- tests/CppUTestExt/IEEE754PluginTest.cpp | 2 -- 4 files changed, 5 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ef365b29..0ef99d953 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -119,7 +119,6 @@ include(GNUInstallDirs) include(CheckTypeSize) include(CheckStructHasMember) set(CMAKE_REQUIRED_FLAGS ${CMAKE_CXX_FLAGS}) -check_cxx_symbol_exists(FE_DIVBYZERO "fenv.h" CPPUTEST_HAVE_FENV) check_cxx_symbol_exists(fork "unistd.h" CPPUTEST_HAVE_FORK) check_cxx_symbol_exists(waitpid "sys/wait.h" CPPUTEST_HAVE_WAITPID) check_cxx_symbol_exists(gettimeofday "sys/time.h" CPPUTEST_HAVE_GETTIMEOFDAY) diff --git a/config.h.cmake b/config.h.cmake index ceef84562..424c55f2b 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -11,8 +11,6 @@ #cmakedefine CPPUTEST_HAVE_GETTIMEOFDAY -#cmakedefine01 CPPUTEST_HAVE_FENV - #cmakedefine CPPUTEST_STD_C_LIB_DISABLED #cmakedefine CPPUTEST_STD_CPP_LIB_DISABLED diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 1bd37aa05..e9714d673 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -163,35 +163,17 @@ #endif /* - * Handling of IEEE754 floating point exceptions via fenv.h + * Handling of IEEE754 (IEC559) floating point exceptions via fenv.h * Predominantly works on non-Visual C++ compilers and Visual C++ 2008 and newer */ -#ifndef CPPUTEST_FENV_DISABLED - #if !CPPUTEST_USE_STD_C_LIB || \ - (defined(_MSC_VER) && (_MSC_VER < 1800)) || \ - defined(__APPLE__) || \ - (defined(__ghs__) && defined(__ColdFire__)) || \ - defined(__BCPLUSPLUS__) - #define CPPUTEST_FENV_DISABLED - #endif -#endif - #ifndef CPPUTEST_HAVE_FENV - #ifdef CPPUTEST_FENV_DISABLED - #define CPPUTEST_HAVE_FENV 0 - #else - #define CPPUTEST_HAVE_FENV 1 + #if __STDC_IEC_559__ && CPPUTEST_USE_STD_C_LIB + #define CPPUTEST_HAVE_FENV 1 + #else + #define CPPUTEST_HAVE_FENV 0 #endif #endif -#if CPPUTEST_HAVE_FENV -#if defined(__WATCOMC__) || defined(__ARMEL__) || defined(__m68k__) -#define CPPUTEST_FENV_IS_WORKING_PROPERLY 0 -#else -#define CPPUTEST_FENV_IS_WORKING_PROPERLY 1 -#endif -#endif - #ifdef __cplusplus /* * Detection of run-time type information (RTTI) presence. Since it's a diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index 9f90b6f75..ee227040a 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -32,7 +32,6 @@ #include "CppUTestExt/IEEE754ExceptionsPlugin.h" #if CPPUTEST_HAVE_FENV -#if CPPUTEST_FENV_IS_WORKING_PROPERLY #include "IEEE754PluginTest_c.h" @@ -141,4 +140,3 @@ IGNORE_TEST(IEEE754ExceptionsPlugin2, should_not_fail_in_ignored_test) } #endif -#endif From b250c708a2e882da67415e93f6aa7265499a0d63 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 15 Nov 2022 22:59:36 -0800 Subject: [PATCH 0931/1093] Fix ClangCL mapfile --- tests/CMakeLists.txt | 19 +++++++++++++++++++ tests/CppUTest/CMakeLists.txt | 9 +-------- tests/CppUTestExt/CMakeLists.txt | 9 +-------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 8bee1d9b8..5d090ace3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,3 +1,22 @@ +# Helper to handle generating a map file, which is annoyingly tricky. +function(add_mapfile target) + if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") + set(mapfile "$.map") + if(CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC") + # ClangCL (lld-link) can't generate map files + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "IAR") + target_link_options(${target} PRIVATE "SHELL:--map ${mapfile}.map") + elseif(MSVC) + target_link_options(${target} PRIVATE "/MAP:${mapfile}") + elseif( + (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR + (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + ) + target_link_options(${target} PRIVATE "LINKER:-Map=${mapfile}") + endif() + endif() +endfunction() + add_subdirectory(CppUTest) if (CPPUTEST_EXTENSIONS) add_subdirectory(CppUTestExt) diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 43a70dd9a..19da64a25 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -53,14 +53,7 @@ endif() target_link_libraries(CppUTestTests PRIVATE ${CppUTestLibName}) -if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") - target_link_options(CppUTestTests - PRIVATE - $<$:LINKER:-Map=$.map> - "$<$:/MAP>" - $<$:"SHELL:--map $.map"> - ) -endif() +add_mapfile(CppUTestTests) if(CPPUTEST_TEST_DISCOVERY) include(CppUTest) diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index eec13d158..e5145f0ab 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -50,14 +50,7 @@ target_link_libraries(CppUTestExtTests ${CppUTestExtLibName} ) -if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") - target_link_options(CppUTestExtTests - PRIVATE - $<$:LINKER:-Map=$.map> - "$<$:/MAP>" - $<$:"SHELL:--map $.map"> - ) -endif() +add_mapfile(CppUTestExtTests) if(CPPUTEST_TEST_DISCOVERY) include(CppUTest) From f9efd9094c4a430fede9034df027515f31c1d094 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 15 Nov 2022 23:33:04 -0800 Subject: [PATCH 0932/1093] Keep map files --- .github/workflows/basic.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index c4fb5d38e..8ae7b0e72 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -210,6 +210,11 @@ jobs: run: cmake --preset ${{ matrix.preset }} ${{ matrix.cmake_args }} - name: Build run: cmake --build cpputest_build --verbose -j + - name: Save map files + uses: actions/upload-artifact@v3 + with: + name: "${{ matrix.name }} map files" + path: cpputest_build/**/*.map - name: Test run: ctest --test-dir cpputest_build ${{ matrix.ctest_args }} From ed6812651ca8da18a88c2ff032f560de8644ead7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 4 Nov 2022 20:14:08 -0700 Subject: [PATCH 0933/1093] Cleanup GMock usage --- CMakeLists.txt | 1 - cmake/gmock.cmake | 13 ------------- config.h.cmake | 2 -- tests/CppUTestExt/CMakeLists.txt | 6 ++++++ 4 files changed, 6 insertions(+), 16 deletions(-) delete mode 100644 cmake/gmock.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ef99d953..970491a81 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,7 +109,6 @@ if(NOT PROJECT_IS_TOP_LEVEL) set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE) endif() -include(cmake/gmock.cmake) if(PROJECT_IS_TOP_LEVEL) include(cmake/warnings.cmake) endif() diff --git a/cmake/gmock.cmake b/cmake/gmock.cmake deleted file mode 100644 index ccf378e78..000000000 --- a/cmake/gmock.cmake +++ /dev/null @@ -1,13 +0,0 @@ -set(GMOCK_HOME $ENV{GMOCK_HOME}) -if (DEFINED ENV{GMOCK_HOME}) - # GMock pulls in gtest. - set(CPPUTEST_INCLUDE_GTEST_TESTS 1) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTEST_USE_OWN_TR1_TUPLE=1") - include_directories(${GMOCK_HOME}/include ${GMOCK_HOME}/gtest ${GMOCK_HOME}/gtest/include) - add_subdirectory(${GMOCK_HOME} "${CMAKE_CURRENT_BINARY_DIR}/gmock") -endif (DEFINED ENV{GMOCK_HOME}) - -if (CPPUTEST_FLAGS) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CPPUTEST_C_FLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CPPUTEST_CXX_FLAGS}") -endif (CPPUTEST_FLAGS) diff --git a/config.h.cmake b/config.h.cmake index 424c55f2b..d3404aaf9 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -14,6 +14,4 @@ #cmakedefine CPPUTEST_STD_C_LIB_DISABLED #cmakedefine CPPUTEST_STD_CPP_LIB_DISABLED -#cmakedefine INCLUDE_GTEST_TESTS - #endif diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index eec13d158..1e6a326e2 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -36,6 +36,12 @@ if(CPPUTEST_STD_C_LIB_DISABLED) ) endif() +find_package(GTest) +if(GTEST_FOUND) + target_compile_definitions(CppUTestExtTests PRIVATE INCLUDE_GTEST_TESTS) + target_link_libraries(CppUTestExtTests PRIVATE ${GTEST_LIBRARIES}) +endif() + if(MINGW) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads) From 30ecf5221f952afef361fec6779450cc9914f5d7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 11 Nov 2022 22:24:42 -0800 Subject: [PATCH 0934/1093] Test GTest in CMake build --- .github/workflows/basic.yml | 4 ++++ CMakeLists.txt | 2 ++ CMakePresets.json | 7 +++++++ include/CppUTestExt/GTestConvertor.h | 2 +- tests/CppUTestExt/CMakeLists.txt | 24 +++++++++++++++++++++--- 5 files changed, 35 insertions(+), 4 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index c4fb5d38e..20eb44a80 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -137,6 +137,10 @@ jobs: os: ubuntu-latest preset: coverage apt_packages: lcov + - name: Google Test + os: ubuntu-latest + cmake_args: -DCMAKE_CXX_STANDARD=98 + preset: gtest - name: GCC ARM embedded os: ubuntu-latest preset: arm-embedded diff --git a/CMakeLists.txt b/CMakeLists.txt index 970491a81..08a39effe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,8 @@ cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTe ${PROJECT_IS_TOP_LEVEL} "BUILD_TESTING" OFF) cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" ON "CPPUTEST_BUILD_TESTING;CMAKE_CROSSCOMPILING_EMULATOR OR NOT CMAKE_CROSSCOMPILING" OFF) +cmake_dependent_option(CPPUTEST_TEST_GTEST "Test GoogleTest integration" + OFF "CPPUTEST_BUILD_TESTING" OFF) cmake_dependent_option(CPPUTEST_EXAMPLES "Compile and make examples?" ${PROJECT_IS_TOP_LEVEL} "NOT CPPUTEST_STD_CPP_LIB_DISABLED" OFF) cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" diff --git a/CMakePresets.json b/CMakePresets.json index 577ab71c7..2e9f95941 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -126,6 +126,13 @@ "CPPUTEST_TESTS_DETAILED": true } }, + { + "name": "gtest", + "inherits": ["defaults"], + "cacheVariables": { + "CPPUTEST_TEST_GTEST": true + } + }, { "name": "IAR", "inherits": ["defaults"], diff --git a/include/CppUTestExt/GTestConvertor.h b/include/CppUTestExt/GTestConvertor.h index f20de912e..fe5b927d4 100644 --- a/include/CppUTestExt/GTestConvertor.h +++ b/include/CppUTestExt/GTestConvertor.h @@ -101,7 +101,7 @@ class GTestShell : public UtestShell * */ #define GTEST_IMPLEMENTATION_ 1 -#include "src/gtest-internal-inl.h" +#include "../src/gtest-internal-inl.h" #include "CppUTest/TestRegistry.h" #include "CppUTest/TestFailure.h" diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 1e6a326e2..7a46a6507 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -36,10 +36,28 @@ if(CPPUTEST_STD_C_LIB_DISABLED) ) endif() -find_package(GTest) -if(GTEST_FOUND) - target_compile_definitions(CppUTestExtTests PRIVATE INCLUDE_GTEST_TESTS) +if(CPPUTEST_TEST_GTEST) + find_package(GTest) + if(NOT GTest_FOUND) + if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.11") + include(FetchContent) + FetchContent_Declare(googletest + URL https://github.com/google/googletest/archive/release-1.8.0.zip + ) + if(NOT googletest_POPULATED) + FetchContent_Populate(googletest) + add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR}) + endif() + set(GTEST_LIBRARIES gmock gtest) + else() + # FetchContent is not supported. + message(FATAL_ERROR + "GTest not found" + ) + endif() + endif() target_link_libraries(CppUTestExtTests PRIVATE ${GTEST_LIBRARIES}) + target_compile_definitions(CppUTestExtTests PRIVATE CPPUTEST_INCLUDE_GTEST_TESTS) endif() if(MINGW) From 88c710017492f946cf4444c9f75eeca832f353f1 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 12 Nov 2022 12:43:38 -0800 Subject: [PATCH 0935/1093] Run GoogleTest tests --- .github/workflows/basic.yml | 1 + CMakePresets.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 20eb44a80..42ecde5ef 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -141,6 +141,7 @@ jobs: os: ubuntu-latest cmake_args: -DCMAKE_CXX_STANDARD=98 preset: gtest + apt_packages: python2 - name: GCC ARM embedded os: ubuntu-latest preset: arm-embedded diff --git a/CMakePresets.json b/CMakePresets.json index 2e9f95941..e8d9cd8d4 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -130,7 +130,8 @@ "name": "gtest", "inherits": ["defaults"], "cacheVariables": { - "CPPUTEST_TEST_GTEST": true + "CPPUTEST_TEST_GTEST": true, + "gtest_build_tests": true } }, { From 6496894412804738165f4cfa4a0a3fea1c41f86a Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 12 Nov 2022 13:16:44 -0800 Subject: [PATCH 0936/1093] Test GTest config with Ninja GTest tests assume that a multi-config generator is used. Ninja is the only portable one. --- .github/workflows/basic.yml | 9 +++++++-- CMakePresets.json | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 42ecde5ef..30af36a30 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -141,7 +141,8 @@ jobs: os: ubuntu-latest cmake_args: -DCMAKE_CXX_STANDARD=98 preset: gtest - apt_packages: python2 + ctest_args: -C Debug + apt_packages: python2 ninja-build - name: GCC ARM embedded os: ubuntu-latest preset: arm-embedded @@ -216,7 +217,11 @@ jobs: - name: Build run: cmake --build cpputest_build --verbose -j - name: Test - run: ctest --test-dir cpputest_build ${{ matrix.ctest_args }} + run: > + ctest + --test-dir cpputest_build + ${{ matrix.ctest_args }} + --output-on-failure # POST PROCESSING diff --git a/CMakePresets.json b/CMakePresets.json index e8d9cd8d4..edcbe9326 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -129,6 +129,7 @@ { "name": "gtest", "inherits": ["defaults"], + "generator": "Ninja Multi-Config", "cacheVariables": { "CPPUTEST_TEST_GTEST": true, "gtest_build_tests": true From bd3f5ab6948a4e3246e95b5f841d56755ec2de56 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 12 Nov 2022 14:53:23 -0800 Subject: [PATCH 0937/1093] Remove dead option --- CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08a39effe..f6d67cbc8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,9 +35,8 @@ endif() cmake_dependent_option(CPPUTEST_STD_CPP_LIB_DISABLED "Use the standard C++ library" OFF "NOT CPPUTEST_STD_C_LIB_DISABLED" ON) -option(CPPUTEST_FLAGS "Use the CFLAGS/CXXFLAGS/LDFLAGS set by CppUTest" ${PROJECT_IS_TOP_LEVEL}) cmake_dependent_option(CPPUTEST_MEM_LEAK_DETECTION_DISABLED "Enable memory leak detection" - OFF "CPPUTEST_FLAGS;NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED;NOT is_clang_cl" ON) + OFF "NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED;NOT is_clang_cl" ON) option(CPPUTEST_EXTENSIONS "Use the CppUTest extension library" ON) include(CheckTypeSize) check_type_size("long long" SIZEOF_LONGLONG) From dd65fbbe1501136f52e1bb743e6390e0db86a0a6 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 26 Nov 2022 22:59:49 -0800 Subject: [PATCH 0938/1093] Fix report path --- .github/workflows/test-report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-report.yml b/.github/workflows/test-report.yml index 12b8c07c3..97a9d0055 100644 --- a/.github/workflows/test-report.yml +++ b/.github/workflows/test-report.yml @@ -13,5 +13,5 @@ jobs: with: artifact: test-results name: JUnit Tests - path: "cpputest_build/**/cpputest_*.xml" + path: "**/cpputest_*.xml" reporter: java-junit From 8ca2f1591ff85045be1c9cf1010f67bf1dfed8ed Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 31 Aug 2022 10:09:09 -0700 Subject: [PATCH 0939/1093] Add MSYS builds --- .github/workflows/extended.yml | 51 ++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 5cab2b39c..59d1d1c0c 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -71,3 +71,54 @@ jobs: ./configure --disable-longlong - name: Build and test run: make tdd + + cmake_msys: + runs-on: windows-latest + defaults: + run: + shell: msys2 {0} + env: + LDFLAGS: -static + steps: + - name: Checkout + uses: actions/checkout@main + - uses: msys2/setup-msys2@v2 + with: + msystem: MINGW64 + update: true + install: > + git + mingw-w64-x86_64-cc + mingw-w64-x86_64-cmake + mingw-w64-x86_64-make + - name: Configure + run: cmake --preset=GNU + - name: Build + run: cmake --build cpputest_build -j + - name: Test + run: ctest --test-dir cpputest_build --output-on-failure + + autotools_msys: + runs-on: windows-latest + defaults: + run: + shell: msys2 {0} + env: + LDFLAGS: -static + steps: + - uses: actions/checkout@v3 + - uses: msys2/setup-msys2@v2 + with: + msystem: MINGW64 + update: true + install: > + git + mingw-w64-x86_64-autotools + mingw-w64-x86_64-cc + mingw-w64-x86_64-make + - name: Configure + run: | + autoreconf -i . + ./configure + - name: Build and test + run: make tdd From 15cd554f2b08d75c176e33595414935624b17b51 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 29 Nov 2022 00:21:32 -0800 Subject: [PATCH 0940/1093] Update qemu link --- .github/workflows/basic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index b9664b22a..ce17ad48b 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -186,7 +186,7 @@ jobs: - name: Install QEMU # The version in the ubuntu repositories (6.2) is broken. run: | - wget -nv http://ftp.de.debian.org/debian/pool/main/q/qemu/qemu-user-static_7.1+dfsg-2_amd64.deb -O qemu.deb + wget -nv http://ftp.de.debian.org/debian/pool/main/q/qemu/qemu-user-static_7.1+dfsg-2+b3_amd64.deb -O qemu.deb sudo dpkg --install qemu.deb rm -f qemu.deb if: ${{ matrix.name == 'GCC ARM embedded' }} From 6aa562f9931b74b6c50d2dc5e5d26c802f785879 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 5 Dec 2022 08:52:31 -0800 Subject: [PATCH 0941/1093] Pin Ubuntu version See https://github.com/actions/setup-python/issues/543. Supported versions of GTest depends on Python 2 which went end-of-life in January 2020. --- .github/workflows/basic.yml | 2 +- .github/workflows/extended.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 82c99f55d..b12b357f6 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -138,7 +138,7 @@ jobs: preset: coverage apt_packages: lcov - name: Google Test - os: ubuntu-latest + os: ubuntu-20.04 cmake_args: -DCMAKE_CXX_STANDARD=98 preset: gtest ctest_args: -C Debug diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml index 59d1d1c0c..1699694a4 100644 --- a/.github/workflows/extended.yml +++ b/.github/workflows/extended.yml @@ -19,7 +19,7 @@ jobs: path: "cpputest_build/**/cpputest_*.xml" gtest: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 strategy: matrix: version: [15, 16, 17, 18] From c384ed0ab7204240967f5264178029adba1fa6f5 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 19 Nov 2022 12:25:01 -0800 Subject: [PATCH 0942/1093] Configure clang-tidy --- .github/workflows/basic.yml | 3 +++ CMakePresets.json | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 82c99f55d..70d161267 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -70,6 +70,9 @@ jobs: cmake_args: -DCMAKE_CXX_STANDARD=17 preset: ClangCL ctest_args: -C Debug + - name: Clang-Tidy + os: ubuntu-latest + preset: clang-tidy - name: Linux Clang 98 os: ubuntu-latest cmake_args: -DCMAKE_CXX_STANDARD=98 diff --git a/CMakePresets.json b/CMakePresets.json index edcbe9326..c7b693123 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -29,6 +29,14 @@ "CMAKE_CXX_COMPILER": "clang++" } }, + { + "name": "clang-tidy", + "inherits": ["Clang"], + "cacheVariables": { + "CMAKE_CXX_CLANG_TIDY": "clang-tidy;-checks=bugprone-*,-bugprone-easily-swappable-parameters;-warnings-as-errors=*", + "CMAKE_C_CLANG_TIDY": "clang-tidy;-checks=bugprone-*,-bugprone-easily-swappable-parameters;-warnings-as-errors=*" + } + }, { "name": "MSVC", "inherits": ["defaults"], From c0b99c417e9f06a7320c064fc6847fb24fa14256 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 19 Nov 2022 11:59:31 -0800 Subject: [PATCH 0943/1093] Resolve clang-tidy bugprone warnings Most of these issues are pretty innocuous, but I did find a couple places that constructors/destructors were relying on dynamic dispatch. --- examples/AllTests/MockDocumentationTest.cpp | 4 +-- include/CppUTest/UtestMacros.h | 2 +- include/CppUTestExt/MockCheckedActualCall.h | 2 +- src/CppUTest/CommandLineArguments.cpp | 3 +-- src/CppUTest/MemoryLeakWarningPlugin.cpp | 2 +- src/CppUTest/SimpleString.cpp | 26 +++++++++---------- src/CppUTest/TestMemoryAllocator.cpp | 8 +++--- src/CppUTestExt/CodeMemoryReportFormatter.cpp | 2 +- src/CppUTestExt/MockSupport.cpp | 13 ++++++++-- tests/CppUTest/SimpleStringCacheTest.cpp | 2 +- tests/CppUTest/TestFailureNaNTest.cpp | 2 +- tests/CppUTest/TestFailureTest.cpp | 2 +- tests/CppUTest/TestMemoryAllocatorTest.cpp | 2 +- tests/CppUTest/TestUTestMacro.cpp | 8 +++--- tests/CppUTest/UtestPlatformTest.cpp | 2 +- tests/CppUTestExt/OrderedTestTest.cpp | 2 +- 16 files changed, 44 insertions(+), 38 deletions(-) diff --git a/examples/AllTests/MockDocumentationTest.cpp b/examples/AllTests/MockDocumentationTest.cpp index d82e5c800..95dfbcce2 100644 --- a/examples/AllTests/MockDocumentationTest.cpp +++ b/examples/AllTests/MockDocumentationTest.cpp @@ -125,8 +125,8 @@ TEST(MockDocumentation, ObjectParameters) TEST(MockDocumentation, returnValue) { mock().expectOneCall("function").andReturnValue(10); - int value = mock().actualCall("function").returnValue().getIntValue(); - value = mock().returnValue().getIntValue(); + mock().actualCall("function").returnValue().getIntValue(); + int value = mock().returnValue().getIntValue(); LONGS_EQUAL(10, value); } diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 85b2422a5..415b28eb8 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -312,7 +312,7 @@ BITS_LOCATION(expected, actual, mask, text, __FILE__, __LINE__) #define BITS_LOCATION(expected, actual, mask, text, file, line)\ - do { UtestShell::getCurrent()->assertBitsEqual(expected, actual, mask, sizeof(actual), text, file, line); } while(0) + do { UtestShell::getCurrent()->assertBitsEqual(expected, actual, mask, sizeof(actual), text, file, line); } while(0) // NOLINT(bugprone-sizeof-expression) #define ENUMS_EQUAL_INT(expected, actual)\ ENUMS_EQUAL_TYPE(int, expected, actual) diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index 48c3807bb..034dfd6e7 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -150,7 +150,7 @@ class MockCheckedActualCall : public MockActualCall MockOutputParametersListNode* outputParameterExpectations_; virtual void addOutputParameter(const SimpleString& name, const SimpleString& type, void* ptr); - virtual void cleanUpOutputParameterList(); + void cleanUpOutputParameterList(); }; class MockActualCallTrace : public MockActualCall diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index cfeeac0eb..b5d1ac7e0 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -71,8 +71,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument == "-ll") listTestLocations_ = true; else if (argument == "-ri") runIgnored_ = true; else if (argument == "-f") crashOnFail_ = true; - else if (argument == "-e") rethrowExceptions_ = false; - else if (argument == "-ci") rethrowExceptions_ = false; + else if ((argument == "-e") || (argument == "-ci")) rethrowExceptions_ = false; else if (argument.startsWith("-r")) setRepeatCount(ac_, av_, i); else if (argument.startsWith("-g")) addGroupFilter(ac_, av_, i); else if (argument.startsWith("-t")) correctParameters = addGroupDotNameFilter(ac_, av_, i, "-t", false, false); diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index a52c3fc97..4e937ed62 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -131,7 +131,7 @@ void cpputest_free_location_with_leak_detection(void* buffer, const char* file, #undef new #if CPPUTEST_HAVE_EXCEPTIONS -#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) if (memory == NULLPTR) throw CPPUTEST_BAD_ALLOC() +#define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) if ((memory) == NULLPTR) throw CPPUTEST_BAD_ALLOC() #else #define UT_THROW_BAD_ALLOC_WHEN_NULL(memory) #endif diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 0a789d725..1f1082a47 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -62,7 +62,7 @@ GlobalSimpleStringMemoryAccountant::~GlobalSimpleStringMemoryAccountant() void GlobalSimpleStringMemoryAccountant::restoreAllocator() { - if (SimpleString::getStringAllocator() == allocator_) + if (allocator_ && (SimpleString::getStringAllocator() == allocator_)) SimpleString::setStringAllocator(allocator_->originalAllocator()); } @@ -1031,19 +1031,17 @@ SimpleString StringFromMaskedBits(unsigned long value, unsigned long mask, size_ SimpleString StringFromOrdinalNumber(unsigned int number) { - unsigned int onesDigit = number % 10; - - const char* suffix; - if (number >= 11 && number <= 13) { - suffix = "th"; - } else if (3 == onesDigit) { - suffix = "rd"; - } else if (2 == onesDigit) { - suffix = "nd"; - } else if (1 == onesDigit) { - suffix = "st"; - } else { - suffix = "th"; + const char* suffix = "th"; + + if ((number < 11) || (number > 13)) { + unsigned int const onesDigit = number % 10; + if (3 == onesDigit) { + suffix = "rd"; + } else if (2 == onesDigit) { + suffix = "nd"; + } else if (1 == onesDigit) { + suffix = "st"; + } } return StringFromFormat("%u%s", number, suffix); diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 88d31132a..800a97b68 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -418,7 +418,7 @@ MemoryAccountantAllocationNode* MemoryAccountant::createNewAccountantAllocationN void MemoryAccountant::destroyAccountantAllocationNode(MemoryAccountantAllocationNode* node) const { - allocator_->free_memory((char*) node, sizeof(node), __FILE__, __LINE__); + allocator_->free_memory((char*) node, sizeof(node), __FILE__, __LINE__); // NOLINT(bugprone-sizeof-expression) } MemoryAccountant::MemoryAccountant() @@ -479,9 +479,9 @@ MemoryAccountantAllocationNode* MemoryAccountant::findNodeOfSize(size_t size) co { if (useCacheSizes_) { for (MemoryAccountantAllocationNode* node = head_; node; node = node->next_) { - if (size > node->size_ && node->next_ == NULLPTR) - return node; - else if (size <= node->size_ && !(node->next_->size_ != 0 && node->next_->size_ <= size)) + if (((size > node->size_) && (node->next_ == NULLPTR)) + || ((size <= node->size_) && + !((node->next_->size_ != 0) && (node->next_->size_ <= size)))) return node; } } diff --git a/src/CppUTestExt/CodeMemoryReportFormatter.cpp b/src/CppUTestExt/CodeMemoryReportFormatter.cpp index 3fdf95f58..03383c67a 100644 --- a/src/CppUTestExt/CodeMemoryReportFormatter.cpp +++ b/src/CppUTestExt/CodeMemoryReportFormatter.cpp @@ -34,7 +34,7 @@ #define MAX_VARIABLE_NAME_LINE_PART 10 #define MAX_VARIABLE_NAME_FILE_PART 53 #define MAX_VARIABLE_NAME_SEPERATOR_PART 1 -#define MAX_VARIABLE_NAME_LENGTH MAX_VARIABLE_NAME_FILE_PART + MAX_VARIABLE_NAME_SEPERATOR_PART + MAX_VARIABLE_NAME_LINE_PART +#define MAX_VARIABLE_NAME_LENGTH (MAX_VARIABLE_NAME_FILE_PART + MAX_VARIABLE_NAME_SEPERATOR_PART + MAX_VARIABLE_NAME_LINE_PART) struct CodeReportingAllocationNode { diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 1c76c9a73..42d8295ab 100644 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -44,9 +44,18 @@ MockSupport& mock(const SimpleString& mockName, MockFailureReporter* failureRepo } MockSupport::MockSupport(const SimpleString& mockName) - : actualCallOrder_(0), expectedCallOrder_(0), strictOrdering_(false), standardReporter_(&defaultReporter_), ignoreOtherCalls_(false), enabled_(true), lastActualFunctionCall_(NULLPTR), mockName_(mockName), tracing_(false) + : + actualCallOrder_(0), + expectedCallOrder_(0), + strictOrdering_(false), + activeReporter_(NULLPTR), + standardReporter_(&defaultReporter_), + ignoreOtherCalls_(false), + enabled_(true), + lastActualFunctionCall_(NULLPTR), + mockName_(mockName), + tracing_(false) { - setActiveReporter(NULLPTR); } MockSupport::~MockSupport() diff --git a/tests/CppUTest/SimpleStringCacheTest.cpp b/tests/CppUTest/SimpleStringCacheTest.cpp index 1fd08d229..7d9a96a46 100644 --- a/tests/CppUTest/SimpleStringCacheTest.cpp +++ b/tests/CppUTest/SimpleStringCacheTest.cpp @@ -188,7 +188,7 @@ TEST(SimpleStringInternalCache, clearCacheWillRemoveAllCachedMemoryButNotAllUsed char* mem = cache.alloc(10); cache.dealloc(mem, 10); - mem = cache.alloc(60); + cache.alloc(60); cache.clearCache(); diff --git a/tests/CppUTest/TestFailureNaNTest.cpp b/tests/CppUTest/TestFailureNaNTest.cpp index 832aaff2d..841d287d9 100644 --- a/tests/CppUTest/TestFailureNaNTest.cpp +++ b/tests/CppUTest/TestFailureNaNTest.cpp @@ -54,7 +54,7 @@ TEST_GROUP(TestFailureNanAndInf) delete test; } }; -#define FAILURE_EQUAL(a, b) STRCMP_EQUAL_LOCATION(a, b.getMessage().asCharString(), "", __FILE__, __LINE__) +#define FAILURE_EQUAL(a, b) STRCMP_EQUAL_LOCATION(a, (b).getMessage().asCharString(), "", __FILE__, __LINE__) TEST(TestFailureNanAndInf, DoublesEqualExpectedIsNaN) { diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index 55860ba77..e4c0fdf67 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -47,7 +47,7 @@ TEST_GROUP(TestFailure) delete test; } }; -#define FAILURE_EQUAL(a, b) STRCMP_EQUAL_LOCATION(a, b.getMessage().asCharString(), "", __FILE__, __LINE__) +#define FAILURE_EQUAL(a, b) STRCMP_EQUAL_LOCATION(a, (b).getMessage().asCharString(), "", __FILE__, __LINE__) TEST(TestFailure, CreateFailure) { diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 39c432b6f..2f080b7cf 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -127,7 +127,7 @@ TEST(TestMemoryAllocatorTest, NullUnknownNames) #if (! CPPUTEST_SANITIZE_ADDRESS) -#define MAX_SIZE_FOR_ALLOC ((size_t) -1 > (unsigned short)-1) ? (size_t) -97 : (size_t) -1 +#define MAX_SIZE_FOR_ALLOC ((size_t) -1 > (unsigned short)-1) ? (size_t)(-97) : (size_t)(-1) static void failTryingToAllocateTooMuchMemory(void) { diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index c78d83ae1..d6724cb16 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -615,16 +615,16 @@ TEST(UnitTestMacros, FailureWithLONGS_EQUALS) static void failingTestMethodWithLONGS_EQUALWithSymbolicParameters_() { -#define _MONDAY 1 - int day_of_the_week = _MONDAY+1; - LONGS_EQUAL(_MONDAY, day_of_the_week); +#define MONDAY 1 + int day_of_the_week = MONDAY+1; + LONGS_EQUAL(MONDAY, day_of_the_week); TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithLONGS_EQUALShowsSymbolicParameters) { fixture.runTestWithMethod(failingTestMethodWithLONGS_EQUALWithSymbolicParameters_); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("LONGS_EQUAL(_MONDAY, day_of_the_week) failed"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("LONGS_EQUAL(MONDAY, day_of_the_week) failed"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 (0x1)>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <2 (0x2)>"); CHECK_FALSE(fixture.getOutput().contains("Message: ")); diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index 4e88ae6b9..051313001 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -126,7 +126,7 @@ TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, FailureInSepa static int accessViolationTestFunction_() { - return *(volatile int*) NULLPTR; + return *(volatile int*) NULLPTR; // NOLINT(clang-analyzer-core.NullDereference) } TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, AccessViolationInSeparateProcessWorks) diff --git a/tests/CppUTestExt/OrderedTestTest.cpp b/tests/CppUTestExt/OrderedTestTest.cpp index 74225d1ee..2c5688c2e 100644 --- a/tests/CppUTestExt/OrderedTestTest.cpp +++ b/tests/CppUTestExt/OrderedTestTest.cpp @@ -82,7 +82,7 @@ TEST_GROUP(TestOrderedTest) TEST(TestOrderedTest, TestInstallerSetsFields) { - OrderedTestInstaller(orderedTest, "testgroup", "testname", "this.cpp", 10, 5); + OrderedTestInstaller installer(orderedTest, "testgroup", "testname", "this.cpp", 10, 5); STRCMP_EQUAL("testgroup", orderedTest.getGroup().asCharString()); STRCMP_EQUAL("testname", orderedTest.getName().asCharString()); STRCMP_EQUAL("this.cpp", orderedTest.getFile().asCharString()); From 626afc55926af91eda146162bcba6e1c2ab73e68 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 27 Nov 2022 01:12:12 -0800 Subject: [PATCH 0944/1093] Use a config file --- .clang-tidy | 4 ++++ CMakePresets.json | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .clang-tidy diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 000000000..9cb4caa67 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,4 @@ +--- +Checks: "clang-diagnostic-*,clang-analyzer-*,bugprone-*,-bugprone-easily-swappable-parameters" +WarningsAsErrors: "*" +FormatStyle: file diff --git a/CMakePresets.json b/CMakePresets.json index c7b693123..06e6b07c6 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -33,8 +33,8 @@ "name": "clang-tidy", "inherits": ["Clang"], "cacheVariables": { - "CMAKE_CXX_CLANG_TIDY": "clang-tidy;-checks=bugprone-*,-bugprone-easily-swappable-parameters;-warnings-as-errors=*", - "CMAKE_C_CLANG_TIDY": "clang-tidy;-checks=bugprone-*,-bugprone-easily-swappable-parameters;-warnings-as-errors=*" + "CMAKE_CXX_CLANG_TIDY": "clang-tidy", + "CMAKE_C_CLANG_TIDY": "clang-tidy" } }, { From 0ab65c6b04e2bcfd2126042eb1d9f58e69a7fbf4 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 5 Dec 2022 20:10:28 -0800 Subject: [PATCH 0945/1093] Resolve clang-tidy warning --- src/CppUTest/TestMemoryAllocator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index 800a97b68..e48082afd 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -418,7 +418,7 @@ MemoryAccountantAllocationNode* MemoryAccountant::createNewAccountantAllocationN void MemoryAccountant::destroyAccountantAllocationNode(MemoryAccountantAllocationNode* node) const { - allocator_->free_memory((char*) node, sizeof(node), __FILE__, __LINE__); // NOLINT(bugprone-sizeof-expression) + allocator_->free_memory((char*) node, sizeof(*node), __FILE__, __LINE__); } MemoryAccountant::MemoryAccountant() From 37129a15356e1dea4a8aa22d0c1906818f526046 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 5 Dec 2022 23:13:05 -0800 Subject: [PATCH 0946/1093] Merge CodeQL into basic workflow --- .github/workflows/basic.yml | 24 ++++++++++++++++++++++++ .github/workflows/codeql.yml | 30 ------------------------------ 2 files changed, 24 insertions(+), 30 deletions(-) delete mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index b12b357f6..9f543c0eb 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -4,6 +4,8 @@ name: Basic builds "on": push: pull_request: + schedule: + - cron: '0 5 * * 3' jobs: clang-format: @@ -16,6 +18,28 @@ jobs: clangFormatVersion: 14 source: examples + codeql: + runs-on: ubuntu-20.04 + env: + CC: gcc-10 + CXX: g++-10 + name: "CodeQL" + steps: + - name: Checkout + uses: actions/checkout@main + - name: CodeQL Initialization + uses: github/codeql-action/init@v2 + with: + languages: cpp + queries: +security-and-quality + - name: Build + run: | + mkdir _build && cd _build + cmake -DCMAKE_CXX_STANDARD=17 .. + make -j2 + - name: CodeQL Analysis + uses: github/codeql-action/analyze@v2 + automake: strategy: matrix: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index d01af5d7b..000000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: codeql - -on: - push: - pull_request: - schedule: - - cron: '0 5 * * 3' - -jobs: - codeql: - runs-on: ubuntu-20.04 - env: - CC: gcc-10 - CXX: g++-10 - name: "CodeQL" - steps: - - name: Checkout - uses: actions/checkout@main - - name: CodeQL Initialization - uses: github/codeql-action/init@v2 - with: - languages: cpp - queries: +security-and-quality - - name: Build - run: | - mkdir _build && cd _build - cmake -DWERROR=ON -DCMAKE_CXX_STANDARD=17 .. - make -j2 - - name: CodeQL Analysis - uses: github/codeql-action/analyze@v2 From 2d7f6a937b65c1a053aff7d7d8499065a1b6480e Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 28 Nov 2022 23:34:03 -0800 Subject: [PATCH 0947/1093] Require Extensions to build examples --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f6d67cbc8..d2bdbeb38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,7 @@ cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" cmake_dependent_option(CPPUTEST_TEST_GTEST "Test GoogleTest integration" OFF "CPPUTEST_BUILD_TESTING" OFF) cmake_dependent_option(CPPUTEST_EXAMPLES "Compile and make examples?" - ${PROJECT_IS_TOP_LEVEL} "NOT CPPUTEST_STD_CPP_LIB_DISABLED" OFF) + ${PROJECT_IS_TOP_LEVEL} "CPPUTEST_EXTENSIONS;NOT CPPUTEST_STD_CPP_LIB_DISABLED" OFF) cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" OFF "PROJECT_IS_TOP_LEVEL" OFF) From 1cbca4845dd52076d039a5be86a20c1492f4cb3f Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Dec 2022 00:30:01 -0800 Subject: [PATCH 0948/1093] Combine all GitHub workflows --- .github/workflows/basic.yml | 118 +++++++++++++++++++++++++++++++ .github/workflows/extended.yml | 124 --------------------------------- README.md | 3 +- 3 files changed, 119 insertions(+), 126 deletions(-) delete mode 100644 .github/workflows/extended.yml diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 6d6e5170c..4828c3b36 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -278,3 +278,121 @@ jobs: path-to-lcov: lcov.info github-token: ${{ secrets.GITHUB_TOKEN }} if: ${{ matrix.name == 'Coverage' }} + + test_report: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@main + - run: cmake --preset=defaults -DCPPUTEST_JUNIT_REPORT=TRUE + - run: cmake --build cpputest_build -j + - run: ctest --test-dir cpputest_build + - uses: actions/upload-artifact@v3 + if: success() || failure() + with: + name: test-results + path: "cpputest_build/**/cpputest_*.xml" + + gtest: + runs-on: ubuntu-20.04 + strategy: + matrix: + version: [15, 16, 17, 18] + steps: + - name: Install Python 2 + uses: actions/setup-python@v4 + with: + python-version: "2.7" + - name: Checkout + uses: actions/checkout@main + - name: Configure + run: | + autoreconf -i . + ./configure + - name: Build and test + run: make check_gtest${{ matrix.version }} + make_dos: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@main + - name: Install tools + run: | + sudo apt-get install -y dosbox + git clone https://github.com/cpputest/watcom-compiler.git watcom + echo "WATCOM=$GITHUB_WORKSPACE/watcom" >> $GITHUB_ENV + echo "CC=wcl" >> $GITHUB_ENV + echo "CXX=wcl" >> $GITHUB_ENV + echo "$GITHUB_WORKSPACE/watcom/binl" >> $GITHUB_PATH + echo "CPPUTEST_HOME=$GITHUB_WORKSPACE" >> $GITHUB_ENV + - name: Build + run: | + $CC --version + make -f $CPPUTEST_HOME/platforms/Dos/Makefile clean + make -f $CPPUTEST_HOME/platforms/Dos/Makefile + - name: Test + env: + TERM: linux + run: $CPPUTEST_HOME/platforms/Dos/alltests.sh + + automake-no-long-long: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@main + - name: Configure + run: | + autoreconf -i . + ./configure --disable-longlong + - name: Build and test + run: make tdd + + cmake_msys: + runs-on: windows-latest + defaults: + run: + shell: msys2 {0} + env: + LDFLAGS: -static + steps: + - name: Checkout + uses: actions/checkout@main + - uses: msys2/setup-msys2@v2 + with: + msystem: MINGW64 + update: true + install: > + git + mingw-w64-x86_64-cc + mingw-w64-x86_64-cmake + mingw-w64-x86_64-make + - name: Configure + run: cmake --preset=GNU + - name: Build + run: cmake --build cpputest_build -j + - name: Test + run: ctest --test-dir cpputest_build --output-on-failure + + autotools_msys: + runs-on: windows-latest + defaults: + run: + shell: msys2 {0} + env: + LDFLAGS: -static + steps: + - uses: actions/checkout@v3 + - uses: msys2/setup-msys2@v2 + with: + msystem: MINGW64 + update: true + install: > + git + mingw-w64-x86_64-autotools + mingw-w64-x86_64-cc + mingw-w64-x86_64-make + - name: Configure + run: | + autoreconf -i . + ./configure + - name: Build and test + run: make tdd diff --git a/.github/workflows/extended.yml b/.github/workflows/extended.yml deleted file mode 100644 index 1699694a4..000000000 --- a/.github/workflows/extended.yml +++ /dev/null @@ -1,124 +0,0 @@ -name: Extended builds - -on: - push: - pull_request: - -jobs: - test_report: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - run: cmake --preset=defaults -DCPPUTEST_JUNIT_REPORT=TRUE - - run: cmake --build cpputest_build -j - - run: ctest --test-dir cpputest_build - - uses: actions/upload-artifact@v3 - if: success() || failure() - with: - name: test-results - path: "cpputest_build/**/cpputest_*.xml" - - gtest: - runs-on: ubuntu-20.04 - strategy: - matrix: - version: [15, 16, 17, 18] - steps: - - name: Install Python 2 - uses: actions/setup-python@v4 - with: - python-version: "2.7" - - name: Checkout - uses: actions/checkout@main - - name: Configure - run: | - autoreconf -i . - ./configure - - name: Build and test - run: make check_gtest${{ matrix.version }} - make_dos: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@main - - name: Install tools - run: | - sudo apt-get install -y dosbox - git clone https://github.com/cpputest/watcom-compiler.git watcom - echo "WATCOM=$GITHUB_WORKSPACE/watcom" >> $GITHUB_ENV - echo "CC=wcl" >> $GITHUB_ENV - echo "CXX=wcl" >> $GITHUB_ENV - echo "$GITHUB_WORKSPACE/watcom/binl" >> $GITHUB_PATH - echo "CPPUTEST_HOME=$GITHUB_WORKSPACE" >> $GITHUB_ENV - - name: Build - run: | - $CC --version - make -f $CPPUTEST_HOME/platforms/Dos/Makefile clean - make -f $CPPUTEST_HOME/platforms/Dos/Makefile - - name: Test - env: - TERM: linux - run: $CPPUTEST_HOME/platforms/Dos/alltests.sh - - automake-no-long-long: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@main - - name: Configure - run: | - autoreconf -i . - ./configure --disable-longlong - - name: Build and test - run: make tdd - - cmake_msys: - runs-on: windows-latest - defaults: - run: - shell: msys2 {0} - env: - LDFLAGS: -static - steps: - - name: Checkout - uses: actions/checkout@main - - uses: msys2/setup-msys2@v2 - with: - msystem: MINGW64 - update: true - install: > - git - mingw-w64-x86_64-cc - mingw-w64-x86_64-cmake - mingw-w64-x86_64-make - - name: Configure - run: cmake --preset=GNU - - name: Build - run: cmake --build cpputest_build -j - - name: Test - run: ctest --test-dir cpputest_build --output-on-failure - - autotools_msys: - runs-on: windows-latest - defaults: - run: - shell: msys2 {0} - env: - LDFLAGS: -static - steps: - - uses: actions/checkout@v3 - - uses: msys2/setup-msys2@v2 - with: - msystem: MINGW64 - update: true - install: > - git - mingw-w64-x86_64-autotools - mingw-w64-x86_64-cc - mingw-w64-x86_64-make - - name: Configure - run: | - autoreconf -i . - ./configure - - name: Build and test - run: make tdd diff --git a/README.md b/README.md index fe5763d22..151676a0f 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ CppUTest ======== -[![Github basic build](https://github.com/cpputest/cpputest/actions/workflows/basic.yml/badge.svg)](https://github.com/cpputest/cpputest/actions/workflows/basic.yml) -[![Github extended build](https://github.com/cpputest/cpputest/actions/workflows/extended.yml/badge.svg)](https://github.com/cpputest/cpputest/actions/workflows/extended.yml) +[![Github Actions](https://github.com/cpputest/cpputest/actions/workflows/basic.yml/badge.svg)](https://github.com/cpputest/cpputest/actions/workflows/basic.yml) [![AppveyorBuild status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) [![CircleCI status](https://circleci.com/gh/cpputest/cpputest.svg?style=svg)](https://app.circleci.com/pipelines/github/cpputest) [![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) From 3872e0a31b70df7462f5ebabaa9796f96b19fe83 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 20 Nov 2022 15:18:21 -0800 Subject: [PATCH 0949/1093] Run address sanitizer --- .github/workflows/basic.yml | 3 +++ CMakePresets.json | 13 +++++++++++++ tests/CppUTest/UtestTest.cpp | 4 ---- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 4828c3b36..ef89e5cf6 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -170,6 +170,9 @@ jobs: preset: gtest ctest_args: -C Debug apt_packages: python2 ninja-build + - name: Address Sanitizer + os: ubuntu-latest + preset: asan - name: GCC ARM embedded os: ubuntu-latest preset: arm-embedded diff --git a/CMakePresets.json b/CMakePresets.json index 06e6b07c6..704f81207 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -127,6 +127,19 @@ "CPPUTEST_USE_LONG_LONG": false } }, + { + "name": "asan", + "inherits": ["Clang"], + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CPPUTEST_MEM_LEAK_DETECTION_DISABLED": true + }, + "environment": { + "CFLAGS": "-fsanitize=address -fno-omit-frame-pointer", + "CXXFLAGS": "-fsanitize=address -fno-omit-frame-pointer", + "LDFLAGS": "-fsanitize=address" + } + }, { "name": "detailed", "inherits": ["defaults"], diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 5a961c891..ed8b69dfa 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -394,8 +394,6 @@ IGNORE_TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) {} #else -#if !CPPUTEST_SANITIZE_ADDRESS - TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) { fixture.setTestFunction(UtestShell::crash); @@ -406,8 +404,6 @@ TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) #endif -#endif - #if CPPUTEST_HAVE_EXCEPTIONS static bool destructorWasCalledOnFailedTest = false; From 989cd878c6b4e0f649643884e956fdcd1c05e497 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 18 Nov 2022 01:00:48 -0800 Subject: [PATCH 0950/1093] README polish --- README.md | 132 ++++++++++++++++++++++++++---------------------------- 1 file changed, 64 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index 151676a0f..d1de45226 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,14 @@ -CppUTest -======== +# CppUTest -[![Github Actions](https://github.com/cpputest/cpputest/actions/workflows/basic.yml/badge.svg)](https://github.com/cpputest/cpputest/actions/workflows/basic.yml) +[![GitHub Actions](https://github.com/cpputest/cpputest/actions/workflows/basic.yml/badge.svg)](https://github.com/cpputest/cpputest/actions/workflows/basic.yml) [![AppveyorBuild status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) -[![CircleCI status](https://circleci.com/gh/cpputest/cpputest.svg?style=svg)](https://app.circleci.com/pipelines/github/cpputest) [![Coverage Status](https://coveralls.io/repos/cpputest/cpputest/badge.svg?branch=master&service=github)](https://coveralls.io/github/cpputest/cpputest?branch=master) [![ConanCenter package](https://repology.org/badge/version-for-repo/conancenter/cpputest.svg)](https://conan.io/center/cpputest) -Obsolete: -[![Travis Build Status (deprecated)](https://app.travis-ci.com/cpputest/cpputest.svg?branch=master)](https://app.travis-ci.com/github/cpputest/cpputest) - - CppUTest unit testing and mocking framework for C/C++ [More information on the project page](https://cpputest.github.io) - Slack channel: [Join if link not expired](https://join.slack.com/t/cpputest/shared_invite/zt-epq97u9h-6yBQHHl2cvUADjEENtdASw) @@ -23,34 +16,39 @@ Slack channel: You'll need to do the following to get started: -Building from source (unix-based, cygwin, MacOSX): +Building from source (Unix-based, Cygwin, MacOS): -* git clone git://github.com/cpputest/cpputest.git -* cd cpputest_build -* autoreconf .. -i -* ../configure -* make +```bash +git clone git://github.com/cpputest/cpputest.git +cd cpputest_build +autoreconf .. -i +../configure +make +``` -You can use `make install` if you want to install CppUTest system-wide +You can use `make install` if you want to install CppUTest system-wide. You can also use CMake, which also works for Windows Visual Studio. -* Download latest version -* cmake CMakeLists.txt -* make +```bash +git clone git://github.com/cpputest/cpputest.git +cmake -B cpputest_build +cmake --build cpputest_build +``` Then to get started, you'll need to do the following: + * Add the include path to the Makefile. Something like: - * CPPFLAGS += -I$(CPPUTEST_HOME)/include + * `CPPFLAGS += -I$(CPPUTEST_HOME)/include` * Add the memory leak macros to your Makefile (needed for additional debug info!). Something like: - * CXXFLAGS += -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorNewMacros.h - * CFLAGS += -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorMallocMacros.h + * `CXXFLAGS += -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorNewMacros.h` + * `CFLAGS += -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorMallocMacros.h` * Add the library linking to your Makefile. Something like: - * LD_LIBRARIES = -L$(CPPUTEST_HOME)/lib -lCppUTest -lCppUTestExt + * `LD_LIBRARIES = -L$(CPPUTEST_HOME)/lib -lCppUTest -lCppUTestExt` After this, you can write your first test: -```C++ +```cpp TEST_GROUP(FirstTestGroup) { }; @@ -63,51 +61,50 @@ TEST(FirstTestGroup, FirstTest) ## Command line switches -* -h help, shows the latest help, including the parameters we've implemented after updating this README page. -* -v verbose, print each test name as it runs -* -r# repeat the tests some number of times, default is one, default if # is not specified is 2. This is handy if you are experiencing memory leaks related to statics and caches. -* -s# random shuffle the test execution order. # is an integer used for seeding the random number generator. # is optional, and if omitted, the seed value is chosen automatically, which results in a different order every time. The seed value is printed to console to make it possible to reproduce a previously generated execution order. Handy for detecting problems related to dependencies between tests. -* -g group only run test whose group contains the substring group -* -n name only run test whose name contains the substring name -* -f crash on fail, run the tests as normal but, when a test fails, crash rather than report the failure in the normal way +* `-h` help, shows the latest help, including the parameters we've implemented after updating this README page. +* `-v` verbose, print each test name as it runs +* `-r#` repeat the tests some number of times, default is one, default if # is not specified is 2. This is handy if you are experiencing memory leaks related to statics and caches. +* `-s#` random shuffle the test execution order. # is an integer used for seeding the random number generator. # is optional, and if omitted, the seed value is chosen automatically, which results in a different order every time. The seed value is printed to console to make it possible to reproduce a previously generated execution order. Handy for detecting problems related to dependencies between tests. +* `-g` group only run test whose group contains the substring group +* `-n` name only run test whose name contains the substring name +* `-f` crash on fail, run the tests as normal but, when a test fails, crash rather than report the failure in the normal way ## Test Macros -* TEST(group, name) - define a test -* IGNORE_TEST(group, name) - turn off the execution of a test -* TEST_GROUP(group) - Declare a test group to which certain tests belong. This will also create the link needed from another library. -* TEST_GROUP_BASE(group, base) - Same as TEST_GROUP, just use a different base class than Utest -* TEST_SETUP() - Declare a void setup method in a TEST_GROUP - this is the same as declaring void setup() -* TEST_TEARDOWN() - Declare a void setup method in a TEST_GROUP -* IMPORT_TEST_GROUP(group) - Export the name of a test group so it can be linked in from a library. Needs to be done in main. +* `TEST(group, name)` - define a test +* `IGNORE_TEST(group, name)` - turn off the execution of a test +* `TEST_GROUP(group)` - Declare a test group to which certain tests belong. This will also create the link needed from another library. +* `TEST_GROUP_BASE(group, base)` - Same as `TEST_GROUP`, just use a different base class than Utest +* `TEST_SETUP()` - Declare a void setup method in a `TEST_GROUP` - this is the same as declaring void `setup()` +* `TEST_TEARDOWN()` - Declare a void setup method in a `TEST_GROUP` +* `IMPORT_TEST_GROUP(group)` - Export the name of a test group so it can be linked in from a library. Needs to be done in `main`. ## Set up and tear down support -* Each TEST_GROUP may contain a setup and/or a teardown method. -* setup() is called prior to each TEST body and teardown() is called after the test body. +* Each `TEST_GROUP` may contain a `setup` and/or a `teardown` method. +* `setup()` is called prior to each `TEST` body and `teardown()` is called after the test body. ## Assertion Macros The failure of one of these macros causes the current test to immediately exit -* CHECK(boolean condition) - checks any boolean result -* CHECK_TRUE(boolean condition) - checks for true -* CHECK_FALSE(boolean condition) - checks for false -* CHECK_EQUAL(expected, actual) - checks for equality between entities using ==. So if you have a class that supports operator==() you can use this macro to compare two instances. -* STRCMP_EQUAL(expected, actual) - check const char* strings for equality using strcmp -* LONGS_EQUAL(expected, actual) - Compares two numbers -* BYTES_EQUAL(expected, actual) - Compares two numbers, eight bits wide -* POINTERS_EQUAL(expected, actual) - Compares two const void * -* DOUBLES_EQUAL(expected, actual, tolerance) - Compares two doubles within some tolerance -* ENUMS_EQUAL_INT(excepted, actual) - Compares two enums which their underlying type is int -* ENUMS_EQUAL_TYPE(underlying_type, excepted, actual) - Compares two enums which they have the same underlying type -* FAIL(text) - always fails -* TEST_EXIT - Exit the test without failure - useful for contract testing (implementing an assert fake) +* `CHECK(boolean condition)` - checks any boolean result +* `CHECK_TRUE(boolean condition)` - checks for true +* `CHECK_FALSE(boolean condition)` - checks for false +* `CHECK_EQUAL(expected, actual)` - checks for equality between entities using `==`. So if you have a class that supports `operator==()` you can use this macro to compare two instances. +* `STRCMP_EQUAL(expected, actual)` - check const `char*` strings for equality using `strcmp` +* `LONGS_EQUAL(expected, actual)` - Compares two numbers +* `BYTES_EQUAL(expected, actual)` - Compares two numbers, eight bits wide +* `POINTERS_EQUAL(expected, actual)` - Compares two `const void *` +* `DOUBLES_EQUAL(expected, actual, tolerance)` - Compares two doubles within some tolerance +* `ENUMS_EQUAL_INT(excepted, actual)` - Compares two enums which their underlying type is `int` +* `ENUMS_EQUAL_TYPE(underlying_type, excepted, actual)` - Compares two enums which they have the same underlying type +* `FAIL(text)` - always fails +* `TEST_EXIT` - Exit the test without failure - useful for contract testing (implementing an assert fake) +Customize `CHECK_EQUAL` to work with your types that support `operator==()` -Customize CHECK_EQUAL to work with your types that support operator==() - -* Create the function: `SimpleString StringFrom(const yourType&)` +- Create the function: `SimpleString StringFrom(const yourType&)` The Extensions directory has a few of these. @@ -120,7 +117,7 @@ The Extensions directory has a few of these. Example of a main with a TestPlugin: -```C++ +```cpp int main(int ac, char** av) { LogPlugin logPlugin; @@ -136,19 +133,19 @@ Memory leak detection * A platform specific memory leak detection mechanism is provided. * If a test fails and has allocated memory prior to the fail and that memory is not cleaned up by TearDown, a memory leak is reported. It is best to only chase memory leaks when other errors have been eliminated. -* Some code uses lazy initialization and appears to leak when it really does not (for example: gcc stringstream used to in an earlier release). One cause is that some standard library calls allocate something and do not free it until after main (or never). - To find out if a memory leak is due to lazy initialization set the -r switch to run tests twice. The signature of this situation is that the first run shows leaks and the second run shows no leaks. When both runs show leaks, you have a leak to find. +* Some code uses lazy initialization and appears to leak when it really does not (for example: gcc stringstream used to in an earlier release). One cause is that some standard library calls allocate something and do not free it until after `main` (or never). + To find out if a memory leak is due to lazy initialization set the `-r` switch to run tests twice. The signature of this situation is that the first run shows leaks and the second run shows no leaks. When both runs show leaks, you have a leak to find. ## How is memory leak detection implemented? -* Before setup() a memory usage checkpoint is recorded -* After teardown() another checkpoint is taken and compared to the original checkpoint +* Before `setup()` a memory usage checkpoint is recorded +* After `teardown()` another checkpoint is taken and compared to the original checkpoint * In Visual Studio the MS debug heap capabilities are used -* For GCC a simple new/delete count is used in overridden operators new, new[], delete and delete[] +* For GCC a simple new/delete count is used in overridden operators `new`, `new[]`, `delete` and `delete[]` If you use some leaky code that you can't or won't fix you can tell a TEST to ignore a certain number of leaks as in this example: -```C++ +```cpp TEST(MemoryLeakWarningTest, Ignore1) { EXPECT_N_LEAKS(1); @@ -158,7 +155,7 @@ TEST(MemoryLeakWarningTest, Ignore1) ## Example Main -```C++ +```cpp #include "CppUTest/CommandLineTestRunner.h" int main(int ac, char** av) @@ -169,7 +166,7 @@ int main(int ac, char** av) ## Example Test -```C++ +```cpp #include "CppUTest/TestHarness.h" #include "ClassName.h" @@ -200,7 +197,7 @@ TEST(ClassName, Create) ``` There are some scripts that are helpful in creating your initial h, cpp, and -Test files. See scripts/README.TXT +Test files. See scripts/README.TXT ## Conan @@ -229,10 +226,9 @@ target_link_libraries(example_test PRIVATE CppUTest::CppUTestExt) ``` - ## Integration as external CMake project -Sometimes you want to use CppUTest in your project without installing it to your system or for having control over the version you are using. This little snippet get the wanted version from Github and builds it as a library. +Sometimes you want to use CppUTest in your project without installing it to your system or for having control over the version you are using. This little snippet get the wanted version from GitHub and builds it as a library. ```cmake # CppUTest From 6b68b2ff849e1a03b99731af0e6895a9995ee4fc Mon Sep 17 00:00:00 2001 From: Mark Furland Date: Tue, 6 Dec 2022 16:17:49 -0500 Subject: [PATCH 0951/1093] Don't error on OSX when __STDC_IEC_559__ isn't defined 6ee9aba75afa413bcd0e8089da71e6a8644ac177 started using __STDC_IEC_559__ to detect if IEC 60559 is supported, but with apple clang 14.0.0 it was undefined and throwing -Wundef This commit just adds a check for if it's defined before using it. --- include/CppUTest/CppUTestConfig.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index e9714d673..bbe3cb6d2 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -167,7 +167,7 @@ * Predominantly works on non-Visual C++ compilers and Visual C++ 2008 and newer */ #ifndef CPPUTEST_HAVE_FENV - #if __STDC_IEC_559__ && CPPUTEST_USE_STD_C_LIB + #if (defined(__STDC_IEC_559__) && __STDC_IEC_559__) && CPPUTEST_USE_STD_C_LIB #define CPPUTEST_HAVE_FENV 1 #else #define CPPUTEST_HAVE_FENV 0 From eac72661359c35184c3cef17b36ca628d2d855e5 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Dec 2022 18:08:17 -0800 Subject: [PATCH 0952/1093] Name builds --- .github/workflows/basic.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index ef89e5cf6..4094ca54f 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -44,21 +44,24 @@ jobs: strategy: matrix: include: - # Mac OSX - - os: macos-latest + - name: Mac GNU + os: macos-latest cc: gcc cxx: g++ - - os: macos-latest + - name: Mac Clang + os: macos-latest cc: clang cxx: clang++ - # Linux - - os: ubuntu-latest + - name: Linux GNU + os: ubuntu-latest cc: gcc cxx: g++ - - os: ubuntu-latest + - name: Linux Clang + os: ubuntu-latest cc: clang cxx: clang++ runs-on: ${{ matrix.os }} + name: Automake ${{ matrix.name }} steps: - name: Checkout uses: actions/checkout@main @@ -199,7 +202,7 @@ jobs: - name: Cygwin os: windows-latest preset: GNU - name: ${{ matrix.name }} + name: CMake ${{ matrix.name }} runs-on: ${{ matrix.os }} steps: ### SETUP @@ -313,6 +316,7 @@ jobs: ./configure - name: Build and test run: make check_gtest${{ matrix.version }} + make_dos: runs-on: ubuntu-latest steps: From 8170bc24542a8c83a73fd6ba611f92e58aa843e4 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Dec 2022 18:13:12 -0800 Subject: [PATCH 0953/1093] Combine automake and gtest --- .github/workflows/basic.yml | 42 +++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 4094ca54f..c05fab304 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -48,21 +48,42 @@ jobs: os: macos-latest cc: gcc cxx: g++ + target: tdd - name: Mac Clang os: macos-latest cc: clang cxx: clang++ + target: tdd - name: Linux GNU os: ubuntu-latest cc: gcc cxx: g++ + target: tdd - name: Linux Clang os: ubuntu-latest cc: clang cxx: clang++ + target: tdd + - name: GTest 1.5 + os: ubuntu-20.04 + target: check_gtest15 + - name: GTest 1.6 + os: ubuntu-20.04 + target: check_gtest16 + - name: GTest 1.7 + os: ubuntu-20.04 + target: check_gtest17 + - name: GTest 1.8 + os: ubuntu-20.04 + target: check_gtest18 runs-on: ${{ matrix.os }} name: Automake ${{ matrix.name }} steps: + - name: Install Python 2 + uses: actions/setup-python@v4 + with: + python-version: "2.7" + if: ${{ startswith(matrix.name, 'GTest') }} - name: Checkout uses: actions/checkout@main - run: brew install automake @@ -76,7 +97,7 @@ jobs: autoreconf -i . ./configure - name: Build and test - run: make tdd + run: make ${{ matrix.target }} cmake: strategy: @@ -298,25 +319,6 @@ jobs: name: test-results path: "cpputest_build/**/cpputest_*.xml" - gtest: - runs-on: ubuntu-20.04 - strategy: - matrix: - version: [15, 16, 17, 18] - steps: - - name: Install Python 2 - uses: actions/setup-python@v4 - with: - python-version: "2.7" - - name: Checkout - uses: actions/checkout@main - - name: Configure - run: | - autoreconf -i . - ./configure - - name: Build and test - run: make check_gtest${{ matrix.version }} - make_dos: runs-on: ubuntu-latest steps: From c2d2de0e43bf8de6f0cf6d023a3fc0b7a0bb1692 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Dec 2022 18:21:44 -0800 Subject: [PATCH 0954/1093] Combine automake-no-long-long --- .github/workflows/basic.yml | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index c05fab304..589106b2a 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -76,6 +76,10 @@ jobs: - name: GTest 1.8 os: ubuntu-20.04 target: check_gtest18 + - name: Disable long long + os: ubuntu-latest + configure_args: --disable-longlong + target: tdd runs-on: ${{ matrix.os }} name: Automake ${{ matrix.name }} steps: @@ -95,7 +99,7 @@ jobs: - name: Configure run: | autoreconf -i . - ./configure + ./configure ${{ matrix.configure_args }} - name: Build and test run: make ${{ matrix.target }} @@ -343,18 +347,6 @@ jobs: TERM: linux run: $CPPUTEST_HOME/platforms/Dos/alltests.sh - automake-no-long-long: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@main - - name: Configure - run: | - autoreconf -i . - ./configure --disable-longlong - - name: Build and test - run: make tdd - cmake_msys: runs-on: windows-latest defaults: From 66eef569aba875d0708b3fb102e57ba0c0ba4963 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Dec 2022 18:29:33 -0800 Subject: [PATCH 0955/1093] Name remaining builds --- .github/workflows/basic.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 589106b2a..e5bf1e617 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -9,6 +9,7 @@ name: Basic builds jobs: clang-format: + name: Clang Format runs-on: ubuntu-latest steps: - name: Checkout @@ -311,6 +312,7 @@ jobs: if: ${{ matrix.name == 'Coverage' }} test_report: + name: JUnit Test Report runs-on: ubuntu-latest steps: - uses: actions/checkout@main @@ -324,6 +326,7 @@ jobs: path: "cpputest_build/**/cpputest_*.xml" make_dos: + name: Make OpenWatcom DOS runs-on: ubuntu-latest steps: - name: Checkout @@ -348,6 +351,7 @@ jobs: run: $CPPUTEST_HOME/platforms/Dos/alltests.sh cmake_msys: + name: CMake MSYS runs-on: windows-latest defaults: run: @@ -374,6 +378,7 @@ jobs: run: ctest --test-dir cpputest_build --output-on-failure autotools_msys: + name: Automake MSYS runs-on: windows-latest defaults: run: From 8f3edece404c1ac8ca456f2b42269702f7bbd5b7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Dec 2022 18:30:34 -0800 Subject: [PATCH 0956/1093] Fix test report --- .github/workflows/test-report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-report.yml b/.github/workflows/test-report.yml index 97a9d0055..d44746601 100644 --- a/.github/workflows/test-report.yml +++ b/.github/workflows/test-report.yml @@ -2,7 +2,7 @@ name: 'Test Report' "on": workflow_run: - workflows: ['Extended builds'] + workflows: ['Basic builds'] types: - completed jobs: From 1ed74e3aff7a842157968a4801853d34d78da634 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Dec 2022 21:37:22 -0800 Subject: [PATCH 0957/1093] Correct pthreads dependency --- src/CppUTest/CMakeLists.txt | 11 ++++++++--- tests/CppUTest/CMakeLists.txt | 8 -------- tests/CppUTestExt/CMakeLists.txt | 8 -------- 3 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index fc56ccac6..f72e40a5d 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -78,9 +78,14 @@ target_compile_definitions(${CppUTestLibName} $<$:_TIMESPEC_DEFINED> ) -if (WIN32) - target_link_libraries(${CppUTestLibName} winmm) -endif (WIN32) +set(THREADS_PREFER_PTHREAD_FLAG ON) +find_package(Threads) + +target_link_libraries(${CppUTestLibName} + PRIVATE + $<$:winmm> + $<$:${CMAKE_THREAD_LIBS_INIT}> +) add_library(CppUTest::CppUTest ALIAS ${CppUTestLibName}) diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 43a70dd9a..53b8051c0 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -43,14 +43,6 @@ if(CPPUTEST_STD_C_LIB_DISABLED) ) endif() -if(MINGW OR (${CMAKE_HOST_SYSTEM_NAME} MATCHES "OpenBSD")) - set(THREADS_PREFER_PTHREAD_FLAG ON) - find_package(Threads) - if(CMAKE_USE_PTHREADS_INIT) - target_link_libraries(CppUTestTests PRIVATE Threads::Threads) - endif() -endif() - target_link_libraries(CppUTestTests PRIVATE ${CppUTestLibName}) if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 7a46a6507..69a98ae58 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -60,14 +60,6 @@ if(CPPUTEST_TEST_GTEST) target_compile_definitions(CppUTestExtTests PRIVATE CPPUTEST_INCLUDE_GTEST_TESTS) endif() -if(MINGW) - set(THREADS_PREFER_PTHREAD_FLAG ON) - find_package(Threads) - if(CMAKE_USE_PTHREADS_INIT) - target_link_libraries(CppUTestExtTests PRIVATE Threads::Threads) - endif() -endif() - target_link_libraries(CppUTestExtTests PRIVATE ${CppUTestLibName} From 3dcd264b184a59d3deacf94b8e4d6540273a35c5 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 7 Dec 2022 00:55:44 -0800 Subject: [PATCH 0958/1093] Fix C++ warning checks --- cmake/warnings.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index e549d2ce6..375c74376 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -57,7 +57,7 @@ foreach(flag IN LISTS WARNING_COMMON_FLAGS WARNING_C_FLAGS) endforeach() include(CheckCXXCompilerFlag) -foreach(flag IN LISTS WARNING_C_FLAGS WARNING_CXX_ONLY_FLAGS) +foreach(flag IN LISTS WARNING_COMMON_FLAGS WARNING_CXX_ONLY_FLAGS) string(REPLACE "++" "xx" WARNING_CXX_FLAG_VAR "WARNING_CXX_FLAG_${flag}") check_cxx_compiler_flag("${flag}" ${WARNING_CXX_FLAG_VAR}) if(${WARNING_CXX_FLAG_VAR}) From cdc32bb0b04d330a4a18d6725aff31d60a29bf68 Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 16 Nov 2022 17:46:21 +0100 Subject: [PATCH 0959/1093] Remove Eclipse project files --- .cproject | 141 ------------------------- .project | 78 -------------- .settings/org.eclipse.cdt.core.prefs | 152 --------------------------- .settings/org.eclipse.cdt.ui.prefs | 4 - 4 files changed, 375 deletions(-) delete mode 100644 .cproject delete mode 100644 .project delete mode 100644 .settings/org.eclipse.cdt.core.prefs delete mode 100644 .settings/org.eclipse.cdt.ui.prefs diff --git a/.cproject b/.cproject deleted file mode 100644 index 1249a9da3..000000000 --- a/.cproject +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - make - extensions - true - true - true - - - make - - examples - true - true - true - - - make - - cleanExamples - true - true - true - - - - - diff --git a/.project b/.project deleted file mode 100644 index 978d661d1..000000000 --- a/.project +++ /dev/null @@ -1,78 +0,0 @@ - - - CppUTest - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - true - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs deleted file mode 100644 index 7bc75596d..000000000 --- a/.settings/org.eclipse.cdt.core.prefs +++ /dev/null @@ -1,152 +0,0 @@ -#Mon Jun 07 17:30:05 SGT 2010 -eclipse.preferences.version=1 -org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80 -org.eclipse.cdt.core.formatter.alignment_for_compact_if=0 -org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16 -org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48 -org.eclipse.cdt.core.formatter.alignment_for_expression_list=0 -org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=next_line -org.eclipse.cdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.cdt.core.formatter.compact_else_if=true -org.eclipse.cdt.core.formatter.continuation_indentation=2 -org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false -org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true -org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false -org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false -org.eclipse.cdt.core.formatter.indent_empty_lines=false -org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.cdt.core.formatter.indentation.size=4 -org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=insert -org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert -org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert -org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert -org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=true -org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=true -org.eclipse.cdt.core.formatter.lineSplit=200 -org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.cdt.core.formatter.tabulation.char=tab -org.eclipse.cdt.core.formatter.tabulation.size=4 -org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false diff --git a/.settings/org.eclipse.cdt.ui.prefs b/.settings/org.eclipse.cdt.ui.prefs deleted file mode 100644 index b684b38df..000000000 --- a/.settings/org.eclipse.cdt.ui.prefs +++ /dev/null @@ -1,4 +0,0 @@ -#Tue Dec 29 09:23:19 SGT 2009 -eclipse.preferences.version=1 -formatter_profile=_CppUTest Coding Style -formatter_settings_version=1 From f20a956bd2141b707cb3a4457ac6db30f1830d80 Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 7 Dec 2022 17:20:45 +0100 Subject: [PATCH 0960/1093] Mark exception as unused (necessary if compiled without RTTI) --- src/CppUTest/TestFailure.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index cdd943c79..476e3edb6 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -426,6 +426,7 @@ UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test, const s #endif ) { + (void) e; } #endif // CPPUTEST_USE_STD_CPP_LIB #endif // CPPUTEST_HAVE_EXCEPTIONS From 8ce1f61ceb09614556af72cc65a7dba1adf50010 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 7 Dec 2022 08:48:24 -0800 Subject: [PATCH 0961/1093] Fix C++ warning checks --- cmake/warnings.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index 375c74376..ea397d8dc 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -57,7 +57,7 @@ foreach(flag IN LISTS WARNING_COMMON_FLAGS WARNING_C_FLAGS) endforeach() include(CheckCXXCompilerFlag) -foreach(flag IN LISTS WARNING_COMMON_FLAGS WARNING_CXX_ONLY_FLAGS) +foreach(flag IN LISTS WARNING_COMMON_FLAGS WARNING_CXX_FLAGS) string(REPLACE "++" "xx" WARNING_CXX_FLAG_VAR "WARNING_CXX_FLAG_${flag}") check_cxx_compiler_flag("${flag}" ${WARNING_CXX_FLAG_VAR}) if(${WARNING_CXX_FLAG_VAR}) From aed16903ad653983a313fbdfaebc27f559badb21 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 7 Dec 2022 08:53:36 -0800 Subject: [PATCH 0962/1093] Resolve restored warning violation --- tests/DummyUTestPlatform/DummyUTestPlatform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/DummyUTestPlatform/DummyUTestPlatform.cpp b/tests/DummyUTestPlatform/DummyUTestPlatform.cpp index fede3cbc9..e5efafdd3 100644 --- a/tests/DummyUTestPlatform/DummyUTestPlatform.cpp +++ b/tests/DummyUTestPlatform/DummyUTestPlatform.cpp @@ -131,7 +131,7 @@ static PlatformSpecificMutex fakeMutexCreate(void) } PlatformSpecificMutex (*PlatformSpecificMutexCreate)(void) = fakeMutexCreate; -static void fakeMutexFunc(PlatformSpecificMutex mtx) {} +static void fakeMutexFunc(PlatformSpecificMutex) {} void (*PlatformSpecificMutexLock)(PlatformSpecificMutex mtx) = fakeMutexFunc; void (*PlatformSpecificMutexUnlock)(PlatformSpecificMutex mtx) = fakeMutexFunc; void (*PlatformSpecificMutexDestroy)(PlatformSpecificMutex mtx) = fakeMutexFunc; From ded683890723d9b51afe09cacd3142b7af5523d3 Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 7 Dec 2022 17:20:45 +0100 Subject: [PATCH 0963/1093] Mark exception as unused (necessary if compiled without RTTI) --- src/CppUTest/TestFailure.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index cdd943c79..476e3edb6 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -426,6 +426,7 @@ UnexpectedExceptionFailure::UnexpectedExceptionFailure(UtestShell* test, const s #endif ) { + (void) e; } #endif // CPPUTEST_USE_STD_CPP_LIB #endif // CPPUTEST_HAVE_EXCEPTIONS From d9a272825c3fd50f7ea0ac2dcf155799a2cbed66 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 7 Dec 2022 18:54:51 -0800 Subject: [PATCH 0964/1093] Resolve windows platform warnings --- examples/AllTests/MockPrinter.h | 2 +- src/Platforms/VisualCpp/UtestPlatform.cpp | 14 +++++++------- tests/CppUTest/TestFailureNaNTest.cpp | 12 ++++++------ tests/CppUTest/UtestTest.cpp | 16 ++++++++-------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/examples/AllTests/MockPrinter.h b/examples/AllTests/MockPrinter.h index c13f1d1f3..7a089f376 100644 --- a/examples/AllTests/MockPrinter.h +++ b/examples/AllTests/MockPrinter.h @@ -44,7 +44,7 @@ class MockPrinter : public Printer { public: explicit MockPrinter() {} - virtual ~MockPrinter() {} + virtual ~MockPrinter() _destructor_override {} virtual void Print(const char* s) _override { diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index 78b5fa5b4..ccaed304f 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -16,7 +16,7 @@ #include #include "CppUTest/PlatformSpecificFunctions.h" -#include +#include #include #include @@ -45,7 +45,7 @@ static int VisualCppSetJmp(void (*function) (void* data), void* data) return 0; } -static void VisualCppLongJmp() +_no_return_ static void VisualCppLongJmp() { jmp_buf_index--; longjmp(test_exit_jmp_buf[jmp_buf_index], 1); @@ -60,7 +60,7 @@ int (*PlatformSpecificSetJmp)(void (*function) (void*), void* data) = VisualCppS void (*PlatformSpecificLongJmp)(void) = VisualCppLongJmp; void (*PlatformSpecificRestoreJumpBuffer)(void) = VisualCppRestoreJumpBuffer; -static void VisualCppRunTestInASeperateProcess(UtestShell* shell, TestPlugin* plugin, TestResult* result) +static void VisualCppRunTestInASeperateProcess(UtestShell* shell, TestPlugin* /* plugin */, TestResult* result) { result->addFailure(TestFailure(shell, "-p doesn't work on this platform, as it is lacking fork.\b")); } @@ -105,7 +105,7 @@ long (*GetPlatformSpecificTimeInMillis)() = VisualCppTimeInMillis; static const char* VisualCppTimeString() { - time_t the_time = time(NULL); + time_t the_time = time(NULLPTR); struct tm the_local_time; static char dateTime[80]; LOCALTIME(&the_local_time, &the_time); @@ -119,21 +119,21 @@ const char* (*GetPlatformSpecificTimeString)() = VisualCppTimeString; static int VisualCppVSNprintf(char *str, size_t size, const char* format, va_list args) { - char* buf = 0; + char* buf = NULLPTR; size_t sizeGuess = size; int result = _VSNPRINTF( str, size, _TRUNCATE, format, args); str[size-1] = 0; while (result == -1) { - if (buf != 0) + if (buf) free(buf); sizeGuess += 10; buf = (char*)malloc(sizeGuess); result = _VSNPRINTF( buf, sizeGuess, _TRUNCATE, format, args); } - if (buf != 0) + if (buf) free(buf); return result; diff --git a/tests/CppUTest/TestFailureNaNTest.cpp b/tests/CppUTest/TestFailureNaNTest.cpp index 841d287d9..4bcd6c51d 100644 --- a/tests/CppUTest/TestFailureNaNTest.cpp +++ b/tests/CppUTest/TestFailureNaNTest.cpp @@ -58,7 +58,7 @@ TEST_GROUP(TestFailureNanAndInf) TEST(TestFailureNanAndInf, DoublesEqualExpectedIsNaN) { - DoublesEqualFailure f(test, failFileName, failLineNumber, NAN, 2.0, 3.0, ""); + DoublesEqualFailure f(test, failFileName, failLineNumber, (double)NAN, 2.0, 3.0, ""); FAILURE_EQUAL("expected \n" "\tbut was <2> threshold used was <3>\n" "\tCannot make comparisons with Nan", f); @@ -66,7 +66,7 @@ TEST(TestFailureNanAndInf, DoublesEqualExpectedIsNaN) TEST(TestFailureNanAndInf, DoublesEqualActualIsNaN) { - DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, NAN, 3.0, ""); + DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, (double)NAN, 3.0, ""); FAILURE_EQUAL("expected <1>\n" "\tbut was threshold used was <3>\n" "\tCannot make comparisons with Nan", f); @@ -74,7 +74,7 @@ TEST(TestFailureNanAndInf, DoublesEqualActualIsNaN) TEST(TestFailureNanAndInf, DoublesEqualThresholdIsNaN) { - DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, 2.0, NAN, ""); + DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, 2.0, (double)NAN, ""); FAILURE_EQUAL("expected <1>\n" "\tbut was <2> threshold used was \n" "\tCannot make comparisons with Nan", f); @@ -82,21 +82,21 @@ TEST(TestFailureNanAndInf, DoublesEqualThresholdIsNaN) TEST(TestFailureNanAndInf, DoublesEqualExpectedIsInf) { - DoublesEqualFailure f(test, failFileName, failLineNumber, INFINITY, 2.0, 3.0, ""); + DoublesEqualFailure f(test, failFileName, failLineNumber, (double)INFINITY, 2.0, 3.0, ""); FAILURE_EQUAL("expected \n" "\tbut was <2> threshold used was <3>", f); } TEST(TestFailureNanAndInf, DoublesEqualActualIsInf) { - DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, INFINITY, 3.0, ""); + DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, (double)INFINITY, 3.0, ""); FAILURE_EQUAL("expected <1>\n" "\tbut was threshold used was <3>", f); } TEST(TestFailureNanAndInf, DoublesEqualThresholdIsInf) { - DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, NAN, INFINITY, ""); + DoublesEqualFailure f(test, failFileName, failLineNumber, 1.0, (double)NAN, (double)INFINITY, ""); FAILURE_EQUAL("expected <1>\n" "\tbut was threshold used was \n" "\tCannot make comparisons with Nan", f); diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index ed8b69dfa..674b7f643 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -71,20 +71,20 @@ TEST(UtestShell, compareDoubles) #ifdef NAN TEST(UtestShell, compareDoublesNaN) { - CHECK(!doubles_equal(NAN, 1.001, 0.01)); - CHECK(!doubles_equal(1.0, NAN, 0.01)); - CHECK(!doubles_equal(1.0, 1.001, NAN)); + CHECK(!doubles_equal((double)NAN, 1.001, 0.01)); + CHECK(!doubles_equal(1.0, (double)NAN, 0.01)); + CHECK(!doubles_equal(1.0, 1.001, (double)NAN)); } #endif #ifdef INFINITY TEST(UtestShell, compareDoublesInf) { - CHECK(!doubles_equal(INFINITY, 1.0, 0.01)); - CHECK(!doubles_equal(1.0, INFINITY, 0.01)); - CHECK(doubles_equal(1.0, -1.0, INFINITY)); - CHECK(doubles_equal(INFINITY, INFINITY, 0.01)); - CHECK(doubles_equal(INFINITY, INFINITY, INFINITY)); + CHECK(!doubles_equal((double)INFINITY, 1.0, 0.01)); + CHECK(!doubles_equal(1.0, (double)INFINITY, 0.01)); + CHECK(doubles_equal(1.0, -1.0, (double)INFINITY)); + CHECK(doubles_equal((double)INFINITY, (double)INFINITY, 0.01)); + CHECK(doubles_equal((double)INFINITY, (double)INFINITY, (double)INFINITY)); } #endif From 3d91a20558d3eb7d198411703e724261550b4ce7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 15 Nov 2022 21:28:57 -0800 Subject: [PATCH 0965/1093] Delete extraneous install configs --- cmake/install.cmake | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/cmake/install.cmake b/cmake/install.cmake index df8bee04d..f58ba31b9 100644 --- a/cmake/install.cmake +++ b/cmake/install.cmake @@ -2,9 +2,6 @@ set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") set(LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") set(INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") -# Pkg-config file -set(CppUTest_PKGCONFIG_FILE ${CMAKE_CURRENT_BINARY_DIR}/cpputest.pc) - # Pkg-config file. set(prefix "${CMAKE_INSTALL_PREFIX}") set(exec_prefix "\${prefix}") @@ -12,9 +9,9 @@ set(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}") set(includedir "\${prefix}/${INCLUDE_INSTALL_DIR}") set(PACKAGE_VERSION "${PROJECT_VERSION}") -configure_file(cpputest.pc.in "${CppUTest_PKGCONFIG_FILE}" @ONLY) +configure_file(cpputest.pc.in cpputest.pc @ONLY) install( - FILES "${CppUTest_PKGCONFIG_FILE}" + FILES "${CMAKE_CURRENT_BINARY_DIR}/cpputest.pc" DESTINATION ${LIB_INSTALL_DIR}/pkgconfig ) @@ -23,20 +20,7 @@ install( DESTINATION "${INCLUDE_INSTALL_DIR}/generated" ) -# Try to include helper module -include(CMakePackageConfigHelpers OPTIONAL - RESULT_VARIABLE PkgHelpers_AVAILABLE -) - -# guard against older versions of cmake which do not provide it -if(NOT PkgHelpers_AVAILABLE) - message(WARNING - "If you wish to use find_package(CppUTest) in your own project to find CppUTest library" - " please update cmake to version which provides CMakePackageConfighelpers module" - " or write generators for CppUTestConfig.cmake by yourself." - ) - return() -endif() +include(CMakePackageConfigHelpers) set(CPPUTEST_CONFIG_DEST "${LIB_INSTALL_DIR}/CppUTest/cmake") @@ -46,13 +30,14 @@ configure_package_config_file(CppUTestConfig.cmake.install.in PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake - VERSION ${PROJECT_VERSION} - COMPATIBILITY SameMajorVersion ) + COMPATIBILITY SameMajorVersion +) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/install/CppUTestConfigVersion.cmake - DESTINATION "${CPPUTEST_CONFIG_DEST}" ) + DESTINATION "${CPPUTEST_CONFIG_DEST}" +) install( EXPORT CppUTestTargets NAMESPACE CppUTest:: @@ -76,6 +61,5 @@ configure_package_config_file(CppUTestConfig.cmake.build.in ) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/CppUTestConfigVersion.cmake - VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion ) From 3014b91ddeee7f1575d26f2e7dad2b8cbda9a905 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 3 Nov 2022 18:22:22 -0700 Subject: [PATCH 0966/1093] Test gtest 1.10 --- .github/workflows/basic.yml | 3 +++ Makefile.am | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 7d5786941..b99197ba2 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -77,6 +77,9 @@ jobs: - name: GTest 1.8 os: ubuntu-20.04 target: check_gtest18 + - name: GTest 1.10 + os: ubuntu-20.04 + target: check_gtest110 - name: Disable long long os: ubuntu-latest configure_args: --disable-longlong diff --git a/Makefile.am b/Makefile.am index a770a68b8..6976e8453 100644 --- a/Makefile.am +++ b/Makefile.am @@ -260,6 +260,12 @@ if INCLUDE_CPPUTEST_EXT ./$(CPPUTESTEXT_TESTS) endif +cpputest_build_gtest110: + mkdir -p cpputest_build_gtest110 + cd cpputest_build_gtest110; \ + wget https://github.com/google/googletest/archive/refs/tags/release-1.10.0.zip -O gtest-1.10.0.zip && unzip gtest-1.10.0.zip; \ + cd googletest-release-1.10.0; cmake .; make + cpputest_build_gtest18: mkdir -p cpputest_build_gtest18 cd cpputest_build_gtest18; \ @@ -311,13 +317,20 @@ check_gtest18: cpputest_build_gtest18 export GTEST_HOME=`pwd`/cpputest_build_gtest18/googletest-release-1.8.0/googletest; \ make distclean; $(srcdir)/configure --enable-std-cpp98; make check +check_gtest110: cpputest_build_gtest110 + @echo "Build using gmock 1.10" + export GMOCK_MOCK=`pwd`/cpputest_build_gtest110/googletest-release-1.10.0; \ + export GTEST_HOME=`pwd`/cpputest_build_gtest110/googletest-release-1.10.0; \ + make distclean; $(srcdir)/configure --enable-std-cpp11; make check + remove_gtest_directories: rm -rf cpputest_build_gtest15 rm -rf cpputest_build_gtest16 rm -rf cpputest_build_gtest17 rm -rf cpputest_build_gtest18 + rm -rf cpputest_build_gtest110 -check_gtest: remove_gtest_directories check_gtest15 check_gtest16 check_gtest17 check_gtest18 +check_gtest: remove_gtest_directories check_gtest15 check_gtest16 check_gtest17 check_gtest18 check_gtest110 check_basic: @echo "If dash is available, run the configure with dash to find bash-isms and increase portability" From a91d6c56a89a5c28a26a072d89f1c45e65c79ff8 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 3 Nov 2022 19:01:18 -0700 Subject: [PATCH 0967/1093] test with gtest 1.11 --- .github/workflows/basic.yml | 3 +++ Makefile.am | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index b99197ba2..78199c634 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -80,6 +80,9 @@ jobs: - name: GTest 1.10 os: ubuntu-20.04 target: check_gtest110 + - name: GTest 1.11 + os: ubuntu-20.04 + target: check_gtest111 - name: Disable long long os: ubuntu-latest configure_args: --disable-longlong diff --git a/Makefile.am b/Makefile.am index 6976e8453..27df95d95 100644 --- a/Makefile.am +++ b/Makefile.am @@ -260,6 +260,13 @@ if INCLUDE_CPPUTEST_EXT ./$(CPPUTESTEXT_TESTS) endif + +cpputest_build_gtest111: + mkdir -p cpputest_build_gtest111 + cd cpputest_build_gtest111; \ + wget https://github.com/google/googletest/archive/refs/tags/release-1.11.0.zip -O gtest-1.11.0.zip && unzip gtest-1.11.0.zip; \ + cd googletest-release-1.11.0; cmake .; make + cpputest_build_gtest110: mkdir -p cpputest_build_gtest110 cd cpputest_build_gtest110; \ @@ -323,14 +330,21 @@ check_gtest110: cpputest_build_gtest110 export GTEST_HOME=`pwd`/cpputest_build_gtest110/googletest-release-1.10.0; \ make distclean; $(srcdir)/configure --enable-std-cpp11; make check +check_gtest111: cpputest_build_gtest111 + @echo "Build using gmock 1.11" + export GMOCK_MOCK=`pwd`/cpputest_build_gtest111/googletest-release-1.11.0; \ + export GTEST_HOME=`pwd`/cpputest_build_gtest111/googletest-release-1.11.0; \ + make distclean; $(srcdir)/configure --enable-std-cpp11; make check + remove_gtest_directories: rm -rf cpputest_build_gtest15 rm -rf cpputest_build_gtest16 rm -rf cpputest_build_gtest17 rm -rf cpputest_build_gtest18 rm -rf cpputest_build_gtest110 + rm -rf cpputest_build_gtest111 -check_gtest: remove_gtest_directories check_gtest15 check_gtest16 check_gtest17 check_gtest18 check_gtest110 +check_gtest: remove_gtest_directories check_gtest15 check_gtest16 check_gtest17 check_gtest18 check_gtest110 check_gtest111 check_basic: @echo "If dash is available, run the configure with dash to find bash-isms and increase portability" From 7c45bff0cdf93b5a175107d2e16341b4c0c7359b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 3 Nov 2022 19:06:17 -0700 Subject: [PATCH 0968/1093] test with gtest 1.12 --- .github/workflows/basic.yml | 3 +++ Makefile.am | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 78199c634..99fdbb10a 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -83,6 +83,9 @@ jobs: - name: GTest 1.11 os: ubuntu-20.04 target: check_gtest111 + - name: GTest 1.12 + os: ubuntu-20.04 + target: check_gtest112 - name: Disable long long os: ubuntu-latest configure_args: --disable-longlong diff --git a/Makefile.am b/Makefile.am index 27df95d95..fd1870225 100644 --- a/Makefile.am +++ b/Makefile.am @@ -261,6 +261,12 @@ if INCLUDE_CPPUTEST_EXT endif +cpputest_build_gtest112: + mkdir -p cpputest_build_gtest112 + cd cpputest_build_gtest112; \ + wget https://github.com/google/googletest/archive/refs/tags/release-1.12.1.zip -O gtest-1.12.1.zip && unzip gtest-1.12.1.zip; \ + cd googletest-release-1.12.1; cmake .; make + cpputest_build_gtest111: mkdir -p cpputest_build_gtest111 cd cpputest_build_gtest111; \ @@ -336,6 +342,12 @@ check_gtest111: cpputest_build_gtest111 export GTEST_HOME=`pwd`/cpputest_build_gtest111/googletest-release-1.11.0; \ make distclean; $(srcdir)/configure --enable-std-cpp11; make check +check_gtest112: cpputest_build_gtest112 + @echo "Build using gmock 1.12" + export GMOCK_MOCK=`pwd`/cpputest_build_gtest121/googletest-release-1.12.1; \ + export GTEST_HOME=`pwd`/cpputest_build_gtest121/googletest-release-1.12.1; \ + make distclean; $(srcdir)/configure --enable-std-cpp11; make check + remove_gtest_directories: rm -rf cpputest_build_gtest15 rm -rf cpputest_build_gtest16 @@ -343,8 +355,9 @@ remove_gtest_directories: rm -rf cpputest_build_gtest18 rm -rf cpputest_build_gtest110 rm -rf cpputest_build_gtest111 + rm -rf cpputest_build_gtest112 -check_gtest: remove_gtest_directories check_gtest15 check_gtest16 check_gtest17 check_gtest18 check_gtest110 check_gtest111 +check_gtest: remove_gtest_directories check_gtest15 check_gtest16 check_gtest17 check_gtest18 check_gtest110 check_gtest111 check_gtest112 check_basic: @echo "If dash is available, run the configure with dash to find bash-isms and increase portability" From 07224dff1ee25668b3fc00a290ead43a76636fd8 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 29 Oct 2022 15:01:35 -0700 Subject: [PATCH 0969/1093] Drop confusing *LibName variables These make the code very confusing and I cannot understand the use case. Multiple architectures cannot exist in the same CMake project. When installing, multiple architectures should probably be installed to different locations, not have different names. The native [`CMAKE__POSTFIX`](https://cmake.org/cmake/help/latest/variable/CMAKE_CONFIG_POSTFIX.html) variable can be used to append arbitrary suffixes to installed libraries. This removes changes from #1538. I may not have all the context here. So I'd appreciate any insight @jgonzalezdr has on what this was originally intended to support. --- CMakeLists.txt | 19 ++----------------- src/CppUTest/CMakeLists.txt | 18 +++++++++--------- src/CppUTestExt/CMakeLists.txt | 10 +++++----- tests/CppUTest/CMakeLists.txt | 2 +- tests/CppUTestExt/CMakeLists.txt | 4 ++-- 5 files changed, 19 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d2bdbeb38..0fa55ab9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,8 +51,6 @@ cmake_dependent_option(CPPUTEST_TEST_GTEST "Test GoogleTest integration" OFF "CPPUTEST_BUILD_TESTING" OFF) cmake_dependent_option(CPPUTEST_EXAMPLES "Compile and make examples?" ${PROJECT_IS_TOP_LEVEL} "CPPUTEST_EXTENSIONS;NOT CPPUTEST_STD_CPP_LIB_DISABLED" OFF) -cmake_dependent_option(CPPUTEST_LIBNAME_POSTFIX_BITSIZE "Add architecture bitsize (32/64) to the library name?" - OFF "PROJECT_IS_TOP_LEVEL" OFF) if(NOT DEFINED CPPUTEST_PLATFORM) if(DEFINED CPP_PLATFORM) @@ -92,19 +90,6 @@ check_cxx_symbol_exists(fopen_s "stdio.h" CPPUTEST_HAVE_SECURE_STDLIB) cmake_dependent_option(CPPUTEST_USE_SECURE_STDLIB "Use MSVC safe functions" ON "WIN32;CPPUTEST_HAVE_SECURE_STDLIB" OFF) -set( CppUTestLibName "CppUTest" ) -set( CppUTestExtLibName "CppUTestExt" ) - -if(CPPUTEST_LIBNAME_POSTFIX_BITSIZE) - if( "${CMAKE_SIZEOF_VOID_P}" STREQUAL "8" ) - set( CppUTestLibName "${CppUTestLibName}64" ) - set( CppUTestExtLibName "${CppUTestExtLibName}64" ) - elseif( "${CMAKE_SIZEOF_VOID_P}" STREQUAL "4" ) - set( CppUTestLibName "${CppUTestLibName}32" ) - set( CppUTestExtLibName "${CppUTestExtLibName}32" ) - endif() -endif() - list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules") if(NOT PROJECT_IS_TOP_LEVEL) set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE) @@ -139,11 +124,11 @@ configure_file ( add_subdirectory(src) -target_include_directories(${CppUTestLibName} +target_include_directories(CppUTest PUBLIC $ ) -target_compile_definitions(${CppUTestLibName} +target_compile_definitions(CppUTest PUBLIC HAVE_CONFIG_H ) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index f72e40a5d..f8c35a09a 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(${CppUTestLibName} +add_library(CppUTest CommandLineArguments.cpp MemoryLeakWarningPlugin.cpp TestHarness_c.cpp @@ -49,11 +49,11 @@ add_library(${CppUTestLibName} #[[Set CPPUTEST_PLATFORM in a parent CMakeLists.txt if reusing one of the provided platforms, else supply the missing definitions]] if(CPPUTEST_PLATFORM) - target_sources(${CppUTestLibName} + target_sources(CppUTest PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../Platforms/${CPPUTEST_PLATFORM}/UtestPlatform.cpp ) - target_include_directories(${CppUTestLibName} + target_include_directories(CppUTest PUBLIC $ ) @@ -65,13 +65,13 @@ if (MINGW) endif() #[[Arrange for the include directory to be added to the include paths of any CMake target depending on CppUTest.]] -target_include_directories(${CppUTestLibName} +target_include_directories(CppUTest PUBLIC $ $ ) -target_compile_definitions(${CppUTestLibName} +target_compile_definitions(CppUTest PRIVATE $<$:STDC_WANT_SECURE_LIB> # Apply workaround for MinGW timespec redefinition (pthread.h / time.h). @@ -81,13 +81,13 @@ target_compile_definitions(${CppUTestLibName} set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads) -target_link_libraries(${CppUTestLibName} +target_link_libraries(CppUTest PRIVATE $<$:winmm> $<$:${CMAKE_THREAD_LIBS_INIT}> ) -add_library(CppUTest::CppUTest ALIAS ${CppUTestLibName}) +add_library(CppUTest::CppUTest ALIAS CppUTest) if(NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) if(MSVC) @@ -97,7 +97,7 @@ if(NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) else() set(force_include "-include") endif() - target_compile_options(${CppUTestLibName} + target_compile_options(CppUTest PUBLIC "$<$:${force_include}CppUTest/MemoryLeakDetectorMallocMacros.h>" "$<$:${force_include}CppUTest/MemoryLeakDetectorNewMacros.h>" @@ -107,7 +107,7 @@ endif() # Installation if(PROJECT_IS_TOP_LEVEL) install( - TARGETS ${CppUTestLibName} + TARGETS CppUTest EXPORT CppUTestTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index d17eff532..ec0f27586 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(${CppUTestExtLibName} STATIC +add_library(CppUTestExt STATIC CodeMemoryReportFormatter.cpp GTest.cpp IEEE754ExceptionsPlugin.cpp @@ -37,20 +37,20 @@ add_library(${CppUTestExtLibName} STATIC ${PROJECT_SOURCE_DIR}/include/CppUTestExt/MockSupport.h ) -target_link_libraries(${CppUTestExtLibName} PUBLIC ${CppUTestLibName}) +target_link_libraries(CppUTestExt PUBLIC CppUTest) #[[Arrange for the include directory to be added to the include paths of any CMake target depending on CppUTestExt.]] -target_include_directories(${CppUTestExtLibName} +target_include_directories(CppUTestExt PUBLIC $ $ ) -add_library(CppUTest::CppUTestExt ALIAS ${CppUTestExtLibName}) +add_library(CppUTest::CppUTestExt ALIAS CppUTestExt) if(PROJECT_IS_TOP_LEVEL) install( - TARGETS ${CppUTestExtLibName} + TARGETS CppUTestExt EXPORT CppUTestTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index e3d8305ae..861fd1116 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -43,7 +43,7 @@ if(CPPUTEST_STD_C_LIB_DISABLED) ) endif() -target_link_libraries(CppUTestTests PRIVATE ${CppUTestLibName}) +target_link_libraries(CppUTestTests PRIVATE CppUTest) add_mapfile(CppUTestTests) diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 95342460a..064275ba4 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -62,8 +62,8 @@ endif() target_link_libraries(CppUTestExtTests PRIVATE - ${CppUTestLibName} - ${CppUTestExtLibName} + CppUTest + CppUTestExt ) add_mapfile(CppUTestExtTests) From 5aa746ed9a92db6b11d2df48471809b8c7431da2 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 15 Nov 2022 17:38:36 -0800 Subject: [PATCH 0970/1093] Remove backticks This is really dumb, but the '`' character is not technically supported by either the C[1] or C++[2] languages. Some especially strict compilers and linters will complain. [1]: https://en.cppreference.com/w/c/language/charset [2]: https://en.cppreference.com/w/cpp/language/charset --- examples/AllTests/AllTests.cpp | 2 +- examples/AllTests/AllTests.h | 2 +- examples/AllTests/CircularBufferTest.cpp | 2 +- examples/AllTests/EventDispatcherTest.cpp | 2 +- examples/AllTests/FEDemoTest.cpp | 2 +- examples/AllTests/HelloTest.cpp | 2 +- examples/AllTests/MockDocumentationTest.cpp | 2 +- examples/AllTests/MockPrinter.h | 2 +- examples/AllTests/PrinterTest.cpp | 2 +- examples/ApplicationLib/CircularBuffer.cpp | 2 +- examples/ApplicationLib/CircularBuffer.h | 2 +- examples/ApplicationLib/EventDispatcher.cpp | 2 +- examples/ApplicationLib/EventDispatcher.h | 2 +- examples/ApplicationLib/ExamplesNewOverrides.h | 2 +- examples/ApplicationLib/Printer.cpp | 2 +- examples/ApplicationLib/Printer.h | 2 +- examples/ApplicationLib/hello.c | 2 +- examples/ApplicationLib/hello.h | 2 +- include/CppUTest/CommandLineArguments.h | 2 +- include/CppUTest/CommandLineTestRunner.h | 2 +- include/CppUTest/CppUTestConfig.h | 2 +- include/CppUTest/CppUTestGeneratedConfig.h | 2 +- include/CppUTest/JUnitTestOutput.h | 2 +- include/CppUTest/MemoryLeakDetector.h | 2 +- include/CppUTest/MemoryLeakDetectorNewMacros.h | 2 +- include/CppUTest/MemoryLeakWarningPlugin.h | 2 +- include/CppUTest/PlatformSpecificFunctions.h | 2 +- include/CppUTest/PlatformSpecificFunctions_c.h | 2 +- include/CppUTest/SimpleMutex.h | 2 +- include/CppUTest/SimpleString.h | 2 +- include/CppUTest/SimpleStringInternalCache.h | 2 +- include/CppUTest/TestFailure.h | 2 +- include/CppUTest/TestFilter.h | 2 +- include/CppUTest/TestHarness.h | 2 +- include/CppUTest/TestHarness_c.h | 2 +- include/CppUTest/TestMemoryAllocator.h | 2 +- include/CppUTest/TestOutput.h | 2 +- include/CppUTest/TestPlugin.h | 2 +- include/CppUTest/TestRegistry.h | 2 +- include/CppUTest/TestResult.h | 2 +- include/CppUTest/TestTestingFixture.h | 2 +- include/CppUTest/Utest.h | 2 +- include/CppUTest/UtestMacros.h | 2 +- include/CppUTestExt/CodeMemoryReportFormatter.h | 2 +- include/CppUTestExt/GMock.h | 2 +- include/CppUTestExt/GTest.h | 2 +- include/CppUTestExt/GTestConvertor.h | 2 +- include/CppUTestExt/GTestSupport.h | 2 +- include/CppUTestExt/IEEE754ExceptionsPlugin.h | 2 +- include/CppUTestExt/MemoryReportAllocator.h | 2 +- include/CppUTestExt/MemoryReportFormatter.h | 2 +- include/CppUTestExt/MemoryReporterPlugin.h | 2 +- include/CppUTestExt/MockActualCall.h | 2 +- include/CppUTestExt/MockCheckedActualCall.h | 2 +- include/CppUTestExt/MockCheckedExpectedCall.h | 2 +- include/CppUTestExt/MockExpectedCall.h | 2 +- include/CppUTestExt/MockExpectedCallsList.h | 2 +- include/CppUTestExt/MockFailure.h | 2 +- include/CppUTestExt/MockNamedValue.h | 2 +- include/CppUTestExt/MockSupport.h | 2 +- include/CppUTestExt/MockSupportPlugin.h | 2 +- include/CppUTestExt/MockSupport_c.h | 2 +- include/CppUTestExt/OrderedTest.h | 2 +- include/Platforms/c2000/stdint.h | 2 +- platforms/CCStudio/tests/CppUTest/AllTestsForTarget.cpp | 2 +- platforms/CCStudio/tests/CppUTestExt/AllTestsForTarget.cpp | 2 +- platforms_examples/armcc/AT91SAM7A3/tests/main.cpp | 2 +- platforms_examples/armcc/LPC1768/tests/main.cpp | 2 +- platforms_examples/armcc/LPC1833/tests/main.cpp | 2 +- src/CppUTest/CommandLineArguments.cpp | 2 +- src/CppUTest/CommandLineTestRunner.cpp | 2 +- src/CppUTest/JUnitTestOutput.cpp | 2 +- src/CppUTest/MemoryLeakDetector.cpp | 2 +- src/CppUTest/MemoryLeakWarningPlugin.cpp | 2 +- src/CppUTest/SimpleMutex.cpp | 2 +- src/CppUTest/SimpleString.cpp | 2 +- src/CppUTest/SimpleStringInternalCache.cpp | 2 +- src/CppUTest/TestFailure.cpp | 2 +- src/CppUTest/TestFilter.cpp | 2 +- src/CppUTest/TestHarness_c.cpp | 2 +- src/CppUTest/TestMemoryAllocator.cpp | 2 +- src/CppUTest/TestOutput.cpp | 2 +- src/CppUTest/TestPlugin.cpp | 2 +- src/CppUTest/TestRegistry.cpp | 2 +- src/CppUTest/TestResult.cpp | 2 +- src/CppUTest/TestTestingFixture.cpp | 2 +- src/CppUTest/Utest.cpp | 2 +- src/CppUTestExt/CodeMemoryReportFormatter.cpp | 2 +- src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 2 +- src/CppUTestExt/MemoryReportAllocator.cpp | 2 +- src/CppUTestExt/MemoryReportFormatter.cpp | 2 +- src/CppUTestExt/MemoryReporterPlugin.cpp | 2 +- src/CppUTestExt/MockActualCall.cpp | 2 +- src/CppUTestExt/MockExpectedCall.cpp | 2 +- src/CppUTestExt/MockExpectedCallsList.cpp | 2 +- src/CppUTestExt/MockFailure.cpp | 2 +- src/CppUTestExt/MockNamedValue.cpp | 2 +- src/CppUTestExt/MockSupport.cpp | 2 +- src/CppUTestExt/MockSupportPlugin.cpp | 2 +- src/CppUTestExt/MockSupport_c.cpp | 2 +- src/CppUTestExt/OrderedTest.cpp | 2 +- src/Platforms/Borland/UtestPlatform.cpp | 2 +- src/Platforms/C2000/UtestPlatform.cpp | 2 +- src/Platforms/Dos/UtestPlatform.cpp | 2 +- src/Platforms/Gcc/UtestPlatform.cpp | 2 +- src/Platforms/GccNoStdC/UtestPlatform.cpp | 2 +- src/Platforms/Iar/UtestPlatform.cpp | 2 +- src/Platforms/Keil/UtestPlatform.cpp | 2 +- src/Platforms/Symbian/SymbianMemoryLeakWarning.cpp | 2 +- src/Platforms/Symbian/UtestPlatform.cpp | 2 +- src/Platforms/armcc/UtestPlatform.cpp | 2 +- tests/CppUTest/AllTests.cpp | 2 +- tests/CppUTest/AllTests.h | 2 +- tests/CppUTest/CommandLineArgumentsTest.cpp | 2 +- tests/CppUTest/CommandLineTestRunnerTest.cpp | 2 +- tests/CppUTest/DummyMemoryLeakDetector.cpp | 2 +- tests/CppUTest/DummyMemoryLeakDetector.h | 2 +- tests/CppUTest/JUnitOutputTest.cpp | 2 +- tests/CppUTest/MemoryLeakDetectorTest.cpp | 2 +- tests/CppUTest/MemoryLeakWarningTest.cpp | 2 +- tests/CppUTest/PluginTest.cpp | 2 +- tests/CppUTest/PreprocessorTest.cpp | 2 +- tests/CppUTest/SimpleMutexTest.cpp | 2 +- tests/CppUTest/SimpleStringCacheTest.cpp | 2 +- tests/CppUTest/SimpleStringTest.cpp | 2 +- tests/CppUTest/TestFailureNaNTest.cpp | 2 +- tests/CppUTest/TestFailureTest.cpp | 2 +- tests/CppUTest/TestFilterTest.cpp | 2 +- tests/CppUTest/TestHarness_cTest.cpp | 2 +- tests/CppUTest/TestInstallerTest.cpp | 2 +- tests/CppUTest/TestMemoryAllocatorTest.cpp | 2 +- tests/CppUTest/TestOutputTest.cpp | 2 +- tests/CppUTest/TestRegistryTest.cpp | 2 +- tests/CppUTest/TestResultTest.cpp | 2 +- tests/CppUTest/TestUTestMacro.cpp | 2 +- tests/CppUTest/TestUTestStringMacro.cpp | 2 +- tests/CppUTest/UtestPlatformTest.cpp | 2 +- tests/CppUTest/UtestTest.cpp | 2 +- tests/CppUTestExt/AllTests.cpp | 2 +- tests/CppUTestExt/CodeMemoryReporterTest.cpp | 2 +- tests/CppUTestExt/ExpectedFunctionsListTest.cpp | 2 +- tests/CppUTestExt/GMockTest.cpp | 2 +- tests/CppUTestExt/GTest1Test.cpp | 2 +- tests/CppUTestExt/GTest2ConvertorTest.cpp | 2 +- tests/CppUTestExt/IEEE754PluginTest.cpp | 2 +- tests/CppUTestExt/IEEE754PluginTest_c.c | 2 +- tests/CppUTestExt/IEEE754PluginTest_c.h | 2 +- tests/CppUTestExt/MemoryReportAllocatorTest.cpp | 2 +- tests/CppUTestExt/MemoryReportFormatterTest.cpp | 2 +- tests/CppUTestExt/MemoryReporterPluginTest.cpp | 2 +- tests/CppUTestExt/MockActualCallTest.cpp | 2 +- tests/CppUTestExt/MockCallTest.cpp | 2 +- tests/CppUTestExt/MockComparatorCopierTest.cpp | 2 +- tests/CppUTestExt/MockExpectedCallTest.cpp | 2 +- tests/CppUTestExt/MockFailureReporterForTest.cpp | 2 +- tests/CppUTestExt/MockFailureReporterForTest.h | 2 +- tests/CppUTestExt/MockFailureTest.cpp | 2 +- tests/CppUTestExt/MockFakeLongLong.cpp | 2 +- tests/CppUTestExt/MockHierarchyTest.cpp | 2 +- tests/CppUTestExt/MockNamedValueTest.cpp | 2 +- tests/CppUTestExt/MockParameterTest.cpp | 2 +- tests/CppUTestExt/MockPluginTest.cpp | 2 +- tests/CppUTestExt/MockReturnValueTest.cpp | 2 +- tests/CppUTestExt/MockStrictOrderTest.cpp | 2 +- tests/CppUTestExt/MockSupportTest.cpp | 2 +- tests/CppUTestExt/MockSupport_cTest.cpp | 2 +- tests/CppUTestExt/MockSupport_cTestCFile.c | 2 +- tests/CppUTestExt/MockSupport_cTestCFile.h | 2 +- tests/CppUTestExt/OrderedTestTest.cpp | 2 +- tests/CppUTestExt/OrderedTestTest.h | 2 +- 170 files changed, 170 insertions(+), 170 deletions(-) diff --git a/examples/AllTests/AllTests.cpp b/examples/AllTests/AllTests.cpp index 75e5ef0b4..7944f3861 100644 --- a/examples/AllTests/AllTests.cpp +++ b/examples/AllTests/AllTests.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/AllTests/AllTests.h b/examples/AllTests/AllTests.h index 23e8ca287..9902c6f17 100644 --- a/examples/AllTests/AllTests.h +++ b/examples/AllTests/AllTests.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/AllTests/CircularBufferTest.cpp b/examples/AllTests/CircularBufferTest.cpp index 7ada76fb3..a2a0881f0 100644 --- a/examples/AllTests/CircularBufferTest.cpp +++ b/examples/AllTests/CircularBufferTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/AllTests/EventDispatcherTest.cpp b/examples/AllTests/EventDispatcherTest.cpp index 81cca450c..0448a50e8 100644 --- a/examples/AllTests/EventDispatcherTest.cpp +++ b/examples/AllTests/EventDispatcherTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index 38802796f..f089ec5c7 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/AllTests/HelloTest.cpp b/examples/AllTests/HelloTest.cpp index 232e60113..83ff54e26 100644 --- a/examples/AllTests/HelloTest.cpp +++ b/examples/AllTests/HelloTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/AllTests/MockDocumentationTest.cpp b/examples/AllTests/MockDocumentationTest.cpp index 95dfbcce2..e5f8e47f1 100644 --- a/examples/AllTests/MockDocumentationTest.cpp +++ b/examples/AllTests/MockDocumentationTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/AllTests/MockPrinter.h b/examples/AllTests/MockPrinter.h index 7a089f376..8af39dcc7 100644 --- a/examples/AllTests/MockPrinter.h +++ b/examples/AllTests/MockPrinter.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/AllTests/PrinterTest.cpp b/examples/AllTests/PrinterTest.cpp index a2ba3978f..d46a678a4 100644 --- a/examples/AllTests/PrinterTest.cpp +++ b/examples/AllTests/PrinterTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/ApplicationLib/CircularBuffer.cpp b/examples/ApplicationLib/CircularBuffer.cpp index 5324891b4..a2d839be5 100644 --- a/examples/ApplicationLib/CircularBuffer.cpp +++ b/examples/ApplicationLib/CircularBuffer.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/ApplicationLib/CircularBuffer.h b/examples/ApplicationLib/CircularBuffer.h index 1239a143c..e9634f10a 100644 --- a/examples/ApplicationLib/CircularBuffer.h +++ b/examples/ApplicationLib/CircularBuffer.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/ApplicationLib/EventDispatcher.cpp b/examples/ApplicationLib/EventDispatcher.cpp index 142aae404..140be3547 100644 --- a/examples/ApplicationLib/EventDispatcher.cpp +++ b/examples/ApplicationLib/EventDispatcher.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/ApplicationLib/EventDispatcher.h b/examples/ApplicationLib/EventDispatcher.h index 34f0843e8..0a4e2f73d 100644 --- a/examples/ApplicationLib/EventDispatcher.h +++ b/examples/ApplicationLib/EventDispatcher.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/ApplicationLib/ExamplesNewOverrides.h b/examples/ApplicationLib/ExamplesNewOverrides.h index ad108fc7a..86cb0219b 100644 --- a/examples/ApplicationLib/ExamplesNewOverrides.h +++ b/examples/ApplicationLib/ExamplesNewOverrides.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/ApplicationLib/Printer.cpp b/examples/ApplicationLib/Printer.cpp index b73b41832..893ae1a40 100644 --- a/examples/ApplicationLib/Printer.cpp +++ b/examples/ApplicationLib/Printer.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/ApplicationLib/Printer.h b/examples/ApplicationLib/Printer.h index 73f08e109..51aa63313 100644 --- a/examples/ApplicationLib/Printer.h +++ b/examples/ApplicationLib/Printer.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/ApplicationLib/hello.c b/examples/ApplicationLib/hello.c index 4ac06a59e..2ab67a69c 100644 --- a/examples/ApplicationLib/hello.c +++ b/examples/ApplicationLib/hello.c @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/examples/ApplicationLib/hello.h b/examples/ApplicationLib/hello.h index 5154b3cf1..83524a5c0 100644 --- a/examples/ApplicationLib/hello.h +++ b/examples/ApplicationLib/hello.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index e0ed3f213..d162a5e2f 100644 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/CommandLineTestRunner.h b/include/CppUTest/CommandLineTestRunner.h index 194cd4cb2..91c52d177 100644 --- a/include/CppUTest/CommandLineTestRunner.h +++ b/include/CppUTest/CommandLineTestRunner.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index bbe3cb6d2..d30d9766f 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/CppUTestGeneratedConfig.h b/include/CppUTest/CppUTestGeneratedConfig.h index 94e293f9c..5bcd53768 100644 --- a/include/CppUTest/CppUTestGeneratedConfig.h +++ b/include/CppUTest/CppUTestGeneratedConfig.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/JUnitTestOutput.h b/include/CppUTest/JUnitTestOutput.h index 1c4a0b0eb..9c01eacb1 100644 --- a/include/CppUTest/JUnitTestOutput.h +++ b/include/CppUTest/JUnitTestOutput.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/MemoryLeakDetector.h b/include/CppUTest/MemoryLeakDetector.h index fb8a61921..9850cc5b1 100644 --- a/include/CppUTest/MemoryLeakDetector.h +++ b/include/CppUTest/MemoryLeakDetector.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/MemoryLeakDetectorNewMacros.h b/include/CppUTest/MemoryLeakDetectorNewMacros.h index eb62b30a5..e482c9680 100644 --- a/include/CppUTest/MemoryLeakDetectorNewMacros.h +++ b/include/CppUTest/MemoryLeakDetectorNewMacros.h @@ -34,7 +34,7 @@ * Some platforms (OSx, i.e.) will get or included when using header, * in order to avoid conflicts with strdup and strndup macros defined by MemoryLeakDetectorMallocMacros.h * we will undefined those macros, include the C++ headers and then reinclude MemoryLeakDetectorMallocMacros.h. - * The check `#if CPPUTEST_USE_STRDUP_MACROS` will ensure we only include MemoryLeakDetectorMallocMacros.h if + * The check '#if CPPUTEST_USE_STRDUP_MACROS' will ensure we only include MemoryLeakDetectorMallocMacros.h if * it has already been includeded earlier. */ #undef strdup diff --git a/include/CppUTest/MemoryLeakWarningPlugin.h b/include/CppUTest/MemoryLeakWarningPlugin.h index ec3c824d9..de0f360d0 100644 --- a/include/CppUTest/MemoryLeakWarningPlugin.h +++ b/include/CppUTest/MemoryLeakWarningPlugin.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/PlatformSpecificFunctions.h b/include/CppUTest/PlatformSpecificFunctions.h index 6737f582a..3b2f983cc 100644 --- a/include/CppUTest/PlatformSpecificFunctions.h +++ b/include/CppUTest/PlatformSpecificFunctions.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/PlatformSpecificFunctions_c.h b/include/CppUTest/PlatformSpecificFunctions_c.h index f8514d2a2..d8ed40ac8 100644 --- a/include/CppUTest/PlatformSpecificFunctions_c.h +++ b/include/CppUTest/PlatformSpecificFunctions_c.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/SimpleMutex.h b/include/CppUTest/SimpleMutex.h index eb4990054..8bb59fb69 100644 --- a/include/CppUTest/SimpleMutex.h +++ b/include/CppUTest/SimpleMutex.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 73777b888..6d33dabfd 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/SimpleStringInternalCache.h b/include/CppUTest/SimpleStringInternalCache.h index 94bfdd808..ef14def8c 100644 --- a/include/CppUTest/SimpleStringInternalCache.h +++ b/include/CppUTest/SimpleStringInternalCache.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/TestFailure.h b/include/CppUTest/TestFailure.h index 27e96c824..7dc816f2c 100644 --- a/include/CppUTest/TestFailure.h +++ b/include/CppUTest/TestFailure.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/TestFilter.h b/include/CppUTest/TestFilter.h index 6f92a00bd..730f52e14 100644 --- a/include/CppUTest/TestFilter.h +++ b/include/CppUTest/TestFilter.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/TestHarness.h b/include/CppUTest/TestHarness.h index 8eb5b29bf..a4f1a8f71 100644 --- a/include/CppUTest/TestHarness.h +++ b/include/CppUTest/TestHarness.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 6888b8a31..e85013d8a 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index 17e5b11f8..0f4a43bc4 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/TestOutput.h b/include/CppUTest/TestOutput.h index dff6e0af9..e0cb1f5d9 100644 --- a/include/CppUTest/TestOutput.h +++ b/include/CppUTest/TestOutput.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/TestPlugin.h b/include/CppUTest/TestPlugin.h index 72ad941c1..c2f5d636d 100644 --- a/include/CppUTest/TestPlugin.h +++ b/include/CppUTest/TestPlugin.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index e57e52ccd..20575dd5a 100644 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/TestResult.h b/include/CppUTest/TestResult.h index 62c4f77fe..fc6e63fd6 100644 --- a/include/CppUTest/TestResult.h +++ b/include/CppUTest/TestResult.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/TestTestingFixture.h b/include/CppUTest/TestTestingFixture.h index 17d12d0cb..2c7cdd5ba 100644 --- a/include/CppUTest/TestTestingFixture.h +++ b/include/CppUTest/TestTestingFixture.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 1b8a67724..ac88cc48a 100644 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 415b28eb8..3789f0671 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/CodeMemoryReportFormatter.h b/include/CppUTestExt/CodeMemoryReportFormatter.h index 466784123..3eae4f30b 100644 --- a/include/CppUTestExt/CodeMemoryReportFormatter.h +++ b/include/CppUTestExt/CodeMemoryReportFormatter.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/GMock.h b/include/CppUTestExt/GMock.h index 71e4c7052..131597371 100644 --- a/include/CppUTestExt/GMock.h +++ b/include/CppUTestExt/GMock.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/GTest.h b/include/CppUTestExt/GTest.h index 1d3a7d124..0c2726e48 100644 --- a/include/CppUTestExt/GTest.h +++ b/include/CppUTestExt/GTest.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/GTestConvertor.h b/include/CppUTestExt/GTestConvertor.h index fe5b927d4..751a38d05 100644 --- a/include/CppUTestExt/GTestConvertor.h +++ b/include/CppUTestExt/GTestConvertor.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/GTestSupport.h b/include/CppUTestExt/GTestSupport.h index 9cbb27bb5..d77bcbe2a 100644 --- a/include/CppUTestExt/GTestSupport.h +++ b/include/CppUTestExt/GTestSupport.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/IEEE754ExceptionsPlugin.h b/include/CppUTestExt/IEEE754ExceptionsPlugin.h index 9d3f0cdc1..efedad5f4 100644 --- a/include/CppUTestExt/IEEE754ExceptionsPlugin.h +++ b/include/CppUTestExt/IEEE754ExceptionsPlugin.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MemoryReportAllocator.h b/include/CppUTestExt/MemoryReportAllocator.h index becdb4ac4..58111c901 100644 --- a/include/CppUTestExt/MemoryReportAllocator.h +++ b/include/CppUTestExt/MemoryReportAllocator.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MemoryReportFormatter.h b/include/CppUTestExt/MemoryReportFormatter.h index d0034b686..d68cf4f5a 100644 --- a/include/CppUTestExt/MemoryReportFormatter.h +++ b/include/CppUTestExt/MemoryReportFormatter.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MemoryReporterPlugin.h b/include/CppUTestExt/MemoryReporterPlugin.h index 9874cade6..1e3dffbe9 100644 --- a/include/CppUTestExt/MemoryReporterPlugin.h +++ b/include/CppUTestExt/MemoryReporterPlugin.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MockActualCall.h b/include/CppUTestExt/MockActualCall.h index b41c3fdd5..51f2fa7e5 100644 --- a/include/CppUTestExt/MockActualCall.h +++ b/include/CppUTestExt/MockActualCall.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index 034dfd6e7..b324ceb92 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index 2079577f0..f77402c30 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MockExpectedCall.h b/include/CppUTestExt/MockExpectedCall.h index 51630dc3d..e043de886 100644 --- a/include/CppUTestExt/MockExpectedCall.h +++ b/include/CppUTestExt/MockExpectedCall.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MockExpectedCallsList.h b/include/CppUTestExt/MockExpectedCallsList.h index bdd7bb48c..3cb2e651d 100644 --- a/include/CppUTestExt/MockExpectedCallsList.h +++ b/include/CppUTestExt/MockExpectedCallsList.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MockFailure.h b/include/CppUTestExt/MockFailure.h index b36a074c2..485d37f4e 100644 --- a/include/CppUTestExt/MockFailure.h +++ b/include/CppUTestExt/MockFailure.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MockNamedValue.h b/include/CppUTestExt/MockNamedValue.h index 413ef48ab..304d137ac 100644 --- a/include/CppUTestExt/MockNamedValue.h +++ b/include/CppUTestExt/MockNamedValue.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index 60a5131f1..ea770ab3a 100644 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MockSupportPlugin.h b/include/CppUTestExt/MockSupportPlugin.h index cc0be2099..9de65e7ae 100644 --- a/include/CppUTestExt/MockSupportPlugin.h +++ b/include/CppUTestExt/MockSupportPlugin.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 5bc9fc1fb..b133e3682 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/CppUTestExt/OrderedTest.h b/include/CppUTestExt/OrderedTest.h index bf9a1469d..18af49309 100644 --- a/include/CppUTestExt/OrderedTest.h +++ b/include/CppUTestExt/OrderedTest.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/include/Platforms/c2000/stdint.h b/include/Platforms/c2000/stdint.h index e2831fdc0..3e076a500 100644 --- a/include/Platforms/c2000/stdint.h +++ b/include/Platforms/c2000/stdint.h @@ -14,7 +14,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/platforms/CCStudio/tests/CppUTest/AllTestsForTarget.cpp b/platforms/CCStudio/tests/CppUTest/AllTestsForTarget.cpp index 47cda0edc..1c977dbde 100644 --- a/platforms/CCStudio/tests/CppUTest/AllTestsForTarget.cpp +++ b/platforms/CCStudio/tests/CppUTest/AllTestsForTarget.cpp @@ -14,7 +14,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/platforms/CCStudio/tests/CppUTestExt/AllTestsForTarget.cpp b/platforms/CCStudio/tests/CppUTestExt/AllTestsForTarget.cpp index 4d7ec09df..d55800a2d 100644 --- a/platforms/CCStudio/tests/CppUTestExt/AllTestsForTarget.cpp +++ b/platforms/CCStudio/tests/CppUTestExt/AllTestsForTarget.cpp @@ -14,7 +14,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/platforms_examples/armcc/AT91SAM7A3/tests/main.cpp b/platforms_examples/armcc/AT91SAM7A3/tests/main.cpp index e1eac674c..8199883d5 100644 --- a/platforms_examples/armcc/AT91SAM7A3/tests/main.cpp +++ b/platforms_examples/armcc/AT91SAM7A3/tests/main.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/platforms_examples/armcc/LPC1768/tests/main.cpp b/platforms_examples/armcc/LPC1768/tests/main.cpp index b8dd10eec..254b171ae 100644 --- a/platforms_examples/armcc/LPC1768/tests/main.cpp +++ b/platforms_examples/armcc/LPC1768/tests/main.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/platforms_examples/armcc/LPC1833/tests/main.cpp b/platforms_examples/armcc/LPC1833/tests/main.cpp index 90f317a05..f1299259f 100644 --- a/platforms_examples/armcc/LPC1833/tests/main.cpp +++ b/platforms_examples/armcc/LPC1833/tests/main.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index b5d1ac7e0..e3d1a8cbe 100644 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 4663ced00..da2d217dc 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/JUnitTestOutput.cpp b/src/CppUTest/JUnitTestOutput.cpp index e85999144..4e5c2585b 100644 --- a/src/CppUTest/JUnitTestOutput.cpp +++ b/src/CppUTest/JUnitTestOutput.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index 6c30e429f..89e45908e 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 4e937ed62..192dbb508 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/SimpleMutex.cpp b/src/CppUTest/SimpleMutex.cpp index a1f4d7027..8fd9c887f 100644 --- a/src/CppUTest/SimpleMutex.cpp +++ b/src/CppUTest/SimpleMutex.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 1f1082a47..5e7160b28 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/SimpleStringInternalCache.cpp b/src/CppUTest/SimpleStringInternalCache.cpp index f339fa4c7..2964a2d2c 100644 --- a/src/CppUTest/SimpleStringInternalCache.cpp +++ b/src/CppUTest/SimpleStringInternalCache.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index 476e3edb6..a3a9bb82e 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/TestFilter.cpp b/src/CppUTest/TestFilter.cpp index c977b6fb5..326767afc 100644 --- a/src/CppUTest/TestFilter.cpp +++ b/src/CppUTest/TestFilter.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/TestHarness_c.cpp b/src/CppUTest/TestHarness_c.cpp index c34b9e0f3..0a93efa4e 100644 --- a/src/CppUTest/TestHarness_c.cpp +++ b/src/CppUTest/TestHarness_c.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/TestMemoryAllocator.cpp b/src/CppUTest/TestMemoryAllocator.cpp index e48082afd..71e3a7ca6 100644 --- a/src/CppUTest/TestMemoryAllocator.cpp +++ b/src/CppUTest/TestMemoryAllocator.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index 71839e481..131997e5a 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/TestPlugin.cpp b/src/CppUTest/TestPlugin.cpp index ac45e52e4..29aa38bcf 100644 --- a/src/CppUTest/TestPlugin.cpp +++ b/src/CppUTest/TestPlugin.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 89b2bed3f..542ab51a8 100644 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/TestResult.cpp b/src/CppUTest/TestResult.cpp index b081f49b7..37ff57f84 100644 --- a/src/CppUTest/TestResult.cpp +++ b/src/CppUTest/TestResult.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/TestTestingFixture.cpp b/src/CppUTest/TestTestingFixture.cpp index 1f23e5fac..a5e73d33e 100644 --- a/src/CppUTest/TestTestingFixture.cpp +++ b/src/CppUTest/TestTestingFixture.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 56e5f944c..fb87c866a 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/CodeMemoryReportFormatter.cpp b/src/CppUTestExt/CodeMemoryReportFormatter.cpp index 03383c67a..57c1e4f96 100644 --- a/src/CppUTestExt/CodeMemoryReportFormatter.cpp +++ b/src/CppUTestExt/CodeMemoryReportFormatter.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index 98f769a4a..5b84a4862 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/MemoryReportAllocator.cpp b/src/CppUTestExt/MemoryReportAllocator.cpp index beea0e357..f51b932ab 100644 --- a/src/CppUTestExt/MemoryReportAllocator.cpp +++ b/src/CppUTestExt/MemoryReportAllocator.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/MemoryReportFormatter.cpp b/src/CppUTestExt/MemoryReportFormatter.cpp index 6ed6bcf58..13833e5d6 100644 --- a/src/CppUTestExt/MemoryReportFormatter.cpp +++ b/src/CppUTestExt/MemoryReportFormatter.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/MemoryReporterPlugin.cpp b/src/CppUTestExt/MemoryReporterPlugin.cpp index e42bcd6bc..8b81f5dc8 100644 --- a/src/CppUTestExt/MemoryReporterPlugin.cpp +++ b/src/CppUTestExt/MemoryReporterPlugin.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index bd8cbddd0..319e20a60 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index 867cb2706..1b283d7d6 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/MockExpectedCallsList.cpp b/src/CppUTestExt/MockExpectedCallsList.cpp index d92e297c5..dd2970d7d 100644 --- a/src/CppUTestExt/MockExpectedCallsList.cpp +++ b/src/CppUTestExt/MockExpectedCallsList.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/MockFailure.cpp b/src/CppUTestExt/MockFailure.cpp index 10f475693..c4295cf05 100644 --- a/src/CppUTestExt/MockFailure.cpp +++ b/src/CppUTestExt/MockFailure.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index f7bc0565f..2d4f1d1a0 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 42d8295ab..9ce11b979 100644 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/MockSupportPlugin.cpp b/src/CppUTestExt/MockSupportPlugin.cpp index 8f299fa5f..741efb920 100644 --- a/src/CppUTestExt/MockSupportPlugin.cpp +++ b/src/CppUTestExt/MockSupportPlugin.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 5787ee09d..d88bad622 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/CppUTestExt/OrderedTest.cpp b/src/CppUTestExt/OrderedTest.cpp index 17035102e..50d0b3440 100644 --- a/src/CppUTestExt/OrderedTest.cpp +++ b/src/CppUTestExt/OrderedTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 83a6468fc..2bbca3ae1 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/Platforms/C2000/UtestPlatform.cpp b/src/Platforms/C2000/UtestPlatform.cpp index a4e6b5fc5..c0cde24fe 100644 --- a/src/Platforms/C2000/UtestPlatform.cpp +++ b/src/Platforms/C2000/UtestPlatform.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/Platforms/Dos/UtestPlatform.cpp b/src/Platforms/Dos/UtestPlatform.cpp index 07aa969ba..b05d7ea55 100644 --- a/src/Platforms/Dos/UtestPlatform.cpp +++ b/src/Platforms/Dos/UtestPlatform.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 90df7bf0b..4cef7e800 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/Platforms/GccNoStdC/UtestPlatform.cpp b/src/Platforms/GccNoStdC/UtestPlatform.cpp index 68413d195..0d552aacb 100644 --- a/src/Platforms/GccNoStdC/UtestPlatform.cpp +++ b/src/Platforms/GccNoStdC/UtestPlatform.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/Platforms/Iar/UtestPlatform.cpp b/src/Platforms/Iar/UtestPlatform.cpp index cf2e83eaf..dac310717 100644 --- a/src/Platforms/Iar/UtestPlatform.cpp +++ b/src/Platforms/Iar/UtestPlatform.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/Platforms/Keil/UtestPlatform.cpp b/src/Platforms/Keil/UtestPlatform.cpp index 59fbae291..406982cfd 100644 --- a/src/Platforms/Keil/UtestPlatform.cpp +++ b/src/Platforms/Keil/UtestPlatform.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/Platforms/Symbian/SymbianMemoryLeakWarning.cpp b/src/Platforms/Symbian/SymbianMemoryLeakWarning.cpp index 0003442d2..dbea37a3c 100644 --- a/src/Platforms/Symbian/SymbianMemoryLeakWarning.cpp +++ b/src/Platforms/Symbian/SymbianMemoryLeakWarning.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/Platforms/Symbian/UtestPlatform.cpp b/src/Platforms/Symbian/UtestPlatform.cpp index ff1d6b3aa..9eb97f160 100644 --- a/src/Platforms/Symbian/UtestPlatform.cpp +++ b/src/Platforms/Symbian/UtestPlatform.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/src/Platforms/armcc/UtestPlatform.cpp b/src/Platforms/armcc/UtestPlatform.cpp index 487ed67da..17f41597e 100644 --- a/src/Platforms/armcc/UtestPlatform.cpp +++ b/src/Platforms/armcc/UtestPlatform.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/AllTests.cpp b/tests/CppUTest/AllTests.cpp index 6b7cbfb30..e9e6a2b75 100644 --- a/tests/CppUTest/AllTests.cpp +++ b/tests/CppUTest/AllTests.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/AllTests.h b/tests/CppUTest/AllTests.h index 9e2fb1649..32ef2c770 100644 --- a/tests/CppUTest/AllTests.h +++ b/tests/CppUTest/AllTests.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index ea576a647..6ff95ca86 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index 6a73a9406..768d4ad9a 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/DummyMemoryLeakDetector.cpp b/tests/CppUTest/DummyMemoryLeakDetector.cpp index 1be2c872b..dc28bab68 100644 --- a/tests/CppUTest/DummyMemoryLeakDetector.cpp +++ b/tests/CppUTest/DummyMemoryLeakDetector.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/DummyMemoryLeakDetector.h b/tests/CppUTest/DummyMemoryLeakDetector.h index 093d0860f..ee367434c 100644 --- a/tests/CppUTest/DummyMemoryLeakDetector.h +++ b/tests/CppUTest/DummyMemoryLeakDetector.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index 6fac9764c..fd2f9fab3 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/MemoryLeakDetectorTest.cpp b/tests/CppUTest/MemoryLeakDetectorTest.cpp index e22fbada1..1a5c70b59 100644 --- a/tests/CppUTest/MemoryLeakDetectorTest.cpp +++ b/tests/CppUTest/MemoryLeakDetectorTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index e219da682..f1af41946 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/PluginTest.cpp b/tests/CppUTest/PluginTest.cpp index 0251a849a..f4147e77c 100644 --- a/tests/CppUTest/PluginTest.cpp +++ b/tests/CppUTest/PluginTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/PreprocessorTest.cpp b/tests/CppUTest/PreprocessorTest.cpp index 3207972f6..d41c8055a 100644 --- a/tests/CppUTest/PreprocessorTest.cpp +++ b/tests/CppUTest/PreprocessorTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/SimpleMutexTest.cpp b/tests/CppUTest/SimpleMutexTest.cpp index 0ee06a05d..64c2ecd15 100644 --- a/tests/CppUTest/SimpleMutexTest.cpp +++ b/tests/CppUTest/SimpleMutexTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/SimpleStringCacheTest.cpp b/tests/CppUTest/SimpleStringCacheTest.cpp index 7d9a96a46..1f7a7beff 100644 --- a/tests/CppUTest/SimpleStringCacheTest.cpp +++ b/tests/CppUTest/SimpleStringCacheTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index b9ec3f1b1..64ae70558 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/TestFailureNaNTest.cpp b/tests/CppUTest/TestFailureNaNTest.cpp index 4bcd6c51d..17b922d78 100644 --- a/tests/CppUTest/TestFailureNaNTest.cpp +++ b/tests/CppUTest/TestFailureNaNTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index e4c0fdf67..82040b069 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/TestFilterTest.cpp b/tests/CppUTest/TestFilterTest.cpp index 1f60e6896..231a01a0a 100644 --- a/tests/CppUTest/TestFilterTest.cpp +++ b/tests/CppUTest/TestFilterTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp index 1544015db..2a39a9180 100644 --- a/tests/CppUTest/TestHarness_cTest.cpp +++ b/tests/CppUTest/TestHarness_cTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/TestInstallerTest.cpp b/tests/CppUTest/TestInstallerTest.cpp index 320136823..2e6b04507 100644 --- a/tests/CppUTest/TestInstallerTest.cpp +++ b/tests/CppUTest/TestInstallerTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 2f080b7cf..1f3d93328 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp index da5b031f6..d1ebb93c7 100644 --- a/tests/CppUTest/TestOutputTest.cpp +++ b/tests/CppUTest/TestOutputTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/TestRegistryTest.cpp b/tests/CppUTest/TestRegistryTest.cpp index b3d26220a..f96b9edef 100644 --- a/tests/CppUTest/TestRegistryTest.cpp +++ b/tests/CppUTest/TestRegistryTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/TestResultTest.cpp b/tests/CppUTest/TestResultTest.cpp index 82035438f..0401240bf 100644 --- a/tests/CppUTest/TestResultTest.cpp +++ b/tests/CppUTest/TestResultTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/TestUTestMacro.cpp b/tests/CppUTest/TestUTestMacro.cpp index d6724cb16..ecc07a619 100644 --- a/tests/CppUTest/TestUTestMacro.cpp +++ b/tests/CppUTest/TestUTestMacro.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/TestUTestStringMacro.cpp b/tests/CppUTest/TestUTestStringMacro.cpp index 4407ff045..e51f18c67 100644 --- a/tests/CppUTest/TestUTestStringMacro.cpp +++ b/tests/CppUTest/TestUTestStringMacro.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index 051313001..b9ca07c80 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index 674b7f643..bfa35461a 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/AllTests.cpp b/tests/CppUTestExt/AllTests.cpp index d593b7604..6b4ca8666 100644 --- a/tests/CppUTestExt/AllTests.cpp +++ b/tests/CppUTestExt/AllTests.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/CodeMemoryReporterTest.cpp b/tests/CppUTestExt/CodeMemoryReporterTest.cpp index 2ed2fef2d..1f8ee0af1 100644 --- a/tests/CppUTestExt/CodeMemoryReporterTest.cpp +++ b/tests/CppUTestExt/CodeMemoryReporterTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp index b2416c890..4c90f8cf7 100644 --- a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp +++ b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/GMockTest.cpp b/tests/CppUTestExt/GMockTest.cpp index f41bc1c12..75b55045e 100644 --- a/tests/CppUTestExt/GMockTest.cpp +++ b/tests/CppUTestExt/GMockTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/GTest1Test.cpp b/tests/CppUTestExt/GTest1Test.cpp index 41a130886..3edf226fd 100644 --- a/tests/CppUTestExt/GTest1Test.cpp +++ b/tests/CppUTestExt/GTest1Test.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/GTest2ConvertorTest.cpp b/tests/CppUTestExt/GTest2ConvertorTest.cpp index f4ca1b051..749a53749 100644 --- a/tests/CppUTestExt/GTest2ConvertorTest.cpp +++ b/tests/CppUTestExt/GTest2ConvertorTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index ee227040a..3a41b3f1f 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.c b/tests/CppUTestExt/IEEE754PluginTest_c.c index bf1bf4ca2..644ea6462 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.c +++ b/tests/CppUTestExt/IEEE754PluginTest_c.c @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.h b/tests/CppUTestExt/IEEE754PluginTest_c.h index abe8817da..6f1f02e91 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.h +++ b/tests/CppUTestExt/IEEE754PluginTest_c.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MemoryReportAllocatorTest.cpp b/tests/CppUTestExt/MemoryReportAllocatorTest.cpp index 3cc990511..13500be4c 100644 --- a/tests/CppUTestExt/MemoryReportAllocatorTest.cpp +++ b/tests/CppUTestExt/MemoryReportAllocatorTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MemoryReportFormatterTest.cpp b/tests/CppUTestExt/MemoryReportFormatterTest.cpp index 61bd15040..4c3c7e4dc 100644 --- a/tests/CppUTestExt/MemoryReportFormatterTest.cpp +++ b/tests/CppUTestExt/MemoryReportFormatterTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MemoryReporterPluginTest.cpp b/tests/CppUTestExt/MemoryReporterPluginTest.cpp index 29e407cd7..c344567cf 100644 --- a/tests/CppUTestExt/MemoryReporterPluginTest.cpp +++ b/tests/CppUTestExt/MemoryReporterPluginTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 8fe720177..8d76bbea9 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index 1aeff22c2..6c6b996ab 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockComparatorCopierTest.cpp b/tests/CppUTestExt/MockComparatorCopierTest.cpp index 83f06615f..1b009d3cb 100644 --- a/tests/CppUTestExt/MockComparatorCopierTest.cpp +++ b/tests/CppUTestExt/MockComparatorCopierTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index f3946297d..679e8073a 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockFailureReporterForTest.cpp b/tests/CppUTestExt/MockFailureReporterForTest.cpp index b8437b8b7..5330b7472 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.cpp +++ b/tests/CppUTestExt/MockFailureReporterForTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockFailureReporterForTest.h b/tests/CppUTestExt/MockFailureReporterForTest.h index 19ca631d3..6e04fee89 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.h +++ b/tests/CppUTestExt/MockFailureReporterForTest.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index dfa32fb5e..cd3955785 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockFakeLongLong.cpp b/tests/CppUTestExt/MockFakeLongLong.cpp index 05ae48d3b..e0cd1a61b 100644 --- a/tests/CppUTestExt/MockFakeLongLong.cpp +++ b/tests/CppUTestExt/MockFakeLongLong.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockHierarchyTest.cpp b/tests/CppUTestExt/MockHierarchyTest.cpp index dc240cf45..89266dc31 100644 --- a/tests/CppUTestExt/MockHierarchyTest.cpp +++ b/tests/CppUTestExt/MockHierarchyTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockNamedValueTest.cpp b/tests/CppUTestExt/MockNamedValueTest.cpp index ad8406e48..e80560d5e 100644 --- a/tests/CppUTestExt/MockNamedValueTest.cpp +++ b/tests/CppUTestExt/MockNamedValueTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 1bad85998..de081cbdc 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -14,7 +14,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockPluginTest.cpp b/tests/CppUTestExt/MockPluginTest.cpp index 2e48ac8e4..7001e3d2c 100644 --- a/tests/CppUTestExt/MockPluginTest.cpp +++ b/tests/CppUTestExt/MockPluginTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockReturnValueTest.cpp b/tests/CppUTestExt/MockReturnValueTest.cpp index 6bb4be15f..320f79529 100644 --- a/tests/CppUTestExt/MockReturnValueTest.cpp +++ b/tests/CppUTestExt/MockReturnValueTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockStrictOrderTest.cpp b/tests/CppUTestExt/MockStrictOrderTest.cpp index f41478ad2..b1b5d103d 100644 --- a/tests/CppUTestExt/MockStrictOrderTest.cpp +++ b/tests/CppUTestExt/MockStrictOrderTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockSupportTest.cpp b/tests/CppUTestExt/MockSupportTest.cpp index 7f39a55ff..a2a31625d 100644 --- a/tests/CppUTestExt/MockSupportTest.cpp +++ b/tests/CppUTestExt/MockSupportTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index b28754169..83afbb8df 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index be68819f8..e3ad5fb1a 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.h b/tests/CppUTestExt/MockSupport_cTestCFile.h index 686c75eee..245247494 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.h +++ b/tests/CppUTestExt/MockSupport_cTestCFile.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/OrderedTestTest.cpp b/tests/CppUTestExt/OrderedTestTest.cpp index 2c5688c2e..a1e75dbb4 100644 --- a/tests/CppUTestExt/OrderedTestTest.cpp +++ b/tests/CppUTestExt/OrderedTestTest.cpp @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY diff --git a/tests/CppUTestExt/OrderedTestTest.h b/tests/CppUTestExt/OrderedTestTest.h index 088115191..4d6afbac4 100644 --- a/tests/CppUTestExt/OrderedTestTest.h +++ b/tests/CppUTestExt/OrderedTestTest.h @@ -13,7 +13,7 @@ * 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 + * 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 BE LIABLE FOR ANY From c02e316c8152dc253f3cf17ac76f0c4292e07410 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 7 Dec 2022 22:56:06 -0800 Subject: [PATCH 0971/1093] Start Make port to GitHub Actions --- .github/workflows/basic.yml | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 7d5786941..a417eaaff 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -330,6 +330,65 @@ jobs: name: test-results path: "cpputest_build/**/cpputest_*.xml" + make: + strategy: + matrix: + include: + - name: Defaults + - name: STDC++ disabled + make_args: > + CPPUTEST_USE_STD_CPP_LIB=Y + extensions + - name: Memory Leak Detection disabled + make_args: > + CPPUTEST_USE_MEM_LEAK_DETECTION=N + extensions + - name: Memory Leak Detection disabled and STD C++ disabled + make_args: > + CPPUTEST_USE_MEM_LEAK_DETECTION=N + CPPUTEST_USE_STD_CPP_LIB=Y + extensions + - name: debug disabled + make_args: > + CPPUTEST_ENABLE_DEBUG=N + extensions + - name: overridden CXXFLAGS and CFLAGS and CPPFLAGS + make_args: > + CLFAGS="" + CXXFLAGS="" + CPPFLAGS="-Iinclude" + - name: without Standard C library includes + make_args: > + CPPUTEST_USE_STD_C_LIB=N + CPPUTEST_ADDITIONAL_CPPFLAGS=-DCPPUTEST_CHAR_BIT=8 + all_no_tests + - name: different TARGET_PLATFORM + make_args: TARGET_PLATFORM=real_platform + - name: overridden CXXFLAGS and CFLAGS and memory leak and STDC++ disabled + make_args: > + CLFAGS="" + CXXFLAGS="" + CPPFLAGS="-Iinclude -DCPPUTEST_STD_CPP_LIB_DISABLED -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED" + - name: Examples + make_args: examples + - name: gcov + make_args: > + CPPUTEST_USE_GCOV=Y + everythingInstall + - name: VPATH usage + make_args: > + CPPUTEST_USE_GCOV=Y + CPPUTEST_USE_VPATH=Y + everythingInstall + name: Make ${{ matrix.name }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@main + - run: > + make + -f Makefile_using_MakefileWorker + ${{ matrix.make_args }} + make_dos: name: Make OpenWatcom DOS runs-on: ubuntu-latest From e1171940a48c9c3a6aba0860d0e2f33769114998 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 8 Dec 2022 00:14:51 -0800 Subject: [PATCH 0972/1093] Port Makefile worker tests --- .github/workflows/basic.yml | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index a417eaaff..1407c935c 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -335,6 +335,7 @@ jobs: matrix: include: - name: Defaults + test_cmd: ./CppUTest_tests -r - name: STDC++ disabled make_args: > CPPUTEST_USE_STD_CPP_LIB=Y @@ -371,23 +372,41 @@ jobs: CPPFLAGS="-Iinclude -DCPPUTEST_STD_CPP_LIB_DISABLED -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED" - name: Examples make_args: examples + - name: JUnit Output + test_cmd: ./CppUTest_tests -ojunit - name: gcov make_args: > CPPUTEST_USE_GCOV=Y everythingInstall + test_cmd: > + make -f Makefile_using_MakefileWorker gcov && + make -f Makefile_CppUTestExt gcov && + make -C examples gcov - name: VPATH usage make_args: > CPPUTEST_USE_GCOV=Y CPPUTEST_USE_VPATH=Y everythingInstall + test_cmd: > + make CPPUTEST_USE_VPATH=Y -f Makefile_CppUTestExt gcov && + make CPPUTEST_USE_VPATH=Y -C examples gcov + - name: VPATH Install + make_args: CPPUTEST_USE_VPATH=Y everythingInstall + test_cmd: + make -f Makefile_using_MakefileWorker flags && + make -f Makefile_using_MakefileWorker debug name: Make ${{ matrix.name }} runs-on: ubuntu-latest steps: - uses: actions/checkout@main - - run: > + - name: Build + run: > make -f Makefile_using_MakefileWorker ${{ matrix.make_args }} + - name: Test + run: ${{ matrix.test_cmd }} + if: ${{ matrix.test_cmd }} make_dos: name: Make OpenWatcom DOS From 9898b80a514cfd934ffaeeefc1b594cb21679670 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 8 Dec 2022 21:17:12 -0800 Subject: [PATCH 0973/1093] Fix MakefileWorker build w/o STDC++ --- .github/workflows/basic.yml | 2 +- Makefile_using_MakefileWorker | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 1407c935c..1aa6f78a0 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -338,7 +338,7 @@ jobs: test_cmd: ./CppUTest_tests -r - name: STDC++ disabled make_args: > - CPPUTEST_USE_STD_CPP_LIB=Y + CPPUTEST_USE_STD_CPP_LIB=N extensions - name: Memory Leak Detection disabled make_args: > diff --git a/Makefile_using_MakefileWorker b/Makefile_using_MakefileWorker index 0aa7395b8..1cd69fc85 100644 --- a/Makefile_using_MakefileWorker +++ b/Makefile_using_MakefileWorker @@ -35,8 +35,8 @@ test_all: start ./$(TEST_TARGET) -r $(MAKE_CMD) clean @echo Building with the STDC++ new disabled. - $(TIME) $(MAKE_CMD) CPPUTEST_USE_STD_CPP_LIB=Y extensions - $(MAKE_CMD) CPPUTEST_USE_STD_CPP_LIB=Y cleanExtensions + $(TIME) $(MAKE_CMD) CPPUTEST_USE_STD_CPP_LIB=N extensions + $(MAKE_CMD) CPPUTEST_USE_STD_CPP_LIB=N cleanExtensions @echo Building with Memory Leak Detection disabled $(TIME) $(MAKE_CMD) CPPUTEST_USE_MEM_LEAK_DETECTION=N extensions $(MAKE_CMD) CPPUTEST_USE_MEM_LEAK_DETECTION=N cleanExtensions From 5d76cbe7d10d81567dd209dc28de8a9062400c26 Mon Sep 17 00:00:00 2001 From: "Steve Hill (Wireless)" Date: Fri, 9 Dec 2022 13:48:01 +0000 Subject: [PATCH 0974/1093] Use the current Test Terminator rather than the hard coded version --- src/CppUTest/MemoryLeakWarningPlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 4e937ed62..2c5be634d 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -545,7 +545,7 @@ class MemoryLeakWarningReporter: public MemoryLeakFailure virtual void fail(char* fail_string) _override { UtestShell* currentTest = UtestShell::getCurrent(); - currentTest->failWith(FailFailure(currentTest, currentTest->getName().asCharString(), currentTest->getLineNumber(), fail_string), TestTerminatorWithoutExceptions()); + currentTest->failWith(FailFailure(currentTest, currentTest->getName().asCharString(), currentTest->getLineNumber(), fail_string), UtestShell::getCurrentTestTerminatorWithoutExceptions()); } // LCOV_EXCL_LINE }; From b99219030b16d51e3bab30aa661c6ca31b279c33 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 11 Dec 2022 15:28:06 -0800 Subject: [PATCH 0975/1093] Improve local DOS dev --- .gitignore | 5 +++++ platforms/Dos/Makefile | 29 ++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index eda2a9d57..9481d2546 100644 --- a/.gitignore +++ b/.gitignore @@ -92,3 +92,8 @@ generated/ #IAR automatically generated files *.dep *.ewt + +# Watcom +*.LIB +*.LST +*.EXE diff --git a/platforms/Dos/Makefile b/platforms/Dos/Makefile index 9273c1a2b..7b17cac89 100644 --- a/platforms/Dos/Makefile +++ b/platforms/Dos/Makefile @@ -9,23 +9,34 @@ comma := , path_separator := / drive = $(subst $(CYGDRIVE),$(lastword $(subst /, ,$(CYGDRIVE))):/,$(1)) convert_paths = $(if $(CYGDRIVE),$(subst /,$(path_separator),$(call drive,$(1))),$(1)) +CPPUTEST_HOME ?= . -include $(CPPUTEST_HOME)/platforms/Dos/platform.mk include $(CPPUTEST_HOME)/platforms/Dos/sources.mk -# Disable W013 unreachable code - it overreacts to CHECK_EQUAL macros -# Disable W367 conditional expression in if statement is always true - same -# Disable W368 conditional expression in if statement is always false - same -# Disable W391 assignment found in boolean expression - we don't care - -CFLAGS := \ - -q -c -os -oc -d0 -we -w=3 -wcd=13 -wcd=367 -wcd=368 -wcd391 -wcd=472 -ml -zm \ +COMMONFLAGS := \ + -q -c -os -oc -d0 -we -w=3 -ml -zm \ -dCPPUTEST_MEM_LEAK_DETECTION_DISABLED=1 -dCPPUTEST_STD_CPP_LIB_DISABLED=1 \ -i$(call convert_paths,$(CPPUTEST_HOME)/include) \ -i$(call convert_paths,$(CPPUTEST_HOME)/include/Platforms/Dos) \ -i$(call convert_paths,$(WATCOM)/h) -i$(call convert_paths,$(WATCOM)/h/nt) \ -CXXFLAGS := $(CFLAGS) -xds +# Disable W303 unreferenced parameter - PUNUSED is GNU-specific +CFLAGS := \ + $(COMMONFLAGS) \ + -wcd=303 + +# Disable W013 unreachable code - it overreacts to CHECK_EQUAL macros +# Disable W367 conditional expression in if statement is always true - same +# Disable W368 conditional expression in if statement is always false - same +# Disable W391 assignment found in boolean expression - we don't care +CXXFLAGS := \ + $(COMMONFLAGS) \ + -wcd=13 \ + -wcd=367 \ + -wcd=368 \ + -wcd=391 \ + -xds .PHONY: all clean @@ -36,7 +47,7 @@ all: CPPU.LIB CPPUX.LIB \ clean: rm -rf ../src/CppUTest/*.o ../src/CppUTestExt/*.o \ ../src/Platforms/dos/*.o ../tests/*.o ../tests/CppUTestExt/*.o \ - *.o *.map *.txt *.LOG *.EXE *.err *.LIB *.LST + *.o *.map *.LOG *.EXE *.err *.LIB *.LST %.o: %.cpp $(CXX) $(CXXFLAGS) -fo=$(call convert_paths,$@) $(call convert_paths,$<) From 4293a4cfc376d1998004a429ea3b84919fa3ea93 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 11 Dec 2022 15:47:11 -0800 Subject: [PATCH 0976/1093] Improve DOS testing --- .github/workflows/basic.yml | 17 ++++++----------- .gitignore | 3 +++ platforms/Dos/alltests.sh | 2 ++ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 0108a23eb..3f718edb6 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -420,27 +420,22 @@ jobs: make_dos: name: Make OpenWatcom DOS runs-on: ubuntu-latest + env: + WATCOM: "./watcom" steps: - name: Checkout uses: actions/checkout@main - name: Install tools run: | sudo apt-get install -y dosbox - git clone https://github.com/cpputest/watcom-compiler.git watcom - echo "WATCOM=$GITHUB_WORKSPACE/watcom" >> $GITHUB_ENV - echo "CC=wcl" >> $GITHUB_ENV - echo "CXX=wcl" >> $GITHUB_ENV - echo "$GITHUB_WORKSPACE/watcom/binl" >> $GITHUB_PATH - echo "CPPUTEST_HOME=$GITHUB_WORKSPACE" >> $GITHUB_ENV + git clone https://github.com/cpputest/watcom-compiler.git $WATCOM + echo "$WATCOM/binl" >> $GITHUB_PATH - name: Build - run: | - $CC --version - make -f $CPPUTEST_HOME/platforms/Dos/Makefile clean - make -f $CPPUTEST_HOME/platforms/Dos/Makefile + run: make -f platforms/Dos/Makefile - name: Test env: TERM: linux - run: $CPPUTEST_HOME/platforms/Dos/alltests.sh + run: platforms/Dos/alltests.sh cmake_msys: name: CMake MSYS diff --git a/.gitignore b/.gitignore index 9481d2546..b704fe83f 100644 --- a/.gitignore +++ b/.gitignore @@ -97,3 +97,6 @@ generated/ *.LIB *.LST *.EXE +*.LOG +/console_output +/exit diff --git a/platforms/Dos/alltests.sh b/platforms/Dos/alltests.sh index 2acebbcb9..9c54b3e0b 100755 --- a/platforms/Dos/alltests.sh +++ b/platforms/Dos/alltests.sh @@ -1,5 +1,7 @@ #!/bin/bash +: "${CPPUTEST_HOME:=.}" + checkForCppUTestToolsEnvVariable() { if [ -z "$CPPUTEST_HOME" ] ; then echo "CPPUTEST_HOME not set. You must set CPPUTEST_HOME to the top level CppUTest directory" From dc7c799369930c8f5f02ee11476f84731f953c95 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 11 Dec 2022 16:00:53 -0800 Subject: [PATCH 0977/1093] Drive dosbox tests from make --- .github/workflows/basic.yml | 5 ++--- platforms/Dos/Makefile | 6 +++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 3f718edb6..bcd74c164 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -422,6 +422,7 @@ jobs: runs-on: ubuntu-latest env: WATCOM: "./watcom" + TERM: linux steps: - name: Checkout uses: actions/checkout@main @@ -433,9 +434,7 @@ jobs: - name: Build run: make -f platforms/Dos/Makefile - name: Test - env: - TERM: linux - run: platforms/Dos/alltests.sh + run: make -f platforms/Dos/Makefile test cmake_msys: name: CMake MSYS diff --git a/platforms/Dos/Makefile b/platforms/Dos/Makefile index 7b17cac89..eae23567b 100644 --- a/platforms/Dos/Makefile +++ b/platforms/Dos/Makefile @@ -9,7 +9,7 @@ comma := , path_separator := / drive = $(subst $(CYGDRIVE),$(lastword $(subst /, ,$(CYGDRIVE))):/,$(1)) convert_paths = $(if $(CYGDRIVE),$(subst /,$(path_separator),$(call drive,$(1))),$(1)) -CPPUTEST_HOME ?= . +export CPPUTEST_HOME ?= . -include $(CPPUTEST_HOME)/platforms/Dos/platform.mk include $(CPPUTEST_HOME)/platforms/Dos/sources.mk @@ -63,3 +63,7 @@ clean: %.EXE: $$($$*_OBJECTS) | CPPU.LIB CPPUX.LIB $(LINK) opt q,map,st=50k sys dos lib CPPU.LIB,CPPUX.LIB \ file $(subst $(space),$(comma),$(call convert_paths,$?)) name $@ + +.PHONY: +test: + $(CPPUTEST_HOME)/platforms/Dos/alltests.sh From 7c57fdbed2fa645681072b279afd4240241b8f8a Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 11 Dec 2022 12:29:41 -0800 Subject: [PATCH 0978/1093] Delete ported travis jobs --- .github/workflows/basic.yml | 6 ++- .travis.yml | 79 -------------------------------- scripts/travis_ci_build.sh | 90 ------------------------------------- 3 files changed, 5 insertions(+), 170 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index bcd74c164..447f69a0f 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -218,6 +218,10 @@ jobs: os: macos-latest preset: defaults install: true + - name: Apple Clang 14 + os: macos-latest + cmake_args: -DCMAKE_CXX_STANDARD=14 + preset: Clang - name: Apple Clang 17 os: macos-latest cmake_args: -DCMAKE_CXX_STANDARD=17 @@ -401,7 +405,7 @@ jobs: make CPPUTEST_USE_VPATH=Y -C examples gcov - name: VPATH Install make_args: CPPUTEST_USE_VPATH=Y everythingInstall - test_cmd: + test_cmd: > make -f Makefile_using_MakefileWorker flags && make -f Makefile_using_MakefileWorker debug name: Make ${{ matrix.name }} diff --git a/.travis.yml b/.travis.yml index 1ce211e3e..223a1d097 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,62 +25,9 @@ jobs: # Basic builds -# Mac OSX - - stage: basic build & test - compiler: gcc - os: osx - env: BUILD=autotools - - compiler: clang - env: BUILD=autotools - os: osx - -# Windows - - compiler: msbuild - os: windows - env: BUILD=vc_windows CPP_STD=17 - - MSBUILD_PATH="c:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin" - - VCTargetsPath="C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\VC\VCTargets" - -# Linux - - compiler: gcc - env: BUILD=cmake CPP_STD=17 - - compiler: gcc - env: BUILD=autotools - - compiler: clang - env: BUILD=autotools - # Extended builds, different C++ version and build tools - stage: extended build & test -# Mac OSX - compiler: clang - os: osx - env: BUILD=cmake CPP_STD=17 - - compiler: gcc - os: osx - env: BUILD=cmake CPP_STD=14 - -# Linux -# CMake different C++ versions with clang - - compiler: clang - env: BUILD=cmake CPP_STD=98 - - compiler: clang - env: BUILD=cmake CPP_STD=11 - - compiler: clang - env: BUILD=cmake CPP_STD=14 - - compiler: clang - env: BUILD=cmake CPP_STD=17 - -# CMake different C++ versions with gcc - - compiler: gcc - env: BUILD=cmake CPP_STD=98 - - compiler: gcc - env: BUILD=cmake CPP_STD=11 - - compiler: gcc - env: BUILD=cmake CPP_STD=14 - - compiler: gcc - env: BUILD=cmake CPP_STD=17 - # New compilers can be added here. Need to be cleared when compiler becomes standard - compiler: gcc env: BUILD=cmake CPP_STD=17 @@ -103,38 +50,14 @@ jobs: packages: ['clang-11', 'libc++-11-dev', 'libc++abi-11-dev'] # Specific other tests - - compiler: gcc - env: BUILD=test_report - addons: - apt: - packages: - - ant-optional - - compiler: gcc - env: BUILD=cmake_coverage - - compiler: gcc - env: BUILD=cmake_gtest - - compiler: clang - env: BUILD=autotools_gtest - compiler: gcc env: BUILD=autotools_cmake_install_test -# MS DOS Build - - env: BUILD=make_dos - addons: - apt: - packages: - - dosbox - # Docker images. Need to be cleared at times - env: BUILD=docker_ubuntu_autotools - env: BUILD=docker_ubuntu_dos - env: BUILD=autotools_dist - - stage: extensive daily tests - compiler: gcc - env: BUILD=extensive_check - - compiler: clang - env: BUILD=extensive_check - arch: ppc64le compiler: gcc env: BUILD=autotools @@ -144,8 +67,6 @@ jobs: - arch: arm64 compiler: gcc env: BUILD=autotools - - compiler: gcc - env: BUILD=makefileworker - compiler: clang env: BUILD=autotools_install_and_test_examples diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index c2682431f..96f5b971a 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -12,10 +12,6 @@ if [ "x$BUILD" = "xautotools" ]; then make tdd fi -if [ "x$BUILD" = "xmakefileworker" ]; then - make -C $CPPUTEST_HOME -f Makefile_using_MakefileWorker test_all -fi - if [ "x$BUILD" = "xcmake" ]; then BUILD_ARGS=("-DWERROR=ON") @@ -29,50 +25,6 @@ if [ "x$BUILD" = "xcmake" ]; then ctest -V fi -if [ "x$BUILD" = "xautotools_gtest" ]; then - autoreconf -i .. - ../configure - make check_gtest -fi - -if [ "x$BUILD" = "xcmake_gtest" ]; then - pwd - wget https://github.com/google/googletest/archive/release-1.6.0.zip -O gtest-1.6.0.zip && unzip gtest-1.6.0.zip; - wget https://github.com/google/googlemock/archive/release-1.6.0.zip -O gmock-1.6.0.zip && unzip gmock-1.6.0.zip; - unzip gtest-1.6.0.zip -d $TRAVIS_BUILD_DIR - unzip gmock-1.6.0.zip -d $TRAVIS_BUILD_DIR - cd $TRAVIS_BUILD_DIR - mv googletest-release-1.6.0 googlemock-release-1.6.0/gtest - cd googlemock-release-1.6.0 - autoreconf -i; ./configure CXXFLAGS=-DGTEST_USE_OWN_TR1_TUPLE=1 && make - cd - - export GMOCK_HOME=$TRAVIS_BUILD_DIR/googlemock-release-1.6.0 - export GTEST_HOME=$TRAVIS_BUILD_DIR/googlemock-release-1.6.0/gtest - cmake . -DGMOCK=ON - make - ctest -V -fi - -if [ "x$BUILD" = "xtest_report" ]; then - autoreconf -i .. - ../configure - make check - ./CppUTestTests -ojunit - ./CppUTestExtTests -ojunit - cp ../scripts/generate_junit_report_ant.xml . - ant -f generate_junit_report_ant.xml -fi - -if [ "x$BUILD" = "xcmake_coverage" ]; then - pip install --user cpp-coveralls gcovr - - cmake .. -DCMAKE_BUILD_TYPE=Debug -DC++11=ON -DCOVERAGE=ON -DLONGLONG=ON - make - ctest - - coveralls -b . -r .. -i "src" -i "include" --gcov-options="-lbc" || true -fi - if [ "x$BUILD" = "xautotools_cmake_install_test" ]; then autoreconf -i .. ../configure @@ -113,26 +65,6 @@ if [ "x$BUILD" = "xdocker_ubuntu_dos" ]; then docker start -i cpputest_dos fi -if [ "x$BUILD" = "xmake_dos" ]; then - if [ ! -d watcom ]; then - git clone https://github.com/cpputest/watcom-compiler.git watcom - fi - export PATH=$PATH:$PWD/watcom/binl - export WATCOM=$PWD/watcom - export CC=wcl - export CXX=wcl - $CC --version - make -f $CPPUTEST_HOME/platforms/Dos/Makefile clean - make -f $CPPUTEST_HOME/platforms/Dos/Makefile - $CPPUTEST_HOME/platforms/Dos/alltests.sh -fi - -if [ "x$BUILD" = "xextensive_check" ]; then - autoreconf -i .. - ../configure - make check_all -fi - if [ "x$BUILD" = "xautotools_dist" ]; then autoreconf -i .. ../configure @@ -154,25 +86,3 @@ if [ "x$BUILD" = "xautotools_install_and_test_examples" ]; then sudo make install make -C $CPPUTEST_HOME/examples -f $CPPUTEST_HOME/examples/Makefile_ExamplesWithCppUTestInstalled.mk fi - -if [ "x$BUILD" = "xvc_windows" ]; then - export PATH=$MSBUILD_PATH:$PATH - cmake .. - MSBuild.exe ALL_BUILD.vcxproj - ./tests/CppUTest/CppUTestTests.exe - ./tests/CppUTestExt/CppUTestExtTests.exe -fi - -if [ "x$BUILD" = "xcmake_windows" ]; then - choco install make - BUILD_ARGS=("-DWERROR=ON") - - if [ -n "$CPP_STD" ]; then - BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=$CPP_STD") - fi - - cmake --version - cmake -G 'Unix Makefiles' "${BUILD_ARGS[@]}" .. - make - ctest -V -fi From 31eddf50ec399e7d9ea6a4f3afc2bacfcd3d58ff Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 11 Dec 2022 12:38:44 -0800 Subject: [PATCH 0979/1093] Automake -> Autotools Reconcile naming of jobs --- .github/workflows/basic.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 447f69a0f..ea260d56e 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -41,7 +41,7 @@ jobs: - name: CodeQL Analysis uses: github/codeql-action/analyze@v2 - automake: + autotools: strategy: matrix: include: @@ -91,7 +91,7 @@ jobs: configure_args: --disable-longlong target: tdd runs-on: ${{ matrix.os }} - name: Automake ${{ matrix.name }} + name: Autotools ${{ matrix.name }} steps: - name: Install Python 2 uses: actions/setup-python@v4 @@ -468,7 +468,7 @@ jobs: run: ctest --test-dir cpputest_build --output-on-failure autotools_msys: - name: Automake MSYS + name: Autotools MSYS runs-on: windows-latest defaults: run: From 4ecb65b0b44e3bfd5767fc98c64d9e7269e3827d Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 11 Dec 2022 12:56:20 -0800 Subject: [PATCH 0980/1093] Port compiler version builds --- .github/workflows/basic.yml | 14 ++++++++++++++ .travis.yml | 21 --------------------- scripts/travis_ci_build.sh | 13 ------------- 3 files changed, 14 insertions(+), 34 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index ea260d56e..d52d21324 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -182,6 +182,20 @@ jobs: os: ubuntu-latest cmake_args: -DCMAKE_CXX_STANDARD=20 preset: GNU + - name: GCC-10 + os: ubuntu-20.04 + cmake_args: > + -DCMAKE_C_COMPILER=gcc-10 + -DCMAKE_CXX_COMPILER=g++-10 + -DCMAKE_CXX_STANDARD=17 + preset: GNU + - name: Clang-11 + os: ubuntu-20.04 + cmake_args: > + -DCMAKE_C_COMPILER=clang-11 + -DCMAKE_CXX_COMPILER=clang++-11 + -DCMAKE_CXX_STANDARD=17 + preset: Clang - name: MinGW os: ubuntu-latest preset: MinGW diff --git a/.travis.yml b/.travis.yml index 223a1d097..181648cb9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,27 +28,6 @@ jobs: # Extended builds, different C++ version and build tools - stage: extended build & test -# New compilers can be added here. Need to be cleared when compiler becomes standard - - compiler: gcc - env: BUILD=cmake CPP_STD=17 - - CC=gcc-10 - - CXX=g++-10 - addons: - apt: - packages: ['g++-10'] - sources: - - sourceline: 'ppa:ubuntu-toolchain-r/test' - - compiler: clang - env: BUILD=cmake CPP_STD=17 - - CC=clang-11 - - CXX=clang++-11 - addons: - apt: - sources: - - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main' - key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key' - packages: ['clang-11', 'libc++-11-dev', 'libc++abi-11-dev'] - # Specific other tests - compiler: gcc env: BUILD=autotools_cmake_install_test diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 96f5b971a..ee3bf2bd3 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -12,19 +12,6 @@ if [ "x$BUILD" = "xautotools" ]; then make tdd fi -if [ "x$BUILD" = "xcmake" ]; then - BUILD_ARGS=("-DWERROR=ON") - - if [ -n "$CPP_STD" ]; then - BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=$CPP_STD") - fi - - cmake --version - cmake "${BUILD_ARGS[@]}" .. - make - ctest -V -fi - if [ "x$BUILD" = "xautotools_cmake_install_test" ]; then autoreconf -i .. ../configure From a73b0efab80ff8dc1b1bfa60c0f879ce9bfdf383 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 11 Dec 2022 13:06:30 -0800 Subject: [PATCH 0981/1093] WIP: port autotools install job Still need to figure out how to capture and compare the outputs of the two install jobs. Use of matrices seems to make this harder. --- .github/workflows/basic.yml | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index d52d21324..3f9c95a6d 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -49,47 +49,50 @@ jobs: os: macos-latest cc: gcc cxx: g++ - target: tdd + make_args: tdd - name: Mac Clang os: macos-latest cc: clang cxx: clang++ - target: tdd + make_args: tdd - name: Linux GNU os: ubuntu-latest cc: gcc cxx: g++ - target: tdd + make_args: tdd - name: Linux Clang os: ubuntu-latest cc: clang cxx: clang++ - target: tdd + make_args: tdd - name: GTest 1.5 os: ubuntu-20.04 - target: check_gtest15 + make_args: check_gtest15 - name: GTest 1.6 os: ubuntu-20.04 - target: check_gtest16 + make_args: check_gtest16 - name: GTest 1.7 os: ubuntu-20.04 - target: check_gtest17 + make_args: check_gtest17 - name: GTest 1.8 os: ubuntu-20.04 - target: check_gtest18 + make_args: check_gtest18 - name: GTest 1.10 os: ubuntu-20.04 - target: check_gtest110 + make_args: check_gtest110 - name: GTest 1.11 os: ubuntu-20.04 - target: check_gtest111 + make_args: check_gtest111 - name: GTest 1.12 os: ubuntu-20.04 - target: check_gtest112 + make_args: check_gtest112 - name: Disable long long os: ubuntu-latest configure_args: --disable-longlong - target: tdd + make_args: tdd + - name: Install + os: ubuntu-latest + make_args: DESTDIR=install_autotools install runs-on: ${{ matrix.os }} name: Autotools ${{ matrix.name }} steps: @@ -111,7 +114,7 @@ jobs: autoreconf -i . ./configure ${{ matrix.configure_args }} - name: Build and test - run: make ${{ matrix.target }} + run: make ${{ matrix.make_args }} cmake: strategy: From d634a3ae2910cd4b19b5cb6b61c9da8fdcddd98b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 11 Dec 2022 13:09:09 -0800 Subject: [PATCH 0982/1093] Delete dead travis script --- .travis.yml | 6 ------ configure.ac | 6 ------ scripts/travis_ci_after.sh | 11 ----------- 3 files changed, 23 deletions(-) delete mode 100755 scripts/travis_ci_after.sh diff --git a/.travis.yml b/.travis.yml index 181648cb9..699f2b237 100644 --- a/.travis.yml +++ b/.travis.yml @@ -81,12 +81,6 @@ before_script: script: - "../scripts/travis_ci_build.sh" -after_failure: -- "../scripts/travis_ci_after.sh" - -after_success: -- "../scripts/travis_ci_after.sh" - notifications: slack: secure: oOx4AGIiJB+j1pkIxlLeQh5qp7TF89Sj+3RzJRQuo6z0HocTz9yJgXPlDh1H9rLj5SxK/UKsk+WFafVuPdWakQ40LeYO49C/+e+mCDcS0ujLka6dvIE8v0SEb1PuaAGjJWdhiviAhSqu9YOKPYZs37lD3oqepuEpxeiXwsur9QU= diff --git a/configure.ac b/configure.ac index cd4089e4e..55a6d5927 100644 --- a/configure.ac +++ b/configure.ac @@ -535,12 +535,6 @@ Did you compile it? -------------------------------------]); fi - # In Travis, do not show warnings. The GTest warnings cause a log overflow that errors the build. Nice :) - if test -n "${TRAVIS_BRANCH}"; then - CPPUTEST_CWARNINGFLAGS="" - CPPUTEST_CXXWARNINGFLAGS="" - fi - else # When we don't compile with GMock, we can be a bit stricter on warnings. CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} ${CPPUTEST_CWARNINGFLAGS_STRICT}" diff --git a/scripts/travis_ci_after.sh b/scripts/travis_ci_after.sh deleted file mode 100755 index b28cb2d96..000000000 --- a/scripts/travis_ci_after.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# Script run in the travis CI -set -ex - -FILE="./test-suite.log" - -if [ -f $FILE ]; then - cat $FILE -else - echo "$FILE not found." -fi From dc5f83e8162b621f3b5cc8b3a926080837b2d4b3 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 11 Dec 2022 14:33:05 -0800 Subject: [PATCH 0983/1093] Port distribution build --- .github/workflows/basic.yml | 11 +++++++++++ .travis.yml | 1 - scripts/travis_ci_build.sh | 13 ------------- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 3f9c95a6d..6925a965d 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -90,6 +90,9 @@ jobs: os: ubuntu-latest configure_args: --disable-longlong make_args: tdd + - name: Distribution + os: ubuntu-latest + make_args: dist dist-zip VERSION=latest - name: Install os: ubuntu-latest make_args: DESTDIR=install_autotools install @@ -115,6 +118,14 @@ jobs: ./configure ${{ matrix.configure_args }} - name: Build and test run: make ${{ matrix.make_args }} + - name: Save Distributions + uses: actions/upload-artifact@v3 + with: + name: "Distribution" + path: | + cpputest-latest.tar.gz + cpputest-latest.zip + if: ${{ matrix.name == 'Distribution' }} cmake: strategy: diff --git a/.travis.yml b/.travis.yml index 699f2b237..3d63dac55 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,7 +35,6 @@ jobs: # Docker images. Need to be cleared at times - env: BUILD=docker_ubuntu_autotools - env: BUILD=docker_ubuntu_dos - - env: BUILD=autotools_dist - arch: ppc64le compiler: gcc diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index ee3bf2bd3..81dee0b09 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -52,19 +52,6 @@ if [ "x$BUILD" = "xdocker_ubuntu_dos" ]; then docker start -i cpputest_dos fi -if [ "x$BUILD" = "xautotools_dist" ]; then - autoreconf -i .. - ../configure - - if [ "x$TRAVIS_OS_NAME" = "xosx" ]; then - COPYFILE_DISABLE=1 make dist VERSION=latest - COPYFILE_DISABLE=1 make dist-zip VERSION=latest - else - make dist VERSION=latest - make dist-zip VERSION=latest - fi -fi - if [ "x$BUILD" = "xautotools_install_and_test_examples" ]; then autoreconf -i .. ../configure From 62c3afd1ed61d37fa83da1fc64e465f2c1ca8ab8 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 11 Dec 2022 19:46:48 -0800 Subject: [PATCH 0984/1093] Stub out auto-deployment Just enough to validate that the triggers and artifacts work as expected --- .github/workflows/deploy-latest.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/deploy-latest.yml diff --git a/.github/workflows/deploy-latest.yml b/.github/workflows/deploy-latest.yml new file mode 100644 index 000000000..a0fff9c1a --- /dev/null +++ b/.github/workflows/deploy-latest.yml @@ -0,0 +1,19 @@ +--- +name: Deploy Latest + +"on": + workflow_run: + workflows: ["Basic builds"] + branches: ["master"] + types: ["completed"] + +jobs: + deploy: + if: ${{ github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v3 + with: + name: Distribution + # TODO: let's just validate that this is triggered as expected first + - run: ls -R From a028ad601710525d3d5f696345dab2ba594dabf7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 13 Dec 2022 08:41:56 -0800 Subject: [PATCH 0985/1093] Restore ported travis configs As requested. --- .travis.yml | 107 ++++++++++++++++++++++++++++++++++ configure.ac | 6 ++ scripts/travis_ci_after.sh | 11 ++++ scripts/travis_ci_build.sh | 116 +++++++++++++++++++++++++++++++++++++ 4 files changed, 240 insertions(+) create mode 100755 scripts/travis_ci_after.sh diff --git a/.travis.yml b/.travis.yml index 3d63dac55..1ce211e3e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,17 +25,116 @@ jobs: # Basic builds +# Mac OSX + - stage: basic build & test + compiler: gcc + os: osx + env: BUILD=autotools + - compiler: clang + env: BUILD=autotools + os: osx + +# Windows + - compiler: msbuild + os: windows + env: BUILD=vc_windows CPP_STD=17 + - MSBUILD_PATH="c:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin" + - VCTargetsPath="C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\VC\VCTargets" + +# Linux + - compiler: gcc + env: BUILD=cmake CPP_STD=17 + - compiler: gcc + env: BUILD=autotools + - compiler: clang + env: BUILD=autotools + # Extended builds, different C++ version and build tools - stage: extended build & test +# Mac OSX + compiler: clang + os: osx + env: BUILD=cmake CPP_STD=17 + - compiler: gcc + os: osx + env: BUILD=cmake CPP_STD=14 + +# Linux +# CMake different C++ versions with clang + - compiler: clang + env: BUILD=cmake CPP_STD=98 + - compiler: clang + env: BUILD=cmake CPP_STD=11 + - compiler: clang + env: BUILD=cmake CPP_STD=14 + - compiler: clang + env: BUILD=cmake CPP_STD=17 + +# CMake different C++ versions with gcc + - compiler: gcc + env: BUILD=cmake CPP_STD=98 + - compiler: gcc + env: BUILD=cmake CPP_STD=11 + - compiler: gcc + env: BUILD=cmake CPP_STD=14 + - compiler: gcc + env: BUILD=cmake CPP_STD=17 + +# New compilers can be added here. Need to be cleared when compiler becomes standard + - compiler: gcc + env: BUILD=cmake CPP_STD=17 + - CC=gcc-10 + - CXX=g++-10 + addons: + apt: + packages: ['g++-10'] + sources: + - sourceline: 'ppa:ubuntu-toolchain-r/test' + - compiler: clang + env: BUILD=cmake CPP_STD=17 + - CC=clang-11 + - CXX=clang++-11 + addons: + apt: + sources: + - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main' + key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key' + packages: ['clang-11', 'libc++-11-dev', 'libc++abi-11-dev'] + # Specific other tests + - compiler: gcc + env: BUILD=test_report + addons: + apt: + packages: + - ant-optional + - compiler: gcc + env: BUILD=cmake_coverage + - compiler: gcc + env: BUILD=cmake_gtest + - compiler: clang + env: BUILD=autotools_gtest - compiler: gcc env: BUILD=autotools_cmake_install_test +# MS DOS Build + - env: BUILD=make_dos + addons: + apt: + packages: + - dosbox + # Docker images. Need to be cleared at times - env: BUILD=docker_ubuntu_autotools - env: BUILD=docker_ubuntu_dos + - env: BUILD=autotools_dist + - stage: extensive daily tests + compiler: gcc + env: BUILD=extensive_check + - compiler: clang + env: BUILD=extensive_check - arch: ppc64le compiler: gcc env: BUILD=autotools @@ -45,6 +144,8 @@ jobs: - arch: arm64 compiler: gcc env: BUILD=autotools + - compiler: gcc + env: BUILD=makefileworker - compiler: clang env: BUILD=autotools_install_and_test_examples @@ -80,6 +181,12 @@ before_script: script: - "../scripts/travis_ci_build.sh" +after_failure: +- "../scripts/travis_ci_after.sh" + +after_success: +- "../scripts/travis_ci_after.sh" + notifications: slack: secure: oOx4AGIiJB+j1pkIxlLeQh5qp7TF89Sj+3RzJRQuo6z0HocTz9yJgXPlDh1H9rLj5SxK/UKsk+WFafVuPdWakQ40LeYO49C/+e+mCDcS0ujLka6dvIE8v0SEb1PuaAGjJWdhiviAhSqu9YOKPYZs37lD3oqepuEpxeiXwsur9QU= diff --git a/configure.ac b/configure.ac index 55a6d5927..cd4089e4e 100644 --- a/configure.ac +++ b/configure.ac @@ -535,6 +535,12 @@ Did you compile it? -------------------------------------]); fi + # In Travis, do not show warnings. The GTest warnings cause a log overflow that errors the build. Nice :) + if test -n "${TRAVIS_BRANCH}"; then + CPPUTEST_CWARNINGFLAGS="" + CPPUTEST_CXXWARNINGFLAGS="" + fi + else # When we don't compile with GMock, we can be a bit stricter on warnings. CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} ${CPPUTEST_CWARNINGFLAGS_STRICT}" diff --git a/scripts/travis_ci_after.sh b/scripts/travis_ci_after.sh new file mode 100755 index 000000000..b28cb2d96 --- /dev/null +++ b/scripts/travis_ci_after.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# Script run in the travis CI +set -ex + +FILE="./test-suite.log" + +if [ -f $FILE ]; then + cat $FILE +else + echo "$FILE not found." +fi diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 81dee0b09..c2682431f 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -12,6 +12,67 @@ if [ "x$BUILD" = "xautotools" ]; then make tdd fi +if [ "x$BUILD" = "xmakefileworker" ]; then + make -C $CPPUTEST_HOME -f Makefile_using_MakefileWorker test_all +fi + +if [ "x$BUILD" = "xcmake" ]; then + BUILD_ARGS=("-DWERROR=ON") + + if [ -n "$CPP_STD" ]; then + BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=$CPP_STD") + fi + + cmake --version + cmake "${BUILD_ARGS[@]}" .. + make + ctest -V +fi + +if [ "x$BUILD" = "xautotools_gtest" ]; then + autoreconf -i .. + ../configure + make check_gtest +fi + +if [ "x$BUILD" = "xcmake_gtest" ]; then + pwd + wget https://github.com/google/googletest/archive/release-1.6.0.zip -O gtest-1.6.0.zip && unzip gtest-1.6.0.zip; + wget https://github.com/google/googlemock/archive/release-1.6.0.zip -O gmock-1.6.0.zip && unzip gmock-1.6.0.zip; + unzip gtest-1.6.0.zip -d $TRAVIS_BUILD_DIR + unzip gmock-1.6.0.zip -d $TRAVIS_BUILD_DIR + cd $TRAVIS_BUILD_DIR + mv googletest-release-1.6.0 googlemock-release-1.6.0/gtest + cd googlemock-release-1.6.0 + autoreconf -i; ./configure CXXFLAGS=-DGTEST_USE_OWN_TR1_TUPLE=1 && make + cd - + export GMOCK_HOME=$TRAVIS_BUILD_DIR/googlemock-release-1.6.0 + export GTEST_HOME=$TRAVIS_BUILD_DIR/googlemock-release-1.6.0/gtest + cmake . -DGMOCK=ON + make + ctest -V +fi + +if [ "x$BUILD" = "xtest_report" ]; then + autoreconf -i .. + ../configure + make check + ./CppUTestTests -ojunit + ./CppUTestExtTests -ojunit + cp ../scripts/generate_junit_report_ant.xml . + ant -f generate_junit_report_ant.xml +fi + +if [ "x$BUILD" = "xcmake_coverage" ]; then + pip install --user cpp-coveralls gcovr + + cmake .. -DCMAKE_BUILD_TYPE=Debug -DC++11=ON -DCOVERAGE=ON -DLONGLONG=ON + make + ctest + + coveralls -b . -r .. -i "src" -i "include" --gcov-options="-lbc" || true +fi + if [ "x$BUILD" = "xautotools_cmake_install_test" ]; then autoreconf -i .. ../configure @@ -52,6 +113,39 @@ if [ "x$BUILD" = "xdocker_ubuntu_dos" ]; then docker start -i cpputest_dos fi +if [ "x$BUILD" = "xmake_dos" ]; then + if [ ! -d watcom ]; then + git clone https://github.com/cpputest/watcom-compiler.git watcom + fi + export PATH=$PATH:$PWD/watcom/binl + export WATCOM=$PWD/watcom + export CC=wcl + export CXX=wcl + $CC --version + make -f $CPPUTEST_HOME/platforms/Dos/Makefile clean + make -f $CPPUTEST_HOME/platforms/Dos/Makefile + $CPPUTEST_HOME/platforms/Dos/alltests.sh +fi + +if [ "x$BUILD" = "xextensive_check" ]; then + autoreconf -i .. + ../configure + make check_all +fi + +if [ "x$BUILD" = "xautotools_dist" ]; then + autoreconf -i .. + ../configure + + if [ "x$TRAVIS_OS_NAME" = "xosx" ]; then + COPYFILE_DISABLE=1 make dist VERSION=latest + COPYFILE_DISABLE=1 make dist-zip VERSION=latest + else + make dist VERSION=latest + make dist-zip VERSION=latest + fi +fi + if [ "x$BUILD" = "xautotools_install_and_test_examples" ]; then autoreconf -i .. ../configure @@ -60,3 +154,25 @@ if [ "x$BUILD" = "xautotools_install_and_test_examples" ]; then sudo make install make -C $CPPUTEST_HOME/examples -f $CPPUTEST_HOME/examples/Makefile_ExamplesWithCppUTestInstalled.mk fi + +if [ "x$BUILD" = "xvc_windows" ]; then + export PATH=$MSBUILD_PATH:$PATH + cmake .. + MSBuild.exe ALL_BUILD.vcxproj + ./tests/CppUTest/CppUTestTests.exe + ./tests/CppUTestExt/CppUTestExtTests.exe +fi + +if [ "x$BUILD" = "xcmake_windows" ]; then + choco install make + BUILD_ARGS=("-DWERROR=ON") + + if [ -n "$CPP_STD" ]; then + BUILD_ARGS+=("-DCMAKE_CXX_STANDARD=$CPP_STD") + fi + + cmake --version + cmake -G 'Unix Makefiles' "${BUILD_ARGS[@]}" .. + make + ctest -V +fi From 38587f48c4199a09515267e3f052907a5d1ab6ce Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 11 Dec 2022 18:18:10 -0800 Subject: [PATCH 0986/1093] port docker build --- .github/workflows/basic.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index bcd74c164..d8579a2d1 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -488,3 +488,20 @@ jobs: ./configure - name: Build and test run: make tdd + + Docker: + strategy: + matrix: + image: [ "ubuntu", "dos"] + runs-on: ubuntu-latest + name: Docker ${{ matrix.image }} + steps: + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Build + uses: docker/build-push-action@v3 + with: + file: docker/Dockerfile.${{ matrix.image }} + tags: cpputest/${{ matrix.image }} From d0552b4a7a5ab57aeaf7cf77a3243387186a3164 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 17 Dec 2022 13:23:52 -0800 Subject: [PATCH 0987/1093] Login to Docker Hub if token is set --- .github/workflows/basic.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index d8579a2d1..5561853ed 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -492,7 +492,7 @@ jobs: Docker: strategy: matrix: - image: [ "ubuntu", "dos"] + image: ["ubuntu", "dos"] runs-on: ubuntu-latest name: Docker ${{ matrix.image }} steps: @@ -500,6 +500,14 @@ jobs: uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + env: + TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} + if: ${{ env.TOKEN != '' }} - name: Build uses: docker/build-push-action@v3 with: From 18e78e8edae99280b2e328b684351668b1d0ce99 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 10 Dec 2022 13:27:46 -0800 Subject: [PATCH 0988/1093] Decompose Makefile Worker targets --- .github/workflows/basic.yml | 75 +++++++++-------------------------- Makefile_using_MakefileWorker | 62 +++++++++++++++++++++++++++-- 2 files changed, 77 insertions(+), 60 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index ec875b820..96305c9c2 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -5,7 +5,7 @@ name: Basic builds push: pull_request: schedule: - - cron: '0 5 * * 3' + - cron: "0 5 * * 3" jobs: clang-format: @@ -376,78 +376,39 @@ jobs: matrix: include: - name: Defaults - test_cmd: ./CppUTest_tests -r + make_target: test_defaults - name: STDC++ disabled - make_args: > - CPPUTEST_USE_STD_CPP_LIB=N - extensions + make_target: test_disable_std_cpp - name: Memory Leak Detection disabled - make_args: > - CPPUTEST_USE_MEM_LEAK_DETECTION=N - extensions - - name: Memory Leak Detection disabled and STD C++ disabled - make_args: > - CPPUTEST_USE_MEM_LEAK_DETECTION=N - CPPUTEST_USE_STD_CPP_LIB=Y - extensions + make_target: test_disable_memory_leak_detection + - name: Disable Leak Detection and STD C++ + make_target: test_disable_std_cpp_and_leak_detection - name: debug disabled - make_args: > - CPPUTEST_ENABLE_DEBUG=N - extensions + make_target: test_disable_debug - name: overridden CXXFLAGS and CFLAGS and CPPFLAGS - make_args: > - CLFAGS="" - CXXFLAGS="" - CPPFLAGS="-Iinclude" + make_target: test_override_flags - name: without Standard C library includes - make_args: > - CPPUTEST_USE_STD_C_LIB=N - CPPUTEST_ADDITIONAL_CPPFLAGS=-DCPPUTEST_CHAR_BIT=8 - all_no_tests + make_target: test_disable_std_c - name: different TARGET_PLATFORM - make_args: TARGET_PLATFORM=real_platform - - name: overridden CXXFLAGS and CFLAGS and memory leak and STDC++ disabled - make_args: > - CLFAGS="" - CXXFLAGS="" - CPPFLAGS="-Iinclude -DCPPUTEST_STD_CPP_LIB_DISABLED -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED" + make_target: test_target_platform + - name: override flags and disable memory leak and STDC++ + make_target: test_override_and_disable - name: Examples - make_args: examples + make_target: test_examples - name: JUnit Output - test_cmd: ./CppUTest_tests -ojunit + make_target: test_junit_output - name: gcov - make_args: > - CPPUTEST_USE_GCOV=Y - everythingInstall - test_cmd: > - make -f Makefile_using_MakefileWorker gcov && - make -f Makefile_CppUTestExt gcov && - make -C examples gcov + make_target: test_gcov - name: VPATH usage - make_args: > - CPPUTEST_USE_GCOV=Y - CPPUTEST_USE_VPATH=Y - everythingInstall - test_cmd: > - make CPPUTEST_USE_VPATH=Y -f Makefile_CppUTestExt gcov && - make CPPUTEST_USE_VPATH=Y -C examples gcov + make_target: test_vpath - name: VPATH Install - make_args: CPPUTEST_USE_VPATH=Y everythingInstall - test_cmd: > - make -f Makefile_using_MakefileWorker flags && - make -f Makefile_using_MakefileWorker debug + make_target: test_vpath_install name: Make ${{ matrix.name }} runs-on: ubuntu-latest steps: - uses: actions/checkout@main - name: Build - run: > - make - -f Makefile_using_MakefileWorker - ${{ matrix.make_args }} - - name: Test - run: ${{ matrix.test_cmd }} - if: ${{ matrix.test_cmd }} + run: make -f Makefile_using_MakefileWorker ${{ matrix.make_target }} make_dos: name: Make OpenWatcom DOS diff --git a/Makefile_using_MakefileWorker b/Makefile_using_MakefileWorker index 1cd69fc85..66ec53932 100644 --- a/Makefile_using_MakefileWorker +++ b/Makefile_using_MakefileWorker @@ -29,38 +29,85 @@ include $(CPPUTEST_HOME)/build/MakefileWorker.mk #these are a sample of the other alternative flag settings .PHONY: test_all test_all: start + $(MAKE_CMD) test_defaults + $(MAKE_CMD) test_disable_std_cpp + $(MAKE_CMD) test_disable_memory_leak_detection + $(MAKE_CMD) test_disable_std_cpp_and_leak_detection + $(MAKE_CMD) test_disable_debug + $(MAKE_CMD) test_override_flags + $(MAKE_CMD) test_disable_std_c + $(MAKE_CMD) test_target_platform + $(MAKE_CMD) test_override_and_disable + $(MAKE_CMD) test_examples + $(MAKE_CMD) test_junit_output + $(MAKE_CMD) test_gcov + $(MAKE_CMD) test_vpath + $(MAKE_CMD) test_vpath_install + +.PHONY: test_defaults +test_defaults: start @echo Building with the default flags. $(MAKE_CMD) clean $(TIME) $(MAKE_CMD) ./$(TEST_TARGET) -r $(MAKE_CMD) clean + +.PHONY: test_disable_std_cpp +test_disable_std_cpp: start @echo Building with the STDC++ new disabled. $(TIME) $(MAKE_CMD) CPPUTEST_USE_STD_CPP_LIB=N extensions $(MAKE_CMD) CPPUTEST_USE_STD_CPP_LIB=N cleanExtensions + +.PHONY: test_disable_memory_leak_detection +test_disable_memory_leak_detection: start @echo Building with Memory Leak Detection disabled $(TIME) $(MAKE_CMD) CPPUTEST_USE_MEM_LEAK_DETECTION=N extensions $(MAKE_CMD) CPPUTEST_USE_MEM_LEAK_DETECTION=N cleanExtensions + +.PHONY: test_disable_std_cpp_and_leak_detection +test_disable_std_cpp_and_leak_detection: start @echo Building with Memory Leak Detection disabled and STD C++ disabled $(TIME) $(MAKE_CMD) CPPUTEST_USE_MEM_LEAK_DETECTION=N CPPUTEST_USE_STD_CPP_LIB=Y extensions $(MAKE_CMD) CPPUTEST_USE_MEM_LEAK_DETECTION=N CPPUTEST_USE_STD_CPP_LIB=Y cleanExtensions + +.PHONY: test_disable_debug +test_disable_debug: start @echo Building with debug disabled $(TIME) $(MAKE_CMD) CPPUTEST_ENABLE_DEBUG=N extensions $(MAKE_CMD) CPPUTEST_ENABLE_DEBUG=N cleanExtensions + +.PHONY: test_override_flags +test_override_flags: start @echo Building with overridden CXXFLAGS and CFLAGS and CPPFLAGS - $(TIME) $(MAKE_CMD) CLFAGS="" CXXFLAGS="" CPPFLAGS="-Iinclude" + $(TIME) $(MAKE_CMD) CFLAGS="" CXXFLAGS="" CPPFLAGS="-Iinclude" $(MAKE_CMD) CFLAGS="" CXXFLAGS="" clean + +.PHONY: test_disable_std_c +test_disable_std_c: start @echo Building without Standard C library includes - $(TIME) $(MAKE_CMD) CPPUTEST_USE_STD_C_LIB=N all_no_tests + $(TIME) $(MAKE_CMD) CPPUTEST_USE_STD_C_LIB=N CPPUTEST_ADDITIONAL_CPPFLAGS="-DCPPUTEST_CHAR_BIT=8" all_no_tests $(MAKE_CMD) CPPUTEST_USE_STD_C_LIB=N clean + +.PHONY: test_target_platform +test_target_platform: start @echo Building with a different TARGET_PLATFORM $(MAKE_CMD) TARGET_PLATFORM=real_platform + +.PHONY: test_override_and_disable +test_override_and_disable: start @echo Building with overridden CXXFLAGS and CFLAGS and memory leak and STDC++ disabled - $(TIME) $(MAKE_CMD) CLFAGS="" CXXFLAGS="" CPPFLAGS="-Iinclude -DCPPUTEST_STD_CPP_LIB_DISABLED -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED" + $(TIME) $(MAKE_CMD) CFLAGS="" CXXFLAGS="" CPPFLAGS="-Iinclude -DCPPUTEST_STD_CPP_LIB_DISABLED -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED" $(MAKE_CMD) CFLAGS="" CXXFLAGS="" CPPFLAGS="-DCPPUTEST_STD_CPP_LIB_DISABLED -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED" clean + +.PHONY: test_examples +test_examples: start @echo Building examples $(MAKE_CMD) cleanExamples $(TIME) $(MAKE_CMD) examples $(MAKE_CMD) cleanExamples + +.PHONY: test_junit_output +test_junit_output: start @echo Testing JUnit output $(TIME) $(MAKE_CMD) $(SILENCE)./$(TEST_TARGET) -ojunit > junit_run_output @@ -68,18 +115,27 @@ test_all: start $(MAKE_CMD) clean $(MAKE_CMD) CPPUTEST_MAP_FILE=map.txt $(MAKE_CMD) clean + +.PHONY: test_gcov +test_gcov: start @echo Testing GCOV usage $(TIME) $(MAKE_CMD) CPPUTEST_USE_GCOV=Y everythingInstall $(MAKE_CMD) gcov $(MAKE) -f Makefile_CppUTestExt gcov $(MAKE) -C examples gcov $(MAKE_CMD) cleanEverythingInstall + +.PHONY: test_vpath +test_vpath: start @echo Testing VPATH usage $(TIME) $(MAKE_CMD) CPPUTEST_USE_GCOV=Y CPPUTEST_USE_VPATH=Y everythingInstall $(MAKE_CMD) CPPUTEST_USE_VPATH=Y gcov $(MAKE) CPPUTEST_USE_VPATH=Y -f Makefile_CppUTestExt gcov $(MAKE) CPPUTEST_USE_VPATH=Y -C examples gcov $(MAKE_CMD) clean cleanExamples + +.PHONY: test_vpath_install +test_vpath_install: start @echo Testing VPATH usage $(TIME) $(MAKE_CMD) CPPUTEST_USE_VPATH=Y everythingInstall $(MAKE_CMD) CPPUTEST_USE_VPATH=Y cleanEverythingInstall From 92c02e06a071c968dcd9a6e7b0a37382201e4cc8 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 10 Dec 2022 15:49:21 -0800 Subject: [PATCH 0989/1093] Disable failing test_gcov --- .github/workflows/basic.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 96305c9c2..b1556deb9 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -397,8 +397,8 @@ jobs: make_target: test_examples - name: JUnit Output make_target: test_junit_output - - name: gcov - make_target: test_gcov + # - name: gcov + # make_target: test_gcov - name: VPATH usage make_target: test_vpath - name: VPATH Install From f64577421bd60a6aec8a27af8939c8431143ca3f Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 14 Dec 2022 19:03:58 -0800 Subject: [PATCH 0990/1093] Remove scheduled workflows Closes #1727 --- .github/workflows/basic.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index b1556deb9..20c566da2 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -4,8 +4,6 @@ name: Basic builds "on": push: pull_request: - schedule: - - cron: "0 5 * * 3" jobs: clang-format: From 3a893bc6d02fd6d1a6b9bb9af0deac5a89371dae Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 28 Dec 2022 17:57:09 -0800 Subject: [PATCH 0991/1093] Delete build directory I frequently delete the build directory when re-configuring builds and it creates very noisy git diffs since the directory is currently tracked. --- .gitignore | 3 +++ cpputest_build/.gitignore | 2 -- scripts/appveyor_ci_build.ps1 | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) delete mode 100644 cpputest_build/.gitignore diff --git a/.gitignore b/.gitignore index b704fe83f..b25e988c8 100644 --- a/.gitignore +++ b/.gitignore @@ -100,3 +100,6 @@ generated/ *.LOG /console_output /exit + +# Builds +/cpputest_build/ diff --git a/cpputest_build/.gitignore b/cpputest_build/.gitignore deleted file mode 100644 index d6b7ef32c..000000000 --- a/cpputest_build/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index 07d5e6f6f..5f33eacd6 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -2,6 +2,8 @@ # Load functions from the helper file . (Join-Path (Split-Path $MyInvocation.MyCommand.Path) 'appveyor_helpers.ps1') +mkdir cpputest_build + function Invoke-BuildCommand($command, $directory = '.') { $command_wrapped = "$command;`$err = `$?" From 97f5494364dbd46bef4684dc0b6a39100628825f Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 28 Dec 2022 21:53:09 -0800 Subject: [PATCH 0992/1093] Use custom artifact download for deployment GitHub's own download action does not work across workflows: https://github.com/actions/download-artifact/issues/3 --- .github/workflows/deploy-latest.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy-latest.yml b/.github/workflows/deploy-latest.yml index a0fff9c1a..b5b123ce6 100644 --- a/.github/workflows/deploy-latest.yml +++ b/.github/workflows/deploy-latest.yml @@ -12,8 +12,14 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' }} runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v3 + # https://github.com/actions/download-artifact/issues/3 + - name: Download artifact + id: download-artifact + uses: dawidd6/action-download-artifact@v2 with: + workflow: basic.yml name: Distribution + workflow_conclusion: success + branch: master # TODO: let's just validate that this is triggered as expected first - run: ls -R From 81436c5e36925042b1991854466f5c5f4413b4dc Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 28 Dec 2022 23:03:42 -0800 Subject: [PATCH 0993/1093] Create tag --- .github/workflows/deploy-latest.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-latest.yml b/.github/workflows/deploy-latest.yml index b5b123ce6..ce1d365e1 100644 --- a/.github/workflows/deploy-latest.yml +++ b/.github/workflows/deploy-latest.yml @@ -12,6 +12,8 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' }} runs-on: ubuntu-latest steps: + - name: Checkout + uses: actions/checkout@v3 # https://github.com/actions/download-artifact/issues/3 - name: Download artifact id: download-artifact @@ -21,5 +23,8 @@ jobs: name: Distribution workflow_conclusion: success branch: master - # TODO: let's just validate that this is triggered as expected first - - run: ls -R + - name: Tag + uses: anothrNick/github-tag-action@v1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CUSTOM_TAG: latest-passing-build From fc8c5a28f2b2ce6ab1da0f8050e07330d8506084 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 28 Dec 2022 22:29:54 -0800 Subject: [PATCH 0994/1093] Create release --- .github/workflows/deploy-latest.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/deploy-latest.yml b/.github/workflows/deploy-latest.yml index ce1d365e1..c97672a04 100644 --- a/.github/workflows/deploy-latest.yml +++ b/.github/workflows/deploy-latest.yml @@ -28,3 +28,15 @@ jobs: with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CUSTOM_TAG: latest-passing-build + - name: Release + uses: softprops/action-gh-release@v1 + with: + tag_name: latest-passing-build + name: Latest passing build + body: | + This is the automatic release from GitHub Actions. + Whenever a build passes, it gets released as Latest Passing Build. + files: | + cpputest-latest.tar.gz + cpputest-latest.zip + fail_on_unmatched_files: true From d4a100945e7509cd9d845852d9a6b76a6dfcfd91 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 28 Dec 2022 22:39:55 -0800 Subject: [PATCH 0995/1093] Limit releases to main repo --- .github/workflows/deploy-latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-latest.yml b/.github/workflows/deploy-latest.yml index c97672a04..6cdd0d735 100644 --- a/.github/workflows/deploy-latest.yml +++ b/.github/workflows/deploy-latest.yml @@ -9,7 +9,7 @@ name: Deploy Latest jobs: deploy: - if: ${{ github.event.workflow_run.conclusion == 'success' }} + if: github.event.workflow_run.conclusion == 'success' && github.repository == 'cpputest/cpputest' runs-on: ubuntu-latest steps: - name: Checkout From 808765d24e6e6fe1edd878ecb0efab23213b16ce Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 29 Dec 2022 09:06:49 -0800 Subject: [PATCH 0996/1093] Abandon attempts to auto-tag and release None of the available GitHub actions allow us to "move" an existing `latest-passing-build` tag. GitHub expects tags to go unmutated. I think this is fine. We shouldn't be merging anything that doesn't build; master effectively serves the same purpose. --- .github/workflows/basic.yml | 8 ------ .github/workflows/deploy-latest.yml | 42 ----------------------------- README.md | 2 +- 3 files changed, 1 insertion(+), 51 deletions(-) delete mode 100644 .github/workflows/deploy-latest.yml diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 20c566da2..8f14e0b32 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -116,14 +116,6 @@ jobs: ./configure ${{ matrix.configure_args }} - name: Build and test run: make ${{ matrix.make_args }} - - name: Save Distributions - uses: actions/upload-artifact@v3 - with: - name: "Distribution" - path: | - cpputest-latest.tar.gz - cpputest-latest.zip - if: ${{ matrix.name == 'Distribution' }} cmake: strategy: diff --git a/.github/workflows/deploy-latest.yml b/.github/workflows/deploy-latest.yml deleted file mode 100644 index 6cdd0d735..000000000 --- a/.github/workflows/deploy-latest.yml +++ /dev/null @@ -1,42 +0,0 @@ ---- -name: Deploy Latest - -"on": - workflow_run: - workflows: ["Basic builds"] - branches: ["master"] - types: ["completed"] - -jobs: - deploy: - if: github.event.workflow_run.conclusion == 'success' && github.repository == 'cpputest/cpputest' - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - # https://github.com/actions/download-artifact/issues/3 - - name: Download artifact - id: download-artifact - uses: dawidd6/action-download-artifact@v2 - with: - workflow: basic.yml - name: Distribution - workflow_conclusion: success - branch: master - - name: Tag - uses: anothrNick/github-tag-action@v1 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CUSTOM_TAG: latest-passing-build - - name: Release - uses: softprops/action-gh-release@v1 - with: - tag_name: latest-passing-build - name: Latest passing build - body: | - This is the automatic release from GitHub Actions. - Whenever a build passes, it gets released as Latest Passing Build. - files: | - cpputest-latest.tar.gz - cpputest-latest.zip - fail_on_unmatched_files: true diff --git a/README.md b/README.md index d1de45226..c45f52734 100644 --- a/README.md +++ b/README.md @@ -236,7 +236,7 @@ include(FetchContent) FetchContent_Declare( CppUTest GIT_REPOSITORY https://github.com/cpputest/cpputest.git - GIT_TAG latest-passing-build # or use release tag, eg. v3.8 + GIT_TAG master # or use release tag, eg. v4.0 ) # Set this to ON if you want to have the CppUTests in your project as well. set(TESTS OFF CACHE BOOL "Switch off CppUTest Test build") From 3cd307953102da283ab8b0a9769dcff8e59a2f89 Mon Sep 17 00:00:00 2001 From: "Steve Hill (Wireless)" Date: Thu, 5 Jan 2023 09:00:34 +0000 Subject: [PATCH 0997/1093] Ensure that exception specifications match for delete overloads --- include/CppUTest/CppUTestConfig.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index d30d9766f..4cc8d3fc7 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -217,8 +217,12 @@ #endif #else #define UT_THROW(exception) - #ifdef __clang__ - #define UT_NOTHROW throw() + #if defined(__clang__) || defined(__GNUC__) + #if defined(__cplusplus) && __cplusplus >= 201103L + #define UT_NOTHROW noexcept + #else + #define UT_NOTHROW throw() + #endif #else #define UT_NOTHROW #endif From 076b148dd089db32e9618aa3b9ce92d9c8cece45 Mon Sep 17 00:00:00 2001 From: "Steve Hill (Wireless)" Date: Thu, 5 Jan 2023 09:54:35 +0000 Subject: [PATCH 0998/1093] Possible fix for broken CI build --- .github/workflows/basic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 20c566da2..3cb7a9b5f 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -281,7 +281,7 @@ jobs: - name: Install QEMU # The version in the ubuntu repositories (6.2) is broken. run: | - wget -nv http://ftp.de.debian.org/debian/pool/main/q/qemu/qemu-user-static_7.1+dfsg-2+b3_amd64.deb -O qemu.deb + wget -nv http://ftp.de.debian.org/debian/pool/main/q/qemu/qemu-user-static_7.1+dfsg-2~bpo11+3_amd64.deb -O qemu.deb sudo dpkg --install qemu.deb rm -f qemu.deb if: ${{ matrix.name == 'GCC ARM embedded' }} From 29614384bd1316771ec0a9c7a8bc940985d967df Mon Sep 17 00:00:00 2001 From: "Steve Hill (Wireless)" Date: Thu, 5 Jan 2023 12:01:07 +0000 Subject: [PATCH 0999/1093] Fix typo in test --- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index 46a602c3c..f3c03f79b 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -43,7 +43,7 @@ static void deleteArrayInvalidatesMemory() unsigned char* memory = new unsigned char[10]; PlatformSpecificMemset(memory, 0xAB, 10); delete [] memory; - CHECK(memory[5] != 0xCB); + CHECK(memory[5] != 0xAB); } CPPUTEST_DO_NOT_SANITIZE_ADDRESS From f92b1ac590de197c74409703ebcdf9e3b39d7a26 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 5 Jan 2023 08:50:31 -0800 Subject: [PATCH 1000/1093] Remove qemu from CI Our workaround to download a new version on Ubuntu keeps breaking because the Debian URL is not stable. - #1700 - #1738 --- .github/workflows/basic.yml | 7 ------- CMakePresets.json | 5 +---- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 8f14e0b32..59c419704 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -270,13 +270,6 @@ jobs: - uses: carlosperate/arm-none-eabi-gcc-action@v1 if: ${{ matrix.name == 'GCC ARM embedded' }} - - name: Install QEMU - # The version in the ubuntu repositories (6.2) is broken. - run: | - wget -nv http://ftp.de.debian.org/debian/pool/main/q/qemu/qemu-user-static_7.1+dfsg-2+b3_amd64.deb -O qemu.deb - sudo dpkg --install qemu.deb - rm -f qemu.deb - if: ${{ matrix.name == 'GCC ARM embedded' }} - name: Install OpenWatcom uses: open-watcom/setup-watcom@v0 diff --git a/CMakePresets.json b/CMakePresets.json index 704f81207..bd1861bb8 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -67,10 +67,7 @@ { "name": "arm-embedded", "inherits": ["defaults"], - "toolchainFile": "${sourceDir}/cmake/Toolchains/arm-none-eabi-gcc.toolchain.cmake", - "cacheVariables": { - "CMAKE_CROSSCOMPILING_EMULATOR": "qemu-arm-static;-cpu;cortex-m4" - } + "toolchainFile": "${sourceDir}/cmake/Toolchains/arm-none-eabi-gcc.toolchain.cmake" }, { "name": "coverage", From d700a5a9b1761129e1aa85ca81a7c33a7a0f66a0 Mon Sep 17 00:00:00 2001 From: "Steve Hill (Wireless)" Date: Thu, 5 Jan 2023 17:38:56 +0000 Subject: [PATCH 1001/1093] Revert "Possible fix for broken CI build" This reverts commit 076b148dd089db32e9618aa3b9ce92d9c8cece45. --- .github/workflows/basic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 3cb7a9b5f..20c566da2 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -281,7 +281,7 @@ jobs: - name: Install QEMU # The version in the ubuntu repositories (6.2) is broken. run: | - wget -nv http://ftp.de.debian.org/debian/pool/main/q/qemu/qemu-user-static_7.1+dfsg-2~bpo11+3_amd64.deb -O qemu.deb + wget -nv http://ftp.de.debian.org/debian/pool/main/q/qemu/qemu-user-static_7.1+dfsg-2+b3_amd64.deb -O qemu.deb sudo dpkg --install qemu.deb rm -f qemu.deb if: ${{ matrix.name == 'GCC ARM embedded' }} From 7dde4358c74c1d8d22f9168bca6260f77fdcdd28 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 7 Jan 2023 12:39:05 -0800 Subject: [PATCH 1002/1093] Run QEMU with Docker --- CMakePresets.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakePresets.json b/CMakePresets.json index bd1861bb8..2d037a052 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -67,7 +67,10 @@ { "name": "arm-embedded", "inherits": ["defaults"], - "toolchainFile": "${sourceDir}/cmake/Toolchains/arm-none-eabi-gcc.toolchain.cmake" + "toolchainFile": "${sourceDir}/cmake/Toolchains/arm-none-eabi-gcc.toolchain.cmake", + "cacheVariables": { + "CMAKE_CROSSCOMPILING_EMULATOR": "docker;run;--rm;-v=${sourceDir}:${sourceDir};multiarch/qemu-user-static:x86_64-arm;qemu-arm-static;-cpu;cortex-m4" + } }, { "name": "coverage", From f11afc457c8e7cb041dcbb65a188cfaf60b164ef Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Dec 2022 23:03:17 -0800 Subject: [PATCH 1003/1093] Split test sources --- tests/CppUTest/CMakeLists.txt | 111 +++++++++++++++++++--------- tests/CppUTestExt/CMakeLists.txt | 121 ++++++++++++++++++++++--------- 2 files changed, 163 insertions(+), 69 deletions(-) diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 861fd1116..dbf7dcbe1 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -1,53 +1,92 @@ -add_executable(CppUTestTests +add_library(CppUTestTests_main OBJECT AllTests.cpp - SetPluginTest.cpp +) + +if(CPPUTEST_STD_C_LIB_DISABLED) + target_sources(CppUTestTests_main + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../DummyUTestPlatform/DummyUTestPlatform.cpp + ) +endif() + +target_link_libraries(CppUTestTests_main + PUBLIC CppUTest +) + + +add_executable(CppUTestTests) + +add_mapfile(CppUTestTests) + +if(CPPUTEST_TEST_DISCOVERY) + include(CppUTest) + cpputest_discover_tests(CppUTestTests) +endif() + +function(add_cpputest_test name) + target_sources(CppUTestTests + PRIVATE ${ARGN} + ) + target_link_libraries(CppUTestTests + PRIVATE CppUTestTests_main + ) +endfunction() + +add_cpputest_test(1 + AllocLetTestFree.c + AllocLetTestFreeTest.cpp CheatSheetTest.cpp - SimpleStringTest.cpp - SimpleStringCacheTest.cpp CompatabilityTests.cpp CommandLineArgumentsTest.cpp - TestFailureTest.cpp - TestFailureNaNTest.cpp CommandLineTestRunnerTest.cpp - TestFilterTest.cpp - TestHarness_cTest.cpp JUnitOutputTest.cpp - TestHarness_cTestCFile.c +) + +add_cpputest_test(2 DummyMemoryLeakDetector.cpp - MemoryLeakDetectorTest.cpp - TestInstallerTest.cpp - AllocLetTestFree.c - MemoryOperatorOverloadTest.cpp - TestMemoryAllocatorTest.cpp MemoryLeakWarningTest.cpp - TestOutputTest.cpp - AllocLetTestFreeTest.cpp - TestRegistryTest.cpp - AllocationInCFile.c PluginTest.cpp - TestResultTest.cpp PreprocessorTest.cpp - TestUTestMacro.cpp - TestUTestStringMacro.cpp - AllocationInCppFile.cpp - UtestTest.cpp + SetPluginTest.cpp SimpleMutexTest.cpp - UtestPlatformTest.cpp TeamCityOutputTest.cpp + TestFailureNaNTest.cpp + TestFailureTest.cpp + TestResultTest.cpp ) -if(CPPUTEST_STD_C_LIB_DISABLED) - target_sources(CppUTestTests - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/../DummyUTestPlatform/DummyUTestPlatform.cpp - ) -endif() +add_cpputest_test(3 + MemoryLeakDetectorTest.cpp + SimpleStringTest.cpp + SimpleStringCacheTest.cpp +) -target_link_libraries(CppUTestTests PRIVATE CppUTest) +add_cpputest_test(4 + TestOutputTest.cpp + TestRegistryTest.cpp +) -add_mapfile(CppUTestTests) +add_cpputest_test(5 + AllocationInCFile.c + AllocationInCppFile.cpp + MemoryOperatorOverloadTest.cpp + TeamCityOutputTest.cpp +) -if(CPPUTEST_TEST_DISCOVERY) - include(CppUTest) - cpputest_discover_tests(CppUTestTests) -endif() +add_cpputest_test(6 + TestFilterTest.cpp + TestHarness_cTest.cpp + TestHarness_cTestCFile.c + TestInstallerTest.cpp +) + +add_cpputest_test(7 + TestMemoryAllocatorTest.cpp + TestUTestMacro.cpp +) + +add_cpputest_test(8 + UtestPlatformTest.cpp + UtestTest.cpp + TestUTestStringMacro.cpp +) diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 064275ba4..c45717f05 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -1,36 +1,9 @@ -add_executable(CppUTestExtTests +add_library(CppUTestExtTests_main OBJECT AllTests.cpp - CodeMemoryReporterTest.cpp - GMockTest.cpp - GTest1Test.cpp - IEEE754PluginTest.cpp - IEEE754PluginTest_c.c - MemoryReportAllocatorTest.cpp - MemoryReporterPluginTest.cpp - MemoryReportFormatterTest.cpp - MockActualCallTest.cpp - MockCheatSheetTest.cpp - MockCallTest.cpp - MockComparatorCopierTest.cpp - MockExpectedCallTest.cpp - ExpectedFunctionsListTest.cpp - MockFailureReporterForTest.cpp - MockFailureTest.cpp - MockHierarchyTest.cpp - MockNamedValueTest.cpp - MockParameterTest.cpp - MockPluginTest.cpp - MockSupportTest.cpp - MockSupport_cTestCFile.c - MockSupport_cTest.cpp - MockStrictOrderTest.cpp - MockReturnValueTest.cpp - OrderedTestTest_c.c - OrderedTestTest.cpp ) if(CPPUTEST_STD_C_LIB_DISABLED) - target_sources(CppUTestExtTests + target_sources(CppUTestExtTests_main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../DummyUTestPlatform/DummyUTestPlatform.cpp ) @@ -56,16 +29,18 @@ if(CPPUTEST_TEST_GTEST) ) endif() endif() - target_link_libraries(CppUTestExtTests PRIVATE ${GTEST_LIBRARIES}) - target_compile_definitions(CppUTestExtTests PRIVATE CPPUTEST_INCLUDE_GTEST_TESTS) + target_link_libraries(CppUTestExtTests_main PUBLIC ${GTEST_LIBRARIES}) + target_compile_definitions(CppUTestExtTests_main PUBLIC CPPUTEST_INCLUDE_GTEST_TESTS) endif() -target_link_libraries(CppUTestExtTests - PRIVATE +target_link_libraries(CppUTestExtTests_main + PUBLIC CppUTest CppUTestExt ) +add_executable(CppUTestExtTests) + add_mapfile(CppUTestExtTests) if(CPPUTEST_TEST_DISCOVERY) @@ -74,3 +49,83 @@ if(CPPUTEST_TEST_DISCOVERY) DETAILED FALSE ) endif() + + +function(add_cpputestext_test name) + target_sources(CppUTestExtTests + PRIVATE ${ARGN} + ) + target_link_libraries(CppUTestExtTests + PRIVATE CppUTestExtTests_main + ) +endfunction() + +add_cpputestext_test(1 + MockFailureReporterForTest.cpp + ExpectedFunctionsListTest.cpp + GMockTest.cpp + GTest1Test.cpp + GTest2ConvertorTest.cpp +) + +add_cpputestext_test(2 + MockFailureReporterForTest.cpp + MemoryReportAllocatorTest.cpp + MemoryReportFormatterTest.cpp + MemoryReporterPluginTest.cpp + MockActualCallTest.cpp + MockCheatSheetTest.cpp + MockComparatorCopierTest.cpp + MockExpectedCallTest.cpp + MockHierarchyTest.cpp +) + +add_cpputestext_test(3 + MockFailureReporterForTest.cpp + CodeMemoryReporterTest.cpp + OrderedTestTest.cpp + OrderedTestTest_c.c +) + +add_cpputestext_test(4 + MockFailureReporterForTest.cpp + MockReturnValueTest.cpp + MockNamedValueTest.cpp +) + +add_cpputestext_test(5 + MockFailureReporterForTest.cpp + MockPluginTest.cpp + MockSupport_cTest.cpp + MockSupport_cTestCFile.c +) + +add_cpputestext_test(6 + MockFailureReporterForTest.cpp + ExpectedFunctionsListTest.cpp + MockCallTest.cpp +) + +add_cpputestext_test(7 + MockFailureReporterForTest.cpp + MockComparatorCopierTest.cpp + MockHierarchyTest.cpp + MockParameterTest.cpp +) + +add_cpputestext_test(8 + MockFailureReporterForTest.cpp + IEEE754PluginTest.cpp + IEEE754PluginTest_c.c + MockComparatorCopierTest.cpp +) + +add_cpputestext_test(9 + MockFailureReporterForTest.cpp + MockFailureTest.cpp + MockHierarchyTest.cpp + MockPluginTest.cpp + MockReturnValueTest.cpp + MockStrictOrderTest.cpp + MockSupportTest.cpp +) From 38c249c3913ee3e856f12ebc57880061d29d2fc1 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 6 Dec 2022 23:18:02 -0800 Subject: [PATCH 1004/1093] Split test executables --- CMakeLists.txt | 2 ++ tests/CppUTest/CMakeLists.txt | 27 +++++++++++++++++++-------- tests/CppUTestExt/CMakeLists.txt | 30 ++++++++++++++++++++---------- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0fa55ab9f..b92b423f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,8 @@ cmake_dependent_option(CPPUTEST_USE_LONG_LONG "Support long long" cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTest" ${PROJECT_IS_TOP_LEVEL} "BUILD_TESTING" OFF) +cmake_dependent_option(CPPUTEST_SPLIT_TESTS "Split tests into small executables" + OFF "CPPUTEST_BUILD_TESTING" OFF) cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" ON "CPPUTEST_BUILD_TESTING;CMAKE_CROSSCOMPILING_EMULATOR OR NOT CMAKE_CROSSCOMPILING" OFF) cmake_dependent_option(CPPUTEST_TEST_GTEST "Test GoogleTest integration" diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index dbf7dcbe1..d6830d825 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -13,21 +13,32 @@ target_link_libraries(CppUTestTests_main PUBLIC CppUTest ) +include(CppUTest) -add_executable(CppUTestTests) +if(NOT CPPUTEST_SPLIT_TESTS) + add_executable(CppUTestTests) -add_mapfile(CppUTestTests) + add_mapfile(CppUTestTests) -if(CPPUTEST_TEST_DISCOVERY) - include(CppUTest) - cpputest_discover_tests(CppUTestTests) + if(CPPUTEST_TEST_DISCOVERY) + cpputest_discover_tests(CppUTestTests) + endif() endif() -function(add_cpputest_test name) - target_sources(CppUTestTests +function(add_cpputest_test number) + set(name CppUTestTests) + + if(CPPUTEST_SPLIT_TESTS) + string(APPEND name ${number}) + add_executable(${name}) + add_mapfile(${name}) + cpputest_discover_tests(${name}) + endif() + + target_sources(${name} PRIVATE ${ARGN} ) - target_link_libraries(CppUTestTests + target_link_libraries(${name} PRIVATE CppUTestTests_main ) endfunction() diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index c45717f05..e4ce6d66c 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -39,23 +39,33 @@ target_link_libraries(CppUTestExtTests_main CppUTestExt ) -add_executable(CppUTestExtTests) +if(NOT CPPUTEST_SPLIT_TESTS) + add_executable(CppUTestExtTests) -add_mapfile(CppUTestExtTests) + add_mapfile(CppUTestExtTests) -if(CPPUTEST_TEST_DISCOVERY) - include(CppUTest) - cpputest_discover_tests(CppUTestExtTests - DETAILED FALSE - ) + if(CPPUTEST_TEST_DISCOVERY) + include(CppUTest) + cpputest_discover_tests(CppUTestExtTests + DETAILED FALSE + ) + endif() endif() +function(add_cpputestext_test number) + set(name CppUTestExtTests) + + if(CPPUTEST_SPLIT_TESTS) + string(APPEND name ${number}) + add_executable(${name}) + add_mapfile(${name}) + cpputest_discover_tests(${name}) + endif() -function(add_cpputestext_test name) - target_sources(CppUTestExtTests + target_sources(${name} PRIVATE ${ARGN} ) - target_link_libraries(CppUTestExtTests + target_link_libraries(${name} PRIVATE CppUTestExtTests_main ) endfunction() From a50c123aa0bb5933942d40b86063f48453e706c2 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 11 Jan 2023 11:19:38 -0800 Subject: [PATCH 1005/1093] Guard test discovery --- tests/CppUTest/CMakeLists.txt | 4 +++- tests/CppUTestExt/CMakeLists.txt | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index d6830d825..46b4542ee 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -32,7 +32,9 @@ function(add_cpputest_test number) string(APPEND name ${number}) add_executable(${name}) add_mapfile(${name}) - cpputest_discover_tests(${name}) + if(CPPUTEST_TEST_DISCOVERY) + cpputest_discover_tests(${name}) + endif() endif() target_sources(${name} diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index e4ce6d66c..1b9298b71 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -59,7 +59,9 @@ function(add_cpputestext_test number) string(APPEND name ${number}) add_executable(${name}) add_mapfile(${name}) - cpputest_discover_tests(${name}) + if(CPPUTEST_TEST_DISCOVERY) + cpputest_discover_tests(${name}) + endif() endif() target_sources(${name} From 9e4f932be1200897bcc0102936677cb971894d02 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 11 Jan 2023 18:27:41 -0800 Subject: [PATCH 1006/1093] Run apt update --- .github/workflows/basic.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 59c419704..2027a5b3a 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -265,7 +265,9 @@ jobs: ### SETUP - name: Install packages - run: sudo apt install -y ${{ matrix.apt_packages }} + run: | + sudo apt-get update + sudo apt-get install -y ${{ matrix.apt_packages }} if: ${{ matrix.apt_packages }} - uses: carlosperate/arm-none-eabi-gcc-action@v1 @@ -404,6 +406,7 @@ jobs: uses: actions/checkout@main - name: Install tools run: | + sudo apt-get update sudo apt-get install -y dosbox git clone https://github.com/cpputest/watcom-compiler.git $WATCOM echo "$WATCOM/binl" >> $GITHUB_PATH From 374729daa0279257ceb083ea2c8d3038895c05f0 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 13 Dec 2022 17:48:29 -0800 Subject: [PATCH 1007/1093] Delete flakey test This is undefined behavior and has been failing very frequently on CI. The custom `delete` implementation calls `free()`. > The behavior is undefined if after `free()` returns, an access is made > through the pointer. https://en.cppreference.com/w/c/memory/free --- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index f3c03f79b..b8e1872c3 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -46,15 +46,6 @@ static void deleteArrayInvalidatesMemory() CHECK(memory[5] != 0xAB); } -CPPUTEST_DO_NOT_SANITIZE_ADDRESS -static void deleteInvalidatesMemory() -{ - unsigned char* memory = new unsigned char; - *memory = 0xAD; - delete memory; - CHECK(*memory != 0xAD); -} - #ifdef NEEDS_DISABLE_USE_AFTER_FREE # pragma GCC diagnostic pop #endif /* NEEDS_DISABLE_USE_AFTER_FREE */ @@ -64,11 +55,6 @@ TEST(BasicBehavior, deleteArrayInvalidatesMemory) deleteArrayInvalidatesMemory(); } -TEST(BasicBehavior, deleteInvalidatesMemory) -{ - deleteInvalidatesMemory(); -} - #if __cplusplus >= 201402L TEST(BasicBehavior, DeleteWithSizeParameterWorks) { From 15f6e80d6a842eb4ab93b21577a5a1603039b382 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 5 Jan 2023 19:02:04 -0800 Subject: [PATCH 1008/1093] remove remaining UB tests --- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 43 ------------------- 1 file changed, 43 deletions(-) diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index b8e1872c3..52e75e89a 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -14,9 +14,6 @@ # if __GNUC__ >= 11 # define NEEDS_DISABLE_FREE_NON_HEEP_WARNING # endif /* GCC >= 11 */ -# if __GNUC__ >= 12 -# define NEEDS_DISABLE_USE_AFTER_FREE -# endif /* GCC >= 12 */ #endif /* GCC */ @@ -32,29 +29,6 @@ TEST(BasicBehavior, CanDeleteNullPointers) #if CPPUTEST_USE_MEM_LEAK_DETECTION -#ifdef NEEDS_DISABLE_USE_AFTER_FREE -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wuse-after-free" -#endif /* NEEDS_DISABLE_USE_AFTER_FREE */ - -CPPUTEST_DO_NOT_SANITIZE_ADDRESS -static void deleteArrayInvalidatesMemory() -{ - unsigned char* memory = new unsigned char[10]; - PlatformSpecificMemset(memory, 0xAB, 10); - delete [] memory; - CHECK(memory[5] != 0xAB); -} - -#ifdef NEEDS_DISABLE_USE_AFTER_FREE -# pragma GCC diagnostic pop -#endif /* NEEDS_DISABLE_USE_AFTER_FREE */ - -TEST(BasicBehavior, deleteArrayInvalidatesMemory) -{ - deleteArrayInvalidatesMemory(); -} - #if __cplusplus >= 201402L TEST(BasicBehavior, DeleteWithSizeParameterWorks) { @@ -116,23 +90,6 @@ TEST(BasicBehavior, bothMallocAndFreeAreOverloaded) #endif -#if CPPUTEST_USE_MEM_LEAK_DETECTION - -CPPUTEST_DO_NOT_SANITIZE_ADDRESS -static void freeInvalidatesMemory() -{ - unsigned char* memory = (unsigned char*) cpputest_malloc(sizeof(unsigned char)); - *memory = 0xAD; - cpputest_free(memory); - CHECK(*memory != 0xAD); -} - -TEST(BasicBehavior, freeInvalidatesMemory) -{ - freeInvalidatesMemory(); -} -#endif - TEST_GROUP(MemoryLeakOverridesToBeUsedInProductionCode) { MemoryLeakDetector* memLeakDetector; From 87cb14aa9a015e5113084869d483c228c84d289a Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 11 Jan 2023 18:27:41 -0800 Subject: [PATCH 1009/1093] Run apt update --- .github/workflows/basic.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 59c419704..2027a5b3a 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -265,7 +265,9 @@ jobs: ### SETUP - name: Install packages - run: sudo apt install -y ${{ matrix.apt_packages }} + run: | + sudo apt-get update + sudo apt-get install -y ${{ matrix.apt_packages }} if: ${{ matrix.apt_packages }} - uses: carlosperate/arm-none-eabi-gcc-action@v1 @@ -404,6 +406,7 @@ jobs: uses: actions/checkout@main - name: Install tools run: | + sudo apt-get update sudo apt-get install -y dosbox git clone https://github.com/cpputest/watcom-compiler.git $WATCOM echo "$WATCOM/binl" >> $GITHUB_PATH From 52fa230e498ced345be929b68956fe52bc59043b Mon Sep 17 00:00:00 2001 From: MonicaLiu Date: Wed, 18 Jan 2023 10:34:24 +0800 Subject: [PATCH 1010/1093] Edit vcpkg installation instructions --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 55d963397..d536d41fd 100644 --- a/README.md +++ b/README.md @@ -64,13 +64,9 @@ TEST(FirstTestGroup, FirstTest) You can build and install cpputest using [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager: -* git clone https://github.com/Microsoft/vcpkg.git -* cd vcpkg -* ./bootstrap-vcpkg.sh # ./bootstrap-vcpkg.bat for Windows -* ./vcpkg integrate install -* ./vcpkg install cpputest - -The cpputest port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. +```console +$ vcpkg install cpputest (More information: https://github.com/microsoft/vcpkg) +``` ## Command line switches From 75a2318010671fb6dec06bee89a550c6ca049e5b Mon Sep 17 00:00:00 2001 From: MonicaLiu Date: Wed, 18 Jan 2023 10:35:47 +0800 Subject: [PATCH 1011/1093] format --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index d536d41fd..245d6af63 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,6 @@ You can build and install cpputest using [vcpkg](https://github.com/Microsoft/vc $ vcpkg install cpputest (More information: https://github.com/microsoft/vcpkg) ``` - ## Command line switches * -h help, shows the latest help, including the parameters we've implemented after updating this README page. From 2d5837a1d63a0c88bafc16e370fb24dd56b2f13b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 18 Jan 2023 18:15:12 -0800 Subject: [PATCH 1012/1093] Pin working qemu image --- CMakePresets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakePresets.json b/CMakePresets.json index 2d037a052..c42b0f0bc 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -69,7 +69,7 @@ "inherits": ["defaults"], "toolchainFile": "${sourceDir}/cmake/Toolchains/arm-none-eabi-gcc.toolchain.cmake", "cacheVariables": { - "CMAKE_CROSSCOMPILING_EMULATOR": "docker;run;--rm;-v=${sourceDir}:${sourceDir};multiarch/qemu-user-static:x86_64-arm;qemu-arm-static;-cpu;cortex-m4" + "CMAKE_CROSSCOMPILING_EMULATOR": "docker;run;--rm;-v=${sourceDir}:${sourceDir};multiarch/qemu-user-static:arm-7.1.0-2;qemu-arm-static;-cpu;cortex-m4" } }, { From 7d97dd632606a0a292273f90b2b7d2a63f153e33 Mon Sep 17 00:00:00 2001 From: Glenn Van Loon Date: Thu, 6 Apr 2023 09:10:58 +0200 Subject: [PATCH 1013/1093] Include cstring in StandardCLibrary.h --- include/CppUTest/StandardCLibrary.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/CppUTest/StandardCLibrary.h b/include/CppUTest/StandardCLibrary.h index c0ef7aa99..ad901727d 100644 --- a/include/CppUTest/StandardCLibrary.h +++ b/include/CppUTest/StandardCLibrary.h @@ -14,6 +14,7 @@ #ifdef __cplusplus #if CPPUTEST_USE_STD_CPP_LIB #include + #include #include #endif #endif From 1e8808f96c8fc3eae7f540d8f5c559ddb56d5ae6 Mon Sep 17 00:00:00 2001 From: viordash <36102143+viordash@users.noreply.github.com> Date: Mon, 5 Jun 2023 12:32:11 +0300 Subject: [PATCH 1014/1093] README.md: fix URLs --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 818b9b779..1055d6133 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ You'll need to do the following to get started: Building from source (Unix-based, Cygwin, MacOS): ```bash -git clone git://github.com/cpputest/cpputest.git +git clone https://github.com/cpputest/cpputest.git cd cpputest_build autoreconf .. -i ../configure @@ -31,7 +31,7 @@ You can use `make install` if you want to install CppUTest system-wide. You can also use CMake, which also works for Windows Visual Studio. ```bash -git clone git://github.com/cpputest/cpputest.git +git clone https://github.com/cpputest/cpputest.git cmake -B cpputest_build cmake --build cpputest_build ``` From c20648edf38b68f061f866b302e51fbe8ba43e43 Mon Sep 17 00:00:00 2001 From: Vitalii Orazov Date: Sun, 13 Aug 2023 23:52:42 +0300 Subject: [PATCH 1015/1093] support very verbose in CompositeTestOutput --- include/CppUTest/TestOutput.h | 2 ++ src/CppUTest/CommandLineTestRunner.cpp | 2 +- src/CppUTest/TestOutput.cpp | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/TestOutput.h b/include/CppUTest/TestOutput.h index e0cb1f5d9..e35dd01d5 100644 --- a/include/CppUTest/TestOutput.h +++ b/include/CppUTest/TestOutput.h @@ -198,6 +198,8 @@ class CompositeTestOutput : public TestOutput virtual void printFailure(const TestFailure& failure) _override; virtual void setProgressIndicator(const char*) _override; + virtual void printVeryVerbose(const char*) _override; + virtual void flush() _override; protected: diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index da2d217dc..f4438e3c5 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -191,7 +191,7 @@ bool CommandLineTestRunner::parseArguments(TestPlugin* plugin) if (arguments_->isJUnitOutput()) { output_= createJUnitOutput(arguments_->getPackageName()); - if (arguments_->isVerbose()) + if (arguments_->isVerbose() || arguments_->isVeryVerbose()) output_ = createCompositeOutput(output_, createConsoleOutput()); } else if (arguments_->isTeamCityOutput()) { output_ = createTeamCityOutput(); diff --git a/src/CppUTest/TestOutput.cpp b/src/CppUTest/TestOutput.cpp index 131997e5a..cb4ced54e 100644 --- a/src/CppUTest/TestOutput.cpp +++ b/src/CppUTest/TestOutput.cpp @@ -400,6 +400,12 @@ void CompositeTestOutput::setProgressIndicator(const char* indicator) if (outputTwo_) outputTwo_->setProgressIndicator(indicator); } +void CompositeTestOutput::printVeryVerbose(const char* str) +{ + if (outputOne_) outputOne_->printVeryVerbose(str); + if (outputTwo_) outputTwo_->printVeryVerbose(str); +} + void CompositeTestOutput::flush() { if (outputOne_) outputOne_->flush(); From 5e2b1bdcc46924cfd5354aafa6753914128f440a Mon Sep 17 00:00:00 2001 From: Vitalii Orazov Date: Mon, 14 Aug 2023 22:55:47 +0300 Subject: [PATCH 1016/1093] add CompositeTestOutput.printVeryVerbose test --- tests/CppUTest/TestOutputTest.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/CppUTest/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp index d1ebb93c7..dd4b38dc0 100644 --- a/tests/CppUTest/TestOutputTest.cpp +++ b/tests/CppUTest/TestOutputTest.cpp @@ -470,3 +470,11 @@ TEST(CompositeTestOutput, deletePreviousInstanceWhenSettingNew) // CHECK NO MEMORY LEAKS } + +TEST(CompositeTestOutput, printVeryVerbose) +{ + compositeOutput.verbose(TestOutput::level_veryVerbose); + compositeOutput.printVeryVerbose("very-verbose"); + STRCMP_EQUAL("very-verbose", output1->getOutput().asCharString()); + STRCMP_EQUAL("very-verbose", output2->getOutput().asCharString()); +} From f8332b3acba73bc485b768401d34ede00362cf3c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 27 Oct 2023 19:19:05 -0700 Subject: [PATCH 1017/1093] Python 2 is dead --- .github/workflows/basic.yml | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 2027a5b3a..d01a1a3ad 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -63,27 +63,6 @@ jobs: cc: clang cxx: clang++ make_args: tdd - - name: GTest 1.5 - os: ubuntu-20.04 - make_args: check_gtest15 - - name: GTest 1.6 - os: ubuntu-20.04 - make_args: check_gtest16 - - name: GTest 1.7 - os: ubuntu-20.04 - make_args: check_gtest17 - - name: GTest 1.8 - os: ubuntu-20.04 - make_args: check_gtest18 - - name: GTest 1.10 - os: ubuntu-20.04 - make_args: check_gtest110 - - name: GTest 1.11 - os: ubuntu-20.04 - make_args: check_gtest111 - - name: GTest 1.12 - os: ubuntu-20.04 - make_args: check_gtest112 - name: Disable long long os: ubuntu-latest configure_args: --disable-longlong @@ -97,11 +76,6 @@ jobs: runs-on: ${{ matrix.os }} name: Autotools ${{ matrix.name }} steps: - - name: Install Python 2 - uses: actions/setup-python@v4 - with: - python-version: "2.7" - if: ${{ startswith(matrix.name, 'GTest') }} - name: Checkout uses: actions/checkout@main - run: brew install automake @@ -220,12 +194,6 @@ jobs: os: ubuntu-latest preset: coverage apt_packages: lcov - - name: Google Test - os: ubuntu-20.04 - cmake_args: -DCMAKE_CXX_STANDARD=98 - preset: gtest - ctest_args: -C Debug - apt_packages: python2 ninja-build - name: Address Sanitizer os: ubuntu-latest preset: asan From d8d9e191eee47b39ad875c930b44d26801d6ee32 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 27 Oct 2023 19:31:42 -0700 Subject: [PATCH 1018/1093] Suppress noisy unsafe buffer warnings --- cmake/warnings.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index ea397d8dc..b016c4d47 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -21,6 +21,7 @@ if( -Wno-reserved-id-macro -Wno-keyword-macro -Wno-long-long + -Wno-unsafe-buffer-usage ) set(WARNING_C_FLAGS From 96f31510a4fd03c215f5987990a802ac8185b13e Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 12 Nov 2022 14:36:24 -0800 Subject: [PATCH 1019/1093] Remove clangcl hack --- CMakeLists.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b92b423f2..8a98c3de8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,14 +29,10 @@ include(CTest) include(CMakeDependentOption) option(CPPUTEST_STD_C_LIB_DISABLED "Disable the standard C library") -if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND (CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")) - set(is_clang_cl TRUE) -endif() - cmake_dependent_option(CPPUTEST_STD_CPP_LIB_DISABLED "Use the standard C++ library" OFF "NOT CPPUTEST_STD_C_LIB_DISABLED" ON) cmake_dependent_option(CPPUTEST_MEM_LEAK_DETECTION_DISABLED "Enable memory leak detection" - OFF "NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED;NOT is_clang_cl" ON) + OFF "NOT BORLAND;NOT CPPUTEST_STD_C_LIB_DISABLED" ON) option(CPPUTEST_EXTENSIONS "Use the CppUTest extension library" ON) include(CheckTypeSize) check_type_size("long long" SIZEOF_LONGLONG) From c210b2029fb5d85ced878d4235f8fb35a637292b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 5 Dec 2022 23:49:40 -0800 Subject: [PATCH 1020/1093] Remove test of undefined behavior --- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index 52e75e89a..0fda2f794 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -39,37 +39,6 @@ TEST(BasicBehavior, DeleteWithSizeParameterWorks) } #endif -#ifdef NEEDS_DISABLE_FREE_NON_HEEP_WARNING -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wfree-nonheap-object" -#endif /* NEEDS_DISABLE_FREE_NON_HEEP_WARNING */ - -static void deleteUnallocatedMemory() -{ - delete (char*) 0x1234678; - FAIL("Should never come here"); // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -#ifdef NEEDS_DISABLE_FREE_NON_HEEP_WARNING -# pragma GCC diagnostic pop -#endif /* NEEDS_DISABLE_FREE_NON_HEEP_WARNING */ - - -TEST(BasicBehavior, deleteWillNotThrowAnExceptionWhenDeletingUnallocatedMemoryButCanStillCauseTestFailures) -{ - /* - * Test failure might cause an exception. But according to C++ standard, you aren't allowed - * to throw exceptions in the delete function. If you do that, it will call std::terminate. - * Therefore, the delete will need to fail without exceptions. - */ - MemoryLeakFailure* defaultReporter = MemoryLeakWarningPlugin::getGlobalFailureReporter(); - TestTestingFixture fixture; - fixture.setTestFunction(deleteUnallocatedMemory); - fixture.runAllTests(); - LONGS_EQUAL(1, fixture.getFailureCount()); - POINTERS_EQUAL(defaultReporter, MemoryLeakWarningPlugin::getGlobalFailureReporter()); -} - #endif #ifdef CPPUTEST_USE_MALLOC_MACROS From 4ba3bcd6b3f6e3585c09e74c1ff0c677dea944c6 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 8 Dec 2022 22:47:28 -0800 Subject: [PATCH 1021/1093] Permit ASAN with leak detections --- CMakePresets.json | 3 +-- include/CppUTest/CppUTestConfig.h | 15 ++++----------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index c42b0f0bc..2e90f1608 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -131,8 +131,7 @@ "name": "asan", "inherits": ["Clang"], "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug", - "CPPUTEST_MEM_LEAK_DETECTION_DISABLED": true + "CMAKE_BUILD_TYPE": "Debug" }, "environment": { "CFLAGS": "-fsanitize=address -fno-omit-frame-pointer", diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 4cc8d3fc7..8346624cf 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -148,18 +148,11 @@ #endif #if CPPUTEST_SANITIZE_ADDRESS -#define CPPUTEST_SANITIZE_ADDRESS 1 -#define CPPUTEST_DO_NOT_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) - #if defined(__linux__) && defined(__clang__) - #if CPPUTEST_USE_MEM_LEAK_DETECTION - #warning Compiling with Address Sanitizer with clang on linux will cause duplicate symbols for operator new. Turning off memory leak detection. Compile with -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED to get rid of this warning. - #undef CPPUTEST_USE_MEM_LEAK_DETECTION - #define CPPUTEST_USE_MEM_LEAK_DETECTION 0 - #endif - #endif + #define CPPUTEST_SANITIZE_ADDRESS 1 + #define CPPUTEST_DO_NOT_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) #else -#define CPPUTEST_SANITIZER_ADDRESS 0 -#define CPPUTEST_DO_NOT_SANITIZE_ADDRESS + #define CPPUTEST_SANITIZER_ADDRESS 0 + #define CPPUTEST_DO_NOT_SANITIZE_ADDRESS #endif /* From 9b858f0e4f86635a2407f612a99137de8c966fe6 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 8 Dec 2022 22:53:40 -0800 Subject: [PATCH 1022/1093] Cleanup macros --- include/CppUTest/CppUTestConfig.h | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 8346624cf..46f0d9451 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -134,24 +134,20 @@ * To check whether it is on or off, we create a CppUTest define here. */ #if defined(__has_feature) -#if __has_feature(address_sanitizer) -#define CPPUTEST_SANITIZE_ADDRESS 1 -#endif -#endif - -#ifdef __SANITIZE_ADDRESS__ -#define CPPUTEST_SANITIZE_ADDRESS 1 + #if __has_feature(address_sanitizer) + #define CPPUTEST_SANITIZE_ADDRESS 1 + #endif +#elif defined(__SANITIZE_ADDRESS__) + #define CPPUTEST_SANITIZE_ADDRESS 1 #endif #ifndef CPPUTEST_SANITIZE_ADDRESS -#define CPPUTEST_SANITIZE_ADDRESS 0 + #define CPPUTEST_SANITIZE_ADDRESS 0 #endif #if CPPUTEST_SANITIZE_ADDRESS - #define CPPUTEST_SANITIZE_ADDRESS 1 #define CPPUTEST_DO_NOT_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) #else - #define CPPUTEST_SANITIZER_ADDRESS 0 #define CPPUTEST_DO_NOT_SANITIZE_ADDRESS #endif From addc0f6d401cb59cec8f2ffd15e47d1c3d7445c7 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 9 Feb 2024 19:10:50 -0800 Subject: [PATCH 1023/1093] Restore asan/clang/linux/leak warning --- include/CppUTest/CppUTestConfig.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 46f0d9451..bbe657f42 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -146,6 +146,9 @@ #endif #if CPPUTEST_SANITIZE_ADDRESS + #if defined(__linux__) && defined(__clang__) && CPPUTEST_USE_STD_CPP_LIB + #warning Compiling with Address Sanitizer with clang on linux may cause duplicate symbols for operator new. Turning off memory leak detection. Compile with -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED to get rid of this warning. + #endif #define CPPUTEST_DO_NOT_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) #else #define CPPUTEST_DO_NOT_SANITIZE_ADDRESS From e18dca1c6137e6706ea13fe3cf5f9cc04f61b8f4 Mon Sep 17 00:00:00 2001 From: Mode77 Date: Sat, 10 Feb 2024 11:01:57 -0500 Subject: [PATCH 1024/1093] Updated MSVC project settings * "AllTests" and "CppUTest" projects now output intermediary files and output libraries in their respective configuration/platform directories which help the msvc build system determine which files need recompiling. * Update build toolset --- CppUTest.vcxproj | 23 ++++++++++++++--------- tests/AllTests.vcxproj | 23 ++++++++++++++--------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index e39220c90..25ded5ca3 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -20,27 +20,32 @@ {F468F539-27BD-468E-BE64-DDE641400B51} + 10.0 StaticLibrary false MultiByte + v142 StaticLibrary false MultiByte + v142 StaticLibrary false MultiByte + v142 StaticLibrary false MultiByte + v142 @@ -60,14 +65,14 @@ <_ProjectFileVersion>10.0.30319.1 - lib\ - lib\ - cpputest_build\Debug\$(ProjectName)\ - cpputest_build\Debug\$(ProjectName)\ - lib\ - lib\ - cpputest_build\Release\$(ProjectName)\ - cpputest_build\Release\$(ProjectName)\ + lib\x86\ + lib\x64\ + cpputest_build\Debug\x86\$(ProjectName)\ + cpputest_build\Debug\x64\$(ProjectName)\ + lib\x86\ + lib\x64\ + cpputest_build\Release\x86\$(ProjectName)\ + cpputest_build\Release\x64\$(ProjectName)\ $(ProjectName)d $(ProjectName)d @@ -295,4 +300,4 @@ - + \ No newline at end of file diff --git a/tests/AllTests.vcxproj b/tests/AllTests.vcxproj index 4dc79fb44..8a99b237b 100644 --- a/tests/AllTests.vcxproj +++ b/tests/AllTests.vcxproj @@ -20,27 +20,32 @@ {913088F6-37C0-4195-80E9-548C7C5303CB} + 10.0 Application false MultiByte + v142 Application false MultiByte + v142 Application false MultiByte + v142 Application false MultiByte + v142 @@ -64,16 +69,16 @@ <_ProjectFileVersion>10.0.30319.1 - ..\cpputest_build\ - ..\cpputest_build\ - ..\cpputest_build\Release\$(ProjectName)\ - ..\cpputest_build\Release\$(ProjectName)\ + ..\cpputest_build\x86\ + ..\cpputest_build\x64\ + ..\cpputest_build\Release\x86\$(ProjectName)\ + ..\cpputest_build\Release\x64\$(ProjectName)\ false false - ..\cpputest_build\ - ..\cpputest_build\ - ..\cpputest_build\Debug\$(ProjectName)\ - ..\cpputest_build\Debug\$(ProjectName)\ + ..\cpputest_build\x86\ + ..\cpputest_build\x64\ + ..\cpputest_build\Debug\x86\$(ProjectName)\ + ..\cpputest_build\Debug\x64\$(ProjectName)\ true true @@ -319,4 +324,4 @@ - + \ No newline at end of file From cf21eee15d0665bdcfb15cf102cc68401738306a Mon Sep 17 00:00:00 2001 From: Mode77 Date: Sat, 10 Feb 2024 18:24:04 -0500 Subject: [PATCH 1025/1093] Undo giving a specific toolset This partially reverts commit e18dca1c6137e6706ea13fe3cf5f9cc04f61b8f4. --- CppUTest.vcxproj | 5 ----- tests/AllTests.vcxproj | 5 ----- 2 files changed, 10 deletions(-) diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index 25ded5ca3..a81cc1fc4 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -20,32 +20,27 @@ {F468F539-27BD-468E-BE64-DDE641400B51} - 10.0 StaticLibrary false MultiByte - v142 StaticLibrary false MultiByte - v142 StaticLibrary false MultiByte - v142 StaticLibrary false MultiByte - v142 diff --git a/tests/AllTests.vcxproj b/tests/AllTests.vcxproj index 8a99b237b..4ca493cb3 100644 --- a/tests/AllTests.vcxproj +++ b/tests/AllTests.vcxproj @@ -20,32 +20,27 @@ {913088F6-37C0-4195-80E9-548C7C5303CB} - 10.0 Application false MultiByte - v142 Application false MultiByte - v142 Application false MultiByte - v142 Application false MultiByte - v142 From 4839a5a184995613b4a4d896a2b610fb842e1cf3 Mon Sep 17 00:00:00 2001 From: Dmitriy Alexandrov Date: Sun, 3 Mar 2024 16:23:21 +0100 Subject: [PATCH 1026/1093] Add C version of MEMCMP_EQUAL --- include/CppUTest/TestHarness_c.h | 7 +++++ src/CppUTest/TestHarness_c.cpp | 5 ++++ tests/CppUTest/TestHarness_cTest.cpp | 39 ++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index e85013d8a..1d1cb9851 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -114,6 +114,12 @@ #define CHECK_EQUAL_C_POINTER_TEXT(expected,actual,text) \ CHECK_EQUAL_C_POINTER_LOCATION(expected,actual,text,__FILE__,__LINE__) +#define CHECK_EQUAL_C_MEMCMP(expected, actual, size) \ + CHECK_EQUAL_C_MEMCMP_LOCATION(expected, actual, size, NULLPTR, __FILE__, __LINE__) + +#define CHECK_EQUAL_C_MEMCMP_TEXT(expected, actual, size, text) \ + CHECK_EQUAL_C_MEMCMP_LOCATION(expected, actual, size, text, __FILE__, __LINE__) + #define CHECK_EQUAL_C_BITS(expected, actual, mask) \ CHECK_EQUAL_C_BITS_LOCATION(expected, actual, mask, sizeof(actual), NULL, __FILE__, __LINE__) @@ -205,6 +211,7 @@ extern void CHECK_EQUAL_C_UBYTE_LOCATION(unsigned char expected, unsigned char a extern void CHECK_EQUAL_C_SBYTE_LOCATION(signed char expected, signed char actual, const char* text, const char* fileName, size_t lineNumber); extern void CHECK_EQUAL_C_STRING_LOCATION(const char* expected, const char* actual, const char* text, const char* fileName, size_t lineNumber); extern void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, const void* actual, const char* text, const char* fileName, size_t lineNumber); +extern void CHECK_EQUAL_C_MEMCMP_LOCATION(const void* expected, const void* actual, size_t size, const char* text, const char* fileName, size_t lineNumber); extern void CHECK_EQUAL_C_BITS_LOCATION(unsigned int expected, unsigned int actual, unsigned int mask, size_t size, const char* text, const char* fileName, size_t lineNumber); extern void FAIL_TEXT_C_LOCATION(const char* text, const char* fileName, size_t lineNumber); extern void FAIL_C_LOCATION(const char* fileName, size_t lineNumber); diff --git a/src/CppUTest/TestHarness_c.cpp b/src/CppUTest/TestHarness_c.cpp index 0a93efa4e..149c8fbb6 100644 --- a/src/CppUTest/TestHarness_c.cpp +++ b/src/CppUTest/TestHarness_c.cpp @@ -99,6 +99,11 @@ void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, const void* actual, co UtestShell::getCurrent()->assertPointersEqual(expected, actual, text, fileName, lineNumber, UtestShell::getCurrentTestTerminatorWithoutExceptions()); } +extern void CHECK_EQUAL_C_MEMCMP_LOCATION(const void* expected, const void* actual, size_t size, const char* text, const char* fileName, size_t lineNumber) +{ + UtestShell::getCurrent()->assertBinaryEqual(expected, actual, size, text, fileName, lineNumber, UtestShell::getCurrentTestTerminatorWithoutExceptions()); +} + extern void CHECK_EQUAL_C_BITS_LOCATION(unsigned int expected, unsigned int actual, unsigned int mask, size_t size, const char* text, const char* fileName, size_t lineNumber) { UtestShell::getCurrent()->assertBitsEqual(expected, actual, mask, size, text, fileName, lineNumber, UtestShell::getCurrentTestTerminatorWithoutExceptions()); diff --git a/tests/CppUTest/TestHarness_cTest.cpp b/tests/CppUTest/TestHarness_cTest.cpp index 2a39a9180..fadc66f1d 100644 --- a/tests/CppUTest/TestHarness_cTest.cpp +++ b/tests/CppUTest/TestHarness_cTest.cpp @@ -581,6 +581,45 @@ TEST(TestHarness_c, checkPointerText) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); } +static void failMemcmpMethod_() +{ + HasTheDestructorBeenCalledChecker checker; + unsigned char expectedData[] = { 0x00, 0x01, 0x02, 0x03 }; + unsigned char actualData[] = { 0x00, 0x01, 0x03, 0x03 }; + + CHECK_EQUAL_C_MEMCMP(expectedData, actualData, sizeof(expectedData)); +} + +TEST(TestHarness_c, checkMemcmp) +{ + CHECK_EQUAL_C_MEMCMP("TEST", "TEST", 5); + fixture->setTestFunction(failMemcmpMethod_); + fixture->runAllTests(); + fixture->assertPrintContains("expected <00 01 02 03>\n\tbut was <00 01 03 03>"); + fixture->assertPrintContains("arness_c"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); +} + +static void failMemcmpTextMethod_() +{ + HasTheDestructorBeenCalledChecker checker; + unsigned char expectedData[] = { 0x00, 0x01, 0x02, 0x03 }; + unsigned char actualData[] = { 0x00, 0x01, 0x03, 0x03 }; + + CHECK_EQUAL_C_MEMCMP_TEXT(expectedData, actualData, sizeof(expectedData), "MemcmpTestText"); +} + +TEST(TestHarness_c, checkMemcmpText) +{ + CHECK_EQUAL_C_MEMCMP_TEXT("TEST", "TEST", 5, "Text"); + fixture->setTestFunction(failMemcmpTextMethod_); + fixture->runAllTests(); + fixture->assertPrintContains("expected <00 01 02 03>\n\tbut was <00 01 03 03>"); + fixture->assertPrintContains("arness_c"); + fixture->assertPrintContains("Message: MemcmpTestText"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled); +} + static void failBitsMethod_() { HasTheDestructorBeenCalledChecker checker; From 0ade506a259b85be1d2bcc69c55fd3bc53bcc815 Mon Sep 17 00:00:00 2001 From: Dmitriy Alexandrov Date: Sun, 24 Mar 2024 11:41:21 +0100 Subject: [PATCH 1027/1093] Fix undefined behavior in case of time overflow at 32-bit platforms --- include/CppUTest/PlatformSpecificFunctions_c.h | 2 +- src/Platforms/Borland/UtestPlatform.cpp | 9 ++++----- src/Platforms/C2000/UtestPlatform.cpp | 6 +++--- src/Platforms/Dos/UtestPlatform.cpp | 6 +++--- src/Platforms/Gcc/UtestPlatform.cpp | 9 ++++----- src/Platforms/GccNoStdC/UtestPlatform.cpp | 2 +- src/Platforms/Iar/UtestPlatform.cpp | 6 +++--- src/Platforms/Keil/UtestPlatform.cpp | 8 ++++---- src/Platforms/Symbian/UtestPlatform.cpp | 6 +++--- src/Platforms/VisualCpp/UtestPlatform.cpp | 16 ++++++++-------- src/Platforms/armcc/UtestPlatform.cpp | 6 +++--- tests/CppUTest/JUnitOutputTest.cpp | 8 ++++---- tests/CppUTest/TeamCityOutputTest.cpp | 4 ++-- tests/CppUTest/TestOutputTest.cpp | 4 ++-- tests/CppUTest/TestResultTest.cpp | 2 +- tests/DummyUTestPlatform/DummyUTestPlatform.cpp | 4 ++-- 16 files changed, 48 insertions(+), 50 deletions(-) diff --git a/include/CppUTest/PlatformSpecificFunctions_c.h b/include/CppUTest/PlatformSpecificFunctions_c.h index d8ed40ac8..36700818b 100644 --- a/include/CppUTest/PlatformSpecificFunctions_c.h +++ b/include/CppUTest/PlatformSpecificFunctions_c.h @@ -47,7 +47,7 @@ extern void (*PlatformSpecificLongJmp)(void); extern void (*PlatformSpecificRestoreJumpBuffer)(void); /* Time operations */ -extern long (*GetPlatformSpecificTimeInMillis)(void); +extern unsigned long (*GetPlatformSpecificTimeInMillis)(void); extern const char* (*GetPlatformSpecificTimeString)(void); /* String operations */ diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 2bbca3ae1..1e6ab3621 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -193,13 +193,12 @@ void (*PlatformSpecificRestoreJumpBuffer)() = PlatformSpecificRestoreJumpBufferI ///////////// Time in millis -static long TimeInMillisImplementation() +static unsigned long TimeInMillisImplementation() { #ifdef CPPUTEST_HAVE_GETTIMEOFDAY struct timeval tv; - struct timezone tz; - gettimeofday(&tv, &tz); - return (tv.tv_sec * 1000) + (long)((double)tv.tv_usec * 0.001); + gettimeofday(&tv, NULL); + return ((unsigned long)tv.tv_sec * 1000) + ((unsigned long)tv.tv_usec / 1000)); #else return 0; #endif @@ -214,7 +213,7 @@ static const char* TimeStringImplementation() return dateTime; } -long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; +unsigned long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; const char* (*GetPlatformSpecificTimeString)() = TimeStringImplementation; static int BorlandVSNprintf(char *str, size_t size, const char* format, va_list args) diff --git a/src/Platforms/C2000/UtestPlatform.cpp b/src/Platforms/C2000/UtestPlatform.cpp index c0cde24fe..558245c5d 100644 --- a/src/Platforms/C2000/UtestPlatform.cpp +++ b/src/Platforms/C2000/UtestPlatform.cpp @@ -100,7 +100,7 @@ int (*PlatformSpecificSetJmp)(void (*function) (void*), void*) = C2000SetJmp; void (*PlatformSpecificLongJmp)(void) = C2000LongJmp; void (*PlatformSpecificRestoreJumpBuffer)(void) = C2000RestoreJumpBuffer; -static long C2000TimeInMillis() +static unsigned long C2000TimeInMillis() { /* The TI c2000 platform does not have Posix support and thus lacks struct timespec. * Also, clock() always returns 0 in the simulator. Hence we work with struct tm.tm_hour @@ -112,7 +112,7 @@ static long C2000TimeInMillis() */ time_t t = time((time_t*)0); struct tm * ptm = gmtime(&t); - long result = (long) + unsigned long result = (unsigned long) ((ptm->tm_sec + ptm->tm_min * (time_t)60 + ptm->tm_hour * (time_t)3600) * (time_t)1000); return result; } @@ -123,7 +123,7 @@ static const char* TimeStringImplementation() return ctime(&tm); } -long (*GetPlatformSpecificTimeInMillis)() = C2000TimeInMillis; +unsigned long (*GetPlatformSpecificTimeInMillis)() = C2000TimeInMillis; const char* (*GetPlatformSpecificTimeString)() = TimeStringImplementation; extern int vsnprintf(char*, size_t, const char*, va_list); // not std::vsnprintf() diff --git a/src/Platforms/Dos/UtestPlatform.cpp b/src/Platforms/Dos/UtestPlatform.cpp index b05d7ea55..c17cd1a4a 100644 --- a/src/Platforms/Dos/UtestPlatform.cpp +++ b/src/Platforms/Dos/UtestPlatform.cpp @@ -104,9 +104,9 @@ int (*PlatformSpecificSetJmp)(void (*function) (void*), void*) = DosSetJmp; void (*PlatformSpecificLongJmp)(void) = DosLongJmp; void (*PlatformSpecificRestoreJumpBuffer)(void) = DosRestoreJumpBuffer; -static long DosTimeInMillis() +static unsigned long DosTimeInMillis() { - return clock() * 1000 / CLOCKS_PER_SEC; + return (unsigned long)(clock() * 1000 / CLOCKS_PER_SEC); } static const char* DosTimeString() @@ -119,7 +119,7 @@ static int DosVSNprintf(char* str, size_t size, const char* format, va_list args return vsnprintf(str, size, format, args); } -long (*GetPlatformSpecificTimeInMillis)() = DosTimeInMillis; +unsigned long (*GetPlatformSpecificTimeInMillis)() = DosTimeInMillis; const char* (*GetPlatformSpecificTimeString)() = DosTimeString; int (*PlatformSpecificVSNprintf)(char *, size_t, const char*, va_list) = DosVSNprintf; diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 4cef7e800..257951895 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -198,13 +198,12 @@ void (*PlatformSpecificRestoreJumpBuffer)() = PlatformSpecificRestoreJumpBufferI ///////////// Time in millis -static long TimeInMillisImplementation() +static unsigned long TimeInMillisImplementation() { #ifdef CPPUTEST_HAVE_GETTIMEOFDAY struct timeval tv; - struct timezone tz; - gettimeofday(&tv, &tz); - return (long)((tv.tv_sec * 1000) + (time_t)((double)tv.tv_usec * 0.001)); + gettimeofday(&tv, NULL); + return (((unsigned long)tv.tv_sec * 1000) + ((unsigned long)tv.tv_usec / 1000)); #else return 0; #endif @@ -225,7 +224,7 @@ static const char* TimeStringImplementation() return dateTime; } -long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; +unsigned long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; const char* (*GetPlatformSpecificTimeString)() = TimeStringImplementation; /* Wish we could add an attribute to the format for discovering mis-use... but the __attribute__(format) seems to not work on va_list */ diff --git a/src/Platforms/GccNoStdC/UtestPlatform.cpp b/src/Platforms/GccNoStdC/UtestPlatform.cpp index 0d552aacb..3b3c996b3 100644 --- a/src/Platforms/GccNoStdC/UtestPlatform.cpp +++ b/src/Platforms/GccNoStdC/UtestPlatform.cpp @@ -48,7 +48,7 @@ void (*PlatformSpecificLongJmp)() = NULLPTR; int (*PlatformSpecificSetJmp)(void (*)(void*), void*) = NULLPTR; void (*PlatformSpecificRestoreJumpBuffer)() = NULLPTR; -long (*GetPlatformSpecificTimeInMillis)() = NULLPTR; +unsigned long (*GetPlatformSpecificTimeInMillis)() = NULLPTR; const char* (*GetPlatformSpecificTimeString)() = NULLPTR; /* IO operations */ diff --git a/src/Platforms/Iar/UtestPlatform.cpp b/src/Platforms/Iar/UtestPlatform.cpp index dac310717..771ca5804 100644 --- a/src/Platforms/Iar/UtestPlatform.cpp +++ b/src/Platforms/Iar/UtestPlatform.cpp @@ -101,13 +101,13 @@ void (*PlatformSpecificRestoreJumpBuffer)() = PlatformSpecificRestoreJumpBufferI ///////////// Time in millis -static long TimeInMillisImplementation() +static unsigned long TimeInMillisImplementation() { clock_t t = clock(); t = t * 10; - return t; + return (unsigned long)t; } ///////////// Time in String @@ -121,7 +121,7 @@ static const char* TimeStringImplementation() return (pTimeStr); } -long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; +unsigned long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; const char* (*GetPlatformSpecificTimeString)() = TimeStringImplementation; int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_list args) = vsnprintf; diff --git a/src/Platforms/Keil/UtestPlatform.cpp b/src/Platforms/Keil/UtestPlatform.cpp index 406982cfd..9d2582eaa 100644 --- a/src/Platforms/Keil/UtestPlatform.cpp +++ b/src/Platforms/Keil/UtestPlatform.cpp @@ -108,16 +108,16 @@ extern "C" * In Keil MDK-ARM, clock() default implementation used semihosting. * Resolutions is user adjustable (1 ms for now) */ - static long TimeInMillisImplementation() + static unsigned long TimeInMillisImplementation() { clock_t t = clock(); - t = t * 10; + t = t * 10; - return t; + return (unsigned long)t; } - long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; + unsigned long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; static const char* TimeStringImplementation() { diff --git a/src/Platforms/Symbian/UtestPlatform.cpp b/src/Platforms/Symbian/UtestPlatform.cpp index 9eb97f160..2829a6f7d 100644 --- a/src/Platforms/Symbian/UtestPlatform.cpp +++ b/src/Platforms/Symbian/UtestPlatform.cpp @@ -67,14 +67,14 @@ void PlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin* pl shell->runOneTest(plugin, *result); } -static long TimeInMillisImplementation() { +static unsigned long TimeInMillisImplementation() { struct timeval tv; struct timezone tz; ::gettimeofday(&tv, &tz); - return (tv.tv_sec * 1000) + (long)(tv.tv_usec * 0.001); + return ((unsigned long)tv.tv_sec * 1000) + ((unsigned long)tv.tv_usec / 1000); } -long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; +unsigned long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; TestOutput::WorkingEnvironment PlatformSpecificGetWorkingEnvironment() { diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index ccaed304f..775ccca7a 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -75,7 +75,7 @@ TestOutput::WorkingEnvironment PlatformSpecificGetWorkingEnvironment() ///////////// Time in millis -static long VisualCppTimeInMillis() +static unsigned long VisualCppTimeInMillis() { static LARGE_INTEGER s_frequency; static const BOOL s_use_qpc = QueryPerformanceFrequency(&s_frequency); @@ -83,23 +83,23 @@ static long VisualCppTimeInMillis() { LARGE_INTEGER now; QueryPerformanceCounter(&now); - return (long)((now.QuadPart * 1000) / s_frequency.QuadPart); - } - else + return (unsigned long)((now.QuadPart * 1000) / s_frequency.QuadPart); + } + else { #ifdef TIMERR_NOERROR - return (long)timeGetTime(); + return (unsigned long)timeGetTime(); #else #if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_VISTA) || (_WIN32_WINNT < _WIN32_WINNT_VISTA) - return (long)GetTickCount(); + return (unsigned long)GetTickCount(); #else - return (long)GetTickCount64(); + return (unsigned long)GetTickCount64(); #endif #endif } } -long (*GetPlatformSpecificTimeInMillis)() = VisualCppTimeInMillis; +unsigned long (*GetPlatformSpecificTimeInMillis)() = VisualCppTimeInMillis; ///////////// Time in String diff --git a/src/Platforms/armcc/UtestPlatform.cpp b/src/Platforms/armcc/UtestPlatform.cpp index 17f41597e..8c686c25a 100644 --- a/src/Platforms/armcc/UtestPlatform.cpp +++ b/src/Platforms/armcc/UtestPlatform.cpp @@ -107,10 +107,10 @@ void (*PlatformSpecificRestoreJumpBuffer)() = PlatformSpecificRestoreJumpBufferI * In Keil MDK-ARM, clock() default implementation used semihosting. * Resolutions is user adjustable (1 ms for now) */ -static long TimeInMillisImplementation() +static unsigned long TimeInMillisImplementation() { clock_t t = clock(); - return t; + return (unsigned long)t; } ///////////// Time in String @@ -121,7 +121,7 @@ static const char* DummyTimeStringImplementation() return ctime(&tm); } -long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; +unsigned long (*GetPlatformSpecificTimeInMillis)() = TimeInMillisImplementation; const char* (*GetPlatformSpecificTimeString)() = DummyTimeStringImplementation; int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_list args) = vsnprintf; diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index fd2f9fab3..9f8ad2e26 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -135,10 +135,10 @@ class FileSystemForJUnitTestOutputTests }; extern "C" { - static long millisTime = 0; + static unsigned long millisTime = 0; static const char* theTime = ""; - static long MockGetPlatformSpecificTimeInMillis() + static unsigned long MockGetPlatformSpecificTimeInMillis() { return millisTime; } @@ -156,7 +156,7 @@ class JUnitTestOutputTestRunner const char* currentGroupName_; UtestShell* currentTest_; bool firstTestInGroup_; - int timeTheTestTakes_; + unsigned int timeTheTestTakes_; unsigned int numberOfChecksInTest_; TestFailure* testFailure_; @@ -279,7 +279,7 @@ class JUnitTestOutputTestRunner return *this; } - JUnitTestOutputTestRunner& thatTakes(int timeElapsed) + JUnitTestOutputTestRunner& thatTakes(unsigned int timeElapsed) { timeTheTestTakes_ = timeElapsed; return *this; diff --git a/tests/CppUTest/TeamCityOutputTest.cpp b/tests/CppUTest/TeamCityOutputTest.cpp index f1aa80c83..04ef60294 100644 --- a/tests/CppUTest/TeamCityOutputTest.cpp +++ b/tests/CppUTest/TeamCityOutputTest.cpp @@ -32,11 +32,11 @@ class TeamCityOutputToBuffer : public TeamCityTestOutput SimpleString output; }; -static long millisTime; +static unsigned long millisTime; extern "C" { - static long MockGetPlatformSpecificTimeInMillis() + static unsigned long MockGetPlatformSpecificTimeInMillis() { return millisTime; } diff --git a/tests/CppUTest/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp index dd4b38dc0..1ed4cf18b 100644 --- a/tests/CppUTest/TestOutputTest.cpp +++ b/tests/CppUTest/TestOutputTest.cpp @@ -30,11 +30,11 @@ #include "CppUTest/TestResult.h" #include "CppUTest/PlatformSpecificFunctions.h" -static long millisTime; +static unsigned long millisTime; extern "C" { - static long MockGetPlatformSpecificTimeInMillis() + static unsigned long MockGetPlatformSpecificTimeInMillis() { return millisTime; } diff --git a/tests/CppUTest/TestResultTest.cpp b/tests/CppUTest/TestResultTest.cpp index 0401240bf..18ae746db 100644 --- a/tests/CppUTest/TestResultTest.cpp +++ b/tests/CppUTest/TestResultTest.cpp @@ -31,7 +31,7 @@ extern "C" { - static long MockGetPlatformSpecificTimeInMillis() + static unsigned long MockGetPlatformSpecificTimeInMillis() { return 10; } diff --git a/tests/DummyUTestPlatform/DummyUTestPlatform.cpp b/tests/DummyUTestPlatform/DummyUTestPlatform.cpp index e5efafdd3..948c85dbe 100644 --- a/tests/DummyUTestPlatform/DummyUTestPlatform.cpp +++ b/tests/DummyUTestPlatform/DummyUTestPlatform.cpp @@ -41,11 +41,11 @@ static void fakeRestoreJumpBuffer() } void (*PlatformSpecificRestoreJumpBuffer)(void) = fakeRestoreJumpBuffer; -static long fakeTimeInMillis(void) +static unsigned long fakeTimeInMillis(void) { return 0; } -long (*GetPlatformSpecificTimeInMillis)(void) = fakeTimeInMillis; +unsigned long (*GetPlatformSpecificTimeInMillis)(void) = fakeTimeInMillis; static const char* fakeTimeString(void) { From a8bdf1506c514e21f023bffaca8dc9d467ca160b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 28 Mar 2024 10:32:08 -0700 Subject: [PATCH 1028/1093] Update MemoryOperatorOverloadTest.cpp --- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index 0fda2f794..ba61ee89e 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -10,12 +10,6 @@ #include "CppUTest/TestHarness_c.h" #include "AllocationInCFile.h" -#if defined(__GNUC__) -# if __GNUC__ >= 11 -# define NEEDS_DISABLE_FREE_NON_HEEP_WARNING -# endif /* GCC >= 11 */ -#endif /* GCC */ - TEST_GROUP(BasicBehavior) { From 2640686139f323d841257608b0dff46668191b13 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 30 Mar 2024 21:07:07 -0700 Subject: [PATCH 1029/1093] Include headers when tidying --- .clang-tidy | 2 ++ CMakePresets.json | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 9cb4caa67..ccda7787a 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -2,3 +2,5 @@ Checks: "clang-diagnostic-*,clang-analyzer-*,bugprone-*,-bugprone-easily-swappable-parameters" WarningsAsErrors: "*" FormatStyle: file +UseColor: true +HeaderFilterRegex: .* diff --git a/CMakePresets.json b/CMakePresets.json index 2e90f1608..a4a3f8327 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -33,8 +33,8 @@ "name": "clang-tidy", "inherits": ["Clang"], "cacheVariables": { - "CMAKE_CXX_CLANG_TIDY": "clang-tidy", - "CMAKE_C_CLANG_TIDY": "clang-tidy" + "CMAKE_CXX_CLANG_TIDY": "clang-tidy;-header-filter=.*", + "CMAKE_C_CLANG_TIDY": "clang-tidy;-header-filter=.*" } }, { From 0883df95b17f0257f9fff33f0fb8caea19e7fe4d Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sat, 30 Mar 2024 21:40:16 -0700 Subject: [PATCH 1030/1093] resolve uncovered warnings --- examples/AllTests/AllTests.cpp | 4 +- examples/AllTests/CircularBufferTest.cpp | 4 +- examples/AllTests/EventDispatcherTest.cpp | 12 +- examples/AllTests/FEDemoTest.cpp | 2 +- examples/AllTests/HelloTest.cpp | 4 +- examples/AllTests/MockDocumentationTest.cpp | 12 +- examples/AllTests/MockPrinter.h | 6 +- examples/AllTests/PrinterTest.cpp | 4 +- examples/ApplicationLib/EventDispatcher.h | 4 +- include/CppUTest/CppUTestConfig.h | 20 +- include/CppUTest/JUnitTestOutput.h | 26 +- include/CppUTest/MemoryLeakDetector.h | 2 +- .../CppUTest/MemoryLeakDetectorNewMacros.h | 4 +- include/CppUTest/MemoryLeakWarningPlugin.h | 6 +- include/CppUTest/SimpleString.h | 2 +- include/CppUTest/SimpleStringInternalCache.h | 14 +- include/CppUTest/TeamCityTestOutput.h | 12 +- include/CppUTest/TestHarness_c.h | 4 +- include/CppUTest/TestMemoryAllocator.h | 42 +-- include/CppUTest/TestOutput.h | 48 +-- include/CppUTest/TestPlugin.h | 12 +- include/CppUTest/Utest.h | 40 +-- include/CppUTest/UtestMacros.h | 24 +- .../CppUTestExt/CodeMemoryReportFormatter.h | 14 +- include/CppUTestExt/GTest.h | 4 +- include/CppUTestExt/GTestConvertor.h | 7 +- include/CppUTestExt/GTestSupport.h | 4 +- include/CppUTestExt/IEEE754ExceptionsPlugin.h | 4 +- include/CppUTestExt/MemoryReportAllocator.h | 14 +- include/CppUTestExt/MemoryReportFormatter.h | 14 +- include/CppUTestExt/MemoryReporterPlugin.h | 8 +- include/CppUTestExt/MockCheckedActualCall.h | 286 +++++++++--------- include/CppUTestExt/MockCheckedExpectedCall.h | 150 ++++----- include/CppUTestExt/MockFailure.h | 2 +- include/CppUTestExt/MockNamedValue.h | 6 +- include/CppUTestExt/MockSupportPlugin.h | 6 +- include/CppUTestExt/OrderedTest.h | 6 +- src/CppUTest/MemoryLeakWarningPlugin.cpp | 4 +- src/CppUTest/Utest.cpp | 2 +- src/CppUTestExt/MockFailure.cpp | 4 +- src/CppUTestExt/MockSupportPlugin.cpp | 4 +- src/CppUTestExt/MockSupport_c.cpp | 16 +- src/Platforms/Gcc/UtestPlatform.cpp | 4 +- src/Platforms/VisualCpp/UtestPlatform.cpp | 2 +- tests/CppUTest/AllocLetTestFreeTest.cpp | 4 +- tests/CppUTest/AllocationInCppFile.h | 2 +- tests/CppUTest/CheatSheetTest.cpp | 4 +- tests/CppUTest/CommandLineArgumentsTest.cpp | 8 +- tests/CppUTest/CommandLineTestRunnerTest.cpp | 20 +- tests/CppUTest/DummyMemoryLeakDetector.h | 6 +- tests/CppUTest/JUnitOutputTest.cpp | 4 +- tests/CppUTest/MemoryLeakDetectorTest.cpp | 20 +- tests/CppUTest/MemoryLeakWarningTest.cpp | 12 +- tests/CppUTest/MemoryOperatorOverloadTest.cpp | 6 +- tests/CppUTest/PluginTest.cpp | 10 +- tests/CppUTest/SetPluginTest.cpp | 20 +- tests/CppUTest/SimpleMutexTest.cpp | 4 +- tests/CppUTest/SimpleStringCacheTest.cpp | 10 +- tests/CppUTest/SimpleStringTest.cpp | 20 +- tests/CppUTest/TeamCityOutputTest.cpp | 10 +- tests/CppUTest/TestFailureNaNTest.cpp | 4 +- tests/CppUTest/TestFailureTest.cpp | 4 +- tests/CppUTest/TestInstallerTest.cpp | 4 +- tests/CppUTest/TestMemoryAllocatorTest.cpp | 34 +-- tests/CppUTest/TestOutputTest.cpp | 20 +- tests/CppUTest/TestRegistryTest.cpp | 26 +- tests/CppUTest/TestResultTest.cpp | 4 +- tests/CppUTest/UtestPlatformTest.cpp | 2 +- tests/CppUTest/UtestTest.cpp | 10 +- tests/CppUTestExt/CodeMemoryReporterTest.cpp | 4 +- .../CppUTestExt/ExpectedFunctionsListTest.cpp | 4 +- tests/CppUTestExt/GMockTest.cpp | 4 +- tests/CppUTestExt/GTest1Test.cpp | 4 +- tests/CppUTestExt/GTest2ConvertorTest.cpp | 4 +- tests/CppUTestExt/IEEE754PluginTest.cpp | 4 +- .../CppUTestExt/MemoryReportFormatterTest.cpp | 4 +- .../CppUTestExt/MemoryReporterPluginTest.cpp | 22 +- tests/CppUTestExt/MockActualCallTest.cpp | 4 +- tests/CppUTestExt/MockCallTest.cpp | 2 +- tests/CppUTestExt/MockCheatSheetTest.cpp | 2 +- .../CppUTestExt/MockComparatorCopierTest.cpp | 12 +- tests/CppUTestExt/MockExpectedCallTest.cpp | 12 +- .../CppUTestExt/MockFailureReporterForTest.h | 4 +- tests/CppUTestExt/MockFailureTest.cpp | 4 +- tests/CppUTestExt/MockHierarchyTest.cpp | 2 +- tests/CppUTestExt/MockNamedValueTest.cpp | 14 +- tests/CppUTestExt/MockParameterTest.cpp | 2 +- tests/CppUTestExt/MockPluginTest.cpp | 10 +- tests/CppUTestExt/MockReturnValueTest.cpp | 2 +- tests/CppUTestExt/MockStrictOrderTest.cpp | 2 +- tests/CppUTestExt/MockSupportTest.cpp | 4 +- tests/CppUTestExt/MockSupport_cTest.cpp | 2 +- tests/CppUTestExt/OrderedTestTest.cpp | 6 +- 93 files changed, 638 insertions(+), 633 deletions(-) diff --git a/examples/AllTests/AllTests.cpp b/examples/AllTests/AllTests.cpp index 7944f3861..7d17d6f3d 100644 --- a/examples/AllTests/AllTests.cpp +++ b/examples/AllTests/AllTests.cpp @@ -34,12 +34,12 @@ class MyDummyComparator : public MockNamedValueComparator { public: - virtual bool isEqual(const void* object1, const void* object2) _override + virtual bool isEqual(const void* object1, const void* object2) CPPUTEST_OVERRIDE { return object1 == object2; } - virtual SimpleString valueToString(const void* object) _override + virtual SimpleString valueToString(const void* object) CPPUTEST_OVERRIDE { return StringFrom(object); } diff --git a/examples/AllTests/CircularBufferTest.cpp b/examples/AllTests/CircularBufferTest.cpp index a2a0881f0..4602e5ab9 100644 --- a/examples/AllTests/CircularBufferTest.cpp +++ b/examples/AllTests/CircularBufferTest.cpp @@ -33,11 +33,11 @@ TEST_GROUP(CircularBuffer) { CircularBuffer* buffer; - void setup() _override + void setup() CPPUTEST_OVERRIDE { buffer = new CircularBuffer(); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete buffer; } diff --git a/examples/AllTests/EventDispatcherTest.cpp b/examples/AllTests/EventDispatcherTest.cpp index 0448a50e8..d7f2767d9 100644 --- a/examples/AllTests/EventDispatcherTest.cpp +++ b/examples/AllTests/EventDispatcherTest.cpp @@ -32,7 +32,7 @@ class ObserverMock : public EventObserver { public: - virtual void notify(const Event& event, int timeOutInSeconds) _override + virtual void notify(const Event& event, int timeOutInSeconds) CPPUTEST_OVERRIDE { mock() .actualCall("notify") @@ -40,7 +40,7 @@ class ObserverMock : public EventObserver .withParameterOfType("Event", "event", (void*)&event) .withParameter("timeOutInSeconds", timeOutInSeconds); } - virtual void notifyRegistration(EventObserver* newObserver) _override + virtual void notifyRegistration(EventObserver* newObserver) CPPUTEST_OVERRIDE { mock().actualCall("notifyRegistration").onObject(this).withParameter("newObserver", newObserver); } @@ -49,11 +49,11 @@ class ObserverMock : public EventObserver class EventComparator : public MockNamedValueComparator { public: - virtual bool isEqual(const void* object1, const void* object2) _override + virtual bool isEqual(const void* object1, const void* object2) CPPUTEST_OVERRIDE { return ((const Event*)object1)->type == ((const Event*)object2)->type; } - virtual SimpleString valueToString(const void* object) _override + virtual SimpleString valueToString(const void* object) CPPUTEST_OVERRIDE { return StringFrom(((const Event*)object)->type); } @@ -67,12 +67,12 @@ TEST_GROUP(EventDispatcher) ObserverMock observer2; EventComparator eventComparator; - void setup() _override + void setup() CPPUTEST_OVERRIDE { dispatcher = new EventDispatcher; mock().installComparator("Event", eventComparator); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete dispatcher; mock().removeAllComparatorsAndCopiers(); diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index f089ec5c7..fb888af22 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -46,7 +46,7 @@ extern "C" { TEST_GROUP(FE_Demo) { - void setup() _override + void setup() CPPUTEST_OVERRIDE { IEEE754ExceptionsPlugin::disableInexact(); } diff --git a/examples/AllTests/HelloTest.cpp b/examples/AllTests/HelloTest.cpp index 83ff54e26..7bc644e0e 100644 --- a/examples/AllTests/HelloTest.cpp +++ b/examples/AllTests/HelloTest.cpp @@ -43,12 +43,12 @@ TEST_GROUP(HelloWorld) va_end(arguments); return 1; } - void setup() _override + void setup() CPPUTEST_OVERRIDE { buffer = new SimpleString(); UT_PTR_SET(PrintFormated, &output_method); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete buffer; } diff --git a/examples/AllTests/MockDocumentationTest.cpp b/examples/AllTests/MockDocumentationTest.cpp index e5f8e47f1..0bd578ea8 100644 --- a/examples/AllTests/MockDocumentationTest.cpp +++ b/examples/AllTests/MockDocumentationTest.cpp @@ -69,7 +69,7 @@ class ClassFromProductionCode class ClassFromProductionCodeMock : public ClassFromProductionCode { public: - virtual void importantFunction() _override + virtual void importantFunction() CPPUTEST_OVERRIDE { mock().actualCall("importantFunction").onObject(this); } @@ -102,11 +102,11 @@ TEST(MockDocumentation, parameters) class MyTypeComparator : public MockNamedValueComparator { public: - virtual bool isEqual(const void* object1, const void* object2) _override + virtual bool isEqual(const void* object1, const void* object2) CPPUTEST_OVERRIDE { return object1 == object2; } - virtual SimpleString valueToString(const void* object) _override + virtual SimpleString valueToString(const void* object) CPPUTEST_OVERRIDE { return StringFrom(object); } @@ -199,12 +199,12 @@ TEST(MockDocumentation, CInterface) TEST_GROUP(FooTestGroup) { - void setup() _override + void setup() CPPUTEST_OVERRIDE { // Init stuff } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { // Uninit stuff } @@ -222,7 +222,7 @@ TEST(FooTestGroup, MoreFoo) TEST_GROUP(BarTestGroup) { - void setup() _override + void setup() CPPUTEST_OVERRIDE { // Init Bar } diff --git a/examples/AllTests/MockPrinter.h b/examples/AllTests/MockPrinter.h index 8af39dcc7..1df48962f 100644 --- a/examples/AllTests/MockPrinter.h +++ b/examples/AllTests/MockPrinter.h @@ -44,14 +44,14 @@ class MockPrinter : public Printer { public: explicit MockPrinter() {} - virtual ~MockPrinter() _destructor_override {} + virtual ~MockPrinter() CPPUTEST_DESTRUCTOR_OVERRIDE {} - virtual void Print(const char* s) _override + virtual void Print(const char* s) CPPUTEST_OVERRIDE { savedOutput.append(s); } - virtual void Print(long int value) _override + virtual void Print(long int value) CPPUTEST_OVERRIDE { SimpleString buffer; buffer = StringFromFormat("%ld", value); diff --git a/examples/AllTests/PrinterTest.cpp b/examples/AllTests/PrinterTest.cpp index d46a678a4..88a5d1ca3 100644 --- a/examples/AllTests/PrinterTest.cpp +++ b/examples/AllTests/PrinterTest.cpp @@ -34,12 +34,12 @@ TEST_GROUP(Printer) Printer* printer; MockPrinter* mockPrinter; - void setup() _override + void setup() CPPUTEST_OVERRIDE { mockPrinter = new MockPrinter(); printer = mockPrinter; } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete printer; } diff --git a/examples/ApplicationLib/EventDispatcher.h b/examples/ApplicationLib/EventDispatcher.h index 0a4e2f73d..a27eb056f 100644 --- a/examples/ApplicationLib/EventDispatcher.h +++ b/examples/ApplicationLib/EventDispatcher.h @@ -25,8 +25,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef EVENTDISPATCHER__H -#define EVENTDISPATCHER__H +#ifndef EVENTDISPATCHER_H +#define EVENTDISPATCHER_H #include diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index bbe657f42..8a71436e1 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -94,7 +94,7 @@ /* Should be the only #include here. Standard C library wrappers */ #include "StandardCLibrary.h" -/* Create a _no_return_ macro, which is used to flag a function as not returning. +/* Create a CPPUTEST_NORETURN macro, which is used to flag a function as not returning. * Used for functions that always throws for instance. * * This is needed for compiling with clang, without breaking other compilers. @@ -104,11 +104,11 @@ #endif #if defined (__cplusplus) && __cplusplus >= 201103L - #define _no_return_ [[noreturn]] + #define CPPUTEST_NORETURN [[noreturn]] #elif __has_attribute(noreturn) - #define _no_return_ __attribute__((noreturn)) + #define CPPUTEST_NORETURN __attribute__((noreturn)) #else - #define _no_return_ + #define CPPUTEST_NORETURN #endif #if defined(__MINGW32__) @@ -118,9 +118,9 @@ #endif #if __has_attribute(format) - #define _check_format_(type, format_parameter, other_parameters) __attribute__ ((format (type, format_parameter, other_parameters))) + #define CPPUTEST_CHECK_FORMAT(type, format_parameter, other_parameters) __attribute__ ((format (type, format_parameter, other_parameters))) #else - #define _check_format_(type, format_parameter, other_parameters) /* type, format_parameter, other_parameters */ + #define CPPUTEST_CHECK_FORMAT(type, format_parameter, other_parameters) /* type, format_parameter, other_parameters */ #endif #if defined(__cplusplus) && __cplusplus >= 201103L @@ -333,10 +333,10 @@ typedef struct #ifdef __cplusplus /* Visual C++ 10.0+ (2010+) supports the override keyword, but doesn't define the C++ version as C++11 */ #if (__cplusplus >= 201103L) || (defined(_MSC_VER) && (_MSC_VER >= 1600)) - #define _override override + #define CPPUTEST_OVERRIDE override #define NULLPTR nullptr #else - #define _override + #define CPPUTEST_OVERRIDE #define NULLPTR NULL #endif #endif @@ -344,9 +344,9 @@ typedef struct #ifdef __cplusplus /* Visual C++ 11.0+ (2012+) supports the override keyword on destructors */ #if (__cplusplus >= 201103L) || (defined(_MSC_VER) && (_MSC_VER >= 1700)) - #define _destructor_override override + #define CPPUTEST_DESTRUCTOR_OVERRIDE override #else - #define _destructor_override + #define CPPUTEST_DESTRUCTOR_OVERRIDE #endif #endif diff --git a/include/CppUTest/JUnitTestOutput.h b/include/CppUTest/JUnitTestOutput.h index 9c01eacb1..5e5746f56 100644 --- a/include/CppUTest/JUnitTestOutput.h +++ b/include/CppUTest/JUnitTestOutput.h @@ -38,22 +38,22 @@ class JUnitTestOutput: public TestOutput { public: JUnitTestOutput(); - virtual ~JUnitTestOutput() _destructor_override; + virtual ~JUnitTestOutput() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual void printTestsStarted() _override; - virtual void printTestsEnded(const TestResult& result) _override; - virtual void printCurrentTestStarted(const UtestShell& test) _override; - virtual void printCurrentTestEnded(const TestResult& res) _override; - virtual void printCurrentGroupStarted(const UtestShell& test) _override; - virtual void printCurrentGroupEnded(const TestResult& res) _override; + virtual void printTestsStarted() CPPUTEST_OVERRIDE; + virtual void printTestsEnded(const TestResult& result) CPPUTEST_OVERRIDE; + virtual void printCurrentTestStarted(const UtestShell& test) CPPUTEST_OVERRIDE; + virtual void printCurrentTestEnded(const TestResult& res) CPPUTEST_OVERRIDE; + virtual void printCurrentGroupStarted(const UtestShell& test) CPPUTEST_OVERRIDE; + virtual void printCurrentGroupEnded(const TestResult& res) CPPUTEST_OVERRIDE; - virtual void printBuffer(const char*) _override; - virtual void print(const char*) _override; - virtual void print(long) _override; - virtual void print(size_t) _override; - virtual void printFailure(const TestFailure& failure) _override; + virtual void printBuffer(const char*) CPPUTEST_OVERRIDE; + virtual void print(const char*) CPPUTEST_OVERRIDE; + virtual void print(long) CPPUTEST_OVERRIDE; + virtual void print(size_t) CPPUTEST_OVERRIDE; + virtual void printFailure(const TestFailure& failure) CPPUTEST_OVERRIDE; - virtual void flush() _override; + virtual void flush() CPPUTEST_OVERRIDE; virtual SimpleString createFileName(const SimpleString& group); void setPackageName(const SimpleString &package); diff --git a/include/CppUTest/MemoryLeakDetector.h b/include/CppUTest/MemoryLeakDetector.h index 9850cc5b1..195a3384a 100644 --- a/include/CppUTest/MemoryLeakDetector.h +++ b/include/CppUTest/MemoryLeakDetector.h @@ -58,7 +58,7 @@ struct SimpleStringBuffer SimpleStringBuffer(); void clear(); - void add(const char* format, ...) _check_format_(CPPUTEST_CHECK_FORMAT_TYPE, 2, 3); + void add(const char* format, ...) CPPUTEST_CHECK_FORMAT(CPPUTEST_CHECK_FORMAT_TYPE, 2, 3); void addMemoryDump(const void* memory, size_t memorySize); char* toString(); diff --git a/include/CppUTest/MemoryLeakDetectorNewMacros.h b/include/CppUTest/MemoryLeakDetectorNewMacros.h index e482c9680..880b89560 100644 --- a/include/CppUTest/MemoryLeakDetectorNewMacros.h +++ b/include/CppUTest/MemoryLeakDetectorNewMacros.h @@ -40,13 +40,13 @@ #undef strdup #undef strndup #undef CPPUTEST_USE_STRDUP_MACROS - #define __CPPUTEST_REINCLUDE_MALLOC_MEMORY_LEAK_DETECTOR + #define CPPUTEST_REINCLUDE_MALLOC_MEMORY_LEAK_DETECTOR #endif #endif #include #include #include - #ifdef __CPPUTEST_REINCLUDE_MALLOC_MEMORY_LEAK_DETECTOR + #ifdef CPPUTEST_REINCLUDE_MALLOC_MEMORY_LEAK_DETECTOR #include "MemoryLeakDetectorMallocMacros.h" #endif #endif diff --git a/include/CppUTest/MemoryLeakWarningPlugin.h b/include/CppUTest/MemoryLeakWarningPlugin.h index de0f360d0..01ae95be7 100644 --- a/include/CppUTest/MemoryLeakWarningPlugin.h +++ b/include/CppUTest/MemoryLeakWarningPlugin.h @@ -43,10 +43,10 @@ class MemoryLeakWarningPlugin: public TestPlugin { public: MemoryLeakWarningPlugin(const SimpleString& name, MemoryLeakDetector* localDetector = NULLPTR); - virtual ~MemoryLeakWarningPlugin() _destructor_override; + virtual ~MemoryLeakWarningPlugin() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual void preTestAction(UtestShell& test, TestResult& result) _override; - virtual void postTestAction(UtestShell& test, TestResult& result) _override; + virtual void preTestAction(UtestShell& test, TestResult& result) CPPUTEST_OVERRIDE; + virtual void postTestAction(UtestShell& test, TestResult& result) CPPUTEST_OVERRIDE; virtual const char* FinalReport(size_t toBeDeletedLeaks = 0); diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 6d33dabfd..63e7684d0 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -209,7 +209,7 @@ SimpleString HexStringFrom(const void* value); SimpleString HexStringFrom(void (*value)()); SimpleString StringFrom(double value, int precision = 6); SimpleString StringFrom(const SimpleString& other); -SimpleString StringFromFormat(const char* format, ...) _check_format_(CPPUTEST_CHECK_FORMAT_TYPE, 1, 2); +SimpleString StringFromFormat(const char* format, ...) CPPUTEST_CHECK_FORMAT(CPPUTEST_CHECK_FORMAT_TYPE, 1, 2); SimpleString VStringFromFormat(const char* format, va_list args); SimpleString StringFromBinary(const unsigned char* value, size_t size); SimpleString StringFromBinaryOrNull(const unsigned char* value, size_t size); diff --git a/include/CppUTest/SimpleStringInternalCache.h b/include/CppUTest/SimpleStringInternalCache.h index ef14def8c..ebbd30f6b 100644 --- a/include/CppUTest/SimpleStringInternalCache.h +++ b/include/CppUTest/SimpleStringInternalCache.h @@ -79,16 +79,16 @@ class SimpleStringCacheAllocator : public TestMemoryAllocator { public: SimpleStringCacheAllocator(SimpleStringInternalCache& cache, TestMemoryAllocator* previousAllocator); - virtual ~SimpleStringCacheAllocator() _destructor_override; + virtual ~SimpleStringCacheAllocator() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; - virtual void free_memory(char* memory, size_t size, const char* file, size_t line) _override; + virtual char* alloc_memory(size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE; + virtual void free_memory(char* memory, size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE; - virtual const char* name() const _override; - virtual const char* alloc_name() const _override; - virtual const char* free_name() const _override; + virtual const char* name() const CPPUTEST_OVERRIDE; + virtual const char* alloc_name() const CPPUTEST_OVERRIDE; + virtual const char* free_name() const CPPUTEST_OVERRIDE; - virtual TestMemoryAllocator* actualAllocator() _override; + virtual TestMemoryAllocator* actualAllocator() CPPUTEST_OVERRIDE; TestMemoryAllocator* originalAllocator(); private: SimpleStringInternalCache& cache_; diff --git a/include/CppUTest/TeamCityTestOutput.h b/include/CppUTest/TeamCityTestOutput.h index 186d21867..caf67d586 100644 --- a/include/CppUTest/TeamCityTestOutput.h +++ b/include/CppUTest/TeamCityTestOutput.h @@ -8,14 +8,14 @@ class TeamCityTestOutput: public ConsoleTestOutput { public: TeamCityTestOutput(void); - virtual ~TeamCityTestOutput(void) _destructor_override; + virtual ~TeamCityTestOutput(void) CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual void printCurrentTestStarted(const UtestShell& test) _override; - virtual void printCurrentTestEnded(const TestResult& res) _override; - virtual void printCurrentGroupStarted(const UtestShell& test) _override; - virtual void printCurrentGroupEnded(const TestResult& res) _override; + virtual void printCurrentTestStarted(const UtestShell& test) CPPUTEST_OVERRIDE; + virtual void printCurrentTestEnded(const TestResult& res) CPPUTEST_OVERRIDE; + virtual void printCurrentGroupStarted(const UtestShell& test) CPPUTEST_OVERRIDE; + virtual void printCurrentGroupEnded(const TestResult& res) CPPUTEST_OVERRIDE; - virtual void printFailure(const TestFailure& failure) _override; + virtual void printFailure(const TestFailure& failure) CPPUTEST_OVERRIDE; protected: diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 1d1cb9851..2145e5f94 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -170,12 +170,12 @@ TEST_GROUP(group_name) #define TEST_GROUP_C_SETUP_WRAPPER(group_name) \ - void setup() _override { \ + void setup() CPPUTEST_OVERRIDE { \ group_##group_name##_setup_wrapper_c(); \ } #define TEST_GROUP_C_TEARDOWN_WRAPPER(group_name) \ - void teardown() _override { \ + void teardown() CPPUTEST_OVERRIDE { \ group_##group_name##_teardown_wrapper_c(); \ } diff --git a/include/CppUTest/TestMemoryAllocator.h b/include/CppUTest/TestMemoryAllocator.h index 0f4a43bc4..8f65bf508 100644 --- a/include/CppUTest/TestMemoryAllocator.h +++ b/include/CppUTest/TestMemoryAllocator.h @@ -93,16 +93,16 @@ class MemoryLeakAllocator : public TestMemoryAllocator { public: MemoryLeakAllocator(TestMemoryAllocator* originalAllocator); - virtual ~MemoryLeakAllocator() _destructor_override; + virtual ~MemoryLeakAllocator() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; - virtual void free_memory(char* memory, size_t size, const char* file, size_t line) _override; + virtual char* alloc_memory(size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE; + virtual void free_memory(char* memory, size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE; - virtual const char* name() const _override; - virtual const char* alloc_name() const _override; - virtual const char* free_name() const _override; + virtual const char* name() const CPPUTEST_OVERRIDE; + virtual const char* alloc_name() const CPPUTEST_OVERRIDE; + virtual const char* free_name() const CPPUTEST_OVERRIDE; - virtual TestMemoryAllocator* actualAllocator() _override; + virtual TestMemoryAllocator* actualAllocator() CPPUTEST_OVERRIDE; private: TestMemoryAllocator* originalAllocator_; }; @@ -112,11 +112,11 @@ class CrashOnAllocationAllocator : public TestMemoryAllocator unsigned allocationToCrashOn_; public: CrashOnAllocationAllocator(); - virtual ~CrashOnAllocationAllocator() _destructor_override; + virtual ~CrashOnAllocationAllocator() CPPUTEST_DESTRUCTOR_OVERRIDE; virtual void setNumberToCrashOn(unsigned allocationToCrashOn); - virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; + virtual char* alloc_memory(size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE; }; @@ -124,10 +124,10 @@ class NullUnknownAllocator: public TestMemoryAllocator { public: NullUnknownAllocator(); - virtual ~NullUnknownAllocator() _destructor_override; + virtual ~NullUnknownAllocator() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; - virtual void free_memory(char* memory, size_t size, const char* file, size_t line) _override; + virtual char* alloc_memory(size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE; + virtual void free_memory(char* memory, size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE; static TestMemoryAllocator* defaultAllocator(); }; @@ -138,10 +138,10 @@ class FailableMemoryAllocator: public TestMemoryAllocator { public: FailableMemoryAllocator(const char* name_str = "failable alloc", const char* alloc_name_str = "alloc", const char* free_name_str = "free"); - virtual ~FailableMemoryAllocator() _destructor_override; + virtual ~FailableMemoryAllocator() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; - virtual char* allocMemoryLeakNode(size_t size) _override; + virtual char* alloc_memory(size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE; + virtual char* allocMemoryLeakNode(size_t size) CPPUTEST_OVERRIDE; virtual void failAllocNumber(int number); virtual void failNthAllocAt(int allocationNumber, const char* file, size_t line); @@ -207,16 +207,16 @@ class AccountingTestMemoryAllocator : public TestMemoryAllocator { public: AccountingTestMemoryAllocator(MemoryAccountant& accountant, TestMemoryAllocator* originalAllocator); - virtual ~AccountingTestMemoryAllocator() _destructor_override; + virtual ~AccountingTestMemoryAllocator() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; - virtual void free_memory(char* memory, size_t size, const char* file, size_t line) _override; + virtual char* alloc_memory(size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE; + virtual void free_memory(char* memory, size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE; - virtual TestMemoryAllocator* actualAllocator() _override; + virtual TestMemoryAllocator* actualAllocator() CPPUTEST_OVERRIDE; TestMemoryAllocator* originalAllocator(); - virtual const char* alloc_name() const _override; - virtual const char* free_name() const _override; + virtual const char* alloc_name() const CPPUTEST_OVERRIDE; + virtual const char* free_name() const CPPUTEST_OVERRIDE; private: void addMemoryToMemoryTrackingToKeepTrackOfSize(char* memory, size_t size); diff --git a/include/CppUTest/TestOutput.h b/include/CppUTest/TestOutput.h index e35dd01d5..47fbe02ea 100644 --- a/include/CppUTest/TestOutput.h +++ b/include/CppUTest/TestOutput.h @@ -117,12 +117,12 @@ class ConsoleTestOutput: public TestOutput explicit ConsoleTestOutput() { } - virtual ~ConsoleTestOutput() _destructor_override + virtual ~ConsoleTestOutput() CPPUTEST_DESTRUCTOR_OVERRIDE { } - virtual void printBuffer(const char* s) _override; - virtual void flush() _override; + virtual void printBuffer(const char* s) CPPUTEST_OVERRIDE; + virtual void flush() CPPUTEST_OVERRIDE; private: ConsoleTestOutput(const ConsoleTestOutput&); @@ -145,14 +145,14 @@ class StringBufferTestOutput: public TestOutput { } - virtual ~StringBufferTestOutput() _destructor_override; + virtual ~StringBufferTestOutput() CPPUTEST_DESTRUCTOR_OVERRIDE; - void printBuffer(const char* s) _override + void printBuffer(const char* s) CPPUTEST_OVERRIDE { output += s; } - void flush() _override + void flush() CPPUTEST_OVERRIDE { output = ""; } @@ -178,29 +178,29 @@ class CompositeTestOutput : public TestOutput virtual void setOutputTwo(TestOutput* output); CompositeTestOutput(); - virtual ~CompositeTestOutput() _destructor_override; + virtual ~CompositeTestOutput() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual void printTestsStarted() _override; - virtual void printTestsEnded(const TestResult& result) _override; + virtual void printTestsStarted() CPPUTEST_OVERRIDE; + virtual void printTestsEnded(const TestResult& result) CPPUTEST_OVERRIDE; - virtual void printCurrentTestStarted(const UtestShell& test) _override; - virtual void printCurrentTestEnded(const TestResult& res) _override; - virtual void printCurrentGroupStarted(const UtestShell& test) _override; - virtual void printCurrentGroupEnded(const TestResult& res) _override; + virtual void printCurrentTestStarted(const UtestShell& test) CPPUTEST_OVERRIDE; + virtual void printCurrentTestEnded(const TestResult& res) CPPUTEST_OVERRIDE; + virtual void printCurrentGroupStarted(const UtestShell& test) CPPUTEST_OVERRIDE; + virtual void printCurrentGroupEnded(const TestResult& res) CPPUTEST_OVERRIDE; - virtual void verbose(VerbosityLevel level) _override; - virtual void color() _override; - virtual void printBuffer(const char*) _override; - virtual void print(const char*) _override; - virtual void print(long) _override; - virtual void print(size_t) _override; - virtual void printDouble(double) _override; - virtual void printFailure(const TestFailure& failure) _override; - virtual void setProgressIndicator(const char*) _override; + virtual void verbose(VerbosityLevel level) CPPUTEST_OVERRIDE; + virtual void color() CPPUTEST_OVERRIDE; + virtual void printBuffer(const char*) CPPUTEST_OVERRIDE; + virtual void print(const char*) CPPUTEST_OVERRIDE; + virtual void print(long) CPPUTEST_OVERRIDE; + virtual void print(size_t) CPPUTEST_OVERRIDE; + virtual void printDouble(double) CPPUTEST_OVERRIDE; + virtual void printFailure(const TestFailure& failure) CPPUTEST_OVERRIDE; + virtual void setProgressIndicator(const char*) CPPUTEST_OVERRIDE; - virtual void printVeryVerbose(const char*) _override; + virtual void printVeryVerbose(const char*) CPPUTEST_OVERRIDE; - virtual void flush() _override; + virtual void flush() CPPUTEST_OVERRIDE; protected: CompositeTestOutput(const TestOutput&); diff --git a/include/CppUTest/TestPlugin.h b/include/CppUTest/TestPlugin.h index c2f5d636d..d0b3c41b3 100644 --- a/include/CppUTest/TestPlugin.h +++ b/include/CppUTest/TestPlugin.h @@ -92,7 +92,7 @@ class SetPointerPlugin: public TestPlugin { public: SetPointerPlugin(const SimpleString& name); - virtual void postTestAction(UtestShell&, TestResult&) _override; + virtual void postTestAction(UtestShell&, TestResult&) CPPUTEST_OVERRIDE; enum { @@ -100,7 +100,11 @@ class SetPointerPlugin: public TestPlugin }; }; -#define UT_PTR_SET(a, b) do { CppUTestStore( (void**)&a ); a = b; } while(0) +#define UT_PTR_SET(a, b) \ + do { \ + CppUTestStore((void**)&(a)); \ + (a) = b; \ + } while (0) ///////////// Null Plugin @@ -110,8 +114,8 @@ class NullTestPlugin: public TestPlugin NullTestPlugin(); - virtual void runAllPreTestAction(UtestShell& test, TestResult& result) _override; - virtual void runAllPostTestAction(UtestShell& test, TestResult& result) _override; + virtual void runAllPreTestAction(UtestShell& test, TestResult& result) CPPUTEST_OVERRIDE; + virtual void runAllPostTestAction(UtestShell& test, TestResult& result) CPPUTEST_OVERRIDE; static NullTestPlugin* instance(); }; diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index ac88cc48a..02e865b76 100644 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -69,29 +69,29 @@ class TestTerminator class NormalTestTerminator : public TestTerminator { public: - virtual void exitCurrentTest() const _override; - virtual ~NormalTestTerminator() _destructor_override; + virtual void exitCurrentTest() const CPPUTEST_OVERRIDE; + virtual ~NormalTestTerminator() CPPUTEST_DESTRUCTOR_OVERRIDE; }; class TestTerminatorWithoutExceptions : public TestTerminator { public: - virtual void exitCurrentTest() const _override; - virtual ~TestTerminatorWithoutExceptions() _destructor_override; + virtual void exitCurrentTest() const CPPUTEST_OVERRIDE; + virtual ~TestTerminatorWithoutExceptions() CPPUTEST_DESTRUCTOR_OVERRIDE; }; class CrashingTestTerminator : public NormalTestTerminator { public: - virtual void exitCurrentTest() const _override; - virtual ~CrashingTestTerminator() _destructor_override; + virtual void exitCurrentTest() const CPPUTEST_OVERRIDE; + virtual ~CrashingTestTerminator() CPPUTEST_DESTRUCTOR_OVERRIDE; }; class CrashingTestTerminatorWithoutExceptions : public TestTerminatorWithoutExceptions { public: - virtual void exitCurrentTest() const _override; - virtual ~CrashingTestTerminatorWithoutExceptions() _destructor_override; + virtual void exitCurrentTest() const CPPUTEST_OVERRIDE; + virtual ~CrashingTestTerminatorWithoutExceptions() CPPUTEST_DESTRUCTOR_OVERRIDE; }; //////////////////// UtestShell @@ -215,9 +215,9 @@ class ExecFunctionTest : public Utest { public: ExecFunctionTest(ExecFunctionTestShell* shell); - void testBody() _override; - virtual void setup() _override; - virtual void teardown() _override; + void testBody() CPPUTEST_OVERRIDE; + virtual void setup() CPPUTEST_OVERRIDE; + virtual void teardown() CPPUTEST_OVERRIDE; private: ExecFunctionTestShell* shell_; }; @@ -239,9 +239,9 @@ class ExecFunctionWithoutParameters : public ExecFunction void (*testFunction_)(); ExecFunctionWithoutParameters(void(*testFunction)()); - virtual ~ExecFunctionWithoutParameters() _destructor_override; + virtual ~ExecFunctionWithoutParameters() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual void exec() _override; + virtual void exec() CPPUTEST_OVERRIDE; }; //////////////////// ExecFunctionTestShell @@ -258,8 +258,8 @@ class ExecFunctionTestShell : public UtestShell { } - Utest* createTest() _override { return new ExecFunctionTest(this); } - virtual ~ExecFunctionTestShell() _destructor_override; + Utest* createTest() CPPUTEST_OVERRIDE { return new ExecFunctionTest(this); } + virtual ~ExecFunctionTestShell() CPPUTEST_DESTRUCTOR_OVERRIDE; }; //////////////////// CppUTestFailedException @@ -276,14 +276,14 @@ class IgnoredUtestShell : public UtestShell { public: IgnoredUtestShell(); - virtual ~IgnoredUtestShell() _destructor_override; + virtual ~IgnoredUtestShell() CPPUTEST_DESTRUCTOR_OVERRIDE; explicit IgnoredUtestShell(const char* groupName, const char* testName, const char* fileName, size_t lineNumber); - virtual bool willRun() const _override; - virtual void setRunIgnored() _override; + virtual bool willRun() const CPPUTEST_OVERRIDE; + virtual void setRunIgnored() CPPUTEST_OVERRIDE; protected: - virtual SimpleString getMacroName() const _override; - virtual void runOneTest(TestPlugin* plugin, TestResult& result) _override; + virtual SimpleString getMacroName() const CPPUTEST_OVERRIDE; + virtual void runOneTest(TestPlugin* plugin, TestResult& result) CPPUTEST_OVERRIDE; private: IgnoredUtestShell(const IgnoredUtestShell&); diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 3789f0671..743bf069e 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -50,10 +50,10 @@ TEST_GROUP_BASE(testGroup, Utest) #define TEST_SETUP() \ - virtual void setup() _override + virtual void setup() CPPUTEST_OVERRIDE #define TEST_TEARDOWN() \ - virtual void teardown() _override + virtual void teardown() CPPUTEST_OVERRIDE #define TEST(testGroup, testName) \ /* External declarations for strict compilers */ \ @@ -62,9 +62,9 @@ \ class TEST_##testGroup##_##testName##_Test : public TEST_GROUP_##CppUTestGroup##testGroup \ { public: TEST_##testGroup##_##testName##_Test () : TEST_GROUP_##CppUTestGroup##testGroup () {} \ - void testBody() _override; }; \ + void testBody() CPPUTEST_OVERRIDE; }; \ class TEST_##testGroup##_##testName##_TestShell : public UtestShell { \ - virtual Utest* createTest() _override { return new TEST_##testGroup##_##testName##_Test; } \ + virtual Utest* createTest() CPPUTEST_OVERRIDE { return new TEST_##testGroup##_##testName##_Test; } \ } TEST_##testGroup##_##testName##_TestShell_instance; \ static TestInstaller TEST_##testGroup##_##testName##_Installer(TEST_##testGroup##_##testName##_TestShell_instance, #testGroup, #testName, __FILE__,__LINE__); \ void TEST_##testGroup##_##testName##_Test::testBody() @@ -76,9 +76,9 @@ \ class IGNORE##testGroup##_##testName##_Test : public TEST_GROUP_##CppUTestGroup##testGroup \ { public: IGNORE##testGroup##_##testName##_Test () : TEST_GROUP_##CppUTestGroup##testGroup () {} \ - public: void testBody() _override; }; \ + public: void testBody() CPPUTEST_OVERRIDE; }; \ class IGNORE##testGroup##_##testName##_TestShell : public IgnoredUtestShell { \ - virtual Utest* createTest() _override { return new IGNORE##testGroup##_##testName##_Test; } \ + virtual Utest* createTest() CPPUTEST_OVERRIDE { return new IGNORE##testGroup##_##testName##_Test; } \ } IGNORE##testGroup##_##testName##_TestShell_instance; \ static TestInstaller TEST_##testGroup##testName##_Installer(IGNORE##testGroup##_##testName##_TestShell_instance, #testGroup, #testName, __FILE__,__LINE__); \ void IGNORE##testGroup##_##testName##_Test::testBody () @@ -225,10 +225,10 @@ UNSIGNED_LONGS_EQUAL_LOCATION((expected), (actual), text, __FILE__, __LINE__) #define LONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - do { UtestShell::getCurrent()->assertLongsEqual((long)expected, (long)actual, text, file, line); } while(0) + do { UtestShell::getCurrent()->assertLongsEqual((long)(expected), (long)(actual), text, file, line); } while(0) #define UNSIGNED_LONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - do { UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, text, file, line); } while(0) + do { UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)(expected), (unsigned long)(actual), text, file, line); } while(0) #if CPPUTEST_USE_LONG_LONG #define LONGLONGS_EQUAL(expected, actual)\ @@ -244,10 +244,10 @@ UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) #define LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - do { UtestShell::getCurrent()->assertLongLongsEqual((cpputest_longlong)expected, (cpputest_longlong)actual, text, file, line); } while(0) + do { UtestShell::getCurrent()->assertLongLongsEqual((cpputest_longlong)(expected), (cpputest_longlong)(actual), text, file, line); } while(0) #define UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ - do { UtestShell::getCurrent()->assertUnsignedLongLongsEqual((cpputest_ulonglong)expected, (cpputest_ulonglong)actual, text, file, line); } while(0) + do { UtestShell::getCurrent()->assertUnsignedLongLongsEqual((cpputest_ulonglong)(expected), (cpputest_ulonglong)(actual), text, file, line); } while(0) #endif // CPPUTEST_USE_LONG_LONG #define BYTES_EQUAL(expected, actual)\ @@ -275,7 +275,7 @@ POINTERS_EQUAL_LOCATION((expected), (actual), text, __FILE__, __LINE__) #define POINTERS_EQUAL_LOCATION(expected, actual, text, file, line)\ - do { UtestShell::getCurrent()->assertPointersEqual((const void *)expected, (const void *)actual, text, file, line); } while(0) + do { UtestShell::getCurrent()->assertPointersEqual((const void *)(expected), (const void *)(actual), text, file, line); } while(0) #define FUNCTIONPOINTERS_EQUAL(expected, actual)\ FUNCTIONPOINTERS_EQUAL_LOCATION((expected), (actual), NULLPTR, __FILE__, __LINE__) @@ -284,7 +284,7 @@ FUNCTIONPOINTERS_EQUAL_LOCATION((expected), (actual), text, __FILE__, __LINE__) #define FUNCTIONPOINTERS_EQUAL_LOCATION(expected, actual, text, file, line)\ - do { UtestShell::getCurrent()->assertFunctionPointersEqual((void (*)())expected, (void (*)())actual, text, file, line); } while(0) + do { UtestShell::getCurrent()->assertFunctionPointersEqual((void (*)())(expected), (void (*)())(actual), text, file, line); } while(0) //Check two doubles for equality within a tolerance threshold #define DOUBLES_EQUAL(expected, actual, threshold)\ diff --git a/include/CppUTestExt/CodeMemoryReportFormatter.h b/include/CppUTestExt/CodeMemoryReportFormatter.h index 3eae4f30b..6e87fe302 100644 --- a/include/CppUTestExt/CodeMemoryReportFormatter.h +++ b/include/CppUTestExt/CodeMemoryReportFormatter.h @@ -39,16 +39,16 @@ class CodeMemoryReportFormatter : public MemoryReportFormatter public: CodeMemoryReportFormatter(TestMemoryAllocator* internalAllocator); - virtual ~CodeMemoryReportFormatter() _destructor_override; + virtual ~CodeMemoryReportFormatter() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual void report_testgroup_start(TestResult* result, UtestShell& test) _override; - virtual void report_testgroup_end(TestResult* /*result*/, UtestShell& /*test*/) _override {} // LCOV_EXCL_LINE + virtual void report_testgroup_start(TestResult* result, UtestShell& test) CPPUTEST_OVERRIDE; + virtual void report_testgroup_end(TestResult* /*result*/, UtestShell& /*test*/) CPPUTEST_OVERRIDE {} // LCOV_EXCL_LINE - virtual void report_test_start(TestResult* result, UtestShell& test) _override; - virtual void report_test_end(TestResult* result, UtestShell& test) _override; + virtual void report_test_start(TestResult* result, UtestShell& test) CPPUTEST_OVERRIDE; + virtual void report_test_end(TestResult* result, UtestShell& test) CPPUTEST_OVERRIDE; - virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, size_t line) _override; - virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, size_t line) _override; + virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, size_t line) CPPUTEST_OVERRIDE; + virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, size_t line) CPPUTEST_OVERRIDE; private: diff --git a/include/CppUTestExt/GTest.h b/include/CppUTestExt/GTest.h index 0c2726e48..a2472d3c7 100644 --- a/include/CppUTestExt/GTest.h +++ b/include/CppUTestExt/GTest.h @@ -25,8 +25,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef GTEST__H_ -#define GTEST__H_ +#ifndef GTEST_H_ +#define GTEST_H_ #undef new #undef strdup diff --git a/include/CppUTestExt/GTestConvertor.h b/include/CppUTestExt/GTestConvertor.h index 751a38d05..fad057646 100644 --- a/include/CppUTestExt/GTestConvertor.h +++ b/include/CppUTestExt/GTestConvertor.h @@ -30,8 +30,8 @@ #include "CppUTest/Utest.h" -#ifdef GTEST__H_ -#error "Please include this file before you include any other GTest files" +#ifdef GTEST_H_ + #error "Please include this file before you include any other GTest files" #endif /* @@ -63,10 +63,11 @@ class GTestShell : public UtestShell ::testing::TestInfo* testinfo_; GTestShell* next_; GTestFlagsThatAllocateMemory* flags_; + public: GTestShell(::testing::TestInfo* testinfo, GTestShell* next, GTestFlagsThatAllocateMemory* flags); - virtual Utest* createTest() _override; + virtual Utest* createTest() CPPUTEST_OVERRIDE; GTestShell* nextGTest() { diff --git a/include/CppUTestExt/GTestSupport.h b/include/CppUTestExt/GTestSupport.h index d77bcbe2a..80892a0fa 100644 --- a/include/CppUTestExt/GTestSupport.h +++ b/include/CppUTestExt/GTestSupport.h @@ -25,8 +25,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef GTESTSUPPORT__H_ -#define GTESTSUPPORT__H_ +#ifndef GTESTSUPPORT_H_ +#define GTESTSUPPORT_H_ extern void CppuTestGTestIgnoreLeaksInTest(); diff --git a/include/CppUTestExt/IEEE754ExceptionsPlugin.h b/include/CppUTestExt/IEEE754ExceptionsPlugin.h index efedad5f4..35a18181f 100644 --- a/include/CppUTestExt/IEEE754ExceptionsPlugin.h +++ b/include/CppUTestExt/IEEE754ExceptionsPlugin.h @@ -35,8 +35,8 @@ class IEEE754ExceptionsPlugin: public TestPlugin public: IEEE754ExceptionsPlugin(const SimpleString& name = "IEEE754ExceptionsPlugin"); - virtual void preTestAction(UtestShell& test, TestResult& result) _override; - virtual void postTestAction(UtestShell& test, TestResult& result) _override; + virtual void preTestAction(UtestShell& test, TestResult& result) CPPUTEST_OVERRIDE; + virtual void postTestAction(UtestShell& test, TestResult& result) CPPUTEST_OVERRIDE; static void disableInexact(void); static void enableInexact(void); diff --git a/include/CppUTestExt/MemoryReportAllocator.h b/include/CppUTestExt/MemoryReportAllocator.h index 58111c901..2cca67e25 100644 --- a/include/CppUTestExt/MemoryReportAllocator.h +++ b/include/CppUTestExt/MemoryReportAllocator.h @@ -40,7 +40,7 @@ class MemoryReportAllocator : public TestMemoryAllocator MemoryReportFormatter* formatter_; public: MemoryReportAllocator(); - virtual ~MemoryReportAllocator() _destructor_override; + virtual ~MemoryReportAllocator() CPPUTEST_DESTRUCTOR_OVERRIDE; virtual void setFormatter(MemoryReportFormatter* formatter); virtual void setTestResult(TestResult* result); @@ -48,14 +48,14 @@ class MemoryReportAllocator : public TestMemoryAllocator virtual TestMemoryAllocator* getRealAllocator(); - virtual char* alloc_memory(size_t size, const char* file, size_t line) _override; - virtual void free_memory(char* memory, size_t size, const char* file, size_t line) _override; + virtual char* alloc_memory(size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE; + virtual void free_memory(char* memory, size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE; - virtual const char* name() const _override; - virtual const char* alloc_name() const _override; - virtual const char* free_name() const _override; + virtual const char* name() const CPPUTEST_OVERRIDE; + virtual const char* alloc_name() const CPPUTEST_OVERRIDE; + virtual const char* free_name() const CPPUTEST_OVERRIDE; - virtual TestMemoryAllocator* actualAllocator() _override; + virtual TestMemoryAllocator* actualAllocator() CPPUTEST_OVERRIDE; }; #endif diff --git a/include/CppUTestExt/MemoryReportFormatter.h b/include/CppUTestExt/MemoryReportFormatter.h index d68cf4f5a..2c7af57aa 100644 --- a/include/CppUTestExt/MemoryReportFormatter.h +++ b/include/CppUTestExt/MemoryReportFormatter.h @@ -50,16 +50,16 @@ class NormalMemoryReportFormatter : public MemoryReportFormatter { public: NormalMemoryReportFormatter(); - virtual ~NormalMemoryReportFormatter() _destructor_override; + virtual ~NormalMemoryReportFormatter() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual void report_testgroup_start(TestResult* /*result*/, UtestShell& /*test*/) _override; - virtual void report_testgroup_end(TestResult* /*result*/, UtestShell& /*test*/) _override {} // LCOV_EXCL_LINE + virtual void report_testgroup_start(TestResult* /*result*/, UtestShell& /*test*/) CPPUTEST_OVERRIDE; + virtual void report_testgroup_end(TestResult* /*result*/, UtestShell& /*test*/) CPPUTEST_OVERRIDE {} // LCOV_EXCL_LINE - virtual void report_test_start(TestResult* result, UtestShell& test) _override; - virtual void report_test_end(TestResult* result, UtestShell& test) _override; + virtual void report_test_start(TestResult* result, UtestShell& test) CPPUTEST_OVERRIDE; + virtual void report_test_end(TestResult* result, UtestShell& test) CPPUTEST_OVERRIDE; - virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, size_t line) _override; - virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, size_t line) _override; + virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t size, char* memory, const char* file, size_t line) CPPUTEST_OVERRIDE; + virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* memory, const char* file, size_t line) CPPUTEST_OVERRIDE; }; #endif diff --git a/include/CppUTestExt/MemoryReporterPlugin.h b/include/CppUTestExt/MemoryReporterPlugin.h index 1e3dffbe9..5b1816f9b 100644 --- a/include/CppUTestExt/MemoryReporterPlugin.h +++ b/include/CppUTestExt/MemoryReporterPlugin.h @@ -44,11 +44,11 @@ class MemoryReporterPlugin : public TestPlugin SimpleString currentTestGroup_; public: MemoryReporterPlugin(); - virtual ~MemoryReporterPlugin() _destructor_override; + virtual ~MemoryReporterPlugin() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual void preTestAction(UtestShell & test, TestResult & result) _override; - virtual void postTestAction(UtestShell & test, TestResult & result) _override; - virtual bool parseArguments(int, const char *const *, int) _override; + virtual void preTestAction(UtestShell & test, TestResult & result) CPPUTEST_OVERRIDE; + virtual void postTestAction(UtestShell & test, TestResult & result) CPPUTEST_OVERRIDE; + virtual bool parseArguments(int, const char *const *, int) CPPUTEST_OVERRIDE; MemoryReportAllocator* getMallocAllocator(); MemoryReportAllocator* getNewAllocator(); diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index b324ceb92..51b12e405 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -35,68 +35,68 @@ class MockCheckedActualCall : public MockActualCall { public: MockCheckedActualCall(unsigned int callOrder, MockFailureReporter* reporter, const MockExpectedCallsList& expectations); - virtual ~MockCheckedActualCall() _destructor_override; + virtual ~MockCheckedActualCall() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual MockActualCall& withName(const SimpleString& name) _override; - virtual MockActualCall& withCallOrder(unsigned int) _override; - virtual MockActualCall& withBoolParameter(const SimpleString& name, bool value) _override; - virtual MockActualCall& withIntParameter(const SimpleString& name, int value) _override; - virtual MockActualCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) _override; - virtual MockActualCall& withLongIntParameter(const SimpleString& name, long int value) _override; - virtual MockActualCall& withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) _override; - virtual MockActualCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) _override; - virtual MockActualCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) _override; - virtual MockActualCall& withDoubleParameter(const SimpleString& name, double value) _override; - virtual MockActualCall& withStringParameter(const SimpleString& name, const char* value) _override; - virtual MockActualCall& withPointerParameter(const SimpleString& name, void* value) _override; - virtual MockActualCall& withConstPointerParameter(const SimpleString& name, const void* value) _override; - virtual MockActualCall& withFunctionPointerParameter(const SimpleString& name, void (*value)()) _override; - virtual MockActualCall& withMemoryBufferParameter(const SimpleString& name, const unsigned char* value, size_t size) _override; - virtual MockActualCall& withParameterOfType(const SimpleString& type, const SimpleString& name, const void* value) _override; - virtual MockActualCall& withOutputParameter(const SimpleString& name, void* output) _override; - virtual MockActualCall& withOutputParameterOfType(const SimpleString& type, const SimpleString& name, void* output) _override; + virtual MockActualCall& withName(const SimpleString& name) CPPUTEST_OVERRIDE; + virtual MockActualCall& withCallOrder(unsigned int) CPPUTEST_OVERRIDE; + virtual MockActualCall& withBoolParameter(const SimpleString& name, bool value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withIntParameter(const SimpleString& name, int value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withLongIntParameter(const SimpleString& name, long int value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withDoubleParameter(const SimpleString& name, double value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withStringParameter(const SimpleString& name, const char* value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withPointerParameter(const SimpleString& name, void* value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withConstPointerParameter(const SimpleString& name, const void* value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withFunctionPointerParameter(const SimpleString& name, void (*value)()) CPPUTEST_OVERRIDE; + virtual MockActualCall& withMemoryBufferParameter(const SimpleString& name, const unsigned char* value, size_t size) CPPUTEST_OVERRIDE; + virtual MockActualCall& withParameterOfType(const SimpleString& type, const SimpleString& name, const void* value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withOutputParameter(const SimpleString& name, void* output) CPPUTEST_OVERRIDE; + virtual MockActualCall& withOutputParameterOfType(const SimpleString& type, const SimpleString& name, void* output) CPPUTEST_OVERRIDE; - virtual bool hasReturnValue() _override; - virtual MockNamedValue returnValue() _override; + virtual bool hasReturnValue() CPPUTEST_OVERRIDE; + virtual MockNamedValue returnValue() CPPUTEST_OVERRIDE; - virtual bool returnBoolValueOrDefault(bool default_value) _override; - virtual bool returnBoolValue() _override; + virtual bool returnBoolValueOrDefault(bool default_value) CPPUTEST_OVERRIDE; + virtual bool returnBoolValue() CPPUTEST_OVERRIDE; - virtual int returnIntValueOrDefault(int default_value) _override; - virtual int returnIntValue() _override; + virtual int returnIntValueOrDefault(int default_value) CPPUTEST_OVERRIDE; + virtual int returnIntValue() CPPUTEST_OVERRIDE; - virtual unsigned long int returnUnsignedLongIntValue() _override; - virtual unsigned long int returnUnsignedLongIntValueOrDefault(unsigned long int) _override; + virtual unsigned long int returnUnsignedLongIntValue() CPPUTEST_OVERRIDE; + virtual unsigned long int returnUnsignedLongIntValueOrDefault(unsigned long int) CPPUTEST_OVERRIDE; - virtual long int returnLongIntValue() _override; - virtual long int returnLongIntValueOrDefault(long int default_value) _override; + virtual long int returnLongIntValue() CPPUTEST_OVERRIDE; + virtual long int returnLongIntValueOrDefault(long int default_value) CPPUTEST_OVERRIDE; - virtual cpputest_ulonglong returnUnsignedLongLongIntValue() _override; - virtual cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong default_value) _override; + virtual cpputest_ulonglong returnUnsignedLongLongIntValue() CPPUTEST_OVERRIDE; + virtual cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong default_value) CPPUTEST_OVERRIDE; - virtual cpputest_longlong returnLongLongIntValue() _override; - virtual cpputest_longlong returnLongLongIntValueOrDefault(cpputest_longlong default_value) _override; + virtual cpputest_longlong returnLongLongIntValue() CPPUTEST_OVERRIDE; + virtual cpputest_longlong returnLongLongIntValueOrDefault(cpputest_longlong default_value) CPPUTEST_OVERRIDE; - virtual unsigned int returnUnsignedIntValue() _override; - virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int default_value) _override; + virtual unsigned int returnUnsignedIntValue() CPPUTEST_OVERRIDE; + virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int default_value) CPPUTEST_OVERRIDE; - virtual const char * returnStringValueOrDefault(const char * default_value) _override; - virtual const char * returnStringValue() _override; + virtual const char * returnStringValueOrDefault(const char * default_value) CPPUTEST_OVERRIDE; + virtual const char * returnStringValue() CPPUTEST_OVERRIDE; - virtual double returnDoubleValue() _override; - virtual double returnDoubleValueOrDefault(double default_value) _override; + virtual double returnDoubleValue() CPPUTEST_OVERRIDE; + virtual double returnDoubleValueOrDefault(double default_value) CPPUTEST_OVERRIDE; - virtual const void * returnConstPointerValue() _override; - virtual const void * returnConstPointerValueOrDefault(const void * default_value) _override; + virtual const void * returnConstPointerValue() CPPUTEST_OVERRIDE; + virtual const void * returnConstPointerValueOrDefault(const void * default_value) CPPUTEST_OVERRIDE; - virtual void * returnPointerValue() _override; - virtual void * returnPointerValueOrDefault(void *) _override; + virtual void * returnPointerValue() CPPUTEST_OVERRIDE; + virtual void * returnPointerValueOrDefault(void *) CPPUTEST_OVERRIDE; typedef void (*FunctionPointerReturnValue)(); - virtual FunctionPointerReturnValue returnFunctionPointerValue() _override; - virtual FunctionPointerReturnValue returnFunctionPointerValueOrDefault(void (*)()) _override; + virtual FunctionPointerReturnValue returnFunctionPointerValue() CPPUTEST_OVERRIDE; + virtual FunctionPointerReturnValue returnFunctionPointerValueOrDefault(void (*)()) CPPUTEST_OVERRIDE; - virtual MockActualCall& onObject(const void* objectPtr) _override; + virtual MockActualCall& onObject(const void* objectPtr) CPPUTEST_OVERRIDE; virtual bool isFulfilled() const; virtual bool hasFailed() const; @@ -157,67 +157,67 @@ class MockActualCallTrace : public MockActualCall { public: MockActualCallTrace(); - virtual ~MockActualCallTrace() _destructor_override; + virtual ~MockActualCallTrace() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual MockActualCall& withName(const SimpleString& name) _override; - virtual MockActualCall& withCallOrder(unsigned int) _override; - virtual MockActualCall& withBoolParameter(const SimpleString& name, bool value) _override; - virtual MockActualCall& withIntParameter(const SimpleString& name, int value) _override; - virtual MockActualCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) _override; - virtual MockActualCall& withLongIntParameter(const SimpleString& name, long int value) _override; - virtual MockActualCall& withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) _override; - virtual MockActualCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) _override; - virtual MockActualCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) _override; - virtual MockActualCall& withDoubleParameter(const SimpleString& name, double value) _override; - virtual MockActualCall& withStringParameter(const SimpleString& name, const char* value) _override; - virtual MockActualCall& withPointerParameter(const SimpleString& name, void* value) _override; - virtual MockActualCall& withConstPointerParameter(const SimpleString& name, const void* value) _override; - virtual MockActualCall& withFunctionPointerParameter(const SimpleString& name, void (*value)()) _override; - virtual MockActualCall& withMemoryBufferParameter(const SimpleString& name, const unsigned char* value, size_t size) _override; - virtual MockActualCall& withParameterOfType(const SimpleString& typeName, const SimpleString& name, const void* value) _override; - virtual MockActualCall& withOutputParameter(const SimpleString& name, void* output) _override; - virtual MockActualCall& withOutputParameterOfType(const SimpleString& typeName, const SimpleString& name, void* output) _override; + virtual MockActualCall& withName(const SimpleString& name) CPPUTEST_OVERRIDE; + virtual MockActualCall& withCallOrder(unsigned int) CPPUTEST_OVERRIDE; + virtual MockActualCall& withBoolParameter(const SimpleString& name, bool value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withIntParameter(const SimpleString& name, int value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withLongIntParameter(const SimpleString& name, long int value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withDoubleParameter(const SimpleString& name, double value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withStringParameter(const SimpleString& name, const char* value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withPointerParameter(const SimpleString& name, void* value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withConstPointerParameter(const SimpleString& name, const void* value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withFunctionPointerParameter(const SimpleString& name, void (*value)()) CPPUTEST_OVERRIDE; + virtual MockActualCall& withMemoryBufferParameter(const SimpleString& name, const unsigned char* value, size_t size) CPPUTEST_OVERRIDE; + virtual MockActualCall& withParameterOfType(const SimpleString& typeName, const SimpleString& name, const void* value) CPPUTEST_OVERRIDE; + virtual MockActualCall& withOutputParameter(const SimpleString& name, void* output) CPPUTEST_OVERRIDE; + virtual MockActualCall& withOutputParameterOfType(const SimpleString& typeName, const SimpleString& name, void* output) CPPUTEST_OVERRIDE; - virtual bool hasReturnValue() _override; - virtual MockNamedValue returnValue() _override; + virtual bool hasReturnValue() CPPUTEST_OVERRIDE; + virtual MockNamedValue returnValue() CPPUTEST_OVERRIDE; - virtual bool returnBoolValueOrDefault(bool default_value) _override; - virtual bool returnBoolValue() _override; + virtual bool returnBoolValueOrDefault(bool default_value) CPPUTEST_OVERRIDE; + virtual bool returnBoolValue() CPPUTEST_OVERRIDE; - virtual int returnIntValueOrDefault(int default_value) _override; - virtual int returnIntValue() _override; + virtual int returnIntValueOrDefault(int default_value) CPPUTEST_OVERRIDE; + virtual int returnIntValue() CPPUTEST_OVERRIDE; - virtual unsigned long int returnUnsignedLongIntValue() _override; - virtual unsigned long int returnUnsignedLongIntValueOrDefault(unsigned long int) _override; + virtual unsigned long int returnUnsignedLongIntValue() CPPUTEST_OVERRIDE; + virtual unsigned long int returnUnsignedLongIntValueOrDefault(unsigned long int) CPPUTEST_OVERRIDE; - virtual long int returnLongIntValue() _override; - virtual long int returnLongIntValueOrDefault(long int default_value) _override; + virtual long int returnLongIntValue() CPPUTEST_OVERRIDE; + virtual long int returnLongIntValueOrDefault(long int default_value) CPPUTEST_OVERRIDE; - virtual cpputest_ulonglong returnUnsignedLongLongIntValue() _override; - virtual cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong default_value) _override; + virtual cpputest_ulonglong returnUnsignedLongLongIntValue() CPPUTEST_OVERRIDE; + virtual cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong default_value) CPPUTEST_OVERRIDE; - virtual cpputest_longlong returnLongLongIntValue() _override; - virtual cpputest_longlong returnLongLongIntValueOrDefault(cpputest_longlong default_value) _override; + virtual cpputest_longlong returnLongLongIntValue() CPPUTEST_OVERRIDE; + virtual cpputest_longlong returnLongLongIntValueOrDefault(cpputest_longlong default_value) CPPUTEST_OVERRIDE; - virtual unsigned int returnUnsignedIntValue() _override; - virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int default_value) _override; + virtual unsigned int returnUnsignedIntValue() CPPUTEST_OVERRIDE; + virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int default_value) CPPUTEST_OVERRIDE; - virtual const char * returnStringValueOrDefault(const char * default_value) _override; - virtual const char * returnStringValue() _override; + virtual const char * returnStringValueOrDefault(const char * default_value) CPPUTEST_OVERRIDE; + virtual const char * returnStringValue() CPPUTEST_OVERRIDE; - virtual double returnDoubleValue() _override; - virtual double returnDoubleValueOrDefault(double default_value) _override; + virtual double returnDoubleValue() CPPUTEST_OVERRIDE; + virtual double returnDoubleValueOrDefault(double default_value) CPPUTEST_OVERRIDE; - virtual void * returnPointerValue() _override; - virtual void * returnPointerValueOrDefault(void *) _override; + virtual void * returnPointerValue() CPPUTEST_OVERRIDE; + virtual void * returnPointerValueOrDefault(void *) CPPUTEST_OVERRIDE; - virtual const void * returnConstPointerValue() _override; - virtual const void * returnConstPointerValueOrDefault(const void * default_value) _override; + virtual const void * returnConstPointerValue() CPPUTEST_OVERRIDE; + virtual const void * returnConstPointerValueOrDefault(const void * default_value) CPPUTEST_OVERRIDE; - virtual MockCheckedActualCall::FunctionPointerReturnValue returnFunctionPointerValue() _override; - virtual MockCheckedActualCall::FunctionPointerReturnValue returnFunctionPointerValueOrDefault(void (*)()) _override; + virtual MockCheckedActualCall::FunctionPointerReturnValue returnFunctionPointerValue() CPPUTEST_OVERRIDE; + virtual MockCheckedActualCall::FunctionPointerReturnValue returnFunctionPointerValueOrDefault(void (*)()) CPPUTEST_OVERRIDE; - virtual MockActualCall& onObject(const void* objectPtr) _override; + virtual MockActualCall& onObject(const void* objectPtr) CPPUTEST_OVERRIDE; const char* getTraceOutput(); void clear(); @@ -235,41 +235,41 @@ class MockActualCallTrace : public MockActualCall class MockIgnoredActualCall: public MockActualCall { public: - virtual MockActualCall& withName(const SimpleString&) _override { return *this;} - virtual MockActualCall& withCallOrder(unsigned int) _override { return *this; } - virtual MockActualCall& withBoolParameter(const SimpleString&, bool) _override { return *this; } - virtual MockActualCall& withIntParameter(const SimpleString&, int) _override { return *this; } - virtual MockActualCall& withUnsignedIntParameter(const SimpleString&, unsigned int) _override { return *this; } - virtual MockActualCall& withLongIntParameter(const SimpleString&, long int) _override { return *this; } - virtual MockActualCall& withUnsignedLongIntParameter(const SimpleString&, unsigned long int) _override { return *this; } - virtual MockActualCall& withLongLongIntParameter(const SimpleString&, cpputest_longlong) _override { return *this; } - virtual MockActualCall& withUnsignedLongLongIntParameter(const SimpleString&, cpputest_ulonglong) _override { return *this; } - virtual MockActualCall& withDoubleParameter(const SimpleString&, double) _override { return *this; } - virtual MockActualCall& withStringParameter(const SimpleString&, const char*) _override { return *this; } - virtual MockActualCall& withPointerParameter(const SimpleString& , void*) _override { return *this; } - virtual MockActualCall& withConstPointerParameter(const SimpleString& , const void*) _override { return *this; } - virtual MockActualCall& withFunctionPointerParameter(const SimpleString& , void (*)()) _override { return *this; } - virtual MockActualCall& withMemoryBufferParameter(const SimpleString&, const unsigned char*, size_t) _override { return *this; } - virtual MockActualCall& withParameterOfType(const SimpleString&, const SimpleString&, const void*) _override { return *this; } - virtual MockActualCall& withOutputParameter(const SimpleString&, void*) _override { return *this; } - virtual MockActualCall& withOutputParameterOfType(const SimpleString&, const SimpleString&, void*) _override { return *this; } - - virtual bool hasReturnValue() _override { return false; } - virtual MockNamedValue returnValue() _override { return MockNamedValue(""); } - - virtual bool returnBoolValueOrDefault(bool value) _override { return value; } - virtual bool returnBoolValue() _override { return false; } - - virtual int returnIntValue() _override { return 0; } - virtual int returnIntValueOrDefault(int value) _override { return value; } - - virtual unsigned long int returnUnsignedLongIntValue() _override { return 0; } - virtual unsigned long int returnUnsignedLongIntValueOrDefault(unsigned long int value) _override { return value; } - - virtual long int returnLongIntValue() _override { return 0; } - virtual long int returnLongIntValueOrDefault(long int value) _override { return value; } - - virtual cpputest_ulonglong returnUnsignedLongLongIntValue() _override + virtual MockActualCall& withName(const SimpleString&) CPPUTEST_OVERRIDE { return *this;} + virtual MockActualCall& withCallOrder(unsigned int) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withBoolParameter(const SimpleString&, bool) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withIntParameter(const SimpleString&, int) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withUnsignedIntParameter(const SimpleString&, unsigned int) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withLongIntParameter(const SimpleString&, long int) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withUnsignedLongIntParameter(const SimpleString&, unsigned long int) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withLongLongIntParameter(const SimpleString&, cpputest_longlong) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withUnsignedLongLongIntParameter(const SimpleString&, cpputest_ulonglong) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withDoubleParameter(const SimpleString&, double) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withStringParameter(const SimpleString&, const char*) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withPointerParameter(const SimpleString& , void*) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withConstPointerParameter(const SimpleString& , const void*) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withFunctionPointerParameter(const SimpleString& , void (*)()) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withMemoryBufferParameter(const SimpleString&, const unsigned char*, size_t) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withParameterOfType(const SimpleString&, const SimpleString&, const void*) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withOutputParameter(const SimpleString&, void*) CPPUTEST_OVERRIDE { return *this; } + virtual MockActualCall& withOutputParameterOfType(const SimpleString&, const SimpleString&, void*) CPPUTEST_OVERRIDE { return *this; } + + virtual bool hasReturnValue() CPPUTEST_OVERRIDE { return false; } + virtual MockNamedValue returnValue() CPPUTEST_OVERRIDE { return MockNamedValue(""); } + + virtual bool returnBoolValueOrDefault(bool value) CPPUTEST_OVERRIDE { return value; } + virtual bool returnBoolValue() CPPUTEST_OVERRIDE { return false; } + + virtual int returnIntValue() CPPUTEST_OVERRIDE { return 0; } + virtual int returnIntValueOrDefault(int value) CPPUTEST_OVERRIDE { return value; } + + virtual unsigned long int returnUnsignedLongIntValue() CPPUTEST_OVERRIDE { return 0; } + virtual unsigned long int returnUnsignedLongIntValueOrDefault(unsigned long int value) CPPUTEST_OVERRIDE { return value; } + + virtual long int returnLongIntValue() CPPUTEST_OVERRIDE { return 0; } + virtual long int returnLongIntValueOrDefault(long int value) CPPUTEST_OVERRIDE { return value; } + + virtual cpputest_ulonglong returnUnsignedLongLongIntValue() CPPUTEST_OVERRIDE { #if CPPUTEST_USE_LONG_LONG return 0; @@ -279,9 +279,9 @@ class MockIgnoredActualCall: public MockActualCall #endif } - virtual cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong value) _override { return value; } + virtual cpputest_ulonglong returnUnsignedLongLongIntValueOrDefault(cpputest_ulonglong value) CPPUTEST_OVERRIDE { return value; } - virtual cpputest_longlong returnLongLongIntValue() _override + virtual cpputest_longlong returnLongLongIntValue() CPPUTEST_OVERRIDE { #if CPPUTEST_USE_LONG_LONG return 0; @@ -291,27 +291,27 @@ class MockIgnoredActualCall: public MockActualCall #endif } - virtual cpputest_longlong returnLongLongIntValueOrDefault(cpputest_longlong value) _override { return value; } + virtual cpputest_longlong returnLongLongIntValueOrDefault(cpputest_longlong value) CPPUTEST_OVERRIDE { return value; } - virtual unsigned int returnUnsignedIntValue() _override { return 0; } - virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int value) _override { return value; } + virtual unsigned int returnUnsignedIntValue() CPPUTEST_OVERRIDE { return 0; } + virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int value) CPPUTEST_OVERRIDE { return value; } - virtual double returnDoubleValue() _override { return 0.0; } - virtual double returnDoubleValueOrDefault(double value) _override { return value; } + virtual double returnDoubleValue() CPPUTEST_OVERRIDE { return 0.0; } + virtual double returnDoubleValueOrDefault(double value) CPPUTEST_OVERRIDE { return value; } - virtual const char * returnStringValue() _override { return ""; } - virtual const char * returnStringValueOrDefault(const char * value) _override { return value; } + virtual const char * returnStringValue() CPPUTEST_OVERRIDE { return ""; } + virtual const char * returnStringValueOrDefault(const char * value) CPPUTEST_OVERRIDE { return value; } - virtual void * returnPointerValue() _override { return NULLPTR; } - virtual void * returnPointerValueOrDefault(void * value) _override { return value; } + virtual void * returnPointerValue() CPPUTEST_OVERRIDE { return NULLPTR; } + virtual void * returnPointerValueOrDefault(void * value) CPPUTEST_OVERRIDE { return value; } - virtual const void * returnConstPointerValue() _override { return NULLPTR; } - virtual const void * returnConstPointerValueOrDefault(const void * value) _override { return value; } + virtual const void * returnConstPointerValue() CPPUTEST_OVERRIDE { return NULLPTR; } + virtual const void * returnConstPointerValueOrDefault(const void * value) CPPUTEST_OVERRIDE { return value; } - virtual MockCheckedActualCall::FunctionPointerReturnValue returnFunctionPointerValue() _override { return NULLPTR; } - virtual MockCheckedActualCall::FunctionPointerReturnValue returnFunctionPointerValueOrDefault(void (*value)()) _override { return value; } + virtual MockCheckedActualCall::FunctionPointerReturnValue returnFunctionPointerValue() CPPUTEST_OVERRIDE { return NULLPTR; } + virtual MockCheckedActualCall::FunctionPointerReturnValue returnFunctionPointerValueOrDefault(void (*value)()) CPPUTEST_OVERRIDE { return value; } - virtual MockActualCall& onObject(const void* ) _override { return *this; } + virtual MockActualCall& onObject(const void* ) CPPUTEST_OVERRIDE { return *this; } static MockIgnoredActualCall& instance(); }; diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index f77402c30..a1a87fd6e 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -37,47 +37,47 @@ class MockCheckedExpectedCall : public MockExpectedCall public: MockCheckedExpectedCall(); MockCheckedExpectedCall(unsigned int numCalls); - virtual ~MockCheckedExpectedCall() _destructor_override; - - virtual MockExpectedCall& withName(const SimpleString& name) _override; - virtual MockExpectedCall& withCallOrder(unsigned int callOrder) _override { return withCallOrder(callOrder, callOrder); } - virtual MockExpectedCall& withCallOrder(unsigned int initialCallOrder, unsigned int finalCallOrder) _override; - virtual MockExpectedCall& withBoolParameter(const SimpleString& name, bool value) _override; - virtual MockExpectedCall& withIntParameter(const SimpleString& name, int value) _override; - virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) _override; - virtual MockExpectedCall& withLongIntParameter(const SimpleString& name, long int value) _override; - virtual MockExpectedCall& withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) _override; - virtual MockExpectedCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) _override; - virtual MockExpectedCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) _override; - virtual MockExpectedCall& withDoubleParameter(const SimpleString& name, double value) _override; - virtual MockExpectedCall& withDoubleParameter(const SimpleString& name, double value, double tolerance) _override; - virtual MockExpectedCall& withStringParameter(const SimpleString& name, const char* value) _override; - virtual MockExpectedCall& withPointerParameter(const SimpleString& name, void* value) _override; - virtual MockExpectedCall& withConstPointerParameter(const SimpleString& name, const void* value) _override; - virtual MockExpectedCall& withFunctionPointerParameter(const SimpleString& name, void (*value)()) _override; - virtual MockExpectedCall& withMemoryBufferParameter(const SimpleString& name, const unsigned char* value, size_t size) _override; - virtual MockExpectedCall& withParameterOfType(const SimpleString& typeName, const SimpleString& name, const void* value) _override; - virtual MockExpectedCall& withOutputParameterReturning(const SimpleString& name, const void* value, size_t size) _override; - virtual MockExpectedCall& withOutputParameterOfTypeReturning(const SimpleString& typeName, const SimpleString& name, const void* value) _override; - virtual MockExpectedCall& withUnmodifiedOutputParameter(const SimpleString& name) _override; - virtual MockExpectedCall& ignoreOtherParameters() _override; - - virtual MockExpectedCall& andReturnValue(bool value) _override; - virtual MockExpectedCall& andReturnValue(int value) _override; - virtual MockExpectedCall& andReturnValue(unsigned int value) _override; - virtual MockExpectedCall& andReturnValue(long int value) _override; - virtual MockExpectedCall& andReturnValue(unsigned long int value) _override; - virtual MockExpectedCall& andReturnValue(cpputest_longlong value) _override; - virtual MockExpectedCall& andReturnValue(cpputest_ulonglong value) _override; - virtual MockExpectedCall& andReturnValue(double value) _override; - virtual MockExpectedCall& andReturnValue(const char* value) _override; - virtual MockExpectedCall& andReturnValue(void* value) _override; - virtual MockExpectedCall& andReturnValue(const void* value) _override; - virtual MockExpectedCall& andReturnValue(void (*value)()) _override; + virtual ~MockCheckedExpectedCall() CPPUTEST_DESTRUCTOR_OVERRIDE; + + virtual MockExpectedCall& withName(const SimpleString& name) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withCallOrder(unsigned int callOrder) CPPUTEST_OVERRIDE { return withCallOrder(callOrder, callOrder); } + virtual MockExpectedCall& withCallOrder(unsigned int initialCallOrder, unsigned int finalCallOrder) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withBoolParameter(const SimpleString& name, bool value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withIntParameter(const SimpleString& name, int value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withLongIntParameter(const SimpleString& name, long int value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withUnsignedLongIntParameter(const SimpleString& name, unsigned long int value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withLongLongIntParameter(const SimpleString& name, cpputest_longlong value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withUnsignedLongLongIntParameter(const SimpleString& name, cpputest_ulonglong value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withDoubleParameter(const SimpleString& name, double value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withDoubleParameter(const SimpleString& name, double value, double tolerance) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withStringParameter(const SimpleString& name, const char* value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withPointerParameter(const SimpleString& name, void* value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withConstPointerParameter(const SimpleString& name, const void* value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withFunctionPointerParameter(const SimpleString& name, void (*value)()) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withMemoryBufferParameter(const SimpleString& name, const unsigned char* value, size_t size) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withParameterOfType(const SimpleString& typeName, const SimpleString& name, const void* value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withOutputParameterReturning(const SimpleString& name, const void* value, size_t size) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withOutputParameterOfTypeReturning(const SimpleString& typeName, const SimpleString& name, const void* value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& withUnmodifiedOutputParameter(const SimpleString& name) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& ignoreOtherParameters() CPPUTEST_OVERRIDE; + + virtual MockExpectedCall& andReturnValue(bool value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& andReturnValue(int value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& andReturnValue(unsigned int value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& andReturnValue(long int value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& andReturnValue(unsigned long int value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& andReturnValue(cpputest_longlong value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& andReturnValue(cpputest_ulonglong value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& andReturnValue(double value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& andReturnValue(const char* value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& andReturnValue(void* value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& andReturnValue(const void* value) CPPUTEST_OVERRIDE; + virtual MockExpectedCall& andReturnValue(void (*value)()) CPPUTEST_OVERRIDE; virtual MockNamedValue returnValue(); - virtual MockExpectedCall& onObject(void* objectPtr) _override; + virtual MockExpectedCall& onObject(void* objectPtr) CPPUTEST_OVERRIDE; virtual MockNamedValue getInputParameter(const SimpleString& name); virtual MockNamedValue getOutputParameter(const SimpleString& name); @@ -151,43 +151,43 @@ class MockIgnoredExpectedCall: public MockExpectedCall { public: - virtual MockExpectedCall& withName(const SimpleString&) _override { return *this;} - virtual MockExpectedCall& withCallOrder(unsigned int) _override { return *this; } - virtual MockExpectedCall& withCallOrder(unsigned int, unsigned int) _override { return *this; } - virtual MockExpectedCall& withBoolParameter(const SimpleString&, bool) _override { return *this; } - virtual MockExpectedCall& withIntParameter(const SimpleString&, int) _override { return *this; } - virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString&, unsigned int) _override{ return *this; } - virtual MockExpectedCall& withLongIntParameter(const SimpleString&, long int) _override { return *this; } - virtual MockExpectedCall& withUnsignedLongIntParameter(const SimpleString&, unsigned long int) _override { return *this; } - virtual MockExpectedCall& withLongLongIntParameter(const SimpleString&, cpputest_longlong) _override { return *this; } - virtual MockExpectedCall& withUnsignedLongLongIntParameter(const SimpleString&, cpputest_ulonglong) _override { return *this; } - virtual MockExpectedCall& withDoubleParameter(const SimpleString&, double) _override { return *this; } - virtual MockExpectedCall& withDoubleParameter(const SimpleString&, double, double) _override { return *this; } - virtual MockExpectedCall& withStringParameter(const SimpleString&, const char*) _override { return *this; } - virtual MockExpectedCall& withPointerParameter(const SimpleString& , void*) _override { return *this; } - virtual MockExpectedCall& withConstPointerParameter(const SimpleString& , const void*) _override { return *this; } - virtual MockExpectedCall& withFunctionPointerParameter(const SimpleString& , void(*)()) _override { return *this; } - virtual MockExpectedCall& withMemoryBufferParameter(const SimpleString&, const unsigned char*, size_t) _override { return *this; } - virtual MockExpectedCall& withParameterOfType(const SimpleString&, const SimpleString&, const void*) _override { return *this; } - virtual MockExpectedCall& withOutputParameterReturning(const SimpleString&, const void*, size_t) _override { return *this; } - virtual MockExpectedCall& withOutputParameterOfTypeReturning(const SimpleString&, const SimpleString&, const void*) _override { return *this; } - virtual MockExpectedCall& withUnmodifiedOutputParameter(const SimpleString&) _override { return *this; } - virtual MockExpectedCall& ignoreOtherParameters() _override { return *this;} - - virtual MockExpectedCall& andReturnValue(bool) _override { return *this; } - virtual MockExpectedCall& andReturnValue(int) _override { return *this; } - virtual MockExpectedCall& andReturnValue(unsigned int) _override { return *this; } - virtual MockExpectedCall& andReturnValue(long int) _override { return *this; } - virtual MockExpectedCall& andReturnValue(unsigned long int) _override { return *this; } - virtual MockExpectedCall& andReturnValue(cpputest_longlong) _override { return *this; } - virtual MockExpectedCall& andReturnValue(cpputest_ulonglong) _override { return *this; } - virtual MockExpectedCall& andReturnValue(double) _override { return *this;} - virtual MockExpectedCall& andReturnValue(const char*) _override { return *this; } - virtual MockExpectedCall& andReturnValue(void*) _override { return *this; } - virtual MockExpectedCall& andReturnValue(const void*) _override { return *this; } - virtual MockExpectedCall& andReturnValue(void (*)()) _override { return *this; } - - virtual MockExpectedCall& onObject(void*) _override { return *this; } + virtual MockExpectedCall& withName(const SimpleString&) CPPUTEST_OVERRIDE { return *this;} + virtual MockExpectedCall& withCallOrder(unsigned int) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withCallOrder(unsigned int, unsigned int) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withBoolParameter(const SimpleString&, bool) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withIntParameter(const SimpleString&, int) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString&, unsigned int) CPPUTEST_OVERRIDE{ return *this; } + virtual MockExpectedCall& withLongIntParameter(const SimpleString&, long int) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withUnsignedLongIntParameter(const SimpleString&, unsigned long int) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withLongLongIntParameter(const SimpleString&, cpputest_longlong) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withUnsignedLongLongIntParameter(const SimpleString&, cpputest_ulonglong) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withDoubleParameter(const SimpleString&, double) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withDoubleParameter(const SimpleString&, double, double) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withStringParameter(const SimpleString&, const char*) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withPointerParameter(const SimpleString& , void*) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withConstPointerParameter(const SimpleString& , const void*) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withFunctionPointerParameter(const SimpleString& , void(*)()) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withMemoryBufferParameter(const SimpleString&, const unsigned char*, size_t) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withParameterOfType(const SimpleString&, const SimpleString&, const void*) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withOutputParameterReturning(const SimpleString&, const void*, size_t) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withOutputParameterOfTypeReturning(const SimpleString&, const SimpleString&, const void*) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& withUnmodifiedOutputParameter(const SimpleString&) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& ignoreOtherParameters() CPPUTEST_OVERRIDE { return *this;} + + virtual MockExpectedCall& andReturnValue(bool) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& andReturnValue(int) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& andReturnValue(unsigned int) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& andReturnValue(long int) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& andReturnValue(unsigned long int) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& andReturnValue(cpputest_longlong) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& andReturnValue(cpputest_ulonglong) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& andReturnValue(double) CPPUTEST_OVERRIDE { return *this;} + virtual MockExpectedCall& andReturnValue(const char*) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& andReturnValue(void*) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& andReturnValue(const void*) CPPUTEST_OVERRIDE { return *this; } + virtual MockExpectedCall& andReturnValue(void (*)()) CPPUTEST_OVERRIDE { return *this; } + + virtual MockExpectedCall& onObject(void*) CPPUTEST_OVERRIDE { return *this; } static MockExpectedCall& instance(); }; diff --git a/include/CppUTestExt/MockFailure.h b/include/CppUTestExt/MockFailure.h index 485d37f4e..3ee4f73d3 100644 --- a/include/CppUTestExt/MockFailure.h +++ b/include/CppUTestExt/MockFailure.h @@ -54,7 +54,7 @@ class MockFailure : public TestFailure { public: MockFailure(UtestShell* test); - virtual ~MockFailure() _destructor_override {} + virtual ~MockFailure() CPPUTEST_DESTRUCTOR_OVERRIDE {} protected: void addExpectationsAndCallHistory(const MockExpectedCallsList& expectations); void addExpectationsAndCallHistoryRelatedTo(const SimpleString& function, const MockExpectedCallsList& expectations); diff --git a/include/CppUTestExt/MockNamedValue.h b/include/CppUTestExt/MockNamedValue.h index 304d137ac..b6e5be2cc 100644 --- a/include/CppUTestExt/MockNamedValue.h +++ b/include/CppUTestExt/MockNamedValue.h @@ -69,8 +69,8 @@ class MockFunctionComparator : public MockNamedValueComparator MockFunctionComparator(isEqualFunction equal, valueToStringFunction valToString) : equal_(equal), valueToString_(valToString) {} - virtual bool isEqual(const void* object1, const void* object2) _override { return equal_(object1, object2); } - virtual SimpleString valueToString(const void* object) _override { return valueToString_(object); } + virtual bool isEqual(const void* object1, const void* object2) CPPUTEST_OVERRIDE { return equal_(object1, object2); } + virtual SimpleString valueToString(const void* object) CPPUTEST_OVERRIDE { return valueToString_(object); } private: isEqualFunction equal_; valueToStringFunction valueToString_; @@ -83,7 +83,7 @@ class MockFunctionCopier : public MockNamedValueCopier MockFunctionCopier(copyFunction copier) : copier_(copier) {} - virtual void copy(void* dst, const void* src) _override { copier_(dst, src); } + virtual void copy(void* dst, const void* src) CPPUTEST_OVERRIDE { copier_(dst, src); } private: copyFunction copier_; diff --git a/include/CppUTestExt/MockSupportPlugin.h b/include/CppUTestExt/MockSupportPlugin.h index 9de65e7ae..b77041c38 100644 --- a/include/CppUTestExt/MockSupportPlugin.h +++ b/include/CppUTestExt/MockSupportPlugin.h @@ -35,10 +35,10 @@ class MockSupportPlugin : public TestPlugin { public: MockSupportPlugin(const SimpleString& name = "MockSupportPLugin"); - virtual ~MockSupportPlugin() _destructor_override; + virtual ~MockSupportPlugin() CPPUTEST_DESTRUCTOR_OVERRIDE; - virtual void preTestAction(UtestShell&, TestResult&) _override; - virtual void postTestAction(UtestShell&, TestResult&) _override; + virtual void preTestAction(UtestShell&, TestResult&) CPPUTEST_OVERRIDE; + virtual void postTestAction(UtestShell&, TestResult&) CPPUTEST_OVERRIDE; virtual void installComparator(const SimpleString& name, MockNamedValueComparator& comparator); virtual void installCopier(const SimpleString& name, MockNamedValueCopier& copier); diff --git a/include/CppUTestExt/OrderedTest.h b/include/CppUTestExt/OrderedTest.h index 18af49309..3db756b2a 100644 --- a/include/CppUTestExt/OrderedTest.h +++ b/include/CppUTestExt/OrderedTest.h @@ -32,7 +32,7 @@ class OrderedTestShell : public UtestShell { public: OrderedTestShell(); - virtual ~OrderedTestShell() _destructor_override; + virtual ~OrderedTestShell() CPPUTEST_DESTRUCTOR_OVERRIDE; virtual OrderedTestShell* addOrderedTest(OrderedTestShell* test); virtual OrderedTestShell* getNextOrderedTest(); @@ -71,9 +71,9 @@ class OrderedTestInstaller extern TEST_##testGroup##_##testName##_TestShell TEST_##testGroup##_##testName##_Instance; \ class TEST_##testGroup##_##testName##_Test : public TEST_GROUP_##CppUTestGroup##testGroup \ { public: TEST_##testGroup##_##testName##_Test () : TEST_GROUP_##CppUTestGroup##testGroup () {} \ - void testBody() _override; }; \ + void testBody() CPPUTEST_OVERRIDE; }; \ class TEST_##testGroup##_##testName##_TestShell : public OrderedTestShell { \ - virtual Utest* createTest() _override { return new TEST_##testGroup##_##testName##_Test; } \ + virtual Utest* createTest() CPPUTEST_OVERRIDE { return new TEST_##testGroup##_##testName##_Test; } \ } TEST_##testGroup##_##testName##_Instance; \ static OrderedTestInstaller TEST_##testGroup##_##testName##_Installer(TEST_##testGroup##_##testName##_Instance, #testGroup, #testName, __FILE__,__LINE__, testLevel); \ void TEST_##testGroup##_##testName##_Test::testBody() diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 67c508830..e954d6338 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -538,11 +538,11 @@ void crash_on_allocation_number(unsigned alloc_number) class MemoryLeakWarningReporter: public MemoryLeakFailure { public: - virtual ~MemoryLeakWarningReporter() _destructor_override + virtual ~MemoryLeakWarningReporter() CPPUTEST_DESTRUCTOR_OVERRIDE { } - virtual void fail(char* fail_string) _override + virtual void fail(char* fail_string) CPPUTEST_OVERRIDE { UtestShell* currentTest = UtestShell::getCurrent(); currentTest->failWith(FailFailure(currentTest, currentTest->getName().asCharString(), currentTest->getLineNumber(), fail_string), UtestShell::getCurrentTestTerminatorWithoutExceptions()); diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index fb87c866a..eed213a4c 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -59,7 +59,7 @@ class OutsideTestRunnerUTest: public UtestShell { return defaultTestResult; } - virtual ~OutsideTestRunnerUTest() _destructor_override + virtual ~OutsideTestRunnerUTest() CPPUTEST_DESTRUCTOR_OVERRIDE { } private: diff --git a/src/CppUTestExt/MockFailure.cpp b/src/CppUTestExt/MockFailure.cpp index c4295cf05..1c0a40f4f 100644 --- a/src/CppUTestExt/MockFailure.cpp +++ b/src/CppUTestExt/MockFailure.cpp @@ -38,7 +38,7 @@ class MockFailureReporterTestTerminator : public TestTerminator { } - virtual void exitCurrentTest() const _override + virtual void exitCurrentTest() const CPPUTEST_OVERRIDE { if (crashOnFailure_) UT_CRASH(); @@ -46,7 +46,7 @@ class MockFailureReporterTestTerminator : public TestTerminator UtestShell::getCurrentTestTerminator().exitCurrentTest(); } // LCOV_EXCL_LINE - virtual ~MockFailureReporterTestTerminator() _destructor_override + virtual ~MockFailureReporterTestTerminator() CPPUTEST_DESTRUCTOR_OVERRIDE { } private: diff --git a/src/CppUTestExt/MockSupportPlugin.cpp b/src/CppUTestExt/MockSupportPlugin.cpp index 741efb920..e484c466c 100644 --- a/src/CppUTestExt/MockSupportPlugin.cpp +++ b/src/CppUTestExt/MockSupportPlugin.cpp @@ -39,12 +39,12 @@ class MockSupportPluginReporter : public MockFailureReporter { } - virtual void failTest(const MockFailure& failure) _override + virtual void failTest(const MockFailure& failure) CPPUTEST_OVERRIDE { result_.addFailure(failure); } - virtual UtestShell* getTestToFail() _override + virtual UtestShell* getTestToFail() CPPUTEST_OVERRIDE { return &test_; } diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index d88bad622..cc7c7e540 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -41,7 +41,7 @@ class MockFailureReporterTestTerminatorForInCOnlyCode : public TestTerminator { } - virtual void exitCurrentTest() const _override + virtual void exitCurrentTest() const CPPUTEST_OVERRIDE { if (crashOnFailure_) UT_CRASH(); @@ -49,7 +49,7 @@ class MockFailureReporterTestTerminatorForInCOnlyCode : public TestTerminator UtestShell::getCurrentTestTerminatorWithoutExceptions().exitCurrentTest(); } // LCOV_EXCL_LINE // LCOV_EXCL_START - virtual ~MockFailureReporterTestTerminatorForInCOnlyCode() _destructor_override + virtual ~MockFailureReporterTestTerminatorForInCOnlyCode() CPPUTEST_DESTRUCTOR_OVERRIDE { } // LCOV_EXCL_STOP @@ -61,7 +61,7 @@ class MockFailureReporterTestTerminatorForInCOnlyCode : public TestTerminator class MockFailureReporterForInCOnlyCode : public MockFailureReporter { public: - void failTest(const MockFailure& failure) _override + void failTest(const MockFailure& failure) CPPUTEST_OVERRIDE { if (!getTestToFail()->hasFailed()) getTestToFail()->failWith(failure, MockFailureReporterTestTerminatorForInCOnlyCode(crashOnFailure_)); @@ -79,13 +79,13 @@ class MockCFunctionComparatorNode : public MockNamedValueComparator public: MockCFunctionComparatorNode(MockCFunctionComparatorNode* next, MockTypeEqualFunction_c equal, MockTypeValueToStringFunction_c toString) : next_(next), equal_(equal), toString_(toString) {} - virtual ~MockCFunctionComparatorNode() _destructor_override {} + virtual ~MockCFunctionComparatorNode() CPPUTEST_DESTRUCTOR_OVERRIDE {} - virtual bool isEqual(const void* object1, const void* object2) _override + virtual bool isEqual(const void* object1, const void* object2) CPPUTEST_OVERRIDE { return equal_(object1, object2) != 0; } - virtual SimpleString valueToString(const void* object) _override + virtual SimpleString valueToString(const void* object) CPPUTEST_OVERRIDE { return SimpleString(toString_(object)); } @@ -102,9 +102,9 @@ class MockCFunctionCopierNode : public MockNamedValueCopier public: MockCFunctionCopierNode(MockCFunctionCopierNode* next, MockTypeCopyFunction_c copier) : next_(next), copier_(copier) {} - virtual ~MockCFunctionCopierNode() _destructor_override {} + virtual ~MockCFunctionCopierNode() CPPUTEST_DESTRUCTOR_OVERRIDE {} - virtual void copy(void* dst, const void* src) _override + virtual void copy(void* dst, const void* src) CPPUTEST_OVERRIDE { copier_(dst, src); } diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 257951895..143f91bd6 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -173,12 +173,12 @@ static int PlatformSpecificSetJmpImplementation(void (*function) (void* data), v } /* - * MacOSX clang 3.0 doesn't seem to recognize longjmp and thus complains about _no_return_. + * MacOSX clang 3.0 doesn't seem to recognize longjmp and thus complains about CPPUTEST_NORETURN. * The later clang compilers complain when it isn't there. So only way is to check the clang compiler here :( */ #ifdef __clang__ #if !((__clang_major__ == 3) && (__clang_minor__ == 0)) - _no_return_ + CPPUTEST_NORETURN #endif #endif static void PlatformSpecificLongJmpImplementation() diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index 775ccca7a..2aa7fbb40 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -45,7 +45,7 @@ static int VisualCppSetJmp(void (*function) (void* data), void* data) return 0; } -_no_return_ static void VisualCppLongJmp() +CPPUTEST_NORETURN static void VisualCppLongJmp() { jmp_buf_index--; longjmp(test_exit_jmp_buf[jmp_buf_index], 1); diff --git a/tests/CppUTest/AllocLetTestFreeTest.cpp b/tests/CppUTest/AllocLetTestFreeTest.cpp index 4c48ce48e..5c05464b7 100644 --- a/tests/CppUTest/AllocLetTestFreeTest.cpp +++ b/tests/CppUTest/AllocLetTestFreeTest.cpp @@ -16,12 +16,12 @@ TEST_GROUP(AllocLetTestFree) { AllocLetTestFree allocLetTestFree; - void setup() _override + void setup() CPPUTEST_OVERRIDE { allocLetTestFree = AllocLetTestFree_Create(); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { AllocLetTestFree_Destroy(allocLetTestFree); } diff --git a/tests/CppUTest/AllocationInCppFile.h b/tests/CppUTest/AllocationInCppFile.h index c7c9d1572..1d59789df 100644 --- a/tests/CppUTest/AllocationInCppFile.h +++ b/tests/CppUTest/AllocationInCppFile.h @@ -12,7 +12,7 @@ char* newArrayAllocationWithoutMacro(); class ClassThatThrowsAnExceptionInTheConstructor { public: - _no_return_ ClassThatThrowsAnExceptionInTheConstructor(); + CPPUTEST_NORETURN ClassThatThrowsAnExceptionInTheConstructor(); }; #endif diff --git a/tests/CppUTest/CheatSheetTest.cpp b/tests/CppUTest/CheatSheetTest.cpp index 1c0e4d6bf..dbde888b7 100644 --- a/tests/CppUTest/CheatSheetTest.cpp +++ b/tests/CppUTest/CheatSheetTest.cpp @@ -9,14 +9,14 @@ static void stub(){} TEST_GROUP(CheatSheet) { /* declare a setup method for the test group. Optional. */ - void setup() _override + void setup() CPPUTEST_OVERRIDE { /* Set method real_one to stub. Automatically restore in teardown */ UT_PTR_SET(real_one, stub); } /* Declare a teardown method for the test group. Optional */ - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { } }; /* Do not forget semicolumn */ diff --git a/tests/CppUTest/CommandLineArgumentsTest.cpp b/tests/CppUTest/CommandLineArgumentsTest.cpp index 6ff95ca86..2a4e29b7f 100644 --- a/tests/CppUTest/CommandLineArgumentsTest.cpp +++ b/tests/CppUTest/CommandLineArgumentsTest.cpp @@ -36,10 +36,10 @@ class OptionsPlugin: public TestPlugin TestPlugin(name) { } - ~OptionsPlugin() _destructor_override + ~OptionsPlugin() CPPUTEST_DESTRUCTOR_OVERRIDE { } - bool parseArguments(int /*ac*/, const char *const * /*av*/, int /*index*/) _override + bool parseArguments(int /*ac*/, const char *const * /*av*/, int /*index*/) CPPUTEST_OVERRIDE { return true; } @@ -50,12 +50,12 @@ TEST_GROUP(CommandLineArguments) CommandLineArguments* args; OptionsPlugin* plugin; - void setup() _override + void setup() CPPUTEST_OVERRIDE { plugin = new OptionsPlugin("options"); args = NULLPTR; } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete args; delete plugin; diff --git a/tests/CppUTest/CommandLineTestRunnerTest.cpp b/tests/CppUTest/CommandLineTestRunnerTest.cpp index 768d4ad9a..e0beed18e 100644 --- a/tests/CppUTest/CommandLineTestRunnerTest.cpp +++ b/tests/CppUTest/CommandLineTestRunnerTest.cpp @@ -46,7 +46,7 @@ class DummyPluginWhichCountsThePlugins : public TestPlugin { } - virtual bool parseArguments(int, const char *const *, int) _override + virtual bool parseArguments(int, const char *const *, int) CPPUTEST_OVERRIDE { /* Remove ourselves from the count */ amountOfPlugins = registry_->countPlugins() - 1; @@ -68,19 +68,19 @@ class CommandLineTestRunnerWithStringBufferOutput : public CommandLineTestRunner fakeConsoleOutputWhichIsReallyABuffer(NULLPTR), fakeTCOutputWhichIsReallyABuffer(NULLPTR) {} - TestOutput* createConsoleOutput() _override + TestOutput* createConsoleOutput() CPPUTEST_OVERRIDE { fakeConsoleOutputWhichIsReallyABuffer = new StringBufferTestOutput; return fakeConsoleOutputWhichIsReallyABuffer; } - TestOutput* createJUnitOutput(const SimpleString&) _override + TestOutput* createJUnitOutput(const SimpleString&) CPPUTEST_OVERRIDE { fakeJUnitOutputWhichIsReallyABuffer_ = new StringBufferTestOutput; return fakeJUnitOutputWhichIsReallyABuffer_; } - TestOutput* createTeamCityOutput() _override + TestOutput* createTeamCityOutput() CPPUTEST_OVERRIDE { fakeTCOutputWhichIsReallyABuffer = new StringBufferTestOutput; return fakeTCOutputWhichIsReallyABuffer; @@ -94,14 +94,14 @@ TEST_GROUP(CommandLineTestRunner) UtestShell *test2; DummyPluginWhichCountsThePlugins* pluginCountingPlugin; - void setup() _override + void setup() CPPUTEST_OVERRIDE { test1 = new UtestShell("group1", "test1", "file1", 1); test2 = new UtestShell("group2", "test2", "file2", 2); registry.addTest(test1); pluginCountingPlugin = new DummyPluginWhichCountsThePlugins("PluginCountingPlugin", ®istry); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete pluginCountingPlugin; delete test2; @@ -402,7 +402,7 @@ class RunIgnoredUtest : public Utest { public: static bool Checker; - void testBody() _override + void testBody() CPPUTEST_OVERRIDE { Checker = true; } @@ -415,7 +415,7 @@ class RunIgnoredUtestShell : public IgnoredUtestShell public: RunIgnoredUtestShell(const char* groupName, const char* testName, const char* fileName, size_t lineNumber) : IgnoredUtestShell(groupName, testName, fileName, lineNumber) {} - virtual Utest* createTest() _override { return new RunIgnoredUtest; } + virtual Utest* createTest() CPPUTEST_OVERRIDE { return new RunIgnoredUtest; } }; TEST_GROUP(RunIgnoredTest) @@ -424,13 +424,13 @@ TEST_GROUP(RunIgnoredTest) RunIgnoredUtestShell *runIgnoredTest; DummyPluginWhichCountsThePlugins* pluginCountingPlugin; - void setup() _override + void setup() CPPUTEST_OVERRIDE { runIgnoredTest = new RunIgnoredUtestShell("group", "test", "file", 1); registry.addTest(runIgnoredTest); pluginCountingPlugin = new DummyPluginWhichCountsThePlugins("PluginCountingPlugin", ®istry); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete pluginCountingPlugin; delete runIgnoredTest; diff --git a/tests/CppUTest/DummyMemoryLeakDetector.h b/tests/CppUTest/DummyMemoryLeakDetector.h index ee367434c..73824af27 100644 --- a/tests/CppUTest/DummyMemoryLeakDetector.h +++ b/tests/CppUTest/DummyMemoryLeakDetector.h @@ -32,7 +32,7 @@ class DummyMemoryLeakDetector : public MemoryLeakDetector { public: DummyMemoryLeakDetector(MemoryLeakFailure* reporter); - virtual ~DummyMemoryLeakDetector() _destructor_override; + virtual ~DummyMemoryLeakDetector() CPPUTEST_DESTRUCTOR_OVERRIDE; static bool wasDeleted(); private: @@ -44,9 +44,9 @@ class DummyMemoryLeakFailure : public MemoryLeakFailure public: DummyMemoryLeakFailure(); - virtual ~DummyMemoryLeakFailure() _destructor_override; + virtual ~DummyMemoryLeakFailure() CPPUTEST_DESTRUCTOR_OVERRIDE; static bool wasDeleted(); - virtual void fail(char*) _override; + virtual void fail(char*) CPPUTEST_OVERRIDE; private: static bool memoryLeakFailureWasDelete; diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index 9f8ad2e26..238963049 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -336,7 +336,7 @@ TEST_GROUP(JUnitOutputTest) JUnitTestOutputTestRunner *testCaseRunner; FileForJUnitOutputTests* outputFile; - void setup() _override + void setup() CPPUTEST_OVERRIDE { UT_PTR_SET(PlatformSpecificFOpen, mockFOpen); UT_PTR_SET(PlatformSpecificFPuts, mockFPuts); @@ -346,7 +346,7 @@ TEST_GROUP(JUnitOutputTest) testCaseRunner = new JUnitTestOutputTestRunner(*result); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete testCaseRunner; delete result; diff --git a/tests/CppUTest/MemoryLeakDetectorTest.cpp b/tests/CppUTest/MemoryLeakDetectorTest.cpp index 1a5c70b59..825ed312e 100644 --- a/tests/CppUTest/MemoryLeakDetectorTest.cpp +++ b/tests/CppUTest/MemoryLeakDetectorTest.cpp @@ -33,11 +33,11 @@ class MemoryLeakFailureForTest: public MemoryLeakFailure { public: - virtual ~MemoryLeakFailureForTest() _destructor_override + virtual ~MemoryLeakFailureForTest() CPPUTEST_DESTRUCTOR_OVERRIDE { } - virtual void fail(char* fail_string) _override + virtual void fail(char* fail_string) CPPUTEST_OVERRIDE { *message = fail_string; } @@ -56,12 +56,12 @@ class NewAllocatorForMemoryLeakDetectionTest: public TestMemoryAllocator int alloc_called; int free_called; - char* alloc_memory(size_t size, const char*, size_t) _override + char* alloc_memory(size_t size, const char*, size_t) CPPUTEST_OVERRIDE { alloc_called++; return TestMemoryAllocator::alloc_memory(size, "file", 1); } - void free_memory(char* memory, size_t size, const char* file, size_t line) _override + void free_memory(char* memory, size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE { free_called++; TestMemoryAllocator::free_memory(memory, size, file, line); @@ -81,24 +81,24 @@ class AllocatorForMemoryLeakDetectionTest: public TestMemoryAllocator int allocMemoryLeakNodeCalled; int freeMemoryLeakNodeCalled; - char* alloc_memory(size_t size, const char* file, size_t line) _override + char* alloc_memory(size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE { alloc_called++; return TestMemoryAllocator::alloc_memory(size, file, line); } - void free_memory(char* memory, size_t size, const char* file, size_t line) _override + void free_memory(char* memory, size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE { free_called++; TestMemoryAllocator::free_memory(memory, size, file, line); } - char* allocMemoryLeakNode(size_t size) _override + char* allocMemoryLeakNode(size_t size) CPPUTEST_OVERRIDE { allocMemoryLeakNodeCalled++; return TestMemoryAllocator::alloc_memory(size, __FILE__, __LINE__); } - void freeMemoryLeakNode(char* memory) _override + void freeMemoryLeakNode(char* memory) CPPUTEST_OVERRIDE { freeMemoryLeakNodeCalled++; TestMemoryAllocator::free_memory(memory, 0, __FILE__, __LINE__); @@ -111,7 +111,7 @@ TEST_GROUP(MemoryLeakDetectorTest) MemoryLeakFailureForTest *reporter; AllocatorForMemoryLeakDetectionTest* testAllocator; - void setup() _override + void setup() CPPUTEST_OVERRIDE { reporter = new MemoryLeakFailureForTest; detector = new MemoryLeakDetector(reporter); @@ -120,7 +120,7 @@ TEST_GROUP(MemoryLeakDetectorTest) detector->startChecking(); reporter->message = new SimpleString(); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete reporter->message; delete detector; diff --git a/tests/CppUTest/MemoryLeakWarningTest.cpp b/tests/CppUTest/MemoryLeakWarningTest.cpp index f1af41946..d4a6ea6fc 100644 --- a/tests/CppUTest/MemoryLeakWarningTest.cpp +++ b/tests/CppUTest/MemoryLeakWarningTest.cpp @@ -74,7 +74,7 @@ TEST_GROUP(MemoryLeakWarningTest) DummyMemoryLeakFailure dummy; TestTestingFixture* fixture; - void setup() _override + void setup() CPPUTEST_OVERRIDE { fixture = new TestTestingFixture(); detector = new MemoryLeakDetector(&dummy); @@ -87,7 +87,7 @@ TEST_GROUP(MemoryLeakWarningTest) leak2 = NULLPTR; } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { detector->deallocMemory(allocator, leak1); detector->deallocMemory(allocator, leak2); @@ -195,7 +195,7 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) cpputestHasCrashed = true; } - void setup() _override + void setup() CPPUTEST_OVERRIDE { memoryAllocatorStash.save(); detector = MemoryLeakWarningPlugin::getGlobalDetector(); @@ -210,7 +210,7 @@ TEST_GROUP(MemoryLeakWarningGlobalDetectorTest) cpputestHasCrashed = false; } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { MemoryLeakWarningPlugin::restoreNewDeleteOverloads(); @@ -407,7 +407,7 @@ static void StubMutexUnlock(PlatformSpecificMutex) TEST_GROUP(MemoryLeakWarningThreadSafe) { - void setup() _override + void setup() CPPUTEST_OVERRIDE { UT_PTR_SET(PlatformSpecificMutexLock, StubMutexLock); UT_PTR_SET(PlatformSpecificMutexUnlock, StubMutexUnlock); @@ -416,7 +416,7 @@ TEST_GROUP(MemoryLeakWarningThreadSafe) mutexUnlockCount = 0; } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { } }; diff --git a/tests/CppUTest/MemoryOperatorOverloadTest.cpp b/tests/CppUTest/MemoryOperatorOverloadTest.cpp index ba61ee89e..df4b212d5 100644 --- a/tests/CppUTest/MemoryOperatorOverloadTest.cpp +++ b/tests/CppUTest/MemoryOperatorOverloadTest.cpp @@ -56,7 +56,7 @@ TEST(BasicBehavior, bothMallocAndFreeAreOverloaded) TEST_GROUP(MemoryLeakOverridesToBeUsedInProductionCode) { MemoryLeakDetector* memLeakDetector; - void setup() _override + void setup() CPPUTEST_OVERRIDE { memLeakDetector = MemoryLeakWarningPlugin::getGlobalDetector(); } @@ -308,7 +308,7 @@ TEST_GROUP(OutOfMemoryTestsForOperatorNew) { TestMemoryAllocator* no_memory_allocator; GlobalMemoryAllocatorStash memoryAllocatorStash; - void setup() _override + void setup() CPPUTEST_OVERRIDE { memoryAllocatorStash.save(); no_memory_allocator = new NullUnknownAllocator; @@ -316,7 +316,7 @@ TEST_GROUP(OutOfMemoryTestsForOperatorNew) setCurrentNewArrayAllocator(no_memory_allocator); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { memoryAllocatorStash.restore(); delete no_memory_allocator; diff --git a/tests/CppUTest/PluginTest.cpp b/tests/CppUTest/PluginTest.cpp index f4147e77c..c9b74fd07 100644 --- a/tests/CppUTest/PluginTest.cpp +++ b/tests/CppUTest/PluginTest.cpp @@ -44,13 +44,13 @@ class DummyPlugin: public TestPlugin { } - virtual void preTestAction(UtestShell&, TestResult&) _override + virtual void preTestAction(UtestShell&, TestResult&) CPPUTEST_OVERRIDE { preAction++; preActionSequence = sequenceNumber++; } - virtual void postTestAction(UtestShell&, TestResult&) _override + virtual void postTestAction(UtestShell&, TestResult&) CPPUTEST_OVERRIDE { postAction++; postActionSequence = sequenceNumber++; @@ -70,7 +70,7 @@ class DummyPluginWhichAcceptsParameters: public DummyPlugin { } - virtual bool parseArguments(int ac, const char *const *av, int index) _override + virtual bool parseArguments(int ac, const char *const *av, int index) CPPUTEST_OVERRIDE { SimpleString argument (av[index]); if (argument == "-paccept") @@ -88,7 +88,7 @@ TEST_GROUP(PluginTest) TestTestingFixture *genFixture; TestRegistry* registry; - void setup() _override + void setup() CPPUTEST_OVERRIDE { firstPlugin = new DummyPlugin(GENERIC_PLUGIN); secondPlugin = new DummyPluginWhichAcceptsParameters(GENERIC_PLUGIN2); @@ -99,7 +99,7 @@ TEST_GROUP(PluginTest) sequenceNumber = 1; } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete firstPlugin; delete secondPlugin; diff --git a/tests/CppUTest/SetPluginTest.cpp b/tests/CppUTest/SetPluginTest.cpp index 33e0324b4..d55b91dfb 100644 --- a/tests/CppUTest/SetPluginTest.cpp +++ b/tests/CppUTest/SetPluginTest.cpp @@ -29,7 +29,7 @@ TEST_GROUP(SetPointerPluginTest) StringBufferTestOutput* output_; TestResult* result_; - void setup() _override + void setup() CPPUTEST_OVERRIDE { myRegistry_ = new TestRegistry(); plugin_ = new SetPointerPlugin("TestSetPlugin"); @@ -39,7 +39,7 @@ TEST_GROUP(SetPointerPluginTest) result_ = new TestResult(*output_); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { myRegistry_->setCurrentRegistry(NULLPTR); delete myRegistry_; @@ -52,13 +52,13 @@ TEST_GROUP(SetPointerPluginTest) class FunctionPointerUtest : public Utest { public: - void setup() _override + void setup() CPPUTEST_OVERRIDE { UT_PTR_SET(fp1, stub_func1); UT_PTR_SET(fp2, stub_func2); UT_PTR_SET(fp2, stub_func2); } - void testBody() _override + void testBody() CPPUTEST_OVERRIDE { CHECK(fp1 == stub_func1); CHECK(fp2 == stub_func2); @@ -68,7 +68,7 @@ class FunctionPointerUtest : public Utest class FunctionPointerUtestShell: public UtestShell { public: - virtual Utest* createTest() _override + virtual Utest* createTest() CPPUTEST_OVERRIDE { return new FunctionPointerUtest(); } @@ -98,7 +98,7 @@ class MaxFunctionPointerUtest : public Utest { } - void setup() _override + void setup() CPPUTEST_OVERRIDE { for (int i = 0; i < numOfFpSets; ++i) { @@ -116,7 +116,7 @@ class MaxFunctionPointerUtestShell: public UtestShell { } - virtual Utest* createTest() _override + virtual Utest* createTest() CPPUTEST_OVERRIDE { return new MaxFunctionPointerUtest(numOfFpSets); } @@ -140,11 +140,11 @@ static double stub_double = 4.0; class SetDoublePointerUtest : public Utest { public: - void setup() _override + void setup() CPPUTEST_OVERRIDE { UT_PTR_SET(orig_double_ptr, &stub_double); } - void testBody() _override + void testBody() CPPUTEST_OVERRIDE { CHECK(orig_double_ptr == &stub_double); } @@ -153,7 +153,7 @@ class SetDoublePointerUtest : public Utest class SetDoublePointerUtestShell: public UtestShell { public: - Utest * createTest() _override + Utest * createTest() CPPUTEST_OVERRIDE { return new SetDoublePointerUtest(); } diff --git a/tests/CppUTest/SimpleMutexTest.cpp b/tests/CppUTest/SimpleMutexTest.cpp index 64c2ecd15..19eeae935 100644 --- a/tests/CppUTest/SimpleMutexTest.cpp +++ b/tests/CppUTest/SimpleMutexTest.cpp @@ -59,7 +59,7 @@ static void StubMutexDestroy(PlatformSpecificMutex) TEST_GROUP(SimpleMutexTest) { - void setup() _override + void setup() CPPUTEST_OVERRIDE { UT_PTR_SET(PlatformSpecificMutexCreate, StubMutexCreate); UT_PTR_SET(PlatformSpecificMutexLock, StubMutexLock); @@ -72,7 +72,7 @@ TEST_GROUP(SimpleMutexTest) mutexUnlockCount = 0; } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { } }; diff --git a/tests/CppUTest/SimpleStringCacheTest.cpp b/tests/CppUTest/SimpleStringCacheTest.cpp index 1f7a7beff..3fd98ab4f 100644 --- a/tests/CppUTest/SimpleStringCacheTest.cpp +++ b/tests/CppUTest/SimpleStringCacheTest.cpp @@ -36,7 +36,7 @@ class TestFunctionWithCache : public ExecFunction SimpleStringInternalCache* parameter; size_t allocationSize; - void exec() _override + void exec() CPPUTEST_OVERRIDE { testFunction(parameter, allocationSize); } @@ -52,7 +52,7 @@ TEST_GROUP(SimpleStringInternalCache) TestFunctionWithCache testFunction; TestTestingFixture fixture; - void setup() _override + void setup() CPPUTEST_OVERRIDE { fixture.setTestFunction(&testFunction); testFunction.parameter = &cache; @@ -62,7 +62,7 @@ TEST_GROUP(SimpleStringInternalCache) cache.setAllocator(defaultAllocator); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { cache.clearAllIncludingCurrentlyUsedMemory(); accountant.clear(); @@ -330,13 +330,13 @@ TEST_GROUP(SimpleStringCacheAllocator) MemoryAccountant accountant; AccountingTestMemoryAllocator* accountingAllocator; - void setup() _override + void setup() CPPUTEST_OVERRIDE { accountingAllocator = new AccountingTestMemoryAllocator(accountant, defaultMallocAllocator()); allocator = new SimpleStringCacheAllocator(cache, accountingAllocator); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { cache.clearCache(); delete allocator; diff --git a/tests/CppUTest/SimpleStringTest.cpp b/tests/CppUTest/SimpleStringTest.cpp index 64ae70558..7a4e7629e 100644 --- a/tests/CppUTest/SimpleStringTest.cpp +++ b/tests/CppUTest/SimpleStringTest.cpp @@ -35,13 +35,13 @@ class JustUseNewStringAllocator : public TestMemoryAllocator { public: - virtual ~JustUseNewStringAllocator() _destructor_override {} + virtual ~JustUseNewStringAllocator() CPPUTEST_DESTRUCTOR_OVERRIDE {} - char* alloc_memory(size_t size, const char* file, size_t line) _override + char* alloc_memory(size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE { return MemoryLeakWarningPlugin::getGlobalDetector()->allocMemory(getCurrentNewArrayAllocator(), size, file, line); } - void free_memory(char* str, size_t, const char* file, size_t line) _override + void free_memory(char* str, size_t, const char* file, size_t line) CPPUTEST_OVERRIDE { MemoryLeakWarningPlugin::getGlobalDetector()->deallocMemory(getCurrentNewArrayAllocator(), str, file, line); } @@ -54,7 +54,7 @@ class GlobalSimpleStringMemoryAccountantExecFunction void (*testFunction_)(GlobalSimpleStringMemoryAccountant*); GlobalSimpleStringMemoryAccountant* parameter_; - virtual void exec() _override + virtual void exec() CPPUTEST_OVERRIDE { testFunction_(parameter_); } @@ -67,14 +67,14 @@ TEST_GROUP(GlobalSimpleStringMemoryAccountant) TestTestingFixture fixture; GlobalSimpleStringMemoryAccountant accountant; - void setup() _override + void setup() CPPUTEST_OVERRIDE { stash.save(); testFunction.parameter_ = &accountant; fixture.setTestFunction(&testFunction); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { stash.restore(); } @@ -157,12 +157,12 @@ TEST_GROUP(SimpleString) { JustUseNewStringAllocator justNewForSimpleStringTestAllocator; GlobalSimpleStringAllocatorStash stash; - void setup() _override + void setup() CPPUTEST_OVERRIDE { stash.save(); SimpleString::setStringAllocator(&justNewForSimpleStringTestAllocator); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { stash.restore(); } @@ -178,10 +178,10 @@ class MyOwnStringAllocator : public TestMemoryAllocator { public: MyOwnStringAllocator() : memoryWasAllocated(false) {} - virtual ~MyOwnStringAllocator() _destructor_override {} + virtual ~MyOwnStringAllocator() CPPUTEST_DESTRUCTOR_OVERRIDE {} bool memoryWasAllocated; - char* alloc_memory(size_t size, const char* file, size_t line) _override + char* alloc_memory(size_t size, const char* file, size_t line) CPPUTEST_OVERRIDE { memoryWasAllocated = true; return TestMemoryAllocator::alloc_memory(size, file, line); diff --git a/tests/CppUTest/TeamCityOutputTest.cpp b/tests/CppUTest/TeamCityOutputTest.cpp index 04ef60294..36ee135f5 100644 --- a/tests/CppUTest/TeamCityOutputTest.cpp +++ b/tests/CppUTest/TeamCityOutputTest.cpp @@ -9,16 +9,16 @@ class TeamCityOutputToBuffer : public TeamCityTestOutput { } - virtual ~TeamCityOutputToBuffer() _destructor_override + virtual ~TeamCityOutputToBuffer() CPPUTEST_DESTRUCTOR_OVERRIDE { } - void printBuffer(const char* s) _override + void printBuffer(const char* s) CPPUTEST_OVERRIDE { output += s; } - void flush() _override + void flush() CPPUTEST_OVERRIDE { output = ""; } @@ -51,7 +51,7 @@ TEST_GROUP(TeamCityOutputTest) TestFailure *f, *f2, *f3; TestResult* result; - void setup() _override + void setup() CPPUTEST_OVERRIDE { mock = new TeamCityOutputToBuffer(); tcout = mock; @@ -64,7 +64,7 @@ TEST_GROUP(TeamCityOutputTest) millisTime = 0; UT_PTR_SET(GetPlatformSpecificTimeInMillis, MockGetPlatformSpecificTimeInMillis); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete tcout; delete tst; diff --git a/tests/CppUTest/TestFailureNaNTest.cpp b/tests/CppUTest/TestFailureNaNTest.cpp index 17b922d78..2f7e2a62f 100644 --- a/tests/CppUTest/TestFailureNaNTest.cpp +++ b/tests/CppUTest/TestFailureNaNTest.cpp @@ -45,11 +45,11 @@ TEST_GROUP(TestFailureNanAndInf) { UtestShell* test; - void setup() _override + void setup() CPPUTEST_OVERRIDE { test = new UtestShell("groupname", "testname", failFileName, failLineNumber-1); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete test; } diff --git a/tests/CppUTest/TestFailureTest.cpp b/tests/CppUTest/TestFailureTest.cpp index 82040b069..6a7cb1516 100644 --- a/tests/CppUTest/TestFailureTest.cpp +++ b/tests/CppUTest/TestFailureTest.cpp @@ -38,11 +38,11 @@ TEST_GROUP(TestFailure) { UtestShell* test; - void setup() _override + void setup() CPPUTEST_OVERRIDE { test = new UtestShell("groupname", "testname", failFileName, failLineNumber-1); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete test; } diff --git a/tests/CppUTest/TestInstallerTest.cpp b/tests/CppUTest/TestInstallerTest.cpp index 2e6b04507..da59f322d 100644 --- a/tests/CppUTest/TestInstallerTest.cpp +++ b/tests/CppUTest/TestInstallerTest.cpp @@ -42,13 +42,13 @@ TEST_GROUP(TestInstaller) TestInstaller* testInstaller; TestRegistry* myRegistry; TestInstallerTestUtestShell shell; - void setup() _override + void setup() CPPUTEST_OVERRIDE { myRegistry = new TestRegistry(); myRegistry->setCurrentRegistry(myRegistry); testInstaller = new TestInstaller(shell, "TestInstaller", "test", __FILE__, __LINE__); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { myRegistry->setCurrentRegistry(NULLPTR); testInstaller->unDo(); diff --git a/tests/CppUTest/TestMemoryAllocatorTest.cpp b/tests/CppUTest/TestMemoryAllocatorTest.cpp index 1f3d93328..1f2e86618 100644 --- a/tests/CppUTest/TestMemoryAllocatorTest.cpp +++ b/tests/CppUTest/TestMemoryAllocatorTest.cpp @@ -36,13 +36,13 @@ TEST_GROUP(TestMemoryAllocatorTest) TestMemoryAllocator* allocator; GlobalMemoryAllocatorStash memoryAllocatorStash; - void setup() _override + void setup() CPPUTEST_OVERRIDE { allocator = NULLPTR; memoryAllocatorStash.save(); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { memoryAllocatorStash.restore(); delete allocator; @@ -149,12 +149,12 @@ TEST_GROUP(MemoryLeakAllocator) { MemoryLeakAllocator* allocator; - void setup() _override + void setup() CPPUTEST_OVERRIDE { allocator = new MemoryLeakAllocator(defaultMallocAllocator()); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete allocator; } @@ -198,13 +198,13 @@ class FailableMemoryAllocatorExecFunction : public ExecFunction FailableMemoryAllocator* allocator_; void (*testFunction_)(FailableMemoryAllocator*); - void exec() _override + void exec() CPPUTEST_OVERRIDE { testFunction_(allocator_); } FailableMemoryAllocatorExecFunction() : allocator_(NULLPTR), testFunction_(NULLPTR) {} - virtual ~FailableMemoryAllocatorExecFunction() _destructor_override {} + virtual ~FailableMemoryAllocatorExecFunction() CPPUTEST_DESTRUCTOR_OVERRIDE {} }; TEST_GROUP(FailableMemoryAllocator) @@ -214,14 +214,14 @@ TEST_GROUP(FailableMemoryAllocator) TestTestingFixture fixture; GlobalMemoryAllocatorStash stash; - void setup() _override + void setup() CPPUTEST_OVERRIDE { stash.save(); testFunction.allocator_ = failableMallocAllocator = new FailableMemoryAllocator("Failable Malloc Allocator", "malloc", "free"); fixture.setTestFunction(&testFunction); setCurrentMallocAllocator(failableMallocAllocator); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { failableMallocAllocator->checkAllFailedAllocsWereDone(); failableMallocAllocator->clearFailedAllocs(); @@ -332,14 +332,14 @@ class MemoryAccountantExecFunction : public ExecFunction { public: - virtual ~MemoryAccountantExecFunction() _destructor_override + virtual ~MemoryAccountantExecFunction() CPPUTEST_DESTRUCTOR_OVERRIDE { } void (*testFunction_)(MemoryAccountant*); MemoryAccountant* parameter_; - virtual void exec() _override + virtual void exec() CPPUTEST_OVERRIDE { testFunction_(parameter_); } @@ -351,13 +351,13 @@ TEST_GROUP(TestMemoryAccountant) TestTestingFixture fixture; MemoryAccountantExecFunction testFunction; - void setup() _override + void setup() CPPUTEST_OVERRIDE { testFunction.parameter_ = &accountant; fixture.setTestFunction(&testFunction); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { accountant.clear(); } @@ -545,12 +545,12 @@ TEST_GROUP(AccountingTestMemoryAllocator) MemoryAccountant accountant; AccountingTestMemoryAllocator *allocator; - void setup() _override + void setup() CPPUTEST_OVERRIDE { allocator = new AccountingTestMemoryAllocator(accountant, getCurrentMallocAllocator()); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { accountant.clear(); delete allocator; @@ -615,7 +615,7 @@ class GlobalMemoryAccountantExecFunction void (*testFunction_)(GlobalMemoryAccountant*); GlobalMemoryAccountant* parameter_; - virtual void exec() _override + virtual void exec() CPPUTEST_OVERRIDE { testFunction_(parameter_); } @@ -628,14 +628,14 @@ TEST_GROUP(GlobalMemoryAccountant) GlobalMemoryAccountantExecFunction testFunction; GlobalMemoryAllocatorStash stash; - void setup() _override + void setup() CPPUTEST_OVERRIDE { testFunction.parameter_ = &accountant; fixture.setTestFunction(&testFunction); stash.save(); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { stash.restore(); } diff --git a/tests/CppUTest/TestOutputTest.cpp b/tests/CppUTest/TestOutputTest.cpp index 1ed4cf18b..bde55df4f 100644 --- a/tests/CppUTest/TestOutputTest.cpp +++ b/tests/CppUTest/TestOutputTest.cpp @@ -51,7 +51,7 @@ TEST_GROUP(TestOutput) TestFailure *f3; TestResult* result; - void setup() _override + void setup() CPPUTEST_OVERRIDE { mock = new StringBufferTestOutput(); printer = mock; @@ -66,7 +66,7 @@ TEST_GROUP(TestOutput) TestOutput::setWorkingEnvironment(TestOutput::eclipse); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { TestOutput::setWorkingEnvironment(TestOutput::detectEnvironment); delete printer; @@ -285,32 +285,32 @@ TEST(TestOutput, printTestsEndedWithNoTestsRunOrIgnored) class CompositeTestOutputTestStringBufferTestOutput : public StringBufferTestOutput { public: - virtual void printTestsStarted() _override + virtual void printTestsStarted() CPPUTEST_OVERRIDE { output += "Test Start\n"; } - virtual void printTestsEnded(const TestResult& result) _override + virtual void printTestsEnded(const TestResult& result) CPPUTEST_OVERRIDE { output += StringFromFormat("Test End %d\n", (int) result.getTestCount()); } - void printCurrentGroupStarted(const UtestShell& test) _override + void printCurrentGroupStarted(const UtestShell& test) CPPUTEST_OVERRIDE { output += StringFromFormat("Group %s Start\n", test.getGroup().asCharString()); } - void printCurrentGroupEnded(const TestResult& res) _override + void printCurrentGroupEnded(const TestResult& res) CPPUTEST_OVERRIDE { output += StringFromFormat("Group End %d\n", (int) res.getTestCount()); } - virtual void printCurrentTestStarted(const UtestShell&) _override + virtual void printCurrentTestStarted(const UtestShell&) CPPUTEST_OVERRIDE { output += "s"; } - void flush() _override + void flush() CPPUTEST_OVERRIDE { output += "flush"; } @@ -339,7 +339,7 @@ TEST_GROUP(CompositeTestOutput) TestResult* result; UtestShell* test; - void setup() _override + void setup() CPPUTEST_OVERRIDE { output1 = new CompositeTestOutputTestStringBufferTestOutput; output2 = new CompositeTestOutputTestStringBufferTestOutput; @@ -349,7 +349,7 @@ TEST_GROUP(CompositeTestOutput) test = new UtestShell("Group", "Name", "file", 10); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete test; delete result; diff --git a/tests/CppUTest/TestRegistryTest.cpp b/tests/CppUTest/TestRegistryTest.cpp index f96b9edef..45d3eb309 100644 --- a/tests/CppUTest/TestRegistryTest.cpp +++ b/tests/CppUTest/TestRegistryTest.cpp @@ -42,7 +42,7 @@ class MockTest: public UtestShell UtestShell(group, "Name", "File", testLineNumber), hasRun_(false) { } - virtual void runOneTest(TestPlugin*, TestResult&) _override + virtual void runOneTest(TestPlugin*, TestResult&) CPPUTEST_OVERRIDE { hasRun_ = true; } @@ -67,7 +67,7 @@ class MockTestResult: public TestResult resetCount(); } - virtual ~MockTestResult() _destructor_override + virtual ~MockTestResult() CPPUTEST_DESTRUCTOR_OVERRIDE { } @@ -81,27 +81,27 @@ class MockTestResult: public TestResult countCurrentGroupEnded = 0; } - virtual void testsStarted() _override + virtual void testsStarted() CPPUTEST_OVERRIDE { countTestsStarted++; } - virtual void testsEnded() _override + virtual void testsEnded() CPPUTEST_OVERRIDE { countTestsEnded++; } - virtual void currentTestStarted(UtestShell* /*test*/) _override + virtual void currentTestStarted(UtestShell* /*test*/) CPPUTEST_OVERRIDE { countCurrentTestStarted++; } - virtual void currentTestEnded(UtestShell* /*test*/) _override + virtual void currentTestEnded(UtestShell* /*test*/) CPPUTEST_OVERRIDE { countCurrentTestEnded++; } - virtual void currentGroupStarted(UtestShell* /*test*/) _override + virtual void currentGroupStarted(UtestShell* /*test*/) CPPUTEST_OVERRIDE { countCurrentGroupStarted++; } - virtual void currentGroupEnded(UtestShell* /*test*/) _override + virtual void currentGroupEnded(UtestShell* /*test*/) CPPUTEST_OVERRIDE { countCurrentGroupEnded++; } @@ -118,7 +118,7 @@ TEST_GROUP(TestRegistry) MockTest* test4; TestResult *result; MockTestResult *mockResult; - void setup() _override + void setup() CPPUTEST_OVERRIDE { output = new StringBufferTestOutput(); mockResult = new MockTestResult(*output); @@ -131,7 +131,7 @@ TEST_GROUP(TestRegistry) myRegistry->setCurrentRegistry(myRegistry); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { myRegistry->setCurrentRegistry(NULLPTR); delete myRegistry; @@ -312,9 +312,9 @@ class MyTestPluginDummy: public TestPlugin { public: MyTestPluginDummy(const SimpleString& name) : TestPlugin(name) {} - virtual ~MyTestPluginDummy() _destructor_override {} - virtual void runAllPreTestAction(UtestShell&, TestResult&) _override {} - virtual void runAllPostTestAction(UtestShell&, TestResult&) _override {} + virtual ~MyTestPluginDummy() CPPUTEST_DESTRUCTOR_OVERRIDE {} + virtual void runAllPreTestAction(UtestShell&, TestResult&) CPPUTEST_OVERRIDE {} + virtual void runAllPostTestAction(UtestShell&, TestResult&) CPPUTEST_OVERRIDE {} }; TEST(TestRegistry, ResetPluginsWorks) diff --git a/tests/CppUTest/TestResultTest.cpp b/tests/CppUTest/TestResultTest.cpp index 18ae746db..a2bd497ba 100644 --- a/tests/CppUTest/TestResultTest.cpp +++ b/tests/CppUTest/TestResultTest.cpp @@ -45,14 +45,14 @@ TEST_GROUP(TestResult) TestResult* res; - void setup() _override + void setup() CPPUTEST_OVERRIDE { mock = new StringBufferTestOutput(); printer = mock; res = new TestResult(*printer); UT_PTR_SET(GetPlatformSpecificTimeInMillis, MockGetPlatformSpecificTimeInMillis); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete printer; delete res; diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index b9ca07c80..f1fa6f03b 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -61,7 +61,7 @@ static void failFunction_() FAIL("This test fails"); } -_no_return_ static void exitNonZeroFunction_(); +CPPUTEST_NORETURN static void exitNonZeroFunction_(); static void exitNonZeroFunction_() { /* destructor of static objects will be called. If StringCache was there then the allocator will report invalid deallocations of static SimpleString */ diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index bfa35461a..c14b9f3c9 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -430,7 +430,7 @@ TEST_GROUP(IgnoredUtestShell) IgnoredUtestShell ignoredTest; ExecFunctionTestShell normalUtestShell; - void setup() _override + void setup() CPPUTEST_OVERRIDE { fixture.addTest(&ignoredTest); fixture.addTest(&normalUtestShell); @@ -509,12 +509,12 @@ TEST_BASE(MyOwnTest) } bool inTest; - void setup() _override + void setup() CPPUTEST_OVERRIDE { CHECK(!inTest); inTest = true; } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { CHECK(inTest); inTest = false; @@ -589,7 +589,7 @@ TEST_GROUP(UtestShellPointerArrayTest) UtestShell* test1; UtestShell* test2; - void setup() _override + void setup() CPPUTEST_OVERRIDE { test0 = new IgnoredUtestShell(); test1 = new IgnoredUtestShell(); @@ -599,7 +599,7 @@ TEST_GROUP(UtestShellPointerArrayTest) test1->addTest(test2); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete test0; delete test1; diff --git a/tests/CppUTestExt/CodeMemoryReporterTest.cpp b/tests/CppUTestExt/CodeMemoryReporterTest.cpp index 1f8ee0af1..c2b390504 100644 --- a/tests/CppUTestExt/CodeMemoryReporterTest.cpp +++ b/tests/CppUTestExt/CodeMemoryReporterTest.cpp @@ -45,7 +45,7 @@ TEST_GROUP(CodeMemoryReportFormatter) TestResult* testResult; CodeMemoryReportFormatter* formatter; - void setup() _override + void setup() CPPUTEST_OVERRIDE { cAllocator = defaultMallocAllocator(); newAllocator = defaultNewAllocator(); @@ -57,7 +57,7 @@ TEST_GROUP(CodeMemoryReportFormatter) testResult = new TestResult(testOutput); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete testResult; delete formatter; diff --git a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp index 4c90f8cf7..526db2393 100644 --- a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp +++ b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp @@ -38,7 +38,7 @@ TEST_GROUP(MockExpectedCallsList) MockCheckedExpectedCall* call2; MockCheckedExpectedCall* call3; MockCheckedExpectedCall* call4; - void setup() _override + void setup() CPPUTEST_OVERRIDE { list = new MockExpectedCallsList; call1 = new MockCheckedExpectedCall; @@ -49,7 +49,7 @@ TEST_GROUP(MockExpectedCallsList) call2->withName("bar"); call3->withName("boo"); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete call1; delete call2; diff --git a/tests/CppUTestExt/GMockTest.cpp b/tests/CppUTestExt/GMockTest.cpp index 75b55045e..88b00e93d 100644 --- a/tests/CppUTestExt/GMockTest.cpp +++ b/tests/CppUTestExt/GMockTest.cpp @@ -37,12 +37,12 @@ TEST_GROUP(GMock) { TestTestingFixture *fixture; - void setup() _override + void setup() CPPUTEST_OVERRIDE { fixture = new TestTestingFixture; } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete fixture; diff --git a/tests/CppUTestExt/GTest1Test.cpp b/tests/CppUTestExt/GTest1Test.cpp index 3edf226fd..8f23d3482 100644 --- a/tests/CppUTestExt/GTest1Test.cpp +++ b/tests/CppUTestExt/GTest1Test.cpp @@ -156,12 +156,12 @@ static void failMethodEXPECT_STREQ_() TEST_GROUP(gtestMacros) { TestTestingFixture* fixture; - void setup() _override + void setup() CPPUTEST_OVERRIDE { fixture = new TestTestingFixture(); afterCheck = false; } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete fixture; } diff --git a/tests/CppUTestExt/GTest2ConvertorTest.cpp b/tests/CppUTestExt/GTest2ConvertorTest.cpp index 749a53749..f8c390fb7 100644 --- a/tests/CppUTestExt/GTest2ConvertorTest.cpp +++ b/tests/CppUTestExt/GTest2ConvertorTest.cpp @@ -34,13 +34,13 @@ class GTestTestingFixtureTest : public testing::Test { bool setup_was_called; char* freed_during_teardown; - void SetUp() _override + void SetUp() CPPUTEST_OVERRIDE { setup_was_called = true; freed_during_teardown = NULL; } - void TearDown() _override + void TearDown() CPPUTEST_OVERRIDE { delete [] freed_during_teardown; } diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index 3a41b3f1f..e37e309cb 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -39,7 +39,7 @@ TEST_GROUP(FE_with_Plugin) { TestTestingFixture fixture; IEEE754ExceptionsPlugin ieee754Plugin; - void setup(void) _override + void setup(void) CPPUTEST_OVERRIDE { fixture.installPlugin(&ieee754Plugin); } @@ -128,7 +128,7 @@ static IEEE754ExceptionsPlugin ip; TEST_GROUP(IEEE754ExceptionsPlugin2) { - void setup(void) _override + void setup(void) CPPUTEST_OVERRIDE { TestRegistry::getCurrentRegistry()->installPlugin(&ip); } diff --git a/tests/CppUTestExt/MemoryReportFormatterTest.cpp b/tests/CppUTestExt/MemoryReportFormatterTest.cpp index 4c3c7e4dc..13b0b190d 100644 --- a/tests/CppUTestExt/MemoryReportFormatterTest.cpp +++ b/tests/CppUTestExt/MemoryReportFormatterTest.cpp @@ -40,13 +40,13 @@ TEST_GROUP(NormalMemoryReportFormatter) TestResult* testResult; NormalMemoryReportFormatter formatter; - void setup() _override + void setup() CPPUTEST_OVERRIDE { memory01 = (char*) 0x01; testResult = new TestResult(testOutput); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete testResult; } diff --git a/tests/CppUTestExt/MemoryReporterPluginTest.cpp b/tests/CppUTestExt/MemoryReporterPluginTest.cpp index c344567cf..2a94646d4 100644 --- a/tests/CppUTestExt/MemoryReporterPluginTest.cpp +++ b/tests/CppUTestExt/MemoryReporterPluginTest.cpp @@ -52,37 +52,37 @@ class TemporaryDefaultNewAllocator class MockMemoryReportFormatter : public MemoryReportFormatter { public: - virtual void report_testgroup_start(TestResult* result, UtestShell& test) _override + virtual void report_testgroup_start(TestResult* result, UtestShell& test) CPPUTEST_OVERRIDE { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_testgroup_start").withParameter("result", result).withParameter("test", &test); } - virtual void report_testgroup_end(TestResult* result, UtestShell& test) _override + virtual void report_testgroup_end(TestResult* result, UtestShell& test) CPPUTEST_OVERRIDE { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_testgroup_end").withParameter("result", result).withParameter("test", &test); } - virtual void report_test_start(TestResult* result, UtestShell& test) _override + virtual void report_test_start(TestResult* result, UtestShell& test) CPPUTEST_OVERRIDE { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_test_start").withParameter("result", result).withParameter("test", &test); } - virtual void report_test_end(TestResult* result, UtestShell& test) _override + virtual void report_test_end(TestResult* result, UtestShell& test) CPPUTEST_OVERRIDE { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_test_end").withParameter("result", result).withParameter("test", &test); } - virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t, char* , const char* , size_t ) _override + virtual void report_alloc_memory(TestResult* result, TestMemoryAllocator* allocator, size_t, char* , const char* , size_t ) CPPUTEST_OVERRIDE { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_alloc_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", allocator); } - virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* , const char* , size_t ) _override + virtual void report_free_memory(TestResult* result, TestMemoryAllocator* allocator, char* , const char* , size_t ) CPPUTEST_OVERRIDE { TemporaryDefaultNewAllocator tempAlloc(previousNewAllocator); mock("formatter").actualCall("report_free_memory").withParameter("result", result).withParameterOfType("TestMemoryAllocator", "allocator", allocator); @@ -94,7 +94,7 @@ static MockMemoryReportFormatter formatterForPluginTest; class MemoryReporterPluginUnderTest : public MemoryReporterPlugin { public: - MemoryReportFormatter* createMemoryFormatter(const SimpleString& type) _override + MemoryReportFormatter* createMemoryFormatter(const SimpleString& type) CPPUTEST_OVERRIDE { mock("reporter").actualCall("createMemoryFormatter").onObject(this).withParameter("type", type.asCharString()); return new MockMemoryReportFormatter; @@ -104,11 +104,11 @@ class MemoryReporterPluginUnderTest : public MemoryReporterPlugin class TestMemoryAllocatorComparator : public MockNamedValueComparator { public: - bool isEqual(const void* object1, const void* object2) _override + bool isEqual(const void* object1, const void* object2) CPPUTEST_OVERRIDE { return ((const TestMemoryAllocator*)object1)->name() == ((const TestMemoryAllocator*)object2)->name(); } - SimpleString valueToString(const void* object) _override + SimpleString valueToString(const void* object) CPPUTEST_OVERRIDE { return ((const TestMemoryAllocator*)object)->name(); } @@ -124,7 +124,7 @@ TEST_GROUP(MemoryReporterPlugin) TestResult* result; UtestShell* test; - void setup() _override + void setup() CPPUTEST_OVERRIDE { previousNewAllocator = getCurrentNewAllocator(); result = new TestResult(output); @@ -138,7 +138,7 @@ TEST_GROUP(MemoryReporterPlugin) reporter->parseArguments(1, cmd_line, 0); mock("reporter").enable(); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { setCurrentNewAllocator(previousNewAllocator); mock().clear(); diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 8d76bbea9..a38b85200 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -38,14 +38,14 @@ TEST_GROUP(MockCheckedActualCall) MockExpectedCallsList* list; MockFailureReporter* reporter; - void setup() _override + void setup() CPPUTEST_OVERRIDE { emptyList = new MockExpectedCallsList; list = new MockExpectedCallsList; reporter = MockFailureReporterForTest::getReporter(); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { CHECK_NO_MOCK_FAILURE(); diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index 6c6b996ab..6b93394f9 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -31,7 +31,7 @@ TEST_GROUP(MockCallTest) { - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { mock().checkExpectations(); mock().clear(); diff --git a/tests/CppUTestExt/MockCheatSheetTest.cpp b/tests/CppUTestExt/MockCheatSheetTest.cpp index 10218f509..ec74a22ce 100644 --- a/tests/CppUTestExt/MockCheatSheetTest.cpp +++ b/tests/CppUTestExt/MockCheatSheetTest.cpp @@ -39,7 +39,7 @@ static void productionCodeBarCalls() /* Actual test */ TEST_GROUP(MockCheatSheet) { - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { /* Check expectations. Alternatively use MockSupportPlugin */ mock().checkExpectations(); diff --git a/tests/CppUTestExt/MockComparatorCopierTest.cpp b/tests/CppUTestExt/MockComparatorCopierTest.cpp index 1b009d3cb..5cad7a4a5 100644 --- a/tests/CppUTestExt/MockComparatorCopierTest.cpp +++ b/tests/CppUTestExt/MockComparatorCopierTest.cpp @@ -30,7 +30,7 @@ TEST_GROUP(MockComparatorCopierTest) { - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { mock().checkExpectations(); mock().clear(); @@ -55,13 +55,13 @@ class MyTypeForTesting class MyTypeForTestingComparator : public MockNamedValueComparator { public: - virtual bool isEqual(const void* object1, const void* object2) _override + virtual bool isEqual(const void* object1, const void* object2) CPPUTEST_OVERRIDE { const MyTypeForTesting* obj1 = (const MyTypeForTesting*) object1; const MyTypeForTesting* obj2 = (const MyTypeForTesting*) object2; return *(obj1->value) == *(obj2->value); } - virtual SimpleString valueToString(const void* object) _override + virtual SimpleString valueToString(const void* object) CPPUTEST_OVERRIDE { const MyTypeForTesting* obj = (const MyTypeForTesting*) object; return StringFrom(*(obj->value)); @@ -71,7 +71,7 @@ class MyTypeForTestingComparator : public MockNamedValueComparator class MyTypeForTestingCopier : public MockNamedValueCopier { public: - virtual void copy(void* dst_, const void* src_) _override + virtual void copy(void* dst_, const void* src_) CPPUTEST_OVERRIDE { MyTypeForTesting* dst = (MyTypeForTesting*) dst_; const MyTypeForTesting* src = (const MyTypeForTesting*) src_; @@ -567,11 +567,11 @@ TEST(MockComparatorCopierTest, installCopiersWorksHierarchically) class StubComparator : public MockNamedValueComparator { public: - virtual bool isEqual(const void*, const void*) _override + virtual bool isEqual(const void*, const void*) CPPUTEST_OVERRIDE { return true; } - virtual SimpleString valueToString(const void*) _override + virtual SimpleString valueToString(const void*) CPPUTEST_OVERRIDE { return ""; } diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 679e8073a..7bd76aa73 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -47,13 +47,13 @@ class TypeForTestingExpectedFunctionCall class TypeForTestingExpectedFunctionCallComparator : public MockNamedValueComparator { public: - virtual bool isEqual(const void* object1, const void* object2) _override + virtual bool isEqual(const void* object1, const void* object2) CPPUTEST_OVERRIDE { const TypeForTestingExpectedFunctionCall* obj1 = (const TypeForTestingExpectedFunctionCall*) object1; const TypeForTestingExpectedFunctionCall* obj2 = (const TypeForTestingExpectedFunctionCall*) object2; return *(obj1->value) == *(obj2->value); } - virtual SimpleString valueToString(const void* object) _override + virtual SimpleString valueToString(const void* object) CPPUTEST_OVERRIDE { const TypeForTestingExpectedFunctionCall* obj = (const TypeForTestingExpectedFunctionCall*) object; return StringFrom(*(obj->value)); @@ -63,7 +63,7 @@ class TypeForTestingExpectedFunctionCallComparator : public MockNamedValueCompar class TypeForTestingExpectedFunctionCallCopier : public MockNamedValueCopier { public: - virtual void copy(void* dst_, const void* src_) _override + virtual void copy(void* dst_, const void* src_) CPPUTEST_OVERRIDE { TypeForTestingExpectedFunctionCall* dst = (TypeForTestingExpectedFunctionCall*) dst_; const TypeForTestingExpectedFunctionCall* src = (const TypeForTestingExpectedFunctionCall*) src_; @@ -73,7 +73,7 @@ class TypeForTestingExpectedFunctionCallCopier : public MockNamedValueCopier TEST_GROUP(MockNamedValueHandlerRepository) { - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { CHECK_NO_MOCK_FAILURE(); MockFailureReporterForTest::clearReporter(); @@ -155,13 +155,13 @@ TEST_GROUP(MockExpectedCall) { MockCheckedExpectedCall* call; MockNamedValueComparatorsAndCopiersRepository* originalComparatorRepository; - void setup() _override + void setup() CPPUTEST_OVERRIDE { originalComparatorRepository = MockNamedValue::getDefaultComparatorsAndCopiersRepository(); call = new MockCheckedExpectedCall(1); call->withName("funcName"); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { MockNamedValue::setDefaultComparatorsAndCopiersRepository(originalComparatorRepository); delete call; diff --git a/tests/CppUTestExt/MockFailureReporterForTest.h b/tests/CppUTestExt/MockFailureReporterForTest.h index 6e04fee89..f1b599f60 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.h +++ b/tests/CppUTestExt/MockFailureReporterForTest.h @@ -38,7 +38,7 @@ class MockFailureReporterForTest : public MockFailureReporter public: SimpleString mockFailureString; - virtual void failTest(const MockFailure& failure) _override; + virtual void failTest(const MockFailure& failure) CPPUTEST_OVERRIDE; static MockFailureReporterForTest* getReporter(); static void clearReporter(); private: @@ -61,7 +61,7 @@ void CHECK_NO_MOCK_FAILURE_LOCATION(const char* file, size_t line); class MockExpectedCallsListForTest : public MockExpectedCallsList { public: - ~MockExpectedCallsListForTest() _destructor_override; + ~MockExpectedCallsListForTest() CPPUTEST_DESTRUCTOR_OVERRIDE; MockCheckedExpectedCall* addFunction(const SimpleString& name); MockCheckedExpectedCall* addFunction(unsigned int numCalls, const SimpleString& name); MockCheckedExpectedCall* addFunctionOrdered(const SimpleString& name, unsigned int order); diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index cd3955785..0e1aea2b5 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -42,7 +42,7 @@ TEST_GROUP(MockFailureTest) MockCheckedExpectedCall* call4; MockCheckedExpectedCall* call5; - void setup () _override + void setup () CPPUTEST_OVERRIDE { list = new MockExpectedCallsList; call1 = new MockCheckedExpectedCall; @@ -51,7 +51,7 @@ TEST_GROUP(MockFailureTest) call4 = new MockCheckedExpectedCall; call5 = new MockCheckedExpectedCall; } - void teardown () _override + void teardown () CPPUTEST_OVERRIDE { delete list; delete call1; diff --git a/tests/CppUTestExt/MockHierarchyTest.cpp b/tests/CppUTestExt/MockHierarchyTest.cpp index 89266dc31..8ee5901df 100644 --- a/tests/CppUTestExt/MockHierarchyTest.cpp +++ b/tests/CppUTestExt/MockHierarchyTest.cpp @@ -30,7 +30,7 @@ TEST_GROUP(MockHierarchyTest) { - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { mock().clear(); } diff --git a/tests/CppUTestExt/MockNamedValueTest.cpp b/tests/CppUTestExt/MockNamedValueTest.cpp index e80560d5e..0a0286f8f 100644 --- a/tests/CppUTestExt/MockNamedValueTest.cpp +++ b/tests/CppUTestExt/MockNamedValueTest.cpp @@ -37,10 +37,10 @@ class MyComparator : public MockNamedValueComparator public: MyComparator() {} - virtual ~MyComparator() _destructor_override {} + virtual ~MyComparator() CPPUTEST_DESTRUCTOR_OVERRIDE {} - virtual bool isEqual(const void*, const void*) _override { return false; } - virtual SimpleString valueToString(const void*) _override { return ""; } + virtual bool isEqual(const void*, const void*) CPPUTEST_OVERRIDE { return false; } + virtual SimpleString valueToString(const void*) CPPUTEST_OVERRIDE { return ""; } }; class MyCopier : public MockNamedValueCopier @@ -48,9 +48,9 @@ class MyCopier : public MockNamedValueCopier public: MyCopier() {} - virtual ~MyCopier() _destructor_override {} + virtual ~MyCopier() CPPUTEST_DESTRUCTOR_OVERRIDE {} - virtual void copy(void*, const void*) _override {} + virtual void copy(void*, const void*) CPPUTEST_OVERRIDE {} }; TEST(ComparatorsAndCopiersRepository, InstallCopierAndRetrieveIt) @@ -96,12 +96,12 @@ TEST(ComparatorsAndCopiersRepository, InstallComparatorsAndCopiersFromRepository TEST_GROUP(MockNamedValue) { MockNamedValue * value; - void setup() _override + void setup() CPPUTEST_OVERRIDE { value = new MockNamedValue("param"); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete value; } diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index de081cbdc..8b3e594bd 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -31,7 +31,7 @@ TEST_GROUP(MockParameterTest) { - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { mock().checkExpectations(); mock().clear(); diff --git a/tests/CppUTestExt/MockPluginTest.cpp b/tests/CppUTestExt/MockPluginTest.cpp index 7001e3d2c..e3c13a20b 100644 --- a/tests/CppUTestExt/MockPluginTest.cpp +++ b/tests/CppUTestExt/MockPluginTest.cpp @@ -40,13 +40,13 @@ TEST_GROUP(MockPlugin) MockSupportPlugin plugin; - void setup() _override + void setup() CPPUTEST_OVERRIDE { test = new UtestShell("group", "name", "file", 1); result = new TestResult(output); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete test; delete result; @@ -92,11 +92,11 @@ TEST(MockPlugin, checkExpectationsWorksAlsoWithHierachicalObjects) class DummyComparator : public MockNamedValueComparator { public: - bool isEqual(const void* object1, const void* object2) _override + bool isEqual(const void* object1, const void* object2) CPPUTEST_OVERRIDE { return object1 == object2; } - SimpleString valueToString(const void*) _override + SimpleString valueToString(const void*) CPPUTEST_OVERRIDE { return "string"; } @@ -120,7 +120,7 @@ TEST(MockPlugin, installComparatorRecordsTheComparatorButNotInstallsItYet) class DummyCopier : public MockNamedValueCopier { public: - void copy(void* dst, const void* src) _override + void copy(void* dst, const void* src) CPPUTEST_OVERRIDE { *(int*)dst = *(const int*)src; } diff --git a/tests/CppUTestExt/MockReturnValueTest.cpp b/tests/CppUTestExt/MockReturnValueTest.cpp index 320f79529..e99890605 100644 --- a/tests/CppUTestExt/MockReturnValueTest.cpp +++ b/tests/CppUTestExt/MockReturnValueTest.cpp @@ -30,7 +30,7 @@ TEST_GROUP(MockReturnValueTest) { - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { mock().checkExpectations(); mock().clear(); diff --git a/tests/CppUTestExt/MockStrictOrderTest.cpp b/tests/CppUTestExt/MockStrictOrderTest.cpp index b1b5d103d..9151ffa5e 100644 --- a/tests/CppUTestExt/MockStrictOrderTest.cpp +++ b/tests/CppUTestExt/MockStrictOrderTest.cpp @@ -30,7 +30,7 @@ TEST_GROUP(MockStrictOrderTest) { - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { mock().clear(); } diff --git a/tests/CppUTestExt/MockSupportTest.cpp b/tests/CppUTestExt/MockSupportTest.cpp index a2a31625d..bf6d3a000 100644 --- a/tests/CppUTestExt/MockSupportTest.cpp +++ b/tests/CppUTestExt/MockSupportTest.cpp @@ -37,7 +37,7 @@ TEST_GROUP(MockSupportTest) MockExpectedCallsListForTest expectations; MockFailureReporterInstaller failureReporterInstaller; - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { mock().checkExpectations(); CHECK_NO_MOCK_FAILURE(); @@ -173,7 +173,7 @@ TEST_GROUP(MockSupportTestWithFixture) { TestTestingFixture fixture; - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { mock().clear(); MockFailureReporterForTest::clearReporter(); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 83afbb8df..f35855299 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -43,7 +43,7 @@ extern "C" { TEST_GROUP(MockSupport_c) { - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { mock_c()->clear(); } diff --git a/tests/CppUTestExt/OrderedTestTest.cpp b/tests/CppUTestExt/OrderedTestTest.cpp index a1e75dbb4..0273cf587 100644 --- a/tests/CppUTestExt/OrderedTestTest.cpp +++ b/tests/CppUTestExt/OrderedTestTest.cpp @@ -44,7 +44,7 @@ TEST_GROUP(TestOrderedTest) ExecFunctionTestShell normalTest3; OrderedTestShell* orderedTestCache; - void setup() _override + void setup() CPPUTEST_OVERRIDE { orderedTestCache = OrderedTestShell::getOrderedTestHead(); OrderedTestShell::setOrderedTestHead(NULLPTR); @@ -53,7 +53,7 @@ TEST_GROUP(TestOrderedTest) fixture->getRegistry()->unDoLastAddTest(); } - void teardown() _override + void teardown() CPPUTEST_OVERRIDE { delete fixture; OrderedTestShell::setOrderedTestHead(orderedTestCache); @@ -169,7 +169,7 @@ int OrderedTestTestingFixture::count_ = 0; TEST_GROUP(TestOrderedTestMacros) { - void setup() _override + void setup() CPPUTEST_OVERRIDE { OrderedTestTestingFixture::checkRun(TestRegistry::getCurrentRegistry()->getCurrentRepetition()); } From 8eed5b21686b88d0913aeb6ac2539a113486d0b7 Mon Sep 17 00:00:00 2001 From: Ford Peprah Date: Thu, 4 Apr 2024 12:20:57 -0400 Subject: [PATCH 1031/1093] Suppress Sanitization Warning on Linux When Memory Leak Detection is Disabled There is a warning in the `CppUTestConfig.h` on Linux platforms when building with ASAN. The warning says to disable memory leak detection in order to get rid of the warning with `-DCPPUTEST_MEM_LEAK_DETECTION_DISABLED`. However, providing said define does not get rid of the warning. This prevents compilation on Linux with ASAN + `-Werror`. --- include/CppUTest/CppUTestConfig.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index bbe657f42..a8576c415 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -146,7 +146,7 @@ #endif #if CPPUTEST_SANITIZE_ADDRESS - #if defined(__linux__) && defined(__clang__) && CPPUTEST_USE_STD_CPP_LIB + #if defined(__linux__) && defined(__clang__) && CPPUTEST_USE_STD_CPP_LIB && CPPUTEST_USE_MEM_LEAK_DETECTION #warning Compiling with Address Sanitizer with clang on linux may cause duplicate symbols for operator new. Turning off memory leak detection. Compile with -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED to get rid of this warning. #endif #define CPPUTEST_DO_NOT_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) From 3f9ec0c74b69c682f399e8f2a76d593d1218a696 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 22 Apr 2024 19:44:22 -0700 Subject: [PATCH 1032/1093] Avoid `-Wmissing-include-dirs` warnings Only c2000 even uses this include path anymore, so we can remove it for everything else. --- CppUTest.vcproj | 4 ++-- CppUTest.vcxproj | 8 ++++---- build/alltests.mmp | 2 +- build/cpputest.mmp | 2 +- cmake/warnings.cmake | 1 + examples/AllTests/AllTests.vcproj | 4 ++-- examples/ApplicationLib/ApplicationLib.vcproj | 4 ++-- platforms/Dos/Makefile | 1 - platforms/armcc/Makefile | 1 - scripts/VS2010Templates/CppUTest_VS2010.props | 4 ++-- scripts/templates/ProjectTemplate/ProjectMakefile | 1 - src/CppUTest/CMakeLists.txt | 5 ++++- tests/AllTests.vcproj | 4 ++-- tests/AllTests.vcxproj | 6 +++--- 14 files changed, 24 insertions(+), 23 deletions(-) diff --git a/CppUTest.vcproj b/CppUTest.vcproj index 99a32833e..82d843b40 100644 --- a/CppUTest.vcproj +++ b/CppUTest.vcproj @@ -41,7 +41,7 @@ Disabled - .\include;.\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) + .\include;%(AdditionalIncludeDirectories) _LIB;WIN32;_DEBUG;STDC_WANT_SECURE_LIB;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -106,7 +106,7 @@ Disabled - .\include;.\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) + .\include;%(AdditionalIncludeDirectories) _LIB;WIN32;_DEBUG;STDC_WANT_SECURE_LIB;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -138,7 +138,7 @@ Disabled - .\include;.\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) + .\include;%(AdditionalIncludeDirectories) OnlyExplicitInline WIN32;NDEBUG;_LIB;STDC_WANT_SECURE_LIB;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) true @@ -173,7 +173,7 @@ Disabled - .\include;.\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) + .\include;%(AdditionalIncludeDirectories) OnlyExplicitInline WIN32;NDEBUG;_LIB;STDC_WANT_SECURE_LIB;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) true diff --git a/build/alltests.mmp b/build/alltests.mmp index 8eaaf5b13..40c1dc86a 100644 --- a/build/alltests.mmp +++ b/build/alltests.mmp @@ -29,7 +29,7 @@ TARGET cpputest.exe TARGETTYPE exe UID 0x00000000 0x03A6305A -USERINCLUDE ..\include ..\include\CppUTest ..\include\Platforms\Symbian ..\tests +USERINCLUDE ..\include ..\include\CppUTest ..\tests SYSTEMINCLUDE \epoc32\include \epoc32\include\stdapis STATICLIBRARY libcrt0.lib diff --git a/build/cpputest.mmp b/build/cpputest.mmp index 8093f8c59..103063507 100644 --- a/build/cpputest.mmp +++ b/build/cpputest.mmp @@ -29,7 +29,7 @@ TARGET cpputest.lib TARGETTYPE LIB UID 0x00000000 0x03A6305A -USERINCLUDE ..\include ..\include\CppUTest ..\include\Platforms\Symbian +USERINCLUDE ..\include ..\include\CppUTest SYSTEMINCLUDE \epoc32\include \epoc32\include\stdapis SOURCEPATH ..\src\CppUTest diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index b016c4d47..383b9e062 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -16,6 +16,7 @@ if( -Wswitch-enum -Wconversion -Wsign-conversion + -Wmissing-include-dirs -Wno-padded -Wno-disabled-macro-expansion -Wno-reserved-id-macro diff --git a/examples/AllTests/AllTests.vcproj b/examples/AllTests/AllTests.vcproj index 4d1be1530..ad9ab2b72 100644 --- a/examples/AllTests/AllTests.vcproj +++ b/examples/AllTests/AllTests.vcproj @@ -45,7 +45,7 @@ - $(CPPUTEST_HOME)\include;$(CPPUTEST_HOME)\include\CppUTestExt\CppUTestGTest;$(CPPUTEST_HOME)\include\CppUTestExt\CppUTestGMock;$(CPPUTEST_HOME)\include\Platforms\VisualCpp + $(CPPUTEST_HOME)\include;$(CPPUTEST_HOME)\include\CppUTestExt\CppUTestGTest;$(CPPUTEST_HOME)\include\CppUTestExt\CppUTestGMock $(CPPUTEST_HOME)\lib - $(CPPUTEST_HOME)\include\Platforms\VisualCpp\Platform.h;$(CPPUTEST_HOME)\include\CppUTest\MemoryLeakDetectorMallocMacros.h; + $(CPPUTEST_HOME)\include\CppUTest\MemoryLeakDetectorMallocMacros.h; CppUTest.lib diff --git a/scripts/templates/ProjectTemplate/ProjectMakefile b/scripts/templates/ProjectTemplate/ProjectMakefile index 68747610f..f426016c8 100644 --- a/scripts/templates/ProjectTemplate/ProjectMakefile +++ b/scripts/templates/ProjectTemplate/ProjectMakefile @@ -32,7 +32,6 @@ INCLUDE_DIRS =\ include \ include/* \ $(CPPUTEST_HOME)/include/ \ - $(CPPUTEST_HOME)/include/Platforms/Gcc\ mocks CPPUTEST_WARNINGFLAGS = -Wall -Werror -Wswitch-default diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index f8c35a09a..b03e644da 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -53,9 +53,12 @@ if(CPPUTEST_PLATFORM) PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../Platforms/${CPPUTEST_PLATFORM}/UtestPlatform.cpp ) +endif() + +if(CPPUTEST_PLATFORM STREQUAL "c2000") target_include_directories(CppUTest PUBLIC - $ + $ ) endif() diff --git a/tests/AllTests.vcproj b/tests/AllTests.vcproj index 16ab375c9..79f30f0e4 100644 --- a/tests/AllTests.vcproj +++ b/tests/AllTests.vcproj @@ -45,7 +45,7 @@ Name="VCCLCompilerTool" Optimization="0" InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\include,..\include\Platforms\VisualCpp" + AdditionalIncludeDirectories="..\include" PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;CPPUTEST_USE_LONG_LONG" StringPooling="true" RuntimeLibrary="0" @@ -129,7 +129,7 @@ true Level3 true - ..\include;..\include\CppUTestExt\CppUTestGTest;..\include\CppUTestExt\CppUTestGMock;..\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) + ..\include;..\include\CppUTestExt\CppUTestGTest;..\include\CppUTestExt\CppUTestGMock;%(AdditionalIncludeDirectories) OldStyle true @@ -131,7 +131,7 @@ true Level3 true - ..\include;..\include\CppUTestExt\CppUTestGTest;..\include\CppUTestExt\CppUTestGMock;..\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) + ..\include;..\include\CppUTestExt\CppUTestGTest;..\include\CppUTestExt\CppUTestGMock;%(AdditionalIncludeDirectories) OldStyle true @@ -162,7 +162,7 @@ Disabled - ..\include;..\include\CppUTestExt\CppUTestGTest;..\include\CppUTestExt\CppUTestGMock;..\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) + ..\include;..\include\CppUTestExt\CppUTestGTest;..\include\CppUTestExt\CppUTestGMock;%(AdditionalIncludeDirectories) _CONSOLE;WIN32;_DEBUG;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL From e45a16d1d2d0780f7087f8d682fe698b6f64627c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 22 Apr 2024 20:00:44 -0700 Subject: [PATCH 1033/1093] Repair Mac builds --- .github/workflows/basic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index d01a1a3ad..375da07aa 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -78,7 +78,7 @@ jobs: steps: - name: Checkout uses: actions/checkout@main - - run: brew install automake + - run: brew install automake libtool if: ${{ startswith(matrix.os, 'macos') }} - if: ${{ matrix.cxx }} run: echo "CXX=${{ matrix.cxx }}" >> $GITHUB_ENV From 2e47bc53c4321f300d225f605fef5e3a4ee7a9b1 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 22 Apr 2024 20:43:03 -0700 Subject: [PATCH 1034/1093] Fix typo Closes #1776 --- configure.ac | 62 ++++++++++++++-------------- include/CppUTestExt/GTestConvertor.h | 8 ++-- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/configure.ac b/configure.ac index cd4089e4e..b0970a771 100644 --- a/configure.ac +++ b/configure.ac @@ -76,7 +76,7 @@ saved_cxxflags="$CXXFLAGS" saved_ldflags="$LDFLAGS" if test "x$USE_MAINTAINER_MODE" = "xyes"; then -# FLag -Werror. +# Flag -Werror. CFLAGS=-Werror AC_MSG_CHECKING([whether CC and CXX supports -Werror]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS_STRICT="${CPPUTEST_CWARNINGFLAGS} -Werror"; CPPUTEST_CXXWARNINGFLAGS_STRICT="${CPPUTEST_CXXWARNINGFLAGS} -Werror" ], [AC_MSG_RESULT([no])]) @@ -87,31 +87,31 @@ AC_LANG_PUSH([C++]) ##################################################################################### ##### C++ checks -# FLag -std=c++1y +# Flag -std=c++1y CXXFLAGS="-Werror -std=c++1y" AC_MSG_CHECKING([whether CXX supports -std=c++1y]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP14FLAG="-std=c++1y" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" -# FLag std=c++14 +# Flag std=c++14 CXXFLAGS="-Werror -std=c++14" AC_MSG_CHECKING([whether CXX supports -std=c++14]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP14FLAG="-std=c++14" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" -# FLag std=c++17 +# Flag std=c++17 CXXFLAGS="-Werror -std=c++17" AC_MSG_CHECKING([whether CXX supports -std=c++17]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP17FLAG="-std=c++17" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" -# FLag std=c++20 +# Flag std=c++20 CXXFLAGS="-Werror -std=c++2a" AC_MSG_CHECKING([whether CXX supports -std=c++2a]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP20FLAG="-std=c++2a" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" -# FLag std=c++20 +# Flag std=c++20 CXXFLAGS="-Werror -std=c++20" AC_MSG_CHECKING([whether CXX supports -std=c++20]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP20FLAG="-std=c++20" ], [AC_MSG_RESULT([no])]) @@ -122,13 +122,13 @@ CXXFLAGS="$saved_cxxflags" ### Checking for C++ version compiler flags -# FLag -std=c++98 +# Flag -std=c++98 CXXFLAGS="-Werror -std=c++98" AC_MSG_CHECKING([whether CXX supports -std=c++98]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP98FLAG="-std=c++98" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" -# FLag -std=c++0x +# Flag -std=c++0x CXXFLAGS="-Werror -std=c++0x" AC_MSG_CHECKING([whether CXX supports -std=c++0x]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP11FLAG="-std=c++0x" ], [AC_MSG_RESULT([no])]) @@ -164,13 +164,13 @@ CXXFLAGS="$saved_cxxflags" AC_LANG_POP -# FLag -Wno-c++11-long-long. This must be on if it is available as otherwise long long is supported but causes a warning. +# Flag -Wno-c++11-long-long. This must be on if it is available as otherwise long long is supported but causes a warning. CFLAGS="-Werror -Wno-c++11-long-long" AC_MSG_CHECKING([whether CC and CXX supports -Wno-c++11-long-long]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wno-c++11-long-long" CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-c++11-long-long" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# FLag -Wno-long-long must be on for C. +# Flag -Wno-long-long must be on for C. CFLAGS="-Werror -Wno-long-long" AC_MSG_CHECKING([whether CC and CXX supports -Wno-long-long]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wno-long-long" CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-long-long"], [AC_MSG_RESULT([no])]) @@ -178,56 +178,56 @@ CFLAGS="$saved_cflags" ##################################################################################### -# FLag -Wall. +# Flag -Wall. CFLAGS="-Werror -Wall" AC_MSG_CHECKING([whether CC and CXX supports -Wall]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wall"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wall" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# FLag -Wextra. +# Flag -Wextra. CFLAGS="-Werror -Wextra" AC_MSG_CHECKING([whether CC and CXX supports -Wextra]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wextra"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wextra" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# FLag -Wshadow. +# Flag -Wshadow. CFLAGS="-Werror -Wshadow" AC_MSG_CHECKING([whether CC and CXX supports -Wshadow]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wshadow"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wshadow" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# FLag -Wswitch-default +# Flag -Wswitch-default CFLAGS="-Werror -Wswitch-default" AC_MSG_CHECKING([whether CC and CXX supports -Wswitch-default]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wswitch-default"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wswitch-default" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# FLag -Wswitch-enum +# Flag -Wswitch-enum CFLAGS="-Werror -Wswitch-enum" AC_MSG_CHECKING([whether CC and CXX supports -Wswitch-enum]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wswitch-enum"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wswitch-enum" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# FLag -Wconversion +# Flag -Wconversion CFLAGS="-Werror -Wconversion" AC_MSG_CHECKING([whether CC and CXX supports -Wconversion]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wconversion"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wconversion" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# FLag -pedantic +# Flag -pedantic CFLAGS="-Werror -pedantic" AC_MSG_CHECKING([whether CC and CXX supports -pedantic]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -pedantic"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -pedantic" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# FLag -Wsign-conversion +# Flag -Wsign-conversion CFLAGS="-Werror -Wsign-conversion" AC_MSG_CHECKING([whether CC supports -Wsign-conversion]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wsign-conversion"], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" ##### C++ Warnings -# FLag -Wsign-conversion (for CXX) +# Flag -Wsign-conversion (for CXX) AC_LANG_PUSH([C++]) CXXFLAGS="-Werror -Wsign-conversion" @@ -235,7 +235,7 @@ AC_MSG_CHECKING([whether CXX supports -Wsign-conversion]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wsign-conversion"], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" -# FLag -Woverloaded-virtual +# Flag -Woverloaded-virtual CXXFLAGS="-Werror -Woverloaded-virtual" AC_MSG_CHECKING([whether CXX supports -Woverloaded-virtual]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Woverloaded-virtual" ], [AC_MSG_RESULT([no])]) @@ -243,7 +243,7 @@ CXXFLAGS="$saved_cxxflags" AC_LANG_POP -# FLag -Wstrict-prototypes +# Flag -Wstrict-prototypes CFLAGS="-Werror -Wstrict-prototypes" AC_MSG_CHECKING([whether CC supports -Wstrict-prototypes]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wstrict-prototypes" ], [AC_MSG_RESULT([no])]) @@ -254,50 +254,50 @@ CFLAGS="$saved_cflags" ##### Less of these warnings # # Disable some warnings as CppUTest has this and can't be prevented at the moment. -# FLag -Wno-disabled-macro-expansion. +# Flag -Wno-disabled-macro-expansion. CFLAGS="-Werror -Wno-disabled-macro-expansion" AC_MSG_CHECKING([whether CC and CXX supports -Wno-disabled-macro-expansion]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wno-disabled-macro-expansion"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-disabled-macro-expansion" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# FLag -Wno-padded. +# Flag -Wno-padded. CFLAGS="-Werror -Wno-padded" AC_MSG_CHECKING([whether CC and CXX supports -Wno-padded]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wno-padded"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-padded" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# FLag -Wno-reserved-id-macro. +# Flag -Wno-reserved-id-macro. CFLAGS="-Werror -Wno-reserved-id-macro" AC_MSG_CHECKING([whether CC and CXX supports -Wno-reserved-id-macro]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wno-reserved-id-macro"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-reserved-id-macro" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# FLag -Wno-keyword-macro. +# Flag -Wno-keyword-macro. CFLAGS="-Werror -Wno-keyword-macro" AC_MSG_CHECKING([whether CC and CXX supports -Wno-keyword-macro]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wno-keyword-macro"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-keyword-macro" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" AC_LANG_PUSH([C++]) -# FLag -Wno-global-constructors. +# Flag -Wno-global-constructors. CXXFLAGS="-Werror -Wno-global-constructors" AC_MSG_CHECKING([whether CXX supports -Wno-global-constructors]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-global-constructors" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" -# FLag -Wno-exit-time-destructors. +# Flag -Wno-exit-time-destructors. CXXFLAGS="-Werror -Wno-exit-time-destructors" AC_MSG_CHECKING([whether CXX supports -Wno-exit-time-destructors]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-exit-time-destructors" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" -# FLag -Wno-weak-vtables. +# Flag -Wno-weak-vtables. CXXFLAGS="-Werror -Wno-weak-vtables" AC_MSG_CHECKING([whether CXX supports -Wno-weak-vtables]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-weak-vtables" ], [AC_MSG_RESULT([no])]) CXXFLAGS="$saved_cxxflags" -# FLag -Wno-old-style-cast. +# Flag -Wno-old-style-cast. CXXFLAGS="-Werror -Wno-old-style-cast" AC_MSG_CHECKING([whether CXX supports -Wno-old-style-cast]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-old-style-cast" ], [AC_MSG_RESULT([no])]) @@ -308,7 +308,7 @@ AC_LANG_POP ##################################################### ######## End warning section -# FLag --coverage +# Flag --coverage AC_LANG_PUSH([C++]) CXXFLAGS="-Werror --coverage" AC_MSG_CHECKING([whether CXX and the linker supports --coverage (broken in clang 3.3)]) @@ -334,7 +334,7 @@ AC_MSG_CHECKING([whether CXX supports operator new with exception handling speci AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include \nvoid* operator new(size_t size) throw(std::bad_alloc);;])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]); UT_NEW_CANT_HAVE_EXCEPTION_SPECIFIER="yes"]) CXXFLAGS="$saved_cxxflags" -# FLag -Wno-missing-exception-spec +# Flag -Wno-missing-exception-spec CXXFLAGS="-Werror -Wno-missing-exception-spec" AC_MSG_CHECKING([whether CXX supports -Wno-missing-exception-spec]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CXX_NO_INC_WARNINGFLAGS="${CPPUTEST_CXX_NO_INC_WARNINGFLAGS} -Wno-missing-exception-spec" ], [AC_MSG_RESULT([no])]) diff --git a/include/CppUTestExt/GTestConvertor.h b/include/CppUTestExt/GTestConvertor.h index 751a38d05..5a91135b1 100644 --- a/include/CppUTestExt/GTestConvertor.h +++ b/include/CppUTestExt/GTestConvertor.h @@ -121,7 +121,7 @@ class GTestShell : public UtestShell class GTestFlagsThatAllocateMemory { public: - void storeValuesOfGTestFLags() + void storeValuesOfGTestFlags() { GTestFlagcolor = ::testing::GTEST_FLAG(color); GTestFlagfilter = ::testing::GTEST_FLAG(filter); @@ -145,7 +145,7 @@ class GTestFlagsThatAllocateMemory #endif } - void setGTestFLagValuesToNULLToAvoidMemoryLeaks() + void setGTestFlagValuesToNULLToAvoidMemoryLeaks() { #ifndef GTEST_VERSION_GTEST_1_7 ::testing::GTEST_FLAG(color) = GTEST_NO_STRING_VALUE; @@ -300,7 +300,7 @@ class GTestUTest: public Utest { ::testing::UnitTest::GetInstance()->impl()->set_current_test_info(NULL); delete test_; - flags_->setGTestFLagValuesToNULLToAvoidMemoryLeaks(); + flags_->setGTestFlagValuesToNULLToAvoidMemoryLeaks(); ::testing::internal::DeathTest::set_last_death_test_message(GTEST_NO_STRING_VALUE); } @@ -366,7 +366,7 @@ inline void GTestConvertor::createDummyInSequenceToAndFailureReporterAvoidMemory inline void GTestConvertor::addAllGTestToTestRegistry() { createDummyInSequenceToAndFailureReporterAvoidMemoryLeakInGMock(); - flags_.storeValuesOfGTestFLags(); + flags_.storeValuesOfGTestFlags(); int argc = 2; const char * argv[] = {"NameOfTheProgram", "--gmock_catch_leaked_mocks=0"}; From 35ae89f57c91a031005a4454186a4f58e4ab07bd Mon Sep 17 00:00:00 2001 From: Cheng Jiang Date: Tue, 23 Apr 2024 14:32:14 +0800 Subject: [PATCH 1035/1093] Improve README.md Clarity Updated README.md to address missing information that could potentially lead to misunderstandings, particularly for new users. This enhancement ensures that the documentation is more comprehensive and user-friendly. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 1055d6133..cb697925b 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ Building from source (Unix-based, Cygwin, MacOS): ```bash git clone https://github.com/cpputest/cpputest.git +cd cpputest +mkdir cpputest_build cd cpputest_build autoreconf .. -i ../configure @@ -32,6 +34,8 @@ You can also use CMake, which also works for Windows Visual Studio. ```bash git clone https://github.com/cpputest/cpputest.git +cd cpputest +mkdir cpputest_build cmake -B cpputest_build cmake --build cpputest_build ``` From 2c19ce3f03a531b31e2278a9add696c1bf225d85 Mon Sep 17 00:00:00 2001 From: Dmitriy Alexandrov Date: Sun, 28 Apr 2024 12:27:58 +0200 Subject: [PATCH 1036/1093] Fix NULLPTR in C harness --- include/CppUTest/TestHarness_c.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 1d1cb9851..ca63a6f65 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -115,7 +115,7 @@ CHECK_EQUAL_C_POINTER_LOCATION(expected,actual,text,__FILE__,__LINE__) #define CHECK_EQUAL_C_MEMCMP(expected, actual, size) \ - CHECK_EQUAL_C_MEMCMP_LOCATION(expected, actual, size, NULLPTR, __FILE__, __LINE__) + CHECK_EQUAL_C_MEMCMP_LOCATION(expected, actual, size, NULL, __FILE__, __LINE__) #define CHECK_EQUAL_C_MEMCMP_TEXT(expected, actual, size, text) \ CHECK_EQUAL_C_MEMCMP_LOCATION(expected, actual, size, text, __FILE__, __LINE__) From ef4ab4918cb52d5709cbfbb2e90f2abff8445dac Mon Sep 17 00:00:00 2001 From: Logan Smith Date: Mon, 22 Jul 2024 11:05:49 -0700 Subject: [PATCH 1037/1093] STRING_H: Gate string.h inclusion on STRDUP - Replace 'CPPUTEST_HAVE_STRING_H' with 'CPPUTEST_HAVE_STRDUP' in 'StandardCLibrary.h' - Issue #1192 resolved a build issue related to projects including string.h for autoconf-based projects but not CMake-based projects. The autoconf projects have 'CPPUTEST_HAVE_STRING_H' defined as part of 'AC_CHECK_HEADERS' check for 'string.h' but CMake projects do not have this same check. The CMake projects *do* have a call to 'check_cxx_symbol_exists' for 'strdup' which is used to set 'CPPUTEST_HAVE_STRDUP' in 'config.h'. The autoconf project has the equivalent check via 'AC_CHECK_FUNCS' for 'strdup', so gating the 'string.h' inclusion in 'StandardCLibrary.h' on 'CPPUTEST_HAVE_STRDUP' is both functionally equivalent for autoconf projects and more precise. --- include/CppUTest/StandardCLibrary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTest/StandardCLibrary.h b/include/CppUTest/StandardCLibrary.h index ad901727d..d518236ca 100644 --- a/include/CppUTest/StandardCLibrary.h +++ b/include/CppUTest/StandardCLibrary.h @@ -45,7 +45,7 @@ #include /* Needed to ensure that string.h is included prior to strdup redefinition */ -#ifdef CPPUTEST_HAVE_STRING_H +#ifdef CPPUTEST_HAVE_STRDUP #include #endif From 6552e0a1c53889c732669b1a0620689e0fa28e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Yhuel?= Date: Wed, 31 Jul 2024 16:27:34 +0200 Subject: [PATCH 1038/1093] Do not define __has_attribute in a public header This causes issues with gcc < 5 and gmacros.h from glib >= 2.69. The glib header thinks the compiler supports __has_attribute, so it uses it instead of doing version checks. Then macros like G_GNUC_UNUSED become empty, as if no attribute was supported. --- include/CppUTest/CppUTestConfig.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 854c08601..b4487cf54 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -100,12 +100,14 @@ * This is needed for compiling with clang, without breaking other compilers. */ #ifndef __has_attribute - #define __has_attribute(x) 0 + #define CPPUTEST_HAS_ATTRIBUTE(x) 0 +#else + #define CPPUTEST_HAS_ATTRIBUTE(x) __has_attribute(x) #endif #if defined (__cplusplus) && __cplusplus >= 201103L #define CPPUTEST_NORETURN [[noreturn]] -#elif __has_attribute(noreturn) +#elif CPPUTEST_HAS_ATTRIBUTE(noreturn) #define CPPUTEST_NORETURN __attribute__((noreturn)) #else #define CPPUTEST_NORETURN @@ -117,7 +119,7 @@ #define CPPUTEST_CHECK_FORMAT_TYPE printf #endif -#if __has_attribute(format) +#if CPPUTEST_HAS_ATTRIBUTE(format) #define CPPUTEST_CHECK_FORMAT(type, format_parameter, other_parameters) __attribute__ ((format (type, format_parameter, other_parameters))) #else #define CPPUTEST_CHECK_FORMAT(type, format_parameter, other_parameters) /* type, format_parameter, other_parameters */ From 43a4a05cefa9b37e378aae0d2318adfa5d469b0c Mon Sep 17 00:00:00 2001 From: Sergey Fedorov Date: Wed, 28 Aug 2024 15:14:54 +0800 Subject: [PATCH 1039/1093] MockParameterTest.cpp: fix ULL constants Fixes: https://github.com/cpputest/cpputest/issues/1801 --- tests/CppUTestExt/MockParameterTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 8b3e594bd..54f719662 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -67,7 +67,7 @@ TEST(MockParameterTest, expectOneIntegerParameterAndValue) TEST(MockParameterTest, expectOneUnsignedLongLongIntegerParameterAndValue) { - unsigned long long value = 0xFFFFAAAAFFFFAAAA; + unsigned long long value = 0xFFFFAAAAFFFFAAAAULL; mock().expectOneCall("foo").withParameter("parameter", value); mock().actualCall("foo").withParameter("parameter", value); @@ -76,7 +76,7 @@ TEST(MockParameterTest, expectOneUnsignedLongLongIntegerParameterAndValue) TEST(MockParameterTest, expectOneLongLongIntegerParameterAndValue) { - long long value = 0x7FFFAAAAFFFFAAAA; + long long value = 0x7FFFAAAAFFFFAAAAULL; mock().expectOneCall("foo").withParameter("parameter", value); mock().actualCall("foo").withParameter("parameter", value); From 7a3d1f2293b77f0f5a2d4b8bc4aaa070088d4a10 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 2 Sep 2024 13:52:02 -0700 Subject: [PATCH 1040/1093] Update and expand CMake integration guide Addresses #1803 --- src/CppUTest/CMakeIntegration-README.md | 108 +++++++++++++++++++++--- 1 file changed, 97 insertions(+), 11 deletions(-) diff --git a/src/CppUTest/CMakeIntegration-README.md b/src/CppUTest/CMakeIntegration-README.md index d39bcced8..7e786502a 100644 --- a/src/CppUTest/CMakeIntegration-README.md +++ b/src/CppUTest/CMakeIntegration-README.md @@ -1,24 +1,110 @@ -It is possible to integrate CppUTest as a sub-module of an enclosing CMake -project. This may be useful if CppUTest is being built for a target platform -other than that of the development host. The following is an example how an -external project can refer to this CMakeLists.txt to build CppUTest as a +# CMake Integration + +## FetchContent + +CMake can automatically download and integrate CppUTest with +[`FetchContent`](https://cmake.org/cmake/help/latest/module/FetchContent.html). +This is the recommended strategy for CMake integration. + +```cmake +cmake_minimum_required(VERSION 3.11) +project(trying_CppUtest) + +include(FetchContent) +FetchContent_Declare( + CppUTest + GIT_REPOSITORY https://github.com/cpputest/cpputest.git + GIT_TAG master # or use release tag, eg. v4.0 + # FIND_PACKAGE_ARGS # Recent CMake versions can integrate FetchContent with find_package + # https://cmake.org/cmake/help/latest/module/FetchContent.html#integrating-with-find-package +) + +# Either set CPPUTEST_PLATFORM to off and # provide a project-specific +# platform.cpp, assign # one of the provided platforms under +# src/Platforms/ # (as shown below), or let CppUTest +# select an appropriate default. +set(CPPUTEST_PLATFORM Gcc STRING BOOL "Platform implementation") + +FetchContent_MakeAvailable(CppUTest) + +add_executable(trying_CppUtest main.cpp) + +target_link_libraries(trying_CppUtest + PRIVATE + CppUTest::CppUTest + #or CppUTest::CppUTestExt +) + +include(CTest) # Enable testing + +# automatically discover CppUTest tests +include(CppUTest) +cpputest_discover_tests(trying_CppUtest) +``` + +## System install + +If CppUTest has been installed on the system, it can be integrated with +[`find_package`](https://cmake.org/cmake/help/latest/command/find_package.html). +The target platform will be the same as the development host. +This is useful for managing a common +CppUTest installation with the system's package manager. + +```cmake +cmake_minimum_required(VERSION 3.8) +project(trying_CppUtest) + +find_package(CppUTest REQUIRED) + +add_executable(trying_CppUtest main.cpp) + +target_link_libraries(trying_CppUtest + PRIVATE + CppUTest + #or CppUTestExt +) + +include(CTest) # Enable testing + +# automatically discover CppUTest tests +include(CppUTest) +cpputest_discover_tests(trying_CppUtest) +``` + +## Shared directory + +It is possible to integrate CppUTest from a local directory. This may be useful +if CppUTest is being built for a target platform other than that of the +development host and CMake 3.11 is not available. The following is an example +how an external project can refer to this CMakeLists.txt to build CppUTest as a library and include it as a target dependency. ```cmake -cmake_minimum_required(VERSION 3.7) +cmake_minimum_required(VERSION 3.8) project(trying_CppUtest) SET(CppUTestRootDirectory /path/to/cpputest) -# Either set CPP_PLATFORM to one of the provided platforms under -# ${CppUTestRootDirectory}/src/Platforms/, or provide a project-specific +# Either set CPPUTEST_PLATFORM to one of the provided platforms under +# /src/Platforms/, or provide a project-specific # platform.cpp (as shown below) -add_subdirectory(${CppUTestRootDirectory}/src/CppUTest CppUTest) +set(CPPUTEST_PLATFORM OFF CACHE BOOL "Platform implementation") +add_subdirectory(${CppUTestRootDirectory} CppUTest) target_sources(CppUTest - PRIVATE - ${PROJECT_SOURCE_DIR}/UtestPlatform.cpp + PRIVATE + ${PROJECT_SOURCE_DIR}/UtestPlatform.cpp ) add_executable(trying_CppUtest main.cpp) -target_link_libraries(trying_CppUtest CppUTest) +target_link_libraries(trying_CppUtest + PRIVATE + CppUTest::CppUTest + #or CppUTest::CppUTestExt +) + +include(CTest) # Enable testing + +# automatically discover CppUTest tests +include(CppUTest) +cpputest_discover_tests(trying_CppUtest) ``` From 181fb3a734307b6c3d146bdbd42953f10fa91ad9 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 3 Sep 2024 08:41:17 +0200 Subject: [PATCH 1041/1093] Ensuring the list include works when overloading the realloc --- examples/AllTests/EventDispatcherTest.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/examples/AllTests/EventDispatcherTest.cpp b/examples/AllTests/EventDispatcherTest.cpp index d7f2767d9..1dc987ba8 100644 --- a/examples/AllTests/EventDispatcherTest.cpp +++ b/examples/AllTests/EventDispatcherTest.cpp @@ -25,9 +25,21 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if CPPUTEST_USE_NEW_MACROS + #undef realloc +#endif + +#include "EventDispatcher.h" + +#if CPPUTEST_USE_NEW_MACROS + #include "CppUTest/MemoryLeakDetectorNewMacros.h" +#endif + + #include "CppUTest/TestHarness.h" #include "CppUTestExt/MockSupport.h" -#include "EventDispatcher.h" + class ObserverMock : public EventObserver { From 6b10165ef1a56778975d4afb0ab03f2f991d84ae Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 3 Sep 2024 08:50:05 +0200 Subject: [PATCH 1042/1093] Reformatted the indenting to pass the formatting build --- examples/AllTests/EventDispatcherTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/AllTests/EventDispatcherTest.cpp b/examples/AllTests/EventDispatcherTest.cpp index 1dc987ba8..3f6cb4441 100644 --- a/examples/AllTests/EventDispatcherTest.cpp +++ b/examples/AllTests/EventDispatcherTest.cpp @@ -27,13 +27,13 @@ #if CPPUTEST_USE_NEW_MACROS - #undef realloc + #undef realloc #endif #include "EventDispatcher.h" #if CPPUTEST_USE_NEW_MACROS - #include "CppUTest/MemoryLeakDetectorNewMacros.h" + #include "CppUTest/MemoryLeakDetectorNewMacros.h" #endif From 6d73134b6b7ccd2d0d732adb0be2ede395234ebc Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 3 Sep 2024 08:56:00 +0200 Subject: [PATCH 1043/1093] The formatter didn't like my empty lines. Perhaps run the formatter before commit? --- examples/AllTests/EventDispatcherTest.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/examples/AllTests/EventDispatcherTest.cpp b/examples/AllTests/EventDispatcherTest.cpp index 3f6cb4441..792178d75 100644 --- a/examples/AllTests/EventDispatcherTest.cpp +++ b/examples/AllTests/EventDispatcherTest.cpp @@ -25,7 +25,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #if CPPUTEST_USE_NEW_MACROS #undef realloc #endif @@ -36,11 +35,9 @@ #include "CppUTest/MemoryLeakDetectorNewMacros.h" #endif - #include "CppUTest/TestHarness.h" #include "CppUTestExt/MockSupport.h" - class ObserverMock : public EventObserver { public: From 7dd59a5bd41ac20d530da29f825c9e4c1346de67 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 3 Sep 2024 14:17:24 +0200 Subject: [PATCH 1044/1093] Also the new seems to cause problems for some of the clang versions --- examples/AllTests/EventDispatcherTest.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/AllTests/EventDispatcherTest.cpp b/examples/AllTests/EventDispatcherTest.cpp index 792178d75..7ea4b52a4 100644 --- a/examples/AllTests/EventDispatcherTest.cpp +++ b/examples/AllTests/EventDispatcherTest.cpp @@ -27,6 +27,7 @@ #if CPPUTEST_USE_NEW_MACROS #undef realloc + #undef new #endif #include "EventDispatcher.h" From 910d519ed09c4dea83c109415dfc4b9234a94258 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 2 Sep 2024 15:42:40 -0700 Subject: [PATCH 1045/1093] Disallow reserved identifier macros We have removed all of these. They are undefined behavior. --- build/MakefileWorker.mk | 8 +++----- cmake/warnings.cmake | 2 +- configure.ac | 12 ++++++------ include/CppUTest/CppUTestConfig.h | 11 ----------- 4 files changed, 10 insertions(+), 23 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index febc9c970..e356ebbf1 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -206,9 +206,8 @@ ifeq ($(COMPILER_NAME),$(CLANG_STR)) # -Wno-old-style-casts -> We only use old style casts by decision # -Wno-c++11-long-long -> When it detects long long, then we can use it and no need for a warning about that # -Wno-c++98-compat-pedantic -> Incompatibilities with C++98, these are happening through #define. -# -Wno-reserved-id-macro -> Macro uses __ in MINGW... can't change that. # -Wno-keyword-macro -> new overload - CPPUTEST_CXX_WARNINGFLAGS += -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables -Wno-old-style-cast -Wno-c++11-long-long -Wno-c++98-compat-pedantic -Wno-reserved-id-macro -Wno-keyword-macro + CPPUTEST_CXX_WARNINGFLAGS += -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables -Wno-old-style-cast -Wno-c++11-long-long -Wno-c++98-compat-pedantic -Wreserved-id-macro -Wno-keyword-macro CPPUTEST_C_WARNINGFLAGS += -Wno-padded # Clang 7 and 12 introduced new warnings by default that don't exist on previous versions of clang and cause errors when present. @@ -219,10 +218,9 @@ CLANG_VERSION_NUM_GT_1200 := $(shell [ "$(CLANG_VERSION_NUM)" -ge 1200 ] && echo CLANG_VERSION_NUM_GT_1205 := $(shell [ "$(CLANG_VERSION_NUM)" -ge 1205 ] && echo Y || echo N) ifeq ($(CLANG_VERSION_NUM_GT_700), Y) -# -Wno-reserved-id-macro -> Many CppUTest macros start with __, which is a reserved namespace # -Wno-keyword-macro -> CppUTest redefines the 'new' keyword for memory leak tracking - CPPUTEST_CXX_WARNINGFLAGS += -Wno-reserved-id-macro -Wno-keyword-macro - CPPUTEST_C_WARNINGFLAGS += -Wno-reserved-id-macro -Wno-keyword-macro + CPPUTEST_CXX_WARNINGFLAGS += -Wno-keyword-macro + CPPUTEST_C_WARNINGFLAGS += -Wno-keyword-macro endif ifeq ($(UNAME_OS),$(MACOSX_STR)) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index 383b9e062..77e4c575d 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -19,7 +19,7 @@ if( -Wmissing-include-dirs -Wno-padded -Wno-disabled-macro-expansion - -Wno-reserved-id-macro + -Wreserved-id-macro -Wno-keyword-macro -Wno-long-long -Wno-unsafe-buffer-usage diff --git a/configure.ac b/configure.ac index b0970a771..33a0b560d 100644 --- a/configure.ac +++ b/configure.ac @@ -226,6 +226,12 @@ AC_MSG_CHECKING([whether CC supports -Wsign-conversion]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wsign-conversion"], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" +# Flag -Wreserved-id-macro +CFLAGS="-Werror -Wreserved-id-macro" +AC_MSG_CHECKING([whether CC support -Wreserved-id-macro]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wreserved-id-macro"], [AC_MSG_RESULT([no])]) +CFLAGS="$saved_cflags" + ##### C++ Warnings # Flag -Wsign-conversion (for CXX) AC_LANG_PUSH([C++]) @@ -266,12 +272,6 @@ AC_MSG_CHECKING([whether CC and CXX supports -Wno-padded]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wno-padded"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-padded" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# Flag -Wno-reserved-id-macro. -CFLAGS="-Werror -Wno-reserved-id-macro" -AC_MSG_CHECKING([whether CC and CXX supports -Wno-reserved-id-macro]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wno-reserved-id-macro"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-reserved-id-macro" ], [AC_MSG_RESULT([no])]) -CFLAGS="$saved_cflags" - # Flag -Wno-keyword-macro. CFLAGS="-Werror -Wno-keyword-macro" AC_MSG_CHECKING([whether CC and CXX supports -Wno-keyword-macro]) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index b4487cf54..4950e7636 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -40,13 +40,6 @@ * */ -#ifdef __clang__ - #pragma clang diagnostic push - #if (__clang_major__ == 3 && __clang_minor__ >= 6) || __clang_major__ >= 4 - #pragma clang diagnostic ignored "-Wreserved-id-macro" - #endif -#endif - /* * Lib C dependencies that are currently still left: * @@ -352,8 +345,4 @@ typedef struct #endif #endif -#ifdef __clang__ - #pragma clang diagnostic pop -#endif - #endif From 8c6df5f0a1a89d5ff410d479dff6fa164198f50b Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 2 Sep 2024 15:53:51 -0700 Subject: [PATCH 1046/1093] Limit keyword macros to leak detection The only required instance of this has local warning suppression. We shouldn't be doing this anywhere else. --- build/MakefileWorker.mk | 10 ++++------ cmake/warnings.cmake | 2 +- configure.ac | 12 ++++++------ 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index e356ebbf1..46852df8d 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -206,9 +206,8 @@ ifeq ($(COMPILER_NAME),$(CLANG_STR)) # -Wno-old-style-casts -> We only use old style casts by decision # -Wno-c++11-long-long -> When it detects long long, then we can use it and no need for a warning about that # -Wno-c++98-compat-pedantic -> Incompatibilities with C++98, these are happening through #define. -# -Wno-keyword-macro -> new overload - CPPUTEST_CXX_WARNINGFLAGS += -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables -Wno-old-style-cast -Wno-c++11-long-long -Wno-c++98-compat-pedantic -Wreserved-id-macro -Wno-keyword-macro - CPPUTEST_C_WARNINGFLAGS += -Wno-padded + CPPUTEST_CXX_WARNINGFLAGS += -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables -Wno-old-style-cast -Wno-c++11-long-long -Wno-c++98-compat-pedantic -Wreserved-id-macro + CPPUTEST_C_WARNINGFLAGS += -Wno-padded -Wreserved-id-macro # Clang 7 and 12 introduced new warnings by default that don't exist on previous versions of clang and cause errors when present. CLANG_VERSION := $(shell echo $(CC_VERSION_OUTPUT) | sed -n 's/.* \([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p') @@ -218,9 +217,8 @@ CLANG_VERSION_NUM_GT_1200 := $(shell [ "$(CLANG_VERSION_NUM)" -ge 1200 ] && echo CLANG_VERSION_NUM_GT_1205 := $(shell [ "$(CLANG_VERSION_NUM)" -ge 1205 ] && echo Y || echo N) ifeq ($(CLANG_VERSION_NUM_GT_700), Y) -# -Wno-keyword-macro -> CppUTest redefines the 'new' keyword for memory leak tracking - CPPUTEST_CXX_WARNINGFLAGS += -Wno-keyword-macro - CPPUTEST_C_WARNINGFLAGS += -Wno-keyword-macro + CPPUTEST_CXX_WARNINGFLAGS += -Wkeyword-macro + CPPUTEST_C_WARNINGFLAGS += -Wkeyword-macro endif ifeq ($(UNAME_OS),$(MACOSX_STR)) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index 77e4c575d..b0487b1ea 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -20,7 +20,7 @@ if( -Wno-padded -Wno-disabled-macro-expansion -Wreserved-id-macro - -Wno-keyword-macro + -Wkeyword-macro -Wno-long-long -Wno-unsafe-buffer-usage ) diff --git a/configure.ac b/configure.ac index 33a0b560d..6e1186906 100644 --- a/configure.ac +++ b/configure.ac @@ -232,6 +232,12 @@ AC_MSG_CHECKING([whether CC support -Wreserved-id-macro]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wreserved-id-macro"], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" +# Flag -Wno-keyword-macro. +CFLAGS="-Werror -Wkeyword-macro" +AC_MSG_CHECKING([whether CC supports -Wkeyword-macro]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wkeyword-macro"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-keyword-macro" ], [AC_MSG_RESULT([no])]) +CFLAGS="$saved_cflags" + ##### C++ Warnings # Flag -Wsign-conversion (for CXX) AC_LANG_PUSH([C++]) @@ -272,12 +278,6 @@ AC_MSG_CHECKING([whether CC and CXX supports -Wno-padded]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wno-padded"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-padded" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# Flag -Wno-keyword-macro. -CFLAGS="-Werror -Wno-keyword-macro" -AC_MSG_CHECKING([whether CC and CXX supports -Wno-keyword-macro]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wno-keyword-macro"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-keyword-macro" ], [AC_MSG_RESULT([no])]) -CFLAGS="$saved_cflags" - AC_LANG_PUSH([C++]) # Flag -Wno-global-constructors. CXXFLAGS="-Werror -Wno-global-constructors" From 685ea5fc245005be4ff563986f12feb963f91bad Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 2 Sep 2024 17:05:14 -0700 Subject: [PATCH 1047/1093] Update VC++ wrapper names --- src/Platforms/VisualCpp/UtestPlatform.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index 2aa7fbb40..992c6b863 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -22,13 +22,13 @@ #include #ifdef STDC_WANT_SECURE_LIB - #define FOPEN(fp, filename, flag) fopen_s((fp), (filename), (flag)) - #define _VSNPRINTF(str, size, trunc, format, args) _vsnprintf_s((str), (size), (trunc), (format), (args)) - #define LOCALTIME(_tm, timer) localtime_s((_tm), (timer)) + #define MAYBE_SECURE_FOPEN(fp, filename, flag) fopen_s((fp), (filename), (flag)) + #define MAYBE_SECURE_VSNPRINTF(str, size, trunc, format, args) _vsnprintf_s((str), (size), (trunc), (format), (args)) + #define MAYBE_SECURE_LOCALTIME(_tm, timer) localtime_s((_tm), (timer)) #else - #define FOPEN(fp, filename, flag) *(fp) = fopen((filename), (flag)) - #define _VSNPRINTF(str, size, trunc, format, args) _vsnprintf((str), (size), (format), (args)) - #define LOCALTIME(_tm, timer) memcpy(_tm, localtime(timer), sizeof(tm)); + #define MAYBE_SECURE_FOPEN(fp, filename, flag) *(fp) = fopen((filename), (flag)) + #define MAYBE_SECURE_VSNPRINTF(str, size, trunc, format, args) _vsnprintf((str), (size), (format), (args)) + #define MAYBE_SECURE_LOCALTIME(_tm, timer) memcpy(_tm, localtime(timer), sizeof(tm)); #endif static jmp_buf test_exit_jmp_buf[10]; @@ -108,7 +108,7 @@ static const char* VisualCppTimeString() time_t the_time = time(NULLPTR); struct tm the_local_time; static char dateTime[80]; - LOCALTIME(&the_local_time, &the_time); + MAYBE_SECURE_LOCALTIME(&the_local_time, &the_time); strftime(dateTime, 80, "%Y-%m-%dT%H:%M:%S", &the_local_time); return dateTime; } @@ -122,7 +122,7 @@ static int VisualCppVSNprintf(char *str, size_t size, const char* format, va_lis char* buf = NULLPTR; size_t sizeGuess = size; - int result = _VSNPRINTF( str, size, _TRUNCATE, format, args); + int result = MAYBE_SECURE_VSNPRINTF( str, size, _TRUNCATE, format, args); str[size-1] = 0; while (result == -1) { @@ -130,7 +130,7 @@ static int VisualCppVSNprintf(char *str, size_t size, const char* format, va_lis free(buf); sizeGuess += 10; buf = (char*)malloc(sizeGuess); - result = _VSNPRINTF( buf, sizeGuess, _TRUNCATE, format, args); + result = MAYBE_SECURE_VSNPRINTF( buf, sizeGuess, _TRUNCATE, format, args); } if (buf) @@ -144,7 +144,7 @@ int (*PlatformSpecificVSNprintf)(char *str, size_t size, const char* format, va_ static PlatformSpecificFile VisualCppFOpen(const char* filename, const char* flag) { FILE* file; - FOPEN(&file, filename, flag); + MAYBE_SECURE_FOPEN(&file, filename, flag); return file; } From 8ea324b1499ff4dcc213eea901380c8f9216ec8a Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 5 Sep 2024 00:25:11 -0700 Subject: [PATCH 1048/1093] Switch from -Wkeyword-macro to -Wkeyword-identifier This covers more and -Wkeyword-macros is enabled by default --- cmake/warnings.cmake | 2 +- configure.ac | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index b0487b1ea..4b763f684 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -20,7 +20,7 @@ if( -Wno-padded -Wno-disabled-macro-expansion -Wreserved-id-macro - -Wkeyword-macro + -Wreserved-identifier -Wno-long-long -Wno-unsafe-buffer-usage ) diff --git a/configure.ac b/configure.ac index 6e1186906..b19c9eb69 100644 --- a/configure.ac +++ b/configure.ac @@ -232,10 +232,10 @@ AC_MSG_CHECKING([whether CC support -Wreserved-id-macro]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wreserved-id-macro"], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" -# Flag -Wno-keyword-macro. -CFLAGS="-Werror -Wkeyword-macro" -AC_MSG_CHECKING([whether CC supports -Wkeyword-macro]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wkeyword-macro"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wno-keyword-macro" ], [AC_MSG_RESULT([no])]) +# Flag -Wreserved-identifier +CFLAGS="-Werror -Wreserved-identifier" +AC_MSG_CHECKING([whether CC supports -Wreserved-identifier]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNINGFLAGS="${CPPUTEST_CWARNINGFLAGS} -Wreserved-identifier"; CPPUTEST_CXXWARNINGFLAGS="${CPPUTEST_CXXWARNINGFLAGS} -Wreserved-identifier" ], [AC_MSG_RESULT([no])]) CFLAGS="$saved_cflags" ##### C++ Warnings From f28be0ee2616d5abd4ba09e7fc48bc714f6f5d73 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 5 Sep 2024 00:27:00 -0700 Subject: [PATCH 1049/1093] Fix reserved test names --- examples/AllTests/FEDemoTest.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index fb888af22..c2f6c17f2 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -52,13 +52,13 @@ TEST_GROUP(FE_Demo) } }; -IGNORE_TEST(FE_Demo, should_fail_when__FE_DIVBYZERO__is_set) +IGNORE_TEST(FE_Demo, should_fail_when_FE_DIVBYZERO_is_set) { float f = 1.0f; CHECK((f /= 0.0f) >= std::numeric_limits::infinity()); } -IGNORE_TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) +IGNORE_TEST(FE_Demo, should_fail_when_FE_UNDERFLOW_is_set) { volatile float f = 0.01f; while (f > 0.0f) @@ -66,7 +66,7 @@ IGNORE_TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) CHECK(f == 0.0f); } -IGNORE_TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) +IGNORE_TEST(FE_Demo, should_fail_when_FE_OVERFLOW_is_set) { volatile float f = 1000.0f; while (f < std::numeric_limits::infinity()) @@ -74,7 +74,7 @@ IGNORE_TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) CHECK(f >= std::numeric_limits::infinity()); } -IGNORE_TEST(FE_Demo, should_fail_when__FE_INEXACT____is_set) +IGNORE_TEST(FE_Demo, should_fail_when_FE_INEXACT_is_set) { IEEE754ExceptionsPlugin::enableInexact(); float f = 10.0f; From 5cb47b4694cd0d3258c740ac2988bed2af5ad04e Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 9 Sep 2024 19:27:32 +0200 Subject: [PATCH 1050/1093] Workaround for the mock FPuts interfering with the TestOutput one, and fixing the tests --- tests/CppUTest/JUnitOutputTest.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index da49b6e43..0612696da 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -312,19 +312,28 @@ class JUnitTestOutputTestRunner extern "C" { static FileSystemForJUnitTestOutputTests fileSystem; + static FileForJUnitOutputTests* currentFile = NULLPTR; static PlatformSpecificFile mockFOpen(const char* filename, const char*) { - return fileSystem.openFile(filename); + currentFile = fileSystem.openFile(filename); + return currentFile; } + static void (*originalFPuts)(const char* str, PlatformSpecificFile file); static void mockFPuts(const char* str, PlatformSpecificFile file) { - ((FileForJUnitOutputTests*)file)->write(str); + if (file == currentFile) { + ((FileForJUnitOutputTests*)file)->write(str); + } + else { + originalFPuts(str, file); + } } static void mockFClose(PlatformSpecificFile file) { + currentFile = NULLPTR; ((FileForJUnitOutputTests*)file)->close(); } } @@ -339,6 +348,7 @@ TEST_GROUP(JUnitOutputTest) void setup() CPPUTEST_OVERRIDE { UT_PTR_SET(PlatformSpecificFOpen, mockFOpen); + originalFPuts = PlatformSpecificFPuts; UT_PTR_SET(PlatformSpecificFPuts, mockFPuts); UT_PTR_SET(PlatformSpecificFClose, mockFClose); junitOutput = new JUnitTestOutput(); @@ -544,7 +554,7 @@ TEST(JUnitOutputTest, testFailureWithNewlineInIt) outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml"); - STRCMP_EQUAL("\n", outputFile->line(6)); + STRCMP_EQUAL("\n", outputFile->line(6)); } TEST(JUnitOutputTest, testFailureWithDifferentFileAndLine) @@ -755,5 +765,5 @@ TEST(JUnitOutputTest, UTPRINTOutputInJUnitOutputWithSpecials) .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("The <rain> in "Spain" Goes \\mainly\\ down the Dr&in \n", outputFile->lineFromTheBack(3)); + STRCMP_EQUAL("The <rain> in "Spain" Goes \\mainly\\ down the Dr&in \n", outputFile->lineFromTheBack(3)); } From 63d9aafe639fbd58f5f8cd2c5070256166eefe3d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 9 Sep 2024 19:44:02 +0200 Subject: [PATCH 1051/1093] Removed #include too much --- src/CppUTest/CommandLineTestRunner.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index f4438e3c5..b50e897e7 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -29,7 +29,6 @@ #include "CppUTest/CommandLineTestRunner.h" #include "CppUTest/TestOutput.h" #include "CppUTest/JUnitTestOutput.h" -#include "CppUTest/PlatformSpecificFunctions.h" #include "CppUTest/TeamCityTestOutput.h" #include "CppUTest/TestRegistry.h" From b76fc5707df6ce6eefb8a011f8f3bfbf273b0938 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 9 Sep 2024 20:18:45 +0200 Subject: [PATCH 1052/1093] Added missing test for \r --- tests/CppUTest/JUnitOutputTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/CppUTest/JUnitOutputTest.cpp b/tests/CppUTest/JUnitOutputTest.cpp index 0612696da..32b5654d4 100644 --- a/tests/CppUTest/JUnitOutputTest.cpp +++ b/tests/CppUTest/JUnitOutputTest.cpp @@ -761,9 +761,9 @@ TEST(JUnitOutputTest, UTPRINTOutputInJUnitOutputWithSpecials) { testCaseRunner->start() .withGroup("groupname") - .withTest("testname").thatPrints("The in \"Spain\"\nGoes \\mainly\\ down the Dr&in\n") + .withTest("testname").thatPrints("The in \"Spain\"\nGoes\r \\mainly\\ down the Dr&in\n") .end(); outputFile = fileSystem.file("cpputest_groupname.xml"); - STRCMP_EQUAL("The <rain> in "Spain" Goes \\mainly\\ down the Dr&in \n", outputFile->lineFromTheBack(3)); + STRCMP_EQUAL("The <rain> in "Spain" Goes \\mainly\\ down the Dr&in \n", outputFile->lineFromTheBack(3)); } From 193b408cad864f2a06a475540fca0fed226183c9 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Mon, 9 Sep 2024 18:41:11 -0700 Subject: [PATCH 1053/1093] Suppress warning from generated autotools header --- include/CppUTest/CppUTestConfig.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 4950e7636..435ea74d2 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -29,7 +29,17 @@ #define CPPUTESTCONFIG_H_ #ifndef CPPUTEST_USE_OWN_CONFIGURATION -#include "CppUTestGeneratedConfig.h" + // The autotools generated header uses reserved names in macros + #ifdef __clang__ + #pragma clang diagnostic push + #if __clang_major__ >= 13 + #pragma clang diagnostic ignored "-Wreserved-identifier" + #endif + #endif + #include "CppUTestGeneratedConfig.h" + #ifdef __clang__ + #pragma clang diagnostic pop + #endif #endif /* From 977aa2d2971e667dcf6fad29e0f7b3609fac5863 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 3 Sep 2024 19:01:05 -0700 Subject: [PATCH 1054/1093] Limit force includes to 1 per file IAR apparently can only accept a single `--preinclude` option. --- include/CppUTest/MemoryLeakDetectorNewMacros.h | 6 ++---- src/CppUTest/CMakeLists.txt | 4 +++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/CppUTest/MemoryLeakDetectorNewMacros.h b/include/CppUTest/MemoryLeakDetectorNewMacros.h index 880b89560..f7985d234 100644 --- a/include/CppUTest/MemoryLeakDetectorNewMacros.h +++ b/include/CppUTest/MemoryLeakDetectorNewMacros.h @@ -40,15 +40,11 @@ #undef strdup #undef strndup #undef CPPUTEST_USE_STRDUP_MACROS - #define CPPUTEST_REINCLUDE_MALLOC_MEMORY_LEAK_DETECTOR #endif #endif #include #include #include - #ifdef CPPUTEST_REINCLUDE_MALLOC_MEMORY_LEAK_DETECTOR - #include "MemoryLeakDetectorMallocMacros.h" - #endif #endif /* Some toolkits, e.g. MFC, provide their own new overloads with signature (size_t, const char *, int). @@ -93,3 +89,5 @@ #define CPPUTEST_USE_NEW_MACROS 1 #endif + +#include "MemoryLeakDetectorMallocMacros.h" diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index b03e644da..f5c3ba532 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -102,7 +102,9 @@ if(NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) endif() target_compile_options(CppUTest PUBLIC - "$<$:${force_include}CppUTest/MemoryLeakDetectorMallocMacros.h>" + # Not all toolchains support multiple force includes (namely IAR), + # so C and C++ each get their own. + "$<$:${force_include}CppUTest/MemoryLeakDetectorMallocMacros.h>" "$<$:${force_include}CppUTest/MemoryLeakDetectorNewMacros.h>" ) endif() From ed2a66f7f6a430158696ce52d398840c4ad3de70 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 3 Sep 2024 19:07:52 -0700 Subject: [PATCH 1055/1093] Repair iar platform This is required for use of `stdout`. --- src/CppUTest/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index f5c3ba532..e336bc185 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -60,6 +60,11 @@ if(CPPUTEST_PLATFORM STREQUAL "c2000") PUBLIC $ ) +elseif(CPPUTEST_PLATFORM STREQUAL "IAR") + target_compile_options(CppUTest + PRIVATE + --dlib_config full + ) endif() if (MINGW) From 0768d962c889168ec68cdfff6270dcb65b150324 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 5 Sep 2024 00:29:05 -0700 Subject: [PATCH 1056/1093] Fix Iar platform spelling CMake COMPILER_ID is "IAR". CppuUTest platform name is "Iar". --- src/CppUTest/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index e336bc185..5833d3801 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -60,7 +60,7 @@ if(CPPUTEST_PLATFORM STREQUAL "c2000") PUBLIC $ ) -elseif(CPPUTEST_PLATFORM STREQUAL "IAR") +elseif(CPPUTEST_PLATFORM STREQUAL "Iar") target_compile_options(CppUTest PRIVATE --dlib_config full From de98f018099f7187a9f31b22e2d8b1f852ef70bc Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 5 Sep 2024 00:30:03 -0700 Subject: [PATCH 1057/1093] Fix IAR force includes A space is not parsed as intended. Use and `=` instead. --- src/CppUTest/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 5833d3801..6fef8e5e4 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -101,7 +101,7 @@ if(NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) if(MSVC) set(force_include "/FI") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "IAR") - set(force_include "--preinclude ") + set(force_include "--preinclude=") else() set(force_include "-include") endif() From 69dc643fa0d22abc3dfc8f341ad7d2efcb960b09 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 22 Nov 2024 20:05:41 -0800 Subject: [PATCH 1058/1093] Resolve new CMake warning CMake 3.31 added a new warning for the added [CMP0175](https://cmake.org/cmake/help/latest/policy/CMP0175.html) policy which uncovered the previously ignored unused `DEPENDS` argument. --- cmake/Modules/CppUTest.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake/Modules/CppUTest.cmake b/cmake/Modules/CppUTest.cmake index fdd8be4d9..3c480df82 100644 --- a/cmake/Modules/CppUTest.cmake +++ b/cmake/Modules/CppUTest.cmake @@ -77,7 +77,6 @@ function(cpputest_discover_tests target) -D "CTEST_FILE=${CTEST_GENERATED_FILE}" -P "${_CPPUTEST_DISCOVERY_SCRIPT}" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" - DEPENDS "${_CPPUTEST_DISCOVERY_SCRIPT}" VERBATIM ) From 9dda473ded5913d47221e7ae50817dbcd45175ff Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Fri, 27 Dec 2024 18:21:21 -0800 Subject: [PATCH 1059/1093] Squelch deprecation warning Most recent CMake started complaining about the pending end of 3.8 support. > ``` > CMake Deprecation Warning at CMakeLists.txt:4 (cmake_minimum_required): > Compatibility with CMake < 3.10 will be removed from a future version of > CMake. > > Update the VERSION argument value. Or, use the ... syntax > to tell CMake that the project requires at least but has been updated > to work with policies introduced by or earlier. > ``` We can retain support by adding a max version. This will no prevent use with newer versions, but indicates forward compatibility.[^1] [^1]: https://cmake.org/cmake/help/latest/command/cmake_minimum_required.html --- CMakeLists.txt | 2 +- examples/CMakeLists.txt | 2 +- src/CppUTest/CMakeIntegration-README.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a98c3de8..b9d8ff764 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ # 2.6.3 is needed for ctest support # 3.1 is needed for target_sources # 3.8 is needed for try_compile improvements (CMP0067) -cmake_minimum_required(VERSION 3.8) +cmake_minimum_required(VERSION 3.8...3.31) project(CppUTest VERSION 4.0 diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 5f443c803..98244cee6 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.8) +cmake_minimum_required(VERSION 3.8...3.31) project(CppUTestExample) diff --git a/src/CppUTest/CMakeIntegration-README.md b/src/CppUTest/CMakeIntegration-README.md index 7e786502a..74ec44aaa 100644 --- a/src/CppUTest/CMakeIntegration-README.md +++ b/src/CppUTest/CMakeIntegration-README.md @@ -51,7 +51,7 @@ This is useful for managing a common CppUTest installation with the system's package manager. ```cmake -cmake_minimum_required(VERSION 3.8) +cmake_minimum_required(VERSION 3.10) project(trying_CppUtest) find_package(CppUTest REQUIRED) @@ -80,7 +80,7 @@ how an external project can refer to this CMakeLists.txt to build CppUTest as a library and include it as a target dependency. ```cmake -cmake_minimum_required(VERSION 3.8) +cmake_minimum_required(VERSION 3.10) project(trying_CppUtest) SET(CppUTestRootDirectory /path/to/cpputest) From d944703759f2961cbdc1a2b06d62432975ea0004 Mon Sep 17 00:00:00 2001 From: David Wang Date: Thu, 9 Jan 2025 13:28:19 -0500 Subject: [PATCH 1060/1093] Github has deprecated "actions/upload-artifact@v3" "actions/download-artifact@v3", bump version to v4. --- .github/workflows/basic.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 375da07aa..91225f79a 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -270,7 +270,7 @@ jobs: - name: Build run: cmake --build cpputest_build --verbose -j - name: Save map files - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: "${{ matrix.name }} map files" path: cpputest_build/**/*.map @@ -318,7 +318,7 @@ jobs: - run: cmake --preset=defaults -DCPPUTEST_JUNIT_REPORT=TRUE - run: cmake --build cpputest_build -j - run: ctest --test-dir cpputest_build - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 if: success() || failure() with: name: test-results From f0205e2861ab306db5ad011050862e1cb58002bb Mon Sep 17 00:00:00 2001 From: "Z. Liu" Date: Sun, 12 Jan 2025 23:04:59 +0800 Subject: [PATCH 1061/1093] configure.ac: fix call of AC_LANG_PROGRAM & unexpected compilation errors 1. multiple line should be enclosed by [[ ]], otherwise compilation of conftest.cpp will failed with: error: extra tokens at end of #include directive [-Werror,-Wextra-tokens] 2. add #include 3. size_t -> std::size_t Signed-off-by: Z. Liu --- configure.ac | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index b19c9eb69..ded69bf76 100644 --- a/configure.ac +++ b/configure.ac @@ -325,13 +325,16 @@ AC_LANG_PUSH([C++]) # Can we use operator delete without exception handling specifier? (clang warns on this!) CXXFLAGS="-Werror" AC_MSG_CHECKING([whether CXX supports operator delete without exception handling specifier]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include \nvoid operator delete(void* mem);])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]); UT_DELETE_MUST_HAVE_EXCEPTION_SPECIFIER="yes"]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +void operator delete(void* mem);]])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]); UT_DELETE_MUST_HAVE_EXCEPTION_SPECIFIER="yes"]) CXXFLAGS="$saved_cxxflags" # Can we use operator new with exception specifier (g++4.7 on MacOSX is broken here) CXXFLAGS="-Werror" AC_MSG_CHECKING([whether CXX supports operator new with exception handling specifier]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include \nvoid* operator new(size_t size) throw(std::bad_alloc);;])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]); UT_NEW_CANT_HAVE_EXCEPTION_SPECIFIER="yes"]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#include +void* operator new(std::size_t size) throw(std::bad_alloc);;]])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]); UT_NEW_CANT_HAVE_EXCEPTION_SPECIFIER="yes"]) CXXFLAGS="$saved_cxxflags" # Flag -Wno-missing-exception-spec From 18fb3ea53701afa78a65c64d144408e3e9a0c638 Mon Sep 17 00:00:00 2001 From: Mara Furland Date: Mon, 13 Jan 2025 17:05:59 -0500 Subject: [PATCH 1062/1093] update README.md fetchcontent cmake section remove test disable dd70ae595cdd7374bd8e160e5d53fe9510904478 renamed TESTS to CPPUTEST_BUILD_TESTING and defaulted it to off, so we no longer need to set it to off in the example --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index cb697925b..8d6ae3727 100644 --- a/README.md +++ b/README.md @@ -248,8 +248,6 @@ FetchContent_Declare( GIT_REPOSITORY https://github.com/cpputest/cpputest.git GIT_TAG master # or use release tag, eg. v4.0 ) -# Set this to ON if you want to have the CppUTests in your project as well. -set(TESTS OFF CACHE BOOL "Switch off CppUTest Test build") FetchContent_MakeAvailable(CppUTest) ``` From 4bd8d01a56991a482745082ce7665b97d91878a8 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 14 Jan 2025 20:59:20 -0800 Subject: [PATCH 1063/1093] Suppress new tidy warnings --- .clang-tidy | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.clang-tidy b/.clang-tidy index ccda7787a..6a48af4f9 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,5 +1,10 @@ --- -Checks: "clang-diagnostic-*,clang-analyzer-*,bugprone-*,-bugprone-easily-swappable-parameters" +Checks: + - clang-diagnostic-* + - clang-analyzer-* + - bugprone-* + - -bugprone-easily-swappable-parameters + - -bugprone-casting-through-void # No C++ casts allowed WarningsAsErrors: "*" FormatStyle: file UseColor: true From 239f70eced278013c4b48a23994a8543cebb2f92 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 19 Jan 2025 21:40:40 -0800 Subject: [PATCH 1064/1093] Ignore coverage output --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b25e988c8..fa41116a8 100644 --- a/.gitignore +++ b/.gitignore @@ -88,6 +88,7 @@ generated/ *.deps/ *.dirstamp *.trs +lcov.info #IAR automatically generated files *.dep From 667e69913f125aa184295ba271407845440f8b9a Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 19 Jan 2025 21:40:25 -0800 Subject: [PATCH 1065/1093] Fix lcov --- .github/workflows/basic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 91225f79a..711476c86 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -300,7 +300,7 @@ jobs: - name: Coverage run: | - lcov --capture --directory . --no-external --output-file lcov.info + lcov --ignore-errors mismatch --capture --directory . --no-external --output-file lcov.info lcov --remove lcov.info --output-file lcov.info '*/tests/*' if: ${{ matrix.name == 'Coverage' }} - name: Coveralls From cc6af364cfb519cff16527bbc4a06bfe56b2299c Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Sun, 19 Jan 2025 22:42:01 -0800 Subject: [PATCH 1066/1093] Repair cygwin --- CMakeLists.txt | 1 + config.h.cmake | 1 + configure.ac | 2 +- src/Platforms/Borland/UtestPlatform.cpp | 6 +++--- src/Platforms/Gcc/UtestPlatform.cpp | 6 +++--- tests/CppUTest/UtestPlatformTest.cpp | 2 +- tests/CppUTest/UtestTest.cpp | 2 +- 7 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b9d8ff764..f0969d1bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -102,6 +102,7 @@ include(GNUInstallDirs) include(CheckTypeSize) include(CheckStructHasMember) set(CMAKE_REQUIRED_FLAGS ${CMAKE_CXX_FLAGS}) +check_cxx_symbol_exists(kill "signal.h" CPPUTEST_HAVE_KILL) check_cxx_symbol_exists(fork "unistd.h" CPPUTEST_HAVE_FORK) check_cxx_symbol_exists(waitpid "sys/wait.h" CPPUTEST_HAVE_WAITPID) check_cxx_symbol_exists(gettimeofday "sys/time.h" CPPUTEST_HAVE_GETTIMEOFDAY) diff --git a/config.h.cmake b/config.h.cmake index d3404aaf9..037a695fb 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -7,6 +7,7 @@ #cmakedefine CPPUTEST_HAVE_FORK #cmakedefine CPPUTEST_HAVE_WAITPID +#cmakedefine CPPUTEST_HAVE_KILL #cmakedefine CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK #cmakedefine CPPUTEST_HAVE_GETTIMEOFDAY diff --git a/configure.ac b/configure.ac index b19c9eb69..b672f4216 100644 --- a/configure.ac +++ b/configure.ac @@ -62,7 +62,7 @@ AC_TYPE_LONG_LONG_INT # Checks for library functions. AC_FUNC_FORK -AC_CHECK_FUNCS([waitpid gettimeofday memset strstr strdup pthread_mutex_lock]) +AC_CHECK_FUNCS([waitpid gettimeofday memset strstr strdup pthread_mutex_lock kill]) AC_CHECK_PROG([CPPUTEST_HAS_GCC], [gcc], [yes], [no]) AC_CHECK_PROG([CPPUTEST_HAS_CLANG], [clang], [yes], [no]) diff --git a/src/Platforms/Borland/UtestPlatform.cpp b/src/Platforms/Borland/UtestPlatform.cpp index 1e6ab3621..3a09a3e68 100644 --- a/src/Platforms/Borland/UtestPlatform.cpp +++ b/src/Platforms/Borland/UtestPlatform.cpp @@ -37,10 +37,11 @@ #ifdef CPPUTEST_HAVE_GETTIMEOFDAY #include #endif -#if defined(CPPUTEST_HAVE_FORK) && defined(CPPUTEST_HAVE_WAITPID) +#if defined(CPPUTEST_HAVE_FORK) && defined(CPPUTEST_HAVE_WAITPID) && defined(CPPUTEST_HAVE_KILL) #include #include #include +#include #endif #include @@ -51,7 +52,6 @@ #include #include #include -#include #ifdef CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK #include @@ -66,7 +66,7 @@ static int jmp_buf_index = 0; // There is a possibility that a compiler provides fork but not waitpid. // TODO consider using spawn() and cwait()? -#if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) +#if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) || !defined(CPPUTEST_HAVE_KILL) static void BorlandPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin*, TestResult* result) { diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 143f91bd6..c86b47839 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -37,10 +37,11 @@ #ifdef CPPUTEST_HAVE_GETTIMEOFDAY #include #endif -#if defined(CPPUTEST_HAVE_FORK) && defined(CPPUTEST_HAVE_WAITPID) +#if defined(CPPUTEST_HAVE_FORK) && defined(CPPUTEST_HAVE_WAITPID) && defined(CPPUTEST_HAVE_KILL) #include #include #include +#include #endif #include @@ -50,7 +51,6 @@ #include #include #include -#include #ifdef CPPUTEST_HAVE_PTHREAD_MUTEX_LOCK #include @@ -62,7 +62,7 @@ static jmp_buf test_exit_jmp_buf[10]; static int jmp_buf_index = 0; // There is a possibility that a compiler provides fork but not waitpid. -#if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) +#if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) || !defined(CPPUTEST_HAVE_KILL) static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin*, TestResult* result) { diff --git a/tests/CppUTest/UtestPlatformTest.cpp b/tests/CppUTest/UtestPlatformTest.cpp index f1fa6f03b..4faf52695 100644 --- a/tests/CppUTest/UtestPlatformTest.cpp +++ b/tests/CppUTest/UtestPlatformTest.cpp @@ -45,7 +45,7 @@ TEST_GROUP(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess) }; // There is a possibility that a compiler provides fork but not waitpid. -#if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) +#if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) || !defined(CPPUTEST_HAVE_KILL) TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, DummyFailsWithMessage) { diff --git a/tests/CppUTest/UtestTest.cpp b/tests/CppUTest/UtestTest.cpp index c14b9f3c9..b1e2fb421 100644 --- a/tests/CppUTest/UtestTest.cpp +++ b/tests/CppUTest/UtestTest.cpp @@ -388,7 +388,7 @@ TEST(UtestShell, RunInSeparateProcessTest) } // There is a possibility that a compiler provides fork but not waitpid. -#if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) +#if !defined(CPPUTEST_HAVE_FORK) || !defined(CPPUTEST_HAVE_WAITPID) || !defined(CPPUTEST_HAVE_KILL) IGNORE_TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) {} From 885070ef7bab8f279083648946cf1f1d2bc0e72d Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 24 Sep 2024 10:57:49 -0700 Subject: [PATCH 1067/1093] More GHS workarounds work around spurious green hills error: `#811-D` --- src/CppUTest/Utest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index eed213a4c..d74a87c79 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -137,8 +137,8 @@ extern "C" { static const NormalTestTerminator normalTestTerminator = NormalTestTerminator(); static const CrashingTestTerminator crashingTestTerminator = CrashingTestTerminator(); -static const TestTerminatorWithoutExceptions normalTestTerminatorWithoutExceptions; -static const CrashingTestTerminatorWithoutExceptions crashingTestTerminatorWithoutExceptions; +static const TestTerminatorWithoutExceptions normalTestTerminatorWithoutExceptions = TestTerminatorWithoutExceptions(); +static const CrashingTestTerminatorWithoutExceptions crashingTestTerminatorWithoutExceptions = CrashingTestTerminatorWithoutExceptions(); const TestTerminator *UtestShell::currentTestTerminator_ = &normalTestTerminator; const TestTerminator *UtestShell::currentTestTerminatorWithoutExceptions_ = &normalTestTerminatorWithoutExceptions; From 1e60529121cd5f6ddec615ced665333fe88da12e Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 24 Sep 2024 13:47:44 -0700 Subject: [PATCH 1068/1093] Prevent attempts to discover cross compiled tests without an emulator --- cmake/Modules/CppUTest.cmake | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/cmake/Modules/CppUTest.cmake b/cmake/Modules/CppUTest.cmake index 3c480df82..160959a5e 100644 --- a/cmake/Modules/CppUTest.cmake +++ b/cmake/Modules/CppUTest.cmake @@ -35,6 +35,17 @@ function(cpputest_discover_tests target) "which is not an executable." ) endif() + + get_property(emulator + TARGET ${target} + PROPERTY CROSSCOMPILING_EMULATOR + ) + if(CMAKE_CROSSCOMPILING) + if(NOT emulator) + message(WARNING "Cannot discover cross compiled tests without an emulator") + return() + endif() + endif() if(NOT DEFINED _EXTRA_ARGS) set(_EXTRA_ARGS -v) @@ -72,7 +83,7 @@ function(cpputest_discover_tests target) "${CMAKE_COMMAND}" -D "TESTS_DETAILED:BOOL=${_DETAILED}" -D "EXECUTABLE=$" - -D "EMULATOR=$" + -D "EMULATOR=${emulator}" -D "ARGS=${_EXTRA_ARGS}" -D "CTEST_FILE=${CTEST_GENERATED_FILE}" -P "${_CPPUTEST_DISCOVERY_SCRIPT}" From df9e0c00ce6b1057851ffdcb8ab011b9662ed160 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Thu, 26 Sep 2024 18:36:00 -0700 Subject: [PATCH 1069/1093] Remove vestigial guards --- CMakeLists.txt | 2 -- examples/AllTests/CMakeLists.txt | 6 ++---- tests/CppUTest/CMakeLists.txt | 8 ++------ tests/CppUTestExt/CMakeLists.txt | 14 +++++--------- 4 files changed, 9 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f0969d1bf..b8748ce89 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,8 +43,6 @@ cmake_dependent_option(CPPUTEST_BUILD_TESTING "Compile and make tests for CppUTe ${PROJECT_IS_TOP_LEVEL} "BUILD_TESTING" OFF) cmake_dependent_option(CPPUTEST_SPLIT_TESTS "Split tests into small executables" OFF "CPPUTEST_BUILD_TESTING" OFF) -cmake_dependent_option(CPPUTEST_TEST_DISCOVERY "Build time test discover" - ON "CPPUTEST_BUILD_TESTING;CMAKE_CROSSCOMPILING_EMULATOR OR NOT CMAKE_CROSSCOMPILING" OFF) cmake_dependent_option(CPPUTEST_TEST_GTEST "Test GoogleTest integration" OFF "CPPUTEST_BUILD_TESTING" OFF) cmake_dependent_option(CPPUTEST_EXAMPLES "Compile and make examples?" diff --git a/examples/AllTests/CMakeLists.txt b/examples/AllTests/CMakeLists.txt index 241b563bf..403718bb4 100644 --- a/examples/AllTests/CMakeLists.txt +++ b/examples/AllTests/CMakeLists.txt @@ -23,7 +23,5 @@ target_link_libraries(ExampleTests CppUTest::CppUTestExt ) -if(CPPUTEST_TEST_DISCOVERY OR NOT DEFINED CPPUTEST_TEST_DISCOVERY) - include(CppUTest) - cpputest_discover_tests(ExampleTests) -endif() +include(CppUTest) +cpputest_discover_tests(ExampleTests) diff --git a/tests/CppUTest/CMakeLists.txt b/tests/CppUTest/CMakeLists.txt index 46b4542ee..0471ce762 100644 --- a/tests/CppUTest/CMakeLists.txt +++ b/tests/CppUTest/CMakeLists.txt @@ -20,9 +20,7 @@ if(NOT CPPUTEST_SPLIT_TESTS) add_mapfile(CppUTestTests) - if(CPPUTEST_TEST_DISCOVERY) - cpputest_discover_tests(CppUTestTests) - endif() + cpputest_discover_tests(CppUTestTests) endif() function(add_cpputest_test number) @@ -32,9 +30,7 @@ function(add_cpputest_test number) string(APPEND name ${number}) add_executable(${name}) add_mapfile(${name}) - if(CPPUTEST_TEST_DISCOVERY) - cpputest_discover_tests(${name}) - endif() + cpputest_discover_tests(${name}) endif() target_sources(${name} diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 1b9298b71..c50179852 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -44,12 +44,10 @@ if(NOT CPPUTEST_SPLIT_TESTS) add_mapfile(CppUTestExtTests) - if(CPPUTEST_TEST_DISCOVERY) - include(CppUTest) - cpputest_discover_tests(CppUTestExtTests - DETAILED FALSE - ) - endif() + include(CppUTest) + cpputest_discover_tests(CppUTestExtTests + DETAILED FALSE + ) endif() function(add_cpputestext_test number) @@ -59,9 +57,7 @@ function(add_cpputestext_test number) string(APPEND name ${number}) add_executable(${name}) add_mapfile(${name}) - if(CPPUTEST_TEST_DISCOVERY) - cpputest_discover_tests(${name}) - endif() + cpputest_discover_tests(${name}) endif() target_sources(${name} From 89eea51a353cf69355d713174fa1bfaba0c5d349 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 21 Jan 2025 19:38:54 -0800 Subject: [PATCH 1070/1093] Revert "Fix IAR force includes" This reverts commit de98f018099f7187a9f31b22e2d8b1f852ef70bc. --- src/CppUTest/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 6fef8e5e4..5833d3801 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -101,7 +101,7 @@ if(NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) if(MSVC) set(force_include "/FI") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "IAR") - set(force_include "--preinclude=") + set(force_include "--preinclude ") else() set(force_include "-include") endif() From 600b057d02bd3208b4bdf49774c1c16a370868ff Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 21 Jan 2025 19:39:27 -0800 Subject: [PATCH 1071/1093] Revert "Limit force includes to 1 per file" This reverts commit 977aa2d2971e667dcf6fad29e0f7b3609fac5863. --- include/CppUTest/MemoryLeakDetectorNewMacros.h | 6 ++++-- src/CppUTest/CMakeLists.txt | 4 +--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/CppUTest/MemoryLeakDetectorNewMacros.h b/include/CppUTest/MemoryLeakDetectorNewMacros.h index f7985d234..880b89560 100644 --- a/include/CppUTest/MemoryLeakDetectorNewMacros.h +++ b/include/CppUTest/MemoryLeakDetectorNewMacros.h @@ -40,11 +40,15 @@ #undef strdup #undef strndup #undef CPPUTEST_USE_STRDUP_MACROS + #define CPPUTEST_REINCLUDE_MALLOC_MEMORY_LEAK_DETECTOR #endif #endif #include #include #include + #ifdef CPPUTEST_REINCLUDE_MALLOC_MEMORY_LEAK_DETECTOR + #include "MemoryLeakDetectorMallocMacros.h" + #endif #endif /* Some toolkits, e.g. MFC, provide their own new overloads with signature (size_t, const char *, int). @@ -89,5 +93,3 @@ #define CPPUTEST_USE_NEW_MACROS 1 #endif - -#include "MemoryLeakDetectorMallocMacros.h" diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 5833d3801..f117333e0 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -107,9 +107,7 @@ if(NOT CPPUTEST_MEM_LEAK_DETECTION_DISABLED) endif() target_compile_options(CppUTest PUBLIC - # Not all toolchains support multiple force includes (namely IAR), - # so C and C++ each get their own. - "$<$:${force_include}CppUTest/MemoryLeakDetectorMallocMacros.h>" + "$<$:${force_include}CppUTest/MemoryLeakDetectorMallocMacros.h>" "$<$:${force_include}CppUTest/MemoryLeakDetectorNewMacros.h>" ) endif() From 1f065ec820d96bc355c08d88232f42828c7392c1 Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Tue, 21 Jan 2025 22:24:08 -0800 Subject: [PATCH 1072/1093] Repair old VS builds --- CppUTest.vcproj | 4 ++++ CppUTest.vcxproj | 1 + Makefile.am | 1 + include/CppUTest/MemoryLeakDetectorForceInclude.h | 4 ++++ platforms/iar/CppUTest.ewp | 3 +-- platforms/iar/CppUTestExt.ewp | 3 +-- platforms/iar/CppUTestExtTest.ewp | 3 +-- platforms/iar/CppUTestTest.ewp | 3 +-- src/CppUTest/CMakeLists.txt | 6 +++--- tests/AllTests.vcproj | 2 +- 10 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 include/CppUTest/MemoryLeakDetectorForceInclude.h diff --git a/CppUTest.vcproj b/CppUTest.vcproj index 82d843b40..9a8bfdcc2 100644 --- a/CppUTest.vcproj +++ b/CppUTest.vcproj @@ -947,6 +947,10 @@ RelativePath=".\include\CppUTest\MemoryLeakDetector.h" > + + diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index 8f7a5148a..4a2f18e61 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -271,6 +271,7 @@ + diff --git a/Makefile.am b/Makefile.am index fd1870225..3406079c7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -77,6 +77,7 @@ include_cpputest_HEADERS = \ include/CppUTest/CppUTestConfig.h \ include/CppUTest/JUnitTestOutput.h \ include/CppUTest/MemoryLeakDetector.h \ + include/CppUTest/MemoryLeakDetectorForceInclude.h \ include/CppUTest/MemoryLeakDetectorMallocMacros.h \ include/CppUTest/MemoryLeakDetectorNewMacros.h \ include/CppUTest/MemoryLeakWarningPlugin.h \ diff --git a/include/CppUTest/MemoryLeakDetectorForceInclude.h b/include/CppUTest/MemoryLeakDetectorForceInclude.h new file mode 100644 index 000000000..6de90e177 --- /dev/null +++ b/include/CppUTest/MemoryLeakDetectorForceInclude.h @@ -0,0 +1,4 @@ +// Not all toolchains support multiple force includes (namely IAR), +// so we wrap the two in a single header. +#include "MemoryLeakDetectorMallocMacros.h" +#include "MemoryLeakDetectorNewMacros.h" diff --git a/platforms/iar/CppUTest.ewp b/platforms/iar/CppUTest.ewp index 72be22fbc..f2f1fbe16 100644 --- a/platforms/iar/CppUTest.ewp +++ b/platforms/iar/CppUTest.ewp @@ -262,8 +262,7 @@

    -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

  • -q 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