From 378bc3711a0879f5fb2be90fa15cfbf71f98ca62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Bu=C3=9Fmann?= Date: Tue, 10 Mar 2015 10:06:37 +0100 Subject: [PATCH 0001/1345] Fix compilation issue with VS6: y:\github\paulbussmann\cpputest\src\cpputest\memoryleakdetector.cpp(81) : error C2374: 'p' : redefinition; multiple initialization y:\github\paulbussmann\cpputest\src\cpputest\memoryleakdetector.cpp(75) : see declaration of 'p' y:\github\paulbussmann\cpputest\src\cpputest\memoryleakdetector.cpp(89) : error C2374: 'p' : redefinition; multiple initialization y:\github\paulbussmann\cpputest\src\cpputest\memoryleakdetector.cpp(75) : see declaration of 'p' --- src/CppUTest/MemoryLeakDetector.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/CppUTest/MemoryLeakDetector.cpp b/src/CppUTest/MemoryLeakDetector.cpp index df9286e96..6fa480e98 100644 --- a/src/CppUTest/MemoryLeakDetector.cpp +++ b/src/CppUTest/MemoryLeakDetector.cpp @@ -63,6 +63,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; while (currentPos < memorySize) { add(" %04lx: ", currentPos); @@ -72,13 +73,13 @@ void SimpleStringBuffer::addMemoryDump(const void* memory, size_t memorySize) } const size_t leftoverBytes = maxLineBytes - bytesInLine; - for (size_t p = 0; p < bytesInLine; p++) { + for (p = 0; p < bytesInLine; p++) { add("%02hhx ", byteMemory[currentPos + p]); if (p == ((maxLineBytes / 2) - 1)) { add(" "); } } - for (size_t p = 0; p < leftoverBytes; p++) { + for (p = 0; p < leftoverBytes; p++) { add(" "); } if (leftoverBytes > (maxLineBytes/2)) { From 5cc6186ec6eaa88b428dce69c5b9cbe9bbfbdd12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Bu=C3=9Fmann?= Date: Tue, 10 Mar 2015 11:09:28 +0100 Subject: [PATCH 0002/1345] Adding to CPPUTEST_MEM_LEAK_DETECTION_DISABLED to VS6 project to get around unresolved externals: 1>CppUTest.lib(MemoryLeakWarningPlugin.obj) : error LNK2001: unresolved external symbol "public: __thiscall std::bad_alloc::bad_alloc(class std::bad_alloc const &)" (??0bad_alloc@std@@QAE@ABV01@@Z) 1>CppUTest.lib(MemoryLeakWarningPlugin.obj) : error LNK2001: unresolved external symbol "public: virtual __thiscall std::bad_alloc::~bad_alloc(void)" (??1bad_alloc@std@@UAE@XZ) 1>CppUTest.lib(MemoryLeakWarningPlugin.obj) : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall std::bad_alloc::bad_alloc(char const *)" (__imp_??0bad_alloc@std@@QAE@PBD@Z) referenced in function "void * __cdecl mem_leak_operator_new(unsigned int)" (?mem_leak_operator_new@@YAPAXI@Z) --- CppUTest.dsp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CppUTest.dsp b/CppUTest.dsp index b27d971ef..64bc37879 100644 --- a/CppUTest.dsp +++ b/CppUTest.dsp @@ -41,7 +41,7 @@ RSC=rc.exe # 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" /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" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -64,7 +64,7 @@ LIB32=link.exe -lib # 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" /FR /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" /FR /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" From ca512e836c3bd56b551af772228dc7c221828dd8 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 11 Jan 2016 08:27:03 -0600 Subject: [PATCH 0003/1345] Refactored to use includes only --- .travis.yml | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index efbdeeae9..1ae9aba70 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,19 +17,29 @@ env: - BUILD=cmake-coverage - BUILD=make-dos matrix: - exclude: - - env: BUILD=cmake-coverage - - env: BUILD=autotools_old_compilers - - env: BUILD=make-dos - - env: BUILD=test_report - - compiler: wcl include: - - env: BUILD=cmake-coverage - compiler: gcc - - env: BUILD=test_report - compiler: gcc - - env: BUILD=make-dos - compiler: wcl + - compiler: clang + env: BUILD=autotools + - compiler: clang + env: BUILD=cmake + - compiler: clang + env: BUILD=autotools_gtest + - compiler: clang + env: BUILD=cmake_gtest + - compiler: gcc + env: BUILD=autotools + - compiler: gcc + env: BUILD=cmake + - compiler: gcc + env: BUILD=autotools_gtest + - compiler: gcc + env: BUILD=cmake_gtest + - compiler: gcc + env: BUILD=cmake-coverage + - compiler: gcc + env: BUILD=test_report + - compiler: wcl + env: BUILD=make-dos global: - secure: |- P05xUfJVw5YM4hF7hzQLjyMzDD4Q1/fyWP9Uk5aK5VrSWNY99EuxldXI5QK/ From 1a5d16d2cac71dfc899f1f19c934b4e2064de648 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 11 Jan 2016 08:41:43 -0600 Subject: [PATCH 0004/1345] Only call things out in the matrix --- .travis.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1ae9aba70..5bbb2e91a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,8 @@ language: cpp os: - linux -compiler: -- clang -- gcc -- wcl rvm: - 1.9.3 -env: - - BUILD=autotools - - BUILD=cmake - - BUILD=autotools_gtest - - BUILD=cmake_gtest - - BUILD=test_report - - BUILD=autotools_old_compilers - - BUILD=cmake-coverage - - BUILD=make-dos matrix: include: - compiler: clang From a6c6ca274682b25d04ad188ea22aad6b8a78eb29 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 11 Jan 2016 19:11:11 -0600 Subject: [PATCH 0005/1345] Move things to global config --- .travis.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5bbb2e91a..50bb7f4d6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,4 @@ language: cpp -os: - - linux -rvm: -- 1.9.3 matrix: include: - compiler: clang @@ -28,6 +24,8 @@ matrix: - compiler: wcl env: BUILD=make-dos global: +- os: linux +- rvm: '1.9.3' - secure: |- P05xUfJVw5YM4hF7hzQLjyMzDD4Q1/fyWP9Uk5aK5VrSWNY99EuxldXI5QK/ vA1NkcW49tQW1wQvBlRtdlLNOmUfDP/oiJFXPwNn4dqwOIOEet2P7JO/5hnH From d441586cee3cc96b4d323c9ae97cf4b08b50aa77 Mon Sep 17 00:00:00 2001 From: nanakira Date: Wed, 13 Jan 2016 23:08:39 +0900 Subject: [PATCH 0006/1345] Update READMEs to make InstallScript.sh working --- README_InstallCppUTest.txt | 4 ++-- scripts/README.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README_InstallCppUTest.txt b/README_InstallCppUTest.txt index 36dca879a..ebe0f9efa 100644 --- a/README_InstallCppUTest.txt +++ b/README_InstallCppUTest.txt @@ -57,8 +57,8 @@ 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/CppSourceTemplates - > ./InstallScripts.sh + > cd /CppUTest + > ./scripts/InstallScripts.sh This command adds some symbolic links to /usr/local/bin, so you have to run it as root. diff --git a/scripts/README.txt b/scripts/README.txt index 83301d737..8840b1b0a 100644 --- a/scripts/README.txt +++ b/scripts/README.txt @@ -10,7 +10,7 @@ Run InstallScripts.sh to 2) Define symbolic links for each of the scripts Like this: - ./InstallScripts.sh + ./scripts/InstallScripts.sh You might have to add the execute privilege to the shell scripts. Like this: From 8f2848a0f434a0dbf039af7d6408e2880d1715f4 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 13 Jan 2016 15:06:23 +0100 Subject: [PATCH 0007/1345] Add missing sources and tests to VC6 project --- CppUTest.dsp | 4 ++++ tests/AllTests.dsp | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/CppUTest.dsp b/CppUTest.dsp index aca1da8e4..00d06d894 100644 --- a/CppUTest.dsp +++ b/CppUTest.dsp @@ -166,6 +166,10 @@ SOURCE=.\SRC\CPPUTEST\SimpleString.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 diff --git a/tests/AllTests.dsp b/tests/AllTests.dsp index 4de37f03a..fdf86ad60 100644 --- a/tests/AllTests.dsp +++ b/tests/AllTests.dsp @@ -106,6 +106,14 @@ SOURCE=.\AllocationInCppFile.cpp # End Source File # Begin Source File +SOURCE=.\AllocLetTestFree.c +# End Source File +# Begin Source File + +SOURCE=.\AllocLetTestFreeTest.cpp +# End Source File +# Begin Source File + SOURCE=.\CppUTestExt\AllTests.cpp # End Source File # Begin Source File @@ -230,10 +238,18 @@ SOURCE=.\SetPluginTest.cpp # End Source File # Begin Source File +SOURCE=.\SimpleMutexTest.cpp +# End Source File +# Begin Source File + SOURCE=.\SimpleStringTest.cpp # End Source File # Begin Source File +SOURCE=.\TestFailureNaNTest.cpp +# End Source File +# Begin Source File + SOURCE=.\TestFailureTest.cpp # End Source File # Begin Source File @@ -270,6 +286,14 @@ SOURCE=.\TestResultTest.cpp # End Source File # Begin Source File +SOURCE=.\TestUtestMacro.cpp +# End Source File +# Begin Source File + +SOURCE=.\UtestPlatformTest.cpp +# End Source File +# Begin Source File + SOURCE=.\UtestTest.cpp # End Source File # End Group From bd15b26c82a831c65e4d9c8341f90cbe3e2c9aa7 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 13 Jan 2016 15:08:44 +0100 Subject: [PATCH 0008/1345] Fix test failure in VC6 ...\MockSupportTest.cpp(186): error: Failure in TEST(MockSupportTestWithFixture, CHECK_NO_MOCK_FAILURE_LOCATION_failed) ..\include\CppUTest/TestTestingFixture.h(112): error: actual <. OK (1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out, 0 ms) > did not contain --- tests/CppUTestExt/MockFailureTest.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/CppUTestExt/MockFailureTest.h b/tests/CppUTestExt/MockFailureTest.h index 101ef6977..3bacac6dc 100644 --- a/tests/CppUTestExt/MockFailureTest.h +++ b/tests/CppUTestExt/MockFailureTest.h @@ -72,10 +72,8 @@ inline UtestShell* mockFailureTest() return MockFailureReporterForTest::getReporter()->getTestToFail(); } -inline SimpleString mockFailureString() -{ - return MockFailureReporterForTest::getReporter()->mockFailureString; -} +#define mockFailureString() /* inline function will not work in VC6 */ \ + MockFailureReporterForTest::getReporter()->mockFailureString inline void CLEAR_MOCK_FAILURE() { From e1d05254fc2c8184d1f60bfa012ee4ebb7a4a606 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 14 Jan 2016 07:08:58 +0100 Subject: [PATCH 0009/1345] Revert "Fix test failure in VC6" This reverts commit bd15b26c82a831c65e4d9c8341f90cbe3e2c9aa7. --- tests/CppUTestExt/MockFailureTest.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/CppUTestExt/MockFailureTest.h b/tests/CppUTestExt/MockFailureTest.h index 3bacac6dc..101ef6977 100644 --- a/tests/CppUTestExt/MockFailureTest.h +++ b/tests/CppUTestExt/MockFailureTest.h @@ -72,8 +72,10 @@ inline UtestShell* mockFailureTest() return MockFailureReporterForTest::getReporter()->getTestToFail(); } -#define mockFailureString() /* inline function will not work in VC6 */ \ - MockFailureReporterForTest::getReporter()->mockFailureString +inline SimpleString mockFailureString() +{ + return MockFailureReporterForTest::getReporter()->mockFailureString; +} inline void CLEAR_MOCK_FAILURE() { From 4f0c6491bceabf35adb4413fd9957d6d936cab09 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 14 Jan 2016 06:14:56 +0000 Subject: [PATCH 0010/1345] Fix VC6 bug by prohibiting inlining --- tests/AllTests.dsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/AllTests.dsp b/tests/AllTests.dsp index fdf86ad60..be25a5c50 100644 --- a/tests/AllTests.dsp +++ b/tests/AllTests.dsp @@ -42,7 +42,7 @@ RSC=rc.exe # 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 "..\include\Platforms\VisualCpp" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "CPPUTEST_MEM_LEAK_DETECTION_DISABLED" /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" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe From acafe0215f3b9f83c50ff1a4380808257e39466f Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 14 Jan 2016 07:18:31 +0000 Subject: [PATCH 0011/1345] Rename MockFailureTest.h to MockFailureReporterForTest.h --- .../{MockFailureTest.h => MockFailureReporterForTest.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/CppUTestExt/{MockFailureTest.h => MockFailureReporterForTest.h} (100%) diff --git a/tests/CppUTestExt/MockFailureTest.h b/tests/CppUTestExt/MockFailureReporterForTest.h similarity index 100% rename from tests/CppUTestExt/MockFailureTest.h rename to tests/CppUTestExt/MockFailureReporterForTest.h From 0d36d2c15971d3021858029a30790dfa0c79def0 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 14 Jan 2016 08:43:22 +0000 Subject: [PATCH 0012/1345] Pull out MockFailureReporterForTest.cpp --- Makefile.am | 1 + tests/CppUTestExt/CMakeLists.txt | 1 + .../CppUTestExt/ExpectedFunctionsListTest.cpp | 2 +- tests/CppUTestExt/MockActualCallTest.cpp | 2 +- tests/CppUTestExt/MockCallTest.cpp | 2 +- .../CppUTestExt/MockComparatorCopierTest.cpp | 2 +- tests/CppUTestExt/MockExpectedCallTest.cpp | 2 +- .../MockFailureReporterForTest.cpp | 120 ++++++++++++++++++ .../CppUTestExt/MockFailureReporterForTest.h | 99 ++------------- tests/CppUTestExt/MockFailureTest.cpp | 2 +- tests/CppUTestExt/MockHierarchyTest.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 +- 16 files changed, 148 insertions(+), 97 deletions(-) create mode 100644 tests/CppUTestExt/MockFailureReporterForTest.cpp diff --git a/Makefile.am b/Makefile.am index 7aba1aae2..debba7dd5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -185,6 +185,7 @@ CppUTestExtTests_SOURCES = \ tests/CppUTestExt/MockComparatorCopierTest.cpp \ tests/CppUTestExt/MockExpectedCallTest.cpp \ tests/CppUTestExt/ExpectedFunctionsListTest.cpp \ + tests/CppUTestExt/MockFailureReporterForTest.cpp \ tests/CppUTestExt/MockFailureTest.cpp \ tests/CppUTestExt/MockHierarchyTest.cpp \ tests/CppUTestExt/MockNamedValueTest.cpp \ diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 0955c2419..5231e59c5 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -12,6 +12,7 @@ set(CppUTestExtTests_src MockComparatorCopierTest.cpp MockExpectedCallTest.cpp ExpectedFunctionsListTest.cpp + MockFailureReporterForTest.cpp MockFailureTest.cpp MockHierarchyTest.cpp MockNamedValueTest.cpp diff --git a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp index 5fbfa1e20..1c374bece 100644 --- a/tests/CppUTestExt/ExpectedFunctionsListTest.cpp +++ b/tests/CppUTestExt/ExpectedFunctionsListTest.cpp @@ -29,7 +29,7 @@ #include "CppUTestExt/MockExpectedCallsList.h" #include "CppUTestExt/MockCheckedExpectedCall.h" #include "CppUTestExt/MockFailure.h" -#include "MockFailureTest.h" +#include "MockFailureReporterForTest.h" TEST_GROUP(MockExpectedCallsList) { diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index edc372594..60839a5dc 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -30,7 +30,7 @@ #include "CppUTestExt/MockCheckedExpectedCall.h" #include "CppUTestExt/MockExpectedCallsList.h" #include "CppUTestExt/MockFailure.h" -#include "MockFailureTest.h" +#include "MockFailureReporterForTest.h" TEST_GROUP(MockCheckedActualCall) { diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index 2690bf02b..ed116f518 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -27,7 +27,7 @@ #include "CppUTest/TestHarness.h" #include "CppUTest/TestTestingFixture.h" -#include "MockFailureTest.h" +#include "MockFailureReporterForTest.h" TEST_GROUP(MockCallTest) { diff --git a/tests/CppUTestExt/MockComparatorCopierTest.cpp b/tests/CppUTestExt/MockComparatorCopierTest.cpp index fff4a5346..a354e3ffc 100644 --- a/tests/CppUTestExt/MockComparatorCopierTest.cpp +++ b/tests/CppUTestExt/MockComparatorCopierTest.cpp @@ -26,7 +26,7 @@ */ #include "CppUTest/TestHarness.h" -#include "MockFailureTest.h" +#include "MockFailureReporterForTest.h" TEST_GROUP(MockComparatorCopierTest) { diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 3e70bfcea..45157ca28 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -28,7 +28,7 @@ #include "CppUTest/TestHarness.h" #include "CppUTestExt/MockCheckedExpectedCall.h" #include "CppUTestExt/MockFailure.h" -#include "MockFailureTest.h" +#include "MockFailureReporterForTest.h" class TypeForTestingExpectedFunctionCall { diff --git a/tests/CppUTestExt/MockFailureReporterForTest.cpp b/tests/CppUTestExt/MockFailureReporterForTest.cpp new file mode 100644 index 000000000..d6f61e15d --- /dev/null +++ b/tests/CppUTestExt/MockFailureReporterForTest.cpp @@ -0,0 +1,120 @@ +/* + * 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 "MockFailureReporterForTest.h" + +#define CHECK_EXPECTED_MOCK_FAILURE(expectedFailure) CHECK_EXPECTED_MOCK_FAILURE_LOCATION(expectedFailure, __FILE__, __LINE__) +#define CHECK_NO_MOCK_FAILURE() CHECK_NO_MOCK_FAILURE_LOCATION(__FILE__, __LINE__) + + + + void MockFailureReporterForTest::failTest(const MockFailure& failure) + { + mockFailureString = failure.getMessage(); + } + + MockFailureReporterForTest* MockFailureReporterForTest::getReporter() + { + static MockFailureReporterForTest reporter; + return &reporter; + } + + MockFailureReporterInstaller::MockFailureReporterInstaller() + { + mock().setMockFailureStandardReporter(MockFailureReporterForTest::getReporter()); + } + + MockFailureReporterInstaller::~MockFailureReporterInstaller() + { + mock().setMockFailureStandardReporter(NULL); + } + + +UtestShell* mockFailureTest() +{ + return MockFailureReporterForTest::getReporter()->getTestToFail(); +} + +SimpleString mockFailureString() +{ + return MockFailureReporterForTest::getReporter()->mockFailureString; +} + +void CLEAR_MOCK_FAILURE() +{ + MockFailureReporterForTest::getReporter()->mockFailureString = ""; +} + +void CHECK_EXPECTED_MOCK_FAILURE_LOCATION(const MockFailure& expectedFailure, const char* file, int line) +{ + SimpleString expectedFailureString = expectedFailure.getMessage(); + SimpleString actualFailureString = mockFailureString(); + CLEAR_MOCK_FAILURE(); + if (expectedFailureString != actualFailureString) + { + SimpleString error = "MockFailures are different.\n"; + error += "Expected MockFailure:\n\t"; + error += expectedFailureString; + error += "\nActual MockFailure:\n\t"; + error += actualFailureString; + FAIL_LOCATION(error.asCharString(), file, line); + } +} + +void CHECK_NO_MOCK_FAILURE_LOCATION(const char* file, int line) +{ + if (mockFailureString() != "") { + SimpleString error = "Unexpected mock failure:\n"; + error += mockFailureString(); + CLEAR_MOCK_FAILURE(); + FAIL_LOCATION(error.asCharString(), file, line); + + } + CLEAR_MOCK_FAILURE(); +} + + MockExpectedCallsListForTest::~MockExpectedCallsListForTest() + { + deleteAllExpectationsAndClearList(); + } + + MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(const SimpleString& name) + { + MockCheckedExpectedCall* newCall = new MockCheckedExpectedCall; + newCall->withName(name); + addExpectedCall(newCall); + return newCall; + } + + MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(const SimpleString& name, int order) + { + MockCheckedExpectedCall* newCall = addFunction(name); + newCall->withCallOrder(order); + return newCall; + } + + diff --git a/tests/CppUTestExt/MockFailureReporterForTest.h b/tests/CppUTestExt/MockFailureReporterForTest.h index 101ef6977..bbc58e793 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.h +++ b/tests/CppUTestExt/MockFailureReporterForTest.h @@ -25,113 +25,42 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef D_TestMockFailure_h -#define D_TestMockFailure_h +#ifndef D_MockFailureReporterForTest_h +#define D_MockFailureReporterForTest_h #include "CppUTestExt/MockSupport.h" #define CHECK_EXPECTED_MOCK_FAILURE(expectedFailure) CHECK_EXPECTED_MOCK_FAILURE_LOCATION(expectedFailure, __FILE__, __LINE__) #define CHECK_NO_MOCK_FAILURE() CHECK_NO_MOCK_FAILURE_LOCATION(__FILE__, __LINE__) - class MockFailureReporterForTest : public MockFailureReporter { public: - SimpleString mockFailureString; - virtual void failTest(const MockFailure& failure) - { - mockFailureString = failure.getMessage(); - } - - static MockFailureReporterForTest* getReporter() - { - static MockFailureReporterForTest reporter; - return &reporter; - } + virtual void failTest(const MockFailure& failure); + static MockFailureReporterForTest* getReporter(); }; class MockFailureReporterInstaller { public: - MockFailureReporterInstaller() - { - mock().setMockFailureStandardReporter(MockFailureReporterForTest::getReporter()); - } - - ~MockFailureReporterInstaller() - { - mock().setMockFailureStandardReporter(NULL); - } + MockFailureReporterInstaller(); + ~MockFailureReporterInstaller(); }; - -inline UtestShell* mockFailureTest() -{ - return MockFailureReporterForTest::getReporter()->getTestToFail(); -} - -inline SimpleString mockFailureString() -{ - return MockFailureReporterForTest::getReporter()->mockFailureString; -} - -inline void CLEAR_MOCK_FAILURE() -{ - MockFailureReporterForTest::getReporter()->mockFailureString = ""; -} - -inline void CHECK_EXPECTED_MOCK_FAILURE_LOCATION(const MockFailure& expectedFailure, const char* file, int line) -{ - SimpleString expectedFailureString = expectedFailure.getMessage(); - SimpleString actualFailureString = mockFailureString(); - CLEAR_MOCK_FAILURE(); - if (expectedFailureString != actualFailureString) - { - SimpleString error = "MockFailures are different.\n"; - error += "Expected MockFailure:\n\t"; - error += expectedFailureString; - error += "\nActual MockFailure:\n\t"; - error += actualFailureString; - FAIL_LOCATION(error.asCharString(), file, line); - } -} - -inline void CHECK_NO_MOCK_FAILURE_LOCATION(const char* file, int line) -{ - if (mockFailureString() != "") { - SimpleString error = "Unexpected mock failure:\n"; - error += mockFailureString(); - CLEAR_MOCK_FAILURE(); - FAIL_LOCATION(error.asCharString(), file, line); - - } - CLEAR_MOCK_FAILURE(); -} +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); class MockExpectedCallsListForTest : public MockExpectedCallsList { public: - ~MockExpectedCallsListForTest() - { - deleteAllExpectationsAndClearList(); - } - - MockCheckedExpectedCall* addFunction(const SimpleString& name) - { - MockCheckedExpectedCall* newCall = new MockCheckedExpectedCall; - newCall->withName(name); - addExpectedCall(newCall); - return newCall; - } - - MockCheckedExpectedCall* addFunction(const SimpleString& name, int order) - { - MockCheckedExpectedCall* newCall = addFunction(name); - newCall->withCallOrder(order); - return newCall; - } + ~MockExpectedCallsListForTest(); + MockCheckedExpectedCall* addFunction(const SimpleString& name); + MockCheckedExpectedCall* addFunction(const SimpleString& name, int order); }; #endif diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index eda54d930..6e6e56b96 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -29,7 +29,7 @@ #include "CppUTestExt/MockFailure.h" #include "CppUTestExt/MockCheckedExpectedCall.h" #include "CppUTestExt/MockExpectedCallsList.h" -#include "MockFailureTest.h" +#include "MockFailureReporterForTest.h" TEST_GROUP(MockFailureTest) { diff --git a/tests/CppUTestExt/MockHierarchyTest.cpp b/tests/CppUTestExt/MockHierarchyTest.cpp index 8503db0d7..ac4f9e51d 100644 --- a/tests/CppUTestExt/MockHierarchyTest.cpp +++ b/tests/CppUTestExt/MockHierarchyTest.cpp @@ -26,7 +26,7 @@ */ #include "CppUTest/TestHarness.h" -#include "MockFailureTest.h" +#include "MockFailureReporterForTest.h" TEST_GROUP(MockHierarchyTest) { diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 990e95f2c..a7f81b0f7 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -27,7 +27,7 @@ */ #include "CppUTest/TestHarness.h" -#include "MockFailureTest.h" +#include "MockFailureReporterForTest.h" TEST_GROUP(MockParameterTest) { diff --git a/tests/CppUTestExt/MockPluginTest.cpp b/tests/CppUTestExt/MockPluginTest.cpp index acda39cd8..18878203f 100644 --- a/tests/CppUTestExt/MockPluginTest.cpp +++ b/tests/CppUTestExt/MockPluginTest.cpp @@ -28,7 +28,7 @@ #include "CppUTest/TestOutput.h" #include "CppUTestExt/MockSupport.h" #include "CppUTestExt/MockSupportPlugin.h" -#include "MockFailureTest.h" +#include "MockFailureReporterForTest.h" #include "CppUTest/TestTestingFixture.h" TEST_GROUP(MockPlugin) diff --git a/tests/CppUTestExt/MockReturnValueTest.cpp b/tests/CppUTestExt/MockReturnValueTest.cpp index 3121423cd..bfaab8ca5 100644 --- a/tests/CppUTestExt/MockReturnValueTest.cpp +++ b/tests/CppUTestExt/MockReturnValueTest.cpp @@ -26,7 +26,7 @@ */ #include "CppUTest/TestHarness.h" -#include "MockFailureTest.h" +#include "MockFailureReporterForTest.h" TEST_GROUP(MockReturnValueTest) { diff --git a/tests/CppUTestExt/MockStrictOrderTest.cpp b/tests/CppUTestExt/MockStrictOrderTest.cpp index dcb3e4750..17682ca5d 100644 --- a/tests/CppUTestExt/MockStrictOrderTest.cpp +++ b/tests/CppUTestExt/MockStrictOrderTest.cpp @@ -26,7 +26,7 @@ */ #include "CppUTest/TestHarness.h" -#include "MockFailureTest.h" +#include "MockFailureReporterForTest.h" TEST_GROUP(MockStrictOrderTest) { diff --git a/tests/CppUTestExt/MockSupportTest.cpp b/tests/CppUTestExt/MockSupportTest.cpp index 5b92d13e5..0f153eaf4 100644 --- a/tests/CppUTestExt/MockSupportTest.cpp +++ b/tests/CppUTestExt/MockSupportTest.cpp @@ -30,7 +30,7 @@ #include "CppUTestExt/MockSupport.h" #include "CppUTestExt/MockExpectedCall.h" #include "CppUTestExt/MockFailure.h" -#include "MockFailureTest.h" +#include "MockFailureReporterForTest.h" TEST_GROUP(MockSupportTest) { From bdd497026a5c3ebf1f7e759f36194e4b0c7ec995 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 14 Jan 2016 08:57:10 +0000 Subject: [PATCH 0013/1345] Add missing files to platforms/Dos/sources.mk --- platforms/Dos/sources.mk | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/platforms/Dos/sources.mk b/platforms/Dos/sources.mk index e66c7d948..8b5e8b949 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/TeamCityTestOutput.o \ $(CPPUTEST_HOME)/src/CppUTest/TestFailure.o \ $(CPPUTEST_HOME)/src/CppUTest/TestFilter.o \ $(CPPUTEST_HOME)/src/CppUTest/TestHarness_c.o \ @@ -62,6 +63,7 @@ CPPU2_OBJECTS := \ $(CPPUTEST_HOME)/tests/MemoryLeakWarningTest.o \ $(CPPUTEST_HOME)/tests/MemoryOperatorOverloadTest.o \ $(CPPUTEST_HOME)/tests/SimpleStringTest.o \ + $(CPPUTEST_HOME)/tests/TeamCityOutputTest.o \ $(CPPUTEST_HOME)/tests/TestFilterTest.o \ $(CPPUTEST_HOME)/tests/TestHarness_cTest.o \ $(CPPUTEST_HOME)/tests/TestHarness_cTestCFile.o \ @@ -79,12 +81,17 @@ CPPU3_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/MemoryReporterPluginTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockActualCallTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockCheatSheetTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockComparatorCopierTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockExpectedCallTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockHierarchyTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockReturnValueTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/OrderedTestTest.o \ CPPU4_OBJECTS := \ $(CPPUTEST_HOME)/tests/TestUTestMacro.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockNamedValueTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockPluginTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockSupport_cTest.o \ @@ -95,6 +102,7 @@ CPPU5_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/CodeMemoryReporterTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockCallTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockComparatorCopierTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockHierarchyTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockParameterTest.o \ @@ -105,6 +113,7 @@ CPPU6_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/ExpectedFunctionsListTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockCallTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockComparatorCopierTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockHierarchyTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockReturnValueTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockStrictOrderTest.o \ From e1c0bc67b1f1c1805b18e48b4d52f433f9a852ae Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 14 Jan 2016 09:04:06 +0000 Subject: [PATCH 0014/1345] Clean up --- .../MockFailureReporterForTest.cpp | 74 +++++++++---------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/tests/CppUTestExt/MockFailureReporterForTest.cpp b/tests/CppUTestExt/MockFailureReporterForTest.cpp index d6f61e15d..4e0b0cfb6 100644 --- a/tests/CppUTestExt/MockFailureReporterForTest.cpp +++ b/tests/CppUTestExt/MockFailureReporterForTest.cpp @@ -27,32 +27,26 @@ #include "MockFailureReporterForTest.h" -#define CHECK_EXPECTED_MOCK_FAILURE(expectedFailure) CHECK_EXPECTED_MOCK_FAILURE_LOCATION(expectedFailure, __FILE__, __LINE__) -#define CHECK_NO_MOCK_FAILURE() CHECK_NO_MOCK_FAILURE_LOCATION(__FILE__, __LINE__) - - - - void MockFailureReporterForTest::failTest(const MockFailure& failure) - { - mockFailureString = failure.getMessage(); - } - - MockFailureReporterForTest* MockFailureReporterForTest::getReporter() - { - static MockFailureReporterForTest reporter; - return &reporter; - } +void MockFailureReporterForTest::failTest(const MockFailure& failure) +{ + mockFailureString = failure.getMessage(); +} - MockFailureReporterInstaller::MockFailureReporterInstaller() - { - mock().setMockFailureStandardReporter(MockFailureReporterForTest::getReporter()); - } +MockFailureReporterForTest* MockFailureReporterForTest::getReporter() +{ + static MockFailureReporterForTest reporter; + return &reporter; +} - MockFailureReporterInstaller::~MockFailureReporterInstaller() - { - mock().setMockFailureStandardReporter(NULL); - } +MockFailureReporterInstaller::MockFailureReporterInstaller() +{ + mock().setMockFailureStandardReporter(MockFailureReporterForTest::getReporter()); +} +MockFailureReporterInstaller::~MockFailureReporterInstaller() +{ + mock().setMockFailureStandardReporter(NULL); +} UtestShell* mockFailureTest() { @@ -97,24 +91,24 @@ void CHECK_NO_MOCK_FAILURE_LOCATION(const char* file, int line) CLEAR_MOCK_FAILURE(); } - MockExpectedCallsListForTest::~MockExpectedCallsListForTest() - { - deleteAllExpectationsAndClearList(); - } +MockExpectedCallsListForTest::~MockExpectedCallsListForTest() +{ + deleteAllExpectationsAndClearList(); +} - MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(const SimpleString& name) - { - MockCheckedExpectedCall* newCall = new MockCheckedExpectedCall; - newCall->withName(name); - addExpectedCall(newCall); - return newCall; - } +MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(const SimpleString& name) +{ + MockCheckedExpectedCall* newCall = new MockCheckedExpectedCall; + newCall->withName(name); + addExpectedCall(newCall); + return newCall; +} - MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(const SimpleString& name, int order) - { - MockCheckedExpectedCall* newCall = addFunction(name); - newCall->withCallOrder(order); - return newCall; - } +MockCheckedExpectedCall* MockExpectedCallsListForTest::addFunction(const SimpleString& name, int order) +{ + MockCheckedExpectedCall* newCall = addFunction(name); + newCall->withCallOrder(order); + return newCall; +} From ccac8c7bbc87272f7c1a9f23fe2aa2c071bc0119 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 14 Jan 2016 09:46:56 +0000 Subject: [PATCH 0015/1345] Changes for VC6 --- tests/AllTests.dsp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/AllTests.dsp b/tests/AllTests.dsp index be25a5c50..db8e4d646 100644 --- a/tests/AllTests.dsp +++ b/tests/AllTests.dsp @@ -190,11 +190,15 @@ SOURCE=.\CppUTestExt\MockExpectedCallTest.cpp # End Source File # Begin Source File -SOURCE=.\CppUTestExt\MockFailureTest.cpp +SOURCE=.\CppUTestExt\MockFailureReporterForTest.cpp # End Source File # Begin Source File -SOURCE=.\CppUTestExt\MockFailureTest.h +SOURCE=.\CppUTestExt\MockFailureReporterForTest.h +# End Source File +# Begin Source File + +SOURCE=.\CppUTestExt\MockFailureTest.cpp # End Source File # Begin Source File From 33ab081f00a11b7a58086953731a4a6f5d95e028 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 14 Jan 2016 09:56:21 +0000 Subject: [PATCH 0016/1345] Changes for VS2005/201x --- tests/AllTests.vcproj | 6 +++++- tests/AllTests.vcxproj | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/AllTests.vcproj b/tests/AllTests.vcproj index b21868bf3..7298ba41e 100644 --- a/tests/AllTests.vcproj +++ b/tests/AllTests.vcproj @@ -754,7 +754,11 @@ + + + From eca08ed2c285ac57764d8e5414524ce62d3c3d10 Mon Sep 17 00:00:00 2001 From: Liu Nick Date: Sun, 17 Jan 2016 14:15:33 +0800 Subject: [PATCH 0017/1345] solution: add one unexpected list in MockSupport, and add one expectNoCall in MockSupport. When expectNoCall() is invoked, One unexpected call will be appended to the unexpected list. then in actualCall(), current existed expectation empty judge will changed to judge if both expectation list and unexpectation list are empty. If expectation list is empty and unexpectation list is not empty, actualCall() will go ahead to trigger the unexpected call failure. --- include/CppUTestExt/MockSupport.h | 5 +++ src/CppUTestExt/MockSupport.cpp | 26 ++++++++++++- tests/CppUTestExt/MockCallTest.cpp | 62 +++++++++++++++++++++++++++++- 3 files changed, 90 insertions(+), 3 deletions(-) diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index 27f3b0119..c7d393ce2 100644 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -47,6 +47,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 MockActualCall& actualCall(const SimpleString& functionName); virtual bool hasReturnValue(); @@ -127,6 +128,7 @@ class MockSupport MockFailureReporter *standardReporter_; MockFailureReporter defaultReporter_; MockExpectedCallsList expectations_; + MockExpectedCallsList unExpectations_; bool ignoreOtherCalls_; bool enabled_; MockCheckedActualCall *lastActualFunctionCall_; @@ -144,6 +146,9 @@ class MockSupport MockNamedValue* retrieveDataFromStore(const SimpleString& name); MockSupport* getMockSupport(MockNamedValueListNode* node); + + bool hasntExpectationWithName(const SimpleString& functionName); + bool hasntUnexpectationWithName(const SimpleString& functionName); }; #endif diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index bd721d6aa..4100e2f03 100644 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -118,7 +118,8 @@ void MockSupport::clear() tracing_ = false; MockActualCallTrace::instance().clear(); - expectations_.deleteAllExpectationsAndClearList(); + expectations_.deleteAllExpectationsAndClearList(); + unExpectations_.deleteAllExpectationsAndClearList(); compositeCalls_.clear(); ignoreOtherCalls_ = false; enabled_ = true; @@ -155,6 +156,17 @@ MockExpectedCall& MockSupport::expectOneCall(const SimpleString& functionName) return *call; } +void MockSupport::expectNoCall(const SimpleString& functionName) +{ + if (!enabled_) return; + + countCheck(); + + MockCheckedExpectedCall* call = new MockCheckedExpectedCall; + call->withName(functionName); + unExpectations_.addExpectedCall(call); +} + MockExpectedCall& MockSupport::expectNCalls(int amount, const SimpleString& functionName) { compositeCalls_.clear(); @@ -170,6 +182,16 @@ MockCheckedActualCall* MockSupport::createActualFunctionCall() return lastActualFunctionCall_; } +bool MockSupport::hasntExpectationWithName(const SimpleString& functionName) +{ + return !expectations_.hasExpectationWithName(functionName) && ignoreOtherCalls_; +} + +bool MockSupport::hasntUnexpectationWithName(const SimpleString& functionName) +{ + return !unExpectations_.hasExpectationWithName(functionName); +} + MockActualCall& MockSupport::actualCall(const SimpleString& functionName) { if (lastActualFunctionCall_) { @@ -182,7 +204,7 @@ MockActualCall& MockSupport::actualCall(const SimpleString& functionName) if (tracing_) return MockActualCallTrace::instance().withName(functionName); - if (!expectations_.hasExpectationWithName(functionName) && ignoreOtherCalls_) { + if (hasntUnexpectationWithName(functionName) && hasntExpectationWithName(functionName)) { return MockIgnoredActualCall::instance(); } diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index 2690bf02b..66396eff1 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -117,6 +117,65 @@ TEST(MockCallTest, expectOneCallHoweverMultipleHappened) CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } +TEST(MockCallTest, expectNoCallThatHappened) +{ + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest expectations; + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); + + mock().expectNoCall("lazy"); + mock().actualCall("lazy"); + + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); +} + +TEST(MockCallTest, expectNoCallDoesntInfluenceExpectOneCall) +{ + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest expectations; + expectations.addFunction("influence", MockCheckedExpectedCall::NO_EXPECTED_CALL_ORDER)->callWasMade(1); + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); + + mock().expectNoCall("lazy"); + mock().expectOneCall("influence"); + mock().actualCall("influence"); + mock().actualCall("lazy"); + + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); +} + +TEST(MockCallTest, expectNoCallOnlyFailureOnceWhenMultipleHappened) +{ + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest expectations; + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); + + mock().expectNoCall("lazy"); + mock().actualCall("lazy"); + mock().actualCall("lazy"); + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); +} + +TEST(MockCallTest, ignoreOtherCallsExceptForTheUnExpectedOne) +{ + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest expectations; + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); + + mock().expectNoCall("lazy"); + mock().ignoreOtherCalls(); + mock().actualCall("bar").withParameter("foo", 1); + mock().actualCall("bar1").withParameter("foo", 1); + mock().actualCall("bar2").withParameter("foo", 1); + mock().actualCall("lazy"); + + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); +} + TEST(MockCallTest, ignoreOtherCallsExceptForTheExpectedOne) { mock().expectOneCall("foo"); @@ -264,6 +323,7 @@ static void mocksAreCountedAsChecksTestFunction_() { mock().expectOneCall("foo"); mock().expectNCalls(3, "bar"); + mock().expectNoCall("lazy"); mock().clear(); } @@ -272,6 +332,6 @@ TEST(MockCallTest, mockExpectationShouldIncreaseNumberOfChecks) TestTestingFixture fixture; fixture.setTestFunction(mocksAreCountedAsChecksTestFunction_); fixture.runAllTests(); - LONGS_EQUAL(4, fixture.getCheckCount()); + LONGS_EQUAL(5, fixture.getCheckCount()); } From d6df0f9e4b422aa5f2f9015e5c3bef2b35dc15dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Bu=C3=9Fmann?= Date: Sun, 17 Jan 2016 14:33:18 +0100 Subject: [PATCH 0018/1345] Ignore JUnit test results from CppUTest "-ojunit". --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a83e8dc12..476ef2a2e 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,4 @@ m4/ltversion.m4 m4/lt~obsolete.m4 missing test-driver +cpputest_*.xml From cdf41a35a198040112b9284155673caa83e22b8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Bu=C3=9Fmann?= Date: Sun, 17 Jan 2016 21:08:07 +0100 Subject: [PATCH 0019/1345] Ignore JUnit test output results created when running e.g. AllTests with parameter "-ojunit". --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index be8d15ddd..43041c879 100644 --- a/.gitignore +++ b/.gitignore @@ -77,3 +77,4 @@ m4/lt~obsolete.m4 missing test-driver platforms/iar/settings +cpputest_*.xml From ed4a595e456411beb98e412600ce622d4a1a3cf8 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 18 Jan 2016 08:06:52 +0000 Subject: [PATCH 0020/1345] Update Cl2000 projects --- platforms/CCStudio/CppUTest.pjt | 1 + platforms/CCStudio/CppUTestExtRunAllTests1.pjt | 5 +++-- platforms/CCStudio/CppUTestExtRunAllTests2.pjt | 9 ++++++++- platforms/CCStudio/CppUTestRunAllTests1.pjt | 7 ++++++- platforms/CCStudio/CppUTestRunAllTests2.pjt | 4 +--- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/platforms/CCStudio/CppUTest.pjt b/platforms/CCStudio/CppUTest.pjt index e403c7668..742ebf264 100644 --- a/platforms/CCStudio/CppUTest.pjt +++ b/platforms/CCStudio/CppUTest.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\TeamCityTestOutput.cpp" Source="..\..\src\CppUTest\TestFailure.cpp" Source="..\..\src\CppUTest\TestFilter.cpp" Source="..\..\src\CppUTest\TestHarness_c.cpp" diff --git a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt index 997ebd876..efd193401 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\TeamCityTestOutput.cpp" Source="..\..\src\CppUTest\TestFailure.cpp" Source="..\..\src\CppUTest\TestFilter.cpp" Source="..\..\src\CppUTest\TestHarness_c.cpp" @@ -41,7 +42,7 @@ Source="..\..\src\CppUTestExt\MockSupport_c.cpp" Source="..\..\src\CppUTestExt\MockSupportPlugin.cpp" Source="..\..\src\CppUTestExt\OrderedTest.cpp" Source="..\..\src\Platforms\C2000\UtestPlatform.cpp" -Source="..\..\tests\CppUTestExt\CodeMemoryReportFormatterTest.cpp" +Source="..\..\tests\CppUTestExt\CodeMemoryReporterTest.cpp" Source="..\..\tests\CppUTestExt\GMockTest.cpp" Source="..\..\tests\CppUTestExt\GTest1Test.cpp" Source="..\..\tests\CppUTestExt\GTest2ConvertorTest.cpp" @@ -51,7 +52,7 @@ Source="..\..\tests\CppUTestExt\MemoryReportFormatterTest.cpp" Source="..\..\tests\CppUTestExt\MockActualCallTest.cpp" Source="..\..\tests\CppUTestExt\MockCheatSheetTest.cpp" Source="..\..\tests\CppUTestExt\MockExpectedCallTest.cpp" -Source="..\..\tests\CppUTestExt\MockExpectedFunctionsListTest.cpp" +Source="..\..\tests\CppUTestExt\MockFailureReporterForTest.cpp" Source="..\..\tests\CppUTestExt\MockFailureTest.cpp" Source="C:\CCStudio_v3.3\C2000\cgtools\lib\src\farmem_cpp.cpp" Source="tests\CppUTestExt\AllTestsForTarget.cpp" diff --git a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt index 6d806b052..2083bd690 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\TeamCityTestOutput.cpp" Source="..\..\src\CppUTest\TestFailure.cpp" Source="..\..\src\CppUTest\TestFilter.cpp" Source="..\..\src\CppUTest\TestHarness_c.cpp" @@ -41,9 +42,15 @@ Source="..\..\src\CppUTestExt\MockSupport_c.cpp" Source="..\..\src\CppUTestExt\MockSupportPlugin.cpp" Source="..\..\src\CppUTestExt\OrderedTest.cpp" Source="..\..\src\Platforms\C2000\UtestPlatform.cpp" -Source="..\..\tests\CppUTestExt\MockFailureTest.cpp" +Source="..\..\tests\CppUTestExt\MockCallTest.cpp" +Source="..\..\tests\CppUTestExt\MockComparatorCopierTest.cpp" +Source="..\..\tests\CppUTestExt\MockFailureReporterForTest.cpp" +Source="..\..\tests\CppUTestExt\MockHierarchyTest.cpp" Source="..\..\tests\CppUTestExt\MockNamedValueTest.cpp" +Source="..\..\tests\CppUTestExt\MockParameterTest.cpp" Source="..\..\tests\CppUTestExt\MockPluginTest.cpp" +Source="..\..\tests\CppUTestExt\MockStrictOrderTest.cpp" +Source="..\..\tests\CppUTestExt\MockReturnValueTest.cpp" Source="..\..\tests\CppUTestExt\MockSupport_cTest.cpp" Source="..\..\tests\CppUTestExt\MockSupport_cTestCFile.c" Source="..\..\tests\CppUTestExt\MockSupportTest.cpp" diff --git a/platforms/CCStudio/CppUTestRunAllTests1.pjt b/platforms/CCStudio/CppUTestRunAllTests1.pjt index f70bdd009..3d0af90b6 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\TeamCityTestOutput.cpp" Source="..\..\src\CppUTest\TestFailure.cpp" Source="..\..\src\CppUTest\TestFilter.cpp" Source="..\..\src\CppUTest\TestHarness_c.cpp" @@ -37,11 +38,15 @@ Source="..\..\tests\CommandLineArgumentsTest.cpp" Source="..\..\tests\CommandLineTestRunnerTest.cpp" Source="..\..\tests\JUnitOutputTest.cpp" Source="..\..\tests\MemoryLeakDetectorTest.cpp" -Source="..\..\tests\MemoryLeakOperatorOverloadsTest.cpp" +Source="..\..\tests\MemoryOperatorOverloadTest.cpp" Source="..\..\tests\MemoryLeakWarningTest.cpp" Source="..\..\tests\PluginTest.cpp" Source="..\..\tests\PreprocessorTest.cpp" Source="..\..\tests\SetPluginTest.cpp" +Source="..\..\tests\TeamCityOutputTest.cpp" +Source="..\..\tests\TestFailureNaNTest.cpp" +Source="..\..\tests\TestFailureTest.cpp" +Source="..\..\tests\TestOutputTest.cpp" Source="C:\CCStudio_v3.3\C2000\cgtools\lib\src\farmem_cpp.cpp" Source="tests\CppUTest\AllTestsForTarget.cpp" Source="sim28335.cmd" diff --git a/platforms/CCStudio/CppUTestRunAllTests2.pjt b/platforms/CCStudio/CppUTestRunAllTests2.pjt index 97d17ce67..62db79a7f 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\TeamCityTestOutput.cpp" Source="..\..\src\CppUTest\TestFailure.cpp" Source="..\..\src\CppUTest\TestFilter.cpp" Source="..\..\src\CppUTest\TestHarness_c.cpp" @@ -29,14 +30,11 @@ Source="..\..\src\CppUTest\TestResult.cpp" Source="..\..\src\CppUTest\Utest.cpp" Source="..\..\src\Platforms\C2000\UtestPlatform.cpp" Source="..\..\tests\SimpleStringTest.cpp" -Source="..\..\tests\TestFailureNaNTest.cpp" -Source="..\..\tests\TestFailureTest.cpp" Source="..\..\tests\TestFilterTest.cpp" Source="..\..\tests\TestHarness_cTest.cpp" Source="..\..\tests\TestHarness_cTestCFile.c" Source="..\..\tests\TestInstallerTest.cpp" Source="..\..\tests\TestMemoryAllocatorTest.cpp" -Source="..\..\tests\TestOutputTest.cpp" Source="..\..\tests\TestRegistryTest.cpp" Source="..\..\tests\TestResultTest.cpp" Source="..\..\tests\TestUTestMacro.cpp" From 30c3239350bc1a1457e3cf5e9cd3273c9d663244 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 20 Jan 2016 09:52:22 +0000 Subject: [PATCH 0021/1345] Add code to show Visual C++ static initialization crash problem --- tests/UtestPlatformTest.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/UtestPlatformTest.cpp b/tests/UtestPlatformTest.cpp index b15a081ca..fb0e0878a 100644 --- a/tests/UtestPlatformTest.cpp +++ b/tests/UtestPlatformTest.cpp @@ -30,6 +30,11 @@ #include "CppUTest/TestTestingFixture.h" #include "CppUTest/PlatformSpecificFunctions.h" +// This will cause a crash in VS2010 due to PlatformSpecificFree being uninitialized +static const SimpleString str1("abc"); +static const SimpleString str2("def"); +static const SimpleString str3((SimpleString)str1 + str2); + TEST_GROUP(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess) { TestTestingFixture fixture; From b7a7242e0f3bf901aaeb0ceb4e6bc336f10c6e6f Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 20 Jan 2016 09:42:18 +0000 Subject: [PATCH 0022/1345] Fix Visual C++ static initialization crash problem --- src/Platforms/VisualCpp/UtestPlatform.cpp | 30 +++++++++++++++-------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/Platforms/VisualCpp/UtestPlatform.cpp b/src/Platforms/VisualCpp/UtestPlatform.cpp index fd35a1483..8dff3fcd4 100644 --- a/src/Platforms/VisualCpp/UtestPlatform.cpp +++ b/src/Platforms/VisualCpp/UtestPlatform.cpp @@ -60,7 +60,7 @@ void (*PlatformSpecificRestoreJumpBuffer)(void) = VisualCppRestoreJumpBuffer; 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")); + result->addFailure(TestFailure(shell, "-p doesn't work on this platform, as it is lacking fork.\b")); } void (*PlatformSpecificRunTestInASeperateProcess)(UtestShell* shell, TestPlugin* plugin, TestResult* result) = @@ -122,19 +122,19 @@ 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); - return file; + FILE* file; + FOPEN(&file, filename, flag); + return file; } static void VisualCppFPuts(const char* str, PlatformSpecificFile file) { - fputs(str, (FILE*)file); + fputs(str, (FILE*)file); } static void VisualCppFClose(PlatformSpecificFile file) { - fclose((FILE*)file); + fclose((FILE*)file); } PlatformSpecificFile (*PlatformSpecificFOpen)(const char* filename, const char* flag) = VisualCppFOpen; @@ -143,7 +143,7 @@ void (*PlatformSpecificFClose)(PlatformSpecificFile file) = VisualCppFClose; static void VisualCppFlush() { - fflush(stdout); + fflush(stdout); } int (*PlatformSpecificPutchar)(int c) = putchar; @@ -151,12 +151,22 @@ void (*PlatformSpecificFlush)(void) = VisualCppFlush; static void* VisualCppMalloc(size_t size) { - return malloc(size); + return malloc(size); +} + +static void* VisualCppReAlloc(void* memory, size_t size) +{ + return realloc(memory, size); +} + +static void VisualCppFree(void* memory) +{ + free(memory); } void* (*PlatformSpecificMalloc)(size_t size) = VisualCppMalloc; -void* (*PlatformSpecificRealloc)(void* memory, size_t size) = realloc; -void (*PlatformSpecificFree)(void* memory) = free; +void* (*PlatformSpecificRealloc)(void* memory, size_t size) = VisualCppReAlloc; +void (*PlatformSpecificFree)(void* memory) = VisualCppFree; void* (*PlatformSpecificMemCpy)(void* s1, const void* s2, size_t size) = memcpy; void* (*PlatformSpecificMemset)(void* mem, int c, size_t size) = memset; From 82e7fc7a64f52a948318e93935ca61dd5448787a Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 20 Jan 2016 12:49:12 +0000 Subject: [PATCH 0023/1345] Add missing const to SimpleString::operator + --- include/CppUTest/SimpleString.h | 2 +- src/CppUTest/SimpleString.cpp | 2 +- tests/UtestPlatformTest.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index b88873c16..2d67c8b37 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -55,7 +55,7 @@ class SimpleString ~SimpleString(); SimpleString& operator=(const SimpleString& other); - SimpleString operator+(const SimpleString&); + SimpleString operator+(const SimpleString&) const; SimpleString& operator+=(const SimpleString&); SimpleString& operator+=(const char*); diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 2a90c7686..5847e74fa 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -320,7 +320,7 @@ bool operator!=(const SimpleString& left, const SimpleString& right) return !(left == right); } -SimpleString SimpleString::operator+(const SimpleString& rhs) +SimpleString SimpleString::operator+(const SimpleString& rhs) const { SimpleString t(buffer_); t += rhs.buffer_; diff --git a/tests/UtestPlatformTest.cpp b/tests/UtestPlatformTest.cpp index fb0e0878a..290f9f33c 100644 --- a/tests/UtestPlatformTest.cpp +++ b/tests/UtestPlatformTest.cpp @@ -33,7 +33,7 @@ // This will cause a crash in VS2010 due to PlatformSpecificFree being uninitialized static const SimpleString str1("abc"); static const SimpleString str2("def"); -static const SimpleString str3((SimpleString)str1 + str2); +static const SimpleString str3(str1 + str2); TEST_GROUP(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess) { From 35e4ad134b3ed6d7c993514d013407e38d088628 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 20 Jan 2016 14:49:27 +0000 Subject: [PATCH 0024/1345] Manipulate some tests to provoke the problem described in issue #829 --- tests/CppUTestExt/MockStrictOrderTest.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/CppUTestExt/MockStrictOrderTest.cpp b/tests/CppUTestExt/MockStrictOrderTest.cpp index 17682ca5d..d6289daec 100644 --- a/tests/CppUTestExt/MockStrictOrderTest.cpp +++ b/tests/CppUTestExt/MockStrictOrderTest.cpp @@ -36,7 +36,6 @@ TEST_GROUP(MockStrictOrderTest) } }; - TEST(MockStrictOrderTest, OrderObserved) { mock().strictOrder(); @@ -95,12 +94,12 @@ TEST(MockStrictOrderTest, orderViolatedWorksHierarchically) MockCallOrderFailure expectedFailure(mockFailureTest(), expectations); mock("bla").expectOneCall("foo1"); - mock().expectOneCall("foo1"); - mock().expectOneCall("foo2"); + mock("foo").expectOneCall("foo1"); + mock("foo").expectOneCall("foo2"); mock("bla").actualCall("foo1"); - mock().actualCall("foo2"); - mock().actualCall("foo1"); + mock("foo").actualCall("foo2"); + mock("foo").actualCall("foo1"); mock().checkExpectations(); CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); @@ -121,7 +120,7 @@ TEST(MockStrictOrderTest, orderViolatedWithinAScope) mock("scope").actualCall("foo2"); mock("scope").actualCall("foo1"); - mock("scope").checkExpectations(); + mock().checkExpectations(); CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } From 2f4b7f5285f62813cf81fe2f4c96d366989d3b6f Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 20 Jan 2016 14:52:15 +0000 Subject: [PATCH 0025/1345] Proposed fix for issue #829 --- src/CppUTestExt/MockSupport.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 4100e2f03..b2d9ed241 100644 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -310,20 +310,15 @@ void MockSupport::countCheck() UtestShell::getCurrent()->countCheck(); } -void MockSupport::checkExpectationsOfLastCall() +void MockSupport::checkExpectations() { + for(MockNamedValueListNode *p = data_.begin(); p; p = p->next()) + if(getMockSupport(p) && getMockSupport(p)->lastActualFunctionCall_) + getMockSupport(p)->checkExpectations(); + if(lastActualFunctionCall_) lastActualFunctionCall_->checkExpectations(); - for(MockNamedValueListNode *p = data_.begin();p;p = p->next()) - if(getMockSupport(p) && getMockSupport(p)->lastActualFunctionCall_) - getMockSupport(p)->lastActualFunctionCall_->checkExpectations(); -} - -void MockSupport::checkExpectations() -{ - checkExpectationsOfLastCall(); - if (wasLastCallFulfilled() && expectedCallsLeft()) failTestWithUnexpectedCalls(); From f56b38f3ae91c79f3e99785c7280480eba53f175 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 21 Jan 2016 14:19:02 +0000 Subject: [PATCH 0026/1345] Add -l to gcov options, so inline functions will be analyzed correctly. --- 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 3428e0a6e..b0304cd1b 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -67,7 +67,7 @@ if [ "x$BUILD" = "xcmake-coverage" ]; then make ctest - coveralls -b . -r .. -i "src" -i "include" --gcov-options="-bc" || true + coveralls -b . -r .. -i "src" -i "include" --gcov-options="-lbc" || true fi if [ "x$BUILD" = "xmake-dos" ]; then From 3e402b9bf9329f74420a0f7fcaf58f8047e80a6d Mon Sep 17 00:00:00 2001 From: Liu Nick Date: Fri, 22 Jan 2016 13:29:21 +0800 Subject: [PATCH 0027/1345] another proposed fix of #829 --- include/CppUTestExt/MockExpectedCallsList.h | 2 ++ include/CppUTestExt/MockSupport.h | 1 + src/CppUTestExt/MockExpectedCallsList.cpp | 8 ++++++ src/CppUTestExt/MockFailure.cpp | 6 +++- src/CppUTestExt/MockSupport.cpp | 32 +++++++++++++++++---- tests/CppUTestExt/MockStrictOrderTest.cpp | 26 +++++++++++++++++ 6 files changed, 68 insertions(+), 7 deletions(-) diff --git a/include/CppUTestExt/MockExpectedCallsList.h b/include/CppUTestExt/MockExpectedCallsList.h index 16b5d5534..a0a28733d 100644 --- a/include/CppUTestExt/MockExpectedCallsList.h +++ b/include/CppUTestExt/MockExpectedCallsList.h @@ -53,6 +53,8 @@ class MockExpectedCallsList virtual void addExpectedCall(MockCheckedExpectedCall* call); virtual void addExpectations(const MockExpectedCallsList& list); virtual void addExpectationsRelatedTo(const SimpleString& name, const MockExpectedCallsList& list); + + virtual void onlyKeepOutOfOrderExpectations(); virtual void addUnfulfilledExpectations(const MockExpectedCallsList& list); virtual void onlyKeepExpectationsRelatedTo(const SimpleString& name); diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index c7d393ce2..c2fdb32da 100644 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -149,6 +149,7 @@ class MockSupport bool hasntExpectationWithName(const SimpleString& functionName); bool hasntUnexpectationWithName(const SimpleString& functionName); + bool hasCallsOutOfOrder(); }; #endif diff --git a/src/CppUTestExt/MockExpectedCallsList.cpp b/src/CppUTestExt/MockExpectedCallsList.cpp index 97f49c7f3..06d0643ce 100644 --- a/src/CppUTestExt/MockExpectedCallsList.cpp +++ b/src/CppUTestExt/MockExpectedCallsList.cpp @@ -149,6 +149,14 @@ void MockExpectedCallsList::onlyKeepExpectationsRelatedTo(const SimpleString& na pruneEmptyNodeFromList(); } +void MockExpectedCallsList::onlyKeepOutOfOrderExpectations() +{ + for (MockExpectedCallsListNode* p = head_; p; p = p->next_) + if (!p->expectedCall_->isOutOfOrder()) + p->expectedCall_ = NULL; + pruneEmptyNodeFromList(); +} + void MockExpectedCallsList::onlyKeepUnfulfilledExpectations() { for (MockExpectedCallsListNode* p = head_; p; p = p->next_) diff --git a/src/CppUTestExt/MockFailure.cpp b/src/CppUTestExt/MockFailure.cpp index b0b432ac3..6d27a41a0 100644 --- a/src/CppUTestExt/MockFailure.cpp +++ b/src/CppUTestExt/MockFailure.cpp @@ -115,9 +115,13 @@ MockUnexpectedCallHappenedFailure::MockUnexpectedCallHappenedFailure(UtestShell* MockCallOrderFailure::MockCallOrderFailure(UtestShell* test, const MockExpectedCallsList& expectations) : MockFailure(test) { + MockExpectedCallsList expectationsForOutOfOrder; + expectationsForOutOfOrder.addExpectations(expectations); + expectationsForOutOfOrder.onlyKeepOutOfOrderExpectations(); + message_ = "Mock Failure: Out of order calls"; message_ += "\n"; - addExpectationsAndCallHistory(expectations); + addExpectationsAndCallHistory(expectationsForOutOfOrder); } MockUnexpectedInputParameterFailure::MockUnexpectedInputParameterFailure(UtestShell* test, const SimpleString& functionName, const MockNamedValue& parameter, const MockExpectedCallsList& expectations) : MockFailure(test) diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index b2d9ed241..abc86c252 100644 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -310,22 +310,42 @@ void MockSupport::countCheck() UtestShell::getCurrent()->countCheck(); } -void MockSupport::checkExpectations() +void MockSupport::checkExpectationsOfLastCall() { - for(MockNamedValueListNode *p = data_.begin(); p; p = p->next()) - if(getMockSupport(p) && getMockSupport(p)->lastActualFunctionCall_) - getMockSupport(p)->checkExpectations(); - if(lastActualFunctionCall_) lastActualFunctionCall_->checkExpectations(); + for(MockNamedValueListNode *p = data_.begin();p;p = p->next()) + if(getMockSupport(p) && getMockSupport(p)->lastActualFunctionCall_) + getMockSupport(p)->lastActualFunctionCall_->checkExpectations(); +} + +bool MockSupport::hasCallsOutOfOrder() +{ + if (expectations_.hasCallsOutOfOrder()) + { + return true; + } + for (MockNamedValueListNode* p = data_.begin(); p; p = p->next()) + if (getMockSupport(p) && getMockSupport(p)->hasCallsOutOfOrder()) + { + return true; + } + return false; +} + +void MockSupport::checkExpectations() +{ + checkExpectationsOfLastCall(); + if (wasLastCallFulfilled() && expectedCallsLeft()) failTestWithUnexpectedCalls(); - if (expectations_.hasCallsOutOfOrder()) + if (hasCallsOutOfOrder()) failTestWithOutOfOrderCalls(); } + bool MockSupport::hasData(const SimpleString& name) { return data_.getValueByName(name) != NULL; diff --git a/tests/CppUTestExt/MockStrictOrderTest.cpp b/tests/CppUTestExt/MockStrictOrderTest.cpp index d6289daec..5098209cd 100644 --- a/tests/CppUTestExt/MockStrictOrderTest.cpp +++ b/tests/CppUTestExt/MockStrictOrderTest.cpp @@ -105,6 +105,32 @@ TEST(MockStrictOrderTest, orderViolatedWorksHierarchically) CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } +TEST(MockStrictOrderTest, orderViolatedWorksWithExtraUnexpectedCall) +{ + MockFailureReporterInstaller failureReporterInstaller; + mock().strictOrder(); + mock("bla").strictOrder(); + mock().ignoreOtherCalls(); + + MockExpectedCallsListForTest expectations; + expectations.addFunction("foo1", 1)->callWasMade(2); + expectations.addFunction("foo2", 2)->callWasMade(1); + MockCallOrderFailure expectedFailure(mockFailureTest(), expectations); + + mock("bla").expectOneCall("foo1"); + mock("foo").expectOneCall("foo1"); + mock("foo").expectOneCall("foo2"); + + mock("bla").actualCall("foo1"); + mock("foo").actualCall("foo2"); + mock("foo").actualCall("unexpected1"); + mock("foo").actualCall("foo1"); + mock("foo").actualCall("unexpected2"); + + mock().checkExpectations(); + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); +} + TEST(MockStrictOrderTest, orderViolatedWithinAScope) { MockFailureReporterInstaller failureReporterInstaller; From 8fb04f201e422102adba53d79a135a63681237d2 Mon Sep 17 00:00:00 2001 From: Matthew Piatt Date: Tue, 26 Jan 2016 21:01:57 -0800 Subject: [PATCH 0028/1345] Added GCOV_ARGS to MakefileWorker.mk This allows passing of additional arguments to gcov when using gcov for coverage analysis. --- build/MakefileWorker.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index 71e843489..b46e36cfd 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -522,14 +522,14 @@ realclean: clean gcov: test ifeq ($(CPPUTEST_USE_VPATH), Y) - $(SILENCE)gcov --object-directory $(CPPUTEST_OBJS_DIR) $(SRC) >> $(GCOV_OUTPUT) 2>> $(GCOV_ERROR) + $(SILENCE)gcov $(GCOV_ARGS) --object-directory $(CPPUTEST_OBJS_DIR) $(SRC) >> $(GCOV_OUTPUT) 2>> $(GCOV_ERROR) else $(SILENCE)for d in $(SRC_DIRS) ; do \ FILES=`ls $$d/*.c $$d/*.cc $$d/*.cpp 2> /dev/null` ; \ - gcov --object-directory $(CPPUTEST_OBJS_DIR)/$$d $$FILES >> $(GCOV_OUTPUT) 2>>$(GCOV_ERROR) ; \ + gcov $(GCOV_ARGS) --object-directory $(CPPUTEST_OBJS_DIR)/$$d $$FILES >> $(GCOV_OUTPUT) 2>>$(GCOV_ERROR) ; \ done $(SILENCE)for f in $(SRC_FILES) ; do \ - gcov --object-directory $(CPPUTEST_OBJS_DIR)/$$f $$f >> $(GCOV_OUTPUT) 2>>$(GCOV_ERROR) ; \ + gcov $(GCOV_ARGS) --object-directory $(CPPUTEST_OBJS_DIR)/$$f $$f >> $(GCOV_OUTPUT) 2>>$(GCOV_ERROR) ; \ done endif $(CPPUTEST_HOME)/scripts/filterGcov.sh $(GCOV_OUTPUT) $(GCOV_ERROR) $(GCOV_REPORT) $(TEST_OUTPUT) From c462b05f250c1bdc7f036e29643758cf858fc80f Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 25 Jan 2016 10:00:50 +0000 Subject: [PATCH 0029/1345] Add tests and checks to bring up coverage again --- tests/CommandLineTestRunnerTest.cpp | 17 +++++++++++++ .../CppUTestExt/MockComparatorCopierTest.cpp | 18 ++++++++++++- tests/CppUTestExt/MockExpectedCallTest.cpp | 8 +++++- tests/CppUTestExt/MockParameterTest.cpp | 5 +++- tests/CppUTestExt/MockSupport_cTest.cpp | 25 +++++++++++++++++++ tests/UtestTest.cpp | 7 +++++- 6 files changed, 76 insertions(+), 4 deletions(-) diff --git a/tests/CommandLineTestRunnerTest.cpp b/tests/CommandLineTestRunnerTest.cpp index 4f4df5178..8b57704ae 100644 --- a/tests/CommandLineTestRunnerTest.cpp +++ b/tests/CommandLineTestRunnerTest.cpp @@ -243,3 +243,20 @@ TEST(CommandLineTestRunner, realJunitOutputShouldBeCreatedAndWorkProperly) STRCMP_CONTAINS(" 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, hasUnsignedIntReturnValue) { composite.andReturnValue((unsigned int) 2); @@ -721,7 +727,7 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.withFunctionPointerParameter("fop", (void(*)()) 0); ignored.withMemoryBufferParameter("waa", (const unsigned char*) 0, 0); ignored.withParameterOfType("top", "mytype", (const void*) 0); - ignored.withOutputParameterReturning("bar", (const void*) 0, 1); + ignored.withOutputParameterReturning("bar", (void*) 0, 1); ignored.ignoreOtherParameters(); ignored.andReturnValue((double) 1.0f); ignored.andReturnValue((unsigned int) 1); diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index a7f81b0f7..efe10bce1 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -683,8 +683,11 @@ TEST(MockParameterTest, ignoreOtherCallsIgnoresWithAllKindsOfParameters) .withParameter("hey", 1ul) .withParameter("duh", 1.0f) .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); + .withOutputParameter("gah", (void*) 0) + .withOutputParameterOfType("goo", "int", (void*) 0); mock().checkExpectations(); } diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index ab49a8da7..c80fcf97c 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -64,6 +64,11 @@ extern "C"{ { return "valueToString"; } + + static void typeCopyFunction(void* dst, const void* src) + { + *(int*) dst = *(int*) src; + } } @@ -319,6 +324,26 @@ TEST(MockSupport_c, failureWithParameterOfTypeCoversValueToString) mock_c()->removeAllComparatorsAndCopiers(); } +static void callToMockCWithOutputParameter_() +{ + int value1 = 7; + const int value2 = 9; + mock_c()->expectOneCall("bar")->withOutputParameterReturning("bla", &value2, sizeof(int)); + mock_c()->actualCall("bar")->withOutputParameter("bla", &value1); + LONGS_EQUAL(value1, value2); +} + +TEST(MockSupport_c, successWithOutputParameter) +{ + TestTestingFixture fixture; + mock_c()->installCopier("intType", typeCopyFunction); + fixture.setTestFunction(callToMockCWithOutputParameter_); + fixture.runAllTests(); + LONGS_EQUAL(3, fixture.getCheckCount()); + LONGS_EQUAL(0, fixture.getFailureCount()); + mock_c()->removeAllComparatorsAndCopiers(); +} + static void failingCallToMockCWithMemoryBuffer_() { unsigned char memBuffer1[] = { 0x12, 0x15, 0xFF }; diff --git a/tests/UtestTest.cpp b/tests/UtestTest.cpp index 5318aba98..2639bc13d 100644 --- a/tests/UtestTest.cpp +++ b/tests/UtestTest.cpp @@ -58,12 +58,17 @@ 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)); 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)); - + 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)); } From c916431b897037fc093bb9bfd769216e679a4453 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Jan 2016 06:54:25 +0000 Subject: [PATCH 0030/1345] Add missing test for SimpleString; fix bug --- src/CppUTest/SimpleString.cpp | 2 +- tests/SimpleStringTest.cpp | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 5847e74fa..2bbee9699 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -615,7 +615,7 @@ SimpleString StringFromBinaryWithSize(const unsigned char* value, size_t size) { SimpleString result = StringFromFormat("Size = %u | HexContents = ", (unsigned) size); size_t displayedSize = ((size > 128) ? 128 : size); - result += StringFromBinaryOrNull(value, size); + result += StringFromBinaryOrNull(value, displayedSize); if (size > displayedSize) { result += " ..."; diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index a34d87d2c..86eaffee9 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -888,6 +888,14 @@ TEST(SimpleString, BinaryWithSize) STRCMP_EQUAL("(null)", StringFromBinaryWithSizeOrNull(NULL, 0).asCharString()); } +TEST(SimpleString, BinaryWithSizeLargerThan128) +{ + unsigned char value[129]; + value[127] = 0x00; + value[128] = 0xff; + + STRCMP_CONTAINS("00 ...", StringFromBinaryWithSize(value, sizeof(value)).asCharString()); +} TEST(SimpleString, MemCmp) { From ed924e3fd9205873a98f722b63ba790c66517102 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 25 Jan 2016 12:12:44 +0000 Subject: [PATCH 0031/1345] Some more tests... --- tests/CppUTestExt/MockExpectedCallTest.cpp | 3 ++- tests/CppUTestExt/MockParameterTest.cpp | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 4dacfc8a6..78bf8ca3f 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -726,8 +726,9 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.withConstPointerParameter("woo", (const void*) 0); ignored.withFunctionPointerParameter("fop", (void(*)()) 0); ignored.withMemoryBufferParameter("waa", (const unsigned char*) 0, 0); - ignored.withParameterOfType("top", "mytype", (const void*) 0); + ignored.withParameterOfType( "mytype", "top", (const void*) 0); ignored.withOutputParameterReturning("bar", (void*) 0, 1); + ignored.withOutputParameterOfTypeReturning("mytype", "bar", (const void*) 0); ignored.ignoreOtherParameters(); ignored.andReturnValue((double) 1.0f); ignored.andReturnValue((unsigned int) 1); diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index efe10bce1..1f44afff6 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -447,7 +447,6 @@ TEST(MockParameterTest, ignoreOtherParametersMultipleCallsButOneDidntHappen) CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } - TEST(MockParameterTest, newCallStartsWhileNotAllParametersWerePassed) { MockFailureReporterInstaller failureReporterInstaller; From b9effef76387b2f6d9af7eb7593c37f8f3801c5e Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 25 Jan 2016 13:58:11 +0000 Subject: [PATCH 0032/1345] Add test for installing Copier hierarchically. --- tests/CppUTestExt/MockComparatorCopierTest.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/CppUTestExt/MockComparatorCopierTest.cpp b/tests/CppUTestExt/MockComparatorCopierTest.cpp index 65db9c65d..703934f3a 100644 --- a/tests/CppUTestExt/MockComparatorCopierTest.cpp +++ b/tests/CppUTestExt/MockComparatorCopierTest.cpp @@ -548,6 +548,20 @@ TEST(MockComparatorCopierTest, installComparatorsWorksHierarchical) mock().removeAllComparatorsAndCopiers(); } +TEST(MockComparatorCopierTest, installCopiersWorksHierarchically) +{ + MyTypeForTesting object(1); + MyTypeForTestingCopier copier; + + mock("existing"); + mock().installCopier("MyTypeForTesting", copier); + mock("existing").expectOneCall("function").withOutputParameterOfTypeReturning("MyTypeForTesting", "parameterName", &object); + mock("existing").actualCall("function").withOutputParameterOfType("MyTypeForTesting", "parameterName", &object); + + mock().checkExpectations(); + mock().removeAllComparatorsAndCopiers(); +} + class StubComparator : public MockNamedValueComparator { public: From b5489675a045b5f6679e3181c213e4f32be245f2 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Jan 2016 07:18:52 +0000 Subject: [PATCH 0033/1345] MockSupport_c 1: Add missing interface --- include/CppUTestExt/MockSupport_c.h | 2 ++ src/CppUTestExt/MockSupport_c.cpp | 16 ++++++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 42 +++++++++++++++++++++++-- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 97f9f6a08..aa6e94c35 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -81,6 +81,7 @@ struct SMockActualCall_c MockActualCall_c* (*withMemoryBufferParameter)(const char* name, const unsigned char* value, size_t size); MockActualCall_c* (*withParameterOfType)(const char* type, const char* name, const void* value); MockActualCall_c* (*withOutputParameter)(const char* name, void* value); + MockActualCall_c* (*withOutputParameterOfType)(const char* type, const char* name, void* value); MockValue_c (*returnValue)(void); }; @@ -100,6 +101,7 @@ struct SMockExpectedCall_c MockExpectedCall_c* (*withMemoryBufferParameter)(const char* name, const unsigned char* value, size_t size); 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* (*andReturnUnsignedIntValue)(unsigned int value); MockExpectedCall_c* (*andReturnIntValue)(int value); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 2337ddef2..d8ba44988 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -145,6 +145,7 @@ MockExpectedCall_c* withFunctionPointerParameters_c(const char* name, void (*val MockExpectedCall_c* withMemoryBufferParameters_c(const char* name, const unsigned char* value, size_t size); 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* andReturnIntValue_c(int value); MockExpectedCall_c* andReturnUnsignedIntValue_c(unsigned int value); MockExpectedCall_c* andReturnLongIntValue_c(long int value); @@ -168,6 +169,7 @@ MockActualCall_c* withActualFunctionPointerParameters_c(const char* name, void ( MockActualCall_c* withActualMemoryBufferParameters_c(const char* name, const unsigned char* value, size_t size); MockActualCall_c* withActualParameterOfType_c(const char* type, const char* name, const void* value); MockActualCall_c* withActualOutputParameter_c(const char* name, void* value); +MockActualCall_c* withActualOutputParameterOfType_c(const char* type, const char* name, void* value); MockValue_c actualReturnValue_c(); @@ -211,6 +213,7 @@ static MockExpectedCall_c gExpectedCall = { withMemoryBufferParameters_c, withParameterOfType_c, withOutputParameterReturning_c, + withOutputParameterOfTypeReturning_c, andReturnUnsignedIntValue_c, andReturnIntValue_c, andReturnLongIntValue_c, @@ -235,6 +238,7 @@ static MockActualCall_c gActualCall = { withActualMemoryBufferParameters_c, withActualParameterOfType_c, withActualOutputParameter_c, + withActualOutputParameterOfType_c, actualReturnValue_c }; @@ -333,6 +337,12 @@ MockExpectedCall_c* withOutputParameterReturning_c(const char* name, const void* return &gExpectedCall; } +MockExpectedCall_c* withOutputParameterOfTypeReturning_c(const char* type, const char* name, const void* value) +{ + expectedCall = &expectedCall->withOutputParameterOfTypeReturning(type, name, value); + return &gExpectedCall; +} + MockExpectedCall_c* andReturnUnsignedIntValue_c(unsigned int value) { expectedCall = &expectedCall->andReturnValue(value); @@ -521,6 +531,12 @@ MockActualCall_c* withActualOutputParameter_c(const char* name, void* value) return &gActualCall; } +MockActualCall_c* withActualOutputParameterOfType_c(const char* type, const char* name, void* value) +{ + actualCall = &actualCall->withOutputParameterOfType(type, name, value); + return &gActualCall; +} + MockValue_c actualReturnValue_c() { return getMockValueCFromNamedValue(actualCall->returnValue()); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index ab49a8da7..c6b13042a 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -64,6 +64,11 @@ extern "C"{ { return "valueToString"; } + + static void typeCopy(void* dst, const void* src) + { + *(int*) dst = *(int*) src; + } } @@ -97,7 +102,7 @@ TEST(MockSupport_c, unsignedLongIntParameter) TEST(MockSupport_c, outputParameters) { int param = 1; - int retval = 2; + const int retval = 2; mock_c()->expectOneCall("foo")->withOutputParameterReturning("out", &retval, sizeof(retval)); mock_c()->actualCall("foo")->withOutputParameter("out", ¶m); mock_c()->checkExpectations(); @@ -108,7 +113,7 @@ TEST(MockSupport_c, outputParameters) TEST(MockSupport_c, outputParameters_differentType) { long param = 1; - long retval = 2; + const long retval = 2; mock_c()->expectOneCall("foo")->withOutputParameterReturning("out", &retval, sizeof(retval)); mock_c()->actualCall("foo")->withOutputParameter("out", ¶m); mock_c()->checkExpectations(); @@ -116,6 +121,19 @@ TEST(MockSupport_c, outputParameters_differentType) LONGS_EQUAL(2, retval); } +TEST(MockSupport_c, outputParametersOfType) +{ + long param = 1; + const long retval = 2; + mock_c()->installCopier("typeName", typeCopy); + mock_c()->expectOneCall("foo")->withOutputParameterOfTypeReturning("typeName", "out", &retval); + mock_c()->actualCall("foo")->withOutputParameterOfType("typeName", "out", ¶m); + LONGS_EQUAL(2, param); + LONGS_EQUAL(2, retval); + mock_c()->checkExpectations(); + mock_c()->removeAllComparatorsAndCopiers(); +} + TEST(MockSupport_c, returnUnsignedIntValue) { unsigned int expected_value = 7; @@ -319,6 +337,26 @@ TEST(MockSupport_c, failureWithParameterOfTypeCoversValueToString) mock_c()->removeAllComparatorsAndCopiers(); } +static void callToMockCWithOutputParameter_() +{ + int value1 = 7; + const int value2 = 9; + mock_c()->expectOneCall("bar")->withOutputParameterReturning("bla", &value2, sizeof(int)); + mock_c()->actualCall("bar")->withOutputParameter("bla", &value1); + LONGS_EQUAL(value1, value2); +} + +TEST(MockSupport_c, successWithOutputParameter) +{ + TestTestingFixture fixture; + mock_c()->installCopier("intType", typeCopy); + fixture.setTestFunction(callToMockCWithOutputParameter_); + fixture.runAllTests(); + LONGS_EQUAL(3, fixture.getCheckCount()); + LONGS_EQUAL(0, fixture.getFailureCount()); + mock_c()->removeAllComparatorsAndCopiers(); +} + static void failingCallToMockCWithMemoryBuffer_() { unsigned char memBuffer1[] = { 0x12, 0x15, 0xFF }; From 361453d82291e9b1d934f90ce35b9ae702a273aa Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Jan 2016 07:23:30 +0000 Subject: [PATCH 0034/1345] MockSupport_c 2: Reorder interfaces; add missing ones in /**/. (the order should now as far as possible be identical to MockSupport) --- include/CppUTestExt/MockSupport_c.h | 28 ++++++++++++++++++++++------ src/CppUTestExt/MockSupport_c.cpp | 6 +++--- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index aa6e94c35..849110054 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -82,8 +82,8 @@ struct SMockActualCall_c MockActualCall_c* (*withParameterOfType)(const char* type, const char* name, const void* value); MockActualCall_c* (*withOutputParameter)(const char* name, void* value); MockActualCall_c* (*withOutputParameterOfType)(const char* type, const char* name, void* value); - MockValue_c (*returnValue)(void); +/** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; typedef struct SMockExpectedCall_c MockExpectedCall_c; @@ -102,6 +102,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* (*ignoreOtherParameters)(void); */ MockExpectedCall_c* (*andReturnUnsignedIntValue)(unsigned int value); MockExpectedCall_c* (*andReturnIntValue)(int value); @@ -121,21 +122,32 @@ typedef void (*MockTypeCopyFunction_c)(void* dst, const void* src); typedef struct SMockSupport_c MockSupport_c; struct SMockSupport_c { +/** void (*strictOrder)(void); */ MockExpectedCall_c* (*expectOneCall)(const char* name); +/** MockExpectedCall_c* (*expectNoCall)(const char* name); */ +/** MockExpectedCall_c* (*expectNCalls)(int number, const char* name); */ MockActualCall_c* (*actualCall)(const char* name); +/** bool (*hasReturnValue)(void) */ MockValue_c (*returnValue)(void); - void (*enable)(void); - void (*disable)(void); - void (*setIntData) (const char* name, int value); - void (*setDoubleData) (const char* name, double value); +/** void (*setUnsignedIntData) (unsigned int value): */ void (*setStringData) (const char* name, const char* value); + void (*setDoubleData) (const char* name, double value); void (*setPointerData) (const char* name, void* value); 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); MockValue_c (*getData)(const char* name); + +/** MockSupport_c* getMockSupportScope(const char* name); */ + +/** const char (*getTraceOutput+)(void); */ + + void (*disable)(void); + void (*enable)(void); +/** void (*tracing)(bool enabled); */ +/** void (*ignoreOtherCalls)(void); */ void (*checkExpectations)(void); int (*expectedCallsLeft)(void); @@ -143,12 +155,16 @@ struct SMockSupport_c void (*clear)(void); void (*crashOnFailure)(unsigned shouldCrash); +/** void setMockFailureStandardReporter(MockFailureReporter* reporter); */ +/** void (*setActiveReporter)(MockFailureReporter* activeReporter); */ +/** void (*setDefaultComparatorsAndCopiersRepository)(void); */ + void (*installComparator) (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString); void (*installCopier) (const char* typeName, MockTypeCopyFunction_c copier); +/** void (*installComparatorsAndCopiers_c)(void); */ void (*removeAllComparatorsAndCopiers)(void); }; - MockSupport_c* mock_c(void); MockSupport_c* mock_scope_c(const char* scope); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index d8ba44988..2ca5cb0ae 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -246,16 +246,16 @@ static MockSupport_c gMockSupport = { expectOneCall_c, actualCall_c, actualReturnValue_c, - enable_c, - disable_c, setIntData_c, - setDoubleData_c, setStringData_c, + setDoubleData_c, setPointerData_c, setConstPointerData_c, setFunctionPointerData_c, setDataObject_c, getData_c, + disable_c, + enable_c, checkExpectations_c, expectedCallsLeft_c, clear_c, From 1c87c64a0d123f5fff005f4aa2e58ee7abd387c8 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 25 Jan 2016 14:55:25 +0000 Subject: [PATCH 0035/1345] MockSupoort_c 3: Add ignoreOtherParameters(). --- include/CppUTestExt/MockSupport_c.h | 2 +- src/CppUTestExt/MockSupport_c.cpp | 8 ++++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 7 +++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 849110054..3c722d282 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -102,7 +102,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* (*ignoreOtherParameters)(void); */ + MockExpectedCall_c* (*ignoreOtherParameters)(void); MockExpectedCall_c* (*andReturnUnsignedIntValue)(unsigned int value); MockExpectedCall_c* (*andReturnIntValue)(int value); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 2ca5cb0ae..d8594793b 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -146,6 +146,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* ignoreOtherParameters_c(void); MockExpectedCall_c* andReturnIntValue_c(int value); MockExpectedCall_c* andReturnUnsignedIntValue_c(unsigned int value); MockExpectedCall_c* andReturnLongIntValue_c(long int value); @@ -214,6 +215,7 @@ static MockExpectedCall_c gExpectedCall = { withParameterOfType_c, withOutputParameterReturning_c, withOutputParameterOfTypeReturning_c, + ignoreOtherParameters_c, andReturnUnsignedIntValue_c, andReturnIntValue_c, andReturnLongIntValue_c, @@ -343,6 +345,12 @@ MockExpectedCall_c* withOutputParameterOfTypeReturning_c(const char* type, const return &gExpectedCall; } +MockExpectedCall_c* ignoreOtherParameters_c() +{ + expectedCall = &expectedCall->ignoreOtherParameters(); + return &gExpectedCall; +} + MockExpectedCall_c* andReturnUnsignedIntValue_c(unsigned int value) { expectedCall = &expectedCall->andReturnValue(value); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index c6b13042a..f0d2a43ef 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -134,6 +134,13 @@ TEST(MockSupport_c, outputParametersOfType) mock_c()->removeAllComparatorsAndCopiers(); } +TEST(MockSupport_c, ignoreOtherParameters) +{ + mock_c()->expectOneCall("foo")->withIntParameters("int", 1)->ignoreOtherParameters(); + mock_c()->actualCall("foo")->withIntParameters("int", 1)->withDoubleParameters("double", 0.01f); + mock_c()->checkExpectations(); +} + TEST(MockSupport_c, returnUnsignedIntValue) { unsigned int expected_value = 7; From 243e083c9b2e1b9565debc67d6789cf925027971 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Jan 2016 07:26:38 +0000 Subject: [PATCH 0036/1345] MockSupport_c 4: Add ignoreOtherCalls(). --- include/CppUTestExt/MockSupport_c.h | 2 +- src/CppUTestExt/MockSupport_c.cpp | 7 +++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 10 ++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 3c722d282..6cea956a7 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -147,7 +147,7 @@ struct SMockSupport_c void (*disable)(void); void (*enable)(void); /** void (*tracing)(bool enabled); */ -/** void (*ignoreOtherCalls)(void); */ + void (*ignoreOtherCalls)(void); void (*checkExpectations)(void); int (*expectedCallsLeft)(void); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index d8594793b..87c2b3afc 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -119,6 +119,7 @@ MockExpectedCall_c* expectOneCall_c(const char* name); MockActualCall_c* actualCall_c(const char* name); void disable_c(void); void enable_c(void); +void ignoreOtherCalls_c(void); void setIntData_c(const char* name, int value); void setDoubleData_c(const char* name, double value); void setStringData_c(const char* name, const char* value); @@ -258,6 +259,7 @@ static MockSupport_c gMockSupport = { getData_c, disable_c, enable_c, + ignoreOtherCalls_c, checkExpectations_c, expectedCallsLeft_c, clear_c, @@ -560,6 +562,11 @@ void enable_c(void) currentMockSupport->enable(); } +void ignoreOtherCalls_c(void) +{ + currentMockSupport->ignoreOtherCalls(); +} + void setIntData_c(const char* name, int value) { currentMockSupport->setData(name, value); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index f0d2a43ef..738dbef95 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -380,3 +380,13 @@ TEST(MockSupport_c, expectOneMemBufferParameterAndValueFailsDueToContents) fixture.assertPrintContains("Unexpected parameter value to parameter \"name\" " "to function \"bar\": "); } + +TEST(MockSupport_c, ignoreOtherCalls) +{ + mock_c()->expectOneCall("foo"); + mock_c()->ignoreOtherCalls(); + mock_c()->actualCall("foo"); + mock_c()->actualCall("bar"); + mock_c()->checkExpectations(); +} + From 1fef1c1be6f36e6c27aba9c6a0bc497382810bc1 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Jan 2016 07:30:05 +0000 Subject: [PATCH 0037/1345] MockSupport_c 5: Add test for withMemoryBufferParameter() --- tests/CppUTestExt/MockSupport_cTest.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 738dbef95..7e2974589 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -99,6 +99,14 @@ TEST(MockSupport_c, unsignedLongIntParameter) mock_c()->actualCall("foo")->withUnsignedLongIntParameters("p", 1); } +TEST(MockSupport_c, memoryBufferParameter) +{ + const unsigned char mem_buffer[] = { 1, 2, 3}; + mock_c()->expectOneCall("foo")->withMemoryBufferParameter("out", mem_buffer, sizeof(mem_buffer)); + mock_c()->actualCall("foo")->withMemoryBufferParameter("out", mem_buffer, sizeof(mem_buffer)); + mock_c()->checkExpectations(); +} + TEST(MockSupport_c, outputParameters) { int param = 1; From 8131eb5058e01048dfd6b333021768c0d8971917 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Jan 2016 08:27:31 +0000 Subject: [PATCH 0038/1345] MockSupport_c 6: Add strictOrder() --- include/CppUTestExt/MockSupport_c.h | 2 +- src/CppUTestExt/MockSupport_c.cpp | 7 +++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 12 ++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 6cea956a7..86a8c6dea 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -122,7 +122,7 @@ typedef void (*MockTypeCopyFunction_c)(void* dst, const void* src); typedef struct SMockSupport_c MockSupport_c; struct SMockSupport_c { -/** void (*strictOrder)(void); */ + void (*strictOrder)(void); MockExpectedCall_c* (*expectOneCall)(const char* name); /** MockExpectedCall_c* (*expectNoCall)(const char* name); */ /** MockExpectedCall_c* (*expectNCalls)(int number, const char* name); */ diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 87c2b3afc..a4d23700c 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -115,6 +115,7 @@ static MockCFunctionCopierNode* copierList_ = NULL; extern "C" { +void strictOrder_c(void); MockExpectedCall_c* expectOneCall_c(const char* name); MockActualCall_c* actualCall_c(const char* name); void disable_c(void); @@ -246,6 +247,7 @@ static MockActualCall_c gActualCall = { }; static MockSupport_c gMockSupport = { + strictOrder_c, expectOneCall_c, actualCall_c, actualReturnValue_c, @@ -457,6 +459,11 @@ static MockValue_c getMockValueCFromNamedValue(const MockNamedValue& namedValue) return returnValue; } +void strictOrder_c(void) +{ + currentMockSupport->strictOrder(); +} + MockExpectedCall_c* expectOneCall_c(const char* name) { expectedCall = ¤tMockSupport->expectOneCall(name); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 7e2974589..f095ce741 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -36,6 +36,18 @@ TEST_GROUP(MockSupport_c) { }; +TEST(MockSupport_c, OrderObserved) +{ + mock_c()->strictOrder(); + + mock_c()->expectOneCall("foo1"); + mock_c()->expectOneCall("foo2"); + mock_c()->actualCall("foo1"); + mock_c()->actualCall("foo2"); + + mock_c()->checkExpectations(); +} + TEST(MockSupport_c, expectAndActualOneCall) { mock_c()->expectOneCall("boo"); From d431a22daad2a0b613947046e7476aabc691a174 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Jan 2016 09:22:42 +0000 Subject: [PATCH 0039/1345] MockSupport_c 7: Add hasReturnValue() --- include/CppUTestExt/MockSupport_c.h | 3 ++- src/CppUTestExt/MockSupport_c.cpp | 7 +++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 9 +++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 86a8c6dea..cac2e98b1 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -82,6 +82,7 @@ struct SMockActualCall_c MockActualCall_c* (*withParameterOfType)(const char* type, const char* name, const void* value); MockActualCall_c* (*withOutputParameter)(const char* name, void* value); MockActualCall_c* (*withOutputParameterOfType)(const char* type, const char* name, void* value); + int (*hasReturnValue)(void); MockValue_c (*returnValue)(void); /** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; @@ -127,7 +128,7 @@ struct SMockSupport_c /** MockExpectedCall_c* (*expectNoCall)(const char* name); */ /** MockExpectedCall_c* (*expectNCalls)(int number, const char* name); */ MockActualCall_c* (*actualCall)(const char* name); -/** bool (*hasReturnValue)(void) */ +/** bool (*hasReturnValue)(void); */ MockValue_c (*returnValue)(void); void (*setIntData) (const char* name, int value); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index a4d23700c..6cb328eca 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -173,6 +173,7 @@ MockActualCall_c* withActualMemoryBufferParameters_c(const char* name, const uns MockActualCall_c* withActualParameterOfType_c(const char* type, const char* name, const void* value); MockActualCall_c* withActualOutputParameter_c(const char* name, void* value); MockActualCall_c* withActualOutputParameterOfType_c(const char* type, const char* name, void* value); +int hasReturnValue_c(void); MockValue_c actualReturnValue_c(); @@ -243,6 +244,7 @@ static MockActualCall_c gActualCall = { withActualParameterOfType_c, withActualOutputParameter_c, withActualOutputParameterOfType_c, + hasReturnValue_c, actualReturnValue_c }; @@ -554,6 +556,11 @@ MockActualCall_c* withActualOutputParameterOfType_c(const char* type, const char return &gActualCall; } +int hasReturnValue_c(void) +{ + return actualCall->hasReturnValue(); +} + MockValue_c actualReturnValue_c() { return getMockValueCFromNamedValue(actualCall->returnValue()); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index f095ce741..bc1a22fd4 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -48,6 +48,15 @@ TEST(MockSupport_c, OrderObserved) mock_c()->checkExpectations(); } +TEST(MockSupport_c, hasReturnValue) +{ + mock_c()->expectOneCall("foo"); + CHECK(!mock_c()->actualCall("foo")->hasReturnValue()); + + mock_c()->expectOneCall("foo2")->andReturnIntValue(1); + CHECK(mock_c()->actualCall("foo2")->hasReturnValue()); +} + TEST(MockSupport_c, expectAndActualOneCall) { mock_c()->expectOneCall("boo"); From 4829ea60aa3eff50738a48eccb10fa17a2fb16b9 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Jan 2016 12:41:07 +0000 Subject: [PATCH 0040/1345] MockSupport_c 8: Add expectNCalls(). --- include/CppUTestExt/MockSupport_c.h | 2 +- src/CppUTestExt/MockSupport_c.cpp | 9 +++++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 9 +++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index cac2e98b1..b536ac4ad 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -126,7 +126,7 @@ struct SMockSupport_c void (*strictOrder)(void); MockExpectedCall_c* (*expectOneCall)(const char* name); /** MockExpectedCall_c* (*expectNoCall)(const char* name); */ -/** MockExpectedCall_c* (*expectNCalls)(int number, const char* name); */ + MockExpectedCall_c* (*expectNCalls)(int number, const char* name); MockActualCall_c* (*actualCall)(const char* name); /** bool (*hasReturnValue)(void); */ MockValue_c (*returnValue)(void); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 6cb328eca..3b051e65b 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -117,6 +117,7 @@ extern "C" { void strictOrder_c(void); MockExpectedCall_c* expectOneCall_c(const char* name); +MockExpectedCall_c* expectNCalls_c(const int number, const char* name); MockActualCall_c* actualCall_c(const char* name); void disable_c(void); void enable_c(void); @@ -251,6 +252,7 @@ static MockActualCall_c gActualCall = { static MockSupport_c gMockSupport = { strictOrder_c, expectOneCall_c, + expectNCalls_c, actualCall_c, actualReturnValue_c, setIntData_c, @@ -472,6 +474,13 @@ MockExpectedCall_c* expectOneCall_c(const char* name) return &gExpectedCall; } +MockExpectedCall_c* expectNCalls_c(const int number, const char* name) +{ + expectedCall = ¤tMockSupport->expectNCalls(number, name); + return &gExpectedCall; +} + + MockActualCall_c* actualCall_c(const char* name) { actualCall = ¤tMockSupport->actualCall(name); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index bc1a22fd4..eec4c62d0 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -64,6 +64,15 @@ TEST(MockSupport_c, expectAndActualOneCall) mock_c()->checkExpectations(); } +TEST(MockSupport_c, expectAndActualThreeCalls) +{ + mock_c()->expectNCalls(3, "boo"); + mock_c()->actualCall("boo"); + mock_c()->actualCall("boo"); + mock_c()->actualCall("boo"); + mock_c()->checkExpectations(); +} + TEST(MockSupport_c, expectAndActualParameters) { mock_c()->expectOneCall("boo")->withIntParameters("integer", 1)->withDoubleParameters("double", 1.0)-> From 8d2c7a9fbfbb4117a6c4b8991e119e1f916c4a7f Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Jan 2016 13:09:36 +0000 Subject: [PATCH 0041/1345] MockSupport_c 9: Add expectNoCall(). --- include/CppUTestExt/MockSupport_c.h | 19 ++++++++++++++++++- src/CppUTestExt/MockSupport_c.cpp | 8 +++++++- tests/CppUTestExt/MockSupport_cTest.cpp | 8 ++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index b536ac4ad..3ae0e9c6e 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -125,11 +125,28 @@ struct SMockSupport_c { void (*strictOrder)(void); MockExpectedCall_c* (*expectOneCall)(const char* name); -/** MockExpectedCall_c* (*expectNoCall)(const char* name); */ + void (*expectNoCall)(const char* name); MockExpectedCall_c* (*expectNCalls)(int number, const char* name); MockActualCall_c* (*actualCall)(const char* name); /** bool (*hasReturnValue)(void); */ MockValue_c (*returnValue)(void); +/** int returnIntValueOrDefault(int defaultValue); */ +/** unsigned int unsignedIntReturnValue(void); */ +/** long int longIntReturnValue(void); */ +/** long int returnLongIntValueOrDefault(long int defaultValue); */ +/** unsigned long int unsignedLongIntReturnValue(void); */ +/** unsigned long int returnUnsignedLongIntValueOrDefault(unsigned long int defaultValue); */ +/** unsigned int returnUnsignedIntValueOrDefault(unsigned int defaultValue); */ +/** const char* stringReturnValue(void); */ +/** const char* returnStringValueOrDefault(const char * defaultValue); */ +/** double returnDoubleValueOrDefault(double defaultValue); */ +/** double doubleReturnValue(void); */ +/** void* pointerReturnValue(void); */ +/** void* returnPointerValueOrDefault(void * defaultValue); */ +/** const void* returnConstPointerValueOrDefault(const void * defaultValue); */ +/** const void* constPointerReturnValue(void); */ +/** void (*returnFunctionPointerValueOrDefault(void (*defaultValue)()))(); */ +/** void (*functionPointerReturnValue())(void); */ void (*setIntData) (const char* name, int value); /** void (*setUnsignedIntData) (unsigned int value): */ diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 3b051e65b..edc6e801b 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -117,6 +117,7 @@ extern "C" { void strictOrder_c(void); MockExpectedCall_c* expectOneCall_c(const char* name); +void expectNoCall_c(const char* name); MockExpectedCall_c* expectNCalls_c(const int number, const char* name); MockActualCall_c* actualCall_c(const char* name); void disable_c(void); @@ -252,6 +253,7 @@ static MockActualCall_c gActualCall = { static MockSupport_c gMockSupport = { strictOrder_c, expectOneCall_c, + expectNoCall_c, expectNCalls_c, actualCall_c, actualReturnValue_c, @@ -474,13 +476,17 @@ MockExpectedCall_c* expectOneCall_c(const char* name) return &gExpectedCall; } +void expectNoCall_c(const char* name) +{ + currentMockSupport->expectNoCall(name); +} + MockExpectedCall_c* expectNCalls_c(const int number, const char* name) { expectedCall = ¤tMockSupport->expectNCalls(number, name); return &gExpectedCall; } - MockActualCall_c* actualCall_c(const char* name) { actualCall = ¤tMockSupport->actualCall(name); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index eec4c62d0..1504c66ad 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -73,6 +73,14 @@ TEST(MockSupport_c, expectAndActualThreeCalls) mock_c()->checkExpectations(); } +TEST(MockSupport_c, expectNoCall) +{ + mock_c()->expectNoCall("foo"); + mock_c()->expectOneCall("bar"); + mock_c()->actualCall("bar"); + mock_c()->checkExpectations(); +} + TEST(MockSupport_c, expectAndActualParameters) { mock_c()->expectOneCall("boo")->withIntParameters("integer", 1)->withDoubleParameters("double", 1.0)-> From f3f015d8c39c0fc7a410f210c87a8cea9ce5a45e Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Jan 2016 14:17:41 +0000 Subject: [PATCH 0042/1345] MockSupport_c 10: Additions to all_mock_support_c_calls() --- include/CppUTestExt/MockSupport_c.h | 2 +- tests/CppUTestExt/MockSupport_cTestCFile.c | 66 +++++++++++++++++++--- 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 3ae0e9c6e..8b6227071 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -149,7 +149,7 @@ struct SMockSupport_c /** void (*functionPointerReturnValue())(void); */ void (*setIntData) (const char* name, int value); -/** void (*setUnsignedIntData) (unsigned int value): */ +/** void (*setUnsignedIntData) (unsigned int value); */ void (*setStringData) (const char* name, const char* value); void (*setDoubleData) (const char* name, double value); void (*setPointerData) (const char* name, void* value); diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index 189033c39..e1eeb0dcc 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -40,21 +40,47 @@ static const char* typeNameValueToString(const void* object) void all_mock_support_c_calls(void) { + mock_c()->strictOrder(); mock_c()->expectOneCall("boo"); + mock_c()->expectNoCall("bla"); + mock_c()->expectNCalls(1, "foo"); mock_c()->actualCall("boo"); + mock_c()->actualCall("foo"); mock_c()->checkExpectations(); - mock_c()->expectOneCall("boo")->withIntParameters("integer", 1)->withDoubleParameters("double", 1.0)-> - withStringParameters("string", "string")->withPointerParameters("pointer", (void*) 1)-> + mock_c()->expectOneCall("boo")->withIntParameters("integer", 1)-> + withUnsignedIntParameters("unsigned", 1)-> + withLongIntParameters("long int", (long int) -1)-> + withUnsignedLongIntParameters("unsigned long int", (unsigned long int) 1)-> + withDoubleParameters("double", 1.0)-> + withStringParameters("string", "string")-> + withPointerParameters("pointer", (void*) 1)-> withConstPointerParameters("constpointer", (const void*) 1)-> - withFunctionPointerParameters("functionpointer", (void(*)()) 1); - mock_c()->actualCall("boo")->withIntParameters("integer", 1)->withDoubleParameters("double", 1.0)-> - withStringParameters("string", "string")->withPointerParameters("pointer", (void*) 1)-> + withFunctionPointerParameters("functionpointer", (void(*)()) 1)-> + withMemoryBufferParameter("name", (void*) 1, 0)-> + ignoreOtherParameters(); + + mock_c()->actualCall("boo")->withIntParameters("integer", 1)-> + withUnsignedIntParameters("unsigned", 1)-> + withLongIntParameters("long int", (long int) -1)-> + withUnsignedLongIntParameters("unsigned long int", (unsigned long int) 1)-> + withDoubleParameters("double", 1.0)-> + withStringParameters("string", "string")-> + withPointerParameters("pointer", (void*) 1)-> withConstPointerParameters("constpointer", (const void*) 1)-> - withFunctionPointerParameters("functionpointer", (void(*)()) 1); + withFunctionPointerParameters("functionpointer", (void(*)()) 1)-> + withMemoryBufferParameter("name", (void*) 1, 0)-> + hasReturnValue(); + + mock_c()->disable(); + mock_c()->expectOneCall("boo")->withParameterOfType("type", "name", (void*) 1)-> + withOutputParameterReturning("name", (void*)1, 0)-> + withOutputParameterOfTypeReturning("type", "name", (void*)1); + mock_c()->actualCall("boo")->withParameterOfType("type", "name", (void*) 1)-> + withOutputParameter("name", (void*)1)-> + withOutputParameterOfType("type", "name", (void*)1); + mock_c()->enable(); - mock_c()->expectOneCall("boo")->withMemoryBufferParameter("name", (void*) 1, 0); - mock_c()->actualCall("boo")->withMemoryBufferParameter("name", (void*) 1, 0); mock_c()->clear(); mock_c()->installComparator("typeName", typeNameIsEqual, typeNameValueToString); @@ -82,6 +108,30 @@ void all_mock_support_c_calls(void) mock_c()->actualCall("boo5")->returnValue(); mock_c()->returnValue(); + mock_c()->setIntData("int", 5); + mock_c()->expectOneCall("bla")->withIntParameters("int", 5); + mock_c()->actualCall("bla")->withIntParameters("int", mock_c()->getData("int").value.intValue); + + mock_c()->setStringData("string", "lol"); + mock_c()->expectOneCall("bla")->withStringParameters("str", "lol"); + mock_c()->actualCall("bla")->withStringParameters("str", mock_c()->getData("string").value.stringValue); + + mock_c()->setDoubleData("double", 0.001f); + mock_c()->expectOneCall("bla")->withDoubleParameters("double", 0.001f); + mock_c()->actualCall("bla")->withDoubleParameters("double", mock_c()->getData("double").value.doubleValue); + + mock_c()->setPointerData("ptr", (void*)1); + mock_c()->expectOneCall("bla")->withPointerParameters("ptr", (void*)1); + mock_c()->actualCall("bla")->withPointerParameters("ptr", mock_c()->getData("ptr").value.pointerValue); + + mock_c()->setConstPointerData("cptr", (const void*)1); + mock_c()->expectOneCall("bla")->withConstPointerParameters("cptr", (const void*)1); + mock_c()->actualCall("bla")->withConstPointerParameters("cptr", mock_c()->getData("ptr").value.constPointerValue); + + mock_c()->setFunctionPointerData("ptr", (void(*)())1); + mock_c()->expectOneCall("bla")->withFunctionPointerParameters("ptr", (void(*)())1); + mock_c()->actualCall("bla")->withFunctionPointerParameters("ptr", mock_c()->getData("ptr").value.functionPointerValue); + mock_c()->disable(); mock_c()->actualCall("disabled"); mock_c()->enable(); From fcf0f021e22339340bb4d9c496ee50c284d5e553 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Jan 2016 15:39:34 +0000 Subject: [PATCH 0043/1345] MockSupport_c 11: Add mock_c()->hasReturnValue() --- include/CppUTestExt/MockSupport_c.h | 2 +- src/CppUTestExt/MockSupport_c.cpp | 13 ++++++++++--- tests/CppUTestExt/MockSupport_cTest.cpp | 2 ++ tests/CppUTestExt/MockSupport_cTestCFile.c | 7 +++++++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 8b6227071..6d6f5664f 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -128,7 +128,7 @@ struct SMockSupport_c void (*expectNoCall)(const char* name); MockExpectedCall_c* (*expectNCalls)(int number, const char* name); MockActualCall_c* (*actualCall)(const char* name); -/** bool (*hasReturnValue)(void); */ + int (*hasReturnValue)(void); MockValue_c (*returnValue)(void); /** int returnIntValueOrDefault(int defaultValue); */ /** unsigned int unsignedIntReturnValue(void); */ diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index edc6e801b..c9a8631de 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -131,6 +131,7 @@ 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); MockValue_c getData_c(const char* name); +int hasReturnValue_c(void); void checkExpectations_c(); int expectedCallsLeft_c(); @@ -175,7 +176,7 @@ MockActualCall_c* withActualMemoryBufferParameters_c(const char* name, const uns MockActualCall_c* withActualParameterOfType_c(const char* type, const char* name, const void* value); MockActualCall_c* withActualOutputParameter_c(const char* name, void* value); MockActualCall_c* withActualOutputParameterOfType_c(const char* type, const char* name, void* value); -int hasReturnValue_c(void); +int hasActualReturnValue_c(void); MockValue_c actualReturnValue_c(); @@ -246,7 +247,7 @@ static MockActualCall_c gActualCall = { withActualParameterOfType_c, withActualOutputParameter_c, withActualOutputParameterOfType_c, - hasReturnValue_c, + hasActualReturnValue_c, actualReturnValue_c }; @@ -256,6 +257,7 @@ static MockSupport_c gMockSupport = { expectNoCall_c, expectNCalls_c, actualCall_c, + hasReturnValue_c, actualReturnValue_c, setIntData_c, setStringData_c, @@ -571,7 +573,7 @@ MockActualCall_c* withActualOutputParameterOfType_c(const char* type, const char return &gActualCall; } -int hasReturnValue_c(void) +int hasActualReturnValue_c(void) { return actualCall->hasReturnValue(); } @@ -636,6 +638,11 @@ MockValue_c getData_c(const char* name) return getMockValueCFromNamedValue(currentMockSupport->getData(name)); } +int hasReturnValue_c() +{ + return currentMockSupport->hasReturnValue(); +} + void checkExpectations_c() { currentMockSupport->checkExpectations(); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 1504c66ad..d1612c609 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -52,9 +52,11 @@ TEST(MockSupport_c, hasReturnValue) { mock_c()->expectOneCall("foo"); CHECK(!mock_c()->actualCall("foo")->hasReturnValue()); + CHECK(!mock_c()->hasReturnValue()); mock_c()->expectOneCall("foo2")->andReturnIntValue(1); CHECK(mock_c()->actualCall("foo2")->hasReturnValue()); + CHECK(mock_c()->hasReturnValue()); } TEST(MockSupport_c, expectAndActualOneCall) diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index e1eeb0dcc..2a9eee8c5 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -40,6 +40,7 @@ static const char* typeNameValueToString(const void* object) void all_mock_support_c_calls(void) { + int hasReturnValue; mock_c()->strictOrder(); mock_c()->expectOneCall("boo"); mock_c()->expectNoCall("bla"); @@ -132,6 +133,12 @@ void all_mock_support_c_calls(void) mock_c()->expectOneCall("bla")->withFunctionPointerParameters("ptr", (void(*)())1); mock_c()->actualCall("bla")->withFunctionPointerParameters("ptr", mock_c()->getData("ptr").value.functionPointerValue); + mock_c()->expectOneCall("bla")->andReturnIntValue(-3); + mock_c()->expectOneCall("foo")->withIntParameters("bool", 1); + mock_c()->actualCall("bla"); + hasReturnValue = mock_c()->hasReturnValue(); + mock_c()->actualCall("foo")->withIntParameters("bool", hasReturnValue); + mock_c()->disable(); mock_c()->actualCall("disabled"); mock_c()->enable(); From 9d311a1ea23819a2193bedf05e0dd39d9d09a1b4 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Jan 2016 17:17:10 +0000 Subject: [PATCH 0044/1345] MockSupport_c 12: Add intReturnValue() & Co. --- include/CppUTestExt/MockSupport_c.h | 5 +++- src/CppUTestExt/MockSupport_c.cpp | 34 +++++++++++++++++----- tests/CppUTestExt/MockSupport_cTest.cpp | 20 ++++++++++++- tests/CppUTestExt/MockSupport_cTestCFile.c | 11 +++---- 4 files changed, 54 insertions(+), 16 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 6d6f5664f..22f0374db 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -84,6 +84,8 @@ struct SMockActualCall_c MockActualCall_c* (*withOutputParameterOfType)(const char* type, const char* name, void* value); int (*hasReturnValue)(void); MockValue_c (*returnValue)(void); + int (*intReturnValue)(void); + int (*returnIntValueOrDefault)(int defaultValue); /** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; @@ -130,7 +132,8 @@ struct SMockSupport_c MockActualCall_c* (*actualCall)(const char* name); int (*hasReturnValue)(void); MockValue_c (*returnValue)(void); -/** int returnIntValueOrDefault(int defaultValue); */ + int (*intReturnValue)(void); + int (*returnIntValueOrDefault)(int defaultValue); /** unsigned int unsignedIntReturnValue(void); */ /** long int longIntReturnValue(void); */ /** long int returnLongIntValueOrDefault(long int defaultValue); */ diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index c9a8631de..83bbbbf87 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -115,14 +115,14 @@ static MockCFunctionCopierNode* copierList_ = NULL; extern "C" { -void strictOrder_c(void); +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); MockActualCall_c* actualCall_c(const char* name); -void disable_c(void); -void enable_c(void); -void ignoreOtherCalls_c(void); +void disable_c(); +void enable_c(); +void ignoreOtherCalls_c(); void setIntData_c(const char* name, int value); void setDoubleData_c(const char* name, double value); void setStringData_c(const char* name, const char* value); @@ -131,7 +131,7 @@ 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); MockValue_c getData_c(const char* name); -int hasReturnValue_c(void); +int hasReturnValue_c(); void checkExpectations_c(); int expectedCallsLeft_c(); @@ -176,8 +176,10 @@ MockActualCall_c* withActualMemoryBufferParameters_c(const char* name, const uns MockActualCall_c* withActualParameterOfType_c(const char* type, const char* name, const void* value); MockActualCall_c* withActualOutputParameter_c(const char* name, void* value); MockActualCall_c* withActualOutputParameterOfType_c(const char* type, const char* name, void* value); -int hasActualReturnValue_c(void); +int hasActualReturnValue_c(); MockValue_c actualReturnValue_c(); +int actualReturnIntValueOrDefault_c(int defaultValue); +int actualIntReturnValue_c(); static void installComparator_c (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString) @@ -248,7 +250,9 @@ static MockActualCall_c gActualCall = { withActualOutputParameter_c, withActualOutputParameterOfType_c, hasActualReturnValue_c, - actualReturnValue_c + actualReturnValue_c, + actualIntReturnValue_c, + actualReturnIntValueOrDefault_c }; static MockSupport_c gMockSupport = { @@ -259,6 +263,8 @@ static MockSupport_c gMockSupport = { actualCall_c, hasReturnValue_c, actualReturnValue_c, + actualIntReturnValue_c, + actualReturnIntValueOrDefault_c, setIntData_c, setStringData_c, setDoubleData_c, @@ -583,6 +589,20 @@ MockValue_c actualReturnValue_c() return getMockValueCFromNamedValue(actualCall->returnValue()); } +int actualIntReturnValue_c() +{ + return getMockValueCFromNamedValue(actualCall->returnValue()).value.intValue; +} + +int actualReturnIntValueOrDefault_c(int defaultValue) +{ + if (!hasActualReturnValue_c()) { + return defaultValue; + } + return actualIntReturnValue_c(); + +} + void disable_c(void) { currentMockSupport->disable(); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index d1612c609..6083402ba 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -199,12 +199,30 @@ TEST(MockSupport_c, returnUnsignedIntValue) TEST(MockSupport_c, returnIntValue) { - int expected_value = 10; + int expected_value = -10; mock_c()->expectOneCall("boo")->andReturnIntValue(expected_value); LONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->returnValue().value.intValue); + LONGS_EQUAL(expected_value, mock_c()->intReturnValue()); LONGS_EQUAL(MOCKVALUETYPE_INTEGER, mock_c()->returnValue().type); } +TEST(MockSupport_c, whenReturnValueIsGivenReturnIntValueOrDefaultShouldIgnoreTheDefault) +{ + int defaultValue = -10; + int expectedValue = defaultValue - 1; + mock_c()->expectOneCall("foo")->andReturnIntValue(expectedValue); + LONGS_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnIntValueOrDefault(defaultValue)); + LONGS_EQUAL(expectedValue, mock_c()->returnIntValueOrDefault(defaultValue)); +} + +TEST(MockSupport_c, whenNoReturnValueIsGivenReturnIntValueOrDefaultShouldlUseTheDefaultValue) +{ + int defaultValue = -10; + mock_c()->expectOneCall("foo"); + LONGS_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnIntValueOrDefault(defaultValue)); + LONGS_EQUAL(defaultValue, mock_c()->returnIntValueOrDefault(defaultValue)); +} + TEST(MockSupport_c, returnLongIntValue) { long int expected_value = 10; diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index 2a9eee8c5..46d810ae2 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -40,7 +40,6 @@ static const char* typeNameValueToString(const void* object) void all_mock_support_c_calls(void) { - int hasReturnValue; mock_c()->strictOrder(); mock_c()->expectOneCall("boo"); mock_c()->expectNoCall("bla"); @@ -133,12 +132,10 @@ void all_mock_support_c_calls(void) mock_c()->expectOneCall("bla")->withFunctionPointerParameters("ptr", (void(*)())1); mock_c()->actualCall("bla")->withFunctionPointerParameters("ptr", mock_c()->getData("ptr").value.functionPointerValue); - mock_c()->expectOneCall("bla")->andReturnIntValue(-3); - mock_c()->expectOneCall("foo")->withIntParameters("bool", 1); - mock_c()->actualCall("bla"); - hasReturnValue = mock_c()->hasReturnValue(); - mock_c()->actualCall("foo")->withIntParameters("bool", hasReturnValue); - + mock_c()->hasReturnValue(); + mock_c()->intReturnValue(); + mock_c()->returnIntValueOrDefault(0); + mock_c()->disable(); mock_c()->actualCall("disabled"); mock_c()->enable(); From f16d4fa463d6ef7667a85cd19ffdded955821db0 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 05:51:54 +0000 Subject: [PATCH 0045/1345] MockSupport_c 13: Test memoryBufferValue in MockValueType_c. --- tests/CppUTestExt/MockSupport_cTest.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 6083402ba..a78bc6ed0 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -324,6 +324,13 @@ TEST(MockSupport_c, MockSupportSetDataObject) POINTERS_EQUAL((void*) 1, mock_c()->getData("name").value.objectValue); } +TEST(MockSupport_c, TestMockGetMemoryBufferDataObjectCHereBecauseItIsNotCurrentlyUsedByCppUTest) +{ + mock_c()->setDataObject("name", "const unsigned char*", (void *) 0xDEAD); + POINTERS_EQUAL(0xDEAD, mock_c()->getData("name").value.memoryBufferValue); + LONGS_EQUAL(MOCKVALUETYPE_MEMORYBUFFER, mock_c()->getData("name").type); +} + TEST(MockSupport_c, WorksInCFile) { all_mock_support_c_calls(); From 3acd674fae048c866b49d953af5c17778c689da8 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 06:53:10 +0000 Subject: [PATCH 0046/1345] MockSupport_c 14: Add unsignedIntReturnValue() & Co. --- include/CppUTestExt/MockSupport_c.h | 6 ++-- src/CppUTestExt/MockSupport_c.cpp | 22 ++++++++++++-- tests/CppUTestExt/MockSupport_cTest.cpp | 34 +++++++++++++++++----- tests/CppUTestExt/MockSupport_cTestCFile.c | 4 ++- 4 files changed, 53 insertions(+), 13 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 22f0374db..2f9225883 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -86,6 +86,8 @@ struct SMockActualCall_c MockValue_c (*returnValue)(void); int (*intReturnValue)(void); int (*returnIntValueOrDefault)(int defaultValue); + unsigned int (*unsignedIntReturnValue)(void); + unsigned int (*returnUnsignedIntValueOrDefault)(unsigned int defaultValue); /** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; @@ -134,12 +136,12 @@ struct SMockSupport_c MockValue_c (*returnValue)(void); int (*intReturnValue)(void); int (*returnIntValueOrDefault)(int defaultValue); -/** unsigned int unsignedIntReturnValue(void); */ + unsigned int (*unsignedIntReturnValue)(void); + unsigned int (*returnUnsignedIntValueOrDefault)(unsigned int defaultValue); /** long int longIntReturnValue(void); */ /** long int returnLongIntValueOrDefault(long int defaultValue); */ /** unsigned long int unsignedLongIntReturnValue(void); */ /** unsigned long int returnUnsignedLongIntValueOrDefault(unsigned long int defaultValue); */ -/** unsigned int returnUnsignedIntValueOrDefault(unsigned int defaultValue); */ /** const char* stringReturnValue(void); */ /** const char* returnStringValueOrDefault(const char * defaultValue); */ /** double returnDoubleValueOrDefault(double defaultValue); */ diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 83bbbbf87..3ecf87999 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -178,8 +178,10 @@ MockActualCall_c* withActualOutputParameter_c(const char* name, void* value); MockActualCall_c* withActualOutputParameterOfType_c(const char* type, const char* name, void* value); int hasActualReturnValue_c(); MockValue_c actualReturnValue_c(); -int actualReturnIntValueOrDefault_c(int defaultValue); int actualIntReturnValue_c(); +int actualReturnIntValueOrDefault_c(int defaultValue); +unsigned int actualUnsignedIntReturnValue_c(); +unsigned int actualReturnUnsignedIntValueOrDefault_c(unsigned int defaultValue); static void installComparator_c (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString) @@ -252,7 +254,9 @@ static MockActualCall_c gActualCall = { hasActualReturnValue_c, actualReturnValue_c, actualIntReturnValue_c, - actualReturnIntValueOrDefault_c + actualReturnIntValueOrDefault_c, + actualUnsignedIntReturnValue_c, + actualReturnUnsignedIntValueOrDefault_c }; static MockSupport_c gMockSupport = { @@ -265,6 +269,8 @@ static MockSupport_c gMockSupport = { actualReturnValue_c, actualIntReturnValue_c, actualReturnIntValueOrDefault_c, + actualUnsignedIntReturnValue_c, + actualReturnUnsignedIntValueOrDefault_c, setIntData_c, setStringData_c, setDoubleData_c, @@ -600,7 +606,19 @@ int actualReturnIntValueOrDefault_c(int defaultValue) return defaultValue; } return actualIntReturnValue_c(); +} +unsigned int actualUnsignedIntReturnValue_c() +{ + return getMockValueCFromNamedValue(actualCall->returnValue()).value.unsignedIntValue; +} + +unsigned int actualReturnUnsignedIntValueOrDefault_c(unsigned int defaultValue) +{ + if (!hasActualReturnValue_c()) { + return defaultValue; + } + return actualUnsignedIntReturnValue_c(); } void disable_c(void) diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index a78bc6ed0..71373a742 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -189,14 +189,6 @@ TEST(MockSupport_c, ignoreOtherParameters) mock_c()->checkExpectations(); } -TEST(MockSupport_c, returnUnsignedIntValue) -{ - unsigned int expected_value = 7; - mock_c()->expectOneCall("boo")->andReturnUnsignedIntValue(expected_value); - LONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->returnValue().value.unsignedIntValue); - LONGS_EQUAL(MOCKVALUETYPE_UNSIGNED_INTEGER, mock_c()->returnValue().type); -} - TEST(MockSupport_c, returnIntValue) { int expected_value = -10; @@ -223,6 +215,32 @@ TEST(MockSupport_c, whenNoReturnValueIsGivenReturnIntValueOrDefaultShouldlUseThe LONGS_EQUAL(defaultValue, mock_c()->returnIntValueOrDefault(defaultValue)); } +TEST(MockSupport_c, returnUnsignedIntValue) +{ + unsigned int expected_value = 7; + mock_c()->expectOneCall("boo")->andReturnUnsignedIntValue(expected_value); + LONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->returnValue().value.unsignedIntValue); + LONGS_EQUAL(expected_value, mock_c()->unsignedIntReturnValue()); + LONGS_EQUAL(MOCKVALUETYPE_UNSIGNED_INTEGER, mock_c()->returnValue().type); +} + +TEST(MockSupport_c, whenReturnValueIsGivenReturnUnsignedIntValueOrDefaultShouldIgnoreTheDefault) +{ + unsigned int defaultValue = 10; + unsigned int expectedValue = defaultValue + 1; + mock_c()->expectOneCall("foo")->andReturnUnsignedIntValue(expectedValue); + LONGS_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnUnsignedIntValueOrDefault(defaultValue)); + LONGS_EQUAL(expectedValue, mock_c()->returnUnsignedIntValueOrDefault(defaultValue)); +} + +TEST(MockSupport_c, whenNoReturnValueIsGivenReturnUnsignedIntValueOrDefaultShouldlUseTheDefaultValue) +{ + unsigned int defaultValue = 10; + mock_c()->expectOneCall("foo"); + LONGS_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnUnsignedIntValueOrDefault(defaultValue)); + LONGS_EQUAL(defaultValue, mock_c()->returnUnsignedIntValueOrDefault(defaultValue)); +} + TEST(MockSupport_c, returnLongIntValue) { long int expected_value = 10; diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index 46d810ae2..55fa308f5 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -134,7 +134,9 @@ void all_mock_support_c_calls(void) mock_c()->hasReturnValue(); mock_c()->intReturnValue(); - mock_c()->returnIntValueOrDefault(0); + mock_c()->returnIntValueOrDefault(-1); + mock_c()->unsignedIntReturnValue(); + mock_c()->returnUnsignedIntValueOrDefault(1); mock_c()->disable(); mock_c()->actualCall("disabled"); From 3ca31ee41f0fa813b55d491cb5c3d8c2d84450df Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 06:52:02 +0000 Subject: [PATCH 0047/1345] MockSupport_c 15: Add longIntReturnValue() & Co. --- include/CppUTestExt/MockSupport_c.h | 6 ++++-- src/CppUTestExt/MockSupport_c.cpp | 22 ++++++++++++++++++-- tests/CppUTestExt/MockSupport_cTest.cpp | 24 +++++++++++++++++++--- tests/CppUTestExt/MockSupport_cTestCFile.c | 2 ++ 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 2f9225883..e112366c2 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -88,6 +88,8 @@ struct SMockActualCall_c int (*returnIntValueOrDefault)(int defaultValue); unsigned int (*unsignedIntReturnValue)(void); unsigned int (*returnUnsignedIntValueOrDefault)(unsigned int defaultValue); + long int (*longIntReturnValue)(void); + long int (*returnLongIntValueOrDefault)(long int defaultValue); /** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; @@ -138,8 +140,8 @@ struct SMockSupport_c int (*returnIntValueOrDefault)(int defaultValue); unsigned int (*unsignedIntReturnValue)(void); unsigned int (*returnUnsignedIntValueOrDefault)(unsigned int defaultValue); -/** long int longIntReturnValue(void); */ -/** long int returnLongIntValueOrDefault(long int defaultValue); */ + long int (*longIntReturnValue)(void); + long int (*returnLongIntValueOrDefault)(long int defaultValue); /** unsigned long int unsignedLongIntReturnValue(void); */ /** unsigned long int returnUnsignedLongIntValueOrDefault(unsigned long int defaultValue); */ /** const char* stringReturnValue(void); */ diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 3ecf87999..2c6d16dc2 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -182,7 +182,8 @@ int actualIntReturnValue_c(); int actualReturnIntValueOrDefault_c(int defaultValue); unsigned int actualUnsignedIntReturnValue_c(); unsigned int actualReturnUnsignedIntValueOrDefault_c(unsigned int defaultValue); - +long int actualLongIntReturnValue_c(); +long int actualReturnLongIntValueOrDefault_c(long int defaultValue); static void installComparator_c (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString) { @@ -256,7 +257,9 @@ static MockActualCall_c gActualCall = { actualIntReturnValue_c, actualReturnIntValueOrDefault_c, actualUnsignedIntReturnValue_c, - actualReturnUnsignedIntValueOrDefault_c + actualReturnUnsignedIntValueOrDefault_c, + actualLongIntReturnValue_c, + actualReturnLongIntValueOrDefault_c, }; static MockSupport_c gMockSupport = { @@ -271,6 +274,8 @@ static MockSupport_c gMockSupport = { actualReturnIntValueOrDefault_c, actualUnsignedIntReturnValue_c, actualReturnUnsignedIntValueOrDefault_c, + actualLongIntReturnValue_c, + actualReturnLongIntValueOrDefault_c, setIntData_c, setStringData_c, setDoubleData_c, @@ -621,6 +626,19 @@ unsigned int actualReturnUnsignedIntValueOrDefault_c(unsigned int defaultValue) return actualUnsignedIntReturnValue_c(); } +long int actualLongIntReturnValue_c() +{ + return getMockValueCFromNamedValue(actualCall->returnValue()).value.longIntValue; +} + +long int actualReturnLongIntValueOrDefault_c(long int defaultValue) +{ + if (!hasActualReturnValue_c()) { + return defaultValue; + } + return actualLongIntReturnValue_c(); +} + void disable_c(void) { currentMockSupport->disable(); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 71373a742..d4cb335d6 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -193,7 +193,7 @@ TEST(MockSupport_c, returnIntValue) { int expected_value = -10; mock_c()->expectOneCall("boo")->andReturnIntValue(expected_value); - LONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->returnValue().value.intValue); + LONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->intReturnValue()); LONGS_EQUAL(expected_value, mock_c()->intReturnValue()); LONGS_EQUAL(MOCKVALUETYPE_INTEGER, mock_c()->returnValue().type); } @@ -219,7 +219,7 @@ TEST(MockSupport_c, returnUnsignedIntValue) { unsigned int expected_value = 7; mock_c()->expectOneCall("boo")->andReturnUnsignedIntValue(expected_value); - LONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->returnValue().value.unsignedIntValue); + LONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->unsignedIntReturnValue()); LONGS_EQUAL(expected_value, mock_c()->unsignedIntReturnValue()); LONGS_EQUAL(MOCKVALUETYPE_UNSIGNED_INTEGER, mock_c()->returnValue().type); } @@ -245,10 +245,28 @@ TEST(MockSupport_c, returnLongIntValue) { long int expected_value = 10; mock_c()->expectOneCall("boo")->andReturnLongIntValue(expected_value); - LONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->returnValue().value.longIntValue); + LONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->longIntReturnValue()); + LONGS_EQUAL(expected_value, mock_c()->longIntReturnValue()); LONGS_EQUAL(MOCKVALUETYPE_LONG_INTEGER, mock_c()->returnValue().type); } +TEST(MockSupport_c, whenReturnValueIsGivenReturnLongIntValueOrDefaultShouldIgnoreTheDefault) +{ + long int defaultValue = 10L; + long int expectedValue = defaultValue + 1L; + mock_c()->expectOneCall("foo")->andReturnLongIntValue(expectedValue); + LONGS_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnLongIntValueOrDefault(defaultValue)); + LONGS_EQUAL(expectedValue, mock_c()->returnLongIntValueOrDefault(defaultValue)); +} + +TEST(MockSupport_c, whenNoReturnValueIsGivenReturnLongIntValueOrDefaultShouldlUseTheDefaultValue) +{ + long int defaultValue = 10L; + mock_c()->expectOneCall("foo"); + LONGS_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnLongIntValueOrDefault(defaultValue)); + LONGS_EQUAL(defaultValue, mock_c()->returnLongIntValueOrDefault(defaultValue)); +} + TEST(MockSupport_c, returnUnsignedLongIntValue) { unsigned long int expected_value = 10; diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index 55fa308f5..ddd7a8be9 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -137,6 +137,8 @@ void all_mock_support_c_calls(void) mock_c()->returnIntValueOrDefault(-1); mock_c()->unsignedIntReturnValue(); mock_c()->returnUnsignedIntValueOrDefault(1); + mock_c()->longIntReturnValue(); + mock_c()->returnLongIntValueOrDefault(1L); mock_c()->disable(); mock_c()->actualCall("disabled"); From 3817ced5ba4ece35f7f799c16e5225f32ce0ae08 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 07:17:29 +0000 Subject: [PATCH 0048/1345] MockSupport_c 16: Add unsignedLongIntReturnValue() & friends --- include/CppUTestExt/MockSupport_c.h | 6 +++-- src/CppUTestExt/MockSupport_c.cpp | 19 +++++++++++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 28 ++++++++++++++++++---- tests/CppUTestExt/MockSupport_cTestCFile.c | 4 +++- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index e112366c2..8d45fdb71 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -90,6 +90,8 @@ struct SMockActualCall_c unsigned int (*returnUnsignedIntValueOrDefault)(unsigned int defaultValue); long int (*longIntReturnValue)(void); long int (*returnLongIntValueOrDefault)(long int defaultValue); + unsigned long int (*unsignedLongIntReturnValue)(void); + unsigned long int (*returnUnsignedLongIntValueOrDefault)(unsigned long int defaultValue); /** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; @@ -142,8 +144,8 @@ struct SMockSupport_c unsigned int (*returnUnsignedIntValueOrDefault)(unsigned int defaultValue); long int (*longIntReturnValue)(void); long int (*returnLongIntValueOrDefault)(long int defaultValue); -/** unsigned long int unsignedLongIntReturnValue(void); */ -/** unsigned long int returnUnsignedLongIntValueOrDefault(unsigned long int defaultValue); */ + unsigned long int (*unsignedLongIntReturnValue)(void); + unsigned long int (*returnUnsignedLongIntValueOrDefault)(unsigned long int defaultValue); /** const char* stringReturnValue(void); */ /** const char* returnStringValueOrDefault(const char * defaultValue); */ /** double returnDoubleValueOrDefault(double defaultValue); */ diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 2c6d16dc2..7f05a5ad3 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -184,6 +184,8 @@ unsigned int actualUnsignedIntReturnValue_c(); unsigned int actualReturnUnsignedIntValueOrDefault_c(unsigned int defaultValue); long int actualLongIntReturnValue_c(); long int actualReturnLongIntValueOrDefault_c(long int defaultValue); +unsigned long int actualUnsignedLongIntReturnValue_c(); +unsigned long int actualReturnUnsignedLongIntValueOrDefault_c(unsigned long int defaultValue); static void installComparator_c (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString) { @@ -260,6 +262,8 @@ static MockActualCall_c gActualCall = { actualReturnUnsignedIntValueOrDefault_c, actualLongIntReturnValue_c, actualReturnLongIntValueOrDefault_c, + actualUnsignedLongIntReturnValue_c, + actualReturnUnsignedLongIntValueOrDefault_c, }; static MockSupport_c gMockSupport = { @@ -276,6 +280,8 @@ static MockSupport_c gMockSupport = { actualReturnUnsignedIntValueOrDefault_c, actualLongIntReturnValue_c, actualReturnLongIntValueOrDefault_c, + actualUnsignedLongIntReturnValue_c, + actualReturnUnsignedLongIntValueOrDefault_c, setIntData_c, setStringData_c, setDoubleData_c, @@ -639,6 +645,19 @@ long int actualReturnLongIntValueOrDefault_c(long int defaultValue) return actualLongIntReturnValue_c(); } +unsigned long int actualUnsignedLongIntReturnValue_c() +{ + return getMockValueCFromNamedValue(actualCall->returnValue()).value.unsignedLongIntValue; +} + +unsigned long int actualReturnUnsignedLongIntValueOrDefault_c(unsigned long int defaultValue) +{ + if (!hasActualReturnValue_c()) { + return defaultValue; + } + return actualUnsignedLongIntReturnValue_c(); +} + void disable_c(void) { currentMockSupport->disable(); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index d4cb335d6..783c6357c 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -243,7 +243,7 @@ TEST(MockSupport_c, whenNoReturnValueIsGivenReturnUnsignedIntValueOrDefaultShoul TEST(MockSupport_c, returnLongIntValue) { - long int expected_value = 10; + long int expected_value = -10L; mock_c()->expectOneCall("boo")->andReturnLongIntValue(expected_value); LONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->longIntReturnValue()); LONGS_EQUAL(expected_value, mock_c()->longIntReturnValue()); @@ -252,8 +252,8 @@ TEST(MockSupport_c, returnLongIntValue) TEST(MockSupport_c, whenReturnValueIsGivenReturnLongIntValueOrDefaultShouldIgnoreTheDefault) { - long int defaultValue = 10L; - long int expectedValue = defaultValue + 1L; + long int defaultValue = -10L; + long int expectedValue = defaultValue - 1L; mock_c()->expectOneCall("foo")->andReturnLongIntValue(expectedValue); LONGS_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnLongIntValueOrDefault(defaultValue)); LONGS_EQUAL(expectedValue, mock_c()->returnLongIntValueOrDefault(defaultValue)); @@ -261,7 +261,7 @@ TEST(MockSupport_c, whenReturnValueIsGivenReturnLongIntValueOrDefaultShouldIgnor TEST(MockSupport_c, whenNoReturnValueIsGivenReturnLongIntValueOrDefaultShouldlUseTheDefaultValue) { - long int defaultValue = 10L; + long int defaultValue = -10L; mock_c()->expectOneCall("foo"); LONGS_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnLongIntValueOrDefault(defaultValue)); LONGS_EQUAL(defaultValue, mock_c()->returnLongIntValueOrDefault(defaultValue)); @@ -271,10 +271,28 @@ TEST(MockSupport_c, returnUnsignedLongIntValue) { unsigned long int expected_value = 10; mock_c()->expectOneCall("boo")->andReturnUnsignedLongIntValue(expected_value); - LONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->returnValue().value.unsignedLongIntValue); + LONGS_EQUAL(expected_value, mock_c()->actualCall("boo")->unsignedLongIntReturnValue()); + LONGS_EQUAL(expected_value, mock_c()->unsignedLongIntReturnValue()); LONGS_EQUAL(MOCKVALUETYPE_UNSIGNED_LONG_INTEGER, mock_c()->returnValue().type); } +TEST(MockSupport_c, whenReturnValueIsGivenReturnUnsignedLongIntValueOrDefaultShouldIgnoreTheDefault) +{ + unsigned long int defaultValue = 10L; + unsigned long int expectedValue = defaultValue + 1L; + mock_c()->expectOneCall("foo")->andReturnUnsignedLongIntValue(expectedValue); + LONGS_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnUnsignedLongIntValueOrDefault(defaultValue)); + LONGS_EQUAL(expectedValue, mock_c()->returnUnsignedLongIntValueOrDefault(defaultValue)); +} + +TEST(MockSupport_c, whenNoReturnValueIsGivenReturnUnsignedLongIntValueOrDefaultShouldlUseTheDefaultValue) +{ + unsigned long int defaultValue = 10L; + mock_c()->expectOneCall("foo"); + LONGS_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnUnsignedLongIntValueOrDefault(defaultValue)); + LONGS_EQUAL(defaultValue, mock_c()->returnUnsignedLongIntValueOrDefault(defaultValue)); +} + TEST(MockSupport_c, returnDoubleValue) { mock_c()->expectOneCall("boo")->andReturnDoubleValue(1.0); diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index ddd7a8be9..6fe52e7e5 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -138,7 +138,9 @@ void all_mock_support_c_calls(void) mock_c()->unsignedIntReturnValue(); mock_c()->returnUnsignedIntValueOrDefault(1); mock_c()->longIntReturnValue(); - mock_c()->returnLongIntValueOrDefault(1L); + mock_c()->returnLongIntValueOrDefault(-1L); + mock_c()->unsignedLongIntReturnValue(); + mock_c()->returnUnsignedLongIntValueOrDefault(1L); mock_c()->disable(); mock_c()->actualCall("disabled"); From 064aef984f279d14fcbfa51fe0829b346f9fe43a Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 07:50:57 +0000 Subject: [PATCH 0049/1345] MockSupport_c 17: Add stringReturnValue() & friends. --- include/CppUTestExt/MockSupport_c.h | 6 ++-- src/CppUTestExt/MockSupport_c.cpp | 19 +++++++++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 32 +++++++++++++++++----- tests/CppUTestExt/MockSupport_cTestCFile.c | 4 ++- 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 8d45fdb71..69abc153b 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -92,6 +92,8 @@ struct SMockActualCall_c long int (*returnLongIntValueOrDefault)(long int defaultValue); unsigned long int (*unsignedLongIntReturnValue)(void); unsigned long int (*returnUnsignedLongIntValueOrDefault)(unsigned long int defaultValue); + const char* (*stringReturnValue)(void); + const char* (*returnStringValueOrDefault)(const char * defaultValue); /** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; @@ -146,8 +148,8 @@ struct SMockSupport_c long int (*returnLongIntValueOrDefault)(long int defaultValue); unsigned long int (*unsignedLongIntReturnValue)(void); unsigned long int (*returnUnsignedLongIntValueOrDefault)(unsigned long int defaultValue); -/** const char* stringReturnValue(void); */ -/** const char* returnStringValueOrDefault(const char * defaultValue); */ + const char* (*stringReturnValue)(void); + const char* (*returnStringValueOrDefault)(const char * defaultValue); /** double returnDoubleValueOrDefault(double defaultValue); */ /** double doubleReturnValue(void); */ /** void* pointerReturnValue(void); */ diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 7f05a5ad3..a19478c43 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -186,6 +186,8 @@ long int actualLongIntReturnValue_c(); long int actualReturnLongIntValueOrDefault_c(long int defaultValue); unsigned long int actualUnsignedLongIntReturnValue_c(); unsigned long int actualReturnUnsignedLongIntValueOrDefault_c(unsigned long int defaultValue); +const char* actualStringReturnValue_c(void); +const char* actualReturnStringValueOrDefault_c(const char * defaultValue); static void installComparator_c (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString) { @@ -264,6 +266,8 @@ static MockActualCall_c gActualCall = { actualReturnLongIntValueOrDefault_c, actualUnsignedLongIntReturnValue_c, actualReturnUnsignedLongIntValueOrDefault_c, + actualStringReturnValue_c, + actualReturnStringValueOrDefault_c, }; static MockSupport_c gMockSupport = { @@ -282,6 +286,8 @@ static MockSupport_c gMockSupport = { actualReturnLongIntValueOrDefault_c, actualUnsignedLongIntReturnValue_c, actualReturnUnsignedLongIntValueOrDefault_c, + actualStringReturnValue_c, + actualReturnStringValueOrDefault_c, setIntData_c, setStringData_c, setDoubleData_c, @@ -658,6 +664,19 @@ unsigned long int actualReturnUnsignedLongIntValueOrDefault_c(unsigned long int return actualUnsignedLongIntReturnValue_c(); } +const char* actualStringReturnValue_c(void) +{ + return getMockValueCFromNamedValue(actualCall->returnValue()).value.stringValue; +} + +const char* actualReturnStringValueOrDefault_c(const char * defaultValue) +{ + if (!hasActualReturnValue_c()) { + return defaultValue; + } + return actualStringReturnValue_c(); +} + void disable_c(void) { currentMockSupport->disable(); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 783c6357c..ce716b2b6 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -293,6 +293,31 @@ TEST(MockSupport_c, whenNoReturnValueIsGivenReturnUnsignedLongIntValueOrDefaultS LONGS_EQUAL(defaultValue, mock_c()->returnUnsignedLongIntValueOrDefault(defaultValue)); } +TEST(MockSupport_c, returnStringValue) +{ + mock_c()->expectOneCall("boo")->andReturnStringValue("hello world"); + STRCMP_EQUAL("hello world", mock_c()->actualCall("boo")->stringReturnValue()); + STRCMP_EQUAL("hello world", mock_c()->stringReturnValue()); + LONGS_EQUAL(MOCKVALUETYPE_STRING, mock_c()->returnValue().type); +} + +TEST(MockSupport_c, whenReturnValueIsGivenReturnStringValueOrDefaultShouldIgnoreTheDefault) +{ + const char defaultValue[] = "bar"; + const char expectedValue[] = "bla"; + mock_c()->expectOneCall("foo")->andReturnStringValue(expectedValue); + STRCMP_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnStringValueOrDefault(defaultValue)); + STRCMP_EQUAL(expectedValue, mock_c()->returnStringValueOrDefault(defaultValue)); +} + +TEST(MockSupport_c, whenNoReturnValueIsGivenReturnStringValueOrDefaultShouldlUseTheDefaultValue) +{ + const char defaultValue[] = "bar"; + mock_c()->expectOneCall("foo"); + STRCMP_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnStringValueOrDefault(defaultValue)); + STRCMP_EQUAL(defaultValue, mock_c()->returnStringValueOrDefault(defaultValue)); +} + TEST(MockSupport_c, returnDoubleValue) { mock_c()->expectOneCall("boo")->andReturnDoubleValue(1.0); @@ -300,13 +325,6 @@ TEST(MockSupport_c, returnDoubleValue) LONGS_EQUAL(MOCKVALUETYPE_DOUBLE, mock_c()->returnValue().type); } -TEST(MockSupport_c, returnStringValue) -{ - mock_c()->expectOneCall("boo")->andReturnStringValue("hello world"); - STRCMP_EQUAL("hello world", mock_c()->actualCall("boo")->returnValue().value.stringValue); - LONGS_EQUAL(MOCKVALUETYPE_STRING, mock_c()->returnValue().type); -} - TEST(MockSupport_c, returnPointerValue) { mock_c()->expectOneCall("boo")->andReturnPointerValue((void*) 10); diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index 6fe52e7e5..67e8baa9d 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -141,7 +141,9 @@ void all_mock_support_c_calls(void) mock_c()->returnLongIntValueOrDefault(-1L); mock_c()->unsignedLongIntReturnValue(); mock_c()->returnUnsignedLongIntValueOrDefault(1L); - + mock_c()->stringReturnValue(); + mock_c()->returnStringValueOrDefault(""); + mock_c()->disable(); mock_c()->actualCall("disabled"); mock_c()->enable(); From 1b8700bfaac62b54cf687cd0affea8dbf82a7f1a Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 08:09:22 +0000 Subject: [PATCH 0050/1345] MockSupport_c 18: Add doubleReturnValue() & friends. --- include/CppUTestExt/MockSupport_c.h | 6 ++++-- src/CppUTestExt/MockSupport_c.cpp | 19 +++++++++++++++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 20 +++++++++++++++++++- tests/CppUTestExt/MockSupport_cTestCFile.c | 2 ++ 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 69abc153b..a96f4109c 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -94,6 +94,8 @@ struct SMockActualCall_c unsigned long int (*returnUnsignedLongIntValueOrDefault)(unsigned long int defaultValue); const char* (*stringReturnValue)(void); const char* (*returnStringValueOrDefault)(const char * defaultValue); + double (*doubleReturnValue)(void); + double (*returnDoubleValueOrDefault)(double defaultValue); /** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; @@ -150,8 +152,8 @@ struct SMockSupport_c unsigned long int (*returnUnsignedLongIntValueOrDefault)(unsigned long int defaultValue); const char* (*stringReturnValue)(void); const char* (*returnStringValueOrDefault)(const char * defaultValue); -/** double returnDoubleValueOrDefault(double defaultValue); */ -/** double doubleReturnValue(void); */ + double (*doubleReturnValue)(void); + double (*returnDoubleValueOrDefault)(double defaultValue); /** void* pointerReturnValue(void); */ /** void* returnPointerValueOrDefault(void * defaultValue); */ /** const void* returnConstPointerValueOrDefault(const void * defaultValue); */ diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index a19478c43..56bd5fbc0 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -188,6 +188,8 @@ unsigned long int actualUnsignedLongIntReturnValue_c(); unsigned long int actualReturnUnsignedLongIntValueOrDefault_c(unsigned long int defaultValue); const char* actualStringReturnValue_c(void); const char* actualReturnStringValueOrDefault_c(const char * defaultValue); +double actualDoubleReturnValue_c(void); +double actualReturnDoubleValueOrDefault_c(double defaultValue); static void installComparator_c (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString) { @@ -268,6 +270,8 @@ static MockActualCall_c gActualCall = { actualReturnUnsignedLongIntValueOrDefault_c, actualStringReturnValue_c, actualReturnStringValueOrDefault_c, + actualDoubleReturnValue_c, + actualReturnDoubleValueOrDefault_c, }; static MockSupport_c gMockSupport = { @@ -288,6 +292,8 @@ static MockSupport_c gMockSupport = { actualReturnUnsignedLongIntValueOrDefault_c, actualStringReturnValue_c, actualReturnStringValueOrDefault_c, + actualDoubleReturnValue_c, + actualReturnDoubleValueOrDefault_c, setIntData_c, setStringData_c, setDoubleData_c, @@ -677,6 +683,19 @@ const char* actualReturnStringValueOrDefault_c(const char * defaultValue) return actualStringReturnValue_c(); } +double actualDoubleReturnValue_c() +{ + return getMockValueCFromNamedValue(actualCall->returnValue()).value.doubleValue; +} + +double actualReturnDoubleValueOrDefault_c(double defaultValue) +{ + if (!hasActualReturnValue_c()) { + return defaultValue; + } + return actualDoubleReturnValue_c(); +} + void disable_c(void) { currentMockSupport->disable(); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index ce716b2b6..9db6877a8 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -321,10 +321,28 @@ TEST(MockSupport_c, whenNoReturnValueIsGivenReturnStringValueOrDefaultShouldlUse TEST(MockSupport_c, returnDoubleValue) { mock_c()->expectOneCall("boo")->andReturnDoubleValue(1.0); - DOUBLES_EQUAL(1.0, mock_c()->actualCall("boo")->returnValue().value.doubleValue, 0.005); + DOUBLES_EQUAL(1.0, mock_c()->actualCall("boo")->doubleReturnValue(), 0.005); + DOUBLES_EQUAL(1.0, mock_c()->doubleReturnValue(), 0.005); LONGS_EQUAL(MOCKVALUETYPE_DOUBLE, mock_c()->returnValue().type); } +TEST(MockSupport_c, whenReturnValueIsGivenReturnDoubleValueOrDefaultShouldIgnoreTheDefault) +{ + double defaultValue = 2.2; + double expectedValue = defaultValue + 0.1; + mock_c()->expectOneCall("foo")->andReturnDoubleValue(expectedValue); + DOUBLES_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnDoubleValueOrDefault(defaultValue), 0.005); + DOUBLES_EQUAL(expectedValue, mock_c()->returnDoubleValueOrDefault(defaultValue), 0.005); +} + +TEST(MockSupport_c, whenNoReturnValueIsGivenReturnDoubleValueOrDefaultShouldlUseTheDefaultValue) +{ + double defaultValue = 2.2; + mock_c()->expectOneCall("foo"); + DOUBLES_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnDoubleValueOrDefault(defaultValue), 0.005); + DOUBLES_EQUAL(defaultValue, mock_c()->returnDoubleValueOrDefault(defaultValue), 0.005); +} + TEST(MockSupport_c, returnPointerValue) { mock_c()->expectOneCall("boo")->andReturnPointerValue((void*) 10); diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index 67e8baa9d..0576dfcf3 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -143,6 +143,8 @@ void all_mock_support_c_calls(void) mock_c()->returnUnsignedLongIntValueOrDefault(1L); mock_c()->stringReturnValue(); mock_c()->returnStringValueOrDefault(""); + mock_c()->doubleReturnValue(); + mock_c()->returnDoubleValueOrDefault(0.01F); mock_c()->disable(); mock_c()->actualCall("disabled"); From 039be91ab80ba10dd6f46a2a0e7806f658fb2e8a Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 08:15:11 +0000 Subject: [PATCH 0051/1345] MockSupport_c 19: Fix formatting. --- include/CppUTestExt/MockSupport_c.h | 4 ++-- tests/CommandLineTestRunnerTest.cpp | 2 +- tests/CppUTestExt/MockComparatorCopierTest.cpp | 2 +- tests/CppUTestExt/MockSupport_cTest.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index a96f4109c..e0cd9587b 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -115,7 +115,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* (*ignoreOtherParameters)(void); + MockExpectedCall_c* (*ignoreOtherParameters)(void); MockExpectedCall_c* (*andReturnUnsignedIntValue)(unsigned int value); MockExpectedCall_c* (*andReturnIntValue)(int value); @@ -170,7 +170,7 @@ struct SMockSupport_c void (*setFunctionPointerData) (const char* name, void (*value)(void)); void (*setDataObject) (const char* name, const char* type, void* value); MockValue_c (*getData)(const char* name); - + /** MockSupport_c* getMockSupportScope(const char* name); */ /** const char (*getTraceOutput+)(void); */ diff --git a/tests/CommandLineTestRunnerTest.cpp b/tests/CommandLineTestRunnerTest.cpp index 8b57704ae..057b95c65 100644 --- a/tests/CommandLineTestRunnerTest.cpp +++ b/tests/CommandLineTestRunnerTest.cpp @@ -252,7 +252,7 @@ TEST(CommandLineTestRunner, realTeamCityOutputShouldBeCreatedAndWorkProperly) CommandLineTestRunner commandLineTestRunner(4, argv, ®istry); commandLineTestRunner.runAllTestsMain(); - + delete fakeOutput; /* Original output must be restored before further output occurs */ STRCMP_CONTAINS("##teamcity[testSuiteStarted name='group'", FakeOutput::console.asCharString()); diff --git a/tests/CppUTestExt/MockComparatorCopierTest.cpp b/tests/CppUTestExt/MockComparatorCopierTest.cpp index 703934f3a..0b83a6811 100644 --- a/tests/CppUTestExt/MockComparatorCopierTest.cpp +++ b/tests/CppUTestExt/MockComparatorCopierTest.cpp @@ -504,7 +504,7 @@ TEST(MockComparatorCopierTest, removingCopiersWorksHierachically) { MockFailureReporterInstaller failureReporterInstaller; MyTypeForTesting object(1); - + MyTypeForTestingCopier copier; mock("scope").installCopier("MyTypeForTesting", copier); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 9db6877a8..57b66d0ea 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -104,7 +104,7 @@ extern "C"{ { return "valueToString"; } - + static void typeCopy(void* dst, const void* src) { *(int*) dst = *(int*) src; From a33a036c1510458416dfb5fe135b240b88f1484a Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 08:31:34 +0000 Subject: [PATCH 0052/1345] MockSupport_c 20: Some clean-up. --- src/CppUTestExt/MockSupport_c.cpp | 117 +++++++++++++++--------------- 1 file changed, 58 insertions(+), 59 deletions(-) diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 56bd5fbc0..8220e2fcc 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -161,7 +161,6 @@ MockExpectedCall_c* andReturnStringValue_c(const char* value); MockExpectedCall_c* andReturnPointerValue_c(void* value); MockExpectedCall_c* andReturnConstPointerValue_c(const void* value); MockExpectedCall_c* andReturnFunctionPointerValue_c(void (*value)()); -MockValue_c expectedReturnValue_c(); MockActualCall_c* withActualIntParameters_c(const char* name, int value); MockActualCall_c* withActualUnsignedIntParameters_c(const char* name, unsigned int value); @@ -177,19 +176,19 @@ MockActualCall_c* withActualParameterOfType_c(const char* type, const char* name MockActualCall_c* withActualOutputParameter_c(const char* name, void* value); MockActualCall_c* withActualOutputParameterOfType_c(const char* type, const char* name, void* value); int hasActualReturnValue_c(); -MockValue_c actualReturnValue_c(); -int actualIntReturnValue_c(); -int actualReturnIntValueOrDefault_c(int defaultValue); -unsigned int actualUnsignedIntReturnValue_c(); -unsigned int actualReturnUnsignedIntValueOrDefault_c(unsigned int defaultValue); -long int actualLongIntReturnValue_c(); -long int actualReturnLongIntValueOrDefault_c(long int defaultValue); -unsigned long int actualUnsignedLongIntReturnValue_c(); -unsigned long int actualReturnUnsignedLongIntValueOrDefault_c(unsigned long int defaultValue); -const char* actualStringReturnValue_c(void); -const char* actualReturnStringValueOrDefault_c(const char * defaultValue); -double actualDoubleReturnValue_c(void); -double actualReturnDoubleValueOrDefault_c(double defaultValue); +MockValue_c returnValue_c(); +int intReturnValue_c(); +int returnIntValueOrDefault_c(int defaultValue); +unsigned int unsignedIntReturnValue_c(); +unsigned int returnUnsignedIntValueOrDefault_c(unsigned int defaultValue); +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); +const char* stringReturnValue_c(void); +const char* returnStringValueOrDefault_c(const char * defaultValue); +double doubleReturnValue_c(void); +double returnDoubleValueOrDefault_c(double defaultValue); static void installComparator_c (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString) { @@ -259,19 +258,19 @@ static MockActualCall_c gActualCall = { withActualOutputParameter_c, withActualOutputParameterOfType_c, hasActualReturnValue_c, - actualReturnValue_c, - actualIntReturnValue_c, - actualReturnIntValueOrDefault_c, - actualUnsignedIntReturnValue_c, - actualReturnUnsignedIntValueOrDefault_c, - actualLongIntReturnValue_c, - actualReturnLongIntValueOrDefault_c, - actualUnsignedLongIntReturnValue_c, - actualReturnUnsignedLongIntValueOrDefault_c, - actualStringReturnValue_c, - actualReturnStringValueOrDefault_c, - actualDoubleReturnValue_c, - actualReturnDoubleValueOrDefault_c, + returnValue_c, + intReturnValue_c, + returnIntValueOrDefault_c, + unsignedIntReturnValue_c, + returnUnsignedIntValueOrDefault_c, + longIntReturnValue_c, + returnLongIntValueOrDefault_c, + unsignedLongIntReturnValue_c, + returnUnsignedLongIntValueOrDefault_c, + stringReturnValue_c, + returnStringValueOrDefault_c, + doubleReturnValue_c, + returnDoubleValueOrDefault_c, }; static MockSupport_c gMockSupport = { @@ -281,19 +280,19 @@ static MockSupport_c gMockSupport = { expectNCalls_c, actualCall_c, hasReturnValue_c, - actualReturnValue_c, - actualIntReturnValue_c, - actualReturnIntValueOrDefault_c, - actualUnsignedIntReturnValue_c, - actualReturnUnsignedIntValueOrDefault_c, - actualLongIntReturnValue_c, - actualReturnLongIntValueOrDefault_c, - actualUnsignedLongIntReturnValue_c, - actualReturnUnsignedLongIntValueOrDefault_c, - actualStringReturnValue_c, - actualReturnStringValueOrDefault_c, - actualDoubleReturnValue_c, - actualReturnDoubleValueOrDefault_c, + returnValue_c, + intReturnValue_c, + returnIntValueOrDefault_c, + unsignedIntReturnValue_c, + returnUnsignedIntValueOrDefault_c, + longIntReturnValue_c, + returnLongIntValueOrDefault_c, + unsignedLongIntReturnValue_c, + returnUnsignedLongIntValueOrDefault_c, + stringReturnValue_c, + returnStringValueOrDefault_c, + doubleReturnValue_c, + returnDoubleValueOrDefault_c, setIntData_c, setStringData_c, setDoubleData_c, @@ -613,87 +612,87 @@ int hasActualReturnValue_c(void) return actualCall->hasReturnValue(); } -MockValue_c actualReturnValue_c() +MockValue_c returnValue_c() { return getMockValueCFromNamedValue(actualCall->returnValue()); } -int actualIntReturnValue_c() +int intReturnValue_c() { return getMockValueCFromNamedValue(actualCall->returnValue()).value.intValue; } -int actualReturnIntValueOrDefault_c(int defaultValue) +int returnIntValueOrDefault_c(int defaultValue) { if (!hasActualReturnValue_c()) { return defaultValue; } - return actualIntReturnValue_c(); + return intReturnValue_c(); } -unsigned int actualUnsignedIntReturnValue_c() +unsigned int unsignedIntReturnValue_c() { return getMockValueCFromNamedValue(actualCall->returnValue()).value.unsignedIntValue; } -unsigned int actualReturnUnsignedIntValueOrDefault_c(unsigned int defaultValue) +unsigned int returnUnsignedIntValueOrDefault_c(unsigned int defaultValue) { if (!hasActualReturnValue_c()) { return defaultValue; } - return actualUnsignedIntReturnValue_c(); + return unsignedIntReturnValue_c(); } -long int actualLongIntReturnValue_c() +long int longIntReturnValue_c() { return getMockValueCFromNamedValue(actualCall->returnValue()).value.longIntValue; } -long int actualReturnLongIntValueOrDefault_c(long int defaultValue) +long int returnLongIntValueOrDefault_c(long int defaultValue) { if (!hasActualReturnValue_c()) { return defaultValue; } - return actualLongIntReturnValue_c(); + return longIntReturnValue_c(); } -unsigned long int actualUnsignedLongIntReturnValue_c() +unsigned long int unsignedLongIntReturnValue_c() { return getMockValueCFromNamedValue(actualCall->returnValue()).value.unsignedLongIntValue; } -unsigned long int actualReturnUnsignedLongIntValueOrDefault_c(unsigned long int defaultValue) +unsigned long int returnUnsignedLongIntValueOrDefault_c(unsigned long int defaultValue) { if (!hasActualReturnValue_c()) { return defaultValue; } - return actualUnsignedLongIntReturnValue_c(); + return unsignedLongIntReturnValue_c(); } -const char* actualStringReturnValue_c(void) +const char* stringReturnValue_c(void) { return getMockValueCFromNamedValue(actualCall->returnValue()).value.stringValue; } -const char* actualReturnStringValueOrDefault_c(const char * defaultValue) +const char* returnStringValueOrDefault_c(const char * defaultValue) { if (!hasActualReturnValue_c()) { return defaultValue; } - return actualStringReturnValue_c(); + return stringReturnValue_c(); } -double actualDoubleReturnValue_c() +double doubleReturnValue_c() { return getMockValueCFromNamedValue(actualCall->returnValue()).value.doubleValue; } -double actualReturnDoubleValueOrDefault_c(double defaultValue) +double returnDoubleValueOrDefault_c(double defaultValue) { if (!hasActualReturnValue_c()) { return defaultValue; } - return actualDoubleReturnValue_c(); + return doubleReturnValue_c(); } void disable_c(void) From 4d595dda7b0bc54849032ee0c9efc8af5e40d3f1 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 08:39:05 +0000 Subject: [PATCH 0053/1345] MockSupport_c 21: Remove some redundancy. --- src/CppUTestExt/MockSupport_c.cpp | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 8220e2fcc..7c0836301 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -175,7 +175,6 @@ MockActualCall_c* withActualMemoryBufferParameters_c(const char* name, const uns MockActualCall_c* withActualParameterOfType_c(const char* type, const char* name, const void* value); MockActualCall_c* withActualOutputParameter_c(const char* name, void* value); MockActualCall_c* withActualOutputParameterOfType_c(const char* type, const char* name, void* value); -int hasActualReturnValue_c(); MockValue_c returnValue_c(); int intReturnValue_c(); int returnIntValueOrDefault_c(int defaultValue); @@ -257,7 +256,7 @@ static MockActualCall_c gActualCall = { withActualParameterOfType_c, withActualOutputParameter_c, withActualOutputParameterOfType_c, - hasActualReturnValue_c, + hasReturnValue_c, returnValue_c, intReturnValue_c, returnIntValueOrDefault_c, @@ -607,11 +606,6 @@ MockActualCall_c* withActualOutputParameterOfType_c(const char* type, const char return &gActualCall; } -int hasActualReturnValue_c(void) -{ - return actualCall->hasReturnValue(); -} - MockValue_c returnValue_c() { return getMockValueCFromNamedValue(actualCall->returnValue()); @@ -624,7 +618,7 @@ int intReturnValue_c() int returnIntValueOrDefault_c(int defaultValue) { - if (!hasActualReturnValue_c()) { + if (!hasReturnValue_c()) { return defaultValue; } return intReturnValue_c(); @@ -637,7 +631,7 @@ unsigned int unsignedIntReturnValue_c() unsigned int returnUnsignedIntValueOrDefault_c(unsigned int defaultValue) { - if (!hasActualReturnValue_c()) { + if (!hasReturnValue_c()) { return defaultValue; } return unsignedIntReturnValue_c(); @@ -650,7 +644,7 @@ long int longIntReturnValue_c() long int returnLongIntValueOrDefault_c(long int defaultValue) { - if (!hasActualReturnValue_c()) { + if (!hasReturnValue_c()) { return defaultValue; } return longIntReturnValue_c(); @@ -663,7 +657,7 @@ unsigned long int unsignedLongIntReturnValue_c() unsigned long int returnUnsignedLongIntValueOrDefault_c(unsigned long int defaultValue) { - if (!hasActualReturnValue_c()) { + if (!hasReturnValue_c()) { return defaultValue; } return unsignedLongIntReturnValue_c(); @@ -676,7 +670,7 @@ const char* stringReturnValue_c(void) const char* returnStringValueOrDefault_c(const char * defaultValue) { - if (!hasActualReturnValue_c()) { + if (!hasReturnValue_c()) { return defaultValue; } return stringReturnValue_c(); @@ -689,7 +683,7 @@ double doubleReturnValue_c() double returnDoubleValueOrDefault_c(double defaultValue) { - if (!hasActualReturnValue_c()) { + if (!hasReturnValue_c()) { return defaultValue; } return doubleReturnValue_c(); From e33cc8102d432a8b4b0637e15aabb9e527664d9f Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 08:55:11 +0000 Subject: [PATCH 0054/1345] MockSupport_c 22: Add pointerReturnvalue & friends. --- include/CppUTestExt/MockSupport_c.h | 6 ++++-- src/CppUTestExt/MockSupport_c.cpp | 21 +++++++++++++++++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 20 +++++++++++++++++++- tests/CppUTestExt/MockSupport_cTestCFile.c | 2 ++ 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index e0cd9587b..997719f86 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -96,6 +96,8 @@ struct SMockActualCall_c const char* (*returnStringValueOrDefault)(const char * defaultValue); double (*doubleReturnValue)(void); double (*returnDoubleValueOrDefault)(double defaultValue); + void* (*pointerReturnValue)(void); + void* (*returnPointerValueOrDefault)(void * defaultValue); /** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; @@ -154,8 +156,8 @@ struct SMockSupport_c const char* (*returnStringValueOrDefault)(const char * defaultValue); double (*doubleReturnValue)(void); double (*returnDoubleValueOrDefault)(double defaultValue); -/** void* pointerReturnValue(void); */ -/** void* returnPointerValueOrDefault(void * defaultValue); */ + void* (*pointerReturnValue)(void); + void* (*returnPointerValueOrDefault)(void * defaultValue); /** const void* returnConstPointerValueOrDefault(const void * defaultValue); */ /** const void* constPointerReturnValue(void); */ /** void (*returnFunctionPointerValueOrDefault(void (*defaultValue)()))(); */ diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 7c0836301..0827f081d 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -188,6 +188,8 @@ const char* stringReturnValue_c(void); const char* returnStringValueOrDefault_c(const char * defaultValue); double doubleReturnValue_c(void); double returnDoubleValueOrDefault_c(double defaultValue); +void* pointerReturnValue_c(void); +void* returnPointerValueOrDefault_c(void * defaultValue); static void installComparator_c (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString) { @@ -270,6 +272,9 @@ static MockActualCall_c gActualCall = { returnStringValueOrDefault_c, doubleReturnValue_c, returnDoubleValueOrDefault_c, + pointerReturnValue_c, + returnPointerValueOrDefault_c, + }; static MockSupport_c gMockSupport = { @@ -292,6 +297,8 @@ static MockSupport_c gMockSupport = { returnStringValueOrDefault_c, doubleReturnValue_c, returnDoubleValueOrDefault_c, + pointerReturnValue_c, + returnPointerValueOrDefault_c, setIntData_c, setStringData_c, setDoubleData_c, @@ -689,6 +696,20 @@ double returnDoubleValueOrDefault_c(double defaultValue) return doubleReturnValue_c(); } +void* pointerReturnValue_c(void) +{ + return getMockValueCFromNamedValue(actualCall->returnValue()).value.pointerValue; +} + +void* returnPointerValueOrDefault_c(void * defaultValue) +{ + if (!hasReturnValue_c()) { + return defaultValue; + } + return pointerReturnValue_c(); +} + + void disable_c(void) { currentMockSupport->disable(); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 57b66d0ea..2629256e5 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -346,10 +346,28 @@ TEST(MockSupport_c, whenNoReturnValueIsGivenReturnDoubleValueOrDefaultShouldlUse TEST(MockSupport_c, returnPointerValue) { mock_c()->expectOneCall("boo")->andReturnPointerValue((void*) 10); - POINTERS_EQUAL((void*) 10, mock_c()->actualCall("boo")->returnValue().value.pointerValue); + POINTERS_EQUAL((void*) 10, mock_c()->actualCall("boo")->pointerReturnValue()); + POINTERS_EQUAL((void*) 10, mock_c()->pointerReturnValue()); LONGS_EQUAL(MOCKVALUETYPE_POINTER, mock_c()->returnValue().type); } +TEST(MockSupport_c, whenReturnValueIsGivenReturnPointerValueOrDefaultShouldIgnoreTheDefault) +{ + void* defaultValue = (void*) 10; + void* expectedValue = (void*) 27; + mock_c()->expectOneCall("foo")->andReturnPointerValue(expectedValue); + POINTERS_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnPointerValueOrDefault(defaultValue)); + POINTERS_EQUAL(expectedValue, mock_c()->returnPointerValueOrDefault(defaultValue)); +} + +TEST(MockSupport_c, whenNoReturnValueIsGivenReturnPointerValueOrDefaultShouldlUseTheDefaultValue) +{ + void* defaultValue = (void*) 10; + mock_c()->expectOneCall("foo"); + POINTERS_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnPointerValueOrDefault(defaultValue)); + POINTERS_EQUAL(defaultValue, mock_c()->returnPointerValueOrDefault(defaultValue)); +} + TEST(MockSupport_c, returnConstPointerValue) { mock_c()->expectOneCall("boo")->andReturnConstPointerValue((const void*) 10); diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index 0576dfcf3..b2ec10493 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -145,6 +145,8 @@ void all_mock_support_c_calls(void) mock_c()->returnStringValueOrDefault(""); mock_c()->doubleReturnValue(); mock_c()->returnDoubleValueOrDefault(0.01F); + mock_c()->pointerReturnValue(); + mock_c()->returnPointerValueOrDefault(0); mock_c()->disable(); mock_c()->actualCall("disabled"); From d1cb0ff4568253c3eeaa9075cf63ac62861118f9 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 09:10:47 +0000 Subject: [PATCH 0055/1345] MockSupport_c 23: Add constPointerReturnvalue & friends. --- include/CppUTestExt/MockSupport_c.h | 6 ++++-- src/CppUTestExt/MockSupport_c.cpp | 19 ++++++++++++++++++- tests/CppUTestExt/MockSupport_cTest.cpp | 17 +++++++++++++++++ tests/CppUTestExt/MockSupport_cTestCFile.c | 2 ++ 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 997719f86..9ee6ac612 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -98,6 +98,8 @@ struct SMockActualCall_c double (*returnDoubleValueOrDefault)(double defaultValue); void* (*pointerReturnValue)(void); void* (*returnPointerValueOrDefault)(void * defaultValue); + const void* (*constPointerReturnValue)(void); + const void* (*returnConstPointerValueOrDefault)(const void * defaultValue); /** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; @@ -158,8 +160,8 @@ struct SMockSupport_c double (*returnDoubleValueOrDefault)(double defaultValue); void* (*pointerReturnValue)(void); void* (*returnPointerValueOrDefault)(void * defaultValue); -/** const void* returnConstPointerValueOrDefault(const void * defaultValue); */ -/** const void* constPointerReturnValue(void); */ + const void* (*constPointerReturnValue)(void); + const void* (*returnConstPointerValueOrDefault)(const void * defaultValue); /** void (*returnFunctionPointerValueOrDefault(void (*defaultValue)()))(); */ /** void (*functionPointerReturnValue())(void); */ diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 0827f081d..bb556a9ca 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -190,6 +190,8 @@ double doubleReturnValue_c(void); double returnDoubleValueOrDefault_c(double defaultValue); void* pointerReturnValue_c(void); void* returnPointerValueOrDefault_c(void * defaultValue); +const void* constPointerReturnValue_c(void); +const void* returnConstPointerValueOrDefault_c(const void * defaultValue); static void installComparator_c (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString) { @@ -274,7 +276,8 @@ static MockActualCall_c gActualCall = { returnDoubleValueOrDefault_c, pointerReturnValue_c, returnPointerValueOrDefault_c, - + constPointerReturnValue_c, + returnConstPointerValueOrDefault_c, }; static MockSupport_c gMockSupport = { @@ -299,6 +302,8 @@ static MockSupport_c gMockSupport = { returnDoubleValueOrDefault_c, pointerReturnValue_c, returnPointerValueOrDefault_c, + constPointerReturnValue_c, + returnConstPointerValueOrDefault_c, setIntData_c, setStringData_c, setDoubleData_c, @@ -709,6 +714,18 @@ void* returnPointerValueOrDefault_c(void * defaultValue) return pointerReturnValue_c(); } +const void* constPointerReturnValue_c(void) +{ + return getMockValueCFromNamedValue(actualCall->returnValue()).value.constPointerValue; +} + +const void* returnConstPointerValueOrDefault_c(const void * defaultValue) +{ + if (!hasReturnValue_c()) { + return defaultValue; + } + return constPointerReturnValue_c(); +} void disable_c(void) { diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 2629256e5..6f0f4b5dd 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -375,6 +375,23 @@ TEST(MockSupport_c, returnConstPointerValue) LONGS_EQUAL(MOCKVALUETYPE_CONST_POINTER, mock_c()->returnValue().type); } +TEST(MockSupport_c, whenReturnValueIsGivenReturnConstPointerValueOrDefaultShouldIgnoreTheDefault) +{ + const void* defaultValue = (void*) 10; + const void* expectedValue = (void*) 27; + mock_c()->expectOneCall("foo")->andReturnConstPointerValue(expectedValue); + POINTERS_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnConstPointerValueOrDefault(defaultValue)); + POINTERS_EQUAL(expectedValue, mock_c()->returnConstPointerValueOrDefault(defaultValue)); +} + +TEST(MockSupport_c, whenNoReturnValueIsGivenReturnConstPointerValueOrDefaultShouldlUseTheDefaultValue) +{ + const void* defaultValue = (void*) 10; + mock_c()->expectOneCall("foo"); + POINTERS_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnConstPointerValueOrDefault(defaultValue)); + POINTERS_EQUAL(defaultValue, mock_c()->returnConstPointerValueOrDefault(defaultValue)); +} + TEST(MockSupport_c, returnFunctionPointerValue) { mock_c()->expectOneCall("boo")->andReturnFunctionPointerValue((void(*)()) 10); diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index b2ec10493..6b85b9dec 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -147,6 +147,8 @@ void all_mock_support_c_calls(void) mock_c()->returnDoubleValueOrDefault(0.01F); mock_c()->pointerReturnValue(); mock_c()->returnPointerValueOrDefault(0); + mock_c()->constPointerReturnValue(); + mock_c()->returnConstPointerValueOrDefault(0); mock_c()->disable(); mock_c()->actualCall("disabled"); From 05b273a7d982332e015948ea2f0aa4e228be9fd0 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 10:36:52 +0000 Subject: [PATCH 0056/1345] MockSupport_c 25: Add setUnsignedIntData(). --- include/CppUTestExt/MockSupport_c.h | 2 +- src/CppUTestExt/MockSupport_c.cpp | 9 ++++++++- tests/CppUTestExt/MockSupport_cTestCFile.c | 10 ++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 9ee6ac612..caee3a01b 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -166,7 +166,7 @@ struct SMockSupport_c /** void (*functionPointerReturnValue())(void); */ void (*setIntData) (const char* name, int value); -/** void (*setUnsignedIntData) (unsigned int value); */ + void (*setUnsignedIntData) (const char* name, unsigned int value); void (*setStringData) (const char* name, const char* value); void (*setDoubleData) (const char* name, double value); void (*setPointerData) (const char* name, void* value); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index bb556a9ca..ec01332c1 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -124,6 +124,7 @@ void disable_c(); void enable_c(); void ignoreOtherCalls_c(); void setIntData_c(const char* name, int value); +void setUnsignedIntData_c(const char* name, unsigned int value); void setDoubleData_c(const char* name, double value); void setStringData_c(const char* name, const char* value); void setPointerData_c(const char* name, void* value); @@ -305,6 +306,7 @@ static MockSupport_c gMockSupport = { constPointerReturnValue_c, returnConstPointerValueOrDefault_c, setIntData_c, + setUnsignedIntData_c, setStringData_c, setDoubleData_c, setPointerData_c, @@ -321,7 +323,7 @@ static MockSupport_c gMockSupport = { crashOnFailure_c, installComparator_c, installCopier_c, - removeAllComparatorsAndCopiers_c, + removeAllComparatorsAndCopiers_c }; MockExpectedCall_c* withIntParameters_c(const char* name, int value) @@ -747,6 +749,11 @@ void setIntData_c(const char* name, int value) currentMockSupport->setData(name, value); } +void setUnsignedIntData_c(const char* name, unsigned int value) +{ + currentMockSupport->setData(name, value); +} + void setDoubleData_c(const char* name, double value) { currentMockSupport->setData(name, value); diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index 6b85b9dec..b3c2e2d69 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -155,6 +155,16 @@ void all_mock_support_c_calls(void) mock_c()->enable(); mock_c()->checkExpectations(); + mock_c()->setIntData("bla1", -2); + mock_c()->setUnsignedIntData("bla2", 2); + mock_c()->setDoubleData("bla3", 0.035); + mock_c()->setStringData("bla4", "abc"); + mock_c()->setPointerData("bla", (void*) 2); + mock_c()->setConstPointerData("bla", (const void*) 2); + mock_c()->setFunctionPointerData("bla", (void (*)()) 2); + mock_c()->setDataObject("bla", "type", (void*) 2); + mock_c()->getData("bla"); + mock_scope_c("scope")->expectOneCall("boo"); mock_scope_c("other")->expectedCallsLeft(); mock_scope_c("scope")->expectedCallsLeft(); From dbe451bba91557197bd456db12239e36d056cf7c Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 10:14:35 +0000 Subject: [PATCH 0057/1345] MockSupport_c 24: Add functionPointerReturnvalue & friends. --- include/CppUTestExt/MockSupport_c.h | 6 ++++-- src/CppUTestExt/MockSupport_c.cpp | 19 +++++++++++++++++++ tests/CppUTestExt/MockSupport_cTest.cpp | 17 +++++++++++++++++ tests/CppUTestExt/MockSupport_cTestCFile.c | 2 ++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index caee3a01b..7c44618e9 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -100,6 +100,8 @@ struct SMockActualCall_c void* (*returnPointerValueOrDefault)(void * defaultValue); const void* (*constPointerReturnValue)(void); const void* (*returnConstPointerValueOrDefault)(const void * defaultValue); + void (*(*functionPointerReturnValue)())(void); + void (*(*returnFunctionPointerValueOrDefault)(void (*defaultValue)()))(); /** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; @@ -162,8 +164,8 @@ struct SMockSupport_c void* (*returnPointerValueOrDefault)(void * defaultValue); const void* (*constPointerReturnValue)(void); const void* (*returnConstPointerValueOrDefault)(const void * defaultValue); -/** void (*returnFunctionPointerValueOrDefault(void (*defaultValue)()))(); */ -/** void (*functionPointerReturnValue())(void); */ + void (*(*functionPointerReturnValue)())(void); + void (*(*returnFunctionPointerValueOrDefault)(void (*defaultValue)()))(); void (*setIntData) (const char* name, int value); void (*setUnsignedIntData) (const char* name, unsigned int value); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index ec01332c1..cd4d75cc6 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -193,6 +193,8 @@ void* pointerReturnValue_c(void); void* returnPointerValueOrDefault_c(void * defaultValue); const void* constPointerReturnValue_c(void); const void* returnConstPointerValueOrDefault_c(const void * defaultValue); +void (*functionPointerReturnValue_c())(void); +void (*returnFunctionPointerValueOrDefault_c(void (*defaultValue)()))(); static void installComparator_c (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString) { @@ -279,6 +281,8 @@ static MockActualCall_c gActualCall = { returnPointerValueOrDefault_c, constPointerReturnValue_c, returnConstPointerValueOrDefault_c, + functionPointerReturnValue_c, + returnFunctionPointerValueOrDefault_c }; static MockSupport_c gMockSupport = { @@ -305,6 +309,8 @@ static MockSupport_c gMockSupport = { returnPointerValueOrDefault_c, constPointerReturnValue_c, returnConstPointerValueOrDefault_c, + functionPointerReturnValue_c, + returnFunctionPointerValueOrDefault_c, setIntData_c, setUnsignedIntData_c, setStringData_c, @@ -729,6 +735,19 @@ const void* returnConstPointerValueOrDefault_c(const void * defaultValue) return constPointerReturnValue_c(); } +void (*functionPointerReturnValue_c())(void) +{ + return getMockValueCFromNamedValue(actualCall->returnValue()).value.functionPointerValue; +} + +void (*returnFunctionPointerValueOrDefault_c(void (*defaultValue)()))() +{ + if (!hasReturnValue_c()) { + return defaultValue; + } + return functionPointerReturnValue_c(); +} + void disable_c(void) { currentMockSupport->disable(); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 6f0f4b5dd..4dcd4be3b 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -399,6 +399,23 @@ TEST(MockSupport_c, returnFunctionPointerValue) LONGS_EQUAL(MOCKVALUETYPE_FUNCTIONPOINTER, mock_c()->returnValue().type); } +TEST(MockSupport_c, whenReturnValueIsGivenReturnFunctionPointerValueOrDefaultShouldIgnoreTheDefault) +{ + void (*defaultValue)() = (void (*)()) 10; + void (*expectedValue)() = (void (*)()) 14; + mock_c()->expectOneCall("foo")->andReturnFunctionPointerValue(expectedValue); + FUNCTIONPOINTERS_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnFunctionPointerValueOrDefault(defaultValue)); + FUNCTIONPOINTERS_EQUAL(expectedValue, mock_c()->returnFunctionPointerValueOrDefault(defaultValue)); +} + +TEST(MockSupport_c, whenNoReturnValueIsGivenReturnFunctionPointerValueOrDefaultShouldlUseTheDefaultValue) +{ + void (*defaultValue)() = (void (*)()) 10; + mock_c()->expectOneCall("foo"); + FUNCTIONPOINTERS_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnFunctionPointerValueOrDefault(defaultValue)); + FUNCTIONPOINTERS_EQUAL(defaultValue, mock_c()->returnFunctionPointerValueOrDefault(defaultValue)); +} + TEST(MockSupport_c, MockSupportWithScope) { mock_scope_c("scope")->expectOneCall("boo"); diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index b3c2e2d69..8dc8d3995 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -149,6 +149,8 @@ void all_mock_support_c_calls(void) mock_c()->returnPointerValueOrDefault(0); mock_c()->constPointerReturnValue(); mock_c()->returnConstPointerValueOrDefault(0); + mock_c()->functionPointerReturnValue(); + mock_c()->returnFunctionPointerValueOrDefault(0); mock_c()->disable(); mock_c()->actualCall("disabled"); From fc0bcb0a75707ba56a2fe8df87bf0c0dee979377 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 11:43:20 +0000 Subject: [PATCH 0058/1345] MockSupport_c 26: :P --- include/CppUTestExt/MockSupport_c.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 7c44618e9..7fb6f367d 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -100,8 +100,8 @@ struct SMockActualCall_c void* (*returnPointerValueOrDefault)(void * defaultValue); const void* (*constPointerReturnValue)(void); const void* (*returnConstPointerValueOrDefault)(const void * defaultValue); - void (*(*functionPointerReturnValue)())(void); - void (*(*returnFunctionPointerValueOrDefault)(void (*defaultValue)()))(); + void (*(*functionPointerReturnValue) (void))(); + void (*(*returnFunctionPointerValueOrDefault) (void(*defaultValue)()))(); /** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; @@ -164,8 +164,8 @@ struct SMockSupport_c void* (*returnPointerValueOrDefault)(void * defaultValue); const void* (*constPointerReturnValue)(void); const void* (*returnConstPointerValueOrDefault)(const void * defaultValue); - void (*(*functionPointerReturnValue)())(void); - void (*(*returnFunctionPointerValueOrDefault)(void (*defaultValue)()))(); + void (*(*functionPointerReturnValue) (void))(); + void (*(*returnFunctionPointerValueOrDefault) (void(*defaultValue)()))(); void (*setIntData) (const char* name, int value); void (*setUnsignedIntData) (const char* name, unsigned int value); From aa6ffe2a985dff23e2a0dba3574a53e8ea9e4ea1 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 13:16:17 +0000 Subject: [PATCH 0059/1345] MockSupport_c 27: This should finally fix it. --- include/CppUTestExt/MockSupport_c.h | 8 ++++---- src/CppUTestExt/MockSupport_c.cpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index 7fb6f367d..b4aaacd63 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -100,8 +100,8 @@ struct SMockActualCall_c void* (*returnPointerValueOrDefault)(void * defaultValue); const void* (*constPointerReturnValue)(void); const void* (*returnConstPointerValueOrDefault)(const void * defaultValue); - void (*(*functionPointerReturnValue) (void))(); - void (*(*returnFunctionPointerValueOrDefault) (void(*defaultValue)()))(); + void (*(*functionPointerReturnValue)(void))(void); + void (*(*returnFunctionPointerValueOrDefault)(void(*defaultValue)(void)))(void); /** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; @@ -164,8 +164,8 @@ struct SMockSupport_c void* (*returnPointerValueOrDefault)(void * defaultValue); const void* (*constPointerReturnValue)(void); const void* (*returnConstPointerValueOrDefault)(const void * defaultValue); - void (*(*functionPointerReturnValue) (void))(); - void (*(*returnFunctionPointerValueOrDefault) (void(*defaultValue)()))(); + void (*(*functionPointerReturnValue)(void))(void); + void (*(*returnFunctionPointerValueOrDefault) (void(*defaultValue)(void)))(void); void (*setIntData) (const char* name, int value); void (*setUnsignedIntData) (const char* name, unsigned int value); diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index cd4d75cc6..4755cf0d1 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -193,8 +193,8 @@ void* pointerReturnValue_c(void); void* returnPointerValueOrDefault_c(void * defaultValue); const void* constPointerReturnValue_c(void); const void* returnConstPointerValueOrDefault_c(const void * defaultValue); -void (*functionPointerReturnValue_c())(void); -void (*returnFunctionPointerValueOrDefault_c(void (*defaultValue)()))(); +void (*functionPointerReturnValue_c())(); +void (*returnFunctionPointerValueOrDefault_c(void(*defaultValue)()))(); static void installComparator_c (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString) { From 5b350b2eb760598bdf154eaef77523da31f27af5 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 28 Jan 2016 16:24:17 +0000 Subject: [PATCH 0060/1345] Add test to cover the last line in MockActualCall.cpp --- tests/CppUTestExt/MockActualCallTest.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 60839a5dc..82e0a8a1f 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -71,6 +71,15 @@ TEST(MockCheckedActualCall, unExpectedCallWithAParameter) CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } +TEST(MockCheckedActualCall, unExpectedCallWithAnOutputParameter) +{ + MockCheckedActualCall actualCall(1, reporter, *emptyList); + actualCall.withName("unexpected").withOutputParameter("bar", (void*)0); + + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "unexpected", *list); + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); +} + TEST(MockCheckedActualCall, actualCallWithNoReturnValueAndMeaninglessCallOrderForCoverage) { MockCheckedActualCall actualCall(1, reporter, *emptyList); From 42fb0fa5b7f78a2fce8b730d4e9ce8ab48ff77f8 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 29 Jan 2016 06:13:25 +0000 Subject: [PATCH 0061/1345] MockSupport_c 28: Clean-up. --- include/CppUTestExt/MockSupport_c.h | 11 ----------- src/CppUTestExt/MockSupport_c.cpp | 26 ++++++++++++------------- tests/CppUTestExt/MockSupport_cTest.cpp | 21 ++++++++++---------- 3 files changed, 24 insertions(+), 34 deletions(-) diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index b4aaacd63..ac9ad355d 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -102,7 +102,6 @@ struct SMockActualCall_c const void* (*returnConstPointerValueOrDefault)(const void * defaultValue); void (*(*functionPointerReturnValue)(void))(void); void (*(*returnFunctionPointerValueOrDefault)(void(*defaultValue)(void)))(void); -/** MockActualCall_c* (*onObject)(const void* objectPtr); */ /* Probably makes no sense in C */ }; typedef struct SMockExpectedCall_c MockExpectedCall_c; @@ -177,13 +176,8 @@ struct SMockSupport_c void (*setDataObject) (const char* name, const char* type, void* value); MockValue_c (*getData)(const char* name); -/** MockSupport_c* getMockSupportScope(const char* name); */ - -/** const char (*getTraceOutput+)(void); */ - void (*disable)(void); void (*enable)(void); -/** void (*tracing)(bool enabled); */ void (*ignoreOtherCalls)(void); void (*checkExpectations)(void); @@ -192,13 +186,8 @@ struct SMockSupport_c void (*clear)(void); void (*crashOnFailure)(unsigned shouldCrash); -/** void setMockFailureStandardReporter(MockFailureReporter* reporter); */ -/** void (*setActiveReporter)(MockFailureReporter* activeReporter); */ -/** void (*setDefaultComparatorsAndCopiersRepository)(void); */ - void (*installComparator) (const char* typeName, MockTypeEqualFunction_c isEqual, MockTypeValueToStringFunction_c valueToString); void (*installCopier) (const char* typeName, MockTypeCopyFunction_c copier); -/** void (*installComparatorsAndCopiers_c)(void); */ void (*removeAllComparatorsAndCopiers)(void); }; diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 4755cf0d1..3db2fb08e 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -152,7 +152,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* ignoreOtherParameters_c(void); +MockExpectedCall_c* ignoreOtherParameters_c(); MockExpectedCall_c* andReturnIntValue_c(int value); MockExpectedCall_c* andReturnUnsignedIntValue_c(unsigned int value); MockExpectedCall_c* andReturnLongIntValue_c(long int value); @@ -185,13 +185,13 @@ 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); -const char* stringReturnValue_c(void); +const char* stringReturnValue_c(); const char* returnStringValueOrDefault_c(const char * defaultValue); -double doubleReturnValue_c(void); +double doubleReturnValue_c(); double returnDoubleValueOrDefault_c(double defaultValue); -void* pointerReturnValue_c(void); +void* pointerReturnValue_c(); void* returnPointerValueOrDefault_c(void * defaultValue); -const void* constPointerReturnValue_c(void); +const void* constPointerReturnValue_c(); const void* returnConstPointerValueOrDefault_c(const void * defaultValue); void (*functionPointerReturnValue_c())(); void (*returnFunctionPointerValueOrDefault_c(void(*defaultValue)()))(); @@ -520,7 +520,7 @@ static MockValue_c getMockValueCFromNamedValue(const MockNamedValue& namedValue) return returnValue; } -void strictOrder_c(void) +void strictOrder_c() { currentMockSupport->strictOrder(); } @@ -683,7 +683,7 @@ unsigned long int returnUnsignedLongIntValueOrDefault_c(unsigned long int defaul return unsignedLongIntReturnValue_c(); } -const char* stringReturnValue_c(void) +const char* stringReturnValue_c() { return getMockValueCFromNamedValue(actualCall->returnValue()).value.stringValue; } @@ -709,7 +709,7 @@ double returnDoubleValueOrDefault_c(double defaultValue) return doubleReturnValue_c(); } -void* pointerReturnValue_c(void) +void* pointerReturnValue_c() { return getMockValueCFromNamedValue(actualCall->returnValue()).value.pointerValue; } @@ -722,7 +722,7 @@ void* returnPointerValueOrDefault_c(void * defaultValue) return pointerReturnValue_c(); } -const void* constPointerReturnValue_c(void) +const void* constPointerReturnValue_c() { return getMockValueCFromNamedValue(actualCall->returnValue()).value.constPointerValue; } @@ -735,7 +735,7 @@ const void* returnConstPointerValueOrDefault_c(const void * defaultValue) return constPointerReturnValue_c(); } -void (*functionPointerReturnValue_c())(void) +void (*functionPointerReturnValue_c())() { return getMockValueCFromNamedValue(actualCall->returnValue()).value.functionPointerValue; } @@ -748,17 +748,17 @@ void (*returnFunctionPointerValueOrDefault_c(void (*defaultValue)()))() return functionPointerReturnValue_c(); } -void disable_c(void) +void disable_c() { currentMockSupport->disable(); } -void enable_c(void) +void enable_c() { currentMockSupport->enable(); } -void ignoreOtherCalls_c(void) +void ignoreOtherCalls_c() { currentMockSupport->ignoreOtherCalls(); } diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 4dcd4be3b..564c02c66 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -371,7 +371,8 @@ TEST(MockSupport_c, whenNoReturnValueIsGivenReturnPointerValueOrDefaultShouldlUs TEST(MockSupport_c, returnConstPointerValue) { mock_c()->expectOneCall("boo")->andReturnConstPointerValue((const void*) 10); - POINTERS_EQUAL((const void*) 10, mock_c()->actualCall("boo")->returnValue().value.constPointerValue); + POINTERS_EQUAL((const void*) 10, mock_c()->actualCall("boo")->constPointerReturnValue()); + POINTERS_EQUAL((const void*) 10, mock_c()->constPointerReturnValue()); LONGS_EQUAL(MOCKVALUETYPE_CONST_POINTER, mock_c()->returnValue().type); } @@ -395,7 +396,8 @@ TEST(MockSupport_c, whenNoReturnValueIsGivenReturnConstPointerValueOrDefaultShou TEST(MockSupport_c, returnFunctionPointerValue) { mock_c()->expectOneCall("boo")->andReturnFunctionPointerValue((void(*)()) 10); - FUNCTIONPOINTERS_EQUAL((void(*)()) 10, mock_c()->actualCall("boo")->returnValue().value.functionPointerValue); + FUNCTIONPOINTERS_EQUAL((void(*)()) 10, mock_c()->actualCall("boo")->functionPointerReturnValue()); + FUNCTIONPOINTERS_EQUAL((void(*)()) 10, mock_c()->functionPointerReturnValue()); LONGS_EQUAL(MOCKVALUETYPE_FUNCTIONPOINTER, mock_c()->returnValue().type); } @@ -454,6 +456,13 @@ TEST(MockSupport_c, MockSupportSetConstPointerData) POINTERS_EQUAL((const void*) 1, mock_c()->getData("constPointer").value.constPointerValue); } +TEST(MockSupport_c, MockSupportMemoryBufferData) +{ + mock_c()->setDataObject("name", "const unsigned char*", (void *) 0xDEAD); + POINTERS_EQUAL(0xDEAD, mock_c()->getData("name").value.memoryBufferValue); + LONGS_EQUAL(MOCKVALUETYPE_MEMORYBUFFER, mock_c()->getData("name").type); +} + TEST(MockSupport_c, MockSupportSetFunctionPointerData) { mock_c()->setFunctionPointerData("functionPointer", (void(*)()) 1); @@ -466,13 +475,6 @@ TEST(MockSupport_c, MockSupportSetDataObject) POINTERS_EQUAL((void*) 1, mock_c()->getData("name").value.objectValue); } -TEST(MockSupport_c, TestMockGetMemoryBufferDataObjectCHereBecauseItIsNotCurrentlyUsedByCppUTest) -{ - mock_c()->setDataObject("name", "const unsigned char*", (void *) 0xDEAD); - POINTERS_EQUAL(0xDEAD, mock_c()->getData("name").value.memoryBufferValue); - LONGS_EQUAL(MOCKVALUETYPE_MEMORYBUFFER, mock_c()->getData("name").type); -} - TEST(MockSupport_c, WorksInCFile) { all_mock_support_c_calls(); @@ -604,4 +606,3 @@ TEST(MockSupport_c, ignoreOtherCalls) mock_c()->actualCall("bar"); mock_c()->checkExpectations(); } - From 6b77ad486788b2a7846a0b63bf2e80557b5dd311 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 29 Jan 2016 08:20:47 +0000 Subject: [PATCH 0062/1345] Prune install: in .travis.yml; install Dosbox only for make_dos. --- .travis.yml | 12 ++---------- scripts/travis_ci_build.sh | 10 ++++++---- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index 50bb7f4d6..5dc79bb97 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,11 +18,11 @@ matrix: - compiler: gcc env: BUILD=cmake_gtest - compiler: gcc - env: BUILD=cmake-coverage + env: BUILD=cmake_coverage - compiler: gcc env: BUILD=test_report - compiler: wcl - env: BUILD=make-dos + env: BUILD=make_dos global: - os: linux - rvm: '1.9.3' @@ -34,15 +34,7 @@ global: addons: apt: packages: - # - dosbox - valgrind -before_install: - # - sudo pip install cpp-coveralls - - sudo apt-get install dosbox -install: - - gem install travis_github_deployer - - sudo apt-get update --fix-missing - # - sudo apt-get install valgrind before_script: - export CPPUTEST_BUILD_DIR=$TRAVIS_BUILD_DIR/cpputest_build - mkdir -p $CPPUTEST_BUILD_DIR && cd $CPPUTEST_BUILD_DIR diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index b0304cd1b..964e9d369 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -13,7 +13,8 @@ if [ "x$BUILD" = "xautotools" ]; then if [ "x$CXX" = "xg++" ]; then echo "Deploy please" -# cd .. && travis_github_deployer -v || exit 1 +# gem install travis_github_deployer +# cd .. && travis_github_deployer -v || exit 1 fi; fi @@ -60,8 +61,8 @@ if [ "x$BUILD" = "xtest_report" ]; then ant -f generate_junit_report_ant.xml fi -if [ "x$BUILD" = "xcmake-coverage" ]; then - pip install cpp-coveralls --user `whoami` +if [ "x$BUILD" = "xcmake_coverage" ]; then + pip install cpp-coveralls --user `whoami` cmake .. -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE -DCOVERAGE=ON make @@ -70,7 +71,8 @@ if [ "x$BUILD" = "xcmake-coverage" ]; then coveralls -b . -r .. -i "src" -i "include" --gcov-options="-lbc" || true fi -if [ "x$BUILD" = "xmake-dos" ]; then +if [ "x$BUILD" = "xmake_dos" ]; then + sudo apt-get install dosbox wget ftp://ftp.openwatcom.org/pub/open-watcom-c-linux-1.9 -O /tmp/watcom.zip mkdir -p watcom && unzip -aqd watcom /tmp/watcom.zip && sudo chmod -R 755 watcom/binl export PATH=$PATH:$PWD/watcom/binl From 19a2d4d3b24bd94c16e84c719d956b68d89de085 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 1 Feb 2016 07:53:33 +0000 Subject: [PATCH 0063/1345] Put back dosbox package as comment --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 5dc79bb97..17d0738e9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,7 @@ global: addons: apt: packages: +# - dosbox - valgrind before_script: - export CPPUTEST_BUILD_DIR=$TRAVIS_BUILD_DIR/cpputest_build From 9aba1f858de91762d41718aaf7db8df0be2f16f1 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 1 Feb 2016 09:25:39 +0000 Subject: [PATCH 0064/1345] Fix wrong test code in MockSupport_cTest.cpp --- tests/CppUTestExt/MockSupport_cTest.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 564c02c66..daced03d1 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -561,22 +561,22 @@ TEST(MockSupport_c, failureWithParameterOfTypeCoversValueToString) mock_c()->removeAllComparatorsAndCopiers(); } -static void callToMockCWithOutputParameter_() +static void callToMockCWithOutputParameterOfType_() { int value1 = 7; const int value2 = 9; - mock_c()->expectOneCall("bar")->withOutputParameterReturning("bla", &value2, sizeof(int)); - mock_c()->actualCall("bar")->withOutputParameter("bla", &value1); + mock_c()->expectOneCall("bar")->withOutputParameterOfTypeReturning("intType", "bla", &value2); + mock_c()->actualCall("bar")->withOutputParameterOfType("intType", "bla", &value1); LONGS_EQUAL(value1, value2); } -TEST(MockSupport_c, successWithOutputParameter) +TEST(MockSupport_c, successWithOutputParameterOfType) { TestTestingFixture fixture; mock_c()->installCopier("intType", typeCopy); - fixture.setTestFunction(callToMockCWithOutputParameter_); + fixture.setTestFunction(callToMockCWithOutputParameterOfType_); fixture.runAllTests(); - LONGS_EQUAL(3, fixture.getCheckCount()); + LONGS_EQUAL(2, fixture.getCheckCount()); LONGS_EQUAL(0, fixture.getFailureCount()); mock_c()->removeAllComparatorsAndCopiers(); } From 136e89dc0afae348df90c905615034579a388734 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 3 Feb 2016 23:59:23 +0100 Subject: [PATCH 0065/1345] Dosbox has been white-listed --- .travis.yml | 5 ++++- scripts/travis_ci_build.sh | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 17d0738e9..6665fa8a3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,6 +23,10 @@ matrix: env: BUILD=test_report - compiler: wcl env: BUILD=make_dos + addons: + apt: + packages: + - dosbox global: - os: linux - rvm: '1.9.3' @@ -34,7 +38,6 @@ global: addons: apt: packages: -# - dosbox - valgrind before_script: - export CPPUTEST_BUILD_DIR=$TRAVIS_BUILD_DIR/cpputest_build diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index 964e9d369..f0c71b97e 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -72,7 +72,6 @@ if [ "x$BUILD" = "xcmake_coverage" ]; then fi if [ "x$BUILD" = "xmake_dos" ]; then - sudo apt-get install dosbox wget ftp://ftp.openwatcom.org/pub/open-watcom-c-linux-1.9 -O /tmp/watcom.zip mkdir -p watcom && unzip -aqd watcom /tmp/watcom.zip && sudo chmod -R 755 watcom/binl export PATH=$PATH:$PWD/watcom/binl From dc0b4bca9434046f5ce10e954c6c1fd4ca488c7b Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 4 Feb 2016 07:53:13 +0000 Subject: [PATCH 0066/1345] Move apt-get valgrind to specific jobs --- .travis.yml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6665fa8a3..4110f6a06 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,10 @@ matrix: include: - compiler: clang env: BUILD=autotools + addons: + apt: + packages: + - valgrind - compiler: clang env: BUILD=cmake - compiler: clang @@ -11,6 +15,10 @@ matrix: env: BUILD=cmake_gtest - compiler: gcc env: BUILD=autotools + addons: + apt: + packages: + - valgrind - compiler: gcc env: BUILD=cmake - compiler: gcc @@ -35,10 +43,12 @@ global: vA1NkcW49tQW1wQvBlRtdlLNOmUfDP/oiJFXPwNn4dqwOIOEet2P7JO/5hnH MNHlZmGu2WpoZREhOFBfsIhK0IP8mloqLDq2XemBdga/LWygrLU= - secure: Y/8iNkf6uEbE3qltnM+7mGlCvFWzyttwwRGgVGw1m9xOiUJcobvOImQRU8XZ91dgO+Fz0A3mljqs1sK1OPjpXmFGE1jP/NlotMw0WlDOuSIDjQ4ubwdTNGAwNY53R9ygbIjEmqxHAJm9mOZqxW2hNaoI7TcX6oX248/hLibyx8M= + env: BUILD=make_dos addons: - apt: - packages: - - valgrind +# env: BUILD=autotools +# apt: +# packages: +# - valgrind before_script: - export CPPUTEST_BUILD_DIR=$TRAVIS_BUILD_DIR/cpputest_build - mkdir -p $CPPUTEST_BUILD_DIR && cd $CPPUTEST_BUILD_DIR From 182ef419ad3c959120d0fd77345ea3bc880199fd Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 4 Feb 2016 08:28:52 +0000 Subject: [PATCH 0067/1345] Remove commented out section --- .travis.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4110f6a06..a00059ae3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,11 +44,6 @@ global: MNHlZmGu2WpoZREhOFBfsIhK0IP8mloqLDq2XemBdga/LWygrLU= - secure: Y/8iNkf6uEbE3qltnM+7mGlCvFWzyttwwRGgVGw1m9xOiUJcobvOImQRU8XZ91dgO+Fz0A3mljqs1sK1OPjpXmFGE1jP/NlotMw0WlDOuSIDjQ4ubwdTNGAwNY53R9ygbIjEmqxHAJm9mOZqxW2hNaoI7TcX6oX248/hLibyx8M= env: BUILD=make_dos -addons: -# env: BUILD=autotools -# apt: -# packages: -# - valgrind before_script: - export CPPUTEST_BUILD_DIR=$TRAVIS_BUILD_DIR/cpputest_build - mkdir -p $CPPUTEST_BUILD_DIR && cd $CPPUTEST_BUILD_DIR From ad8f4f06d6cfd52df85311f75dc1fe358a98e8e5 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 4 Feb 2016 10:34:28 +0000 Subject: [PATCH 0068/1345] Yipee! Running container-based :) --- .travis.yml | 1 + scripts/travis_ci_build.sh | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a00059ae3..296311f59 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: cpp +sudo: false matrix: include: - compiler: clang diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index f0c71b97e..e997ecf1d 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -73,11 +73,10 @@ fi if [ "x$BUILD" = "xmake_dos" ]; then wget ftp://ftp.openwatcom.org/pub/open-watcom-c-linux-1.9 -O /tmp/watcom.zip - mkdir -p watcom && unzip -aqd watcom /tmp/watcom.zip && sudo chmod -R 755 watcom/binl + 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 - wcl --version export CC=wcl export CXX=wcl $CC --version From 60120b9a09a535d433a8e1afd342511275c869c9 Mon Sep 17 00:00:00 2001 From: offa Date: Thu, 4 Feb 2016 12:59:23 +0100 Subject: [PATCH 0069/1345] Message variable name changed to avoid possible naming conflicts. --- include/CppUTest/UtestMacros.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 68a3ac934..c2372d39c 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -277,17 +277,17 @@ #if CPPUTEST_USE_STD_CPP_LIB #define CHECK_THROWS(expected, expression) \ { \ - SimpleString msg("expected to throw "#expected "\nbut threw nothing"); \ + SimpleString failure_msg("expected to throw "#expected "\nbut threw nothing"); \ bool caught_expected = false; \ try { \ (expression); \ } catch(const expected &) { \ caught_expected = true; \ } catch(...) { \ - msg = "expected to throw " #expected "\nbut threw a different type"; \ + failure_msg = "expected to throw " #expected "\nbut threw a different type"; \ } \ if (!caught_expected) { \ - UtestShell::getCurrent()->fail(msg.asCharString(), __FILE__, __LINE__); \ + UtestShell::getCurrent()->fail(failure_msg.asCharString(), __FILE__, __LINE__); \ } \ else { \ UtestShell::getCurrent()->countCheck(); \ From 43039a12a7814a24f0b9fad315a5608556d75b2a Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 4 Feb 2016 15:31:34 +0000 Subject: [PATCH 0070/1345] Clean-up --- .travis.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 296311f59..c483ff027 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,13 +40,15 @@ global: - os: linux - rvm: '1.9.3' - secure: |- - P05xUfJVw5YM4hF7hzQLjyMzDD4Q1/fyWP9Uk5aK5VrSWNY99EuxldXI5QK/ - vA1NkcW49tQW1wQvBlRtdlLNOmUfDP/oiJFXPwNn4dqwOIOEet2P7JO/5hnH - MNHlZmGu2WpoZREhOFBfsIhK0IP8mloqLDq2XemBdga/LWygrLU= -- secure: Y/8iNkf6uEbE3qltnM+7mGlCvFWzyttwwRGgVGw1m9xOiUJcobvOImQRU8XZ91dgO+Fz0A3mljqs1sK1OPjpXmFGE1jP/NlotMw0WlDOuSIDjQ4ubwdTNGAwNY53R9ygbIjEmqxHAJm9mOZqxW2hNaoI7TcX6oX248/hLibyx8M= - env: BUILD=make_dos + 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 +- export CPPUTEST_BUILD_DIR=$TRAVIS_BUILD_DIR/cpputest_build +- mkdir -p $CPPUTEST_BUILD_DIR && cd $CPPUTEST_BUILD_DIR script: - "../scripts/travis_ci_build.sh" From 015bd17ba97a6baefe791301ebf9d2e0ecccaea9 Mon Sep 17 00:00:00 2001 From: Liu Nick Date: Fri, 5 Feb 2016 14:04:05 +0800 Subject: [PATCH 0071/1345] add 3 missing header file in CppUTestExt --- CppUTest.vcxproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index 18f7cb287..fe44bc6af 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -150,12 +150,15 @@ + + + From 22848fd463fdf4cfc9003a675756fce4f4a5dc54 Mon Sep 17 00:00:00 2001 From: Liu Nick Date: Fri, 5 Feb 2016 14:04:05 +0800 Subject: [PATCH 0072/1345] add 3 missing header file in CppUTestExt --- CppUTest.vcxproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index 18f7cb287..fe44bc6af 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -150,12 +150,15 @@ + + + From 952d948b58a4d180933c0e2da27cbe3b5bdf3e74 Mon Sep 17 00:00:00 2001 From: Harry Bock Date: Fri, 5 Feb 2016 12:47:43 -0500 Subject: [PATCH 0073/1345] Correct use of ordinal numbers in MockUnexpectedCallHappenedFailure Previously, all such failures displayed a failure message containing "Unexpected additional (Nth) call", even for values such as 2, 3, etc. Correctly differentiate based on English ordinal numbering rules. --- include/CppUTest/SimpleString.h | 1 + src/CppUTest/SimpleString.cpp | 20 +++++++++++++++ src/CppUTestExt/MockFailure.cpp | 9 ++++--- tests/CppUTestExt/MockFailureTest.cpp | 35 +++++++++++++++++++++------ tests/SimpleStringTest.cpp | 31 ++++++++++++++++++++++++ 5 files changed, 85 insertions(+), 11 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 2d67c8b37..b4f06aca9 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -154,6 +154,7 @@ SimpleString StringFromBinaryOrNull(const unsigned char* value, size_t size); 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); #if CPPUTEST_USE_STD_CPP_LIB diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 2bbee9699..05b9e61f8 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -653,6 +653,26 @@ SimpleString StringFromMaskedBits(unsigned long value, unsigned long mask, size_ return result; } +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"; + } + + return StringFromFormat("%u%s", number, suffix); +} + SimpleStringCollection::SimpleStringCollection() { collection_ = 0; diff --git a/src/CppUTestExt/MockFailure.cpp b/src/CppUTestExt/MockFailure.cpp index 6d27a41a0..bb93ea503 100644 --- a/src/CppUTestExt/MockFailure.cpp +++ b/src/CppUTestExt/MockFailure.cpp @@ -103,11 +103,12 @@ MockExpectedCallsDidntHappenFailure::MockExpectedCallsDidntHappenFailure(UtestSh MockUnexpectedCallHappenedFailure::MockUnexpectedCallHappenedFailure(UtestShell* test, const SimpleString& name, const MockExpectedCallsList& expectations) : MockFailure(test) { - int amountOfExpectations = expectations.amountOfExpectationsFor(name); - if (amountOfExpectations) - message_ = StringFromFormat("Mock Failure: Unexpected additional (%dth) call to function: ", amountOfExpectations+1); - else + if (expectations.amountOfExpectationsFor(name)) { + SimpleString ordinalNumber = StringFromOrdinalNumber((unsigned)(expectations.amountOfExpectationsFor(name) + 1)); + message_ = StringFromFormat("Mock Failure: Unexpected additional (%s) call to function: ", ordinalNumber.asCharString()); + } else { message_ = "Mock Failure: Unexpected call to function: "; + } message_ += name; message_ += "\n"; addExpectationsAndCallHistory(expectations); diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index 6e6e56b96..22cd3f8d3 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -61,6 +61,23 @@ TEST_GROUP(MockFailureTest) list->addExpectedCall(call2); list->addExpectedCall(call3); } + + void checkUnexpectedNthCallMessage(unsigned int count, const char* expectedOrdinal) + { + MockExpectedCallsList callList; + MockCheckedExpectedCall expCall; + + expCall.withName("bar"); + for (unsigned int i = 0; i < (count - 1); i++) { + expCall.callWasMade(1); + callList.addExpectedCall(&expCall); + } + + MockUnexpectedCallHappenedFailure failure(UtestShell::getCurrent(), "bar", callList); + + SimpleString expectedMessage = StringFromFormat("Mock Failure: Unexpected additional (%s) call to function: bar\n\tEXPECTED", expectedOrdinal); + STRCMP_CONTAINS(expectedMessage.asCharString(), failure.getMessage().asCharString()); + } }; TEST(MockFailureTest, noErrorFailureSomethingGoneWrong) @@ -96,14 +113,18 @@ TEST(MockFailureTest, expectedCallDidNotHappen) "\t\thaphaphap -> no parameters", failure.getMessage().asCharString()); } -TEST(MockFailureTest, MockUnexpectedAdditionalCallFailure) +TEST(MockFailureTest, MockUnexpectedNthAdditionalCallFailure) { - call1->withName("bar"); - call1->callWasMade(1); - list->addExpectedCall(call1); - - MockUnexpectedCallHappenedFailure failure(UtestShell::getCurrent(), "bar", *list); - STRCMP_CONTAINS("Mock Failure: Unexpected additional (2th) call to function: bar\n\tEXPECTED", failure.getMessage().asCharString()); + checkUnexpectedNthCallMessage(2, "2nd"); + checkUnexpectedNthCallMessage(3, "3rd"); + checkUnexpectedNthCallMessage(4, "4th"); + checkUnexpectedNthCallMessage(11, "11th"); + checkUnexpectedNthCallMessage(12, "12th"); + checkUnexpectedNthCallMessage(13, "13th"); + checkUnexpectedNthCallMessage(14, "14th"); + checkUnexpectedNthCallMessage(21, "21st"); + checkUnexpectedNthCallMessage(22, "22nd"); + checkUnexpectedNthCallMessage(23, "23rd"); } TEST(MockFailureTest, MockUnexpectedInputParameterFailure) diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 86eaffee9..02d796c3c 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -957,3 +957,34 @@ TEST(SimpleString, MaskedBits4bytes) STRCMP_EQUAL("11xx11xx 11xx11xx 11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFFFFFF, 0xCCCCCCCC, 4).asCharString()); } } + +TEST(SimpleString, StringFromOrdinalNumberOnes) +{ + STRCMP_EQUAL("2nd", StringFromOrdinalNumber(2).asCharString()); + STRCMP_EQUAL("3rd", StringFromOrdinalNumber(3).asCharString()); + STRCMP_EQUAL("4th", StringFromOrdinalNumber(4).asCharString()); + STRCMP_EQUAL("5th", StringFromOrdinalNumber(5).asCharString()); + STRCMP_EQUAL("6th", StringFromOrdinalNumber(6).asCharString()); + STRCMP_EQUAL("7th", StringFromOrdinalNumber(7).asCharString()); +} + +TEST(SimpleString, StringFromOrdinalNumberTens) +{ + STRCMP_EQUAL("10th", StringFromOrdinalNumber(10).asCharString()); + STRCMP_EQUAL("11th", StringFromOrdinalNumber(11).asCharString()); + STRCMP_EQUAL("12th", StringFromOrdinalNumber(12).asCharString()); + STRCMP_EQUAL("13th", StringFromOrdinalNumber(13).asCharString()); + STRCMP_EQUAL("14th", StringFromOrdinalNumber(14).asCharString()); + STRCMP_EQUAL("18th", StringFromOrdinalNumber(18).asCharString()); +} + +TEST(SimpleString, StringFromOrdinalNumberOthers) +{ + STRCMP_EQUAL("21st", StringFromOrdinalNumber(21).asCharString()); + STRCMP_EQUAL("22nd", StringFromOrdinalNumber(22).asCharString()); + STRCMP_EQUAL("23rd", StringFromOrdinalNumber(23).asCharString()); + STRCMP_EQUAL("24th", StringFromOrdinalNumber(24).asCharString()); + STRCMP_EQUAL("32nd", StringFromOrdinalNumber(32).asCharString()); + STRCMP_EQUAL("100th", StringFromOrdinalNumber(100).asCharString()); + STRCMP_EQUAL("101st", StringFromOrdinalNumber(101).asCharString()); +} From 5de73eef3447757fc68fdd2b9ff8c682e59a4024 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 8 Feb 2016 14:04:46 +0000 Subject: [PATCH 0074/1345] Add IEEE754ExceptionFlagsPlugin --- Makefile.am | 4 + examples/AllTests/FEDemoTest.cpp | 50 +++++++ include/CppUTest/CppUTestConfig.h | 1 + include/CppUTestExt/IEEE754ExceptionsPlugin.h | 53 +++++++ platforms/Dos/sources.mk | 3 + src/CppUTestExt/CMakeLists.txt | 2 + src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 78 ++++++++++ tests/CppUTestExt/CMakeLists.txt | 2 + tests/CppUTestExt/IEEE754PluginTest.cpp | 136 ++++++++++++++++++ tests/CppUTestExt/IEEE754PluginTest_c.c | 67 +++++++++ tests/CppUTestExt/IEEE754PluginTest_c.h | 34 +++++ 11 files changed, 430 insertions(+) create mode 100644 examples/AllTests/FEDemoTest.cpp create mode 100644 include/CppUTestExt/IEEE754ExceptionsPlugin.h create mode 100644 src/CppUTestExt/IEEE754ExceptionsPlugin.cpp create mode 100644 tests/CppUTestExt/IEEE754PluginTest.cpp create mode 100644 tests/CppUTestExt/IEEE754PluginTest_c.c create mode 100644 tests/CppUTestExt/IEEE754PluginTest_c.h diff --git a/Makefile.am b/Makefile.am index debba7dd5..bee2b5d26 100644 --- a/Makefile.am +++ b/Makefile.am @@ -88,6 +88,7 @@ lib_libCppUTestExt_a_CXXFLAGS = $(lib_libCppUTest_a_CXXFLAGS) lib_libCppUTestExt_a_SOURCES = \ src/CppUTestExt/CodeMemoryReportFormatter.cpp \ + src/CppUTestExt/IEEE754ExceptionsPlugin.cpp \ src/CppUTestExt/MemoryReportAllocator.cpp \ src/CppUTestExt/MemoryReporterPlugin.cpp \ src/CppUTestExt/MemoryReportFormatter.cpp \ @@ -108,6 +109,7 @@ include_cpputestext_HEADERS = \ include/CppUTestExt/GMock.h \ include/CppUTestExt/GTest.h \ include/CppUTestExt/GTestConvertor.h \ + include/CppUTestExt/IEEE754ExceptionsPlugin.h \ include/CppUTestExt/MemoryReportAllocator.h \ include/CppUTestExt/MemoryReporterPlugin.h \ include/CppUTestExt/MemoryReportFormatter.h \ @@ -176,6 +178,8 @@ CppUTestExtTests_SOURCES = \ tests/CppUTestExt/GMockTest.cpp \ tests/CppUTestExt/GTest1Test.cpp \ tests/CppUTestExt/GTest2ConvertorTest.cpp \ + tests/CppUTestExt/IEEE754PluginTest.cpp \ + tests/CppUTestExt/IEEE754PluginTest_c.c \ tests/CppUTestExt/MemoryReportAllocatorTest.cpp \ tests/CppUTestExt/MemoryReporterPluginTest.cpp \ tests/CppUTestExt/MemoryReportFormatterTest.cpp \ diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp new file mode 100644 index 000000000..8ed04e9b5 --- /dev/null +++ b/examples/AllTests/FEDemoTest.cpp @@ -0,0 +1,50 @@ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestHarness.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/IEEE754ExceptionsPlugin.h" + +#ifdef COMPILER_FULLY_SUPPORTS_CXX11 + +#include +#include + +static volatile float f; + +TEST_GROUP(FE_Demo) { +}; + +TEST(FE_Demo, should_fail_when__FE_DIVBYZERO__is_set) { + f = 1.0f; + CHECK(f /= 0.0f == std::numeric_limits::infinity() ); +} + +TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) { + f = 0.01f; + while (f > 0.0f) f *= f; + CHECK(f == 0.0f); +} + +TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) { + f = 1000.0f; + while (f < std::numeric_limits::infinity()) f *= f; + CHECK(f == std::numeric_limits::infinity()); +} + +TEST(FE_Demo, should_fail_when__FE_INEXACT____is_set) { + f = 10.0f; + DOUBLES_EQUAL(f / 3.0f, 3.333f, 0.001f); +} + +TEST(FE_Demo, should_succeed_when_no_flags_are_set) { + CHECK(5.0f == 15.0f / 3.0f); +} + +static IEEE754ExceptionFlagsPlugin ieee754Plugin{"IEEE754"}; + +int main(int ac, char** av) { + TestRegistry::getCurrentRegistry()->installPlugin(&ieee754Plugin); + ieee754Plugin.enableInexact(); + return RUN_ALL_TESTS(ac, av); +} + +#endif diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 31effb695..7b5c33001 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -178,6 +178,7 @@ /* 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))) +#define CPPUTEST_COMPILER_FULLY_SUPPORTS_CXX11 #define _override override #else #define _override diff --git a/include/CppUTestExt/IEEE754ExceptionsPlugin.h b/include/CppUTestExt/IEEE754ExceptionsPlugin.h new file mode 100644 index 000000000..8b59593ec --- /dev/null +++ b/include/CppUTestExt/IEEE754ExceptionsPlugin.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2015, Michael Feathers, James Grenning, Bas Vodde + * and Arnd Strube. 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_IEEE754ExceptionsPlugin_h +#define D_IEEE754ExceptionsPlugin_h + +#include "CppUTest/TestPlugin.h" + +class IEEE754ExceptionsPlugin: public TestPlugin +{ +public: + IEEE754ExceptionsPlugin(const SimpleString& name) : TestPlugin(name), + hasFailed_(false), inexactEnabled_(false) {} + + virtual void preTestAction(UtestShell& test, TestResult& result) _override; + virtual void postTestAction(UtestShell& test, TestResult& result) _override; + + void disableInexact(void); + void enableInexact(void); + +private: + void ieee754Check(int flag, const char* test); + bool hasFailed_; + UtestShell* test_; + TestResult* result_; + bool inexactEnabled_; +}; + +#endif diff --git a/platforms/Dos/sources.mk b/platforms/Dos/sources.mk index 8b5e8b949..1f085eebe 100644 --- a/platforms/Dos/sources.mk +++ b/platforms/Dos/sources.mk @@ -22,6 +22,7 @@ CPPU_OBJECTS := \ CPPUX_OBJECTS := \ $(CPPUTEST_HOME)/src/CppUTestExt/CodeMemoryReportFormatter.o \ $(CPPUTEST_HOME)/src/CppUTestExt/MemoryReporterPlugin.o \ + $(CPPUTEST_HOME)/src/CppUTestExt/IEEE754ExceptionsPlugin.o \ $(CPPUTEST_HOME)/src/CppUTestExt/MockFailure.o \ $(CPPUTEST_HOME)/src/CppUTestExt/MockSupportPlugin.o \ $(CPPUTEST_HOME)/src/CppUTestExt/MockActualCall.o \ @@ -111,6 +112,8 @@ CPPU5_OBJECTS := \ CPPU6_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/ExpectedFunctionsListTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/IEEE754PluginTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/IEEE754PluginTest_c.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockCallTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockComparatorCopierTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ diff --git a/src/CppUTestExt/CMakeLists.txt b/src/CppUTestExt/CMakeLists.txt index 3fa9ae1ab..749be7a9e 100644 --- a/src/CppUTestExt/CMakeLists.txt +++ b/src/CppUTestExt/CMakeLists.txt @@ -1,5 +1,6 @@ set(CppUTestExt_src CodeMemoryReportFormatter.cpp + IEEE754ExceptionsPlugin.cpp MemoryReporterPlugin.cpp MockFailure.cpp MockSupportPlugin.cpp @@ -16,6 +17,7 @@ set(CppUTestExt_src 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 diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp new file mode 100644 index 000000000..236e9facf --- /dev/null +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2015, Michael Feathers, James Grenning, Bas Vodde + * and Arnd R. Strube. 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. + */ + +#ifdef CPPUTEST_COMPILER_FULLY_SUPPORTS_CXX11 + +#include "CppUTest/TestHarness.h" +#include "CppUTestExt/IEEE754ExceptionsPlugin.h" + +#include + +#define IEEE754_CHECK_CLEAR(flag) ieee754Check(flag, #flag) + +void IEEE754ExceptionsPlugin::preTestAction(UtestShell&, TestResult&) +{ + std::feclearexcept(FE_ALL_EXCEPT); +} + +void IEEE754ExceptionsPlugin::postTestAction(UtestShell& test, TestResult& result) +{ + hasFailed_ = test.hasFailed(); + test_ = &test; + result_ = &result; + IEEE754_CHECK_CLEAR(FE_DIVBYZERO); + IEEE754_CHECK_CLEAR(FE_OVERFLOW); + IEEE754_CHECK_CLEAR(FE_UNDERFLOW); + IEEE754_CHECK_CLEAR(FE_INVALID); + if (inexactEnabled_) { + IEEE754_CHECK_CLEAR(FE_INEXACT); + } +} + +void IEEE754ExceptionsPlugin::disableInexact() +{ + inexactEnabled_ = false; +} + +void IEEE754ExceptionsPlugin::enableInexact() +{ + inexactEnabled_ = true; +} + +void IEEE754ExceptionsPlugin::ieee754Check(int flag, const char* text) +{ + if(!hasFailed_) { + result_->countCheck(); + if(std::fetestexcept(flag)) { + CheckFailure failure(test_, __FILE__, __LINE__, "IEEE754_CHECK_CLEAR", text); + result_->addFailure(failure); + hasFailed_ = true; + } + } +} + +#endif diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 5231e59c5..a38581a92 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -3,6 +3,8 @@ set(CppUTestExtTests_src CodeMemoryReporterTest.cpp GMockTest.cpp GTest1Test.cpp + IEEE754PluginTest.cpp + IEEE754PluginTest_c.c MemoryReportAllocatorTest.cpp MemoryReporterPluginTest.cpp MemoryReportFormatterTest.cpp diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp new file mode 100644 index 000000000..17c48be3d --- /dev/null +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2015, Michael Feathers, James Grenning, Bas Vodde + * and Arnd R. Strube. 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. + */ + +/* The IEEE754ExceptionFlags plugin by definition requires C++11 */ + +#ifdef CPPUTEST_COMPILER_FULLY_SUPPORTS_CXX11 + +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestHarness.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTest/TestTestingFixture.h" +#include "CppUTestExt/IEEE754ExceptionsPlugin.h" +#include + +extern "C" { + #include "IEEE754PluginTest_c.h" +} + +TEST_GROUP(FE__with_Plugin) { + TestTestingFixture fixture; + IEEE754ExceptionsPlugin ieee754Plugin{"IEEE754"}; + void setup(void) override { + fixture.registry_->installPlugin(&ieee754Plugin); + } +}; + +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) { + 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) { + fixture.setTestFunction(set_underflow_c); + fixture.runAllTests(); + fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_UNDERFLOW) failed"); +} + +TEST(FE__with_Plugin, should_fail____when__FE_INVALID____is_set) { + fixture.setTestFunction(set_invalid_c); + fixture.runAllTests(); + fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_INVALID) failed"); +} + +TEST(FE__with_Plugin, should_fail____when__FE_INEXACT____is_set_and_enabled) { + ieee754Plugin.enableInexact(); + fixture.setTestFunction(set_inexact_c); + fixture.runAllTests(); + fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_INEXACT) failed"); +} + +TEST(FE__with_Plugin, should_succeed_when__FE_INEXACT____is_set_and_disabled) { + ieee754Plugin.enableInexact(); + ieee754Plugin.disableInexact(); + fixture.setTestFunction(set_inexact_c); + fixture.runAllTests(); + fixture.assertPrintContains("OK"); +} + +TEST(FE__with_Plugin, should_succeed_with_5_checks_when_no_flags_are_set) { + ieee754Plugin.enableInexact(); + fixture.setTestFunction(set_nothing_c); + fixture.runAllTests(); + fixture.assertPrintContains("OK (1 tests, 1 ran, 5 checks, 0 ignored, 0 filtered out, 0 ms)"); + ieee754Plugin.disableInexact(); +} + +TEST(FE__with_Plugin, should_check_only_once_when_all_flags_are_set) { + fixture.setTestFunction(set_everything_c); + fixture.runAllTests(); + LONGS_EQUAL(1, fixture.getCheckCount()); +} + +TEST(FE__with_Plugin, should_fail_only_once_when_all_flags_are_set) { + fixture.setTestFunction(set_everything_c); + fixture.runAllTests(); + LONGS_EQUAL(1, fixture.getFailureCount()); +} + +static void set_everything_but_already_failed(void) { + set_everything_c(); + CHECK(1 == 2); +} + +TEST(FE__with_Plugin, should_not_fail_again_when_test_has_already_failed) { + fixture.setTestFunction(set_everything_but_already_failed); + fixture.runAllTests(); + LONGS_EQUAL(1, fixture.getCheckCount()); + LONGS_EQUAL(1, fixture.getFailureCount()); +} + +static IEEE754ExceptionsPlugin ip{"IEEE754"}; + +TEST_GROUP(IEEE754ExceptionsPlugin2) { + + TestRegistry* registry = TestRegistry::getCurrentRegistry(); + void setup(void) override { + registry->installPlugin(&ip); + } +}; + +IGNORE_TEST(IEEE754ExceptionsPlugin2, should_not_fail_in_ignored_test) { + set_everything_c(); +} + +#endif diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.c b/tests/CppUTestExt/IEEE754PluginTest_c.c new file mode 100644 index 000000000..2b76e7acb --- /dev/null +++ b/tests/CppUTestExt/IEEE754PluginTest_c.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2015, Michael Feathers, James Grenning, Bas Vodde + * and Arnd R. Strube. 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 "IEEE754PluginTest_c.h" +#include +#include + +static volatile float f; + +void set_divisionbyzero_c(void) { + f = 1.0f; + f /= 0.0f; +} + +void set_overflow_c(void) { + f = 1000.0f; + while (f < INFINITY) f *= f; +} + +void set_underflow_c(void) { + f = 0.01f; + while (f > 0.0f) f *= f; +} + +void set_invalid_c(void) { + f = (float) sqrt(-1.0f); +} + +void set_inexact_c(void) { + f = 10.0f; + f /= 3.0f; +} + +void set_nothing_c(void) { +} + +void set_everything_c() { + set_divisionbyzero_c(); + set_overflow_c(); + set_underflow_c(); + set_invalid_c(); + set_inexact_c(); +} diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.h b/tests/CppUTestExt/IEEE754PluginTest_c.h new file mode 100644 index 000000000..a0de61a5e --- /dev/null +++ b/tests/CppUTestExt/IEEE754PluginTest_c.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015, Michael Feathers, James Grenning, Bas Vodde + * and Arnd R. Strube. 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. + */ + +void set_divisionbyzero_c(void); +void set_overflow_c(void); +void set_underflow_c(void); +void set_invalid_c(void); +void set_inexact_c(void); +void set_nothing_c(void); +void set_everything_c(void); From 0a53b21f80d7117c8c46801b99999af600dd740e Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 8 Feb 2016 15:18:06 +0000 Subject: [PATCH 0075/1345] Pass test and result as arguments --- include/CppUTestExt/IEEE754ExceptionsPlugin.h | 4 +--- src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 22 +++++++++---------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/include/CppUTestExt/IEEE754ExceptionsPlugin.h b/include/CppUTestExt/IEEE754ExceptionsPlugin.h index 8b59593ec..3a6977915 100644 --- a/include/CppUTestExt/IEEE754ExceptionsPlugin.h +++ b/include/CppUTestExt/IEEE754ExceptionsPlugin.h @@ -43,10 +43,8 @@ class IEEE754ExceptionsPlugin: public TestPlugin void enableInexact(void); private: - void ieee754Check(int flag, const char* test); + void ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text); bool hasFailed_; - UtestShell* test_; - TestResult* result_; bool inexactEnabled_; }; diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index 236e9facf..cbce311c6 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -32,7 +32,7 @@ #include -#define IEEE754_CHECK_CLEAR(flag) ieee754Check(flag, #flag) +#define IEEE754_CHECK_CLEAR(test, result, flag) ieee754Check(test, result, flag, #flag) void IEEE754ExceptionsPlugin::preTestAction(UtestShell&, TestResult&) { @@ -42,14 +42,12 @@ void IEEE754ExceptionsPlugin::preTestAction(UtestShell&, TestResult&) void IEEE754ExceptionsPlugin::postTestAction(UtestShell& test, TestResult& result) { hasFailed_ = test.hasFailed(); - test_ = &test; - result_ = &result; - IEEE754_CHECK_CLEAR(FE_DIVBYZERO); - IEEE754_CHECK_CLEAR(FE_OVERFLOW); - IEEE754_CHECK_CLEAR(FE_UNDERFLOW); - IEEE754_CHECK_CLEAR(FE_INVALID); + IEEE754_CHECK_CLEAR(test, result, FE_DIVBYZERO); + IEEE754_CHECK_CLEAR(test, result, FE_OVERFLOW); + IEEE754_CHECK_CLEAR(test, result, FE_UNDERFLOW); + IEEE754_CHECK_CLEAR(test, result, FE_INVALID); if (inexactEnabled_) { - IEEE754_CHECK_CLEAR(FE_INEXACT); + IEEE754_CHECK_CLEAR(test, result, FE_INEXACT); } } @@ -63,13 +61,13 @@ void IEEE754ExceptionsPlugin::enableInexact() inexactEnabled_ = true; } -void IEEE754ExceptionsPlugin::ieee754Check(int flag, const char* text) +void IEEE754ExceptionsPlugin::ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text) { if(!hasFailed_) { - result_->countCheck(); + result.countCheck(); if(std::fetestexcept(flag)) { - CheckFailure failure(test_, __FILE__, __LINE__, "IEEE754_CHECK_CLEAR", text); - result_->addFailure(failure); + CheckFailure failure(&test, __FILE__, __LINE__, "IEEE754_CHECK_CLEAR", text); + result.addFailure(failure); hasFailed_ = true; } } From 49e5de390d098d1be4dc57a07c4109f9f2e14f6f Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 8 Feb 2016 18:11:56 +0100 Subject: [PATCH 0076/1345] Do away with hasFailed alltogether --- include/CppUTestExt/IEEE754ExceptionsPlugin.h | 3 +-- src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 27 +++++++++---------- tests/CppUTestExt/IEEE754PluginTest.cpp | 4 +-- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/include/CppUTestExt/IEEE754ExceptionsPlugin.h b/include/CppUTestExt/IEEE754ExceptionsPlugin.h index 3a6977915..23207b1d9 100644 --- a/include/CppUTestExt/IEEE754ExceptionsPlugin.h +++ b/include/CppUTestExt/IEEE754ExceptionsPlugin.h @@ -34,7 +34,7 @@ class IEEE754ExceptionsPlugin: public TestPlugin { public: IEEE754ExceptionsPlugin(const SimpleString& name) : TestPlugin(name), - hasFailed_(false), inexactEnabled_(false) {} + inexactEnabled_(false) {} virtual void preTestAction(UtestShell& test, TestResult& result) _override; virtual void postTestAction(UtestShell& test, TestResult& result) _override; @@ -44,7 +44,6 @@ class IEEE754ExceptionsPlugin: public TestPlugin private: void ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text); - bool hasFailed_; bool inexactEnabled_; }; diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index cbce311c6..9be3f9ee9 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -41,13 +41,14 @@ void IEEE754ExceptionsPlugin::preTestAction(UtestShell&, TestResult&) void IEEE754ExceptionsPlugin::postTestAction(UtestShell& test, TestResult& result) { - hasFailed_ = test.hasFailed(); - IEEE754_CHECK_CLEAR(test, result, FE_DIVBYZERO); - IEEE754_CHECK_CLEAR(test, result, FE_OVERFLOW); - IEEE754_CHECK_CLEAR(test, result, FE_UNDERFLOW); - IEEE754_CHECK_CLEAR(test, result, FE_INVALID); - if (inexactEnabled_) { - IEEE754_CHECK_CLEAR(test, result, FE_INEXACT); + if(!test.hasFailed()) { + IEEE754_CHECK_CLEAR(test, result, FE_DIVBYZERO); + IEEE754_CHECK_CLEAR(test, result, FE_OVERFLOW); + IEEE754_CHECK_CLEAR(test, result, FE_UNDERFLOW); + IEEE754_CHECK_CLEAR(test, result, FE_INVALID); + if (inexactEnabled_) { + IEEE754_CHECK_CLEAR(test, result, FE_INEXACT); + } } } @@ -63,13 +64,11 @@ void IEEE754ExceptionsPlugin::enableInexact() void IEEE754ExceptionsPlugin::ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text) { - if(!hasFailed_) { - result.countCheck(); - if(std::fetestexcept(flag)) { - CheckFailure failure(&test, __FILE__, __LINE__, "IEEE754_CHECK_CLEAR", text); - result.addFailure(failure); - hasFailed_ = true; - } + gitresult.countCheck(); + if(std::fetestexcept(flag)) { + std::feclearexcept(FE_ALL_EXCEPT); + CheckFailure failure(&test, __FILE__, __LINE__, "IEEE754_CHECK_CLEAR", text); + result.addFailure(failure); } } diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index 17c48be3d..a0fcb6dab 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -95,10 +95,10 @@ TEST(FE__with_Plugin, should_succeed_with_5_checks_when_no_flags_are_set) { ieee754Plugin.disableInexact(); } -TEST(FE__with_Plugin, should_check_only_once_when_all_flags_are_set) { +TEST(FE__with_Plugin, should_check_four_times_when_all_flags_are_set) { fixture.setTestFunction(set_everything_c); fixture.runAllTests(); - LONGS_EQUAL(1, fixture.getCheckCount()); + LONGS_EQUAL(4, fixture.getCheckCount()); } TEST(FE__with_Plugin, should_fail_only_once_when_all_flags_are_set) { From b3f945d518d0ff2b55fa2b555361ffc8f3199fac Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 8 Feb 2016 19:36:46 +0100 Subject: [PATCH 0077/1345] That was supposed to go into Terminal\! --- src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index 9be3f9ee9..4a9ccb40f 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -64,7 +64,7 @@ void IEEE754ExceptionsPlugin::enableInexact() void IEEE754ExceptionsPlugin::ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text) { - gitresult.countCheck(); + result.countCheck(); if(std::fetestexcept(flag)) { std::feclearexcept(FE_ALL_EXCEPT); CheckFailure failure(&test, __FILE__, __LINE__, "IEEE754_CHECK_CLEAR", text); From d895ef351fce7b84074c55e2289b7359141316b5 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 10 Feb 2016 11:06:44 +0100 Subject: [PATCH 0078/1345] Three improvements: 1. Default argument for name (important for older C++ compilers) 2. Make declaration / implementation like in existing plugins 3. Minimum requirement for this to work is actually C99, not C++11. Hence, use rather than . --- include/CppUTestExt/IEEE754ExceptionsPlugin.h | 3 +-- src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 13 +++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/include/CppUTestExt/IEEE754ExceptionsPlugin.h b/include/CppUTestExt/IEEE754ExceptionsPlugin.h index 23207b1d9..1ec65787a 100644 --- a/include/CppUTestExt/IEEE754ExceptionsPlugin.h +++ b/include/CppUTestExt/IEEE754ExceptionsPlugin.h @@ -33,8 +33,7 @@ class IEEE754ExceptionsPlugin: public TestPlugin { public: - IEEE754ExceptionsPlugin(const SimpleString& name) : TestPlugin(name), - inexactEnabled_(false) {} + IEEE754ExceptionsPlugin(const SimpleString& name = "IEEE754ExceptionsPlugin"); virtual void preTestAction(UtestShell& test, TestResult& result) _override; virtual void postTestAction(UtestShell& test, TestResult& result) _override; diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index 4a9ccb40f..4d5f0979d 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -30,13 +30,18 @@ #include "CppUTest/TestHarness.h" #include "CppUTestExt/IEEE754ExceptionsPlugin.h" -#include +#include #define IEEE754_CHECK_CLEAR(test, result, flag) ieee754Check(test, result, flag, #flag) +IEEE754ExceptionsPlugin::IEEE754ExceptionsPlugin(const SimpleString& name) + : TestPlugin(name), inexactEnabled_(false) +{ +} + void IEEE754ExceptionsPlugin::preTestAction(UtestShell&, TestResult&) { - std::feclearexcept(FE_ALL_EXCEPT); + feclearexcept(FE_ALL_EXCEPT); } void IEEE754ExceptionsPlugin::postTestAction(UtestShell& test, TestResult& result) @@ -65,8 +70,8 @@ void IEEE754ExceptionsPlugin::enableInexact() void IEEE754ExceptionsPlugin::ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text) { result.countCheck(); - if(std::fetestexcept(flag)) { - std::feclearexcept(FE_ALL_EXCEPT); + if(fetestexcept(flag)) { + feclearexcept(FE_ALL_EXCEPT); CheckFailure failure(&test, __FILE__, __LINE__, "IEEE754_CHECK_CLEAR", text); result.addFailure(failure); } From 28283c7bbd7cb5f5e80f41d876ca310488ad624a Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 10 Feb 2016 11:00:22 +0000 Subject: [PATCH 0079/1345] Missed some --- tests/CppUTestExt/IEEE754PluginTest.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index a0fcb6dab..defd4e575 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -34,7 +34,7 @@ #include "CppUTest/TestRegistry.h" #include "CppUTest/TestTestingFixture.h" #include "CppUTestExt/IEEE754ExceptionsPlugin.h" -#include +#include extern "C" { #include "IEEE754PluginTest_c.h" @@ -42,8 +42,8 @@ extern "C" { TEST_GROUP(FE__with_Plugin) { TestTestingFixture fixture; - IEEE754ExceptionsPlugin ieee754Plugin{"IEEE754"}; - void setup(void) override { + IEEE754ExceptionsPlugin ieee754Plugin; + void setup(void) _override { fixture.registry_->installPlugin(&ieee754Plugin); } }; @@ -119,13 +119,11 @@ TEST(FE__with_Plugin, should_not_fail_again_when_test_has_already_failed) { LONGS_EQUAL(1, fixture.getFailureCount()); } -static IEEE754ExceptionsPlugin ip{"IEEE754"}; +static IEEE754ExceptionsPlugin ip; TEST_GROUP(IEEE754ExceptionsPlugin2) { - - TestRegistry* registry = TestRegistry::getCurrentRegistry(); - void setup(void) override { - registry->installPlugin(&ip); + void setup(void) _override { + TestRegistry::getCurrentRegistry()->installPlugin(&ip); } }; From af752b4e27c55601bd28fc5b90ad786e8e64c0e3 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 11 Feb 2016 06:44:37 +0000 Subject: [PATCH 0080/1345] Sanitize for C99 and remove C++11 requirement. Two remaining problems: 1. MinGW 64 bit does not raise inexact for 10.0f/3.0f 2. On the Dos platform, FE_OVERFLOW is set for any error --- src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 12 +++++++----- tests/CppUTestExt/IEEE754PluginTest.cpp | 5 ++--- tests/CppUTestExt/IEEE754PluginTest_c.c | 1 - 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index 4d5f0979d..86eaa67d0 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -25,12 +25,14 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifdef CPPUTEST_COMPILER_FULLY_SUPPORTS_CXX11 - #include "CppUTest/TestHarness.h" #include "CppUTestExt/IEEE754ExceptionsPlugin.h" -#include +#if CPPUTEST_USE_STD_C_LIB + +extern "C" { + #include +} #define IEEE754_CHECK_CLEAR(test, result, flag) ieee754Check(test, result, flag, #flag) @@ -41,7 +43,7 @@ IEEE754ExceptionsPlugin::IEEE754ExceptionsPlugin(const SimpleString& name) void IEEE754ExceptionsPlugin::preTestAction(UtestShell&, TestResult&) { - feclearexcept(FE_ALL_EXCEPT); + CHECK(!feclearexcept(FE_ALL_EXCEPT)); } void IEEE754ExceptionsPlugin::postTestAction(UtestShell& test, TestResult& result) @@ -71,7 +73,7 @@ void IEEE754ExceptionsPlugin::ieee754Check(UtestShell& test, TestResult& result, { result.countCheck(); if(fetestexcept(flag)) { - feclearexcept(FE_ALL_EXCEPT); + CHECK(!feclearexcept(FE_ALL_EXCEPT)); CheckFailure failure(&test, __FILE__, __LINE__, "IEEE754_CHECK_CLEAR", text); result.addFailure(failure); } diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index defd4e575..fc5f9fa6d 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -27,14 +27,13 @@ /* The IEEE754ExceptionFlags plugin by definition requires C++11 */ -#ifdef CPPUTEST_COMPILER_FULLY_SUPPORTS_CXX11 - #include "CppUTest/CommandLineTestRunner.h" #include "CppUTest/TestHarness.h" #include "CppUTest/TestRegistry.h" #include "CppUTest/TestTestingFixture.h" #include "CppUTestExt/IEEE754ExceptionsPlugin.h" -#include + +#if CPPUTEST_USE_STD_C_LIB extern "C" { #include "IEEE754PluginTest_c.h" diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.c b/tests/CppUTestExt/IEEE754PluginTest_c.c index 2b76e7acb..e92ad0712 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.c +++ b/tests/CppUTestExt/IEEE754PluginTest_c.c @@ -27,7 +27,6 @@ #include "IEEE754PluginTest_c.h" #include -#include static volatile float f; From b98634b6356232050225cd95570d071159d0c2f2 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 12 Feb 2016 06:38:12 +0100 Subject: [PATCH 0081/1345] For now, omit tests on systems that can't do them --- include/CppUTest/CppUTestConfig.h | 13 +++++++++++++ src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 2 +- tests/CppUTestExt/IEEE754PluginTest.cpp | 14 +++++++++----- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 7b5c33001..afba9d08d 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -165,6 +165,19 @@ #endif #endif +/* + * Handling of IEEE754 floating point exceptions via fenv.h + */ + +#if CPPUTEST_USE_STD_C_LIB +#define CPPUTEST_HAVE_FENV +#if defined(__WATCOMC__) +#define CPPUTEST_FENV_IS_WORKING_PROPERLY 0 +#else +#define CPPUTEST_FENV_IS_WORKING_PROPERLY 1 +#endif +#endif + /* * Detection of different 64 bit environments */ diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index 86eaa67d0..533585c21 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -28,7 +28,7 @@ #include "CppUTest/TestHarness.h" #include "CppUTestExt/IEEE754ExceptionsPlugin.h" -#if CPPUTEST_USE_STD_C_LIB +#ifdef CPPUTEST_HAVE_FENV extern "C" { #include diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index fc5f9fa6d..119b8c101 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -25,15 +25,13 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* The IEEE754ExceptionFlags plugin by definition requires C++11 */ - #include "CppUTest/CommandLineTestRunner.h" #include "CppUTest/TestHarness.h" #include "CppUTest/TestRegistry.h" #include "CppUTest/TestTestingFixture.h" #include "CppUTestExt/IEEE754ExceptionsPlugin.h" -#if CPPUTEST_USE_STD_C_LIB +#if CPPUTEST_FENV_IS_WORKING_PROPERLY extern "C" { #include "IEEE754PluginTest_c.h" @@ -65,13 +63,19 @@ TEST(FE__with_Plugin, should_fail____when__FE_UNDERFLOW__is_set) { fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_UNDERFLOW) failed"); } -TEST(FE__with_Plugin, should_fail____when__FE_INVALID____is_set) { +#ifndef __MINGW64__ +#define NOT_MINGW64_TEST TEST +#else +#define NOT_MINGW64_TEST IGNORE_TEST +#endif + +NOT_MINGW64_TEST(FE__with_Plugin, should_fail____when__FE_INVALID____is_set) { fixture.setTestFunction(set_invalid_c); fixture.runAllTests(); fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_INVALID) failed"); } -TEST(FE__with_Plugin, should_fail____when__FE_INEXACT____is_set_and_enabled) { +NOT_MINGW64_TEST(FE__with_Plugin, should_fail____when__FE_INEXACT____is_set_and_enabled) { ieee754Plugin.enableInexact(); fixture.setTestFunction(set_inexact_c); fixture.runAllTests(); From 0ed8235e39b4e3af7ba4f2a0ea2372d0c033f249 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 12 Feb 2016 07:21:48 +0100 Subject: [PATCH 0082/1345] Fix examples and more --- examples/AllTests/AllTests.cpp | 5 +- examples/AllTests/FEDemoTest.cpp | 70 ++++++++++++++----- include/CppUTestExt/IEEE754ExceptionsPlugin.h | 6 +- src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 13 ++-- tests/CppUTestExt/IEEE754PluginTest.cpp | 6 +- 5 files changed, 71 insertions(+), 29 deletions(-) diff --git a/examples/AllTests/AllTests.cpp b/examples/AllTests/AllTests.cpp index 06a9e0324..22bd8ba6b 100644 --- a/examples/AllTests/AllTests.cpp +++ b/examples/AllTests/AllTests.cpp @@ -28,6 +28,7 @@ #include "CppUTest/CommandLineTestRunner.h" #include "CppUTest/TestPlugin.h" #include "CppUTest/TestRegistry.h" +#include "CppUTestExt/IEEE754ExceptionsPlugin.h" #include "CppUTestExt/MockSupportPlugin.h" class MyDummyComparator : public MockNamedValueComparator @@ -48,9 +49,11 @@ int main(int ac, char** av) { MyDummyComparator dummyComparator; MockSupportPlugin mockPlugin; - + IEEE754ExceptionsPlugin ieee754Plugin; + mockPlugin.installComparator("MyDummyType", dummyComparator); TestRegistry::getCurrentRegistry()->installPlugin(&mockPlugin); + TestRegistry::getCurrentRegistry()->installPlugin(&ieee754Plugin); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index 8ed04e9b5..ba4e7f4e4 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -1,36 +1,82 @@ +/* + * Copyright (c) 2016, Michael Feathers, James Grenning, Bas Vodde + * and Arnd Strube. 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/TestHarness.h" #include "CppUTest/TestRegistry.h" #include "CppUTestExt/IEEE754ExceptionsPlugin.h" -#ifdef COMPILER_FULLY_SUPPORTS_CXX11 +#ifdef CPPUTEST_HAVE_FENV + +/* + * Un-comment the following line to see a demonstration of failing and + * crashing tests + */ +// #define RUN_FAILING_TESTS + +extern "C" { + #include +} -#include #include static volatile float f; TEST_GROUP(FE_Demo) { + void setup() { + IEEE754ExceptionsPlugin::disableInexact(); + } }; -TEST(FE_Demo, should_fail_when__FE_DIVBYZERO__is_set) { +#ifdef RUN_FAILING_TESTS +#define FAILING_TEST TEST +#else +#define FAILING_TEST IGNORE_TEST +#endif + +FAILING_TEST(FE_Demo, should_fail_when__FE_DIVBYZERO__is_set) { f = 1.0f; - CHECK(f /= 0.0f == std::numeric_limits::infinity() ); + CHECK((f /= 0.0f) >= std::numeric_limits::infinity() ); } -TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) { +FAILING_TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) { f = 0.01f; while (f > 0.0f) f *= f; CHECK(f == 0.0f); } -TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) { +FAILING_TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) { f = 1000.0f; while (f < std::numeric_limits::infinity()) f *= f; - CHECK(f == std::numeric_limits::infinity()); + CHECK(f >= std::numeric_limits::infinity()); } -TEST(FE_Demo, should_fail_when__FE_INEXACT____is_set) { +FAILING_TEST(FE_Demo, should_fail_when__FE_INEXACT____is_set) { + IEEE754ExceptionsPlugin::enableInexact(); f = 10.0f; DOUBLES_EQUAL(f / 3.0f, 3.333f, 0.001f); } @@ -39,12 +85,4 @@ TEST(FE_Demo, should_succeed_when_no_flags_are_set) { CHECK(5.0f == 15.0f / 3.0f); } -static IEEE754ExceptionFlagsPlugin ieee754Plugin{"IEEE754"}; - -int main(int ac, char** av) { - TestRegistry::getCurrentRegistry()->installPlugin(&ieee754Plugin); - ieee754Plugin.enableInexact(); - return RUN_ALL_TESTS(ac, av); -} - #endif diff --git a/include/CppUTestExt/IEEE754ExceptionsPlugin.h b/include/CppUTestExt/IEEE754ExceptionsPlugin.h index 1ec65787a..69ff1971f 100644 --- a/include/CppUTestExt/IEEE754ExceptionsPlugin.h +++ b/include/CppUTestExt/IEEE754ExceptionsPlugin.h @@ -38,12 +38,12 @@ class IEEE754ExceptionsPlugin: public TestPlugin virtual void preTestAction(UtestShell& test, TestResult& result) _override; virtual void postTestAction(UtestShell& test, TestResult& result) _override; - void disableInexact(void); - void enableInexact(void); + static void disableInexact(void); + static void enableInexact(void); private: void ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text); - bool inexactEnabled_; + static bool inexactDisabled_; }; #endif diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index 533585c21..e22852f5a 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -36,8 +36,10 @@ extern "C" { #define IEEE754_CHECK_CLEAR(test, result, flag) ieee754Check(test, result, flag, #flag) +bool IEEE754ExceptionsPlugin::inexactDisabled_ = true; + IEEE754ExceptionsPlugin::IEEE754ExceptionsPlugin(const SimpleString& name) - : TestPlugin(name), inexactEnabled_(false) + : TestPlugin(name) { } @@ -53,25 +55,24 @@ void IEEE754ExceptionsPlugin::postTestAction(UtestShell& test, TestResult& resul IEEE754_CHECK_CLEAR(test, result, FE_OVERFLOW); IEEE754_CHECK_CLEAR(test, result, FE_UNDERFLOW); IEEE754_CHECK_CLEAR(test, result, FE_INVALID); - if (inexactEnabled_) { - IEEE754_CHECK_CLEAR(test, result, FE_INEXACT); - } + IEEE754_CHECK_CLEAR(test, result, FE_INEXACT); } } void IEEE754ExceptionsPlugin::disableInexact() { - inexactEnabled_ = false; + inexactDisabled_ = true; } void IEEE754ExceptionsPlugin::enableInexact() { - inexactEnabled_ = true; + inexactDisabled_ = false; } void IEEE754ExceptionsPlugin::ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text) { result.countCheck(); + if(inexactDisabled_) feclearexcept(FE_INEXACT); if(fetestexcept(flag)) { CHECK(!feclearexcept(FE_ALL_EXCEPT)); CheckFailure failure(&test, __FILE__, __LINE__, "IEEE754_CHECK_CLEAR", text); diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index 119b8c101..70239c6ca 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -75,7 +75,7 @@ NOT_MINGW64_TEST(FE__with_Plugin, should_fail____when__FE_INVALID____is_set) { fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_INVALID) failed"); } -NOT_MINGW64_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) { ieee754Plugin.enableInexact(); fixture.setTestFunction(set_inexact_c); fixture.runAllTests(); @@ -98,10 +98,10 @@ TEST(FE__with_Plugin, should_succeed_with_5_checks_when_no_flags_are_set) { ieee754Plugin.disableInexact(); } -TEST(FE__with_Plugin, should_check_four_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(4, fixture.getCheckCount()); + LONGS_EQUAL(5, fixture.getCheckCount()); } TEST(FE__with_Plugin, should_fail_only_once_when_all_flags_are_set) { From 5b1e89b21319eaf780866f5d14f80544361679e1 Mon Sep 17 00:00:00 2001 From: James Grenning Date: Fri, 12 Feb 2016 03:36:17 -0600 Subject: [PATCH 0083/1345] Added TEST_EXIT to support contract testing, users can build an assert that won't return if they expected an assert to trigger --- README.md | 2 +- include/CppUTest/Utest.h | 1 + include/CppUTest/UtestMacros.h | 3 +++ src/CppUTest/Utest.cpp | 5 +++++ tests/UtestTest.cpp | 16 +++++++++++++++- 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5c5fcefb5..e819c5a85 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ The failure of one of these macros causes the current test to immediately exit * POINTERS_EQUAL(expected, actual) - Compares two const void * * DOUBLES_EQUAL(expected, actual, tolerance) - Compares two doubles within some tolerance * 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==() @@ -104,7 +105,6 @@ The Extensions directory has a few of these. * CppUTest can support extra checking functionality by inserting TestPlugins * TestPlugin is derived from the TestPlugin class and can be inserted in the TestRegistry via the installPlugin method. -* All TestPlugins are called before and after running all tests and before and after running a single test (like Setup and Teardown). TestPlugins are typically inserted in the main. * TestPlugins can be used for, for example, system stability and resource handling like files, memory or network connection clean-up. * In CppUTest, the memory leak detection is done via a default enabled TestPlugin diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 8824949ae..0df77867a 100644 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -120,6 +120,7 @@ class UtestShell 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 fail(const char *text, const char *fileName, int 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); diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index c2372d39c..a9d585d94 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -268,6 +268,9 @@ #define FAIL_TEST_LOCATION(text, file,line)\ { UtestShell::getCurrent()->fail(text, file, line); } +#define TEST_EXIT\ + { UtestShell::getCurrent()->exitTest(); } + #define UT_PRINT_LOCATION(text, file, line) \ { UtestShell::getCurrent()->print(text, file, line); } diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 2daf7bc80..b8b842933 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -341,6 +341,11 @@ void UtestShell::failWith(const TestFailure& failure, const TestTerminator& term terminator.exitCurrentTest(); } // LCOV_EXCL_LINE +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) { getTestResult()->countCheck(); diff --git a/tests/UtestTest.cpp b/tests/UtestTest.cpp index 2639bc13d..5ef43a1cf 100644 --- a/tests/UtestTest.cpp +++ b/tests/UtestTest.cpp @@ -54,6 +54,12 @@ static void _passingCheckEqualTestMethod() CHECK_EQUAL(1, 1); } +static void _exitTestMethod() +{ + TEST_EXIT; + FAIL("Should not get here"); +} + TEST(UtestShell, compareDoubles) { double zero = 0.0; @@ -87,7 +93,6 @@ TEST(UtestShell, PassedCheckEqualWillIncreaseTheAmountOfChecks) LONGS_EQUAL(1, fixture.getCheckCount()); } - IGNORE_TEST(UtestShell, IgnoreTestAccessingFixture) { CHECK(&fixture != NULL); @@ -111,6 +116,15 @@ TEST(UtestShell, MacrosUsedInTearDown) LONGS_EQUAL(1, fixture.getFailureCount()); } +TEST(UtestShell, ExitLeavesQuietly) +{ + fixture.setTestFunction(_exitTestMethod); + fixture.runAllTests(); + LONGS_EQUAL(0, fixture.getFailureCount()); +} + + + static int teardownCalled = 0; static void _teardownMethod() From 33d686d36cdd07e681900a38d66c7ff63bf3ccf9 Mon Sep 17 00:00:00 2001 From: Harry Bock Date: Fri, 12 Feb 2016 22:31:58 -0500 Subject: [PATCH 0084/1345] Make LONGS_EQUAL(_TEXT)() and UNSIGNED_LONGS_EQUAL(_TEXT)() expression-safe. Ensure expected/actual are put in parenthesis before calling (UNSIGNED_)LONGS_EQUAL_LOCATION(). This prevents unwanted truncation and silences PC-Lint. --- include/CppUTest/UtestMacros.h | 8 ++++---- tests/TestUTestMacro.cpp | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index a9d585d94..92408d2eb 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -183,16 +183,16 @@ //Check two long integers for equality #define LONGS_EQUAL(expected, actual)\ - LONGS_EQUAL_LOCATION(expected, actual, NULL, __FILE__, __LINE__) + LONGS_EQUAL_LOCATION((expected), (actual), NULL, __FILE__, __LINE__) #define LONGS_EQUAL_TEXT(expected, actual, text)\ - LONGS_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) + 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), NULL, __FILE__, __LINE__) #define UNSIGNED_LONGS_EQUAL_TEXT(expected, actual, text)\ - UNSIGNED_LONGS_EQUAL_LOCATION(expected, actual, text, __FILE__, __LINE__) + 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); } diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 99ed84ac9..20440b683 100644 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -421,6 +421,22 @@ static int _countingMethod() return countInCountingMethod++; } +TEST(UnitTestMacros, LONGS_EQUAL_macroExpressionSafety) +{ + LONGS_EQUAL(1, 0.4 + 0.7); + LONGS_EQUAL(0.4 + 0.7, 1); + LONGS_EQUAL_TEXT(1, 0.4 + 0.7, "-Wconversion=great"); + LONGS_EQUAL_TEXT(0.4 + 0.7, 1, "-Wconversion=great"); +} + +TEST(UnitTestMacros, UNSIGNED_LONGS_EQUAL_macroExpressionSafety) +{ + UNSIGNED_LONGS_EQUAL(1, 0.4 + 0.7); + UNSIGNED_LONGS_EQUAL(0.4 + 0.7, 1); + UNSIGNED_LONGS_EQUAL_TEXT(1, 0.4 + 0.7, "-Wconversion=great"); + UNSIGNED_LONGS_EQUAL_TEXT(0.4 + 0.7, 1, "-Wconversion=great"); +} + TEST(UnitTestMacros, passingCheckEqualWillNotBeEvaluatedMultipleTimesWithCHECK_EQUAL) { countInCountingMethod = 0; From 85a1bc442c44f97e6c029942f8b09efba4377505 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 15 Feb 2016 13:26:35 +0000 Subject: [PATCH 0085/1345] Remove '0 ms' from comparison string --- 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 70239c6ca..bf828f1e1 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -94,7 +94,7 @@ TEST(FE__with_Plugin, should_succeed_with_5_checks_when_no_flags_are_set) { ieee754Plugin.enableInexact(); fixture.setTestFunction(set_nothing_c); fixture.runAllTests(); - fixture.assertPrintContains("OK (1 tests, 1 ran, 5 checks, 0 ignored, 0 filtered out, 0 ms)"); + fixture.assertPrintContains("OK (1 tests, 1 ran, 5 checks, 0 ignored, 0 filtered out"); ieee754Plugin.disableInexact(); } From e79fb2c09be0e5275186bf1955b217c67aadc9bb Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 15 Feb 2016 12:25:01 +0000 Subject: [PATCH 0086/1345] Fix default return value of ignored actual calls --- include/CppUTestExt/MockCheckedActualCall.h | 18 +++++++++--------- tests/CppUTestExt/MockActualCallTest.cpp | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index 71189df7b..33e04696e 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -225,32 +225,32 @@ class MockIgnoredActualCall: public MockActualCall virtual bool hasReturnValue() _override { return false; } virtual MockNamedValue returnValue() _override { return MockNamedValue(""); } - virtual int returnIntValueOrDefault(int) _override { return 0; } 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) _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) _override { return returnLongIntValue(); } + virtual long int returnLongIntValueOrDefault(long int value) _override { return value; } virtual unsigned int returnUnsignedIntValue() _override { return 0; } - virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int) _override { return returnUnsignedIntValue(); } + virtual unsigned int returnUnsignedIntValueOrDefault(unsigned int value) _override { return value; } virtual double returnDoubleValue() _override { return 0.0; } - virtual double returnDoubleValueOrDefault(double) _override { return returnDoubleValue(); } + virtual double returnDoubleValueOrDefault(double value) _override { return value; } - virtual const char * returnStringValueOrDefault(const char *) _override { return returnStringValue(); } virtual const char * returnStringValue() _override { return ""; } + virtual const char * returnStringValueOrDefault(const char * value) _override { return value; } virtual void * returnPointerValue() _override { return NULL; } - virtual void * returnPointerValueOrDefault(void * ) _override { return returnPointerValue(); } + virtual void * returnPointerValueOrDefault(void * value) _override { return value; } virtual const void * returnConstPointerValue() _override { return NULL; } - virtual const void * returnConstPointerValueOrDefault(const void *) _override { return returnConstPointerValue(); } + virtual const void * returnConstPointerValueOrDefault(const void * value) _override { return value; } virtual void (*returnFunctionPointerValue())() _override { return NULL; } - virtual void (*returnFunctionPointerValueOrDefault(void (*)()))() _override { return returnFunctionPointerValue(); } + virtual void (*returnFunctionPointerValueOrDefault(void (*value)()))() _override { return value; } virtual MockActualCall& onObject(const void* ) _override { return *this; } diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 82e0a8a1f..190fd66cf 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -139,22 +139,22 @@ TEST(MockCheckedActualCall, MockIgnoredActualCallWorksAsItShould) CHECK(0 == actual.returnUnsignedLongIntValue()); CHECK(0 == actual.returnIntValue()); - CHECK(0 == actual.returnUnsignedLongIntValueOrDefault(1ul)); - CHECK(0 == actual.returnIntValueOrDefault(1)); + CHECK(1ul == actual.returnUnsignedLongIntValueOrDefault(1ul)); + CHECK(1 == actual.returnIntValueOrDefault(1)); CHECK(0 == actual.returnLongIntValue()); - CHECK(0 == actual.returnLongIntValueOrDefault(1l)); + CHECK(1l == actual.returnLongIntValueOrDefault(1l)); CHECK(0 == actual.returnUnsignedIntValue()); - CHECK(0 == actual.returnUnsignedIntValueOrDefault(1u)); + CHECK(1u == actual.returnUnsignedIntValueOrDefault(1u)); DOUBLES_EQUAL(0.0f, actual.returnDoubleValue(), 0.0f); - DOUBLES_EQUAL(0.0f, actual.returnDoubleValueOrDefault(1.0f), 0.0f); - STRCMP_EQUAL("", actual.returnStringValueOrDefault("bla")); + DOUBLES_EQUAL(1.5f, actual.returnDoubleValueOrDefault(1.5f), 0.0f); + STRCMP_EQUAL("bla", actual.returnStringValueOrDefault("bla")); STRCMP_EQUAL("", actual.returnStringValue()); CHECK(0 == actual.returnPointerValue()); - CHECK(0 == actual.returnPointerValueOrDefault((void*) 0x0)); + CHECK((void*) 0x2 == actual.returnPointerValueOrDefault((void*) 0x2)); CHECK(0 == actual.returnConstPointerValue()); - CHECK(0 == actual.returnConstPointerValueOrDefault((const void*) 0x0)); + CHECK((const void*) 0x2 == actual.returnConstPointerValueOrDefault((const void*) 0x2)); CHECK(0 == actual.returnFunctionPointerValue()); - CHECK(0 == actual.returnFunctionPointerValueOrDefault((void(*)()) 0x0)); + CHECK((void(*)()) 1 == actual.returnFunctionPointerValueOrDefault((void(*)()) 0x1)); CHECK_FALSE(actual.hasReturnValue()); CHECK(actual.returnValue().equals(MockNamedValue(""))); } From a9de90442c5472b1a4fdc672c800d71cded2b709 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Tue, 16 Feb 2016 06:50:35 +0100 Subject: [PATCH 0087/1345] Fix isnan() / isinf() GCC bug problem --- src/Platforms/Gcc/UtestPlatform.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 9c19a89a1..5f0730521 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -232,14 +232,21 @@ void (*PlatformSpecificFree)(void* memory) = free; void* (*PlatformSpecificMemCpy)(void*, const void*, size_t) = memcpy; void* (*PlatformSpecificMemset)(void*, int, size_t) = memset; +/* MinGw GCC 5.3.0 isnan / isinf macros are not working properly, causing a conversion + * warning / error + */ +#ifdef __MINGW32__ +#pragma GCC diagnostic ignored "-Wfloat-conversion" +#endif + static int IsNanImplementation(double d) { - return isnan((float)d); + return isnan(d); } static int IsInfImplementation(double d) { - return isinf((float)d); + return isinf(d); } double (*PlatformSpecificFabs)(double) = fabs; From d0920e3da471eae5b64a4949c1900172ed9bc436 Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 16 Feb 2016 22:21:54 +0100 Subject: [PATCH 0088/1345] Issue #871 fixed for Linux GCC. --- src/Platforms/Gcc/UtestPlatform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 5f0730521..4349301be 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -235,7 +235,7 @@ void* (*PlatformSpecificMemset)(void*, int, size_t) = memset; /* MinGw GCC 5.3.0 isnan / isinf macros are not working properly, causing a conversion * warning / error */ -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(__GNUC__) #pragma GCC diagnostic ignored "-Wfloat-conversion" #endif From 8e08717aacdf3ec4a8658ef23316e08de3030e08 Mon Sep 17 00:00:00 2001 From: offa Date: Tue, 16 Feb 2016 22:33:39 +0100 Subject: [PATCH 0089/1345] Check for GCC Version added. --- src/Platforms/Gcc/UtestPlatform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 4349301be..7b6b7eeea 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -235,7 +235,7 @@ void* (*PlatformSpecificMemset)(void*, int, size_t) = memset; /* MinGw GCC 5.3.0 isnan / isinf macros are not working properly, causing a conversion * warning / error */ -#if defined(__MINGW32__) || defined(__GNUC__) +#if defined(__MINGW32__) || (defined(__GNUC__) && __GNUC__ >= 5) #pragma GCC diagnostic ignored "-Wfloat-conversion" #endif From efe09e4709f316e56ed82cc2e72d242ede1144b7 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 17 Feb 2016 07:11:39 +0000 Subject: [PATCH 0090/1345] Add missing CHECK --- src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index e22852f5a..400808dc9 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -72,7 +72,7 @@ void IEEE754ExceptionsPlugin::enableInexact() void IEEE754ExceptionsPlugin::ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text) { result.countCheck(); - if(inexactDisabled_) feclearexcept(FE_INEXACT); + if(inexactDisabled_) CHECK(!feclearexcept(FE_INEXACT)); if(fetestexcept(flag)) { CHECK(!feclearexcept(FE_ALL_EXCEPT)); CheckFailure failure(&test, __FILE__, __LINE__, "IEEE754_CHECK_CLEAR", text); From 6b3aa63f2be849ad6613f4b6a82bc12c4e9efc62 Mon Sep 17 00:00:00 2001 From: offa Date: Wed, 17 Feb 2016 19:00:21 +0100 Subject: [PATCH 0091/1345] Check for MinGW removed since it's already handled by the GNUC check (#873). --- src/Platforms/Gcc/UtestPlatform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 7b6b7eeea..6bf7d7b1c 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -235,7 +235,7 @@ void* (*PlatformSpecificMemset)(void*, int, size_t) = memset; /* MinGw GCC 5.3.0 isnan / isinf macros are not working properly, causing a conversion * warning / error */ -#if defined(__MINGW32__) || (defined(__GNUC__) && __GNUC__ >= 5) +#if defined(__GNUC__) && __GNUC__ >= 5 #pragma GCC diagnostic ignored "-Wfloat-conversion" #endif From c48a179312a36c9a3bf284286c85f1f3b9c6afe8 Mon Sep 17 00:00:00 2001 From: Charles Nicholson Date: Wed, 17 Feb 2016 10:43:25 -0800 Subject: [PATCH 0092/1345] manually set the output location of all test executables to their intended locations. Necessary because Xcode (and presumably VS) add the configuration (debug/release/relwithdebinfo) to the path, and the CMake tooling can't find it. --- tests/CMakeLists.txt | 7 ++++++- tests/CppUTestExt/CMakeLists.txt | 8 +++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index fa20c4284..a3f4213d8 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -46,6 +46,11 @@ endif (MINGW) add_executable(CppUTestTests ${CppUTestTests_src}) target_link_libraries(CppUTestTests CppUTest ${THREAD_LIB}) +set_target_properties(CppUTestTests + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests" + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/tests" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/tests") add_subdirectory(CppUTestExt) -cpputest_buildtime_discover_tests (CppUTestTests) +cpputest_buildtime_discover_tests(CppUTestTests) diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index a38581a92..1d7410d1d 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -34,5 +34,11 @@ if (MINGW) endif (MINGW) add_executable(CppUTestExtTests ${CppUTestExtTests_src}) +set_target_properties(CppUTestExtTests + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests/CppUTestExt" + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/tests/CppUTestExt" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/tests/CppUTestExt") + target_link_libraries(CppUTestExtTests CppUTest CppUTestExt ${THREAD_LIB} ${CPPUNIT_EXTERNAL_LIBRARIES}) -cpputest_buildtime_discover_tests (CppUTestExtTests) +cpputest_buildtime_discover_tests(CppUTestExtTests) From c4c64f144b76a66d22e6c0c5545162def4d34b35 Mon Sep 17 00:00:00 2001 From: Charles Nicholson Date: Wed, 17 Feb 2016 10:57:30 -0800 Subject: [PATCH 0093/1345] replace explicit property manipulation for test output location with call to centralized routine that updates properties on all configurations. --- CMakeLists.txt | 1 + cmake/Modules/CppUTestSetTestOutputLocation.cmake | 10 ++++++++++ tests/CMakeLists.txt | 6 +----- tests/CppUTestExt/CMakeLists.txt | 7 +------ 4 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 cmake/Modules/CppUTestSetTestOutputLocation.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index c608bb4c3..ea4a6d53b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ include("${CppUTestRootDirectory}/cmake/Modules/CppUTestConfigurationOptions.cma include(CTest) #include("${CppUTestRootDirectory}/cmake/Modules/CheckFunctionExists.cmake") include("${CppUTestRootDirectory}/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake") +include("${CppUTestRootDirectory}/cmake/Modules/CppUTestSetTestOutputLocation.cmake") configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" diff --git a/cmake/Modules/CppUTestSetTestOutputLocation.cmake b/cmake/Modules/CppUTestSetTestOutputLocation.cmake new file mode 100644 index 000000000..409e4b0d5 --- /dev/null +++ b/cmake/Modules/CppUTestSetTestOutputLocation.cmake @@ -0,0 +1,10 @@ +# Override output properties to put test executable at specificied location +function (cpputest_set_test_output_location TEST_TARGET OUTPUT_LOCATION) + set_target_properties(${TEST_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_LOCATION}) + foreach(OUTPUT_CONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUT_CONFIG} OUTPUT_CONFIG) + set_target_properties(${TEST_TARGET} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} ${OUTPUT_LOCATION}) + endforeach(OUTPUT_CONFIG) +endfunction () + diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a3f4213d8..1feea1b7c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -45,12 +45,8 @@ if (MINGW) endif (MINGW) add_executable(CppUTestTests ${CppUTestTests_src}) +cpputest_set_test_output_location(CppUTestTests "${CMAKE_BINARY_DIR}/tests") target_link_libraries(CppUTestTests CppUTest ${THREAD_LIB}) -set_target_properties(CppUTestTests - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests" - RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/tests" - RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/tests") add_subdirectory(CppUTestExt) cpputest_buildtime_discover_tests(CppUTestTests) diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 1d7410d1d..093fe8a4f 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -34,11 +34,6 @@ if (MINGW) endif (MINGW) add_executable(CppUTestExtTests ${CppUTestExtTests_src}) -set_target_properties(CppUTestExtTests - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests/CppUTestExt" - RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/tests/CppUTestExt" - RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/tests/CppUTestExt") - +cpputest_set_test_output_location(CppUTestExtTests "${CMAKE_BINARY_DIR}/tests/CppUTestExt") target_link_libraries(CppUTestExtTests CppUTest CppUTestExt ${THREAD_LIB} ${CPPUNIT_EXTERNAL_LIBRARIES}) cpputest_buildtime_discover_tests(CppUTestExtTests) From e163db5f7bade2f0dae0ccb6dbe383687c62e163 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 15 Feb 2016 19:54:59 -0600 Subject: [PATCH 0094/1345] Build against both MinGW 4.8.5 and 5.3.0 --- appveyor.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 8776110a8..3ef5e6d12 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,13 +8,21 @@ environment: - PlatformToolset: Cygwin - PlatformToolset: MinGW Platform: Win32 + Version: 4.8.5 - PlatformToolset: MinGW Platform: x64 + Version: 4.8.5 + - PlatformToolset: MinGW + Platform: Win32 + Version: 5.3.0 + - PlatformToolset: MinGW + Platform: x64 + Version: 5.3.0 - PlatformToolset: v90 - PlatformToolset: v100 install: -- ps: if ($env:PlatformToolset -eq 'MinGW') { choco install mingw $( if ($env:Platform -eq 'Win32') { Write-Output -forcex86 } ) } +- ps: if ($env:PlatformToolset -eq 'MinGW') { choco install mingw --version $env:Version $( if ($env:Platform -eq 'Win32') { Write-Output -forcex86 } ) } - ps: if ($env:PlatformToolset -eq 'Cygwin') { (New-Object System.Net.WebClient).DownloadFile('https://cygwin.com/setup-x86.exe', "${env:TEMP}\cygwin-setup.exe") ; . "${env:TEMP}\cygwin-setup.exe" --quiet-mode --packages autoconf automake make gcc-core libtool gcc-g++ } build_script: From c02cd097ac0eabafedd0e7cf93adc0a9307bce01 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Tue, 16 Feb 2016 09:48:43 -0600 Subject: [PATCH 0095/1345] Direct choco output to null --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 3ef5e6d12..2ea9f3df2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -22,7 +22,7 @@ environment: - PlatformToolset: v100 install: -- ps: if ($env:PlatformToolset -eq 'MinGW') { choco install mingw --version $env:Version $( if ($env:Platform -eq 'Win32') { Write-Output -forcex86 } ) } +- ps: if ($env:PlatformToolset -eq 'MinGW') { choco install mingw --version $env:Version $( if ($env:Platform -eq 'Win32') { Write-Output -forcex86 } ) | Out-Null } - ps: if ($env:PlatformToolset -eq 'Cygwin') { (New-Object System.Net.WebClient).DownloadFile('https://cygwin.com/setup-x86.exe', "${env:TEMP}\cygwin-setup.exe") ; . "${env:TEMP}\cygwin-setup.exe" --quiet-mode --packages autoconf automake make gcc-core libtool gcc-g++ } build_script: From c71a5795b62fd153f60f047a854f2d54d74c51bc Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 19 Feb 2016 11:17:45 +0000 Subject: [PATCH 0096/1345] Fix issue 879 --- src/CppUTest/Utest.cpp | 1 + tests/CppUTestExt/MockSupportTest.cpp | 21 ++++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index b8b842933..b3f285e15 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -176,6 +176,7 @@ void UtestShell::crash() void UtestShell::runOneTest(TestPlugin* plugin, TestResult& result) { + hasFailed_ = false; HelperTestRunInfo runInfo(this, plugin, &result); if (isRunInSeperateProcess()) PlatformSpecificSetJmp(helperDoRunOneTestSeperateProcess, &runInfo); diff --git a/tests/CppUTestExt/MockSupportTest.cpp b/tests/CppUTestExt/MockSupportTest.cpp index 0f153eaf4..bf35f5a36 100644 --- a/tests/CppUTestExt/MockSupportTest.cpp +++ b/tests/CppUTestExt/MockSupportTest.cpp @@ -199,7 +199,7 @@ static void crashMethod() cpputestHasCrashed = true; } -static void crashOnFailureTestFunction_(void) +static void unexpectedCallTestFunction_(void) { mock().actualCall("unexpected"); } // LCOV_EXCL_LINE @@ -210,7 +210,7 @@ TEST(MockSupportTestWithFixture, shouldCrashOnFailure) { mock().crashOnFailure(true); UtestShell::setCrashMethod(crashMethod); - fixture.setTestFunction(crashOnFailureTestFunction_); + fixture.setTestFunction(unexpectedCallTestFunction_); fixture.runAllTests(); @@ -224,7 +224,7 @@ TEST(MockSupportTestWithFixture, ShouldNotCrashOnFailureAfterCrashMethodWasReset { cpputestHasCrashed = false; UtestShell::setCrashMethod(crashMethod); - fixture.setTestFunction(crashOnFailureTestFunction_); + fixture.setTestFunction(unexpectedCallTestFunction_); UtestShell::resetCrashMethod(); fixture.runAllTests(); @@ -233,3 +233,18 @@ TEST(MockSupportTestWithFixture, ShouldNotCrashOnFailureAfterCrashMethodWasReset CHECK_FALSE(cpputestHasCrashed); } +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_); + } +} + From f01c4ab8f4251ed1c9b75cffe8fb4c9eeb04b284 Mon Sep 17 00:00:00 2001 From: Liu Nick Date: Tue, 23 Feb 2016 10:31:47 +0800 Subject: [PATCH 0097/1345] fix #884 append scope "oneClass" to function name if specified mock("oneClass") --- include/CppUTestExt/MockSupport.h | 7 ++- src/CppUTestExt/MockSupport.cpp | 22 +++++++-- tests/CppUTestExt/MockCallTest.cpp | 57 +++++++++++++++++++++++ tests/CppUTestExt/MockHierarchyTest.cpp | 10 ++-- tests/CppUTestExt/MockPluginTest.cpp | 4 +- tests/CppUTestExt/MockStrictOrderTest.cpp | 12 ++--- 6 files changed, 94 insertions(+), 18 deletions(-) diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index c2fdb32da..2c5287d3f 100644 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -135,7 +135,8 @@ class MockSupport MockExpectedCallComposite compositeCalls_; MockNamedValueComparatorsAndCopiersRepository comparatorsAndCopiersRepository_; MockNamedValueList data_; - + SimpleString scope_; + bool tracing_; void checkExpectationsOfLastCall(); @@ -150,6 +151,10 @@ class MockSupport bool hasntExpectationWithName(const SimpleString& functionName); bool hasntUnexpectationWithName(const SimpleString& functionName); bool hasCallsOutOfOrder(); + + SimpleString appendScopeToName(const SimpleString& functionName); + + void withScope(const SimpleString& name); }; #endif diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index abc86c252..05517c7c2 100644 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -142,6 +142,12 @@ void MockSupport::strictOrder() strictOrdering_ = true; } +SimpleString MockSupport::appendScopeToName(const SimpleString& functionName) +{ + if (scope_.isEmpty()) return functionName; + return scope_ + "::" + functionName; +} + MockExpectedCall& MockSupport::expectOneCall(const SimpleString& functionName) { if (!enabled_) return MockIgnoredExpectedCall::instance(); @@ -149,7 +155,7 @@ MockExpectedCall& MockSupport::expectOneCall(const SimpleString& functionName) countCheck(); MockCheckedExpectedCall* call = new MockCheckedExpectedCall; - call->withName(functionName); + call->withName(appendScopeToName(functionName)); if (strictOrdering_) call->withCallOrder(++expectedCallOrder_); expectations_.addExpectedCall(call); @@ -194,6 +200,8 @@ bool MockSupport::hasntUnexpectationWithName(const SimpleString& functionName) MockActualCall& MockSupport::actualCall(const SimpleString& functionName) { + const SimpleString scopeFuntionName = appendScopeToName(functionName); + if (lastActualFunctionCall_) { lastActualFunctionCall_->checkExpectations(); delete lastActualFunctionCall_; @@ -201,15 +209,15 @@ MockActualCall& MockSupport::actualCall(const SimpleString& functionName) } if (!enabled_) return MockIgnoredActualCall::instance(); - if (tracing_) return MockActualCallTrace::instance().withName(functionName); + if (tracing_) return MockActualCallTrace::instance().withName(scopeFuntionName); - if (hasntUnexpectationWithName(functionName) && hasntExpectationWithName(functionName)) { + if (hasntUnexpectationWithName(scopeFuntionName) && hasntExpectationWithName(scopeFuntionName)) { return MockIgnoredActualCall::instance(); } MockCheckedActualCall* call = createActualFunctionCall(); - call->withName(functionName); + call->withName(scopeFuntionName); return *call; } @@ -443,11 +451,17 @@ MockSupport* MockSupport::getMockSupportScope(const SimpleString& name) } MockSupport *newMock = clone(); + newMock->withScope(name); setDataObject(mockingSupportName, "MockSupport", newMock); return newMock; } +void MockSupport::withScope(const SimpleString& name) +{ + scope_ = name; +} + MockSupport* MockSupport::getMockSupport(MockNamedValueListNode* node) { if (node->getType() == "MockSupport" && node->getName().contains(MOCK_SUPPORT_SCOPE_PREFIX)) diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index e1c1851ea..6ab20c05e 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -78,6 +78,22 @@ TEST(MockCallTest, checkExpectationsClearsTheExpectations) CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } +TEST(MockCallTest, expectOneCallInScopeButNotHappen) +{ + + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest expectations; + expectations.addFunction("scope::foobar"); + MockExpectedCallsDidntHappenFailure expectedFailure(mockFailureTest(), expectations); + + mock("scope").expectOneCall("foobar"); + mock().checkExpectations(); + + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); + +} + TEST(MockCallTest, unexpectedCallHappened) { MockFailureReporterInstaller failureReporterInstaller; @@ -90,6 +106,47 @@ TEST(MockCallTest, unexpectedCallHappened) CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } +TEST(MockCallTest, unexpectedScopeCallHappened) +{ + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest emptyExpectations; + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "scope::func", emptyExpectations); + + mock("scope").actualCall("func"); + + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); +} + +TEST(MockCallTest, expectOneCallInOneScopeButActualCallInAnotherScope) +{ + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest emptyExpectations; + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "class::foo", emptyExpectations); + + mock("scope").expectOneCall("foo"); + mock("class").actualCall("foo"); + + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); + mock().clear(); +} + +TEST(MockCallTest, expectOneCallInScopeButActualCallInGlobal) +{ + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest emptyExpectations; + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "foo", emptyExpectations); + + mock("scope").expectOneCall("foo"); + mock().actualCall("foo"); + + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); + mock().clear(); +} + + TEST(MockCallTest, expectMultipleCallsThatHappen) { mock().expectOneCall("foo"); diff --git a/tests/CppUTestExt/MockHierarchyTest.cpp b/tests/CppUTestExt/MockHierarchyTest.cpp index ac4f9e51d..800ec74dc 100644 --- a/tests/CppUTestExt/MockHierarchyTest.cpp +++ b/tests/CppUTestExt/MockHierarchyTest.cpp @@ -94,8 +94,8 @@ TEST(MockHierarchyTest, checkExpectationsWorksHierarchically) MockFailureReporterInstaller failureReporterInstaller; MockExpectedCallsListForTest expectations; - expectations.addFunction("foobar"); - expectations.addFunction("helloworld"); + expectations.addFunction("first::foobar"); + expectations.addFunction("second::helloworld"); MockExpectedCallsDidntHappenFailure expectedFailure(mockFailureTest(), expectations); mock("first").expectOneCall("foobar"); @@ -127,8 +127,8 @@ TEST(MockHierarchyTest, checkExpectationsWorksHierarchicallyForLastCallNotFinish MockFailureReporterInstaller failureReporterInstaller; MockExpectedCallsListForTest expectations; - expectations.addFunction("foobar")->withParameter("boo", 1); - MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "foobar", expectations); + expectations.addFunction("first::foobar")->withParameter("boo", 1); + MockExpectedParameterDidntHappenFailure expectedFailure(mockFailureTest(), "first::foobar", expectations); mock("first").expectOneCall("foobar").withParameter("boo", 1); mock("first").actualCall("foobar"); @@ -144,7 +144,7 @@ TEST(MockHierarchyTest, reporterIsInheritedInHierarchicalMocks) mock("differentScope").actualCall("foobar"); - MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "foobar", expectations); + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "differentScope::foobar", expectations); CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } diff --git a/tests/CppUTestExt/MockPluginTest.cpp b/tests/CppUTestExt/MockPluginTest.cpp index 18878203f..ae1739b86 100644 --- a/tests/CppUTestExt/MockPluginTest.cpp +++ b/tests/CppUTestExt/MockPluginTest.cpp @@ -75,8 +75,8 @@ TEST(MockPlugin, checkExpectationsWorksAlsoWithHierachicalObjects) MockFailureReporterInstaller failureReporterInstaller; MockExpectedCallsListForTest expectations; - expectations.addFunction("foobar")->onObject((void*) 1); - MockExpectedObjectDidntHappenFailure expectedFailure(test, "foobar", expectations); + expectations.addFunction("differentScope::foobar")->onObject((void*) 1); + MockExpectedObjectDidntHappenFailure expectedFailure(test, "differentScope::foobar", expectations); mock("differentScope").expectOneCall("foobar").onObject((void*) 1); mock("differentScope").actualCall("foobar"); diff --git a/tests/CppUTestExt/MockStrictOrderTest.cpp b/tests/CppUTestExt/MockStrictOrderTest.cpp index 5098209cd..001082e09 100644 --- a/tests/CppUTestExt/MockStrictOrderTest.cpp +++ b/tests/CppUTestExt/MockStrictOrderTest.cpp @@ -89,8 +89,8 @@ TEST(MockStrictOrderTest, orderViolatedWorksHierarchically) mock("bla").strictOrder(); MockExpectedCallsListForTest expectations; - expectations.addFunction("foo1", 1)->callWasMade(2); - expectations.addFunction("foo2", 2)->callWasMade(1); + expectations.addFunction("foo::foo1", 1)->callWasMade(2); + expectations.addFunction("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("foo1", 1)->callWasMade(2); - expectations.addFunction("foo2", 2)->callWasMade(1); + expectations.addFunction("foo::foo1", 1)->callWasMade(2); + expectations.addFunction("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("foo1", 1)->callWasMade(2); - expectations.addFunction("foo2", 2)->callWasMade(1); + expectations.addFunction("scope::foo1", 1)->callWasMade(2); + expectations.addFunction("scope::foo2", 2)->callWasMade(1); MockCallOrderFailure expectedFailure(mockFailureTest(), expectations); mock("scope").expectOneCall("foo1"); From 01b7261dfd6517be72baf0c567eb2623c9af972d Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 25 Feb 2016 07:20:54 +0000 Subject: [PATCH 0098/1345] Remove conditional tests for Cl2000 & Dos, which are no longer needed. --- tests/SimpleStringTest.cpp | 22 ++++++---------------- tests/TestFailureTest.cpp | 5 +---- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 02d796c3c..1b94c2578 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -940,22 +940,12 @@ TEST(SimpleString, MaskedBits2bytes) TEST(SimpleString, MaskedBits4bytes) { - if(sizeof(long) < 4) { - STRCMP_EQUAL("xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x00000000, 0x00000000, 4).asCharString()); - STRCMP_EQUAL("00000000 00000000", StringFromMaskedBits(0x00000000, 0xFFFFFFFF, 4).asCharString()); - STRCMP_EQUAL("11111111 11111111", StringFromMaskedBits(0xFFFFFFFF, 0xFFFFFFFF, 4).asCharString()); - STRCMP_EQUAL("1xxxxxxx xxxxxxxx", StringFromMaskedBits(0x00008000, 0x00008000, 4).asCharString()); - STRCMP_EQUAL("xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x00000001, 0x00000001, 4).asCharString()); - STRCMP_EQUAL("11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFFFFFF, 0xCCCCCCCC, 4).asCharString()); - } - else { - STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x00000000, 0x00000000, 4).asCharString()); - STRCMP_EQUAL("00000000 00000000 00000000 00000000", StringFromMaskedBits(0x00000000, 0xFFFFFFFF, 4).asCharString()); - STRCMP_EQUAL("11111111 11111111 11111111 11111111", StringFromMaskedBits(0xFFFFFFFF, 0xFFFFFFFF, 4).asCharString()); - STRCMP_EQUAL("1xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x80000000, 0x80000000, 4).asCharString()); - STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x00000001, 0x00000001, 4).asCharString()); - STRCMP_EQUAL("11xx11xx 11xx11xx 11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFFFFFF, 0xCCCCCCCC, 4).asCharString()); - } + STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x00000000, 0x00000000, 4).asCharString()); + STRCMP_EQUAL("00000000 00000000 00000000 00000000", StringFromMaskedBits(0x00000000, 0xFFFFFFFF, 4).asCharString()); + STRCMP_EQUAL("11111111 11111111 11111111 11111111", StringFromMaskedBits(0xFFFFFFFF, 0xFFFFFFFF, 4).asCharString()); + STRCMP_EQUAL("1xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x80000000, 0x80000000, 4).asCharString()); + STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x00000001, 0x00000001, 4).asCharString()); + STRCMP_EQUAL("11xx11xx 11xx11xx 11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFFFFFF, 0xCCCCCCCC, 4).asCharString()); } TEST(SimpleString, StringFromOrdinalNumberOnes) diff --git a/tests/TestFailureTest.cpp b/tests/TestFailureTest.cpp index 88a9d8325..e4cf62a6f 100644 --- a/tests/TestFailureTest.cpp +++ b/tests/TestFailureTest.cpp @@ -380,8 +380,5 @@ TEST(TestFailure, BitsEqual2bytes) TEST(TestFailure, BitsEqual4bytes) { BitsEqualFailure f(test, failFileName, failLineNumber, 0x00000001, 0x00000003, 0xFFFFFFFF, 4, ""); - if (sizeof(long) < 4) - FAILURE_EQUAL("expected <00000000 00000001>\n\tbut was <00000000 00000011>", f) - else - FAILURE_EQUAL("expected <00000000 00000000 00000000 00000001>\n\tbut was <00000000 00000000 00000000 00000011>", f); + FAILURE_EQUAL("expected <00000000 00000000 00000000 00000001>\n\tbut was <00000000 00000000 00000000 00000011>", f); } From b2bf96644dcbf0fafc21405656982d91ee96e787 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 25 Feb 2016 13:20:01 +0000 Subject: [PATCH 0099/1345] CHECK_EQUAL_C_BITS for comparing bits in pure C --- include/CppUTest/TestHarness_c.h | 5 +++++ src/CppUTest/TestHarness_c.cpp | 5 +++++ tests/TestHarness_cTest.cpp | 16 ++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index 42b35e044..db059c48d 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -51,6 +51,9 @@ #define CHECK_EQUAL_C_POINTER(expected,actual) \ CHECK_EQUAL_C_POINTER_LOCATION(expected,actual,__FILE__,__LINE__) +#define CHECK_EQUAL_C_BITS(expected, actual, mask)\ + CHECK_EQUAL_C_BITS_LOCATION(expected, actual, mask, sizeof(actual), __FILE__, __LINE__) + #define FAIL_TEXT_C(text) \ FAIL_TEXT_C_LOCATION(text,__FILE__,__LINE__) @@ -121,6 +124,8 @@ extern void CHECK_EQUAL_C_STRING_LOCATION(const char* expected, const char* actual, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, const void* actual, 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); extern void FAIL_TEXT_C_LOCATION(const char* text, const char* fileName, int lineNumber); extern void FAIL_C_LOCATION(const char* fileName, int lineNumber); diff --git a/src/CppUTest/TestHarness_c.cpp b/src/CppUTest/TestHarness_c.cpp index 1f05eb156..29f939f87 100644 --- a/src/CppUTest/TestHarness_c.cpp +++ b/src/CppUTest/TestHarness_c.cpp @@ -60,6 +60,11 @@ void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, const void* actual, co UtestShell::getCurrent()->assertPointersEqual(expected, actual, NULL, 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()); +} + void FAIL_TEXT_C_LOCATION(const char* text, const char* fileName, int lineNumber) { UtestShell::getCurrent()->fail(text, fileName, lineNumber, TestTerminatorWithoutExceptions()); diff --git a/tests/TestHarness_cTest.cpp b/tests/TestHarness_cTest.cpp index 1aabc239d..3d752a57c 100644 --- a/tests/TestHarness_cTest.cpp +++ b/tests/TestHarness_cTest.cpp @@ -165,6 +165,22 @@ TEST(TestHarness_c, checkPointer) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failBitsMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_BITS(0x0001, (unsigned short)0x0003, 0xFFFF); +} + +TEST(TestHarness_c, checkBits) +{ + CHECK_EQUAL_C_POINTER(NULL, NULL); + fixture->setTestFunction(_failBitsMethod); + fixture->runAllTests(); + fixture->assertPrintContains("expected <00000000 00000001>\n\tbut was <00000000 00000011>"); + fixture->assertPrintContains("arness_c"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failTextMethod() { HasTheDestructorBeenCalledChecker checker; From 27028e9a871867b42eca19da320a07b5e72e882d Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 29 Feb 2016 07:59:18 +0000 Subject: [PATCH 0100/1345] Disable 'W472: expression with side effect in sizeof discarded' for wcl --- platforms/Dos/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/Dos/Makefile b/platforms/Dos/Makefile index a8dd5b76a..cb0062b61 100644 --- a/platforms/Dos/Makefile +++ b/platforms/Dos/Makefile @@ -19,7 +19,7 @@ include ../platforms/Dos/sources.mk # 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 -ml -zm \ + -q -c -os -oc -d0 -we -w=3 -wcd=13 -wcd=367 -wcd=368 -wcd391 -wcd=472 -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) \ From f75ae1f180de29d61deabd40ad0c9482f86b37fb Mon Sep 17 00:00:00 2001 From: liu nick Date: Fri, 4 Mar 2016 03:29:56 +0000 Subject: [PATCH 0101/1345] complete mockSupport with mockName_ when clone --- include/CppUTestExt/MockSupport.h | 7 +++---- src/CppUTestExt/MockSupport.cpp | 20 +++++++------------- 2 files changed, 10 insertions(+), 17 deletions(-) mode change 100644 => 100755 include/CppUTestExt/MockSupport.h mode change 100644 => 100755 src/CppUTestExt/MockSupport.cpp diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h old mode 100644 new mode 100755 index 2c5287d3f..5a948b927 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -42,7 +42,7 @@ MockSupport& mock(const SimpleString& mockName = "", MockFailureReporter* failur class MockSupport { public: - MockSupport(); + MockSupport(const SimpleString& mockName = ""); virtual ~MockSupport(); virtual void strictOrder(); @@ -115,7 +115,7 @@ class MockSupport virtual void removeAllComparatorsAndCopiers(); protected: - MockSupport* clone(); + MockSupport* clone(const SimpleString& mockName = ""); virtual MockCheckedActualCall *createActualFunctionCall(); virtual void failTest(MockFailure& failure); void countCheck(); @@ -135,7 +135,7 @@ class MockSupport MockExpectedCallComposite compositeCalls_; MockNamedValueComparatorsAndCopiersRepository comparatorsAndCopiersRepository_; MockNamedValueList data_; - SimpleString scope_; + const SimpleString mockName_; bool tracing_; @@ -154,7 +154,6 @@ class MockSupport SimpleString appendScopeToName(const SimpleString& functionName); - void withScope(const SimpleString& name); }; #endif diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp old mode 100644 new mode 100755 index 05517c7c2..37f22adbf --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -43,8 +43,8 @@ MockSupport& mock(const SimpleString& mockName, MockFailureReporter* failureRepo return mock_support; } -MockSupport::MockSupport() - : callOrder_(0), expectedCallOrder_(0), strictOrdering_(false), standardReporter_(&defaultReporter_), ignoreOtherCalls_(false), enabled_(true), lastActualFunctionCall_(NULL), tracing_(false) +MockSupport::MockSupport(const SimpleString& mockName) + : callOrder_(0), expectedCallOrder_(0), strictOrdering_(false), standardReporter_(&defaultReporter_), ignoreOtherCalls_(false), enabled_(true), lastActualFunctionCall_(NULL), tracing_(false), mockName_(mockName) { setActiveReporter(NULL); } @@ -144,8 +144,8 @@ void MockSupport::strictOrder() SimpleString MockSupport::appendScopeToName(const SimpleString& functionName) { - if (scope_.isEmpty()) return functionName; - return scope_ + "::" + functionName; + if (mockName_.isEmpty()) return functionName; + return mockName_ + "::" + functionName; } MockExpectedCall& MockSupport::expectOneCall(const SimpleString& functionName) @@ -425,9 +425,9 @@ MockNamedValue MockSupport::getData(const SimpleString& name) return *value; } -MockSupport* MockSupport::clone() +MockSupport* MockSupport::clone(const SimpleString& mockName) { - MockSupport* newMock = new MockSupport; + MockSupport* newMock = new MockSupport(mockName); newMock->setMockFailureStandardReporter(standardReporter_); if (ignoreOtherCalls_) newMock->ignoreOtherCalls(); @@ -450,18 +450,12 @@ MockSupport* MockSupport::getMockSupportScope(const SimpleString& name) return (MockSupport*) getData(mockingSupportName).getObjectPointer(); } - MockSupport *newMock = clone(); - newMock->withScope(name); + MockSupport *newMock = clone(name); setDataObject(mockingSupportName, "MockSupport", newMock); return newMock; } -void MockSupport::withScope(const SimpleString& name) -{ - scope_ = name; -} - MockSupport* MockSupport::getMockSupport(MockNamedValueListNode* node) { if (node->getType() == "MockSupport" && node->getName().contains(MOCK_SUPPORT_SCOPE_PREFIX)) From b5c0a77a87b2502973f46492c9ad377352edb3eb Mon Sep 17 00:00:00 2001 From: liu nick Date: Fri, 4 Mar 2016 03:55:41 +0000 Subject: [PATCH 0102/1345] clone should have no default parameter --- include/CppUTestExt/MockSupport.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index 5a948b927..8abb3d34c 100755 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -115,7 +115,7 @@ class MockSupport virtual void removeAllComparatorsAndCopiers(); protected: - MockSupport* clone(const SimpleString& mockName = ""); + MockSupport* clone(const SimpleString& mockName); virtual MockCheckedActualCall *createActualFunctionCall(); virtual void failTest(MockFailure& failure); void countCheck(); From 41ecd64000ecdbe1c9a53e366b0dd1740279fc4f Mon Sep 17 00:00:00 2001 From: liu nick Date: Fri, 4 Mar 2016 05:59:30 +0000 Subject: [PATCH 0103/1345] adjust the sequence in member intialization list --- src/CppUTestExt/MockSupport.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 37f22adbf..118c404fa 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), tracing_(false), mockName_(mockName) + : callOrder_(0), expectedCallOrder_(0), strictOrdering_(false), standardReporter_(&defaultReporter_), ignoreOtherCalls_(false), enabled_(true), lastActualFunctionCall_(NULL), mockName_(mockName), tracing_(false) { setActiveReporter(NULL); } From 05748dfefa5221d25a9bbce31fd1c64b72b25af9 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 24 Feb 2016 09:45:41 +0000 Subject: [PATCH 0104/1345] Re-arrange Cl2000 build to fit memory --- platforms/CCStudio/CppUTestExtRunAllTests1.pjt | 3 +++ platforms/CCStudio/CppUTestExtRunAllTests2.pjt | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt index efd193401..354938203 100644 --- a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt +++ b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt @@ -54,6 +54,9 @@ Source="..\..\tests\CppUTestExt\MockCheatSheetTest.cpp" Source="..\..\tests\CppUTestExt\MockExpectedCallTest.cpp" Source="..\..\tests\CppUTestExt\MockFailureReporterForTest.cpp" Source="..\..\tests\CppUTestExt\MockFailureTest.cpp" +Source="..\..\tests\CppUTestExt\MockPluginTest.cpp" +Source="..\..\tests\CppUTestExt\MockStrictOrderTest.cpp" +Source="..\..\tests\CppUTestExt\MockSupportTest.cpp" Source="C:\CCStudio_v3.3\C2000\cgtools\lib\src\farmem_cpp.cpp" Source="tests\CppUTestExt\AllTestsForTarget.cpp" Source="sim28335.cmd" diff --git a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt index 2083bd690..fc9c12088 100644 --- a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt +++ b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt @@ -48,12 +48,9 @@ Source="..\..\tests\CppUTestExt\MockFailureReporterForTest.cpp" Source="..\..\tests\CppUTestExt\MockHierarchyTest.cpp" Source="..\..\tests\CppUTestExt\MockNamedValueTest.cpp" Source="..\..\tests\CppUTestExt\MockParameterTest.cpp" -Source="..\..\tests\CppUTestExt\MockPluginTest.cpp" -Source="..\..\tests\CppUTestExt\MockStrictOrderTest.cpp" Source="..\..\tests\CppUTestExt\MockReturnValueTest.cpp" Source="..\..\tests\CppUTestExt\MockSupport_cTest.cpp" Source="..\..\tests\CppUTestExt\MockSupport_cTestCFile.c" -Source="..\..\tests\CppUTestExt\MockSupportTest.cpp" Source="..\..\tests\CppUTestExt\OrderedTestTest.cpp" Source="C:\CCStudio_v3.3\C2000\cgtools\lib\src\farmem_cpp.cpp" Source="tests\CppUTestExt\AllTestsForTarget.cpp" From d036937135df45d4dbb0ca0f8ecc69870d40f566 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 7 Mar 2016 09:45:43 +0000 Subject: [PATCH 0105/1345] Fix display for 16 bit per byte systems --- include/CppUTest/CppUTestConfig.h | 10 ++++++++++ src/CppUTest/SimpleString.cpp | 2 +- tests/TestFailureTest.cpp | 24 ++++++++++++++++-------- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index afba9d08d..eda52114d 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -189,6 +189,16 @@ #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. + */ +#if CPPUTEST_USE_STD_C_LIB +#include +#define CPPUTEST_CHAR_BIT CHAR_BIT +#else +#define CPPUTEST_CHAR_BIT 8 +#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))) #define CPPUTEST_COMPILER_FULLY_SUPPORTS_CXX11 diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 05b9e61f8..208ff054b 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -631,7 +631,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) * 8) : (byteCount * 8); + 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/TestFailureTest.cpp b/tests/TestFailureTest.cpp index e4cf62a6f..f1c91d78e 100644 --- a/tests/TestFailureTest.cpp +++ b/tests/TestFailureTest.cpp @@ -360,25 +360,33 @@ TEST(TestFailure, BinaryEqualExpectedNull) TEST(TestFailure, BitsEqualWithText) { - BitsEqualFailure f(test, failFileName, failLineNumber, 0x01, 0x03, 0xFF, 1, "text"); + BitsEqualFailure f(test, failFileName, failLineNumber, 0x0001, 0x0003, 0x00FF, 2*8/CPPUTEST_CHAR_BIT, "text"); FAILURE_EQUAL("Message: text\n" - "\texpected <00000001>\n\tbut was <00000011>", f); + "\texpected \n\tbut was ", f); } -TEST(TestFailure, BitsEqual1byte) +#if (CPPUTEST_CHAR_BIT == 16) +TEST(TestFailure, BitsEqualChar) { - BitsEqualFailure f(test, failFileName, failLineNumber, 0x01, 0x03, 0xFF, 1, ""); + BitsEqualFailure f(test, failFileName, failLineNumber, 0x01, 0x03, 0xFF, sizeof(char), ""); + FAILURE_EQUAL("expected \n\tbut was ", f); +} +#else +TEST(TestFailure, BitsEqualChar) +{ + BitsEqualFailure f(test, failFileName, failLineNumber, 0x01, 0x03, 0xFF, sizeof(char), ""); FAILURE_EQUAL("expected <00000001>\n\tbut was <00000011>", f); } +#endif -TEST(TestFailure, BitsEqual2bytes) +TEST(TestFailure, BitsEqual16Bit) { - BitsEqualFailure f(test, failFileName, failLineNumber, 0x0001, 0x0003, 0xFFFF, 2, ""); + 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, BitsEqual4bytes) +TEST(TestFailure, BitsEqual32Bit) { - BitsEqualFailure f(test, failFileName, failLineNumber, 0x00000001, 0x00000003, 0xFFFFFFFF, 4, ""); + 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); } From fbf00f7ab3315daaa771e0af370210424bb499b0 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 7 Mar 2016 10:32:07 +0000 Subject: [PATCH 0106/1345] Re-arrange Cl2000 build again to fit memory --- platforms/CCStudio/CppUTestExtRunAllTests1.pjt | 1 + platforms/CCStudio/CppUTestExtRunAllTests2.pjt | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt index 354938203..51a46126e 100644 --- a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt +++ b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt @@ -54,6 +54,7 @@ Source="..\..\tests\CppUTestExt\MockCheatSheetTest.cpp" Source="..\..\tests\CppUTestExt\MockExpectedCallTest.cpp" Source="..\..\tests\CppUTestExt\MockFailureReporterForTest.cpp" Source="..\..\tests\CppUTestExt\MockFailureTest.cpp" +Source="..\..\tests\CppUTestExt\MockHierarchyTest.cpp" Source="..\..\tests\CppUTestExt\MockPluginTest.cpp" Source="..\..\tests\CppUTestExt\MockStrictOrderTest.cpp" Source="..\..\tests\CppUTestExt\MockSupportTest.cpp" diff --git a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt index fc9c12088..b77ee4e9b 100644 --- a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt +++ b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt @@ -45,7 +45,6 @@ Source="..\..\src\Platforms\C2000\UtestPlatform.cpp" Source="..\..\tests\CppUTestExt\MockCallTest.cpp" Source="..\..\tests\CppUTestExt\MockComparatorCopierTest.cpp" Source="..\..\tests\CppUTestExt\MockFailureReporterForTest.cpp" -Source="..\..\tests\CppUTestExt\MockHierarchyTest.cpp" Source="..\..\tests\CppUTestExt\MockNamedValueTest.cpp" Source="..\..\tests\CppUTestExt\MockParameterTest.cpp" Source="..\..\tests\CppUTestExt\MockReturnValueTest.cpp" From 667457c264aa568288a6feb4b985cb0e202a8c3c Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 7 Mar 2016 15:01:16 +0000 Subject: [PATCH 0107/1345] This can be fixed by casting to (void (*)()) --- src/CppUTestExt/MockSupport_c.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 3db2fb08e..d38813f22 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -507,7 +507,7 @@ static MockValue_c getMockValueCFromNamedValue(const MockNamedValue& namedValue) } else if (SimpleString::StrCmp(namedValue.getType().asCharString(), "void (*)()") == 0) { returnValue.type = MOCKVALUETYPE_FUNCTIONPOINTER; - returnValue.value.functionPointerValue = namedValue.getFunctionPointerValue(); + returnValue.value.functionPointerValue = (void (*)()) namedValue.getFunctionPointerValue(); } else if (SimpleString::StrCmp(namedValue.getType().asCharString(), "const unsigned char*") == 0) { returnValue.type = MOCKVALUETYPE_MEMORYBUFFER; From e13cc537a88b83528f69f0e89a7a7c8ab1c81870 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 13 Mar 2016 15:24:25 +0800 Subject: [PATCH 0108/1345] Changed values to real functions to get rid of warnings --- tests/CppUTestExt/MockSupport_cTest.cpp | 36 ++++++++++++++----------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index daced03d1..d06619c53 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -32,6 +32,15 @@ #include "MockSupport_cTestCFile.h" #include "CppUTestExt/OrderedTest.h" +extern "C" { + static void dummy_function_for_mock_c_test() + { + } + static void dummy_function_for_mock_c_test_two() + { + } +} + TEST_GROUP(MockSupport_c) { }; @@ -87,10 +96,10 @@ TEST(MockSupport_c, expectAndActualParameters) { mock_c()->expectOneCall("boo")->withIntParameters("integer", 1)->withDoubleParameters("double", 1.0)-> withStringParameters("string", "string")->withPointerParameters("pointer", (void*) 1)-> - withFunctionPointerParameters("functionPointer", (void(*)()) 1); + withFunctionPointerParameters("functionPointer", dummy_function_for_mock_c_test); mock_c()->actualCall("boo")->withIntParameters("integer", 1)->withDoubleParameters("double", 1.0)-> withStringParameters("string", "string")->withPointerParameters("pointer", (void*) 1)-> - withFunctionPointerParameters("functionPointer", (void(*)()) 1); + withFunctionPointerParameters("functionPointer", dummy_function_for_mock_c_test); } extern "C"{ @@ -395,27 +404,24 @@ TEST(MockSupport_c, whenNoReturnValueIsGivenReturnConstPointerValueOrDefaultShou TEST(MockSupport_c, returnFunctionPointerValue) { - mock_c()->expectOneCall("boo")->andReturnFunctionPointerValue((void(*)()) 10); - FUNCTIONPOINTERS_EQUAL((void(*)()) 10, mock_c()->actualCall("boo")->functionPointerReturnValue()); - FUNCTIONPOINTERS_EQUAL((void(*)()) 10, mock_c()->functionPointerReturnValue()); + mock_c()->expectOneCall("boo")->andReturnFunctionPointerValue(dummy_function_for_mock_c_test); + FUNCTIONPOINTERS_EQUAL(dummy_function_for_mock_c_test, mock_c()->actualCall("boo")->functionPointerReturnValue()); + FUNCTIONPOINTERS_EQUAL(dummy_function_for_mock_c_test, mock_c()->functionPointerReturnValue()); LONGS_EQUAL(MOCKVALUETYPE_FUNCTIONPOINTER, mock_c()->returnValue().type); } TEST(MockSupport_c, whenReturnValueIsGivenReturnFunctionPointerValueOrDefaultShouldIgnoreTheDefault) { - void (*defaultValue)() = (void (*)()) 10; - void (*expectedValue)() = (void (*)()) 14; - mock_c()->expectOneCall("foo")->andReturnFunctionPointerValue(expectedValue); - FUNCTIONPOINTERS_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnFunctionPointerValueOrDefault(defaultValue)); - FUNCTIONPOINTERS_EQUAL(expectedValue, mock_c()->returnFunctionPointerValueOrDefault(defaultValue)); + mock_c()->expectOneCall("foo")->andReturnFunctionPointerValue(dummy_function_for_mock_c_test); + FUNCTIONPOINTERS_EQUAL(dummy_function_for_mock_c_test, mock_c()->actualCall("foo")->returnFunctionPointerValueOrDefault(dummy_function_for_mock_c_test_two)); + FUNCTIONPOINTERS_EQUAL(dummy_function_for_mock_c_test, mock_c()->returnFunctionPointerValueOrDefault(dummy_function_for_mock_c_test_two)); } TEST(MockSupport_c, whenNoReturnValueIsGivenReturnFunctionPointerValueOrDefaultShouldlUseTheDefaultValue) { - void (*defaultValue)() = (void (*)()) 10; mock_c()->expectOneCall("foo"); - FUNCTIONPOINTERS_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnFunctionPointerValueOrDefault(defaultValue)); - FUNCTIONPOINTERS_EQUAL(defaultValue, mock_c()->returnFunctionPointerValueOrDefault(defaultValue)); + FUNCTIONPOINTERS_EQUAL(dummy_function_for_mock_c_test_two, mock_c()->actualCall("foo")->returnFunctionPointerValueOrDefault(dummy_function_for_mock_c_test_two)); + FUNCTIONPOINTERS_EQUAL(dummy_function_for_mock_c_test_two, mock_c()->returnFunctionPointerValueOrDefault(dummy_function_for_mock_c_test_two)); } TEST(MockSupport_c, MockSupportWithScope) @@ -465,8 +471,8 @@ TEST(MockSupport_c, MockSupportMemoryBufferData) TEST(MockSupport_c, MockSupportSetFunctionPointerData) { - mock_c()->setFunctionPointerData("functionPointer", (void(*)()) 1); - FUNCTIONPOINTERS_EQUAL((void(*)()) 1, mock_c()->getData("functionPointer").value.functionPointerValue); + mock_c()->setFunctionPointerData("functionPointer", dummy_function_for_mock_c_test); + FUNCTIONPOINTERS_EQUAL(dummy_function_for_mock_c_test, mock_c()->getData("functionPointer").value.functionPointerValue); } TEST(MockSupport_c, MockSupportSetDataObject) From 2b6a17dcd344e4dc113334637eb23cded621403d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 13 Mar 2016 15:25:27 +0800 Subject: [PATCH 0109/1345] Helper for quick tests --- include/CppUTest/UtestMacros.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 92408d2eb..15165fba4 100644 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -88,6 +88,14 @@ extern int* p##testGroup; \ int* p##testGroup = &externTestGroup##testGroup +#define CPPUTEST_DEFAULT_MAIN \ + /*#include */ \ + int main(int argc, char** argv) \ + { \ + return CommandLineTestRunner::RunAllTests(argc, argv); \ + } + + // Different checking macros #define CHECK(condition)\ From c4c96845ac7103ea7a964cbbec552ed11156b6bd Mon Sep 17 00:00:00 2001 From: Bukuli Norbert Date: Sun, 13 Mar 2016 09:56:19 +0100 Subject: [PATCH 0110/1345] CMake: Fixed thread support finding for OpenBSD --- tests/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index fa20c4284..32b9e3f45 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -44,6 +44,12 @@ if (MINGW) 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 () + add_executable(CppUTestTests ${CppUTestTests_src}) target_link_libraries(CppUTestTests CppUTest ${THREAD_LIB}) From 36e9c6aac2fac981e9298da5300b41c88e7c729b Mon Sep 17 00:00:00 2001 From: Bukuli Norbert Date: Sun, 13 Mar 2016 09:56:58 +0100 Subject: [PATCH 0111/1345] MockSupport C: Fixed compilation on OpenBSD-5.8 size_t arguments are not initialized properly from int. --- 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 8dc8d3995..e0bceabc6 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -57,7 +57,7 @@ void all_mock_support_c_calls(void) withPointerParameters("pointer", (void*) 1)-> withConstPointerParameters("constpointer", (const void*) 1)-> withFunctionPointerParameters("functionpointer", (void(*)()) 1)-> - withMemoryBufferParameter("name", (void*) 1, 0)-> + withMemoryBufferParameter("name", (void*) 1, 0UL)-> ignoreOtherParameters(); mock_c()->actualCall("boo")->withIntParameters("integer", 1)-> @@ -69,12 +69,12 @@ void all_mock_support_c_calls(void) withPointerParameters("pointer", (void*) 1)-> withConstPointerParameters("constpointer", (const void*) 1)-> withFunctionPointerParameters("functionpointer", (void(*)()) 1)-> - withMemoryBufferParameter("name", (void*) 1, 0)-> + withMemoryBufferParameter("name", (void*) 1, 0UL)-> hasReturnValue(); mock_c()->disable(); mock_c()->expectOneCall("boo")->withParameterOfType("type", "name", (void*) 1)-> - withOutputParameterReturning("name", (void*)1, 0)-> + withOutputParameterReturning("name", (void*)1, 0UL)-> withOutputParameterOfTypeReturning("type", "name", (void*)1); mock_c()->actualCall("boo")->withParameterOfType("type", "name", (void*) 1)-> withOutputParameter("name", (void*)1)-> From d6cb373627d75162f3a79890e091f9bc1017a4d8 Mon Sep 17 00:00:00 2001 From: Norber Bukuli Date: Sun, 13 Mar 2016 09:17:12 +0100 Subject: [PATCH 0112/1345] Typo fix in README.md AppVeyer -> AppVeyor --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e819c5a85..f49c4bcdc 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ CppUTest unit testing and mocking framework for C/C++ Travis Linux build status: [![Build Status](https://travis-ci.org/cpputest/cpputest.png?branch=master)](https://travis-ci.org/cpputest/cpputest) -AppVeyer Windows build status: +AppVeyor Windows build status: [![Build status](https://ci.appveyor.com/api/projects/status/irh38i4wblsb5tew?svg=true)](https://ci.appveyor.com/project/basvodde/cpputest) Coverage: From 0b586ff9767ea8cd8e7f3aa07921ea250a3a2c9a Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 10 Mar 2016 08:30:23 +0000 Subject: [PATCH 0113/1345] Fix Cpp vs C function pointer problem for cl2000 --- platforms/CCStudio/CppUTestExtRunAllTests1.pjt | 1 - src/CppUTestExt/MockSupport_c.cpp | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt index 51a46126e..fd90cb8aa 100644 --- a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt +++ b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt @@ -38,7 +38,6 @@ Source="..\..\src\CppUTestExt\MockExpectedCallsList.cpp" Source="..\..\src\CppUTestExt\MockFailure.cpp" Source="..\..\src\CppUTestExt\MockNamedValue.cpp" Source="..\..\src\CppUTestExt\MockSupport.cpp" -Source="..\..\src\CppUTestExt\MockSupport_c.cpp" Source="..\..\src\CppUTestExt\MockSupportPlugin.cpp" Source="..\..\src\CppUTestExt\OrderedTest.cpp" Source="..\..\src\Platforms\C2000\UtestPlatform.cpp" diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index d38813f22..47c3bc524 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -32,6 +32,8 @@ #include "CppUTestExt/MockSupport.h" #include "CppUTestExt/MockSupport_c.h" +typedef void (*cpputest_cpp_function_pointer)(); /* Cl2000 requires cast to C++ function */ + class MockFailureReporterTestTerminatorForInCOnlyCode : public TestTerminatorWithoutExceptions { public: @@ -382,7 +384,7 @@ MockExpectedCall_c* withConstPointerParameters_c(const char* name, const void* v MockExpectedCall_c* withFunctionPointerParameters_c(const char* name, void (*value)()) { - expectedCall = &expectedCall->withParameter(name, value); + expectedCall = &expectedCall->withParameter(name, (cpputest_cpp_function_pointer)value); return &gExpectedCall; } @@ -466,7 +468,7 @@ MockExpectedCall_c* andReturnConstPointerValue_c(const void* value) MockExpectedCall_c* andReturnFunctionPointerValue_c(void (*value)()) { - expectedCall = &expectedCall->andReturnValue(value); + expectedCall = &expectedCall->andReturnValue((cpputest_cpp_function_pointer)value); return &gExpectedCall; } @@ -598,7 +600,7 @@ MockActualCall_c* withActualConstPointerParameters_c(const char* name, const voi MockActualCall_c* withActualFunctionPointerParameters_c(const char* name, void (*value)()) { - actualCall = &actualCall->withParameter(name, value); + actualCall = &actualCall->withParameter(name, (cpputest_cpp_function_pointer) value); return &gActualCall; } @@ -795,7 +797,7 @@ void setConstPointerData_c(const char* name, const void* value) void setFunctionPointerData_c(const char* name, void (*value)()) { - currentMockSupport->setData(name, value); + currentMockSupport->setData(name, (cpputest_cpp_function_pointer) value); } void setDataObject_c(const char* name, const char* type, void* value) From 1b9458e0359186008e4af4486d54656f3cf3302c Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 14 Mar 2016 11:33:09 +0100 Subject: [PATCH 0114/1345] GCC Float conversion fix (#871); separate version checks for Gcc --- src/Platforms/Gcc/UtestPlatform.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 6bf7d7b1c..77427bc33 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -232,10 +232,10 @@ void (*PlatformSpecificFree)(void* memory) = free; void* (*PlatformSpecificMemCpy)(void*, const void*, size_t) = memcpy; void* (*PlatformSpecificMemset)(void*, int, size_t) = memset; -/* MinGw GCC 5.3.0 isnan / isinf macros are not working properly, causing a conversion - * warning / error +/* 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 +#if defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ > 8)) #pragma GCC diagnostic ignored "-Wfloat-conversion" #endif From 42200b0128a8f82cde4f79c78a6b0c8da34f9e37 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 16 Mar 2016 18:06:05 +0100 Subject: [PATCH 0115/1345] Fix SimpleString Tests for 16bit per byte systems (cl2000) --- tests/SimpleStringTest.cpp | 43 ++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 1b94c2578..60c5427c2 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -917,8 +917,18 @@ TEST(SimpleString, MemCmpFirstLastNotMatching) CHECK(0 != SimpleString::MemCmp(base, lastNotMatching, sizeof(base))); } - -TEST(SimpleString, MaskedBits1byte) +#if (CPPUTEST_CHAR_BIT == 16) +TEST(SimpleString, MaskedBitsChar) +{ + STRCMP_EQUAL("xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x00, 0x00, 1).asCharString()); + STRCMP_EQUAL("xxxxxxxx 00000000", StringFromMaskedBits(0x00, 0xFF, 1).asCharString()); + STRCMP_EQUAL("xxxxxxxx 11111111", StringFromMaskedBits(0xFF, 0xFF, 1).asCharString()); + STRCMP_EQUAL("xxxxxxxx 1xxxxxxx", StringFromMaskedBits(0x80, 0x80, 1).asCharString()); + STRCMP_EQUAL("xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x01, 0x01, 1).asCharString()); + STRCMP_EQUAL("xxxxxxxx 11xx11xx", StringFromMaskedBits(0xFF, 0xCC, 1).asCharString()); +} +#else +TEST(SimpleString, MaskedBitsChar) { STRCMP_EQUAL("xxxxxxxx", StringFromMaskedBits(0x00, 0x00, 1).asCharString()); STRCMP_EQUAL("00000000", StringFromMaskedBits(0x00, 0xFF, 1).asCharString()); @@ -927,25 +937,26 @@ TEST(SimpleString, MaskedBits1byte) STRCMP_EQUAL("xxxxxxx1", StringFromMaskedBits(0x01, 0x01, 1).asCharString()); STRCMP_EQUAL("11xx11xx", StringFromMaskedBits(0xFF, 0xCC, 1).asCharString()); } +#endif -TEST(SimpleString, MaskedBits2bytes) +TEST(SimpleString, MaskedBits16Bit) { - STRCMP_EQUAL("xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x0000, 0x0000, 2).asCharString()); - STRCMP_EQUAL("00000000 00000000", StringFromMaskedBits(0x0000, 0xFFFF, 2).asCharString()); - STRCMP_EQUAL("11111111 11111111", StringFromMaskedBits(0xFFFF, 0xFFFF, 2).asCharString()); - STRCMP_EQUAL("1xxxxxxx xxxxxxxx", StringFromMaskedBits(0x8000, 0x8000, 2).asCharString()); - STRCMP_EQUAL("xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x0001, 0x0001, 2).asCharString()); - STRCMP_EQUAL("11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFF, 0xCCCC, 2).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, MaskedBits4bytes) +TEST(SimpleString, MaskedBits32Bit) { - STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x00000000, 0x00000000, 4).asCharString()); - STRCMP_EQUAL("00000000 00000000 00000000 00000000", StringFromMaskedBits(0x00000000, 0xFFFFFFFF, 4).asCharString()); - STRCMP_EQUAL("11111111 11111111 11111111 11111111", StringFromMaskedBits(0xFFFFFFFF, 0xFFFFFFFF, 4).asCharString()); - STRCMP_EQUAL("1xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx", StringFromMaskedBits(0x80000000, 0x80000000, 4).asCharString()); - STRCMP_EQUAL("xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx1", StringFromMaskedBits(0x00000001, 0x00000001, 4).asCharString()); - STRCMP_EQUAL("11xx11xx 11xx11xx 11xx11xx 11xx11xx", StringFromMaskedBits(0xFFFFFFFF, 0xCCCCCCCC, 4).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) From 3d0a4d3cf291d10b555bf0bbea5173d8bf05140c Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 18 Mar 2016 10:16:25 +0100 Subject: [PATCH 0116/1345] Interface for checking an IEEE754 exception flag in the debugger When a test fails due to an an IEEE754 exception flag being set, it can be hard to find exactly where the error occurred. By entering the new static method in the debugger as a watch, e.g. IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(4), its value will change to true at the exact point where the problem occurred. --- include/CppUTestExt/IEEE754ExceptionsPlugin.h | 1 + src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 5 +++++ tests/CppUTestExt/IEEE754PluginTest.cpp | 3 +++ 3 files changed, 9 insertions(+) diff --git a/include/CppUTestExt/IEEE754ExceptionsPlugin.h b/include/CppUTestExt/IEEE754ExceptionsPlugin.h index 69ff1971f..a31215cab 100644 --- a/include/CppUTestExt/IEEE754ExceptionsPlugin.h +++ b/include/CppUTestExt/IEEE754ExceptionsPlugin.h @@ -40,6 +40,7 @@ class IEEE754ExceptionsPlugin: public TestPlugin static void disableInexact(void); static void enableInexact(void); + static bool checkIeee754ExeptionFlag(int flag); private: void ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text); diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index 400808dc9..e09834fb1 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -69,6 +69,11 @@ void IEEE754ExceptionsPlugin::enableInexact() inexactDisabled_ = false; } +bool IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(int flag) +{ + return fetestexcept(flag); +} + void IEEE754ExceptionsPlugin::ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text) { result.countCheck(); diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index bf828f1e1..3f1e92ea1 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -118,6 +118,9 @@ static void set_everything_but_already_failed(void) { TEST(FE__with_Plugin, should_not_fail_again_when_test_has_already_failed) { fixture.setTestFunction(set_everything_but_already_failed); fixture.runAllTests(); + CHECK(ieee754Plugin.checkIeee754ExeptionFlag(0x04)); + CHECK(ieee754Plugin.checkIeee754ExeptionFlag(0x08)); + CHECK(ieee754Plugin.checkIeee754ExeptionFlag(0x10)); LONGS_EQUAL(1, fixture.getCheckCount()); LONGS_EQUAL(1, fixture.getFailureCount()); } From 5356ff56d55cb5f08fc753d5d52460c369c64b58 Mon Sep 17 00:00:00 2001 From: liu nick Date: Sun, 20 Mar 2016 04:59:01 +0000 Subject: [PATCH 0117/1345] argument line option to enable OPTRUN_TEST --- include/CppUTest/CommandLineArguments.h | 2 + include/CppUTest/TestRegistry.h | 5 +- include/CppUTest/TestTestingFixture.h | 6 +++ include/CppUTest/Utest.h | 20 ++++++++ include/CppUTest/UtestMacros.h | 15 ++++++ src/CppUTest/CommandLineArguments.cpp | 11 ++++- src/CppUTest/CommandLineTestRunner.cpp | 2 + src/CppUTest/TestRegistry.cpp | 8 ++- src/CppUTest/Utest.cpp | 51 +++++++++++++++++-- tests/CommandLineArgumentsTest.cpp | 25 +++++++++- tests/CommandLineTestRunnerTest.cpp | 66 +++++++++++++++++++++++++ tests/TestUTestMacro.cpp | 33 +++++++++++++ 12 files changed, 234 insertions(+), 10 deletions(-) mode change 100644 => 100755 include/CppUTest/CommandLineArguments.h mode change 100644 => 100755 include/CppUTest/TestRegistry.h mode change 100644 => 100755 include/CppUTest/TestTestingFixture.h mode change 100644 => 100755 include/CppUTest/Utest.h mode change 100644 => 100755 include/CppUTest/UtestMacros.h mode change 100644 => 100755 src/CppUTest/CommandLineArguments.cpp mode change 100644 => 100755 src/CppUTest/CommandLineTestRunner.cpp mode change 100644 => 100755 src/CppUTest/TestRegistry.cpp mode change 100644 => 100755 src/CppUTest/Utest.cpp mode change 100644 => 100755 tests/CommandLineArgumentsTest.cpp mode change 100644 => 100755 tests/CommandLineTestRunnerTest.cpp mode change 100644 => 100755 tests/TestUTestMacro.cpp diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h old mode 100644 new mode 100755 index ac910638e..de3e0d754 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -45,6 +45,7 @@ class CommandLineArguments bool isColor() const; bool isListingTestGroupNames() const; bool isListingTestGroupAndCaseNames() const; + bool isOptRun() const; int getRepeatCount() const; const TestFilter* getGroupFilters() const; const TestFilter* getNameFilters() const; @@ -69,6 +70,7 @@ class CommandLineArguments bool runTestsAsSeperateProcess_; bool listTestGroupNames_; bool listTestGroupAndCaseNames_; + bool isOptRun_; int repeat_; TestFilter* groupFilters_; TestFilter* nameFilters_; diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h old mode 100644 new mode 100755 index 7cc606980..9a5d34837 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -54,7 +54,6 @@ class TestRegistry virtual void listTestGroupAndCaseNames(TestResult& result); virtual void setNameFilters(const TestFilter* filters); virtual void setGroupFilters(const TestFilter* filters); - virtual void installPlugin(TestPlugin* plugin); virtual void resetPlugins(); virtual TestPlugin* getFirstPlugin(); @@ -73,7 +72,7 @@ class TestRegistry virtual void setRunTestsInSeperateProcess(); int getCurrentRepetition(); - + void setOptRun(); private: bool testShouldRun(UtestShell* test, TestResult& result); @@ -86,7 +85,7 @@ class TestRegistry static TestRegistry* currentRegistry_; bool runInSeperateProcess_; int currentRepetition_; - + bool isOptRun_; }; #endif diff --git a/include/CppUTest/TestTestingFixture.h b/include/CppUTest/TestTestingFixture.h old mode 100644 new mode 100755 index 42af0d3be..7f5e51456 --- a/include/CppUTest/TestTestingFixture.h +++ b/include/CppUTest/TestTestingFixture.h @@ -116,6 +116,12 @@ class TestTestingFixture } + int getRunCount() + { + return result_->getRunCount(); + } + + TestRegistry* registry_; ExecFunctionTestShell* genTest_; StringBufferTestOutput* output_; diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h old mode 100644 new mode 100755 index 0df77867a..3bb27bcdd --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -103,6 +103,7 @@ class UtestShell int getLineNumber() const; virtual bool willRun() const; virtual bool hasFailed() const; + bool isOptRun() 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()); @@ -137,6 +138,8 @@ class UtestShell virtual bool isRunInSeperateProcess() const; virtual void setRunInSeperateProcess(); + void setOptRun(); + virtual Utest* createTest(); virtual void destroyTest(Utest* test); @@ -160,6 +163,7 @@ class UtestShell UtestShell *next_; bool isRunAsSeperateProcess_; bool hasFailed_; + bool isOptRun_; void setTestResult(TestResult* result); void setCurrentTest(UtestShell* test); @@ -170,6 +174,8 @@ class UtestShell }; + + //////////////////// ExecFunctionTest class ExecFunctionTestShell; @@ -231,6 +237,20 @@ class IgnoredUtestShell : public UtestShell }; +////////////////////optRunTest +class OptRunUtestShell : public IgnoredUtestShell +{ +public: + OptRunUtestShell(); + virtual ~OptRunUtestShell(); + explicit OptRunUtestShell(const char* groupName, const char* testName, + const char* fileName, int lineNumber); + virtual bool willRun() const _override; + virtual void runOneTest(TestPlugin* plugin, TestResult& result) _override; +protected: + virtual SimpleString getMacroName() const _override; +}; + //////////////////// TestInstaller class TestInstaller diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h old mode 100644 new mode 100755 index 92408d2eb..29fd1924f --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -83,6 +83,21 @@ static TestInstaller TEST_##testGroup##testName##_Installer(IGNORE##testGroup##_##testName##_TestShell_instance, #testGroup, #testName, __FILE__,__LINE__); \ void IGNORE##testGroup##_##testName##_Test::testBodyThatNeverRuns () +#define OPTRUN_TEST(testGroup, testName)\ + /* External declarations for strict compilers */ \ + class OPTRUN##testGroup##_##testName##_TestShell; \ + extern OPTRUN##testGroup##_##testName##_TestShell OPTRUN##testGroup##_##testName##_TestShell_instance; \ + \ + class OPTRUN##testGroup##_##testName##_Test : public TEST_GROUP_##CppUTestGroup##testGroup \ +{ public: OPTRUN##testGroup##_##testName##_Test () : TEST_GROUP_##CppUTestGroup##testGroup () {} \ + public: void testBody (); }; \ + class OPTRUN##testGroup##_##testName##_TestShell : public OptRunUtestShell { \ + virtual Utest* createTest() _override { return new OPTRUN##testGroup##_##testName##_Test; } \ + } OPTRUN##testGroup##_##testName##_TestShell_instance; \ + static TestInstaller TEST_##testGroup##testName##_Installer(OPTRUN##testGroup##_##testName##_TestShell_instance, #testGroup, #testName, __FILE__,__LINE__); \ + void OPTRUN##testGroup##_##testName##_Test::testBody () + + #define IMPORT_TEST_GROUP(testGroup) \ extern int externTestGroup##testGroup;\ extern int* p##testGroup; \ diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp old mode 100644 new mode 100755 index fc3387815..924dc986c --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -30,7 +30,7 @@ #include "CppUTest/PlatformSpecificFunctions.h" CommandLineArguments::CommandLineArguments(int ac, const char** av) : - ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), repeat_(1), groupFilters_(NULL), nameFilters_(NULL), outputType_(OUTPUT_ECLIPSE) + ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), isOptRun_(false), repeat_(1), groupFilters_(NULL), nameFilters_(NULL), outputType_(OUTPUT_ECLIPSE) { } @@ -59,6 +59,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument == "-p") runTestsAsSeperateProcess_ = true; else if (argument == "-lg") listTestGroupNames_ = true; else if (argument == "-ln") listTestGroupAndCaseNames_ = true; + else if (argument == "-optRun") isOptRun_ = 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); @@ -70,6 +71,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument.startsWith("-xsn")) AddExcludeStrictNameFilter(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("OPTRUN_TEST(")) AddTestToRunBasedOnVerboseOutput(ac_, av_, i, "OPTRUN_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); @@ -84,7 +86,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) const char* CommandLineArguments::usage() const { - return "usage [-v] [-c] [-p] [-lg] [-ln] [-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] [-optRun] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; } bool CommandLineArguments::isVerbose() const @@ -107,6 +109,11 @@ bool CommandLineArguments::isListingTestGroupAndCaseNames() const return listTestGroupAndCaseNames_; } +bool CommandLineArguments::isOptRun() const +{ + return isOptRun_; +} + bool CommandLineArguments::runTestsInSeperateProcess() const { return runTestsAsSeperateProcess_; diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp old mode 100644 new mode 100755 index 37663afcc..d52282ba7 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -88,9 +88,11 @@ 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_->isOptRun()) registry_->setOptRun(); } int CommandLineTestRunner::runAllTests() diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp old mode 100644 new mode 100755 index 9c4f651a0..94c747cae --- 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) + tests_(NULL), nameFilters_(NULL), groupFilters_(NULL), firstPlugin_(NullTestPlugin::instance()), runInSeperateProcess_(false), currentRepetition_(0), isOptRun_(false) { } @@ -50,6 +50,7 @@ void TestRegistry::runAllTests(TestResult& result) result.testsStarted(); for (UtestShell *test = tests_; test != NULL; test = test->getNext()) { if (runInSeperateProcess_) test->setRunInSeperateProcess(); + if (isOptRun_) test->setOptRun(); if (groupStart) { result.currentGroupStarted(test); @@ -161,6 +162,11 @@ void TestRegistry::setGroupFilters(const TestFilter* filters) groupFilters_ = filters; } +void TestRegistry::setOptRun() +{ + isOptRun_ = true; +} + void TestRegistry::setRunTestsInSeperateProcess() { runInSeperateProcess_ = true; diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp old mode 100644 new mode 100755 index b3f285e15..440ca2eec --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -132,17 +132,17 @@ 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_(NULL), isRunAsSeperateProcess_(false), hasFailed_(false), isOptRun_(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_(NULL), isRunAsSeperateProcess_(false), hasFailed_(false), isOptRun_(false) { } UtestShell::UtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber, UtestShell* nextTest) : - group_(groupName), name_(testName), file_(fileName), lineNumber_(lineNumber), next_(nextTest), isRunAsSeperateProcess_(false), hasFailed_(false) + group_(groupName), name_(testName), file_(fileName), lineNumber_(lineNumber), next_(nextTest), isRunAsSeperateProcess_(false), hasFailed_(false), isOptRun_(false) { } @@ -264,6 +264,11 @@ bool UtestShell::hasFailed() const return hasFailed_; } +bool UtestShell::isOptRun() const +{ + return isOptRun_; +} + void UtestShell::countCheck() { getTestResult()->countCheck(); @@ -285,6 +290,11 @@ void UtestShell::setRunInSeperateProcess() } +void UtestShell::setOptRun() +{ + isOptRun_ = true; +} + void UtestShell::setFileName(const char* fileName) { file_ = fileName; @@ -675,3 +685,38 @@ void TestInstaller::unDo() { TestRegistry::getCurrentRegistry()->unDoLastAddTest(); } + +OptRunUtestShell::OptRunUtestShell() +{ + +} +OptRunUtestShell::OptRunUtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber) : + IgnoredUtestShell(groupName, testName, fileName, lineNumber) +{ +} + +OptRunUtestShell::~OptRunUtestShell() +{ + +} +bool OptRunUtestShell::willRun() const +{ + if (isOptRun()) return UtestShell::willRun(); + + return IgnoredUtestShell::willRun(); +} + +void OptRunUtestShell::runOneTest(TestPlugin* plugin, TestResult& result) +{ + if (isOptRun()) + { + UtestShell::runOneTest(plugin, result); + return; + } + IgnoredUtestShell::runOneTest(plugin, result); +} + +SimpleString OptRunUtestShell::getMacroName() const +{ + return "OPTRUN_TEST"; +} diff --git a/tests/CommandLineArgumentsTest.cpp b/tests/CommandLineArgumentsTest.cpp old mode 100644 new mode 100755 index b9fa751b8..e4b359f8f --- a/tests/CommandLineArgumentsTest.cpp +++ b/tests/CommandLineArgumentsTest.cpp @@ -302,6 +302,20 @@ TEST(CommandLineArguments, setTestToRunUsingVerboseOutputOfIgnoreTest) CHECK_EQUAL(groupFilter, *args->getGroupFilters()); } +TEST(CommandLineArguments, setTestToRunUsingVerboseOutputOfOptRunTest) +{ + int argc = 2; + const char* argv[] = { "tests.exe", "OPTRUN_TEST(testgroup, testname) - stuff" }; + CHECK(newArgumentParser(argc, argv)); + + TestFilter nameFilter("testname"); + TestFilter groupFilter("testgroup"); + nameFilter.strictMatching(); + groupFilter.strictMatching(); + CHECK_EQUAL(nameFilter, *args->getNameFilters()); + CHECK_EQUAL(groupFilter, *args->getGroupFilters()); +} + TEST(CommandLineArguments, setNormalOutput) { int argc = 2; @@ -370,7 +384,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] [-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] [-optRun] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", args->usage()); } @@ -424,3 +438,12 @@ TEST(CommandLineArguments, lastParameterFieldMissing) CHECK(newArgumentParser(argc, argv)); CHECK_EQUAL(SimpleString(""), args->getPackageName()); } + +TEST(CommandLineArguments, setOptRun) +{ + int argc = 2; + const char* argv[] = { "tests.exe", "-optRun"}; + CHECK(newArgumentParser(argc, argv)); + CHECK(args->isOptRun()); +} + diff --git a/tests/CommandLineTestRunnerTest.cpp b/tests/CommandLineTestRunnerTest.cpp old mode 100644 new mode 100755 index 057b95c65..49e7025a1 --- a/tests/CommandLineTestRunnerTest.cpp +++ b/tests/CommandLineTestRunnerTest.cpp @@ -32,6 +32,8 @@ #include "CppUTest/TestPlugin.h" #include "CppUTest/JUnitTestOutput.h" #include "CppUTest/PlatformSpecificFunctions.h" +#include "CppUTestExt/MockSupport.h" + class DummyPluginWhichCountsThePlugins : public TestPlugin { @@ -260,3 +262,67 @@ TEST(CommandLineTestRunner, realTeamCityOutputShouldBeCreatedAndWorkProperly) STRCMP_CONTAINS("##teamcity[testFinished name='test'", FakeOutput::console.asCharString()); STRCMP_CONTAINS("##teamcity[testSuiteFinished name='group'", FakeOutput::console.asCharString()); } +static bool bChecker = false; + +class OptRunUtestForTest : public Utest +{ +public: + void testBody() + { + bChecker = true; + } +}; + +class optRunUtestShellForTest : public OptRunUtestShell +{ +public: + optRunUtestShellForTest(const char* groupName, const char* testName, const char* fileName, int lineNumber) + : OptRunUtestShell(groupName, testName, fileName, lineNumber) {} + virtual Utest* createTest() _override { return new OptRunUtestForTest; } +}; + +TEST_GROUP(OptRunTestTests) +{ + TestRegistry registry; + optRunUtestShellForTest *optRunTest_; + DummyPluginWhichCountsThePlugins* pluginCountingPlugin; + + void setup() + { + optRunTest_ = new optRunUtestShellForTest("group", "test", "file", 1); + registry.addTest(optRunTest_); + pluginCountingPlugin = new DummyPluginWhichCountsThePlugins("PluginCountingPlugin", ®istry); + } + void teardown() + { + delete pluginCountingPlugin; + delete optRunTest_; + bChecker = false; + } +}; + +TEST(OptRunTestTests, optRunWillBeIgnoredIfNoOptionSpecified) +{ + const char* argv[] = { "tests.exe" }; + + CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(1, argv, ®istry); + commandLineTestRunner.runAllTestsMain(); + + CHECK_FALSE( bChecker ); +} + +TEST(OptRunTestTests, optRunWillGetRunIfOptionSpecified) +{ + const char* argv[] = { "tests.exe", "-optRun" }; + + CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); + commandLineTestRunner.runAllTestsMain(); + + CHECK_TRUE( bChecker ); +} + +OPTRUN_TEST(OptRunTestTests, ThisIsATestFromUserView) +{ + CHECK(0); +} + diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp old mode 100644 new mode 100755 index 20440b683..0d42927b4 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -1362,4 +1362,37 @@ TEST(IgnoreTest, printsIGNORE_TESTwhenVerbose) fixture.assertPrintContains("IGNORE_TEST"); } +TEST_GROUP(OptRunTest) +{ + TestTestingFixture fixture; + OptRunUtestShell optRunTest; + + void setup() _override + { + fixture.addTest(&optRunTest); + } +}; + +TEST(OptRunTest, optRunOptionSpecifiedThenIncreaseRunCount) +{ + optRunTest.setOptRun(); + fixture.runAllTests(); + LONGS_EQUAL(2, fixture.getRunCount()); + LONGS_EQUAL(0, fixture.getIgnoreCount()); +}; + +TEST(OptRunTest, optRunOptionNotSpecifiedThenIncreaseIgnoredCount) +{ + fixture.runAllTests(); + LONGS_EQUAL(1, fixture.getRunCount()); + LONGS_EQUAL(1, fixture.getIgnoreCount()); +}; + +TEST(OptRunTest, printsOPTRUN_TESTwhenVerbose) +{ + fixture.output_->verbose(); + fixture.runAllTests(); + fixture.assertPrintContains("OPTRUN_TEST"); +} + From d3cf3e09b2b1aa9f3b0267b3ab0494249520650a Mon Sep 17 00:00:00 2001 From: liu nick Date: Sun, 20 Mar 2016 14:53:45 +0000 Subject: [PATCH 0118/1345] add command line option to enable run ignore test --- include/CppUTest/CommandLineArguments.h | 4 +- include/CppUTest/TestRegistry.h | 4 +- include/CppUTest/Utest.h | 20 ++------ include/CppUTest/UtestMacros.h | 19 +------- src/CppUTest/CommandLineArguments.cpp | 11 ++--- src/CppUTest/CommandLineTestRunner.cpp | 2 +- src/CppUTest/TestRegistry.cpp | 8 ++-- src/CppUTest/Utest.cpp | 61 +++++++------------------ tests/CommandLineArgumentsTest.cpp | 20 ++------ tests/CommandLineTestRunnerTest.cpp | 41 ++++++++--------- tests/TestUTestMacro.cpp | 19 +++----- 11 files changed, 63 insertions(+), 146 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index de3e0d754..adf591121 100755 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -45,7 +45,7 @@ class CommandLineArguments bool isColor() const; bool isListingTestGroupNames() const; bool isListingTestGroupAndCaseNames() const; - bool isOptRun() const; + bool isRunIgnore() const; int getRepeatCount() const; const TestFilter* getGroupFilters() const; const TestFilter* getNameFilters() const; @@ -70,7 +70,7 @@ class CommandLineArguments bool runTestsAsSeperateProcess_; bool listTestGroupNames_; bool listTestGroupAndCaseNames_; - bool isOptRun_; + bool runIgnore_; int repeat_; TestFilter* groupFilters_; TestFilter* nameFilters_; diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index 9a5d34837..9f61cd1b0 100755 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -72,7 +72,7 @@ class TestRegistry virtual void setRunTestsInSeperateProcess(); int getCurrentRepetition(); - void setOptRun(); + void setRunIgnore(); private: bool testShouldRun(UtestShell* test, TestResult& result); @@ -85,7 +85,7 @@ class TestRegistry static TestRegistry* currentRegistry_; bool runInSeperateProcess_; int currentRepetition_; - bool isOptRun_; + bool runIgnore_; }; #endif diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 3bb27bcdd..f412393c6 100755 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -103,7 +103,7 @@ class UtestShell int getLineNumber() const; virtual bool willRun() const; virtual bool hasFailed() const; - bool isOptRun() const; + bool isRunIgnore() 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()); @@ -138,7 +138,7 @@ class UtestShell virtual bool isRunInSeperateProcess() const; virtual void setRunInSeperateProcess(); - void setOptRun(); + void setRunIgnore(); virtual Utest* createTest(); virtual void destroyTest(Utest* test); @@ -163,7 +163,7 @@ class UtestShell UtestShell *next_; bool isRunAsSeperateProcess_; bool hasFailed_; - bool isOptRun_; + bool runIgnore_; void setTestResult(TestResult* result); void setCurrentTest(UtestShell* test); @@ -237,20 +237,6 @@ class IgnoredUtestShell : public UtestShell }; -////////////////////optRunTest -class OptRunUtestShell : public IgnoredUtestShell -{ -public: - OptRunUtestShell(); - virtual ~OptRunUtestShell(); - explicit OptRunUtestShell(const char* groupName, const char* testName, - const char* fileName, int lineNumber); - virtual bool willRun() const _override; - virtual void runOneTest(TestPlugin* plugin, TestResult& result) _override; -protected: - virtual SimpleString getMacroName() const _override; -}; - //////////////////// TestInstaller class TestInstaller diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 29fd1924f..fa11a0949 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -76,27 +76,12 @@ \ class IGNORE##testGroup##_##testName##_Test : public TEST_GROUP_##CppUTestGroup##testGroup \ { public: IGNORE##testGroup##_##testName##_Test () : TEST_GROUP_##CppUTestGroup##testGroup () {} \ - public: void testBodyThatNeverRuns (); }; \ + public: void testBody (); }; \ class IGNORE##testGroup##_##testName##_TestShell : public IgnoredUtestShell { \ virtual Utest* createTest() _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::testBodyThatNeverRuns () - -#define OPTRUN_TEST(testGroup, testName)\ - /* External declarations for strict compilers */ \ - class OPTRUN##testGroup##_##testName##_TestShell; \ - extern OPTRUN##testGroup##_##testName##_TestShell OPTRUN##testGroup##_##testName##_TestShell_instance; \ - \ - class OPTRUN##testGroup##_##testName##_Test : public TEST_GROUP_##CppUTestGroup##testGroup \ -{ public: OPTRUN##testGroup##_##testName##_Test () : TEST_GROUP_##CppUTestGroup##testGroup () {} \ - public: void testBody (); }; \ - class OPTRUN##testGroup##_##testName##_TestShell : public OptRunUtestShell { \ - virtual Utest* createTest() _override { return new OPTRUN##testGroup##_##testName##_Test; } \ - } OPTRUN##testGroup##_##testName##_TestShell_instance; \ - static TestInstaller TEST_##testGroup##testName##_Installer(OPTRUN##testGroup##_##testName##_TestShell_instance, #testGroup, #testName, __FILE__,__LINE__); \ - void OPTRUN##testGroup##_##testName##_Test::testBody () - + void IGNORE##testGroup##_##testName##_Test::testBody () #define IMPORT_TEST_GROUP(testGroup) \ extern int externTestGroup##testGroup;\ diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 924dc986c..fe706dc9e 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** av) : - ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), isOptRun_(false), repeat_(1), groupFilters_(NULL), nameFilters_(NULL), outputType_(OUTPUT_ECLIPSE) + ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnore_(false), repeat_(1), groupFilters_(NULL), nameFilters_(NULL), outputType_(OUTPUT_ECLIPSE) { } @@ -59,7 +59,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument == "-p") runTestsAsSeperateProcess_ = true; else if (argument == "-lg") listTestGroupNames_ = true; else if (argument == "-ln") listTestGroupAndCaseNames_ = true; - else if (argument == "-optRun") isOptRun_ = true; + else if (argument == "-runIgnore") runIgnore_ = 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); @@ -71,7 +71,6 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument.startsWith("-xsn")) AddExcludeStrictNameFilter(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("OPTRUN_TEST(")) AddTestToRunBasedOnVerboseOutput(ac_, av_, i, "OPTRUN_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); @@ -86,7 +85,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) const char* CommandLineArguments::usage() const { - return "usage [-v] [-c] [-p] [-lg] [-ln] [-optRun] [-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] [-runIgnore] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; } bool CommandLineArguments::isVerbose() const @@ -109,9 +108,9 @@ bool CommandLineArguments::isListingTestGroupAndCaseNames() const return listTestGroupAndCaseNames_; } -bool CommandLineArguments::isOptRun() const +bool CommandLineArguments::isRunIgnore() const { - return isOptRun_; + return runIgnore_; } bool CommandLineArguments::runTestsInSeperateProcess() const diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index d52282ba7..45cb941f7 100755 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -92,7 +92,7 @@ void CommandLineTestRunner::initializeTestRun() if (arguments_->isVerbose()) output_->verbose(); if (arguments_->isColor()) output_->color(); if (arguments_->runTestsInSeperateProcess()) registry_->setRunTestsInSeperateProcess(); - if (arguments_->isOptRun()) registry_->setOptRun(); + if (arguments_->isRunIgnore()) registry_->setRunIgnore(); } int CommandLineTestRunner::runAllTests() diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 94c747cae..a4edcdc73 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), isOptRun_(false) + tests_(NULL), nameFilters_(NULL), groupFilters_(NULL), firstPlugin_(NullTestPlugin::instance()), runInSeperateProcess_(false), currentRepetition_(0), runIgnore_(false) { } @@ -50,7 +50,7 @@ void TestRegistry::runAllTests(TestResult& result) result.testsStarted(); for (UtestShell *test = tests_; test != NULL; test = test->getNext()) { if (runInSeperateProcess_) test->setRunInSeperateProcess(); - if (isOptRun_) test->setOptRun(); + if (runIgnore_) test->setRunIgnore(); if (groupStart) { result.currentGroupStarted(test); @@ -162,9 +162,9 @@ void TestRegistry::setGroupFilters(const TestFilter* filters) groupFilters_ = filters; } -void TestRegistry::setOptRun() +void TestRegistry::setRunIgnore() { - isOptRun_ = true; + runIgnore_ = true; } void TestRegistry::setRunTestsInSeperateProcess() diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 440ca2eec..d0e5bb586 100755 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -132,17 +132,17 @@ extern "C" { /******************************** */ UtestShell::UtestShell() : - group_("UndefinedTestGroup"), name_("UndefinedTest"), file_("UndefinedFile"), lineNumber_(0), next_(NULL), isRunAsSeperateProcess_(false), hasFailed_(false), isOptRun_(false) + group_("UndefinedTestGroup"), name_("UndefinedTest"), file_("UndefinedFile"), lineNumber_(0), next_(NULL), isRunAsSeperateProcess_(false), hasFailed_(false), runIgnore_(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), isOptRun_(false) + group_(groupName), name_(testName), file_(fileName), lineNumber_(lineNumber), next_(NULL), isRunAsSeperateProcess_(false), hasFailed_(false), runIgnore_(false) { } UtestShell::UtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber, UtestShell* nextTest) : - group_(groupName), name_(testName), file_(fileName), lineNumber_(lineNumber), next_(nextTest), isRunAsSeperateProcess_(false), hasFailed_(false), isOptRun_(false) + group_(groupName), name_(testName), file_(fileName), lineNumber_(lineNumber), next_(nextTest), isRunAsSeperateProcess_(false), hasFailed_(false), runIgnore_(false) { } @@ -264,9 +264,9 @@ bool UtestShell::hasFailed() const return hasFailed_; } -bool UtestShell::isOptRun() const +bool UtestShell::isRunIgnore() const { - return isOptRun_; + return runIgnore_; } void UtestShell::countCheck() @@ -290,9 +290,9 @@ void UtestShell::setRunInSeperateProcess() } -void UtestShell::setOptRun() +void UtestShell::setRunIgnore() { - isOptRun_ = true; + runIgnore_ = true; } void UtestShell::setFileName(const char* fileName) @@ -651,7 +651,9 @@ IgnoredUtestShell::~IgnoredUtestShell() } bool IgnoredUtestShell::willRun() const -{ +{ + if (isRunIgnore()) return UtestShell::willRun(); + return false; } @@ -660,8 +662,14 @@ SimpleString IgnoredUtestShell::getMacroName() const return "IGNORE_TEST"; } -void IgnoredUtestShell::runOneTest(TestPlugin* /* plugin */, TestResult& result) +void IgnoredUtestShell::runOneTest(TestPlugin* plugin, TestResult& result) { + if (isRunIgnore()) + { + UtestShell::runOneTest(plugin, result); + return; + } + result.countIgnored(); } @@ -685,38 +693,3 @@ void TestInstaller::unDo() { TestRegistry::getCurrentRegistry()->unDoLastAddTest(); } - -OptRunUtestShell::OptRunUtestShell() -{ - -} -OptRunUtestShell::OptRunUtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber) : - IgnoredUtestShell(groupName, testName, fileName, lineNumber) -{ -} - -OptRunUtestShell::~OptRunUtestShell() -{ - -} -bool OptRunUtestShell::willRun() const -{ - if (isOptRun()) return UtestShell::willRun(); - - return IgnoredUtestShell::willRun(); -} - -void OptRunUtestShell::runOneTest(TestPlugin* plugin, TestResult& result) -{ - if (isOptRun()) - { - UtestShell::runOneTest(plugin, result); - return; - } - IgnoredUtestShell::runOneTest(plugin, result); -} - -SimpleString OptRunUtestShell::getMacroName() const -{ - return "OPTRUN_TEST"; -} diff --git a/tests/CommandLineArgumentsTest.cpp b/tests/CommandLineArgumentsTest.cpp index e4b359f8f..c03c55666 100755 --- a/tests/CommandLineArgumentsTest.cpp +++ b/tests/CommandLineArgumentsTest.cpp @@ -302,20 +302,6 @@ TEST(CommandLineArguments, setTestToRunUsingVerboseOutputOfIgnoreTest) CHECK_EQUAL(groupFilter, *args->getGroupFilters()); } -TEST(CommandLineArguments, setTestToRunUsingVerboseOutputOfOptRunTest) -{ - int argc = 2; - const char* argv[] = { "tests.exe", "OPTRUN_TEST(testgroup, testname) - stuff" }; - CHECK(newArgumentParser(argc, argv)); - - TestFilter nameFilter("testname"); - TestFilter groupFilter("testgroup"); - nameFilter.strictMatching(); - groupFilter.strictMatching(); - CHECK_EQUAL(nameFilter, *args->getNameFilters()); - CHECK_EQUAL(groupFilter, *args->getGroupFilters()); -} - TEST(CommandLineArguments, setNormalOutput) { int argc = 2; @@ -384,7 +370,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] [-optRun] [-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] [-runIgnore] [-r#] [-g|sg|xg|xsg groupName]... [-n|sn|xn|xsn testName]... [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", args->usage()); } @@ -442,8 +428,8 @@ TEST(CommandLineArguments, lastParameterFieldMissing) TEST(CommandLineArguments, setOptRun) { int argc = 2; - const char* argv[] = { "tests.exe", "-optRun"}; + const char* argv[] = { "tests.exe", "-runIgnore"}; CHECK(newArgumentParser(argc, argv)); - CHECK(args->isOptRun()); + CHECK(args->isRunIgnore()); } diff --git a/tests/CommandLineTestRunnerTest.cpp b/tests/CommandLineTestRunnerTest.cpp index 49e7025a1..a59f5f2d7 100755 --- a/tests/CommandLineTestRunnerTest.cpp +++ b/tests/CommandLineTestRunnerTest.cpp @@ -262,67 +262,62 @@ TEST(CommandLineTestRunner, realTeamCityOutputShouldBeCreatedAndWorkProperly) STRCMP_CONTAINS("##teamcity[testFinished name='test'", FakeOutput::console.asCharString()); STRCMP_CONTAINS("##teamcity[testSuiteFinished name='group'", FakeOutput::console.asCharString()); } -static bool bChecker = false; +static bool Checker = false; -class OptRunUtestForTest : public Utest +class RunIgnoreUtest : public Utest { public: void testBody() { - bChecker = true; + Checker = true; } }; -class optRunUtestShellForTest : public OptRunUtestShell +class RunIgnoreUtestShell : public IgnoredUtestShell { public: - optRunUtestShellForTest(const char* groupName, const char* testName, const char* fileName, int lineNumber) - : OptRunUtestShell(groupName, testName, fileName, lineNumber) {} - virtual Utest* createTest() _override { return new OptRunUtestForTest; } + RunIgnoreUtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber) + : IgnoredUtestShell(groupName, testName, fileName, lineNumber) {} + virtual Utest* createTest() _override { return new RunIgnoreUtest; } }; -TEST_GROUP(OptRunTestTests) +TEST_GROUP(RunIgnoreTest) { TestRegistry registry; - optRunUtestShellForTest *optRunTest_; + RunIgnoreUtestShell *runIgnoreTest; DummyPluginWhichCountsThePlugins* pluginCountingPlugin; void setup() { - optRunTest_ = new optRunUtestShellForTest("group", "test", "file", 1); - registry.addTest(optRunTest_); + runIgnoreTest = new RunIgnoreUtestShell("group", "test", "file", 1); + registry.addTest(runIgnoreTest); pluginCountingPlugin = new DummyPluginWhichCountsThePlugins("PluginCountingPlugin", ®istry); } void teardown() { delete pluginCountingPlugin; - delete optRunTest_; - bChecker = false; + delete runIgnoreTest; + Checker = false; } }; -TEST(OptRunTestTests, optRunWillBeIgnoredIfNoOptionSpecified) +TEST(RunIgnoreTest, IgnoreTestWillBeIgnoredIfNoOptionSpecified) { const char* argv[] = { "tests.exe" }; CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(1, argv, ®istry); commandLineTestRunner.runAllTestsMain(); - CHECK_FALSE( bChecker ); + CHECK_FALSE( Checker ); } -TEST(OptRunTestTests, optRunWillGetRunIfOptionSpecified) +TEST(RunIgnoreTest, IgnoreTestWillGetRunIfOptionSpecified) { - const char* argv[] = { "tests.exe", "-optRun" }; + const char* argv[] = { "tests.exe", "-runIgnore" }; CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); commandLineTestRunner.runAllTestsMain(); - CHECK_TRUE( bChecker ); -} - -OPTRUN_TEST(OptRunTestTests, ThisIsATestFromUserView) -{ - CHECK(0); + CHECK_TRUE( Checker ); } diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 0d42927b4..6e0349a17 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -1362,37 +1362,30 @@ TEST(IgnoreTest, printsIGNORE_TESTwhenVerbose) fixture.assertPrintContains("IGNORE_TEST"); } -TEST_GROUP(OptRunTest) +TEST_GROUP(OptRunIgnoredTest) { TestTestingFixture fixture; - OptRunUtestShell optRunTest; + IgnoredUtestShell optRunIgnoreTest; void setup() _override { - fixture.addTest(&optRunTest); + fixture.addTest(&optRunIgnoreTest); } }; -TEST(OptRunTest, optRunOptionSpecifiedThenIncreaseRunCount) +TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenIncreaseRunCount) { - optRunTest.setOptRun(); + optRunIgnoreTest.setRunIgnore(); fixture.runAllTests(); LONGS_EQUAL(2, fixture.getRunCount()); LONGS_EQUAL(0, fixture.getIgnoreCount()); }; -TEST(OptRunTest, optRunOptionNotSpecifiedThenIncreaseIgnoredCount) +TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenIncreaseIgnoredCount) { fixture.runAllTests(); LONGS_EQUAL(1, fixture.getRunCount()); LONGS_EQUAL(1, fixture.getIgnoreCount()); }; -TEST(OptRunTest, printsOPTRUN_TESTwhenVerbose) -{ - fixture.output_->verbose(); - fixture.runAllTests(); - fixture.assertPrintContains("OPTRUN_TEST"); -} - From e06bc357c4aaa0bdbab2724e4f348e9db97b3f98 Mon Sep 17 00:00:00 2001 From: Jerry Ryle Date: Sun, 20 Mar 2016 12:12:38 -0700 Subject: [PATCH 0119/1345] Updated the function pointer assertion with the new(ish) testTerminator parameter. --- include/CppUTest/Utest.h | 2 +- src/CppUTest/Utest.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 0df77867a..f29126385 100644 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -114,7 +114,7 @@ class UtestShell 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 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); + 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()); diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index b3f285e15..3219fab90 100644 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -431,11 +431,11 @@ void UtestShell::assertPointersEqual(const void* expected, const void* actual, c 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) +void UtestShell::assertFunctionPointersEqual(void (*expected)(), void (*actual)(), const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); if (expected != actual) - failWith(EqualsFailure(this, fileName, lineNumber, StringFrom(expected), StringFrom(actual), text)); + 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) From f71c240788f9ab255c7dfb3b54942bc1f39ff96a Mon Sep 17 00:00:00 2001 From: liu nick Date: Mon, 21 Mar 2016 09:24:33 +0000 Subject: [PATCH 0120/1345] delete extra ; --- tests/TestUTestMacro.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 6e0349a17..d3994b4a4 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -1371,7 +1371,7 @@ TEST_GROUP(OptRunIgnoredTest) { fixture.addTest(&optRunIgnoreTest); } -}; +} TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenIncreaseRunCount) { @@ -1379,13 +1379,13 @@ TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenIncreaseRunCount) fixture.runAllTests(); LONGS_EQUAL(2, fixture.getRunCount()); LONGS_EQUAL(0, fixture.getIgnoreCount()); -}; +} TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenIncreaseIgnoredCount) { fixture.runAllTests(); LONGS_EQUAL(1, fixture.getRunCount()); LONGS_EQUAL(1, fixture.getIgnoreCount()); -}; +} From 51ef55c2b64ee6f9dd403d4ff6bd9107d5145d2e Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 21 Mar 2016 10:41:28 +0100 Subject: [PATCH 0121/1345] Match test code to CppUTest conventions --- examples/AllTests/FEDemoTest.cpp | 23 +++++++---- tests/CppUTestExt/IEEE754PluginTest.cpp | 51 ++++++++++++++++--------- tests/CppUTestExt/IEEE754PluginTest_c.c | 21 ++++++---- 3 files changed, 63 insertions(+), 32 deletions(-) diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index ba4e7f4e4..26deb8fc1 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -46,8 +46,10 @@ extern "C" { static volatile float f; -TEST_GROUP(FE_Demo) { - void setup() { +TEST_GROUP(FE_Demo) +{ + void setup() + { IEEE754ExceptionsPlugin::disableInexact(); } }; @@ -58,30 +60,35 @@ TEST_GROUP(FE_Demo) { #define FAILING_TEST IGNORE_TEST #endif -FAILING_TEST(FE_Demo, should_fail_when__FE_DIVBYZERO__is_set) { +FAILING_TEST(FE_Demo, should_fail_when__FE_DIVBYZERO__is_set) +{ f = 1.0f; - CHECK((f /= 0.0f) >= std::numeric_limits::infinity() ); + CHECK((f /= 0.0f) >= std::numeric_limits::infinity()); } -FAILING_TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) { +FAILING_TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) +{ f = 0.01f; while (f > 0.0f) f *= f; CHECK(f == 0.0f); } -FAILING_TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) { +FAILING_TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) +{ f = 1000.0f; while (f < std::numeric_limits::infinity()) f *= f; CHECK(f >= std::numeric_limits::infinity()); } -FAILING_TEST(FE_Demo, should_fail_when__FE_INEXACT____is_set) { +FAILING_TEST(FE_Demo, should_fail_when__FE_INEXACT____is_set) +{ IEEE754ExceptionsPlugin::enableInexact(); f = 10.0f; DOUBLES_EQUAL(f / 3.0f, 3.333f, 0.001f); } -TEST(FE_Demo, should_succeed_when_no_flags_are_set) { +TEST(FE_Demo, should_succeed_when_no_flags_are_set) +{ CHECK(5.0f == 15.0f / 3.0f); } diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index 3f1e92ea1..b6b608aba 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -33,31 +33,37 @@ #if CPPUTEST_FENV_IS_WORKING_PROPERLY -extern "C" { +extern "C" +{ #include "IEEE754PluginTest_c.h" } -TEST_GROUP(FE__with_Plugin) { +TEST_GROUP(FE__with_Plugin) +{ TestTestingFixture fixture; IEEE754ExceptionsPlugin ieee754Plugin; - void setup(void) _override { + void setup(void) _override + { fixture.registry_->installPlugin(&ieee754Plugin); } }; -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"); @@ -69,20 +75,23 @@ TEST(FE__with_Plugin, should_fail____when__FE_UNDERFLOW__is_set) { #define NOT_MINGW64_TEST IGNORE_TEST #endif -NOT_MINGW64_TEST(FE__with_Plugin, should_fail____when__FE_INVALID____is_set) { +NOT_MINGW64_TEST(FE__with_Plugin, should_fail____when__FE_INVALID____is_set) +{ fixture.setTestFunction(set_invalid_c); fixture.runAllTests(); fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_INVALID) 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) +{ ieee754Plugin.enableInexact(); fixture.setTestFunction(set_inexact_c); fixture.runAllTests(); 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) +{ ieee754Plugin.enableInexact(); ieee754Plugin.disableInexact(); fixture.setTestFunction(set_inexact_c); @@ -90,7 +99,8 @@ 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) +{ ieee754Plugin.enableInexact(); fixture.setTestFunction(set_nothing_c); fixture.runAllTests(); @@ -98,24 +108,28 @@ TEST(FE__with_Plugin, should_succeed_with_5_checks_when_no_flags_are_set) { ieee754Plugin.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(); LONGS_EQUAL(1, fixture.getFailureCount()); } -static void set_everything_but_already_failed(void) { +static void set_everything_but_already_failed(void) +{ set_everything_c(); 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(); CHECK(ieee754Plugin.checkIeee754ExeptionFlag(0x04)); @@ -127,13 +141,16 @@ TEST(FE__with_Plugin, should_not_fail_again_when_test_has_already_failed) { static IEEE754ExceptionsPlugin ip; -TEST_GROUP(IEEE754ExceptionsPlugin2) { - void setup(void) _override { +TEST_GROUP(IEEE754ExceptionsPlugin2) +{ + void setup(void) _override + { TestRegistry::getCurrentRegistry()->installPlugin(&ip); } }; -IGNORE_TEST(IEEE754ExceptionsPlugin2, should_not_fail_in_ignored_test) { +IGNORE_TEST(IEEE754ExceptionsPlugin2, should_not_fail_in_ignored_test) +{ set_everything_c(); } diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.c b/tests/CppUTestExt/IEEE754PluginTest_c.c index e92ad0712..a856dc683 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.c +++ b/tests/CppUTestExt/IEEE754PluginTest_c.c @@ -30,34 +30,41 @@ static volatile float f; -void set_divisionbyzero_c(void) { +void set_divisionbyzero_c(void) +{ f = 1.0f; f /= 0.0f; } -void set_overflow_c(void) { +void set_overflow_c(void) +{ f = 1000.0f; while (f < INFINITY) f *= f; } -void set_underflow_c(void) { +void set_underflow_c(void) +{ f = 0.01f; while (f > 0.0f) f *= f; } -void set_invalid_c(void) { +void set_invalid_c(void) +{ f = (float) sqrt(-1.0f); } -void set_inexact_c(void) { +void set_inexact_c(void) +{ f = 10.0f; f /= 3.0f; } -void set_nothing_c(void) { +void set_nothing_c(void) +{ } -void set_everything_c() { +void set_everything_c() +{ set_divisionbyzero_c(); set_overflow_c(); set_underflow_c(); From a5de964b8720516398305de10afff2dcba310daa Mon Sep 17 00:00:00 2001 From: liu nick Date: Mon, 21 Mar 2016 09:44:15 +0000 Subject: [PATCH 0122/1345] add ; for group test --- tests/TestUTestMacro.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index d3994b4a4..570bea887 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -1371,7 +1371,7 @@ TEST_GROUP(OptRunIgnoredTest) { fixture.addTest(&optRunIgnoreTest); } -} +}; TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenIncreaseRunCount) { From 640fe65c0aa695e568f6b7bcf3919c7713db25ab Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 21 Mar 2016 16:59:45 +0100 Subject: [PATCH 0123/1345] Reshuffle Dos tests into 7 EXEs --- platforms/Dos/Makefile | 3 ++- platforms/Dos/sources.mk | 48 +++++++++++++++++++++------------------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/platforms/Dos/Makefile b/platforms/Dos/Makefile index cb0062b61..4b1150b09 100644 --- a/platforms/Dos/Makefile +++ b/platforms/Dos/Makefile @@ -29,7 +29,8 @@ CXXFLAGS := $(CFLAGS) -xds .PHONY: all clean -all: CPPU.LIB CPPUX.LIB CPPU1.EXE CPPU2.EXE CPPU3.EXE CPPU4.EXE CPPU5.EXE CPPU6.EXE +all: CPPU.LIB CPPUX.LIB CPPU1.EXE CPPU2.EXE CPPU3.EXE CPPU4.EXE \ + CPPU5.EXE CPPU6.EXE CPPU7.EXE clean: rm -rf ../src/CppUTest/*.o ../src/CppUTestExt/*.o \ diff --git a/platforms/Dos/sources.mk b/platforms/Dos/sources.mk index 1f085eebe..897f64858 100644 --- a/platforms/Dos/sources.mk +++ b/platforms/Dos/sources.mk @@ -43,36 +43,41 @@ CPPU1_OBJECTS := \ $(CPPUTEST_HOME)/tests/CommandLineArgumentsTest.o \ $(CPPUTEST_HOME)/tests/CommandLineTestRunnerTest.o \ $(CPPUTEST_HOME)/tests/JUnitOutputTest.o \ - $(CPPUTEST_HOME)/tests/TeamCityOutputTest.o \ + $(CPPUTEST_HOME)/tests/MemoryLeakWarningTest.o \ $(CPPUTEST_HOME)/tests/PluginTest.o \ $(CPPUTEST_HOME)/tests/PreprocessorTest.o \ $(CPPUTEST_HOME)/tests/SetPluginTest.o \ $(CPPUTEST_HOME)/tests/SimpleMutexTest.o \ + $(CPPUTEST_HOME)/tests/TeamCityOutputTest.o \ $(CPPUTEST_HOME)/tests/TestFailureNaNTest.o \ $(CPPUTEST_HOME)/tests/TestFailureTest.o \ - $(CPPUTEST_HOME)/tests/TestOutputTest.o \ - $(CPPUTEST_HOME)/tests/TestRegistryTest.o \ $(CPPUTEST_HOME)/tests/TestResultTest.o \ - $(CPPUTEST_HOME)/tests/UtestPlatformTest.o \ - $(CPPUTEST_HOME)/tests/UtestTest.o \ CPPU2_OBJECTS := \ + $(CPPUTEST_HOME)/tests/AllTests.o \ + $(CPPUTEST_HOME)/tests/MemoryLeakDetectorTest.o \ + $(CPPUTEST_HOME)/tests/SimpleStringTest.o \ + $(CPPUTEST_HOME)/tests/TestOutputTest.o \ + $(CPPUTEST_HOME)/tests/TestRegistryTest.o \ + +CPPU3_OBJECTS := \ $(CPPUTEST_HOME)/tests/AllTests.o \ $(CPPUTEST_HOME)/tests/AllocationInCFile.o \ $(CPPUTEST_HOME)/tests/AllocationInCppFile.o \ - $(CPPUTEST_HOME)/tests/MemoryLeakDetectorTest.o \ - $(CPPUTEST_HOME)/tests/MemoryLeakWarningTest.o \ $(CPPUTEST_HOME)/tests/MemoryOperatorOverloadTest.o \ - $(CPPUTEST_HOME)/tests/SimpleStringTest.o \ $(CPPUTEST_HOME)/tests/TeamCityOutputTest.o \ $(CPPUTEST_HOME)/tests/TestFilterTest.o \ $(CPPUTEST_HOME)/tests/TestHarness_cTest.o \ $(CPPUTEST_HOME)/tests/TestHarness_cTestCFile.o \ $(CPPUTEST_HOME)/tests/TestInstallerTest.o \ $(CPPUTEST_HOME)/tests/TestMemoryAllocatorTest.o \ + $(CPPUTEST_HOME)/tests/TestUTestMacro.o \ + $(CPPUTEST_HOME)/tests/UtestPlatformTest.o \ + $(CPPUTEST_HOME)/tests/UtestTest.o \ -CPPU3_OBJECTS := \ +CPPU4_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/ExpectedFunctionsListTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/GMockTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/GTest1Test.o \ @@ -84,40 +89,37 @@ CPPU3_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockCheatSheetTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockComparatorCopierTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockExpectedCallTest.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockHierarchyTest.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/MockReturnValueTest.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/OrderedTestTest.o \ -CPPU4_OBJECTS := \ - $(CPPUTEST_HOME)/tests/TestUTestMacro.o \ +CPPU5_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/MockReturnValueTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockNamedValueTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockPluginTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockSupport_cTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockSupport_cTestCFile.o \ -CPPU5_OBJECTS := \ +CPPU6_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/CodeMemoryReporterTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/ExpectedFunctionsListTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockCallTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockComparatorCopierTest.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockHierarchyTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockParameterTest.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/MockPluginTest.o \ -CPPU6_OBJECTS := \ + CPPU7_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/ExpectedFunctionsListTest.o \ + $(CPPUTEST_HOME)/tests/CppUTestExt/MockFailureReporterForTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/IEEE754PluginTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/IEEE754PluginTest_c.o \ - $(CPPUTEST_HOME)/tests/CppUTestExt/MockCallTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockComparatorCopierTest.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 \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockReturnValueTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockStrictOrderTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockSupportTest.o \ From bbf318bf22a8e0eb339baaab4c89a5e542f740dc Mon Sep 17 00:00:00 2001 From: liu nick Date: Tue, 22 Mar 2016 06:09:41 +0000 Subject: [PATCH 0124/1345] change -runIgnore to -ri --- include/CppUTest/CommandLineArguments.h | 2 +- include/CppUTest/TestRegistry.h | 4 ++-- include/CppUTest/TestTestingFixture.h | 8 ++++---- include/CppUTest/Utest.h | 6 +++--- src/CppUTest/CommandLineArguments.cpp | 4 ++-- src/CppUTest/CommandLineTestRunner.cpp | 2 +- src/CppUTest/TestRegistry.cpp | 2 +- tests/CommandLineArgumentsTest.cpp | 4 ++-- tests/CommandLineTestRunnerTest.cpp | 2 +- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index adf591121..f53a02243 100755 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -45,7 +45,7 @@ class CommandLineArguments bool isColor() const; bool isListingTestGroupNames() const; bool isListingTestGroupAndCaseNames() const; - bool isRunIgnore() const; + bool isRunIgnore() const; int getRepeatCount() const; const TestFilter* getGroupFilters() const; const TestFilter* getNameFilters() const; diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index 9f61cd1b0..799cab501 100755 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -72,7 +72,7 @@ class TestRegistry virtual void setRunTestsInSeperateProcess(); int getCurrentRepetition(); - void setRunIgnore(); + void setRunIgnore(); private: bool testShouldRun(UtestShell* test, TestResult& result); @@ -85,7 +85,7 @@ class TestRegistry static TestRegistry* currentRegistry_; bool runInSeperateProcess_; int currentRepetition_; - bool runIgnore_; + bool runIgnore_; }; #endif diff --git a/include/CppUTest/TestTestingFixture.h b/include/CppUTest/TestTestingFixture.h index 7f5e51456..3f65ad29b 100755 --- a/include/CppUTest/TestTestingFixture.h +++ b/include/CppUTest/TestTestingFixture.h @@ -116,10 +116,10 @@ class TestTestingFixture } - int getRunCount() - { - return result_->getRunCount(); - } + int getRunCount() + { + return result_->getRunCount(); + } TestRegistry* registry_; diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index f412393c6..dfae3a419 100755 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -103,7 +103,7 @@ class UtestShell int getLineNumber() const; virtual bool willRun() const; virtual bool hasFailed() const; - bool isRunIgnore() const; + bool isRunIgnore() 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()); @@ -138,7 +138,7 @@ class UtestShell virtual bool isRunInSeperateProcess() const; virtual void setRunInSeperateProcess(); - void setRunIgnore(); + void setRunIgnore(); virtual Utest* createTest(); virtual void destroyTest(Utest* test); @@ -163,7 +163,7 @@ class UtestShell UtestShell *next_; bool isRunAsSeperateProcess_; bool hasFailed_; - bool runIgnore_; + bool runIgnore_; void setTestResult(TestResult* result); void setCurrentTest(UtestShell* test); diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index fe706dc9e..40d25e1ed 100755 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -59,7 +59,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument == "-p") runTestsAsSeperateProcess_ = true; else if (argument == "-lg") listTestGroupNames_ = true; else if (argument == "-ln") listTestGroupAndCaseNames_ = true; - else if (argument == "-runIgnore") runIgnore_ = true; + else if (argument == "-ri") runIgnore_ = 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); @@ -85,7 +85,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) const char* CommandLineArguments::usage() const { - return "usage [-v] [-c] [-p] [-lg] [-ln] [-runIgnore] [-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]... [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n"; } bool CommandLineArguments::isVerbose() const diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 45cb941f7..d55873d78 100755 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -92,7 +92,7 @@ void CommandLineTestRunner::initializeTestRun() if (arguments_->isVerbose()) output_->verbose(); if (arguments_->isColor()) output_->color(); if (arguments_->runTestsInSeperateProcess()) registry_->setRunTestsInSeperateProcess(); - if (arguments_->isRunIgnore()) registry_->setRunIgnore(); + if (arguments_->isRunIgnore()) registry_->setRunIgnore(); } int CommandLineTestRunner::runAllTests() diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index a4edcdc73..61513e063 100755 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -50,7 +50,7 @@ void TestRegistry::runAllTests(TestResult& result) result.testsStarted(); for (UtestShell *test = tests_; test != NULL; test = test->getNext()) { if (runInSeperateProcess_) test->setRunInSeperateProcess(); - if (runIgnore_) test->setRunIgnore(); + if (runIgnore_) test->setRunIgnore(); if (groupStart) { result.currentGroupStarted(test); diff --git a/tests/CommandLineArgumentsTest.cpp b/tests/CommandLineArgumentsTest.cpp index c03c55666..65e70aef3 100755 --- a/tests/CommandLineArgumentsTest.cpp +++ b/tests/CommandLineArgumentsTest.cpp @@ -370,7 +370,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] [-runIgnore] [-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]... [\"TEST(groupName, testName)\"]... [-o{normal, junit, teamcity}] [-k packageName]\n", args->usage()); } @@ -428,7 +428,7 @@ TEST(CommandLineArguments, lastParameterFieldMissing) TEST(CommandLineArguments, setOptRun) { int argc = 2; - const char* argv[] = { "tests.exe", "-runIgnore"}; + const char* argv[] = { "tests.exe", "-ri"}; CHECK(newArgumentParser(argc, argv)); CHECK(args->isRunIgnore()); } diff --git a/tests/CommandLineTestRunnerTest.cpp b/tests/CommandLineTestRunnerTest.cpp index a59f5f2d7..2438756da 100755 --- a/tests/CommandLineTestRunnerTest.cpp +++ b/tests/CommandLineTestRunnerTest.cpp @@ -313,7 +313,7 @@ TEST(RunIgnoreTest, IgnoreTestWillBeIgnoredIfNoOptionSpecified) TEST(RunIgnoreTest, IgnoreTestWillGetRunIfOptionSpecified) { - const char* argv[] = { "tests.exe", "-runIgnore" }; + const char* argv[] = { "tests.exe", "-ri" }; CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); commandLineTestRunner.runAllTestsMain(); From e462ab4b53ab906319adb40fd0d238b2f225ffe5 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Tue, 22 Mar 2016 17:54:16 +0100 Subject: [PATCH 0125/1345] Use static calls - instance might be in main() --- tests/CppUTestExt/IEEE754PluginTest.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index b6b608aba..d360e8767 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -84,7 +84,7 @@ NOT_MINGW64_TEST(FE__with_Plugin, should_fail____when__FE_INVALID____is_set) TEST(FE__with_Plugin, should_fail____when__FE_INEXACT____is_set_and_enabled) { - ieee754Plugin.enableInexact(); + IEEE754ExceptionsPlugin::enableInexact(); fixture.setTestFunction(set_inexact_c); fixture.runAllTests(); fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_INEXACT) failed"); @@ -92,8 +92,8 @@ TEST(FE__with_Plugin, should_fail____when__FE_INEXACT____is_set_and_enabled) TEST(FE__with_Plugin, should_succeed_when__FE_INEXACT____is_set_and_disabled) { - ieee754Plugin.enableInexact(); - ieee754Plugin.disableInexact(); + IEEE754ExceptionsPlugin::enableInexact(); + IEEE754ExceptionsPlugin::disableInexact(); fixture.setTestFunction(set_inexact_c); fixture.runAllTests(); fixture.assertPrintContains("OK"); @@ -101,11 +101,11 @@ TEST(FE__with_Plugin, should_succeed_when__FE_INEXACT____is_set_and_disabled) TEST(FE__with_Plugin, should_succeed_with_5_checks_when_no_flags_are_set) { - ieee754Plugin.enableInexact(); + IEEE754ExceptionsPlugin::enableInexact(); fixture.setTestFunction(set_nothing_c); fixture.runAllTests(); fixture.assertPrintContains("OK (1 tests, 1 ran, 5 checks, 0 ignored, 0 filtered out"); - ieee754Plugin.disableInexact(); + IEEE754ExceptionsPlugin::disableInexact(); } TEST(FE__with_Plugin, should_check_five_times_when_all_flags_are_set) @@ -132,9 +132,9 @@ TEST(FE__with_Plugin, should_not_fail_again_when_test_has_already_failed) { fixture.setTestFunction(set_everything_but_already_failed); fixture.runAllTests(); - CHECK(ieee754Plugin.checkIeee754ExeptionFlag(0x04)); - CHECK(ieee754Plugin.checkIeee754ExeptionFlag(0x08)); - CHECK(ieee754Plugin.checkIeee754ExeptionFlag(0x10)); + CHECK(IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(0x04)); + CHECK(IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(0x08)); + CHECK(IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(0x10)); LONGS_EQUAL(1, fixture.getCheckCount()); LONGS_EQUAL(1, fixture.getFailureCount()); } From 493342553a6b33dcb538ced578c3e4c32352c922 Mon Sep 17 00:00:00 2001 From: liu nick Date: Thu, 24 Mar 2016 03:24:04 +0000 Subject: [PATCH 0126/1345] refactory and formatt output --- include/CppUTest/CommandLineArguments.h | 2 +- include/CppUTest/Utest.h | 11 +++++----- src/CppUTest/CommandLineArguments.cpp | 2 +- src/CppUTest/TestRegistry.cpp | 2 +- src/CppUTest/Utest.cpp | 28 +++++++++++++------------ tests/CommandLineArgumentsTest.cpp | 1 + tests/CommandLineTestRunnerTest.cpp | 3 +++ tests/TestUTestMacro.cpp | 28 +++++++++++++++++++++++++ 8 files changed, 56 insertions(+), 21 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index f53a02243..10702c568 100755 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -70,7 +70,7 @@ class CommandLineArguments bool runTestsAsSeperateProcess_; bool listTestGroupNames_; bool listTestGroupAndCaseNames_; - bool runIgnore_; + bool runIgnore_; int repeat_; TestFilter* groupFilters_; TestFilter* nameFilters_; diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index dfae3a419..e7bc0c89c 100755 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -103,7 +103,6 @@ class UtestShell int getLineNumber() const; virtual bool willRun() const; virtual bool hasFailed() const; - bool isRunIgnore() 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()); @@ -138,7 +137,7 @@ class UtestShell virtual bool isRunInSeperateProcess() const; virtual void setRunInSeperateProcess(); - void setRunIgnore(); + virtual void setRunIgnore(); virtual Utest* createTest(); virtual void destroyTest(Utest* test); @@ -163,7 +162,6 @@ class UtestShell UtestShell *next_; bool isRunAsSeperateProcess_; bool hasFailed_; - bool runIgnore_; void setTestResult(TestResult* result); void setCurrentTest(UtestShell* test); @@ -227,13 +225,16 @@ class IgnoredUtestShell : public UtestShell explicit IgnoredUtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber); virtual bool willRun() const _override; - protected: virtual SimpleString getMacroName() const _override; + virtual void setRunIgnore() _override; +protected: + virtual SimpleString getMacroName() const _override; virtual void runOneTest(TestPlugin* plugin, TestResult& result) _override; - private: IgnoredUtestShell(const IgnoredUtestShell&); IgnoredUtestShell& operator=(const IgnoredUtestShell&); + + bool runIgnore_; }; diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 40d25e1ed..6118b7d69 100755 --- a/src/CppUTest/CommandLineArguments.cpp +++ b/src/CppUTest/CommandLineArguments.cpp @@ -110,7 +110,7 @@ bool CommandLineArguments::isListingTestGroupAndCaseNames() const bool CommandLineArguments::isRunIgnore() const { - return runIgnore_; + return runIgnore_; } bool CommandLineArguments::runTestsInSeperateProcess() const diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 61513e063..5afce1df6 100755 --- a/src/CppUTest/TestRegistry.cpp +++ b/src/CppUTest/TestRegistry.cpp @@ -164,7 +164,7 @@ void TestRegistry::setGroupFilters(const TestFilter* filters) void TestRegistry::setRunIgnore() { - runIgnore_ = true; + runIgnore_ = true; } void TestRegistry::setRunTestsInSeperateProcess() diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index d0e5bb586..1c53c820a 100755 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -132,17 +132,17 @@ extern "C" { /******************************** */ UtestShell::UtestShell() : - group_("UndefinedTestGroup"), name_("UndefinedTest"), file_("UndefinedFile"), lineNumber_(0), next_(NULL), isRunAsSeperateProcess_(false), hasFailed_(false), runIgnore_(false) + group_("UndefinedTestGroup"), name_("UndefinedTest"), file_("UndefinedFile"), lineNumber_(0), next_(NULL), 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), runIgnore_(false) + group_(groupName), name_(testName), file_(fileName), lineNumber_(lineNumber), next_(NULL), isRunAsSeperateProcess_(false), hasFailed_(false) { } UtestShell::UtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber, UtestShell* nextTest) : - group_(groupName), name_(testName), file_(fileName), lineNumber_(lineNumber), next_(nextTest), isRunAsSeperateProcess_(false), hasFailed_(false), runIgnore_(false) + group_(groupName), name_(testName), file_(fileName), lineNumber_(lineNumber), next_(nextTest), isRunAsSeperateProcess_(false), hasFailed_(false) { } @@ -264,11 +264,6 @@ bool UtestShell::hasFailed() const return hasFailed_; } -bool UtestShell::isRunIgnore() const -{ - return runIgnore_; -} - void UtestShell::countCheck() { getTestResult()->countCheck(); @@ -292,7 +287,7 @@ void UtestShell::setRunInSeperateProcess() void UtestShell::setRunIgnore() { - runIgnore_ = true; + } void UtestShell::setFileName(const char* fileName) @@ -637,12 +632,12 @@ void ExecFunctionTest::teardown() } /////////////// IgnoredUtestShell ///////////// -IgnoredUtestShell::IgnoredUtestShell() +IgnoredUtestShell::IgnoredUtestShell(): runIgnore_(false) { } IgnoredUtestShell::IgnoredUtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber) : - UtestShell(groupName, testName, fileName, lineNumber) + UtestShell(groupName, testName, fileName, lineNumber), runIgnore_(false) { } @@ -652,19 +647,21 @@ IgnoredUtestShell::~IgnoredUtestShell() bool IgnoredUtestShell::willRun() const { - if (isRunIgnore()) return UtestShell::willRun(); + if (runIgnore_) return UtestShell::willRun(); return false; } SimpleString IgnoredUtestShell::getMacroName() const { + if (runIgnore_) return "TEST"; + return "IGNORE_TEST"; } void IgnoredUtestShell::runOneTest(TestPlugin* plugin, TestResult& result) { - if (isRunIgnore()) + if (runIgnore_) { UtestShell::runOneTest(plugin, result); return; @@ -673,6 +670,11 @@ void IgnoredUtestShell::runOneTest(TestPlugin* plugin, TestResult& result) result.countIgnored(); } +void IgnoredUtestShell::setRunIgnore() +{ + runIgnore_ = true; +} + ////////////// TestInstaller //////////// diff --git a/tests/CommandLineArgumentsTest.cpp b/tests/CommandLineArgumentsTest.cpp index 65e70aef3..a74d39636 100755 --- a/tests/CommandLineArgumentsTest.cpp +++ b/tests/CommandLineArgumentsTest.cpp @@ -383,6 +383,7 @@ TEST(CommandLineArguments, pluginKnowsOption) TestRegistry::getCurrentRegistry()->removePluginByName("options"); } + TEST(CommandLineArguments, checkDefaultArguments) { int argc = 1; diff --git a/tests/CommandLineTestRunnerTest.cpp b/tests/CommandLineTestRunnerTest.cpp index 2438756da..6c519e6c0 100755 --- a/tests/CommandLineTestRunnerTest.cpp +++ b/tests/CommandLineTestRunnerTest.cpp @@ -264,6 +264,8 @@ TEST(CommandLineTestRunner, realTeamCityOutputShouldBeCreatedAndWorkProperly) } static bool Checker = false; + + class RunIgnoreUtest : public Utest { public: @@ -273,6 +275,7 @@ class RunIgnoreUtest : public Utest } }; + class RunIgnoreUtestShell : public IgnoredUtestShell { public: diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 570bea887..58fb91a8c 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -1389,3 +1389,31 @@ TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenIncreaseIgnoredCount) } +TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenReturnTESTInFormattedName) +{ + optRunIgnoreTest.setGroupName("TestGroup"); + optRunIgnoreTest.setTestName("TestName"); + optRunIgnoreTest.setRunIgnore(); + fixture.runAllTests(); + STRCMP_EQUAL("TEST(TestGroup, TestName)", optRunIgnoreTest.getFormattedName().asCharString()); +} + +TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenReturnIGNORETESTInFormattedName) +{ + optRunIgnoreTest.setGroupName("TestGroup"); + optRunIgnoreTest.setTestName("TestName"); + fixture.runAllTests(); + STRCMP_EQUAL("IGNORE_TEST(TestGroup, TestName)", optRunIgnoreTest.getFormattedName().asCharString()); +} + +TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenWillRunReturnFalse) +{ + CHECK_FALSE(optRunIgnoreTest.willRun()); +} + +TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenWillRunReturnTrue) +{ + optRunIgnoreTest.setRunIgnore(); + CHECK_TRUE(optRunIgnoreTest.willRun()); +} + From 9a9d9de25d6ef77e7a094c7ebb8f5b6134b71a55 Mon Sep 17 00:00:00 2001 From: liu nick Date: Thu, 24 Mar 2016 03:33:11 +0000 Subject: [PATCH 0127/1345] formatting correct --- 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 1c53c820a..1a43a6898 100755 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -647,7 +647,7 @@ IgnoredUtestShell::~IgnoredUtestShell() bool IgnoredUtestShell::willRun() const { - if (runIgnore_) return UtestShell::willRun(); + if (runIgnore_) return UtestShell::willRun(); return false; } From e974f11aad12de99d7cde2cc4e25650bb18ee91e Mon Sep 17 00:00:00 2001 From: liu nick Date: Thu, 24 Mar 2016 05:38:19 +0000 Subject: [PATCH 0128/1345] add test and change ignore to ignored --- include/CppUTest/CommandLineArguments.h | 4 +-- include/CppUTest/TestRegistry.h | 4 +-- include/CppUTest/Utest.h | 6 ++-- src/CppUTest/CommandLineArguments.cpp | 8 ++--- src/CppUTest/CommandLineTestRunner.cpp | 2 +- src/CppUTest/TestRegistry.cpp | 8 ++--- src/CppUTest/Utest.cpp | 16 +++++----- tests/CommandLineArgumentsTest.cpp | 2 +- tests/CommandLineTestRunnerTest.cpp | 32 ++++++++++---------- tests/TestUTestMacro.cpp | 39 +++++++++++++++---------- 10 files changed, 65 insertions(+), 56 deletions(-) diff --git a/include/CppUTest/CommandLineArguments.h b/include/CppUTest/CommandLineArguments.h index 10702c568..95cc0d7bb 100755 --- a/include/CppUTest/CommandLineArguments.h +++ b/include/CppUTest/CommandLineArguments.h @@ -45,7 +45,7 @@ class CommandLineArguments bool isColor() const; bool isListingTestGroupNames() const; bool isListingTestGroupAndCaseNames() const; - bool isRunIgnore() const; + bool isRunIgnored() const; int getRepeatCount() const; const TestFilter* getGroupFilters() const; const TestFilter* getNameFilters() const; @@ -70,7 +70,7 @@ class CommandLineArguments bool runTestsAsSeperateProcess_; bool listTestGroupNames_; bool listTestGroupAndCaseNames_; - bool runIgnore_; + bool runIgnored_; int repeat_; TestFilter* groupFilters_; TestFilter* nameFilters_; diff --git a/include/CppUTest/TestRegistry.h b/include/CppUTest/TestRegistry.h index 799cab501..c451d8467 100755 --- a/include/CppUTest/TestRegistry.h +++ b/include/CppUTest/TestRegistry.h @@ -72,7 +72,7 @@ class TestRegistry virtual void setRunTestsInSeperateProcess(); int getCurrentRepetition(); - void setRunIgnore(); + void setRunIgnored(); private: bool testShouldRun(UtestShell* test, TestResult& result); @@ -85,7 +85,7 @@ class TestRegistry static TestRegistry* currentRegistry_; bool runInSeperateProcess_; int currentRepetition_; - bool runIgnore_; + bool runIgnored_; }; #endif diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index e7bc0c89c..acadd7086 100755 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -137,7 +137,7 @@ class UtestShell virtual bool isRunInSeperateProcess() const; virtual void setRunInSeperateProcess(); - virtual void setRunIgnore(); + virtual void setRunIgnored(); virtual Utest* createTest(); virtual void destroyTest(Utest* test); @@ -225,7 +225,7 @@ class IgnoredUtestShell : public UtestShell explicit IgnoredUtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber); virtual bool willRun() const _override; - virtual void setRunIgnore() _override; + virtual void setRunIgnored() _override; protected: virtual SimpleString getMacroName() const _override; virtual void runOneTest(TestPlugin* plugin, TestResult& result) _override; @@ -234,7 +234,7 @@ class IgnoredUtestShell : public UtestShell IgnoredUtestShell(const IgnoredUtestShell&); IgnoredUtestShell& operator=(const IgnoredUtestShell&); - bool runIgnore_; + bool runIgnored_; }; diff --git a/src/CppUTest/CommandLineArguments.cpp b/src/CppUTest/CommandLineArguments.cpp index 6118b7d69..e0b993bcd 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** av) : - ac_(ac), av_(av), verbose_(false), color_(false), runTestsAsSeperateProcess_(false), listTestGroupNames_(false), listTestGroupAndCaseNames_(false), runIgnore_(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_(NULL), nameFilters_(NULL), outputType_(OUTPUT_ECLIPSE) { } @@ -59,7 +59,7 @@ bool CommandLineArguments::parse(TestPlugin* plugin) else if (argument == "-p") runTestsAsSeperateProcess_ = true; else if (argument == "-lg") listTestGroupNames_ = true; else if (argument == "-ln") listTestGroupAndCaseNames_ = true; - else if (argument == "-ri") runIgnore_ = 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); @@ -108,9 +108,9 @@ bool CommandLineArguments::isListingTestGroupAndCaseNames() const return listTestGroupAndCaseNames_; } -bool CommandLineArguments::isRunIgnore() const +bool CommandLineArguments::isRunIgnored() const { - return runIgnore_; + return runIgnored_; } bool CommandLineArguments::runTestsInSeperateProcess() const diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index d55873d78..43d2dec5c 100755 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -92,7 +92,7 @@ void CommandLineTestRunner::initializeTestRun() if (arguments_->isVerbose()) output_->verbose(); if (arguments_->isColor()) output_->color(); if (arguments_->runTestsInSeperateProcess()) registry_->setRunTestsInSeperateProcess(); - if (arguments_->isRunIgnore()) registry_->setRunIgnore(); + if (arguments_->isRunIgnored()) registry_->setRunIgnored(); } int CommandLineTestRunner::runAllTests() diff --git a/src/CppUTest/TestRegistry.cpp b/src/CppUTest/TestRegistry.cpp index 5afce1df6..26c049859 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), runIgnore_(false) + tests_(NULL), nameFilters_(NULL), groupFilters_(NULL), firstPlugin_(NullTestPlugin::instance()), runInSeperateProcess_(false), currentRepetition_(0), runIgnored_(false) { } @@ -50,7 +50,7 @@ void TestRegistry::runAllTests(TestResult& result) result.testsStarted(); for (UtestShell *test = tests_; test != NULL; test = test->getNext()) { if (runInSeperateProcess_) test->setRunInSeperateProcess(); - if (runIgnore_) test->setRunIgnore(); + if (runIgnored_) test->setRunIgnored(); if (groupStart) { result.currentGroupStarted(test); @@ -162,9 +162,9 @@ void TestRegistry::setGroupFilters(const TestFilter* filters) groupFilters_ = filters; } -void TestRegistry::setRunIgnore() +void TestRegistry::setRunIgnored() { - runIgnore_ = true; + runIgnored_ = true; } void TestRegistry::setRunTestsInSeperateProcess() diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 1a43a6898..4dc2b549a 100755 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -285,7 +285,7 @@ void UtestShell::setRunInSeperateProcess() } -void UtestShell::setRunIgnore() +void UtestShell::setRunIgnored() { } @@ -632,12 +632,12 @@ void ExecFunctionTest::teardown() } /////////////// IgnoredUtestShell ///////////// -IgnoredUtestShell::IgnoredUtestShell(): runIgnore_(false) +IgnoredUtestShell::IgnoredUtestShell(): runIgnored_(false) { } IgnoredUtestShell::IgnoredUtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber) : - UtestShell(groupName, testName, fileName, lineNumber), runIgnore_(false) + UtestShell(groupName, testName, fileName, lineNumber), runIgnored_(false) { } @@ -647,21 +647,21 @@ IgnoredUtestShell::~IgnoredUtestShell() bool IgnoredUtestShell::willRun() const { - if (runIgnore_) return UtestShell::willRun(); + if (runIgnored_) return UtestShell::willRun(); return false; } SimpleString IgnoredUtestShell::getMacroName() const { - if (runIgnore_) return "TEST"; + if (runIgnored_) return "TEST"; return "IGNORE_TEST"; } void IgnoredUtestShell::runOneTest(TestPlugin* plugin, TestResult& result) { - if (runIgnore_) + if (runIgnored_) { UtestShell::runOneTest(plugin, result); return; @@ -670,9 +670,9 @@ void IgnoredUtestShell::runOneTest(TestPlugin* plugin, TestResult& result) result.countIgnored(); } -void IgnoredUtestShell::setRunIgnore() +void IgnoredUtestShell::setRunIgnored() { - runIgnore_ = true; + runIgnored_ = true; } diff --git a/tests/CommandLineArgumentsTest.cpp b/tests/CommandLineArgumentsTest.cpp index a74d39636..c2d5dd537 100755 --- a/tests/CommandLineArgumentsTest.cpp +++ b/tests/CommandLineArgumentsTest.cpp @@ -431,6 +431,6 @@ TEST(CommandLineArguments, setOptRun) int argc = 2; const char* argv[] = { "tests.exe", "-ri"}; CHECK(newArgumentParser(argc, argv)); - CHECK(args->isRunIgnore()); + CHECK(args->isRunIgnored()); } diff --git a/tests/CommandLineTestRunnerTest.cpp b/tests/CommandLineTestRunnerTest.cpp index 6c519e6c0..e514c67ef 100755 --- a/tests/CommandLineTestRunnerTest.cpp +++ b/tests/CommandLineTestRunnerTest.cpp @@ -262,65 +262,65 @@ TEST(CommandLineTestRunner, realTeamCityOutputShouldBeCreatedAndWorkProperly) STRCMP_CONTAINS("##teamcity[testFinished name='test'", FakeOutput::console.asCharString()); STRCMP_CONTAINS("##teamcity[testSuiteFinished name='group'", FakeOutput::console.asCharString()); } -static bool Checker = false; - -class RunIgnoreUtest : public Utest +class RunIgnoredUtest : public Utest { public: + static bool Checker; void testBody() { Checker = true; } }; +bool RunIgnoredUtest::Checker = false; -class RunIgnoreUtestShell : public IgnoredUtestShell +class RunIgnoredUtestShell : public IgnoredUtestShell { public: - RunIgnoreUtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber) + RunIgnoredUtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber) : IgnoredUtestShell(groupName, testName, fileName, lineNumber) {} - virtual Utest* createTest() _override { return new RunIgnoreUtest; } + virtual Utest* createTest() _override { return new RunIgnoredUtest; } }; -TEST_GROUP(RunIgnoreTest) +TEST_GROUP(RunIgnoredTest) { TestRegistry registry; - RunIgnoreUtestShell *runIgnoreTest; + RunIgnoredUtestShell *runIgnoredTest; DummyPluginWhichCountsThePlugins* pluginCountingPlugin; void setup() { - runIgnoreTest = new RunIgnoreUtestShell("group", "test", "file", 1); - registry.addTest(runIgnoreTest); + runIgnoredTest = new RunIgnoredUtestShell("group", "test", "file", 1); + registry.addTest(runIgnoredTest); pluginCountingPlugin = new DummyPluginWhichCountsThePlugins("PluginCountingPlugin", ®istry); } void teardown() { delete pluginCountingPlugin; - delete runIgnoreTest; - Checker = false; + delete runIgnoredTest; + RunIgnoredUtest::Checker = false; } }; -TEST(RunIgnoreTest, IgnoreTestWillBeIgnoredIfNoOptionSpecified) +TEST(RunIgnoredTest, IgnoreTestWillBeIgnoredIfNoOptionSpecified) { const char* argv[] = { "tests.exe" }; CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(1, argv, ®istry); commandLineTestRunner.runAllTestsMain(); - CHECK_FALSE( Checker ); + CHECK_FALSE( RunIgnoredUtest::Checker ); } -TEST(RunIgnoreTest, IgnoreTestWillGetRunIfOptionSpecified) +TEST(RunIgnoredTest, IgnoreTestWillGetRunIfOptionSpecified) { const char* argv[] = { "tests.exe", "-ri" }; CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); commandLineTestRunner.runAllTestsMain(); - CHECK_TRUE( Checker ); + CHECK_TRUE( RunIgnoredUtest::Checker ); } diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 58fb91a8c..394f7fdd8 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -1365,55 +1365,64 @@ TEST(IgnoreTest, printsIGNORE_TESTwhenVerbose) TEST_GROUP(OptRunIgnoredTest) { TestTestingFixture fixture; - IgnoredUtestShell optRunIgnoreTest; + IgnoredUtestShell optRunIgnoredTest; + ExecFunctionTestShell normalUtestShell; void setup() _override { - fixture.addTest(&optRunIgnoreTest); + fixture.addTest(&optRunIgnoredTest); + fixture.addTest(&normalUtestShell); } }; TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenIncreaseRunCount) { - optRunIgnoreTest.setRunIgnore(); + optRunIgnoredTest.setRunIgnored(); fixture.runAllTests(); - LONGS_EQUAL(2, fixture.getRunCount()); + LONGS_EQUAL(3, fixture.getRunCount()); LONGS_EQUAL(0, fixture.getIgnoreCount()); } TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenIncreaseIgnoredCount) { fixture.runAllTests(); - LONGS_EQUAL(1, fixture.getRunCount()); + LONGS_EQUAL(2, fixture.getRunCount()); LONGS_EQUAL(1, fixture.getIgnoreCount()); } +TEST(OptRunIgnoredTest, optRunOptionSpecifiedWillNotInfluenceNormalTestCount) +{ + normalUtestShell.setRunIgnored(); + fixture.runAllTests(); + LONGS_EQUAL(2, fixture.getRunCount()); + LONGS_EQUAL(1, fixture.getIgnoreCount()); +} TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenReturnTESTInFormattedName) { - optRunIgnoreTest.setGroupName("TestGroup"); - optRunIgnoreTest.setTestName("TestName"); - optRunIgnoreTest.setRunIgnore(); + optRunIgnoredTest.setGroupName("TestGroup"); + optRunIgnoredTest.setTestName("TestName"); + optRunIgnoredTest.setRunIgnored(); fixture.runAllTests(); - STRCMP_EQUAL("TEST(TestGroup, TestName)", optRunIgnoreTest.getFormattedName().asCharString()); + STRCMP_EQUAL("TEST(TestGroup, TestName)", optRunIgnoredTest.getFormattedName().asCharString()); } TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenReturnIGNORETESTInFormattedName) { - optRunIgnoreTest.setGroupName("TestGroup"); - optRunIgnoreTest.setTestName("TestName"); + optRunIgnoredTest.setGroupName("TestGroup"); + optRunIgnoredTest.setTestName("TestName"); fixture.runAllTests(); - STRCMP_EQUAL("IGNORE_TEST(TestGroup, TestName)", optRunIgnoreTest.getFormattedName().asCharString()); + STRCMP_EQUAL("IGNORE_TEST(TestGroup, TestName)", optRunIgnoredTest.getFormattedName().asCharString()); } TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenWillRunReturnFalse) { - CHECK_FALSE(optRunIgnoreTest.willRun()); + CHECK_FALSE(optRunIgnoredTest.willRun()); } TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenWillRunReturnTrue) { - optRunIgnoreTest.setRunIgnore(); - CHECK_TRUE(optRunIgnoreTest.willRun()); + optRunIgnoredTest.setRunIgnored(); + CHECK_TRUE(optRunIgnoredTest.willRun()); } From 577e4a23662e49139eac1f47cee22eb8605bff3f Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 24 Mar 2016 09:26:42 +0100 Subject: [PATCH 0129/1345] Move IgnoredUtestShell tests to UtestTest.cpp --- tests/TestUTestMacro.cpp | 89 ---------------------------------------- tests/UtestTest.cpp | 81 ++++++++++++++++++++++++++++++++++-- 2 files changed, 77 insertions(+), 93 deletions(-) diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 394f7fdd8..c6300b28d 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -1337,92 +1337,3 @@ TEST(UnitTestMacros, MultipleCHECK_THROWS_inOneScope) CHECK_THROWS(int, throw 4); } #endif - -TEST_GROUP(IgnoreTest) -{ - TestTestingFixture fixture; - IgnoredUtestShell ignoreTest; - - void setup() _override - { - fixture.addTest(&ignoreTest); - } -}; - -TEST(IgnoreTest, doesIgnoreCount) -{ - fixture.runAllTests(); - LONGS_EQUAL(1, fixture.getIgnoreCount()); -} - -TEST(IgnoreTest, printsIGNORE_TESTwhenVerbose) -{ - fixture.output_->verbose(); - fixture.runAllTests(); - fixture.assertPrintContains("IGNORE_TEST"); -} - -TEST_GROUP(OptRunIgnoredTest) -{ - TestTestingFixture fixture; - IgnoredUtestShell optRunIgnoredTest; - ExecFunctionTestShell normalUtestShell; - - void setup() _override - { - fixture.addTest(&optRunIgnoredTest); - fixture.addTest(&normalUtestShell); - } -}; - -TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenIncreaseRunCount) -{ - optRunIgnoredTest.setRunIgnored(); - fixture.runAllTests(); - LONGS_EQUAL(3, fixture.getRunCount()); - LONGS_EQUAL(0, fixture.getIgnoreCount()); -} - -TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenIncreaseIgnoredCount) -{ - fixture.runAllTests(); - LONGS_EQUAL(2, fixture.getRunCount()); - LONGS_EQUAL(1, fixture.getIgnoreCount()); -} - -TEST(OptRunIgnoredTest, optRunOptionSpecifiedWillNotInfluenceNormalTestCount) -{ - normalUtestShell.setRunIgnored(); - fixture.runAllTests(); - LONGS_EQUAL(2, fixture.getRunCount()); - LONGS_EQUAL(1, fixture.getIgnoreCount()); -} - -TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenReturnTESTInFormattedName) -{ - optRunIgnoredTest.setGroupName("TestGroup"); - optRunIgnoredTest.setTestName("TestName"); - optRunIgnoredTest.setRunIgnored(); - fixture.runAllTests(); - STRCMP_EQUAL("TEST(TestGroup, TestName)", optRunIgnoredTest.getFormattedName().asCharString()); -} - -TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenReturnIGNORETESTInFormattedName) -{ - optRunIgnoredTest.setGroupName("TestGroup"); - optRunIgnoredTest.setTestName("TestName"); - fixture.runAllTests(); - STRCMP_EQUAL("IGNORE_TEST(TestGroup, TestName)", optRunIgnoredTest.getFormattedName().asCharString()); -} - -TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenWillRunReturnFalse) -{ - CHECK_FALSE(optRunIgnoredTest.willRun()); -} - -TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenWillRunReturnTrue) -{ - optRunIgnoredTest.setRunIgnored(); - CHECK_TRUE(optRunIgnoredTest.willRun()); -} - diff --git a/tests/UtestTest.cpp b/tests/UtestTest.cpp index 5ef43a1cf..0ccb94a97 100644 --- a/tests/UtestTest.cpp +++ b/tests/UtestTest.cpp @@ -30,10 +30,6 @@ #include "CppUTest/TestTestingFixture.h" #include "CppUTest/PlatformSpecificFunctions.h" -TEST_GROUP(Utest) -{ -}; - TEST_GROUP(UtestShell) { TestTestingFixture fixture; @@ -236,6 +232,83 @@ TEST(UtestShell, DestructorIsCalledForLocalObjectsWhenTheTestFails) #endif +TEST_GROUP(IgnoredUtestShell) +{ + TestTestingFixture fixture; + IgnoredUtestShell ignoredTest; + ExecFunctionTestShell normalUtestShell; + + void setup() _override + { + fixture.addTest(&ignoredTest); + fixture.addTest(&normalUtestShell); + } +}; + +TEST(IgnoredUtestShell, doesIgnoreCount) +{ + fixture.runAllTests(); + LONGS_EQUAL(1, fixture.getIgnoreCount()); +} + +TEST(IgnoredUtestShell, printsIGNORE_TESTwhenVerbose) +{ + fixture.output_->verbose(); + fixture.runAllTests(); + fixture.assertPrintContains("IGNORE_TEST"); +} + +TEST(IgnoredUtestShell, runIgnoredOptionSpecifiedThenIncreaseRunCount) +{ + ignoredTest.setRunIgnored(); + fixture.runAllTests(); + LONGS_EQUAL(3, fixture.getRunCount()); + LONGS_EQUAL(0, fixture.getIgnoreCount()); +} + +TEST(IgnoredUtestShell, runIgnoredOptionNotSpecifiedThenIncreaseIgnoredCount) +{ + fixture.runAllTests(); + LONGS_EQUAL(2, fixture.getRunCount()); + LONGS_EQUAL(1, fixture.getIgnoreCount()); +} + +TEST(IgnoredUtestShell, runIgnoredOptionSpecifiedWillNotInfluenceNormalTestCount) +{ + normalUtestShell.setRunIgnored(); + fixture.runAllTests(); + LONGS_EQUAL(2, fixture.getRunCount()); + LONGS_EQUAL(1, fixture.getIgnoreCount()); +} + +TEST(IgnoredUtestShell, runIgnoredOptionSpecifiedThenReturnTESTInFormattedName) +{ + ignoredTest.setGroupName("TestGroup"); + ignoredTest.setTestName("TestName"); + ignoredTest.setRunIgnored(); + fixture.runAllTests(); + STRCMP_EQUAL("TEST(TestGroup, TestName)", ignoredTest.getFormattedName().asCharString()); +} + +TEST(IgnoredUtestShell, runIgnoredOptionNotSpecifiedThenReturnIGNORETESTInFormattedName) +{ + ignoredTest.setGroupName("TestGroup"); + ignoredTest.setTestName("TestName"); + fixture.runAllTests(); + STRCMP_EQUAL("IGNORE_TEST(TestGroup, TestName)", ignoredTest.getFormattedName().asCharString()); +} + +TEST(IgnoredUtestShell, runIgnoredOptionNotSpecifiedThenWillRunReturnFalse) +{ + CHECK_FALSE(ignoredTest.willRun()); +} + +TEST(IgnoredUtestShell, runIgnoredOptionSpecifiedThenWillRunReturnTrue) +{ + ignoredTest.setRunIgnored(); + CHECK_TRUE(ignoredTest.willRun()); +} + TEST_BASE(MyOwnTest) { MyOwnTest() : From 0b0d69cb313c303db2d423b1f443df84b03586c8 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 24 Mar 2016 14:03:38 +0100 Subject: [PATCH 0130/1345] Remove trailing whitespace --- examples/AllTests/AllTests.cpp | 2 +- include/CppUTest/Utest.h | 4 ++-- include/CppUTestExt/MockExpectedCallsList.h | 2 +- include/CppUTestExt/MockSupport.h | 8 ++++---- include/Platforms/c2000/stdint.h | 6 +++--- src/CppUTest/SimpleMutex.cpp | 2 +- src/CppUTest/Utest.cpp | 12 ++++++------ src/CppUTestExt/MockSupport.cpp | 4 ++-- src/Platforms/Keil/UtestPlatform.cpp | 4 ++-- src/Platforms/Symbian/README_Symbian.txt | 6 +++--- src/Platforms/Symbian/SymbianMemoryLeakWarning.cpp | 10 +++++----- src/Platforms/Symbian/UtestPlatform.cpp | 2 +- tests/CommandLineTestRunnerTest.cpp | 8 ++++---- tests/CppUTestExt/MockCallTest.cpp | 12 ++++++------ tests/CppUTestExt/MockStrictOrderTest.cpp | 2 +- tests/SimpleMutexTest.cpp | 2 +- tests/TestUTestMacro.cpp | 4 ++-- 17 files changed, 45 insertions(+), 45 deletions(-) diff --git a/examples/AllTests/AllTests.cpp b/examples/AllTests/AllTests.cpp index 22bd8ba6b..5ff9de3b1 100644 --- a/examples/AllTests/AllTests.cpp +++ b/examples/AllTests/AllTests.cpp @@ -50,7 +50,7 @@ int main(int ac, char** av) MyDummyComparator dummyComparator; MockSupportPlugin mockPlugin; IEEE754ExceptionsPlugin ieee754Plugin; - + mockPlugin.installComparator("MyDummyType", dummyComparator); TestRegistry::getCurrentRegistry()->installPlugin(&mockPlugin); TestRegistry::getCurrentRegistry()->installPlugin(&ieee754Plugin); diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 8f788b2c2..a2378bdc0 100755 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -226,14 +226,14 @@ class IgnoredUtestShell : public UtestShell const char* fileName, int lineNumber); virtual bool willRun() const _override; virtual void setRunIgnored() _override; -protected: +protected: virtual SimpleString getMacroName() const _override; virtual void runOneTest(TestPlugin* plugin, TestResult& result) _override; private: IgnoredUtestShell(const IgnoredUtestShell&); IgnoredUtestShell& operator=(const IgnoredUtestShell&); - + bool runIgnored_; }; diff --git a/include/CppUTestExt/MockExpectedCallsList.h b/include/CppUTestExt/MockExpectedCallsList.h index a0a28733d..ea29b0f1c 100644 --- a/include/CppUTestExt/MockExpectedCallsList.h +++ b/include/CppUTestExt/MockExpectedCallsList.h @@ -53,7 +53,7 @@ class MockExpectedCallsList virtual void addExpectedCall(MockCheckedExpectedCall* call); virtual void addExpectations(const MockExpectedCallsList& list); virtual void addExpectationsRelatedTo(const SimpleString& name, const MockExpectedCallsList& list); - + virtual void onlyKeepOutOfOrderExpectations(); virtual void addUnfulfilledExpectations(const MockExpectedCallsList& list); diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index 8abb3d34c..8c4e0fd72 100755 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -136,7 +136,7 @@ class MockSupport MockNamedValueComparatorsAndCopiersRepository comparatorsAndCopiersRepository_; MockNamedValueList data_; const SimpleString mockName_; - + bool tracing_; void checkExpectationsOfLastCall(); @@ -147,13 +147,13 @@ class MockSupport MockNamedValue* retrieveDataFromStore(const SimpleString& name); MockSupport* getMockSupport(MockNamedValueListNode* node); - + bool hasntExpectationWithName(const SimpleString& functionName); bool hasntUnexpectationWithName(const SimpleString& functionName); bool hasCallsOutOfOrder(); - + SimpleString appendScopeToName(const SimpleString& functionName); - + }; #endif diff --git a/include/Platforms/c2000/stdint.h b/include/Platforms/c2000/stdint.h index f81307690..e2831fdc0 100644 --- a/include/Platforms/c2000/stdint.h +++ b/include/Platforms/c2000/stdint.h @@ -28,9 +28,9 @@ #ifndef stdint_wrapper_h #define stdint_wrapper_h - + #include - + typedef unsigned char uint8_t; /* This will still compile to 16 bit */ - + #endif /* stdint_wrapper_h */ \ No newline at end of file diff --git a/src/CppUTest/SimpleMutex.cpp b/src/CppUTest/SimpleMutex.cpp index c75648637..a1f4d7027 100644 --- a/src/CppUTest/SimpleMutex.cpp +++ b/src/CppUTest/SimpleMutex.cpp @@ -42,7 +42,7 @@ void SimpleMutex::Lock(void) { PlatformSpecificMutexLock(psMtx); } - + void SimpleMutex::Unlock(void) { PlatformSpecificMutexUnlock(psMtx); diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 7b1c339e7..31ba27e0a 100755 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -646,7 +646,7 @@ IgnoredUtestShell::~IgnoredUtestShell() } bool IgnoredUtestShell::willRun() const -{ +{ if (runIgnored_) return UtestShell::willRun(); return false; @@ -661,11 +661,11 @@ SimpleString IgnoredUtestShell::getMacroName() const void IgnoredUtestShell::runOneTest(TestPlugin* plugin, TestResult& result) { - if (runIgnored_) - { - UtestShell::runOneTest(plugin, result); - return; - } + if (runIgnored_) + { + UtestShell::runOneTest(plugin, result); + return; + } result.countIgnored(); } diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 118c404fa..46762ca7e 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) + : callOrder_(0), expectedCallOrder_(0), strictOrdering_(false), standardReporter_(&defaultReporter_), ignoreOtherCalls_(false), enabled_(true), lastActualFunctionCall_(NULL), mockName_(mockName), tracing_(false) { setActiveReporter(NULL); } @@ -118,7 +118,7 @@ void MockSupport::clear() tracing_ = false; MockActualCallTrace::instance().clear(); - expectations_.deleteAllExpectationsAndClearList(); + expectations_.deleteAllExpectationsAndClearList(); unExpectations_.deleteAllExpectationsAndClearList(); compositeCalls_.clear(); ignoreOtherCalls_ = false; diff --git a/src/Platforms/Keil/UtestPlatform.cpp b/src/Platforms/Keil/UtestPlatform.cpp index 65456ad5a..5201b2fe7 100644 --- a/src/Platforms/Keil/UtestPlatform.cpp +++ b/src/Platforms/Keil/UtestPlatform.cpp @@ -109,9 +109,9 @@ extern "C" static long TimeInMillisImplementation() { clock_t t = clock(); - + t = t * 10; - + return t; } diff --git a/src/Platforms/Symbian/README_Symbian.txt b/src/Platforms/Symbian/README_Symbian.txt index 3d8a229a4..1f9dc6c36 100644 --- a/src/Platforms/Symbian/README_Symbian.txt +++ b/src/Platforms/Symbian/README_Symbian.txt @@ -2,9 +2,9 @@ CppUTest on Symbian Compliling -To compile CppUTest you need to have Symbian Posix libraries installed. On S60 it's +To compile CppUTest you need to have Symbian Posix libraries installed. On S60 it's recommended to use S60 Open C. On other platforms one can use Symbian PIPS. Compiling is -in standard way, by issuing from command line commands bldmake bldfiles && abld build in +in standard way, by issuing from command line commands bldmake bldfiles && abld build in build-directory. You can also import the project's bld.inf file into Carbide in normal way. @@ -12,7 +12,7 @@ Writing tests CppUTest exports the needed header files into \epoc32\include\CppUTest -directory. Add the directory to the include-path of the test project. One needs to include TestHarness.h file into test source -file. The test project must link against cpputest.lib using STATICLIBRARY statement in MMP-file. +file. The test project must link against cpputest.lib using STATICLIBRARY statement in MMP-file. CppUTest depends also on standard C-library so the tests must be linked against libc as well. The entry point file of the tests is normally the following: diff --git a/src/Platforms/Symbian/SymbianMemoryLeakWarning.cpp b/src/Platforms/Symbian/SymbianMemoryLeakWarning.cpp index e87d12529..0003442d2 100644 --- a/src/Platforms/Symbian/SymbianMemoryLeakWarning.cpp +++ b/src/Platforms/Symbian/SymbianMemoryLeakWarning.cpp @@ -42,8 +42,8 @@ class MemoryLeakWarningData : public CBase { MemoryLeakWarning::MemoryLeakWarning() { - _latest = this; - CreateData(); + _latest = this; + CreateData(); } MemoryLeakWarning::~MemoryLeakWarning() @@ -61,16 +61,16 @@ const char* MemoryLeakWarning::FinalReport(int toBeDeletedLeaks) if( cellDifference != toBeDeletedLeaks ) { return "Heap imbalance after test\n"; } - + TInt processHandles; TInt threadHandles; RThread().HandleCount(processHandles, threadHandles); - + if(_impl->iInitialProcessHandleCount != processHandles || _impl->iInitialThreadHandleCount != threadHandles) { return "Handle count imbalance after test\n"; } - + return ""; } diff --git a/src/Platforms/Symbian/UtestPlatform.cpp b/src/Platforms/Symbian/UtestPlatform.cpp index e1fcd040c..a4d5df7e0 100644 --- a/src/Platforms/Symbian/UtestPlatform.cpp +++ b/src/Platforms/Symbian/UtestPlatform.cpp @@ -138,7 +138,7 @@ void PlatformSpecificFClose(PlatformSpecificFile file) { } extern "C" { - + static int IsNanImplementation(double d) { return isnan(d); diff --git a/tests/CommandLineTestRunnerTest.cpp b/tests/CommandLineTestRunnerTest.cpp index e514c67ef..722739acd 100755 --- a/tests/CommandLineTestRunnerTest.cpp +++ b/tests/CommandLineTestRunnerTest.cpp @@ -300,7 +300,7 @@ TEST_GROUP(RunIgnoredTest) { delete pluginCountingPlugin; delete runIgnoredTest; - RunIgnoredUtest::Checker = false; + RunIgnoredUtest::Checker = false; } }; @@ -316,10 +316,10 @@ TEST(RunIgnoredTest, IgnoreTestWillBeIgnoredIfNoOptionSpecified) TEST(RunIgnoredTest, IgnoreTestWillGetRunIfOptionSpecified) { - const char* argv[] = { "tests.exe", "-ri" }; + const char* argv[] = { "tests.exe", "-ri" }; - CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); - commandLineTestRunner.runAllTestsMain(); + CommandLineTestRunnerWithStringBufferOutput commandLineTestRunner(2, argv, ®istry); + commandLineTestRunner.runAllTestsMain(); CHECK_TRUE( RunIgnoredUtest::Checker ); } diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index 6ab20c05e..377333f16 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -124,7 +124,7 @@ TEST(MockCallTest, expectOneCallInOneScopeButActualCallInAnotherScope) MockExpectedCallsListForTest emptyExpectations; MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "class::foo", emptyExpectations); - + mock("scope").expectOneCall("foo"); mock("class").actualCall("foo"); @@ -138,7 +138,7 @@ TEST(MockCallTest, expectOneCallInScopeButActualCallInGlobal) MockExpectedCallsListForTest emptyExpectations; MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "foo", emptyExpectations); - + mock("scope").expectOneCall("foo"); mock().actualCall("foo"); @@ -177,20 +177,20 @@ TEST(MockCallTest, expectOneCallHoweverMultipleHappened) TEST(MockCallTest, expectNoCallThatHappened) { MockFailureReporterInstaller failureReporterInstaller; - + MockExpectedCallsListForTest expectations; MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); mock().expectNoCall("lazy"); mock().actualCall("lazy"); - + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } TEST(MockCallTest, expectNoCallDoesntInfluenceExpectOneCall) { MockFailureReporterInstaller failureReporterInstaller; - + MockExpectedCallsListForTest expectations; expectations.addFunction("influence", MockCheckedExpectedCall::NO_EXPECTED_CALL_ORDER)->callWasMade(1); MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); @@ -206,7 +206,7 @@ TEST(MockCallTest, expectNoCallDoesntInfluenceExpectOneCall) TEST(MockCallTest, expectNoCallOnlyFailureOnceWhenMultipleHappened) { MockFailureReporterInstaller failureReporterInstaller; - + MockExpectedCallsListForTest expectations; MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); diff --git a/tests/CppUTestExt/MockStrictOrderTest.cpp b/tests/CppUTestExt/MockStrictOrderTest.cpp index 001082e09..41fe96d9d 100644 --- a/tests/CppUTestExt/MockStrictOrderTest.cpp +++ b/tests/CppUTestExt/MockStrictOrderTest.cpp @@ -119,7 +119,7 @@ TEST(MockStrictOrderTest, orderViolatedWorksWithExtraUnexpectedCall) mock("bla").expectOneCall("foo1"); mock("foo").expectOneCall("foo1"); - mock("foo").expectOneCall("foo2"); + mock("foo").expectOneCall("foo2"); mock("bla").actualCall("foo1"); mock("foo").actualCall("foo2"); diff --git a/tests/SimpleMutexTest.cpp b/tests/SimpleMutexTest.cpp index 292bf7e43..9788ebe0b 100644 --- a/tests/SimpleMutexTest.cpp +++ b/tests/SimpleMutexTest.cpp @@ -71,7 +71,7 @@ TEST_GROUP(SimpleMutexTest) mutexLockCount = 0; mutexUnlockCount = 0; } - + void teardown() { } diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 394f7fdd8..f642d3328 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -1404,7 +1404,7 @@ TEST(OptRunIgnoredTest, optRunOptionSpecifiedThenReturnTESTInFormattedName) optRunIgnoredTest.setTestName("TestName"); optRunIgnoredTest.setRunIgnored(); fixture.runAllTests(); - STRCMP_EQUAL("TEST(TestGroup, TestName)", optRunIgnoredTest.getFormattedName().asCharString()); + STRCMP_EQUAL("TEST(TestGroup, TestName)", optRunIgnoredTest.getFormattedName().asCharString()); } TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenReturnIGNORETESTInFormattedName) @@ -1412,7 +1412,7 @@ TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenReturnIGNORETESTInFormattedN optRunIgnoredTest.setGroupName("TestGroup"); optRunIgnoredTest.setTestName("TestName"); fixture.runAllTests(); - STRCMP_EQUAL("IGNORE_TEST(TestGroup, TestName)", optRunIgnoredTest.getFormattedName().asCharString()); + STRCMP_EQUAL("IGNORE_TEST(TestGroup, TestName)", optRunIgnoredTest.getFormattedName().asCharString()); } TEST(OptRunIgnoredTest, optRunOptionNotSpecifiedThenWillRunReturnFalse) From 6e875e2648577cdae098374e9f6486e2e5da1a3d Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Tue, 29 Dec 2015 20:11:02 -0600 Subject: [PATCH 0131/1345] Add another path to remove for completeness sake --- scripts/appveyor_ci_build.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index 58168f739..25321ea6c 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -145,6 +145,7 @@ if ($env:PlatformToolset -eq 'MinGW') Remove-PathFolder "C:\Program Files\Git\usr\bin" Remove-PathFolder "C:\Program Files (x86)\Git\bin" Remove-PathFolder "C:\Program Files (x86)\Git\cmd" + Remove-PathFolder "C:\Program Files (x86)\Git\usr\bin" # Add mingw to the path Add-PathFolder $mingw_path From 5784da5c49dc123ab63348e19b79657d7ef2d00b Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Tue, 29 Dec 2015 20:17:24 -0600 Subject: [PATCH 0132/1345] Replace list of if statements with a switch --- scripts/appveyor_ci_build.ps1 | 85 +++++++++++++++++------------------ 1 file changed, 42 insertions(+), 43 deletions(-) diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index 25321ea6c..7ed827938 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -102,58 +102,57 @@ else $logger_arg = '' } -if ($env:PlatformToolset -eq 'v90') +# Clean up some paths for any configuration +Remove-PathFolder "C:\MinGW\bin" +Remove-PathFolder "C:\Program Files\Git\bin" +Remove-PathFolder "C:\Program Files\Git\cmd" +Remove-PathFolder "C:\Program Files\Git\usr\bin" +Remove-PathFolder "C:\Program Files (x86)\Git\bin" +Remove-PathFolder "C:\Program Files (x86)\Git\cmd" +Remove-PathFolder "C:\Program Files (x86)\Git\usr\bin" + +switch ($env:PlatformToolset) { - $vsvarspath = Join-Path $env:VS90COMNTOOLS vsvars32.bat - Get-BatchFile($vsvarspath) - - $VS2008ProjectFiles | foreach { - Invoke-BuildCommand "vcbuild /upgrade $_" + 'Cygwin' + { + Invoke-CygwinCommand "autoreconf -i .. ; ../configure ; make CppUTestTests.exe CppUTestExtTests.exe" "cpputest_build" } - $VS2008ProjectFiles | foreach { - Invoke-BuildCommand "vcbuild $_ $env:CONFIGURATION" - } -} + 'MinGW' + { + $mingw_path = 'C:\Tools\mingw32\bin' + if ($env:Platform -eq 'x64') + { + $mingw_path = 'C:\Tools\mingw64\bin' + } -if ($env:PlatformToolset -eq 'v100') -{ - $VS2010ProjectFiles | foreach { - Invoke-BuildCommand "msbuild $logger_arg $_" - } -} + # Add mingw to the path + Add-PathFolder $mingw_path -if ($env:PlatformToolset -eq 'Cygwin') -{ - Invoke-CygwinCommand "autoreconf -i .. ; ../configure ; make CppUTestTests.exe CppUTestExtTests.exe" "cpputest_build" -} + Invoke-BuildCommand "cmake -G 'MinGW Makefiles' .." 'cpputest_build' + Invoke-BuildCommand "mingw32-make all" 'cpputest_build' -if ($env:PlatformToolset -eq 'MinGW') -{ - $mingw_path = 'C:\Tools\mingw32\bin' - if ($env:Platform -eq 'x64') - { - $mingw_path = 'C:\Tools\mingw64\bin' + Remove-PathFolder $mingw_path } - Write-Host "Initial Path: $env:Path" - - # Need to do some path cleanup first - Remove-PathFolder "C:\MinGW\bin" - Remove-PathFolder "C:\Program Files\Git\bin" - Remove-PathFolder "C:\Program Files\Git\cmd" - Remove-PathFolder "C:\Program Files\Git\usr\bin" - Remove-PathFolder "C:\Program Files (x86)\Git\bin" - Remove-PathFolder "C:\Program Files (x86)\Git\cmd" - Remove-PathFolder "C:\Program Files (x86)\Git\usr\bin" - - # Add mingw to the path - Add-PathFolder $mingw_path + 'v90' + { + $vsvarspath = Join-Path $env:VS90COMNTOOLS vsvars32.bat + Get-BatchFile($vsvarspath) - Write-Host "Building with Path: $env:Path" + $VS2008ProjectFiles | foreach { + Invoke-BuildCommand "vcbuild /upgrade $_" + } - Invoke-BuildCommand "cmake -G 'MinGW Makefiles' .." 'cpputest_build' - Invoke-BuildCommand "mingw32-make all" 'cpputest_build' + $VS2008ProjectFiles | foreach { + Invoke-BuildCommand "vcbuild $_ $env:CONFIGURATION" + } + } - Remove-PathFolder $mingw_path + default # Mainly for v100, should also support anything newer I think + { + $VS2010ProjectFiles | foreach { + Invoke-BuildCommand "msbuild $logger_arg $_" + } + } } From 69582e1ae82b6f696717c132d64b13a03de20734 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Tue, 29 Dec 2015 20:43:26 -0600 Subject: [PATCH 0133/1345] Refactored some functions to a helper file --- scripts/appveyor_ci_build.ps1 | 56 ++--------------------------------- scripts/appveyor_ci_test.ps1 | 48 ++---------------------------- scripts/appveyor_helpers.ps1 | 56 +++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 100 deletions(-) create mode 100644 scripts/appveyor_helpers.ps1 diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index 7ed827938..5a29b7b4f 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -1,12 +1,6 @@  -# Helper function to extract vars out of the vsvars batch file -function Get-Batchfile ($file) { - $cmd = "`"$file`" & set" - cmd /c $cmd | Foreach-Object { - $p, $v = $_.split('=') - Set-Item -path env:$p -value $v - } -} +# Load functions from the helper file +. (Join-Path (Split-Path $MyInvocation.MyCommand.Path) 'appveyor_helpers.ps1') function Invoke-BuildCommand($command, $directory = '.') { @@ -43,52 +37,6 @@ function Invoke-CygwinCommand($command, $directory = '.') } } -function Remove-PathFolder($folder) -{ - [System.Collections.ArrayList]$pathFolders = New-Object System.Collections.ArrayList - $env:Path -split ";" | foreach { $pathFolders.Add($_) | Out-Null } - - for ([int]$i = 0; $i -lt $pathFolders.Count; $i++) - { - if ([string]::Compare($pathFolders[$i], $folder, $true) -eq 0) - { - Write-Host "Removing $folder from the PATH" - $pathFolders.RemoveAt($i) - $i-- - } - } - - $env:Path = $pathFolders -join ";" -} - -function Add-PathFolder($folder) -{ - if (-not (Test-Path $folder)) - { - Write-Host "Not adding $folder to the PATH, it does not exist" - } - - [bool]$alreadyInPath = $false - [System.Collections.ArrayList]$pathFolders = New-Object System.Collections.ArrayList - $env:Path -split ";" | foreach { $pathFolders.Add($_) | Out-Null } - - for ([int]$i = 0; $i -lt $pathFolders.Count; $i++) - { - if ([string]::Compare($pathFolders[$i], $folder, $true) -eq 0) - { - $alreadyInPath = $true - break - } - } - - if (-not $alreadyInPath) - { - Write-Host "Adding $folder to the PATH" - $pathFolders.Insert(0, $folder) - $env:Path = $pathFolders -join ";" - } -} - # The project files that will get built $VS2008ProjectFiles = @( 'CppUTest.vcproj' , 'tests\AllTests.vcproj' ) $VS2010ProjectFiles = @( 'CppUTest.vcxproj', 'tests\AllTests.vcxproj' ) diff --git a/scripts/appveyor_ci_test.ps1 b/scripts/appveyor_ci_test.ps1 index a26be7393..989a2ec61 100644 --- a/scripts/appveyor_ci_test.ps1 +++ b/scripts/appveyor_ci_test.ps1 @@ -1,4 +1,6 @@  +# Load functions from the helper file +. (Join-Path (Split-Path $MyInvocation.MyCommand.Path) 'appveyor_helpers.ps1') function Publish-TestResults($files) { @@ -56,52 +58,6 @@ function Invoke-CygwinTests($executable) Invoke-Expression $cygwin_command } -function Remove-PathFolder($folder) -{ - [System.Collections.ArrayList]$pathFolders = New-Object System.Collections.ArrayList - $env:Path -split ";" | foreach { $pathFolders.Add($_) | Out-Null } - - for ([int]$i = 0; $i -lt $pathFolders.Count; $i++) - { - if ([string]::Compare($pathFolders[$i], $folder, $true) -eq 0) - { - Write-Host "Removing $folder from the PATH" - $pathFolders.RemoveAt($i) - $i-- - } - } - - $env:Path = $pathFolders -join ";" -} - -function Add-PathFolder($folder) -{ - if (-not (Test-Path $folder)) - { - Write-Host "Not adding $folder to the PATH, it does not exist" - } - - [bool]$alreadyInPath = $false - [System.Collections.ArrayList]$pathFolders = New-Object System.Collections.ArrayList - $env:Path -split ";" | foreach { $pathFolders.Add($_) | Out-Null } - - for ([int]$i = 0; $i -lt $pathFolders.Count; $i++) - { - if ([string]::Compare($pathFolders[$i], $folder, $true) -eq 0) - { - $alreadyInPath = $true - break - } - } - - if (-not $alreadyInPath) - { - Write-Host "Adding $folder to the PATH" - $pathFolders.Insert(0, $folder) - $env:Path = $pathFolders -join ";" - } -} - switch ($env:PlatformToolset) { 'Cygwin' diff --git a/scripts/appveyor_helpers.ps1 b/scripts/appveyor_helpers.ps1 new file mode 100644 index 000000000..e72a2031d --- /dev/null +++ b/scripts/appveyor_helpers.ps1 @@ -0,0 +1,56 @@ + +# Helper function to extract vars out of the vsvars batch file +function Get-Batchfile ($file) { + $cmd = "`"$file`" & set" + cmd /c $cmd | Foreach-Object { + $p, $v = $_.split('=') + Set-Item -path env:$p -value $v + } +} + +function Add-PathFolder($folder) +{ + if (-not (Test-Path $folder)) + { + Write-Host "Not adding $folder to the PATH, it does not exist" + } + + [bool]$alreadyInPath = $false + [System.Collections.ArrayList]$pathFolders = New-Object System.Collections.ArrayList + $env:Path -split ";" | foreach { $pathFolders.Add($_) | Out-Null } + + for ([int]$i = 0; $i -lt $pathFolders.Count; $i++) + { + if ([string]::Compare($pathFolders[$i], $folder, $true) -eq 0) + { + $alreadyInPath = $true + break + } + } + + if (-not $alreadyInPath) + { + Write-Host "Adding $folder to the PATH" + $pathFolders.Insert(0, $folder) + $env:Path = $pathFolders -join ";" + } +} + +function Remove-PathFolder($folder) +{ + [System.Collections.ArrayList]$pathFolders = New-Object System.Collections.ArrayList + $env:Path -split ";" | foreach { $pathFolders.Add($_) | Out-Null } + + for ([int]$i = 0; $i -lt $pathFolders.Count; $i++) + { + if ([string]::Compare($pathFolders[$i], $folder, $true) -eq 0) + { + Write-Host "Removing $folder from the PATH" + $pathFolders.RemoveAt($i) + $i-- + } + } + + $env:Path = $pathFolders -join ";" +} + From 5a3d9af717b5e053d8294804d12c0acc4f80b7a5 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Tue, 29 Dec 2015 20:54:27 -0600 Subject: [PATCH 0134/1345] Added logic to enable local script testing --- scripts/appveyor_ci_test.ps1 | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/scripts/appveyor_ci_test.ps1 b/scripts/appveyor_ci_test.ps1 index 989a2ec61..e76b223f0 100644 --- a/scripts/appveyor_ci_test.ps1 +++ b/scripts/appveyor_ci_test.ps1 @@ -58,6 +58,30 @@ function Invoke-CygwinTests($executable) Invoke-Expression $cygwin_command } +$TestCount = 0 + +if (-not $env:APPVEYOR) +{ + function Add-AppVeyorTest() + { + # Wacky way to access a script variable, but it works + $count = Get-Variable -Name TestCount -Scope script + Set-Variable -Name TestCount -Scope script -Value ($count.Value + 1) + } + + function Add-AppVeyorMessage($Message, $Category) + { + if ($Category -eq 'Error') + { + Write-Error $Message + } + else + { + Write-Host $Message + } + } +} + switch ($env:PlatformToolset) { 'Cygwin' @@ -87,3 +111,8 @@ switch ($env:PlatformToolset) } Publish-TestResults (Get-ChildItem 'cpputest_*.xml') + +if (-not $env:APPVEYOR) +{ + Write-Host "Tests Ran: $TestCount" +} \ No newline at end of file From 664a01da8ebcd5e824265e96d00bc45039224785 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Tue, 29 Dec 2015 21:04:04 -0600 Subject: [PATCH 0135/1345] Use VS2015 tools version --- scripts/appveyor_ci_build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index 5a29b7b4f..85f9f02ea 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -100,7 +100,7 @@ switch ($env:PlatformToolset) default # Mainly for v100, should also support anything newer I think { $VS2010ProjectFiles | foreach { - Invoke-BuildCommand "msbuild $logger_arg $_" + Invoke-BuildCommand "msbuild /ToolsVersion:14.0 $logger_arg $_" } } } From a4036842f4532da8b703d2933ed69567ef8c01bb Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Tue, 29 Dec 2015 21:05:22 -0600 Subject: [PATCH 0136/1345] Added VS2015 as a built version --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 2ea9f3df2..1e35a495f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,6 +20,7 @@ environment: Version: 5.3.0 - PlatformToolset: v90 - PlatformToolset: v100 + - PlatformToolset: v140 install: - ps: if ($env:PlatformToolset -eq 'MinGW') { choco install mingw --version $env:Version $( if ($env:Platform -eq 'Win32') { Write-Output -forcex86 } ) | Out-Null } From fded6a43567688cbce252138318984f3a8deb2b5 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Tue, 5 Jan 2016 20:02:12 -0600 Subject: [PATCH 0137/1345] Added helper function to get bin folders --- scripts/appveyor_ci_build.ps1 | 11 ++++------- scripts/appveyor_ci_test.ps1 | 8 ++------ scripts/appveyor_helpers.ps1 | 20 ++++++++++++++++++++ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index 85f9f02ea..35e368ffa 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -22,8 +22,9 @@ function Invoke-BuildCommand($command, $directory = '.') function Invoke-CygwinCommand($command, $directory = '.') { - # Assume cygwin is located at C:\cygwin for now - $cygwin_bin = "C:\cygwin\bin" + # Assume cygwin is located at C:\cygwin on x86 and C:\cygwin64 on x64 for now + $cygwin_bin = Get-CygwinBin + $cygwin_directory = (. "${cygwin_bin}\cygpath.exe" (Resolve-Path $directory)) $command_wrapped = "${cygwin_bin}\bash.exe --login -c 'cd $cygwin_directory ; $command' ; `$err = `$?" @@ -68,11 +69,7 @@ switch ($env:PlatformToolset) 'MinGW' { - $mingw_path = 'C:\Tools\mingw32\bin' - if ($env:Platform -eq 'x64') - { - $mingw_path = 'C:\Tools\mingw64\bin' - } + $mingw_path = Get-MinGWBin # Add mingw to the path Add-PathFolder $mingw_path diff --git a/scripts/appveyor_ci_test.ps1 b/scripts/appveyor_ci_test.ps1 index e76b223f0..fad1280d2 100644 --- a/scripts/appveyor_ci_test.ps1 +++ b/scripts/appveyor_ci_test.ps1 @@ -44,7 +44,7 @@ function Invoke-Tests($executable) function Invoke-CygwinTests($executable) { # Assume cygwin is located at C:\cygwin for now - $cygwin_bin = "C:\cygwin\bin" + $cygwin_bin = Get-CygwinBin # Get the full path to the executable $cygwin_folder = . "${cygwin_bin}\cygpath.exe" (Resolve-Path ".") @@ -92,11 +92,7 @@ switch ($env:PlatformToolset) 'MinGW' { - $mingw_path = 'C:\Tools\mingw32\bin' - if ($env:Platform -eq 'x64') - { - $mingw_path = 'C:\Tools\mingw64\bin' - } + $mingw_path = Get-MinGWBin Add-PathFolder $mingw_path Invoke-Tests '.\cpputest_build\tests\CppUTestTests.exe' diff --git a/scripts/appveyor_helpers.ps1 b/scripts/appveyor_helpers.ps1 index e72a2031d..b8dfbecd0 100644 --- a/scripts/appveyor_helpers.ps1 +++ b/scripts/appveyor_helpers.ps1 @@ -8,6 +8,26 @@ function Get-Batchfile ($file) { } } +# Helper function to provide the bin-folder path to mingw +function Get-MinGWBin() { + if ($env:Platform -eq 'x64') { + Write-Output 'C:\Tools\mingw64\bin' + } + else { + Write-Output 'C:\Tools\mingw32\bin' + } +} + +# Helper function to provide the bin-folder path to cygwin +function Get-CygwinBin() { + if ($env:Platform -eq 'x64') { + Write-Output 'C:\cygwin64\bin' + } + else { + Write-Output 'C:\cygwin\bin' + } +} + function Add-PathFolder($folder) { if (-not (Test-Path $folder)) From 704653c0b7f9e67a94dacb19c2e7a8c1e7179189 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sun, 10 Jan 2016 15:56:40 -0600 Subject: [PATCH 0138/1345] Cleanup configs --- appveyor.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 1e35a495f..263e4d5b1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,6 +6,7 @@ os: environment: matrix: - PlatformToolset: Cygwin + Platform: x86 - PlatformToolset: MinGW Platform: Win32 Version: 4.8.5 @@ -19,8 +20,14 @@ environment: Platform: x64 Version: 5.3.0 - PlatformToolset: v90 + Platform: Win32 + Configuration: Release - PlatformToolset: v100 + Platform: Win32 + Configuration: Release - PlatformToolset: v140 + Platform: Win32 + Configuration: Release install: - ps: if ($env:PlatformToolset -eq 'MinGW') { choco install mingw --version $env:Version $( if ($env:Platform -eq 'Win32') { Write-Output -forcex86 } ) | Out-Null } @@ -36,6 +43,3 @@ artifacts: - path: lib\CppUTest.lib name: CppUTest -# Other configuration options -platform: Win32 -configuration: Release From 159be3975bdfcaa20a3e515333650f5675d0c5c8 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Thu, 18 Feb 2016 19:47:27 -0600 Subject: [PATCH 0139/1345] Modified how the different configurations are named --- appveyor.yml | 42 +++++++++++++---------------------- scripts/appveyor_ci_build.ps1 | 41 ++++++++++++++++++---------------- scripts/appveyor_helpers.ps1 | 4 ++-- 3 files changed, 40 insertions(+), 47 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 263e4d5b1..a96ce0c53 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,33 +5,24 @@ os: environment: matrix: - - PlatformToolset: Cygwin - Platform: x86 - - PlatformToolset: MinGW - Platform: Win32 - Version: 4.8.5 - - PlatformToolset: MinGW - Platform: x64 - Version: 4.8.5 - - PlatformToolset: MinGW - Platform: Win32 - Version: 5.3.0 - - PlatformToolset: MinGW - Platform: x64 - Version: 5.3.0 - - PlatformToolset: v90 - Platform: Win32 - Configuration: Release - - PlatformToolset: v100 - Platform: Win32 - Configuration: Release - - PlatformToolset: v140 - Platform: Win32 - Configuration: Release + - Platform: Cygwin32 + - Platform: MinGW32 + PlatformToolset: 4.8.5 + - Platform: MinGW64 + PlatformToolset: 4.8.5 + - Platform: MinGW32 + PlatformToolset: 5.3.0 + - Platform: MinGW64 + PlatformToolset: 5.3.0 + - Platform: Win32 + PlatformToolset: v90 + - Platform: Win32 + PlatformToolset: v100 + - Platform: Win32 + PlatformToolset: v140 install: -- ps: if ($env:PlatformToolset -eq 'MinGW') { choco install mingw --version $env:Version $( if ($env:Platform -eq 'Win32') { Write-Output -forcex86 } ) | Out-Null } -- ps: if ($env:PlatformToolset -eq 'Cygwin') { (New-Object System.Net.WebClient).DownloadFile('https://cygwin.com/setup-x86.exe', "${env:TEMP}\cygwin-setup.exe") ; . "${env:TEMP}\cygwin-setup.exe" --quiet-mode --packages autoconf automake make gcc-core libtool gcc-g++ } +- ps: if ($env:PlatformToolset -like 'MinGW*') { choco install mingw --version $env:PlatformToolset $( if ($env:Platform -eq 'MinGW32') { Write-Output -forcex86 } ) | Out-Null } build_script: - ps: scripts\appveyor_ci_build.ps1 @@ -42,4 +33,3 @@ test_script: artifacts: - path: lib\CppUTest.lib name: CppUTest - diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index 35e368ffa..f7153e7b8 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -60,14 +60,14 @@ Remove-PathFolder "C:\Program Files (x86)\Git\bin" Remove-PathFolder "C:\Program Files (x86)\Git\cmd" Remove-PathFolder "C:\Program Files (x86)\Git\usr\bin" -switch ($env:PlatformToolset) +switch -Wildcard ($env:Platform) { - 'Cygwin' + 'Cygwin*' { Invoke-CygwinCommand "autoreconf -i .. ; ../configure ; make CppUTestTests.exe CppUTestExtTests.exe" "cpputest_build" } - 'MinGW' + 'MinGW*' { $mingw_path = Get-MinGWBin @@ -80,24 +80,27 @@ switch ($env:PlatformToolset) Remove-PathFolder $mingw_path } - 'v90' + default # Assume that anything else uses Visual C++ { - $vsvarspath = Join-Path $env:VS90COMNTOOLS vsvars32.bat - Get-BatchFile($vsvarspath) - - $VS2008ProjectFiles | foreach { - Invoke-BuildCommand "vcbuild /upgrade $_" - } - - $VS2008ProjectFiles | foreach { - Invoke-BuildCommand "vcbuild $_ $env:CONFIGURATION" + if ($env:PlatformToolset -eq 'v90') + { + # Load environment variables from vsvars32.bat + $vsvarspath = Join-Path $env:VS90COMNTOOLS vsvars32.bat + Get-BatchFile($vsvarspath) + + $VS2008ProjectFiles | foreach { + Invoke-BuildCommand "vcbuild /upgrade $_" + } + + $VS2008ProjectFiles | foreach { + Invoke-BuildCommand "vcbuild $_ $env:CONFIGURATION" + } } - } - - default # Mainly for v100, should also support anything newer I think - { - $VS2010ProjectFiles | foreach { - Invoke-BuildCommand "msbuild /ToolsVersion:14.0 $logger_arg $_" + else + { + $VS2010ProjectFiles | foreach { + Invoke-BuildCommand "msbuild /ToolsVersion:14.0 $logger_arg $_" + } } } } diff --git a/scripts/appveyor_helpers.ps1 b/scripts/appveyor_helpers.ps1 index b8dfbecd0..8f6e0dd67 100644 --- a/scripts/appveyor_helpers.ps1 +++ b/scripts/appveyor_helpers.ps1 @@ -10,7 +10,7 @@ function Get-Batchfile ($file) { # Helper function to provide the bin-folder path to mingw function Get-MinGWBin() { - if ($env:Platform -eq 'x64') { + if ($env:Platform -like '*64') { Write-Output 'C:\Tools\mingw64\bin' } else { @@ -20,7 +20,7 @@ function Get-MinGWBin() { # Helper function to provide the bin-folder path to cygwin function Get-CygwinBin() { - if ($env:Platform -eq 'x64') { + if ($env:Platform -like '*64') { Write-Output 'C:\cygwin64\bin' } else { From 1b6905c3aa162f2fd1854494ae804a0a5ec1012b Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Thu, 18 Feb 2016 19:48:32 -0600 Subject: [PATCH 0140/1345] Set Configuration = Release --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index a96ce0c53..a5d47fb1c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,6 +4,7 @@ os: - Windows Server 2012 R2 environment: + Configuration: Release matrix: - Platform: Cygwin32 - Platform: MinGW32 From e7d16f4adc5a1d93e7d2a8206775453cec1e816b Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Thu, 18 Feb 2016 19:59:53 -0600 Subject: [PATCH 0141/1345] Updated to match yml files --- scripts/appveyor_ci_test.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/appveyor_ci_test.ps1 b/scripts/appveyor_ci_test.ps1 index fad1280d2..423395117 100644 --- a/scripts/appveyor_ci_test.ps1 +++ b/scripts/appveyor_ci_test.ps1 @@ -82,15 +82,15 @@ if (-not $env:APPVEYOR) } } -switch ($env:PlatformToolset) +switch -Wildcard ($env:Platform) { - 'Cygwin' + 'Cygwin*' { Invoke-CygwinTests 'cpputest_build\CppUTestTests.exe' Invoke-CygwinTests 'cpputest_build\CppUTestExtTests.exe' } - 'MinGW' + 'MinGW*' { $mingw_path = Get-MinGWBin @@ -111,4 +111,4 @@ Publish-TestResults (Get-ChildItem 'cpputest_*.xml') if (-not $env:APPVEYOR) { Write-Host "Tests Ran: $TestCount" -} \ No newline at end of file +} From 984aab5057f0c54cf42187a486c25154a4d212ab Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Thu, 18 Feb 2016 20:29:59 -0600 Subject: [PATCH 0142/1345] Fixed the install command --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index a5d47fb1c..d745c5380 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,7 +23,7 @@ environment: PlatformToolset: v140 install: -- ps: if ($env:PlatformToolset -like 'MinGW*') { choco install mingw --version $env:PlatformToolset $( if ($env:Platform -eq 'MinGW32') { 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 } ) | Out-Null } build_script: - ps: scripts\appveyor_ci_build.ps1 From 1b4b14dcf2407d3a9f52ede47a5ead049953bdb7 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Fri, 25 Mar 2016 13:14:46 -0500 Subject: [PATCH 0143/1345] Bring in cygwin changes when investigating failures --- appveyor.yml | 3 +-- scripts/appveyor_ci_build.ps1 | 8 +++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index d745c5380..da834a21a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,7 +1,6 @@ version: 3.7.0-ci{build} -os: -- Windows Server 2012 R2 +image: Visual Studio 2013 environment: Configuration: Release diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index f7153e7b8..238688545 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -26,9 +26,9 @@ function Invoke-CygwinCommand($command, $directory = '.') $cygwin_bin = Get-CygwinBin $cygwin_directory = (. "${cygwin_bin}\cygpath.exe" (Resolve-Path $directory)) - $command_wrapped = "${cygwin_bin}\bash.exe --login -c 'cd $cygwin_directory ; $command' ; `$err = `$?" + $command_wrapped = "${cygwin_bin}\bash.exe --login -c 'cd $cygwin_directory ; $command'" - Write-Host $command + Write-Host "Executing <$command> in <$cygwin_directory>" Invoke-Expression $command_wrapped if ($LASTEXITCODE -ne 0) @@ -64,7 +64,9 @@ switch -Wildcard ($env:Platform) { 'Cygwin*' { - Invoke-CygwinCommand "autoreconf -i .. ; ../configure ; make CppUTestTests.exe CppUTestExtTests.exe" "cpputest_build" + Invoke-CygwinCommand "autoreconf -i .." "cpputest_build" + Invoke-CygwinCommand "../configure" "cpputest_build" + Invoke-CygwinCommand "make CppUTestTests.exe CppUTestExtTests.exe" "cpputest_build" } 'MinGW*' From ee59f0c8f3efc60ee691a6a681ed096d05d8fc3f Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Fri, 25 Mar 2016 14:45:52 -0500 Subject: [PATCH 0144/1345] VS 2013 image needs toolsversion 12.0 --- scripts/appveyor_ci_build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index 238688545..f5cb4adff 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -101,7 +101,7 @@ switch -Wildcard ($env:Platform) else { $VS2010ProjectFiles | foreach { - Invoke-BuildCommand "msbuild /ToolsVersion:14.0 $logger_arg $_" + Invoke-BuildCommand "msbuild /ToolsVersion:12.0 $logger_arg $_" } } } From 27dc00c3be426964cb3ecafb88899b9d997fa343 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Fri, 25 Mar 2016 14:58:51 -0500 Subject: [PATCH 0145/1345] Can't build 14.0 when using VS2013 image --- appveyor.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index da834a21a..859403d37 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -18,8 +18,6 @@ environment: PlatformToolset: v90 - Platform: Win32 PlatformToolset: v100 - - Platform: Win32 - 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 e43cce64c6f4f9f284108aedc442c5b4b837eca9 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Fri, 25 Mar 2016 16:29:46 -0500 Subject: [PATCH 0146/1345] Re-add support for VS2015 Can enable this again since I now know what was causing problems with cygwin --- appveyor.yml | 4 +++- scripts/appveyor_ci_build.ps1 | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 859403d37..3e2426f83 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ version: 3.7.0-ci{build} -image: Visual Studio 2013 +image: Visual Studio 2015 environment: Configuration: Release @@ -18,6 +18,8 @@ environment: PlatformToolset: v90 - Platform: Win32 PlatformToolset: v100 + - Platform: Win32 + 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 } diff --git a/scripts/appveyor_ci_build.ps1 b/scripts/appveyor_ci_build.ps1 index f5cb4adff..238688545 100644 --- a/scripts/appveyor_ci_build.ps1 +++ b/scripts/appveyor_ci_build.ps1 @@ -101,7 +101,7 @@ switch -Wildcard ($env:Platform) else { $VS2010ProjectFiles | foreach { - Invoke-BuildCommand "msbuild /ToolsVersion:12.0 $logger_arg $_" + Invoke-BuildCommand "msbuild /ToolsVersion:14.0 $logger_arg $_" } } } From 56ec7ce355a5f47f29a74d5c7ae0c46d528a75fa Mon Sep 17 00:00:00 2001 From: Jerry Ryle Date: Sat, 26 Mar 2016 12:13:21 -0700 Subject: [PATCH 0147/1345] Corrected instances where floats are implicitly promoted to doubles. This implicit promotion triggers a warning in Apple's clang v7.3.0. --- tests/CppUTestExt/IEEE754PluginTest_c.c | 2 +- tests/CppUTestExt/MockActualCallTest.cpp | 8 ++++---- tests/CppUTestExt/MockFailureTest.cpp | 2 +- tests/CppUTestExt/MockParameterTest.cpp | 2 +- tests/CppUTestExt/MockSupport_cTest.cpp | 2 +- tests/CppUTestExt/MockSupport_cTestCFile.c | 6 +++--- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.c b/tests/CppUTestExt/IEEE754PluginTest_c.c index a856dc683..74dda7f63 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.c +++ b/tests/CppUTestExt/IEEE754PluginTest_c.c @@ -50,7 +50,7 @@ void set_underflow_c(void) void set_invalid_c(void) { - f = (float) sqrt(-1.0f); + f = (float) sqrt(-1.0); } void set_inexact_c(void) diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 190fd66cf..30b22351f 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -145,8 +145,8 @@ TEST(MockCheckedActualCall, MockIgnoredActualCallWorksAsItShould) CHECK(1l == actual.returnLongIntValueOrDefault(1l)); CHECK(0 == actual.returnUnsignedIntValue()); CHECK(1u == actual.returnUnsignedIntValueOrDefault(1u)); - DOUBLES_EQUAL(0.0f, actual.returnDoubleValue(), 0.0f); - DOUBLES_EQUAL(1.5f, actual.returnDoubleValueOrDefault(1.5f), 0.0f); + DOUBLES_EQUAL(0.0, actual.returnDoubleValue(), 0.0); + DOUBLES_EQUAL(1.5, actual.returnDoubleValueOrDefault(1.5), 0.0); STRCMP_EQUAL("bla", actual.returnStringValueOrDefault("bla")); STRCMP_EQUAL("", actual.returnStringValue()); CHECK(0 == actual.returnPointerValue()); @@ -208,8 +208,8 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) CHECK(0 == actual.returnLongIntValueOrDefault(1l)); CHECK(0 == actual.returnUnsignedIntValue()); CHECK(0 == actual.returnUnsignedIntValueOrDefault(1u)); - DOUBLES_EQUAL(0.0f, actual.returnDoubleValue(), 0.0f); - DOUBLES_EQUAL(0.0f, actual.returnDoubleValueOrDefault(1.0f), 0.0f); + DOUBLES_EQUAL(0.0, actual.returnDoubleValue(), 0.0); + DOUBLES_EQUAL(0.0, actual.returnDoubleValueOrDefault(1.0), 0.0); STRCMP_EQUAL("", actual.returnStringValueOrDefault("bla")); STRCMP_EQUAL("", actual.returnStringValue()); CHECK(0 == actual.returnPointerValue()); diff --git a/tests/CppUTestExt/MockFailureTest.cpp b/tests/CppUTestExt/MockFailureTest.cpp index 22cd3f8d3..7e9b9e417 100644 --- a/tests/CppUTestExt/MockFailureTest.cpp +++ b/tests/CppUTestExt/MockFailureTest.cpp @@ -130,7 +130,7 @@ TEST(MockFailureTest, MockUnexpectedNthAdditionalCallFailure) TEST(MockFailureTest, MockUnexpectedInputParameterFailure) { call1->withName("foo").withParameter("boo", 2); - call2->withName("foo").withParameter("boo", 3.3f); + call2->withName("foo").withParameter("boo", 3.3); call3->withName("unrelated"); addAllToList(); diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index 1f44afff6..cbea7bc76 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -680,7 +680,7 @@ TEST(MockParameterTest, ignoreOtherCallsIgnoresWithAllKindsOfParameters) .withParameter("bar", 1u) .withParameter("foo", 1l) .withParameter("hey", 1ul) - .withParameter("duh", 1.0f) + .withParameter("duh", 1.0) .withParameter("yoo", (const void*) 0) .withParameter("func", (void(*)()) 0) .withParameter("mem", (const unsigned char*) 0, 0) diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index d06619c53..7976bbb0c 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -194,7 +194,7 @@ TEST(MockSupport_c, outputParametersOfType) TEST(MockSupport_c, ignoreOtherParameters) { mock_c()->expectOneCall("foo")->withIntParameters("int", 1)->ignoreOtherParameters(); - mock_c()->actualCall("foo")->withIntParameters("int", 1)->withDoubleParameters("double", 0.01f); + mock_c()->actualCall("foo")->withIntParameters("int", 1)->withDoubleParameters("double", 0.01); mock_c()->checkExpectations(); } diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index e0bceabc6..62c017386 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -116,8 +116,8 @@ void all_mock_support_c_calls(void) mock_c()->expectOneCall("bla")->withStringParameters("str", "lol"); mock_c()->actualCall("bla")->withStringParameters("str", mock_c()->getData("string").value.stringValue); - mock_c()->setDoubleData("double", 0.001f); - mock_c()->expectOneCall("bla")->withDoubleParameters("double", 0.001f); + mock_c()->setDoubleData("double", 0.001); + mock_c()->expectOneCall("bla")->withDoubleParameters("double", 0.001); mock_c()->actualCall("bla")->withDoubleParameters("double", mock_c()->getData("double").value.doubleValue); mock_c()->setPointerData("ptr", (void*)1); @@ -144,7 +144,7 @@ void all_mock_support_c_calls(void) mock_c()->stringReturnValue(); mock_c()->returnStringValueOrDefault(""); mock_c()->doubleReturnValue(); - mock_c()->returnDoubleValueOrDefault(0.01F); + mock_c()->returnDoubleValueOrDefault(0.01); mock_c()->pointerReturnValue(); mock_c()->returnPointerValueOrDefault(0); mock_c()->constPointerReturnValue(); From aa1140d71c8d69cf935c8f333609b47b8937b122 Mon Sep 17 00:00:00 2001 From: Charles Nicholson Date: Mon, 28 Mar 2016 10:24:17 -0700 Subject: [PATCH 0148/1345] rename cpputest_set_test_output_location to cpputest_normalize_test_output_location. It no longer takes a path, but uses as the output location for IDEs like Xcode that like to insert Debug and Release into the path. --- CMakeLists.txt | 2 +- ...tion.cmake => CppUTestNormalizeTestOutputLocation.cmake} | 6 +++--- tests/CMakeLists.txt | 2 +- tests/CppUTestExt/CMakeLists.txt | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename cmake/Modules/{CppUTestSetTestOutputLocation.cmake => CppUTestNormalizeTestOutputLocation.cmake} (74%) diff --git a/CMakeLists.txt b/CMakeLists.txt index ea4a6d53b..cf63d7b03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ include("${CppUTestRootDirectory}/cmake/Modules/CppUTestConfigurationOptions.cma include(CTest) #include("${CppUTestRootDirectory}/cmake/Modules/CheckFunctionExists.cmake") include("${CppUTestRootDirectory}/cmake/Modules/CppUTestBuildTimeDiscoverTests.cmake") -include("${CppUTestRootDirectory}/cmake/Modules/CppUTestSetTestOutputLocation.cmake") +include("${CppUTestRootDirectory}/cmake/Modules/CppUTestNormalizeTestOutputLocation.cmake") configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" diff --git a/cmake/Modules/CppUTestSetTestOutputLocation.cmake b/cmake/Modules/CppUTestNormalizeTestOutputLocation.cmake similarity index 74% rename from cmake/Modules/CppUTestSetTestOutputLocation.cmake rename to cmake/Modules/CppUTestNormalizeTestOutputLocation.cmake index 409e4b0d5..acb5efb34 100644 --- a/cmake/Modules/CppUTestSetTestOutputLocation.cmake +++ b/cmake/Modules/CppUTestNormalizeTestOutputLocation.cmake @@ -1,10 +1,10 @@ # Override output properties to put test executable at specificied location -function (cpputest_set_test_output_location TEST_TARGET OUTPUT_LOCATION) - set_target_properties(${TEST_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_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} ${OUTPUT_LOCATION}) + RUNTIME_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} ${CMAKE_CURRENT_BINARY_DIR}) endforeach(OUTPUT_CONFIG) endfunction () diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index efdec91f9..9305b3dd2 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -51,7 +51,7 @@ if (${CMAKE_HOST_SYSTEM_NAME} MATCHES "OpenBSD") endif () add_executable(CppUTestTests ${CppUTestTests_src}) -cpputest_set_test_output_location(CppUTestTests "${CMAKE_BINARY_DIR}/tests") +cpputest_normalize_test_output_location(CppUTestTests) target_link_libraries(CppUTestTests CppUTest ${THREAD_LIB}) add_subdirectory(CppUTestExt) diff --git a/tests/CppUTestExt/CMakeLists.txt b/tests/CppUTestExt/CMakeLists.txt index 093fe8a4f..8039a3b52 100644 --- a/tests/CppUTestExt/CMakeLists.txt +++ b/tests/CppUTestExt/CMakeLists.txt @@ -34,6 +34,6 @@ if (MINGW) endif (MINGW) add_executable(CppUTestExtTests ${CppUTestExtTests_src}) -cpputest_set_test_output_location(CppUTestExtTests "${CMAKE_BINARY_DIR}/tests/CppUTestExt") +cpputest_normalize_test_output_location(CppUTestExtTests) target_link_libraries(CppUTestExtTests CppUTest CppUTestExt ${THREAD_LIB} ${CPPUNIT_EXTERNAL_LIBRARIES}) cpputest_buildtime_discover_tests(CppUTestExtTests) From aa236fa56c890d46f1395f67ee99414ac388c2c1 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 30 Mar 2016 07:45:53 +0100 Subject: [PATCH 0149/1345] Use -ri option rather than ugly #ifdef --- examples/AllTests/FEDemoTest.cpp | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index 26deb8fc1..06483051d 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -33,10 +33,10 @@ #ifdef CPPUTEST_HAVE_FENV /* - * Un-comment the following line to see a demonstration of failing and - * crashing tests + * To see a demonstration of tests failing as a result of IEEE754ExceptionsPlugin + * picking up floating point errors, run the test executable with the -ri option. + * */ -// #define RUN_FAILING_TESTS extern "C" { #include @@ -54,33 +54,27 @@ TEST_GROUP(FE_Demo) } }; -#ifdef RUN_FAILING_TESTS -#define FAILING_TEST TEST -#else -#define FAILING_TEST IGNORE_TEST -#endif - -FAILING_TEST(FE_Demo, should_fail_when__FE_DIVBYZERO__is_set) +IGNORE_TEST(FE_Demo, should_fail_when__FE_DIVBYZERO__is_set) { f = 1.0f; CHECK((f /= 0.0f) >= std::numeric_limits::infinity()); } -FAILING_TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) +IGNORE_TEST(FE_Demo, should_fail_when__FE_UNDERFLOW__is_set) { f = 0.01f; while (f > 0.0f) f *= f; CHECK(f == 0.0f); } -FAILING_TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) +IGNORE_TEST(FE_Demo, should_fail_when__FE_OVERFLOW__is_set) { f = 1000.0f; while (f < std::numeric_limits::infinity()) f *= f; CHECK(f >= std::numeric_limits::infinity()); } -FAILING_TEST(FE_Demo, should_fail_when__FE_INEXACT____is_set) +IGNORE_TEST(FE_Demo, should_fail_when__FE_INEXACT____is_set) { IEEE754ExceptionsPlugin::enableInexact(); f = 10.0f; From 3c0da52b1aadbc5a59e73d7f51955ca3c475f214 Mon Sep 17 00:00:00 2001 From: Asger Graarup Overby Date: Wed, 6 Apr 2016 14:49:03 +0200 Subject: [PATCH 0150/1345] Fix cast in arguments to withFunctionPointerParameters() by making void argument explicit. --- tests/CppUTestExt/MockSupport_cTestCFile.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index 62c017386..e49f34aa6 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -56,7 +56,7 @@ void all_mock_support_c_calls(void) withStringParameters("string", "string")-> withPointerParameters("pointer", (void*) 1)-> withConstPointerParameters("constpointer", (const void*) 1)-> - withFunctionPointerParameters("functionpointer", (void(*)()) 1)-> + withFunctionPointerParameters("functionpointer", (void(*)(void)) 1)-> withMemoryBufferParameter("name", (void*) 1, 0UL)-> ignoreOtherParameters(); @@ -68,7 +68,7 @@ void all_mock_support_c_calls(void) withStringParameters("string", "string")-> withPointerParameters("pointer", (void*) 1)-> withConstPointerParameters("constpointer", (const void*) 1)-> - withFunctionPointerParameters("functionpointer", (void(*)()) 1)-> + withFunctionPointerParameters("functionpointer", (void(*)(void)) 1)-> withMemoryBufferParameter("name", (void*) 1, 0UL)-> hasReturnValue(); @@ -104,7 +104,7 @@ void all_mock_support_c_calls(void) mock_c()->actualCall("boo4")->returnValue(); mock_c()->returnValue(); - mock_c()->expectOneCall("boo5")->andReturnFunctionPointerValue((void(*)()) 10); + mock_c()->expectOneCall("boo5")->andReturnFunctionPointerValue((void(*)(void)) 10); mock_c()->actualCall("boo5")->returnValue(); mock_c()->returnValue(); @@ -128,8 +128,8 @@ void all_mock_support_c_calls(void) mock_c()->expectOneCall("bla")->withConstPointerParameters("cptr", (const void*)1); mock_c()->actualCall("bla")->withConstPointerParameters("cptr", mock_c()->getData("ptr").value.constPointerValue); - mock_c()->setFunctionPointerData("ptr", (void(*)())1); - mock_c()->expectOneCall("bla")->withFunctionPointerParameters("ptr", (void(*)())1); + mock_c()->setFunctionPointerData("ptr", (void(*)(void))1); + mock_c()->expectOneCall("bla")->withFunctionPointerParameters("ptr", (void(*)(void))1); mock_c()->actualCall("bla")->withFunctionPointerParameters("ptr", mock_c()->getData("ptr").value.functionPointerValue); mock_c()->hasReturnValue(); @@ -163,7 +163,7 @@ void all_mock_support_c_calls(void) mock_c()->setStringData("bla4", "abc"); mock_c()->setPointerData("bla", (void*) 2); mock_c()->setConstPointerData("bla", (const void*) 2); - mock_c()->setFunctionPointerData("bla", (void (*)()) 2); + mock_c()->setFunctionPointerData("bla", (void (*)(void)) 2); mock_c()->setDataObject("bla", "type", (void*) 2); mock_c()->getData("bla"); From f6b1ccabe479c7bf46f5ef24c0a5565db25b736d Mon Sep 17 00:00:00 2001 From: Asger Graarup Overby Date: Wed, 6 Apr 2016 09:38:55 +0200 Subject: [PATCH 0151/1345] Provide CMake configure option for MSVC to use safe functions. --- cmake/Modules/CppUTestConfigurationOptions.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 2b3cf9a79..91436f30c 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -1,6 +1,10 @@ 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) + endif(STDC_WANT_SECURE_LIB) elseif (STD_C) set(CPP_PLATFORM Gcc) else (MSVC) From f9b80ac86be8c85228d277d7d0396fc55f832ebf Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 25 Mar 2016 08:48:12 +0100 Subject: [PATCH 0152/1345] Return proper bool --- src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index e09834fb1..b37e775ad 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -71,7 +71,7 @@ void IEEE754ExceptionsPlugin::enableInexact() bool IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(int flag) { - return fetestexcept(flag); + return fetestexcept(flag) != 0; } void IEEE754ExceptionsPlugin::ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text) From 7c44df6eb688a1ca7de1bd0361cf2acace58d17a Mon Sep 17 00:00:00 2001 From: Ma Xilai Date: Sat, 9 Apr 2016 01:14:43 +0800 Subject: [PATCH 0153/1345] (#922) MockSupport::expectNoCall does not append scope to function name --- src/CppUTestExt/MockSupport.cpp | 2 +- tests/CppUTestExt/MockCallTest.cpp | 40 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index 46762ca7e..aafbca888 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -169,7 +169,7 @@ void MockSupport::expectNoCall(const SimpleString& functionName) countCheck(); MockCheckedExpectedCall* call = new MockCheckedExpectedCall; - call->withName(functionName); + call->withName(appendScopeToName(functionName)); unExpectations_.addExpectedCall(call); } diff --git a/tests/CppUTestExt/MockCallTest.cpp b/tests/CppUTestExt/MockCallTest.cpp index 377333f16..44f3f7829 100644 --- a/tests/CppUTestExt/MockCallTest.cpp +++ b/tests/CppUTestExt/MockCallTest.cpp @@ -233,6 +233,46 @@ TEST(MockCallTest, ignoreOtherCallsExceptForTheUnExpectedOne) CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); } + +TEST(MockCallTest, expectNoCallInScopeThatHappened) +{ + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest expectations; + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "scope::lazy", expectations); + + mock("scope").expectNoCall("lazy"); + mock("scope").actualCall("lazy"); + + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); +} + +TEST(MockCallTest, expectNoCallInScopeButActualCallInAnotherScope) +{ + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest expectations; + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "scope2::lazy", expectations); + + mock("scope1").expectNoCall("lazy"); + mock("scope2").actualCall("lazy"); + + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); +} + +TEST(MockCallTest, expectNoCallInScopeButActualCallInGlobal) +{ + MockFailureReporterInstaller failureReporterInstaller; + + MockExpectedCallsListForTest expectations; + MockUnexpectedCallHappenedFailure expectedFailure(mockFailureTest(), "lazy", expectations); + + mock("scope1").expectNoCall("lazy"); + mock().actualCall("lazy"); + + CHECK_EXPECTED_MOCK_FAILURE(expectedFailure); +} + TEST(MockCallTest, ignoreOtherCallsExceptForTheExpectedOne) { mock().expectOneCall("foo"); From c923acfc307925f6ed0fc7cb23fa9bdbd22beb5d Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 13 Apr 2016 15:08:08 +0200 Subject: [PATCH 0154/1345] Make mock_c() return values type safe --- src/CppUTestExt/MockSupport_c.cpp | 18 +++---- tests/CppUTestExt/MockSupport_cTestCFile.c | 58 +++++++++++++--------- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 47c3bc524..acd7f044a 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -635,7 +635,7 @@ MockValue_c returnValue_c() int intReturnValue_c() { - return getMockValueCFromNamedValue(actualCall->returnValue()).value.intValue; + return actualCall->returnIntValue(); } int returnIntValueOrDefault_c(int defaultValue) @@ -648,7 +648,7 @@ int returnIntValueOrDefault_c(int defaultValue) unsigned int unsignedIntReturnValue_c() { - return getMockValueCFromNamedValue(actualCall->returnValue()).value.unsignedIntValue; + return actualCall->returnUnsignedIntValue(); } unsigned int returnUnsignedIntValueOrDefault_c(unsigned int defaultValue) @@ -661,7 +661,7 @@ unsigned int returnUnsignedIntValueOrDefault_c(unsigned int defaultValue) long int longIntReturnValue_c() { - return getMockValueCFromNamedValue(actualCall->returnValue()).value.longIntValue; + return actualCall->returnLongIntValue(); } long int returnLongIntValueOrDefault_c(long int defaultValue) @@ -674,7 +674,7 @@ long int returnLongIntValueOrDefault_c(long int defaultValue) unsigned long int unsignedLongIntReturnValue_c() { - return getMockValueCFromNamedValue(actualCall->returnValue()).value.unsignedLongIntValue; + return actualCall->returnUnsignedLongIntValue(); } unsigned long int returnUnsignedLongIntValueOrDefault_c(unsigned long int defaultValue) @@ -687,7 +687,7 @@ unsigned long int returnUnsignedLongIntValueOrDefault_c(unsigned long int defaul const char* stringReturnValue_c() { - return getMockValueCFromNamedValue(actualCall->returnValue()).value.stringValue; + return actualCall->returnStringValue(); } const char* returnStringValueOrDefault_c(const char * defaultValue) @@ -700,7 +700,7 @@ const char* returnStringValueOrDefault_c(const char * defaultValue) double doubleReturnValue_c() { - return getMockValueCFromNamedValue(actualCall->returnValue()).value.doubleValue; + return actualCall->returnDoubleValue(); } double returnDoubleValueOrDefault_c(double defaultValue) @@ -713,7 +713,7 @@ double returnDoubleValueOrDefault_c(double defaultValue) void* pointerReturnValue_c() { - return getMockValueCFromNamedValue(actualCall->returnValue()).value.pointerValue; + return actualCall->returnPointerValue(); } void* returnPointerValueOrDefault_c(void * defaultValue) @@ -726,7 +726,7 @@ void* returnPointerValueOrDefault_c(void * defaultValue) const void* constPointerReturnValue_c() { - return getMockValueCFromNamedValue(actualCall->returnValue()).value.constPointerValue; + return actualCall->returnConstPointerValue(); } const void* returnConstPointerValueOrDefault_c(const void * defaultValue) @@ -739,7 +739,7 @@ const void* returnConstPointerValueOrDefault_c(const void * defaultValue) void (*functionPointerReturnValue_c())() { - return getMockValueCFromNamedValue(actualCall->returnValue()).value.functionPointerValue; + return actualCall->returnFunctionPointerValue(); } void (*returnFunctionPointerValueOrDefault_c(void (*defaultValue)()))() diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index e49f34aa6..d2fc573b5 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -89,24 +89,41 @@ void all_mock_support_c_calls(void) mock_c()->clear(); mock_c()->removeAllComparatorsAndCopiers(); - mock_c()->expectOneCall("boo")->andReturnIntValue(10); - mock_c()->actualCall("boo")->returnValue(); - mock_c()->returnValue(); - mock_c()->expectOneCall("boo2")->andReturnDoubleValue(1.0); - mock_c()->actualCall("boo2")->returnValue(); - mock_c()->returnValue(); + mock_c()->expectOneCall("boo")->andReturnIntValue(-10); + mock_c()->actualCall("boo")->intReturnValue(); + mock_c()->intReturnValue(); - mock_c()->expectOneCall("boo3")->andReturnStringValue("hello world"); - mock_c()->actualCall("boo3")->returnValue(); - mock_c()->returnValue(); + mock_c()->expectOneCall("boo2")->andReturnUnsignedIntValue(1.0); + mock_c()->actualCall("boo2")->unsignedIntReturnValue(); + mock_c()->unsignedIntReturnValue(); - mock_c()->expectOneCall("boo4")->andReturnPointerValue((void*) 10); - mock_c()->actualCall("boo4")->returnValue(); - mock_c()->returnValue(); + mock_c()->expectOneCall("boo3")->andReturnLongIntValue(1.0); + mock_c()->actualCall("boo3")->longIntReturnValue(); + mock_c()->longIntReturnValue(); - mock_c()->expectOneCall("boo5")->andReturnFunctionPointerValue((void(*)(void)) 10); - mock_c()->actualCall("boo5")->returnValue(); - mock_c()->returnValue(); + mock_c()->expectOneCall("boo3")->andReturnUnsignedLongIntValue(1.0); + mock_c()->actualCall("boo3")->unsignedLongIntReturnValue(); + mock_c()->unsignedLongIntReturnValue(); + + mock_c()->expectOneCall("boo4")->andReturnDoubleValue(1.0); + mock_c()->actualCall("boo4")->doubleReturnValue(); + mock_c()->doubleReturnValue(); + + mock_c()->expectOneCall("boo5")->andReturnStringValue("hello world"); + mock_c()->actualCall("boo5")->stringReturnValue(); + mock_c()->stringReturnValue(); + + mock_c()->expectOneCall("boo6")->andReturnPointerValue((void*) 10); + mock_c()->actualCall("boo6")->pointerReturnValue(); + mock_c()->pointerReturnValue(); + + mock_c()->expectOneCall("boo7")->andReturnConstPointerValue((void*) 10); + mock_c()->actualCall("boo7")->constPointerReturnValue(); + mock_c()->constPointerReturnValue(); + + mock_c()->expectOneCall("boo8")->andReturnFunctionPointerValue((void(*)(void)) 10); + mock_c()->actualCall("boo8")->functionPointerReturnValue(); + mock_c()->functionPointerReturnValue(); mock_c()->setIntData("int", 5); mock_c()->expectOneCall("bla")->withIntParameters("int", 5); @@ -132,24 +149,17 @@ void all_mock_support_c_calls(void) mock_c()->expectOneCall("bla")->withFunctionPointerParameters("ptr", (void(*)(void))1); mock_c()->actualCall("bla")->withFunctionPointerParameters("ptr", mock_c()->getData("ptr").value.functionPointerValue); + mock_c()->clear(); + mock_c()->hasReturnValue(); - mock_c()->intReturnValue(); mock_c()->returnIntValueOrDefault(-1); - mock_c()->unsignedIntReturnValue(); mock_c()->returnUnsignedIntValueOrDefault(1); - mock_c()->longIntReturnValue(); mock_c()->returnLongIntValueOrDefault(-1L); - mock_c()->unsignedLongIntReturnValue(); mock_c()->returnUnsignedLongIntValueOrDefault(1L); - mock_c()->stringReturnValue(); mock_c()->returnStringValueOrDefault(""); - mock_c()->doubleReturnValue(); mock_c()->returnDoubleValueOrDefault(0.01); - mock_c()->pointerReturnValue(); mock_c()->returnPointerValueOrDefault(0); - mock_c()->constPointerReturnValue(); mock_c()->returnConstPointerValueOrDefault(0); - mock_c()->functionPointerReturnValue(); mock_c()->returnFunctionPointerValueOrDefault(0); mock_c()->disable(); From 5b848d9128f2ec02a88f7e2e8746aebef6cd2507 Mon Sep 17 00:00:00 2001 From: Gavin Lambert Date: Thu, 14 Apr 2016 16:33:44 +1200 Subject: [PATCH 0155/1345] Add mock support for bool; directly in C++, via int in C. --- include/CppUTestExt/MockActualCall.h | 5 ++ include/CppUTestExt/MockCheckedActualCall.h | 12 ++++ include/CppUTestExt/MockCheckedExpectedCall.h | 6 ++ include/CppUTestExt/MockExpectedCall.h | 3 + include/CppUTestExt/MockNamedValue.h | 3 + include/CppUTestExt/MockSupport.h | 3 + include/CppUTestExt/MockSupport_c.h | 10 ++++ src/CppUTestExt/MockActualCall.cpp | 38 ++++++++++++ src/CppUTestExt/MockExpectedCall.cpp | 29 ++++++++++ src/CppUTestExt/MockNamedValue.cpp | 20 ++++++- src/CppUTestExt/MockSupport.cpp | 19 ++++++ src/CppUTestExt/MockSupport_c.cpp | 56 +++++++++++++++++- tests/CppUTestExt/MockActualCallTest.cpp | 6 ++ tests/CppUTestExt/MockExpectedCallTest.cpp | 23 ++++++++ tests/CppUTestExt/MockParameterTest.cpp | 9 +++ tests/CppUTestExt/MockReturnValueTest.cpp | 58 +++++++++++++++++++ tests/CppUTestExt/MockSupportTest.cpp | 7 +++ tests/CppUTestExt/MockSupport_cTest.cpp | 38 ++++++++++++ tests/CppUTestExt/MockSupport_cTestCFile.c | 12 ++++ 19 files changed, 354 insertions(+), 3 deletions(-) diff --git a/include/CppUTestExt/MockActualCall.h b/include/CppUTestExt/MockActualCall.h index e87b9390e..496a499a0 100644 --- a/include/CppUTestExt/MockActualCall.h +++ b/include/CppUTestExt/MockActualCall.h @@ -43,6 +43,7 @@ class MockActualCall virtual MockActualCall& withName(const SimpleString& name)=0; virtual MockActualCall& withCallOrder(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); } MockActualCall& withParameter(const SimpleString& name, long int value) { return withLongIntParameter(name, value); } @@ -57,6 +58,7 @@ class MockActualCall virtual MockActualCall& withOutputParameter(const SimpleString& name, void* output)=0; virtual MockActualCall& withOutputParameterOfType(const SimpleString& typeName, const SimpleString& name, void* output)=0; + virtual MockActualCall& withBoolParameter(const SimpleString& name, bool value)=0; virtual MockActualCall& withIntParameter(const SimpleString& name, int value)=0; virtual MockActualCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value)=0; virtual MockActualCall& withLongIntParameter(const SimpleString& name, long int value)=0; @@ -71,6 +73,9 @@ class MockActualCall virtual bool hasReturnValue()=0; virtual MockNamedValue returnValue()=0; + virtual bool returnBoolValueOrDefault(bool default_value)=0; + virtual bool returnBoolValue()=0; + virtual int returnIntValueOrDefault(int default_value)=0; virtual int returnIntValue()=0; diff --git a/include/CppUTestExt/MockCheckedActualCall.h b/include/CppUTestExt/MockCheckedActualCall.h index 33e04696e..f4606cf17 100644 --- a/include/CppUTestExt/MockCheckedActualCall.h +++ b/include/CppUTestExt/MockCheckedActualCall.h @@ -39,6 +39,7 @@ class MockCheckedActualCall : public MockActualCall virtual MockActualCall& withName(const SimpleString& name) _override; virtual MockActualCall& withCallOrder(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; @@ -56,6 +57,9 @@ class MockCheckedActualCall : public MockActualCall virtual bool hasReturnValue() _override; virtual MockNamedValue returnValue() _override; + virtual bool returnBoolValueOrDefault(bool default_value) _override; + virtual bool returnBoolValue() _override; + virtual int returnIntValueOrDefault(int default_value) _override; virtual int returnIntValue() _override; @@ -147,6 +151,7 @@ class MockActualCallTrace : public MockActualCall virtual MockActualCall& withName(const SimpleString& name) _override; virtual MockActualCall& withCallOrder(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; @@ -164,6 +169,9 @@ class MockActualCallTrace : public MockActualCall virtual bool hasReturnValue() _override; virtual MockNamedValue returnValue() _override; + virtual bool returnBoolValueOrDefault(bool default_value) _override; + virtual bool returnBoolValue() _override; + virtual int returnIntValueOrDefault(int default_value) _override; virtual int returnIntValue() _override; @@ -208,6 +216,7 @@ class MockIgnoredActualCall: public MockActualCall public: virtual MockActualCall& withName(const SimpleString&) _override { return *this;} virtual MockActualCall& withCallOrder(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; } @@ -225,6 +234,9 @@ 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 returnBoolValue() _override { return false; } + virtual int returnIntValue() _override { return 0; } virtual int returnIntValueOrDefault(int value) _override { return value; } diff --git a/include/CppUTestExt/MockCheckedExpectedCall.h b/include/CppUTestExt/MockCheckedExpectedCall.h index c7dd98c45..e3f3725af 100644 --- a/include/CppUTestExt/MockCheckedExpectedCall.h +++ b/include/CppUTestExt/MockCheckedExpectedCall.h @@ -40,6 +40,7 @@ class MockCheckedExpectedCall : public MockExpectedCall virtual MockExpectedCall& withName(const SimpleString& name) _override; virtual MockExpectedCall& withCallOrder(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; @@ -55,6 +56,7 @@ class MockCheckedExpectedCall : public MockExpectedCall 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; @@ -141,6 +143,7 @@ class MockExpectedCallComposite : public MockExpectedCall virtual MockExpectedCall& withName(const SimpleString& name) _override; virtual MockExpectedCall& withCallOrder(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; @@ -156,6 +159,7 @@ class MockExpectedCallComposite : public MockExpectedCall 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; @@ -180,6 +184,7 @@ class MockIgnoredExpectedCall: public MockExpectedCall virtual MockExpectedCall& withName(const SimpleString&) _override { return *this;} virtual MockExpectedCall& withCallOrder(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; } @@ -195,6 +200,7 @@ class MockIgnoredExpectedCall: public MockExpectedCall virtual MockExpectedCall& withOutputParameterOfTypeReturning(const SimpleString&, const SimpleString&, const void*) _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; } diff --git a/include/CppUTestExt/MockExpectedCall.h b/include/CppUTestExt/MockExpectedCall.h index 642e99ded..73120e7f1 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(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); } MockExpectedCall& withParameter(const SimpleString& name, long int value) { return withLongIntParameter(name, value); } @@ -55,6 +56,7 @@ class MockExpectedCall virtual MockExpectedCall& withOutputParameterOfTypeReturning(const SimpleString& typeName, const SimpleString& name, const void* value)=0; virtual MockExpectedCall& ignoreOtherParameters()=0; + virtual MockExpectedCall& withBoolParameter(const SimpleString& name, bool value)=0; virtual MockExpectedCall& withIntParameter(const SimpleString& name, int value)=0; virtual MockExpectedCall& withUnsignedIntParameter(const SimpleString& name, unsigned int value)=0; virtual MockExpectedCall& withLongIntParameter(const SimpleString& name, long int value)=0; @@ -65,6 +67,7 @@ class MockExpectedCall virtual MockExpectedCall& withFunctionPointerParameter(const SimpleString& name, void (*value)())=0; virtual MockExpectedCall& withConstPointerParameter(const SimpleString& name, const void* value)=0; virtual MockExpectedCall& withMemoryBufferParameter(const SimpleString& name, const unsigned char* value, size_t size)=0; + virtual MockExpectedCall& andReturnValue(bool value)=0; virtual MockExpectedCall& andReturnValue(int value)=0; virtual MockExpectedCall& andReturnValue(unsigned int value)=0; virtual MockExpectedCall& andReturnValue(long int value)=0; diff --git a/include/CppUTestExt/MockNamedValue.h b/include/CppUTestExt/MockNamedValue.h index 82f71a9f0..2e08be75a 100644 --- a/include/CppUTestExt/MockNamedValue.h +++ b/include/CppUTestExt/MockNamedValue.h @@ -101,6 +101,7 @@ class MockNamedValue DEFAULT_COPY_CONSTRUCTOR(MockNamedValue) virtual ~MockNamedValue(); + virtual void setValue(bool value); virtual void setValue(int value); virtual void setValue(unsigned int value); virtual void setValue(long int value); @@ -124,6 +125,7 @@ class MockNamedValue virtual SimpleString getName() const; virtual SimpleString getType() const; + virtual bool getBoolValue() const; virtual int getIntValue() const; virtual unsigned int getUnsignedIntValue() const; virtual long int getLongIntValue() const; @@ -145,6 +147,7 @@ class MockNamedValue SimpleString name_; SimpleString type_; union { + bool boolValue_; int intValue_; unsigned int unsignedIntValue_; long int longIntValue_; diff --git a/include/CppUTestExt/MockSupport.h b/include/CppUTestExt/MockSupport.h index 8c4e0fd72..e58bf2a57 100755 --- a/include/CppUTestExt/MockSupport.h +++ b/include/CppUTestExt/MockSupport.h @@ -52,6 +52,8 @@ class MockSupport virtual MockActualCall& actualCall(const SimpleString& functionName); virtual bool hasReturnValue(); virtual MockNamedValue returnValue(); + virtual bool boolReturnValue(); + virtual bool returnBoolValueOrDefault(bool defaultValue); virtual int intReturnValue(); virtual int returnIntValueOrDefault(int defaultValue); virtual unsigned int unsignedIntReturnValue(); @@ -72,6 +74,7 @@ class MockSupport virtual void (*functionPointerReturnValue())(); bool hasData(const SimpleString& name); + void setData(const SimpleString& name, bool value); void setData(const SimpleString& name, int value); void setData(const SimpleString& name, unsigned int value); void setData(const SimpleString& name, const char* value); diff --git a/include/CppUTestExt/MockSupport_c.h b/include/CppUTestExt/MockSupport_c.h index ac9ad355d..0706d5472 100644 --- a/include/CppUTestExt/MockSupport_c.h +++ b/include/CppUTestExt/MockSupport_c.h @@ -35,6 +35,7 @@ extern "C" { #include "CppUTest/StandardCLibrary.h" typedef enum { + MOCKVALUETYPE_BOOL, MOCKVALUETYPE_UNSIGNED_INTEGER, MOCKVALUETYPE_INTEGER, MOCKVALUETYPE_LONG_INTEGER, @@ -52,6 +53,7 @@ typedef struct SMockValue_c { MockValueType_c type; union { + int boolValue; int intValue; unsigned int unsignedIntValue; long int longIntValue; @@ -69,6 +71,7 @@ typedef struct SMockValue_c typedef struct SMockActualCall_c MockActualCall_c; struct SMockActualCall_c { + MockActualCall_c* (*withBoolParameters)(const char* name, int value); MockActualCall_c* (*withIntParameters)(const char* name, int value); MockActualCall_c* (*withUnsignedIntParameters)(const char* name, unsigned int value); MockActualCall_c* (*withLongIntParameters)(const char* name, long int value); @@ -84,6 +87,8 @@ struct SMockActualCall_c MockActualCall_c* (*withOutputParameterOfType)(const char* type, const char* name, void* value); int (*hasReturnValue)(void); MockValue_c (*returnValue)(void); + int (*boolReturnValue)(void); + int (*returnBoolValueOrDefault)(int defaultValue); int (*intReturnValue)(void); int (*returnIntValueOrDefault)(int defaultValue); unsigned int (*unsignedIntReturnValue)(void); @@ -107,6 +112,7 @@ struct SMockActualCall_c typedef struct SMockExpectedCall_c MockExpectedCall_c; struct SMockExpectedCall_c { + MockExpectedCall_c* (*withBoolParameters)(const char* name, int value); MockExpectedCall_c* (*withIntParameters)(const char* name, int value); MockExpectedCall_c* (*withUnsignedIntParameters)(const char* name, unsigned int value); MockExpectedCall_c* (*withLongIntParameters)(const char* name, long int value); @@ -122,6 +128,7 @@ struct SMockExpectedCall_c MockExpectedCall_c* (*withOutputParameterOfTypeReturning)(const char* type, const char* name, const void* value); MockExpectedCall_c* (*ignoreOtherParameters)(void); + MockExpectedCall_c* (*andReturnBoolValue)(int value); MockExpectedCall_c* (*andReturnUnsignedIntValue)(unsigned int value); MockExpectedCall_c* (*andReturnIntValue)(int value); MockExpectedCall_c* (*andReturnLongIntValue)(long int value); @@ -147,6 +154,8 @@ struct SMockSupport_c MockActualCall_c* (*actualCall)(const char* name); int (*hasReturnValue)(void); MockValue_c (*returnValue)(void); + int (*boolReturnValue)(void); + int (*returnBoolValueOrDefault)(int defaultValue); int (*intReturnValue)(void); int (*returnIntValueOrDefault)(int defaultValue); unsigned int (*unsignedIntReturnValue)(void); @@ -166,6 +175,7 @@ struct SMockSupport_c void (*(*functionPointerReturnValue)(void))(void); void (*(*returnFunctionPointerValueOrDefault) (void(*defaultValue)(void)))(void); + void (*setBoolData) (const char* name, int value); void (*setIntData) (const char* name, int value); void (*setUnsignedIntData) (const char* name, unsigned int value); void (*setStringData) (const char* name, const char* value); diff --git a/src/CppUTestExt/MockActualCall.cpp b/src/CppUTestExt/MockActualCall.cpp index 6071b0a81..0cfef9a2c 100644 --- a/src/CppUTestExt/MockActualCall.cpp +++ b/src/CppUTestExt/MockActualCall.cpp @@ -197,6 +197,14 @@ void MockCheckedActualCall::checkOutputParameter(const MockNamedValue& outputPar finalizeCallWhenFulfilled(); } +MockActualCall& MockCheckedActualCall::withBoolParameter(const SimpleString& name, bool value) +{ + MockNamedValue actualParameter(name); + actualParameter.setValue(value); + checkInputParameter(actualParameter); + return *this; +} + MockActualCall& MockCheckedActualCall::withUnsignedIntParameter(const SimpleString& name, unsigned int value) { MockNamedValue actualParameter(name); @@ -364,6 +372,19 @@ MockNamedValue MockCheckedActualCall::returnValue() return MockNamedValue("no return value"); } +bool MockCheckedActualCall::returnBoolValueOrDefault(bool default_value) +{ + if (!hasReturnValue()) { + return default_value; + } + return returnBoolValue(); +} + +bool MockCheckedActualCall::returnBoolValue() +{ + return returnValue().getBoolValue(); +} + int MockCheckedActualCall::returnIntValueOrDefault(int default_value) { if (!hasReturnValue()) { @@ -559,6 +580,13 @@ void MockActualCallTrace::addParameterName(const SimpleString& name) traceBuffer_ += ":"; } +MockActualCall& MockActualCallTrace::withBoolParameter(const SimpleString& name, bool value) +{ + addParameterName(name); + traceBuffer_ += StringFrom(value); + return *this; +} + MockActualCall& MockActualCallTrace::withUnsignedIntParameter(const SimpleString& name, unsigned int value) { addParameterName(name); @@ -684,6 +712,16 @@ long int MockActualCallTrace::returnLongIntValueOrDefault(long int) return returnLongIntValue(); } +bool MockActualCallTrace::returnBoolValue() +{ + return false; +} + +bool MockActualCallTrace::returnBoolValueOrDefault(bool) +{ + return false; +} + int MockActualCallTrace::returnIntValue() { return 0; diff --git a/src/CppUTestExt/MockExpectedCall.cpp b/src/CppUTestExt/MockExpectedCall.cpp index 1d00628d0..e9f3c96d0 100644 --- a/src/CppUTestExt/MockExpectedCall.cpp +++ b/src/CppUTestExt/MockExpectedCall.cpp @@ -73,6 +73,14 @@ MockExpectedCall& MockCheckedExpectedCall::withName(const SimpleString& name) return *this; } +MockExpectedCall& MockCheckedExpectedCall::withBoolParameter(const SimpleString& name, bool value) +{ + MockNamedValue* newParameter = new MockExpectedFunctionParameter(name); + inputParameters_->add(newParameter); + newParameter->setValue(value); + return *this; +} + MockExpectedCall& MockCheckedExpectedCall::withUnsignedIntParameter(const SimpleString& name, unsigned int value) { MockNamedValue* newParameter = new MockExpectedFunctionParameter(name); @@ -401,6 +409,13 @@ bool MockCheckedExpectedCall::MockExpectedFunctionParameter::isFulfilled() const return fulfilled_; } +MockExpectedCall& MockCheckedExpectedCall::andReturnValue(bool value) +{ + returnValue_.setName("returnValue"); + returnValue_.setValue(value); + return *this; +} + MockExpectedCall& MockCheckedExpectedCall::andReturnValue(unsigned int value) { returnValue_.setName("returnValue"); @@ -536,6 +551,13 @@ MockExpectedCall& MockExpectedCallComposite::withCallOrder(int) 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_) @@ -635,6 +657,13 @@ MockExpectedCall& MockExpectedCallComposite::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_) diff --git a/src/CppUTestExt/MockNamedValue.cpp b/src/CppUTestExt/MockNamedValue.cpp index 8895722c6..169b9ac29 100644 --- a/src/CppUTestExt/MockNamedValue.cpp +++ b/src/CppUTestExt/MockNamedValue.cpp @@ -46,6 +46,12 @@ MockNamedValue::~MockNamedValue() { } +void MockNamedValue::setValue(bool value) +{ + type_ = "bool"; + value_.boolValue_ = value; +} + void MockNamedValue::setValue(unsigned int value) { type_ = "unsigned int"; @@ -138,6 +144,12 @@ SimpleString MockNamedValue::getType() const return type_; } +bool MockNamedValue::getBoolValue() const +{ + STRCMP_EQUAL("bool", type_.asCharString()); + return value_.boolValue_; +} + unsigned int MockNamedValue::getUnsignedIntValue() const { if(type_ == "int" && value_.intValue_ >= 0) @@ -268,7 +280,9 @@ bool MockNamedValue::equals(const MockNamedValue& p) const if (type_ != p.type_) return false; - if (type_ == "int") + if (type_ == "bool") + return value_.boolValue_ == p.value_.boolValue_; + else if (type_ == "int") return value_.intValue_ == p.value_.intValue_; else if (type_ == "unsigned int") return value_.unsignedIntValue_ == p.value_.unsignedIntValue_; @@ -312,7 +326,9 @@ bool MockNamedValue::compatibleForCopying(const MockNamedValue& p) const SimpleString MockNamedValue::toString() const { - if (type_ == "int") + if (type_ == "bool") + return StringFrom(value_.boolValue_); + else if (type_ == "int") return StringFrom(value_.intValue_); else if (type_ == "unsigned int") return StringFrom(value_.unsignedIntValue_); diff --git a/src/CppUTestExt/MockSupport.cpp b/src/CppUTestExt/MockSupport.cpp index aafbca888..fb307652e 100755 --- a/src/CppUTestExt/MockSupport.cpp +++ b/src/CppUTestExt/MockSupport.cpp @@ -369,6 +369,12 @@ MockNamedValue* MockSupport::retrieveDataFromStore(const SimpleString& name) return newData; } +void MockSupport::setData(const SimpleString& name, bool value) +{ + MockNamedValue* newData = retrieveDataFromStore(name); + newData->setValue(value); +} + void MockSupport::setData(const SimpleString& name, unsigned int value) { MockNamedValue* newData = retrieveDataFromStore(name); @@ -469,6 +475,11 @@ MockNamedValue MockSupport::returnValue() return MockNamedValue(""); } +bool MockSupport::boolReturnValue() +{ + return returnValue().getBoolValue(); +} + unsigned int MockSupport::unsignedIntReturnValue() { return returnValue().getUnsignedIntValue(); @@ -503,6 +514,14 @@ long int MockSupport::returnLongIntValueOrDefault(long int defaultValue) return defaultValue; } +bool MockSupport::returnBoolValueOrDefault(bool defaultValue) +{ + if (hasReturnValue()) { + return boolReturnValue(); + } + return defaultValue; +} + int MockSupport::returnIntValueOrDefault(int defaultValue) { if (hasReturnValue()) { diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index acd7f044a..485b40fe9 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -125,6 +125,7 @@ MockActualCall_c* actualCall_c(const char* name); void disable_c(); void enable_c(); void ignoreOtherCalls_c(); +void setBoolData_c(const char* name, int value); void setIntData_c(const char* name, int value); void setUnsignedIntData_c(const char* name, unsigned int value); void setDoubleData_c(const char* name, double value); @@ -141,6 +142,7 @@ int expectedCallsLeft_c(); void clear_c(); void crashOnFailure_c(unsigned shouldCrash); +MockExpectedCall_c* withBoolParameters_c(const char* name, int value); 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); @@ -155,6 +157,7 @@ MockExpectedCall_c* withParameterOfType_c(const char* type, const char* name, co 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* ignoreOtherParameters_c(); +MockExpectedCall_c* andReturnBoolValue_c(int value); MockExpectedCall_c* andReturnIntValue_c(int value); MockExpectedCall_c* andReturnUnsignedIntValue_c(unsigned int value); MockExpectedCall_c* andReturnLongIntValue_c(long int value); @@ -165,6 +168,7 @@ MockExpectedCall_c* andReturnPointerValue_c(void* value); MockExpectedCall_c* andReturnConstPointerValue_c(const void* value); MockExpectedCall_c* andReturnFunctionPointerValue_c(void (*value)()); +MockActualCall_c* withActualBoolParameters_c(const char* name, int value); 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); @@ -179,6 +183,8 @@ MockActualCall_c* withActualParameterOfType_c(const char* type, const char* name MockActualCall_c* withActualOutputParameter_c(const char* name, void* value); MockActualCall_c* withActualOutputParameterOfType_c(const char* type, const char* name, void* value); MockValue_c returnValue_c(); +int boolReturnValue_c(); +int returnBoolValueOrDefault_c(int defaultValue); int intReturnValue_c(); int returnIntValueOrDefault_c(int defaultValue); unsigned int unsignedIntReturnValue_c(); @@ -226,6 +232,7 @@ static void removeAllComparatorsAndCopiers_c() } static MockExpectedCall_c gExpectedCall = { + withBoolParameters_c, withIntParameters_c, withUnsignedIntParameters_c, withLongIntParameters_c, @@ -240,6 +247,7 @@ static MockExpectedCall_c gExpectedCall = { withOutputParameterReturning_c, withOutputParameterOfTypeReturning_c, ignoreOtherParameters_c, + andReturnBoolValue_c, andReturnUnsignedIntValue_c, andReturnIntValue_c, andReturnLongIntValue_c, @@ -252,6 +260,7 @@ static MockExpectedCall_c gExpectedCall = { }; static MockActualCall_c gActualCall = { + withActualBoolParameters_c, withActualIntParameters_c, withActualUnsignedIntParameters_c, withActualLongIntParameters_c, @@ -267,6 +276,8 @@ static MockActualCall_c gActualCall = { withActualOutputParameterOfType_c, hasReturnValue_c, returnValue_c, + boolReturnValue_c, + returnBoolValueOrDefault_c, intReturnValue_c, returnIntValueOrDefault_c, unsignedIntReturnValue_c, @@ -295,6 +306,8 @@ static MockSupport_c gMockSupport = { actualCall_c, hasReturnValue_c, returnValue_c, + boolReturnValue_c, + returnBoolValueOrDefault_c, intReturnValue_c, returnIntValueOrDefault_c, unsignedIntReturnValue_c, @@ -313,6 +326,7 @@ static MockSupport_c gMockSupport = { returnConstPointerValueOrDefault_c, functionPointerReturnValue_c, returnFunctionPointerValueOrDefault_c, + setBoolData_c, setIntData_c, setUnsignedIntData_c, setStringData_c, @@ -334,6 +348,12 @@ static MockSupport_c gMockSupport = { removeAllComparatorsAndCopiers_c }; +MockExpectedCall_c* withBoolParameters_c(const char* name, int value) +{ + expectedCall = &expectedCall->withParameter(name, (value != 0)); + return &gExpectedCall; +} + MockExpectedCall_c* withIntParameters_c(const char* name, int value) { expectedCall = &expectedCall->withParameter(name, value); @@ -418,6 +438,12 @@ MockExpectedCall_c* ignoreOtherParameters_c() return &gExpectedCall; } +MockExpectedCall_c* andReturnBoolValue_c(int value) +{ + expectedCall = &expectedCall->andReturnValue(value != 0); + return &gExpectedCall; +} + MockExpectedCall_c* andReturnUnsignedIntValue_c(unsigned int value) { expectedCall = &expectedCall->andReturnValue(value); @@ -475,7 +501,11 @@ MockExpectedCall_c* andReturnFunctionPointerValue_c(void (*value)()) static MockValue_c getMockValueCFromNamedValue(const MockNamedValue& namedValue) { MockValue_c returnValue; - if (SimpleString::StrCmp(namedValue.getType().asCharString(), "int") == 0) { + if (SimpleString::StrCmp(namedValue.getType().asCharString(), "bool") == 0) { + returnValue.type = MOCKVALUETYPE_BOOL; + returnValue.value.boolValue = namedValue.getBoolValue() ? 1 : 0; + } + else if (SimpleString::StrCmp(namedValue.getType().asCharString(), "int") == 0) { returnValue.type = MOCKVALUETYPE_INTEGER; returnValue.value.intValue = namedValue.getIntValue(); } @@ -550,6 +580,12 @@ MockActualCall_c* actualCall_c(const char* name) return &gActualCall; } +MockActualCall_c* withActualBoolParameters_c(const char* name, int value) +{ + actualCall = &actualCall->withParameter(name, (value != 0)); + return &gActualCall; +} + MockActualCall_c* withActualIntParameters_c(const char* name, int value) { actualCall = &actualCall->withParameter(name, value); @@ -633,6 +669,19 @@ MockValue_c returnValue_c() return getMockValueCFromNamedValue(actualCall->returnValue()); } +int boolReturnValue_c() +{ + return actualCall->returnBoolValue() ? 1 : 0; +} + +int returnBoolValueOrDefault_c(int defaultValue) +{ + if (!hasReturnValue_c()) { + return defaultValue; + } + return boolReturnValue_c(); +} + int intReturnValue_c() { return actualCall->returnIntValue(); @@ -765,6 +814,11 @@ void ignoreOtherCalls_c() currentMockSupport->ignoreOtherCalls(); } +void setBoolData_c(const char* name, int value) +{ + currentMockSupport->setData(name, (value != 0)); +} + void setIntData_c(const char* name, int value) { currentMockSupport->setData(name, value); diff --git a/tests/CppUTestExt/MockActualCallTest.cpp b/tests/CppUTestExt/MockActualCallTest.cpp index 30b22351f..e221208df 100644 --- a/tests/CppUTestExt/MockActualCallTest.cpp +++ b/tests/CppUTestExt/MockActualCallTest.cpp @@ -137,6 +137,8 @@ TEST(MockCheckedActualCall, MockIgnoredActualCallWorksAsItShould) actual.withName("func"); actual.withCallOrder(1); + CHECK(false == actual.returnBoolValue()); + CHECK(false == actual.returnBoolValueOrDefault(true)); CHECK(0 == actual.returnUnsignedLongIntValue()); CHECK(0 == actual.returnIntValue()); CHECK(1ul == actual.returnUnsignedLongIntValueOrDefault(1ul)); @@ -170,6 +172,7 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) actual.withCallOrder(1); actual.onObject(&value); + actual.withBoolParameter("bool", true); actual.withUnsignedIntParameter("unsigned_int", (unsigned int) 1); actual.withUnsignedLongIntParameter("unsigned_long", (unsigned long)1); actual.withLongIntParameter("long_int", (long int) 1); @@ -183,6 +186,7 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) expectedString += " withCallOrder:1"; expectedString += " onObject:0x"; expectedString += HexStringFrom(&value); + expectedString += " bool:true"; expectedString += " unsigned_int: 1 (0x00000001)"; expectedString += " unsigned_long:1 (0x1)"; expectedString += " long_int:1"; @@ -199,6 +203,8 @@ TEST(MockCheckedActualCall, remainderOfMockActualCallTraceWorksAsItShould) CHECK_FALSE(actual.hasReturnValue()); CHECK(actual.returnValue().equals(MockNamedValue(""))); + CHECK(false == actual.returnBoolValue()); + CHECK(false == actual.returnBoolValueOrDefault(true)); CHECK(0 == actual.returnLongIntValue()); CHECK(0 == actual.returnUnsignedLongIntValue()); CHECK(0 == actual.returnIntValue()); diff --git a/tests/CppUTestExt/MockExpectedCallTest.cpp b/tests/CppUTestExt/MockExpectedCallTest.cpp index 78bf8ca3f..c8d546b68 100644 --- a/tests/CppUTestExt/MockExpectedCallTest.cpp +++ b/tests/CppUTestExt/MockExpectedCallTest.cpp @@ -189,6 +189,14 @@ TEST(MockExpectedCall, callWithIntegerParameter) CHECK(call->hasInputParameterWithName("integer")); } +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")); +} + TEST(MockExpectedCall, callWithUnsignedLongIntegerParameter) { const SimpleString name = "unsigned long integer"; @@ -564,6 +572,12 @@ TEST_GROUP(MockExpectedCallComposite) } }; +TEST(MockExpectedCallComposite, hasBoolParameter) +{ + composite.withParameter("param", true); + STRCMP_EQUAL("name -> bool param: ", call.callToString().asCharString()); +} + TEST(MockExpectedCallComposite, hasLongIntParameter) { composite.withParameter("param", (long int) -1); @@ -619,6 +633,13 @@ TEST(MockExpectedCallComposite, hasOutputParameterOfTypeReturning) 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); @@ -716,6 +737,7 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.withName("func"); ignored.withCallOrder(1); ignored.onObject((void*) 0); + ignored.withBoolParameter("umm", true); ignored.withIntParameter("bla", (int) 1); ignored.withUnsignedIntParameter("foo", (unsigned int) 1); ignored.withLongIntParameter("hey", (long int) 1); @@ -730,6 +752,7 @@ TEST(MockIgnoredExpectedCall, worksAsItShould) ignored.withOutputParameterReturning("bar", (void*) 0, 1); ignored.withOutputParameterOfTypeReturning("mytype", "bar", (const void*) 0); ignored.ignoreOtherParameters(); + ignored.andReturnValue(true); ignored.andReturnValue((double) 1.0f); ignored.andReturnValue((unsigned int) 1); ignored.andReturnValue((int) 1); diff --git a/tests/CppUTestExt/MockParameterTest.cpp b/tests/CppUTestExt/MockParameterTest.cpp index cbea7bc76..64f6d15f6 100644 --- a/tests/CppUTestExt/MockParameterTest.cpp +++ b/tests/CppUTestExt/MockParameterTest.cpp @@ -37,6 +37,14 @@ TEST_GROUP(MockParameterTest) } }; +TEST(MockParameterTest, expectOneBooleanParameterAndValue) +{ + mock().expectOneCall("foo").withParameter("parameter", true); + mock().actualCall("foo").withParameter("parameter", true); + + mock().checkExpectations(); +} + TEST(MockParameterTest, expectOneUnsignedIntegerParameterAndValue) { unsigned int value = 14400; @@ -677,6 +685,7 @@ TEST(MockParameterTest, ignoreOtherCallsIgnoresWithAllKindsOfParameters) { mock().ignoreOtherCalls(); mock().actualCall("boo") + .withParameter("umm", true) .withParameter("bar", 1u) .withParameter("foo", 1l) .withParameter("hey", 1ul) diff --git a/tests/CppUTestExt/MockReturnValueTest.cpp b/tests/CppUTestExt/MockReturnValueTest.cpp index bfaab8ca5..afeff76d5 100644 --- a/tests/CppUTestExt/MockReturnValueTest.cpp +++ b/tests/CppUTestExt/MockReturnValueTest.cpp @@ -202,6 +202,23 @@ TEST(MockReturnValueTest, WhenNoLongIntegerReturnValueIsExpectedButThereIsADefau LONGS_EQUAL(default_return_value, mock().returnLongIntValueOrDefault(default_return_value)); } +TEST(MockReturnValueTest, WhenABooleanReturnValueIsExpectedAndAlsoThereIsADefaultShouldlIgnoreTheDefault) +{ + bool default_return_value = true; + bool expected_return_value = false; + mock().expectOneCall("foo").andReturnValue(expected_return_value); + CHECK_EQUAL(expected_return_value, mock().actualCall("foo").returnBoolValueOrDefault(default_return_value)); + CHECK_EQUAL(expected_return_value, mock().returnBoolValueOrDefault(default_return_value)); +} + +TEST(MockReturnValueTest, WhenNoBooleanReturnValueIsExpectedButThereIsADefaultShouldlUseTheDefaultValue) +{ + bool default_return_value = true; + mock().expectOneCall("foo"); + CHECK_EQUAL(default_return_value, mock().actualCall("foo").returnBoolValueOrDefault(default_return_value)); + CHECK_EQUAL(default_return_value, mock().returnBoolValueOrDefault(default_return_value)); +} + TEST(MockReturnValueTest, WhenAIntegerReturnValueIsExpectedAndAlsoThereIsADefaultShouldlIgnoreTheDefault) { int default_return_value = 777; @@ -219,6 +236,47 @@ TEST(MockReturnValueTest, WhenNoIntegerReturnValueIsExpectedButThereIsADefaultSh LONGS_EQUAL(default_return_value, mock().returnIntValueOrDefault(default_return_value)); } +TEST(MockReturnValueTest, BooleanReturnValue) +{ + bool expected_value = true; + mock().expectOneCall("foo").andReturnValue(true); + MockActualCall& actual_call = mock().actualCall("foo"); + + CHECK_EQUAL(expected_value, actual_call.returnValue().getBoolValue()); + CHECK_EQUAL(expected_value, actual_call.returnBoolValue()); + + CHECK_EQUAL(expected_value, mock().returnValue().getBoolValue()); + CHECK_EQUAL(expected_value, mock().boolReturnValue()); +} + +TEST(MockReturnValueTest, BooleanReturnValueSetsDifferentValues) +{ + bool expected_value = true; + bool another_expected_value = false; + + mock().expectOneCall("foo").andReturnValue(expected_value); + mock().expectOneCall("foo").andReturnValue(another_expected_value); + + CHECK_EQUAL(expected_value, mock().actualCall("foo").returnValue().getBoolValue()); + CHECK_EQUAL(expected_value, mock().returnValue().getBoolValue()); + CHECK_EQUAL(another_expected_value, mock().actualCall("foo").returnValue().getBoolValue()); + CHECK_EQUAL(another_expected_value, mock().returnValue().getBoolValue()); +} + +TEST(MockReturnValueTest, BooleanReturnValueSetsDifferentValuesWhileParametersAreIgnored) +{ + bool ret_value = true; + bool another_ret_value = false; + + mock().expectOneCall("foo").withParameter("p1", 1).ignoreOtherParameters().andReturnValue(ret_value); + mock().expectOneCall("foo").withParameter("p1", 1).ignoreOtherParameters().andReturnValue(another_ret_value); + + CHECK_EQUAL(ret_value, mock().actualCall("foo").withParameter("p1", 1).returnValue().getBoolValue()); + CHECK_EQUAL(ret_value, mock().returnValue().getBoolValue()); + CHECK_EQUAL(another_ret_value, mock().actualCall("foo").withParameter("p1", 1).returnValue().getBoolValue()); + CHECK_EQUAL(another_ret_value, mock().returnValue().getBoolValue()); +} + TEST(MockReturnValueTest, IntegerReturnValue) { int expected_value = 1; diff --git a/tests/CppUTestExt/MockSupportTest.cpp b/tests/CppUTestExt/MockSupportTest.cpp index bf35f5a36..4c616dd5d 100644 --- a/tests/CppUTestExt/MockSupportTest.cpp +++ b/tests/CppUTestExt/MockSupportTest.cpp @@ -58,6 +58,13 @@ TEST(MockSupportTest, setDataForIntegerValues) LONGS_EQUAL(expected_data, mock().getData("data").getIntValue()); } +TEST(MockSupportTest, setDataForBooleanValues) +{ + bool expected_data = true; + mock().setData("data", expected_data); + CHECK_EQUAL(expected_data, mock().getData("data").getBoolValue()); +} + TEST(MockSupportTest, hasDataBeenSet) { CHECK(!mock().hasData("data")); diff --git a/tests/CppUTestExt/MockSupport_cTest.cpp b/tests/CppUTestExt/MockSupport_cTest.cpp index 7976bbb0c..8fc55ec70 100644 --- a/tests/CppUTestExt/MockSupport_cTest.cpp +++ b/tests/CppUTestExt/MockSupport_cTest.cpp @@ -130,6 +130,12 @@ TEST(MockSupport_c, expectAndActualParametersOnObject) mock_c()->removeAllComparatorsAndCopiers(); } +TEST(MockSupport_c, boolParameter) +{ + mock_c()->expectOneCall("foo")->withBoolParameters("p", 1); + mock_c()->actualCall("foo")->withBoolParameters("p", 1); +} + TEST(MockSupport_c, unsignedIntParameter) { mock_c()->expectOneCall("foo")->withUnsignedIntParameters("p", 1); @@ -198,6 +204,32 @@ TEST(MockSupport_c, ignoreOtherParameters) mock_c()->checkExpectations(); } +TEST(MockSupport_c, returnBoolValue) +{ + int expected_value = 1; + mock_c()->expectOneCall("boo")->andReturnBoolValue(expected_value); + CHECK_EQUAL(expected_value, mock_c()->actualCall("boo")->boolReturnValue()); + CHECK_EQUAL(expected_value, mock_c()->boolReturnValue()); + LONGS_EQUAL(MOCKVALUETYPE_BOOL, mock_c()->returnValue().type); +} + +TEST(MockSupport_c, whenReturnValueIsGivenReturnBoolValueOrDefaultShouldIgnoreTheDefault) +{ + int defaultValue = 1; + int expectedValue = 0; + mock_c()->expectOneCall("foo")->andReturnBoolValue(expectedValue); + LONGS_EQUAL(expectedValue, mock_c()->actualCall("foo")->returnBoolValueOrDefault(defaultValue)); + LONGS_EQUAL(expectedValue, mock_c()->returnBoolValueOrDefault(defaultValue)); +} + +TEST(MockSupport_c, whenNoReturnValueIsGivenReturnBoolValueOrDefaultShouldlUseTheDefaultValue) +{ + int defaultValue = 1; + mock_c()->expectOneCall("foo"); + LONGS_EQUAL(defaultValue, mock_c()->actualCall("foo")->returnBoolValueOrDefault(defaultValue)); + LONGS_EQUAL(defaultValue, mock_c()->returnBoolValueOrDefault(defaultValue)); +} + TEST(MockSupport_c, returnIntValue) { int expected_value = -10; @@ -432,6 +464,12 @@ TEST(MockSupport_c, MockSupportWithScope) mock_scope_c("scope")->actualCall("boo"); } +TEST(MockSupport_c, MockSupportSetBoolData) +{ + mock_c()->setBoolData("boolean", 1); + CHECK_EQUAL(1, mock_c()->getData("boolean").value.boolValue); +} + TEST(MockSupport_c, MockSupportSetIntData) { mock_c()->setIntData("integer", 10); diff --git a/tests/CppUTestExt/MockSupport_cTestCFile.c b/tests/CppUTestExt/MockSupport_cTestCFile.c index d2fc573b5..38155c7a5 100644 --- a/tests/CppUTestExt/MockSupport_cTestCFile.c +++ b/tests/CppUTestExt/MockSupport_cTestCFile.c @@ -49,6 +49,7 @@ void all_mock_support_c_calls(void) mock_c()->checkExpectations(); mock_c()->expectOneCall("boo")->withIntParameters("integer", 1)-> + withBoolParameters("bool", 1)-> withUnsignedIntParameters("unsigned", 1)-> withLongIntParameters("long int", (long int) -1)-> withUnsignedLongIntParameters("unsigned long int", (unsigned long int) 1)-> @@ -61,6 +62,7 @@ void all_mock_support_c_calls(void) ignoreOtherParameters(); mock_c()->actualCall("boo")->withIntParameters("integer", 1)-> + withBoolParameters("bool", 1)-> withUnsignedIntParameters("unsigned", 1)-> withLongIntParameters("long int", (long int) -1)-> withUnsignedLongIntParameters("unsigned long int", (unsigned long int) 1)-> @@ -89,9 +91,14 @@ void all_mock_support_c_calls(void) mock_c()->clear(); mock_c()->removeAllComparatorsAndCopiers(); + mock_c()->expectOneCall("boo")->andReturnBoolValue(1); + mock_c()->actualCall("boo")->boolReturnValue(); + mock_c()->boolReturnValue(); + mock_c()->expectOneCall("boo")->andReturnIntValue(-10); mock_c()->actualCall("boo")->intReturnValue(); mock_c()->intReturnValue(); + mock_c()->returnValue(); mock_c()->expectOneCall("boo2")->andReturnUnsignedIntValue(1.0); mock_c()->actualCall("boo2")->unsignedIntReturnValue(); @@ -125,6 +132,10 @@ void all_mock_support_c_calls(void) mock_c()->actualCall("boo8")->functionPointerReturnValue(); mock_c()->functionPointerReturnValue(); + mock_c()->setBoolData("bool", 1); + mock_c()->expectOneCall("bla")->withBoolParameters("bool", 1); + mock_c()->actualCall("bla")->withBoolParameters("bool", mock_c()->getData("bool").value.boolValue); + mock_c()->setIntData("int", 5); mock_c()->expectOneCall("bla")->withIntParameters("int", 5); mock_c()->actualCall("bla")->withIntParameters("int", mock_c()->getData("int").value.intValue); @@ -152,6 +163,7 @@ void all_mock_support_c_calls(void) mock_c()->clear(); mock_c()->hasReturnValue(); + mock_c()->returnBoolValueOrDefault(1); mock_c()->returnIntValueOrDefault(-1); mock_c()->returnUnsignedIntValueOrDefault(1); mock_c()->returnLongIntValueOrDefault(-1L); From 73796fb2b97481ffee0b9066c548a9155491c118 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 18 Apr 2016 21:03:37 +0800 Subject: [PATCH 0156/1345] Removed the CPPUTEST_COMPILATION from cmake and autotools. Seems not used --- build/MakefileWorker.mk | 2 -- cmake/Modules/CppUTestConfigurationOptions.cmake | 2 -- config.h.cmake | 2 -- configure.ac | 2 -- tests/PreprocessorTest.cpp | 10 ---------- 5 files changed, 18 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index b46e36cfd..db945199b 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -262,8 +262,6 @@ ifeq ($(CPPUTEST_USE_STD_C_LIB), N) CPPUTEST_CPPFLAGS += -nostdinc endif -CPPUTEST_CPPFLAGS += -DCPPUTEST_COMPILATION - ifeq ($(CPPUTEST_USE_MEM_LEAK_DETECTION), N) CPPUTEST_CPPFLAGS += -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED else diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 91436f30c..fcefa5c31 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -74,5 +74,3 @@ if (CPPUTEST_FLAGS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CPPUTEST_CXX_FLAGS}") set(CMAKE_LD_FLAGS "${CMAKE_LD_FLAGS} ${CPPUTEST_LD_FLAGS}") endif (CPPUTEST_FLAGS) - -set(CPPUTEST_COMPILATION 1) diff --git a/config.h.cmake b/config.h.cmake index 06b369062..13f3396b8 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -1,8 +1,6 @@ #ifndef CONFIG_H_ #define CONFIG_H_ -#cmakedefine CPPUTEST_COMPILATION @CPPUTEST_COMPILATION@ - #cmakedefine CPPUTEST_MEM_LEAK_DETECTION_DISABLED #cmakedefine CPPUTEST_STD_C_LIB_DISABLED diff --git a/configure.ac b/configure.ac index a4855c5aa..b99403965 100644 --- a/configure.ac +++ b/configure.ac @@ -451,8 +451,6 @@ AC_SUBST([CPPUTEST_HAS_GCC]) AC_SUBST([CPPUTEST_HAS_CLANG]) AC_SUBST([ALL_FILES_IN_GIT]) -AC_DEFINE([CPPUTEST_COMPILATION], [1], [Compiling CppUTest itself]) - LT_INIT AC_CONFIG_FILES([Makefile]) AC_OUTPUT diff --git a/tests/PreprocessorTest.cpp b/tests/PreprocessorTest.cpp index 19795f8e1..3207972f6 100644 --- a/tests/PreprocessorTest.cpp +++ b/tests/PreprocessorTest.cpp @@ -31,13 +31,3 @@ TEST_GROUP(PreprocessorTest) { }; -/* TODO: Need to fix this on all platforms! */ -#if 0 -#ifndef CPPUTEST_COMPILATION - -TEST(PreprocessorTest, FailWhenCPPUTEST_COMPILATIONIsNotDefined) -{ - FAIL("CPPUTEST_COMPILATION should always be defined when compiling CppUTest"); -} -#endif -#endif From ca0dcaa3e0b3e165cc1bebaced616df4614c170c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 18 Apr 2016 21:32:08 +0800 Subject: [PATCH 0157/1345] Install a generated config.h which is prefixed --- m4/m4_ax_prefix_config_h.m4 | 203 ++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 m4/m4_ax_prefix_config_h.m4 diff --git a/m4/m4_ax_prefix_config_h.m4 b/m4/m4_ax_prefix_config_h.m4 new file mode 100644 index 000000000..c17563f44 --- /dev/null +++ b/m4/m4_ax_prefix_config_h.m4 @@ -0,0 +1,203 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_prefix_config_h.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PREFIX_CONFIG_H [(OUTPUT-HEADER [,PREFIX [,ORIG-HEADER]])] +# +# DESCRIPTION +# +# Generate an installable config.h. +# +# A package should not normally install its config.h as a system header, +# but if it must, this macro can be used to avoid namespace pollution by +# making a copy of config.h with a prefix added to all the macro names. +# +# Each "#define SOMEDEF" line of the configuration header has the given +# prefix added, in the same case as the first character of the macro name. +# +# Defaults: +# +# OUTPUT-HEADER = $PACKAGE-config.h +# PREFIX = $PACKAGE +# ORIG-HEADER, from AM_CONFIG_HEADER(config.h) +# +# Your configure.ac script should contain both macros in this order. +# +# Example: +# +# AC_INIT(config.h.in) # config.h.in as created by "autoheader" +# AM_INIT_AUTOMAKE(testpkg, 0.1.1) # makes #undef VERSION and PACKAGE +# AM_CONFIG_HEADER(config.h) # prep config.h from config.h.in +# AX_PREFIX_CONFIG_H(mylib/_config.h) # prep mylib/_config.h from it.. +# AC_MEMORY_H # makes "#undef NEED_MEMORY_H" +# AC_C_CONST_H # makes "#undef const" +# AC_OUTPUT(Makefile) # creates the "config.h" now +# # and also mylib/_config.h +# +# If the argument to AX_PREFIX_CONFIG_H would have been omitted then the +# default output file would have been called simply "testpkg-config.h", +# but even under the name "mylib/_config.h" it contains prefix-defines +# like +# +# #ifndef TESTPKG_VERSION +# #define TESTPKG_VERSION "0.1.1" +# #endif +# #ifndef TESTPKG_NEED_MEMORY_H +# #define TESTPKG_NEED_MEMORY_H 1 +# #endif +# #ifndef _testpkg_const +# #define _testpkg_const _const +# #endif +# +# and this "mylib/_config.h" can be installed along with other header +# files, which is most convenient when creating a shared library (that has +# some headers) whose functionality depends on features detected at +# compile-time. No need to invent some "mylib-confdefs.h.in" manually. +# +# Note that some AC_DEFINEs that end up in the config.h file are actually +# self-referential - e.g. AC_C_INLINE, AC_C_CONST, and the AC_TYPE_OFF_T +# say that they "will define inline|const|off_t if the system does not do +# it by itself". You might want to clean up about these - consider an +# extra mylib/conf.h that reads something like: +# +# #include +# #ifndef _testpkg_const +# #define _testpkg_const const +# #endif +# +# and then start using _testpkg_const in the header files. That is also a +# good thing to differentiate whether some library-user has starting to +# take up with a different compiler, so perhaps it could read something +# like this: +# +# #ifdef _MSC_VER +# #include +# #else +# #include +# #endif +# #ifndef _testpkg_const +# #define _testpkg_const const +# #endif +# +# LICENSE +# +# Copyright (c) 2014 Reuben Thomas +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2008 Marten Svantesson +# Copyright (c) 2008 Gerald Point +# +# 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 15 + +AC_DEFUN([AX_PREFIX_CONFIG_H],[dnl +AC_PREREQ([2.62]) +AC_BEFORE([AC_CONFIG_HEADERS],[$0])dnl +AC_CONFIG_COMMANDS(m4_default([$1], [$PACKAGE-config.h]),[dnl +AS_VAR_PUSHDEF([_OUT],[ac_prefix_conf_OUT])dnl +AS_VAR_PUSHDEF([_DEF],[ac_prefix_conf_DEF])dnl +AS_VAR_PUSHDEF([_PKG],[ac_prefix_conf_PKG])dnl +AS_VAR_PUSHDEF([_LOW],[ac_prefix_conf_LOW])dnl +AS_VAR_PUSHDEF([_UPP],[ac_prefix_conf_UPP])dnl +AS_VAR_PUSHDEF([_INP],[ac_prefix_conf_INP])dnl +m4_pushdef([_script],[conftest.prefix])dnl +m4_pushdef([_symbol],[m4_cr_Letters[]m4_cr_digits[]_])dnl +_OUT=`echo m4_default([$1], [$PACKAGE-config.h])` +_DEF=`echo _$_OUT | sed -e "y:m4_cr_letters:m4_cr_LETTERS[]:" -e "s/@<:@^m4_cr_Letters@:>@/_/g"` +_PKG=`echo m4_default([$2], [$PACKAGE])` +_LOW=`echo _$_PKG | sed -e "y:m4_cr_LETTERS-:m4_cr_letters[]_:"` +_UPP=`echo $_PKG | sed -e "y:m4_cr_letters-:m4_cr_LETTERS[]_:" -e "/^@<:@m4_cr_digits@:>@/s/^/_/"` +_INP=`echo "$3" | sed -e 's/ *//'` +if test ".$_INP" = "."; then + for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue + case "$ac_file" in + *.h) _INP=$ac_file ;; + *) + esac + test ".$_INP" != "." && break + done +fi +if test ".$_INP" = "."; then + case "$_OUT" in + */*) _INP=`basename "$_OUT"` + ;; + *-*) _INP=`echo "$_OUT" | sed -e "s/@<:@_symbol@:>@*-//"` + ;; + *) _INP=config.h + ;; + esac +fi +if test -z "$_PKG" ; then + AC_MSG_ERROR([no prefix for _PREFIX_PKG_CONFIG_H]) +else + if test ! -f "$_INP" ; then if test -f "$srcdir/$_INP" ; then + _INP="$srcdir/$_INP" + fi fi + AC_MSG_NOTICE(creating $_OUT - prefix $_UPP for $_INP defines) + if test -f $_INP ; then + AS_ECHO(["s/^@%:@undef *\\(@<:@m4_cr_LETTERS[]_@:>@\\)/@%:@undef $_UPP""_\\1/"]) > _script + AS_ECHO(["s/^@%:@undef *\\(@<:@m4_cr_letters@:>@\\)/@%:@undef $_LOW""_\\1/"]) >> _script + AS_ECHO(["s/^@%:@def[]ine *\\(@<:@m4_cr_LETTERS[]_@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_UPP""_\\1\\"]) >> _script + AS_ECHO(["@%:@def[]ine $_UPP""_\\1\\2\\"]) >> _script + AS_ECHO(["@%:@endif/"]) >> _script + AS_ECHO(["s/^@%:@def[]ine *\\(@<:@m4_cr_letters@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_LOW""_\\1\\"]) >> _script + AS_ECHO(["@%:@define $_LOW""_\\1\\2\\"]) >> _script + AS_ECHO(["@%:@endif/"]) >> _script + # now executing _script on _DEF input to create _OUT output file + echo "@%:@ifndef $_DEF" >$tmp/pconfig.h + echo "@%:@def[]ine $_DEF 1" >>$tmp/pconfig.h + echo ' ' >>$tmp/pconfig.h + echo /'*' $_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h + + sed -f _script $_INP >>$tmp/pconfig.h + echo ' ' >>$tmp/pconfig.h + echo '/* once:' $_DEF '*/' >>$tmp/pconfig.h + echo "@%:@endif" >>$tmp/pconfig.h + if cmp -s $_OUT $tmp/pconfig.h 2>/dev/null; then + AC_MSG_NOTICE([$_OUT is unchanged]) + else + ac_dir=`AS_DIRNAME(["$_OUT"])` + AS_MKDIR_P(["$ac_dir"]) + rm -f "$_OUT" + mv $tmp/pconfig.h "$_OUT" + fi + else + AC_MSG_ERROR([input file $_INP does not exist - skip generating $_OUT]) + fi + rm -f conftest.* +fi +m4_popdef([_symbol])dnl +m4_popdef([_script])dnl +AS_VAR_POPDEF([_INP])dnl +AS_VAR_POPDEF([_UPP])dnl +AS_VAR_POPDEF([_LOW])dnl +AS_VAR_POPDEF([_PKG])dnl +AS_VAR_POPDEF([_DEF])dnl +AS_VAR_POPDEF([_OUT])dnl +],[PACKAGE="$PACKAGE"])]) From 21c515eb3b328a586c72b03e5401d440ebac7c74 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 19 Apr 2016 10:41:28 +0800 Subject: [PATCH 0158/1345] Forgot to add these --- Makefile.am | 3 ++- configure.ac | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index bee2b5d26..86e1170e2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -80,7 +80,8 @@ include_cpputest_HEADERS = \ include/CppUTest/TestResult.h \ include/CppUTest/TestTestingFixture.h \ include/CppUTest/Utest.h \ - include/CppUTest/UtestMacros.h + include/CppUTest/UtestMacros.h \ + CppUTestGeneratedConfig.h lib_libCppUTestExt_a_CPPFLAGS = $(lib_libCppUTest_a_CPPFLAGS) lib_libCppUTestExt_a_CFLAGS = $(lib_libCppUTest_a_CFLAGS) diff --git a/configure.ac b/configure.ac index b99403965..a9d186564 100644 --- a/configure.ac +++ b/configure.ac @@ -4,6 +4,7 @@ AC_INIT([CppUTest], [3.7.2], [https://github.com/cpputest/cpputest]) AM_INIT_AUTOMAKE([subdir-objects]) AC_CONFIG_SRCDIR([src/CppUTest/Utest.cpp]) AC_CONFIG_HEADERS([config.h]) +AX_PREFIX_CONFIG_H(CppUTestGeneratedConfig.h) AC_CONFIG_FILES([cpputest.pc]) AC_CONFIG_MACRO_DIR([m4]) AC_LIBTOOL_DLOPEN From beeb82f4b3fd8342ed9dc742c14ec2635ee83b9f Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 19 Apr 2016 14:52:10 +0800 Subject: [PATCH 0159/1345] Used the installed generated config.h file --- Makefile.am | 2 +- configure.ac | 2 +- include/CppUTest/CppUTestConfig.h | 4 +- include/CppUTest/CppUTestGeneratedConfig.h | 47 ++++++++++++++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 include/CppUTest/CppUTestGeneratedConfig.h diff --git a/Makefile.am b/Makefile.am index 86e1170e2..020ea3680 100644 --- a/Makefile.am +++ b/Makefile.am @@ -81,7 +81,7 @@ include_cpputest_HEADERS = \ include/CppUTest/TestTestingFixture.h \ include/CppUTest/Utest.h \ include/CppUTest/UtestMacros.h \ - CppUTestGeneratedConfig.h + generated/CppUTestGeneratedConfig.h lib_libCppUTestExt_a_CPPFLAGS = $(lib_libCppUTest_a_CPPFLAGS) lib_libCppUTestExt_a_CFLAGS = $(lib_libCppUTest_a_CFLAGS) diff --git a/configure.ac b/configure.ac index a9d186564..7c09bf8a1 100644 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,7 @@ AC_INIT([CppUTest], [3.7.2], [https://github.com/cpputest/cpputest]) AM_INIT_AUTOMAKE([subdir-objects]) AC_CONFIG_SRCDIR([src/CppUTest/Utest.cpp]) AC_CONFIG_HEADERS([config.h]) -AX_PREFIX_CONFIG_H(CppUTestGeneratedConfig.h) +AX_PREFIX_CONFIG_H(generated/CppUTestGeneratedConfig.h) AC_CONFIG_FILES([cpputest.pc]) AC_CONFIG_MACRO_DIR([m4]) AC_LIBTOOL_DLOPEN diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index eda52114d..b570293f4 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -29,8 +29,8 @@ #ifndef CPPUTESTCONFIG_H_ #define CPPUTESTCONFIG_H_ -#ifdef HAVE_CONFIG_H -#include "config.h" +#ifndef CPPUTEST_USE_OWN_CONFIGURATION +#include "CppUTestGeneratedConfig.h" #endif /* diff --git a/include/CppUTest/CppUTestGeneratedConfig.h b/include/CppUTest/CppUTestGeneratedConfig.h new file mode 100644 index 000000000..94e293f9c --- /dev/null +++ b/include/CppUTest/CppUTestGeneratedConfig.h @@ -0,0 +1,47 @@ +/* + * 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. + */ + +/* + * This file is confusing, sorry for that :) Please never edit this file. + * + * It serves 3 purposes + * + * 1) When you installed CppUTest on your system (make install), then this file should be overwritten by one that + * actually contains some configuration of your system. Mostly info such as availability of types, headers, etc. + * 2) When you build CppUTest using autotools, this file will be included and it will include the generated file. + * That should be the same file as will be installed if you run make install + * 3) When you use CppUTest on another platform that doesn't require configuration, then this file does nothing and + * should be harmless. + * + * If you have done make install and you still found this text, then please report a bug :) + * + */ + +#ifdef HAVE_CONFIG_H +#include "generated/CppUTestGeneratedConfig.h" +#endif + From 79b1694a509ad78ea137ab3ae835104ad4fa7304 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 19 Apr 2016 21:35:29 +0800 Subject: [PATCH 0160/1345] Changed the prefixes of the AC_DEFINES and added prefix for GTEST includes --- build/MakefileWorker.mk | 2 +- cmake/Modules/CppUTestConfigurationOptions.cmake | 2 +- configure.ac | 6 +++--- tests/CppUTestExt/AllTests.cpp | 4 ++-- tests/CppUTestExt/GMockTest.cpp | 2 +- tests/CppUTestExt/GTest1Test.cpp | 2 +- tests/CppUTestExt/GTest2ConvertorTest.cpp | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index db945199b..5146aaa34 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -291,7 +291,7 @@ ifdef $(GMOCK_HOME) CPPUTEST_CPPFLAGS += -I$(GMOCK_HOME)/include GMOCK_LIBRARY = $(GMOCK_HOME)/lib/.libs/libgmock.a LD_LIBRARIES += $(GMOCK_LIBRARY) - CPPUTEST_CPPFLAGS += -DINCLUDE_GTEST_TESTS + CPPUTEST_CPPFLAGS += -DCPPUTEST_INCLUDE_GTEST_TESTS CPPUTEST_WARNINGFLAGS = CPPUTEST_CPPFLAGS += -I$(GTEST_HOME)/include -I$(GTEST_HOME) GTEST_LIBRARY = $(GTEST_HOME)/lib/.libs/libgtest.a diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index fcefa5c31..8383a4b92 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -56,7 +56,7 @@ endif (C++11) set(GMOCK_HOME $ENV{GMOCK_HOME}) if (DEFINED ENV{GMOCK_HOME}) # GMock pulls in gtest. - set(INCLUDE_GTEST_TESTS 1) + 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") diff --git a/configure.ac b/configure.ac index 7c09bf8a1..03a84250a 100644 --- a/configure.ac +++ b/configure.ac @@ -327,7 +327,7 @@ if test "x${use_std_c}" = xno; then memory_leak_detection=no CPPUTEST_CPPFLAGS="${CPPUTEST_CPPFLAGS} -nostdinc" CPPUTEST_LDFLAGS="${CPPUTEST_LDFLAGS} -nostdlib" - AC_DEFINE([CPPUTEST_STD_C_LIB_DISABLED], [1], [Standard C library disabled]) + AC_DEFINE([STD_C_LIB_DISABLED], [1], [Standard C library disabled]) CPP_PLATFORM="GccNoStdC" else CPP_PLATFORM="Gcc" @@ -335,7 +335,7 @@ fi # Using standard C++ if test "x${use_std_cpp}" = xno; then - AC_DEFINE([CPPUTEST_STD_CPP_LIB_DISABLED], 1, [Standard C++ library disabled]) + AC_DEFINE([STD_CPP_LIB_DISABLED], 1, [Standard C++ library disabled]) if test "x${use_std_c}" = xyes; then CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} -nostdinc++" @@ -353,7 +353,7 @@ fi # Dealing with memory leak detection if test "x${memory_leak_detection}" = xno; then - AC_DEFINE([CPPUTEST_MEM_LEAK_DETECTION_DISABLED], 1, [memory leak detection disabled]) + AC_DEFINE([MEM_LEAK_DETECTION_DISABLED], 1, [memory leak detection disabled]) else CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} -include ${srcdir}/include/CppUTest/MemoryLeakDetectorNewMacros.h" CPPUTEST_CPPFLAGS="${CPPUTEST_CPPFLAGS} -include ${srcdir}/include/CppUTest/MemoryLeakDetectorMallocMacros.h" diff --git a/tests/CppUTestExt/AllTests.cpp b/tests/CppUTestExt/AllTests.cpp index d0caf8d60..5ca0bf79f 100644 --- a/tests/CppUTestExt/AllTests.cpp +++ b/tests/CppUTestExt/AllTests.cpp @@ -30,13 +30,13 @@ #include "CppUTestExt/MemoryReporterPlugin.h" #include "CppUTestExt/MockSupportPlugin.h" -#ifdef INCLUDE_GTEST_TESTS +#ifdef CPPUTEST_INCLUDE_GTEST_TESTS #include "CppUTestExt/GTestConvertor.h" #endif int main(int ac, const char** av) { -#ifdef INCLUDE_GTEST_TESTS +#ifdef CPPUTEST_INCLUDE_GTEST_TESTS GTestConvertor convertor; convertor.addAllGTestToTestRegistry(); #endif diff --git a/tests/CppUTestExt/GMockTest.cpp b/tests/CppUTestExt/GMockTest.cpp index 184afb6b5..a3698ef2d 100644 --- a/tests/CppUTestExt/GMockTest.cpp +++ b/tests/CppUTestExt/GMockTest.cpp @@ -25,7 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifdef INCLUDE_GTEST_TESTS +#ifdef CPPUTEST_INCLUDE_GTEST_TESTS #include "CppUTestExt/GMock.h" #include "CppUTest/TestHarness.h" diff --git a/tests/CppUTestExt/GTest1Test.cpp b/tests/CppUTestExt/GTest1Test.cpp index aa1bf9d98..ae787ba2c 100644 --- a/tests/CppUTestExt/GTest1Test.cpp +++ b/tests/CppUTestExt/GTest1Test.cpp @@ -25,7 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifdef INCLUDE_GTEST_TESTS +#ifdef CPPUTEST_INCLUDE_GTEST_TESTS #undef new #include "CppUTestExt/GTest.h" diff --git a/tests/CppUTestExt/GTest2ConvertorTest.cpp b/tests/CppUTestExt/GTest2ConvertorTest.cpp index 11ef66e73..f65e5ea1e 100644 --- a/tests/CppUTestExt/GTest2ConvertorTest.cpp +++ b/tests/CppUTestExt/GTest2ConvertorTest.cpp @@ -25,7 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifdef INCLUDE_GTEST_TESTS +#ifdef CPPUTEST_INCLUDE_GTEST_TESTS #include "CppUTestExt/GTestConvertor.h" @@ -68,7 +68,7 @@ TEST_GROUP(GTestConvertor) { }; -#ifdef INCLUDE_GTEST_TESTS +#ifdef CPPUTEST_INCLUDE_GTEST_TESTS /* * These tests depend on the amount of GTests that are actually added (also in other files). From 09010cd36055b0278eca88c9d8733247786256a8 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 Apr 2016 09:14:17 +0800 Subject: [PATCH 0161/1345] Added prefix to HAVE_FORK --- src/Platforms/Gcc/UtestPlatform.cpp | 2 +- tests/UtestTest.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Platforms/Gcc/UtestPlatform.cpp b/src/Platforms/Gcc/UtestPlatform.cpp index 77427bc33..a9f0b2301 100644 --- a/src/Platforms/Gcc/UtestPlatform.cpp +++ b/src/Platforms/Gcc/UtestPlatform.cpp @@ -53,7 +53,7 @@ static jmp_buf test_exit_jmp_buf[10]; static int jmp_buf_index = 0; -#ifndef HAVE_FORK +#ifndef CPPUTEST_HAVE_FORK static void GccPlatformSpecificRunTestInASeperateProcess(UtestShell* shell, TestPlugin*, TestResult* result) { diff --git a/tests/UtestTest.cpp b/tests/UtestTest.cpp index 0ccb94a97..64bcbbf6e 100644 --- a/tests/UtestTest.cpp +++ b/tests/UtestTest.cpp @@ -193,7 +193,7 @@ TEST(UtestShell, RunInSeparateProcessTest) fixture.assertPrintContains("Failed in separate process"); } -#ifndef HAVE_FORK +#ifndef CPPUTEST_HAVE_FORK IGNORE_TEST(UtestShell, TestDefaultCrashMethodInSeparateProcessTest) {} From 6c17874f4729bfb367598cc11895e480df0038d0 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 Apr 2016 09:17:04 +0800 Subject: [PATCH 0162/1345] Forgot a FORK and changed the CMakefile --- CMakeLists.txt | 4 ++-- tests/UtestPlatformTest.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cf63d7b03..3a450217c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ include(CheckFunctionExists) set (CMAKE_REQUIRED_INCLUDES "unistd.h") check_function_exists(fork HAVE_FORK) if(HAVE_FORK) - add_definitions(-DHAVE_FORK) + add_definitions(-DCPPUTEST_HAVE_FORK) endif(HAVE_FORK) option(STD_C "Use the standard C library" ON) @@ -49,7 +49,7 @@ configure_file ( "${PROJECT_BINARY_DIR}/config.h" ) include_directories(${PROJECT_BINARY_DIR}) -add_definitions(-DHAVE_CONFIG_H) +add_definitions(-DCPPUTEST_HAVE_CONFIG_H) include_directories(${CppUTestRootDirectory}/include) add_subdirectory(src/CppUTest) diff --git a/tests/UtestPlatformTest.cpp b/tests/UtestPlatformTest.cpp index 290f9f33c..cf8bbd469 100644 --- a/tests/UtestPlatformTest.cpp +++ b/tests/UtestPlatformTest.cpp @@ -40,7 +40,7 @@ TEST_GROUP(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess) TestTestingFixture fixture; }; -#ifndef HAVE_FORK +#ifndef CPPUTEST_HAVE_FORK TEST(UTestPlatformsTest_PlatformSpecificRunTestInASeperateProcess, DummyFailsWithMessage) { From 18a6d93c7db822942d00eee57a095247d2e1a639 Mon Sep 17 00:00:00 2001 From: Gavin Lambert Date: Fri, 15 Apr 2016 18:12:16 +1200 Subject: [PATCH 0163/1345] Add test support for long long. --- configure.ac | 7 ++ include/CppUTest/CppUTestConfig.h | 21 +++++ include/CppUTest/SimpleString.h | 4 + include/CppUTest/TestFailure.h | 18 +++++ include/CppUTest/Utest.h | 2 + include/CppUTest/UtestMacros.h | 19 +++++ src/CppUTest/SimpleString.cpp | 56 ++++++++++++++ src/CppUTest/TestFailure.cpp | 45 +++++++++++ src/CppUTest/Utest.cpp | 26 +++++++ tests/SimpleStringTest.cpp | 22 ++++++ tests/TestFailureTest.cpp | 28 +++++++ tests/TestUTestMacro.cpp | 123 ++++++++++++++++++++++++++++++ 12 files changed, 371 insertions(+) diff --git a/configure.ac b/configure.ac index 03a84250a..73655bfc1 100644 --- a/configure.ac +++ b/configure.ac @@ -56,6 +56,7 @@ AC_TYPE_UINT16_T AC_TYPE_UINT32_T AC_TYPE_UINT64_T AC_TYPE_UINT8_T +AC_TYPE_LONG_LONG_INT # Checks for library functions. AC_FUNC_FORK @@ -187,6 +188,12 @@ 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" +# FLag -Wno-long-long. +CXXFLAGS="-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])]) +CFLAGS="$saved_cflags" + # FLag -Wno-global-constructors. AC_LANG_PUSH([C++]) CXXFLAGS="-Werror -Wno-global-constructors" diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index b570293f4..866875ce4 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -199,6 +199,27 @@ #define CPPUTEST_CHAR_BIT 8 #endif +/* Support for "long long" type */ +#ifdef CPPUTEST_USE_LONG_LONG +typedef long long cpputest_longlong; +typedef unsigned long long cpputest_ulonglong; +#define CPPUTEST_LONGLONG_DEFAULT ((cpputest_longlong)0) +#define CPPUTEST_ULONGLONG_DEFAULT ((cpputest_ulonglong)0U) +#else +/* Define some placeholders to disable the overloaded methods. + * It's not required to have these match the size of the "real" type, but it's occasionally convenient. + */ +#if defined(CPPUTEST_64BIT) && !defined(CPPUTEST_64BIT_32BIT_LONGS) +typedef struct { char dummy[16]; } cpputest_longlong; +typedef struct { char dummy[16]; } cpputest_ulonglong; +#else +typedef struct { char dummy[8]; } cpputest_longlong; +typedef struct { char dummy[8]; } cpputest_ulonglong; +#endif +#define CPPUTEST_LONGLONG_DEFAULT cpputest_longlong() +#define CPPUTEST_ULONGLONG_DEFAULT cpputest_ulonglong() +#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))) #define CPPUTEST_COMPILER_FULLY_SUPPORTS_CXX11 diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index b4f06aca9..295eea33b 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -141,8 +141,12 @@ SimpleString StringFrom(int value); SimpleString StringFrom(unsigned int value); SimpleString StringFrom(long value); SimpleString StringFrom(unsigned long value); +SimpleString StringFrom(cpputest_longlong value); +SimpleString StringFrom(cpputest_ulonglong value); SimpleString HexStringFrom(long value); SimpleString HexStringFrom(unsigned long value); +SimpleString HexStringFrom(cpputest_longlong value); +SimpleString HexStringFrom(cpputest_ulonglong value); SimpleString HexStringFrom(const void* value); SimpleString HexStringFrom(void (*value)()); SimpleString StringFrom(double value, int precision = 6); diff --git a/include/CppUTest/TestFailure.h b/include/CppUTest/TestFailure.h index 8090483ea..9bb1f9b04 100644 --- a/include/CppUTest/TestFailure.h +++ b/include/CppUTest/TestFailure.h @@ -135,6 +135,18 @@ class UnsignedLongsEqualFailure : public TestFailure UnsignedLongsEqualFailure(UtestShell* test, const char* fileName, int 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); +}; + +class UnsignedLongLongsEqualFailure : public TestFailure +{ +public: + UnsignedLongLongsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, cpputest_ulonglong expected, cpputest_ulonglong actual, const SimpleString& text); +}; + class StringEqualFailure : public TestFailure { public: @@ -159,4 +171,10 @@ class BitsEqualFailure : public TestFailure BitsEqualFailure(UtestShell* test, const char* fileName, int 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); +}; + #endif diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index a2378bdc0..83509d899 100755 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -113,6 +113,8 @@ class UtestShell 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 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()); diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index f3ae780fe..b62df4a4e 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -208,6 +208,25 @@ #define UNSIGNED_LONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ { 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__) + +#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__) + +#define UNSIGNED_LONGLONGS_EQUAL_TEXT(expected, actual, text)\ + 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); } + +#define UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ + { UtestShell::getCurrent()->assertUnsignedLongLongsEqual(expected, actual, text, file, line); } + + #define BYTES_EQUAL(expected, actual)\ LONGS_EQUAL((expected) & 0xff,(actual) & 0xff) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 208ff054b..f09523d45 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -478,6 +478,40 @@ SimpleString HexStringFrom(unsigned long value) return StringFromFormat("%lx", value); } +#ifdef CPPUTEST_USE_LONG_LONG + +SimpleString StringFrom(cpputest_longlong value) +{ + return StringFromFormat("%lld", value); +} + +SimpleString StringFrom(cpputest_ulonglong value) +{ + return StringFromFormat("%llu (0x%llx)", value, value); +} + +SimpleString HexStringFrom(cpputest_longlong value) +{ + return StringFromFormat("%llx", value); +} + +SimpleString HexStringFrom(cpputest_ulonglong value) +{ + return StringFromFormat("%llx", value); +} + +SimpleString HexStringFrom(const void* value) +{ + return HexStringFrom((cpputest_ulonglong) value); +} + +SimpleString HexStringFrom(void (*value)()) +{ + return HexStringFrom((cpputest_ulonglong) value); +} + +#else /* CPPUTEST_USE_LONG_LONG */ + static long convertPointerToLongValue(const void* value) { /* @@ -500,6 +534,26 @@ static long convertFunctionPointerToLongValue(void (*value)()) return *long_value; } +SimpleString StringFrom(cpputest_longlong) +{ + return ""; +} + +SimpleString StringFrom(cpputest_ulonglong) +{ + return ""; +} + +SimpleString HexStringFrom(cpputest_longlong) +{ + return ""; +} + +SimpleString HexStringFrom(cpputest_ulonglong) +{ + return ""; +} + SimpleString HexStringFrom(const void* value) { return StringFromFormat("%lx", convertPointerToLongValue(value)); @@ -510,6 +564,8 @@ SimpleString HexStringFrom(void (*value)()) return StringFromFormat("%lx", convertFunctionPointerToLongValue(value)); } +#endif /* CPPUTEST_USE_LONG_LONG */ + SimpleString StringFrom(double value, int precision) { if (PlatformSpecificIsNan(value)) diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index d01513080..d98fd20a4 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -272,6 +272,42 @@ 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) +: TestFailure(test, fileName, lineNumber) +{ + 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 + " 0x" + aHex; + SimpleString expectedReported = eDecimal + " 0x" + eHex; + message_ += createButWasString(expectedReported, actualReported); +} + +UnsignedLongLongsEqualFailure::UnsignedLongLongsEqualFailure(UtestShell* test, const char* fileName, int lineNumber, cpputest_ulonglong expected, cpputest_ulonglong actual, const SimpleString& text) +: TestFailure(test, fileName, lineNumber) +{ + 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 + " 0x" + aHex; + SimpleString expectedReported = eDecimal + " 0x" + eHex; + message_ += createButWasString(expectedReported, actualReported); +} + StringEqualFailure::StringEqualFailure(UtestShell* test, const char* fileName, int lineNumber, const char* expected, const char* actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { @@ -326,3 +362,12 @@ 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, + const SimpleString& featureName, const SimpleString& text) +: TestFailure(test, fileName, lineNumber) +{ + 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());; +} diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 31ba27e0a..3bc31960e 100755 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -429,6 +429,32 @@ void UtestShell::assertUnsignedLongsEqual(unsigned long expected, unsigned long 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) +{ + getTestResult()->countCheck(); +#ifdef CPPUTEST_USE_LONG_LONG + if (expected != actual) + failWith(LongLongsEqualFailure(this, fileName, lineNumber, expected, actual, text), testTerminator); +#else + (void)expected; + (void)actual; + failWith(FeatureUnsupportedFailure(this, fileName, lineNumber, "CPPUTEST_USE_LONG_LONG", text), testTerminator); +#endif +} + +void UtestShell::assertUnsignedLongLongsEqual(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) +{ + getTestResult()->countCheck(); +#ifdef CPPUTEST_USE_LONG_LONG + if (expected != actual) + failWith(UnsignedLongLongsEqualFailure(this, fileName, lineNumber, expected, actual, text), testTerminator); +#else + (void)expected; + (void)actual; + failWith(FeatureUnsupportedFailure(this, fileName, lineNumber, "CPPUTEST_USE_LONG_LONG", text), testTerminator); +#endif +} + void UtestShell::assertPointersEqual(const void* expected, const void* actual, const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator) { getTestResult()->countCheck(); diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 60c5427c2..a5d04e32c 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -493,6 +493,23 @@ TEST(SimpleString, UnsignedLongInts) CHECK(s == s2); } +#ifdef CPPUTEST_USE_LONG_LONG + +TEST(SimpleString, LongLongInts) +{ + SimpleString s(StringFrom((long long)1)); + CHECK(s == "1"); +} + +TEST(SimpleString, UnsignedLongLongInts) +{ + SimpleString s(StringFrom((unsigned long long)1)); + SimpleString s2(StringFrom((unsigned long long)1)); + CHECK(s == s2); +} + +#endif /* CPPUTEST_USE_LONG_LONG */ + TEST(SimpleString, Doubles) { SimpleString s(StringFrom(1.2)); @@ -534,6 +551,11 @@ TEST(SimpleString, HexStrings) SimpleString h1 = HexStringFrom(0xffffL); STRCMP_EQUAL("ffff", h1.asCharString()); +#ifdef CPPUTEST_USE_LONG_LONG + SimpleString h15 = HexStringFrom(0xffffLL); + STRCMP_EQUAL("ffff", h15.asCharString()); +#endif + SimpleString h2 = HexStringFrom((void *)0xfffeL); STRCMP_EQUAL("fffe", h2.asCharString()); diff --git a/tests/TestFailureTest.cpp b/tests/TestFailureTest.cpp index f1c91d78e..bdb73a6cd 100644 --- a/tests/TestFailureTest.cpp +++ b/tests/TestFailureTest.cpp @@ -139,6 +139,28 @@ TEST(TestFailure, LongsEqualFailure) 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); +#else + LongLongsEqualFailure f(test, failFileName, failLineNumber, CPPUTEST_LONGLONG_DEFAULT, CPPUTEST_LONGLONG_DEFAULT, ""); + FAILURE_EQUAL("expected < 0x>\n\tbut was < 0x>", f); +#endif +} + +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); +#else + UnsignedLongLongsEqualFailure f(test, failFileName, failLineNumber, CPPUTEST_ULONGLONG_DEFAULT, CPPUTEST_ULONGLONG_DEFAULT, ""); + FAILURE_EQUAL("expected < 0x>\n\tbut was < 0x>", f); +#endif +} + TEST(TestFailure, StringsEqualFailureWithText) { StringEqualFailure f(test, failFileName, failLineNumber, "abc", "abd", "text"); @@ -390,3 +412,9 @@ TEST(TestFailure, BitsEqual32Bit) 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); } + +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); +} diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index c6300b28d..3c182e549 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -261,6 +261,129 @@ 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 + +static void _LONGLONGS_EQUALTestMethod() +{ + LONGLONGS_EQUAL(1, 1); + LONGLONGS_EQUAL(1, 0); +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, TestLONGLONGS_EQUAL) +{ + runTestWithMethod(_LONGLONGS_EQUALTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1 0x1>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0 0x0>"); +} + +TEST(UnitTestMacros, LONGLONGS_EQUALBehavesAsProperMacro) +{ + if (false) LONGLONGS_EQUAL(1, 0) + else LONGLONGS_EQUAL(1, 1) +} + +IGNORE_TEST(UnitTestMacros, LONGLONGS_EQUALWorksInAnIgnoredTest) +{ + LONGLONGS_EQUAL(1, 0); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +static void _LONGLONGS_EQUAL_TEXTTestMethod() +{ + LONGLONGS_EQUAL_TEXT(1, 0, "Failed because it failed"); +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, TestLONGLONGS_EQUAL_TEXT) +{ + 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"); +} + +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") +} + +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() +{ + UNSIGNED_LONGLONGS_EQUAL(1, 1); + UNSIGNED_LONGLONGS_EQUAL(1, 0); +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, TestUNSIGNED_LONGLONGS_EQUAL) +{ + 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>"); +} + +TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALBehavesAsProperMacro) +{ + if (false) UNSIGNED_LONGLONGS_EQUAL(1, 0) + else UNSIGNED_LONGLONGS_EQUAL(1, 1) +} + +IGNORE_TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALWorksInAnIgnoredTest) +{ + UNSIGNED_LONGLONGS_EQUAL(1, 0); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +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) +{ + 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("Failed because it failed"); +} + +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") +} + +IGNORE_TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUAL_TEXTWorksInAnIgnoredTest) +{ + UNSIGNED_LONGLONGS_EQUAL_TEXT(1, 0, "Failed because it failed"); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + + +#else /* CPPUTEST_USE_LONG_LONG */ + +static void _LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod() +{ + LONGLONGS_EQUAL(CPPUTEST_LONGLONG_DEFAULT, CPPUTEST_LONGLONG_DEFAULT); +} // LCOV_EXCL_LINE +static void _UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod() +{ + UNSIGNED_LONGLONGS_EQUAL(CPPUTEST_ULONGLONG_DEFAULT, CPPUTEST_ULONGLONG_DEFAULT); +} // LCOV_EXCL_LINE + +TEST(UnitTestMacros, LONGLONGS_EQUALFailsWithUnsupportedFeature) +{ + runTestWithMethod(_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("\"CPPUTEST_USE_LONG_LONG\" is not supported"); +} +TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeature) +{ + 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() { CHECK(false); From 08adf6b63f33a13c45cfa6b82e5c2d5f4df405dd Mon Sep 17 00:00:00 2001 From: Gavin Lambert Date: Fri, 15 Apr 2016 22:27:54 +1200 Subject: [PATCH 0164/1345] Add build option for longlong Enabled by default in Visual Studio projects (but not for CMake to VS). Enabled for Travis cmake_coverage build. Disabled by default in all other cases. --- CMakeLists.txt | 2 ++ CppUTest.dsp | 4 ++-- CppUTest.mak | 4 ++-- CppUTest.vcproj | 4 ++-- CppUTest.vcxproj | 6 +++--- build/MakefileWorker.mk | 9 +++++++++ cmake/Modules/CppUTestConfigurationOptions.cmake | 4 ++++ cmake/Modules/CppUTestWarningFlags.cmake | 1 + config.h.cmake | 1 + configure.ac | 9 +++++++++ scripts/travis_ci_build.sh | 2 +- tests/AllTests.dsp | 4 ++-- tests/AllTests.mak | 4 ++-- tests/AllTests.vcproj | 4 ++-- tests/AllTests.vcxproj | 6 +++--- 15 files changed, 45 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3a450217c..4f7a60dd8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,7 @@ 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(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) @@ -129,6 +130,7 @@ Current compiler options: Features configured in CppUTest: Memory Leak Detection: ${MEMORY_LEAK_DETECTION} Compiling Extensions: ${EXTENSIONS} + Support Long Long: ${LONGLONG} Use CppUTest flags: ${CPPUTEST_FLAGS} Using Standard C library: ${STD_C} diff --git a/CppUTest.dsp b/CppUTest.dsp index 00d06d894..f13f8216e 100644 --- a/CppUTest.dsp +++ b/CppUTest.dsp @@ -41,7 +41,7 @@ RSC=rc.exe # 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" /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 @@ -64,7 +64,7 @@ LIB32=link.exe -lib # 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" /FR /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" diff --git a/CppUTest.mak b/CppUTest.mak index f58acf4f6..52b1aca6a 100644 --- a/CppUTest.mak +++ b/CppUTest.mak @@ -77,7 +77,7 @@ CLEAN : "$(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" /Fp"$(INTDIR)\CppUTest.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c +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= \ @@ -204,7 +204,7 @@ CLEAN : "$(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" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c +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= \ diff --git a/CppUTest.vcproj b/CppUTest.vcproj index c0e057764..73acd4987 100644 --- a/CppUTest.vcproj +++ b/CppUTest.vcproj @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories=".\include\Platforms\VisualCpp,.\include" - PreprocessorDefinitions="WIN32;_DEBUG;_LIB;STDC_WANT_SECURE_LIB" + PreprocessorDefinitions="WIN32;_DEBUG;_LIB;STDC_WANT_SECURE_LIB;CPPUTEST_USE_LONG_LONG" BasicRuntimeChecks="3" RuntimeLibrary="3" PrecompiledHeaderFile=".\Debug/CppUTest.pch" @@ -113,7 +113,7 @@ Optimization="0" InlineFunctionExpansion="1" AdditionalIncludeDirectories=".\include\Platforms\VisualCpp,.\include" - PreprocessorDefinitions="WIN32;NDEBUG;_LIB;STDC_WANT_SECURE_LIB" + PreprocessorDefinitions="WIN32;NDEBUG;_LIB;STDC_WANT_SECURE_LIB;CPPUTEST_USE_LONG_LONG" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index fe44bc6af..11fbecf20 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -48,7 +48,7 @@ Disabled .\include;.\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) - _LIB;WIN32;_DEBUG;STDC_WANT_SECURE_LIB;%(PreprocessorDefinitions) + _LIB;WIN32;_DEBUG;STDC_WANT_SECURE_LIB;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 @@ -81,7 +81,7 @@ Disabled .\include;.\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) OnlyExplicitInline - WIN32;NDEBUG;_LIB;STDC_WANT_SECURE_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;STDC_WANT_SECURE_LIB;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) true MultiThreadedDLL true @@ -194,4 +194,4 @@ - \ No newline at end of file + diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index 5146aaa34..cfe2b561c 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -160,6 +160,11 @@ ifndef CPPUTEST_USE_STD_CPP_LIB CPPUTEST_USE_STD_CPP_LIB = Y endif +# Use long long, off by default +ifndef CPPUTEST_USE_LONG_LONG + CPPUTEST_USE_LONG_LONG = N +endif + # Use gcov, off by default ifndef CPPUTEST_USE_GCOV CPPUTEST_USE_GCOV = N @@ -273,6 +278,10 @@ else endif endif +ifeq ($(CPPUTEST_USE_LONG_LONG), Y) + CPPUTEST_CPPFLAGS += -DCPPUTEST_USE_LONG_LONG +endif + ifeq ($(CPPUTEST_ENABLE_DEBUG), Y) CPPUTEST_CXXFLAGS += -g CPPUTEST_CFLAGS += -g diff --git a/cmake/Modules/CppUTestConfigurationOptions.cmake b/cmake/Modules/CppUTestConfigurationOptions.cmake index 8383a4b92..634482cec 100644 --- a/cmake/Modules/CppUTestConfigurationOptions.cmake +++ b/cmake/Modules/CppUTestConfigurationOptions.cmake @@ -38,6 +38,10 @@ else (MEMORY_LEAK_DETECTION) set(CPPUTEST_MEM_LEAK_DETECTION_DISABLED 1) endif (MEMORY_LEAK_DETECTION) +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/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index 5833246d2..83e3c8df5 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -36,6 +36,7 @@ else (MSVC) Wno-disabled-macro-expansion Wno-reserved-id-macro Wno-keyword-macro + Wno-long-long ) if (NOT GMOCK AND NOT REAL_GTEST) diff --git a/config.h.cmake b/config.h.cmake index 13f3396b8..e8a4b9fd4 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -2,6 +2,7 @@ #define CONFIG_H_ #cmakedefine CPPUTEST_MEM_LEAK_DETECTION_DISABLED +#cmakedefine CPPUTEST_USE_LONG_LONG #cmakedefine CPPUTEST_STD_C_LIB_DISABLED #cmakedefine CPPUTEST_STD_CPP_LIB_DISABLED diff --git a/configure.ac b/configure.ac index 73655bfc1..771672b3b 100644 --- a/configure.ac +++ b/configure.ac @@ -318,6 +318,9 @@ AC_ARG_ENABLE([memory-leak-detection], [AC_HELP_STRING([--disable-memory-leak-de AC_ARG_ENABLE([extensions], [AC_HELP_STRING([--disable-extensions], [disable CppUTest extension library])], [cpputest_ext=${enableval}], [cpputest_ext=yes]) +AC_ARG_ENABLE([longlong], [AC_HELP_STRING([--enable-longlong], [enable support for long long type])], + [use_longlong=${enableval}], [use_longlong=no]) + 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]) @@ -366,6 +369,11 @@ else CPPUTEST_CPPFLAGS="${CPPUTEST_CPPFLAGS} -include ${srcdir}/include/CppUTest/MemoryLeakDetectorMallocMacros.h" fi +# Support for long long +if test "x${use_longlong}" = xyes; then + AC_DEFINE([CPPUTEST_USE_LONG_LONG], 1, [enable long long]) +fi + # Generating map files. if test "x${generate_map_file}" = xyes; then CPPUTEST_LDFLAGS="${CPPUTEST_LDFLAGS} ${CPPUTEST_LD_MAP_GENERATION}" @@ -483,6 +491,7 @@ Current compiler options: Features configured in ${PACKAGE_NAME}: Memory Leak Detection: ${memory_leak_detection} Compiling extensions: ${cpputest_ext} + Long Long support: ${use_longlong} Disable CppUTest compile/link flags: ${cpputest_flags} Using Standard C++ Library: ${use_std_cpp} diff --git a/scripts/travis_ci_build.sh b/scripts/travis_ci_build.sh index e997ecf1d..0d5efa9b4 100755 --- a/scripts/travis_ci_build.sh +++ b/scripts/travis_ci_build.sh @@ -64,7 +64,7 @@ fi if [ "x$BUILD" = "xcmake_coverage" ]; then pip install cpp-coveralls --user `whoami` - cmake .. -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE -DCOVERAGE=ON + cmake .. -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE -DCOVERAGE=ON -DLONGLONG=ON make ctest diff --git a/tests/AllTests.dsp b/tests/AllTests.dsp index db8e4d646..da3578ac2 100644 --- a/tests/AllTests.dsp +++ b/tests/AllTests.dsp @@ -42,7 +42,7 @@ RSC=rc.exe # 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" /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 @@ -71,7 +71,7 @@ PostBuild_Cmds=$(TargetPath) # 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" /FR /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 diff --git a/tests/AllTests.mak b/tests/AllTests.mak index 1378bd537..775a82d4c 100644 --- a/tests/AllTests.mak +++ b/tests/AllTests.mak @@ -99,7 +99,7 @@ CLEAN : "$(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" /Fp"$(INTDIR)\AllTests.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c +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= \ @@ -284,7 +284,7 @@ CLEAN : "$(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" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c +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= \ diff --git a/tests/AllTests.vcproj b/tests/AllTests.vcproj index 7298ba41e..9d64dd553 100644 --- a/tests/AllTests.vcproj +++ b/tests/AllTests.vcproj @@ -46,7 +46,7 @@ Optimization="0" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\include,..\include\Platforms\VisualCpp" - PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;CPPUTEST_USE_LONG_LONG" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" @@ -130,7 +130,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="..\include,..\include\Platforms\VisualCpp" - PreprocessorDefinitions="_CONSOLE;WIN32;_DEBUG" + PreprocessorDefinitions="_CONSOLE;WIN32;_DEBUG;CPPUTEST_USE_LONG_LONG" BasicRuntimeChecks="3" RuntimeLibrary="3" WarningLevel="3" diff --git a/tests/AllTests.vcxproj b/tests/AllTests.vcxproj index 66e5865c8..64b306bb0 100644 --- a/tests/AllTests.vcxproj +++ b/tests/AllTests.vcxproj @@ -54,7 +54,7 @@ MaxSpeed OnlyExplicitInline - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) true MultiThreadedDLL true @@ -92,7 +92,7 @@ Disabled ..\include;..\include\CppUTestExt\CppUTestGTest;..\include\CppUTestExt\CppUTestGMock;..\include\Platforms\VisualCpp;%(AdditionalIncludeDirectories) - _CONSOLE;WIN32;_DEBUG;%(PreprocessorDefinitions) + _CONSOLE;WIN32;_DEBUG;CPPUTEST_USE_LONG_LONG;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL true @@ -201,4 +201,4 @@ - \ No newline at end of file + From 8a8eac13a604de77a15f4295273ec6dab447bf1c Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 20 Apr 2016 22:07:19 +0800 Subject: [PATCH 0165/1345] Changed to long long support to use the CppUTestGeneratedConfig --- configure.ac | 9 --------- include/CppUTest/CppUTestConfig.h | 8 ++++---- include/CppUTest/UtestMacros.h | 3 +++ tests/TestFailureTest.cpp | 6 ++++-- tests/TestUTestMacro.cpp | 23 ----------------------- 5 files changed, 11 insertions(+), 38 deletions(-) diff --git a/configure.ac b/configure.ac index 771672b3b..73655bfc1 100644 --- a/configure.ac +++ b/configure.ac @@ -318,9 +318,6 @@ AC_ARG_ENABLE([memory-leak-detection], [AC_HELP_STRING([--disable-memory-leak-de AC_ARG_ENABLE([extensions], [AC_HELP_STRING([--disable-extensions], [disable CppUTest extension library])], [cpputest_ext=${enableval}], [cpputest_ext=yes]) -AC_ARG_ENABLE([longlong], [AC_HELP_STRING([--enable-longlong], [enable support for long long type])], - [use_longlong=${enableval}], [use_longlong=no]) - 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]) @@ -369,11 +366,6 @@ else CPPUTEST_CPPFLAGS="${CPPUTEST_CPPFLAGS} -include ${srcdir}/include/CppUTest/MemoryLeakDetectorMallocMacros.h" fi -# Support for long long -if test "x${use_longlong}" = xyes; then - AC_DEFINE([CPPUTEST_USE_LONG_LONG], 1, [enable long long]) -fi - # Generating map files. if test "x${generate_map_file}" = xyes; then CPPUTEST_LDFLAGS="${CPPUTEST_LDFLAGS} ${CPPUTEST_LD_MAP_GENERATION}" @@ -491,7 +483,6 @@ Current compiler options: Features configured in ${PACKAGE_NAME}: Memory Leak Detection: ${memory_leak_detection} Compiling extensions: ${cpputest_ext} - Long Long support: ${use_longlong} Disable CppUTest compile/link flags: ${cpputest_flags} Using Standard C++ Library: ${use_std_cpp} diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 866875ce4..0837bb601 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -200,11 +200,13 @@ #endif /* Support for "long long" type */ +#ifdef CPPUTEST_HAVE_LONG_LONG_INT +#define CPPUTEST_USE_LONG_LONG 1 +#endif + #ifdef CPPUTEST_USE_LONG_LONG typedef long long cpputest_longlong; typedef unsigned long long cpputest_ulonglong; -#define CPPUTEST_LONGLONG_DEFAULT ((cpputest_longlong)0) -#define CPPUTEST_ULONGLONG_DEFAULT ((cpputest_ulonglong)0U) #else /* Define some placeholders to disable the overloaded methods. * It's not required to have these match the size of the "real" type, but it's occasionally convenient. @@ -216,8 +218,6 @@ typedef struct { char dummy[16]; } cpputest_ulonglong; typedef struct { char dummy[8]; } cpputest_longlong; typedef struct { char dummy[8]; } cpputest_ulonglong; #endif -#define CPPUTEST_LONGLONG_DEFAULT cpputest_longlong() -#define CPPUTEST_ULONGLONG_DEFAULT cpputest_ulonglong() #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/UtestMacros.h b/include/CppUTest/UtestMacros.h index b62df4a4e..3a85ff470 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -208,6 +208,8 @@ #define UNSIGNED_LONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ { UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, text, file, line); } +#ifdef CPPUTEST_USE_LONG_LONG + #define LONGLONGS_EQUAL(expected, actual)\ LONGLONGS_EQUAL_LOCATION(expected, actual, NULL, __FILE__, __LINE__) @@ -226,6 +228,7 @@ #define UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ { UtestShell::getCurrent()->assertUnsignedLongLongsEqual(expected, actual, text, file, line); } +#endif #define BYTES_EQUAL(expected, actual)\ LONGS_EQUAL((expected) & 0xff,(actual) & 0xff) diff --git a/tests/TestFailureTest.cpp b/tests/TestFailureTest.cpp index bdb73a6cd..8635a2334 100644 --- a/tests/TestFailureTest.cpp +++ b/tests/TestFailureTest.cpp @@ -145,7 +145,8 @@ TEST(TestFailure, LongLongsEqualFailure) LongLongsEqualFailure f(test, failFileName, failLineNumber, 1, 2, ""); FAILURE_EQUAL("expected <1 0x1>\n\tbut was <2 0x2>", f); #else - LongLongsEqualFailure f(test, failFileName, failLineNumber, CPPUTEST_LONGLONG_DEFAULT, CPPUTEST_LONGLONG_DEFAULT, ""); + cpputest_longlong dummy_longlong; + LongLongsEqualFailure f(test, failFileName, failLineNumber, dummy_longlong, dummy_longlong, ""); FAILURE_EQUAL("expected < 0x>\n\tbut was < 0x>", f); #endif } @@ -156,7 +157,8 @@ TEST(TestFailure, UnsignedLongLongsEqualFailure) UnsignedLongLongsEqualFailure f(test, failFileName, failLineNumber, 1, 2, ""); FAILURE_EQUAL("expected <1 (0x1) 0x1>\n\tbut was <2 (0x2) 0x2>", f); #else - UnsignedLongLongsEqualFailure f(test, failFileName, failLineNumber, CPPUTEST_ULONGLONG_DEFAULT, CPPUTEST_ULONGLONG_DEFAULT, ""); + cpputest_ulonglong dummy_ulonglong; + UnsignedLongLongsEqualFailure f(test, failFileName, failLineNumber, dummy_ulonglong, dummy_ulonglong, ""); FAILURE_EQUAL("expected < 0x>\n\tbut was < 0x>", f); #endif } diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 3c182e549..11fdeaab2 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -359,29 +359,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 /* CPPUTEST_USE_LONG_LONG */ - -static void _LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod() -{ - LONGLONGS_EQUAL(CPPUTEST_LONGLONG_DEFAULT, CPPUTEST_LONGLONG_DEFAULT); -} // LCOV_EXCL_LINE -static void _UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod() -{ - UNSIGNED_LONGLONGS_EQUAL(CPPUTEST_ULONGLONG_DEFAULT, CPPUTEST_ULONGLONG_DEFAULT); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, LONGLONGS_EQUALFailsWithUnsupportedFeature) -{ - runTestWithMethod(_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("\"CPPUTEST_USE_LONG_LONG\" is not supported"); -} -TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeature) -{ - 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 d9cb286c04ad2fa81b41d18413f261868c0326ca Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 21 Apr 2016 10:00:08 +0800 Subject: [PATCH 0166/1345] Ability to turn off long long, and doing so in one of the autotools test builds --- Makefile.am | 6 +++--- configure.ac | 10 ++++++++- include/CppUTest/CppUTestConfig.h | 34 ++++++++++++++++++++++++------- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/Makefile.am b/Makefile.am index 020ea3680..f7fb31843 100644 --- a/Makefile.am +++ b/Makefile.am @@ -190,7 +190,7 @@ CppUTestExtTests_SOURCES = \ tests/CppUTestExt/MockComparatorCopierTest.cpp \ tests/CppUTestExt/MockExpectedCallTest.cpp \ tests/CppUTestExt/ExpectedFunctionsListTest.cpp \ - tests/CppUTestExt/MockFailureReporterForTest.cpp \ + tests/CppUTestExt/MockFailureReporterForTest.cpp \ tests/CppUTestExt/MockFailureTest.cpp \ tests/CppUTestExt/MockHierarchyTest.cpp \ tests/CppUTestExt/MockNamedValueTest.cpp \ @@ -287,8 +287,8 @@ check_basic: @echo "Building without the Standard C library" make distclean; $(srcdir)/configure --disable-std-c; make - @echo "Building without the Standard C++ library" - make distclean; $(srcdir)/configure --disable-std-cpp; make check + @echo "Building without the Standard C++ library and without long long" + make distclean; $(srcdir)/configure --disable-std-cpp --disable-long-long; make check @echo "Building without memory leak detection" make distclean; $(srcdir)/configure --disable-memory-leak-detection; make check diff --git a/configure.ac b/configure.ac index 73655bfc1..4002871b3 100644 --- a/configure.ac +++ b/configure.ac @@ -318,6 +318,9 @@ AC_ARG_ENABLE([memory-leak-detection], [AC_HELP_STRING([--disable-memory-leak-de AC_ARG_ENABLE([extensions], [AC_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])], + [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])], [generate_map_file=${enableval}], [generate_map_file=no]) @@ -357,7 +360,6 @@ if test "x${use_std_cpp11}" = xyes; then CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} ${CPPUTEST_CPP11FLAG} ${CPPUTEST_CPP11BLACKLIST}" 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]) @@ -366,6 +368,11 @@ else CPPUTEST_CPPFLAGS="${CPPUTEST_CPPFLAGS} -include ${srcdir}/include/CppUTest/MemoryLeakDetectorMallocMacros.h" fi +# Disablong long long support +if test "x${use_longlong}" = xno; then + AC_DEFINE([DISABLE_LONG_LONG], 1, [enable long long]) +fi + # Generating map files. if test "x${generate_map_file}" = xyes; then CPPUTEST_LDFLAGS="${CPPUTEST_LDFLAGS} ${CPPUTEST_LD_MAP_GENERATION}" @@ -483,6 +490,7 @@ Current compiler options: Features configured in ${PACKAGE_NAME}: Memory Leak Detection: ${memory_leak_detection} Compiling extensions: ${cpputest_ext} + Use Long Long (if available): ${use_longlong} Disable CppUTest compile/link flags: ${cpputest_flags} Using Standard C++ Library: ${use_std_cpp} diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 0837bb601..90ea527ec 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -25,7 +25,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #ifndef CPPUTESTCONFIG_H_ #define CPPUTESTCONFIG_H_ @@ -199,8 +198,11 @@ #define CPPUTEST_CHAR_BIT 8 #endif -/* Support for "long long" type */ -#ifdef CPPUTEST_HAVE_LONG_LONG_INT +/* + * Support for "long long" type + */ + +#if defined(CPPUTEST_HAVE_LONG_LONG_INT) && !defined(CPPUTEST_DISABLE_LONG_LONG) && !defined(CPPUTEST_USE_LONG_LONG) #define CPPUTEST_USE_LONG_LONG 1 #endif @@ -211,13 +213,31 @@ typedef unsigned long long cpputest_ulonglong; /* Define some placeholders to disable the overloaded methods. * It's not required to have these match the size of the "real" type, but it's occasionally convenient. */ + #if defined(CPPUTEST_64BIT) && !defined(CPPUTEST_64BIT_32BIT_LONGS) -typedef struct { char dummy[16]; } cpputest_longlong; -typedef struct { char dummy[16]; } cpputest_ulonglong; +#define CPPUTEST_SIZE_OF_FAKE_LONG_LONG_TYPE 16 #else -typedef struct { char dummy[8]; } cpputest_longlong; -typedef struct { char dummy[8]; } cpputest_ulonglong; +#define CPPUTEST_SIZE_OF_FAKE_LONG_LONG_TYPE 8 #endif + +struct cpputest_longlong +{ +#if defined(__cplusplus) + cpputest_longlong() {} + cpputest_longlong(int) {} +#endif + char dummy[CPPUTEST_SIZE_OF_FAKE_LONG_LONG_TYPE]; +}; + +struct cpputest_ulonglong +{ +#if defined(__cplusplus) + cpputest_ulonglong() {} + cpputest_ulonglong(int) {} +#endif + char dummy[CPPUTEST_SIZE_OF_FAKE_LONG_LONG_TYPE]; +}; + #endif /* Visual C++ 10.0+ (2010+) supports the override keyword, but doesn't define the C++ version as C++11 */ From 918f4475b7a1695f5da4c09c0e61044cdd0b5865 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 21 Apr 2016 10:00:32 +0800 Subject: [PATCH 0167/1345] Restored the tests for when long long is disabled --- include/CppUTest/UtestMacros.h | 4 ---- tests/TestUTestMacro.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 3a85ff470..448ecf71d 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -208,8 +208,6 @@ #define UNSIGNED_LONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ { UtestShell::getCurrent()->assertUnsignedLongsEqual((unsigned long)expected, (unsigned long)actual, text, file, line); } -#ifdef CPPUTEST_USE_LONG_LONG - #define LONGLONGS_EQUAL(expected, actual)\ LONGLONGS_EQUAL_LOCATION(expected, actual, NULL, __FILE__, __LINE__) @@ -228,8 +226,6 @@ #define UNSIGNED_LONGLONGS_EQUAL_LOCATION(expected, actual, text, file, line)\ { UtestShell::getCurrent()->assertUnsignedLongLongsEqual(expected, actual, text, file, line); } -#endif - #define BYTES_EQUAL(expected, actual)\ LONGS_EQUAL((expected) & 0xff,(actual) & 0xff) diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 11fdeaab2..95beee2de 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -359,6 +359,30 @@ 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) +{ + runTestWithMethod(_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("\"CPPUTEST_USE_LONG_LONG\" is not supported"); +} + +TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeature) +{ + 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 2478e159ab5c721be7f16317f531503e95d402d3 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Thu, 21 Apr 2016 12:20:25 +0800 Subject: [PATCH 0168/1345] Because the Makefile.mk has no long long detection and thus it is off by default, the library also needs to be compiled without long long support --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index f7fb31843..fa59dcba3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -347,7 +347,7 @@ check_examples: $(MAKE) -C $(srcdir)/examples all clean @echo "Compiling and running the examples. This will use the old Makefile" - make distclean; $(srcdir)/configure; make; $(MAKE) -C $(srcdir)/examples all clean CPPUTEST_LIB_LINK_DIR="`pwd`/lib" + make distclean; $(srcdir)/configure --disable-longlong; make; $(MAKE) -C $(srcdir)/examples all clean CPPUTEST_LIB_LINK_DIR="`pwd`/lib" check_all: check_basic check_special_situations check_coverage remove_coverage_output check_examples check_gtest @echo "Last... one normal build and test" From c3c7c3f49c5ae7f6d43637ac6c691cf96df4dd5b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Fri, 22 Apr 2016 13:18:34 +0800 Subject: [PATCH 0169/1345] Fixed LONG LONG mistakes' --- configure.ac | 4 ++-- include/CppUTest/CppUTestConfig.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 4002871b3..78dc3c30e 100644 --- a/configure.ac +++ b/configure.ac @@ -368,9 +368,9 @@ else CPPUTEST_CPPFLAGS="${CPPUTEST_CPPFLAGS} -include ${srcdir}/include/CppUTest/MemoryLeakDetectorMallocMacros.h" fi -# Disablong long long support +# Disabling long long support if test "x${use_longlong}" = xno; then - AC_DEFINE([DISABLE_LONG_LONG], 1, [enable long long]) + AC_DEFINE([LONG_LONG_DISABLED], 1, [disable long long]) fi # Generating map files. diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 90ea527ec..4797b221c 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -202,7 +202,7 @@ * Support for "long long" type */ -#if defined(CPPUTEST_HAVE_LONG_LONG_INT) && !defined(CPPUTEST_DISABLE_LONG_LONG) && !defined(CPPUTEST_USE_LONG_LONG) +#if defined(CPPUTEST_HAVE_LONG_LONG_INT) && !defined(CPPUTEST_LONG_LONG_DISABLED) && !defined(CPPUTEST_USE_LONG_LONG) #define CPPUTEST_USE_LONG_LONG 1 #endif From 8db33823d0f86fac18af1edda179cbb89f8a440c Mon Sep 17 00:00:00 2001 From: Gavin Lambert Date: Fri, 22 Apr 2016 19:16:24 +1200 Subject: [PATCH 0170/1345] Update cmake builds for new CppUTestGeneratedConfig.h file. --- CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f7a60dd8..4b1bb19ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,10 +47,10 @@ include("${CppUTestRootDirectory}/cmake/Modules/CppUTestNormalizeTestOutputLocat configure_file ( "${PROJECT_SOURCE_DIR}/config.h.cmake" - "${PROJECT_BINARY_DIR}/config.h" + "${PROJECT_BINARY_DIR}/generated/CppUTestGeneratedConfig.h" ) include_directories(${PROJECT_BINARY_DIR}) -add_definitions(-DCPPUTEST_HAVE_CONFIG_H) +add_definitions(-DHAVE_CONFIG_H) include_directories(${CppUTestRootDirectory}/include) add_subdirectory(src/CppUTest) @@ -81,6 +81,10 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CppUTest_PKGCONFIG_FILE} DESTINATION ${LIB_INSTALL_DIR}/pkgconfig ) +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) From 8c9626b53546937cdc4d5828f42545c0aaaf4f03 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 25 Apr 2016 21:24:33 -0500 Subject: [PATCH 0171/1345] Added some missing files to the projects --- CppUTest.vcproj | 110 +++++++++++++++++++++++++++++++++++------- tests/AllTests.vcproj | 28 ++++++++--- 2 files changed, 113 insertions(+), 25 deletions(-) diff --git a/CppUTest.vcproj b/CppUTest.vcproj index c0e057764..6b0e9dd45 100644 --- a/CppUTest.vcproj +++ b/CppUTest.vcproj @@ -226,6 +226,10 @@ /> + + @@ -249,7 +253,7 @@ + + + + @@ -871,10 +883,26 @@ RelativePath="include\CppUTestExt\GTestConvertor.h" > + + + + + + + + @@ -895,6 +923,10 @@ RelativePath="include\CppUTestExt\MemoryReportFormatter.h" > + + @@ -903,6 +935,10 @@ RelativePath="include\CppUTestExt\MockCheckedExpectedCall.h" > + + @@ -943,10 +979,22 @@ RelativePath="src\Platforms\VisualCpp\Platform.h" > + + + + + + @@ -955,6 +1003,22 @@ RelativePath="include\CppUTest\SimpleStringExtensions.h" > + + + + + + + + @@ -967,6 +1031,10 @@ RelativePath="include\CppUTest\TestInstaller.h" > + + @@ -983,10 +1051,18 @@ RelativePath="include\CppUTest\TestResult.h" > + + + + diff --git a/tests/AllTests.vcproj b/tests/AllTests.vcproj index 7298ba41e..fecb325e1 100644 --- a/tests/AllTests.vcproj +++ b/tests/AllTests.vcproj @@ -492,6 +492,14 @@ /> + + + + @@ -730,6 +738,14 @@ /> + + + + @@ -753,14 +769,6 @@ /> - - - - @@ -1366,6 +1374,10 @@ RelativePath="..\include\CppUTest\CppUTestConfig.h" > + + From f24dac20dd409f7a085d8b164fd8866a34b561a2 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 25 Apr 2016 21:24:57 -0500 Subject: [PATCH 0172/1345] Added logic to disable fnev on VS2005 and earlier --- include/CppUTest/CppUTestConfig.h | 3 ++- tests/CppUTestExt/IEEE754PluginTest_c.c | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index eda52114d..e31252d24 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -167,9 +167,10 @@ /* * Handling of IEEE754 floating point exceptions via fenv.h + * Works on non-Visual C++ compilers and Visual C++ 2008 and newer */ -#if CPPUTEST_USE_STD_C_LIB +#if CPPUTEST_USE_STD_C_LIB && (!defined(_MSC_VER) || (_MSC_VER >= 1500)) #define CPPUTEST_HAVE_FENV #if defined(__WATCOMC__) #define CPPUTEST_FENV_IS_WORKING_PROPERLY 0 diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.c b/tests/CppUTestExt/IEEE754PluginTest_c.c index a856dc683..61a07dbbe 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.c +++ b/tests/CppUTestExt/IEEE754PluginTest_c.c @@ -25,6 +25,10 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include + +#ifdef CPPUTEST_HAVE_FENV + #include "IEEE754PluginTest_c.h" #include @@ -71,3 +75,5 @@ void set_everything_c() set_invalid_c(); set_inexact_c(); } + +#endif // CPPUTEST_HAVE_FENV \ No newline at end of file From f6cfc5a609e891f31a7e51c6fa28dade53a01f5a Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 25 Apr 2016 21:29:32 -0500 Subject: [PATCH 0173/1345] Add more missing files --- CppUTest.vcxproj | 4 ++++ tests/AllTests.vcxproj | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index fe44bc6af..466c4b0b9 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -112,6 +112,7 @@ + @@ -152,6 +153,7 @@ + @@ -168,7 +170,9 @@ + + diff --git a/tests/AllTests.vcxproj b/tests/AllTests.vcxproj index 66e5865c8..cbdb0cdce 100644 --- a/tests/AllTests.vcxproj +++ b/tests/AllTests.vcxproj @@ -145,6 +145,8 @@ + + @@ -195,6 +197,8 @@ + + From 9199dea90143f198b8053226c2744fc68eac2a0d Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 26 Apr 2016 10:30:58 +0800 Subject: [PATCH 0174/1345] Moved limits.h into StandardC.h --- include/CppUTest/CppUTestConfig.h | 7 +++---- include/CppUTest/StandardCLibrary.h | 3 +++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index 4797b221c..a651793a2 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -91,6 +91,9 @@ #endif #endif +/* 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. * Used for functions that always throws for instance. * @@ -192,7 +195,6 @@ * Since CHAR_BIT is defined in limits.h (ANSI C), use default of 8 when building without Std C library. */ #if CPPUTEST_USE_STD_C_LIB -#include #define CPPUTEST_CHAR_BIT CHAR_BIT #else #define CPPUTEST_CHAR_BIT 8 @@ -256,7 +258,4 @@ struct cpputest_ulonglong #pragma clang diagnostic pop #endif -/* Should be the only #include here. Standard C library wrappers */ -#include "StandardCLibrary.h" - #endif diff --git a/include/CppUTest/StandardCLibrary.h b/include/CppUTest/StandardCLibrary.h index 6e352fb5d..51ba089d0 100644 --- a/include/CppUTest/StandardCLibrary.h +++ b/include/CppUTest/StandardCLibrary.h @@ -22,6 +22,9 @@ /* Needed for ... */ #include +/* Needed for some detection of long long and 64 bit */ +#include + #else #ifdef __KERNEL__ From fff29fb923bfcaf35fea6d69a6d4d9e2011eca07 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 25 Apr 2016 21:38:37 -0500 Subject: [PATCH 0175/1345] Actually, fenv.h not available until the 2013 version --- 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 e31252d24..f47ee6b30 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -170,7 +170,7 @@ * Works on non-Visual C++ compilers and Visual C++ 2008 and newer */ -#if CPPUTEST_USE_STD_C_LIB && (!defined(_MSC_VER) || (_MSC_VER >= 1500)) +#if CPPUTEST_USE_STD_C_LIB && (!defined(_MSC_VER) || (_MSC_VER >= 1800)) #define CPPUTEST_HAVE_FENV #if defined(__WATCOMC__) #define CPPUTEST_FENV_IS_WORKING_PROPERLY 0 From 9efe82eb4ca904e39b9f321ff61cf359608aa064 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 26 Apr 2016 12:19:10 +0800 Subject: [PATCH 0176/1345] Crude check for long long for when configure isn't used --- Makefile.am | 2 +- include/CppUTest/CppUTestConfig.h | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index fa59dcba3..f7fb31843 100644 --- a/Makefile.am +++ b/Makefile.am @@ -347,7 +347,7 @@ check_examples: $(MAKE) -C $(srcdir)/examples all clean @echo "Compiling and running the examples. This will use the old Makefile" - make distclean; $(srcdir)/configure --disable-longlong; make; $(MAKE) -C $(srcdir)/examples all clean CPPUTEST_LIB_LINK_DIR="`pwd`/lib" + make distclean; $(srcdir)/configure; make; $(MAKE) -C $(srcdir)/examples all clean CPPUTEST_LIB_LINK_DIR="`pwd`/lib" check_all: check_basic check_special_situations check_coverage remove_coverage_output check_examples check_gtest @echo "Last... one normal build and test" diff --git a/include/CppUTest/CppUTestConfig.h b/include/CppUTest/CppUTestConfig.h index a651793a2..4fc204384 100644 --- a/include/CppUTest/CppUTestConfig.h +++ b/include/CppUTest/CppUTestConfig.h @@ -201,12 +201,21 @@ #endif /* - * Support for "long long" type + * Support for "long long" type. + * + * 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 + * 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_HAVE_LONG_LONG_INT) && !defined(CPPUTEST_LONG_LONG_DISABLED) && !defined(CPPUTEST_USE_LONG_LONG) +#if !defined(CPPUTEST_LONG_LONG_DISABLED) && !defined(CPPUTEST_USE_LONG_LONG) +#if defined(CPPUTEST_HAVE_LONG_LONG_INT) || defined(LLONG_MAX) #define CPPUTEST_USE_LONG_LONG 1 #endif +#endif #ifdef CPPUTEST_USE_LONG_LONG typedef long long cpputest_longlong; From 962535a54b6cb9b46aee82d962b9ec486b7a67ae Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 26 Apr 2016 13:17:46 +0800 Subject: [PATCH 0177/1345] Turned off warning about long long being C++11 when we detected it should be supported anyway --- build/MakefileWorker.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index cfe2b561c..a644b6a24 100644 --- a/build/MakefileWorker.mk +++ b/build/MakefileWorker.mk @@ -194,7 +194,8 @@ ifeq ($(COMPILER_NAME),$(CLANG_STR)) # -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-old-style-casts -> We only use old style casts by decision - 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 -> 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 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. From 20715da485ef951904c702067c816d7706d2ab4b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 26 Apr 2016 14:24:01 +0800 Subject: [PATCH 0178/1345] Removed C98 compat pedantic errors when compiling with C++11 --- cmake/Modules/CppUTestWarningFlags.cmake | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index 83e3c8df5..143b182d0 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -23,6 +23,10 @@ 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 Weverything Wall @@ -36,13 +40,9 @@ else (MSVC) Wno-disabled-macro-expansion Wno-reserved-id-macro Wno-keyword-macro - Wno-long-long + Wno-long-long ) - 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_ONLY_FLAGS Wstrict-prototypes ) @@ -62,8 +62,12 @@ else (MSVC) if (C++11) check_cxx_compiler_flag("-Wno-c++98-compat" NO_WARNING_CXX_98_COMPAT_FLAG) + check_cxx_compiler_flag("-Wno-c++98-compat-pedantic" NO_WARNING_CXX_98_COMPAT_PEDANTIC_FLAG) if (NO_WARNING_CXX_98_COMPAT_FLAG) set(CPPUTEST_CXX_WARNING_FLAGS "${CPPUTEST_CXX_WARNING_FLAGS} -Wno-c++98-compat") endif (NO_WARNING_CXX_98_COMPAT_FLAG) + if (NO_WARNING_CXX_98_COMPAT_PEDANTIC_FLAG) + set(CPPUTEST_CXX_WARNING_FLAGS "${CPPUTEST_CXX_WARNING_FLAGS} -Wno-c++98-compat-pedantic") + endif (NO_WARNING_CXX_98_COMPAT_PEDANTIC_FLAG) endif (C++11) endif (MSVC) From 22d4056d0ec9472409ed471197093fb310615e26 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 26 Apr 2016 22:07:13 +0800 Subject: [PATCH 0179/1345] Cleaned up the warning flags a bit and can run all tests now --- configure.ac | 96 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 35 deletions(-) diff --git a/configure.ac b/configure.ac index 78dc3c30e..f7032d286 100644 --- a/configure.ac +++ b/configure.ac @@ -81,18 +81,50 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNIN CFLAGS="$saved_cflags" fi -# 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" +##################################################################################### +##### C++ 11 checks + +### Checking for Standard C++ 11 compiler flags +AC_LANG_PUSH([C++]) + +# FLag -std=c++0x +CXXFLAGS="-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" +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++" +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" + +AC_LANG_POP # Flag -Wno-c++98-compat CXXFLAGS="-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=" -Wno-c++98-compat" ], [AC_MSG_RESULT([no])]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CPP11BLACKLIST="${CPPUTEST_CPP11BLACKLIST} -Wno-c++98-compat" ], [AC_MSG_RESULT([no])]) +CXXFLAGS="$saved_cxxflags" + +# Flag -Wno-c++98-compat-pedantic +CXXFLAGS="-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])]) CXXFLAGS="$saved_cxxflags" +##################################################################################### +##### 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]) @@ -163,6 +195,10 @@ 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])]) 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. CFLAGS="-Werror -Wno-disabled-macro-expansion" @@ -188,11 +224,11 @@ 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" -# FLag -Wno-long-long. -CXXFLAGS="-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])]) -CFLAGS="$saved_cflags" +# FLag -Wno-c++11-long-long +CXXFLAGS="-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-global-constructors. AC_LANG_PUSH([C++]) @@ -226,6 +262,9 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CXXWARN CXXFLAGS="$saved_cxxflags" AC_LANG_POP +##################################################### +######## End warning section + # FLag --coverage AC_LANG_PUSH([C++]) CXXFLAGS="-Werror --coverage" @@ -234,29 +273,10 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); coverage_flag_suppo CXXFLAGS="$saved_cxxflags" AC_LANG_POP -### Checking for Standard C++ 11 compiler flags -AC_LANG_PUSH([C++]) - -# FLag -std=c++0x -CXXFLAGS="-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" -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++" -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" - -AC_LANG_POP - -### Checking for strange exception handling behavior, related to bugs in compilers... -### TODO: This part isn't finished yet. It will need to generate different CppUTestConfig.h files based on the result of these checks. +###################################################### +# Exception Handling +# +# Checking for strange exception handling behavior, related to bugs in compilers... AC_LANG_PUSH([C++]) # Can we use operator delete without exception handling specifier? (clang warns on this!) @@ -271,6 +291,12 @@ 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 +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])]) +CXXFLAGS="$saved_cxxflags" + AC_LANG_POP ##### Linker checking. @@ -347,7 +373,7 @@ fi if test "x${use_std_cpp}" = xno; then AC_DEFINE([STD_CPP_LIB_DISABLED], 1, [Standard C++ library disabled]) if test "x${use_std_c}" = xyes; then - CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} -nostdinc++" + CPPUTEST_CXXFLAGS="${CPPUTEST_CXXFLAGS} -nostdinc++ ${CPPUTEST_CXX_NO_INC_WARNINGFLAGS}" # Since automake passes the CXXFLAGS to the linker, this will cause warnings with clang 3.2 (which become errors) CPPUTEST_LDFLAGS="${CPPUTEST_LDFLAGS} ${CPPUTEST_NO_UNUSED_ARGUMENT_WARNING}" From 645171e7e612baac7d8086c5e6a010afe9b0ae5b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 27 Apr 2016 09:16:22 +0800 Subject: [PATCH 0180/1345] Cleaning up the generated config file on a distclean --- Makefile.am | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Makefile.am b/Makefile.am index f7fb31843..d960bf691 100644 --- a/Makefile.am +++ b/Makefile.am @@ -203,6 +203,10 @@ CppUTestExtTests_SOURCES = \ tests/CppUTestExt/MockReturnValueTest.cpp \ tests/CppUTestExt/OrderedTestTest.cpp +DISTCLEANFILES = \ + filename.map.txt \ + generated/CppUTestGeneratedConfig.h + if INCLUDE_GMOCKTESTS #GTestTests_CPPFLAGS = $(lib_libCppUTestExt_a_CPPFLAGS) @@ -371,3 +375,6 @@ dist-hook: fi \ fi +distclean-local: distclean + test -z "generated" || rmdir generated + From 0ea8e7af91d36c451ba503815680d2ec22574731 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 27 Apr 2016 09:54:58 +0800 Subject: [PATCH 0181/1345] Shouldn't have a dependency to distclean --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index d960bf691..8e08d0f16 100644 --- a/Makefile.am +++ b/Makefile.am @@ -375,6 +375,6 @@ dist-hook: fi \ fi -distclean-local: distclean +distclean-local: test -z "generated" || rmdir generated From 9500d53f6c7e9e6a7a14bcf006ec8911d24268a3 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Wed, 27 Apr 2016 07:15:24 -0500 Subject: [PATCH 0182/1345] Fixed comment on endif, add newline to end --- tests/CppUTestExt/IEEE754PluginTest_c.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.c b/tests/CppUTestExt/IEEE754PluginTest_c.c index 61a07dbbe..614890b21 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.c +++ b/tests/CppUTestExt/IEEE754PluginTest_c.c @@ -76,4 +76,4 @@ void set_everything_c() set_inexact_c(); } -#endif // CPPUTEST_HAVE_FENV \ No newline at end of file +#endif /* CPPUTEST_HAVE_FENV */ From 686544ae8aee6dc5f1081b37cd23f8d16667f471 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 27 Apr 2016 22:53:44 +0800 Subject: [PATCH 0183/1345] Resolve problems with recursive includes --- include/CppUTest/StandardCLibrary.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/StandardCLibrary.h b/include/CppUTest/StandardCLibrary.h index 51ba089d0..37333879d 100644 --- a/include/CppUTest/StandardCLibrary.h +++ b/include/CppUTest/StandardCLibrary.h @@ -1,8 +1,10 @@ +/* Must include this first to ensure the StandardC include in CppUTestConfig still happens at the right moment */ +#include "CppUTestConfig.h" + #ifndef STANDARDCLIBRARY_H_ #define STANDARDCLIBRARY_H_ -#include "CppUTestConfig.h" #if CPPUTEST_USE_STD_C_LIB From 4052631707d55db386e15fc61b0c1af4a7780b7c Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 27 Apr 2016 16:56:47 +0100 Subject: [PATCH 0184/1345] New test for Dos platform.mk as needed by Cygwin 2.5.0 --- platforms/Dos/README.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/platforms/Dos/README.txt b/platforms/Dos/README.txt index e982d35eb..66825b6c0 100644 --- a/platforms/Dos/README.txt +++ b/platforms/Dos/README.txt @@ -15,3 +15,11 @@ INCLUDE := c:\data\00_Dev\05_CppUTest\cpputest\include DOSBOX := DOSBox CYGDRIVE:= /cygdrive/d/ path_separator := \\ + +### platform.mk for use with Cygwin 2.5.0 on Windows 7 +WATCOM := d:\watcom +CPPUTEST_HOME := c:\\data\\00_Dev\\05_CppUTest\\cpputest +INCLUDE := c:\data\00_Dev\05_CppUTest\cpputest\include +DOSBOX := DOSBox +CYGDRIVE:= /cygdrive/d/ +path_separator := \\ From bf58b42bc1ec75ad0a3cac037219dc42a7277c1f Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Fri, 29 Apr 2016 18:01:52 -0500 Subject: [PATCH 0185/1345] Remove references to INFINITY Don't need to block compilation now, should work with any compiler --- tests/CppUTestExt/IEEE754PluginTest_c.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.c b/tests/CppUTestExt/IEEE754PluginTest_c.c index 614890b21..425d1ee6c 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.c +++ b/tests/CppUTestExt/IEEE754PluginTest_c.c @@ -27,8 +27,6 @@ #include -#ifdef CPPUTEST_HAVE_FENV - #include "IEEE754PluginTest_c.h" #include @@ -42,14 +40,14 @@ void set_divisionbyzero_c(void) void set_overflow_c(void) { - f = 1000.0f; - while (f < INFINITY) f *= f; + f = 1e38f; + f *= f; } void set_underflow_c(void) { - f = 0.01f; - while (f > 0.0f) f *= f; + f = 1e-38f; + f *= f; } void set_invalid_c(void) @@ -75,5 +73,3 @@ void set_everything_c() set_invalid_c(); set_inexact_c(); } - -#endif /* CPPUTEST_HAVE_FENV */ From 7d99131ca06c96f799ef296629d3b31ffeb3bc83 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Fri, 29 Apr 2016 20:01:03 -0500 Subject: [PATCH 0186/1345] Remove a not needed include too --- tests/CppUTestExt/IEEE754PluginTest_c.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.c b/tests/CppUTestExt/IEEE754PluginTest_c.c index 425d1ee6c..4a9424d9a 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.c +++ b/tests/CppUTestExt/IEEE754PluginTest_c.c @@ -25,8 +25,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include - #include "IEEE754PluginTest_c.h" #include From b3470e7e4404ef7c0d08c597eef0fa327cbcff29 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 30 Apr 2016 07:07:27 -0700 Subject: [PATCH 0187/1345] Cleaned up configure.ac and added no long long to MakefileWorked --- build/MakefileWorker.mk | 2 +- configure.ac | 43 ++++++++++++++++++++++------------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/build/MakefileWorker.mk b/build/MakefileWorker.mk index a644b6a24..bd054ad4d 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 + CPPUTEST_WARNINGFLAGS = -Wall -Wextra -Werror -Wshadow -Wswitch-default -Wswitch-enum -Wconversion -Wno-long-long ifeq ($(CPPUTEST_PEDANTIC_ERRORS), Y) CPPUTEST_WARNINGFLAGS += -pedantic-errors endif diff --git a/configure.ac b/configure.ac index f7032d286..dbbe9ec96 100644 --- a/configure.ac +++ b/configure.ac @@ -103,8 +103,6 @@ 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" -AC_LANG_POP - # Flag -Wno-c++98-compat CXXFLAGS="-Wno-c++98-compat" AC_MSG_CHECKING([whether CXX supports -Wno-c++98-compat]) @@ -117,6 +115,21 @@ 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" +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. +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. +CFLAGS="-Werror -Wno-long-long" +AC_MSG_CHECKING([whether CC 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" + + ##################################################################################### ##### More of these warnings # FLag -Weverything. @@ -173,20 +186,21 @@ 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) AC_LANG_PUSH([C++]) + CXXFLAGS="-Werror -Wsign-conversion" 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])]) -CFLAGS="$saved_cxxflags" -AC_LANG_POP +CXXFLAGS="$saved_cxxflags" # FLag -Woverloaded-virtual -AC_LANG_PUSH([C++]) 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])]) CXXFLAGS="$saved_cxxflags" + AC_LANG_POP # FLag -Wstrict-prototypes @@ -213,53 +227,42 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [AC_MSG_RESULT([yes]); CPPUTEST_CWARNIN CFLAGS="$saved_cflags" # FLag -Wno-reserved-id-macro. -CXXFLAGS="-Werror -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. -CXXFLAGS="-Werror -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" -# FLag -Wno-c++11-long-long -CXXFLAGS="-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-global-constructors. AC_LANG_PUSH([C++]) +# 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" -AC_LANG_POP # FLag -Wno-exit-time-destructors. -AC_LANG_PUSH([C++]) 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" -AC_LANG_POP # FLag -Wno-weak-vtables. -AC_LANG_PUSH([C++]) 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" -AC_LANG_POP # FLag -Wno-old-style-cast. -AC_LANG_PUSH([C++]) 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])]) CXXFLAGS="$saved_cxxflags" + AC_LANG_POP ##################################################### From a3968cdb9547632e4cc99113d731822707339148 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 2 May 2016 14:11:18 +0800 Subject: [PATCH 0188/1345] Splitup the Test Macro file, alternative --- Makefile.am | 2 + include/CppUTest/TestTestingFixture.h | 22 +- src/CppUTest/TestTestingFixture.cpp | 36 ++ tests/TestUTestMacro.cpp | 600 ++++---------------------- tests/TestUTestStringMacro.cpp | 468 ++++++++++++++++++++ 5 files changed, 601 insertions(+), 527 deletions(-) create mode 100644 src/CppUTest/TestTestingFixture.cpp create mode 100755 tests/TestUTestStringMacro.cpp diff --git a/Makefile.am b/Makefile.am index 8e08d0f16..793980012 100644 --- a/Makefile.am +++ b/Makefile.am @@ -49,6 +49,7 @@ lib_libCppUTest_a_SOURCES = \ src/CppUTest/TestPlugin.cpp \ src/CppUTest/TestRegistry.cpp \ src/CppUTest/TestResult.cpp \ + src/CppUTest/TestTestingFixture.cpp \ src/CppUTest/Utest.cpp \ src/Platforms/@CPP_PLATFORM@/UtestPlatform.cpp @@ -164,6 +165,7 @@ CppUTestTests_SOURCES = \ tests/TestRegistryTest.cpp \ tests/TestResultTest.cpp \ tests/TestUTestMacro.cpp \ + tests/TestUTestStringMacro.cpp \ tests/UtestTest.cpp \ tests/UtestPlatformTest.cpp diff --git a/include/CppUTest/TestTestingFixture.h b/include/CppUTest/TestTestingFixture.h index 3f65ad29b..775c13823 100755 --- a/include/CppUTest/TestTestingFixture.h +++ b/include/CppUTest/TestTestingFixture.h @@ -44,6 +44,8 @@ class TestTestingFixture registry_->setCurrentRegistry(registry_); registry_->addTest(genTest_); + + lineOfCodeExecutedAfterCheck = false; } virtual ~TestTestingFixture() @@ -75,6 +77,12 @@ class TestTestingFixture genTest_->teardown_ = teardownFunction; } + void runTestWithMethod(void(*method)()) + { + setTestFunction(method); + runAllTests(); + } + void runAllTests() { registry_->runAllTests(*result_); @@ -113,7 +121,6 @@ class TestTestingFixture static void assertPrintContains(const SimpleString& output, const SimpleString& contains) { STRCMP_CONTAINS(contains.asCharString(), output.asCharString()); - } int getRunCount() @@ -121,6 +128,19 @@ class TestTestingFixture return result_->getRunCount(); } + void 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); + + 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) + } + + static void lineExecutedAfterCheck(); + static bool lineOfCodeExecutedAfterCheck; TestRegistry* registry_; ExecFunctionTestShell* genTest_; diff --git a/src/CppUTest/TestTestingFixture.cpp b/src/CppUTest/TestTestingFixture.cpp new file mode 100644 index 000000000..0adc716de --- /dev/null +++ b/src/CppUTest/TestTestingFixture.cpp @@ -0,0 +1,36 @@ +/* + * 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/TestTestingFixture.h" + +bool TestTestingFixture::lineOfCodeExecutedAfterCheck = false; + +void TestTestingFixture::lineExecutedAfterCheck() +{ + lineOfCodeExecutedAfterCheck = true; +} diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 95beee2de..6fad64b6a 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -29,52 +29,28 @@ #include "CppUTest/TestOutput.h" #include "CppUTest/TestTestingFixture.h" -static bool lineOfCodeExecutedAfterCheck; - -#define CHECK_TEST_FAILS_PROPER_WITH_TEXT(text) CHECK_TEST_FAILS_PROPER_WITH_TEXT_LOCATION(text, fixture, __FILE__, __LINE__) - -static void CHECK_TEST_FAILS_PROPER_WITH_TEXT_LOCATION(const char* text, TestTestingFixture& fixture, const char* file, int line) -{ - if (fixture.getFailureCount() != 1) - FAIL_LOCATION(StringFromFormat("Expected one test failure, but got %d amount of test failures", fixture.getFailureCount()).asCharString(), file, line); - - STRCMP_CONTAINS_LOCATION(text, fixture.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) - -} +#define CHECK_TEST_FAILS_PROPER_WITH_TEXT(text) fixture.checkTestFailsWithProperTestLocation(text, __FILE__, __LINE__) TEST_GROUP(UnitTestMacros) { TestTestingFixture fixture; - void setup() - { - lineOfCodeExecutedAfterCheck = false; - } - - void runTestWithMethod(void(*method)()) - { - fixture.setTestFunction(method); - fixture.runAllTests(); - } }; static void _failingTestMethodWithFAIL() { FAIL("This test fails"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FAILMakesTheTestFailPrintsTheRightResultAndStopsExecuting) { - runTestWithMethod(_failingTestMethodWithFAIL); + fixture.runTestWithMethod(_failingTestMethodWithFAIL); CHECK_TEST_FAILS_PROPER_WITH_TEXT("This test fails"); } TEST(UnitTestMacros, FAILWillPrintTheFileThatItFailed) { - runTestWithMethod(_failingTestMethodWithFAIL); + fixture.runTestWithMethod(_failingTestMethodWithFAIL); CHECK_TEST_FAILS_PROPER_WITH_TEXT(__FILE__); } @@ -92,127 +68,6 @@ IGNORE_TEST(UnitTestMacros, FAILworksInAnIgnoredTest) FAIL("die!"); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _STRCMP_EQUALWithActualIsNULLTestMethod() -{ - STRCMP_EQUAL("ok", NULL); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_EQUALAndActualIsNULL) -{ - runTestWithMethod(_STRCMP_EQUALWithActualIsNULLTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <(null)>"); -} - -static void _STRCMP_EQUALWithExpectedIsNULLTestMethod() -{ - STRCMP_EQUAL(NULL, "ok"); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_EQUALAndExpectedIsNULL) -{ - runTestWithMethod(_STRCMP_EQUALWithExpectedIsNULLTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <(null)>"); -} - -static void _STRCMP_CONTAINSWithActualIsNULLTestMethod() -{ - STRCMP_CONTAINS("ok", NULL); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_CONTAINSAndActualIsNULL) -{ - runTestWithMethod(_STRCMP_CONTAINSWithActualIsNULLTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); -} - -static void _STRCMP_CONTAINSWithExpectedIsNULLTestMethod() -{ - STRCMP_CONTAINS(NULL, "ok"); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_CONTAINSAndExpectedIsNULL) -{ - runTestWithMethod(_STRCMP_CONTAINSWithExpectedIsNULLTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain <>"); -} - -static void _STRNCMP_EQUALWithActualIsNULLTestMethod() -{ - STRNCMP_EQUAL("ok", NULL, 2); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRNCMP_EQUALAndActualIsNULL) -{ - runTestWithMethod(_STRNCMP_EQUALWithActualIsNULLTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <(null)>"); -} - -static void _STRNCMP_EQUALWithExpectedIsNULLTestMethod() -{ - STRNCMP_EQUAL(NULL, "ok", 2); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRNCMP_EQUALAndExpectedIsNULL) -{ - runTestWithMethod(_STRNCMP_EQUALWithExpectedIsNULLTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <(null)>"); -} - -static void _STRCMP_NOCASE_EQUALWithActualIsNULLTestMethod() -{ - STRCMP_NOCASE_EQUAL("ok", NULL); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_NOCASE_EQUALAndActualIsNULL) -{ - runTestWithMethod(_STRCMP_NOCASE_EQUALWithActualIsNULLTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <(null)>"); -} - -static void _STRCMP_NOCASE_EQUALWithExpectedIsNULLTestMethod() -{ - STRCMP_NOCASE_EQUAL(NULL, "ok"); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_NOCASE_EQUALAndExpectedIsNULL) -{ - runTestWithMethod(_STRCMP_NOCASE_EQUALWithExpectedIsNULLTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <(null)>"); -} - -static void _STRCMP_NOCASE_EQUALWithUnequalInputTestMethod() -{ - STRCMP_NOCASE_EQUAL("no", "ok"); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_NOCASE_EQUALAndUnequalInput) -{ - runTestWithMethod(_STRCMP_NOCASE_EQUALWithUnequalInputTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); -} - -static void _STRCMP_NOCASE_CONTAINSWithActualIsNULLTestMethod() -{ - STRCMP_NOCASE_CONTAINS("ok", NULL); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_NOCASE_CONTAINSAndActualIsNULL) -{ - runTestWithMethod(_STRCMP_NOCASE_CONTAINSWithActualIsNULLTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); -} - -static void _STRCMP_NOCASE_CONTAINSWithExpectedIsNULLTestMethod() -{ - STRCMP_NOCASE_CONTAINS(NULL, "ok"); -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_NOCASE_CONTAINSAndExpectedIsNULL) -{ - runTestWithMethod(_STRCMP_NOCASE_CONTAINSWithExpectedIsNULLTestMethod); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain <>"); -} - static void _UNSIGNED_LONGS_EQUALTestMethod() { UNSIGNED_LONGS_EQUAL(1, 1); @@ -221,7 +76,7 @@ static void _UNSIGNED_LONGS_EQUALTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGS_EQUAL) { - runTestWithMethod(_UNSIGNED_LONGS_EQUALTestMethod); + 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>"); } @@ -244,7 +99,7 @@ static void _UNSIGNED_LONGS_EQUAL_TEXTTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGS_EQUAL_TEXT) { - runTestWithMethod(_UNSIGNED_LONGS_EQUAL_TEXTTestMethod); + 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("Failed because it failed"); @@ -271,7 +126,7 @@ static void _LONGLONGS_EQUALTestMethod() TEST(UnitTestMacros, TestLONGLONGS_EQUAL) { - 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>"); } @@ -294,7 +149,7 @@ static void _LONGLONGS_EQUAL_TEXTTestMethod() TEST(UnitTestMacros, TestLONGLONGS_EQUAL_TEXT) { - 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"); @@ -319,7 +174,7 @@ static void _UNSIGNED_LONGLONGS_EQUALTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGLONGS_EQUAL) { - runTestWithMethod(_UNSIGNED_LONGLONGS_EQUALTestMethod); + 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>"); } @@ -342,7 +197,7 @@ static void _UNSIGNED_LONGLONGS_EQUAL_TEXTTestMethod() TEST(UnitTestMacros, TestUNSIGNED_LONGLONGS_EQUAL_TEXT) { - runTestWithMethod(_UNSIGNED_LONGLONGS_EQUAL_TEXTTestMethod); + 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("Failed because it failed"); @@ -373,13 +228,13 @@ static void _UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod() TEST(UnitTestMacros, LONGLONGS_EQUALFailsWithUnsupportedFeature) { - 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) { - runTestWithMethod(_UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod); + fixture.runTestWithMethod(_UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeatureTestMethod); CHECK_TEST_FAILS_PROPER_WITH_TEXT("\"CPPUTEST_USE_LONG_LONG\" is not supported"); } @@ -388,12 +243,12 @@ TEST(UnitTestMacros, UNSIGNED_LONGLONGS_EQUALFailsWithUnsupportedFeature) static void _failingTestMethodWithCHECK() { CHECK(false); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithCHECK) { - runTestWithMethod(_failingTestMethodWithCHECK); + fixture.runTestWithMethod(_failingTestMethodWithCHECK); CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK(false) failed"); } @@ -411,12 +266,12 @@ IGNORE_TEST(UnitTestMacros, CHECKWorksInAnIgnoredTest) static void _failingTestMethodWithCHECK_TEXT() { CHECK_TEXT(false, "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithCHECK_TEXT) { - 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"); } @@ -435,12 +290,12 @@ IGNORE_TEST(UnitTestMacros, CHECK_TEXTWorksInAnIgnoredTest) static void _failingTestMethodWithCHECK_TRUE() { CHECK_TRUE(false); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithCHECK_TRUE) { - runTestWithMethod(_failingTestMethodWithCHECK_TRUE); + fixture.runTestWithMethod(_failingTestMethodWithCHECK_TRUE); CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK_TRUE(false) failed"); } @@ -458,12 +313,12 @@ IGNORE_TEST(UnitTestMacros, CHECK_TRUEWorksInAnIgnoredTest) static void _failingTestMethodWithCHECK_TRUE_TEXT() { CHECK_TRUE_TEXT(false, "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithCHECK_TRUE_TEXT) { - 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"); } @@ -482,12 +337,12 @@ IGNORE_TEST(UnitTestMacros, CHECK_TRUE_TEXTWorksInAnIgnoredTest) static void _failingTestMethodWithCHECK_FALSE() { CHECK_FALSE(true); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithCHECK_FALSE) { - runTestWithMethod(_failingTestMethodWithCHECK_FALSE); + fixture.runTestWithMethod(_failingTestMethodWithCHECK_FALSE); CHECK_TEST_FAILS_PROPER_WITH_TEXT("CHECK_FALSE(true) failed"); } @@ -505,12 +360,12 @@ IGNORE_TEST(UnitTestMacros, CHECK_FALSEWorksInAnIgnoredTest) static void _failingTestMethodWithCHECK_FALSE_TEXT() { CHECK_FALSE_TEXT(true, "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithCHECK_FALSE_TEXT) { - 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"); } @@ -529,12 +384,12 @@ IGNORE_TEST(UnitTestMacros, CHECK_FALSE_TEXTWorksInAnIgnoredTest) static void _failingTestMethodWithCHECK_EQUAL() { CHECK_EQUAL(1, 2); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithCHECK_EQUAL) { - runTestWithMethod(_failingTestMethodWithCHECK_EQUAL); + fixture.runTestWithMethod(_failingTestMethodWithCHECK_EQUAL); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <1>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <2>"); } @@ -576,7 +431,7 @@ static void _failing_CHECK_EQUAL_WithActualBeingEvaluatesMultipleTimesWillGiveAW TEST(UnitTestMacros, failing_CHECK_EQUAL_WithActualBeingEvaluatesMultipleTimesWillGiveAWarning) { - 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."); } @@ -587,13 +442,13 @@ static void _failing_CHECK_EQUAL_WithExpectedBeingEvaluatesMultipleTimesWillGive TEST(UnitTestMacros, failing_CHECK_EQUAL_WithExpectedBeingEvaluatesMultipleTimesWillGiveAWarning) { - 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) { - runTestWithMethod(_failingTestMethodWithCHECK_EQUAL); + fixture.runTestWithMethod(_failingTestMethodWithCHECK_EQUAL); CHECK( ! fixture.output_->getOutput().contains("WARNING")); } @@ -611,12 +466,12 @@ IGNORE_TEST(UnitTestMacros, CHECK_EQUALWorksInAnIgnoredTest) static void _failingTestMethodWithCHECK_EQUAL_TEXT() { CHECK_EQUAL_TEXT(1, 2, "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithCHECK_EQUAL_TEXT) { - 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"); @@ -633,260 +488,15 @@ IGNORE_TEST(UnitTestMacros, CHECK_EQUAL_TEXTWorksInAnIgnoredTest) CHECK_EQUAL_TEXT(1, 2, "Failed because it failed") // LCOV_EXCL_LINE } // LCOV_EXCL_LINE -static void _failingTestMethodWithSTRCMP_EQUAL() -{ - STRCMP_EQUAL("hello", "hell"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_EQUAL) -{ - runTestWithMethod(_failingTestMethodWithSTRCMP_EQUAL); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); -} - -TEST(UnitTestMacros, STRCMP_EQUALBehavesAsProperMacro) -{ - if (false) STRCMP_EQUAL("1", "2") - else STRCMP_EQUAL("1", "1") -} - -IGNORE_TEST(UnitTestMacros, STRCMP_EQUALWorksInAnIgnoredTest) -{ - STRCMP_EQUAL("Hello", "World") // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -static void _failingTestMethodWithSTRCMP_EQUAL_TEXT() -{ - STRCMP_EQUAL_TEXT("hello", "hell", "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_EQUAL_TEXT) -{ - 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"); -} - -TEST(UnitTestMacros, STRCMP_EQUAL_TEXTBehavesAsProperMacro) -{ - if (false) STRCMP_EQUAL_TEXT("1", "2", "Failed because it failed") - else STRCMP_EQUAL_TEXT("1", "1", "Failed because it failed") -} - -IGNORE_TEST(UnitTestMacros, STRCMP_EQUAL_TEXTWorksInAnIgnoredTest) -{ - STRCMP_EQUAL_TEXT("Hello", "World", "Failed because it failed") // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -static void _failingTestMethodWithSTRNCMP_EQUAL() -{ - STRNCMP_EQUAL("hello", "hallo", 5); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRNCMP_EQUAL) -{ - runTestWithMethod(_failingTestMethodWithSTRNCMP_EQUAL); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); -} - -TEST(UnitTestMacros, STRNCMP_EQUALBehavesAsProperMacro) -{ - if (false) STRNCMP_EQUAL("1", "2", 1) - else STRNCMP_EQUAL("1", "1", 1) -} - -IGNORE_TEST(UnitTestMacros, STRNCMP_EQUALWorksInAnIgnoredTest) -{ - STRNCMP_EQUAL("Hello", "World", 3) // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -static void _failingTestMethodWithSTRNCMP_EQUAL_TEXT() -{ - STRNCMP_EQUAL_TEXT("hello", "hallo", 5, "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRNCMP_EQUAL_TEXT) -{ - 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"); -} - -TEST(UnitTestMacros, 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") -} - -IGNORE_TEST(UnitTestMacros, STRNCMP_EQUAL_TEXTWorksInAnIgnoredTest) -{ - STRNCMP_EQUAL_TEXT("Hello", "World", 3, "Failed because it failed") // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -static void _failingTestMethodWithSTRCMP_NOCASE_EQUAL() -{ - STRCMP_NOCASE_EQUAL("hello", "Hell"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_NOCASE_EQUAL) -{ - runTestWithMethod(_failingTestMethodWithSTRCMP_NOCASE_EQUAL); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); -} - -TEST(UnitTestMacros, STRCMP_NOCASE_EQUALBehavesAsProperMacro) -{ - if (false) STRCMP_NOCASE_EQUAL("1", "2") - else STRCMP_NOCASE_EQUAL("1", "1") -} - -IGNORE_TEST(UnitTestMacros, STRCMP_NOCASE_EQUALWorksInAnIgnoredTest) -{ - STRCMP_NOCASE_EQUAL("Hello", "World") // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -static void _failingTestMethodWithSTRCMP_NOCASE_EQUAL_TEXT() -{ - STRCMP_NOCASE_EQUAL_TEXT("hello", "hell", "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_NOCASE_EQUAL_TEXT) -{ - 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"); -} - -TEST(UnitTestMacros, 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") -} - -IGNORE_TEST(UnitTestMacros, STRCMP_NOCASE_EQUAL_TEXTWorksInAnIgnoredTest) -{ - STRCMP_NOCASE_EQUAL_TEXT("Hello", "World", "Failed because it failed") // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -static void _failingTestMethodWithSTRCMP_CONTAINS() -{ - STRCMP_CONTAINS("hello", "world"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_CONTAINS) -{ - runTestWithMethod(_failingTestMethodWithSTRCMP_CONTAINS); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("actual "); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); -} - -TEST(UnitTestMacros, STRCMP_CONTAINSBehavesAsProperMacro) -{ - if (false) STRCMP_CONTAINS("1", "2") - else STRCMP_CONTAINS("1", "1") -} - -IGNORE_TEST(UnitTestMacros, STRCMP_CONTAINSWorksInAnIgnoredTest) -{ - STRCMP_CONTAINS("Hello", "World") // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -static void _failingTestMethodWithSTRCMP_CONTAINS_TEXT() -{ - STRCMP_CONTAINS_TEXT("hello", "world", "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, FailureWithSTRCMP_CONTAINS_TEXT) -{ - 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"); -} - -TEST(UnitTestMacros, STRCMP_CONTAINS_TEXTBehavesAsProperMacro) -{ - if (false) STRCMP_CONTAINS_TEXT("1", "2", "Failed because it failed") - else STRCMP_CONTAINS_TEXT("1", "1", "Failed because it failed") -} - -IGNORE_TEST(UnitTestMacros, STRCMP_CONTAINS_TEXTWorksInAnIgnoredTest) -{ - STRCMP_CONTAINS_TEXT("Hello", "World", "Failed because it failed") // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -static void _failingTestMethodWithSTRCMP_NOCASE_CONTAINS() -{ - STRCMP_NOCASE_CONTAINS("hello", "WORLD"); - lineOfCodeExecutedAfterCheck = true; -} - -TEST(UnitTestMacros, FailureWithSTRCMP_NOCASE_CONTAINS) -{ - runTestWithMethod(_failingTestMethodWithSTRCMP_NOCASE_CONTAINS); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("actual "); - CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); -} - -TEST(UnitTestMacros, STRCMP_NOCASE_CONTAINSBehavesAsProperMacro) -{ - if (false) STRCMP_NOCASE_CONTAINS("never", "executed") - else STRCMP_NOCASE_CONTAINS("hello", "HELLO WORLD") -} - -IGNORE_TEST(UnitTestMacros, STRCMP_NO_CASE_CONTAINSWorksInAnIgnoredTest) -{ - STRCMP_NOCASE_CONTAINS("Hello", "World") // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -static void _failingTestMethodWithSTRCMP_NOCASE_CONTAINS_TEXT() -{ - STRCMP_NOCASE_CONTAINS_TEXT("hello", "WORLD", "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; -} - -TEST(UnitTestMacros, FailureWithSTRCMP_NOCASE_CONTAINS_TEXT) -{ - 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"); -} - -TEST(UnitTestMacros, 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") -} - -IGNORE_TEST(UnitTestMacros, STRCMP_NO_CASE_CONTAINS_TEXTWorksInAnIgnoredTest) -{ - STRCMP_NOCASE_CONTAINS_TEXT("Hello", "World", "Failed because it failed") // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - static void _failingTestMethodWithLONGS_EQUAL() { LONGS_EQUAL(1, 0xff); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithLONGS_EQUALS) { - runTestWithMethod(_failingTestMethodWithLONGS_EQUAL); + fixture.runTestWithMethod(_failingTestMethodWithLONGS_EQUAL); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected < 1 0x01>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <255 0xff>"); } @@ -905,12 +515,12 @@ IGNORE_TEST(UnitTestMacros, LONGS_EQUALWorksInAnIgnoredTest) static void _failingTestMethodWithLONGS_EQUAL_TEXT() { LONGS_EQUAL_TEXT(1, 0xff, "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithLONGS_EQUALS_TEXT) { - runTestWithMethod(_failingTestMethodWithLONGS_EQUAL_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("Failed because it failed"); @@ -930,12 +540,12 @@ IGNORE_TEST(UnitTestMacros, LONGS_EQUAL_TEXTWorksInAnIgnoredTest) static void _failingTestMethodWithBYTES_EQUAL() { BYTES_EQUAL('a', 'b'); - lineOfCodeExecutedAfterCheck = true; + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } TEST(UnitTestMacros, FailureWithBYTES_EQUAL) { - 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>"); } @@ -954,12 +564,12 @@ IGNORE_TEST(UnitTestMacros, BYTES_EQUALWorksInAnIgnoredTest) static void _failingTestMethodWithBYTES_EQUAL_TEXT() { BYTES_EQUAL_TEXT('a', 'b', "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } TEST(UnitTestMacros, FailureWithBYTES_EQUAL_TEXT) { - 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"); @@ -979,12 +589,12 @@ IGNORE_TEST(UnitTestMacros, BYTES_EQUAL_TEXTWorksInAnIgnoredTest) static void _failingTestMethodWithPOINTERS_EQUAL() { POINTERS_EQUAL((void*)0xa5a5, (void*)0xf0f0); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithPOINTERS_EQUAL) { - runTestWithMethod(_failingTestMethodWithPOINTERS_EQUAL); + fixture.runTestWithMethod(_failingTestMethodWithPOINTERS_EQUAL); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <0xa5a5>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0xf0f0>"); } @@ -1003,12 +613,12 @@ IGNORE_TEST(UnitTestMacros, POINTERS_EQUALWorksInAnIgnoredTest) static void _failingTestMethodWithPOINTERS_EQUAL_TEXT() { POINTERS_EQUAL_TEXT((void*)0xa5a5, (void*)0xf0f0, "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithPOINTERS_EQUAL_TEXT) { - 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"); @@ -1029,12 +639,12 @@ IGNORE_TEST(UnitTestMacros, POINTERS_EQUAL_TEXTWorksInAnIgnoredTest) static void _failingTestMethodWithFUNCTIONPOINTERS_EQUAL() { FUNCTIONPOINTERS_EQUAL((void (*)())0xa5a5, (void (*)())0xf0f0); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithFUNCTIONPOINTERS_EQUAL) { - runTestWithMethod(_failingTestMethodWithFUNCTIONPOINTERS_EQUAL); + fixture.runTestWithMethod(_failingTestMethodWithFUNCTIONPOINTERS_EQUAL); CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <0xa5a5>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <0xf0f0>"); } @@ -1053,12 +663,12 @@ IGNORE_TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUALWorksInAnIgnoredTest) static void _failingTestMethodWithFUNCTIONPOINTERS_EQUAL_TEXT() { FUNCTIONPOINTERS_EQUAL_TEXT((void (*)())0xa5a5, (void (*)())0xf0f0, "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithFUNCTIONPOINTERS_EQUAL_TEXT) { - 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"); @@ -1081,12 +691,12 @@ IGNORE_TEST(UnitTestMacros, FUNCTIONPOINTERS_EQUAL_TEXTWorksInAnIgnoredTest) static void _failingTestMethodWithDOUBLES_EQUAL() { DOUBLES_EQUAL(0.12, 44.1, 0.3); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithDOUBLES_EQUAL) { - 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>"); @@ -1106,12 +716,12 @@ IGNORE_TEST(UnitTestMacros, DOUBLES_EQUALWorksInAnIgnoredTest) static void _failingTestMethodWithDOUBLES_EQUAL_TEXT() { DOUBLES_EQUAL_TEXT(0.12, 44.1, 0.3, "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithDOUBLES_EQUAL_TEXT) { - 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>"); @@ -1129,6 +739,8 @@ IGNORE_TEST(UnitTestMacros, DOUBLES_EQUAL_TEXTWorksInAnIgnoredTest) DOUBLES_EQUAL_TEXT(100.0, 0.0, 0.2, "Failed because it failed") // LCOV_EXCL_LINE } // LCOV_EXCL_LINE +static bool lineOfCodeExecutedAfterCheck = false; + static void _passingTestMethod() { CHECK(true); @@ -1137,7 +749,7 @@ static void _passingTestMethod() TEST(UnitTestMacros, SuccessPrintsNothing) { - runTestWithMethod(_passingTestMethod); + fixture.runTestWithMethod(_passingTestMethod); LONGS_EQUAL(0, fixture.getFailureCount()); fixture.assertPrintContains(".\nOK (1 tests"); @@ -1151,7 +763,7 @@ static void _methodThatOnlyPrints() TEST(UnitTestMacros, PrintPrintsWhateverPrintPrints) { - runTestWithMethod(_methodThatOnlyPrints); + fixture.runTestWithMethod(_methodThatOnlyPrints); LONGS_EQUAL(0, fixture.getFailureCount()); fixture.assertPrintContains("Hello World!"); @@ -1165,7 +777,7 @@ static void _methodThatOnlyPrintsUsingSimpleStringFromFormat() TEST(UnitTestMacros, PrintPrintsSimpleStringsForExampleThoseReturnedByFromString) { - runTestWithMethod(_methodThatOnlyPrintsUsingSimpleStringFromFormat); + fixture.runTestWithMethod(_methodThatOnlyPrintsUsingSimpleStringFromFormat); fixture.assertPrintContains("Hello World! 2009"); } @@ -1203,70 +815,6 @@ TEST(UnitTestMacros, allMacrosFromFunctionThatReturnsAValue) functionThatReturnsAValue(); } -TEST(UnitTestMacros, NFirstCharsComparison) -{ - STRNCMP_EQUAL("Hello World!", "Hello Peter!", 0); - STRNCMP_EQUAL("Hello World!", "Hello Peter!", 1); - STRNCMP_EQUAL("Hello World!", "Hello Peter!", 6); - STRNCMP_EQUAL("Hello World!", "Hello", 5); -} - -static void _compareNFirstCharsWithUpperAndLowercase() -{ - STRNCMP_EQUAL("hello world!", "HELLO WORLD!", 12); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, CompareNFirstCharsWithUpperAndLowercase) -{ - 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() -{ - STRNCMP_EQUAL("Hello World!", "Hello Peter!", 12); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, CompareNFirstCharsWithDifferenceInTheMiddle) -{ - 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() -{ - STRNCMP_EQUAL("", "Not empty string", 5); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, CompareNFirstCharsWithEmptyString) -{ - 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() -{ - STRNCMP_EQUAL("Not empty string?", "Not empty string!", 17); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE -} // LCOV_EXCL_LINE - -TEST(UnitTestMacros, CompareNFirstCharsWithLastCharDifferent) -{ - 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"); -} - TEST(UnitTestMacros, MEMCMP_EQUALBehavesAsAProperMacro) { if (false) MEMCMP_EQUAL("TEST", "test", 5) @@ -1284,12 +832,12 @@ static void _MEMCMP_EQUALFailingTestMethodWithUnequalInput() unsigned char actualData[] = { 0x00, 0x01, 0x03, 0x03 }; MEMCMP_EQUAL(expectedData, actualData, sizeof(expectedData)); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, MEMCMP_EQUALFailureWithUnequalInput) { - 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"); @@ -1300,12 +848,12 @@ static void _MEMCMP_EQUALFailingTestMethodWithNullExpected() unsigned char actualData[] = { 0x00, 0x01, 0x02, 0x03 }; MEMCMP_EQUAL(NULL, actualData, sizeof(actualData)); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, MEMCMP_EQUALFailureWithNullExpected) { - 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>"); } @@ -1315,12 +863,12 @@ static void _MEMCMP_EQUALFailingTestMethodWithNullActual() unsigned char expectedData[] = { 0x00, 0x01, 0x02, 0x03 }; MEMCMP_EQUAL(expectedData, NULL, sizeof(expectedData)); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, MEMCMP_EQUALFailureWithNullActual) { - 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)>"); } @@ -1337,12 +885,12 @@ static void _failingTestMethodWithMEMCMP_EQUAL_TEXT() unsigned char actualData[] = { 0x00, 0x01, 0x03, 0x03 }; MEMCMP_EQUAL_TEXT(expectedData, actualData, sizeof(expectedData), "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithMEMCMP_EQUAL_TEXT) { - 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"); @@ -1374,12 +922,12 @@ IGNORE_TEST(UnitTestMacros, BITS_EQUALWorksInAnIgnoredTest) static void _BITS_EQUALFailingTestMethodWithUnequalInput() { BITS_EQUAL(0x00, 0xFF, 0xFF); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, BITS_EQUALFailureWithUnequalInput) { - runTestWithMethod(_BITS_EQUALFailingTestMethodWithUnequalInput); + fixture.runTestWithMethod(_BITS_EQUALFailingTestMethodWithUnequalInput); CHECK_TEST_FAILS_PROPER_WITH_TEXT("00000000>"); CHECK_TEST_FAILS_PROPER_WITH_TEXT("11111111>"); } @@ -1392,12 +940,12 @@ TEST(UnitTestMacros, BITS_EQUALZeroMaskEqual) static void _failingTestMethodWithBITS_EQUAL_TEXT() { BITS_EQUAL_TEXT(0x00, 0xFFFFFFFF, 0xFF, "Failed because it failed"); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithBITS_EQUAL_TEXT) { - 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"); @@ -1418,12 +966,12 @@ IGNORE_TEST(UnitTestMacros, BITS_EQUAL_TEXTWorksInAnIgnoredTest) static void _failingTestMethod_NoThrowWithCHECK_THROWS() { CHECK_THROWS(int, (void) (1+2)); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithCHECK_THROWS_whenDoesntThrow) { - 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()); @@ -1432,24 +980,24 @@ TEST(UnitTestMacros, FailureWithCHECK_THROWS_whenDoesntThrow) static void _succeedingTestMethod_CorrectThrowWithCHECK_THROWS() { CHECK_THROWS(int, throw 4); - lineOfCodeExecutedAfterCheck = true; + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } TEST(UnitTestMacros, SuccessWithCHECK_THROWS) { - runTestWithMethod(_succeedingTestMethod_CorrectThrowWithCHECK_THROWS); + fixture.runTestWithMethod(_succeedingTestMethod_CorrectThrowWithCHECK_THROWS); LONGS_EQUAL(1, fixture.getCheckCount()); } static void _failingTestMethod_WrongThrowWithCHECK_THROWS() { CHECK_THROWS(int, throw 4.3); - lineOfCodeExecutedAfterCheck = true; // LCOV_EXCL_LINE + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE } // LCOV_EXCL_LINE TEST(UnitTestMacros, FailureWithCHECK_THROWS_whenWrongThrow) { - 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/TestUTestStringMacro.cpp b/tests/TestUTestStringMacro.cpp new file mode 100755 index 000000000..62ac79ddb --- /dev/null +++ b/tests/TestUTestStringMacro.cpp @@ -0,0 +1,468 @@ +/* + * 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" + +#define CHECK_TEST_FAILS_PROPER_WITH_TEXT(text) fixture.checkTestFailsWithProperTestLocation(text, __FILE__, __LINE__) + +TEST_GROUP(UnitTestStringMacros) +{ + TestTestingFixture fixture; +}; + +static void _STRCMP_EQUALWithActualIsNULLTestMethod() +{ + STRCMP_EQUAL("ok", NULL); +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUALAndActualIsNULL) +{ + fixture.runTestWithMethod(_STRCMP_EQUALWithActualIsNULLTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <(null)>"); +} + +static void _STRCMP_EQUALWithExpectedIsNULLTestMethod() +{ + STRCMP_EQUAL(NULL, "ok"); +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUALAndExpectedIsNULL) +{ + fixture.runTestWithMethod(_STRCMP_EQUALWithExpectedIsNULLTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <(null)>"); +} + +static void _STRCMP_CONTAINSWithActualIsNULLTestMethod() +{ + STRCMP_CONTAINS("ok", NULL); +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINSAndActualIsNULL) +{ + fixture.runTestWithMethod(_STRCMP_CONTAINSWithActualIsNULLTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); +} + +static void _STRCMP_CONTAINSWithExpectedIsNULLTestMethod() +{ + STRCMP_CONTAINS(NULL, "ok"); +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINSAndExpectedIsNULL) +{ + fixture.runTestWithMethod(_STRCMP_CONTAINSWithExpectedIsNULLTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain <>"); +} + +static void _STRNCMP_EQUALWithActualIsNULLTestMethod() +{ + STRNCMP_EQUAL("ok", NULL, 2); +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUALAndActualIsNULL) +{ + fixture.runTestWithMethod(_STRNCMP_EQUALWithActualIsNULLTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <(null)>"); +} + +static void _STRNCMP_EQUALWithExpectedIsNULLTestMethod() +{ + STRNCMP_EQUAL(NULL, "ok", 2); +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUALAndExpectedIsNULL) +{ + fixture.runTestWithMethod(_STRNCMP_EQUALWithExpectedIsNULLTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <(null)>"); +} + +static void _STRCMP_NOCASE_EQUALWithActualIsNULLTestMethod() +{ + STRCMP_NOCASE_EQUAL("ok", NULL); +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUALAndActualIsNULL) +{ + fixture.runTestWithMethod(_STRCMP_NOCASE_EQUALWithActualIsNULLTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <(null)>"); +} + +static void _STRCMP_NOCASE_EQUALWithExpectedIsNULLTestMethod() +{ + STRCMP_NOCASE_EQUAL(NULL, "ok"); +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUALAndExpectedIsNULL) +{ + fixture.runTestWithMethod(_STRCMP_NOCASE_EQUALWithExpectedIsNULLTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <(null)>"); +} + +static void _STRCMP_NOCASE_EQUALWithUnequalInputTestMethod() +{ + STRCMP_NOCASE_EQUAL("no", "ok"); +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUALAndUnequalInput) +{ + fixture.runTestWithMethod(_STRCMP_NOCASE_EQUALWithUnequalInputTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); +} + +static void _STRCMP_NOCASE_CONTAINSWithActualIsNULLTestMethod() +{ + STRCMP_NOCASE_CONTAINS("ok", NULL); +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_CONTAINSAndActualIsNULL) +{ + fixture.runTestWithMethod(_STRCMP_NOCASE_CONTAINSWithActualIsNULLTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); +} + +static void _STRCMP_NOCASE_CONTAINSWithExpectedIsNULLTestMethod() +{ + STRCMP_NOCASE_CONTAINS(NULL, "ok"); +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_CONTAINSAndExpectedIsNULL) +{ + fixture.runTestWithMethod(_STRCMP_NOCASE_CONTAINSWithExpectedIsNULLTestMethod); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain <>"); +} + +static void _failingTestMethodWithSTRCMP_EQUAL() +{ + STRCMP_EQUAL("hello", "hell"); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_EQUAL) +{ + fixture.runTestWithMethod(_failingTestMethodWithSTRCMP_EQUAL); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); +} + +TEST(UnitTestStringMacros, STRCMP_EQUALBehavesAsProperMacro) +{ + if (false) STRCMP_EQUAL("1", "2") + else STRCMP_EQUAL("1", "1") +} + +IGNORE_TEST(UnitTestStringMacros, STRCMP_EQUALWorksInAnIgnoredTest) +{ + STRCMP_EQUAL("Hello", "World") // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +static void _failingTestMethodWithSTRCMP_EQUAL_TEXT() +{ + STRCMP_EQUAL_TEXT("hello", "hell", "Failed because it failed"); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_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"); +} + +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") +} + +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() +{ + STRNCMP_EQUAL("hello", "hallo", 5); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRNCMP_EQUAL) +{ + fixture.runTestWithMethod(_failingTestMethodWithSTRNCMP_EQUAL); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); +} + +TEST(UnitTestStringMacros, STRNCMP_EQUALBehavesAsProperMacro) +{ + 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 +} // LCOV_EXCL_LINE + +static void _failingTestMethodWithSTRNCMP_EQUAL_TEXT() +{ + STRNCMP_EQUAL_TEXT("hello", "hallo", 5, "Failed because it failed"); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRNCMP_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"); +} + +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") +} + +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() +{ + STRCMP_NOCASE_EQUAL("hello", "Hell"); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_EQUAL) +{ + fixture.runTestWithMethod(_failingTestMethodWithSTRCMP_NOCASE_EQUAL); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected "); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was "); +} + +TEST(UnitTestStringMacros, STRCMP_NOCASE_EQUALBehavesAsProperMacro) +{ + 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 +} // LCOV_EXCL_LINE + +static void _failingTestMethodWithSTRCMP_NOCASE_EQUAL_TEXT() +{ + STRCMP_NOCASE_EQUAL_TEXT("hello", "hell", "Failed because it failed"); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_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"); +} + +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") +} + +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() +{ + STRCMP_CONTAINS("hello", "world"); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_CONTAINS) +{ + fixture.runTestWithMethod(_failingTestMethodWithSTRCMP_CONTAINS); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("actual "); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); +} + +TEST(UnitTestStringMacros, STRCMP_CONTAINSBehavesAsProperMacro) +{ + if (false) STRCMP_CONTAINS("1", "2") + else STRCMP_CONTAINS("1", "1") +} + +IGNORE_TEST(UnitTestStringMacros, STRCMP_CONTAINSWorksInAnIgnoredTest) +{ + STRCMP_CONTAINS("Hello", "World") // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +static void _failingTestMethodWithSTRCMP_CONTAINS_TEXT() +{ + STRCMP_CONTAINS_TEXT("hello", "world", "Failed because it failed"); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, FailureWithSTRCMP_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"); +} + +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") +} + +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() +{ + STRCMP_NOCASE_CONTAINS("hello", "WORLD"); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} + +TEST(UnitTestStringMacros, FailureWithSTRCMP_NOCASE_CONTAINS) +{ + fixture.runTestWithMethod(_failingTestMethodWithSTRCMP_NOCASE_CONTAINS); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("actual "); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("did not contain "); +} + +TEST(UnitTestStringMacros, STRCMP_NOCASE_CONTAINSBehavesAsProperMacro) +{ + 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 +} // LCOV_EXCL_LINE + +static void _failingTestMethodWithSTRCMP_NOCASE_CONTAINS_TEXT() +{ + STRCMP_NOCASE_CONTAINS_TEXT("hello", "WORLD", "Failed because it failed"); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} + +TEST(UnitTestStringMacros, FailureWithSTRCMP_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"); +} + +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") +} + +IGNORE_TEST(UnitTestStringMacros, STRCMP_NO_CASE_CONTAINS_TEXTWorksInAnIgnoredTest) +{ + STRCMP_NOCASE_CONTAINS_TEXT("Hello", "World", "Failed because it failed") // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, NFirstCharsComparison) +{ + STRNCMP_EQUAL("Hello World!", "Hello Peter!", 0); + STRNCMP_EQUAL("Hello World!", "Hello Peter!", 1); + STRNCMP_EQUAL("Hello World!", "Hello Peter!", 6); + STRNCMP_EQUAL("Hello World!", "Hello", 5); +} + +static void _compareNFirstCharsWithUpperAndLowercase() +{ + STRNCMP_EQUAL("hello world!", "HELLO WORLD!", 12); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, 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() +{ + STRNCMP_EQUAL("Hello World!", "Hello Peter!", 12); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, 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() +{ + STRNCMP_EQUAL("", "Not empty string", 5); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, 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() +{ + STRNCMP_EQUAL("Not empty string?", "Not empty string!", 17); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} // LCOV_EXCL_LINE + +TEST(UnitTestStringMacros, 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"); +} + From 5223899c40942203b5eb570f91380acd35e9a2c3 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 2 May 2016 15:55:33 +0800 Subject: [PATCH 0189/1345] Moved to the source file to resolve compile error --- include/CppUTest/TestTestingFixture.h | 11 +---------- src/CppUTest/TestTestingFixture.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/include/CppUTest/TestTestingFixture.h b/include/CppUTest/TestTestingFixture.h index 775c13823..53874dd09 100755 --- a/include/CppUTest/TestTestingFixture.h +++ b/include/CppUTest/TestTestingFixture.h @@ -128,16 +128,7 @@ class TestTestingFixture return result_->getRunCount(); } - void 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); - - 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) - } + void checkTestFailsWithProperTestLocation(const char* text, const char* file, int line); static void lineExecutedAfterCheck(); static bool lineOfCodeExecutedAfterCheck; diff --git a/src/CppUTest/TestTestingFixture.cpp b/src/CppUTest/TestTestingFixture.cpp index 0adc716de..9e7d9b938 100644 --- a/src/CppUTest/TestTestingFixture.cpp +++ b/src/CppUTest/TestTestingFixture.cpp @@ -34,3 +34,15 @@ void TestTestingFixture::lineExecutedAfterCheck() { 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); + + 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) +} + From 78800fb50367e19073dc94f1430d91686ddefd0a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 2 May 2016 19:35:33 +0800 Subject: [PATCH 0190/1345] Added files to CMake --- src/CppUTest/CMakeLists.txt | 1 + tests/CMakeLists.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/src/CppUTest/CMakeLists.txt b/src/CppUTest/CMakeLists.txt index 85c66df09..b44d8fd84 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -14,6 +14,7 @@ set(CppUTest_src MemoryLeakDetector.cpp TestFilter.cpp TestPlugin.cpp + TestTestingPlugin.cpp SimpleMutex.cpp Utest.cpp ../Platforms/${CPP_PLATFORM}/UtestPlatform.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 9305b3dd2..2759e3785 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -27,6 +27,7 @@ set(CppUTestTests_src TestResultTest.cpp PreprocessorTest.cpp TestUTestMacro.cpp + TestUTestStringMacro.cpp AllocationInCppFile.cpp UtestTest.cpp SimpleMutexTest.cpp From 7bf3d168cd912414bd73328a131caece61522e16 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 2 May 2016 19:37:56 +0800 Subject: [PATCH 0191/1345] Files for DOS build --- platforms/Dos/sources.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platforms/Dos/sources.mk b/platforms/Dos/sources.mk index 897f64858..0c44762e0 100644 --- a/platforms/Dos/sources.mk +++ b/platforms/Dos/sources.mk @@ -15,6 +15,7 @@ CPPU_OBJECTS := \ $(CPPUTEST_HOME)/src/CppUTest/TestOutput.o \ $(CPPUTEST_HOME)/src/CppUTest/TestPlugin.o \ $(CPPUTEST_HOME)/src/CppUTest/TestRegistry.o \ + $(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 \ @@ -110,6 +111,7 @@ CPPU6_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockComparatorCopierTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockHierarchyTest.o \ $(CPPUTEST_HOME)/tests/CppUTestExt/MockParameterTest.o \ + $(CPPUTEST_HOME)/tests/TestUTestStringMacro.o \ CPPU7_OBJECTS := \ $(CPPUTEST_HOME)/tests/CppUTestExt/AllTests.o \ From 167c7f349226083435f7a669877a279677cc77d1 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 2 May 2016 20:08:46 +0800 Subject: [PATCH 0192/1345] Fixed typo in filename' --- 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 b44d8fd84..736777f5e 100644 --- a/src/CppUTest/CMakeLists.txt +++ b/src/CppUTest/CMakeLists.txt @@ -14,7 +14,7 @@ set(CppUTest_src MemoryLeakDetector.cpp TestFilter.cpp TestPlugin.cpp - TestTestingPlugin.cpp + TestTestingFixture.cpp SimpleMutex.cpp Utest.cpp ../Platforms/${CPP_PLATFORM}/UtestPlatform.cpp From d554912f1e25c7accf5698f159773efececf4637 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Wed, 4 May 2016 15:32:52 +0100 Subject: [PATCH 0193/1345] Remove tests for FE_INVALID because not all platforms support this --- src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 2 +- tests/CppUTestExt/IEEE754PluginTest.cpp | 13 ------------- tests/CppUTestExt/IEEE754PluginTest_c.c | 7 ------- tests/CppUTestExt/IEEE754PluginTest_c.h | 1 - 4 files changed, 1 insertion(+), 22 deletions(-) diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index b37e775ad..4da3f9d6b 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -54,7 +54,7 @@ void IEEE754ExceptionsPlugin::postTestAction(UtestShell& test, TestResult& resul IEEE754_CHECK_CLEAR(test, result, FE_DIVBYZERO); IEEE754_CHECK_CLEAR(test, result, FE_OVERFLOW); IEEE754_CHECK_CLEAR(test, result, FE_UNDERFLOW); - IEEE754_CHECK_CLEAR(test, result, FE_INVALID); + IEEE754_CHECK_CLEAR(test, result, FE_INVALID); // LCOV_EXCL_LINE (not all platforms support this) IEEE754_CHECK_CLEAR(test, result, FE_INEXACT); } } diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index d360e8767..73f0abce9 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -69,19 +69,6 @@ TEST(FE__with_Plugin, should_fail____when__FE_UNDERFLOW__is_set) fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_UNDERFLOW) failed"); } -#ifndef __MINGW64__ -#define NOT_MINGW64_TEST TEST -#else -#define NOT_MINGW64_TEST IGNORE_TEST -#endif - -NOT_MINGW64_TEST(FE__with_Plugin, should_fail____when__FE_INVALID____is_set) -{ - fixture.setTestFunction(set_invalid_c); - fixture.runAllTests(); - fixture.assertPrintContains("IEEE754_CHECK_CLEAR(FE_INVALID) failed"); -} - TEST(FE__with_Plugin, should_fail____when__FE_INEXACT____is_set_and_enabled) { IEEE754ExceptionsPlugin::enableInexact(); diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.c b/tests/CppUTestExt/IEEE754PluginTest_c.c index 560b57bde..45cc782f2 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.c +++ b/tests/CppUTestExt/IEEE754PluginTest_c.c @@ -26,7 +26,6 @@ */ #include "IEEE754PluginTest_c.h" -#include static volatile float f; @@ -48,11 +47,6 @@ void set_underflow_c(void) f *= f; } -void set_invalid_c(void) -{ - f = (float) sqrt(-1.0); -} - void set_inexact_c(void) { f = 10.0f; @@ -68,6 +62,5 @@ void set_everything_c() set_divisionbyzero_c(); set_overflow_c(); set_underflow_c(); - set_invalid_c(); set_inexact_c(); } diff --git a/tests/CppUTestExt/IEEE754PluginTest_c.h b/tests/CppUTestExt/IEEE754PluginTest_c.h index a0de61a5e..2f65ba7a5 100644 --- a/tests/CppUTestExt/IEEE754PluginTest_c.h +++ b/tests/CppUTestExt/IEEE754PluginTest_c.h @@ -28,7 +28,6 @@ void set_divisionbyzero_c(void); void set_overflow_c(void); void set_underflow_c(void); -void set_invalid_c(void); void set_inexact_c(void); void set_nothing_c(void); void set_everything_c(void); From b35653ea80f747d1f7032d61791ac4220ecc47d9 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Fri, 6 May 2016 21:51:33 -0500 Subject: [PATCH 0194/1345] Added missing source files --- CppUTest.vcxproj | 3 ++- tests/AllTests.vcxproj | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index a545daecd..8cbba5009 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -141,6 +141,7 @@ + %(AdditionalIncludeDirectories) @@ -198,4 +199,4 @@ - + \ No newline at end of file diff --git a/tests/AllTests.vcxproj b/tests/AllTests.vcxproj index d32de927d..d48f39e46 100644 --- a/tests/AllTests.vcxproj +++ b/tests/AllTests.vcxproj @@ -189,6 +189,7 @@ + @@ -205,4 +206,4 @@ - + \ No newline at end of file From 44fc77874fe78e42a600f9ddea9ce1460d0ff9ca Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sat, 7 May 2016 08:15:33 -0500 Subject: [PATCH 0195/1345] Add missing source files --- CppUTest.vcproj | 4 ++++ tests/AllTests.vcproj | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/CppUTest.vcproj b/CppUTest.vcproj index 7b312db24..a06306cf6 100644 --- a/CppUTest.vcproj +++ b/CppUTest.vcproj @@ -802,6 +802,10 @@ /> + + diff --git a/tests/AllTests.vcproj b/tests/AllTests.vcproj index bd398e474..f5bc0f061 100644 --- a/tests/AllTests.vcproj +++ b/tests/AllTests.vcproj @@ -1299,6 +1299,10 @@ /> + + From 0d92b98f5666794f3a4c16a3578baa2607164cd0 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sat, 7 May 2016 08:20:02 -0500 Subject: [PATCH 0196/1345] Add/Remove headers in project file --- CppUTest.vcproj | 38 +++----------------------------------- 1 file changed, 3 insertions(+), 35 deletions(-) diff --git a/CppUTest.vcproj b/CppUTest.vcproj index a06306cf6..c0edc3813 100644 --- a/CppUTest.vcproj +++ b/CppUTest.vcproj @@ -872,15 +872,15 @@ > - - @@ -967,22 +963,10 @@ RelativePath="include\CppUTestExt\MockSupportPlugin.h" > - - - - - - @@ -991,10 +975,6 @@ RelativePath=".\include\CppUTest\PlatformSpecificFunctions_c.h" > - - @@ -1003,10 +983,6 @@ RelativePath="include\CppUTest\SimpleString.h" > - - @@ -1031,10 +1007,6 @@ RelativePath="include\CppUTest\TestHarness_c.h" > - - @@ -1067,10 +1039,6 @@ RelativePath=".\include\CppUTest\UtestMacros.h" > - - From 2f807a2336fd92d50f05ceb9316ee3a1f418db9d Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Sat, 7 May 2016 08:20:24 -0500 Subject: [PATCH 0197/1345] Remove headers that are part of main project --- tests/AllTests.vcproj | 56 ------------------------------------------- 1 file changed, 56 deletions(-) diff --git a/tests/AllTests.vcproj b/tests/AllTests.vcproj index f5bc0f061..0225cba2e 100644 --- a/tests/AllTests.vcproj +++ b/tests/AllTests.vcproj @@ -1370,66 +1370,10 @@ RelativePath="AllTests.h" > - - - - - - - - - - - - - - - - - - - - - - - - - - - - Date: Sat, 7 May 2016 08:22:42 -0500 Subject: [PATCH 0198/1345] Add a missing header file --- CppUTest.vcxproj | 1 + 1 file changed, 1 insertion(+) diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index 8cbba5009..16e718e85 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -172,6 +172,7 @@ + From 3a4cd929891f8687844a9bbe38de0f64ae11983c Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 9 May 2016 13:16:18 +0100 Subject: [PATCH 0199/1345] Check if any flag is set (rather than all flags)... because flags can have different values across compilers and we would prefer not to include in the tests. --- tests/CppUTestExt/IEEE754PluginTest.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index 73f0abce9..dbf1a420a 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -119,9 +119,11 @@ TEST(FE__with_Plugin, should_not_fail_again_when_test_has_already_failed) { fixture.setTestFunction(set_everything_but_already_failed); fixture.runAllTests(); - CHECK(IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(0x04)); - CHECK(IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(0x08)); - CHECK(IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(0x10)); + CHECK( + IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(1 << 2) || + IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(1 << 3) || + IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(1 << 4) + ); LONGS_EQUAL(1, fixture.getCheckCount()); LONGS_EQUAL(1, fixture.getFailureCount()); } From d73778d2a718664ee70f539d5bf2960afa001d35 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 9 May 2016 19:31:47 -0500 Subject: [PATCH 0200/1345] Replaced parameter function with specific functions --- include/CppUTestExt/IEEE754ExceptionsPlugin.h | 5 ++++- src/CppUTestExt/IEEE754ExceptionsPlugin.cpp | 19 +++++++++++++++++-- tests/CppUTestExt/IEEE754PluginTest.cpp | 9 ++++----- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/include/CppUTestExt/IEEE754ExceptionsPlugin.h b/include/CppUTestExt/IEEE754ExceptionsPlugin.h index a31215cab..9d3f0cdc1 100644 --- a/include/CppUTestExt/IEEE754ExceptionsPlugin.h +++ b/include/CppUTestExt/IEEE754ExceptionsPlugin.h @@ -40,7 +40,10 @@ class IEEE754ExceptionsPlugin: public TestPlugin static void disableInexact(void); static void enableInexact(void); - static bool checkIeee754ExeptionFlag(int flag); + static bool checkIeee754OverflowExceptionFlag(); + static bool checkIeee754UnderflowExceptionFlag(); + static bool checkIeee754InexactExceptionFlag(); + static bool checkIeee754DivByZeroExceptionFlag(); private: void ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text); diff --git a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp index 4da3f9d6b..9f0ec9b38 100644 --- a/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp +++ b/src/CppUTestExt/IEEE754ExceptionsPlugin.cpp @@ -69,9 +69,24 @@ void IEEE754ExceptionsPlugin::enableInexact() inexactDisabled_ = false; } -bool IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(int flag) +bool IEEE754ExceptionsPlugin::checkIeee754OverflowExceptionFlag() { - return fetestexcept(flag) != 0; + return fetestexcept(FE_OVERFLOW) != 0; +} + +bool IEEE754ExceptionsPlugin::checkIeee754UnderflowExceptionFlag() +{ + return fetestexcept(FE_UNDERFLOW) != 0; +} + +bool IEEE754ExceptionsPlugin::checkIeee754InexactExceptionFlag() +{ + return fetestexcept(FE_INEXACT) != 0; +} + +bool IEEE754ExceptionsPlugin::checkIeee754DivByZeroExceptionFlag() +{ + return fetestexcept(FE_DIVBYZERO) != 0; } void IEEE754ExceptionsPlugin::ieee754Check(UtestShell& test, TestResult& result, int flag, const char* text) diff --git a/tests/CppUTestExt/IEEE754PluginTest.cpp b/tests/CppUTestExt/IEEE754PluginTest.cpp index dbf1a420a..c4c223f82 100644 --- a/tests/CppUTestExt/IEEE754PluginTest.cpp +++ b/tests/CppUTestExt/IEEE754PluginTest.cpp @@ -119,11 +119,10 @@ TEST(FE__with_Plugin, should_not_fail_again_when_test_has_already_failed) { fixture.setTestFunction(set_everything_but_already_failed); fixture.runAllTests(); - CHECK( - IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(1 << 2) || - IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(1 << 3) || - IEEE754ExceptionsPlugin::checkIeee754ExeptionFlag(1 << 4) - ); + CHECK(IEEE754ExceptionsPlugin::checkIeee754OverflowExceptionFlag()); + CHECK(IEEE754ExceptionsPlugin::checkIeee754UnderflowExceptionFlag()); + CHECK(IEEE754ExceptionsPlugin::checkIeee754InexactExceptionFlag()); + CHECK(IEEE754ExceptionsPlugin::checkIeee754DivByZeroExceptionFlag()); LONGS_EQUAL(1, fixture.getCheckCount()); LONGS_EQUAL(1, fixture.getFailureCount()); } From ecc131d951675a9fab45ee9724de294fb781de59 Mon Sep 17 00:00:00 2001 From: Andy Neebel Date: Mon, 9 May 2016 20:20:59 -0500 Subject: [PATCH 0201/1345] Added ignores for VS2015 files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 43041c879..d344aef87 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,8 @@ Release *.tlog *.cache *.user +*.VC.db +*.VC.opendb _build_ _build builds/*gcc* From c92072393011f596cd3dcd003e5388520c36f87b Mon Sep 17 00:00:00 2001 From: James Grenning Date: Tue, 17 May 2016 16:18:53 -0500 Subject: [PATCH 0202/1345] Removed Prag Prog, Grenning copyright. --- .../armcc/AT91SAM7A3/tests/main.cpp | 47 +++++++++++-------- .../armcc/LPC1768/tests/main.cpp | 43 ++++++++++------- 2 files changed, 53 insertions(+), 37 deletions(-) diff --git a/platforms_examples/armcc/AT91SAM7A3/tests/main.cpp b/platforms_examples/armcc/AT91SAM7A3/tests/main.cpp index 47b2f60bb..e1eac674c 100644 --- a/platforms_examples/armcc/AT91SAM7A3/tests/main.cpp +++ b/platforms_examples/armcc/AT91SAM7A3/tests/main.cpp @@ -1,27 +1,34 @@ -//- ------------------------------------------------------------------ -//- Copyright (c) James W. Grenning -- All Rights Reserved -//- For use by owners of Test-Driven Development for Embedded C, -//- and attendees of Renaissance Software Consulting, Co. training -//- classes. -//- -//- Available at http://pragprog.com/titles/jgade/ -//- ISBN 1-934356-62-X, ISBN13 978-1-934356-62-3 -//- -//- Authorized users may use this source code in your own -//- projects, however the source code may not be used to -//- create training material, courses, books, articles, and -//- the like. We make no guarantees that this source code is -//- fit for any purpose. -//- -//- www.renaissancesoftware.net james@renaissancesoftware.net -//- ------------------------------------------------------------------ +/* + * 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" int main(int ac, char** av) { - int result = RUN_ALL_TESTS(ac, av); - - return result; + return RUN_ALL_TESTS(ac, av); } diff --git a/platforms_examples/armcc/LPC1768/tests/main.cpp b/platforms_examples/armcc/LPC1768/tests/main.cpp index c9ffa63ed..b8dd10eec 100644 --- a/platforms_examples/armcc/LPC1768/tests/main.cpp +++ b/platforms_examples/armcc/LPC1768/tests/main.cpp @@ -1,20 +1,29 @@ -//- ------------------------------------------------------------------ -//- Copyright (c) James W. Grenning -- All Rights Reserved -//- For use by owners of Test-Driven Development for Embedded C, -//- and attendees of Renaissance Software Consulting, Co. training -//- classes. -//- -//- Available at http://pragprog.com/titles/jgade/ -//- ISBN 1-934356-62-X, ISBN13 978-1-934356-62-3 -//- -//- Authorized users may use this source code in your own -//- projects, however the source code may not be used to -//- create training material, courses, books, articles, and -//- the like. We make no guarantees that this source code is -//- fit for any purpose. -//- -//- www.renaissancesoftware.net james@renaissancesoftware.net -//- ------------------------------------------------------------------ +/* + * 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 From 8987bf47641101b3f64cc0550ec36b1f62242d1f Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 12 May 2016 15:27:02 +0100 Subject: [PATCH 0203/1345] Add SimpleString::npos & use as default amount in subString() --- include/CppUTest/SimpleString.h | 4 +++- tests/SimpleStringTest.cpp | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 295eea33b..07f304f82 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -59,6 +59,8 @@ class SimpleString SimpleString& operator+=(const SimpleString&); SimpleString& operator+=(const char*); + static const size_t npos = (size_t) -1; + char at(int pos) const; int find(char ch) const; int findFrom(size_t starting_position, char ch) const; @@ -76,7 +78,7 @@ class SimpleString void replace(const char* to, const char* with); SimpleString lowerCase() const; - SimpleString subString(size_t beginPos, size_t amount) const; + SimpleString subString(size_t beginPos, size_t amount = SimpleString::npos) const; SimpleString subStringFromTill(char startChar, char lastExcludedChar) const; void copyToBuffer(char* buffer, size_t bufferSize) const; diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index a5d04e32c..df6b91d1d 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -370,6 +370,12 @@ TEST(SimpleString, subStringFromPos5WithAmountLargerThanString) STRCMP_EQUAL("World", str.subString(6, 10).asCharString()); } +TEST(SimpleString, subStringFromPos3ToEndOfStringUsingNposAsDefault) +{ + SimpleString str("Hello World"); + STRCMP_EQUAL("World", str.subString(6).asCharString()); +} + TEST(SimpleString, subStringBeginPosOutOfBounds) { SimpleString str("Hello World"); From d7c1fa83d1ae1d13a31f62ac556669bd7229b202 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Thu, 12 May 2016 21:06:06 +0200 Subject: [PATCH 0204/1345] Use size_t consistently with the aid of SimpleString::npos --- include/CppUTest/SimpleString.h | 6 +++--- src/CppUTest/SimpleString.cpp | 20 ++++++++++---------- tests/SimpleStringTest.cpp | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index 07f304f82..c8aca4e78 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -61,9 +61,9 @@ class SimpleString static const size_t npos = (size_t) -1; - char at(int pos) const; - int find(char ch) const; - int findFrom(size_t starting_position, char ch) const; + char at(size_t pos) const; + size_t find(char ch) const; + size_t findFrom(size_t starting_position, char ch) const; bool contains(const SimpleString& other) const; bool containsNoCase(const SimpleString& other) const; bool startsWith(const SimpleString& other) const; diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index f09523d45..999018ce7 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -369,33 +369,33 @@ SimpleString SimpleString::subString(size_t beginPos, size_t amount) const return newString; } -char SimpleString::at(int pos) const +char SimpleString::at(size_t pos) const { return buffer_[pos]; } -int SimpleString::find(char ch) const +size_t SimpleString::find(char ch) const { return findFrom(0, ch); } -int SimpleString::findFrom(size_t starting_position, char ch) const +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 (int) i; - return -1; + if (buffer_[i] == ch) return i; + return npos; } SimpleString SimpleString::subStringFromTill(char startChar, char lastExcludedChar) const { - int beginPos = find(startChar); - if (beginPos < 0) return ""; + size_t beginPos = find(startChar); + if (beginPos == npos) return ""; - int endPos = findFrom((size_t)beginPos, lastExcludedChar); - if (endPos == -1) return subString((size_t)beginPos, size()); + size_t endPos = findFrom(beginPos, lastExcludedChar); + if (endPos == npos) return subString(beginPos, size()); - return subString((size_t)beginPos, (size_t) (endPos - beginPos)); + return subString(beginPos, endPos - beginPos); } char* SimpleString::copyToNewBuffer(const char* bufferToCopy, size_t bufferSize) diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index df6b91d1d..3dedb94e1 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -411,7 +411,7 @@ TEST(SimpleString, findNormal) SimpleString str("Hello World"); LONGS_EQUAL(0, str.find('H')); LONGS_EQUAL(1, str.find('e')); - LONGS_EQUAL(-1, str.find('!')); + LONGS_EQUAL(SimpleString::npos, str.find('!')); } TEST(SimpleString, at) From f5e42eebf3b036b148ecb24facfbd2a3868b97e7 Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 13 May 2016 10:19:38 +0100 Subject: [PATCH 0205/1345] Add missing sources to CCStudio --- platforms/CCStudio/CppUTest.wks | Bin 15926 -> 16336 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/platforms/CCStudio/CppUTest.wks b/platforms/CCStudio/CppUTest.wks index 1dd4eb3197982e8f1813bc539df732d17a221a51..4b25a9f0f24bed6dfc76408b0c5dd31c24b3020e 100644 GIT binary patch delta 1602 zcma)6Ur1A76#wpZ_ijs@SK7mhE$?)?>DKCsx+$Al78E5>K~NZK7G$Iq_6Nfp7Gy7x zbsmf;EJ?5k5-vp8gFX3Ly+rg>5aLr9QL=|x=iK&<-CM>EobBG<_dCCHzH`6xJs*CP zn!PKF3oUR@zP)ZH#+Z{awx?(4^!an@7IrnJZ?%6C^~pD*ds> zm3=_(9-hcGe5G^d_?K*uD{xtOR;5H9Wu^Yto}837JOwwZ z3+pMCk?W~u^mJ`-0G4ZQA*!z6bh|>HK>jxQhaizr^EQ((StCnCz6|pfhoHK~9lC~Z z)^NfooW6c;Yg)h>UR3K2xsYNFCyc^xnZw)jGJmX9B6RM?kXFb}b#HiFFd}Gsg+u^- zic6c6f*Q)y>|ynW_klgy2L~GC@XF=TXQPXvQ^v#PqM?9EEh7dQJgCbJRuVFGav61? z72Pm?dJ=OF&4;oVmlNpu{oz>srgRZ7-S&$ifEJA-%RR7kr Zqext8f##%FUcfuf)e4b+wO*%q)FP^Rja*-BHj#2gDK=tXd5)~P!JOd zA|BJP;13?WiMQh751#C$ph7Jo{vC?FRm6h`LXCF)CYmsz#Sgw6=Iy*U@6F6w`O&4N z+aj+Ua7SG5c~XQp2_YwP^M#8gWk30xG{@~5oJgvcMXILid@I;1_DQHed}RvWA1=?` z(@S*1*^oszaC>p_EmLoM#5xrGFgw7DK1rX!pW7A|Lu_KVFk%oHJBatfl4JHC z5mvPoxEhfloK*k%T8=yrsA2$KYR_R@l^eG6YRk64$CDsMyWwXd1Gevh)-g(N5S%kha~;mF8n4Y;}QIiznJcWk6Nc4C9o>6 z9GQSr`V7nsFT&%L+{b#ND+KIc_!PEqq}Pu{Nn From 926b70cd9b28eab8a86f594352fd4454b59b717c Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 13 May 2016 10:38:20 +0100 Subject: [PATCH 0206/1345] This cast is necessary for the Cl2000 compiler --- src/CppUTestExt/MockSupport_c.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CppUTestExt/MockSupport_c.cpp b/src/CppUTestExt/MockSupport_c.cpp index 485b40fe9..69145b7de 100644 --- a/src/CppUTestExt/MockSupport_c.cpp +++ b/src/CppUTestExt/MockSupport_c.cpp @@ -788,7 +788,7 @@ const void* returnConstPointerValueOrDefault_c(const void * defaultValue) void (*functionPointerReturnValue_c())() { - return actualCall->returnFunctionPointerValue(); + return (void (*)()) actualCall->returnFunctionPointerValue(); } void (*returnFunctionPointerValueOrDefault_c(void (*defaultValue)()))() From 9eb7cd1854fe3ca1b73c4f0f48a0f3161f52ed9e Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 13 May 2016 10:44:22 +0100 Subject: [PATCH 0207/1345] Add missing sources to CCStudio 2 --- platforms/CCStudio/CppUTest.wks | Bin 16336 -> 16569 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/platforms/CCStudio/CppUTest.wks b/platforms/CCStudio/CppUTest.wks index 4b25a9f0f24bed6dfc76408b0c5dd31c24b3020e..edcb3b00c0af56d6e8f66619d25b914cede7034f 100644 GIT binary patch delta 314 zcmcamzq65X!z?zY_4bqJuuT%4Xu-h1$-uzilUSKwTB2aUkYlmgk)4x?k!iCx=Vn&c z1m>jmzc(}U|KMT`@J(6&dy|wj8`G57&9Vv~q$W?$XJKTVoMo*%+0vzZ z&!M7JT$CK+Tu=}il3HBiT2T_?o1dH=Tv||&UsMvGte0F+;5zw Date: Wed, 18 May 2016 14:44:01 +0100 Subject: [PATCH 0208/1345] Shunt around sources so all fits in memory again --- platforms/CCStudio/CppUTest.pjt | 1 + platforms/CCStudio/CppUTestExtRunAllTests1.pjt | 3 ++- platforms/CCStudio/CppUTestExtRunAllTests2.pjt | 3 ++- platforms/CCStudio/CppUTestRunAllTests1.pjt | 5 +++-- platforms/CCStudio/CppUTestRunAllTests2.pjt | 3 +++ 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/platforms/CCStudio/CppUTest.pjt b/platforms/CCStudio/CppUTest.pjt index 742ebf264..60a338dd8 100644 --- a/platforms/CCStudio/CppUTest.pjt +++ b/platforms/CCStudio/CppUTest.pjt @@ -27,6 +27,7 @@ Source="..\..\src\CppUTest\TestOutput.cpp" Source="..\..\src\CppUTest\TestPlugin.cpp" Source="..\..\src\CppUTest\TestRegistry.cpp" Source="..\..\src\CppUTest\TestResult.cpp" +Source="..\..\src\CppUTest\TestTestingFixture.cpp" Source="..\..\src\CppUTest\Utest.cpp" Source="..\..\src\CppUTestExt\CodeMemoryReportFormatter.cpp" Source="..\..\src\CppUTestExt\MemoryReportAllocator.cpp" diff --git a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt index fd90cb8aa..d48d4aaec 100644 --- a/platforms/CCStudio/CppUTestExtRunAllTests1.pjt +++ b/platforms/CCStudio/CppUTestExtRunAllTests1.pjt @@ -27,6 +27,7 @@ Source="..\..\src\CppUTest\TestOutput.cpp" Source="..\..\src\CppUTest\TestPlugin.cpp" Source="..\..\src\CppUTest\TestRegistry.cpp" Source="..\..\src\CppUTest\TestResult.cpp" +Source="..\..\src\CppUTest\TestTestingFixture.cpp" Source="..\..\src\CppUTest\Utest.cpp" Source="..\..\src\CppUTestExt\CodeMemoryReportFormatter.cpp" Source="..\..\src\CppUTestExt\MemoryReportAllocator.cpp" @@ -46,7 +47,6 @@ Source="..\..\tests\CppUTestExt\GMockTest.cpp" Source="..\..\tests\CppUTestExt\GTest1Test.cpp" Source="..\..\tests\CppUTestExt\GTest2ConvertorTest.cpp" Source="..\..\tests\CppUTestExt\MemoryReportAllocatorTest.cpp" -Source="..\..\tests\CppUTestExt\MemoryReporterPluginTest.cpp" Source="..\..\tests\CppUTestExt\MemoryReportFormatterTest.cpp" Source="..\..\tests\CppUTestExt\MockActualCallTest.cpp" Source="..\..\tests\CppUTestExt\MockCheatSheetTest.cpp" @@ -55,6 +55,7 @@ Source="..\..\tests\CppUTestExt\MockFailureReporterForTest.cpp" Source="..\..\tests\CppUTestExt\MockFailureTest.cpp" Source="..\..\tests\CppUTestExt\MockHierarchyTest.cpp" Source="..\..\tests\CppUTestExt\MockPluginTest.cpp" +Source="..\..\tests\CppUTestExt\MockReturnValueTest.cpp" Source="..\..\tests\CppUTestExt\MockStrictOrderTest.cpp" Source="..\..\tests\CppUTestExt\MockSupportTest.cpp" Source="C:\CCStudio_v3.3\C2000\cgtools\lib\src\farmem_cpp.cpp" diff --git a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt index b77ee4e9b..3a16a39b3 100644 --- a/platforms/CCStudio/CppUTestExtRunAllTests2.pjt +++ b/platforms/CCStudio/CppUTestExtRunAllTests2.pjt @@ -27,6 +27,7 @@ Source="..\..\src\CppUTest\TestOutput.cpp" Source="..\..\src\CppUTest\TestPlugin.cpp" Source="..\..\src\CppUTest\TestRegistry.cpp" Source="..\..\src\CppUTest\TestResult.cpp" +Source="..\..\src\CppUTest\TestTestingFixture.cpp" Source="..\..\src\CppUTest\Utest.cpp" Source="..\..\src\CppUTestExt\CodeMemoryReportFormatter.cpp" Source="..\..\src\CppUTestExt\MemoryReportAllocator.cpp" @@ -42,12 +43,12 @@ Source="..\..\src\CppUTestExt\MockSupport_c.cpp" Source="..\..\src\CppUTestExt\MockSupportPlugin.cpp" Source="..\..\src\CppUTestExt\OrderedTest.cpp" Source="..\..\src\Platforms\C2000\UtestPlatform.cpp" +Source="..\..\tests\CppUTestExt\MemoryReporterPluginTest.cpp" Source="..\..\tests\CppUTestExt\MockCallTest.cpp" Source="..\..\tests\CppUTestExt\MockComparatorCopierTest.cpp" Source="..\..\tests\CppUTestExt\MockFailureReporterForTest.cpp" Source="..\..\tests\CppUTestExt\MockNamedValueTest.cpp" Source="..\..\tests\CppUTestExt\MockParameterTest.cpp" -Source="..\..\tests\CppUTestExt\MockReturnValueTest.cpp" Source="..\..\tests\CppUTestExt\MockSupport_cTest.cpp" Source="..\..\tests\CppUTestExt\MockSupport_cTestCFile.c" Source="..\..\tests\CppUTestExt\OrderedTestTest.cpp" diff --git a/platforms/CCStudio/CppUTestRunAllTests1.pjt b/platforms/CCStudio/CppUTestRunAllTests1.pjt index 3d0af90b6..bd08bc024 100644 --- a/platforms/CCStudio/CppUTestRunAllTests1.pjt +++ b/platforms/CCStudio/CppUTestRunAllTests1.pjt @@ -27,6 +27,7 @@ Source="..\..\src\CppUTest\TestOutput.cpp" Source="..\..\src\CppUTest\TestPlugin.cpp" Source="..\..\src\CppUTest\TestRegistry.cpp" Source="..\..\src\CppUTest\TestResult.cpp" +Source="..\..\src\CppUTest\TestTestingFixture.cpp" Source="..\..\src\CppUTest\Utest.cpp" Source="..\..\src\Platforms\C2000\UtestPlatform.cpp" Source="..\..\tests\AllocationInCFile.c" @@ -38,15 +39,15 @@ Source="..\..\tests\CommandLineArgumentsTest.cpp" Source="..\..\tests\CommandLineTestRunnerTest.cpp" Source="..\..\tests\JUnitOutputTest.cpp" Source="..\..\tests\MemoryLeakDetectorTest.cpp" -Source="..\..\tests\MemoryOperatorOverloadTest.cpp" Source="..\..\tests\MemoryLeakWarningTest.cpp" +Source="..\..\tests\MemoryOperatorOverloadTest.cpp" Source="..\..\tests\PluginTest.cpp" Source="..\..\tests\PreprocessorTest.cpp" Source="..\..\tests\SetPluginTest.cpp" Source="..\..\tests\TeamCityOutputTest.cpp" Source="..\..\tests\TestFailureNaNTest.cpp" Source="..\..\tests\TestFailureTest.cpp" -Source="..\..\tests\TestOutputTest.cpp" +Source="..\..\tests\TestUTestStringMacro.cpp" Source="C:\CCStudio_v3.3\C2000\cgtools\lib\src\farmem_cpp.cpp" Source="tests\CppUTest\AllTestsForTarget.cpp" Source="sim28335.cmd" diff --git a/platforms/CCStudio/CppUTestRunAllTests2.pjt b/platforms/CCStudio/CppUTestRunAllTests2.pjt index 62db79a7f..279afff4c 100644 --- a/platforms/CCStudio/CppUTestRunAllTests2.pjt +++ b/platforms/CCStudio/CppUTestRunAllTests2.pjt @@ -27,7 +27,9 @@ Source="..\..\src\CppUTest\TestOutput.cpp" Source="..\..\src\CppUTest\TestPlugin.cpp" Source="..\..\src\CppUTest\TestRegistry.cpp" Source="..\..\src\CppUTest\TestResult.cpp" +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\TestFilterTest.cpp" @@ -35,6 +37,7 @@ Source="..\..\tests\TestHarness_cTest.cpp" Source="..\..\tests\TestHarness_cTestCFile.c" Source="..\..\tests\TestInstallerTest.cpp" Source="..\..\tests\TestMemoryAllocatorTest.cpp" +Source="..\..\tests\TestOutputTest.cpp" Source="..\..\tests\TestRegistryTest.cpp" Source="..\..\tests\TestResultTest.cpp" Source="..\..\tests\TestUTestMacro.cpp" From a61da03533bb825840dc8bb4ede5a0cf31a1c21c Mon Sep 17 00:00:00 2001 From: Arno Moonen Date: Thu, 19 May 2016 18:28:49 +0200 Subject: [PATCH 0209/1345] Added workaround to prevent the redefinition of timespec when using MinGW (see cpputest/cpputest#971 ). --- CMakeLists.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b1bb19ae..28d183bfd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,15 @@ if(HAVE_FORK) add_definitions(-DCPPUTEST_HAVE_FORK) endif(HAVE_FORK) +# Apply workaround for MinGW timespec redefinition (pthread.h / time.h) +if (MINGW) + 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() +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) From ff09247968c308349f457d3170f28081ac5b5723 Mon Sep 17 00:00:00 2001 From: Arno Moonen Date: Thu, 19 May 2016 21:01:20 +0200 Subject: [PATCH 0210/1345] 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 e97f3cacc591eb530b79fc4267137eed116768dd Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 20 May 2016 08:17:09 +0100 Subject: [PATCH 0211/1345] Drop platforms_startup/ (fix for #961) --- platforms_startup/README | 4 - .../armcc/AT91SAM7A3/AT91SAM7A3.h | 2992 ---------- platforms_startup/armcc/AT91SAM7A3/Makefile | 125 - platforms_startup/armcc/AT91SAM7A3/README | 9 - platforms_startup/armcc/AT91SAM7A3/Retarget.c | 177 - platforms_startup/armcc/AT91SAM7A3/SAM7A3.asm | 434 -- .../armcc/AT91SAM7A3/lib_AT91SAM7A3.h | 5054 ----------------- platforms_startup/armcc/LPC1768/LPC17xx.h | 1083 ---- platforms_startup/armcc/LPC1768/Makefile | 123 - platforms_startup/armcc/LPC1768/README | 19 - platforms_startup/armcc/LPC1768/Retarget.c | 153 - platforms_startup/armcc/LPC1768/Serial.c | 82 - platforms_startup/armcc/LPC1768/Serial.h | 24 - platforms_startup/armcc/LPC1768/core_cm3.h | 1227 ---- platforms_startup/armcc/LPC1768/core_cmFunc.h | 609 -- .../armcc/LPC1768/core_cmInstr.h | 586 -- .../armcc/LPC1768/lpc17xx_clkpwr.c | 350 -- .../armcc/LPC1768/lpc17xx_clkpwr.h | 406 -- .../armcc/LPC1768/lpc17xx_libcfg_default.c | 76 - .../armcc/LPC1768/lpc17xx_libcfg_default.h | 182 - .../armcc/LPC1768/lpc17xx_pinsel.h | 203 - .../armcc/LPC1768/lpc17xx_timer.c | 609 -- .../armcc/LPC1768/lpc17xx_timer.h | 348 -- platforms_startup/armcc/LPC1768/lpc_types.h | 212 - .../armcc/LPC1768/startup_LPC17xx.asm | 281 - .../armcc/LPC1768/system_LPC17xx.c | 642 --- .../armcc/LPC1768/system_LPC17xx.h | 72 - platforms_startup/armcc/LPC1833/Makefile | 139 - platforms_startup/armcc/LPC1833/README | 10 - platforms_startup/armcc/LPC1833/cmsis_18xx.h | 152 - platforms_startup/armcc/LPC1833/core_cm3.h | 1550 ----- platforms_startup/armcc/LPC1833/core_cmFunc.h | 312 - .../armcc/LPC1833/core_cmInstr.h | 303 - platforms_startup/armcc/LPC1833/retarget.c | 224 - .../armcc/LPC1833/startup_LPC18xx.asm | 337 -- platforms_startup/armcc/LPC1833/sysinit.c | 45 - 36 files changed, 19154 deletions(-) delete mode 100644 platforms_startup/README delete mode 100644 platforms_startup/armcc/AT91SAM7A3/AT91SAM7A3.h delete mode 100644 platforms_startup/armcc/AT91SAM7A3/Makefile delete mode 100644 platforms_startup/armcc/AT91SAM7A3/README delete mode 100644 platforms_startup/armcc/AT91SAM7A3/Retarget.c delete mode 100644 platforms_startup/armcc/AT91SAM7A3/SAM7A3.asm delete mode 100644 platforms_startup/armcc/AT91SAM7A3/lib_AT91SAM7A3.h delete mode 100644 platforms_startup/armcc/LPC1768/LPC17xx.h delete mode 100644 platforms_startup/armcc/LPC1768/Makefile delete mode 100644 platforms_startup/armcc/LPC1768/README delete mode 100644 platforms_startup/armcc/LPC1768/Retarget.c delete mode 100644 platforms_startup/armcc/LPC1768/Serial.c delete mode 100644 platforms_startup/armcc/LPC1768/Serial.h delete mode 100644 platforms_startup/armcc/LPC1768/core_cm3.h delete mode 100644 platforms_startup/armcc/LPC1768/core_cmFunc.h delete mode 100644 platforms_startup/armcc/LPC1768/core_cmInstr.h delete mode 100644 platforms_startup/armcc/LPC1768/lpc17xx_clkpwr.c delete mode 100644 platforms_startup/armcc/LPC1768/lpc17xx_clkpwr.h delete mode 100644 platforms_startup/armcc/LPC1768/lpc17xx_libcfg_default.c delete mode 100644 platforms_startup/armcc/LPC1768/lpc17xx_libcfg_default.h delete mode 100644 platforms_startup/armcc/LPC1768/lpc17xx_pinsel.h delete mode 100644 platforms_startup/armcc/LPC1768/lpc17xx_timer.c delete mode 100644 platforms_startup/armcc/LPC1768/lpc17xx_timer.h delete mode 100644 platforms_startup/armcc/LPC1768/lpc_types.h delete mode 100644 platforms_startup/armcc/LPC1768/startup_LPC17xx.asm delete mode 100644 platforms_startup/armcc/LPC1768/system_LPC17xx.c delete mode 100644 platforms_startup/armcc/LPC1768/system_LPC17xx.h delete mode 100644 platforms_startup/armcc/LPC1833/Makefile delete mode 100644 platforms_startup/armcc/LPC1833/README delete mode 100644 platforms_startup/armcc/LPC1833/cmsis_18xx.h delete mode 100644 platforms_startup/armcc/LPC1833/core_cm3.h delete mode 100644 platforms_startup/armcc/LPC1833/core_cmFunc.h delete mode 100644 platforms_startup/armcc/LPC1833/core_cmInstr.h delete mode 100644 platforms_startup/armcc/LPC1833/retarget.c delete mode 100644 platforms_startup/armcc/LPC1833/startup_LPC18xx.asm delete mode 100644 platforms_startup/armcc/LPC1833/sysinit.c diff --git a/platforms_startup/README b/platforms_startup/README deleted file mode 100644 index c62c9a8f4..000000000 --- a/platforms_startup/README +++ /dev/null @@ -1,4 +0,0 @@ -Directory to place startup files for different toolchains/chips combinations. - -Source files from this directory is compiled to library placed in lib - directory in CppUTest home. diff --git a/platforms_startup/armcc/AT91SAM7A3/AT91SAM7A3.h b/platforms_startup/armcc/AT91SAM7A3/AT91SAM7A3.h deleted file mode 100644 index 66c15496f..000000000 --- a/platforms_startup/armcc/AT91SAM7A3/AT91SAM7A3.h +++ /dev/null @@ -1,2992 +0,0 @@ -// ---------------------------------------------------------------------------- -// ATMEL Microcontroller Software Support - ROUSSET - -// ---------------------------------------------------------------------------- -// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE -// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. -// ---------------------------------------------------------------------------- -// File Name : AT91SAM7A3.h -// Object : AT91SAM7A3 definitions -// Generated : AT91 SW Application Group 09/13/2005 (09:48:02) -// -// CVS Reference : /AT91SAM7A3.pl/1.28/Tue Sep 13 07:43:39 2005// -// CVS Reference : /SYS_SAM7A3.pl/1.7/Thu Feb 3 17:24:14 2005// -// CVS Reference : /MC_SAM7A3.pl/1.2/Fri May 20 14:22:29 2005// -// CVS Reference : /PMC_SAM7A3.pl/1.2/Tue Feb 8 14:00:18 2005// -// CVS Reference : /RSTC_SAM7A3.pl/1.2/Wed Jul 13 15:25:16 2005// -// CVS Reference : /SHDWC_SAM7A3.pl/1.1/Thu Feb 3 17:23:24 2005// -// CVS Reference : /UDP_SAM7A3.pl/1.1/Tue May 10 12:39:23 2005// -// CVS Reference : /PWM_SAM7A3.pl/1.1/Tue May 10 12:38:54 2005// -// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:21:42 2005// -// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:29:42 2005// -// CVS Reference : /RTTC_6081A.pl/1.2/Thu Nov 4 13:57:22 2004// -// CVS Reference : /PITC_6079A.pl/1.2/Thu Nov 4 13:56:22 2004// -// CVS Reference : /WDTC_6080A.pl/1.3/Thu Nov 4 13:58:52 2004// -// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 09:02:11 2005// -// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:54:41 2005// -// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:23:02 2005// -// CVS Reference : /US_6089C.pl/1.1/Mon Jan 31 13:56:02 2005// -// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:10:41 2004// -// CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 06:38:23 2004// -// CVS Reference : /TC_6082A.pl/1.7/Wed Mar 9 16:31:51 2005// -// CVS Reference : /CAN_6019B.pl/1.1/Mon Jan 31 13:54:30 2005// -// CVS Reference : /MCI_6101A.pl/1.1/Tue Jul 13 06:33:59 2004// -// CVS Reference : /ADC_6051C.pl/1.1/Mon Jan 31 13:12:40 2005// -// CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:46:08 2005// -// CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 13:30:33 2005// -// ---------------------------------------------------------------------------- - -#ifndef AT91SAM7A3_H -#define AT91SAM7A3_H - -typedef volatile unsigned int AT91_REG;// Hardware register definition - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR System Peripherals -// ***************************************************************************** -typedef struct _AT91S_SYS { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register - AT91_REG Reserved2[45]; // - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved3[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved4[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register - AT91_REG Reserved5[54]; // - AT91_REG PIOA_PER; // PIO Enable Register - AT91_REG PIOA_PDR; // PIO Disable Register - AT91_REG PIOA_PSR; // PIO Status Register - AT91_REG Reserved6[1]; // - AT91_REG PIOA_OER; // Output Enable Register - AT91_REG PIOA_ODR; // Output Disable Registerr - AT91_REG PIOA_OSR; // Output Status Register - AT91_REG Reserved7[1]; // - AT91_REG PIOA_IFER; // Input Filter Enable Register - AT91_REG PIOA_IFDR; // Input Filter Disable Register - AT91_REG PIOA_IFSR; // Input Filter Status Register - AT91_REG Reserved8[1]; // - AT91_REG PIOA_SODR; // Set Output Data Register - AT91_REG PIOA_CODR; // Clear Output Data Register - AT91_REG PIOA_ODSR; // Output Data Status Register - AT91_REG PIOA_PDSR; // Pin Data Status Register - AT91_REG PIOA_IER; // Interrupt Enable Register - AT91_REG PIOA_IDR; // Interrupt Disable Register - AT91_REG PIOA_IMR; // Interrupt Mask Register - AT91_REG PIOA_ISR; // Interrupt Status Register - AT91_REG PIOA_MDER; // Multi-driver Enable Register - AT91_REG PIOA_MDDR; // Multi-driver Disable Register - AT91_REG PIOA_MDSR; // Multi-driver Status Register - AT91_REG Reserved9[1]; // - AT91_REG PIOA_PPUDR; // Pull-up Disable Register - AT91_REG PIOA_PPUER; // Pull-up Enable Register - AT91_REG PIOA_PPUSR; // Pull-up Status Register - AT91_REG Reserved10[1]; // - AT91_REG PIOA_ASR; // Select A Register - AT91_REG PIOA_BSR; // Select B Register - AT91_REG PIOA_ABSR; // AB Select Status Register - AT91_REG Reserved11[9]; // - AT91_REG PIOA_OWER; // Output Write Enable Register - AT91_REG PIOA_OWDR; // Output Write Disable Register - AT91_REG PIOA_OWSR; // Output Write Status Register - AT91_REG Reserved12[85]; // - AT91_REG PIOB_PER; // PIO Enable Register - AT91_REG PIOB_PDR; // PIO Disable Register - AT91_REG PIOB_PSR; // PIO Status Register - AT91_REG Reserved13[1]; // - AT91_REG PIOB_OER; // Output Enable Register - AT91_REG PIOB_ODR; // Output Disable Registerr - AT91_REG PIOB_OSR; // Output Status Register - AT91_REG Reserved14[1]; // - AT91_REG PIOB_IFER; // Input Filter Enable Register - AT91_REG PIOB_IFDR; // Input Filter Disable Register - AT91_REG PIOB_IFSR; // Input Filter Status Register - AT91_REG Reserved15[1]; // - AT91_REG PIOB_SODR; // Set Output Data Register - AT91_REG PIOB_CODR; // Clear Output Data Register - AT91_REG PIOB_ODSR; // Output Data Status Register - AT91_REG PIOB_PDSR; // Pin Data Status Register - AT91_REG PIOB_IER; // Interrupt Enable Register - AT91_REG PIOB_IDR; // Interrupt Disable Register - AT91_REG PIOB_IMR; // Interrupt Mask Register - AT91_REG PIOB_ISR; // Interrupt Status Register - AT91_REG PIOB_MDER; // Multi-driver Enable Register - AT91_REG PIOB_MDDR; // Multi-driver Disable Register - AT91_REG PIOB_MDSR; // Multi-driver Status Register - AT91_REG Reserved16[1]; // - AT91_REG PIOB_PPUDR; // Pull-up Disable Register - AT91_REG PIOB_PPUER; // Pull-up Enable Register - AT91_REG PIOB_PPUSR; // Pull-up Status Register - AT91_REG Reserved17[1]; // - AT91_REG PIOB_ASR; // Select A Register - AT91_REG PIOB_BSR; // Select B Register - AT91_REG PIOB_ABSR; // AB Select Status Register - AT91_REG Reserved18[9]; // - AT91_REG PIOB_OWER; // Output Write Enable Register - AT91_REG PIOB_OWDR; // Output Write Disable Register - AT91_REG PIOB_OWSR; // Output Write Status Register - AT91_REG Reserved19[341]; // - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved20[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved21[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved22[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved23[3]; // - AT91_REG PMC_PCKR[4]; // Programmable Clock Register - AT91_REG Reserved24[4]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register - AT91_REG Reserved25[36]; // - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register - AT91_REG Reserved26[1]; // - AT91_REG SHDWC_SHCR; // Shut Down Control Register - AT91_REG SHDWC_SHMR; // Shut Down Mode Register - AT91_REG SHDWC_SHSR; // Shut Down Status Register - AT91_REG Reserved27[1]; // - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register - AT91_REG Reserved28[1]; // - AT91_REG SYS_GPBR0; // General Purpose Register 0 - AT91_REG SYS_GPBR1; // General Purpose Register 1 - AT91_REG Reserved29[106]; // - AT91_REG MC_RCR; // MC Remap Control Register - AT91_REG MC_ASR; // MC Abort Status Register - AT91_REG MC_AASR; // MC Abort Address Status Register - AT91_REG Reserved30[1]; // - AT91_REG MC_PUIA[16]; // MC Protection Unit Area - AT91_REG MC_PUP; // MC Protection Unit Peripherals - AT91_REG MC_PUER; // MC Protection Unit Enable Register - AT91_REG Reserved31[2]; // - AT91_REG MC_FMR; // MC Flash Mode Register - AT91_REG MC_FCR; // MC Flash Command Register - AT91_REG MC_FSR; // MC Flash Status Register -} AT91S_SYS, *AT91PS_SYS; - -// -------- GPBR : (SYS Offset: 0xd50) GPBR General Purpose Register -------- -// -------- GPBR : (SYS Offset: 0xd54) GPBR General Purpose Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller -// ***************************************************************************** -typedef struct _AT91S_AIC { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register -} AT91S_AIC, *AT91PS_AIC; - -// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- -#define AT91C_AIC_PRIOR ((unsigned int) 0x7 << 0) // (AIC) Priority Level -#define AT91C_AIC_PRIOR_LOWEST ((unsigned int) 0x0) // (AIC) Lowest priority level -#define AT91C_AIC_PRIOR_HIGHEST ((unsigned int) 0x7) // (AIC) Highest priority level -#define AT91C_AIC_SRCTYPE ((unsigned int) 0x3 << 5) // (AIC) Interrupt Source Type -#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL ((unsigned int) 0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive -#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL ((unsigned int) 0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered -#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered -#define AT91C_AIC_SRCTYPE_HIGH_LEVEL ((unsigned int) 0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE ((unsigned int) 0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered -// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- -#define AT91C_AIC_NFIQ ((unsigned int) 0x1 << 0) // (AIC) NFIQ Status -#define AT91C_AIC_NIRQ ((unsigned int) 0x1 << 1) // (AIC) NIRQ Status -// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- -#define AT91C_AIC_DCR_PROT ((unsigned int) 0x1 << 0) // (AIC) Protection Mode -#define AT91C_AIC_DCR_GMSK ((unsigned int) 0x1 << 1) // (AIC) General Mask - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Peripheral DMA Controller -// ***************************************************************************** -typedef struct _AT91S_PDC { - AT91_REG PDC_RPR; // Receive Pointer Register - AT91_REG PDC_RCR; // Receive Counter Register - AT91_REG PDC_TPR; // Transmit Pointer Register - AT91_REG PDC_TCR; // Transmit Counter Register - AT91_REG PDC_RNPR; // Receive Next Pointer Register - AT91_REG PDC_RNCR; // Receive Next Counter Register - AT91_REG PDC_TNPR; // Transmit Next Pointer Register - AT91_REG PDC_TNCR; // Transmit Next Counter Register - AT91_REG PDC_PTCR; // PDC Transfer Control Register - AT91_REG PDC_PTSR; // PDC Transfer Status Register -} AT91S_PDC, *AT91PS_PDC; - -// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- -#define AT91C_PDC_RXTEN ((unsigned int) 0x1 << 0) // (PDC) Receiver Transfer Enable -#define AT91C_PDC_RXTDIS ((unsigned int) 0x1 << 1) // (PDC) Receiver Transfer Disable -#define AT91C_PDC_TXTEN ((unsigned int) 0x1 << 8) // (PDC) Transmitter Transfer Enable -#define AT91C_PDC_TXTDIS ((unsigned int) 0x1 << 9) // (PDC) Transmitter Transfer Disable -// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Debug Unit -// ***************************************************************************** -typedef struct _AT91S_DBGU { - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved0[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved1[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register -} AT91S_DBGU, *AT91PS_DBGU; - -// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_RSTRX ((unsigned int) 0x1 << 2) // (DBGU) Reset Receiver -#define AT91C_US_RSTTX ((unsigned int) 0x1 << 3) // (DBGU) Reset Transmitter -#define AT91C_US_RXEN ((unsigned int) 0x1 << 4) // (DBGU) Receiver Enable -#define AT91C_US_RXDIS ((unsigned int) 0x1 << 5) // (DBGU) Receiver Disable -#define AT91C_US_TXEN ((unsigned int) 0x1 << 6) // (DBGU) Transmitter Enable -#define AT91C_US_TXDIS ((unsigned int) 0x1 << 7) // (DBGU) Transmitter Disable -#define AT91C_US_RSTSTA ((unsigned int) 0x1 << 8) // (DBGU) Reset Status Bits -// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_PAR ((unsigned int) 0x7 << 9) // (DBGU) Parity type -#define AT91C_US_PAR_EVEN ((unsigned int) 0x0 << 9) // (DBGU) Even Parity -#define AT91C_US_PAR_ODD ((unsigned int) 0x1 << 9) // (DBGU) Odd Parity -#define AT91C_US_PAR_SPACE ((unsigned int) 0x2 << 9) // (DBGU) Parity forced to 0 (Space) -#define AT91C_US_PAR_MARK ((unsigned int) 0x3 << 9) // (DBGU) Parity forced to 1 (Mark) -#define AT91C_US_PAR_NONE ((unsigned int) 0x4 << 9) // (DBGU) No Parity -#define AT91C_US_PAR_MULTI_DROP ((unsigned int) 0x6 << 9) // (DBGU) Multi-drop mode -#define AT91C_US_CHMODE ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode -#define AT91C_US_CHMODE_NORMAL ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. -#define AT91C_US_CHMODE_AUTO ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. -#define AT91C_US_CHMODE_LOCAL ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. -#define AT91C_US_CHMODE_REMOTE ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. -// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXRDY ((unsigned int) 0x1 << 0) // (DBGU) RXRDY Interrupt -#define AT91C_US_TXRDY ((unsigned int) 0x1 << 1) // (DBGU) TXRDY Interrupt -#define AT91C_US_ENDRX ((unsigned int) 0x1 << 3) // (DBGU) End of Receive Transfer Interrupt -#define AT91C_US_ENDTX ((unsigned int) 0x1 << 4) // (DBGU) End of Transmit Interrupt -#define AT91C_US_OVRE ((unsigned int) 0x1 << 5) // (DBGU) Overrun Interrupt -#define AT91C_US_FRAME ((unsigned int) 0x1 << 6) // (DBGU) Framing Error Interrupt -#define AT91C_US_PARE ((unsigned int) 0x1 << 7) // (DBGU) Parity Error Interrupt -#define AT91C_US_TXEMPTY ((unsigned int) 0x1 << 9) // (DBGU) TXEMPTY Interrupt -#define AT91C_US_TXBUFE ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt -#define AT91C_US_RXBUFF ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt -#define AT91C_US_COMM_TX ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt -#define AT91C_US_COMM_RX ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt -// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- -// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- -#define AT91C_US_FORCE_NTRST ((unsigned int) 0x1 << 0) // (DBGU) Force NTRST in JTAG - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Parallel Input Output Controler -// ***************************************************************************** -typedef struct _AT91S_PIO { - AT91_REG PIO_PER; // PIO Enable Register - AT91_REG PIO_PDR; // PIO Disable Register - AT91_REG PIO_PSR; // PIO Status Register - AT91_REG Reserved0[1]; // - AT91_REG PIO_OER; // Output Enable Register - AT91_REG PIO_ODR; // Output Disable Registerr - AT91_REG PIO_OSR; // Output Status Register - AT91_REG Reserved1[1]; // - AT91_REG PIO_IFER; // Input Filter Enable Register - AT91_REG PIO_IFDR; // Input Filter Disable Register - AT91_REG PIO_IFSR; // Input Filter Status Register - AT91_REG Reserved2[1]; // - AT91_REG PIO_SODR; // Set Output Data Register - AT91_REG PIO_CODR; // Clear Output Data Register - AT91_REG PIO_ODSR; // Output Data Status Register - AT91_REG PIO_PDSR; // Pin Data Status Register - AT91_REG PIO_IER; // Interrupt Enable Register - AT91_REG PIO_IDR; // Interrupt Disable Register - AT91_REG PIO_IMR; // Interrupt Mask Register - AT91_REG PIO_ISR; // Interrupt Status Register - AT91_REG PIO_MDER; // Multi-driver Enable Register - AT91_REG PIO_MDDR; // Multi-driver Disable Register - AT91_REG PIO_MDSR; // Multi-driver Status Register - AT91_REG Reserved3[1]; // - AT91_REG PIO_PPUDR; // Pull-up Disable Register - AT91_REG PIO_PPUER; // Pull-up Enable Register - AT91_REG PIO_PPUSR; // Pull-up Status Register - AT91_REG Reserved4[1]; // - AT91_REG PIO_ASR; // Select A Register - AT91_REG PIO_BSR; // Select B Register - AT91_REG PIO_ABSR; // AB Select Status Register - AT91_REG Reserved5[9]; // - AT91_REG PIO_OWER; // Output Write Enable Register - AT91_REG PIO_OWDR; // Output Write Disable Register - AT91_REG PIO_OWSR; // Output Write Status Register -} AT91S_PIO, *AT91PS_PIO; - - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Clock Generator Controler -// ***************************************************************************** -typedef struct _AT91S_CKGR { - AT91_REG CKGR_MOR; // Main Oscillator Register - AT91_REG CKGR_MCFR; // Main Clock Frequency Register - AT91_REG Reserved0[1]; // - AT91_REG CKGR_PLLR; // PLL Register -} AT91S_CKGR, *AT91PS_CKGR; - -// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- -#define AT91C_CKGR_MOSCEN ((unsigned int) 0x1 << 0) // (CKGR) Main Oscillator Enable -#define AT91C_CKGR_OSCBYPASS ((unsigned int) 0x1 << 1) // (CKGR) Main Oscillator Bypass -#define AT91C_CKGR_OSCOUNT ((unsigned int) 0xFF << 8) // (CKGR) Main Oscillator Start-up Time -// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- -#define AT91C_CKGR_MAINF ((unsigned int) 0xFFFF << 0) // (CKGR) Main Clock Frequency -#define AT91C_CKGR_MAINRDY ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready -// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- -#define AT91C_CKGR_DIV ((unsigned int) 0xFF << 0) // (CKGR) Divider Selected -#define AT91C_CKGR_DIV_0 ((unsigned int) 0x0) // (CKGR) Divider output is 0 -#define AT91C_CKGR_DIV_BYPASS ((unsigned int) 0x1) // (CKGR) Divider is bypassed -#define AT91C_CKGR_PLLCOUNT ((unsigned int) 0x3F << 8) // (CKGR) PLL Counter -#define AT91C_CKGR_OUT ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range -#define AT91C_CKGR_OUT_0 ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_1 ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_2 ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_3 ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_MUL ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier -#define AT91C_CKGR_USBDIV ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks -#define AT91C_CKGR_USBDIV_0 ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output -#define AT91C_CKGR_USBDIV_1 ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 -#define AT91C_CKGR_USBDIV_2 ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Power Management Controler -// ***************************************************************************** -typedef struct _AT91S_PMC { - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved0[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved1[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved2[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved3[3]; // - AT91_REG PMC_PCKR[4]; // Programmable Clock Register - AT91_REG Reserved4[4]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register -} AT91S_PMC, *AT91PS_PMC; - -// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- -#define AT91C_PMC_PCK ((unsigned int) 0x1 << 0) // (PMC) Processor Clock -#define AT91C_PMC_UDP ((unsigned int) 0x1 << 7) // (PMC) USB Device Port Clock -#define AT91C_PMC_PCK0 ((unsigned int) 0x1 << 8) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK1 ((unsigned int) 0x1 << 9) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK2 ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK3 ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output -// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- -// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- -// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- -// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- -// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- -// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- -#define AT91C_PMC_CSS ((unsigned int) 0x3 << 0) // (PMC) Programmable Clock Selection -#define AT91C_PMC_CSS_SLOW_CLK ((unsigned int) 0x0) // (PMC) Slow Clock is selected -#define AT91C_PMC_CSS_MAIN_CLK ((unsigned int) 0x1) // (PMC) Main Clock is selected -#define AT91C_PMC_CSS_PLL_CLK ((unsigned int) 0x3) // (PMC) Clock from PLL is selected -#define AT91C_PMC_PRES ((unsigned int) 0x7 << 2) // (PMC) Programmable Clock Prescaler -#define AT91C_PMC_PRES_CLK ((unsigned int) 0x0 << 2) // (PMC) Selected clock -#define AT91C_PMC_PRES_CLK_2 ((unsigned int) 0x1 << 2) // (PMC) Selected clock divided by 2 -#define AT91C_PMC_PRES_CLK_4 ((unsigned int) 0x2 << 2) // (PMC) Selected clock divided by 4 -#define AT91C_PMC_PRES_CLK_8 ((unsigned int) 0x3 << 2) // (PMC) Selected clock divided by 8 -#define AT91C_PMC_PRES_CLK_16 ((unsigned int) 0x4 << 2) // (PMC) Selected clock divided by 16 -#define AT91C_PMC_PRES_CLK_32 ((unsigned int) 0x5 << 2) // (PMC) Selected clock divided by 32 -#define AT91C_PMC_PRES_CLK_64 ((unsigned int) 0x6 << 2) // (PMC) Selected clock divided by 64 -// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- -// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- -#define AT91C_PMC_MOSCS ((unsigned int) 0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask -#define AT91C_PMC_LOCK ((unsigned int) 0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask -#define AT91C_PMC_MCKRDY ((unsigned int) 0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK0RDY ((unsigned int) 0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK1RDY ((unsigned int) 0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK2RDY ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK3RDY ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask -// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- -// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- -// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Reset Controller Interface -// ***************************************************************************** -typedef struct _AT91S_RSTC { - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register -} AT91S_RSTC, *AT91PS_RSTC; - -// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- -#define AT91C_RSTC_PROCRST ((unsigned int) 0x1 << 0) // (RSTC) Processor Reset -#define AT91C_RSTC_PERRST ((unsigned int) 0x1 << 2) // (RSTC) Peripheral Reset -#define AT91C_RSTC_EXTRST ((unsigned int) 0x1 << 3) // (RSTC) External Reset -#define AT91C_RSTC_KEY ((unsigned int) 0xFF << 24) // (RSTC) Password -// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- -#define AT91C_RSTC_URSTS ((unsigned int) 0x1 << 0) // (RSTC) User Reset Status -#define AT91C_RSTC_RSTTYP ((unsigned int) 0x7 << 8) // (RSTC) Reset Type -#define AT91C_RSTC_RSTTYP_GENERAL ((unsigned int) 0x0 << 8) // (RSTC) General reset. Both VDDCORE and VDDBU rising. -#define AT91C_RSTC_RSTTYP_WAKEUP ((unsigned int) 0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WATCHDOG ((unsigned int) 0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. -#define AT91C_RSTC_RSTTYP_SOFTWARE ((unsigned int) 0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. -#define AT91C_RSTC_RSTTYP_USER ((unsigned int) 0x4 << 8) // (RSTC) User Reset. NRST pin detected low. -#define AT91C_RSTC_NRSTL ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level -#define AT91C_RSTC_SRCMP ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress. -// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- -#define AT91C_RSTC_URSTEN ((unsigned int) 0x1 << 0) // (RSTC) User Reset Enable -#define AT91C_RSTC_URSTIEN ((unsigned int) 0x1 << 4) // (RSTC) User Reset Interrupt Enable -#define AT91C_RSTC_ERSTL ((unsigned int) 0xF << 8) // (RSTC) User Reset Length - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Shut Down Controller Interface -// ***************************************************************************** -typedef struct _AT91S_SHDWC { - AT91_REG SHDWC_SHCR; // Shut Down Control Register - AT91_REG SHDWC_SHMR; // Shut Down Mode Register - AT91_REG SHDWC_SHSR; // Shut Down Status Register -} AT91S_SHDWC, *AT91PS_SHDWC; - -// -------- SHDWC_SHCR : (SHDWC Offset: 0x0) Shut Down Control Register -------- -#define AT91C_SHDWC_SHDW ((unsigned int) 0x1 << 0) // (SHDWC) Processor Reset -#define AT91C_SHDWC_KEY ((unsigned int) 0xFF << 24) // (SHDWC) Shut down KEY Password -// -------- SHDWC_SHMR : (SHDWC Offset: 0x4) Shut Down Mode Register -------- -#define AT91C_SHDWC_WKMODE0 ((unsigned int) 0x3 << 0) // (SHDWC) Wake Up 0 Mode Selection -#define AT91C_SHDWC_WKMODE0_NONE ((unsigned int) 0x0) // (SHDWC) None. No detection is performed on the wake up input. -#define AT91C_SHDWC_WKMODE0_HIGH ((unsigned int) 0x1) // (SHDWC) High Level. -#define AT91C_SHDWC_WKMODE0_LOW ((unsigned int) 0x2) // (SHDWC) Low Level. -#define AT91C_SHDWC_WKMODE0_ANYLEVEL ((unsigned int) 0x3) // (SHDWC) Any level change. -#define AT91C_SHDWC_CPTWK0 ((unsigned int) 0xF << 4) // (SHDWC) Counter On Wake Up 0 -#define AT91C_SHDWC_WKMODE1 ((unsigned int) 0x3 << 8) // (SHDWC) Wake Up 1 Mode Selection -#define AT91C_SHDWC_WKMODE1_NONE ((unsigned int) 0x0 << 8) // (SHDWC) None. No detection is performed on the wake up input. -#define AT91C_SHDWC_WKMODE1_HIGH ((unsigned int) 0x1 << 8) // (SHDWC) High Level. -#define AT91C_SHDWC_WKMODE1_LOW ((unsigned int) 0x2 << 8) // (SHDWC) Low Level. -#define AT91C_SHDWC_WKMODE1_ANYLEVEL ((unsigned int) 0x3 << 8) // (SHDWC) Any level change. -#define AT91C_SHDWC_CPTWK1 ((unsigned int) 0xF << 12) // (SHDWC) Counter On Wake Up 1 -#define AT91C_SHDWC_RTTWKEN ((unsigned int) 0x1 << 16) // (SHDWC) Real Time Timer Wake Up Enable -// -------- SHDWC_SHSR : (SHDWC Offset: 0x8) Shut Down Status Register -------- -#define AT91C_SHDWC_WAKEUP0 ((unsigned int) 0x1 << 0) // (SHDWC) Wake Up 0 Status -#define AT91C_SHDWC_WAKEUP1 ((unsigned int) 0x1 << 1) // (SHDWC) Wake Up 1 Status -#define AT91C_SHDWC_FWKUP ((unsigned int) 0x1 << 2) // (SHDWC) Force Wake Up Status -#define AT91C_SHDWC_RTTWK ((unsigned int) 0x1 << 16) // (SHDWC) Real Time Timer wake Up - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface -// ***************************************************************************** -typedef struct _AT91S_RTTC { - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register -} AT91S_RTTC, *AT91PS_RTTC; - -// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- -#define AT91C_RTTC_RTPRES ((unsigned int) 0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value -#define AT91C_RTTC_ALMIEN ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable -#define AT91C_RTTC_RTTINCIEN ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable -#define AT91C_RTTC_RTTRST ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart -// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- -#define AT91C_RTTC_ALMV ((unsigned int) 0x0 << 0) // (RTTC) Alarm Value -// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- -#define AT91C_RTTC_CRTV ((unsigned int) 0x0 << 0) // (RTTC) Current Real-time Value -// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- -#define AT91C_RTTC_ALMS ((unsigned int) 0x1 << 0) // (RTTC) Real-time Alarm Status -#define AT91C_RTTC_RTTINC ((unsigned int) 0x1 << 1) // (RTTC) Real-time Timer Increment - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface -// ***************************************************************************** -typedef struct _AT91S_PITC { - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register -} AT91S_PITC, *AT91PS_PITC; - -// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- -#define AT91C_PITC_PIV ((unsigned int) 0xFFFFF << 0) // (PITC) Periodic Interval Value -#define AT91C_PITC_PITEN ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled -#define AT91C_PITC_PITIEN ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable -// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- -#define AT91C_PITC_PITS ((unsigned int) 0x1 << 0) // (PITC) Periodic Interval Timer Status -// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- -#define AT91C_PITC_CPIV ((unsigned int) 0xFFFFF << 0) // (PITC) Current Periodic Interval Value -#define AT91C_PITC_PICNT ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter -// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface -// ***************************************************************************** -typedef struct _AT91S_WDTC { - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register -} AT91S_WDTC, *AT91PS_WDTC; - -// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- -#define AT91C_WDTC_WDRSTT ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Restart -#define AT91C_WDTC_KEY ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password -// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- -#define AT91C_WDTC_WDV ((unsigned int) 0xFFF << 0) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDFIEN ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable -#define AT91C_WDTC_WDRSTEN ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable -#define AT91C_WDTC_WDRPROC ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDDIS ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable -#define AT91C_WDTC_WDD ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value -#define AT91C_WDTC_WDDBGHLT ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt -#define AT91C_WDTC_WDIDLEHLT ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt -// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- -#define AT91C_WDTC_WDUNF ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Underflow -#define AT91C_WDTC_WDERR ((unsigned int) 0x1 << 1) // (WDTC) Watchdog Error - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Memory Controller Interface -// ***************************************************************************** -typedef struct _AT91S_MC { - AT91_REG MC_RCR; // MC Remap Control Register - AT91_REG MC_ASR; // MC Abort Status Register - AT91_REG MC_AASR; // MC Abort Address Status Register - AT91_REG Reserved0[1]; // - AT91_REG MC_PUIA[16]; // MC Protection Unit Area - AT91_REG MC_PUP; // MC Protection Unit Peripherals - AT91_REG MC_PUER; // MC Protection Unit Enable Register - AT91_REG Reserved1[2]; // - AT91_REG MC_FMR; // MC Flash Mode Register - AT91_REG MC_FCR; // MC Flash Command Register - AT91_REG MC_FSR; // MC Flash Status Register -} AT91S_MC, *AT91PS_MC; - -// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- -#define AT91C_MC_RCB ((unsigned int) 0x1 << 0) // (MC) Remap Command Bit -// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- -#define AT91C_MC_UNDADD ((unsigned int) 0x1 << 0) // (MC) Undefined Addess Abort Status -#define AT91C_MC_MISADD ((unsigned int) 0x1 << 1) // (MC) Misaligned Addess Abort Status -#define AT91C_MC_MPU ((unsigned int) 0x1 << 2) // (MC) Memory protection Unit Abort Status -#define AT91C_MC_ABTSZ ((unsigned int) 0x3 << 8) // (MC) Abort Size Status -#define AT91C_MC_ABTSZ_BYTE ((unsigned int) 0x0 << 8) // (MC) Byte -#define AT91C_MC_ABTSZ_HWORD ((unsigned int) 0x1 << 8) // (MC) Half-word -#define AT91C_MC_ABTSZ_WORD ((unsigned int) 0x2 << 8) // (MC) Word -#define AT91C_MC_ABTTYP ((unsigned int) 0x3 << 10) // (MC) Abort Type Status -#define AT91C_MC_ABTTYP_DATAR ((unsigned int) 0x0 << 10) // (MC) Data Read -#define AT91C_MC_ABTTYP_DATAW ((unsigned int) 0x1 << 10) // (MC) Data Write -#define AT91C_MC_ABTTYP_FETCH ((unsigned int) 0x2 << 10) // (MC) Code Fetch -#define AT91C_MC_MST0 ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source -#define AT91C_MC_MST1 ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source -#define AT91C_MC_SVMST0 ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source -#define AT91C_MC_SVMST1 ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source -// -------- MC_PUIA : (MC Offset: 0x10) MC Protection Unit Area -------- -#define AT91C_MC_PROT ((unsigned int) 0x3 << 0) // (MC) Protection -#define AT91C_MC_PROT_PNAUNA ((unsigned int) 0x0) // (MC) Privilege: No Access, User: No Access -#define AT91C_MC_PROT_PRWUNA ((unsigned int) 0x1) // (MC) Privilege: Read/Write, User: No Access -#define AT91C_MC_PROT_PRWURO ((unsigned int) 0x2) // (MC) Privilege: Read/Write, User: Read Only -#define AT91C_MC_PROT_PRWURW ((unsigned int) 0x3) // (MC) Privilege: Read/Write, User: Read/Write -#define AT91C_MC_SIZE ((unsigned int) 0xF << 4) // (MC) Internal Area Size -#define AT91C_MC_SIZE_1KB ((unsigned int) 0x0 << 4) // (MC) Area size 1KByte -#define AT91C_MC_SIZE_2KB ((unsigned int) 0x1 << 4) // (MC) Area size 2KByte -#define AT91C_MC_SIZE_4KB ((unsigned int) 0x2 << 4) // (MC) Area size 4KByte -#define AT91C_MC_SIZE_8KB ((unsigned int) 0x3 << 4) // (MC) Area size 8KByte -#define AT91C_MC_SIZE_16KB ((unsigned int) 0x4 << 4) // (MC) Area size 16KByte -#define AT91C_MC_SIZE_32KB ((unsigned int) 0x5 << 4) // (MC) Area size 32KByte -#define AT91C_MC_SIZE_64KB ((unsigned int) 0x6 << 4) // (MC) Area size 64KByte -#define AT91C_MC_SIZE_128KB ((unsigned int) 0x7 << 4) // (MC) Area size 128KByte -#define AT91C_MC_SIZE_256KB ((unsigned int) 0x8 << 4) // (MC) Area size 256KByte -#define AT91C_MC_SIZE_512KB ((unsigned int) 0x9 << 4) // (MC) Area size 512KByte -#define AT91C_MC_SIZE_1MB ((unsigned int) 0xA << 4) // (MC) Area size 1MByte -#define AT91C_MC_SIZE_2MB ((unsigned int) 0xB << 4) // (MC) Area size 2MByte -#define AT91C_MC_SIZE_4MB ((unsigned int) 0xC << 4) // (MC) Area size 4MByte -#define AT91C_MC_SIZE_8MB ((unsigned int) 0xD << 4) // (MC) Area size 8MByte -#define AT91C_MC_SIZE_16MB ((unsigned int) 0xE << 4) // (MC) Area size 16MByte -#define AT91C_MC_SIZE_64MB ((unsigned int) 0xF << 4) // (MC) Area size 64MByte -#define AT91C_MC_BA ((unsigned int) 0x3FFFF << 10) // (MC) Internal Area Base Address -// -------- MC_PUP : (MC Offset: 0x50) MC Protection Unit Peripheral -------- -// -------- MC_PUER : (MC Offset: 0x54) MC Protection Unit Area -------- -#define AT91C_MC_PUEB ((unsigned int) 0x1 << 0) // (MC) Protection Unit enable Bit -// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- -#define AT91C_MC_EOP ((unsigned int) 0x1 << 0) // (MC) End Of Programming Flag -#define AT91C_MC_EOL ((unsigned int) 0x1 << 1) // (MC) End Of Lock/Unlock Flag -#define AT91C_MC_LOCKE ((unsigned int) 0x1 << 2) // (MC) Lock Error Flag -#define AT91C_MC_PROGE ((unsigned int) 0x1 << 3) // (MC) Programming Error Flag -#define AT91C_MC_NEBP ((unsigned int) 0x1 << 7) // (MC) No Erase Before Programming -#define AT91C_MC_FWS ((unsigned int) 0x3 << 8) // (MC) Flash Wait State -#define AT91C_MC_FWS_0FWS ((unsigned int) 0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations -#define AT91C_MC_FWS_1FWS ((unsigned int) 0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations -#define AT91C_MC_FWS_2FWS ((unsigned int) 0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations -#define AT91C_MC_FWS_3FWS ((unsigned int) 0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations -#define AT91C_MC_FMCN ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number -// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- -#define AT91C_MC_FCMD ((unsigned int) 0xF << 0) // (MC) Flash Command -#define AT91C_MC_FCMD_START_PROG ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN. -#define AT91C_MC_FCMD_LOCK ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_PROG_AND_LOCK ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. -#define AT91C_MC_FCMD_UNLOCK ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_ERASE_ALL ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. -#define AT91C_MC_PAGEN ((unsigned int) 0x3FF << 8) // (MC) Page Number -#define AT91C_MC_KEY ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key -// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- -#define AT91C_MC_LOCKS0 ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status -#define AT91C_MC_LOCKS1 ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status -#define AT91C_MC_LOCKS2 ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status -#define AT91C_MC_LOCKS3 ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status -#define AT91C_MC_LOCKS4 ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status -#define AT91C_MC_LOCKS5 ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status -#define AT91C_MC_LOCKS6 ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status -#define AT91C_MC_LOCKS7 ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status -#define AT91C_MC_LOCKS8 ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status -#define AT91C_MC_LOCKS9 ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status -#define AT91C_MC_LOCKS10 ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status -#define AT91C_MC_LOCKS11 ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status -#define AT91C_MC_LOCKS12 ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status -#define AT91C_MC_LOCKS13 ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status -#define AT91C_MC_LOCKS14 ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status -#define AT91C_MC_LOCKS15 ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface -// ***************************************************************************** -typedef struct _AT91S_CAN_MB { - AT91_REG CAN_MB_MMR; // MailBox Mode Register - AT91_REG CAN_MB_MAM; // MailBox Acceptance Mask Register - AT91_REG CAN_MB_MID; // MailBox ID Register - AT91_REG CAN_MB_MFID; // MailBox Family ID Register - AT91_REG CAN_MB_MSR; // MailBox Status Register - AT91_REG CAN_MB_MDL; // MailBox Data Low Register - AT91_REG CAN_MB_MDH; // MailBox Data High Register - AT91_REG CAN_MB_MCR; // MailBox Control Register -} AT91S_CAN_MB, *AT91PS_CAN_MB; - -// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- -#define AT91C_CAN_MTIMEMARK ((unsigned int) 0xFFFF << 0) // (CAN_MB) Mailbox Timemark -#define AT91C_CAN_PRIOR ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority -#define AT91C_CAN_MOT ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type -#define AT91C_CAN_MOT_DIS ((unsigned int) 0x0 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_RX ((unsigned int) 0x1 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_RXOVERWRITE ((unsigned int) 0x2 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_TX ((unsigned int) 0x3 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_CONSUMER ((unsigned int) 0x4 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_PRODUCER ((unsigned int) 0x5 << 24) // (CAN_MB) -// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- -#define AT91C_CAN_MIDvB ((unsigned int) 0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode -#define AT91C_CAN_MIDvA ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode -#define AT91C_CAN_MIDE ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version -// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- -// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- -// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- -#define AT91C_CAN_MTIMESTAMP ((unsigned int) 0xFFFF << 0) // (CAN_MB) Timer Value -#define AT91C_CAN_MDLC ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code -#define AT91C_CAN_MRTR ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request -#define AT91C_CAN_MABT ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort -#define AT91C_CAN_MRDY ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready -#define AT91C_CAN_MMI ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored -// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- -// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- -// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- -#define AT91C_CAN_MACR ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox -#define AT91C_CAN_MTCR ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Control Area Network Interface -// ***************************************************************************** -typedef struct _AT91S_CAN { - AT91_REG CAN_MR; // Mode Register - AT91_REG CAN_IER; // Interrupt Enable Register - AT91_REG CAN_IDR; // Interrupt Disable Register - AT91_REG CAN_IMR; // Interrupt Mask Register - AT91_REG CAN_SR; // Status Register - AT91_REG CAN_BR; // Baudrate Register - AT91_REG CAN_TIM; // Timer Register - AT91_REG CAN_TIMESTP; // Time Stamp Register - AT91_REG CAN_ECR; // Error Counter Register - AT91_REG CAN_TCR; // Transfer Command Register - AT91_REG CAN_ACR; // Abort Command Register - AT91_REG Reserved0[52]; // - AT91_REG CAN_VR; // Version Register - AT91_REG Reserved1[64]; // - AT91S_CAN_MB CAN_MB0; // CAN Mailbox 0 - AT91S_CAN_MB CAN_MB1; // CAN Mailbox 1 - AT91S_CAN_MB CAN_MB2; // CAN Mailbox 2 - AT91S_CAN_MB CAN_MB3; // CAN Mailbox 3 - AT91S_CAN_MB CAN_MB4; // CAN Mailbox 4 - AT91S_CAN_MB CAN_MB5; // CAN Mailbox 5 - AT91S_CAN_MB CAN_MB6; // CAN Mailbox 6 - AT91S_CAN_MB CAN_MB7; // CAN Mailbox 7 - AT91S_CAN_MB CAN_MB8; // CAN Mailbox 8 - AT91S_CAN_MB CAN_MB9; // CAN Mailbox 9 - AT91S_CAN_MB CAN_MB10; // CAN Mailbox 10 - AT91S_CAN_MB CAN_MB11; // CAN Mailbox 11 - AT91S_CAN_MB CAN_MB12; // CAN Mailbox 12 - AT91S_CAN_MB CAN_MB13; // CAN Mailbox 13 - AT91S_CAN_MB CAN_MB14; // CAN Mailbox 14 - AT91S_CAN_MB CAN_MB15; // CAN Mailbox 15 -} AT91S_CAN, *AT91PS_CAN; - -// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- -#define AT91C_CAN_CANEN ((unsigned int) 0x1 << 0) // (CAN) CAN Controller Enable -#define AT91C_CAN_LPM ((unsigned int) 0x1 << 1) // (CAN) Disable/Enable Low Power Mode -#define AT91C_CAN_ABM ((unsigned int) 0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode -#define AT91C_CAN_OVL ((unsigned int) 0x1 << 3) // (CAN) Disable/Enable Overload Frame -#define AT91C_CAN_TEOF ((unsigned int) 0x1 << 4) // (CAN) Time Stamp messages at each end of Frame -#define AT91C_CAN_TTM ((unsigned int) 0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode -#define AT91C_CAN_TIMFRZ ((unsigned int) 0x1 << 6) // (CAN) Enable Timer Freeze -#define AT91C_CAN_DRPT ((unsigned int) 0x1 << 7) // (CAN) Disable Repeat -// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- -#define AT91C_CAN_MB0 ((unsigned int) 0x1 << 0) // (CAN) Mailbox 0 Flag -#define AT91C_CAN_MB1 ((unsigned int) 0x1 << 1) // (CAN) Mailbox 1 Flag -#define AT91C_CAN_MB2 ((unsigned int) 0x1 << 2) // (CAN) Mailbox 2 Flag -#define AT91C_CAN_MB3 ((unsigned int) 0x1 << 3) // (CAN) Mailbox 3 Flag -#define AT91C_CAN_MB4 ((unsigned int) 0x1 << 4) // (CAN) Mailbox 4 Flag -#define AT91C_CAN_MB5 ((unsigned int) 0x1 << 5) // (CAN) Mailbox 5 Flag -#define AT91C_CAN_MB6 ((unsigned int) 0x1 << 6) // (CAN) Mailbox 6 Flag -#define AT91C_CAN_MB7 ((unsigned int) 0x1 << 7) // (CAN) Mailbox 7 Flag -#define AT91C_CAN_MB8 ((unsigned int) 0x1 << 8) // (CAN) Mailbox 8 Flag -#define AT91C_CAN_MB9 ((unsigned int) 0x1 << 9) // (CAN) Mailbox 9 Flag -#define AT91C_CAN_MB10 ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag -#define AT91C_CAN_MB11 ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag -#define AT91C_CAN_MB12 ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag -#define AT91C_CAN_MB13 ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag -#define AT91C_CAN_MB14 ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag -#define AT91C_CAN_MB15 ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag -#define AT91C_CAN_ERRA ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag -#define AT91C_CAN_WARN ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag -#define AT91C_CAN_ERRP ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag -#define AT91C_CAN_BOFF ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag -#define AT91C_CAN_SLEEP ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag -#define AT91C_CAN_WAKEUP ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag -#define AT91C_CAN_TOVF ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag -#define AT91C_CAN_TSTP ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag -#define AT91C_CAN_CERR ((unsigned int) 0x1 << 24) // (CAN) CRC Error -#define AT91C_CAN_SERR ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error -#define AT91C_CAN_AERR ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error -#define AT91C_CAN_FERR ((unsigned int) 0x1 << 27) // (CAN) Form Error -#define AT91C_CAN_BERR ((unsigned int) 0x1 << 28) // (CAN) Bit Error -// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- -// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- -// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- -#define AT91C_CAN_RBSY ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy -#define AT91C_CAN_TBSY ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy -#define AT91C_CAN_OVLY ((unsigned int) 0x1 << 31) // (CAN) Overload Busy -// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- -#define AT91C_CAN_PHASE2 ((unsigned int) 0x7 << 0) // (CAN) Phase 2 segment -#define AT91C_CAN_PHASE1 ((unsigned int) 0x7 << 4) // (CAN) Phase 1 segment -#define AT91C_CAN_PROPAG ((unsigned int) 0x7 << 8) // (CAN) Programmation time segment -#define AT91C_CAN_SYNC ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment -#define AT91C_CAN_BRP ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler -#define AT91C_CAN_SMP ((unsigned int) 0x1 << 24) // (CAN) Sampling mode -// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- -#define AT91C_CAN_TIMER ((unsigned int) 0xFFFF << 0) // (CAN) Timer field -// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- -// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- -#define AT91C_CAN_REC ((unsigned int) 0xFF << 0) // (CAN) Receive Error Counter -#define AT91C_CAN_TEC ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter -// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- -#define AT91C_CAN_TIMRST ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field -// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface -// ***************************************************************************** -typedef struct _AT91S_TC { - AT91_REG TC_CCR; // Channel Control Register - AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) - AT91_REG Reserved0[2]; // - AT91_REG TC_CV; // Counter Value - AT91_REG TC_RA; // Register A - AT91_REG TC_RB; // Register B - AT91_REG TC_RC; // Register C - AT91_REG TC_SR; // Status Register - AT91_REG TC_IER; // Interrupt Enable Register - AT91_REG TC_IDR; // Interrupt Disable Register - AT91_REG TC_IMR; // Interrupt Mask Register -} AT91S_TC, *AT91PS_TC; - -// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- -#define AT91C_TC_CLKEN ((unsigned int) 0x1 << 0) // (TC) Counter Clock Enable Command -#define AT91C_TC_CLKDIS ((unsigned int) 0x1 << 1) // (TC) Counter Clock Disable Command -#define AT91C_TC_SWTRG ((unsigned int) 0x1 << 2) // (TC) Software Trigger Command -// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- -#define AT91C_TC_CLKS ((unsigned int) 0x7 << 0) // (TC) Clock Selection -#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK -#define AT91C_TC_CLKS_XC0 ((unsigned int) 0x5) // (TC) Clock selected: XC0 -#define AT91C_TC_CLKS_XC1 ((unsigned int) 0x6) // (TC) Clock selected: XC1 -#define AT91C_TC_CLKS_XC2 ((unsigned int) 0x7) // (TC) Clock selected: XC2 -#define AT91C_TC_CLKI ((unsigned int) 0x1 << 3) // (TC) Clock Invert -#define AT91C_TC_BURST ((unsigned int) 0x3 << 4) // (TC) Burst Signal Selection -#define AT91C_TC_BURST_NONE ((unsigned int) 0x0 << 4) // (TC) The clock is not gated by an external signal -#define AT91C_TC_BURST_XC0 ((unsigned int) 0x1 << 4) // (TC) XC0 is ANDed with the selected clock -#define AT91C_TC_BURST_XC1 ((unsigned int) 0x2 << 4) // (TC) XC1 is ANDed with the selected clock -#define AT91C_TC_BURST_XC2 ((unsigned int) 0x3 << 4) // (TC) XC2 is ANDed with the selected clock -#define AT91C_TC_CPCSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RC Compare -#define AT91C_TC_LDBSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RB Loading -#define AT91C_TC_LDBDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disabled with RB Loading -#define AT91C_TC_CPCDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disable with RC Compare -#define AT91C_TC_ETRGEDG ((unsigned int) 0x3 << 8) // (TC) External Trigger Edge Selection -#define AT91C_TC_ETRGEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None -#define AT91C_TC_ETRGEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_ETRGEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_ETRGEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVTEDG ((unsigned int) 0x3 << 8) // (TC) External Event Edge Selection -#define AT91C_TC_EEVTEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None -#define AT91C_TC_EEVTEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_EEVTEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_EEVTEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_ABETRG ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection -#define AT91C_TC_EEVT ((unsigned int) 0x3 << 10) // (TC) External Event Selection -#define AT91C_TC_EEVT_TIOB ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input -#define AT91C_TC_EEVT_XC0 ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output -#define AT91C_TC_EEVT_XC1 ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output -#define AT91C_TC_EEVT_XC2 ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output -#define AT91C_TC_ENETRG ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable -#define AT91C_TC_WAVESEL ((unsigned int) 0x3 << 13) // (TC) Waveform Selection -#define AT91C_TC_WAVESEL_UP ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UP_AUTO ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN_AUTO ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare -#define AT91C_TC_CPCTRG ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable -#define AT91C_TC_WAVE ((unsigned int) 0x1 << 15) // (TC) -#define AT91C_TC_LDRA ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection -#define AT91C_TC_LDRA_NONE ((unsigned int) 0x0 << 16) // (TC) Edge: None -#define AT91C_TC_LDRA_RISING ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRA_FALLING ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRA_BOTH ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA -#define AT91C_TC_ACPA ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA -#define AT91C_TC_ACPA_NONE ((unsigned int) 0x0 << 16) // (TC) Effect: none -#define AT91C_TC_ACPA_SET ((unsigned int) 0x1 << 16) // (TC) Effect: set -#define AT91C_TC_ACPA_CLEAR ((unsigned int) 0x2 << 16) // (TC) Effect: clear -#define AT91C_TC_ACPA_TOGGLE ((unsigned int) 0x3 << 16) // (TC) Effect: toggle -#define AT91C_TC_LDRB ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection -#define AT91C_TC_LDRB_NONE ((unsigned int) 0x0 << 18) // (TC) Edge: None -#define AT91C_TC_LDRB_RISING ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRB_FALLING ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRB_BOTH ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA -#define AT91C_TC_ACPC ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA -#define AT91C_TC_ACPC_NONE ((unsigned int) 0x0 << 18) // (TC) Effect: none -#define AT91C_TC_ACPC_SET ((unsigned int) 0x1 << 18) // (TC) Effect: set -#define AT91C_TC_ACPC_CLEAR ((unsigned int) 0x2 << 18) // (TC) Effect: clear -#define AT91C_TC_ACPC_TOGGLE ((unsigned int) 0x3 << 18) // (TC) Effect: toggle -#define AT91C_TC_AEEVT ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA -#define AT91C_TC_AEEVT_NONE ((unsigned int) 0x0 << 20) // (TC) Effect: none -#define AT91C_TC_AEEVT_SET ((unsigned int) 0x1 << 20) // (TC) Effect: set -#define AT91C_TC_AEEVT_CLEAR ((unsigned int) 0x2 << 20) // (TC) Effect: clear -#define AT91C_TC_AEEVT_TOGGLE ((unsigned int) 0x3 << 20) // (TC) Effect: toggle -#define AT91C_TC_ASWTRG ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA -#define AT91C_TC_ASWTRG_NONE ((unsigned int) 0x0 << 22) // (TC) Effect: none -#define AT91C_TC_ASWTRG_SET ((unsigned int) 0x1 << 22) // (TC) Effect: set -#define AT91C_TC_ASWTRG_CLEAR ((unsigned int) 0x2 << 22) // (TC) Effect: clear -#define AT91C_TC_ASWTRG_TOGGLE ((unsigned int) 0x3 << 22) // (TC) Effect: toggle -#define AT91C_TC_BCPB ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB -#define AT91C_TC_BCPB_NONE ((unsigned int) 0x0 << 24) // (TC) Effect: none -#define AT91C_TC_BCPB_SET ((unsigned int) 0x1 << 24) // (TC) Effect: set -#define AT91C_TC_BCPB_CLEAR ((unsigned int) 0x2 << 24) // (TC) Effect: clear -#define AT91C_TC_BCPB_TOGGLE ((unsigned int) 0x3 << 24) // (TC) Effect: toggle -#define AT91C_TC_BCPC ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB -#define AT91C_TC_BCPC_NONE ((unsigned int) 0x0 << 26) // (TC) Effect: none -#define AT91C_TC_BCPC_SET ((unsigned int) 0x1 << 26) // (TC) Effect: set -#define AT91C_TC_BCPC_CLEAR ((unsigned int) 0x2 << 26) // (TC) Effect: clear -#define AT91C_TC_BCPC_TOGGLE ((unsigned int) 0x3 << 26) // (TC) Effect: toggle -#define AT91C_TC_BEEVT ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB -#define AT91C_TC_BEEVT_NONE ((unsigned int) 0x0 << 28) // (TC) Effect: none -#define AT91C_TC_BEEVT_SET ((unsigned int) 0x1 << 28) // (TC) Effect: set -#define AT91C_TC_BEEVT_CLEAR ((unsigned int) 0x2 << 28) // (TC) Effect: clear -#define AT91C_TC_BEEVT_TOGGLE ((unsigned int) 0x3 << 28) // (TC) Effect: toggle -#define AT91C_TC_BSWTRG ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB -#define AT91C_TC_BSWTRG_NONE ((unsigned int) 0x0 << 30) // (TC) Effect: none -#define AT91C_TC_BSWTRG_SET ((unsigned int) 0x1 << 30) // (TC) Effect: set -#define AT91C_TC_BSWTRG_CLEAR ((unsigned int) 0x2 << 30) // (TC) Effect: clear -#define AT91C_TC_BSWTRG_TOGGLE ((unsigned int) 0x3 << 30) // (TC) Effect: toggle -// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- -#define AT91C_TC_COVFS ((unsigned int) 0x1 << 0) // (TC) Counter Overflow -#define AT91C_TC_LOVRS ((unsigned int) 0x1 << 1) // (TC) Load Overrun -#define AT91C_TC_CPAS ((unsigned int) 0x1 << 2) // (TC) RA Compare -#define AT91C_TC_CPBS ((unsigned int) 0x1 << 3) // (TC) RB Compare -#define AT91C_TC_CPCS ((unsigned int) 0x1 << 4) // (TC) RC Compare -#define AT91C_TC_LDRAS ((unsigned int) 0x1 << 5) // (TC) RA Loading -#define AT91C_TC_LDRBS ((unsigned int) 0x1 << 6) // (TC) RB Loading -#define AT91C_TC_ETRGS ((unsigned int) 0x1 << 7) // (TC) External Trigger -#define AT91C_TC_CLKSTA ((unsigned int) 0x1 << 16) // (TC) Clock Enabling -#define AT91C_TC_MTIOA ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror -#define AT91C_TC_MTIOB ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror -// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- -// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- -// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Interface -// ***************************************************************************** -typedef struct _AT91S_TCB { - AT91S_TC TCB_TC0; // TC Channel 0 - AT91_REG Reserved0[4]; // - AT91S_TC TCB_TC1; // TC Channel 1 - AT91_REG Reserved1[4]; // - AT91S_TC TCB_TC2; // TC Channel 2 - AT91_REG Reserved2[4]; // - AT91_REG TCB_BCR; // TC Block Control Register - AT91_REG TCB_BMR; // TC Block Mode Register -} AT91S_TCB, *AT91PS_TCB; - -// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- -#define AT91C_TCB_SYNC ((unsigned int) 0x1 << 0) // (TCB) Synchro Command -// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- -#define AT91C_TCB_TC0XC0S ((unsigned int) 0x3 << 0) // (TCB) External Clock Signal 0 Selection -#define AT91C_TCB_TC0XC0S_TCLK0 ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0 -#define AT91C_TCB_TC0XC0S_NONE ((unsigned int) 0x1) // (TCB) None signal connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA1 ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA2 ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0 -#define AT91C_TCB_TC1XC1S ((unsigned int) 0x3 << 2) // (TCB) External Clock Signal 1 Selection -#define AT91C_TCB_TC1XC1S_TCLK1 ((unsigned int) 0x0 << 2) // (TCB) TCLK1 connected to XC1 -#define AT91C_TCB_TC1XC1S_NONE ((unsigned int) 0x1 << 2) // (TCB) None signal connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA0 ((unsigned int) 0x2 << 2) // (TCB) TIOA0 connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA2 ((unsigned int) 0x3 << 2) // (TCB) TIOA2 connected to XC1 -#define AT91C_TCB_TC2XC2S ((unsigned int) 0x3 << 4) // (TCB) External Clock Signal 2 Selection -#define AT91C_TCB_TC2XC2S_TCLK2 ((unsigned int) 0x0 << 4) // (TCB) TCLK2 connected to XC2 -#define AT91C_TCB_TC2XC2S_NONE ((unsigned int) 0x1 << 4) // (TCB) None signal connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA0 ((unsigned int) 0x2 << 4) // (TCB) TIOA0 connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA1 ((unsigned int) 0x3 << 4) // (TCB) TIOA2 connected to XC2 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Multimedia Card Interface -// ***************************************************************************** -typedef struct _AT91S_MCI { - AT91_REG MCI_CR; // MCI Control Register - AT91_REG MCI_MR; // MCI Mode Register - AT91_REG MCI_DTOR; // MCI Data Timeout Register - AT91_REG MCI_SDCR; // MCI SD Card Register - AT91_REG MCI_ARGR; // MCI Argument Register - AT91_REG MCI_CMDR; // MCI Command Register - AT91_REG Reserved0[2]; // - AT91_REG MCI_RSPR[4]; // MCI Response Register - AT91_REG MCI_RDR; // MCI Receive Data Register - AT91_REG MCI_TDR; // MCI Transmit Data Register - AT91_REG Reserved1[2]; // - AT91_REG MCI_SR; // MCI Status Register - AT91_REG MCI_IER; // MCI Interrupt Enable Register - AT91_REG MCI_IDR; // MCI Interrupt Disable Register - AT91_REG MCI_IMR; // MCI Interrupt Mask Register - AT91_REG Reserved2[44]; // - AT91_REG MCI_RPR; // Receive Pointer Register - AT91_REG MCI_RCR; // Receive Counter Register - AT91_REG MCI_TPR; // Transmit Pointer Register - AT91_REG MCI_TCR; // Transmit Counter Register - AT91_REG MCI_RNPR; // Receive Next Pointer Register - AT91_REG MCI_RNCR; // Receive Next Counter Register - AT91_REG MCI_TNPR; // Transmit Next Pointer Register - AT91_REG MCI_TNCR; // Transmit Next Counter Register - AT91_REG MCI_PTCR; // PDC Transfer Control Register - AT91_REG MCI_PTSR; // PDC Transfer Status Register -} AT91S_MCI, *AT91PS_MCI; - -// -------- MCI_CR : (MCI Offset: 0x0) MCI Control Register -------- -#define AT91C_MCI_MCIEN ((unsigned int) 0x1 << 0) // (MCI) Multimedia Interface Enable -#define AT91C_MCI_MCIDIS ((unsigned int) 0x1 << 1) // (MCI) Multimedia Interface Disable -#define AT91C_MCI_PWSEN ((unsigned int) 0x1 << 2) // (MCI) Power Save Mode Enable -#define AT91C_MCI_PWSDIS ((unsigned int) 0x1 << 3) // (MCI) Power Save Mode Disable -#define AT91C_MCI_SWRST ((unsigned int) 0x1 << 7) // (MCI) MCI Software reset -// -------- MCI_MR : (MCI Offset: 0x4) MCI Mode Register -------- -#define AT91C_MCI_CLKDIV ((unsigned int) 0xFF << 0) // (MCI) Clock Divider -#define AT91C_MCI_PWSDIV ((unsigned int) 0x7 << 8) // (MCI) Power Saving Divider -#define AT91C_MCI_PDCPADV ((unsigned int) 0x1 << 14) // (MCI) PDC Padding Value -#define AT91C_MCI_PDCMODE ((unsigned int) 0x1 << 15) // (MCI) PDC Oriented Mode -#define AT91C_MCI_BLKLEN ((unsigned int) 0xFFF << 18) // (MCI) Data Block Length -// -------- MCI_DTOR : (MCI Offset: 0x8) MCI Data Timeout Register -------- -#define AT91C_MCI_DTOCYC ((unsigned int) 0xF << 0) // (MCI) Data Timeout Cycle Number -#define AT91C_MCI_DTOMUL ((unsigned int) 0x7 << 4) // (MCI) Data Timeout Multiplier -#define AT91C_MCI_DTOMUL_1 ((unsigned int) 0x0 << 4) // (MCI) DTOCYC x 1 -#define AT91C_MCI_DTOMUL_16 ((unsigned int) 0x1 << 4) // (MCI) DTOCYC x 16 -#define AT91C_MCI_DTOMUL_128 ((unsigned int) 0x2 << 4) // (MCI) DTOCYC x 128 -#define AT91C_MCI_DTOMUL_256 ((unsigned int) 0x3 << 4) // (MCI) DTOCYC x 256 -#define AT91C_MCI_DTOMUL_1024 ((unsigned int) 0x4 << 4) // (MCI) DTOCYC x 1024 -#define AT91C_MCI_DTOMUL_4096 ((unsigned int) 0x5 << 4) // (MCI) DTOCYC x 4096 -#define AT91C_MCI_DTOMUL_65536 ((unsigned int) 0x6 << 4) // (MCI) DTOCYC x 65536 -#define AT91C_MCI_DTOMUL_1048576 ((unsigned int) 0x7 << 4) // (MCI) DTOCYC x 1048576 -// -------- MCI_SDCR : (MCI Offset: 0xc) MCI SD Card Register -------- -#define AT91C_MCI_SCDSEL ((unsigned int) 0xF << 0) // (MCI) SD Card Selector -#define AT91C_MCI_SCDBUS ((unsigned int) 0x1 << 7) // (MCI) SD Card Bus Width -// -------- MCI_CMDR : (MCI Offset: 0x14) MCI Command Register -------- -#define AT91C_MCI_CMDNB ((unsigned int) 0x3F << 0) // (MCI) Command Number -#define AT91C_MCI_RSPTYP ((unsigned int) 0x3 << 6) // (MCI) Response Type -#define AT91C_MCI_RSPTYP_NO ((unsigned int) 0x0 << 6) // (MCI) No response -#define AT91C_MCI_RSPTYP_48 ((unsigned int) 0x1 << 6) // (MCI) 48-bit response -#define AT91C_MCI_RSPTYP_136 ((unsigned int) 0x2 << 6) // (MCI) 136-bit response -#define AT91C_MCI_SPCMD ((unsigned int) 0x7 << 8) // (MCI) Special CMD -#define AT91C_MCI_SPCMD_NONE ((unsigned int) 0x0 << 8) // (MCI) Not a special CMD -#define AT91C_MCI_SPCMD_INIT ((unsigned int) 0x1 << 8) // (MCI) Initialization CMD -#define AT91C_MCI_SPCMD_SYNC ((unsigned int) 0x2 << 8) // (MCI) Synchronized CMD -#define AT91C_MCI_SPCMD_IT_CMD ((unsigned int) 0x4 << 8) // (MCI) Interrupt command -#define AT91C_MCI_SPCMD_IT_REP ((unsigned int) 0x5 << 8) // (MCI) Interrupt response -#define AT91C_MCI_OPDCMD ((unsigned int) 0x1 << 11) // (MCI) Open Drain Command -#define AT91C_MCI_MAXLAT ((unsigned int) 0x1 << 12) // (MCI) Maximum Latency for Command to respond -#define AT91C_MCI_TRCMD ((unsigned int) 0x3 << 16) // (MCI) Transfer CMD -#define AT91C_MCI_TRCMD_NO ((unsigned int) 0x0 << 16) // (MCI) No transfer -#define AT91C_MCI_TRCMD_START ((unsigned int) 0x1 << 16) // (MCI) Start transfer -#define AT91C_MCI_TRCMD_STOP ((unsigned int) 0x2 << 16) // (MCI) Stop transfer -#define AT91C_MCI_TRDIR ((unsigned int) 0x1 << 18) // (MCI) Transfer Direction -#define AT91C_MCI_TRTYP ((unsigned int) 0x3 << 19) // (MCI) Transfer Type -#define AT91C_MCI_TRTYP_BLOCK ((unsigned int) 0x0 << 19) // (MCI) Block Transfer type -#define AT91C_MCI_TRTYP_MULTIPLE ((unsigned int) 0x1 << 19) // (MCI) Multiple Block transfer type -#define AT91C_MCI_TRTYP_STREAM ((unsigned int) 0x2 << 19) // (MCI) Stream transfer type -// -------- MCI_SR : (MCI Offset: 0x40) MCI Status Register -------- -#define AT91C_MCI_CMDRDY ((unsigned int) 0x1 << 0) // (MCI) Command Ready flag -#define AT91C_MCI_RXRDY ((unsigned int) 0x1 << 1) // (MCI) RX Ready flag -#define AT91C_MCI_TXRDY ((unsigned int) 0x1 << 2) // (MCI) TX Ready flag -#define AT91C_MCI_BLKE ((unsigned int) 0x1 << 3) // (MCI) Data Block Transfer Ended flag -#define AT91C_MCI_DTIP ((unsigned int) 0x1 << 4) // (MCI) Data Transfer in Progress flag -#define AT91C_MCI_NOTBUSY ((unsigned int) 0x1 << 5) // (MCI) Data Line Not Busy flag -#define AT91C_MCI_ENDRX ((unsigned int) 0x1 << 6) // (MCI) End of RX Buffer flag -#define AT91C_MCI_ENDTX ((unsigned int) 0x1 << 7) // (MCI) End of TX Buffer flag -#define AT91C_MCI_RXBUFF ((unsigned int) 0x1 << 14) // (MCI) RX Buffer Full flag -#define AT91C_MCI_TXBUFE ((unsigned int) 0x1 << 15) // (MCI) TX Buffer Empty flag -#define AT91C_MCI_RINDE ((unsigned int) 0x1 << 16) // (MCI) Response Index Error flag -#define AT91C_MCI_RDIRE ((unsigned int) 0x1 << 17) // (MCI) Response Direction Error flag -#define AT91C_MCI_RCRCE ((unsigned int) 0x1 << 18) // (MCI) Response CRC Error flag -#define AT91C_MCI_RENDE ((unsigned int) 0x1 << 19) // (MCI) Response End Bit Error flag -#define AT91C_MCI_RTOE ((unsigned int) 0x1 << 20) // (MCI) Response Time-out Error flag -#define AT91C_MCI_DCRCE ((unsigned int) 0x1 << 21) // (MCI) data CRC Error flag -#define AT91C_MCI_DTOE ((unsigned int) 0x1 << 22) // (MCI) Data timeout Error flag -#define AT91C_MCI_OVRE ((unsigned int) 0x1 << 30) // (MCI) Overrun flag -#define AT91C_MCI_UNRE ((unsigned int) 0x1 << 31) // (MCI) Underrun flag -// -------- MCI_IER : (MCI Offset: 0x44) MCI Interrupt Enable Register -------- -// -------- MCI_IDR : (MCI Offset: 0x48) MCI Interrupt Disable Register -------- -// -------- MCI_IMR : (MCI Offset: 0x4c) MCI Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR USB Device Interface -// ***************************************************************************** -typedef struct _AT91S_UDP { - AT91_REG UDP_NUM; // Frame Number Register - AT91_REG UDP_GLBSTATE; // Global State Register - AT91_REG UDP_FADDR; // Function Address Register - AT91_REG Reserved0[1]; // - AT91_REG UDP_IER; // Interrupt Enable Register - AT91_REG UDP_IDR; // Interrupt Disable Register - AT91_REG UDP_IMR; // Interrupt Mask Register - AT91_REG UDP_ISR; // Interrupt Status Register - AT91_REG UDP_ICR; // Interrupt Clear Register - AT91_REG Reserved1[1]; // - AT91_REG UDP_RSTEP; // Reset Endpoint Register - AT91_REG Reserved2[1]; // - AT91_REG UDP_CSR[6]; // Endpoint Control and Status Register - AT91_REG Reserved3[2]; // - AT91_REG UDP_FDR[6]; // Endpoint FIFO Data Register - AT91_REG Reserved4[3]; // - AT91_REG UDP_TXVC; // Transceiver Control Register -} AT91S_UDP, *AT91PS_UDP; - -// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- -#define AT91C_UDP_FRM_NUM ((unsigned int) 0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats -#define AT91C_UDP_FRM_ERR ((unsigned int) 0x1 << 16) // (UDP) Frame Error -#define AT91C_UDP_FRM_OK ((unsigned int) 0x1 << 17) // (UDP) Frame OK -// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- -#define AT91C_UDP_FADDEN ((unsigned int) 0x1 << 0) // (UDP) Function Address Enable -#define AT91C_UDP_CONFG ((unsigned int) 0x1 << 1) // (UDP) Configured -#define AT91C_UDP_ESR ((unsigned int) 0x1 << 2) // (UDP) Enable Send Resume -#define AT91C_UDP_RSMINPR ((unsigned int) 0x1 << 3) // (UDP) A Resume Has Been Sent to the Host -#define AT91C_UDP_RMWUPE ((unsigned int) 0x1 << 4) // (UDP) Remote Wake Up Enable -// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- -#define AT91C_UDP_FADD ((unsigned int) 0xFF << 0) // (UDP) Function Address Value -#define AT91C_UDP_FEN ((unsigned int) 0x1 << 8) // (UDP) Function Enable -// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- -#define AT91C_UDP_EPINT0 ((unsigned int) 0x1 << 0) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT1 ((unsigned int) 0x1 << 1) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT2 ((unsigned int) 0x1 << 2) // (UDP) Endpoint 2 Interrupt -#define AT91C_UDP_EPINT3 ((unsigned int) 0x1 << 3) // (UDP) Endpoint 3 Interrupt -#define AT91C_UDP_EPINT4 ((unsigned int) 0x1 << 4) // (UDP) Endpoint 4 Interrupt -#define AT91C_UDP_EPINT5 ((unsigned int) 0x1 << 5) // (UDP) Endpoint 5 Interrupt -#define AT91C_UDP_RXSUSP ((unsigned int) 0x1 << 8) // (UDP) USB Suspend Interrupt -#define AT91C_UDP_RXRSM ((unsigned int) 0x1 << 9) // (UDP) USB Resume Interrupt -#define AT91C_UDP_EXTRSM ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt -#define AT91C_UDP_SOFINT ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt -#define AT91C_UDP_WAKEUP ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt -// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- -// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- -// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- -#define AT91C_UDP_ENDBUSRES ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt -// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- -// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- -#define AT91C_UDP_EP0 ((unsigned int) 0x1 << 0) // (UDP) Reset Endpoint 0 -#define AT91C_UDP_EP1 ((unsigned int) 0x1 << 1) // (UDP) Reset Endpoint 1 -#define AT91C_UDP_EP2 ((unsigned int) 0x1 << 2) // (UDP) Reset Endpoint 2 -#define AT91C_UDP_EP3 ((unsigned int) 0x1 << 3) // (UDP) Reset Endpoint 3 -#define AT91C_UDP_EP4 ((unsigned int) 0x1 << 4) // (UDP) Reset Endpoint 4 -#define AT91C_UDP_EP5 ((unsigned int) 0x1 << 5) // (UDP) Reset Endpoint 5 -// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- -#define AT91C_UDP_TXCOMP ((unsigned int) 0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR -#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 << 1) // (UDP) Receive Data Bank 0 -#define AT91C_UDP_RXSETUP ((unsigned int) 0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) -#define AT91C_UDP_ISOERROR ((unsigned int) 0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) -#define AT91C_UDP_TXPKTRDY ((unsigned int) 0x1 << 4) // (UDP) Transmit Packet Ready -#define AT91C_UDP_FORCESTALL ((unsigned int) 0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). -#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). -#define AT91C_UDP_DIR ((unsigned int) 0x1 << 7) // (UDP) Transfer Direction -#define AT91C_UDP_EPTYPE ((unsigned int) 0x7 << 8) // (UDP) Endpoint type -#define AT91C_UDP_EPTYPE_CTRL ((unsigned int) 0x0 << 8) // (UDP) Control -#define AT91C_UDP_EPTYPE_ISO_OUT ((unsigned int) 0x1 << 8) // (UDP) Isochronous OUT -#define AT91C_UDP_EPTYPE_BULK_OUT ((unsigned int) 0x2 << 8) // (UDP) Bulk OUT -#define AT91C_UDP_EPTYPE_INT_OUT ((unsigned int) 0x3 << 8) // (UDP) Interrupt OUT -#define AT91C_UDP_EPTYPE_ISO_IN ((unsigned int) 0x5 << 8) // (UDP) Isochronous IN -#define AT91C_UDP_EPTYPE_BULK_IN ((unsigned int) 0x6 << 8) // (UDP) Bulk IN -#define AT91C_UDP_EPTYPE_INT_IN ((unsigned int) 0x7 << 8) // (UDP) Interrupt IN -#define AT91C_UDP_DTGLE ((unsigned int) 0x1 << 11) // (UDP) Data Toggle -#define AT91C_UDP_EPEDS ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable -#define AT91C_UDP_RXBYTECNT ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO -// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- -#define AT91C_UDP_TXVDIS ((unsigned int) 0x1 << 8) // (UDP) -#define AT91C_UDP_PUON ((unsigned int) 0x1 << 9) // (UDP) Pull-up ON - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Two-wire Interface -// ***************************************************************************** -typedef struct _AT91S_TWI { - AT91_REG TWI_CR; // Control Register - AT91_REG TWI_MMR; // Master Mode Register - AT91_REG Reserved0[1]; // - AT91_REG TWI_IADR; // Internal Address Register - AT91_REG TWI_CWGR; // Clock Waveform Generator Register - AT91_REG Reserved1[3]; // - AT91_REG TWI_SR; // Status Register - AT91_REG TWI_IER; // Interrupt Enable Register - AT91_REG TWI_IDR; // Interrupt Disable Register - AT91_REG TWI_IMR; // Interrupt Mask Register - AT91_REG TWI_RHR; // Receive Holding Register - AT91_REG TWI_THR; // Transmit Holding Register -} AT91S_TWI, *AT91PS_TWI; - -// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- -#define AT91C_TWI_START ((unsigned int) 0x1 << 0) // (TWI) Send a START Condition -#define AT91C_TWI_STOP ((unsigned int) 0x1 << 1) // (TWI) Send a STOP Condition -#define AT91C_TWI_MSEN ((unsigned int) 0x1 << 2) // (TWI) TWI Master Transfer Enabled -#define AT91C_TWI_MSDIS ((unsigned int) 0x1 << 3) // (TWI) TWI Master Transfer Disabled -#define AT91C_TWI_SWRST ((unsigned int) 0x1 << 7) // (TWI) Software Reset -// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- -#define AT91C_TWI_IADRSZ ((unsigned int) 0x3 << 8) // (TWI) Internal Device Address Size -#define AT91C_TWI_IADRSZ_NO ((unsigned int) 0x0 << 8) // (TWI) No internal device address -#define AT91C_TWI_IADRSZ_1_BYTE ((unsigned int) 0x1 << 8) // (TWI) One-byte internal device address -#define AT91C_TWI_IADRSZ_2_BYTE ((unsigned int) 0x2 << 8) // (TWI) Two-byte internal device address -#define AT91C_TWI_IADRSZ_3_BYTE ((unsigned int) 0x3 << 8) // (TWI) Three-byte internal device address -#define AT91C_TWI_MREAD ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction -#define AT91C_TWI_DADR ((unsigned int) 0x7F << 16) // (TWI) Device Address -// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- -#define AT91C_TWI_CLDIV ((unsigned int) 0xFF << 0) // (TWI) Clock Low Divider -#define AT91C_TWI_CHDIV ((unsigned int) 0xFF << 8) // (TWI) Clock High Divider -#define AT91C_TWI_CKDIV ((unsigned int) 0x7 << 16) // (TWI) Clock Divider -// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- -#define AT91C_TWI_TXCOMP ((unsigned int) 0x1 << 0) // (TWI) Transmission Completed -#define AT91C_TWI_RXRDY ((unsigned int) 0x1 << 1) // (TWI) Receive holding register ReaDY -#define AT91C_TWI_TXRDY ((unsigned int) 0x1 << 2) // (TWI) Transmit holding register ReaDY -#define AT91C_TWI_OVRE ((unsigned int) 0x1 << 6) // (TWI) Overrun Error -#define AT91C_TWI_UNRE ((unsigned int) 0x1 << 7) // (TWI) Underrun Error -#define AT91C_TWI_NACK ((unsigned int) 0x1 << 8) // (TWI) Not Acknowledged -// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- -// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- -// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Usart -// ***************************************************************************** -typedef struct _AT91S_USART { - AT91_REG US_CR; // Control Register - AT91_REG US_MR; // Mode Register - AT91_REG US_IER; // Interrupt Enable Register - AT91_REG US_IDR; // Interrupt Disable Register - AT91_REG US_IMR; // Interrupt Mask Register - AT91_REG US_CSR; // Channel Status Register - AT91_REG US_RHR; // Receiver Holding Register - AT91_REG US_THR; // Transmitter Holding Register - AT91_REG US_BRGR; // Baud Rate Generator Register - AT91_REG US_RTOR; // Receiver Time-out Register - AT91_REG US_TTGR; // Transmitter Time-guard Register - AT91_REG Reserved0[5]; // - AT91_REG US_FIDI; // FI_DI_Ratio Register - AT91_REG US_NER; // Nb Errors Register - AT91_REG Reserved1[1]; // - AT91_REG US_IF; // IRDA_FILTER Register - AT91_REG Reserved2[44]; // - AT91_REG US_RPR; // Receive Pointer Register - AT91_REG US_RCR; // Receive Counter Register - AT91_REG US_TPR; // Transmit Pointer Register - AT91_REG US_TCR; // Transmit Counter Register - AT91_REG US_RNPR; // Receive Next Pointer Register - AT91_REG US_RNCR; // Receive Next Counter Register - AT91_REG US_TNPR; // Transmit Next Pointer Register - AT91_REG US_TNCR; // Transmit Next Counter Register - AT91_REG US_PTCR; // PDC Transfer Control Register - AT91_REG US_PTSR; // PDC Transfer Status Register -} AT91S_USART, *AT91PS_USART; - -// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_STTBRK ((unsigned int) 0x1 << 9) // (USART) Start Break -#define AT91C_US_STPBRK ((unsigned int) 0x1 << 10) // (USART) Stop Break -#define AT91C_US_STTTO ((unsigned int) 0x1 << 11) // (USART) Start Time-out -#define AT91C_US_SENDA ((unsigned int) 0x1 << 12) // (USART) Send Address -#define AT91C_US_RSTIT ((unsigned int) 0x1 << 13) // (USART) Reset Iterations -#define AT91C_US_RSTNACK ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge -#define AT91C_US_RETTO ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out -#define AT91C_US_DTREN ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable -#define AT91C_US_DTRDIS ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable -#define AT91C_US_RTSEN ((unsigned int) 0x1 << 18) // (USART) Request to Send enable -#define AT91C_US_RTSDIS ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable -// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_USMODE ((unsigned int) 0xF << 0) // (USART) Usart mode -#define AT91C_US_USMODE_NORMAL ((unsigned int) 0x0) // (USART) Normal -#define AT91C_US_USMODE_RS485 ((unsigned int) 0x1) // (USART) RS485 -#define AT91C_US_USMODE_HWHSH ((unsigned int) 0x2) // (USART) Hardware Handshaking -#define AT91C_US_USMODE_MODEM ((unsigned int) 0x3) // (USART) Modem -#define AT91C_US_USMODE_ISO7816_0 ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0 -#define AT91C_US_USMODE_ISO7816_1 ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1 -#define AT91C_US_USMODE_IRDA ((unsigned int) 0x8) // (USART) IrDA -#define AT91C_US_USMODE_SWHSH ((unsigned int) 0xC) // (USART) Software Handshaking -#define AT91C_US_CLKS ((unsigned int) 0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CLKS_CLOCK ((unsigned int) 0x0 << 4) // (USART) Clock -#define AT91C_US_CLKS_FDIV1 ((unsigned int) 0x1 << 4) // (USART) fdiv1 -#define AT91C_US_CLKS_SLOW ((unsigned int) 0x2 << 4) // (USART) slow_clock (ARM) -#define AT91C_US_CLKS_EXT ((unsigned int) 0x3 << 4) // (USART) External (SCK) -#define AT91C_US_CHRL ((unsigned int) 0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CHRL_5_BITS ((unsigned int) 0x0 << 6) // (USART) Character Length: 5 bits -#define AT91C_US_CHRL_6_BITS ((unsigned int) 0x1 << 6) // (USART) Character Length: 6 bits -#define AT91C_US_CHRL_7_BITS ((unsigned int) 0x2 << 6) // (USART) Character Length: 7 bits -#define AT91C_US_CHRL_8_BITS ((unsigned int) 0x3 << 6) // (USART) Character Length: 8 bits -#define AT91C_US_SYNC ((unsigned int) 0x1 << 8) // (USART) Synchronous Mode Select -#define AT91C_US_NBSTOP ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits -#define AT91C_US_NBSTOP_1_BIT ((unsigned int) 0x0 << 12) // (USART) 1 stop bit -#define AT91C_US_NBSTOP_15_BIT ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits -#define AT91C_US_NBSTOP_2_BIT ((unsigned int) 0x2 << 12) // (USART) 2 stop bits -#define AT91C_US_MSBF ((unsigned int) 0x1 << 16) // (USART) Bit Order -#define AT91C_US_MODE9 ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length -#define AT91C_US_CKLO ((unsigned int) 0x1 << 18) // (USART) Clock Output Select -#define AT91C_US_OVER ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode -#define AT91C_US_INACK ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge -#define AT91C_US_DSNACK ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK -#define AT91C_US_MAX_ITER ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions -#define AT91C_US_FILTER ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter -// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXBRK ((unsigned int) 0x1 << 2) // (USART) Break Received/End of Break -#define AT91C_US_TIMEOUT ((unsigned int) 0x1 << 8) // (USART) Receiver Time-out -#define AT91C_US_ITERATION ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached -#define AT91C_US_NACK ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge -#define AT91C_US_RIIC ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag -#define AT91C_US_DSRIC ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag -#define AT91C_US_DCDIC ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag -#define AT91C_US_CTSIC ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag -// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- -#define AT91C_US_RI ((unsigned int) 0x1 << 20) // (USART) Image of RI Input -#define AT91C_US_DSR ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input -#define AT91C_US_DCD ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input -#define AT91C_US_CTS ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR PWMC Channel Interface -// ***************************************************************************** -typedef struct _AT91S_PWMC_CH { - AT91_REG PWMC_CMR; // Channel Mode Register - AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register - AT91_REG PWMC_CPRDR; // Channel Period Register - AT91_REG PWMC_CCNTR; // Channel Counter Register - AT91_REG PWMC_CUPDR; // Channel Update Register - AT91_REG PWMC_Reserved[3]; // Reserved -} AT91S_PWMC_CH, *AT91PS_PWMC_CH; - -// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- -#define AT91C_PWMC_CPRE ((unsigned int) 0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx -#define AT91C_PWMC_CPRE_MCK ((unsigned int) 0x0) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKA ((unsigned int) 0xB) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKB ((unsigned int) 0xC) // (PWMC_CH) -#define AT91C_PWMC_CALG ((unsigned int) 0x1 << 8) // (PWMC_CH) Channel Alignment -#define AT91C_PWMC_CPOL ((unsigned int) 0x1 << 9) // (PWMC_CH) Channel Polarity -#define AT91C_PWMC_CPD ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period -// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- -#define AT91C_PWMC_CDTY ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Duty Cycle -// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- -#define AT91C_PWMC_CPRD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Period -// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- -#define AT91C_PWMC_CCNT ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Counter -// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- -#define AT91C_PWMC_CUPD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Update - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface -// ***************************************************************************** -typedef struct _AT91S_PWMC { - AT91_REG PWMC_MR; // PWMC Mode Register - AT91_REG PWMC_ENA; // PWMC Enable Register - AT91_REG PWMC_DIS; // PWMC Disable Register - AT91_REG PWMC_SR; // PWMC Status Register - AT91_REG PWMC_IER; // PWMC Interrupt Enable Register - AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register - AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register - AT91_REG PWMC_ISR; // PWMC Interrupt Status Register - AT91_REG Reserved0[55]; // - AT91_REG PWMC_VR; // PWMC Version Register - AT91_REG Reserved1[64]; // - AT91S_PWMC_CH PWMC_CH[8]; // PWMC Channel -} AT91S_PWMC, *AT91PS_PWMC; - -// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- -#define AT91C_PWMC_DIVA ((unsigned int) 0xFF << 0) // (PWMC) CLKA divide factor. -#define AT91C_PWMC_PREA ((unsigned int) 0xF << 8) // (PWMC) Divider Input Clock Prescaler A -#define AT91C_PWMC_PREA_MCK ((unsigned int) 0x0 << 8) // (PWMC) -#define AT91C_PWMC_DIVB ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor. -#define AT91C_PWMC_PREB ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B -#define AT91C_PWMC_PREB_MCK ((unsigned int) 0x0 << 24) // (PWMC) -// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- -#define AT91C_PWMC_CHID0 ((unsigned int) 0x1 << 0) // (PWMC) Channel ID 0 -#define AT91C_PWMC_CHID1 ((unsigned int) 0x1 << 1) // (PWMC) Channel ID 1 -#define AT91C_PWMC_CHID2 ((unsigned int) 0x1 << 2) // (PWMC) Channel ID 2 -#define AT91C_PWMC_CHID3 ((unsigned int) 0x1 << 3) // (PWMC) Channel ID 3 -#define AT91C_PWMC_CHID4 ((unsigned int) 0x1 << 4) // (PWMC) Channel ID 4 -#define AT91C_PWMC_CHID5 ((unsigned int) 0x1 << 5) // (PWMC) Channel ID 5 -#define AT91C_PWMC_CHID6 ((unsigned int) 0x1 << 6) // (PWMC) Channel ID 6 -#define AT91C_PWMC_CHID7 ((unsigned int) 0x1 << 7) // (PWMC) Channel ID 7 -// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- -// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- -// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- -// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- -// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- -// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface -// ***************************************************************************** -typedef struct _AT91S_SSC { - AT91_REG SSC_CR; // Control Register - AT91_REG SSC_CMR; // Clock Mode Register - AT91_REG Reserved0[2]; // - AT91_REG SSC_RCMR; // Receive Clock ModeRegister - AT91_REG SSC_RFMR; // Receive Frame Mode Register - AT91_REG SSC_TCMR; // Transmit Clock Mode Register - AT91_REG SSC_TFMR; // Transmit Frame Mode Register - AT91_REG SSC_RHR; // Receive Holding Register - AT91_REG SSC_THR; // Transmit Holding Register - AT91_REG Reserved1[2]; // - AT91_REG SSC_RSHR; // Receive Sync Holding Register - AT91_REG SSC_TSHR; // Transmit Sync Holding Register - AT91_REG Reserved2[2]; // - AT91_REG SSC_SR; // Status Register - AT91_REG SSC_IER; // Interrupt Enable Register - AT91_REG SSC_IDR; // Interrupt Disable Register - AT91_REG SSC_IMR; // Interrupt Mask Register - AT91_REG Reserved3[44]; // - AT91_REG SSC_RPR; // Receive Pointer Register - AT91_REG SSC_RCR; // Receive Counter Register - AT91_REG SSC_TPR; // Transmit Pointer Register - AT91_REG SSC_TCR; // Transmit Counter Register - AT91_REG SSC_RNPR; // Receive Next Pointer Register - AT91_REG SSC_RNCR; // Receive Next Counter Register - AT91_REG SSC_TNPR; // Transmit Next Pointer Register - AT91_REG SSC_TNCR; // Transmit Next Counter Register - AT91_REG SSC_PTCR; // PDC Transfer Control Register - AT91_REG SSC_PTSR; // PDC Transfer Status Register -} AT91S_SSC, *AT91PS_SSC; - -// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- -#define AT91C_SSC_RXEN ((unsigned int) 0x1 << 0) // (SSC) Receive Enable -#define AT91C_SSC_RXDIS ((unsigned int) 0x1 << 1) // (SSC) Receive Disable -#define AT91C_SSC_TXEN ((unsigned int) 0x1 << 8) // (SSC) Transmit Enable -#define AT91C_SSC_TXDIS ((unsigned int) 0x1 << 9) // (SSC) Transmit Disable -#define AT91C_SSC_SWRST ((unsigned int) 0x1 << 15) // (SSC) Software Reset -// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- -#define AT91C_SSC_CKS ((unsigned int) 0x3 << 0) // (SSC) Receive/Transmit Clock Selection -#define AT91C_SSC_CKS_DIV ((unsigned int) 0x0) // (SSC) Divided Clock -#define AT91C_SSC_CKS_TK ((unsigned int) 0x1) // (SSC) TK Clock signal -#define AT91C_SSC_CKS_RK ((unsigned int) 0x2) // (SSC) RK pin -#define AT91C_SSC_CKO ((unsigned int) 0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection -#define AT91C_SSC_CKO_NONE ((unsigned int) 0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only -#define AT91C_SSC_CKO_CONTINOUS ((unsigned int) 0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output -#define AT91C_SSC_CKO_DATA_TX ((unsigned int) 0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output -#define AT91C_SSC_CKI ((unsigned int) 0x1 << 5) // (SSC) Receive/Transmit Clock Inversion -#define AT91C_SSC_START ((unsigned int) 0xF << 8) // (SSC) Receive/Transmit Start Selection -#define AT91C_SSC_START_CONTINOUS ((unsigned int) 0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. -#define AT91C_SSC_START_TX ((unsigned int) 0x1 << 8) // (SSC) Transmit/Receive start -#define AT91C_SSC_START_LOW_RF ((unsigned int) 0x2 << 8) // (SSC) Detection of a low level on RF input -#define AT91C_SSC_START_HIGH_RF ((unsigned int) 0x3 << 8) // (SSC) Detection of a high level on RF input -#define AT91C_SSC_START_FALL_RF ((unsigned int) 0x4 << 8) // (SSC) Detection of a falling edge on RF input -#define AT91C_SSC_START_RISE_RF ((unsigned int) 0x5 << 8) // (SSC) Detection of a rising edge on RF input -#define AT91C_SSC_START_LEVEL_RF ((unsigned int) 0x6 << 8) // (SSC) Detection of any level change on RF input -#define AT91C_SSC_START_EDGE_RF ((unsigned int) 0x7 << 8) // (SSC) Detection of any edge on RF input -#define AT91C_SSC_START_0 ((unsigned int) 0x8 << 8) // (SSC) Compare 0 -#define AT91C_SSC_STTDLY ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay -#define AT91C_SSC_PERIOD ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection -// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- -#define AT91C_SSC_DATLEN ((unsigned int) 0x1F << 0) // (SSC) Data Length -#define AT91C_SSC_LOOP ((unsigned int) 0x1 << 5) // (SSC) Loop Mode -#define AT91C_SSC_MSBF ((unsigned int) 0x1 << 7) // (SSC) Most Significant Bit First -#define AT91C_SSC_DATNB ((unsigned int) 0xF << 8) // (SSC) Data Number per Frame -#define AT91C_SSC_FSLEN ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length -#define AT91C_SSC_FSOS ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection -#define AT91C_SSC_FSOS_NONE ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only -#define AT91C_SSC_FSOS_NEGATIVE ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse -#define AT91C_SSC_FSOS_POSITIVE ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse -#define AT91C_SSC_FSOS_LOW ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer -#define AT91C_SSC_FSOS_HIGH ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer -#define AT91C_SSC_FSOS_TOGGLE ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer -#define AT91C_SSC_FSEDGE ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection -// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- -// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- -#define AT91C_SSC_DATDEF ((unsigned int) 0x1 << 5) // (SSC) Data Default Value -#define AT91C_SSC_FSDEN ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable -// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- -#define AT91C_SSC_TXRDY ((unsigned int) 0x1 << 0) // (SSC) Transmit Ready -#define AT91C_SSC_TXEMPTY ((unsigned int) 0x1 << 1) // (SSC) Transmit Empty -#define AT91C_SSC_ENDTX ((unsigned int) 0x1 << 2) // (SSC) End Of Transmission -#define AT91C_SSC_TXBUFE ((unsigned int) 0x1 << 3) // (SSC) Transmit Buffer Empty -#define AT91C_SSC_RXRDY ((unsigned int) 0x1 << 4) // (SSC) Receive Ready -#define AT91C_SSC_OVRUN ((unsigned int) 0x1 << 5) // (SSC) Receive Overrun -#define AT91C_SSC_ENDRX ((unsigned int) 0x1 << 6) // (SSC) End of Reception -#define AT91C_SSC_RXBUFF ((unsigned int) 0x1 << 7) // (SSC) Receive Buffer Full -#define AT91C_SSC_TXSYN ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync -#define AT91C_SSC_RXSYN ((unsigned int) 0x1 << 11) // (SSC) Receive Sync -#define AT91C_SSC_TXENA ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable -#define AT91C_SSC_RXENA ((unsigned int) 0x1 << 17) // (SSC) Receive Enable -// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- -// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- -// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Analog to Digital Convertor -// ***************************************************************************** -typedef struct _AT91S_ADC { - AT91_REG ADC_CR; // ADC Control Register - AT91_REG ADC_MR; // ADC Mode Register - AT91_REG Reserved0[2]; // - AT91_REG ADC_CHER; // ADC Channel Enable Register - AT91_REG ADC_CHDR; // ADC Channel Disable Register - AT91_REG ADC_CHSR; // ADC Channel Status Register - AT91_REG ADC_SR; // ADC Status Register - AT91_REG ADC_LCDR; // ADC Last Converted Data Register - AT91_REG ADC_IER; // ADC Interrupt Enable Register - AT91_REG ADC_IDR; // ADC Interrupt Disable Register - AT91_REG ADC_IMR; // ADC Interrupt Mask Register - AT91_REG ADC_CDR0; // ADC Channel Data Register 0 - AT91_REG ADC_CDR1; // ADC Channel Data Register 1 - AT91_REG ADC_CDR2; // ADC Channel Data Register 2 - AT91_REG ADC_CDR3; // ADC Channel Data Register 3 - AT91_REG ADC_CDR4; // ADC Channel Data Register 4 - AT91_REG ADC_CDR5; // ADC Channel Data Register 5 - AT91_REG ADC_CDR6; // ADC Channel Data Register 6 - AT91_REG ADC_CDR7; // ADC Channel Data Register 7 - AT91_REG Reserved1[44]; // - AT91_REG ADC_RPR; // Receive Pointer Register - AT91_REG ADC_RCR; // Receive Counter Register - AT91_REG ADC_TPR; // Transmit Pointer Register - AT91_REG ADC_TCR; // Transmit Counter Register - AT91_REG ADC_RNPR; // Receive Next Pointer Register - AT91_REG ADC_RNCR; // Receive Next Counter Register - AT91_REG ADC_TNPR; // Transmit Next Pointer Register - AT91_REG ADC_TNCR; // Transmit Next Counter Register - AT91_REG ADC_PTCR; // PDC Transfer Control Register - AT91_REG ADC_PTSR; // PDC Transfer Status Register -} AT91S_ADC, *AT91PS_ADC; - -// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- -#define AT91C_ADC_SWRST ((unsigned int) 0x1 << 0) // (ADC) Software Reset -#define AT91C_ADC_START ((unsigned int) 0x1 << 1) // (ADC) Start Conversion -// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- -#define AT91C_ADC_TRGEN ((unsigned int) 0x1 << 0) // (ADC) Trigger Enable -#define AT91C_ADC_TRGEN_DIS ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software -#define AT91C_ADC_TRGEN_EN ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. -#define AT91C_ADC_TRGSEL ((unsigned int) 0x7 << 1) // (ADC) Trigger Selection -#define AT91C_ADC_TRGSEL_TIOA0 ((unsigned int) 0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 -#define AT91C_ADC_TRGSEL_TIOA1 ((unsigned int) 0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 -#define AT91C_ADC_TRGSEL_TIOA2 ((unsigned int) 0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 -#define AT91C_ADC_TRGSEL_TIOA3 ((unsigned int) 0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 -#define AT91C_ADC_TRGSEL_TIOA4 ((unsigned int) 0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 -#define AT91C_ADC_TRGSEL_TIOA5 ((unsigned int) 0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 -#define AT91C_ADC_TRGSEL_EXT ((unsigned int) 0x6 << 1) // (ADC) Selected TRGSEL = External Trigger -#define AT91C_ADC_LOWRES ((unsigned int) 0x1 << 4) // (ADC) Resolution. -#define AT91C_ADC_LOWRES_10_BIT ((unsigned int) 0x0 << 4) // (ADC) 10-bit resolution -#define AT91C_ADC_LOWRES_8_BIT ((unsigned int) 0x1 << 4) // (ADC) 8-bit resolution -#define AT91C_ADC_SLEEP ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_SLEEP_NORMAL_MODE ((unsigned int) 0x0 << 5) // (ADC) Normal Mode -#define AT91C_ADC_SLEEP_MODE ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_PRESCAL ((unsigned int) 0x3F << 8) // (ADC) Prescaler rate selection -#define AT91C_ADC_STARTUP ((unsigned int) 0x1F << 16) // (ADC) Startup Time -#define AT91C_ADC_SHTIM ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time -// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- -#define AT91C_ADC_CH0 ((unsigned int) 0x1 << 0) // (ADC) Channel 0 -#define AT91C_ADC_CH1 ((unsigned int) 0x1 << 1) // (ADC) Channel 1 -#define AT91C_ADC_CH2 ((unsigned int) 0x1 << 2) // (ADC) Channel 2 -#define AT91C_ADC_CH3 ((unsigned int) 0x1 << 3) // (ADC) Channel 3 -#define AT91C_ADC_CH4 ((unsigned int) 0x1 << 4) // (ADC) Channel 4 -#define AT91C_ADC_CH5 ((unsigned int) 0x1 << 5) // (ADC) Channel 5 -#define AT91C_ADC_CH6 ((unsigned int) 0x1 << 6) // (ADC) Channel 6 -#define AT91C_ADC_CH7 ((unsigned int) 0x1 << 7) // (ADC) Channel 7 -// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- -// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- -// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- -#define AT91C_ADC_EOC0 ((unsigned int) 0x1 << 0) // (ADC) End of Conversion -#define AT91C_ADC_EOC1 ((unsigned int) 0x1 << 1) // (ADC) End of Conversion -#define AT91C_ADC_EOC2 ((unsigned int) 0x1 << 2) // (ADC) End of Conversion -#define AT91C_ADC_EOC3 ((unsigned int) 0x1 << 3) // (ADC) End of Conversion -#define AT91C_ADC_EOC4 ((unsigned int) 0x1 << 4) // (ADC) End of Conversion -#define AT91C_ADC_EOC5 ((unsigned int) 0x1 << 5) // (ADC) End of Conversion -#define AT91C_ADC_EOC6 ((unsigned int) 0x1 << 6) // (ADC) End of Conversion -#define AT91C_ADC_EOC7 ((unsigned int) 0x1 << 7) // (ADC) End of Conversion -#define AT91C_ADC_OVRE0 ((unsigned int) 0x1 << 8) // (ADC) Overrun Error -#define AT91C_ADC_OVRE1 ((unsigned int) 0x1 << 9) // (ADC) Overrun Error -#define AT91C_ADC_OVRE2 ((unsigned int) 0x1 << 10) // (ADC) Overrun Error -#define AT91C_ADC_OVRE3 ((unsigned int) 0x1 << 11) // (ADC) Overrun Error -#define AT91C_ADC_OVRE4 ((unsigned int) 0x1 << 12) // (ADC) Overrun Error -#define AT91C_ADC_OVRE5 ((unsigned int) 0x1 << 13) // (ADC) Overrun Error -#define AT91C_ADC_OVRE6 ((unsigned int) 0x1 << 14) // (ADC) Overrun Error -#define AT91C_ADC_OVRE7 ((unsigned int) 0x1 << 15) // (ADC) Overrun Error -#define AT91C_ADC_DRDY ((unsigned int) 0x1 << 16) // (ADC) Data Ready -#define AT91C_ADC_GOVRE ((unsigned int) 0x1 << 17) // (ADC) General Overrun -#define AT91C_ADC_ENDRX ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer -#define AT91C_ADC_RXBUFF ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt -// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- -#define AT91C_ADC_LDATA ((unsigned int) 0x3FF << 0) // (ADC) Last Data Converted -// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- -// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- -// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- -// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- -#define AT91C_ADC_DATA ((unsigned int) 0x3FF << 0) // (ADC) Converted Data -// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- -// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- -// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- -// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- -// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- -// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- -// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Serial Parallel Interface -// ***************************************************************************** -typedef struct _AT91S_SPI { - AT91_REG SPI_CR; // Control Register - AT91_REG SPI_MR; // Mode Register - AT91_REG SPI_RDR; // Receive Data Register - AT91_REG SPI_TDR; // Transmit Data Register - AT91_REG SPI_SR; // Status Register - AT91_REG SPI_IER; // Interrupt Enable Register - AT91_REG SPI_IDR; // Interrupt Disable Register - AT91_REG SPI_IMR; // Interrupt Mask Register - AT91_REG Reserved0[4]; // - AT91_REG SPI_CSR[4]; // Chip Select Register - AT91_REG Reserved1[48]; // - AT91_REG SPI_RPR; // Receive Pointer Register - AT91_REG SPI_RCR; // Receive Counter Register - AT91_REG SPI_TPR; // Transmit Pointer Register - AT91_REG SPI_TCR; // Transmit Counter Register - AT91_REG SPI_RNPR; // Receive Next Pointer Register - AT91_REG SPI_RNCR; // Receive Next Counter Register - AT91_REG SPI_TNPR; // Transmit Next Pointer Register - AT91_REG SPI_TNCR; // Transmit Next Counter Register - AT91_REG SPI_PTCR; // PDC Transfer Control Register - AT91_REG SPI_PTSR; // PDC Transfer Status Register -} AT91S_SPI, *AT91PS_SPI; - -// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- -#define AT91C_SPI_SPIEN ((unsigned int) 0x1 << 0) // (SPI) SPI Enable -#define AT91C_SPI_SPIDIS ((unsigned int) 0x1 << 1) // (SPI) SPI Disable -#define AT91C_SPI_SWRST ((unsigned int) 0x1 << 7) // (SPI) SPI Software reset -#define AT91C_SPI_LASTXFER ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer -// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- -#define AT91C_SPI_MSTR ((unsigned int) 0x1 << 0) // (SPI) Master/Slave Mode -#define AT91C_SPI_PS ((unsigned int) 0x1 << 1) // (SPI) Peripheral Select -#define AT91C_SPI_PS_FIXED ((unsigned int) 0x0 << 1) // (SPI) Fixed Peripheral Select -#define AT91C_SPI_PS_VARIABLE ((unsigned int) 0x1 << 1) // (SPI) Variable Peripheral Select -#define AT91C_SPI_PCSDEC ((unsigned int) 0x1 << 2) // (SPI) Chip Select Decode -#define AT91C_SPI_FDIV ((unsigned int) 0x1 << 3) // (SPI) Clock Selection -#define AT91C_SPI_MODFDIS ((unsigned int) 0x1 << 4) // (SPI) Mode Fault Detection -#define AT91C_SPI_LLB ((unsigned int) 0x1 << 7) // (SPI) Clock Selection -#define AT91C_SPI_PCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select -#define AT91C_SPI_DLYBCS ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects -// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- -#define AT91C_SPI_RD ((unsigned int) 0xFFFF << 0) // (SPI) Receive Data -#define AT91C_SPI_RPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- -#define AT91C_SPI_TD ((unsigned int) 0xFFFF << 0) // (SPI) Transmit Data -#define AT91C_SPI_TPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- -#define AT91C_SPI_RDRF ((unsigned int) 0x1 << 0) // (SPI) Receive Data Register Full -#define AT91C_SPI_TDRE ((unsigned int) 0x1 << 1) // (SPI) Transmit Data Register Empty -#define AT91C_SPI_MODF ((unsigned int) 0x1 << 2) // (SPI) Mode Fault Error -#define AT91C_SPI_OVRES ((unsigned int) 0x1 << 3) // (SPI) Overrun Error Status -#define AT91C_SPI_ENDRX ((unsigned int) 0x1 << 4) // (SPI) End of Receiver Transfer -#define AT91C_SPI_ENDTX ((unsigned int) 0x1 << 5) // (SPI) End of Receiver Transfer -#define AT91C_SPI_RXBUFF ((unsigned int) 0x1 << 6) // (SPI) RXBUFF Interrupt -#define AT91C_SPI_TXBUFE ((unsigned int) 0x1 << 7) // (SPI) TXBUFE Interrupt -#define AT91C_SPI_NSSR ((unsigned int) 0x1 << 8) // (SPI) NSSR Interrupt -#define AT91C_SPI_TXEMPTY ((unsigned int) 0x1 << 9) // (SPI) TXEMPTY Interrupt -#define AT91C_SPI_SPIENS ((unsigned int) 0x1 << 16) // (SPI) Enable Status -// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- -// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- -// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- -// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- -#define AT91C_SPI_CPOL ((unsigned int) 0x1 << 0) // (SPI) Clock Polarity -#define AT91C_SPI_NCPHA ((unsigned int) 0x1 << 1) // (SPI) Clock Phase -#define AT91C_SPI_CSAAT ((unsigned int) 0x1 << 3) // (SPI) Chip Select Active After Transfer -#define AT91C_SPI_BITS ((unsigned int) 0xF << 4) // (SPI) Bits Per Transfer -#define AT91C_SPI_BITS_8 ((unsigned int) 0x0 << 4) // (SPI) 8 Bits Per transfer -#define AT91C_SPI_BITS_9 ((unsigned int) 0x1 << 4) // (SPI) 9 Bits Per transfer -#define AT91C_SPI_BITS_10 ((unsigned int) 0x2 << 4) // (SPI) 10 Bits Per transfer -#define AT91C_SPI_BITS_11 ((unsigned int) 0x3 << 4) // (SPI) 11 Bits Per transfer -#define AT91C_SPI_BITS_12 ((unsigned int) 0x4 << 4) // (SPI) 12 Bits Per transfer -#define AT91C_SPI_BITS_13 ((unsigned int) 0x5 << 4) // (SPI) 13 Bits Per transfer -#define AT91C_SPI_BITS_14 ((unsigned int) 0x6 << 4) // (SPI) 14 Bits Per transfer -#define AT91C_SPI_BITS_15 ((unsigned int) 0x7 << 4) // (SPI) 15 Bits Per transfer -#define AT91C_SPI_BITS_16 ((unsigned int) 0x8 << 4) // (SPI) 16 Bits Per transfer -#define AT91C_SPI_SCBR ((unsigned int) 0xFF << 8) // (SPI) Serial Clock Baud Rate -#define AT91C_SPI_DLYBS ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK -#define AT91C_SPI_DLYBCT ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers - -// ***************************************************************************** -// REGISTER ADDRESS DEFINITION FOR AT91SAM7A3 -// ***************************************************************************** -// ========== Register definition for SYS peripheral ========== -#define AT91C_SYS_GPBR1 ((AT91_REG *) 0xFFFFFD54) // (SYS) General Purpose Register 1 -#define AT91C_SYS_GPBR0 ((AT91_REG *) 0xFFFFFD50) // (SYS) General Purpose Register 0 -// ========== Register definition for AIC peripheral ========== -#define AT91C_AIC_ICCR ((AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register -#define AT91C_AIC_IECR ((AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register -#define AT91C_AIC_SMR ((AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register -#define AT91C_AIC_ISCR ((AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register -#define AT91C_AIC_EOICR ((AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register -#define AT91C_AIC_DCR ((AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) -#define AT91C_AIC_FFER ((AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register -#define AT91C_AIC_SVR ((AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register -#define AT91C_AIC_SPU ((AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register -#define AT91C_AIC_FFDR ((AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register -#define AT91C_AIC_FVR ((AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register -#define AT91C_AIC_FFSR ((AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register -#define AT91C_AIC_IMR ((AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register -#define AT91C_AIC_ISR ((AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register -#define AT91C_AIC_IVR ((AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register -#define AT91C_AIC_IDCR ((AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register -#define AT91C_AIC_CISR ((AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register -#define AT91C_AIC_IPR ((AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register -// ========== Register definition for PDC_DBGU peripheral ========== -#define AT91C_DBGU_TNCR ((AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register -#define AT91C_DBGU_RNCR ((AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register -#define AT91C_DBGU_PTCR ((AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register -#define AT91C_DBGU_PTSR ((AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register -#define AT91C_DBGU_RCR ((AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register -#define AT91C_DBGU_TCR ((AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register -#define AT91C_DBGU_RPR ((AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register -#define AT91C_DBGU_TPR ((AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register -#define AT91C_DBGU_RNPR ((AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register -#define AT91C_DBGU_TNPR ((AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register -// ========== Register definition for DBGU peripheral ========== -#define AT91C_DBGU_EXID ((AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register -#define AT91C_DBGU_THR ((AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register -#define AT91C_DBGU_CSR ((AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register -#define AT91C_DBGU_IDR ((AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register -#define AT91C_DBGU_MR ((AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register -#define AT91C_DBGU_FNTR ((AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register -#define AT91C_DBGU_CIDR ((AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register -#define AT91C_DBGU_BRGR ((AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register -#define AT91C_DBGU_RHR ((AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register -#define AT91C_DBGU_IMR ((AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register -#define AT91C_DBGU_IER ((AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register -#define AT91C_DBGU_CR ((AT91_REG *) 0xFFFFF200) // (DBGU) Control Register -// ========== Register definition for PIOA peripheral ========== -#define AT91C_PIOA_IMR ((AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register -#define AT91C_PIOA_IER ((AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register -#define AT91C_PIOA_OWDR ((AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register -#define AT91C_PIOA_ISR ((AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register -#define AT91C_PIOA_PPUDR ((AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register -#define AT91C_PIOA_MDSR ((AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register -#define AT91C_PIOA_MDER ((AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register -#define AT91C_PIOA_PER ((AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register -#define AT91C_PIOA_PSR ((AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register -#define AT91C_PIOA_OER ((AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register -#define AT91C_PIOA_BSR ((AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register -#define AT91C_PIOA_PPUER ((AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register -#define AT91C_PIOA_MDDR ((AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register -#define AT91C_PIOA_PDR ((AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register -#define AT91C_PIOA_ODR ((AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr -#define AT91C_PIOA_IFDR ((AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register -#define AT91C_PIOA_ABSR ((AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register -#define AT91C_PIOA_ASR ((AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register -#define AT91C_PIOA_PPUSR ((AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register -#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register -#define AT91C_PIOA_SODR ((AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register -#define AT91C_PIOA_IFSR ((AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register -#define AT91C_PIOA_IFER ((AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register -#define AT91C_PIOA_OSR ((AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register -#define AT91C_PIOA_IDR ((AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register -#define AT91C_PIOA_PDSR ((AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register -#define AT91C_PIOA_CODR ((AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register -#define AT91C_PIOA_OWSR ((AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register -#define AT91C_PIOA_OWER ((AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register -// ========== Register definition for PIOB peripheral ========== -#define AT91C_PIOB_OWSR ((AT91_REG *) 0xFFFFF6A8) // (PIOB) Output Write Status Register -#define AT91C_PIOB_PPUSR ((AT91_REG *) 0xFFFFF668) // (PIOB) Pull-up Status Register -#define AT91C_PIOB_PPUDR ((AT91_REG *) 0xFFFFF660) // (PIOB) Pull-up Disable Register -#define AT91C_PIOB_MDSR ((AT91_REG *) 0xFFFFF658) // (PIOB) Multi-driver Status Register -#define AT91C_PIOB_MDER ((AT91_REG *) 0xFFFFF650) // (PIOB) Multi-driver Enable Register -#define AT91C_PIOB_IMR ((AT91_REG *) 0xFFFFF648) // (PIOB) Interrupt Mask Register -#define AT91C_PIOB_OSR ((AT91_REG *) 0xFFFFF618) // (PIOB) Output Status Register -#define AT91C_PIOB_OER ((AT91_REG *) 0xFFFFF610) // (PIOB) Output Enable Register -#define AT91C_PIOB_PSR ((AT91_REG *) 0xFFFFF608) // (PIOB) PIO Status Register -#define AT91C_PIOB_PER ((AT91_REG *) 0xFFFFF600) // (PIOB) PIO Enable Register -#define AT91C_PIOB_BSR ((AT91_REG *) 0xFFFFF674) // (PIOB) Select B Register -#define AT91C_PIOB_PPUER ((AT91_REG *) 0xFFFFF664) // (PIOB) Pull-up Enable Register -#define AT91C_PIOB_IFDR ((AT91_REG *) 0xFFFFF624) // (PIOB) Input Filter Disable Register -#define AT91C_PIOB_ODR ((AT91_REG *) 0xFFFFF614) // (PIOB) Output Disable Registerr -#define AT91C_PIOB_ABSR ((AT91_REG *) 0xFFFFF678) // (PIOB) AB Select Status Register -#define AT91C_PIOB_ASR ((AT91_REG *) 0xFFFFF670) // (PIOB) Select A Register -#define AT91C_PIOB_IFER ((AT91_REG *) 0xFFFFF620) // (PIOB) Input Filter Enable Register -#define AT91C_PIOB_IFSR ((AT91_REG *) 0xFFFFF628) // (PIOB) Input Filter Status Register -#define AT91C_PIOB_SODR ((AT91_REG *) 0xFFFFF630) // (PIOB) Set Output Data Register -#define AT91C_PIOB_ODSR ((AT91_REG *) 0xFFFFF638) // (PIOB) Output Data Status Register -#define AT91C_PIOB_CODR ((AT91_REG *) 0xFFFFF634) // (PIOB) Clear Output Data Register -#define AT91C_PIOB_PDSR ((AT91_REG *) 0xFFFFF63C) // (PIOB) Pin Data Status Register -#define AT91C_PIOB_OWER ((AT91_REG *) 0xFFFFF6A0) // (PIOB) Output Write Enable Register -#define AT91C_PIOB_IER ((AT91_REG *) 0xFFFFF640) // (PIOB) Interrupt Enable Register -#define AT91C_PIOB_OWDR ((AT91_REG *) 0xFFFFF6A4) // (PIOB) Output Write Disable Register -#define AT91C_PIOB_MDDR ((AT91_REG *) 0xFFFFF654) // (PIOB) Multi-driver Disable Register -#define AT91C_PIOB_ISR ((AT91_REG *) 0xFFFFF64C) // (PIOB) Interrupt Status Register -#define AT91C_PIOB_IDR ((AT91_REG *) 0xFFFFF644) // (PIOB) Interrupt Disable Register -#define AT91C_PIOB_PDR ((AT91_REG *) 0xFFFFF604) // (PIOB) PIO Disable Register -// ========== Register definition for CKGR peripheral ========== -#define AT91C_CKGR_PLLR ((AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register -#define AT91C_CKGR_MCFR ((AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register -#define AT91C_CKGR_MOR ((AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register -// ========== Register definition for PMC peripheral ========== -#define AT91C_PMC_SCSR ((AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register -#define AT91C_PMC_SCER ((AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register -#define AT91C_PMC_IMR ((AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register -#define AT91C_PMC_IDR ((AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register -#define AT91C_PMC_PCDR ((AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register -#define AT91C_PMC_SCDR ((AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register -#define AT91C_PMC_SR ((AT91_REG *) 0xFFFFFC68) // (PMC) Status Register -#define AT91C_PMC_IER ((AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register -#define AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register -#define AT91C_PMC_MOR ((AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register -#define AT91C_PMC_PCER ((AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register -#define AT91C_PMC_PCSR ((AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register -#define AT91C_PMC_PLLR ((AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register -#define AT91C_PMC_MCFR ((AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register -#define AT91C_PMC_PCKR ((AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register -// ========== Register definition for RSTC peripheral ========== -#define AT91C_RSTC_RSR ((AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register -#define AT91C_RSTC_RMR ((AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register -#define AT91C_RSTC_RCR ((AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register -// ========== Register definition for SHDWC peripheral ========== -#define AT91C_SHDWC_SHMR ((AT91_REG *) 0xFFFFFD14) // (SHDWC) Shut Down Mode Register -#define AT91C_SHDWC_SHSR ((AT91_REG *) 0xFFFFFD18) // (SHDWC) Shut Down Status Register -#define AT91C_SHDWC_SHCR ((AT91_REG *) 0xFFFFFD10) // (SHDWC) Shut Down Control Register -// ========== Register definition for RTTC peripheral ========== -#define AT91C_RTTC_RTSR ((AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register -#define AT91C_RTTC_RTAR ((AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register -#define AT91C_RTTC_RTVR ((AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register -#define AT91C_RTTC_RTMR ((AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register -// ========== Register definition for PITC peripheral ========== -#define AT91C_PITC_PIIR ((AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register -#define AT91C_PITC_PISR ((AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register -#define AT91C_PITC_PIVR ((AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register -#define AT91C_PITC_PIMR ((AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register -// ========== Register definition for WDTC peripheral ========== -#define AT91C_WDTC_WDMR ((AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register -#define AT91C_WDTC_WDSR ((AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register -#define AT91C_WDTC_WDCR ((AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register -// ========== Register definition for MC peripheral ========== -#define AT91C_MC_FCR ((AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register -#define AT91C_MC_PUER ((AT91_REG *) 0xFFFFFF54) // (MC) MC Protection Unit Enable Register -#define AT91C_MC_ASR ((AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register -#define AT91C_MC_FSR ((AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register -#define AT91C_MC_FMR ((AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register -#define AT91C_MC_PUP ((AT91_REG *) 0xFFFFFF50) // (MC) MC Protection Unit Peripherals -#define AT91C_MC_PUIA ((AT91_REG *) 0xFFFFFF10) // (MC) MC Protection Unit Area -#define AT91C_MC_AASR ((AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register -#define AT91C_MC_RCR ((AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register -// ========== Register definition for CAN0_MB0 peripheral ========== -#define AT91C_CAN0_MB0_MDH ((AT91_REG *) 0xFFF80218) // (CAN0_MB0) MailBox Data High Register -#define AT91C_CAN0_MB0_MSR ((AT91_REG *) 0xFFF80210) // (CAN0_MB0) MailBox Status Register -#define AT91C_CAN0_MB0_MID ((AT91_REG *) 0xFFF80208) // (CAN0_MB0) MailBox ID Register -#define AT91C_CAN0_MB0_MMR ((AT91_REG *) 0xFFF80200) // (CAN0_MB0) MailBox Mode Register -#define AT91C_CAN0_MB0_MCR ((AT91_REG *) 0xFFF8021C) // (CAN0_MB0) MailBox Control Register -#define AT91C_CAN0_MB0_MDL ((AT91_REG *) 0xFFF80214) // (CAN0_MB0) MailBox Data Low Register -#define AT91C_CAN0_MB0_MFID ((AT91_REG *) 0xFFF8020C) // (CAN0_MB0) MailBox Family ID Register -#define AT91C_CAN0_MB0_MAM ((AT91_REG *) 0xFFF80204) // (CAN0_MB0) MailBox Acceptance Mask Register -// ========== Register definition for CAN0_MB1 peripheral ========== -#define AT91C_CAN0_MB1_MDH ((AT91_REG *) 0xFFF80238) // (CAN0_MB1) MailBox Data High Register -#define AT91C_CAN0_MB1_MSR ((AT91_REG *) 0xFFF80230) // (CAN0_MB1) MailBox Status Register -#define AT91C_CAN0_MB1_MID ((AT91_REG *) 0xFFF80228) // (CAN0_MB1) MailBox ID Register -#define AT91C_CAN0_MB1_MMR ((AT91_REG *) 0xFFF80220) // (CAN0_MB1) MailBox Mode Register -#define AT91C_CAN0_MB1_MCR ((AT91_REG *) 0xFFF8023C) // (CAN0_MB1) MailBox Control Register -#define AT91C_CAN0_MB1_MDL ((AT91_REG *) 0xFFF80234) // (CAN0_MB1) MailBox Data Low Register -#define AT91C_CAN0_MB1_MFID ((AT91_REG *) 0xFFF8022C) // (CAN0_MB1) MailBox Family ID Register -#define AT91C_CAN0_MB1_MAM ((AT91_REG *) 0xFFF80224) // (CAN0_MB1) MailBox Acceptance Mask Register -// ========== Register definition for CAN0_MB2 peripheral ========== -#define AT91C_CAN0_MB2_MDH ((AT91_REG *) 0xFFF80258) // (CAN0_MB2) MailBox Data High Register -#define AT91C_CAN0_MB2_MSR ((AT91_REG *) 0xFFF80250) // (CAN0_MB2) MailBox Status Register -#define AT91C_CAN0_MB2_MID ((AT91_REG *) 0xFFF80248) // (CAN0_MB2) MailBox ID Register -#define AT91C_CAN0_MB2_MMR ((AT91_REG *) 0xFFF80240) // (CAN0_MB2) MailBox Mode Register -#define AT91C_CAN0_MB2_MCR ((AT91_REG *) 0xFFF8025C) // (CAN0_MB2) MailBox Control Register -#define AT91C_CAN0_MB2_MDL ((AT91_REG *) 0xFFF80254) // (CAN0_MB2) MailBox Data Low Register -#define AT91C_CAN0_MB2_MFID ((AT91_REG *) 0xFFF8024C) // (CAN0_MB2) MailBox Family ID Register -#define AT91C_CAN0_MB2_MAM ((AT91_REG *) 0xFFF80244) // (CAN0_MB2) MailBox Acceptance Mask Register -// ========== Register definition for CAN0_MB3 peripheral ========== -#define AT91C_CAN0_MB3_MDH ((AT91_REG *) 0xFFF80278) // (CAN0_MB3) MailBox Data High Register -#define AT91C_CAN0_MB3_MSR ((AT91_REG *) 0xFFF80270) // (CAN0_MB3) MailBox Status Register -#define AT91C_CAN0_MB3_MID ((AT91_REG *) 0xFFF80268) // (CAN0_MB3) MailBox ID Register -#define AT91C_CAN0_MB3_MMR ((AT91_REG *) 0xFFF80260) // (CAN0_MB3) MailBox Mode Register -#define AT91C_CAN0_MB3_MCR ((AT91_REG *) 0xFFF8027C) // (CAN0_MB3) MailBox Control Register -#define AT91C_CAN0_MB3_MDL ((AT91_REG *) 0xFFF80274) // (CAN0_MB3) MailBox Data Low Register -#define AT91C_CAN0_MB3_MFID ((AT91_REG *) 0xFFF8026C) // (CAN0_MB3) MailBox Family ID Register -#define AT91C_CAN0_MB3_MAM ((AT91_REG *) 0xFFF80264) // (CAN0_MB3) MailBox Acceptance Mask Register -// ========== Register definition for CAN0_MB4 peripheral ========== -#define AT91C_CAN0_MB4_MDH ((AT91_REG *) 0xFFF80298) // (CAN0_MB4) MailBox Data High Register -#define AT91C_CAN0_MB4_MSR ((AT91_REG *) 0xFFF80290) // (CAN0_MB4) MailBox Status Register -#define AT91C_CAN0_MB4_MID ((AT91_REG *) 0xFFF80288) // (CAN0_MB4) MailBox ID Register -#define AT91C_CAN0_MB4_MMR ((AT91_REG *) 0xFFF80280) // (CAN0_MB4) MailBox Mode Register -#define AT91C_CAN0_MB4_MCR ((AT91_REG *) 0xFFF8029C) // (CAN0_MB4) MailBox Control Register -#define AT91C_CAN0_MB4_MDL ((AT91_REG *) 0xFFF80294) // (CAN0_MB4) MailBox Data Low Register -#define AT91C_CAN0_MB4_MFID ((AT91_REG *) 0xFFF8028C) // (CAN0_MB4) MailBox Family ID Register -#define AT91C_CAN0_MB4_MAM ((AT91_REG *) 0xFFF80284) // (CAN0_MB4) MailBox Acceptance Mask Register -// ========== Register definition for CAN0_MB5 peripheral ========== -#define AT91C_CAN0_MB5_MSR ((AT91_REG *) 0xFFF802B0) // (CAN0_MB5) MailBox Status Register -#define AT91C_CAN0_MB5_MID ((AT91_REG *) 0xFFF802A8) // (CAN0_MB5) MailBox ID Register -#define AT91C_CAN0_MB5_MMR ((AT91_REG *) 0xFFF802A0) // (CAN0_MB5) MailBox Mode Register -#define AT91C_CAN0_MB5_MCR ((AT91_REG *) 0xFFF802BC) // (CAN0_MB5) MailBox Control Register -#define AT91C_CAN0_MB5_MDL ((AT91_REG *) 0xFFF802B4) // (CAN0_MB5) MailBox Data Low Register -#define AT91C_CAN0_MB5_MFID ((AT91_REG *) 0xFFF802AC) // (CAN0_MB5) MailBox Family ID Register -#define AT91C_CAN0_MB5_MAM ((AT91_REG *) 0xFFF802A4) // (CAN0_MB5) MailBox Acceptance Mask Register -#define AT91C_CAN0_MB5_MDH ((AT91_REG *) 0xFFF802B8) // (CAN0_MB5) MailBox Data High Register -// ========== Register definition for CAN0_MB6 peripheral ========== -#define AT91C_CAN0_MB6_MCR ((AT91_REG *) 0xFFF802DC) // (CAN0_MB6) MailBox Control Register -#define AT91C_CAN0_MB6_MDL ((AT91_REG *) 0xFFF802D4) // (CAN0_MB6) MailBox Data Low Register -#define AT91C_CAN0_MB6_MFID ((AT91_REG *) 0xFFF802CC) // (CAN0_MB6) MailBox Family ID Register -#define AT91C_CAN0_MB6_MAM ((AT91_REG *) 0xFFF802C4) // (CAN0_MB6) MailBox Acceptance Mask Register -#define AT91C_CAN0_MB6_MDH ((AT91_REG *) 0xFFF802D8) // (CAN0_MB6) MailBox Data High Register -#define AT91C_CAN0_MB6_MSR ((AT91_REG *) 0xFFF802D0) // (CAN0_MB6) MailBox Status Register -#define AT91C_CAN0_MB6_MID ((AT91_REG *) 0xFFF802C8) // (CAN0_MB6) MailBox ID Register -#define AT91C_CAN0_MB6_MMR ((AT91_REG *) 0xFFF802C0) // (CAN0_MB6) MailBox Mode Register -// ========== Register definition for CAN0_MB7 peripheral ========== -#define AT91C_CAN0_MB7_MCR ((AT91_REG *) 0xFFF802FC) // (CAN0_MB7) MailBox Control Register -#define AT91C_CAN0_MB7_MDL ((AT91_REG *) 0xFFF802F4) // (CAN0_MB7) MailBox Data Low Register -#define AT91C_CAN0_MB7_MFID ((AT91_REG *) 0xFFF802EC) // (CAN0_MB7) MailBox Family ID Register -#define AT91C_CAN0_MB7_MAM ((AT91_REG *) 0xFFF802E4) // (CAN0_MB7) MailBox Acceptance Mask Register -#define AT91C_CAN0_MB7_MDH ((AT91_REG *) 0xFFF802F8) // (CAN0_MB7) MailBox Data High Register -#define AT91C_CAN0_MB7_MSR ((AT91_REG *) 0xFFF802F0) // (CAN0_MB7) MailBox Status Register -#define AT91C_CAN0_MB7_MID ((AT91_REG *) 0xFFF802E8) // (CAN0_MB7) MailBox ID Register -#define AT91C_CAN0_MB7_MMR ((AT91_REG *) 0xFFF802E0) // (CAN0_MB7) MailBox Mode Register -// ========== Register definition for CAN0_MB8 peripheral ========== -#define AT91C_CAN0_MB8_MCR ((AT91_REG *) 0xFFF8031C) // (CAN0_MB8) MailBox Control Register -#define AT91C_CAN0_MB8_MDL ((AT91_REG *) 0xFFF80314) // (CAN0_MB8) MailBox Data Low Register -#define AT91C_CAN0_MB8_MFID ((AT91_REG *) 0xFFF8030C) // (CAN0_MB8) MailBox Family ID Register -#define AT91C_CAN0_MB8_MAM ((AT91_REG *) 0xFFF80304) // (CAN0_MB8) MailBox Acceptance Mask Register -#define AT91C_CAN0_MB8_MDH ((AT91_REG *) 0xFFF80318) // (CAN0_MB8) MailBox Data High Register -#define AT91C_CAN0_MB8_MMR ((AT91_REG *) 0xFFF80300) // (CAN0_MB8) MailBox Mode Register -#define AT91C_CAN0_MB8_MID ((AT91_REG *) 0xFFF80308) // (CAN0_MB8) MailBox ID Register -#define AT91C_CAN0_MB8_MSR ((AT91_REG *) 0xFFF80310) // (CAN0_MB8) MailBox Status Register -// ========== Register definition for CAN0_MB9 peripheral ========== -#define AT91C_CAN0_MB9_MCR ((AT91_REG *) 0xFFF8033C) // (CAN0_MB9) MailBox Control Register -#define AT91C_CAN0_MB9_MDL ((AT91_REG *) 0xFFF80334) // (CAN0_MB9) MailBox Data Low Register -#define AT91C_CAN0_MB9_MFID ((AT91_REG *) 0xFFF8032C) // (CAN0_MB9) MailBox Family ID Register -#define AT91C_CAN0_MB9_MAM ((AT91_REG *) 0xFFF80324) // (CAN0_MB9) MailBox Acceptance Mask Register -#define AT91C_CAN0_MB9_MDH ((AT91_REG *) 0xFFF80338) // (CAN0_MB9) MailBox Data High Register -#define AT91C_CAN0_MB9_MSR ((AT91_REG *) 0xFFF80330) // (CAN0_MB9) MailBox Status Register -#define AT91C_CAN0_MB9_MID ((AT91_REG *) 0xFFF80328) // (CAN0_MB9) MailBox ID Register -#define AT91C_CAN0_MB9_MMR ((AT91_REG *) 0xFFF80320) // (CAN0_MB9) MailBox Mode Register -// ========== Register definition for CAN0_MB10 peripheral ========== -#define AT91C_CAN0_MB10_MCR ((AT91_REG *) 0xFFF8035C) // (CAN0_MB10) MailBox Control Register -#define AT91C_CAN0_MB10_MDL ((AT91_REG *) 0xFFF80354) // (CAN0_MB10) MailBox Data Low Register -#define AT91C_CAN0_MB10_MFID ((AT91_REG *) 0xFFF8034C) // (CAN0_MB10) MailBox Family ID Register -#define AT91C_CAN0_MB10_MAM ((AT91_REG *) 0xFFF80344) // (CAN0_MB10) MailBox Acceptance Mask Register -#define AT91C_CAN0_MB10_MDH ((AT91_REG *) 0xFFF80358) // (CAN0_MB10) MailBox Data High Register -#define AT91C_CAN0_MB10_MSR ((AT91_REG *) 0xFFF80350) // (CAN0_MB10) MailBox Status Register -#define AT91C_CAN0_MB10_MID ((AT91_REG *) 0xFFF80348) // (CAN0_MB10) MailBox ID Register -#define AT91C_CAN0_MB10_MMR ((AT91_REG *) 0xFFF80340) // (CAN0_MB10) MailBox Mode Register -// ========== Register definition for CAN0_MB11 peripheral ========== -#define AT91C_CAN0_MB11_MCR ((AT91_REG *) 0xFFF8037C) // (CAN0_MB11) MailBox Control Register -#define AT91C_CAN0_MB11_MDL ((AT91_REG *) 0xFFF80374) // (CAN0_MB11) MailBox Data Low Register -#define AT91C_CAN0_MB11_MFID ((AT91_REG *) 0xFFF8036C) // (CAN0_MB11) MailBox Family ID Register -#define AT91C_CAN0_MB11_MAM ((AT91_REG *) 0xFFF80364) // (CAN0_MB11) MailBox Acceptance Mask Register -#define AT91C_CAN0_MB11_MDH ((AT91_REG *) 0xFFF80378) // (CAN0_MB11) MailBox Data High Register -#define AT91C_CAN0_MB11_MSR ((AT91_REG *) 0xFFF80370) // (CAN0_MB11) MailBox Status Register -#define AT91C_CAN0_MB11_MMR ((AT91_REG *) 0xFFF80360) // (CAN0_MB11) MailBox Mode Register -#define AT91C_CAN0_MB11_MID ((AT91_REG *) 0xFFF80368) // (CAN0_MB11) MailBox ID Register -// ========== Register definition for CAN0_MB12 peripheral ========== -#define AT91C_CAN0_MB12_MCR ((AT91_REG *) 0xFFF8039C) // (CAN0_MB12) MailBox Control Register -#define AT91C_CAN0_MB12_MDL ((AT91_REG *) 0xFFF80394) // (CAN0_MB12) MailBox Data Low Register -#define AT91C_CAN0_MB12_MFID ((AT91_REG *) 0xFFF8038C) // (CAN0_MB12) MailBox Family ID Register -#define AT91C_CAN0_MB12_MAM ((AT91_REG *) 0xFFF80384) // (CAN0_MB12) MailBox Acceptance Mask Register -#define AT91C_CAN0_MB12_MDH ((AT91_REG *) 0xFFF80398) // (CAN0_MB12) MailBox Data High Register -#define AT91C_CAN0_MB12_MSR ((AT91_REG *) 0xFFF80390) // (CAN0_MB12) MailBox Status Register -#define AT91C_CAN0_MB12_MID ((AT91_REG *) 0xFFF80388) // (CAN0_MB12) MailBox ID Register -#define AT91C_CAN0_MB12_MMR ((AT91_REG *) 0xFFF80380) // (CAN0_MB12) MailBox Mode Register -// ========== Register definition for CAN0_MB13 peripheral ========== -#define AT91C_CAN0_MB13_MCR ((AT91_REG *) 0xFFF803BC) // (CAN0_MB13) MailBox Control Register -#define AT91C_CAN0_MB13_MDL ((AT91_REG *) 0xFFF803B4) // (CAN0_MB13) MailBox Data Low Register -#define AT91C_CAN0_MB13_MFID ((AT91_REG *) 0xFFF803AC) // (CAN0_MB13) MailBox Family ID Register -#define AT91C_CAN0_MB13_MAM ((AT91_REG *) 0xFFF803A4) // (CAN0_MB13) MailBox Acceptance Mask Register -#define AT91C_CAN0_MB13_MDH ((AT91_REG *) 0xFFF803B8) // (CAN0_MB13) MailBox Data High Register -#define AT91C_CAN0_MB13_MSR ((AT91_REG *) 0xFFF803B0) // (CAN0_MB13) MailBox Status Register -#define AT91C_CAN0_MB13_MID ((AT91_REG *) 0xFFF803A8) // (CAN0_MB13) MailBox ID Register -#define AT91C_CAN0_MB13_MMR ((AT91_REG *) 0xFFF803A0) // (CAN0_MB13) MailBox Mode Register -// ========== Register definition for CAN0_MB14 peripheral ========== -#define AT91C_CAN0_MB14_MCR ((AT91_REG *) 0xFFF803DC) // (CAN0_MB14) MailBox Control Register -#define AT91C_CAN0_MB14_MDL ((AT91_REG *) 0xFFF803D4) // (CAN0_MB14) MailBox Data Low Register -#define AT91C_CAN0_MB14_MFID ((AT91_REG *) 0xFFF803CC) // (CAN0_MB14) MailBox Family ID Register -#define AT91C_CAN0_MB14_MAM ((AT91_REG *) 0xFFF803C4) // (CAN0_MB14) MailBox Acceptance Mask Register -#define AT91C_CAN0_MB14_MDH ((AT91_REG *) 0xFFF803D8) // (CAN0_MB14) MailBox Data High Register -#define AT91C_CAN0_MB14_MSR ((AT91_REG *) 0xFFF803D0) // (CAN0_MB14) MailBox Status Register -#define AT91C_CAN0_MB14_MID ((AT91_REG *) 0xFFF803C8) // (CAN0_MB14) MailBox ID Register -#define AT91C_CAN0_MB14_MMR ((AT91_REG *) 0xFFF803C0) // (CAN0_MB14) MailBox Mode Register -// ========== Register definition for CAN0_MB15 peripheral ========== -#define AT91C_CAN0_MB15_MMR ((AT91_REG *) 0xFFF803E0) // (CAN0_MB15) MailBox Mode Register -#define AT91C_CAN0_MB15_MDH ((AT91_REG *) 0xFFF803F8) // (CAN0_MB15) MailBox Data High Register -#define AT91C_CAN0_MB15_MSR ((AT91_REG *) 0xFFF803F0) // (CAN0_MB15) MailBox Status Register -#define AT91C_CAN0_MB15_MID ((AT91_REG *) 0xFFF803E8) // (CAN0_MB15) MailBox ID Register -#define AT91C_CAN0_MB15_MCR ((AT91_REG *) 0xFFF803FC) // (CAN0_MB15) MailBox Control Register -#define AT91C_CAN0_MB15_MDL ((AT91_REG *) 0xFFF803F4) // (CAN0_MB15) MailBox Data Low Register -#define AT91C_CAN0_MB15_MFID ((AT91_REG *) 0xFFF803EC) // (CAN0_MB15) MailBox Family ID Register -#define AT91C_CAN0_MB15_MAM ((AT91_REG *) 0xFFF803E4) // (CAN0_MB15) MailBox Acceptance Mask Register -// ========== Register definition for CAN0 peripheral ========== -#define AT91C_CAN0_TCR ((AT91_REG *) 0xFFF80024) // (CAN0) Transfer Command Register -#define AT91C_CAN0_TIMESTP ((AT91_REG *) 0xFFF8001C) // (CAN0) Time Stamp Register -#define AT91C_CAN0_BR ((AT91_REG *) 0xFFF80014) // (CAN0) Baudrate Register -#define AT91C_CAN0_ACR ((AT91_REG *) 0xFFF80028) // (CAN0) Abort Command Register -#define AT91C_CAN0_VR ((AT91_REG *) 0xFFF800FC) // (CAN0) Version Register -#define AT91C_CAN0_IER ((AT91_REG *) 0xFFF80004) // (CAN0) Interrupt Enable Register -#define AT91C_CAN0_IMR ((AT91_REG *) 0xFFF8000C) // (CAN0) Interrupt Mask Register -#define AT91C_CAN0_MR ((AT91_REG *) 0xFFF80000) // (CAN0) Mode Register -#define AT91C_CAN0_IDR ((AT91_REG *) 0xFFF80008) // (CAN0) Interrupt Disable Register -#define AT91C_CAN0_SR ((AT91_REG *) 0xFFF80010) // (CAN0) Status Register -#define AT91C_CAN0_TIM ((AT91_REG *) 0xFFF80018) // (CAN0) Timer Register -#define AT91C_CAN0_ECR ((AT91_REG *) 0xFFF80020) // (CAN0) Error Counter Register -// ========== Register definition for CAN1_MB0 peripheral ========== -#define AT91C_CAN1_MB0_MDH ((AT91_REG *) 0xFFF84218) // (CAN1_MB0) MailBox Data High Register -#define AT91C_CAN1_MB0_MSR ((AT91_REG *) 0xFFF84210) // (CAN1_MB0) MailBox Status Register -#define AT91C_CAN1_MB0_MID ((AT91_REG *) 0xFFF84208) // (CAN1_MB0) MailBox ID Register -#define AT91C_CAN1_MB0_MMR ((AT91_REG *) 0xFFF84200) // (CAN1_MB0) MailBox Mode Register -#define AT91C_CAN1_MB0_MCR ((AT91_REG *) 0xFFF8421C) // (CAN1_MB0) MailBox Control Register -#define AT91C_CAN1_MB0_MDL ((AT91_REG *) 0xFFF84214) // (CAN1_MB0) MailBox Data Low Register -#define AT91C_CAN1_MB0_MFID ((AT91_REG *) 0xFFF8420C) // (CAN1_MB0) MailBox Family ID Register -#define AT91C_CAN1_MB0_MAM ((AT91_REG *) 0xFFF84204) // (CAN1_MB0) MailBox Acceptance Mask Register -// ========== Register definition for CAN1_MB1 peripheral ========== -#define AT91C_CAN1_MB1_MDH ((AT91_REG *) 0xFFF84238) // (CAN1_MB1) MailBox Data High Register -#define AT91C_CAN1_MB1_MSR ((AT91_REG *) 0xFFF84230) // (CAN1_MB1) MailBox Status Register -#define AT91C_CAN1_MB1_MID ((AT91_REG *) 0xFFF84228) // (CAN1_MB1) MailBox ID Register -#define AT91C_CAN1_MB1_MMR ((AT91_REG *) 0xFFF84220) // (CAN1_MB1) MailBox Mode Register -#define AT91C_CAN1_MB1_MCR ((AT91_REG *) 0xFFF8423C) // (CAN1_MB1) MailBox Control Register -#define AT91C_CAN1_MB1_MDL ((AT91_REG *) 0xFFF84234) // (CAN1_MB1) MailBox Data Low Register -#define AT91C_CAN1_MB1_MFID ((AT91_REG *) 0xFFF8422C) // (CAN1_MB1) MailBox Family ID Register -#define AT91C_CAN1_MB1_MAM ((AT91_REG *) 0xFFF84224) // (CAN1_MB1) MailBox Acceptance Mask Register -// ========== Register definition for CAN1_MB2 peripheral ========== -#define AT91C_CAN1_MB2_MDH ((AT91_REG *) 0xFFF84258) // (CAN1_MB2) MailBox Data High Register -#define AT91C_CAN1_MB2_MSR ((AT91_REG *) 0xFFF84250) // (CAN1_MB2) MailBox Status Register -#define AT91C_CAN1_MB2_MID ((AT91_REG *) 0xFFF84248) // (CAN1_MB2) MailBox ID Register -#define AT91C_CAN1_MB2_MMR ((AT91_REG *) 0xFFF84240) // (CAN1_MB2) MailBox Mode Register -#define AT91C_CAN1_MB2_MCR ((AT91_REG *) 0xFFF8425C) // (CAN1_MB2) MailBox Control Register -#define AT91C_CAN1_MB2_MDL ((AT91_REG *) 0xFFF84254) // (CAN1_MB2) MailBox Data Low Register -#define AT91C_CAN1_MB2_MFID ((AT91_REG *) 0xFFF8424C) // (CAN1_MB2) MailBox Family ID Register -#define AT91C_CAN1_MB2_MAM ((AT91_REG *) 0xFFF84244) // (CAN1_MB2) MailBox Acceptance Mask Register -// ========== Register definition for CAN1_MB3 peripheral ========== -#define AT91C_CAN1_MB3_MCR ((AT91_REG *) 0xFFF8427C) // (CAN1_MB3) MailBox Control Register -#define AT91C_CAN1_MB3_MFID ((AT91_REG *) 0xFFF8426C) // (CAN1_MB3) MailBox Family ID Register -#define AT91C_CAN1_MB3_MAM ((AT91_REG *) 0xFFF84264) // (CAN1_MB3) MailBox Acceptance Mask Register -#define AT91C_CAN1_MB3_MMR ((AT91_REG *) 0xFFF84260) // (CAN1_MB3) MailBox Mode Register -#define AT91C_CAN1_MB3_MDH ((AT91_REG *) 0xFFF84278) // (CAN1_MB3) MailBox Data High Register -#define AT91C_CAN1_MB3_MSR ((AT91_REG *) 0xFFF84270) // (CAN1_MB3) MailBox Status Register -#define AT91C_CAN1_MB3_MID ((AT91_REG *) 0xFFF84268) // (CAN1_MB3) MailBox ID Register -#define AT91C_CAN1_MB3_MDL ((AT91_REG *) 0xFFF84274) // (CAN1_MB3) MailBox Data Low Register -// ========== Register definition for CAN1_MB4 peripheral ========== -#define AT91C_CAN1_MB4_MCR ((AT91_REG *) 0xFFF8429C) // (CAN1_MB4) MailBox Control Register -#define AT91C_CAN1_MB4_MDL ((AT91_REG *) 0xFFF84294) // (CAN1_MB4) MailBox Data Low Register -#define AT91C_CAN1_MB4_MFID ((AT91_REG *) 0xFFF8428C) // (CAN1_MB4) MailBox Family ID Register -#define AT91C_CAN1_MB4_MAM ((AT91_REG *) 0xFFF84284) // (CAN1_MB4) MailBox Acceptance Mask Register -#define AT91C_CAN1_MB4_MDH ((AT91_REG *) 0xFFF84298) // (CAN1_MB4) MailBox Data High Register -#define AT91C_CAN1_MB4_MSR ((AT91_REG *) 0xFFF84290) // (CAN1_MB4) MailBox Status Register -#define AT91C_CAN1_MB4_MID ((AT91_REG *) 0xFFF84288) // (CAN1_MB4) MailBox ID Register -#define AT91C_CAN1_MB4_MMR ((AT91_REG *) 0xFFF84280) // (CAN1_MB4) MailBox Mode Register -// ========== Register definition for CAN1_MB5 peripheral ========== -#define AT91C_CAN1_MB5_MCR ((AT91_REG *) 0xFFF842BC) // (CAN1_MB5) MailBox Control Register -#define AT91C_CAN1_MB5_MDL ((AT91_REG *) 0xFFF842B4) // (CAN1_MB5) MailBox Data Low Register -#define AT91C_CAN1_MB5_MFID ((AT91_REG *) 0xFFF842AC) // (CAN1_MB5) MailBox Family ID Register -#define AT91C_CAN1_MB5_MAM ((AT91_REG *) 0xFFF842A4) // (CAN1_MB5) MailBox Acceptance Mask Register -#define AT91C_CAN1_MB5_MDH ((AT91_REG *) 0xFFF842B8) // (CAN1_MB5) MailBox Data High Register -#define AT91C_CAN1_MB5_MSR ((AT91_REG *) 0xFFF842B0) // (CAN1_MB5) MailBox Status Register -#define AT91C_CAN1_MB5_MID ((AT91_REG *) 0xFFF842A8) // (CAN1_MB5) MailBox ID Register -#define AT91C_CAN1_MB5_MMR ((AT91_REG *) 0xFFF842A0) // (CAN1_MB5) MailBox Mode Register -// ========== Register definition for CAN1_MB6 peripheral ========== -#define AT91C_CAN1_MB6_MDH ((AT91_REG *) 0xFFF842D8) // (CAN1_MB6) MailBox Data High Register -#define AT91C_CAN1_MB6_MSR ((AT91_REG *) 0xFFF842D0) // (CAN1_MB6) MailBox Status Register -#define AT91C_CAN1_MB6_MID ((AT91_REG *) 0xFFF842C8) // (CAN1_MB6) MailBox ID Register -#define AT91C_CAN1_MB6_MMR ((AT91_REG *) 0xFFF842C0) // (CAN1_MB6) MailBox Mode Register -#define AT91C_CAN1_MB6_MAM ((AT91_REG *) 0xFFF842C4) // (CAN1_MB6) MailBox Acceptance Mask Register -#define AT91C_CAN1_MB6_MCR ((AT91_REG *) 0xFFF842DC) // (CAN1_MB6) MailBox Control Register -#define AT91C_CAN1_MB6_MDL ((AT91_REG *) 0xFFF842D4) // (CAN1_MB6) MailBox Data Low Register -#define AT91C_CAN1_MB6_MFID ((AT91_REG *) 0xFFF842CC) // (CAN1_MB6) MailBox Family ID Register -// ========== Register definition for CAN1_MB7 peripheral ========== -#define AT91C_CAN1_MB7_MDH ((AT91_REG *) 0xFFF842F8) // (CAN1_MB7) MailBox Data High Register -#define AT91C_CAN1_MB7_MSR ((AT91_REG *) 0xFFF842F0) // (CAN1_MB7) MailBox Status Register -#define AT91C_CAN1_MB7_MID ((AT91_REG *) 0xFFF842E8) // (CAN1_MB7) MailBox ID Register -#define AT91C_CAN1_MB7_MMR ((AT91_REG *) 0xFFF842E0) // (CAN1_MB7) MailBox Mode Register -#define AT91C_CAN1_MB7_MCR ((AT91_REG *) 0xFFF842FC) // (CAN1_MB7) MailBox Control Register -#define AT91C_CAN1_MB7_MDL ((AT91_REG *) 0xFFF842F4) // (CAN1_MB7) MailBox Data Low Register -#define AT91C_CAN1_MB7_MFID ((AT91_REG *) 0xFFF842EC) // (CAN1_MB7) MailBox Family ID Register -#define AT91C_CAN1_MB7_MAM ((AT91_REG *) 0xFFF842E4) // (CAN1_MB7) MailBox Acceptance Mask Register -// ========== Register definition for CAN1_MB8 peripheral ========== -#define AT91C_CAN1_MB8_MDH ((AT91_REG *) 0xFFF84318) // (CAN1_MB8) MailBox Data High Register -#define AT91C_CAN1_MB8_MSR ((AT91_REG *) 0xFFF84310) // (CAN1_MB8) MailBox Status Register -#define AT91C_CAN1_MB8_MID ((AT91_REG *) 0xFFF84308) // (CAN1_MB8) MailBox ID Register -#define AT91C_CAN1_MB8_MMR ((AT91_REG *) 0xFFF84300) // (CAN1_MB8) MailBox Mode Register -#define AT91C_CAN1_MB8_MCR ((AT91_REG *) 0xFFF8431C) // (CAN1_MB8) MailBox Control Register -#define AT91C_CAN1_MB8_MDL ((AT91_REG *) 0xFFF84314) // (CAN1_MB8) MailBox Data Low Register -#define AT91C_CAN1_MB8_MFID ((AT91_REG *) 0xFFF8430C) // (CAN1_MB8) MailBox Family ID Register -#define AT91C_CAN1_MB8_MAM ((AT91_REG *) 0xFFF84304) // (CAN1_MB8) MailBox Acceptance Mask Register -// ========== Register definition for CAN1_MB9 peripheral ========== -#define AT91C_CAN1_MB9_MID ((AT91_REG *) 0xFFF84328) // (CAN1_MB9) MailBox ID Register -#define AT91C_CAN1_MB9_MDH ((AT91_REG *) 0xFFF84338) // (CAN1_MB9) MailBox Data High Register -#define AT91C_CAN1_MB9_MSR ((AT91_REG *) 0xFFF84330) // (CAN1_MB9) MailBox Status Register -#define AT91C_CAN1_MB9_MMR ((AT91_REG *) 0xFFF84320) // (CAN1_MB9) MailBox Mode Register -#define AT91C_CAN1_MB9_MCR ((AT91_REG *) 0xFFF8433C) // (CAN1_MB9) MailBox Control Register -#define AT91C_CAN1_MB9_MDL ((AT91_REG *) 0xFFF84334) // (CAN1_MB9) MailBox Data Low Register -#define AT91C_CAN1_MB9_MFID ((AT91_REG *) 0xFFF8432C) // (CAN1_MB9) MailBox Family ID Register -#define AT91C_CAN1_MB9_MAM ((AT91_REG *) 0xFFF84324) // (CAN1_MB9) MailBox Acceptance Mask Register -// ========== Register definition for CAN1_MB10 peripheral ========== -#define AT91C_CAN1_MB10_MDH ((AT91_REG *) 0xFFF84358) // (CAN1_MB10) MailBox Data High Register -#define AT91C_CAN1_MB10_MSR ((AT91_REG *) 0xFFF84350) // (CAN1_MB10) MailBox Status Register -#define AT91C_CAN1_MB10_MID ((AT91_REG *) 0xFFF84348) // (CAN1_MB10) MailBox ID Register -#define AT91C_CAN1_MB10_MMR ((AT91_REG *) 0xFFF84340) // (CAN1_MB10) MailBox Mode Register -#define AT91C_CAN1_MB10_MCR ((AT91_REG *) 0xFFF8435C) // (CAN1_MB10) MailBox Control Register -#define AT91C_CAN1_MB10_MDL ((AT91_REG *) 0xFFF84354) // (CAN1_MB10) MailBox Data Low Register -#define AT91C_CAN1_MB10_MFID ((AT91_REG *) 0xFFF8434C) // (CAN1_MB10) MailBox Family ID Register -#define AT91C_CAN1_MB10_MAM ((AT91_REG *) 0xFFF84344) // (CAN1_MB10) MailBox Acceptance Mask Register -// ========== Register definition for CAN1_MB11 peripheral ========== -#define AT91C_CAN1_MB11_MDH ((AT91_REG *) 0xFFF84378) // (CAN1_MB11) MailBox Data High Register -#define AT91C_CAN1_MB11_MSR ((AT91_REG *) 0xFFF84370) // (CAN1_MB11) MailBox Status Register -#define AT91C_CAN1_MB11_MID ((AT91_REG *) 0xFFF84368) // (CAN1_MB11) MailBox ID Register -#define AT91C_CAN1_MB11_MMR ((AT91_REG *) 0xFFF84360) // (CAN1_MB11) MailBox Mode Register -#define AT91C_CAN1_MB11_MCR ((AT91_REG *) 0xFFF8437C) // (CAN1_MB11) MailBox Control Register -#define AT91C_CAN1_MB11_MDL ((AT91_REG *) 0xFFF84374) // (CAN1_MB11) MailBox Data Low Register -#define AT91C_CAN1_MB11_MFID ((AT91_REG *) 0xFFF8436C) // (CAN1_MB11) MailBox Family ID Register -#define AT91C_CAN1_MB11_MAM ((AT91_REG *) 0xFFF84364) // (CAN1_MB11) MailBox Acceptance Mask Register -// ========== Register definition for CAN1_MB12 peripheral ========== -#define AT91C_CAN1_MB12_MDH ((AT91_REG *) 0xFFF84398) // (CAN1_MB12) MailBox Data High Register -#define AT91C_CAN1_MB12_MSR ((AT91_REG *) 0xFFF84390) // (CAN1_MB12) MailBox Status Register -#define AT91C_CAN1_MB12_MID ((AT91_REG *) 0xFFF84388) // (CAN1_MB12) MailBox ID Register -#define AT91C_CAN1_MB12_MMR ((AT91_REG *) 0xFFF84380) // (CAN1_MB12) MailBox Mode Register -#define AT91C_CAN1_MB12_MCR ((AT91_REG *) 0xFFF8439C) // (CAN1_MB12) MailBox Control Register -#define AT91C_CAN1_MB12_MDL ((AT91_REG *) 0xFFF84394) // (CAN1_MB12) MailBox Data Low Register -#define AT91C_CAN1_MB12_MFID ((AT91_REG *) 0xFFF8438C) // (CAN1_MB12) MailBox Family ID Register -#define AT91C_CAN1_MB12_MAM ((AT91_REG *) 0xFFF84384) // (CAN1_MB12) MailBox Acceptance Mask Register -// ========== Register definition for CAN1_MB13 peripheral ========== -#define AT91C_CAN1_MB13_MDH ((AT91_REG *) 0xFFF843B8) // (CAN1_MB13) MailBox Data High Register -#define AT91C_CAN1_MB13_MSR ((AT91_REG *) 0xFFF843B0) // (CAN1_MB13) MailBox Status Register -#define AT91C_CAN1_MB13_MID ((AT91_REG *) 0xFFF843A8) // (CAN1_MB13) MailBox ID Register -#define AT91C_CAN1_MB13_MMR ((AT91_REG *) 0xFFF843A0) // (CAN1_MB13) MailBox Mode Register -#define AT91C_CAN1_MB13_MCR ((AT91_REG *) 0xFFF843BC) // (CAN1_MB13) MailBox Control Register -#define AT91C_CAN1_MB13_MDL ((AT91_REG *) 0xFFF843B4) // (CAN1_MB13) MailBox Data Low Register -#define AT91C_CAN1_MB13_MFID ((AT91_REG *) 0xFFF843AC) // (CAN1_MB13) MailBox Family ID Register -#define AT91C_CAN1_MB13_MAM ((AT91_REG *) 0xFFF843A4) // (CAN1_MB13) MailBox Acceptance Mask Register -// ========== Register definition for CAN1_MB14 peripheral ========== -#define AT91C_CAN1_MB14_MDH ((AT91_REG *) 0xFFF843D8) // (CAN1_MB14) MailBox Data High Register -#define AT91C_CAN1_MB14_MSR ((AT91_REG *) 0xFFF843D0) // (CAN1_MB14) MailBox Status Register -#define AT91C_CAN1_MB14_MID ((AT91_REG *) 0xFFF843C8) // (CAN1_MB14) MailBox ID Register -#define AT91C_CAN1_MB14_MMR ((AT91_REG *) 0xFFF843C0) // (CAN1_MB14) MailBox Mode Register -#define AT91C_CAN1_MB14_MCR ((AT91_REG *) 0xFFF843DC) // (CAN1_MB14) MailBox Control Register -#define AT91C_CAN1_MB14_MDL ((AT91_REG *) 0xFFF843D4) // (CAN1_MB14) MailBox Data Low Register -#define AT91C_CAN1_MB14_MFID ((AT91_REG *) 0xFFF843CC) // (CAN1_MB14) MailBox Family ID Register -#define AT91C_CAN1_MB14_MAM ((AT91_REG *) 0xFFF843C4) // (CAN1_MB14) MailBox Acceptance Mask Register -// ========== Register definition for CAN1_MB15 peripheral ========== -#define AT91C_CAN1_MB15_MDH ((AT91_REG *) 0xFFF843F8) // (CAN1_MB15) MailBox Data High Register -#define AT91C_CAN1_MB15_MSR ((AT91_REG *) 0xFFF843F0) // (CAN1_MB15) MailBox Status Register -#define AT91C_CAN1_MB15_MID ((AT91_REG *) 0xFFF843E8) // (CAN1_MB15) MailBox ID Register -#define AT91C_CAN1_MB15_MMR ((AT91_REG *) 0xFFF843E0) // (CAN1_MB15) MailBox Mode Register -#define AT91C_CAN1_MB15_MCR ((AT91_REG *) 0xFFF843FC) // (CAN1_MB15) MailBox Control Register -#define AT91C_CAN1_MB15_MDL ((AT91_REG *) 0xFFF843F4) // (CAN1_MB15) MailBox Data Low Register -#define AT91C_CAN1_MB15_MFID ((AT91_REG *) 0xFFF843EC) // (CAN1_MB15) MailBox Family ID Register -#define AT91C_CAN1_MB15_MAM ((AT91_REG *) 0xFFF843E4) // (CAN1_MB15) MailBox Acceptance Mask Register -// ========== Register definition for CAN1 peripheral ========== -#define AT91C_CAN1_MR ((AT91_REG *) 0xFFF84000) // (CAN1) Mode Register -#define AT91C_CAN1_VR ((AT91_REG *) 0xFFF840FC) // (CAN1) Version Register -#define AT91C_CAN1_TIMESTP ((AT91_REG *) 0xFFF8401C) // (CAN1) Time Stamp Register -#define AT91C_CAN1_BR ((AT91_REG *) 0xFFF84014) // (CAN1) Baudrate Register -#define AT91C_CAN1_IMR ((AT91_REG *) 0xFFF8400C) // (CAN1) Interrupt Mask Register -#define AT91C_CAN1_IER ((AT91_REG *) 0xFFF84004) // (CAN1) Interrupt Enable Register -#define AT91C_CAN1_ACR ((AT91_REG *) 0xFFF84028) // (CAN1) Abort Command Register -#define AT91C_CAN1_ECR ((AT91_REG *) 0xFFF84020) // (CAN1) Error Counter Register -#define AT91C_CAN1_TIM ((AT91_REG *) 0xFFF84018) // (CAN1) Timer Register -#define AT91C_CAN1_SR ((AT91_REG *) 0xFFF84010) // (CAN1) Status Register -#define AT91C_CAN1_TCR ((AT91_REG *) 0xFFF84024) // (CAN1) Transfer Command Register -#define AT91C_CAN1_IDR ((AT91_REG *) 0xFFF84008) // (CAN1) Interrupt Disable Register -// ========== Register definition for TC0 peripheral ========== -#define AT91C_TC0_IMR ((AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register -#define AT91C_TC0_IER ((AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register -#define AT91C_TC0_RC ((AT91_REG *) 0xFFFA001C) // (TC0) Register C -#define AT91C_TC0_RA ((AT91_REG *) 0xFFFA0014) // (TC0) Register A -#define AT91C_TC0_CMR ((AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC0_IDR ((AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register -#define AT91C_TC0_SR ((AT91_REG *) 0xFFFA0020) // (TC0) Status Register -#define AT91C_TC0_RB ((AT91_REG *) 0xFFFA0018) // (TC0) Register B -#define AT91C_TC0_CV ((AT91_REG *) 0xFFFA0010) // (TC0) Counter Value -#define AT91C_TC0_CCR ((AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register -// ========== Register definition for TC1 peripheral ========== -#define AT91C_TC1_IMR ((AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register -#define AT91C_TC1_IER ((AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register -#define AT91C_TC1_RC ((AT91_REG *) 0xFFFA005C) // (TC1) Register C -#define AT91C_TC1_RA ((AT91_REG *) 0xFFFA0054) // (TC1) Register A -#define AT91C_TC1_CMR ((AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC1_IDR ((AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register -#define AT91C_TC1_SR ((AT91_REG *) 0xFFFA0060) // (TC1) Status Register -#define AT91C_TC1_RB ((AT91_REG *) 0xFFFA0058) // (TC1) Register B -#define AT91C_TC1_CV ((AT91_REG *) 0xFFFA0050) // (TC1) Counter Value -#define AT91C_TC1_CCR ((AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register -// ========== Register definition for TC2 peripheral ========== -#define AT91C_TC2_IMR ((AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register -#define AT91C_TC2_IER ((AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register -#define AT91C_TC2_RC ((AT91_REG *) 0xFFFA009C) // (TC2) Register C -#define AT91C_TC2_RA ((AT91_REG *) 0xFFFA0094) // (TC2) Register A -#define AT91C_TC2_CMR ((AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC2_IDR ((AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register -#define AT91C_TC2_SR ((AT91_REG *) 0xFFFA00A0) // (TC2) Status Register -#define AT91C_TC2_RB ((AT91_REG *) 0xFFFA0098) // (TC2) Register B -#define AT91C_TC2_CV ((AT91_REG *) 0xFFFA0090) // (TC2) Counter Value -#define AT91C_TC2_CCR ((AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register -// ========== Register definition for TCB0 peripheral ========== -#define AT91C_TCB0_BMR ((AT91_REG *) 0xFFFA00C4) // (TCB0) TC Block Mode Register -#define AT91C_TCB0_BCR ((AT91_REG *) 0xFFFA00C0) // (TCB0) TC Block Control Register -// ========== Register definition for TC3 peripheral ========== -#define AT91C_TC3_IMR ((AT91_REG *) 0xFFFA402C) // (TC3) Interrupt Mask Register -#define AT91C_TC3_CV ((AT91_REG *) 0xFFFA4010) // (TC3) Counter Value -#define AT91C_TC3_CCR ((AT91_REG *) 0xFFFA4000) // (TC3) Channel Control Register -#define AT91C_TC3_IER ((AT91_REG *) 0xFFFA4024) // (TC3) Interrupt Enable Register -#define AT91C_TC3_CMR ((AT91_REG *) 0xFFFA4004) // (TC3) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC3_RA ((AT91_REG *) 0xFFFA4014) // (TC3) Register A -#define AT91C_TC3_RC ((AT91_REG *) 0xFFFA401C) // (TC3) Register C -#define AT91C_TC3_IDR ((AT91_REG *) 0xFFFA4028) // (TC3) Interrupt Disable Register -#define AT91C_TC3_RB ((AT91_REG *) 0xFFFA4018) // (TC3) Register B -#define AT91C_TC3_SR ((AT91_REG *) 0xFFFA4020) // (TC3) Status Register -// ========== Register definition for TC4 peripheral ========== -#define AT91C_TC4_IMR ((AT91_REG *) 0xFFFA406C) // (TC4) Interrupt Mask Register -#define AT91C_TC4_IER ((AT91_REG *) 0xFFFA4064) // (TC4) Interrupt Enable Register -#define AT91C_TC4_RC ((AT91_REG *) 0xFFFA405C) // (TC4) Register C -#define AT91C_TC4_RA ((AT91_REG *) 0xFFFA4054) // (TC4) Register A -#define AT91C_TC4_CMR ((AT91_REG *) 0xFFFA4044) // (TC4) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC4_IDR ((AT91_REG *) 0xFFFA4068) // (TC4) Interrupt Disable Register -#define AT91C_TC4_SR ((AT91_REG *) 0xFFFA4060) // (TC4) Status Register -#define AT91C_TC4_RB ((AT91_REG *) 0xFFFA4058) // (TC4) Register B -#define AT91C_TC4_CV ((AT91_REG *) 0xFFFA4050) // (TC4) Counter Value -#define AT91C_TC4_CCR ((AT91_REG *) 0xFFFA4040) // (TC4) Channel Control Register -// ========== Register definition for TC5 peripheral ========== -#define AT91C_TC5_CMR ((AT91_REG *) 0xFFFA4084) // (TC5) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC5_IDR ((AT91_REG *) 0xFFFA40A8) // (TC5) Interrupt Disable Register -#define AT91C_TC5_SR ((AT91_REG *) 0xFFFA40A0) // (TC5) Status Register -#define AT91C_TC5_RB ((AT91_REG *) 0xFFFA4098) // (TC5) Register B -#define AT91C_TC5_CV ((AT91_REG *) 0xFFFA4090) // (TC5) Counter Value -#define AT91C_TC5_CCR ((AT91_REG *) 0xFFFA4080) // (TC5) Channel Control Register -#define AT91C_TC5_IMR ((AT91_REG *) 0xFFFA40AC) // (TC5) Interrupt Mask Register -#define AT91C_TC5_IER ((AT91_REG *) 0xFFFA40A4) // (TC5) Interrupt Enable Register -#define AT91C_TC5_RC ((AT91_REG *) 0xFFFA409C) // (TC5) Register C -#define AT91C_TC5_RA ((AT91_REG *) 0xFFFA4094) // (TC5) Register A -// ========== Register definition for TCB1 peripheral ========== -#define AT91C_TCB1_BCR ((AT91_REG *) 0xFFFA40C0) // (TCB1) TC Block Control Register -#define AT91C_TCB1_BMR ((AT91_REG *) 0xFFFA40C4) // (TCB1) TC Block Mode Register -// ========== Register definition for TC6 peripheral ========== -#define AT91C_TC6_IDR ((AT91_REG *) 0xFFFA8028) // (TC6) Interrupt Disable Register -#define AT91C_TC6_SR ((AT91_REG *) 0xFFFA8020) // (TC6) Status Register -#define AT91C_TC6_RB ((AT91_REG *) 0xFFFA8018) // (TC6) Register B -#define AT91C_TC6_CV ((AT91_REG *) 0xFFFA8010) // (TC6) Counter Value -#define AT91C_TC6_CCR ((AT91_REG *) 0xFFFA8000) // (TC6) Channel Control Register -#define AT91C_TC6_IMR ((AT91_REG *) 0xFFFA802C) // (TC6) Interrupt Mask Register -#define AT91C_TC6_IER ((AT91_REG *) 0xFFFA8024) // (TC6) Interrupt Enable Register -#define AT91C_TC6_RC ((AT91_REG *) 0xFFFA801C) // (TC6) Register C -#define AT91C_TC6_RA ((AT91_REG *) 0xFFFA8014) // (TC6) Register A -#define AT91C_TC6_CMR ((AT91_REG *) 0xFFFA8004) // (TC6) Channel Mode Register (Capture Mode / Waveform Mode) -// ========== Register definition for TC7 peripheral ========== -#define AT91C_TC7_IDR ((AT91_REG *) 0xFFFA8068) // (TC7) Interrupt Disable Register -#define AT91C_TC7_SR ((AT91_REG *) 0xFFFA8060) // (TC7) Status Register -#define AT91C_TC7_RB ((AT91_REG *) 0xFFFA8058) // (TC7) Register B -#define AT91C_TC7_CV ((AT91_REG *) 0xFFFA8050) // (TC7) Counter Value -#define AT91C_TC7_CCR ((AT91_REG *) 0xFFFA8040) // (TC7) Channel Control Register -#define AT91C_TC7_IMR ((AT91_REG *) 0xFFFA806C) // (TC7) Interrupt Mask Register -#define AT91C_TC7_IER ((AT91_REG *) 0xFFFA8064) // (TC7) Interrupt Enable Register -#define AT91C_TC7_RC ((AT91_REG *) 0xFFFA805C) // (TC7) Register C -#define AT91C_TC7_RA ((AT91_REG *) 0xFFFA8054) // (TC7) Register A -#define AT91C_TC7_CMR ((AT91_REG *) 0xFFFA8044) // (TC7) Channel Mode Register (Capture Mode / Waveform Mode) -// ========== Register definition for TC8 peripheral ========== -#define AT91C_TC8_CV ((AT91_REG *) 0xFFFA8090) // (TC8) Counter Value -#define AT91C_TC8_CCR ((AT91_REG *) 0xFFFA8080) // (TC8) Channel Control Register -#define AT91C_TC8_IMR ((AT91_REG *) 0xFFFA80AC) // (TC8) Interrupt Mask Register -#define AT91C_TC8_IER ((AT91_REG *) 0xFFFA80A4) // (TC8) Interrupt Enable Register -#define AT91C_TC8_RC ((AT91_REG *) 0xFFFA809C) // (TC8) Register C -#define AT91C_TC8_RA ((AT91_REG *) 0xFFFA8094) // (TC8) Register A -#define AT91C_TC8_CMR ((AT91_REG *) 0xFFFA8084) // (TC8) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC8_IDR ((AT91_REG *) 0xFFFA80A8) // (TC8) Interrupt Disable Register -#define AT91C_TC8_SR ((AT91_REG *) 0xFFFA80A0) // (TC8) Status Register -#define AT91C_TC8_RB ((AT91_REG *) 0xFFFA8098) // (TC8) Register B -// ========== Register definition for TCB2 peripheral ========== -#define AT91C_TCB2_BMR ((AT91_REG *) 0xFFFA80C4) // (TCB2) TC Block Mode Register -#define AT91C_TCB2_BCR ((AT91_REG *) 0xFFFA80C0) // (TCB2) TC Block Control Register -// ========== Register definition for PDC_MCI peripheral ========== -#define AT91C_MCI_RCR ((AT91_REG *) 0xFFFAC104) // (PDC_MCI) Receive Counter Register -#define AT91C_MCI_PTCR ((AT91_REG *) 0xFFFAC120) // (PDC_MCI) PDC Transfer Control Register -#define AT91C_MCI_TNPR ((AT91_REG *) 0xFFFAC118) // (PDC_MCI) Transmit Next Pointer Register -#define AT91C_MCI_RNPR ((AT91_REG *) 0xFFFAC110) // (PDC_MCI) Receive Next Pointer Register -#define AT91C_MCI_TPR ((AT91_REG *) 0xFFFAC108) // (PDC_MCI) Transmit Pointer Register -#define AT91C_MCI_RPR ((AT91_REG *) 0xFFFAC100) // (PDC_MCI) Receive Pointer Register -#define AT91C_MCI_PTSR ((AT91_REG *) 0xFFFAC124) // (PDC_MCI) PDC Transfer Status Register -#define AT91C_MCI_TNCR ((AT91_REG *) 0xFFFAC11C) // (PDC_MCI) Transmit Next Counter Register -#define AT91C_MCI_RNCR ((AT91_REG *) 0xFFFAC114) // (PDC_MCI) Receive Next Counter Register -#define AT91C_MCI_TCR ((AT91_REG *) 0xFFFAC10C) // (PDC_MCI) Transmit Counter Register -// ========== Register definition for MCI peripheral ========== -#define AT91C_MCI_IER ((AT91_REG *) 0xFFFAC044) // (MCI) MCI Interrupt Enable Register -#define AT91C_MCI_TDR ((AT91_REG *) 0xFFFAC034) // (MCI) MCI Transmit Data Register -#define AT91C_MCI_IDR ((AT91_REG *) 0xFFFAC048) // (MCI) MCI Interrupt Disable Register -#define AT91C_MCI_SR ((AT91_REG *) 0xFFFAC040) // (MCI) MCI Status Register -#define AT91C_MCI_DTOR ((AT91_REG *) 0xFFFAC008) // (MCI) MCI Data Timeout Register -#define AT91C_MCI_CR ((AT91_REG *) 0xFFFAC000) // (MCI) MCI Control Register -#define AT91C_MCI_IMR ((AT91_REG *) 0xFFFAC04C) // (MCI) MCI Interrupt Mask Register -#define AT91C_MCI_MR ((AT91_REG *) 0xFFFAC004) // (MCI) MCI Mode Register -#define AT91C_MCI_SDCR ((AT91_REG *) 0xFFFAC00C) // (MCI) MCI SD Card Register -#define AT91C_MCI_CMDR ((AT91_REG *) 0xFFFAC014) // (MCI) MCI Command Register -#define AT91C_MCI_ARGR ((AT91_REG *) 0xFFFAC010) // (MCI) MCI Argument Register -#define AT91C_MCI_RSPR ((AT91_REG *) 0xFFFAC020) // (MCI) MCI Response Register -#define AT91C_MCI_RDR ((AT91_REG *) 0xFFFAC030) // (MCI) MCI Receive Data Register -// ========== Register definition for UDP peripheral ========== -#define AT91C_UDP_TXVC ((AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register -#define AT91C_UDP_ISR ((AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register -#define AT91C_UDP_IDR ((AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register -#define AT91C_UDP_CSR ((AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register -#define AT91C_UDP_RSTEP ((AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register -#define AT91C_UDP_ICR ((AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register -#define AT91C_UDP_GLBSTATE ((AT91_REG *) 0xFFFB0004) // (UDP) Global State Register -#define AT91C_UDP_NUM ((AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register -#define AT91C_UDP_FADDR ((AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register -#define AT91C_UDP_IER ((AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register -#define AT91C_UDP_IMR ((AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register -#define AT91C_UDP_FDR ((AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register -// ========== Register definition for TWI peripheral ========== -#define AT91C_TWI_RHR ((AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register -#define AT91C_TWI_IDR ((AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register -#define AT91C_TWI_SR ((AT91_REG *) 0xFFFB8020) // (TWI) Status Register -#define AT91C_TWI_CWGR ((AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register -#define AT91C_TWI_CR ((AT91_REG *) 0xFFFB8000) // (TWI) Control Register -#define AT91C_TWI_THR ((AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register -#define AT91C_TWI_IMR ((AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register -#define AT91C_TWI_IER ((AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register -#define AT91C_TWI_IADR ((AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register -#define AT91C_TWI_MMR ((AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register -// ========== Register definition for PDC_US0 peripheral ========== -#define AT91C_US0_PTCR ((AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register -#define AT91C_US0_TNPR ((AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register -#define AT91C_US0_RNPR ((AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register -#define AT91C_US0_TPR ((AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register -#define AT91C_US0_RPR ((AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register -#define AT91C_US0_PTSR ((AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register -#define AT91C_US0_TNCR ((AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register -#define AT91C_US0_RNCR ((AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register -#define AT91C_US0_TCR ((AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register -#define AT91C_US0_RCR ((AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register -// ========== Register definition for US0 peripheral ========== -#define AT91C_US0_TTGR ((AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register -#define AT91C_US0_BRGR ((AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register -#define AT91C_US0_RHR ((AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register -#define AT91C_US0_IMR ((AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register -#define AT91C_US0_NER ((AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register -#define AT91C_US0_RTOR ((AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register -#define AT91C_US0_FIDI ((AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register -#define AT91C_US0_CR ((AT91_REG *) 0xFFFC0000) // (US0) Control Register -#define AT91C_US0_IER ((AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register -#define AT91C_US0_IF ((AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register -#define AT91C_US0_MR ((AT91_REG *) 0xFFFC0004) // (US0) Mode Register -#define AT91C_US0_IDR ((AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register -#define AT91C_US0_CSR ((AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register -#define AT91C_US0_THR ((AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register -// ========== Register definition for PDC_US1 peripheral ========== -#define AT91C_US1_PTSR ((AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register -#define AT91C_US1_TNCR ((AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register -#define AT91C_US1_RNCR ((AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register -#define AT91C_US1_TCR ((AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register -#define AT91C_US1_RCR ((AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register -#define AT91C_US1_PTCR ((AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register -#define AT91C_US1_TNPR ((AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register -#define AT91C_US1_RNPR ((AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register -#define AT91C_US1_TPR ((AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register -#define AT91C_US1_RPR ((AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register -// ========== Register definition for US1 peripheral ========== -#define AT91C_US1_RHR ((AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register -#define AT91C_US1_IMR ((AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register -#define AT91C_US1_IER ((AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register -#define AT91C_US1_CR ((AT91_REG *) 0xFFFC4000) // (US1) Control Register -#define AT91C_US1_RTOR ((AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register -#define AT91C_US1_THR ((AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register -#define AT91C_US1_CSR ((AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register -#define AT91C_US1_IDR ((AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register -#define AT91C_US1_FIDI ((AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register -#define AT91C_US1_BRGR ((AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register -#define AT91C_US1_TTGR ((AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register -#define AT91C_US1_IF ((AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register -#define AT91C_US1_NER ((AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register -#define AT91C_US1_MR ((AT91_REG *) 0xFFFC4004) // (US1) Mode Register -// ========== Register definition for PDC_US2 peripheral ========== -#define AT91C_US2_PTSR ((AT91_REG *) 0xFFFC8124) // (PDC_US2) PDC Transfer Status Register -#define AT91C_US2_TNCR ((AT91_REG *) 0xFFFC811C) // (PDC_US2) Transmit Next Counter Register -#define AT91C_US2_RNCR ((AT91_REG *) 0xFFFC8114) // (PDC_US2) Receive Next Counter Register -#define AT91C_US2_TCR ((AT91_REG *) 0xFFFC810C) // (PDC_US2) Transmit Counter Register -#define AT91C_US2_PTCR ((AT91_REG *) 0xFFFC8120) // (PDC_US2) PDC Transfer Control Register -#define AT91C_US2_RCR ((AT91_REG *) 0xFFFC8104) // (PDC_US2) Receive Counter Register -#define AT91C_US2_TNPR ((AT91_REG *) 0xFFFC8118) // (PDC_US2) Transmit Next Pointer Register -#define AT91C_US2_RPR ((AT91_REG *) 0xFFFC8100) // (PDC_US2) Receive Pointer Register -#define AT91C_US2_TPR ((AT91_REG *) 0xFFFC8108) // (PDC_US2) Transmit Pointer Register -#define AT91C_US2_RNPR ((AT91_REG *) 0xFFFC8110) // (PDC_US2) Receive Next Pointer Register -// ========== Register definition for US2 peripheral ========== -#define AT91C_US2_FIDI ((AT91_REG *) 0xFFFC8040) // (US2) FI_DI_Ratio Register -#define AT91C_US2_TTGR ((AT91_REG *) 0xFFFC8028) // (US2) Transmitter Time-guard Register -#define AT91C_US2_BRGR ((AT91_REG *) 0xFFFC8020) // (US2) Baud Rate Generator Register -#define AT91C_US2_RHR ((AT91_REG *) 0xFFFC8018) // (US2) Receiver Holding Register -#define AT91C_US2_IMR ((AT91_REG *) 0xFFFC8010) // (US2) Interrupt Mask Register -#define AT91C_US2_IER ((AT91_REG *) 0xFFFC8008) // (US2) Interrupt Enable Register -#define AT91C_US2_CR ((AT91_REG *) 0xFFFC8000) // (US2) Control Register -#define AT91C_US2_IF ((AT91_REG *) 0xFFFC804C) // (US2) IRDA_FILTER Register -#define AT91C_US2_NER ((AT91_REG *) 0xFFFC8044) // (US2) Nb Errors Register -#define AT91C_US2_RTOR ((AT91_REG *) 0xFFFC8024) // (US2) Receiver Time-out Register -#define AT91C_US2_THR ((AT91_REG *) 0xFFFC801C) // (US2) Transmitter Holding Register -#define AT91C_US2_CSR ((AT91_REG *) 0xFFFC8014) // (US2) Channel Status Register -#define AT91C_US2_IDR ((AT91_REG *) 0xFFFC800C) // (US2) Interrupt Disable Register -#define AT91C_US2_MR ((AT91_REG *) 0xFFFC8004) // (US2) Mode Register -// ========== Register definition for PWMC_CH0 peripheral ========== -#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register -#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register -#define AT91C_PWMC_CH0_CMR ((AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register -#define AT91C_PWMC_CH0_Reserved ((AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved -#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register -#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH1 peripheral ========== -#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register -#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register -#define AT91C_PWMC_CH1_CMR ((AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register -#define AT91C_PWMC_CH1_Reserved ((AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved -#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register -#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH2 peripheral ========== -#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register -#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register -#define AT91C_PWMC_CH2_CMR ((AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register -#define AT91C_PWMC_CH2_Reserved ((AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved -#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register -#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH3 peripheral ========== -#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register -#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register -#define AT91C_PWMC_CH3_CMR ((AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register -#define AT91C_PWMC_CH3_Reserved ((AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved -#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register -#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH4 peripheral ========== -#define AT91C_PWMC_CH4_CUPDR ((AT91_REG *) 0xFFFCC290) // (PWMC_CH4) Channel Update Register -#define AT91C_PWMC_CH4_CPRDR ((AT91_REG *) 0xFFFCC288) // (PWMC_CH4) Channel Period Register -#define AT91C_PWMC_CH4_CMR ((AT91_REG *) 0xFFFCC280) // (PWMC_CH4) Channel Mode Register -#define AT91C_PWMC_CH4_Reserved ((AT91_REG *) 0xFFFCC294) // (PWMC_CH4) Reserved -#define AT91C_PWMC_CH4_CCNTR ((AT91_REG *) 0xFFFCC28C) // (PWMC_CH4) Channel Counter Register -#define AT91C_PWMC_CH4_CDTYR ((AT91_REG *) 0xFFFCC284) // (PWMC_CH4) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH5 peripheral ========== -#define AT91C_PWMC_CH5_CUPDR ((AT91_REG *) 0xFFFCC2B0) // (PWMC_CH5) Channel Update Register -#define AT91C_PWMC_CH5_CPRDR ((AT91_REG *) 0xFFFCC2A8) // (PWMC_CH5) Channel Period Register -#define AT91C_PWMC_CH5_CMR ((AT91_REG *) 0xFFFCC2A0) // (PWMC_CH5) Channel Mode Register -#define AT91C_PWMC_CH5_Reserved ((AT91_REG *) 0xFFFCC2B4) // (PWMC_CH5) Reserved -#define AT91C_PWMC_CH5_CCNTR ((AT91_REG *) 0xFFFCC2AC) // (PWMC_CH5) Channel Counter Register -#define AT91C_PWMC_CH5_CDTYR ((AT91_REG *) 0xFFFCC2A4) // (PWMC_CH5) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH6 peripheral ========== -#define AT91C_PWMC_CH6_Reserved ((AT91_REG *) 0xFFFCC2D4) // (PWMC_CH6) Reserved -#define AT91C_PWMC_CH6_CCNTR ((AT91_REG *) 0xFFFCC2CC) // (PWMC_CH6) Channel Counter Register -#define AT91C_PWMC_CH6_CDTYR ((AT91_REG *) 0xFFFCC2C4) // (PWMC_CH6) Channel Duty Cycle Register -#define AT91C_PWMC_CH6_CUPDR ((AT91_REG *) 0xFFFCC2D0) // (PWMC_CH6) Channel Update Register -#define AT91C_PWMC_CH6_CPRDR ((AT91_REG *) 0xFFFCC2C8) // (PWMC_CH6) Channel Period Register -#define AT91C_PWMC_CH6_CMR ((AT91_REG *) 0xFFFCC2C0) // (PWMC_CH6) Channel Mode Register -// ========== Register definition for PWMC_CH7 peripheral ========== -#define AT91C_PWMC_CH7_Reserved ((AT91_REG *) 0xFFFCC2F4) // (PWMC_CH7) Reserved -#define AT91C_PWMC_CH7_CCNTR ((AT91_REG *) 0xFFFCC2EC) // (PWMC_CH7) Channel Counter Register -#define AT91C_PWMC_CH7_CDTYR ((AT91_REG *) 0xFFFCC2E4) // (PWMC_CH7) Channel Duty Cycle Register -#define AT91C_PWMC_CH7_CUPDR ((AT91_REG *) 0xFFFCC2F0) // (PWMC_CH7) Channel Update Register -#define AT91C_PWMC_CH7_CPRDR ((AT91_REG *) 0xFFFCC2E8) // (PWMC_CH7) Channel Period Register -#define AT91C_PWMC_CH7_CMR ((AT91_REG *) 0xFFFCC2E0) // (PWMC_CH7) Channel Mode Register -// ========== Register definition for PWMC peripheral ========== -#define AT91C_PWMC_VR ((AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register -#define AT91C_PWMC_ISR ((AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register -#define AT91C_PWMC_IDR ((AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register -#define AT91C_PWMC_SR ((AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register -#define AT91C_PWMC_ENA ((AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register -#define AT91C_PWMC_IMR ((AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register -#define AT91C_PWMC_MR ((AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register -#define AT91C_PWMC_DIS ((AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register -#define AT91C_PWMC_IER ((AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register -// ========== Register definition for PDC_SSC0 peripheral ========== -#define AT91C_SSC0_PTCR ((AT91_REG *) 0xFFFD0120) // (PDC_SSC0) PDC Transfer Control Register -#define AT91C_SSC0_TNPR ((AT91_REG *) 0xFFFD0118) // (PDC_SSC0) Transmit Next Pointer Register -#define AT91C_SSC0_RNPR ((AT91_REG *) 0xFFFD0110) // (PDC_SSC0) Receive Next Pointer Register -#define AT91C_SSC0_TPR ((AT91_REG *) 0xFFFD0108) // (PDC_SSC0) Transmit Pointer Register -#define AT91C_SSC0_RPR ((AT91_REG *) 0xFFFD0100) // (PDC_SSC0) Receive Pointer Register -#define AT91C_SSC0_PTSR ((AT91_REG *) 0xFFFD0124) // (PDC_SSC0) PDC Transfer Status Register -#define AT91C_SSC0_TNCR ((AT91_REG *) 0xFFFD011C) // (PDC_SSC0) Transmit Next Counter Register -#define AT91C_SSC0_RNCR ((AT91_REG *) 0xFFFD0114) // (PDC_SSC0) Receive Next Counter Register -#define AT91C_SSC0_TCR ((AT91_REG *) 0xFFFD010C) // (PDC_SSC0) Transmit Counter Register -#define AT91C_SSC0_RCR ((AT91_REG *) 0xFFFD0104) // (PDC_SSC0) Receive Counter Register -// ========== Register definition for SSC0 peripheral ========== -#define AT91C_SSC0_IMR ((AT91_REG *) 0xFFFD004C) // (SSC0) Interrupt Mask Register -#define AT91C_SSC0_IER ((AT91_REG *) 0xFFFD0044) // (SSC0) Interrupt Enable Register -#define AT91C_SSC0_TSHR ((AT91_REG *) 0xFFFD0034) // (SSC0) Transmit Sync Holding Register -#define AT91C_SSC0_THR ((AT91_REG *) 0xFFFD0024) // (SSC0) Transmit Holding Register -#define AT91C_SSC0_TFMR ((AT91_REG *) 0xFFFD001C) // (SSC0) Transmit Frame Mode Register -#define AT91C_SSC0_RFMR ((AT91_REG *) 0xFFFD0014) // (SSC0) Receive Frame Mode Register -#define AT91C_SSC0_CMR ((AT91_REG *) 0xFFFD0004) // (SSC0) Clock Mode Register -#define AT91C_SSC0_IDR ((AT91_REG *) 0xFFFD0048) // (SSC0) Interrupt Disable Register -#define AT91C_SSC0_SR ((AT91_REG *) 0xFFFD0040) // (SSC0) Status Register -#define AT91C_SSC0_RSHR ((AT91_REG *) 0xFFFD0030) // (SSC0) Receive Sync Holding Register -#define AT91C_SSC0_RHR ((AT91_REG *) 0xFFFD0020) // (SSC0) Receive Holding Register -#define AT91C_SSC0_TCMR ((AT91_REG *) 0xFFFD0018) // (SSC0) Transmit Clock Mode Register -#define AT91C_SSC0_RCMR ((AT91_REG *) 0xFFFD0010) // (SSC0) Receive Clock ModeRegister -#define AT91C_SSC0_CR ((AT91_REG *) 0xFFFD0000) // (SSC0) Control Register -// ========== Register definition for PDC_SSC1 peripheral ========== -#define AT91C_SSC1_PTCR ((AT91_REG *) 0xFFFD4120) // (PDC_SSC1) PDC Transfer Control Register -#define AT91C_SSC1_TNPR ((AT91_REG *) 0xFFFD4118) // (PDC_SSC1) Transmit Next Pointer Register -#define AT91C_SSC1_RNPR ((AT91_REG *) 0xFFFD4110) // (PDC_SSC1) Receive Next Pointer Register -#define AT91C_SSC1_TPR ((AT91_REG *) 0xFFFD4108) // (PDC_SSC1) Transmit Pointer Register -#define AT91C_SSC1_RPR ((AT91_REG *) 0xFFFD4100) // (PDC_SSC1) Receive Pointer Register -#define AT91C_SSC1_PTSR ((AT91_REG *) 0xFFFD4124) // (PDC_SSC1) PDC Transfer Status Register -#define AT91C_SSC1_TNCR ((AT91_REG *) 0xFFFD411C) // (PDC_SSC1) Transmit Next Counter Register -#define AT91C_SSC1_RNCR ((AT91_REG *) 0xFFFD4114) // (PDC_SSC1) Receive Next Counter Register -#define AT91C_SSC1_TCR ((AT91_REG *) 0xFFFD410C) // (PDC_SSC1) Transmit Counter Register -#define AT91C_SSC1_RCR ((AT91_REG *) 0xFFFD4104) // (PDC_SSC1) Receive Counter Register -// ========== Register definition for SSC1 peripheral ========== -#define AT91C_SSC1_RFMR ((AT91_REG *) 0xFFFD4014) // (SSC1) Receive Frame Mode Register -#define AT91C_SSC1_CMR ((AT91_REG *) 0xFFFD4004) // (SSC1) Clock Mode Register -#define AT91C_SSC1_IDR ((AT91_REG *) 0xFFFD4048) // (SSC1) Interrupt Disable Register -#define AT91C_SSC1_SR ((AT91_REG *) 0xFFFD4040) // (SSC1) Status Register -#define AT91C_SSC1_RSHR ((AT91_REG *) 0xFFFD4030) // (SSC1) Receive Sync Holding Register -#define AT91C_SSC1_RHR ((AT91_REG *) 0xFFFD4020) // (SSC1) Receive Holding Register -#define AT91C_SSC1_TCMR ((AT91_REG *) 0xFFFD4018) // (SSC1) Transmit Clock Mode Register -#define AT91C_SSC1_RCMR ((AT91_REG *) 0xFFFD4010) // (SSC1) Receive Clock ModeRegister -#define AT91C_SSC1_CR ((AT91_REG *) 0xFFFD4000) // (SSC1) Control Register -#define AT91C_SSC1_IMR ((AT91_REG *) 0xFFFD404C) // (SSC1) Interrupt Mask Register -#define AT91C_SSC1_IER ((AT91_REG *) 0xFFFD4044) // (SSC1) Interrupt Enable Register -#define AT91C_SSC1_TSHR ((AT91_REG *) 0xFFFD4034) // (SSC1) Transmit Sync Holding Register -#define AT91C_SSC1_THR ((AT91_REG *) 0xFFFD4024) // (SSC1) Transmit Holding Register -#define AT91C_SSC1_TFMR ((AT91_REG *) 0xFFFD401C) // (SSC1) Transmit Frame Mode Register -// ========== Register definition for PDC_ADC0 peripheral ========== -#define AT91C_ADC0_PTCR ((AT91_REG *) 0xFFFD8120) // (PDC_ADC0) PDC Transfer Control Register -#define AT91C_ADC0_TNPR ((AT91_REG *) 0xFFFD8118) // (PDC_ADC0) Transmit Next Pointer Register -#define AT91C_ADC0_RNPR ((AT91_REG *) 0xFFFD8110) // (PDC_ADC0) Receive Next Pointer Register -#define AT91C_ADC0_TPR ((AT91_REG *) 0xFFFD8108) // (PDC_ADC0) Transmit Pointer Register -#define AT91C_ADC0_RPR ((AT91_REG *) 0xFFFD8100) // (PDC_ADC0) Receive Pointer Register -#define AT91C_ADC0_PTSR ((AT91_REG *) 0xFFFD8124) // (PDC_ADC0) PDC Transfer Status Register -#define AT91C_ADC0_TNCR ((AT91_REG *) 0xFFFD811C) // (PDC_ADC0) Transmit Next Counter Register -#define AT91C_ADC0_RNCR ((AT91_REG *) 0xFFFD8114) // (PDC_ADC0) Receive Next Counter Register -#define AT91C_ADC0_TCR ((AT91_REG *) 0xFFFD810C) // (PDC_ADC0) Transmit Counter Register -#define AT91C_ADC0_RCR ((AT91_REG *) 0xFFFD8104) // (PDC_ADC0) Receive Counter Register -// ========== Register definition for ADC0 peripheral ========== -#define AT91C_ADC0_IMR ((AT91_REG *) 0xFFFD802C) // (ADC0) ADC Interrupt Mask Register -#define AT91C_ADC0_CDR4 ((AT91_REG *) 0xFFFD8040) // (ADC0) ADC Channel Data Register 4 -#define AT91C_ADC0_CDR2 ((AT91_REG *) 0xFFFD8038) // (ADC0) ADC Channel Data Register 2 -#define AT91C_ADC0_CDR0 ((AT91_REG *) 0xFFFD8030) // (ADC0) ADC Channel Data Register 0 -#define AT91C_ADC0_CDR7 ((AT91_REG *) 0xFFFD804C) // (ADC0) ADC Channel Data Register 7 -#define AT91C_ADC0_CDR1 ((AT91_REG *) 0xFFFD8034) // (ADC0) ADC Channel Data Register 1 -#define AT91C_ADC0_CDR3 ((AT91_REG *) 0xFFFD803C) // (ADC0) ADC Channel Data Register 3 -#define AT91C_ADC0_CDR5 ((AT91_REG *) 0xFFFD8044) // (ADC0) ADC Channel Data Register 5 -#define AT91C_ADC0_MR ((AT91_REG *) 0xFFFD8004) // (ADC0) ADC Mode Register -#define AT91C_ADC0_CDR6 ((AT91_REG *) 0xFFFD8048) // (ADC0) ADC Channel Data Register 6 -#define AT91C_ADC0_CR ((AT91_REG *) 0xFFFD8000) // (ADC0) ADC Control Register -#define AT91C_ADC0_CHER ((AT91_REG *) 0xFFFD8010) // (ADC0) ADC Channel Enable Register -#define AT91C_ADC0_CHSR ((AT91_REG *) 0xFFFD8018) // (ADC0) ADC Channel Status Register -#define AT91C_ADC0_IER ((AT91_REG *) 0xFFFD8024) // (ADC0) ADC Interrupt Enable Register -#define AT91C_ADC0_SR ((AT91_REG *) 0xFFFD801C) // (ADC0) ADC Status Register -#define AT91C_ADC0_CHDR ((AT91_REG *) 0xFFFD8014) // (ADC0) ADC Channel Disable Register -#define AT91C_ADC0_IDR ((AT91_REG *) 0xFFFD8028) // (ADC0) ADC Interrupt Disable Register -#define AT91C_ADC0_LCDR ((AT91_REG *) 0xFFFD8020) // (ADC0) ADC Last Converted Data Register -// ========== Register definition for PDC_ADC1 peripheral ========== -#define AT91C_ADC1_RPR ((AT91_REG *) 0xFFFDC100) // (PDC_ADC1) Receive Pointer Register -#define AT91C_ADC1_RCR ((AT91_REG *) 0xFFFDC104) // (PDC_ADC1) Receive Counter Register -#define AT91C_ADC1_PTSR ((AT91_REG *) 0xFFFDC124) // (PDC_ADC1) PDC Transfer Status Register -#define AT91C_ADC1_TNCR ((AT91_REG *) 0xFFFDC11C) // (PDC_ADC1) Transmit Next Counter Register -#define AT91C_ADC1_RNCR ((AT91_REG *) 0xFFFDC114) // (PDC_ADC1) Receive Next Counter Register -#define AT91C_ADC1_TCR ((AT91_REG *) 0xFFFDC10C) // (PDC_ADC1) Transmit Counter Register -#define AT91C_ADC1_PTCR ((AT91_REG *) 0xFFFDC120) // (PDC_ADC1) PDC Transfer Control Register -#define AT91C_ADC1_TNPR ((AT91_REG *) 0xFFFDC118) // (PDC_ADC1) Transmit Next Pointer Register -#define AT91C_ADC1_RNPR ((AT91_REG *) 0xFFFDC110) // (PDC_ADC1) Receive Next Pointer Register -#define AT91C_ADC1_TPR ((AT91_REG *) 0xFFFDC108) // (PDC_ADC1) Transmit Pointer Register -// ========== Register definition for ADC1 peripheral ========== -#define AT91C_ADC1_CDR1 ((AT91_REG *) 0xFFFDC034) // (ADC1) ADC Channel Data Register 1 -#define AT91C_ADC1_IMR ((AT91_REG *) 0xFFFDC02C) // (ADC1) ADC Interrupt Mask Register -#define AT91C_ADC1_IER ((AT91_REG *) 0xFFFDC024) // (ADC1) ADC Interrupt Enable Register -#define AT91C_ADC1_SR ((AT91_REG *) 0xFFFDC01C) // (ADC1) ADC Status Register -#define AT91C_ADC1_CDR2 ((AT91_REG *) 0xFFFDC038) // (ADC1) ADC Channel Data Register 2 -#define AT91C_ADC1_CDR0 ((AT91_REG *) 0xFFFDC030) // (ADC1) ADC Channel Data Register 0 -#define AT91C_ADC1_CDR3 ((AT91_REG *) 0xFFFDC03C) // (ADC1) ADC Channel Data Register 3 -#define AT91C_ADC1_CDR6 ((AT91_REG *) 0xFFFDC048) // (ADC1) ADC Channel Data Register 6 -#define AT91C_ADC1_CDR4 ((AT91_REG *) 0xFFFDC040) // (ADC1) ADC Channel Data Register 4 -#define AT91C_ADC1_CR ((AT91_REG *) 0xFFFDC000) // (ADC1) ADC Control Register -#define AT91C_ADC1_CDR7 ((AT91_REG *) 0xFFFDC04C) // (ADC1) ADC Channel Data Register 7 -#define AT91C_ADC1_CDR5 ((AT91_REG *) 0xFFFDC044) // (ADC1) ADC Channel Data Register 5 -#define AT91C_ADC1_CHDR ((AT91_REG *) 0xFFFDC014) // (ADC1) ADC Channel Disable Register -#define AT91C_ADC1_MR ((AT91_REG *) 0xFFFDC004) // (ADC1) ADC Mode Register -#define AT91C_ADC1_IDR ((AT91_REG *) 0xFFFDC028) // (ADC1) ADC Interrupt Disable Register -#define AT91C_ADC1_LCDR ((AT91_REG *) 0xFFFDC020) // (ADC1) ADC Last Converted Data Register -#define AT91C_ADC1_CHSR ((AT91_REG *) 0xFFFDC018) // (ADC1) ADC Channel Status Register -#define AT91C_ADC1_CHER ((AT91_REG *) 0xFFFDC010) // (ADC1) ADC Channel Enable Register -// ========== Register definition for PDC_SPI0 peripheral ========== -#define AT91C_SPI0_PTCR ((AT91_REG *) 0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register -#define AT91C_SPI0_TNPR ((AT91_REG *) 0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register -#define AT91C_SPI0_RNPR ((AT91_REG *) 0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register -#define AT91C_SPI0_TPR ((AT91_REG *) 0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register -#define AT91C_SPI0_RPR ((AT91_REG *) 0xFFFE0100) // (PDC_SPI0) Receive Pointer Register -#define AT91C_SPI0_PTSR ((AT91_REG *) 0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register -#define AT91C_SPI0_TNCR ((AT91_REG *) 0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register -#define AT91C_SPI0_RNCR ((AT91_REG *) 0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register -#define AT91C_SPI0_TCR ((AT91_REG *) 0xFFFE010C) // (PDC_SPI0) Transmit Counter Register -#define AT91C_SPI0_RCR ((AT91_REG *) 0xFFFE0104) // (PDC_SPI0) Receive Counter Register -// ========== Register definition for SPI0 peripheral ========== -#define AT91C_SPI0_CSR ((AT91_REG *) 0xFFFE0030) // (SPI0) Chip Select Register -#define AT91C_SPI0_IDR ((AT91_REG *) 0xFFFE0018) // (SPI0) Interrupt Disable Register -#define AT91C_SPI0_SR ((AT91_REG *) 0xFFFE0010) // (SPI0) Status Register -#define AT91C_SPI0_RDR ((AT91_REG *) 0xFFFE0008) // (SPI0) Receive Data Register -#define AT91C_SPI0_CR ((AT91_REG *) 0xFFFE0000) // (SPI0) Control Register -#define AT91C_SPI0_IMR ((AT91_REG *) 0xFFFE001C) // (SPI0) Interrupt Mask Register -#define AT91C_SPI0_IER ((AT91_REG *) 0xFFFE0014) // (SPI0) Interrupt Enable Register -#define AT91C_SPI0_TDR ((AT91_REG *) 0xFFFE000C) // (SPI0) Transmit Data Register -#define AT91C_SPI0_MR ((AT91_REG *) 0xFFFE0004) // (SPI0) Mode Register -// ========== Register definition for PDC_SPI1 peripheral ========== -#define AT91C_SPI1_RNPR ((AT91_REG *) 0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register -#define AT91C_SPI1_TPR ((AT91_REG *) 0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register -#define AT91C_SPI1_RPR ((AT91_REG *) 0xFFFE4100) // (PDC_SPI1) Receive Pointer Register -#define AT91C_SPI1_PTSR ((AT91_REG *) 0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register -#define AT91C_SPI1_RCR ((AT91_REG *) 0xFFFE4104) // (PDC_SPI1) Receive Counter Register -#define AT91C_SPI1_TCR ((AT91_REG *) 0xFFFE410C) // (PDC_SPI1) Transmit Counter Register -#define AT91C_SPI1_RNCR ((AT91_REG *) 0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register -#define AT91C_SPI1_TNCR ((AT91_REG *) 0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register -#define AT91C_SPI1_TNPR ((AT91_REG *) 0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register -#define AT91C_SPI1_PTCR ((AT91_REG *) 0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register -// ========== Register definition for SPI1 peripheral ========== -#define AT91C_SPI1_CSR ((AT91_REG *) 0xFFFE4030) // (SPI1) Chip Select Register -#define AT91C_SPI1_IDR ((AT91_REG *) 0xFFFE4018) // (SPI1) Interrupt Disable Register -#define AT91C_SPI1_SR ((AT91_REG *) 0xFFFE4010) // (SPI1) Status Register -#define AT91C_SPI1_RDR ((AT91_REG *) 0xFFFE4008) // (SPI1) Receive Data Register -#define AT91C_SPI1_CR ((AT91_REG *) 0xFFFE4000) // (SPI1) Control Register -#define AT91C_SPI1_IMR ((AT91_REG *) 0xFFFE401C) // (SPI1) Interrupt Mask Register -#define AT91C_SPI1_IER ((AT91_REG *) 0xFFFE4014) // (SPI1) Interrupt Enable Register -#define AT91C_SPI1_TDR ((AT91_REG *) 0xFFFE400C) // (SPI1) Transmit Data Register -#define AT91C_SPI1_MR ((AT91_REG *) 0xFFFE4004) // (SPI1) Mode Register - -// ***************************************************************************** -// PIO DEFINITIONS FOR AT91SAM7A3 -// ***************************************************************************** -#define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 -#define AT91C_PA0_TWD ((unsigned int) AT91C_PIO_PA0) // TWI Two-wire Serial Data -#define AT91C_PA0_ADTRG0 ((unsigned int) AT91C_PIO_PA0) // ADC0 External Trigger -#define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 -#define AT91C_PA1_TWCK ((unsigned int) AT91C_PIO_PA1) // TWI Two-wire Serial Clock -#define AT91C_PA1_ADTRG1 ((unsigned int) AT91C_PIO_PA1) // ADC1 External Trigger -#define AT91C_PIO_PA10 ((unsigned int) 1 << 10) // Pin Controlled by PA10 -#define AT91C_PA10_TXD2 ((unsigned int) AT91C_PIO_PA10) // USART 2 Transmit Data -#define AT91C_PA10_SPI1_SPCK ((unsigned int) AT91C_PIO_PA10) // SPI1 Serial Clock -#define AT91C_PIO_PA11 ((unsigned int) 1 << 11) // Pin Controlled by PA11 -#define AT91C_PA11_SPI0_NPCS0 ((unsigned int) AT91C_PIO_PA11) // SPI0 Peripheral Chip Select 0 -#define AT91C_PIO_PA12 ((unsigned int) 1 << 12) // Pin Controlled by PA12 -#define AT91C_PA12_SPI0_NPCS1 ((unsigned int) AT91C_PIO_PA12) // SPI0 Peripheral Chip Select 1 -#define AT91C_PA12_MCDA1 ((unsigned int) AT91C_PIO_PA12) // Multimedia Card A Data 1 -#define AT91C_PIO_PA13 ((unsigned int) 1 << 13) // Pin Controlled by PA13 -#define AT91C_PA13_SPI0_NPCS2 ((unsigned int) AT91C_PIO_PA13) // SPI0 Peripheral Chip Select 2 -#define AT91C_PA13_MCDA2 ((unsigned int) AT91C_PIO_PA13) // Multimedia Card A Data 2 -#define AT91C_PIO_PA14 ((unsigned int) 1 << 14) // Pin Controlled by PA14 -#define AT91C_PA14_SPI0_NPCS3 ((unsigned int) AT91C_PIO_PA14) // SPI0 Peripheral Chip Select 3 -#define AT91C_PA14_MCDA3 ((unsigned int) AT91C_PIO_PA14) // Multimedia Card A Data 3 -#define AT91C_PIO_PA15 ((unsigned int) 1 << 15) // Pin Controlled by PA15 -#define AT91C_PA15_SPI0_MISO ((unsigned int) AT91C_PIO_PA15) // SPI0 Master In Slave -#define AT91C_PA15_MCDA0 ((unsigned int) AT91C_PIO_PA15) // Multimedia Card A Data 0 -#define AT91C_PIO_PA16 ((unsigned int) 1 << 16) // Pin Controlled by PA16 -#define AT91C_PA16_SPI0_MOSI ((unsigned int) AT91C_PIO_PA16) // SPI0 Master Out Slave -#define AT91C_PA16_MCCDA ((unsigned int) AT91C_PIO_PA16) // Multimedia Card A Command -#define AT91C_PIO_PA17 ((unsigned int) 1 << 17) // Pin Controlled by PA17 -#define AT91C_PA17_SPI0_SPCK ((unsigned int) AT91C_PIO_PA17) // SPI0 Serial Clock -#define AT91C_PA17_MCCK ((unsigned int) AT91C_PIO_PA17) // Multimedia Card Clock -#define AT91C_PIO_PA18 ((unsigned int) 1 << 18) // Pin Controlled by PA18 -#define AT91C_PA18_PWM0 ((unsigned int) AT91C_PIO_PA18) // PWMC Channel 0 -#define AT91C_PA18_PCK0 ((unsigned int) AT91C_PIO_PA18) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PA19 ((unsigned int) 1 << 19) // Pin Controlled by PA19 -#define AT91C_PA19_PWM1 ((unsigned int) AT91C_PIO_PA19) // PWMC Channel 1 -#define AT91C_PA19_PCK1 ((unsigned int) AT91C_PIO_PA19) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA2 ((unsigned int) 1 << 2) // Pin Controlled by PA2 -#define AT91C_PA2_RXD0 ((unsigned int) AT91C_PIO_PA2) // USART 0 Receive Data -#define AT91C_PIO_PA20 ((unsigned int) 1 << 20) // Pin Controlled by PA20 -#define AT91C_PA20_PWM2 ((unsigned int) AT91C_PIO_PA20) // PWMC Channel 2 -#define AT91C_PA20_PCK2 ((unsigned int) AT91C_PIO_PA20) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA21 ((unsigned int) 1 << 21) // Pin Controlled by PA21 -#define AT91C_PA21_PWM3 ((unsigned int) AT91C_PIO_PA21) // PWMC Channel 3 -#define AT91C_PA21_PCK3 ((unsigned int) AT91C_PIO_PA21) // PMC Programmable Clock Output 3 -#define AT91C_PIO_PA22 ((unsigned int) 1 << 22) // Pin Controlled by PA22 -#define AT91C_PA22_PWM4 ((unsigned int) AT91C_PIO_PA22) // PWMC Channel 4 -#define AT91C_PA22_IRQ0 ((unsigned int) AT91C_PIO_PA22) // Interrupt input 0 -#define AT91C_PIO_PA23 ((unsigned int) 1 << 23) // Pin Controlled by PA23 -#define AT91C_PA23_PWM5 ((unsigned int) AT91C_PIO_PA23) // PWMC Channel 5 -#define AT91C_PA23_IRQ1 ((unsigned int) AT91C_PIO_PA23) // Interrupt input 1 -#define AT91C_PIO_PA24 ((unsigned int) 1 << 24) // Pin Controlled by PA24 -#define AT91C_PA24_PWM6 ((unsigned int) AT91C_PIO_PA24) // PWMC Channel 6 -#define AT91C_PA24_TCLK4 ((unsigned int) AT91C_PIO_PA24) // Timer Counter 4 external Clock Input -#define AT91C_PIO_PA25 ((unsigned int) 1 << 25) // Pin Controlled by PA25 -#define AT91C_PA25_PWM7 ((unsigned int) AT91C_PIO_PA25) // PWMC Channel 7 -#define AT91C_PA25_TCLK5 ((unsigned int) AT91C_PIO_PA25) // Timer Counter 5 external Clock Input -#define AT91C_PIO_PA26 ((unsigned int) 1 << 26) // Pin Controlled by PA26 -#define AT91C_PA26_CANRX0 ((unsigned int) AT91C_PIO_PA26) // CAN Receive 0 -#define AT91C_PIO_PA27 ((unsigned int) 1 << 27) // Pin Controlled by PA27 -#define AT91C_PA27_CANTX0 ((unsigned int) AT91C_PIO_PA27) // CAN Transmit 0 -#define AT91C_PIO_PA28 ((unsigned int) 1 << 28) // Pin Controlled by PA28 -#define AT91C_PA28_CANRX1 ((unsigned int) AT91C_PIO_PA28) // CAN Receive 1 -#define AT91C_PA28_TCLK3 ((unsigned int) AT91C_PIO_PA28) // Timer Counter 3 external Clock Input -#define AT91C_PIO_PA29 ((unsigned int) 1 << 29) // Pin Controlled by PA29 -#define AT91C_PA29_CANTX1 ((unsigned int) AT91C_PIO_PA29) // CAN Transmit 1 -#define AT91C_PA29_TCLK6 ((unsigned int) AT91C_PIO_PA29) // Timer Counter 6 external clock input -#define AT91C_PIO_PA3 ((unsigned int) 1 << 3) // Pin Controlled by PA3 -#define AT91C_PA3_TXD0 ((unsigned int) AT91C_PIO_PA3) // USART 0 Transmit Data -#define AT91C_PIO_PA30 ((unsigned int) 1 << 30) // Pin Controlled by PA30 -#define AT91C_PA30_DRXD ((unsigned int) AT91C_PIO_PA30) // DBGU Debug Receive Data -#define AT91C_PA30_TCLK7 ((unsigned int) AT91C_PIO_PA30) // Timer Counter 7 external clock input -#define AT91C_PIO_PA31 ((unsigned int) 1 << 31) // Pin Controlled by PA31 -#define AT91C_PA31_DTXD ((unsigned int) AT91C_PIO_PA31) // DBGU Debug Transmit Data -#define AT91C_PA31_TCLK8 ((unsigned int) AT91C_PIO_PA31) // Timer Counter 8 external clock input -#define AT91C_PIO_PA4 ((unsigned int) 1 << 4) // Pin Controlled by PA4 -#define AT91C_PA4_SCK0 ((unsigned int) AT91C_PIO_PA4) // USART 0 Serial Clock -#define AT91C_PA4_SPI1_NPCS0 ((unsigned int) AT91C_PIO_PA4) // SPI1 Peripheral Chip Select 0 -#define AT91C_PIO_PA5 ((unsigned int) 1 << 5) // Pin Controlled by PA5 -#define AT91C_PA5_RTS0 ((unsigned int) AT91C_PIO_PA5) // USART 0 Ready To Send -#define AT91C_PA5_SPI1_NPCS1 ((unsigned int) AT91C_PIO_PA5) // SPI1 Peripheral Chip Select 1 -#define AT91C_PIO_PA6 ((unsigned int) 1 << 6) // Pin Controlled by PA6 -#define AT91C_PA6_CTS0 ((unsigned int) AT91C_PIO_PA6) // USART 0 Clear To Send -#define AT91C_PA6_SPI1_NPCS2 ((unsigned int) AT91C_PIO_PA6) // SPI1 Peripheral Chip Select 2 -#define AT91C_PIO_PA7 ((unsigned int) 1 << 7) // Pin Controlled by PA7 -#define AT91C_PA7_RXD1 ((unsigned int) AT91C_PIO_PA7) // USART 1 Receive Data -#define AT91C_PA7_SPI1_NPCS3 ((unsigned int) AT91C_PIO_PA7) // SPI1 Peripheral Chip Select 3 -#define AT91C_PIO_PA8 ((unsigned int) 1 << 8) // Pin Controlled by PA8 -#define AT91C_PA8_TXD1 ((unsigned int) AT91C_PIO_PA8) // USART 1 Transmit Data -#define AT91C_PA8_SPI1_MISO ((unsigned int) AT91C_PIO_PA8) // SPI1 Master In Slave -#define AT91C_PIO_PA9 ((unsigned int) 1 << 9) // Pin Controlled by PA9 -#define AT91C_PA9_RXD2 ((unsigned int) AT91C_PIO_PA9) // USART 2 Receive Data -#define AT91C_PA9_SPI1_MOSI ((unsigned int) AT91C_PIO_PA9) // SPI1 Master Out Slave -#define AT91C_PIO_PB0 ((unsigned int) 1 << 0) // Pin Controlled by PB0 -#define AT91C_PB0_IRQ2 ((unsigned int) AT91C_PIO_PB0) // Interrupt input 2 -#define AT91C_PB0_PWM5 ((unsigned int) AT91C_PIO_PB0) // PWMC Channel 5 -#define AT91C_PIO_PB1 ((unsigned int) 1 << 1) // Pin Controlled by PB1 -#define AT91C_PB1_IRQ3 ((unsigned int) AT91C_PIO_PB1) // Interrupt input 3 -#define AT91C_PB1_PWM6 ((unsigned int) AT91C_PIO_PB1) // PWMC Channel 6 -#define AT91C_PIO_PB10 ((unsigned int) 1 << 10) // Pin Controlled by PB10 -#define AT91C_PB10_TCLK1 ((unsigned int) AT91C_PIO_PB10) // Timer Counter 1 external clock input -#define AT91C_PB10_RK1 ((unsigned int) AT91C_PIO_PB10) // SSC Receive Clock 1 -#define AT91C_PIO_PB11 ((unsigned int) 1 << 11) // Pin Controlled by PB11 -#define AT91C_PB11_TCLK2 ((unsigned int) AT91C_PIO_PB11) // Timer Counter 2 external clock input -#define AT91C_PB11_RF1 ((unsigned int) AT91C_PIO_PB11) // SSC Receive Frame Sync 1 -#define AT91C_PIO_PB12 ((unsigned int) 1 << 12) // Pin Controlled by PB12 -#define AT91C_PB12_TIOA0 ((unsigned int) AT91C_PIO_PB12) // Timer Counter 0 Multipurpose Timer I/O Pin A -#define AT91C_PB12_TD1 ((unsigned int) AT91C_PIO_PB12) // SSC Transmit Data 1 -#define AT91C_PIO_PB13 ((unsigned int) 1 << 13) // Pin Controlled by PB13 -#define AT91C_PB13_TIOB0 ((unsigned int) AT91C_PIO_PB13) // Timer Counter 0 Multipurpose Timer I/O Pin B -#define AT91C_PB13_RD1 ((unsigned int) AT91C_PIO_PB13) // SSC Receive Data 1 -#define AT91C_PIO_PB14 ((unsigned int) 1 << 14) // Pin Controlled by PB14 -#define AT91C_PB14_TIOA1 ((unsigned int) AT91C_PIO_PB14) // Timer Counter 1 Multipurpose Timer I/O Pin A -#define AT91C_PB14_PWM0 ((unsigned int) AT91C_PIO_PB14) // PWMC Channel 0 -#define AT91C_PIO_PB15 ((unsigned int) 1 << 15) // Pin Controlled by PB15 -#define AT91C_PB15_TIOB1 ((unsigned int) AT91C_PIO_PB15) // Timer Counter 1 Multipurpose Timer I/O Pin B -#define AT91C_PB15_PWM1 ((unsigned int) AT91C_PIO_PB15) // PWMC Channel 1 -#define AT91C_PIO_PB16 ((unsigned int) 1 << 16) // Pin Controlled by PB16 -#define AT91C_PB16_TIOA2 ((unsigned int) AT91C_PIO_PB16) // Timer Counter 2 Multipurpose Timer I/O Pin A -#define AT91C_PB16_PWM2 ((unsigned int) AT91C_PIO_PB16) // PWMC Channel 2 -#define AT91C_PIO_PB17 ((unsigned int) 1 << 17) // Pin Controlled by PB17 -#define AT91C_PB17_TIOB2 ((unsigned int) AT91C_PIO_PB17) // Timer Counter 2 Multipurpose Timer I/O Pin B -#define AT91C_PB17_PWM3 ((unsigned int) AT91C_PIO_PB17) // PWMC Channel 3 -#define AT91C_PIO_PB18 ((unsigned int) 1 << 18) // Pin Controlled by PB18 -#define AT91C_PB18_TIOA3 ((unsigned int) AT91C_PIO_PB18) // Timer Counter 3 Multipurpose Timer I/O Pin A -#define AT91C_PB18_PWM4 ((unsigned int) AT91C_PIO_PB18) // PWMC Channel 4 -#define AT91C_PIO_PB19 ((unsigned int) 1 << 19) // Pin Controlled by PB19 -#define AT91C_PB19_TIOB3 ((unsigned int) AT91C_PIO_PB19) // Timer Counter 3 Multipurpose Timer I/O Pin B -#define AT91C_PB19_SPI1_NPCS1 ((unsigned int) AT91C_PIO_PB19) // SPI1 Peripheral Chip Select 1 -#define AT91C_PIO_PB2 ((unsigned int) 1 << 2) // Pin Controlled by PB2 -#define AT91C_PB2_TF0 ((unsigned int) AT91C_PIO_PB2) // SSC Transmit Frame Sync 0 -#define AT91C_PB2_PWM7 ((unsigned int) AT91C_PIO_PB2) // PWMC Channel 7 -#define AT91C_PIO_PB20 ((unsigned int) 1 << 20) // Pin Controlled by PB20 -#define AT91C_PB20_TIOA4 ((unsigned int) AT91C_PIO_PB20) // Timer Counter 4 Multipurpose Timer I/O Pin A -#define AT91C_PB20_SPI1_NPCS2 ((unsigned int) AT91C_PIO_PB20) // SPI1 Peripheral Chip Select 2 -#define AT91C_PIO_PB21 ((unsigned int) 1 << 21) // Pin Controlled by PB21 -#define AT91C_PB21_TIOB4 ((unsigned int) AT91C_PIO_PB21) // Timer Counter 4 Multipurpose Timer I/O Pin B -#define AT91C_PB21_SPI1_NPCS3 ((unsigned int) AT91C_PIO_PB21) // SPI1 Peripheral Chip Select 3 -#define AT91C_PIO_PB22 ((unsigned int) 1 << 22) // Pin Controlled by PB22 -#define AT91C_PB22_TIOA5 ((unsigned int) AT91C_PIO_PB22) // Timer Counter 5 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PB23 ((unsigned int) 1 << 23) // Pin Controlled by PB23 -#define AT91C_PB23_TIOB5 ((unsigned int) AT91C_PIO_PB23) // Timer Counter 5 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PB24 ((unsigned int) 1 << 24) // Pin Controlled by PB24 -#define AT91C_PB24_TIOA6 ((unsigned int) AT91C_PIO_PB24) // Timer Counter 6 Multipurpose Timer I/O Pin A -#define AT91C_PB24_RTS1 ((unsigned int) AT91C_PIO_PB24) // USART 1 Ready To Send -#define AT91C_PIO_PB25 ((unsigned int) 1 << 25) // Pin Controlled by PB25 -#define AT91C_PB25_TIOB6 ((unsigned int) AT91C_PIO_PB25) // Timer Counter 6 Multipurpose Timer I/O Pin B -#define AT91C_PB25_CTS1 ((unsigned int) AT91C_PIO_PB25) // USART 1 Clear To Send -#define AT91C_PIO_PB26 ((unsigned int) 1 << 26) // Pin Controlled by PB26 -#define AT91C_PB26_TIOA7 ((unsigned int) AT91C_PIO_PB26) // Timer Counter 7 Multipurpose Timer I/O Pin A -#define AT91C_PB26_SCK1 ((unsigned int) AT91C_PIO_PB26) // USART 1 Serial Clock -#define AT91C_PIO_PB27 ((unsigned int) 1 << 27) // Pin Controlled by PB27 -#define AT91C_PB27_TIOB7 ((unsigned int) AT91C_PIO_PB27) // Timer Counter 7 Multipurpose Timer I/O Pin B -#define AT91C_PB27_RTS2 ((unsigned int) AT91C_PIO_PB27) // USART 2 Ready To Send -#define AT91C_PIO_PB28 ((unsigned int) 1 << 28) // Pin Controlled by PB28 -#define AT91C_PB28_TIOA8 ((unsigned int) AT91C_PIO_PB28) // Timer Counter 8 Multipurpose Timer I/O Pin A -#define AT91C_PB28_CTS2 ((unsigned int) AT91C_PIO_PB28) // USART 2 Clear To Send -#define AT91C_PIO_PB29 ((unsigned int) 1 << 29) // Pin Controlled by PB29 -#define AT91C_PB29_TIOB8 ((unsigned int) AT91C_PIO_PB29) // Timer Counter 8 Multipurpose Timer I/O Pin B -#define AT91C_PB29_SCK2 ((unsigned int) AT91C_PIO_PB29) // USART 2 Serial Clock -#define AT91C_PIO_PB3 ((unsigned int) 1 << 3) // Pin Controlled by PB3 -#define AT91C_PB3_TK0 ((unsigned int) AT91C_PIO_PB3) // SSC Transmit Clock 0 -#define AT91C_PB3_PCK0 ((unsigned int) AT91C_PIO_PB3) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PB4 ((unsigned int) 1 << 4) // Pin Controlled by PB4 -#define AT91C_PB4_TD0 ((unsigned int) AT91C_PIO_PB4) // SSC Transmit data -#define AT91C_PB4_PCK1 ((unsigned int) AT91C_PIO_PB4) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PB5 ((unsigned int) 1 << 5) // Pin Controlled by PB5 -#define AT91C_PB5_RD0 ((unsigned int) AT91C_PIO_PB5) // SSC Receive Data -#define AT91C_PB5_PCK2 ((unsigned int) AT91C_PIO_PB5) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PB6 ((unsigned int) 1 << 6) // Pin Controlled by PB6 -#define AT91C_PB6_RK0 ((unsigned int) AT91C_PIO_PB6) // SSC Receive Clock -#define AT91C_PB6_PCK3 ((unsigned int) AT91C_PIO_PB6) // PMC Programmable Clock Output 3 -#define AT91C_PIO_PB7 ((unsigned int) 1 << 7) // Pin Controlled by PB7 -#define AT91C_PB7_RF0 ((unsigned int) AT91C_PIO_PB7) // SSC Receive Frame Sync 0 -#define AT91C_PB7_CANTX1 ((unsigned int) AT91C_PIO_PB7) // CAN Transmit 1 -#define AT91C_PIO_PB8 ((unsigned int) 1 << 8) // Pin Controlled by PB8 -#define AT91C_PB8_FIQ ((unsigned int) AT91C_PIO_PB8) // AIC Fast Interrupt Input -#define AT91C_PB8_TF1 ((unsigned int) AT91C_PIO_PB8) // SSC Transmit Frame Sync 1 -#define AT91C_PIO_PB9 ((unsigned int) 1 << 9) // Pin Controlled by PB9 -#define AT91C_PB9_TCLK0 ((unsigned int) AT91C_PIO_PB9) // Timer Counter 0 external clock input -#define AT91C_PB9_TK1 ((unsigned int) AT91C_PIO_PB9) // SSC Transmit Clock 1 - -// ***************************************************************************** -// PERIPHERAL ID DEFINITIONS FOR AT91SAM7A3 -// ***************************************************************************** -#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ) -#define AT91C_ID_SYS ((unsigned int) 1) // System Peripheral -#define AT91C_ID_PIOA ((unsigned int) 2) // Parallel IO Controller A -#define AT91C_ID_PIOB ((unsigned int) 3) // Parallel IO Controller B -#define AT91C_ID_CAN0 ((unsigned int) 4) // Control Area Network Controller 0 -#define AT91C_ID_CAN1 ((unsigned int) 5) // Control Area Network Controller 1 -#define AT91C_ID_US0 ((unsigned int) 6) // USART 0 -#define AT91C_ID_US1 ((unsigned int) 7) // USART 1 -#define AT91C_ID_US2 ((unsigned int) 8) // USART 2 -#define AT91C_ID_MCI ((unsigned int) 9) // Multimedia Card Interface -#define AT91C_ID_TWI ((unsigned int) 10) // Two-Wire Interface -#define AT91C_ID_SPI0 ((unsigned int) 11) // Serial Peripheral Interface 0 -#define AT91C_ID_SPI1 ((unsigned int) 12) // Serial Peripheral Interface 1 -#define AT91C_ID_SSC0 ((unsigned int) 13) // Serial Synchronous Controller 0 -#define AT91C_ID_SSC1 ((unsigned int) 14) // Serial Synchronous Controller 1 -#define AT91C_ID_TC0 ((unsigned int) 15) // Timer Counter 0 -#define AT91C_ID_TC1 ((unsigned int) 16) // Timer Counter 1 -#define AT91C_ID_TC2 ((unsigned int) 17) // Timer Counter 2 -#define AT91C_ID_TC3 ((unsigned int) 18) // Timer Counter 3 -#define AT91C_ID_TC4 ((unsigned int) 19) // Timer Counter 4 -#define AT91C_ID_TC5 ((unsigned int) 20) // Timer Counter 5 -#define AT91C_ID_TC6 ((unsigned int) 21) // Timer Counter 6 -#define AT91C_ID_TC7 ((unsigned int) 22) // Timer Counter 7 -#define AT91C_ID_TC8 ((unsigned int) 23) // Timer Counter 8 -#define AT91C_ID_ADC0 ((unsigned int) 24) // Analog To Digital Converter 0 -#define AT91C_ID_ADC1 ((unsigned int) 25) // Analog To Digital Converter 1 -#define AT91C_ID_PWMC ((unsigned int) 26) // Pulse Width Modulation Controller -#define AT91C_ID_UDP ((unsigned int) 27) // USB Device Port -#define AT91C_ID_IRQ0 ((unsigned int) 28) // Advanced Interrupt Controller (IRQ0) -#define AT91C_ID_IRQ1 ((unsigned int) 29) // Advanced Interrupt Controller (IRQ1) -#define AT91C_ID_IRQ2 ((unsigned int) 30) // Advanced Interrupt Controller (IRQ2) -#define AT91C_ID_IRQ3 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ3) -#define AT91C_ALL_INT ((unsigned int) 0xFFFFFFFF) // ALL VALID INTERRUPTS - -// ***************************************************************************** -// BASE ADDRESS DEFINITIONS FOR AT91SAM7A3 -// ***************************************************************************** -#define AT91C_BASE_SYS ((AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address -#define AT91C_BASE_AIC ((AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address -#define AT91C_BASE_PDC_DBGU ((AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address -#define AT91C_BASE_DBGU ((AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address -#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address -#define AT91C_BASE_PIOB ((AT91PS_PIO) 0xFFFFF600) // (PIOB) Base Address -#define AT91C_BASE_CKGR ((AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address -#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address -#define AT91C_BASE_RSTC ((AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address -#define AT91C_BASE_SHDWC ((AT91PS_SHDWC) 0xFFFFFD10) // (SHDWC) Base Address -#define AT91C_BASE_RTTC ((AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address -#define AT91C_BASE_PITC ((AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address -#define AT91C_BASE_WDTC ((AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address -#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address -#define AT91C_BASE_CAN0_MB0 ((AT91PS_CAN_MB) 0xFFF80200) // (CAN0_MB0) Base Address -#define AT91C_BASE_CAN0_MB1 ((AT91PS_CAN_MB) 0xFFF80220) // (CAN0_MB1) Base Address -#define AT91C_BASE_CAN0_MB2 ((AT91PS_CAN_MB) 0xFFF80240) // (CAN0_MB2) Base Address -#define AT91C_BASE_CAN0_MB3 ((AT91PS_CAN_MB) 0xFFF80260) // (CAN0_MB3) Base Address -#define AT91C_BASE_CAN0_MB4 ((AT91PS_CAN_MB) 0xFFF80280) // (CAN0_MB4) Base Address -#define AT91C_BASE_CAN0_MB5 ((AT91PS_CAN_MB) 0xFFF802A0) // (CAN0_MB5) Base Address -#define AT91C_BASE_CAN0_MB6 ((AT91PS_CAN_MB) 0xFFF802C0) // (CAN0_MB6) Base Address -#define AT91C_BASE_CAN0_MB7 ((AT91PS_CAN_MB) 0xFFF802E0) // (CAN0_MB7) Base Address -#define AT91C_BASE_CAN0_MB8 ((AT91PS_CAN_MB) 0xFFF80300) // (CAN0_MB8) Base Address -#define AT91C_BASE_CAN0_MB9 ((AT91PS_CAN_MB) 0xFFF80320) // (CAN0_MB9) Base Address -#define AT91C_BASE_CAN0_MB10 ((AT91PS_CAN_MB) 0xFFF80340) // (CAN0_MB10) Base Address -#define AT91C_BASE_CAN0_MB11 ((AT91PS_CAN_MB) 0xFFF80360) // (CAN0_MB11) Base Address -#define AT91C_BASE_CAN0_MB12 ((AT91PS_CAN_MB) 0xFFF80380) // (CAN0_MB12) Base Address -#define AT91C_BASE_CAN0_MB13 ((AT91PS_CAN_MB) 0xFFF803A0) // (CAN0_MB13) Base Address -#define AT91C_BASE_CAN0_MB14 ((AT91PS_CAN_MB) 0xFFF803C0) // (CAN0_MB14) Base Address -#define AT91C_BASE_CAN0_MB15 ((AT91PS_CAN_MB) 0xFFF803E0) // (CAN0_MB15) Base Address -#define AT91C_BASE_CAN0 ((AT91PS_CAN) 0xFFF80000) // (CAN0) Base Address -#define AT91C_BASE_CAN1_MB0 ((AT91PS_CAN_MB) 0xFFF84200) // (CAN1_MB0) Base Address -#define AT91C_BASE_CAN1_MB1 ((AT91PS_CAN_MB) 0xFFF84220) // (CAN1_MB1) Base Address -#define AT91C_BASE_CAN1_MB2 ((AT91PS_CAN_MB) 0xFFF84240) // (CAN1_MB2) Base Address -#define AT91C_BASE_CAN1_MB3 ((AT91PS_CAN_MB) 0xFFF84260) // (CAN1_MB3) Base Address -#define AT91C_BASE_CAN1_MB4 ((AT91PS_CAN_MB) 0xFFF84280) // (CAN1_MB4) Base Address -#define AT91C_BASE_CAN1_MB5 ((AT91PS_CAN_MB) 0xFFF842A0) // (CAN1_MB5) Base Address -#define AT91C_BASE_CAN1_MB6 ((AT91PS_CAN_MB) 0xFFF842C0) // (CAN1_MB6) Base Address -#define AT91C_BASE_CAN1_MB7 ((AT91PS_CAN_MB) 0xFFF842E0) // (CAN1_MB7) Base Address -#define AT91C_BASE_CAN1_MB8 ((AT91PS_CAN_MB) 0xFFF84300) // (CAN1_MB8) Base Address -#define AT91C_BASE_CAN1_MB9 ((AT91PS_CAN_MB) 0xFFF84320) // (CAN1_MB9) Base Address -#define AT91C_BASE_CAN1_MB10 ((AT91PS_CAN_MB) 0xFFF84340) // (CAN1_MB10) Base Address -#define AT91C_BASE_CAN1_MB11 ((AT91PS_CAN_MB) 0xFFF84360) // (CAN1_MB11) Base Address -#define AT91C_BASE_CAN1_MB12 ((AT91PS_CAN_MB) 0xFFF84380) // (CAN1_MB12) Base Address -#define AT91C_BASE_CAN1_MB13 ((AT91PS_CAN_MB) 0xFFF843A0) // (CAN1_MB13) Base Address -#define AT91C_BASE_CAN1_MB14 ((AT91PS_CAN_MB) 0xFFF843C0) // (CAN1_MB14) Base Address -#define AT91C_BASE_CAN1_MB15 ((AT91PS_CAN_MB) 0xFFF843E0) // (CAN1_MB15) Base Address -#define AT91C_BASE_CAN1 ((AT91PS_CAN) 0xFFF84000) // (CAN1) Base Address -#define AT91C_BASE_TC0 ((AT91PS_TC) 0xFFFA0000) // (TC0) Base Address -#define AT91C_BASE_TC1 ((AT91PS_TC) 0xFFFA0040) // (TC1) Base Address -#define AT91C_BASE_TC2 ((AT91PS_TC) 0xFFFA0080) // (TC2) Base Address -#define AT91C_BASE_TCB0 ((AT91PS_TCB) 0xFFFA0000) // (TCB0) Base Address -#define AT91C_BASE_TC3 ((AT91PS_TC) 0xFFFA4000) // (TC3) Base Address -#define AT91C_BASE_TC4 ((AT91PS_TC) 0xFFFA4040) // (TC4) Base Address -#define AT91C_BASE_TC5 ((AT91PS_TC) 0xFFFA4080) // (TC5) Base Address -#define AT91C_BASE_TCB1 ((AT91PS_TCB) 0xFFFA4000) // (TCB1) Base Address -#define AT91C_BASE_TC6 ((AT91PS_TC) 0xFFFA8000) // (TC6) Base Address -#define AT91C_BASE_TC7 ((AT91PS_TC) 0xFFFA8040) // (TC7) Base Address -#define AT91C_BASE_TC8 ((AT91PS_TC) 0xFFFA8080) // (TC8) Base Address -#define AT91C_BASE_TCB2 ((AT91PS_TCB) 0xFFFA8000) // (TCB2) Base Address -#define AT91C_BASE_PDC_MCI ((AT91PS_PDC) 0xFFFAC100) // (PDC_MCI) Base Address -#define AT91C_BASE_MCI ((AT91PS_MCI) 0xFFFAC000) // (MCI) Base Address -#define AT91C_BASE_UDP ((AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address -#define AT91C_BASE_TWI ((AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address -#define AT91C_BASE_PDC_US0 ((AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address -#define AT91C_BASE_US0 ((AT91PS_USART) 0xFFFC0000) // (US0) Base Address -#define AT91C_BASE_PDC_US1 ((AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address -#define AT91C_BASE_US1 ((AT91PS_USART) 0xFFFC4000) // (US1) Base Address -#define AT91C_BASE_PDC_US2 ((AT91PS_PDC) 0xFFFC8100) // (PDC_US2) Base Address -#define AT91C_BASE_US2 ((AT91PS_USART) 0xFFFC8000) // (US2) Base Address -#define AT91C_BASE_PWMC_CH0 ((AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address -#define AT91C_BASE_PWMC_CH1 ((AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address -#define AT91C_BASE_PWMC_CH2 ((AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address -#define AT91C_BASE_PWMC_CH3 ((AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address -#define AT91C_BASE_PWMC_CH4 ((AT91PS_PWMC_CH) 0xFFFCC280) // (PWMC_CH4) Base Address -#define AT91C_BASE_PWMC_CH5 ((AT91PS_PWMC_CH) 0xFFFCC2A0) // (PWMC_CH5) Base Address -#define AT91C_BASE_PWMC_CH6 ((AT91PS_PWMC_CH) 0xFFFCC2C0) // (PWMC_CH6) Base Address -#define AT91C_BASE_PWMC_CH7 ((AT91PS_PWMC_CH) 0xFFFCC2E0) // (PWMC_CH7) Base Address -#define AT91C_BASE_PWMC ((AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address -#define AT91C_BASE_PDC_SSC0 ((AT91PS_PDC) 0xFFFD0100) // (PDC_SSC0) Base Address -#define AT91C_BASE_SSC0 ((AT91PS_SSC) 0xFFFD0000) // (SSC0) Base Address -#define AT91C_BASE_PDC_SSC1 ((AT91PS_PDC) 0xFFFD4100) // (PDC_SSC1) Base Address -#define AT91C_BASE_SSC1 ((AT91PS_SSC) 0xFFFD4000) // (SSC1) Base Address -#define AT91C_BASE_PDC_ADC0 ((AT91PS_PDC) 0xFFFD8100) // (PDC_ADC0) Base Address -#define AT91C_BASE_ADC0 ((AT91PS_ADC) 0xFFFD8000) // (ADC0) Base Address -#define AT91C_BASE_PDC_ADC1 ((AT91PS_PDC) 0xFFFDC100) // (PDC_ADC1) Base Address -#define AT91C_BASE_ADC1 ((AT91PS_ADC) 0xFFFDC000) // (ADC1) Base Address -#define AT91C_BASE_PDC_SPI0 ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI0) Base Address -#define AT91C_BASE_SPI0 ((AT91PS_SPI) 0xFFFE0000) // (SPI0) Base Address -#define AT91C_BASE_PDC_SPI1 ((AT91PS_PDC) 0xFFFE4100) // (PDC_SPI1) Base Address -#define AT91C_BASE_SPI1 ((AT91PS_SPI) 0xFFFE4000) // (SPI1) Base Address - -// ***************************************************************************** -// MEMORY MAPPING DEFINITIONS FOR AT91SAM7A3 -// ***************************************************************************** -// ISRAM -#define AT91C_ISRAM ((char *) 0x00200000) // Internal SRAM base address -#define AT91C_ISRAM_SIZE ((unsigned int) 0x00008000) // Internal SRAM size in byte (32 Kbytes) -// IFLASH -#define AT91C_IFLASH ((char *) 0x00100000) // Internal FLASH base address -#define AT91C_IFLASH_SIZE ((unsigned int) 0x00040000) // Internal FLASH size in byte (256 Kbytes) -#define AT91C_IFLASH_PAGE_SIZE ((unsigned int) 256) // Internal FLASH Page Size: 256 bytes -#define AT91C_IFLASH_LOCK_REGION_SIZE ((unsigned int) 16384) // Internal FLASH Lock Region Size: 16 Kbytes -#define AT91C_IFLASH_NB_OF_PAGES ((unsigned int) 1024) // Internal FLASH Number of Pages: 1024 bytes -#define AT91C_IFLASH_NB_OF_LOCK_BITS ((unsigned int) 16) // Internal FLASH Number of Lock Bits: 16 bytes - -#endif diff --git a/platforms_startup/armcc/AT91SAM7A3/Makefile b/platforms_startup/armcc/AT91SAM7A3/Makefile deleted file mode 100644 index 13dac3705..000000000 --- a/platforms_startup/armcc/AT91SAM7A3/Makefile +++ /dev/null @@ -1,125 +0,0 @@ -# Makefile to create startup library for AT91SAM7A3 chip - -.SILENT: - -CPU = ARM7TDMI -CPU_MODE = thumb -TARGET_PLATFORM =armcc_$(CPU)_$(CPU_MODE) - -CPPUTEST_HOME = ../../.. - -# component name -COMPONENT_NAME = Startup_AT91SAM7A3 - -# directory to place artefacts -OBJS_DIR = objs - -# directory to place startup library -LIB_DIR = $(CPPUTEST_HOME)/lib/$(TARGET_PLATFORM) - -# directory with source files -SRC_DIRS = . - -# directory with header files -INCLUDE_DIRS = . - -# CYGWIN path -CYGWIN =C:/CYGWIN/bin -MKDIR =$(CYGWIN)/mkdir -RM =$(CYGWIN)/rm -TOUCH =$(CYGWIN)/touch - -KEIL_DIR=D:/Keil/ARM/ARMCC -CC=$(KEIL_DIR)/bin/armcc.exe -AS=$(KEIL_DIR)/bin/armasm.exe -AR=$(KEIL_DIR)/bin/armar.exe -# armcc system include path -SYS_INCLUDE_DIRS =$(KEIL_DIR)/include - -# adding Keil MDK-ARM system headers to build startup library -INCLUDE_DIRS +=$(SYS_INCLUDE_DIRS) - -CPUFLAGS =--cpu=$(CPU) -ifeq ($(CPU_MODE), thumb) - CPUFLAGS +=--apcs=/interwork -endif - -DEPFLAGS =-M \ - $(INCLUDES) \ - --depend_format=unix_escaped \ - --depend_single_line \ - --no_depend_system_headers - -OPTFLAGS =-O3 - -CPPUTEST_CPPFLAGS =$(CPUFLAGS) \ - $(OPTFLAGS) \ - -c \ - -g \ - $(INCLUDES) \ - --$(CPU_MODE) \ - -D__CLK_TCK=1000 \ - -ARFLAGS = --debug_symbols - - -TARGET_LIB = \ - $(LIB_DIR)/lib$(COMPONENT_NAME).a - -#Helper Functions -get_src_from_dir = $(wildcard $1/*.c) $(wildcard $1/*.asm) -get_src_from_dir_list = $(foreach dir, $1, $(call get_src_from_dir,$(dir))) -__src_to = $(subst .asm,$1, $(subst .c,$1,$2)) -src_to = $(addprefix $3/,$(call __src_to,$1,$2)) -src_to_o = $(call src_to,.o,$1,$2) -src_to_d = $(call src_to,.d,$1,$2) -time = $(shell date +%s) -delta_t = $(eval minus, $1, $2) -debug_print_list = $(foreach word,$1,echo " $(word)";) echo - -# for building CRT library -SRC = $(call get_src_from_dir_list, $(SRC_DIRS)) -OBJ = $(call src_to_o,$(SRC),$(OBJS_DIR)) -INCLUDES += $(foreach dir, $(INCLUDE_DIRS), -I$(dir)) -DEP_FILES = $(call src_to_d, $(SRC), $(OBJS_DIR)) -STUFF_TO_CLEAN = $(OBJ) $(DEP_FILES) - -#Don't create CRT dependencies when we're cleaning, for instance -ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS)))) - -include $(DEP_FILES) -endif - -all: $(TARGET_LIB) - echo Done! - -$(TARGET_LIB): $(OBJ) | $(LIB_DIR) - $(AR) $(ARFLAGS) --create $@ $^ - echo Build CRT library done! - -$(LIB_DIR) $(OBJS_DIR): - echo Updating directory $@ - $(MKDIR) -p $@ - -#This is the rule for creating the dependency files -$(OBJS_DIR)/%.d: %.c Makefile | $(OBJS_DIR) - echo Compiling C file $< for dependency. Out file $@. - $(CC) $(DEPFLAGS) $< --depend=$@ --depend_target='$(patsubst %.d,%.o,$@)' - -$(OBJS_DIR)/%.d: %.asm | $(OBJS_DIR) - echo Compiling ASM file $< for dependency. Out file $@. - $(TOUCH) $@ - -#This rule does the compilation C files -$(OBJS_DIR)/%.o: %.c $(OBJS_DIR)/%.d - echo Compiling C file $<. Out file $@ - $(CC) $(CPPUTEST_CPPFLAGS) $< -o $@ - -#This rule does the compilation ASM -$(OBJS_DIR)/%.o: %.asm $(OBJS_DIR)/%.d - echo Assembling file $<. Out file $@ - $(AS) $(CPUFLAGS) --diag-suppress 1786 $< -o $@ - - -clean: - @$(RM) -f $(STUFF_TO_CLEAN) - diff --git a/platforms_startup/armcc/AT91SAM7A3/README b/platforms_startup/armcc/AT91SAM7A3/README deleted file mode 100644 index ed704bc2d..000000000 --- a/platforms_startup/armcc/AT91SAM7A3/README +++ /dev/null @@ -1,9 +0,0 @@ -Startup library for ARM C/C++ compiler and AT91SAM7A3 chip. -Semihosting is in use, so you may use standard printf() or std::cout << "Hello!" - -Requirements: -1. CYGWIN (rm.exe, mkdir.exe, make.exe, echo.exe) -2. Keil MDK-ARM - -Library libStartup_AT91SAM7A3.a is placed in ./lib/armcc_ARM7TDMI_thumb - directory of home CppUTest directory. diff --git a/platforms_startup/armcc/AT91SAM7A3/Retarget.c b/platforms_startup/armcc/AT91SAM7A3/Retarget.c deleted file mode 100644 index 24f3443e3..000000000 --- a/platforms_startup/armcc/AT91SAM7A3/Retarget.c +++ /dev/null @@ -1,177 +0,0 @@ -/*---------------------------------------------------------------------------- - * Name: Retarget.c - * Purpose: 'Retarget' layer for target-dependent low level functions - * Note(s): - *---------------------------------------------------------------------------- - * This file is part of the uVision/ARM development tools. - * This software may only be used under the terms of a valid, current, - * end user licence from KEIL for a compatible version of KEIL software - * development tools. Nothing else gives you the right to use this software. - * - * This software is supplied "AS IS" without warranties of any kind. - * - * Copyright (c) 2011 Keil - An ARM Company. All rights reserved. - *----------------------------------------------------------------------------*/ - -#include -#include -#include -#include "lib_AT91SAM7A3.h" - -/* Standard IO device handles. */ -#define STDIN 0x8001 -#define STDOUT 0x8002 -#define STDERR 0x8003 - - -#pragma import(__use_no_semihosting_swi) - -const char __stdin_name[] = "STDIN"; -const char __stdout_name[] = "STDOUT"; -const char __stderr_name[] = "STDERR"; - -static int init_UART_done = 0; -static void UART_putc(unsigned char); -static void UART_init(void); - - -FILEHANDLE _sys_open(const char *name, int openmode) -{ - FILEHANDLE rc; - /* Register standard Input Output devices. */ - if (strcmp(name, "STDIN") == 0) rc = STDIN; - else if (strcmp(name, "STDOUT") == 0) rc = STDOUT; - else if (strcmp(name, "STDERR") == 0) rc = STDERR; - else rc = 1; - return (rc); -} - -int _sys_close(FILEHANDLE fh) -{ - return 0; -} - -int _sys_write(FILEHANDLE fh, const unsigned char *buf, - unsigned len, int mode) -{ - while (len) { - UART_putc(*buf); - buf++; - len--; - } - return len; -} - -int _sys_read(FILEHANDLE fh, unsigned char *buf, - unsigned len, int mode) -{ - return -1; /* not supported */ -} - -void _ttywrch(int ch) -{ - UART_putc(ch); -} - -int _sys_istty(FILEHANDLE fh) -{ - return 0; /* buffered output */ -} - -int _sys_seek(FILEHANDLE fh, long pos) -{ - return -1; /* not supported */ -} - -long _sys_flen(FILEHANDLE fh) -{ - return -1; /* not supported */ -} - -void _sys_exit(int return_code) { - while(1); -} - -char *_sys_command_string(char *cmd, int len) -{ - const char * const arg[] = { - "tst.axf", - "-v", - "-gSimpleStringBuffer", - "-ojunit"}; - int i, j; - char *rc = cmd; - if (len) { - /* Specify commandline arguments here as needed */ - len = sizeof(arg) / sizeof(char *); - for (i = 0; i < len; i++) { - j = strlen(arg[i])+1; - if (cmd - rc + j > len) { - rc = NULL; - break; - } - memcpy(cmd, arg[i], j); - cmd += j; - } - if (rc) rc = cmd; - } else rc = NULL; - return rc; -} - -void _clock_init(void) -{ - AT91F_PITInit(AT91C_BASE_PITC, 1000, 50); /* Period = 1000 Hz, CLK = 50 MHz */ -} - -clock_t clock(void) -{ - static clock_t rc = 0; - rc += AT91F_PITGetPIVR(AT91C_BASE_PITC) >> 20; - return rc; -} - -time_t time(time_t *timer) -{ - return 0; -} - - -static void UART_putc(unsigned char ch) -{ - if (init_UART_done == 0) { - UART_init(); - init_UART_done++; - } - while ((AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY) == 0) __nop(); - AT91C_BASE_DBGU->DBGU_THR = ch; -} - -static void UART_init(void) -{ - AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_SYS; - AT91C_BASE_PIOA->PIO_PDR = (1<<30) | (1UL<<31); - AT91C_BASE_PIOA->PIO_ASR = (1<<30) | (1UL<<31); - AT91C_BASE_DBGU->DBGU_IDR = ~0; - AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS | AT91C_US_RSTSTA; - AT91C_BASE_DBGU->DBGU_BRGR = 27; /* 115200 if MCLK = 50 МГц */ - AT91C_BASE_DBGU->DBGU_MR = AT91C_US_PAR_NONE | AT91C_US_CHMODE_NORMAL; - AT91C_BASE_DBGU->DBGU_CR = AT91C_US_TXEN; - AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN; - AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTSTA; /* Reset status IRQ */ -} - -/* Replace of default Keil MDK-ARM function to create linked list of - * destructor addresses of global or statically created objects. List is - * placed in heap at startup. - * No exit() is planned to call (exit from main() never take place in - * embedded applications). So, it is no need to that list and it is possible - * to use less heap memory. - * New version of __aeabi_atexit does not create that list. See also - * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3951.html - * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0041d/IHI0041D_cppabi.pdf - */ -int __aeabi_atexit(void* object, void (*destroyer)(void*), void* dso_handle) -{ - return 1; // 0: failed; non-0: OK -// return __cxa_atexit(destroyer, object, dso_handle); /* Keil MDK-ARM version */ -} diff --git a/platforms_startup/armcc/AT91SAM7A3/SAM7A3.asm b/platforms_startup/armcc/AT91SAM7A3/SAM7A3.asm deleted file mode 100644 index 2edec9072..000000000 --- a/platforms_startup/armcc/AT91SAM7A3/SAM7A3.asm +++ /dev/null @@ -1,434 +0,0 @@ -;/*****************************************************************************/ -;/* SAM7.S: Startup file for Atmel AT91SAM7 device series */ -;/*****************************************************************************/ -;/* <<< Use Configuration Wizard in Context Menu >>> */ -;/*****************************************************************************/ -;/* This file is part of the uVision/ARM development tools. */ -;/* Copyright (c) 2005-2008 Keil Software. All rights reserved. */ -;/* This software may only be used under the terms of a valid, current, */ -;/* end user licence from KEIL for a compatible version of KEIL software */ -;/* development tools. Nothing else gives you the right to use this software. */ -;/*****************************************************************************/ - - -;/* -; * The SAM7.S code is executed after CPU Reset. This file may be -; * translated with the following SET symbols. In uVision these SET -; * symbols are entered under Options - ASM - Define. -; * -; * REMAP: when set the startup code remaps exception vectors from -; * on-chip RAM to address 0. -; * -; * RAM_INTVEC: when set the startup code copies exception vectors -; * from on-chip Flash to on-chip RAM. -; */ - - -; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs - -Mode_USR EQU 0x10 -Mode_FIQ EQU 0x11 -Mode_IRQ EQU 0x12 -Mode_SVC EQU 0x13 -Mode_ABT EQU 0x17 -Mode_UND EQU 0x1B -Mode_SYS EQU 0x1F - -I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled -F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled - - -; Internal Memory Base Addresses -FLASH_BASE EQU 0x00100000 -RAM_BASE EQU 0x00200000 - - -;// Stack Configuration (Stack Sizes in Bytes) -;// Undefined Mode <0x0-0xFFFFFFFF:8> -;// Supervisor Mode <0x0-0xFFFFFFFF:8> -;// Abort Mode <0x0-0xFFFFFFFF:8> -;// Fast Interrupt Mode <0x0-0xFFFFFFFF:8> -;// Interrupt Mode <0x0-0xFFFFFFFF:8> -;// User/System Mode <0x0-0xFFFFFFFF:8> -;// - -UND_Stack_Size EQU 0x00000000 -SVC_Stack_Size EQU 0x00001000 -ABT_Stack_Size EQU 0x00000000 -FIQ_Stack_Size EQU 0x00000000 -IRQ_Stack_Size EQU 0x00000070 -USR_Stack_Size EQU 0x00000000 - -ISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \ - FIQ_Stack_Size + IRQ_Stack_Size) - - AREA STACK, NOINIT, READWRITE, ALIGN=3 - -Stack_Mem SPACE USR_Stack_Size -__initial_sp SPACE ISR_Stack_Size - -Stack_Top - - -;// Heap Configuration -;// Heap Size (in Bytes) <0x0-0xFFFFFFFF> -;// - -Heap_Size EQU 0x0002800 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - -; Reset Controller (RSTC) definitions -RSTC_BASE EQU 0xFFFFFD00 ; RSTC Base Address -RSTC_MR EQU 0x08 ; RSTC_MR Offset - -;/* -;// Reset Controller (RSTC) -;// URSTEN: User Reset Enable -;// Enables NRST Pin to generate Reset -;// ERSTL: External Reset Length <0-15> -;// External Reset Time in 2^(ERSTL+1) Slow Clock Cycles -;// -;*/ -RSTC_SETUP EQU 1 -RSTC_MR_Val EQU 0xA5000401 - - -; Embedded Flash Controller (EFC) definitions -EFC_BASE EQU 0xFFFFFF00 ; EFC Base Address -EFC0_FMR EQU 0x60 ; EFC0_FMR Offset -EFC1_FMR EQU 0x70 ; EFC1_FMR Offset - -;// Embedded Flash Controller 0 (EFC0) -;// FMCN: Flash Microsecond Cycle Number <0-255> -;// Number of Master Clock Cycles in 1us -;// FWS: Flash Wait State -;// <0=> Read: 1 cycle / Write: 2 cycles -;// <1=> Read: 2 cycle / Write: 3 cycles -;// <2=> Read: 3 cycle / Write: 4 cycles -;// <3=> Read: 4 cycle / Write: 4 cycles -;// -EFC0_SETUP EQU 1 -EFC0_FMR_Val EQU 0x004B0100 - -;// Embedded Flash Controller 1 (EFC1) -;// FMCN: Flash Microsecond Cycle Number <0-255> -;// Number of Master Clock Cycles in 1us -;// FWS: Flash Wait State -;// <0=> Read: 1 cycle / Write: 2 cycles -;// <1=> Read: 2 cycle / Write: 3 cycles -;// <2=> Read: 3 cycle / Write: 4 cycles -;// <3=> Read: 4 cycle / Write: 4 cycles -;// -EFC1_SETUP EQU 0 -EFC1_FMR_Val EQU 0x00320100 - - -; Watchdog Timer (WDT) definitions -WDT_BASE EQU 0xFFFFFD40 ; WDT Base Address -WDT_MR EQU 0x04 ; WDT_MR Offset - -;// Watchdog Timer (WDT) -;// WDV: Watchdog Counter Value <0-4095> -;// WDD: Watchdog Delta Value <0-4095> -;// WDFIEN: Watchdog Fault Interrupt Enable -;// WDRSTEN: Watchdog Reset Enable -;// WDRPROC: Watchdog Reset Processor -;// WDDBGHLT: Watchdog Debug Halt -;// WDIDLEHLT: Watchdog Idle Halt -;// WDDIS: Watchdog Disable -;// -WDT_SETUP EQU 1 -WDT_MR_Val EQU 0x00008000 - - -; Power Mangement Controller (PMC) definitions -PMC_BASE EQU 0xFFFFFC00 ; PMC Base Address -PMC_MOR EQU 0x20 ; PMC_MOR Offset -PMC_MCFR EQU 0x24 ; PMC_MCFR Offset -PMC_PLLR EQU 0x2C ; PMC_PLLR Offset -PMC_MCKR EQU 0x30 ; PMC_MCKR Offset -PMC_SR EQU 0x68 ; PMC_SR Offset -PMC_MOSCEN EQU (1<<0) ; Main Oscillator Enable -PMC_OSCBYPASS EQU (1<<1) ; Main Oscillator Bypass -PMC_OSCOUNT EQU (0xFF<<8) ; Main OScillator Start-up Time -PMC_DIV EQU (0xFF<<0) ; PLL Divider -PMC_PLLCOUNT EQU (0x3F<<8) ; PLL Lock Counter -PMC_OUT EQU (0x03<<14) ; PLL Clock Frequency Range -PMC_MUL EQU (0x7FF<<16) ; PLL Multiplier -PMC_USBDIV EQU (0x03<<28) ; USB Clock Divider -PMC_CSS EQU (3<<0) ; Clock Source Selection -PMC_PRES EQU (7<<2) ; Prescaler Selection -PMC_MOSCS EQU (1<<0) ; Main Oscillator Stable -PMC_LOCK EQU (1<<2) ; PLL Lock Status -PMC_MCKRDY EQU (1<<3) ; Master Clock Status - -;// Power Mangement Controller (PMC) -;// Main Oscillator -;// MOSCEN: Main Oscillator Enable -;// OSCBYPASS: Oscillator Bypass -;// OSCCOUNT: Main Oscillator Startup Time <0-255> -;// -;// Phase Locked Loop (PLL) -;// DIV: PLL Divider <0-255> -;// MUL: PLL Multiplier <0-2047> -;// PLL Output is multiplied by MUL+1 -;// OUT: PLL Clock Frequency Range -;// <0=> 80..160MHz <1=> Reserved -;// <2=> 150..220MHz <3=> Reserved -;// PLLCOUNT: PLL Lock Counter <0-63> -;// USBDIV: USB Clock Divider -;// <0=> None <1=> 2 <2=> 4 <3=> Reserved -;// -;// CSS: Clock Source Selection -;// <0=> Slow Clock -;// <1=> Main Clock -;// <2=> Reserved -;// <3=> PLL Clock -;// PRES: Prescaler -;// <0=> None -;// <1=> Clock / 2 <2=> Clock / 4 -;// <3=> Clock / 8 <4=> Clock / 16 -;// <5=> Clock / 32 <6=> Clock / 64 -;// <7=> Reserved -;// -PMC_SETUP EQU 1 -PMC_MOR_Val EQU 0x00000601 -PMC_PLLR_Val EQU 0x00C71E04 -PMC_MCKR_Val EQU 0x0000000B - - - PRESERVE8 - - -; Area Definition and Entry Point -; Startup Code must be linked first at Address at which it expects to run. - - AREA |.reset|, CODE, READONLY - ARM - - -; Exception Vectors -; Mapped to Address 0. -; Absolute addressing mode must be used. -; Dummy Handlers are implemented as infinite loops which can be modified. - -Vectors LDR PC,Reset_Addr - LDR PC,Undef_Addr - LDR PC,SWI_Addr - LDR PC,PAbt_Addr - LDR PC,DAbt_Addr - NOP ; Reserved Vector -; LDR PC,IRQ_Addr - LDR PC,[PC,#-0xF20] ; Vector From AIC_IVR -; LDR PC,FIQ_Addr - LDR PC,[PC,#-0xF20] ; Vector From AIC_FVR - -Reset_Addr DCD Reset_Handler -Undef_Addr DCD Undef_Handler -SWI_Addr DCD SWI_Handler -PAbt_Addr DCD PAbt_Handler -DAbt_Addr DCD DAbt_Handler - DCD 0 ; Reserved Address -IRQ_Addr DCD IRQ_Handler -FIQ_Addr DCD FIQ_Handler - -Undef_Handler B Undef_Handler -SWI_Handler B SWI_Handler ; Part of RTL -PAbt_Handler B PAbt_Handler -DAbt_Handler B DAbt_Handler -IRQ_Handler B IRQ_Handler -FIQ_Handler B FIQ_Handler - - -; Reset Handler - - EXPORT Reset_Handler -Reset_Handler - - -; Setup RSTC - IF RSTC_SETUP != 0 - LDR R0, =RSTC_BASE - LDR R1, =RSTC_MR_Val - STR R1, [R0, #RSTC_MR] - ENDIF - - -; Setup EFC0 - IF EFC0_SETUP != 0 - LDR R0, =EFC_BASE - LDR R1, =EFC0_FMR_Val - STR R1, [R0, #EFC0_FMR] - ENDIF - -; Setup EFC1 - IF EFC1_SETUP != 0 - LDR R0, =EFC_BASE - LDR R1, =EFC1_FMR_Val - STR R1, [R0, #EFC1_FMR] - ENDIF - - -; Setup WDT - IF WDT_SETUP != 0 - LDR R0, =WDT_BASE - LDR R1, =WDT_MR_Val - STR R1, [R0, #WDT_MR] - ENDIF - - -; Setup PMC - IF PMC_SETUP != 0 - LDR R0, =PMC_BASE - -; Setup Main Oscillator - LDR R1, =PMC_MOR_Val - STR R1, [R0, #PMC_MOR] - -; Wait until Main Oscillator is stablilized - IF (PMC_MOR_Val:AND:PMC_MOSCEN) != 0 -MOSCS_Loop LDR R2, [R0, #PMC_SR] - ANDS R2, R2, #PMC_MOSCS - BEQ MOSCS_Loop - ENDIF - -; Setup the PLL - IF (PMC_PLLR_Val:AND:PMC_MUL) != 0 - LDR R1, =PMC_PLLR_Val - STR R1, [R0, #PMC_PLLR] - -; Wait until PLL is stabilized -PLL_Loop LDR R2, [R0, #PMC_SR] - ANDS R2, R2, #PMC_LOCK - BEQ PLL_Loop - ENDIF - -; Select Clock - IF (PMC_MCKR_Val:AND:PMC_CSS) == 1 ; Main Clock Selected - LDR R1, =PMC_MCKR_Val - AND R1, #PMC_CSS - STR R1, [R0, #PMC_MCKR] -WAIT_Rdy1 LDR R2, [R0, #PMC_SR] - ANDS R2, R2, #PMC_MCKRDY - BEQ WAIT_Rdy1 - LDR R1, =PMC_MCKR_Val - STR R1, [R0, #PMC_MCKR] -WAIT_Rdy2 LDR R2, [R0, #PMC_SR] - ANDS R2, R2, #PMC_MCKRDY - BEQ WAIT_Rdy2 - ELIF (PMC_MCKR_Val:AND:PMC_CSS) == 3 ; PLL Clock Selected - LDR R1, =PMC_MCKR_Val - AND R1, #PMC_PRES - STR R1, [R0, #PMC_MCKR] -WAIT_Rdy1 LDR R2, [R0, #PMC_SR] - ANDS R2, R2, #PMC_MCKRDY - BEQ WAIT_Rdy1 - LDR R1, =PMC_MCKR_Val - STR R1, [R0, #PMC_MCKR] -WAIT_Rdy2 LDR R2, [R0, #PMC_SR] - ANDS R2, R2, #PMC_MCKRDY - BEQ WAIT_Rdy2 - ENDIF ; Select Clock - ENDIF ; PMC_SETUP - - -; Copy Exception Vectors to Internal RAM - - IF :DEF:RAM_INTVEC - ADR R8, Vectors ; Source - LDR R9, =RAM_BASE ; Destination - LDMIA R8!, {R0-R7} ; Load Vectors - STMIA R9!, {R0-R7} ; Store Vectors - LDMIA R8!, {R0-R7} ; Load Handler Addresses - STMIA R9!, {R0-R7} ; Store Handler Addresses - ENDIF - - -; Remap on-chip RAM to address 0 - -MC_BASE EQU 0xFFFFFF00 ; MC Base Address -MC_RCR EQU 0x00 ; MC_RCR Offset - - IF :DEF:REMAP - LDR R0, =MC_BASE - MOV R1, #1 - STR R1, [R0, #MC_RCR] ; Remap - ENDIF - - -; Setup Stack for each mode - - LDR R0, =Stack_Top - -; Enter Undefined Instruction Mode and set its Stack Pointer - MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit - MOV SP, R0 - SUB R0, R0, #UND_Stack_Size - -; Enter Abort Mode and set its Stack Pointer - MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit - MOV SP, R0 - SUB R0, R0, #ABT_Stack_Size - -; Enter FIQ Mode and set its Stack Pointer - MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit - MOV SP, R0 - SUB R0, R0, #FIQ_Stack_Size - -; Enter IRQ Mode and set its Stack Pointer - MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit - MOV SP, R0 - SUB R0, R0, #IRQ_Stack_Size - -; Enter Supervisor Mode and set its Stack Pointer - MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit - MOV SP, R0 - SUB R0, R0, #SVC_Stack_Size - -; Enter User Mode and set its Stack Pointer -; MSR CPSR_c, #Mode_USR -; IF :DEF:__MICROLIB - -; EXPORT __initial_sp - -; ELSE - -; MOV SP, R0 -; SUB SL, SP, #USR_Stack_Size - -; ENDIF - - -; Enter the C code - - IMPORT __main - LDR R0, =__main - BX R0 - - - IF :DEF:__MICROLIB - - EXPORT __heap_base - EXPORT __heap_limit - - ELSE -; User Initial Stack & Heap - AREA |.text|, CODE, READONLY - - IMPORT __use_two_region_memory - EXPORT __user_setup_stackheap -__user_setup_stackheap - - LDR R0, = Heap_Mem - LDR R2, = (Heap_Mem + Heap_Size) - LDR SP, =(Stack_Mem + SVC_Stack_Size) - BX LR - ENDIF - - - END diff --git a/platforms_startup/armcc/AT91SAM7A3/lib_AT91SAM7A3.h b/platforms_startup/armcc/AT91SAM7A3/lib_AT91SAM7A3.h deleted file mode 100644 index a21319445..000000000 --- a/platforms_startup/armcc/AT91SAM7A3/lib_AT91SAM7A3.h +++ /dev/null @@ -1,5054 +0,0 @@ -//* ---------------------------------------------------------------------------- -//* ATMEL Microcontroller Software Support - ROUSSET - -//* ---------------------------------------------------------------------------- -//* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR -//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE -//* DISCLAIMED. IN NO EVENT SHALL ATMEL 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. -//* ---------------------------------------------------------------------------- -//* File Name : lib_AT91SAM7A3.h -//* Object : AT91SAM7A3 inlined functions -//* Generated : AT91 SW Application Group 09/13/2005 (09:48:02) -//* -//* CVS Reference : /lib_MC_SAM.h/1.3/Wed Apr 28 09:02:35 2004// -//* CVS Reference : /lib_pdc.h/1.2/Tue Jul 2 12:29:40 2002// -//* CVS Reference : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003// -//* CVS Reference : /lib_shdwc_6122A.h/1.1/Wed Oct 6 13:06:00 2004// -//* CVS Reference : /lib_spi2.h/1.2/Tue Aug 23 15:43:14 2005// -//* CVS Reference : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003// -//* CVS Reference : /lib_PWM_SAM.h/1.3/Wed Dec 3 10:23:10 2003// -//* CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// -//* CVS Reference : /lib_pitc_6079A.h/1.2/Thu Nov 4 14:01:11 2004// -//* CVS Reference : /lib_adc.h/1.6/Fri Oct 17 08:12:38 2003// -//* CVS Reference : /lib_pmc_SAM.h/1.9/Tue Aug 30 13:03:40 2005// -//* CVS Reference : /lib_rstc_6098A.h/1.1/Wed Oct 6 09:39:19 2004// -//* CVS Reference : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003// -//* CVS Reference : /lib_rttc_6081A.h/1.1/Wed Oct 6 09:39:38 2004// -//* CVS Reference : /lib_twi.h/1.3/Mon Jul 19 13:37:30 2004// -//* CVS Reference : /lib_usart.h/1.5/Thu Nov 21 16:01:53 2002// -//* CVS Reference : /lib_mci.h/1.7/Thu May 27 08:47:43 2004// -//* CVS Reference : /lib_wdtc_6080A.h/1.1/Wed Oct 6 09:38:30 2004// -//* CVS Reference : /lib_udp.h/1.5/Mon Aug 29 08:17:54 2005// -//* CVS Reference : /lib_aic_6075b.h/1.2/Mon Jul 18 11:06:01 2005// -//* CVS Reference : /lib_can_AT91.h/1.5/Tue Aug 23 15:42:51 2005// -//* ---------------------------------------------------------------------------- - -#ifndef lib_AT91SAM7A3_H -#define lib_AT91SAM7A3_H - -#include "AT91SAM7A3.h" -/* ***************************************************************************** - SOFTWARE API FOR AIC - ***************************************************************************** */ -#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20] - -//*---------------------------------------------------------------------------- -//* \fn AT91F_AIC_ConfigureIt -//* \brief Interrupt Handler Initialization -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_AIC_ConfigureIt ( - AT91PS_AIC pAic, // \arg pointer to the AIC registers - unsigned int irq_id, // \arg interrupt number to initialize - unsigned int priority, // \arg priority to give to the interrupt - unsigned int src_type, // \arg activation and sense of activation - void (*newHandler) () ) // \arg address of the interrupt handler -{ - unsigned int oldHandler; - unsigned int mask ; - - oldHandler = pAic->AIC_SVR[irq_id]; - - mask = 0x1 << irq_id ; - //* Disable the interrupt on the interrupt controller - pAic->AIC_IDCR = mask ; - //* Save the interrupt handler routine pointer and the interrupt priority - pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ; - //* Store the Source Mode Register - pAic->AIC_SMR[irq_id] = src_type | priority ; - //* Clear the interrupt on the interrupt controller - pAic->AIC_ICCR = mask ; - - return oldHandler; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_AIC_EnableIt -//* \brief Enable corresponding IT number -//*---------------------------------------------------------------------------- -__inline void AT91F_AIC_EnableIt ( - AT91PS_AIC pAic, // \arg pointer to the AIC registers - unsigned int irq_id ) // \arg interrupt number to initialize -{ - //* Enable the interrupt on the interrupt controller - pAic->AIC_IECR = 0x1 << irq_id ; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_AIC_DisableIt -//* \brief Disable corresponding IT number -//*---------------------------------------------------------------------------- -__inline void AT91F_AIC_DisableIt ( - AT91PS_AIC pAic, // \arg pointer to the AIC registers - unsigned int irq_id ) // \arg interrupt number to initialize -{ - unsigned int mask = 0x1 << irq_id; - //* Disable the interrupt on the interrupt controller - pAic->AIC_IDCR = mask ; - //* Clear the interrupt on the Interrupt Controller ( if one is pending ) - pAic->AIC_ICCR = mask ; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_AIC_ClearIt -//* \brief Clear corresponding IT number -//*---------------------------------------------------------------------------- -__inline void AT91F_AIC_ClearIt ( - AT91PS_AIC pAic, // \arg pointer to the AIC registers - unsigned int irq_id) // \arg interrupt number to initialize -{ - //* Clear the interrupt on the Interrupt Controller ( if one is pending ) - pAic->AIC_ICCR = (0x1 << irq_id); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_AIC_AcknowledgeIt -//* \brief Acknowledge corresponding IT number -//*---------------------------------------------------------------------------- -__inline void AT91F_AIC_AcknowledgeIt ( - AT91PS_AIC pAic) // \arg pointer to the AIC registers -{ - pAic->AIC_EOICR = pAic->AIC_EOICR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_AIC_SetExceptionVector -//* \brief Configure vector handler -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_AIC_SetExceptionVector ( - unsigned int *pVector, // \arg pointer to the AIC registers - void (*Handler) () ) // \arg Interrupt Handler -{ - unsigned int oldVector = *pVector; - - if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE) - *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE; - else - *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000; - - return oldVector; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_AIC_Trig -//* \brief Trig an IT -//*---------------------------------------------------------------------------- -__inline void AT91F_AIC_Trig ( - AT91PS_AIC pAic, // \arg pointer to the AIC registers - unsigned int irq_id) // \arg interrupt number -{ - pAic->AIC_ISCR = (0x1 << irq_id) ; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_AIC_IsActive -//* \brief Test if an IT is active -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_AIC_IsActive ( - AT91PS_AIC pAic, // \arg pointer to the AIC registers - unsigned int irq_id) // \arg Interrupt Number -{ - return (pAic->AIC_ISR & (0x1 << irq_id)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_AIC_IsPending -//* \brief Test if an IT is pending -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_AIC_IsPending ( - AT91PS_AIC pAic, // \arg pointer to the AIC registers - unsigned int irq_id) // \arg Interrupt Number -{ - return (pAic->AIC_IPR & (0x1 << irq_id)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_AIC_Open -//* \brief Set exception vectors and AIC registers to default values -//*---------------------------------------------------------------------------- -__inline void AT91F_AIC_Open( - AT91PS_AIC pAic, // \arg pointer to the AIC registers - void (*IrqHandler) (), // \arg Default IRQ vector exception - void (*FiqHandler) (), // \arg Default FIQ vector exception - void (*DefaultHandler) (), // \arg Default Handler set in ISR - void (*SpuriousHandler) (), // \arg Default Spurious Handler - unsigned int protectMode) // \arg Debug Control Register -{ - int i; - - // Disable all interrupts and set IVR to the default handler - for (i = 0; i < 32; ++i) { - AT91F_AIC_DisableIt(pAic, i); - AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_HIGH_LEVEL, DefaultHandler); - } - - // Set the IRQ exception vector - AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler); - // Set the Fast Interrupt exception vector - AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler); - - pAic->AIC_SPU = (unsigned int) SpuriousHandler; - pAic->AIC_DCR = protectMode; -} -/* ***************************************************************************** - SOFTWARE API FOR PDC - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_SetNextRx -//* \brief Set the next receive transfer descriptor -//*---------------------------------------------------------------------------- -__inline void AT91F_PDC_SetNextRx ( - AT91PS_PDC pPDC, // \arg pointer to a PDC controller - char *address, // \arg address to the next bloc to be received - unsigned int bytes) // \arg number of bytes to be received -{ - pPDC->PDC_RNPR = (unsigned int) address; - pPDC->PDC_RNCR = bytes; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_SetNextTx -//* \brief Set the next transmit transfer descriptor -//*---------------------------------------------------------------------------- -__inline void AT91F_PDC_SetNextTx ( - AT91PS_PDC pPDC, // \arg pointer to a PDC controller - char *address, // \arg address to the next bloc to be transmitted - unsigned int bytes) // \arg number of bytes to be transmitted -{ - pPDC->PDC_TNPR = (unsigned int) address; - pPDC->PDC_TNCR = bytes; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_SetRx -//* \brief Set the receive transfer descriptor -//*---------------------------------------------------------------------------- -__inline void AT91F_PDC_SetRx ( - AT91PS_PDC pPDC, // \arg pointer to a PDC controller - char *address, // \arg address to the next bloc to be received - unsigned int bytes) // \arg number of bytes to be received -{ - pPDC->PDC_RPR = (unsigned int) address; - pPDC->PDC_RCR = bytes; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_SetTx -//* \brief Set the transmit transfer descriptor -//*---------------------------------------------------------------------------- -__inline void AT91F_PDC_SetTx ( - AT91PS_PDC pPDC, // \arg pointer to a PDC controller - char *address, // \arg address to the next bloc to be transmitted - unsigned int bytes) // \arg number of bytes to be transmitted -{ - pPDC->PDC_TPR = (unsigned int) address; - pPDC->PDC_TCR = bytes; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_EnableTx -//* \brief Enable transmit -//*---------------------------------------------------------------------------- -__inline void AT91F_PDC_EnableTx ( - AT91PS_PDC pPDC ) // \arg pointer to a PDC controller -{ - pPDC->PDC_PTCR = AT91C_PDC_TXTEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_EnableRx -//* \brief Enable receive -//*---------------------------------------------------------------------------- -__inline void AT91F_PDC_EnableRx ( - AT91PS_PDC pPDC ) // \arg pointer to a PDC controller -{ - pPDC->PDC_PTCR = AT91C_PDC_RXTEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_DisableTx -//* \brief Disable transmit -//*---------------------------------------------------------------------------- -__inline void AT91F_PDC_DisableTx ( - AT91PS_PDC pPDC ) // \arg pointer to a PDC controller -{ - pPDC->PDC_PTCR = AT91C_PDC_TXTDIS; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_DisableRx -//* \brief Disable receive -//*---------------------------------------------------------------------------- -__inline void AT91F_PDC_DisableRx ( - AT91PS_PDC pPDC ) // \arg pointer to a PDC controller -{ - pPDC->PDC_PTCR = AT91C_PDC_RXTDIS; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_IsTxEmpty -//* \brief Test if the current transfer descriptor has been sent -//*---------------------------------------------------------------------------- -__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete - AT91PS_PDC pPDC ) // \arg pointer to a PDC controller -{ - return !(pPDC->PDC_TCR); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_IsNextTxEmpty -//* \brief Test if the next transfer descriptor has been moved to the current td -//*---------------------------------------------------------------------------- -__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete - AT91PS_PDC pPDC ) // \arg pointer to a PDC controller -{ - return !(pPDC->PDC_TNCR); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_IsRxEmpty -//* \brief Test if the current transfer descriptor has been filled -//*---------------------------------------------------------------------------- -__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete - AT91PS_PDC pPDC ) // \arg pointer to a PDC controller -{ - return !(pPDC->PDC_RCR); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_IsNextRxEmpty -//* \brief Test if the next transfer descriptor has been moved to the current td -//*---------------------------------------------------------------------------- -__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete - AT91PS_PDC pPDC ) // \arg pointer to a PDC controller -{ - return !(pPDC->PDC_RNCR); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_Open -//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX -//*---------------------------------------------------------------------------- -__inline void AT91F_PDC_Open ( - AT91PS_PDC pPDC) // \arg pointer to a PDC controller -{ - //* Disable the RX and TX PDC transfer requests - AT91F_PDC_DisableRx(pPDC); - AT91F_PDC_DisableTx(pPDC); - - //* Reset all Counter register Next buffer first - AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); - AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); - AT91F_PDC_SetTx(pPDC, (char *) 0, 0); - AT91F_PDC_SetRx(pPDC, (char *) 0, 0); - - //* Enable the RX and TX PDC transfer requests - AT91F_PDC_EnableRx(pPDC); - AT91F_PDC_EnableTx(pPDC); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_Close -//* \brief Close PDC: disable TX and RX reset transfer descriptors -//*---------------------------------------------------------------------------- -__inline void AT91F_PDC_Close ( - AT91PS_PDC pPDC) // \arg pointer to a PDC controller -{ - //* Disable the RX and TX PDC transfer requests - AT91F_PDC_DisableRx(pPDC); - AT91F_PDC_DisableTx(pPDC); - - //* Reset all Counter register Next buffer first - AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); - AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); - AT91F_PDC_SetTx(pPDC, (char *) 0, 0); - AT91F_PDC_SetRx(pPDC, (char *) 0, 0); - -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_SendFrame -//* \brief Close PDC: disable TX and RX reset transfer descriptors -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PDC_SendFrame( - AT91PS_PDC pPDC, - char *pBuffer, - unsigned int szBuffer, - char *pNextBuffer, - unsigned int szNextBuffer ) -{ - if (AT91F_PDC_IsTxEmpty(pPDC)) { - //* Buffer and next buffer can be initialized - AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer); - AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer); - return 2; - } - else if (AT91F_PDC_IsNextTxEmpty(pPDC)) { - //* Only one buffer can be initialized - AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer); - return 1; - } - else { - //* All buffer are in use... - return 0; - } -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PDC_ReceiveFrame -//* \brief Close PDC: disable TX and RX reset transfer descriptors -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PDC_ReceiveFrame ( - AT91PS_PDC pPDC, - char *pBuffer, - unsigned int szBuffer, - char *pNextBuffer, - unsigned int szNextBuffer ) -{ - if (AT91F_PDC_IsRxEmpty(pPDC)) { - //* Buffer and next buffer can be initialized - AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer); - AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer); - return 2; - } - else if (AT91F_PDC_IsNextRxEmpty(pPDC)) { - //* Only one buffer can be initialized - AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer); - return 1; - } - else { - //* All buffer are in use... - return 0; - } -} -/* ***************************************************************************** - SOFTWARE API FOR DBGU - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_DBGU_InterruptEnable -//* \brief Enable DBGU Interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_DBGU_InterruptEnable( - AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller - unsigned int flag) // \arg dbgu interrupt to be enabled -{ - pDbgu->DBGU_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_DBGU_InterruptDisable -//* \brief Disable DBGU Interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_DBGU_InterruptDisable( - AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller - unsigned int flag) // \arg dbgu interrupt to be disabled -{ - pDbgu->DBGU_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_DBGU_GetInterruptMaskStatus -//* \brief Return DBGU Interrupt Mask Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status - AT91PS_DBGU pDbgu) // \arg pointer to a DBGU controller -{ - return pDbgu->DBGU_IMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_DBGU_IsInterruptMasked -//* \brief Test if DBGU Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline int AT91F_DBGU_IsInterruptMasked( - AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag); -} - -/* ***************************************************************************** - SOFTWARE API FOR PIO - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_CfgPeriph -//* \brief Enable pins to be drived by peripheral -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_CfgPeriph( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int periphAEnable, // \arg PERIPH A to enable - unsigned int periphBEnable) // \arg PERIPH B to enable - -{ - pPio->PIO_ASR = periphAEnable; - pPio->PIO_BSR = periphBEnable; - pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_CfgOutput -//* \brief Enable PIO in output mode -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_CfgOutput( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int pioEnable) // \arg PIO to be enabled -{ - pPio->PIO_PER = pioEnable; // Set in PIO mode - pPio->PIO_OER = pioEnable; // Configure in Output -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_CfgInput -//* \brief Enable PIO in input mode -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_CfgInput( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int inputEnable) // \arg PIO to be enabled -{ - // Disable output - pPio->PIO_ODR = inputEnable; - pPio->PIO_PER = inputEnable; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_CfgOpendrain -//* \brief Configure PIO in open drain -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_CfgOpendrain( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int multiDrvEnable) // \arg pio to be configured in open drain -{ - // Configure the multi-drive option - pPio->PIO_MDDR = ~multiDrvEnable; - pPio->PIO_MDER = multiDrvEnable; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_CfgPullup -//* \brief Enable or disable pullup on PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_CfgPullup( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int pullupEnable) // \arg enable pullup on PIO -{ - // Connect or not Pullup - pPio->PIO_PPUDR = ~pullupEnable; - pPio->PIO_PPUER = pullupEnable; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_PullupEnable -//* \brief Enable pullup on PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_PullupEnable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int pullupEnable) // \arg enable pullup on PIO -{ - // Connect Pullup - pPio->PIO_PPUER = pullupEnable; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_PullupDisable -//* \brief Disable pullup on PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_PullupDisable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int pullupDisable) // \arg enable pullup on PIO -{ - // Not connect Pullup - pPio->PIO_PPUDR = pullupDisable; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_CfgDirectDrive -//* \brief Enable direct drive on PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_CfgDirectDrive( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int directDrive) // \arg PIO to be configured with direct drive - -{ - // Configure the Direct Drive - pPio->PIO_OWDR = ~directDrive; - pPio->PIO_OWER = directDrive; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_CfgInputFilter -//* \brief Enable input filter on input PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_CfgInputFilter( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int inputFilter) // \arg PIO to be configured with input filter - -{ - // Configure the Direct Drive - pPio->PIO_IFDR = ~inputFilter; - pPio->PIO_IFER = inputFilter; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_GetInput -//* \brief Return PIO input value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PIO_GetInput( // \return PIO input - AT91PS_PIO pPio) // \arg pointer to a PIO controller -{ - return pPio->PIO_PDSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_IsInputSet -//* \brief Test if PIO is input flag is active -//*---------------------------------------------------------------------------- -__inline int AT91F_PIO_IsInputSet( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PIO_GetInput(pPio) & flag); -} - - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_SetOutput -//* \brief Set to 1 output PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_SetOutput( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg output to be set -{ - pPio->PIO_SODR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_ClearOutput -//* \brief Set to 0 output PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_ClearOutput( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg output to be cleared -{ - pPio->PIO_CODR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_ForceOutput -//* \brief Force output when Direct drive option is enabled -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_ForceOutput( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg output to be forced -{ - pPio->PIO_ODSR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_Enable -//* \brief Enable PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_Enable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio to be enabled -{ - pPio->PIO_PER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_Disable -//* \brief Disable PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_Disable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio to be disabled -{ - pPio->PIO_PDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_GetStatus -//* \brief Return PIO Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status - AT91PS_PIO pPio) // \arg pointer to a PIO controller -{ - return pPio->PIO_PSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_IsSet -//* \brief Test if PIO is Set -//*---------------------------------------------------------------------------- -__inline int AT91F_PIO_IsSet( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PIO_GetStatus(pPio) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_OutputEnable -//* \brief Output Enable PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_OutputEnable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio output to be enabled -{ - pPio->PIO_OER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_OutputDisable -//* \brief Output Enable PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_OutputDisable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio output to be disabled -{ - pPio->PIO_ODR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_GetOutputStatus -//* \brief Return PIO Output Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status - AT91PS_PIO pPio) // \arg pointer to a PIO controller -{ - return pPio->PIO_OSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_IsOuputSet -//* \brief Test if PIO Output is Set -//*---------------------------------------------------------------------------- -__inline int AT91F_PIO_IsOutputSet( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PIO_GetOutputStatus(pPio) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_InputFilterEnable -//* \brief Input Filter Enable PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_InputFilterEnable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio input filter to be enabled -{ - pPio->PIO_IFER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_InputFilterDisable -//* \brief Input Filter Disable PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_InputFilterDisable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio input filter to be disabled -{ - pPio->PIO_IFDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_GetInputFilterStatus -//* \brief Return PIO Input Filter Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status - AT91PS_PIO pPio) // \arg pointer to a PIO controller -{ - return pPio->PIO_IFSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_IsInputFilterSet -//* \brief Test if PIO Input filter is Set -//*---------------------------------------------------------------------------- -__inline int AT91F_PIO_IsInputFilterSet( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PIO_GetInputFilterStatus(pPio) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_GetOutputDataStatus -//* \brief Return PIO Output Data Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status - AT91PS_PIO pPio) // \arg pointer to a PIO controller -{ - return pPio->PIO_ODSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_InterruptEnable -//* \brief Enable PIO Interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_InterruptEnable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio interrupt to be enabled -{ - pPio->PIO_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_InterruptDisable -//* \brief Disable PIO Interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_InterruptDisable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio interrupt to be disabled -{ - pPio->PIO_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_GetInterruptMaskStatus -//* \brief Return PIO Interrupt Mask Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status - AT91PS_PIO pPio) // \arg pointer to a PIO controller -{ - return pPio->PIO_IMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_GetInterruptStatus -//* \brief Return PIO Interrupt Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status - AT91PS_PIO pPio) // \arg pointer to a PIO controller -{ - return pPio->PIO_ISR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_IsInterruptMasked -//* \brief Test if PIO Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline int AT91F_PIO_IsInterruptMasked( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_IsInterruptSet -//* \brief Test if PIO Interrupt is Set -//*---------------------------------------------------------------------------- -__inline int AT91F_PIO_IsInterruptSet( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PIO_GetInterruptStatus(pPio) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_MultiDriverEnable -//* \brief Multi Driver Enable PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_MultiDriverEnable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio to be enabled -{ - pPio->PIO_MDER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_MultiDriverDisable -//* \brief Multi Driver Disable PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_MultiDriverDisable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio to be disabled -{ - pPio->PIO_MDDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_GetMultiDriverStatus -//* \brief Return PIO Multi Driver Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status - AT91PS_PIO pPio) // \arg pointer to a PIO controller -{ - return pPio->PIO_MDSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_IsMultiDriverSet -//* \brief Test if PIO MultiDriver is Set -//*---------------------------------------------------------------------------- -__inline int AT91F_PIO_IsMultiDriverSet( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_A_RegisterSelection -//* \brief PIO A Register Selection -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_A_RegisterSelection( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio A register selection -{ - pPio->PIO_ASR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_B_RegisterSelection -//* \brief PIO B Register Selection -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_B_RegisterSelection( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio B register selection -{ - pPio->PIO_BSR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_Get_AB_RegisterStatus -//* \brief Return PIO Interrupt Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status - AT91PS_PIO pPio) // \arg pointer to a PIO controller -{ - return pPio->PIO_ABSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_IsAB_RegisterSet -//* \brief Test if PIO AB Register is Set -//*---------------------------------------------------------------------------- -__inline int AT91F_PIO_IsAB_RegisterSet( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_OutputWriteEnable -//* \brief Output Write Enable PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_OutputWriteEnable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio output write to be enabled -{ - pPio->PIO_OWER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_OutputWriteDisable -//* \brief Output Write Disable PIO -//*---------------------------------------------------------------------------- -__inline void AT91F_PIO_OutputWriteDisable( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg pio output write to be disabled -{ - pPio->PIO_OWDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_GetOutputWriteStatus -//* \brief Return PIO Output Write Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status - AT91PS_PIO pPio) // \arg pointer to a PIO controller -{ - return pPio->PIO_OWSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_IsOutputWriteSet -//* \brief Test if PIO OutputWrite is Set -//*---------------------------------------------------------------------------- -__inline int AT91F_PIO_IsOutputWriteSet( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_GetCfgPullup -//* \brief Return PIO Configuration Pullup -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup - AT91PS_PIO pPio) // \arg pointer to a PIO controller -{ - return pPio->PIO_PPUSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_IsOutputDataStatusSet -//* \brief Test if PIO Output Data Status is Set -//*---------------------------------------------------------------------------- -__inline int AT91F_PIO_IsOutputDataStatusSet( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PIO_GetOutputDataStatus(pPio) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIO_IsCfgPullupStatusSet -//* \brief Test if PIO Configuration Pullup Status is Set -//*---------------------------------------------------------------------------- -__inline int AT91F_PIO_IsCfgPullupStatusSet( - AT91PS_PIO pPio, // \arg pointer to a PIO controller - unsigned int flag) // \arg flag to be tested -{ - return (~AT91F_PIO_GetCfgPullup(pPio) & flag); -} - -/* ***************************************************************************** - SOFTWARE API FOR PMC - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_CfgSysClkEnableReg -//* \brief Configure the System Clock Enable Register of the PMC controller -//*---------------------------------------------------------------------------- -__inline void AT91F_PMC_CfgSysClkEnableReg ( - AT91PS_PMC pPMC, // \arg pointer to PMC controller - unsigned int mode) -{ - //* Write to the SCER register - pPMC->PMC_SCER = mode; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_CfgSysClkDisableReg -//* \brief Configure the System Clock Disable Register of the PMC controller -//*---------------------------------------------------------------------------- -__inline void AT91F_PMC_CfgSysClkDisableReg ( - AT91PS_PMC pPMC, // \arg pointer to PMC controller - unsigned int mode) -{ - //* Write to the SCDR register - pPMC->PMC_SCDR = mode; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_GetSysClkStatusReg -//* \brief Return the System Clock Status Register of the PMC controller -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PMC_GetSysClkStatusReg ( - AT91PS_PMC pPMC // pointer to a CAN controller - ) -{ - return pPMC->PMC_SCSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_EnablePeriphClock -//* \brief Enable peripheral clock -//*---------------------------------------------------------------------------- -__inline void AT91F_PMC_EnablePeriphClock ( - AT91PS_PMC pPMC, // \arg pointer to PMC controller - unsigned int periphIds) // \arg IDs of peripherals to enable -{ - pPMC->PMC_PCER = periphIds; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_DisablePeriphClock -//* \brief Disable peripheral clock -//*---------------------------------------------------------------------------- -__inline void AT91F_PMC_DisablePeriphClock ( - AT91PS_PMC pPMC, // \arg pointer to PMC controller - unsigned int periphIds) // \arg IDs of peripherals to enable -{ - pPMC->PMC_PCDR = periphIds; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_GetPeriphClock -//* \brief Get peripheral clock status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PMC_GetPeriphClock ( - AT91PS_PMC pPMC) // \arg pointer to PMC controller -{ - return pPMC->PMC_PCSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CKGR_CfgMainOscillatorReg -//* \brief Cfg the main oscillator -//*---------------------------------------------------------------------------- -__inline void AT91F_CKGR_CfgMainOscillatorReg ( - AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller - unsigned int mode) -{ - pCKGR->CKGR_MOR = mode; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CKGR_GetMainOscillatorReg -//* \brief Cfg the main oscillator -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CKGR_GetMainOscillatorReg ( - AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller -{ - return pCKGR->CKGR_MOR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CKGR_EnableMainOscillator -//* \brief Enable the main oscillator -//*---------------------------------------------------------------------------- -__inline void AT91F_CKGR_EnableMainOscillator( - AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller -{ - pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CKGR_DisableMainOscillator -//* \brief Disable the main oscillator -//*---------------------------------------------------------------------------- -__inline void AT91F_CKGR_DisableMainOscillator ( - AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller -{ - pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CKGR_CfgMainOscStartUpTime -//* \brief Cfg MOR Register according to the main osc startup time -//*---------------------------------------------------------------------------- -__inline void AT91F_CKGR_CfgMainOscStartUpTime ( - AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller - unsigned int startup_time, // \arg main osc startup time in microsecond (us) - unsigned int slowClock) // \arg slowClock in Hz -{ - pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT; - pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CKGR_GetMainClockFreqReg -//* \brief Cfg the main oscillator -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CKGR_GetMainClockFreqReg ( - AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller -{ - return pCKGR->CKGR_MCFR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CKGR_GetMainClock -//* \brief Return Main clock in Hz -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CKGR_GetMainClock ( - AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller - unsigned int slowClock) // \arg slowClock in Hz -{ - return ((pCKGR->CKGR_MCFR & AT91C_CKGR_MAINF) * slowClock) >> 4; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_CfgMCKReg -//* \brief Cfg Master Clock Register -//*---------------------------------------------------------------------------- -__inline void AT91F_PMC_CfgMCKReg ( - AT91PS_PMC pPMC, // \arg pointer to PMC controller - unsigned int mode) -{ - pPMC->PMC_MCKR = mode; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_GetMCKReg -//* \brief Return Master Clock Register -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PMC_GetMCKReg( - AT91PS_PMC pPMC) // \arg pointer to PMC controller -{ - return pPMC->PMC_MCKR; -} - -//*------------------------------------------------------------------------------ -//* \fn AT91F_PMC_GetMasterClock -//* \brief Return master clock in Hz which correponds to processor clock for ARM7 -//*------------------------------------------------------------------------------ -__inline unsigned int AT91F_PMC_GetMasterClock ( - AT91PS_PMC pPMC, // \arg pointer to PMC controller - AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller - unsigned int slowClock) // \arg slowClock in Hz -{ - unsigned int reg = pPMC->PMC_MCKR; - unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2)); - unsigned int pllDivider, pllMultiplier; - - switch (reg & AT91C_PMC_CSS) { - case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected - return slowClock / prescaler; - case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected - return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler; - case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected - reg = pCKGR->CKGR_PLLR; - pllDivider = (reg & AT91C_CKGR_DIV); - pllMultiplier = ((reg & AT91C_CKGR_MUL) >> 16) + 1; - return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler; - } - return 0; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_EnablePCK -//* \brief Enable peripheral clock -//*---------------------------------------------------------------------------- -__inline void AT91F_PMC_EnablePCK ( - AT91PS_PMC pPMC, // \arg pointer to PMC controller - unsigned int pck, // \arg Peripheral clock identifier 0 .. 7 - unsigned int mode) -{ - pPMC->PMC_PCKR[pck] = mode; - pPMC->PMC_SCER = (1 << pck) << 8; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_DisablePCK -//* \brief Enable peripheral clock -//*---------------------------------------------------------------------------- -__inline void AT91F_PMC_DisablePCK ( - AT91PS_PMC pPMC, // \arg pointer to PMC controller - unsigned int pck) // \arg Peripheral clock identifier 0 .. 7 -{ - pPMC->PMC_SCDR = (1 << pck) << 8; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_EnableIt -//* \brief Enable PMC interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_PMC_EnableIt ( - AT91PS_PMC pPMC, // pointer to a PMC controller - unsigned int flag) // IT to be enabled -{ - //* Write to the IER register - pPMC->PMC_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_DisableIt -//* \brief Disable PMC interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_PMC_DisableIt ( - AT91PS_PMC pPMC, // pointer to a PMC controller - unsigned int flag) // IT to be disabled -{ - //* Write to the IDR register - pPMC->PMC_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_GetStatus -//* \brief Return PMC Interrupt Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status - AT91PS_PMC pPMC) // pointer to a PMC controller -{ - return pPMC->PMC_SR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_GetInterruptMaskStatus -//* \brief Return PMC Interrupt Mask Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status - AT91PS_PMC pPMC) // pointer to a PMC controller -{ - return pPMC->PMC_IMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_IsInterruptMasked -//* \brief Test if PMC Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PMC_IsInterruptMasked( - AT91PS_PMC pPMC, // \arg pointer to a PMC controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_IsStatusSet -//* \brief Test if PMC Status is Set -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PMC_IsStatusSet( - AT91PS_PMC pPMC, // \arg pointer to a PMC controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PMC_GetStatus(pPMC) & flag); -} - -// ---------------------------------------------------------------------------- -// \fn AT91F_CKGR_CfgPLLReg -// \brief Cfg the PLL Register -// ---------------------------------------------------------------------------- -__inline void AT91F_CKGR_CfgPLLReg ( - AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller - unsigned int mode) -{ - pCKGR->CKGR_PLLR = mode; -} - -// ---------------------------------------------------------------------------- -// \fn AT91F_CKGR_GetPLLReg -// \brief Get the PLL Register -// ---------------------------------------------------------------------------- -__inline unsigned int AT91F_CKGR_GetPLLReg ( - AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller -{ - return pCKGR->CKGR_PLLR; -} - - -/* ***************************************************************************** - SOFTWARE API FOR RSTC - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_RSTSoftReset -//* \brief Start Software Reset -//*---------------------------------------------------------------------------- -__inline void AT91F_RSTSoftReset( - AT91PS_RSTC pRSTC, - unsigned int reset) -{ - pRSTC->RSTC_RCR = (0xA5000000 | reset); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_RSTSetMode -//* \brief Set Reset Mode -//*---------------------------------------------------------------------------- -__inline void AT91F_RSTSetMode( - AT91PS_RSTC pRSTC, - unsigned int mode) -{ - pRSTC->RSTC_RMR = (0xA5000000 | mode); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_RSTGetMode -//* \brief Get Reset Mode -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_RSTGetMode( - AT91PS_RSTC pRSTC) -{ - return (pRSTC->RSTC_RMR); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_RSTGetStatus -//* \brief Get Reset Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_RSTGetStatus( - AT91PS_RSTC pRSTC) -{ - return (pRSTC->RSTC_RSR); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_RSTIsSoftRstActive -//* \brief Return !=0 if software reset is still not completed -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_RSTIsSoftRstActive( - AT91PS_RSTC pRSTC) -{ - return ((pRSTC->RSTC_RSR) & AT91C_RSTC_SRCMP); -} -/* ***************************************************************************** - SOFTWARE API FOR SHDWC - ***************************************************************************** */ -//*-------------------------------------------------------------------------------------- -//* Function Name : AT91F_SHDWNSetMode() -//* Object : Set the Shutdown mode register -//*-------------------------------------------------------------------------------------- -__inline unsigned int AT91F_SHDWNSetMode( - AT91PS_SHDWC pSHDWC, - unsigned int mode) -{ - pSHDWC->SHDWC_SHMR = mode; - return(pSHDWC->SHDWC_SHMR); -} - -//*-------------------------------------------------------------------------------------- -//* Function Name : AT91F_SHDWNGetMode() -//* Object : Get the Shutdown mode register -//*-------------------------------------------------------------------------------------- -__inline unsigned int AT91F_SHDWNGetMode( - AT91PS_SHDWC pSHDWC) -{ - return(pSHDWC->SHDWC_SHMR); -} - -//*-------------------------------------------------------------------------------------- -//* Function Name : AT91F_SHDWNEnable() -//* Object : Enable Shutdown -//*-------------------------------------------------------------------------------------- -__inline void AT91F_SHDWNEnable( - AT91PS_SHDWC pSHDWC) -{ - pSHDWC->SHDWC_SHCR = 0xA5000001; -} - -//*-------------------------------------------------------------------------------------- -//* Function Name : AT91F_SHDWNGetStatus() -//* Object : Get Shutdown Status -//*-------------------------------------------------------------------------------------- -__inline unsigned int AT91F_SHDWNGetStatus( - AT91PS_SHDWC pSHDWC) -{ - return(pSHDWC->SHDWC_SHSR); -} - -/* ***************************************************************************** - SOFTWARE API FOR RTTC - ***************************************************************************** */ -//*-------------------------------------------------------------------------------------- -//* \fn AT91F_SetRTT_TimeBase() -//* \brief Set the RTT prescaler according to the TimeBase in ms -//*-------------------------------------------------------------------------------------- -__inline unsigned int AT91F_RTTSetTimeBase( - AT91PS_RTTC pRTTC, - unsigned int ms) -{ - if (ms > 2000) - return 1; // AT91C_TIME_OUT_OF_RANGE - pRTTC->RTTC_RTMR &= ~0xFFFF; - pRTTC->RTTC_RTMR |= (((ms << 15) /1000) & 0xFFFF); - return 0; -} - -//*-------------------------------------------------------------------------------------- -//* \fn AT91F_RTTSetPrescaler() -//* \brief Set the new prescaler value -//*-------------------------------------------------------------------------------------- -__inline unsigned int AT91F_RTTSetPrescaler( - AT91PS_RTTC pRTTC, - unsigned int rtpres) -{ - pRTTC->RTTC_RTMR &= ~0xFFFF; - pRTTC->RTTC_RTMR |= (rtpres & 0xFFFF); - return (pRTTC->RTTC_RTMR); -} - -//*-------------------------------------------------------------------------------------- -//* \fn AT91F_RTTRestart() -//* \brief Restart the RTT prescaler -//*-------------------------------------------------------------------------------------- -__inline void AT91F_RTTRestart( - AT91PS_RTTC pRTTC) -{ - pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTRST; -} - - -//*-------------------------------------------------------------------------------------- -//* \fn AT91F_RTT_SetAlarmINT() -//* \brief Enable RTT Alarm Interrupt -//*-------------------------------------------------------------------------------------- -__inline void AT91F_RTTSetAlarmINT( - AT91PS_RTTC pRTTC) -{ - pRTTC->RTTC_RTMR |= AT91C_RTTC_ALMIEN; -} - -//*-------------------------------------------------------------------------------------- -//* \fn AT91F_RTT_ClearAlarmINT() -//* \brief Disable RTT Alarm Interrupt -//*-------------------------------------------------------------------------------------- -__inline void AT91F_RTTClearAlarmINT( - AT91PS_RTTC pRTTC) -{ - pRTTC->RTTC_RTMR &= ~AT91C_RTTC_ALMIEN; -} - -//*-------------------------------------------------------------------------------------- -//* \fn AT91F_RTT_SetRttIncINT() -//* \brief Enable RTT INC Interrupt -//*-------------------------------------------------------------------------------------- -__inline void AT91F_RTTSetRttIncINT( - AT91PS_RTTC pRTTC) -{ - pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTINCIEN; -} - -//*-------------------------------------------------------------------------------------- -//* \fn AT91F_RTT_ClearRttIncINT() -//* \brief Disable RTT INC Interrupt -//*-------------------------------------------------------------------------------------- -__inline void AT91F_RTTClearRttIncINT( - AT91PS_RTTC pRTTC) -{ - pRTTC->RTTC_RTMR &= ~AT91C_RTTC_RTTINCIEN; -} - -//*-------------------------------------------------------------------------------------- -//* \fn AT91F_RTT_SetAlarmValue() -//* \brief Set RTT Alarm Value -//*-------------------------------------------------------------------------------------- -__inline void AT91F_RTTSetAlarmValue( - AT91PS_RTTC pRTTC, unsigned int alarm) -{ - pRTTC->RTTC_RTAR = alarm; -} - -//*-------------------------------------------------------------------------------------- -//* \fn AT91F_RTT_GetAlarmValue() -//* \brief Get RTT Alarm Value -//*-------------------------------------------------------------------------------------- -__inline unsigned int AT91F_RTTGetAlarmValue( - AT91PS_RTTC pRTTC) -{ - return(pRTTC->RTTC_RTAR); -} - -//*-------------------------------------------------------------------------------------- -//* \fn AT91F_RTTGetStatus() -//* \brief Read the RTT status -//*-------------------------------------------------------------------------------------- -__inline unsigned int AT91F_RTTGetStatus( - AT91PS_RTTC pRTTC) -{ - return(pRTTC->RTTC_RTSR); -} - -//*-------------------------------------------------------------------------------------- -//* \fn AT91F_RTT_ReadValue() -//* \brief Read the RTT value -//*-------------------------------------------------------------------------------------- -__inline unsigned int AT91F_RTTReadValue( - AT91PS_RTTC pRTTC) -{ - register volatile unsigned int val1,val2; - do - { - val1 = pRTTC->RTTC_RTVR; - val2 = pRTTC->RTTC_RTVR; - } - while(val1 != val2); - return(val1); -} -/* ***************************************************************************** - SOFTWARE API FOR PITC - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_PITInit -//* \brief System timer init : period in �second, system clock freq in MHz -//*---------------------------------------------------------------------------- -__inline void AT91F_PITInit( - AT91PS_PITC pPITC, - unsigned int period, - unsigned int pit_frequency) -{ - pPITC->PITC_PIMR = period ? (period * pit_frequency + 8) >> 4 : 0; // +8 to avoid %10 and /10 - pPITC->PITC_PIMR |= AT91C_PITC_PITEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PITSetPIV -//* \brief Set the PIT Periodic Interval Value -//*---------------------------------------------------------------------------- -__inline void AT91F_PITSetPIV( - AT91PS_PITC pPITC, - unsigned int piv) -{ - pPITC->PITC_PIMR = piv | (pPITC->PITC_PIMR & (AT91C_PITC_PITEN | AT91C_PITC_PITIEN)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PITEnableInt -//* \brief Enable PIT periodic interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_PITEnableInt( - AT91PS_PITC pPITC) -{ - pPITC->PITC_PIMR |= AT91C_PITC_PITIEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PITDisableInt -//* \brief Disable PIT periodic interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_PITDisableInt( - AT91PS_PITC pPITC) -{ - pPITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PITGetMode -//* \brief Read PIT mode register -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PITGetMode( - AT91PS_PITC pPITC) -{ - return(pPITC->PITC_PIMR); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PITGetStatus -//* \brief Read PIT status register -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PITGetStatus( - AT91PS_PITC pPITC) -{ - return(pPITC->PITC_PISR); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PITGetPIIR -//* \brief Read PIT CPIV and PICNT without ressetting the counters -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PITGetPIIR( - AT91PS_PITC pPITC) -{ - return(pPITC->PITC_PIIR); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PITGetPIVR -//* \brief Read System timer CPIV and PICNT without ressetting the counters -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PITGetPIVR( - AT91PS_PITC pPITC) -{ - return(pPITC->PITC_PIVR); -} -/* ***************************************************************************** - SOFTWARE API FOR WDTC - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_WDTSetMode -//* \brief Set Watchdog Mode Register -//*---------------------------------------------------------------------------- -__inline void AT91F_WDTSetMode( - AT91PS_WDTC pWDTC, - unsigned int Mode) -{ - pWDTC->WDTC_WDMR = Mode; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_WDTRestart -//* \brief Restart Watchdog -//*---------------------------------------------------------------------------- -__inline void AT91F_WDTRestart( - AT91PS_WDTC pWDTC) -{ - pWDTC->WDTC_WDCR = 0xA5000001; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_WDTSGettatus -//* \brief Get Watchdog Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_WDTSGettatus( - AT91PS_WDTC pWDTC) -{ - return(pWDTC->WDTC_WDSR & 0x3); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_WDTGetPeriod -//* \brief Translate ms into Watchdog Compatible value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_WDTGetPeriod(unsigned int ms) -{ - if ((ms < 4) || (ms > 16000)) - return 0; - return((ms << 8) / 1000); -} -/* ***************************************************************************** - SOFTWARE API FOR MC - ***************************************************************************** */ - -#define AT91C_MC_CORRECT_KEY ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MC_Remap -//* \brief Make Remap -//*---------------------------------------------------------------------------- -__inline void AT91F_MC_Remap (void) // -{ - AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC; - - pMC->MC_RCR = AT91C_MC_RCB; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MC_EFC_CfgModeReg -//* \brief Configure the EFC Mode Register of the MC controller -//*---------------------------------------------------------------------------- -__inline void AT91F_MC_EFC_CfgModeReg ( - AT91PS_MC pMC, // pointer to a MC controller - unsigned int mode) // mode register -{ - // Write to the FMR register - pMC->MC_FMR = mode; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MC_EFC_GetModeReg -//* \brief Return MC EFC Mode Regsiter -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MC_EFC_GetModeReg( - AT91PS_MC pMC) // pointer to a MC controller -{ - return pMC->MC_FMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MC_EFC_ComputeFMCN -//* \brief Return MC EFC Mode Regsiter -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MC_EFC_ComputeFMCN( - int master_clock) // master clock in Hz -{ - return (master_clock/1000000 +2); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MC_EFC_PerformCmd -//* \brief Perform EFC Command -//*---------------------------------------------------------------------------- -__inline void AT91F_MC_EFC_PerformCmd ( - AT91PS_MC pMC, // pointer to a MC controller - unsigned int transfer_cmd) -{ - pMC->MC_FCR = transfer_cmd; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MC_EFC_GetStatus -//* \brief Return MC EFC Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MC_EFC_GetStatus( - AT91PS_MC pMC) // pointer to a MC controller -{ - return pMC->MC_FSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MC_EFC_IsInterruptMasked -//* \brief Test if EFC MC Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MC_EFC_IsInterruptMasked( - AT91PS_MC pMC, // \arg pointer to a MC controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_MC_EFC_GetModeReg(pMC) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MC_EFC_IsInterruptSet -//* \brief Test if EFC MC Interrupt is Set -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MC_EFC_IsInterruptSet( - AT91PS_MC pMC, // \arg pointer to a MC controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_MC_EFC_GetStatus(pMC) & flag); -} - -/* ***************************************************************************** - SOFTWARE API FOR CAN - ***************************************************************************** */ -#define STANDARD_FORMAT 0 -#define EXTENDED_FORMAT 1 - -//*---------------------------------------------------------------------------- -//* \fn AT91F_InitMailboxRegisters() -//* \brief Configure the corresponding mailbox -//*---------------------------------------------------------------------------- -__inline void AT91F_InitMailboxRegisters(AT91PS_CAN_MB CAN_Mailbox, - int mode_reg, - int acceptance_mask_reg, - int id_reg, - int data_low_reg, - int data_high_reg, - int control_reg) -{ - CAN_Mailbox->CAN_MB_MCR = 0x0; - CAN_Mailbox->CAN_MB_MMR = mode_reg; - CAN_Mailbox->CAN_MB_MAM = acceptance_mask_reg; - CAN_Mailbox->CAN_MB_MID = id_reg; - CAN_Mailbox->CAN_MB_MDL = data_low_reg; - CAN_Mailbox->CAN_MB_MDH = data_high_reg; - CAN_Mailbox->CAN_MB_MCR = control_reg; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_EnableCAN() -//* \brief -//*---------------------------------------------------------------------------- -__inline void AT91F_EnableCAN( - AT91PS_CAN pCAN) // pointer to a CAN controller -{ - pCAN->CAN_MR |= AT91C_CAN_CANEN; - - // Wait for WAKEUP flag raising <=> 11-recessive-bit were scanned by the transceiver - while( (pCAN->CAN_SR & AT91C_CAN_WAKEUP) != AT91C_CAN_WAKEUP ); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_DisableCAN() -//* \brief -//*---------------------------------------------------------------------------- -__inline void AT91F_DisableCAN( - AT91PS_CAN pCAN) // pointer to a CAN controller -{ - pCAN->CAN_MR &= ~AT91C_CAN_CANEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_EnableIt -//* \brief Enable CAN interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN_EnableIt ( - AT91PS_CAN pCAN, // pointer to a CAN controller - unsigned int flag) // IT to be enabled -{ - //* Write to the IER register - pCAN->CAN_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_DisableIt -//* \brief Disable CAN interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN_DisableIt ( - AT91PS_CAN pCAN, // pointer to a CAN controller - unsigned int flag) // IT to be disabled -{ - //* Write to the IDR register - pCAN->CAN_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetStatus -//* \brief Return CAN Interrupt Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetStatus( // \return CAN Interrupt Status - AT91PS_CAN pCAN) // pointer to a CAN controller -{ - return pCAN->CAN_SR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetInterruptMaskStatus -//* \brief Return CAN Interrupt Mask Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetInterruptMaskStatus( // \return CAN Interrupt Mask Status - AT91PS_CAN pCAN) // pointer to a CAN controller -{ - return pCAN->CAN_IMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_IsInterruptMasked -//* \brief Test if CAN Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_IsInterruptMasked( - AT91PS_CAN pCAN, // \arg pointer to a CAN controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_CAN_GetInterruptMaskStatus(pCAN) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_IsStatusSet -//* \brief Test if CAN Interrupt is Set -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_IsStatusSet( - AT91PS_CAN pCAN, // \arg pointer to a CAN controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_CAN_GetStatus(pCAN) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_CfgModeReg -//* \brief Configure the Mode Register of the CAN controller -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN_CfgModeReg ( - AT91PS_CAN pCAN, // pointer to a CAN controller - unsigned int mode) // mode register -{ - //* Write to the MR register - pCAN->CAN_MR = mode; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetModeReg -//* \brief Return the Mode Register of the CAN controller value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetModeReg ( - AT91PS_CAN pCAN // pointer to a CAN controller - ) -{ - return pCAN->CAN_MR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_CfgBaudrateReg -//* \brief Configure the Baudrate of the CAN controller for the network -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN_CfgBaudrateReg ( - AT91PS_CAN pCAN, // pointer to a CAN controller - unsigned int baudrate_cfg) -{ - //* Write to the BR register - pCAN->CAN_BR = baudrate_cfg; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetBaudrate -//* \brief Return the Baudrate of the CAN controller for the network value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetBaudrate ( - AT91PS_CAN pCAN // pointer to a CAN controller - ) -{ - return pCAN->CAN_BR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetInternalCounter -//* \brief Return CAN Timer Regsiter Value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetInternalCounter ( - AT91PS_CAN pCAN // pointer to a CAN controller - ) -{ - return pCAN->CAN_TIM; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetTimestamp -//* \brief Return CAN Timestamp Register Value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetTimestamp ( - AT91PS_CAN pCAN // pointer to a CAN controller - ) -{ - return pCAN->CAN_TIMESTP; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetErrorCounter -//* \brief Return CAN Error Counter Register Value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetErrorCounter ( - AT91PS_CAN pCAN // pointer to a CAN controller - ) -{ - return pCAN->CAN_ECR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_InitTransferRequest -//* \brief Request for a transfer on the corresponding mailboxes -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN_InitTransferRequest ( - AT91PS_CAN pCAN, // pointer to a CAN controller - unsigned int transfer_cmd) -{ - pCAN->CAN_TCR = transfer_cmd; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_InitAbortRequest -//* \brief Abort the corresponding mailboxes -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN_InitAbortRequest ( - AT91PS_CAN pCAN, // pointer to a CAN controller - unsigned int abort_cmd) -{ - pCAN->CAN_ACR = abort_cmd; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_CfgMessageModeReg -//* \brief Program the Message Mode Register -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN_CfgMessageModeReg ( - AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox - unsigned int mode) -{ - CAN_Mailbox->CAN_MB_MMR = mode; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetMessageModeReg -//* \brief Return the Message Mode Register -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetMessageModeReg ( - AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox -{ - return CAN_Mailbox->CAN_MB_MMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_CfgMessageIDReg -//* \brief Program the Message ID Register -//* \brief Version == 0 for Standard messsage, Version == 1 for Extended -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN_CfgMessageIDReg ( - AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox - unsigned int id, - unsigned char version) -{ - if(version==0) // IDvA Standard Format - CAN_Mailbox->CAN_MB_MID = id<<18; - else // IDvB Extended Format - CAN_Mailbox->CAN_MB_MID = id | (1<<29); // set MIDE bit -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetMessageIDReg -//* \brief Return the Message ID Register -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetMessageIDReg ( - AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox -{ - return CAN_Mailbox->CAN_MB_MID; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_CfgMessageAcceptanceMaskReg -//* \brief Program the Message Acceptance Mask Register -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN_CfgMessageAcceptanceMaskReg ( - AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox - unsigned int mask) -{ - CAN_Mailbox->CAN_MB_MAM = mask; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetMessageAcceptanceMaskReg -//* \brief Return the Message Acceptance Mask Register -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetMessageAcceptanceMaskReg ( - AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox -{ - return CAN_Mailbox->CAN_MB_MAM; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetFamilyID -//* \brief Return the Message ID Register -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetFamilyID ( - AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox -{ - return CAN_Mailbox->CAN_MB_MFID; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_CfgMessageCtrl -//* \brief Request and config for a transfer on the corresponding mailbox -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN_CfgMessageCtrlReg ( - AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox - unsigned int message_ctrl_cmd) -{ - CAN_Mailbox->CAN_MB_MCR = message_ctrl_cmd; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetMessageStatus -//* \brief Return CAN Mailbox Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetMessageStatus ( - AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox -{ - return CAN_Mailbox->CAN_MB_MSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_CfgMessageDataLow -//* \brief Program data low value -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN_CfgMessageDataLow ( - AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox - unsigned int data) -{ - CAN_Mailbox->CAN_MB_MDL = data; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetMessageDataLow -//* \brief Return data low value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetMessageDataLow ( - AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox -{ - return CAN_Mailbox->CAN_MB_MDL; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_CfgMessageDataHigh -//* \brief Program data high value -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN_CfgMessageDataHigh ( - AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox - unsigned int data) -{ - CAN_Mailbox->CAN_MB_MDH = data; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN_GetMessageDataHigh -//* \brief Return data high value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_CAN_GetMessageDataHigh ( - AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox -{ - return CAN_Mailbox->CAN_MB_MDH; -} - -/* ***************************************************************************** - SOFTWARE API FOR TC - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC_InterruptEnable -//* \brief Enable TC Interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_TC_InterruptEnable( - AT91PS_TC pTc, // \arg pointer to a TC controller - unsigned int flag) // \arg TC interrupt to be enabled -{ - pTc->TC_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC_InterruptDisable -//* \brief Disable TC Interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_TC_InterruptDisable( - AT91PS_TC pTc, // \arg pointer to a TC controller - unsigned int flag) // \arg TC interrupt to be disabled -{ - pTc->TC_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC_GetInterruptMaskStatus -//* \brief Return TC Interrupt Mask Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status - AT91PS_TC pTc) // \arg pointer to a TC controller -{ - return pTc->TC_IMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC_IsInterruptMasked -//* \brief Test if TC Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline int AT91F_TC_IsInterruptMasked( - AT91PS_TC pTc, // \arg pointer to a TC controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag); -} - -/* ***************************************************************************** - SOFTWARE API FOR MCI - ***************************************************************************** */ -//* Classic MCI Data Timeout Register Configuration with 1048576 MCK cycles between 2 data transfer -#define AT91C_MCI_DTOR_1MEGA_CYCLES (AT91C_MCI_DTOCYC | AT91C_MCI_DTOMUL) - -//* Classic MCI SDCard Register Configuration with 1-bit data bus on slot A -#define AT91C_MCI_MMC_SLOTA (AT91C_MCI_SCDSEL & 0x0) - -//* Classic MCI SDCard Register Configuration with 1-bit data bus on slot B -#define AT91C_MCI_MMC_SLOTB (AT91C_MCI_SCDSEL & 0x1) - -//* Classic MCI SDCard Register Configuration with 4-bit data bus on slot A -#define AT91C_MCI_SDCARD_4BITS_SLOTA ( (AT91C_MCI_SCDSEL & 0x0) | AT91C_MCI_SCDBUS ) - -//* Classic MCI SDCard Register Configuration with 4-bit data bus on slot B -#define AT91C_MCI_SDCARD_4BITS_SLOTB ( (AT91C_MCI_SCDSEL & 0x1) | AT91C_MCI_SCDBUS ) - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_Configure -//* \brief Configure the MCI -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_Configure ( - AT91PS_MCI pMCI, // \arg pointer to a MCI controller - unsigned int DTOR_register, // \arg Data Timeout Register to be programmed - unsigned int MR_register, // \arg Mode Register to be programmed - unsigned int SDCR_register) // \arg SDCard Register to be programmed -{ - //* Disable the MCI - pMCI->MCI_CR = AT91C_MCI_MCIDIS | AT91C_MCI_PWSDIS; - - //* Disable all the interrupts - pMCI->MCI_IDR = 0xFFFFFFFF; - - //* Set the Data Timeout Register - pMCI->MCI_DTOR = DTOR_register; - - //* Set the Mode Register - pMCI->MCI_MR = MR_register; - - //* Set the SDCard Register - pMCI->MCI_SDCR = SDCR_register; - - //* Enable the MCI - pMCI->MCI_CR = AT91C_MCI_MCIEN | AT91C_MCI_PWSEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_EnableIt -//* \brief Enable MCI IT -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_EnableIt ( - AT91PS_MCI pMCI, // \arg pointer to a MCI controller - unsigned int flag) // \arg IT to be enabled -{ - //* Write to the IER register - pMCI->MCI_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_DisableIt -//* \brief Disable MCI IT -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_DisableIt ( - AT91PS_MCI pMCI, // \arg pointer to a MCI controller - unsigned int flag) // \arg IT to be disabled -{ - //* Write to the IDR register - pMCI->MCI_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_GetStatus -//* \brief Return MCI Interrupt Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MCI_GetStatus( // \return MCI Interrupt Status - AT91PS_MCI pMCI) // pointer to a MCI controller -{ - return pMCI->MCI_SR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_GetInterruptMaskStatus -//* \brief Return MCI Interrupt Mask Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MCI_GetInterruptMaskStatus( // \return MCI Interrupt Mask Status - AT91PS_MCI pMCI) // pointer to a MCI controller -{ - return pMCI->MCI_IMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_IsInterruptMasked -//* \brief Test if MCI Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MCI_IsInterruptMasked( - AT91PS_MCI pMCI, // \arg pointer to a MCI controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_MCI_GetInterruptMaskStatus(pMCI) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_IsStatusSet -//* \brief Test if MCI Status is Set -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MCI_IsStatusSet( - AT91PS_MCI pMCI, // \arg pointer to a MCI controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_MCI_GetStatus(pMCI) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_Enable -//* \brief Enable the MCI Interface -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_Enable ( - AT91PS_MCI pMCI) // \arg pointer to a MCI controller -{ - //* Enable the MCI - pMCI->MCI_CR = AT91C_MCI_MCIEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_Disable -//* \brief Disable the MCI Interface -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_Disable ( - AT91PS_MCI pMCI) // \arg pointer to a MCI controller -{ - //* Disable the MCI - pMCI->MCI_CR = AT91C_MCI_MCIDIS; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_SW_Reset -//* \brief Reset the MCI Interface -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_SW_Reset ( - AT91PS_MCI pMCI) // \arg pointer to a MCI controller -{ - //* Disable the MCI - pMCI->MCI_CR = AT91C_MCI_SWRST; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_CfgModeReg -//* \brief Configure the Mode Register of the MCI controller -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_CfgModeReg ( - AT91PS_MCI pMCI, // pointer to a MCI controller - unsigned int mode) // mode register -{ - //* Write to the MR register - pMCI->MCI_MR = mode; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_GetModeReg -//* \brief Return the Mode Register of the MCI controller value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MCI_GetModeReg ( - AT91PS_MCI pMCI // pointer to a MCI controller - ) -{ - return pMCI->MCI_MR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_CfgFrequency -//* \brief Configure the frequency MCCK of the MCI controller -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_CfgFrequency ( - AT91PS_MCI pMCI, // pointer to a MCI controller - unsigned int mck_clock, // in MHz - unsigned int mci_clock) // in MHz -{ - unsigned int prescal; - - prescal = mck_clock/(2*mci_clock) - 1; - - //* Write to the MR register - pMCI->MCI_MR &= ~AT91C_MCI_CLKDIV; - pMCI->MCI_MR |= (prescal & AT91C_MCI_CLKDIV); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_CfgDataTimeOutReg -//* \brief Configure the Data TimeOut Register of the MCI controller -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_CfgDataTimeOutReg ( - AT91PS_MCI pMCI, // pointer to a MCI controller - unsigned int cfg) -{ - //* Write to the DTOR register - pMCI->MCI_DTOR = cfg; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_GetDataTimeOutReg -//* \brief Return the Data TimeOut Register of the MCI controller value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MCI_GetDataTimeOutReg ( - AT91PS_MCI pMCI // pointer to a MCI controller - ) -{ - return pMCI->MCI_DTOR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_CfgSDCardReg -//* \brief Configure the SDCard Register of the MCI controller -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_CfgSDCardReg ( - AT91PS_MCI pMCI, // pointer to a MCI controller - unsigned int cfg) -{ - //* Write to the SDCR register - pMCI->MCI_SDCR = cfg; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_GetSDCardReg -//* \brief Return the SDCard Register of the MCI controller value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MCI_GetSDCardReg ( - AT91PS_MCI pMCI // pointer to a MCI controller - ) -{ - return pMCI->MCI_SDCR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_CfgARGReg -//* \brief Configure the Command ARGUMENT Register of the MCI controller -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_CfgARGReg ( - AT91PS_MCI pMCI, // pointer to a MCI controller - unsigned int arg) -{ - //* Write to the ARG register - pMCI->MCI_ARGR = arg; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_GetARGReg -//* \brief Return the Command ARGUMENT Register of the MCI controller value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MCI_GetARGReg ( - AT91PS_MCI pMCI // pointer to a MCI controller - ) -{ - return pMCI->MCI_ARGR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_CfgCMDReg -//* \brief Configure the COMMAND Register of the MCI controller -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_CfgCMDReg ( - AT91PS_MCI pMCI, // pointer to a MCI controller - unsigned int cmd) -{ - //* Write to the ARG register - pMCI->MCI_CMDR = cmd; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_GetRSP0Reg -//* \brief Return the RESPONSE Register 0 of the MCI controller value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MCI_GetRSP0Reg ( - AT91PS_MCI pMCI // pointer to a MCI controller - ) -{ - return pMCI->MCI_RSPR[0]; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_GetRSP1Reg -//* \brief Return the RESPONSE Register 1 of the MCI controller value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MCI_GetRSP1Reg ( - AT91PS_MCI pMCI // pointer to a MCI controller - ) -{ - return pMCI->MCI_RSPR[0]; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_GetRSP2Reg -//* \brief Return the RESPONSE Register 2 of the MCI controller value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MCI_GetRSP2Reg ( - AT91PS_MCI pMCI // pointer to a MCI controller - ) -{ - return pMCI->MCI_RSPR[0]; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_GetRSP3Reg -//* \brief Return the RESPONSE Register 3 of the MCI controller value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_MCI_GetRSP3Reg ( - AT91PS_MCI pMCI // pointer to a MCI controller - ) -{ - return pMCI->MCI_RSPR[0]; -} - -/* ***************************************************************************** - SOFTWARE API FOR UDP - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_EnableIt -//* \brief Enable UDP IT -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_EnableIt ( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned int flag) // \arg IT to be enabled -{ - //* Write to the IER register - pUDP->UDP_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_DisableIt -//* \brief Disable UDP IT -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_DisableIt ( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned int flag) // \arg IT to be disabled -{ - //* Write to the IDR register - pUDP->UDP_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_SetAddress -//* \brief Set UDP functional address -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_SetAddress ( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned char address) // \arg new UDP address -{ - pUDP->UDP_FADDR = (AT91C_UDP_FEN | address); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_EnableEp -//* \brief Enable Endpoint -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_EnableEp ( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned char endpoint) // \arg endpoint number -{ - pUDP->UDP_CSR[endpoint] |= AT91C_UDP_EPEDS; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_DisableEp -//* \brief Enable Endpoint -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_DisableEp ( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned char endpoint) // \arg endpoint number -{ - pUDP->UDP_CSR[endpoint] &= ~AT91C_UDP_EPEDS; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_SetState -//* \brief Set UDP Device state -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_SetState ( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned int flag) // \arg new UDP address -{ - pUDP->UDP_GLBSTATE &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG); - pUDP->UDP_GLBSTATE |= flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_GetState -//* \brief return UDP Device state -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state - AT91PS_UDP pUDP) // \arg pointer to a UDP controller -{ - return (pUDP->UDP_GLBSTATE & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_ResetEp -//* \brief Reset UDP endpoint -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_ResetEp ( // \return the UDP device state - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned int flag) // \arg Endpoints to be reset -{ - pUDP->UDP_RSTEP = flag; - pUDP->UDP_RSTEP = 0; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_EpStall -//* \brief Endpoint will STALL requests -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_EpStall( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned char endpoint) // \arg endpoint number -{ - pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_EpWrite -//* \brief Write value in the DPR -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_EpWrite( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned char endpoint, // \arg endpoint number - unsigned char value) // \arg value to be written in the DPR -{ - pUDP->UDP_FDR[endpoint] = value; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_EpRead -//* \brief Return value from the DPR -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_UDP_EpRead( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned char endpoint) // \arg endpoint number -{ - return pUDP->UDP_FDR[endpoint]; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_EpEndOfWr -//* \brief Notify the UDP that values in DPR are ready to be sent -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_EpEndOfWr( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned char endpoint) // \arg endpoint number -{ - pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_EpClear -//* \brief Clear flag in the endpoint CSR register -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_EpClear( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned char endpoint, // \arg endpoint number - unsigned int flag) // \arg flag to be cleared -{ - pUDP->UDP_CSR[endpoint] &= ~(flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_EpSet -//* \brief Set flag in the endpoint CSR register -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_EpSet( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned char endpoint, // \arg endpoint number - unsigned int flag) // \arg flag to be cleared -{ - pUDP->UDP_CSR[endpoint] |= flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_EpStatus -//* \brief Return the endpoint CSR register -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_UDP_EpStatus( - AT91PS_UDP pUDP, // \arg pointer to a UDP controller - unsigned char endpoint) // \arg endpoint number -{ - return pUDP->UDP_CSR[endpoint]; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_GetInterruptMaskStatus -//* \brief Return UDP Interrupt Mask Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( - AT91PS_UDP pUdp) // \arg pointer to a UDP controller -{ - return pUdp->UDP_IMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_IsInterruptMasked -//* \brief Test if UDP Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline int AT91F_UDP_IsInterruptMasked( - AT91PS_UDP pUdp, // \arg pointer to a UDP controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag); -} - -// ---------------------------------------------------------------------------- -// \fn AT91F_UDP_InterruptStatusRegister -// \brief Return the Interrupt Status Register -// ---------------------------------------------------------------------------- -__inline unsigned int AT91F_UDP_InterruptStatusRegister( - AT91PS_UDP pUDP ) // \arg pointer to a UDP controller -{ - return pUDP->UDP_ISR; -} - -// ---------------------------------------------------------------------------- -// \fn AT91F_UDP_InterruptClearRegister -// \brief Clear Interrupt Register -// ---------------------------------------------------------------------------- -__inline void AT91F_UDP_InterruptClearRegister ( - AT91PS_UDP pUDP, // \arg pointer to UDP controller - unsigned int flag) // \arg IT to be cleat -{ - pUDP->UDP_ICR = flag; -} - -// ---------------------------------------------------------------------------- -// \fn AT91F_UDP_EnableTransceiver -// \brief Enable transceiver -// ---------------------------------------------------------------------------- -__inline void AT91F_UDP_EnableTransceiver( - AT91PS_UDP pUDP ) // \arg pointer to a UDP controller -{ - pUDP->UDP_TXVC &= ~AT91C_UDP_TXVDIS; -} - -// ---------------------------------------------------------------------------- -// \fn AT91F_UDP_DisableTransceiver -// \brief Disable transceiver -// ---------------------------------------------------------------------------- -__inline void AT91F_UDP_DisableTransceiver( - AT91PS_UDP pUDP ) // \arg pointer to a UDP controller -{ - pUDP->UDP_TXVC = AT91C_UDP_TXVDIS; -} - -/* ***************************************************************************** - SOFTWARE API FOR TWI - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_TWI_EnableIt -//* \brief Enable TWI IT -//*---------------------------------------------------------------------------- -__inline void AT91F_TWI_EnableIt ( - AT91PS_TWI pTWI, // \arg pointer to a TWI controller - unsigned int flag) // \arg IT to be enabled -{ - //* Write to the IER register - pTWI->TWI_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TWI_DisableIt -//* \brief Disable TWI IT -//*---------------------------------------------------------------------------- -__inline void AT91F_TWI_DisableIt ( - AT91PS_TWI pTWI, // \arg pointer to a TWI controller - unsigned int flag) // \arg IT to be disabled -{ - //* Write to the IDR register - pTWI->TWI_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TWI_Configure -//* \brief Configure TWI in master mode -//*---------------------------------------------------------------------------- -__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI ) // \arg pointer to a TWI controller -{ - //* Disable interrupts - pTWI->TWI_IDR = (unsigned int) -1; - - //* Reset peripheral - pTWI->TWI_CR = AT91C_TWI_SWRST; - - //* Set Master mode - pTWI->TWI_CR = AT91C_TWI_MSEN; - -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TWI_GetInterruptMaskStatus -//* \brief Return TWI Interrupt Mask Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status - AT91PS_TWI pTwi) // \arg pointer to a TWI controller -{ - return pTwi->TWI_IMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TWI_IsInterruptMasked -//* \brief Test if TWI Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline int AT91F_TWI_IsInterruptMasked( - AT91PS_TWI pTwi, // \arg pointer to a TWI controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag); -} - -/* ***************************************************************************** - SOFTWARE API FOR USART - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_Baudrate -//* \brief Calculate the baudrate -//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity -#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \ - AT91C_US_NBSTOP_1_BIT + \ - AT91C_US_PAR_NONE + \ - AT91C_US_CHRL_8_BITS + \ - AT91C_US_CLKS_CLOCK ) - -//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity -#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \ - AT91C_US_NBSTOP_1_BIT + \ - AT91C_US_PAR_NONE + \ - AT91C_US_CHRL_8_BITS + \ - AT91C_US_CLKS_EXT ) - -//* Standard Synchronous Mode : 8 bits , 1 stop , no parity -#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \ - AT91C_US_USMODE_NORMAL + \ - AT91C_US_NBSTOP_1_BIT + \ - AT91C_US_PAR_NONE + \ - AT91C_US_CHRL_8_BITS + \ - AT91C_US_CLKS_CLOCK ) - -//* SCK used Label -#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT) - -//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity -#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \ - AT91C_US_CLKS_CLOCK +\ - AT91C_US_NBSTOP_1_BIT + \ - AT91C_US_PAR_EVEN + \ - AT91C_US_CHRL_8_BITS + \ - AT91C_US_CKLO +\ - AT91C_US_OVER) - -//* Standard IRDA mode -#define AT91C_US_ASYNC_IRDA_MODE ( AT91C_US_USMODE_IRDA + \ - AT91C_US_NBSTOP_1_BIT + \ - AT91C_US_PAR_NONE + \ - AT91C_US_CHRL_8_BITS + \ - AT91C_US_CLKS_CLOCK ) - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_Baudrate -//* \brief Caluculate baud_value according to the main clock and the baud rate -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_US_Baudrate ( - const unsigned int main_clock, // \arg peripheral clock - const unsigned int baud_rate) // \arg UART baudrate -{ - unsigned int baud_value = ((main_clock*10)/(baud_rate * 16)); - if ((baud_value % 10) >= 5) - baud_value = (baud_value / 10) + 1; - else - baud_value /= 10; - return baud_value; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_SetBaudrate -//* \brief Set the baudrate according to the CPU clock -//*---------------------------------------------------------------------------- -__inline void AT91F_US_SetBaudrate ( - AT91PS_USART pUSART, // \arg pointer to a USART controller - unsigned int mainClock, // \arg peripheral clock - unsigned int speed) // \arg UART baudrate -{ - //* Define the baud rate divisor register - pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_SetTimeguard -//* \brief Set USART timeguard -//*---------------------------------------------------------------------------- -__inline void AT91F_US_SetTimeguard ( - AT91PS_USART pUSART, // \arg pointer to a USART controller - unsigned int timeguard) // \arg timeguard value -{ - //* Write the Timeguard Register - pUSART->US_TTGR = timeguard ; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_EnableIt -//* \brief Enable USART IT -//*---------------------------------------------------------------------------- -__inline void AT91F_US_EnableIt ( - AT91PS_USART pUSART, // \arg pointer to a USART controller - unsigned int flag) // \arg IT to be enabled -{ - //* Write to the IER register - pUSART->US_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_DisableIt -//* \brief Disable USART IT -//*---------------------------------------------------------------------------- -__inline void AT91F_US_DisableIt ( - AT91PS_USART pUSART, // \arg pointer to a USART controller - unsigned int flag) // \arg IT to be disabled -{ - //* Write to the IER register - pUSART->US_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_Configure -//* \brief Configure USART -//*---------------------------------------------------------------------------- -__inline void AT91F_US_Configure ( - AT91PS_USART pUSART, // \arg pointer to a USART controller - unsigned int mainClock, // \arg peripheral clock - unsigned int mode , // \arg mode Register to be programmed - unsigned int baudRate , // \arg baudrate to be programmed - unsigned int timeguard ) // \arg timeguard to be programmed -{ - //* Disable interrupts - pUSART->US_IDR = (unsigned int) -1; - - //* Reset receiver and transmitter - pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ; - - //* Define the baud rate divisor register - AT91F_US_SetBaudrate(pUSART, mainClock, baudRate); - - //* Write the Timeguard Register - AT91F_US_SetTimeguard(pUSART, timeguard); - - //* Clear Transmit and Receive Counters - AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR)); - - //* Define the USART mode - pUSART->US_MR = mode ; - -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_EnableRx -//* \brief Enable receiving characters -//*---------------------------------------------------------------------------- -__inline void AT91F_US_EnableRx ( - AT91PS_USART pUSART) // \arg pointer to a USART controller -{ - //* Enable receiver - pUSART->US_CR = AT91C_US_RXEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_EnableTx -//* \brief Enable sending characters -//*---------------------------------------------------------------------------- -__inline void AT91F_US_EnableTx ( - AT91PS_USART pUSART) // \arg pointer to a USART controller -{ - //* Enable transmitter - pUSART->US_CR = AT91C_US_TXEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_ResetRx -//* \brief Reset Receiver and re-enable it -//*---------------------------------------------------------------------------- -__inline void AT91F_US_ResetRx ( - AT91PS_USART pUSART) // \arg pointer to a USART controller -{ - //* Reset receiver - pUSART->US_CR = AT91C_US_RSTRX; - //* Re-Enable receiver - pUSART->US_CR = AT91C_US_RXEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_ResetTx -//* \brief Reset Transmitter and re-enable it -//*---------------------------------------------------------------------------- -__inline void AT91F_US_ResetTx ( - AT91PS_USART pUSART) // \arg pointer to a USART controller -{ - //* Reset transmitter - pUSART->US_CR = AT91C_US_RSTTX; - //* Enable transmitter - pUSART->US_CR = AT91C_US_TXEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_DisableRx -//* \brief Disable Receiver -//*---------------------------------------------------------------------------- -__inline void AT91F_US_DisableRx ( - AT91PS_USART pUSART) // \arg pointer to a USART controller -{ - //* Disable receiver - pUSART->US_CR = AT91C_US_RXDIS; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_DisableTx -//* \brief Disable Transmitter -//*---------------------------------------------------------------------------- -__inline void AT91F_US_DisableTx ( - AT91PS_USART pUSART) // \arg pointer to a USART controller -{ - //* Disable transmitter - pUSART->US_CR = AT91C_US_TXDIS; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_Close -//* \brief Close USART: disable IT disable receiver and transmitter, close PDC -//*---------------------------------------------------------------------------- -__inline void AT91F_US_Close ( - AT91PS_USART pUSART) // \arg pointer to a USART controller -{ - //* Reset the baud rate divisor register - pUSART->US_BRGR = 0 ; - - //* Reset the USART mode - pUSART->US_MR = 0 ; - - //* Reset the Timeguard Register - pUSART->US_TTGR = 0; - - //* Disable all interrupts - pUSART->US_IDR = 0xFFFFFFFF ; - - //* Abort the Peripheral Data Transfers - AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR)); - - //* Disable receiver and transmitter and stop any activity immediately - pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_TxReady -//* \brief Return 1 if a character can be written in US_THR -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_US_TxReady ( - AT91PS_USART pUSART ) // \arg pointer to a USART controller -{ - return (pUSART->US_CSR & AT91C_US_TXRDY); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_RxReady -//* \brief Return 1 if a character can be read in US_RHR -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_US_RxReady ( - AT91PS_USART pUSART ) // \arg pointer to a USART controller -{ - return (pUSART->US_CSR & AT91C_US_RXRDY); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_Error -//* \brief Return the error flag -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_US_Error ( - AT91PS_USART pUSART ) // \arg pointer to a USART controller -{ - return (pUSART->US_CSR & - (AT91C_US_OVRE | // Overrun error - AT91C_US_FRAME | // Framing error - AT91C_US_PARE)); // Parity error -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_PutChar -//* \brief Send a character,does not check if ready to send -//*---------------------------------------------------------------------------- -__inline void AT91F_US_PutChar ( - AT91PS_USART pUSART, - int character ) -{ - pUSART->US_THR = (character & 0x1FF); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_GetChar -//* \brief Receive a character,does not check if a character is available -//*---------------------------------------------------------------------------- -__inline int AT91F_US_GetChar ( - const AT91PS_USART pUSART) -{ - return((pUSART->US_RHR) & 0x1FF); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_SendFrame -//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_US_SendFrame( - AT91PS_USART pUSART, - char *pBuffer, - unsigned int szBuffer, - char *pNextBuffer, - unsigned int szNextBuffer ) -{ - return AT91F_PDC_SendFrame( - (AT91PS_PDC) &(pUSART->US_RPR), - pBuffer, - szBuffer, - pNextBuffer, - szNextBuffer); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_ReceiveFrame -//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_US_ReceiveFrame ( - AT91PS_USART pUSART, - char *pBuffer, - unsigned int szBuffer, - char *pNextBuffer, - unsigned int szNextBuffer ) -{ - return AT91F_PDC_ReceiveFrame( - (AT91PS_PDC) &(pUSART->US_RPR), - pBuffer, - szBuffer, - pNextBuffer, - szNextBuffer); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US_SetIrdaFilter -//* \brief Set the value of IrDa filter tregister -//*---------------------------------------------------------------------------- -__inline void AT91F_US_SetIrdaFilter ( - AT91PS_USART pUSART, - unsigned char value -) -{ - pUSART->US_IF = value; -} - -/* ***************************************************************************** - SOFTWARE API FOR PWMC - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWM_GetStatus -//* \brief Return PWM Interrupt Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status - AT91PS_PWMC pPWM) // pointer to a PWM controller -{ - return pPWM->PWMC_SR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWM_InterruptEnable -//* \brief Enable PWM Interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_InterruptEnable( - AT91PS_PWMC pPwm, // \arg pointer to a PWM controller - unsigned int flag) // \arg PWM interrupt to be enabled -{ - pPwm->PWMC_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWM_InterruptDisable -//* \brief Disable PWM Interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_InterruptDisable( - AT91PS_PWMC pPwm, // \arg pointer to a PWM controller - unsigned int flag) // \arg PWM interrupt to be disabled -{ - pPwm->PWMC_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWM_GetInterruptMaskStatus -//* \brief Return PWM Interrupt Mask Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status - AT91PS_PWMC pPwm) // \arg pointer to a PWM controller -{ - return pPwm->PWMC_IMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWM_IsInterruptMasked -//* \brief Test if PWM Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PWMC_IsInterruptMasked( - AT91PS_PWMC pPWM, // \arg pointer to a PWM controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWM_IsStatusSet -//* \brief Test if PWM Interrupt is Set -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_PWMC_IsStatusSet( - AT91PS_PWMC pPWM, // \arg pointer to a PWM controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_PWMC_GetStatus(pPWM) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWM_CfgChannel -//* \brief Test if PWM Interrupt is Set -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_CfgChannel( - AT91PS_PWMC pPWM, // \arg pointer to a PWM controller - unsigned int channelId, // \arg PWM channel ID - unsigned int mode, // \arg PWM mode - unsigned int period, // \arg PWM period - unsigned int duty) // \arg PWM duty cycle -{ - pPWM->PWMC_CH[channelId].PWMC_CMR = mode; - pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty; - pPWM->PWMC_CH[channelId].PWMC_CPRDR = period; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWM_StartChannel -//* \brief Enable channel -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_StartChannel( - AT91PS_PWMC pPWM, // \arg pointer to a PWM controller - unsigned int flag) // \arg Channels IDs to be enabled -{ - pPWM->PWMC_ENA = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWM_StopChannel -//* \brief Disable channel -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_StopChannel( - AT91PS_PWMC pPWM, // \arg pointer to a PWM controller - unsigned int flag) // \arg Channels IDs to be enabled -{ - pPWM->PWMC_DIS = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWM_UpdateChannel -//* \brief Update Period or Duty Cycle -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_UpdateChannel( - AT91PS_PWMC pPWM, // \arg pointer to a PWM controller - unsigned int channelId, // \arg PWM channel ID - unsigned int update) // \arg Channels IDs to be enabled -{ - pPWM->PWMC_CH[channelId].PWMC_CUPDR = update; -} - -/* ***************************************************************************** - SOFTWARE API FOR SSC - ***************************************************************************** */ -//* Define the standard I2S mode configuration - -//* Configuration to set in the SSC Transmit Clock Mode Register -//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits -//* nb_slot_by_frame : number of channels -#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ - AT91C_SSC_CKS_DIV +\ - AT91C_SSC_CKO_CONTINOUS +\ - AT91C_SSC_CKG_NONE +\ - AT91C_SSC_START_FALL_RF +\ - AT91C_SSC_STTOUT +\ - ((1<<16) & AT91C_SSC_STTDLY) +\ - ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24)) - - -//* Configuration to set in the SSC Transmit Frame Mode Register -//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits -//* nb_slot_by_frame : number of channels -#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ - (nb_bit_by_slot-1) +\ - AT91C_SSC_MSBF +\ - (((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB) +\ - (((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\ - AT91C_SSC_FSOS_NEGATIVE) - - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC_SetBaudrate -//* \brief Set the baudrate according to the CPU clock -//*---------------------------------------------------------------------------- -__inline void AT91F_SSC_SetBaudrate ( - AT91PS_SSC pSSC, // \arg pointer to a SSC controller - unsigned int mainClock, // \arg peripheral clock - unsigned int speed) // \arg SSC baudrate -{ - unsigned int baud_value; - //* Define the baud rate divisor register - if (speed == 0) - baud_value = 0; - else - { - baud_value = (unsigned int) (mainClock * 10)/(2*speed); - if ((baud_value % 10) >= 5) - baud_value = (baud_value / 10) + 1; - else - baud_value /= 10; - } - - pSSC->SSC_CMR = baud_value; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC_Configure -//* \brief Configure SSC -//*---------------------------------------------------------------------------- -__inline void AT91F_SSC_Configure ( - AT91PS_SSC pSSC, // \arg pointer to a SSC controller - unsigned int syst_clock, // \arg System Clock Frequency - unsigned int baud_rate, // \arg Expected Baud Rate Frequency - unsigned int clock_rx, // \arg Receiver Clock Parameters - unsigned int mode_rx, // \arg mode Register to be programmed - unsigned int clock_tx, // \arg Transmitter Clock Parameters - unsigned int mode_tx) // \arg mode Register to be programmed -{ - //* Disable interrupts - pSSC->SSC_IDR = (unsigned int) -1; - - //* Reset receiver and transmitter - pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ; - - //* Define the Clock Mode Register - AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate); - - //* Write the Receive Clock Mode Register - pSSC->SSC_RCMR = clock_rx; - - //* Write the Transmit Clock Mode Register - pSSC->SSC_TCMR = clock_tx; - - //* Write the Receive Frame Mode Register - pSSC->SSC_RFMR = mode_rx; - - //* Write the Transmit Frame Mode Register - pSSC->SSC_TFMR = mode_tx; - - //* Clear Transmit and Receive Counters - AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR)); - - -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC_EnableRx -//* \brief Enable receiving datas -//*---------------------------------------------------------------------------- -__inline void AT91F_SSC_EnableRx ( - AT91PS_SSC pSSC) // \arg pointer to a SSC controller -{ - //* Enable receiver - pSSC->SSC_CR = AT91C_SSC_RXEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC_DisableRx -//* \brief Disable receiving datas -//*---------------------------------------------------------------------------- -__inline void AT91F_SSC_DisableRx ( - AT91PS_SSC pSSC) // \arg pointer to a SSC controller -{ - //* Disable receiver - pSSC->SSC_CR = AT91C_SSC_RXDIS; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC_EnableTx -//* \brief Enable sending datas -//*---------------------------------------------------------------------------- -__inline void AT91F_SSC_EnableTx ( - AT91PS_SSC pSSC) // \arg pointer to a SSC controller -{ - //* Enable transmitter - pSSC->SSC_CR = AT91C_SSC_TXEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC_DisableTx -//* \brief Disable sending datas -//*---------------------------------------------------------------------------- -__inline void AT91F_SSC_DisableTx ( - AT91PS_SSC pSSC) // \arg pointer to a SSC controller -{ - //* Disable transmitter - pSSC->SSC_CR = AT91C_SSC_TXDIS; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC_EnableIt -//* \brief Enable SSC IT -//*---------------------------------------------------------------------------- -__inline void AT91F_SSC_EnableIt ( - AT91PS_SSC pSSC, // \arg pointer to a SSC controller - unsigned int flag) // \arg IT to be enabled -{ - //* Write to the IER register - pSSC->SSC_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC_DisableIt -//* \brief Disable SSC IT -//*---------------------------------------------------------------------------- -__inline void AT91F_SSC_DisableIt ( - AT91PS_SSC pSSC, // \arg pointer to a SSC controller - unsigned int flag) // \arg IT to be disabled -{ - //* Write to the IDR register - pSSC->SSC_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC_ReceiveFrame -//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_SSC_ReceiveFrame ( - AT91PS_SSC pSSC, - char *pBuffer, - unsigned int szBuffer, - char *pNextBuffer, - unsigned int szNextBuffer ) -{ - return AT91F_PDC_ReceiveFrame( - (AT91PS_PDC) &(pSSC->SSC_RPR), - pBuffer, - szBuffer, - pNextBuffer, - szNextBuffer); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC_SendFrame -//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_SSC_SendFrame( - AT91PS_SSC pSSC, - char *pBuffer, - unsigned int szBuffer, - char *pNextBuffer, - unsigned int szNextBuffer ) -{ - return AT91F_PDC_SendFrame( - (AT91PS_PDC) &(pSSC->SSC_RPR), - pBuffer, - szBuffer, - pNextBuffer, - szNextBuffer); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC_GetInterruptMaskStatus -//* \brief Return SSC Interrupt Mask Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status - AT91PS_SSC pSsc) // \arg pointer to a SSC controller -{ - return pSsc->SSC_IMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC_IsInterruptMasked -//* \brief Test if SSC Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline int AT91F_SSC_IsInterruptMasked( - AT91PS_SSC pSsc, // \arg pointer to a SSC controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag); -} - -/* ***************************************************************************** - SOFTWARE API FOR ADC - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_EnableIt -//* \brief Enable ADC interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_ADC_EnableIt ( - AT91PS_ADC pADC, // pointer to a ADC controller - unsigned int flag) // IT to be enabled -{ - //* Write to the IER register - pADC->ADC_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_DisableIt -//* \brief Disable ADC interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_ADC_DisableIt ( - AT91PS_ADC pADC, // pointer to a ADC controller - unsigned int flag) // IT to be disabled -{ - //* Write to the IDR register - pADC->ADC_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetStatus -//* \brief Return ADC Interrupt Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status - AT91PS_ADC pADC) // pointer to a ADC controller -{ - return pADC->ADC_SR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetInterruptMaskStatus -//* \brief Return ADC Interrupt Mask Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status - AT91PS_ADC pADC) // pointer to a ADC controller -{ - return pADC->ADC_IMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_IsInterruptMasked -//* \brief Test if ADC Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_IsInterruptMasked( - AT91PS_ADC pADC, // \arg pointer to a ADC controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_IsStatusSet -//* \brief Test if ADC Status is Set -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_IsStatusSet( - AT91PS_ADC pADC, // \arg pointer to a ADC controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_ADC_GetStatus(pADC) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_CfgModeReg -//* \brief Configure the Mode Register of the ADC controller -//*---------------------------------------------------------------------------- -__inline void AT91F_ADC_CfgModeReg ( - AT91PS_ADC pADC, // pointer to a ADC controller - unsigned int mode) // mode register -{ - //* Write to the MR register - pADC->ADC_MR = mode; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetModeReg -//* \brief Return the Mode Register of the ADC controller value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetModeReg ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - return pADC->ADC_MR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_CfgTimings -//* \brief Configure the different necessary timings of the ADC controller -//*---------------------------------------------------------------------------- -__inline void AT91F_ADC_CfgTimings ( - AT91PS_ADC pADC, // pointer to a ADC controller - unsigned int mck_clock, // in MHz - unsigned int adc_clock, // in MHz - unsigned int startup_time, // in us - unsigned int sample_and_hold_time) // in ns -{ - unsigned int prescal,startup,shtim; - - prescal = mck_clock/(2*adc_clock) - 1; - startup = adc_clock*startup_time/8 - 1; - shtim = adc_clock*sample_and_hold_time/1000 - 1; - - //* Write to the MR register - pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_EnableChannel -//* \brief Return ADC Timer Register Value -//*---------------------------------------------------------------------------- -__inline void AT91F_ADC_EnableChannel ( - AT91PS_ADC pADC, // pointer to a ADC controller - unsigned int channel) // mode register -{ - //* Write to the CHER register - pADC->ADC_CHER = channel; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_DisableChannel -//* \brief Return ADC Timer Register Value -//*---------------------------------------------------------------------------- -__inline void AT91F_ADC_DisableChannel ( - AT91PS_ADC pADC, // pointer to a ADC controller - unsigned int channel) // mode register -{ - //* Write to the CHDR register - pADC->ADC_CHDR = channel; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetChannelStatus -//* \brief Return ADC Timer Register Value -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetChannelStatus ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - return pADC->ADC_CHSR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_StartConversion -//* \brief Software request for a analog to digital conversion -//*---------------------------------------------------------------------------- -__inline void AT91F_ADC_StartConversion ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - pADC->ADC_CR = AT91C_ADC_START; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_SoftReset -//* \brief Software reset -//*---------------------------------------------------------------------------- -__inline void AT91F_ADC_SoftReset ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - pADC->ADC_CR = AT91C_ADC_SWRST; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetLastConvertedData -//* \brief Return the Last Converted Data -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetLastConvertedData ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - return pADC->ADC_LCDR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetConvertedDataCH0 -//* \brief Return the Channel 0 Converted Data -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetConvertedDataCH0 ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - return pADC->ADC_CDR0; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetConvertedDataCH1 -//* \brief Return the Channel 1 Converted Data -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetConvertedDataCH1 ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - return pADC->ADC_CDR1; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetConvertedDataCH2 -//* \brief Return the Channel 2 Converted Data -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetConvertedDataCH2 ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - return pADC->ADC_CDR2; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetConvertedDataCH3 -//* \brief Return the Channel 3 Converted Data -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetConvertedDataCH3 ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - return pADC->ADC_CDR3; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetConvertedDataCH4 -//* \brief Return the Channel 4 Converted Data -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetConvertedDataCH4 ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - return pADC->ADC_CDR4; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetConvertedDataCH5 -//* \brief Return the Channel 5 Converted Data -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetConvertedDataCH5 ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - return pADC->ADC_CDR5; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetConvertedDataCH6 -//* \brief Return the Channel 6 Converted Data -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetConvertedDataCH6 ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - return pADC->ADC_CDR6; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC_GetConvertedDataCH7 -//* \brief Return the Channel 7 Converted Data -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_ADC_GetConvertedDataCH7 ( - AT91PS_ADC pADC // pointer to a ADC controller - ) -{ - return pADC->ADC_CDR7; -} - -/* ***************************************************************************** - SOFTWARE API FOR SPI - ***************************************************************************** */ -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_CfgCs -//* \brief Configure SPI chip select register -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI_CfgCs ( - AT91PS_SPI pSPI, // pointer to a SPI controller - int cs, // SPI cs number (0 to 3) - int val) // chip select register -{ - //* Write to the CSR register - *(pSPI->SPI_CSR + cs) = val; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_EnableIt -//* \brief Enable SPI interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI_EnableIt ( - AT91PS_SPI pSPI, // pointer to a SPI controller - unsigned int flag) // IT to be enabled -{ - //* Write to the IER register - pSPI->SPI_IER = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_DisableIt -//* \brief Disable SPI interrupt -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI_DisableIt ( - AT91PS_SPI pSPI, // pointer to a SPI controller - unsigned int flag) // IT to be disabled -{ - //* Write to the IDR register - pSPI->SPI_IDR = flag; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_Reset -//* \brief Reset the SPI controller -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI_Reset ( - AT91PS_SPI pSPI // pointer to a SPI controller - ) -{ - //* Write to the CR register - pSPI->SPI_CR = AT91C_SPI_SWRST; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_Enable -//* \brief Enable the SPI controller -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI_Enable ( - AT91PS_SPI pSPI // pointer to a SPI controller - ) -{ - //* Write to the CR register - pSPI->SPI_CR = AT91C_SPI_SPIEN; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_Disable -//* \brief Disable the SPI controller -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI_Disable ( - AT91PS_SPI pSPI // pointer to a SPI controller - ) -{ - //* Write to the CR register - pSPI->SPI_CR = AT91C_SPI_SPIDIS; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_CfgMode -//* \brief Enable the SPI controller -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI_CfgMode ( - AT91PS_SPI pSPI, // pointer to a SPI controller - int mode) // mode register -{ - //* Write to the MR register - pSPI->SPI_MR = mode; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_CfgPCS -//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI_CfgPCS ( - AT91PS_SPI pSPI, // pointer to a SPI controller - char PCS_Device) // PCS of the Device -{ - //* Write to the MR register - pSPI->SPI_MR &= 0xFFF0FFFF; - pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS ); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_ReceiveFrame -//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_SPI_ReceiveFrame ( - AT91PS_SPI pSPI, - char *pBuffer, - unsigned int szBuffer, - char *pNextBuffer, - unsigned int szNextBuffer ) -{ - return AT91F_PDC_ReceiveFrame( - (AT91PS_PDC) &(pSPI->SPI_RPR), - pBuffer, - szBuffer, - pNextBuffer, - szNextBuffer); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_SendFrame -//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_SPI_SendFrame( - AT91PS_SPI pSPI, - char *pBuffer, - unsigned int szBuffer, - char *pNextBuffer, - unsigned int szNextBuffer ) -{ - return AT91F_PDC_SendFrame( - (AT91PS_PDC) &(pSPI->SPI_RPR), - pBuffer, - szBuffer, - pNextBuffer, - szNextBuffer); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_Close -//* \brief Close SPI: disable IT disable transfert, close PDC -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI_Close ( - AT91PS_SPI pSPI) // \arg pointer to a SPI controller -{ - //* Reset all the Chip Select register - pSPI->SPI_CSR[0] = 0 ; - pSPI->SPI_CSR[1] = 0 ; - pSPI->SPI_CSR[2] = 0 ; - pSPI->SPI_CSR[3] = 0 ; - - //* Reset the SPI mode - pSPI->SPI_MR = 0 ; - - //* Disable all interrupts - pSPI->SPI_IDR = 0xFFFFFFFF ; - - //* Abort the Peripheral Data Transfers - AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR)); - - //* Disable receiver and transmitter and stop any activity immediately - pSPI->SPI_CR = AT91C_SPI_SPIDIS; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_PutChar -//* \brief Send a character,does not check if ready to send -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI_PutChar ( - AT91PS_SPI pSPI, - unsigned int character, - unsigned int cs_number ) -{ - unsigned int value_for_cs; - value_for_cs = (~(1 << cs_number)) & 0xF; //Place a zero among a 4 ONEs number - pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_GetChar -//* \brief Receive a character,does not check if a character is available -//*---------------------------------------------------------------------------- -__inline int AT91F_SPI_GetChar ( - const AT91PS_SPI pSPI) -{ - return((pSPI->SPI_RDR) & 0xFFFF); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_GetInterruptMaskStatus -//* \brief Return SPI Interrupt Mask Status -//*---------------------------------------------------------------------------- -__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status - AT91PS_SPI pSpi) // \arg pointer to a SPI controller -{ - return pSpi->SPI_IMR; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI_IsInterruptMasked -//* \brief Test if SPI Interrupt is Masked -//*---------------------------------------------------------------------------- -__inline int AT91F_SPI_IsInterruptMasked( - AT91PS_SPI pSpi, // \arg pointer to a SPI controller - unsigned int flag) // \arg flag to be tested -{ - return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MC_CfgPMC -//* \brief Enable Peripheral clock in PMC for MC -//*---------------------------------------------------------------------------- -__inline void AT91F_MC_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_SYS)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_DBGU_CfgPMC -//* \brief Enable Peripheral clock in PMC for DBGU -//*---------------------------------------------------------------------------- -__inline void AT91F_DBGU_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_SYS)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_DBGU_CfgPIO -//* \brief Configure PIO controllers to drive DBGU signals -//*---------------------------------------------------------------------------- -__inline void AT91F_DBGU_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA31_DTXD ) | - ((unsigned int) AT91C_PA30_DRXD ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWMC_CH0_CfgPIO -//* \brief Configure PIO controllers to drive PWMC_CH0 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_CH0_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA18_PWM0 ), // Peripheral A - 0); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB14_PWM0 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWMC_CH1_CfgPIO -//* \brief Configure PIO controllers to drive PWMC_CH1 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_CH1_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA19_PWM1 ), // Peripheral A - 0); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB15_PWM1 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWMC_CH2_CfgPIO -//* \brief Configure PIO controllers to drive PWMC_CH2 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_CH2_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA20_PWM2 ), // Peripheral A - 0); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB16_PWM2 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWMC_CH3_CfgPIO -//* \brief Configure PIO controllers to drive PWMC_CH3 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_CH3_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA21_PWM3 ), // Peripheral A - 0); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB17_PWM3 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWMC_CH4_CfgPIO -//* \brief Configure PIO controllers to drive PWMC_CH4 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_CH4_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA22_PWM4 ), // Peripheral A - 0); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB18_PWM4 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWMC_CH5_CfgPIO -//* \brief Configure PIO controllers to drive PWMC_CH5 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_CH5_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA23_PWM5 ), // Peripheral A - 0); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB0_PWM5 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWMC_CH6_CfgPIO -//* \brief Configure PIO controllers to drive PWMC_CH6 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_CH6_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA24_PWM6 ), // Peripheral A - 0); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB1_PWM6 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWMC_CH7_CfgPIO -//* \brief Configure PIO controllers to drive PWMC_CH7 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_CH7_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA25_PWM7 ), // Peripheral A - 0); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB2_PWM7 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SHDWC_CfgPMC -//* \brief Enable Peripheral clock in PMC for SHDWC -//*---------------------------------------------------------------------------- -__inline void AT91F_SHDWC_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_SYS)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI0_CfgPMC -//* \brief Enable Peripheral clock in PMC for SPI0 -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI0_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_SPI0)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI0_CfgPIO -//* \brief Configure PIO controllers to drive SPI0 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI0_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA16_SPI0_MOSI) | - ((unsigned int) AT91C_PA11_SPI0_NPCS0) | - ((unsigned int) AT91C_PA12_SPI0_NPCS1) | - ((unsigned int) AT91C_PA15_SPI0_MISO) | - ((unsigned int) AT91C_PA13_SPI0_NPCS2) | - ((unsigned int) AT91C_PA17_SPI0_SPCK) | - ((unsigned int) AT91C_PA14_SPI0_NPCS3), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI1_CfgPMC -//* \brief Enable Peripheral clock in PMC for SPI1 -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI1_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_SPI1)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SPI1_CfgPIO -//* \brief Configure PIO controllers to drive SPI1 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_SPI1_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PA9_SPI1_MOSI) | - ((unsigned int) AT91C_PA4_SPI1_NPCS0) | - ((unsigned int) AT91C_PA8_SPI1_MISO) | - ((unsigned int) AT91C_PA5_SPI1_NPCS1) | - ((unsigned int) AT91C_PA10_SPI1_SPCK) | - ((unsigned int) AT91C_PA6_SPI1_NPCS2) | - ((unsigned int) AT91C_PA7_SPI1_NPCS3)); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB19_SPI1_NPCS1) | - ((unsigned int) AT91C_PB20_SPI1_NPCS2) | - ((unsigned int) AT91C_PB21_SPI1_NPCS3)); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC0_CfgPMC -//* \brief Enable Peripheral clock in PMC for SSC0 -//*---------------------------------------------------------------------------- -__inline void AT91F_SSC0_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_SSC0)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC0_CfgPIO -//* \brief Configure PIO controllers to drive SSC0 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_SSC0_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - ((unsigned int) AT91C_PB7_RF0 ) | - ((unsigned int) AT91C_PB3_TK0 ) | - ((unsigned int) AT91C_PB6_RK0 ) | - ((unsigned int) AT91C_PB4_TD0 ) | - ((unsigned int) AT91C_PB5_RD0 ) | - ((unsigned int) AT91C_PB2_TF0 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC1_CfgPMC -//* \brief Enable Peripheral clock in PMC for SSC1 -//*---------------------------------------------------------------------------- -__inline void AT91F_SSC1_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_SSC1)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_SSC1_CfgPIO -//* \brief Configure PIO controllers to drive SSC1 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_SSC1_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB9_TK1 ) | - ((unsigned int) AT91C_PB11_RF1 ) | - ((unsigned int) AT91C_PB10_RK1 ) | - ((unsigned int) AT91C_PB12_TD1 ) | - ((unsigned int) AT91C_PB13_RD1 ) | - ((unsigned int) AT91C_PB8_TF1 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWMC_CfgPMC -//* \brief Enable Peripheral clock in PMC for PWMC -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_PWMC)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC0_CfgPMC -//* \brief Enable Peripheral clock in PMC for TC0 -//*---------------------------------------------------------------------------- -__inline void AT91F_TC0_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_TC0)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC0_CfgPIO -//* \brief Configure PIO controllers to drive TC0 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_TC0_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - ((unsigned int) AT91C_PB12_TIOA0 ) | - ((unsigned int) AT91C_PB13_TIOB0 ) | - ((unsigned int) AT91C_PB9_TCLK0 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC1_CfgPMC -//* \brief Enable Peripheral clock in PMC for TC1 -//*---------------------------------------------------------------------------- -__inline void AT91F_TC1_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_TC1)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC1_CfgPIO -//* \brief Configure PIO controllers to drive TC1 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_TC1_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - ((unsigned int) AT91C_PB14_TIOA1 ) | - ((unsigned int) AT91C_PB15_TIOB1 ) | - ((unsigned int) AT91C_PB10_TCLK1 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC2_CfgPMC -//* \brief Enable Peripheral clock in PMC for TC2 -//*---------------------------------------------------------------------------- -__inline void AT91F_TC2_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_TC2)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC2_CfgPIO -//* \brief Configure PIO controllers to drive TC2 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_TC2_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - ((unsigned int) AT91C_PB16_TIOA2 ) | - ((unsigned int) AT91C_PB17_TIOB2 ) | - ((unsigned int) AT91C_PB11_TCLK2 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC3_CfgPMC -//* \brief Enable Peripheral clock in PMC for TC3 -//*---------------------------------------------------------------------------- -__inline void AT91F_TC3_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_TC3)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC3_CfgPIO -//* \brief Configure PIO controllers to drive TC3 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_TC3_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PA28_TCLK3 )); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - ((unsigned int) AT91C_PB18_TIOA3 ) | - ((unsigned int) AT91C_PB19_TIOB3 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC4_CfgPMC -//* \brief Enable Peripheral clock in PMC for TC4 -//*---------------------------------------------------------------------------- -__inline void AT91F_TC4_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_TC4)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC4_CfgPIO -//* \brief Configure PIO controllers to drive TC4 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_TC4_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PA24_TCLK4 )); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - ((unsigned int) AT91C_PB21_TIOB4 ) | - ((unsigned int) AT91C_PB20_TIOA4 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC5_CfgPMC -//* \brief Enable Peripheral clock in PMC for TC5 -//*---------------------------------------------------------------------------- -__inline void AT91F_TC5_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_TC5)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC5_CfgPIO -//* \brief Configure PIO controllers to drive TC5 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_TC5_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PA25_TCLK5 )); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - ((unsigned int) AT91C_PB23_TIOB5 ) | - ((unsigned int) AT91C_PB22_TIOA5 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC6_CfgPMC -//* \brief Enable Peripheral clock in PMC for TC6 -//*---------------------------------------------------------------------------- -__inline void AT91F_TC6_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_TC6)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC6_CfgPIO -//* \brief Configure PIO controllers to drive TC6 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_TC6_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PA29_TCLK6 )); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - ((unsigned int) AT91C_PB24_TIOA6 ) | - ((unsigned int) AT91C_PB25_TIOB6 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC7_CfgPMC -//* \brief Enable Peripheral clock in PMC for TC7 -//*---------------------------------------------------------------------------- -__inline void AT91F_TC7_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_TC7)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC7_CfgPIO -//* \brief Configure PIO controllers to drive TC7 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_TC7_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PA30_TCLK7 )); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - ((unsigned int) AT91C_PB26_TIOA7 ) | - ((unsigned int) AT91C_PB27_TIOB7 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC8_CfgPMC -//* \brief Enable Peripheral clock in PMC for TC8 -//*---------------------------------------------------------------------------- -__inline void AT91F_TC8_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_TC8)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TC8_CfgPIO -//* \brief Configure PIO controllers to drive TC8 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_TC8_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PA31_TCLK8 )); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - ((unsigned int) AT91C_PB28_TIOA8 ) | - ((unsigned int) AT91C_PB29_TIOB8 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PITC_CfgPMC -//* \brief Enable Peripheral clock in PMC for PITC -//*---------------------------------------------------------------------------- -__inline void AT91F_PITC_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_SYS)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC0_CfgPMC -//* \brief Enable Peripheral clock in PMC for ADC0 -//*---------------------------------------------------------------------------- -__inline void AT91F_ADC0_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_ADC0)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC0_CfgPIO -//* \brief Configure PIO controllers to drive ADC0 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_ADC0_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PA0_ADTRG0 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC1_CfgPMC -//* \brief Enable Peripheral clock in PMC for ADC1 -//*---------------------------------------------------------------------------- -__inline void AT91F_ADC1_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_ADC1)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_ADC1_CfgPIO -//* \brief Configure PIO controllers to drive ADC1 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_ADC1_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PA1_ADTRG1 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_CfgPMC -//* \brief Enable Peripheral clock in PMC for PMC -//*---------------------------------------------------------------------------- -__inline void AT91F_PMC_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_SYS)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PMC_CfgPIO -//* \brief Configure PIO controllers to drive PMC signals -//*---------------------------------------------------------------------------- -__inline void AT91F_PMC_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PA19_PCK1 ) | - ((unsigned int) AT91C_PA20_PCK2 ) | - ((unsigned int) AT91C_PA21_PCK3 ) | - ((unsigned int) AT91C_PA18_PCK0 )); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB4_PCK1 ) | - ((unsigned int) AT91C_PB5_PCK2 ) | - ((unsigned int) AT91C_PB6_PCK3 ) | - ((unsigned int) AT91C_PB3_PCK0 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_RSTC_CfgPMC -//* \brief Enable Peripheral clock in PMC for RSTC -//*---------------------------------------------------------------------------- -__inline void AT91F_RSTC_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_SYS)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIOA_CfgPMC -//* \brief Enable Peripheral clock in PMC for PIOA -//*---------------------------------------------------------------------------- -__inline void AT91F_PIOA_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_PIOA)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PIOB_CfgPMC -//* \brief Enable Peripheral clock in PMC for PIOB -//*---------------------------------------------------------------------------- -__inline void AT91F_PIOB_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_PIOB)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_RTTC_CfgPMC -//* \brief Enable Peripheral clock in PMC for RTTC -//*---------------------------------------------------------------------------- -__inline void AT91F_RTTC_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_SYS)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TWI_CfgPMC -//* \brief Enable Peripheral clock in PMC for TWI -//*---------------------------------------------------------------------------- -__inline void AT91F_TWI_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_TWI)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_TWI_CfgPIO -//* \brief Configure PIO controllers to drive TWI signals -//*---------------------------------------------------------------------------- -__inline void AT91F_TWI_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA0_TWD ) | - ((unsigned int) AT91C_PA1_TWCK ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US0_CfgPMC -//* \brief Enable Peripheral clock in PMC for US0 -//*---------------------------------------------------------------------------- -__inline void AT91F_US0_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_US0)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US0_CfgPIO -//* \brief Configure PIO controllers to drive US0 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_US0_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA2_RXD0 ) | - ((unsigned int) AT91C_PA3_TXD0 ) | - ((unsigned int) AT91C_PA5_RTS0 ) | - ((unsigned int) AT91C_PA4_SCK0 ) | - ((unsigned int) AT91C_PA6_CTS0 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US1_CfgPMC -//* \brief Enable Peripheral clock in PMC for US1 -//*---------------------------------------------------------------------------- -__inline void AT91F_US1_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_US1)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US1_CfgPIO -//* \brief Configure PIO controllers to drive US1 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_US1_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA7_RXD1 ) | - ((unsigned int) AT91C_PA8_TXD1 ), // Peripheral A - 0); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB26_SCK1 ) | - ((unsigned int) AT91C_PB24_RTS1 ) | - ((unsigned int) AT91C_PB25_CTS1 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US2_CfgPMC -//* \brief Enable Peripheral clock in PMC for US2 -//*---------------------------------------------------------------------------- -__inline void AT91F_US2_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_US2)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_US2_CfgPIO -//* \brief Configure PIO controllers to drive US2 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_US2_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA10_TXD2 ) | - ((unsigned int) AT91C_PA9_RXD2 ), // Peripheral A - 0); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB28_CTS2 ) | - ((unsigned int) AT91C_PB29_SCK2 ) | - ((unsigned int) AT91C_PB27_RTS2 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_CfgPMC -//* \brief Enable Peripheral clock in PMC for MCI -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_MCI)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_CfgPIO -//* \brief Configure PIO controllers to drive MCI signals -//*---------------------------------------------------------------------------- -__inline void AT91F_MCI_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PA14_MCDA3 ) | - ((unsigned int) AT91C_PA16_MCCDA ) | - ((unsigned int) AT91C_PA15_MCDA0 ) | - ((unsigned int) AT91C_PA17_MCCK ) | - ((unsigned int) AT91C_PA12_MCDA1 ) | - ((unsigned int) AT91C_PA13_MCDA2 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_WDTC_CfgPMC -//* \brief Enable Peripheral clock in PMC for WDTC -//*---------------------------------------------------------------------------- -__inline void AT91F_WDTC_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_SYS)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_UDP_CfgPMC -//* \brief Enable Peripheral clock in PMC for UDP -//*---------------------------------------------------------------------------- -__inline void AT91F_UDP_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_UDP)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_AIC_CfgPMC -//* \brief Enable Peripheral clock in PMC for AIC -//*---------------------------------------------------------------------------- -__inline void AT91F_AIC_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_IRQ1) | - ((unsigned int) 1 << AT91C_ID_IRQ2) | - ((unsigned int) 1 << AT91C_ID_FIQ) | - ((unsigned int) 1 << AT91C_ID_IRQ3) | - ((unsigned int) 1 << AT91C_ID_IRQ0)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_AIC_CfgPIO -//* \brief Configure PIO controllers to drive AIC signals -//*---------------------------------------------------------------------------- -__inline void AT91F_AIC_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PA22_IRQ0 ) | - ((unsigned int) AT91C_PA23_IRQ1 )); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - ((unsigned int) AT91C_PB8_FIQ ) | - ((unsigned int) AT91C_PB0_IRQ2 ) | - ((unsigned int) AT91C_PB1_IRQ3 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN0_CfgPMC -//* \brief Enable Peripheral clock in PMC for CAN0 -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN0_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_CAN0)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN0_CfgPIO -//* \brief Configure PIO controllers to drive CAN0 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN0_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA27_CANTX0 ) | - ((unsigned int) AT91C_PA26_CANRX0 ), // Peripheral A - 0); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN1_CfgPMC -//* \brief Enable Peripheral clock in PMC for CAN1 -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN1_CfgPMC (void) -{ - AT91F_PMC_EnablePeriphClock( - AT91C_BASE_PMC, // PIO controller base address - ((unsigned int) 1 << AT91C_ID_CAN1)); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CAN1_CfgPIO -//* \brief Configure PIO controllers to drive CAN1 signals -//*---------------------------------------------------------------------------- -__inline void AT91F_CAN1_CfgPIO (void) -{ - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOA, // PIO controller base address - ((unsigned int) AT91C_PA29_CANTX1 ) | - ((unsigned int) AT91C_PA28_CANRX1 ), // Peripheral A - 0); // Peripheral B - // Configure PIO controllers to periph mode - AT91F_PIO_CfgPeriph( - AT91C_BASE_PIOB, // PIO controller base address - 0, // Peripheral A - ((unsigned int) AT91C_PB7_CANTX1 )); // Peripheral B -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_DBGU_SetBaudRate -//* \brief Set baud rate for DBGU -//*---------------------------------------------------------------------------- -__inline void AT91F_DBGU_SetBaudRate( - AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller - unsigned int cd) // \arg dbgu CD -{ - pDbgu->DBGU_BRGR = cd; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_DBGU_Configure -//* \brief Configure DBGU -//*---------------------------------------------------------------------------- -__inline void AT91F_DBGU_Configure ( - AT91PS_DBGU pDbgu, // \arg pointer to a USART controller - unsigned int bd, // \arg baudrate to be programmed - unsigned int mode) // \arg mode Register to be programmed -{ - // Disable interrupts - pDbgu->DBGU_IDR = (unsigned int) -1; - // Reset receiver and transmitter - pDbgu->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS | AT91C_US_RSTSTA; - // Define the baud rate divisor register - AT91F_DBGU_SetBaudRate(pDbgu, bd); - // Define the DBGU mode - pDbgu->DBGU_MR = mode; -} - -__inline void AT91F_DBGU_EnableRx ( - AT91PS_DBGU pDbgu) // \arg pointer to a USART controller -{ - //* Enable receiver - pDbgu->DBGU_CR = AT91C_US_RXEN; -} - -__inline void AT91F_DBGU_EnableTx ( - AT91PS_DBGU pDbgu) // \arg pointer to a USART controller -{ - //* Enable transmitter - pDbgu->DBGU_CR = AT91C_US_TXEN; -} - -__inline void AT91F_DBGU_PutChar ( - AT91PS_DBGU pDbgu, - unsigned char character ) -{ - pDbgu->DBGU_THR = (character & 0xFF); -} - -__inline unsigned int AT91F_DBGU_IsENDTXInt ( - AT91PS_DBGU pDbgu ) // \arg pointer to a USART controller -{ - return (pDbgu->DBGU_CSR & AT91C_US_ENDTX); -} - -__inline unsigned int AT91F_DBGU_IsTXRDYInt ( - AT91PS_DBGU pDbgu ) // \arg pointer to a USART controller -{ - return (pDbgu->DBGU_CSR & AT91C_US_TXRDY); -} - -__inline unsigned int AT91F_DBGU_IsRXRDYInt( - AT91PS_DBGU pDbgu ) // \arg pointer to a USART controller -{ - return (pDbgu->DBGU_CSR & AT91C_US_RXRDY); -} - -__inline unsigned int AT91F_DBGU_IsOVREInt ( - AT91PS_DBGU pDbgu ) // \arg pointer to a USART controller -{ - return (pDbgu->DBGU_CSR & AT91C_US_OVRE); -} - -__inline unsigned int AT91F_DBGU_IsFRAMEInt ( - AT91PS_DBGU pDbgu ) // \arg pointer to a USART controller -{ - return (pDbgu->DBGU_CSR & AT91C_US_FRAME); -} - -__inline unsigned int AT91F_DBGU_IsPAREInt ( - AT91PS_DBGU pDbgu ) // \arg pointer to a USART controller -{ - return (pDbgu->DBGU_CSR & AT91C_US_PARE); -} - -__inline unsigned int AT91F_DBGU_IsTXEMPTYInt ( - AT91PS_DBGU pDbgu ) // \arg pointer to a USART controller -{ - return (pDbgu->DBGU_CSR & AT91C_US_TXEMPTY); -} - -__inline void AT91F_DBGU_ResetStatus ( - AT91PS_DBGU pDbgu ) // \arg pointer to a USART controller -{ - pDbgu->DBGU_CR = AT91C_US_RSTSTA; -} - -__inline unsigned char AT91F_DBGU_GetChar ( - AT91PS_DBGU pDbgu ) // \arg pointer to a USART controller -{ - return (AT91C_BASE_DBGU->DBGU_RHR); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_PWMC_Reset -//* \brief Reset PWM main registers -//*---------------------------------------------------------------------------- -__inline void AT91F_PWMC_Reset( - AT91PS_PWMC pPWM) // pointer to a PWM controller -{ - pPWM->PWMC_MR = 0; //clock off -} - - -#endif // lib_AT91SAM7A3_H diff --git a/platforms_startup/armcc/LPC1768/LPC17xx.h b/platforms_startup/armcc/LPC1768/LPC17xx.h deleted file mode 100644 index 556b1fad4..000000000 --- a/platforms_startup/armcc/LPC1768/LPC17xx.h +++ /dev/null @@ -1,1083 +0,0 @@ -/**************************************************************************//** - * @file LPC17xx.h - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File for - * NXP LPC17xx Device Series - * @version: V1.09 - * @date: 25. July. 2011 - * - * @note - * Copyright (C) 2009 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - - -#ifndef __LPC17xx_H__ -#define __LPC17xx_H__ - -/* - * ========================================================================== - * ---------- Interrupt Number Definition ----------------------------------- - * ========================================================================== - */ - -/** @addtogroup LPC17xx_System - * @{ - */ - -/** @brief IRQ interrupt source definition */ -typedef enum IRQn -{ -/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ - -/****** LPC17xx Specific Interrupt Numbers *******************************************************/ - WDT_IRQn = 0, /*!< Watchdog Timer Interrupt */ - TIMER0_IRQn = 1, /*!< Timer0 Interrupt */ - TIMER1_IRQn = 2, /*!< Timer1 Interrupt */ - TIMER2_IRQn = 3, /*!< Timer2 Interrupt */ - TIMER3_IRQn = 4, /*!< Timer3 Interrupt */ - UART0_IRQn = 5, /*!< UART0 Interrupt */ - UART1_IRQn = 6, /*!< UART1 Interrupt */ - UART2_IRQn = 7, /*!< UART2 Interrupt */ - UART3_IRQn = 8, /*!< UART3 Interrupt */ - PWM1_IRQn = 9, /*!< PWM1 Interrupt */ - I2C0_IRQn = 10, /*!< I2C0 Interrupt */ - I2C1_IRQn = 11, /*!< I2C1 Interrupt */ - I2C2_IRQn = 12, /*!< I2C2 Interrupt */ - SPI_IRQn = 13, /*!< SPI Interrupt */ - SSP0_IRQn = 14, /*!< SSP0 Interrupt */ - SSP1_IRQn = 15, /*!< SSP1 Interrupt */ - PLL0_IRQn = 16, /*!< PLL0 Lock (Main PLL) Interrupt */ - RTC_IRQn = 17, /*!< Real Time Clock Interrupt */ - EINT0_IRQn = 18, /*!< External Interrupt 0 Interrupt */ - EINT1_IRQn = 19, /*!< External Interrupt 1 Interrupt */ - EINT2_IRQn = 20, /*!< External Interrupt 2 Interrupt */ - EINT3_IRQn = 21, /*!< External Interrupt 3 Interrupt */ - ADC_IRQn = 22, /*!< A/D Converter Interrupt */ - BOD_IRQn = 23, /*!< Brown-Out Detect Interrupt */ - USB_IRQn = 24, /*!< USB Interrupt */ - CAN_IRQn = 25, /*!< CAN Interrupt */ - DMA_IRQn = 26, /*!< General Purpose DMA Interrupt */ - I2S_IRQn = 27, /*!< I2S Interrupt */ - ENET_IRQn = 28, /*!< Ethernet Interrupt */ - RIT_IRQn = 29, /*!< Repetitive Interrupt Timer Interrupt */ - MCPWM_IRQn = 30, /*!< Motor Control PWM Interrupt */ - QEI_IRQn = 31, /*!< Quadrature Encoder Interface Interrupt */ - PLL1_IRQn = 32, /*!< PLL1 Lock (USB PLL) Interrupt */ - USBActivity_IRQn = 33, /*!< USB Activity Interrupt */ - CANActivity_IRQn = 34 /*!< CAN Activity Interrupt */ -} IRQn_Type; - - -/* - * ========================================================================== - * ----------- Processor and Core Peripheral Section ------------------------ - * ========================================================================== - */ - -/* Configuration of the Cortex-M3 Processor and Core Peripherals */ -#define __MPU_PRESENT 1 /*!< MPU present or not */ -#define __NVIC_PRIO_BITS 5 /*!< Number of Bits used for Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - - -#include "system_LPC17xx.h" /* System Header */ -#include "core_cm3.h" /* Cortex-M3 processor and core peripherals */ - - -/******************************************************************************/ -/* Device Specific Peripheral registers structures */ -/******************************************************************************/ - -#if defined ( __CC_ARM ) -#pragma anon_unions -#elif defined ( __ICCARM__ ) -#pragma language=save -#pragma language=extended -#endif - -/*------------- System Control (SC) ------------------------------------------*/ -/** @brief System Control (SC) register structure definition */ -typedef struct -{ - __IO uint32_t FLASHCFG; /* Flash Accelerator Module */ - uint32_t RESERVED0[31]; - __IO uint32_t PLL0CON; /* Clocking and Power Control */ - __IO uint32_t PLL0CFG; - __I uint32_t PLL0STAT; - __O uint32_t PLL0FEED; - uint32_t RESERVED1[4]; - __IO uint32_t PLL1CON; - __IO uint32_t PLL1CFG; - __I uint32_t PLL1STAT; - __O uint32_t PLL1FEED; - uint32_t RESERVED2[4]; - __IO uint32_t PCON; - __IO uint32_t PCONP; - uint32_t RESERVED3[15]; - __IO uint32_t CCLKCFG; - __IO uint32_t USBCLKCFG; - __IO uint32_t CLKSRCSEL; - __IO uint32_t CANSLEEPCLR; - __IO uint32_t CANWAKEFLAGS; - uint32_t RESERVED4[10]; - __IO uint32_t EXTINT; /* External Interrupts */ - uint32_t RESERVED5; - __IO uint32_t EXTMODE; - __IO uint32_t EXTPOLAR; - uint32_t RESERVED6[12]; - __IO uint32_t RSID; /* Reset */ - uint32_t RESERVED7[7]; - __IO uint32_t SCS; /* Syscon Miscellaneous Registers */ - __IO uint32_t IRCTRIM; /* Clock Dividers */ - __IO uint32_t PCLKSEL0; - __IO uint32_t PCLKSEL1; - uint32_t RESERVED8[4]; - __IO uint32_t USBIntSt; /* USB Device/OTG Interrupt Register */ - __IO uint32_t DMAREQSEL; - __IO uint32_t CLKOUTCFG; /* Clock Output Configuration */ - } LPC_SC_TypeDef; - -/*------------- Pin Connect Block (PINCON) -----------------------------------*/ -/** @brief Pin Connect Block (PINCON) register structure definition */ -typedef struct -{ - __IO uint32_t PINSEL0; - __IO uint32_t PINSEL1; - __IO uint32_t PINSEL2; - __IO uint32_t PINSEL3; - __IO uint32_t PINSEL4; - __IO uint32_t PINSEL5; - __IO uint32_t PINSEL6; - __IO uint32_t PINSEL7; - __IO uint32_t PINSEL8; - __IO uint32_t PINSEL9; - __IO uint32_t PINSEL10; - uint32_t RESERVED0[5]; - __IO uint32_t PINMODE0; - __IO uint32_t PINMODE1; - __IO uint32_t PINMODE2; - __IO uint32_t PINMODE3; - __IO uint32_t PINMODE4; - __IO uint32_t PINMODE5; - __IO uint32_t PINMODE6; - __IO uint32_t PINMODE7; - __IO uint32_t PINMODE8; - __IO uint32_t PINMODE9; - __IO uint32_t PINMODE_OD0; - __IO uint32_t PINMODE_OD1; - __IO uint32_t PINMODE_OD2; - __IO uint32_t PINMODE_OD3; - __IO uint32_t PINMODE_OD4; - __IO uint32_t I2CPADCFG; -} LPC_PINCON_TypeDef; - -/*------------- General Purpose Input/Output (GPIO) --------------------------*/ -/** @brief General Purpose Input/Output (GPIO) register structure definition */ -typedef struct -{ - union { - __IO uint32_t FIODIR; - struct { - __IO uint16_t FIODIRL; - __IO uint16_t FIODIRH; - }; - struct { - __IO uint8_t FIODIR0; - __IO uint8_t FIODIR1; - __IO uint8_t FIODIR2; - __IO uint8_t FIODIR3; - }; - }; - uint32_t RESERVED0[3]; - union { - __IO uint32_t FIOMASK; - struct { - __IO uint16_t FIOMASKL; - __IO uint16_t FIOMASKH; - }; - struct { - __IO uint8_t FIOMASK0; - __IO uint8_t FIOMASK1; - __IO uint8_t FIOMASK2; - __IO uint8_t FIOMASK3; - }; - }; - union { - __IO uint32_t FIOPIN; - struct { - __IO uint16_t FIOPINL; - __IO uint16_t FIOPINH; - }; - struct { - __IO uint8_t FIOPIN0; - __IO uint8_t FIOPIN1; - __IO uint8_t FIOPIN2; - __IO uint8_t FIOPIN3; - }; - }; - union { - __IO uint32_t FIOSET; - struct { - __IO uint16_t FIOSETL; - __IO uint16_t FIOSETH; - }; - struct { - __IO uint8_t FIOSET0; - __IO uint8_t FIOSET1; - __IO uint8_t FIOSET2; - __IO uint8_t FIOSET3; - }; - }; - union { - __O uint32_t FIOCLR; - struct { - __O uint16_t FIOCLRL; - __O uint16_t FIOCLRH; - }; - struct { - __O uint8_t FIOCLR0; - __O uint8_t FIOCLR1; - __O uint8_t FIOCLR2; - __O uint8_t FIOCLR3; - }; - }; -} LPC_GPIO_TypeDef; - -/** @brief General Purpose Input/Output interrupt (GPIOINT) register structure definition */ -typedef struct -{ - __I uint32_t IntStatus; - __I uint32_t IO0IntStatR; - __I uint32_t IO0IntStatF; - __O uint32_t IO0IntClr; - __IO uint32_t IO0IntEnR; - __IO uint32_t IO0IntEnF; - uint32_t RESERVED0[3]; - __I uint32_t IO2IntStatR; - __I uint32_t IO2IntStatF; - __O uint32_t IO2IntClr; - __IO uint32_t IO2IntEnR; - __IO uint32_t IO2IntEnF; -} LPC_GPIOINT_TypeDef; - -/*------------- Timer (TIM) --------------------------------------------------*/ -/** @brief Timer (TIM) register structure definition */ -typedef struct -{ - __IO uint32_t IR; - __IO uint32_t TCR; - __IO uint32_t TC; - __IO uint32_t PR; - __IO uint32_t PC; - __IO uint32_t MCR; - __IO uint32_t MR0; - __IO uint32_t MR1; - __IO uint32_t MR2; - __IO uint32_t MR3; - __IO uint32_t CCR; - __I uint32_t CR0; - __I uint32_t CR1; - uint32_t RESERVED0[2]; - __IO uint32_t EMR; - uint32_t RESERVED1[12]; - __IO uint32_t CTCR; -} LPC_TIM_TypeDef; - -/*------------- Pulse-Width Modulation (PWM) ---------------------------------*/ -/** @brief Pulse-Width Modulation (PWM) register structure definition */ -typedef struct -{ - __IO uint32_t IR; - __IO uint32_t TCR; - __IO uint32_t TC; - __IO uint32_t PR; - __IO uint32_t PC; - __IO uint32_t MCR; - __IO uint32_t MR0; - __IO uint32_t MR1; - __IO uint32_t MR2; - __IO uint32_t MR3; - __IO uint32_t CCR; - __I uint32_t CR0; - __I uint32_t CR1; - __I uint32_t CR2; - __I uint32_t CR3; - uint32_t RESERVED0; - __IO uint32_t MR4; - __IO uint32_t MR5; - __IO uint32_t MR6; - __IO uint32_t PCR; - __IO uint32_t LER; - uint32_t RESERVED1[7]; - __IO uint32_t CTCR; -} LPC_PWM_TypeDef; - -/*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/ -/** @brief Universal Asynchronous Receiver Transmitter (UART) register structure definition */ -typedef struct -{ - union { - __I uint8_t RBR; - __O uint8_t THR; - __IO uint8_t DLL; - uint32_t RESERVED0; - }; - union { - __IO uint8_t DLM; - __IO uint32_t IER; - }; - union { - __I uint32_t IIR; - __O uint8_t FCR; - }; - __IO uint8_t LCR; - uint8_t RESERVED1[7]; - __I uint8_t LSR; - uint8_t RESERVED2[7]; - __IO uint8_t SCR; - uint8_t RESERVED3[3]; - __IO uint32_t ACR; - __IO uint8_t ICR; - uint8_t RESERVED4[3]; - __IO uint8_t FDR; - uint8_t RESERVED5[7]; - __IO uint8_t TER; - uint8_t RESERVED6[39]; - __I uint8_t FIFOLVL; -} LPC_UART_TypeDef; - -/** @brief Universal Asynchronous Receiver Transmitter 0 (UART0) register structure definition */ -typedef struct -{ - union { - __I uint8_t RBR; - __O uint8_t THR; - __IO uint8_t DLL; - uint32_t RESERVED0; - }; - union { - __IO uint8_t DLM; - __IO uint32_t IER; - }; - union { - __I uint32_t IIR; - __O uint8_t FCR; - }; - __IO uint8_t LCR; - uint8_t RESERVED1[7]; - __I uint8_t LSR; - uint8_t RESERVED2[7]; - __IO uint8_t SCR; - uint8_t RESERVED3[3]; - __IO uint32_t ACR; - __IO uint8_t ICR; - uint8_t RESERVED4[3]; - __IO uint8_t FDR; - uint8_t RESERVED5[7]; - __IO uint8_t TER; - uint8_t RESERVED6[39]; - __I uint8_t FIFOLVL; -} LPC_UART0_TypeDef; - -/** @brief Universal Asynchronous Receiver Transmitter 1 (UART1) register structure definition */ -typedef struct -{ - union { - __I uint8_t RBR; - __O uint8_t THR; - __IO uint8_t DLL; - uint32_t RESERVED0; - }; - union { - __IO uint8_t DLM; - __IO uint32_t IER; - }; - union { - __I uint32_t IIR; - __O uint8_t FCR; - }; - __IO uint8_t LCR; - uint8_t RESERVED1[3]; - __IO uint8_t MCR; - uint8_t RESERVED2[3]; - __I uint8_t LSR; - uint8_t RESERVED3[3]; - __I uint8_t MSR; - uint8_t RESERVED4[3]; - __IO uint8_t SCR; - uint8_t RESERVED5[3]; - __IO uint32_t ACR; - uint32_t RESERVED6; - __IO uint32_t FDR; - uint32_t RESERVED7; - __IO uint8_t TER; - uint8_t RESERVED8[27]; - __IO uint8_t RS485CTRL; - uint8_t RESERVED9[3]; - __IO uint8_t ADRMATCH; - uint8_t RESERVED10[3]; - __IO uint8_t RS485DLY; - uint8_t RESERVED11[3]; - __I uint8_t FIFOLVL; -} LPC_UART1_TypeDef; - -/*------------- Serial Peripheral Interface (SPI) ----------------------------*/ -/** @brief Serial Peripheral Interface (SPI) register structure definition */ -typedef struct -{ - __IO uint32_t SPCR; - __I uint32_t SPSR; - __IO uint32_t SPDR; - __IO uint32_t SPCCR; - uint32_t RESERVED0[3]; - __IO uint32_t SPINT; -} LPC_SPI_TypeDef; - -/*------------- Synchronous Serial Communication (SSP) -----------------------*/ -/** @brief Synchronous Serial Communication (SSP) register structure definition */ -typedef struct -{ - __IO uint32_t CR0; - __IO uint32_t CR1; - __IO uint32_t DR; - __I uint32_t SR; - __IO uint32_t CPSR; - __IO uint32_t IMSC; - __IO uint32_t RIS; - __IO uint32_t MIS; - __IO uint32_t ICR; - __IO uint32_t DMACR; -} LPC_SSP_TypeDef; - -/*------------- Inter-Integrated Circuit (I2C) -------------------------------*/ -/** @brief Inter-Integrated Circuit (I2C) register structure definition */ -typedef struct -{ - __IO uint32_t I2CONSET; - __I uint32_t I2STAT; - __IO uint32_t I2DAT; - __IO uint32_t I2ADR0; - __IO uint32_t I2SCLH; - __IO uint32_t I2SCLL; - __O uint32_t I2CONCLR; - __IO uint32_t MMCTRL; - __IO uint32_t I2ADR1; - __IO uint32_t I2ADR2; - __IO uint32_t I2ADR3; - __I uint32_t I2DATA_BUFFER; - __IO uint32_t I2MASK0; - __IO uint32_t I2MASK1; - __IO uint32_t I2MASK2; - __IO uint32_t I2MASK3; -} LPC_I2C_TypeDef; - -/*------------- Inter IC Sound (I2S) -----------------------------------------*/ -/** @brief Inter IC Sound (I2S) register structure definition */ -typedef struct -{ - __IO uint32_t I2SDAO; - __IO uint32_t I2SDAI; - __O uint32_t I2STXFIFO; - __I uint32_t I2SRXFIFO; - __I uint32_t I2SSTATE; - __IO uint32_t I2SDMA1; - __IO uint32_t I2SDMA2; - __IO uint32_t I2SIRQ; - __IO uint32_t I2STXRATE; - __IO uint32_t I2SRXRATE; - __IO uint32_t I2STXBITRATE; - __IO uint32_t I2SRXBITRATE; - __IO uint32_t I2STXMODE; - __IO uint32_t I2SRXMODE; -} LPC_I2S_TypeDef; - -/*------------- Repetitive Interrupt Timer (RIT) -----------------------------*/ -/** @brief Repetitive Interrupt Timer (RIT) register structure definition */ -typedef struct -{ - __IO uint32_t RICOMPVAL; - __IO uint32_t RIMASK; - __IO uint8_t RICTRL; - uint8_t RESERVED0[3]; - __IO uint32_t RICOUNTER; -} LPC_RIT_TypeDef; - -/*------------- Real-Time Clock (RTC) ----------------------------------------*/ -/** @brief Real-Time Clock (RTC) register structure definition */ -typedef struct -{ - __IO uint8_t ILR; - uint8_t RESERVED0[7]; - __IO uint8_t CCR; - uint8_t RESERVED1[3]; - __IO uint8_t CIIR; - uint8_t RESERVED2[3]; - __IO uint8_t AMR; - uint8_t RESERVED3[3]; - __I uint32_t CTIME0; - __I uint32_t CTIME1; - __I uint32_t CTIME2; - __IO uint8_t SEC; - uint8_t RESERVED4[3]; - __IO uint8_t MIN; - uint8_t RESERVED5[3]; - __IO uint8_t HOUR; - uint8_t RESERVED6[3]; - __IO uint8_t DOM; - uint8_t RESERVED7[3]; - __IO uint8_t DOW; - uint8_t RESERVED8[3]; - __IO uint16_t DOY; - uint16_t RESERVED9; - __IO uint8_t MONTH; - uint8_t RESERVED10[3]; - __IO uint16_t YEAR; - uint16_t RESERVED11; - __IO uint32_t CALIBRATION; - __IO uint32_t GPREG0; - __IO uint32_t GPREG1; - __IO uint32_t GPREG2; - __IO uint32_t GPREG3; - __IO uint32_t GPREG4; - __IO uint8_t RTC_AUXEN; - uint8_t RESERVED12[3]; - __IO uint8_t RTC_AUX; - uint8_t RESERVED13[3]; - __IO uint8_t ALSEC; - uint8_t RESERVED14[3]; - __IO uint8_t ALMIN; - uint8_t RESERVED15[3]; - __IO uint8_t ALHOUR; - uint8_t RESERVED16[3]; - __IO uint8_t ALDOM; - uint8_t RESERVED17[3]; - __IO uint8_t ALDOW; - uint8_t RESERVED18[3]; - __IO uint16_t ALDOY; - uint16_t RESERVED19; - __IO uint8_t ALMON; - uint8_t RESERVED20[3]; - __IO uint16_t ALYEAR; - uint16_t RESERVED21; -} LPC_RTC_TypeDef; - -/*------------- Watchdog Timer (WDT) -----------------------------------------*/ -/** @brief Watchdog Timer (WDT) register structure definition */ -typedef struct -{ - __IO uint8_t WDMOD; - uint8_t RESERVED0[3]; - __IO uint32_t WDTC; - __O uint8_t WDFEED; - uint8_t RESERVED1[3]; - __I uint32_t WDTV; - __IO uint32_t WDCLKSEL; -} LPC_WDT_TypeDef; - -/*------------- Analog-to-Digital Converter (ADC) ----------------------------*/ -/** @brief Analog-to-Digital Converter (ADC) register structure definition */ -typedef struct -{ - __IO uint32_t ADCR; - __IO uint32_t ADGDR; - uint32_t RESERVED0; - __IO uint32_t ADINTEN; - __I uint32_t ADDR0; - __I uint32_t ADDR1; - __I uint32_t ADDR2; - __I uint32_t ADDR3; - __I uint32_t ADDR4; - __I uint32_t ADDR5; - __I uint32_t ADDR6; - __I uint32_t ADDR7; - __I uint32_t ADSTAT; - __IO uint32_t ADTRM; -} LPC_ADC_TypeDef; - -/*------------- Digital-to-Analog Converter (DAC) ----------------------------*/ -/** @brief Digital-to-Analog Converter (DAC) register structure definition */ -typedef struct -{ - __IO uint32_t DACR; - __IO uint32_t DACCTRL; - __IO uint16_t DACCNTVAL; -} LPC_DAC_TypeDef; - -/*------------- Motor Control Pulse-Width Modulation (MCPWM) -----------------*/ -/** @brief Motor Control Pulse-Width Modulation (MCPWM) register structure definition */ -typedef struct -{ - __I uint32_t MCCON; - __O uint32_t MCCON_SET; - __O uint32_t MCCON_CLR; - __I uint32_t MCCAPCON; - __O uint32_t MCCAPCON_SET; - __O uint32_t MCCAPCON_CLR; - __IO uint32_t MCTIM0; - __IO uint32_t MCTIM1; - __IO uint32_t MCTIM2; - __IO uint32_t MCPER0; - __IO uint32_t MCPER1; - __IO uint32_t MCPER2; - __IO uint32_t MCPW0; - __IO uint32_t MCPW1; - __IO uint32_t MCPW2; - __IO uint32_t MCDEADTIME; - __IO uint32_t MCCCP; - __IO uint32_t MCCR0; - __IO uint32_t MCCR1; - __IO uint32_t MCCR2; - __I uint32_t MCINTEN; - __O uint32_t MCINTEN_SET; - __O uint32_t MCINTEN_CLR; - __I uint32_t MCCNTCON; - __O uint32_t MCCNTCON_SET; - __O uint32_t MCCNTCON_CLR; - __I uint32_t MCINTFLAG; - __O uint32_t MCINTFLAG_SET; - __O uint32_t MCINTFLAG_CLR; - __O uint32_t MCCAP_CLR; -} LPC_MCPWM_TypeDef; - -/*------------- Quadrature Encoder Interface (QEI) ---------------------------*/ -/** @brief Quadrature Encoder Interface (QEI) register structure definition */ -typedef struct -{ - __O uint32_t QEICON; - __I uint32_t QEISTAT; - __IO uint32_t QEICONF; - __I uint32_t QEIPOS; - __IO uint32_t QEIMAXPOS; - __IO uint32_t CMPOS0; - __IO uint32_t CMPOS1; - __IO uint32_t CMPOS2; - __I uint32_t INXCNT; - __IO uint32_t INXCMP; - __IO uint32_t QEILOAD; - __I uint32_t QEITIME; - __I uint32_t QEIVEL; - __I uint32_t QEICAP; - __IO uint32_t VELCOMP; - __IO uint32_t FILTER; - uint32_t RESERVED0[998]; - __O uint32_t QEIIEC; - __O uint32_t QEIIES; - __I uint32_t QEIINTSTAT; - __I uint32_t QEIIE; - __O uint32_t QEICLR; - __O uint32_t QEISET; -} LPC_QEI_TypeDef; - -/*------------- Controller Area Network (CAN) --------------------------------*/ -/** @brief Controller Area Network Acceptance Filter RAM (CANAF_RAM)structure definition */ -typedef struct -{ - __IO uint32_t mask[512]; /* ID Masks */ -} LPC_CANAF_RAM_TypeDef; - -/** @brief Controller Area Network Acceptance Filter(CANAF) register structure definition */ -typedef struct /* Acceptance Filter Registers */ -{ - __IO uint32_t AFMR; - __IO uint32_t SFF_sa; - __IO uint32_t SFF_GRP_sa; - __IO uint32_t EFF_sa; - __IO uint32_t EFF_GRP_sa; - __IO uint32_t ENDofTable; - __I uint32_t LUTerrAd; - __I uint32_t LUTerr; - __IO uint32_t FCANIE; - __IO uint32_t FCANIC0; - __IO uint32_t FCANIC1; -} LPC_CANAF_TypeDef; - -/** @brief Controller Area Network Central (CANCR) register structure definition */ -typedef struct /* Central Registers */ -{ - __I uint32_t CANTxSR; - __I uint32_t CANRxSR; - __I uint32_t CANMSR; -} LPC_CANCR_TypeDef; - -/** @brief Controller Area Network Controller (CAN) register structure definition */ -typedef struct /* Controller Registers */ -{ - __IO uint32_t MOD; - __O uint32_t CMR; - __IO uint32_t GSR; - __I uint32_t ICR; - __IO uint32_t IER; - __IO uint32_t BTR; - __IO uint32_t EWL; - __I uint32_t SR; - __IO uint32_t RFS; - __IO uint32_t RID; - __IO uint32_t RDA; - __IO uint32_t RDB; - __IO uint32_t TFI1; - __IO uint32_t TID1; - __IO uint32_t TDA1; - __IO uint32_t TDB1; - __IO uint32_t TFI2; - __IO uint32_t TID2; - __IO uint32_t TDA2; - __IO uint32_t TDB2; - __IO uint32_t TFI3; - __IO uint32_t TID3; - __IO uint32_t TDA3; - __IO uint32_t TDB3; -} LPC_CAN_TypeDef; - -/*------------- General Purpose Direct Memory Access (GPDMA) -----------------*/ -/** @brief General Purpose Direct Memory Access (GPDMA) register structure definition */ -typedef struct /* Common Registers */ -{ - __I uint32_t DMACIntStat; - __I uint32_t DMACIntTCStat; - __O uint32_t DMACIntTCClear; - __I uint32_t DMACIntErrStat; - __O uint32_t DMACIntErrClr; - __I uint32_t DMACRawIntTCStat; - __I uint32_t DMACRawIntErrStat; - __I uint32_t DMACEnbldChns; - __IO uint32_t DMACSoftBReq; - __IO uint32_t DMACSoftSReq; - __IO uint32_t DMACSoftLBReq; - __IO uint32_t DMACSoftLSReq; - __IO uint32_t DMACConfig; - __IO uint32_t DMACSync; -} LPC_GPDMA_TypeDef; - -/** @brief General Purpose Direct Memory Access Channel (GPDMACH) register structure definition */ -typedef struct /* Channel Registers */ -{ - __IO uint32_t DMACCSrcAddr; - __IO uint32_t DMACCDestAddr; - __IO uint32_t DMACCLLI; - __IO uint32_t DMACCControl; - __IO uint32_t DMACCConfig; -} LPC_GPDMACH_TypeDef; - -/*------------- Universal Serial Bus (USB) -----------------------------------*/ -/** @brief Universal Serial Bus (USB) register structure definition */ -typedef struct -{ - __I uint32_t HcRevision; /* USB Host Registers */ - __IO uint32_t HcControl; - __IO uint32_t HcCommandStatus; - __IO uint32_t HcInterruptStatus; - __IO uint32_t HcInterruptEnable; - __IO uint32_t HcInterruptDisable; - __IO uint32_t HcHCCA; - __I uint32_t HcPeriodCurrentED; - __IO uint32_t HcControlHeadED; - __IO uint32_t HcControlCurrentED; - __IO uint32_t HcBulkHeadED; - __IO uint32_t HcBulkCurrentED; - __I uint32_t HcDoneHead; - __IO uint32_t HcFmInterval; - __I uint32_t HcFmRemaining; - __I uint32_t HcFmNumber; - __IO uint32_t HcPeriodicStart; - __IO uint32_t HcLSTreshold; - __IO uint32_t HcRhDescriptorA; - __IO uint32_t HcRhDescriptorB; - __IO uint32_t HcRhStatus; - __IO uint32_t HcRhPortStatus1; - __IO uint32_t HcRhPortStatus2; - uint32_t RESERVED0[40]; - __I uint32_t Module_ID; - - __I uint32_t OTGIntSt; /* USB On-The-Go Registers */ - __IO uint32_t OTGIntEn; - __O uint32_t OTGIntSet; - __O uint32_t OTGIntClr; - __IO uint32_t OTGStCtrl; - __IO uint32_t OTGTmr; - uint32_t RESERVED1[58]; - - __I uint32_t USBDevIntSt; /* USB Device Interrupt Registers */ - __IO uint32_t USBDevIntEn; - __O uint32_t USBDevIntClr; - __O uint32_t USBDevIntSet; - - __O uint32_t USBCmdCode; /* USB Device SIE Command Registers */ - __I uint32_t USBCmdData; - - __I uint32_t USBRxData; /* USB Device Transfer Registers */ - __O uint32_t USBTxData; - __I uint32_t USBRxPLen; - __O uint32_t USBTxPLen; - __IO uint32_t USBCtrl; - __O uint32_t USBDevIntPri; - - __I uint32_t USBEpIntSt; /* USB Device Endpoint Interrupt Regs */ - __IO uint32_t USBEpIntEn; - __O uint32_t USBEpIntClr; - __O uint32_t USBEpIntSet; - __O uint32_t USBEpIntPri; - - __IO uint32_t USBReEp; /* USB Device Endpoint Realization Reg*/ - __O uint32_t USBEpInd; - __IO uint32_t USBMaxPSize; - - __I uint32_t USBDMARSt; /* USB Device DMA Registers */ - __O uint32_t USBDMARClr; - __O uint32_t USBDMARSet; - uint32_t RESERVED2[9]; - __IO uint32_t USBUDCAH; - __I uint32_t USBEpDMASt; - __O uint32_t USBEpDMAEn; - __O uint32_t USBEpDMADis; - __I uint32_t USBDMAIntSt; - __IO uint32_t USBDMAIntEn; - uint32_t RESERVED3[2]; - __I uint32_t USBEoTIntSt; - __O uint32_t USBEoTIntClr; - __O uint32_t USBEoTIntSet; - __I uint32_t USBNDDRIntSt; - __O uint32_t USBNDDRIntClr; - __O uint32_t USBNDDRIntSet; - __I uint32_t USBSysErrIntSt; - __O uint32_t USBSysErrIntClr; - __O uint32_t USBSysErrIntSet; - uint32_t RESERVED4[15]; - - union { - __I uint32_t I2C_RX; /* USB OTG I2C Registers */ - __O uint32_t I2C_TX; - }; - __I uint32_t I2C_STS; - __IO uint32_t I2C_CTL; - __IO uint32_t I2C_CLKHI; - __O uint32_t I2C_CLKLO; - uint32_t RESERVED5[824]; - - union { - __IO uint32_t USBClkCtrl; /* USB Clock Control Registers */ - __IO uint32_t OTGClkCtrl; - }; - union { - __I uint32_t USBClkSt; - __I uint32_t OTGClkSt; - }; -} LPC_USB_TypeDef; - -/*------------- Ethernet Media Access Controller (EMAC) ----------------------*/ -/** @brief Ethernet Media Access Controller (EMAC) register structure definition */ -typedef struct -{ - __IO uint32_t MAC1; /* MAC Registers */ - __IO uint32_t MAC2; - __IO uint32_t IPGT; - __IO uint32_t IPGR; - __IO uint32_t CLRT; - __IO uint32_t MAXF; - __IO uint32_t SUPP; - __IO uint32_t TEST; - __IO uint32_t MCFG; - __IO uint32_t MCMD; - __IO uint32_t MADR; - __O uint32_t MWTD; - __I uint32_t MRDD; - __I uint32_t MIND; - uint32_t RESERVED0[2]; - __IO uint32_t SA0; - __IO uint32_t SA1; - __IO uint32_t SA2; - uint32_t RESERVED1[45]; - __IO uint32_t Command; /* Control Registers */ - __I uint32_t Status; - __IO uint32_t RxDescriptor; - __IO uint32_t RxStatus; - __IO uint32_t RxDescriptorNumber; - __I uint32_t RxProduceIndex; - __IO uint32_t RxConsumeIndex; - __IO uint32_t TxDescriptor; - __IO uint32_t TxStatus; - __IO uint32_t TxDescriptorNumber; - __IO uint32_t TxProduceIndex; - __I uint32_t TxConsumeIndex; - uint32_t RESERVED2[10]; - __I uint32_t TSV0; - __I uint32_t TSV1; - __I uint32_t RSV; - uint32_t RESERVED3[3]; - __IO uint32_t FlowControlCounter; - __I uint32_t FlowControlStatus; - uint32_t RESERVED4[34]; - __IO uint32_t RxFilterCtrl; /* Rx Filter Registers */ - __IO uint32_t RxFilterWoLStatus; - __IO uint32_t RxFilterWoLClear; - uint32_t RESERVED5; - __IO uint32_t HashFilterL; - __IO uint32_t HashFilterH; - uint32_t RESERVED6[882]; - __I uint32_t IntStatus; /* Module Control Registers */ - __IO uint32_t IntEnable; - __O uint32_t IntClear; - __O uint32_t IntSet; - uint32_t RESERVED7; - __IO uint32_t PowerDown; - uint32_t RESERVED8; - __IO uint32_t Module_ID; -} LPC_EMAC_TypeDef; - - -#if defined ( __CC_ARM ) -#pragma no_anon_unions -#elif defined ( __ICCARM__ ) -#pragma language=restore -#endif - - -/******************************************************************************/ -/* Peripheral memory map */ -/******************************************************************************/ -/* Base addresses */ -#define LPC_FLASH_BASE (0x00000000UL) -#define LPC_RAM_BASE (0x10000000UL) -#ifdef __LPC17XX_REV00 -#define LPC_AHBRAM0_BASE (0x20000000UL) -#define LPC_AHBRAM1_BASE (0x20004000UL) -#else -#define LPC_AHBRAM0_BASE (0x2007C000UL) -#define LPC_AHBRAM1_BASE (0x20080000UL) -#endif -#define LPC_GPIO_BASE (0x2009C000UL) -#define LPC_APB0_BASE (0x40000000UL) -#define LPC_APB1_BASE (0x40080000UL) -#define LPC_AHB_BASE (0x50000000UL) -#define LPC_CM3_BASE (0xE0000000UL) - -/* APB0 peripherals */ -#define LPC_WDT_BASE (LPC_APB0_BASE + 0x00000) -#define LPC_TIM0_BASE (LPC_APB0_BASE + 0x04000) -#define LPC_TIM1_BASE (LPC_APB0_BASE + 0x08000) -#define LPC_UART0_BASE (LPC_APB0_BASE + 0x0C000) -#define LPC_UART1_BASE (LPC_APB0_BASE + 0x10000) -#define LPC_PWM1_BASE (LPC_APB0_BASE + 0x18000) -#define LPC_I2C0_BASE (LPC_APB0_BASE + 0x1C000) -#define LPC_SPI_BASE (LPC_APB0_BASE + 0x20000) -#define LPC_RTC_BASE (LPC_APB0_BASE + 0x24000) -#define LPC_GPIOINT_BASE (LPC_APB0_BASE + 0x28080) -#define LPC_PINCON_BASE (LPC_APB0_BASE + 0x2C000) -#define LPC_SSP1_BASE (LPC_APB0_BASE + 0x30000) -#define LPC_ADC_BASE (LPC_APB0_BASE + 0x34000) -#define LPC_CANAF_RAM_BASE (LPC_APB0_BASE + 0x38000) -#define LPC_CANAF_BASE (LPC_APB0_BASE + 0x3C000) -#define LPC_CANCR_BASE (LPC_APB0_BASE + 0x40000) -#define LPC_CAN1_BASE (LPC_APB0_BASE + 0x44000) -#define LPC_CAN2_BASE (LPC_APB0_BASE + 0x48000) -#define LPC_I2C1_BASE (LPC_APB0_BASE + 0x5C000) - -/* APB1 peripherals */ -#define LPC_SSP0_BASE (LPC_APB1_BASE + 0x08000) -#define LPC_DAC_BASE (LPC_APB1_BASE + 0x0C000) -#define LPC_TIM2_BASE (LPC_APB1_BASE + 0x10000) -#define LPC_TIM3_BASE (LPC_APB1_BASE + 0x14000) -#define LPC_UART2_BASE (LPC_APB1_BASE + 0x18000) -#define LPC_UART3_BASE (LPC_APB1_BASE + 0x1C000) -#define LPC_I2C2_BASE (LPC_APB1_BASE + 0x20000) -#define LPC_I2S_BASE (LPC_APB1_BASE + 0x28000) -#define LPC_RIT_BASE (LPC_APB1_BASE + 0x30000) -#define LPC_MCPWM_BASE (LPC_APB1_BASE + 0x38000) -#define LPC_QEI_BASE (LPC_APB1_BASE + 0x3C000) -#define LPC_SC_BASE (LPC_APB1_BASE + 0x7C000) - -/* AHB peripherals */ -#define LPC_EMAC_BASE (LPC_AHB_BASE + 0x00000) -#define LPC_GPDMA_BASE (LPC_AHB_BASE + 0x04000) -#define LPC_GPDMACH0_BASE (LPC_AHB_BASE + 0x04100) -#define LPC_GPDMACH1_BASE (LPC_AHB_BASE + 0x04120) -#define LPC_GPDMACH2_BASE (LPC_AHB_BASE + 0x04140) -#define LPC_GPDMACH3_BASE (LPC_AHB_BASE + 0x04160) -#define LPC_GPDMACH4_BASE (LPC_AHB_BASE + 0x04180) -#define LPC_GPDMACH5_BASE (LPC_AHB_BASE + 0x041A0) -#define LPC_GPDMACH6_BASE (LPC_AHB_BASE + 0x041C0) -#define LPC_GPDMACH7_BASE (LPC_AHB_BASE + 0x041E0) -#define LPC_USB_BASE (LPC_AHB_BASE + 0x0C000) - -/* GPIOs */ -#define LPC_GPIO0_BASE (LPC_GPIO_BASE + 0x00000) -#define LPC_GPIO1_BASE (LPC_GPIO_BASE + 0x00020) -#define LPC_GPIO2_BASE (LPC_GPIO_BASE + 0x00040) -#define LPC_GPIO3_BASE (LPC_GPIO_BASE + 0x00060) -#define LPC_GPIO4_BASE (LPC_GPIO_BASE + 0x00080) - -/******************************************************************************/ -/* Peripheral declaration */ -/******************************************************************************/ -#define LPC_SC ((LPC_SC_TypeDef *) LPC_SC_BASE ) -#define LPC_GPIO0 ((LPC_GPIO_TypeDef *) LPC_GPIO0_BASE ) -#define LPC_GPIO1 ((LPC_GPIO_TypeDef *) LPC_GPIO1_BASE ) -#define LPC_GPIO2 ((LPC_GPIO_TypeDef *) LPC_GPIO2_BASE ) -#define LPC_GPIO3 ((LPC_GPIO_TypeDef *) LPC_GPIO3_BASE ) -#define LPC_GPIO4 ((LPC_GPIO_TypeDef *) LPC_GPIO4_BASE ) -#define LPC_WDT ((LPC_WDT_TypeDef *) LPC_WDT_BASE ) -#define LPC_TIM0 ((LPC_TIM_TypeDef *) LPC_TIM0_BASE ) -#define LPC_TIM1 ((LPC_TIM_TypeDef *) LPC_TIM1_BASE ) -#define LPC_TIM2 ((LPC_TIM_TypeDef *) LPC_TIM2_BASE ) -#define LPC_TIM3 ((LPC_TIM_TypeDef *) LPC_TIM3_BASE ) -#define LPC_RIT ((LPC_RIT_TypeDef *) LPC_RIT_BASE ) -#define LPC_UART0 ((LPC_UART_TypeDef *) LPC_UART0_BASE ) -#define LPC_UART1 ((LPC_UART1_TypeDef *) LPC_UART1_BASE ) -#define LPC_UART2 ((LPC_UART_TypeDef *) LPC_UART2_BASE ) -#define LPC_UART3 ((LPC_UART_TypeDef *) LPC_UART3_BASE ) -#define LPC_PWM1 ((LPC_PWM_TypeDef *) LPC_PWM1_BASE ) -#define LPC_I2C0 ((LPC_I2C_TypeDef *) LPC_I2C0_BASE ) -#define LPC_I2C1 ((LPC_I2C_TypeDef *) LPC_I2C1_BASE ) -#define LPC_I2C2 ((LPC_I2C_TypeDef *) LPC_I2C2_BASE ) -#define LPC_I2S ((LPC_I2S_TypeDef *) LPC_I2S_BASE ) -#define LPC_SPI ((LPC_SPI_TypeDef *) LPC_SPI_BASE ) -#define LPC_RTC ((LPC_RTC_TypeDef *) LPC_RTC_BASE ) -#define LPC_GPIOINT ((LPC_GPIOINT_TypeDef *) LPC_GPIOINT_BASE ) -#define LPC_PINCON ((LPC_PINCON_TypeDef *) LPC_PINCON_BASE ) -#define LPC_SSP0 ((LPC_SSP_TypeDef *) LPC_SSP0_BASE ) -#define LPC_SSP1 ((LPC_SSP_TypeDef *) LPC_SSP1_BASE ) -#define LPC_ADC ((LPC_ADC_TypeDef *) LPC_ADC_BASE ) -#define LPC_DAC ((LPC_DAC_TypeDef *) LPC_DAC_BASE ) -#define LPC_CANAF_RAM ((LPC_CANAF_RAM_TypeDef *) LPC_CANAF_RAM_BASE) -#define LPC_CANAF ((LPC_CANAF_TypeDef *) LPC_CANAF_BASE ) -#define LPC_CANCR ((LPC_CANCR_TypeDef *) LPC_CANCR_BASE ) -#define LPC_CAN1 ((LPC_CAN_TypeDef *) LPC_CAN1_BASE ) -#define LPC_CAN2 ((LPC_CAN_TypeDef *) LPC_CAN2_BASE ) -#define LPC_MCPWM ((LPC_MCPWM_TypeDef *) LPC_MCPWM_BASE ) -#define LPC_QEI ((LPC_QEI_TypeDef *) LPC_QEI_BASE ) -#define LPC_EMAC ((LPC_EMAC_TypeDef *) LPC_EMAC_BASE ) -#define LPC_GPDMA ((LPC_GPDMA_TypeDef *) LPC_GPDMA_BASE ) -#define LPC_GPDMACH0 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH0_BASE ) -#define LPC_GPDMACH1 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH1_BASE ) -#define LPC_GPDMACH2 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH2_BASE ) -#define LPC_GPDMACH3 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH3_BASE ) -#define LPC_GPDMACH4 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH4_BASE ) -#define LPC_GPDMACH5 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH5_BASE ) -#define LPC_GPDMACH6 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH6_BASE ) -#define LPC_GPDMACH7 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH7_BASE ) -#define LPC_USB ((LPC_USB_TypeDef *) LPC_USB_BASE ) - -/** - * @} - */ - -#endif // __LPC17xx_H__ diff --git a/platforms_startup/armcc/LPC1768/Makefile b/platforms_startup/armcc/LPC1768/Makefile deleted file mode 100644 index b83836edb..000000000 --- a/platforms_startup/armcc/LPC1768/Makefile +++ /dev/null @@ -1,123 +0,0 @@ -CPU := Cortex-M3 -CPU_MODE := thumb -TARGET_PLATFORM :=armcc_$(CPU)_$(CPU_MODE) - -CPPUTEST_HOME := ../../.. - -# Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° -COMPONENT_NAME := Startup_LPC1768 - -# промежуточный каталог, где производитÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑ†Ð¸Ñ startup-файлов -OBJS_DIR = objs - -# каталог Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¾Ð¹` -LIB_DIR := $(CPPUTEST_HOME)/lib/$(TARGET_PLATFORM) - -# каталог Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ -SRC_DIRS := . - -# каталог Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ñ‡Ð½Ñ‹Ð¼Ð¸ файлами -INCLUDE_DIRS := . - -# CYGWIN path -CYGWIN :=C:/CYGWIN/bin -MKDIR :=@$(CYGWIN)/mkdir -RM :=@$(CYGWIN)/rm -TOUCH :=@$(CYGWIN)/touch -ECHO :=@$(CYGWIN)/echo - -KEIL_DIR:=D:/Keil/ARM/ARMCC -CC:=@$(KEIL_DIR)/bin/armcc.exe -AS:=@$(KEIL_DIR)/bin/armasm.exe -AR:=@$(KEIL_DIR)/bin/armar.exe -# armcc system include path -SYS_INCLUDE_DIRS :=$(KEIL_DIR)/include - -# добавление ÑиÑтемных заголовочных файлов Ð´Ð»Ñ Ñборки CRT библиотеки -INCLUDE_DIRS +=$(SYS_INCLUDE_DIRS) - -CPUFLAGS :=--cpu=$(CPU) -ifeq ($(CPU_MODE), thumb) - CPUFLAGS +=--apcs=/interwork -endif -DEPFLAGS =-M $(INCLUDES) --depend_format=unix_escaped --depend_single_line --no_depend_system_headers -OPTFLAGS :=-O3 -CPPUTEST_CPPFLAGS =$(CPUFLAGS) $(OPTFLAGS) -c -g $(INCLUDES) \ - --$(CPU_MODE) \ - -D__CLK_TCK=1000 \ - -D__UART0 \ - -ARFLAGS := --debug_symbols - - -TARGET_LIB := \ - $(LIB_DIR)/lib$(COMPONENT_NAME).a - -#Helper Functions -get_src_from_dir = $(wildcard $1/*.c) $(wildcard $1/*.asm) -get_src_from_dir_list = $(foreach dir, $1, $(call get_src_from_dir,$(dir))) -__src_to = $(subst .asm,$1, $(subst .c,$1,$2)) -src_to = $(addprefix $3/,$(call __src_to,$1,$2)) -src_to_o = $(call src_to,.o,$1,$2) -src_to_d = $(call src_to,.d,$1,$2) -time = $(shell date +%s) -delta_t = $(eval minus, $1, $2) -debug_print_list = $(foreach word,$1,$(ECHO) " $(word)";) $(ECHO) - -# for building CRT library -SRC := $(call get_src_from_dir_list, $(SRC_DIRS)) -OBJ := $(call src_to_o,$(SRC),$(OBJS_DIR)) -INCLUDES += $(foreach dir, $(INCLUDE_DIRS), -I$(dir)) -DEP_FILES := $(call src_to_d, $(SRC), $(OBJS_DIR)) -STUFF_TO_CLEAN := $(OBJ) $(DEP_FILES) - -#Don't create CRT dependencies when we're cleaning, for instance -ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS)))) - -include $(DEP_FILES) -endif - -$(TARGET_LIB): $(OBJ) | $(LIB_DIR) - $(AR) $(ARFLAGS) --create $@ $^ - $(ECHO) Build CRT library done! - -.PHONY: crt -crt: - $(ECHO) - $(ECHO) CRT =$(CRT) - $(ECHO) SRC =$(SRC) - $(ECHO) OBJ =$(OBJ) - $(ECHO) INCLUDES =$(INCLUDES) - $(ECHO) DEP_FILES =$(DEP_FILES) - $(ECHO) STUFF_TO_CLEAN =$(STUFF_TO_CLEAN) - $(ECHO) OBJS_DIR =$(OBJS_DIR) - -$(LIB_DIR) $(OBJS_DIR): - $(ECHO) Updating directory $@ - $(MKDIR) -p $@ - -#This is the rule for creating the dependency files -$(OBJS_DIR)/%.d: %.c Makefile | $(OBJS_DIR) - $(ECHO) Compiling C file $< for dependency. Out file $@. - $(CC) $(DEPFLAGS) $< --depend=$@ --depend_target='$(patsubst %.d,%.o,$@)' - -$(OBJS_DIR)/%.d: %.asm | $(OBJS_DIR) - $(ECHO) Compiling ASM file $< for dependency. Out file $@. - $(TOUCH) $@ - -#This rule does the compilation C files -$(OBJS_DIR)/%.o: %.c $(OBJS_DIR)/%.d - $(ECHO) Compiling C file $<. Out file $@ - $(CC) $(CPPUTEST_CPPFLAGS) $< -o $@ - -#This rule does the compilation ASM -$(OBJS_DIR)/%.o: %.asm $(OBJS_DIR)/%.d - $(ECHO) Assembling file $<. Out file $@ - $(AS) $(CPUFLAGS) --diag-suppress 1786 $< -o $@ - - -clean: - @$(RM) -f $(STUFF_TO_CLEAN) - - -all: $(TARGET_LIB) - $(ECHO) Done! diff --git a/platforms_startup/armcc/LPC1768/README b/platforms_startup/armcc/LPC1768/README deleted file mode 100644 index dd736eaa7..000000000 --- a/platforms_startup/armcc/LPC1768/README +++ /dev/null @@ -1,19 +0,0 @@ -Startup library for ARM C/C++ compiler and LPC1768 chip. -Semihosting is in use, so you may use standard printf() or std::cout << "Hello!" - -Requirements: -1. CYGWIN (rm.exe, mkdir.exe, make.exe, echo.exe) -2. Keil MDK-ARM - -Library libStartup_LPC1768.a is placed in ./lib/armcc_Cortex-M3_thumb - directory of home CppUTest directory. - -Time measure is done using LPC_TIM3. -Because of calling _clock_init() before main() by startup code, value of - SystemCoreClock is 0, and it is need to manually call _clock_init() in main() - or other place after updating SystemCoreClock. - It come from two quartz selection in system_LPC17xx.c, non-standard solution - of startup initialization. - To remove _clock_init() call from main(), you need to remove two quartz - configuration in system_LPC17xx.c and declare SystemCoreClock variable as - "const" with value of real clock frequency. diff --git a/platforms_startup/armcc/LPC1768/Retarget.c b/platforms_startup/armcc/LPC1768/Retarget.c deleted file mode 100644 index 03060a890..000000000 --- a/platforms_startup/armcc/LPC1768/Retarget.c +++ /dev/null @@ -1,153 +0,0 @@ -/*---------------------------------------------------------------------------- - * Name: Retarget.c - * Purpose: 'Retarget' layer for target-dependent low level functions - * Note(s): - *---------------------------------------------------------------------------- - * This file is part of the uVision/ARM development tools. - * This software may only be used under the terms of a valid, current, - * end user licence from KEIL for a compatible version of KEIL software - * development tools. Nothing else gives you the right to use this software. - * - * This software is supplied "AS IS" without warranties of any kind. - * - * Copyright (c) 2011 Keil - An ARM Company. All rights reserved. - *----------------------------------------------------------------------------*/ - -#include -#include -#include -#include "Serial.h" -#include "lpc17xx_timer.h" - -/* Standard IO device handles. */ -#define STDIN 0x8001 -#define STDOUT 0x8002 -#define STDERR 0x8003 - - -#pragma import(__use_no_semihosting_swi) - -const char __stdin_name[] = "STDIN"; -const char __stdout_name[] = "STDOUT"; -const char __stderr_name[] = "STDERR"; - - -FILEHANDLE _sys_open(const char *name, int openmode) -{ - FILEHANDLE rc; - /* Register standard Input Output devices. */ - if (strcmp(name, "STDIN") == 0) rc = STDIN; - else if (strcmp(name, "STDOUT") == 0) rc = STDOUT; - else if (strcmp(name, "STDERR") == 0) rc = STDERR; - else rc = 1; - return (rc); -} - -int _sys_close(FILEHANDLE fh) -{ - return 0; -} - -int _sys_write(FILEHANDLE fh, const unsigned char *buf, - unsigned len, int mode) -{ - while (len) { - SER_PutChar(*buf); - buf++; - len--; - } - return len; -} - -int _sys_read(FILEHANDLE fh, unsigned char *buf, - unsigned len, int mode) -{ - return -1; /* not supported */ -} - -void _ttywrch(int ch) -{ - SER_PutChar(ch); -} - -int _sys_istty(FILEHANDLE fh) -{ - return 0; /* buffered output */ -} - -int _sys_seek(FILEHANDLE fh, long pos) -{ - return -1; /* not supported */ -} - -long _sys_flen(FILEHANDLE fh) -{ - return -1; /* not supported */ -} - -void _sys_exit(int return_code) { - while(1); -} - -char *_sys_command_string(char *cmd, int len) -{ - const char * const arg[] = { - "tst.axf", - "-v", - "-gSimpleStringBuffer", - "-ojunit"}; - int i, j; - char *rc = cmd; - if (len) { - /* Specify commandline arguments here as needed */ - len = sizeof(arg) / sizeof(char *); - for (i = 0; i < len; i++) { - j = strlen(arg[i])+1; - if (cmd - rc + j > len) { - rc = NULL; - break; - } - memcpy(cmd, arg[i], j); - cmd += j; - } - if (rc) rc = cmd; - } else rc = NULL; - return rc; -} - -void _clock_init(void) -{ - const TIM_TIMERCFG_Type config_us_timer = {TIM_PRESCALE_USVAL, {0,0,0}, 1000}; /* 1000 us for one timer tick */ - TIM_Init(LPC_TIM3, TIM_TIMER_MODE, (void *)&config_us_timer); /* TIMER3 for counting 1 ms */ - TIM_Cmd(LPC_TIM3, ENABLE); -} - -clock_t clock(void) -{ - return LPC_TIM3->TC; -} - -time_t time(time_t *timer) -{ - return 0; -} - - - -/* - * Замена вÑтроенной в Keil MDK-ARM функции, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñоздаёт ÑвÑзанный ÑпиÑок - * адреÑов деÑтрукторов глобальных или ÑтатичеÑких объектов в "куче" при - * инициализации окружениÑ. - * Так как не планируетÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ðµ программы, то ни один такой деÑтруктор не - * должен вызыватьÑÑ, и можно подменить Ñтандартную верÑию __aeabi_atexit на - * другую, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ будет Ñоздавать такой ÑпиÑок в "куче". - * Ð˜Ð´ÐµÑ Ð²Ð·Ñта отÑюда - * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3951.html - * Пример реализации взÑÑ‚ отÑюда - * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0041d/IHI0041D_cppabi.pdf - */ -int __aeabi_atexit(void* object, void (*destroyer)(void*), void* dso_handle) -{ - return 1; // 0: failed; non-0: OK -// return __cxa_atexit(destroyer, object, dso_handle); /* ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¸Ð· Keil MDK-ARM */ -} diff --git a/platforms_startup/armcc/LPC1768/Serial.c b/platforms_startup/armcc/LPC1768/Serial.c deleted file mode 100644 index 96d99826b..000000000 --- a/platforms_startup/armcc/LPC1768/Serial.c +++ /dev/null @@ -1,82 +0,0 @@ -/*------------------------------------------------------------------------------ - * RL-ARM - *------------------------------------------------------------------------------ - * Name: Serial.c - * Purpose: Serial Input Output for NXP LPC17xx - * Note(s): Possible defines to select the used communication interface: - * __UART0 - COM0 (UART0) interface - * - COM1 (UART1) interface (default) - *------------------------------------------------------------------------------ - * This code is part of the RealView Run-Time Library. - * Copyright (c) 2004-2012 KEIL - An ARM Company. All rights reserved. - *----------------------------------------------------------------------------*/ - -#include -#include "Serial.h" - -#ifdef __UART0 - #define UART LPC_UART0 -#else - #define UART LPC_UART1 -#endif - -static int init_UART_done = 0; - - -/*------------------------------------------------------------------------------ - * SER_Init: Initialize Serial Interface - *----------------------------------------------------------------------------*/ - -void SER_Init (void) { - -#ifdef __UART0 /* UART0 */ - LPC_SC->PCONP |= ((1 << 3) | (1 << 15)); /* enable power to UART0 & IOCON */ - - LPC_PINCON->PINSEL0 |= (1 << 4); /* Pin P0.2 used as TXD0 */ - LPC_PINCON->PINSEL0 |= (1 << 6); /* Pin P0.3 used as RXD0 */ -#else /* UART1 */ - LPC_SC->PCONP |= ((1 << 4) | (1 << 15)); /* enable power to UART1 & IOCON */ - - LPC_PINCON->PINSEL4 |= (2 << 0); /* Pin P2.0 used as TXD1 */ - LPC_PINCON->PINSEL4 |= (2 << 2); /* Pin P2.1 used as RXD1 */ -#endif - - UART->LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ - UART->DLL = 9; /* 115200 Baud Rate @ 25.0 MHZ PCLK*/ - UART->FDR = 0x21; /* FR 1,507, DIVADDVAL=1, MULVAL=2 */ - UART->DLM = 0; /* High divisor latch = 0 */ - UART->LCR = 0x03; /* DLAB = 0 */ -} - - -/*------------------------------------------------------------------------------ - * SER_PutChar: Write a character to the Serial Port - *----------------------------------------------------------------------------*/ - -int32_t SER_PutChar (int32_t ch) { - - if (init_UART_done == 0) { - SER_Init(); - init_UART_done++; - } - while (!(UART->LSR & 0x20)); - UART->THR = ch; - return (ch); -} - - -/*------------------------------------------------------------------------------ - * SER_GetChar: Read a character from the Serial Port (non-blocking) - *----------------------------------------------------------------------------*/ - -int32_t SER_GetChar (void) { - - if (UART->LSR & 0x01) - return (UART->RBR); - return (-1); -} - - -/*------------------------------------------------------------------------------ - * End of file - *----------------------------------------------------------------------------*/ diff --git a/platforms_startup/armcc/LPC1768/Serial.h b/platforms_startup/armcc/LPC1768/Serial.h deleted file mode 100644 index 2176f5009..000000000 --- a/platforms_startup/armcc/LPC1768/Serial.h +++ /dev/null @@ -1,24 +0,0 @@ -/*----------------------------------------------------------------------------- - * Name: Serial.h - * Purpose: Serial I/O definitions - *----------------------------------------------------------------------------- - * This file is part of the uVision/ARM development tools. - * This software may only be used under the terms of a valid, current, - * end user licence from KEIL for a compatible version of KEIL software - * development tools. Nothing else gives you the right to use this software. - * - * This software is supplied "AS IS" without warranties of any kind. - * - * Copyright (c) 2004-2012 Keil - An ARM Company. All rights reserved. - *----------------------------------------------------------------------------*/ - -#ifndef __SERIAL_H -#define __SERIAL_H - -#include - -extern void SER_Init (void); -extern int32_t SER_GetChar (void); -extern int32_t SER_PutChar (int32_t ch); - -#endif /* __SERIAL_H */ diff --git a/platforms_startup/armcc/LPC1768/core_cm3.h b/platforms_startup/armcc/LPC1768/core_cm3.h deleted file mode 100644 index 76bf26f6e..000000000 --- a/platforms_startup/armcc/LPC1768/core_cm3.h +++ /dev/null @@ -1,1227 +0,0 @@ -/**************************************************************************//** - * @file core_cm3.h - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V2.10 - * @date 19. July 2011 - * - * @note - * Copyright (C) 2009-2011 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM3_H_GENERIC -#define __CORE_CM3_H_GENERIC - - -/** \ingroup CMSIS_Core - \defgroup CMSIS_MISRA_Exceptions CMSIS MISRA-C:2004 Compliance Exceptions - CMSIS violates following MISRA-C2004 Rules: - - - Violates MISRA 2004 Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - - Violates MISRA 2004 Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - - Violates MISRA 2004 Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup CMSIS_Core - \defgroup CMSIS_core_definitions CMSIS Core Definitions - This file defines all structures and symbols for CMSIS core: - - CMSIS version number - - Cortex-M core - - Cortex-M core Revision Number - @{ - */ - -/* CMSIS CM3 definitions */ -#define __CM3_CMSIS_VERSION_MAIN (0x02) /*!< [31:16] CMSIS HAL main version */ -#define __CM3_CMSIS_VERSION_SUB (0x10) /*!< [15:0] CMSIS HAL sub version */ -#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x03) /*!< Cortex core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - -#endif - -/*!< __FPU_USED to be checked prior to making use of FPU specific registers and functions */ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - /* add preprocessor checks */ -#endif - -#include /*!< standard types definitions */ -#include "core_cmInstr.h" /*!< Core Instruction Access */ -#include "core_cmFunc.h" /*!< Core Function Access */ - -#endif /* __CORE_CM3_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM3_H_DEPENDANT -#define __CORE_CM3_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM3_REV - #define __CM3_REV 0x0200 - #warning "__CM3_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -#ifdef __cplusplus - #define __I volatile /*!< defines 'read only' permissions */ -#else - #define __I volatile const /*!< defines 'read only' permissions */ -#endif -#define __O volatile /*!< defines 'write only' permissions */ -#define __IO volatile /*!< defines 'read / write' permissions */ - -/*@} end of group CMSIS_core_definitions */ - - - -/******************************************************************************* - * Register Abstraction - ******************************************************************************/ -/** \ingroup CMSIS_Core - \defgroup CMSIS_core_register CMSIS Core Register - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE CMSIS Core - Type definitions for the Cortex-M Core Registers - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC CMSIS NVIC - Type definitions for the Cortex-M NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB CMSIS SCB - Type definitions for the Cortex-M System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB CMSIS System Control and ID Register not in the SCB - Type definitions for the Cortex-M System Control and ID Register not in the SCB - @{ - */ - -/** \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ -#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -#else - uint32_t RESERVED1[1]; -#endif -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick CMSIS SysTick - Type definitions for the Cortex-M System Timer Registers - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM CMSIS ITM - Type definitions for the Cortex-M Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __O union - { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_TXENA_Pos 3 /*!< ITM TCR: TXENA Position */ -#define ITM_TCR_TXENA_Msk (1UL << ITM_TCR_TXENA_Pos) /*!< ITM TCR: TXENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU CMSIS MPU - Type definitions for the Cortex-M Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug CMSIS Core Debug - Type definitions for the Cortex-M Core Debug Registers - @{ - */ - -/** \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - @{ - */ - -/* Memory mapping of Cortex-M3 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - ******************************************************************************/ -/** \ingroup CMSIS_Core - \defgroup CMSIS_Core_FunctionInterface CMSIS Core Function Interface - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions CMSIS Core NVIC Functions - @{ - */ - -/** \brief Set Priority Grouping - - This function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - - \param [in] PriorityGroup Priority grouping field - */ -static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** \brief Get Priority Grouping - - This function gets the priority grouping from NVIC Interrupt Controller. - Priority grouping is SCB->AIRCR [10:8] PRIGROUP field. - - \return Priority grouping field - */ -static __INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ -} - - -/** \brief Enable External Interrupt - - This function enables a device specific interrupt in the NVIC interrupt controller. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the external interrupt to enable - */ -static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ -} - - -/** \brief Disable External Interrupt - - This function disables a device specific interrupt in the NVIC interrupt controller. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the external interrupt to disable - */ -static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ -} - - -/** \brief Get Pending Interrupt - - This function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Number of the interrupt for get pending - \return 0 Interrupt status is not pending - \return 1 Interrupt status is pending - */ -static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ -} - - -/** \brief Set Pending Interrupt - - This function sets the pending bit for the specified interrupt. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the interrupt for set pending - */ -static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ -} - - -/** \brief Clear Pending Interrupt - - This function clears the pending bit for the specified interrupt. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the interrupt for clear pending - */ -static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Get Active Interrupt - - This function reads the active register in NVIC and returns the active bit. - \param [in] IRQn Number of the interrupt for get active - \return 0 Interrupt status is not active - \return 1 Interrupt status is active - */ -static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ -} - - -/** \brief Set Interrupt Priority - - This function sets the priority for the specified interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - Note: The priority cannot be set for every core interrupt. - - \param [in] IRQn Number of the interrupt for set priority - \param [in] priority Priority to set - */ -static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ - else { - NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ -} - - -/** \brief Get Interrupt Priority - - This function reads the priority for the specified interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - The returned priority value is automatically aligned to the implemented - priority bits of the microcontroller. - - \param [in] IRQn Number of the interrupt for get priority - \return Interrupt Priority - */ -static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ - else { - return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief Encode Priority - - This function encodes the priority for an interrupt with the given priority group, - preemptive priority value and sub priority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - - The returned priority value can be used for NVIC_SetPriority(...) function - - \param [in] PriorityGroup Used priority group - \param [in] PreemptPriority Preemptive priority value (starting from 0) - \param [in] SubPriority Sub priority value (starting from 0) - \return Encoded priority for the interrupt - */ -static __INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - return ( - ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | - ((SubPriority & ((1 << (SubPriorityBits )) - 1))) - ); -} - - -/** \brief Decode Priority - - This function decodes an interrupt priority value with the given priority group to - preemptive priority value and sub priority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - - The priority value can be retrieved with NVIC_GetPriority(...) function - - \param [in] Priority Priority value - \param [in] PriorityGroup Used priority group - \param [out] pPreemptPriority Preemptive priority value (starting from 0) - \param [out] pSubPriority Sub priority value (starting from 0) - */ -static __INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); - *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); -} - - -/** \brief System Reset - - This function initiate a system reset request to reset the MCU. - */ -static __INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions CMSIS Core SysTick Functions - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - This function initialises the system tick timer and its interrupt and start the system tick timer. - Counter is in free running mode to generate periodical interrupts. - - \param [in] ticks Number of ticks between two interrupts - \return 0 Function succeeded - \return 1 Function failed - */ -static __INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions CMSIS Core Debug Functions - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< external variable to receive characters */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< value identifying ITM_RxBuffer is ready for next character */ - - -/** \brief ITM Send Character - - This function transmits a character via the ITM channel 0. - It just returns when no debugger is connected that has booked the output. - It is blocking when a debugger is connected, but the previous character send is not transmitted. - - \param [in] ch Character to transmit - \return Character to transmit - */ -static __INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) && /* Trace enabled */ - (ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ - (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0].u32 == 0); - ITM->PORT[0].u8 = (uint8_t) ch; - } - return (ch); -} - - -/** \brief ITM Receive Character - - This function inputs a character via external variable ITM_RxBuffer. - It just returns when no debugger is connected that has booked the output. - It is blocking when a debugger is connected, but the previous character send is not transmitted. - - \return Received character - \return -1 No character received - */ -static __INLINE int32_t ITM_ReceiveChar (void) { - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** \brief ITM Check Character - - This function checks external variable ITM_RxBuffer whether a character is available or not. - It returns '1' if a character is available and '0' if no character is available. - - \return 0 No character available - \return 1 Character available - */ -static __INLINE int32_t ITM_CheckChar (void) { - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - -#endif /* __CORE_CM3_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/platforms_startup/armcc/LPC1768/core_cmFunc.h b/platforms_startup/armcc/LPC1768/core_cmFunc.h deleted file mode 100644 index 88819f9dd..000000000 --- a/platforms_startup/armcc/LPC1768/core_cmFunc.h +++ /dev/null @@ -1,609 +0,0 @@ -/**************************************************************************//** - * @file core_cmFunc.h - * @brief CMSIS Cortex-M Core Function Access Header File - * @version V2.10 - * @date 26. July 2011 - * - * @note - * Copyright (C) 2009-2011 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - -#ifndef __CORE_CMFUNC_H -#define __CORE_CMFUNC_H - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -#if (__ARMCC_VERSION < 400677) - #error "Please use ARM Compiler Toolchain V4.0.677 or later!" -#endif - -/* intrinsic void __enable_irq(); */ -/* intrinsic void __disable_irq(); */ - -/** \brief Get Control Register - - This function returns the content of the Control Register. - - \return Control Register value - */ -static __INLINE uint32_t __get_CONTROL(void) -{ - register uint32_t __regControl __ASM("control"); - return(__regControl); -} - - -/** \brief Set Control Register - - This function writes the given value to the Control Register. - - \param [in] control Control Register value to set - */ -static __INLINE void __set_CONTROL(uint32_t control) -{ - register uint32_t __regControl __ASM("control"); - __regControl = control; -} - - -/** \brief Get ISPR Register - - This function returns the content of the ISPR Register. - - \return ISPR Register value - */ -static __INLINE uint32_t __get_IPSR(void) -{ - register uint32_t __regIPSR __ASM("ipsr"); - return(__regIPSR); -} - - -/** \brief Get APSR Register - - This function returns the content of the APSR Register. - - \return APSR Register value - */ -static __INLINE uint32_t __get_APSR(void) -{ - register uint32_t __regAPSR __ASM("apsr"); - return(__regAPSR); -} - - -/** \brief Get xPSR Register - - This function returns the content of the xPSR Register. - - \return xPSR Register value - */ -static __INLINE uint32_t __get_xPSR(void) -{ - register uint32_t __regXPSR __ASM("xpsr"); - return(__regXPSR); -} - - -/** \brief Get Process Stack Pointer - - This function returns the current value of the Process Stack Pointer (PSP). - - \return PSP Register value - */ -static __INLINE uint32_t __get_PSP(void) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - return(__regProcessStackPointer); -} - - -/** \brief Set Process Stack Pointer - - This function assigns the given value to the Process Stack Pointer (PSP). - - \param [in] topOfProcStack Process Stack Pointer value to set - */ -static __INLINE void __set_PSP(uint32_t topOfProcStack) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - __regProcessStackPointer = topOfProcStack; -} - - -/** \brief Get Main Stack Pointer - - This function returns the current value of the Main Stack Pointer (MSP). - - \return MSP Register value - */ -static __INLINE uint32_t __get_MSP(void) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - return(__regMainStackPointer); -} - - -/** \brief Set Main Stack Pointer - - This function assigns the given value to the Main Stack Pointer (MSP). - - \param [in] topOfMainStack Main Stack Pointer value to set - */ -static __INLINE void __set_MSP(uint32_t topOfMainStack) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - __regMainStackPointer = topOfMainStack; -} - - -/** \brief Get Priority Mask - - This function returns the current state of the priority mask bit from the Priority Mask Register. - - \return Priority Mask value - */ -static __INLINE uint32_t __get_PRIMASK(void) -{ - register uint32_t __regPriMask __ASM("primask"); - return(__regPriMask); -} - - -/** \brief Set Priority Mask - - This function assigns the given value to the Priority Mask Register. - - \param [in] priMask Priority Mask - */ -static __INLINE void __set_PRIMASK(uint32_t priMask) -{ - register uint32_t __regPriMask __ASM("primask"); - __regPriMask = (priMask); -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Enable FIQ - - This function enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq - - -/** \brief Disable FIQ - - This function disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq - - -/** \brief Get Base Priority - - This function returns the current value of the Base Priority register. - - \return Base Priority register value - */ -static __INLINE uint32_t __get_BASEPRI(void) -{ - register uint32_t __regBasePri __ASM("basepri"); - return(__regBasePri); -} - - -/** \brief Set Base Priority - - This function assigns the given value to the Base Priority register. - - \param [in] basePri Base Priority value to set - */ -static __INLINE void __set_BASEPRI(uint32_t basePri) -{ - register uint32_t __regBasePri __ASM("basepri"); - __regBasePri = (basePri & 0xff); -} - - -/** \brief Get Fault Mask - - This function returns the current value of the Fault Mask register. - - \return Fault Mask register value - */ -static __INLINE uint32_t __get_FAULTMASK(void) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - return(__regFaultMask); -} - - -/** \brief Set Fault Mask - - This function assigns the given value to the Fault Mask register. - - \param [in] faultMask Fault Mask value to set - */ -static __INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - __regFaultMask = (faultMask & (uint32_t)1); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - -#if (__CORTEX_M == 0x04) - -/** \brief Get FPSCR - - This function returns the current value of the Floating Point Status/Control register. - - \return Floating Point Status/Control register value - */ -static __INLINE uint32_t __get_FPSCR(void) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - register uint32_t __regfpscr __ASM("fpscr"); - return(__regfpscr); -#else - return(0); -#endif -} - - -/** \brief Set FPSCR - - This function assigns the given value to the Floating Point Status/Control register. - - \param [in] fpscr Floating Point Status/Control value to set - */ -static __INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - register uint32_t __regfpscr __ASM("fpscr"); - __regfpscr = (fpscr); -#endif -} - -#endif /* (__CORTEX_M == 0x04) */ - - -#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ - -#include - -#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -/** \brief Enable IRQ Interrupts - - This function enables IRQ interrupts by clearing the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) static __INLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i"); -} - - -/** \brief Disable IRQ Interrupts - - This function disables IRQ interrupts by setting the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) static __INLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i"); -} - - -/** \brief Get Control Register - - This function returns the content of the Control Register. - - \return Control Register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -/** \brief Set Control Register - - This function writes the given value to the Control Register. - - \param [in] control Control Register value to set - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) ); -} - - -/** \brief Get ISPR Register - - This function returns the content of the ISPR Register. - - \return ISPR Register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** \brief Get APSR Register - - This function returns the content of the APSR Register. - - \return APSR Register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** \brief Get xPSR Register - - This function returns the content of the xPSR Register. - - \return xPSR Register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** \brief Get Process Stack Pointer - - This function returns the current value of the Process Stack Pointer (PSP). - - \return PSP Register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); - return(result); -} - - -/** \brief Set Process Stack Pointer - - This function assigns the given value to the Process Stack Pointer (PSP). - - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) ); -} - - -/** \brief Get Main Stack Pointer - - This function returns the current value of the Main Stack Pointer (MSP). - - \return MSP Register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_MSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); - return(result); -} - - -/** \brief Set Main Stack Pointer - - This function assigns the given value to the Main Stack Pointer (MSP). - - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) ); -} - - -/** \brief Get Priority Mask - - This function returns the current state of the priority mask bit from the Priority Mask Register. - - \return Priority Mask value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -/** \brief Set Priority Mask - - This function assigns the given value to the Priority Mask Register. - - \param [in] priMask Priority Mask - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) ); -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Enable FIQ - - This function enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) static __INLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f"); -} - - -/** \brief Disable FIQ - - This function disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) static __INLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f"); -} - - -/** \brief Get Base Priority - - This function returns the current value of the Base Priority register. - - \return Base Priority register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); - return(result); -} - - -/** \brief Set Base Priority - - This function assigns the given value to the Base Priority register. - - \param [in] basePri Base Priority value to set - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_BASEPRI(uint32_t value) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (value) ); -} - - -/** \brief Get Fault Mask - - This function returns the current value of the Fault Mask register. - - \return Fault Mask register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -/** \brief Set Fault Mask - - This function assigns the given value to the Fault Mask register. - - \param [in] faultMask Fault Mask value to set - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - -#if (__CORTEX_M == 0x04) - -/** \brief Get FPSCR - - This function returns the current value of the Floating Point Status/Control register. - - \return Floating Point Status/Control register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FPSCR(void) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - uint32_t result; - - __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); - return(result); -#else - return(0); -#endif -} - - -/** \brief Set FPSCR - - This function assigns the given value to the Floating Point Status/Control register. - - \param [in] fpscr Floating Point Status/Control value to set - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) ); -#endif -} - -#endif /* (__CORTEX_M == 0x04) */ - - -#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ -/* TASKING carm specific functions */ - -/* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all instrinsics, - * Including the CMSIS ones. - */ - -#endif - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -#endif /* __CORE_CMFUNC_H */ diff --git a/platforms_startup/armcc/LPC1768/core_cmInstr.h b/platforms_startup/armcc/LPC1768/core_cmInstr.h deleted file mode 100644 index 8ccd4fef1..000000000 --- a/platforms_startup/armcc/LPC1768/core_cmInstr.h +++ /dev/null @@ -1,586 +0,0 @@ -/**************************************************************************//** - * @file core_cmInstr.h - * @brief CMSIS Cortex-M Core Instruction Access Header File - * @version V2.10 - * @date 19. July 2011 - * - * @note - * Copyright (C) 2009-2011 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - -#ifndef __CORE_CMINSTR_H -#define __CORE_CMINSTR_H - - -/* ########################## Core Instruction Access ######################### */ -/** \ingroup CMSIS_Core - \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -#if (__ARMCC_VERSION < 400677) - #error "Please use ARM Compiler Toolchain V4.0.677 or later!" -#endif - - -/** \brief No Operation - - No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __nop - - -/** \brief Wait For Interrupt - - Wait For Interrupt is a hint instruction that suspends execution - until one of a number of events occurs. - */ -#define __WFI __wfi - - -/** \brief Wait For Event - - Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -#define __WFE __wfe - - -/** \brief Send Event - - Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __sev - - -/** \brief Instruction Synchronization Barrier - - Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or - memory, after the instruction has been completed. - */ -#define __ISB() __isb(0xF) - - -/** \brief Data Synchronization Barrier - - This function acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __dsb(0xF) - - -/** \brief Data Memory Barrier - - This function ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __dmb(0xF) - - -/** \brief Reverse byte order (32 bit) - - This function reverses the byte order in integer value. - - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __rev - - -/** \brief Reverse byte order (16 bit) - - This function reverses the byte order in two unsigned short values. - - \param [in] value Value to reverse - \return Reversed value - */ -static __INLINE __ASM uint32_t __REV16(uint32_t value) -{ - rev16 r0, r0 - bx lr -} - - -/** \brief Reverse byte order in signed short value - - This function reverses the byte order in a signed short value with sign extension to integer. - - \param [in] value Value to reverse - \return Reversed value - */ -static __INLINE __ASM int32_t __REVSH(int32_t value) -{ - revsh r0, r0 - bx lr -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Reverse bit order of value - - This function reverses the bit order of the given value. - - \param [in] value Value to reverse - \return Reversed value - */ -#define __RBIT __rbit - - -/** \brief LDR Exclusive (8 bit) - - This function performs a exclusive LDR command for 8 bit value. - - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) - - -/** \brief LDR Exclusive (16 bit) - - This function performs a exclusive LDR command for 16 bit values. - - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) - - -/** \brief LDR Exclusive (32 bit) - - This function performs a exclusive LDR command for 32 bit values. - - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) - - -/** \brief STR Exclusive (8 bit) - - This function performs a exclusive STR command for 8 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXB(value, ptr) __strex(value, ptr) - - -/** \brief STR Exclusive (16 bit) - - This function performs a exclusive STR command for 16 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXH(value, ptr) __strex(value, ptr) - - -/** \brief STR Exclusive (32 bit) - - This function performs a exclusive STR command for 32 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXW(value, ptr) __strex(value, ptr) - - -/** \brief Remove the exclusive lock - - This function removes the exclusive lock which is created by LDREX. - - */ -#define __CLREX __clrex - - -/** \brief Signed Saturate - - This function saturates a signed value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __ssat - - -/** \brief Unsigned Saturate - - This function saturates an unsigned value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __usat - - -/** \brief Count leading zeros - - This function counts the number of leading zeros of a data value. - - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __clz - -#endif /* (__CORTEX_M >= 0x03) */ - - - -#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ - -#include - - -#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -/** \brief No Operation - - No Operation does nothing. This instruction can be used for code alignment purposes. - */ -__attribute__( ( always_inline ) ) static __INLINE void __NOP(void) -{ - __ASM volatile ("nop"); -} - - -/** \brief Wait For Interrupt - - Wait For Interrupt is a hint instruction that suspends execution - until one of a number of events occurs. - */ -__attribute__( ( always_inline ) ) static __INLINE void __WFI(void) -{ - __ASM volatile ("wfi"); -} - - -/** \brief Wait For Event - - Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -__attribute__( ( always_inline ) ) static __INLINE void __WFE(void) -{ - __ASM volatile ("wfe"); -} - - -/** \brief Send Event - - Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -__attribute__( ( always_inline ) ) static __INLINE void __SEV(void) -{ - __ASM volatile ("sev"); -} - - -/** \brief Instruction Synchronization Barrier - - Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or - memory, after the instruction has been completed. - */ -__attribute__( ( always_inline ) ) static __INLINE void __ISB(void) -{ - __ASM volatile ("isb"); -} - - -/** \brief Data Synchronization Barrier - - This function acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -__attribute__( ( always_inline ) ) static __INLINE void __DSB(void) -{ - __ASM volatile ("dsb"); -} - - -/** \brief Data Memory Barrier - - This function ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -__attribute__( ( always_inline ) ) static __INLINE void __DMB(void) -{ - __ASM volatile ("dmb"); -} - - -/** \brief Reverse byte order (32 bit) - - This function reverses the byte order in integer value. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -/** \brief Reverse byte order (16 bit) - - This function reverses the byte order in two unsigned short values. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV16(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -/** \brief Reverse byte order in signed short value - - This function reverses the byte order in a signed short value with sign extension to integer. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) static __INLINE int32_t __REVSH(int32_t value) -{ - uint32_t result; - - __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Reverse bit order of value - - This function reverses the bit order of the given value. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -/** \brief LDR Exclusive (8 bit) - - This function performs a exclusive LDR command for 8 bit value. - - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__( ( always_inline ) ) static __INLINE uint8_t __LDREXB(volatile uint8_t *addr) -{ - uint8_t result; - - __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); - return(result); -} - - -/** \brief LDR Exclusive (16 bit) - - This function performs a exclusive LDR command for 16 bit values. - - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__( ( always_inline ) ) static __INLINE uint16_t __LDREXH(volatile uint16_t *addr) -{ - uint16_t result; - - __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); - return(result); -} - - -/** \brief LDR Exclusive (32 bit) - - This function performs a exclusive LDR command for 32 bit values. - - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __LDREXW(volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); - return(result); -} - - -/** \brief STR Exclusive (8 bit) - - This function performs a exclusive STR command for 8 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); - return(result); -} - - -/** \brief STR Exclusive (16 bit) - - This function performs a exclusive STR command for 16 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); - return(result); -} - - -/** \brief STR Exclusive (32 bit) - - This function performs a exclusive STR command for 32 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); - return(result); -} - - -/** \brief Remove the exclusive lock - - This function removes the exclusive lock which is created by LDREX. - - */ -__attribute__( ( always_inline ) ) static __INLINE void __CLREX(void) -{ - __ASM volatile ("clrex"); -} - - -/** \brief Signed Saturate - - This function saturates a signed value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** \brief Unsigned Saturate - - This function saturates an unsigned value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** \brief Count leading zeros - - This function counts the number of leading zeros of a data value. - - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -__attribute__( ( always_inline ) ) static __INLINE uint8_t __CLZ(uint32_t value) -{ - uint8_t result; - - __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - - - -#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ -/* TASKING carm specific functions */ - -/* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all intrinsics, - * Including the CMSIS ones. - */ - -#endif - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - -#endif /* __CORE_CMINSTR_H */ diff --git a/platforms_startup/armcc/LPC1768/lpc17xx_clkpwr.c b/platforms_startup/armcc/LPC1768/lpc17xx_clkpwr.c deleted file mode 100644 index f6663d91b..000000000 --- a/platforms_startup/armcc/LPC1768/lpc17xx_clkpwr.c +++ /dev/null @@ -1,350 +0,0 @@ -/********************************************************************** -* $Id$ lpc17xx_clkpwr.c 2010-06-18 -*//** -* @file lpc17xx_clkpwr.c -* @brief Contains all functions support for Clock and Power Control -* firmware library on LPC17xx -* @version 3.0 -* @date 18. June. 2010 -* @author NXP MCU SW Application Team -* -* Copyright(C) 2010, NXP Semiconductor -* All rights reserved. -* -*********************************************************************** -* Software that is described herein is for illustrative purposes only -* which provides customers with programming information regarding the -* products. This software is supplied "AS IS" without any warranties. -* NXP Semiconductors assumes no responsibility or liability for the -* use of the software, conveys no license or title under any patent, -* copyright, or mask work right to the product. NXP Semiconductors -* reserves the right to make changes in the software without -* notification. NXP Semiconductors also make no representation or -* warranty that such application will be suitable for the specified -* use without further testing or modification. -* Permission to use, copy, modify, and distribute this software and its -* documentation is hereby granted, under NXP Semiconductors' -* relevant copyright in the software, without fee, provided that it -* is used in conjunction with NXP Semiconductors microcontrollers. This -* copyright, permission, and disclaimer notice must appear in all copies of -* this code. -**********************************************************************/ - -/* Peripheral group ----------------------------------------------------------- */ -/** @addtogroup CLKPWR - * @{ - */ - -/* Includes ------------------------------------------------------------------- */ -#include "lpc17xx_clkpwr.h" - - -/* Public Functions ----------------------------------------------------------- */ -/** @addtogroup CLKPWR_Public_Functions - * @{ - */ - -/*********************************************************************//** - * @brief Set value of each Peripheral Clock Selection - * @param[in] ClkType Peripheral Clock Selection of each type, - * should be one of the following: - * - CLKPWR_PCLKSEL_WDT : WDT - - CLKPWR_PCLKSEL_TIMER0 : Timer 0 - - CLKPWR_PCLKSEL_TIMER1 : Timer 1 - - CLKPWR_PCLKSEL_UART0 : UART 0 - - CLKPWR_PCLKSEL_UART1 : UART 1 - - CLKPWR_PCLKSEL_PWM1 : PWM 1 - - CLKPWR_PCLKSEL_I2C0 : I2C 0 - - CLKPWR_PCLKSEL_SPI : SPI - - CLKPWR_PCLKSEL_SSP1 : SSP 1 - - CLKPWR_PCLKSEL_DAC : DAC - - CLKPWR_PCLKSEL_ADC : ADC - - CLKPWR_PCLKSEL_CAN1 : CAN 1 - - CLKPWR_PCLKSEL_CAN2 : CAN 2 - - CLKPWR_PCLKSEL_ACF : ACF - - CLKPWR_PCLKSEL_QEI : QEI - - CLKPWR_PCLKSEL_PCB : PCB - - CLKPWR_PCLKSEL_I2C1 : I2C 1 - - CLKPWR_PCLKSEL_SSP0 : SSP 0 - - CLKPWR_PCLKSEL_TIMER2 : Timer 2 - - CLKPWR_PCLKSEL_TIMER3 : Timer 3 - - CLKPWR_PCLKSEL_UART2 : UART 2 - - CLKPWR_PCLKSEL_UART3 : UART 3 - - CLKPWR_PCLKSEL_I2C2 : I2C 2 - - CLKPWR_PCLKSEL_I2S : I2S - - CLKPWR_PCLKSEL_RIT : RIT - - CLKPWR_PCLKSEL_SYSCON : SYSCON - - CLKPWR_PCLKSEL_MC : MC - - * @param[in] DivVal Value of divider, should be: - * - CLKPWR_PCLKSEL_CCLK_DIV_4 : PCLK_peripheral = CCLK/4 - * - CLKPWR_PCLKSEL_CCLK_DIV_1 : PCLK_peripheral = CCLK/1 - * - CLKPWR_PCLKSEL_CCLK_DIV_2 : PCLK_peripheral = CCLK/2 - * - * @return none - **********************************************************************/ -void CLKPWR_SetPCLKDiv (uint32_t ClkType, uint32_t DivVal) -{ - uint32_t bitpos; - - bitpos = (ClkType < 32) ? (ClkType) : (ClkType - 32); - - /* PCLKSEL0 selected */ - if (ClkType < 32) - { - /* Clear two bit at bit position */ - LPC_SC->PCLKSEL0 &= (~(CLKPWR_PCLKSEL_BITMASK(bitpos))); - - /* Set two selected bit */ - LPC_SC->PCLKSEL0 |= (CLKPWR_PCLKSEL_SET(bitpos, DivVal)); - } - /* PCLKSEL1 selected */ - else - { - /* Clear two bit at bit position */ - LPC_SC->PCLKSEL1 &= ~(CLKPWR_PCLKSEL_BITMASK(bitpos)); - - /* Set two selected bit */ - LPC_SC->PCLKSEL1 |= (CLKPWR_PCLKSEL_SET(bitpos, DivVal)); - } -} - - -/*********************************************************************//** - * @brief Get current value of each Peripheral Clock Selection - * @param[in] ClkType Peripheral Clock Selection of each type, - * should be one of the following: - * - CLKPWR_PCLKSEL_WDT : WDT - - CLKPWR_PCLKSEL_TIMER0 : Timer 0 - - CLKPWR_PCLKSEL_TIMER1 : Timer 1 - - CLKPWR_PCLKSEL_UART0 : UART 0 - - CLKPWR_PCLKSEL_UART1 : UART 1 - - CLKPWR_PCLKSEL_PWM1 : PWM 1 - - CLKPWR_PCLKSEL_I2C0 : I2C 0 - - CLKPWR_PCLKSEL_SPI : SPI - - CLKPWR_PCLKSEL_SSP1 : SSP 1 - - CLKPWR_PCLKSEL_DAC : DAC - - CLKPWR_PCLKSEL_ADC : ADC - - CLKPWR_PCLKSEL_CAN1 : CAN 1 - - CLKPWR_PCLKSEL_CAN2 : CAN 2 - - CLKPWR_PCLKSEL_ACF : ACF - - CLKPWR_PCLKSEL_QEI : QEI - - CLKPWR_PCLKSEL_PCB : PCB - - CLKPWR_PCLKSEL_I2C1 : I2C 1 - - CLKPWR_PCLKSEL_SSP0 : SSP 0 - - CLKPWR_PCLKSEL_TIMER2 : Timer 2 - - CLKPWR_PCLKSEL_TIMER3 : Timer 3 - - CLKPWR_PCLKSEL_UART2 : UART 2 - - CLKPWR_PCLKSEL_UART3 : UART 3 - - CLKPWR_PCLKSEL_I2C2 : I2C 2 - - CLKPWR_PCLKSEL_I2S : I2S - - CLKPWR_PCLKSEL_RIT : RIT - - CLKPWR_PCLKSEL_SYSCON : SYSCON - - CLKPWR_PCLKSEL_MC : MC - - * @return Value of Selected Peripheral Clock Selection - **********************************************************************/ -uint32_t CLKPWR_GetPCLKSEL (uint32_t ClkType) -{ - uint32_t bitpos, retval; - - if (ClkType < 32) - { - bitpos = ClkType; - retval = LPC_SC->PCLKSEL0; - } - else - { - bitpos = ClkType - 32; - retval = LPC_SC->PCLKSEL1; - } - - retval = CLKPWR_PCLKSEL_GET(bitpos, retval); - return retval; -} - - - -/*********************************************************************//** - * @brief Get current value of each Peripheral Clock - * @param[in] ClkType Peripheral Clock Selection of each type, - * should be one of the following: - * - CLKPWR_PCLKSEL_WDT : WDT - - CLKPWR_PCLKSEL_TIMER0 : Timer 0 - - CLKPWR_PCLKSEL_TIMER1 : Timer 1 - - CLKPWR_PCLKSEL_UART0 : UART 0 - - CLKPWR_PCLKSEL_UART1 : UART 1 - - CLKPWR_PCLKSEL_PWM1 : PWM 1 - - CLKPWR_PCLKSEL_I2C0 : I2C 0 - - CLKPWR_PCLKSEL_SPI : SPI - - CLKPWR_PCLKSEL_SSP1 : SSP 1 - - CLKPWR_PCLKSEL_DAC : DAC - - CLKPWR_PCLKSEL_ADC : ADC - - CLKPWR_PCLKSEL_CAN1 : CAN 1 - - CLKPWR_PCLKSEL_CAN2 : CAN 2 - - CLKPWR_PCLKSEL_ACF : ACF - - CLKPWR_PCLKSEL_QEI : QEI - - CLKPWR_PCLKSEL_PCB : PCB - - CLKPWR_PCLKSEL_I2C1 : I2C 1 - - CLKPWR_PCLKSEL_SSP0 : SSP 0 - - CLKPWR_PCLKSEL_TIMER2 : Timer 2 - - CLKPWR_PCLKSEL_TIMER3 : Timer 3 - - CLKPWR_PCLKSEL_UART2 : UART 2 - - CLKPWR_PCLKSEL_UART3 : UART 3 - - CLKPWR_PCLKSEL_I2C2 : I2C 2 - - CLKPWR_PCLKSEL_I2S : I2S - - CLKPWR_PCLKSEL_RIT : RIT - - CLKPWR_PCLKSEL_SYSCON : SYSCON - - CLKPWR_PCLKSEL_MC : MC - - * @return Value of Selected Peripheral Clock - **********************************************************************/ -uint32_t CLKPWR_GetPCLK (uint32_t ClkType) -{ - uint32_t retval, div; - - retval = SystemCoreClock; - div = CLKPWR_GetPCLKSEL(ClkType); - - switch (div) - { - case 0: - div = 4; - break; - - case 1: - div = 1; - break; - - case 2: - div = 2; - break; - - case 3: - div = 8; - break; - } - retval /= div; - - return retval; -} - - - -/*********************************************************************//** - * @brief Configure power supply for each peripheral according to NewState - * @param[in] PPType Type of peripheral used to enable power, - * should be one of the following: - * - CLKPWR_PCONP_PCTIM0 : Timer 0 - - CLKPWR_PCONP_PCTIM1 : Timer 1 - - CLKPWR_PCONP_PCUART0 : UART 0 - - CLKPWR_PCONP_PCUART1 : UART 1 - - CLKPWR_PCONP_PCPWM1 : PWM 1 - - CLKPWR_PCONP_PCI2C0 : I2C 0 - - CLKPWR_PCONP_PCSPI : SPI - - CLKPWR_PCONP_PCRTC : RTC - - CLKPWR_PCONP_PCSSP1 : SSP 1 - - CLKPWR_PCONP_PCAD : ADC - - CLKPWR_PCONP_PCAN1 : CAN 1 - - CLKPWR_PCONP_PCAN2 : CAN 2 - - CLKPWR_PCONP_PCGPIO : GPIO - - CLKPWR_PCONP_PCRIT : RIT - - CLKPWR_PCONP_PCMC : MC - - CLKPWR_PCONP_PCQEI : QEI - - CLKPWR_PCONP_PCI2C1 : I2C 1 - - CLKPWR_PCONP_PCSSP0 : SSP 0 - - CLKPWR_PCONP_PCTIM2 : Timer 2 - - CLKPWR_PCONP_PCTIM3 : Timer 3 - - CLKPWR_PCONP_PCUART2 : UART 2 - - CLKPWR_PCONP_PCUART3 : UART 3 - - CLKPWR_PCONP_PCI2C2 : I2C 2 - - CLKPWR_PCONP_PCI2S : I2S - - CLKPWR_PCONP_PCGPDMA : GPDMA - - CLKPWR_PCONP_PCENET : Ethernet - - CLKPWR_PCONP_PCUSB : USB - * - * @param[in] NewState New state of Peripheral Power, should be: - * - ENABLE : Enable power for this peripheral - * - DISABLE : Disable power for this peripheral - * - * @return none - **********************************************************************/ -void CLKPWR_ConfigPPWR (uint32_t PPType, FunctionalState NewState) -{ - if (NewState == ENABLE) - { - LPC_SC->PCONP |= PPType & CLKPWR_PCONP_BITMASK; - } - else if (NewState == DISABLE) - { - LPC_SC->PCONP &= (~PPType) & CLKPWR_PCONP_BITMASK; - } -} - - -/*********************************************************************//** - * @brief Enter Sleep mode with co-operated instruction by the Cortex-M3. - * @param[in] None - * @return None - **********************************************************************/ -void CLKPWR_Sleep(void) -{ - LPC_SC->PCON = 0x00; - /* Sleep Mode*/ - __WFI(); -} - - -/*********************************************************************//** - * @brief Enter Deep Sleep mode with co-operated instruction by the Cortex-M3. - * @param[in] None - * @return None - **********************************************************************/ -void CLKPWR_DeepSleep(void) -{ - /* Deep-Sleep Mode, set SLEEPDEEP bit */ - SCB->SCR = 0x4; - LPC_SC->PCON = 0x00; - /* Deep Sleep Mode*/ - __WFI(); -} - - -/*********************************************************************//** - * @brief Enter Power Down mode with co-operated instruction by the Cortex-M3. - * @param[in] None - * @return None - **********************************************************************/ -void CLKPWR_PowerDown(void) -{ - /* Deep-Sleep Mode, set SLEEPDEEP bit */ - SCB->SCR = 0x4; - LPC_SC->PCON = 0x01; - /* Power Down Mode*/ - __WFI(); -} - - -/*********************************************************************//** - * @brief Enter Deep Power Down mode with co-operated instruction by the Cortex-M3. - * @param[in] None - * @return None - **********************************************************************/ -void CLKPWR_DeepPowerDown(void) -{ - /* Deep-Sleep Mode, set SLEEPDEEP bit */ - SCB->SCR = 0x4; - LPC_SC->PCON = 0x03; - /* Deep Power Down Mode*/ - __WFI(); -} - -/** - * @} - */ - -/** - * @} - */ - -/* --------------------------------- End Of File ------------------------------ */ diff --git a/platforms_startup/armcc/LPC1768/lpc17xx_clkpwr.h b/platforms_startup/armcc/LPC1768/lpc17xx_clkpwr.h deleted file mode 100644 index 4574a6bc1..000000000 --- a/platforms_startup/armcc/LPC1768/lpc17xx_clkpwr.h +++ /dev/null @@ -1,406 +0,0 @@ -/********************************************************************** -* $Id$ lpc17xx_clkpwr.h 2010-05-21 -*//** -* @file lpc17xx_clkpwr.h -* @brief Contains all macro definitions and function prototypes -* support for Clock and Power Control firmware library on LPC17xx -* @version 2.0 -* @date 21. May. 2010 -* @author NXP MCU SW Application Team -* -* Copyright(C) 2010, NXP Semiconductor -* All rights reserved. -* -*********************************************************************** -* Software that is described herein is for illustrative purposes only -* which provides customers with programming information regarding the -* products. This software is supplied "AS IS" without any warranties. -* NXP Semiconductors assumes no responsibility or liability for the -* use of the software, conveys no license or title under any patent, -* copyright, or mask work right to the product. NXP Semiconductors -* reserves the right to make changes in the software without -* notification. NXP Semiconductors also make no representation or -* warranty that such application will be suitable for the specified -* use without further testing or modification. -* Permission to use, copy, modify, and distribute this software and its -* documentation is hereby granted, under NXP Semiconductors' -* relevant copyright in the software, without fee, provided that it -* is used in conjunction with NXP Semiconductors microcontrollers. This -* copyright, permission, and disclaimer notice must appear in all copies of -* this code. -**********************************************************************/ - -/* Peripheral group ----------------------------------------------------------- */ -/** @defgroup CLKPWR CLKPWR (Clock Power) - * @ingroup LPC1700CMSIS_FwLib_Drivers - * @{ - */ - -#ifndef LPC17XX_CLKPWR_H_ -#define LPC17XX_CLKPWR_H_ - -/* Includes ------------------------------------------------------------------- */ -#include "LPC17xx.h" -#include "lpc_types.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Public Macros -------------------------------------------------------------- */ -/** @defgroup CLKPWR_Public_Macros CLKPWR Public Macros - * @{ - */ - -/********************************************************************** - * Peripheral Clock Selection Definitions - **********************************************************************/ -/** Peripheral clock divider bit position for WDT */ -#define CLKPWR_PCLKSEL_WDT ((uint32_t)(0)) -/** Peripheral clock divider bit position for TIMER0 */ -#define CLKPWR_PCLKSEL_TIMER0 ((uint32_t)(2)) -/** Peripheral clock divider bit position for TIMER1 */ -#define CLKPWR_PCLKSEL_TIMER1 ((uint32_t)(4)) -/** Peripheral clock divider bit position for UART0 */ -#define CLKPWR_PCLKSEL_UART0 ((uint32_t)(6)) -/** Peripheral clock divider bit position for UART1 */ -#define CLKPWR_PCLKSEL_UART1 ((uint32_t)(8)) -/** Peripheral clock divider bit position for PWM1 */ -#define CLKPWR_PCLKSEL_PWM1 ((uint32_t)(12)) -/** Peripheral clock divider bit position for I2C0 */ -#define CLKPWR_PCLKSEL_I2C0 ((uint32_t)(14)) -/** Peripheral clock divider bit position for SPI */ -#define CLKPWR_PCLKSEL_SPI ((uint32_t)(16)) -/** Peripheral clock divider bit position for SSP1 */ -#define CLKPWR_PCLKSEL_SSP1 ((uint32_t)(20)) -/** Peripheral clock divider bit position for DAC */ -#define CLKPWR_PCLKSEL_DAC ((uint32_t)(22)) -/** Peripheral clock divider bit position for ADC */ -#define CLKPWR_PCLKSEL_ADC ((uint32_t)(24)) -/** Peripheral clock divider bit position for CAN1 */ -#define CLKPWR_PCLKSEL_CAN1 ((uint32_t)(26)) -/** Peripheral clock divider bit position for CAN2 */ -#define CLKPWR_PCLKSEL_CAN2 ((uint32_t)(28)) -/** Peripheral clock divider bit position for ACF */ -#define CLKPWR_PCLKSEL_ACF ((uint32_t)(30)) -/** Peripheral clock divider bit position for QEI */ -#define CLKPWR_PCLKSEL_QEI ((uint32_t)(32)) -/** Peripheral clock divider bit position for PCB */ -#define CLKPWR_PCLKSEL_PCB ((uint32_t)(36)) -/** Peripheral clock divider bit position for I2C1 */ -#define CLKPWR_PCLKSEL_I2C1 ((uint32_t)(38)) -/** Peripheral clock divider bit position for SSP0 */ -#define CLKPWR_PCLKSEL_SSP0 ((uint32_t)(42)) -/** Peripheral clock divider bit position for TIMER2 */ -#define CLKPWR_PCLKSEL_TIMER2 ((uint32_t)(44)) -/** Peripheral clock divider bit position for TIMER3 */ -#define CLKPWR_PCLKSEL_TIMER3 ((uint32_t)(46)) -/** Peripheral clock divider bit position for UART2 */ -#define CLKPWR_PCLKSEL_UART2 ((uint32_t)(48)) -/** Peripheral clock divider bit position for UART3 */ -#define CLKPWR_PCLKSEL_UART3 ((uint32_t)(50)) -/** Peripheral clock divider bit position for I2C2 */ -#define CLKPWR_PCLKSEL_I2C2 ((uint32_t)(52)) -/** Peripheral clock divider bit position for I2S */ -#define CLKPWR_PCLKSEL_I2S ((uint32_t)(54)) -/** Peripheral clock divider bit position for RIT */ -#define CLKPWR_PCLKSEL_RIT ((uint32_t)(58)) -/** Peripheral clock divider bit position for SYSCON */ -#define CLKPWR_PCLKSEL_SYSCON ((uint32_t)(60)) -/** Peripheral clock divider bit position for MC */ -#define CLKPWR_PCLKSEL_MC ((uint32_t)(62)) - -/** Macro for Peripheral Clock Selection register bit values - * Note: When CCLK_DIV_8, Peripheral’s clock is selected to - * PCLK_xyz = CCLK/8 except for CAN1, CAN2, and CAN filtering - * when ’11’selects PCLK_xyz = CCLK/6 */ -/* Peripheral clock divider is set to 4 from CCLK */ -#define CLKPWR_PCLKSEL_CCLK_DIV_4 ((uint32_t)(0)) -/** Peripheral clock divider is the same with CCLK */ -#define CLKPWR_PCLKSEL_CCLK_DIV_1 ((uint32_t)(1)) -/** Peripheral clock divider is set to 2 from CCLK */ -#define CLKPWR_PCLKSEL_CCLK_DIV_2 ((uint32_t)(2)) - - -/******************************************************************** -* Power Control for Peripherals Definitions -**********************************************************************/ -/** Timer/Counter 0 power/clock control bit */ -#define CLKPWR_PCONP_PCTIM0 ((uint32_t)(1<<1)) -/* Timer/Counter 1 power/clock control bit */ -#define CLKPWR_PCONP_PCTIM1 ((uint32_t)(1<<2)) -/** UART0 power/clock control bit */ -#define CLKPWR_PCONP_PCUART0 ((uint32_t)(1<<3)) -/** UART1 power/clock control bit */ -#define CLKPWR_PCONP_PCUART1 ((uint32_t)(1<<4)) -/** PWM1 power/clock control bit */ -#define CLKPWR_PCONP_PCPWM1 ((uint32_t)(1<<6)) -/** The I2C0 interface power/clock control bit */ -#define CLKPWR_PCONP_PCI2C0 ((uint32_t)(1<<7)) -/** The SPI interface power/clock control bit */ -#define CLKPWR_PCONP_PCSPI ((uint32_t)(1<<8)) -/** The RTC power/clock control bit */ -#define CLKPWR_PCONP_PCRTC ((uint32_t)(1<<9)) -/** The SSP1 interface power/clock control bit */ -#define CLKPWR_PCONP_PCSSP1 ((uint32_t)(1<<10)) -/** A/D converter 0 (ADC0) power/clock control bit */ -#define CLKPWR_PCONP_PCAD ((uint32_t)(1<<12)) -/** CAN Controller 1 power/clock control bit */ -#define CLKPWR_PCONP_PCAN1 ((uint32_t)(1<<13)) -/** CAN Controller 2 power/clock control bit */ -#define CLKPWR_PCONP_PCAN2 ((uint32_t)(1<<14)) -/** GPIO power/clock control bit */ -#define CLKPWR_PCONP_PCGPIO ((uint32_t)(1<<15)) -/** Repetitive Interrupt Timer power/clock control bit */ -#define CLKPWR_PCONP_PCRIT ((uint32_t)(1<<16)) -/** Motor Control PWM */ -#define CLKPWR_PCONP_PCMC ((uint32_t)(1<<17)) -/** Quadrature Encoder Interface power/clock control bit */ -#define CLKPWR_PCONP_PCQEI ((uint32_t)(1<<18)) -/** The I2C1 interface power/clock control bit */ -#define CLKPWR_PCONP_PCI2C1 ((uint32_t)(1<<19)) -/** The SSP0 interface power/clock control bit */ -#define CLKPWR_PCONP_PCSSP0 ((uint32_t)(1<<21)) -/** Timer 2 power/clock control bit */ -#define CLKPWR_PCONP_PCTIM2 ((uint32_t)(1<<22)) -/** Timer 3 power/clock control bit */ -#define CLKPWR_PCONP_PCTIM3 ((uint32_t)(1<<23)) -/** UART 2 power/clock control bit */ -#define CLKPWR_PCONP_PCUART2 ((uint32_t)(1<<24)) -/** UART 3 power/clock control bit */ -#define CLKPWR_PCONP_PCUART3 ((uint32_t)(1<<25)) -/** I2C interface 2 power/clock control bit */ -#define CLKPWR_PCONP_PCI2C2 ((uint32_t)(1<<26)) -/** I2S interface power/clock control bit*/ -#define CLKPWR_PCONP_PCI2S ((uint32_t)(1<<27)) -/** GP DMA function power/clock control bit*/ -#define CLKPWR_PCONP_PCGPDMA ((uint32_t)(1<<29)) -/** Ethernet block power/clock control bit*/ -#define CLKPWR_PCONP_PCENET ((uint32_t)(1<<30)) -/** USB interface power/clock control bit*/ -#define CLKPWR_PCONP_PCUSB ((uint32_t)(1<<31)) - - -/** - * @} - */ -/* Private Macros ------------------------------------------------------------- */ -/** @defgroup CLKPWR_Private_Macros CLKPWR Private Macros - * @{ - */ - -/* --------------------- BIT DEFINITIONS -------------------------------------- */ -/*********************************************************************//** - * Macro defines for Clock Source Select Register - **********************************************************************/ -/** Internal RC oscillator */ -#define CLKPWR_CLKSRCSEL_CLKSRC_IRC ((uint32_t)(0x00)) -/** Main oscillator */ -#define CLKPWR_CLKSRCSEL_CLKSRC_MAINOSC ((uint32_t)(0x01)) -/** RTC oscillator */ -#define CLKPWR_CLKSRCSEL_CLKSRC_RTC ((uint32_t)(0x02)) -/** Clock source selection bit mask */ -#define CLKPWR_CLKSRCSEL_BITMASK ((uint32_t)(0x03)) - -/*********************************************************************//** - * Macro defines for Clock Output Configuration Register - **********************************************************************/ -/* Clock Output Configuration register definition */ -/** Selects the CPU clock as the CLKOUT source */ -#define CLKPWR_CLKOUTCFG_CLKOUTSEL_CPU ((uint32_t)(0x00)) -/** Selects the main oscillator as the CLKOUT source */ -#define CLKPWR_CLKOUTCFG_CLKOUTSEL_MAINOSC ((uint32_t)(0x01)) -/** Selects the Internal RC oscillator as the CLKOUT source */ -#define CLKPWR_CLKOUTCFG_CLKOUTSEL_RC ((uint32_t)(0x02)) -/** Selects the USB clock as the CLKOUT source */ -#define CLKPWR_CLKOUTCFG_CLKOUTSEL_USB ((uint32_t)(0x03)) -/** Selects the RTC oscillator as the CLKOUT source */ -#define CLKPWR_CLKOUTCFG_CLKOUTSEL_RTC ((uint32_t)(0x04)) -/** Integer value to divide the output clock by, minus one */ -#define CLKPWR_CLKOUTCFG_CLKOUTDIV(n) ((uint32_t)((n&0x0F)<<4)) -/** CLKOUT enable control */ -#define CLKPWR_CLKOUTCFG_CLKOUT_EN ((uint32_t)(1<<8)) -/** CLKOUT activity indication */ -#define CLKPWR_CLKOUTCFG_CLKOUT_ACT ((uint32_t)(1<<9)) -/** Clock source selection bit mask */ -#define CLKPWR_CLKOUTCFG_BITMASK ((uint32_t)(0x3FF)) - -/*********************************************************************//** - * Macro defines for PPL0 Control Register - **********************************************************************/ -/** PLL 0 control enable */ -#define CLKPWR_PLL0CON_ENABLE ((uint32_t)(0x01)) -/** PLL 0 control connect */ -#define CLKPWR_PLL0CON_CONNECT ((uint32_t)(0x02)) -/** PLL 0 control bit mask */ -#define CLKPWR_PLL0CON_BITMASK ((uint32_t)(0x03)) - -/*********************************************************************//** - * Macro defines for PPL0 Configuration Register - **********************************************************************/ -/** PLL 0 Configuration MSEL field */ -#define CLKPWR_PLL0CFG_MSEL(n) ((uint32_t)(n&0x7FFF)) -/** PLL 0 Configuration NSEL field */ -#define CLKPWR_PLL0CFG_NSEL(n) ((uint32_t)((n<<16)&0xFF0000)) -/** PLL 0 Configuration bit mask */ -#define CLKPWR_PLL0CFG_BITMASK ((uint32_t)(0xFF7FFF)) - - -/*********************************************************************//** - * Macro defines for PPL0 Status Register - **********************************************************************/ -/** PLL 0 MSEL value */ -#define CLKPWR_PLL0STAT_MSEL(n) ((uint32_t)(n&0x7FFF)) -/** PLL NSEL get value */ -#define CLKPWR_PLL0STAT_NSEL(n) ((uint32_t)((n>>16)&0xFF)) -/** PLL status enable bit */ -#define CLKPWR_PLL0STAT_PLLE ((uint32_t)(1<<24)) -/** PLL status Connect bit */ -#define CLKPWR_PLL0STAT_PLLC ((uint32_t)(1<<25)) -/** PLL status lock */ -#define CLKPWR_PLL0STAT_PLOCK ((uint32_t)(1<<26)) - -/*********************************************************************//** - * Macro defines for PPL0 Feed Register - **********************************************************************/ -/** PLL0 Feed bit mask */ -#define CLKPWR_PLL0FEED_BITMASK ((uint32_t)0xFF) - -/*********************************************************************//** - * Macro defines for PLL1 Control Register - **********************************************************************/ -/** USB PLL control enable */ -#define CLKPWR_PLL1CON_ENABLE ((uint32_t)(0x01)) -/** USB PLL control connect */ -#define CLKPWR_PLL1CON_CONNECT ((uint32_t)(0x02)) -/** USB PLL control bit mask */ -#define CLKPWR_PLL1CON_BITMASK ((uint32_t)(0x03)) - -/*********************************************************************//** - * Macro defines for PLL1 Configuration Register - **********************************************************************/ -/** USB PLL MSEL set value */ -#define CLKPWR_PLL1CFG_MSEL(n) ((uint32_t)(n&0x1F)) -/** USB PLL PSEL set value */ -#define CLKPWR_PLL1CFG_PSEL(n) ((uint32_t)((n&0x03)<<5)) -/** USB PLL configuration bit mask */ -#define CLKPWR_PLL1CFG_BITMASK ((uint32_t)(0x7F)) - -/*********************************************************************//** - * Macro defines for PLL1 Status Register - **********************************************************************/ -/** USB PLL MSEL get value */ -#define CLKPWR_PLL1STAT_MSEL(n) ((uint32_t)(n&0x1F)) -/** USB PLL PSEL get value */ -#define CLKPWR_PLL1STAT_PSEL(n) ((uint32_t)((n>>5)&0x03)) -/** USB PLL status enable bit */ -#define CLKPWR_PLL1STAT_PLLE ((uint32_t)(1<<8)) -/** USB PLL status Connect bit */ -#define CLKPWR_PLL1STAT_PLLC ((uint32_t)(1<<9)) -/** USB PLL status lock */ -#define CLKPWR_PLL1STAT_PLOCK ((uint32_t)(1<<10)) - -/*********************************************************************//** - * Macro defines for PLL1 Feed Register - **********************************************************************/ -/** PLL1 Feed bit mask */ -#define CLKPWR_PLL1FEED_BITMASK ((uint32_t)0xFF) - -/*********************************************************************//** - * Macro defines for CPU Clock Configuration Register - **********************************************************************/ -/** CPU Clock configuration bit mask */ -#define CLKPWR_CCLKCFG_BITMASK ((uint32_t)(0xFF)) - -/*********************************************************************//** - * Macro defines for USB Clock Configuration Register - **********************************************************************/ -/** USB Clock Configuration bit mask */ -#define CLKPWR_USBCLKCFG_BITMASK ((uint32_t)(0x0F)) - -/*********************************************************************//** - * Macro defines for IRC Trim Register - **********************************************************************/ -/** IRC Trim bit mask */ -#define CLKPWR_IRCTRIM_BITMASK ((uint32_t)(0x0F)) - -/*********************************************************************//** - * Macro defines for Peripheral Clock Selection Register 0 and 1 - **********************************************************************/ -/** Peripheral Clock Selection 0 mask bit */ -#define CLKPWR_PCLKSEL0_BITMASK ((uint32_t)(0xFFF3F3FF)) -/** Peripheral Clock Selection 1 mask bit */ -#define CLKPWR_PCLKSEL1_BITMASK ((uint32_t)(0xFCF3F0F3)) -/** Macro to set peripheral clock of each type - * p: position of two bits that hold divider of peripheral clock - * n: value of divider of peripheral clock to be set */ -#define CLKPWR_PCLKSEL_SET(p,n) _SBF(p,n) -/** Macro to mask peripheral clock of each type */ -#define CLKPWR_PCLKSEL_BITMASK(p) _SBF(p,0x03) -/** Macro to get peripheral clock of each type */ -#define CLKPWR_PCLKSEL_GET(p, n) ((uint32_t)((n>>p)&0x03)) - -/*********************************************************************//** - * Macro defines for Power Mode Control Register - **********************************************************************/ -/** Power mode control bit 0 */ -#define CLKPWR_PCON_PM0 ((uint32_t)(1<<0)) -/** Power mode control bit 1 */ -#define CLKPWR_PCON_PM1 ((uint32_t)(1<<1)) -/** Brown-Out Reduced Power Mode */ -#define CLKPWR_PCON_BODPDM ((uint32_t)(1<<2)) -/** Brown-Out Global Disable */ -#define CLKPWR_PCON_BOGD ((uint32_t)(1<<3)) -/** Brown Out Reset Disable */ -#define CLKPWR_PCON_BORD ((uint32_t)(1<<4)) -/** Sleep Mode entry flag */ -#define CLKPWR_PCON_SMFLAG ((uint32_t)(1<<8)) -/** Deep Sleep entry flag */ -#define CLKPWR_PCON_DSFLAG ((uint32_t)(1<<9)) -/** Power-down entry flag */ -#define CLKPWR_PCON_PDFLAG ((uint32_t)(1<<10)) -/** Deep Power-down entry flag */ -#define CLKPWR_PCON_DPDFLAG ((uint32_t)(1<<11)) - -/*********************************************************************//** - * Macro defines for Power Control for Peripheral Register - **********************************************************************/ -/** Power Control for Peripherals bit mask */ -#define CLKPWR_PCONP_BITMASK 0xEFEFF7DE - -/** - * @} - */ - - -/* Public Functions ----------------------------------------------------------- */ -/** @defgroup CLKPWR_Public_Functions CLKPWR Public Functions - * @{ - */ - -void CLKPWR_SetPCLKDiv (uint32_t ClkType, uint32_t DivVal); -uint32_t CLKPWR_GetPCLKSEL (uint32_t ClkType); -uint32_t CLKPWR_GetPCLK (uint32_t ClkType); -void CLKPWR_ConfigPPWR (uint32_t PPType, FunctionalState NewState); -void CLKPWR_Sleep(void); -void CLKPWR_DeepSleep(void); -void CLKPWR_PowerDown(void); -void CLKPWR_DeepPowerDown(void); - -/** - * @} - */ - - -#ifdef __cplusplus -} -#endif - -#endif /* LPC17XX_CLKPWR_H_ */ - -/** - * @} - */ - -/* --------------------------------- End Of File ------------------------------ */ diff --git a/platforms_startup/armcc/LPC1768/lpc17xx_libcfg_default.c b/platforms_startup/armcc/LPC1768/lpc17xx_libcfg_default.c deleted file mode 100644 index 83f5a9e16..000000000 --- a/platforms_startup/armcc/LPC1768/lpc17xx_libcfg_default.c +++ /dev/null @@ -1,76 +0,0 @@ -/********************************************************************** -* $Id$ lpc17xx_libcfg_default.c 2010-05-21 -*//** -* @file lpc17xx_libcfg_default.c -* @brief Library configuration source file (default), used to build -* library without examples -* @version 2.0 -* @date 21. May. 2010 -* @author NXP MCU SW Application Team -* -* Copyright(C) 2010, NXP Semiconductor -* All rights reserved. -* -*********************************************************************** -* Software that is described herein is for illustrative purposes only -* which provides customers with programming information regarding the -* products. This software is supplied "AS IS" without any warranties. -* NXP Semiconductors assumes no responsibility or liability for the -* use of the software, conveys no license or title under any patent, -* copyright, or mask work right to the product. NXP Semiconductors -* reserves the right to make changes in the software without -* notification. NXP Semiconductors also make no representation or -* warranty that such application will be suitable for the specified -* use without further testing or modification. -* Permission to use, copy, modify, and distribute this software and its -* documentation is hereby granted, under NXP Semiconductors' -* relevant copyright in the software, without fee, provided that it -* is used in conjunction with NXP Semiconductors microcontrollers. This -* copyright, permission, and disclaimer notice must appear in all copies of -* this code. -**********************************************************************/ - -/* Library group ----------------------------------------------------------- */ -/** @addtogroup LIBCFG_DEFAULT - * @{ - */ - -/* Includes ------------------------------------------------------------------- */ -#include "lpc17xx_libcfg_default.h" - -/* Public Functions ----------------------------------------------------------- */ -/** @addtogroup LIBCFG_DEFAULT_Public_Functions - * @{ - */ - -#ifndef __BUILD_WITH_EXAMPLE__ - -#ifdef DEBUG -/******************************************************************************* -* @brief Reports the name of the source file and the source line number -* where the CHECK_PARAM error has occurred. -* @param[in] file Pointer to the source file name -* @param[in] line assert_param error line source number -* @return None -*******************************************************************************/ -void check_failed(uint8_t *file, uint32_t line) -{ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\n", file, line) */ - - /* Infinite loop */ - while(1); -} -#endif /* DEBUG */ - -#endif /* __BUILD_WITH_EXAMPLE__ */ - -/** - * @} - */ - -/** - * @} - */ - -/* --------------------------------- End Of File ------------------------------ */ diff --git a/platforms_startup/armcc/LPC1768/lpc17xx_libcfg_default.h b/platforms_startup/armcc/LPC1768/lpc17xx_libcfg_default.h deleted file mode 100644 index b4e3f4d49..000000000 --- a/platforms_startup/armcc/LPC1768/lpc17xx_libcfg_default.h +++ /dev/null @@ -1,182 +0,0 @@ -/********************************************************************** -* $Id$ lpc17xx_libcfg_default.h 2010-05-21 -*//** -* @file lpc17xx_libcfg_default.h -* @brief Default Library configuration header file -* @version 2.0 -* @date 21. May. 2010 -* @author NXP MCU SW Application Team -* -* Copyright(C) 2010, NXP Semiconductor -* All rights reserved. -* -*********************************************************************** -* Software that is described herein is for illustrative purposes only -* which provides customers with programming information regarding the -* products. This software is supplied "AS IS" without any warranties. -* NXP Semiconductors assumes no responsibility or liability for the -* use of the software, conveys no license or title under any patent, -* copyright, or mask work right to the product. NXP Semiconductors -* reserves the right to make changes in the software without -* notification. NXP Semiconductors also make no representation or -* warranty that such application will be suitable for the specified -* use without further testing or modification. -* Permission to use, copy, modify, and distribute this software and its -* documentation is hereby granted, under NXP Semiconductors' -* relevant copyright in the software, without fee, provided that it -* is used in conjunction with NXP Semiconductors microcontrollers. This -* copyright, permission, and disclaimer notice must appear in all copies of -* this code. -**********************************************************************/ - -/* Library Configuration group ----------------------------------------------------------- */ -/** @defgroup LIBCFG_DEFAULT LIBCFG_DEFAULT (Default Library Configuration) - * @ingroup LPC1700CMSIS_FwLib_Drivers - * @{ - */ - -#ifndef LPC17XX_LIBCFG_DEFAULT_H_ -#define LPC17XX_LIBCFG_DEFAULT_H_ - -/* Includes ------------------------------------------------------------------- */ -#include "lpc_types.h" - - -/* Public Macros -------------------------------------------------------------- */ -/** @defgroup LIBCFG_DEFAULT_Public_Macros LIBCFG_DEFAULT Public Macros - * @{ - */ - -/************************** DEBUG MODE DEFINITIONS *********************************/ -/* Un-comment the line below to compile the library in DEBUG mode, this will expanse - the "CHECK_PARAM" macro in the FW library code */ - -#define DEBUG - - -/******************* PERIPHERAL FW LIBRARY CONFIGURATION DEFINITIONS ***********************/ -/* Comment the line below to disable the specific peripheral inclusion */ - -/* DEBUG_FRAMWORK ------------------------------ */ -#define _DBGFWK - -/* GPIO ------------------------------- */ -#define _GPIO - -/* EXTI ------------------------------- */ -#define _EXTI - -/* UART ------------------------------- */ -#define _UART -#define _UART0 -#define _UART1 -#define _UART2 -#define _UART3 - -/* SPI ------------------------------- */ -#define _SPI - -/* SYSTICK --------------------------- */ -#define _SYSTICK - -/* SSP ------------------------------- */ -#define _SSP -#define _SSP0 -#define _SSP1 - - -/* I2C ------------------------------- */ -#define _I2C -#define _I2C0 -#define _I2C1 -#define _I2C2 - -/* TIMER ------------------------------- */ -#define _TIM - -/* WDT ------------------------------- */ -#define _WDT - - -/* GPDMA ------------------------------- */ -#define _GPDMA - - -/* DAC ------------------------------- */ -#define _DAC - -/* DAC ------------------------------- */ -#define _ADC - - -/* PWM ------------------------------- */ -#define _PWM -#define _PWM1 - -/* RTC ------------------------------- */ -#define _RTC - -/* I2S ------------------------------- */ -#define _I2S - -/* USB device ------------------------------- */ -#define _USBDEV -#define _USB_DMA - -/* QEI ------------------------------- */ -#define _QEI - -/* MCPWM ------------------------------- */ -#define _MCPWM - -/* CAN--------------------------------*/ -#define _CAN - -/* RIT ------------------------------- */ -#define _RIT - -/* EMAC ------------------------------ */ -#define _EMAC - -/************************** GLOBAL/PUBLIC MACRO DEFINITIONS *********************************/ - -#ifdef DEBUG -/******************************************************************************* -* @brief The CHECK_PARAM macro is used for function's parameters check. -* It is used only if the library is compiled in DEBUG mode. -* @param[in] expr - If expr is false, it calls check_failed() function -* which reports the name of the source file and the source -* line number of the call that failed. -* - If expr is true, it returns no value. -* @return None -*******************************************************************************/ -#define CHECK_PARAM(expr) ((expr) ? (void)0 : check_failed((uint8_t *)__FILE__, __LINE__)) -#else -#define CHECK_PARAM(expr) -#endif /* DEBUG */ - -/** - * @} - */ - - -/* Public Functions ----------------------------------------------------------- */ -/** @defgroup LIBCFG_DEFAULT_Public_Functions LIBCFG_DEFAULT Public Functions - * @{ - */ - -#ifdef DEBUG -void check_failed(uint8_t *file, uint32_t line); -#endif - -/** - * @} - */ - -#endif /* LPC17XX_LIBCFG_DEFAULT_H_ */ - -/** - * @} - */ - -/* --------------------------------- End Of File ------------------------------ */ diff --git a/platforms_startup/armcc/LPC1768/lpc17xx_pinsel.h b/platforms_startup/armcc/LPC1768/lpc17xx_pinsel.h deleted file mode 100644 index d2ad1f00e..000000000 --- a/platforms_startup/armcc/LPC1768/lpc17xx_pinsel.h +++ /dev/null @@ -1,203 +0,0 @@ -/********************************************************************** -* $Id$ lpc17xx_pinsel.h 2010-05-21 -*//** -* @file lpc17xx_pinsel.h -* @brief Contains all macro definitions and function prototypes -* support for Pin connect block firmware library on LPC17xx -* @version 2.0 -* @date 21. May. 2010 -* @author NXP MCU SW Application Team -* -* Copyright(C) 2010, NXP Semiconductor -* All rights reserved. -* -*********************************************************************** -* Software that is described herein is for illustrative purposes only -* which provides customers with programming information regarding the -* products. This software is supplied "AS IS" without any warranties. -* NXP Semiconductors assumes no responsibility or liability for the -* use of the software, conveys no license or title under any patent, -* copyright, or mask work right to the product. NXP Semiconductors -* reserves the right to make changes in the software without -* notification. NXP Semiconductors also make no representation or -* warranty that such application will be suitable for the specified -* use without further testing or modification. -* Permission to use, copy, modify, and distribute this software and its -* documentation is hereby granted, under NXP Semiconductors' -* relevant copyright in the software, without fee, provided that it -* is used in conjunction with NXP Semiconductors microcontrollers. This -* copyright, permission, and disclaimer notice must appear in all copies of -* this code. -**********************************************************************/ - -/* Peripheral group ----------------------------------------------------------- */ -/** @defgroup PINSEL PINSEL (Pin Selection) - * @ingroup LPC1700CMSIS_FwLib_Drivers - * @{ - */ - -#ifndef LPC17XX_PINSEL_H_ -#define LPC17XX_PINSEL_H_ - -/* Includes ------------------------------------------------------------------- */ -#include "LPC17xx.h" -#include "lpc_types.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Public Macros -------------------------------------------------------------- */ -/** @defgroup PINSEL_Public_Macros PINSEL Public Macros - * @{ - */ - -/*********************************************************************//** - *!< Macros define for PORT Selection - ***********************************************************************/ -#define PINSEL_PORT_0 ((0)) /**< PORT 0*/ -#define PINSEL_PORT_1 ((1)) /**< PORT 1*/ -#define PINSEL_PORT_2 ((2)) /**< PORT 2*/ -#define PINSEL_PORT_3 ((3)) /**< PORT 3*/ -#define PINSEL_PORT_4 ((4)) /**< PORT 4*/ - -/*********************************************************************** - * Macros define for Pin Function selection - **********************************************************************/ -#define PINSEL_FUNC_0 ((0)) /**< default function*/ -#define PINSEL_FUNC_1 ((1)) /**< first alternate function*/ -#define PINSEL_FUNC_2 ((2)) /**< second alternate function*/ -#define PINSEL_FUNC_3 ((3)) /**< third or reserved alternate function*/ - -/*********************************************************************** - * Macros define for Pin Number of Port - **********************************************************************/ -#define PINSEL_PIN_0 ((0)) /**< Pin 0 */ -#define PINSEL_PIN_1 ((1)) /**< Pin 1 */ -#define PINSEL_PIN_2 ((2)) /**< Pin 2 */ -#define PINSEL_PIN_3 ((3)) /**< Pin 3 */ -#define PINSEL_PIN_4 ((4)) /**< Pin 4 */ -#define PINSEL_PIN_5 ((5)) /**< Pin 5 */ -#define PINSEL_PIN_6 ((6)) /**< Pin 6 */ -#define PINSEL_PIN_7 ((7)) /**< Pin 7 */ -#define PINSEL_PIN_8 ((8)) /**< Pin 8 */ -#define PINSEL_PIN_9 ((9)) /**< Pin 9 */ -#define PINSEL_PIN_10 ((10)) /**< Pin 10 */ -#define PINSEL_PIN_11 ((11)) /**< Pin 11 */ -#define PINSEL_PIN_12 ((12)) /**< Pin 12 */ -#define PINSEL_PIN_13 ((13)) /**< Pin 13 */ -#define PINSEL_PIN_14 ((14)) /**< Pin 14 */ -#define PINSEL_PIN_15 ((15)) /**< Pin 15 */ -#define PINSEL_PIN_16 ((16)) /**< Pin 16 */ -#define PINSEL_PIN_17 ((17)) /**< Pin 17 */ -#define PINSEL_PIN_18 ((18)) /**< Pin 18 */ -#define PINSEL_PIN_19 ((19)) /**< Pin 19 */ -#define PINSEL_PIN_20 ((20)) /**< Pin 20 */ -#define PINSEL_PIN_21 ((21)) /**< Pin 21 */ -#define PINSEL_PIN_22 ((22)) /**< Pin 22 */ -#define PINSEL_PIN_23 ((23)) /**< Pin 23 */ -#define PINSEL_PIN_24 ((24)) /**< Pin 24 */ -#define PINSEL_PIN_25 ((25)) /**< Pin 25 */ -#define PINSEL_PIN_26 ((26)) /**< Pin 26 */ -#define PINSEL_PIN_27 ((27)) /**< Pin 27 */ -#define PINSEL_PIN_28 ((28)) /**< Pin 28 */ -#define PINSEL_PIN_29 ((29)) /**< Pin 29 */ -#define PINSEL_PIN_30 ((30)) /**< Pin 30 */ -#define PINSEL_PIN_31 ((31)) /**< Pin 31 */ - -/*********************************************************************** - * Macros define for Pin mode - **********************************************************************/ -#define PINSEL_PINMODE_PULLUP ((0)) /**< Internal pull-up resistor*/ -#define PINSEL_PINMODE_TRISTATE ((2)) /**< Tri-state */ -#define PINSEL_PINMODE_PULLDOWN ((3)) /**< Internal pull-down resistor */ - -/*********************************************************************** - * Macros define for Pin mode (normal/open drain) - **********************************************************************/ -#define PINSEL_PINMODE_NORMAL ((0)) /**< Pin is in the normal (not open drain) mode.*/ -#define PINSEL_PINMODE_OPENDRAIN ((1)) /**< Pin is in the open drain mode */ - -/*********************************************************************** - * Macros define for I2C mode - ***********************************************************************/ -#define PINSEL_I2C_Normal_Mode ((0)) /**< The standard drive mode */ -#define PINSEL_I2C_Fast_Mode ((1)) /**< Fast Mode Plus drive mode */ - -/** - * @} - */ - -/* Private Macros ------------------------------------------------------------- */ -/** @defgroup PINSEL_Private_Macros PINSEL Private Macros - * @{ - */ - -/* Pin selection define */ -/* I2C Pin Configuration register bit description */ -#define PINSEL_I2CPADCFG_SDADRV0 _BIT(0) /**< Drive mode control for the SDA0 pin, P0.27 */ -#define PINSEL_I2CPADCFG_SDAI2C0 _BIT(1) /**< I2C mode control for the SDA0 pin, P0.27 */ -#define PINSEL_I2CPADCFG_SCLDRV0 _BIT(2) /**< Drive mode control for the SCL0 pin, P0.28 */ -#define PINSEL_I2CPADCFG_SCLI2C0 _BIT(3) /**< I2C mode control for the SCL0 pin, P0.28 */ - -/** - * @} - */ - - -/* Public Types --------------------------------------------------------------- */ -/** @defgroup PINSEL_Public_Types PINSEL Public Types - * @{ - */ - -/** @brief Pin configuration structure */ -typedef struct -{ - uint8_t Portnum; /**< Port Number, should be PINSEL_PORT_x, - where x should be in range from 0 to 4 */ - uint8_t Pinnum; /**< Pin Number, should be PINSEL_PIN_x, - where x should be in range from 0 to 31 */ - uint8_t Funcnum; /**< Function Number, should be PINSEL_FUNC_x, - where x should be in range from 0 to 3 */ - uint8_t Pinmode; /**< Pin Mode, should be: - - PINSEL_PINMODE_PULLUP: Internal pull-up resistor - - PINSEL_PINMODE_TRISTATE: Tri-state - - PINSEL_PINMODE_PULLDOWN: Internal pull-down resistor */ - uint8_t OpenDrain; /**< OpenDrain mode, should be: - - PINSEL_PINMODE_NORMAL: Pin is in the normal (not open drain) mode - - PINSEL_PINMODE_OPENDRAIN: Pin is in the open drain mode */ -} PINSEL_CFG_Type; - -/** - * @} - */ - - -/* Public Functions ----------------------------------------------------------- */ -/** @defgroup PINSEL_Public_Functions PINSEL Public Functions - * @{ - */ - -void PINSEL_ConfigPin(PINSEL_CFG_Type *PinCfg); -void PINSEL_ConfigTraceFunc (FunctionalState NewState); -void PINSEL_SetI2C0Pins(uint8_t i2cPinMode, FunctionalState filterSlewRateEnable); - - -/** - * @} - */ - - -#ifdef __cplusplus -} -#endif - -#endif /* LPC17XX_PINSEL_H_ */ - -/** - * @} - */ - -/* --------------------------------- End Of File ------------------------------ */ - diff --git a/platforms_startup/armcc/LPC1768/lpc17xx_timer.c b/platforms_startup/armcc/LPC1768/lpc17xx_timer.c deleted file mode 100644 index 17184aaf5..000000000 --- a/platforms_startup/armcc/LPC1768/lpc17xx_timer.c +++ /dev/null @@ -1,609 +0,0 @@ -/********************************************************************** -* $Id$ lpc17xx_timer.c 2011-03-10 -*//** -* @file lpc17xx_timer.c -* @brief Contains all functions support for Timer firmware library -* on LPC17xx -* @version 3.1 -* @date 10. March. 2011 -* @author NXP MCU SW Application Team -* -* Copyright(C) 2011, NXP Semiconductor -* All rights reserved. -* -*********************************************************************** -* Software that is described herein is for illustrative purposes only -* which provides customers with programming information regarding the -* products. This software is supplied "AS IS" without any warranties. -* NXP Semiconductors assumes no responsibility or liability for the -* use of the software, conveys no license or title under any patent, -* copyright, or mask work right to the product. NXP Semiconductors -* reserves the right to make changes in the software without -* notification. NXP Semiconductors also make no representation or -* warranty that such application will be suitable for the specified -* use without further testing or modification. -* Permission to use, copy, modify, and distribute this software and its -* documentation is hereby granted, under NXP Semiconductors' -* relevant copyright in the software, without fee, provided that it -* is used in conjunction with NXP Semiconductors microcontrollers. This -* copyright, permission, and disclaimer notice must appear in all copies of -* this code. -**********************************************************************/ - -/* Peripheral group ----------------------------------------------------------- */ -/** @addtogroup TIM - * @{ - */ - -/* Includes ------------------------------------------------------------------- */ -#include "lpc17xx_timer.h" -#include "lpc17xx_clkpwr.h" -#include "lpc17xx_pinsel.h" - -/* If this source file built with example, the LPC17xx FW library configuration - * file in each example directory ("lpc17xx_libcfg.h") must be included, - * otherwise the default FW library configuration file must be included instead - */ -#ifdef __BUILD_WITH_EXAMPLE__ -#include "lpc17xx_libcfg.h" -#else -#include "lpc17xx_libcfg_default.h" -#endif /* __BUILD_WITH_EXAMPLE__ */ - -#ifdef _TIM - -/* Private Functions ---------------------------------------------------------- */ - -static uint32_t getPClock (uint32_t timernum); -static uint32_t converUSecToVal (uint32_t timernum, uint32_t usec); -static uint32_t converPtrToTimeNum (LPC_TIM_TypeDef *TIMx); - - -/*********************************************************************//** - * @brief Get peripheral clock of each timer controller - * @param[in] timernum Timer number - * @return Peripheral clock of timer - **********************************************************************/ -static uint32_t getPClock (uint32_t timernum) -{ - uint32_t clkdlycnt; - switch (timernum) - { - case 0: - clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER0); - break; - - case 1: - clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER1); - break; - - case 2: - clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER2); - break; - - case 3: - clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER3); - break; - } - return clkdlycnt; -} - - -/*********************************************************************//** - * @brief Convert a time to a timer count value - * @param[in] timernum Timer number - * @param[in] usec Time in microseconds - * @return The number of required clock ticks to give the time delay - **********************************************************************/ -uint32_t converUSecToVal (uint32_t timernum, uint32_t usec) -{ - uint64_t clkdlycnt; - - // Get Pclock of timer - clkdlycnt = (uint64_t) getPClock(timernum); - - clkdlycnt = (clkdlycnt * usec) / 1000000; - return (uint32_t) clkdlycnt; -} - - -/*********************************************************************//** - * @brief Convert a timer register pointer to a timer number - * @param[in] TIMx Pointer to LPC_TIM_TypeDef, should be: - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * @return The timer number (0 to 3) or 0xFFFF FFFF if register pointer is bad - **********************************************************************/ -uint32_t converPtrToTimeNum (LPC_TIM_TypeDef *TIMx) -{ - uint32_t tnum = 0xFFFFFFFF; - - if (TIMx == LPC_TIM0) - { - tnum = 0; - } - else if (TIMx == LPC_TIM1) - { - tnum = 1; - } - else if (TIMx == LPC_TIM2) - { - tnum = 2; - } - else if (TIMx == LPC_TIM3) - { - tnum = 3; - } - - return tnum; -} - -/* End of Private Functions ---------------------------------------------------- */ - - -/* Public Functions ----------------------------------------------------------- */ -/** @addtogroup TIM_Public_Functions - * @{ - */ - -/*********************************************************************//** - * @brief Get Interrupt Status - * @param[in] TIMx Timer selection, should be: - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * @param[in] IntFlag: interrupt type, should be: - * - TIM_MR0_INT: Interrupt for Match channel 0 - * - TIM_MR1_INT: Interrupt for Match channel 1 - * - TIM_MR2_INT: Interrupt for Match channel 2 - * - TIM_MR3_INT: Interrupt for Match channel 3 - * - TIM_CR0_INT: Interrupt for Capture channel 0 - * - TIM_CR1_INT: Interrupt for Capture channel 1 - * @return FlagStatus - * - SET : interrupt - * - RESET : no interrupt - **********************************************************************/ -FlagStatus TIM_GetIntStatus(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag) -{ - uint8_t temp; - CHECK_PARAM(PARAM_TIMx(TIMx)); - CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag)); - temp = (TIMx->IR)& TIM_IR_CLR(IntFlag); - if (temp) - return SET; - - return RESET; - -} -/*********************************************************************//** - * @brief Get Capture Interrupt Status - * @param[in] TIMx Timer selection, should be: - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * @param[in] IntFlag: interrupt type, should be: - * - TIM_MR0_INT: Interrupt for Match channel 0 - * - TIM_MR1_INT: Interrupt for Match channel 1 - * - TIM_MR2_INT: Interrupt for Match channel 2 - * - TIM_MR3_INT: Interrupt for Match channel 3 - * - TIM_CR0_INT: Interrupt for Capture channel 0 - * - TIM_CR1_INT: Interrupt for Capture channel 1 - * @return FlagStatus - * - SET : interrupt - * - RESET : no interrupt - **********************************************************************/ -FlagStatus TIM_GetIntCaptureStatus(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag) -{ - uint8_t temp; - CHECK_PARAM(PARAM_TIMx(TIMx)); - CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag)); - temp = (TIMx->IR) & (1<<(4+IntFlag)); - if(temp) - return SET; - return RESET; -} -/*********************************************************************//** - * @brief Clear Interrupt pending - * @param[in] TIMx Timer selection, should be: - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * @param[in] IntFlag: interrupt type, should be: - * - TIM_MR0_INT: Interrupt for Match channel 0 - * - TIM_MR1_INT: Interrupt for Match channel 1 - * - TIM_MR2_INT: Interrupt for Match channel 2 - * - TIM_MR3_INT: Interrupt for Match channel 3 - * - TIM_CR0_INT: Interrupt for Capture channel 0 - * - TIM_CR1_INT: Interrupt for Capture channel 1 - * @return None - **********************************************************************/ -void TIM_ClearIntPending(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag) -{ - CHECK_PARAM(PARAM_TIMx(TIMx)); - CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag)); - TIMx->IR = TIM_IR_CLR(IntFlag); -} - -/*********************************************************************//** - * @brief Clear Capture Interrupt pending - * @param[in] TIMx Timer selection, should be - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * @param[in] IntFlag interrupt type, should be: - * - TIM_MR0_INT: Interrupt for Match channel 0 - * - TIM_MR1_INT: Interrupt for Match channel 1 - * - TIM_MR2_INT: Interrupt for Match channel 2 - * - TIM_MR3_INT: Interrupt for Match channel 3 - * - TIM_CR0_INT: Interrupt for Capture channel 0 - * - TIM_CR1_INT: Interrupt for Capture channel 1 - * @return None - **********************************************************************/ -void TIM_ClearIntCapturePending(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag) -{ - CHECK_PARAM(PARAM_TIMx(TIMx)); - CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag)); - TIMx->IR = (1<<(4+IntFlag)); -} - -/*********************************************************************//** - * @brief Configuration for Timer at initial time - * @param[in] TimerCounterMode timer counter mode, should be: - * - TIM_TIMER_MODE: Timer mode - * - TIM_COUNTER_RISING_MODE: Counter rising mode - * - TIM_COUNTER_FALLING_MODE: Counter falling mode - * - TIM_COUNTER_ANY_MODE:Counter on both edges - * @param[in] TIM_ConfigStruct pointer to TIM_TIMERCFG_Type or - * TIM_COUNTERCFG_Type - * @return None - **********************************************************************/ -void TIM_ConfigStructInit(TIM_MODE_OPT TimerCounterMode, void *TIM_ConfigStruct) -{ - if (TimerCounterMode == TIM_TIMER_MODE ) - { - TIM_TIMERCFG_Type * pTimeCfg = (TIM_TIMERCFG_Type *)TIM_ConfigStruct; - pTimeCfg->PrescaleOption = TIM_PRESCALE_USVAL; - pTimeCfg->PrescaleValue = 1; - } - else - { - TIM_COUNTERCFG_Type * pCounterCfg = (TIM_COUNTERCFG_Type *)TIM_ConfigStruct; - pCounterCfg->CountInputSelect = TIM_COUNTER_INCAP0; - } -} - -/*********************************************************************//** - * @brief Initial Timer/Counter device - * Set Clock frequency for Timer - * Set initial configuration for Timer - * @param[in] TIMx Timer selection, should be: - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * @param[in] TimerCounterMode Timer counter mode, should be: - * - TIM_TIMER_MODE: Timer mode - * - TIM_COUNTER_RISING_MODE: Counter rising mode - * - TIM_COUNTER_FALLING_MODE: Counter falling mode - * - TIM_COUNTER_ANY_MODE:Counter on both edges - * @param[in] TIM_ConfigStruct pointer to TIM_TIMERCFG_Type - * that contains the configuration information for the - * specified Timer peripheral. - * @return None - **********************************************************************/ -void TIM_Init(LPC_TIM_TypeDef *TIMx, TIM_MODE_OPT TimerCounterMode, void *TIM_ConfigStruct) -{ - TIM_TIMERCFG_Type *pTimeCfg; - TIM_COUNTERCFG_Type *pCounterCfg; - - CHECK_PARAM(PARAM_TIMx(TIMx)); - CHECK_PARAM(PARAM_TIM_MODE_OPT(TimerCounterMode)); - - //set power - - if (TIMx== LPC_TIM0) - { - CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM0, ENABLE); - //PCLK_Timer0 = CCLK/4 - CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER0, CLKPWR_PCLKSEL_CCLK_DIV_4); - } - else if (TIMx== LPC_TIM1) - { - CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM1, ENABLE); - //PCLK_Timer1 = CCLK/4 - CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER1, CLKPWR_PCLKSEL_CCLK_DIV_4); - - } - - else if (TIMx== LPC_TIM2) - { - CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM2, ENABLE); - //PCLK_Timer2= CCLK/4 - CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER2, CLKPWR_PCLKSEL_CCLK_DIV_4); - } - else if (TIMx== LPC_TIM3) - { - CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM3, ENABLE); - //PCLK_Timer3= CCLK/4 - CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER3, CLKPWR_PCLKSEL_CCLK_DIV_4); - - } - - TIMx->CCR &= ~TIM_CTCR_MODE_MASK; - TIMx->CCR |= TIM_TIMER_MODE; - - TIMx->TC =0; - TIMx->PC =0; - TIMx->PR =0; - TIMx->TCR |= (1<<1); //Reset Counter - TIMx->TCR &= ~(1<<1); //release reset - if (TimerCounterMode == TIM_TIMER_MODE ) - { - pTimeCfg = (TIM_TIMERCFG_Type *)TIM_ConfigStruct; - if (pTimeCfg->PrescaleOption == TIM_PRESCALE_TICKVAL) - { - TIMx->PR = pTimeCfg->PrescaleValue -1 ; - } - else - { - TIMx->PR = converUSecToVal (converPtrToTimeNum(TIMx),pTimeCfg->PrescaleValue)-1; - } - } - else - { - - pCounterCfg = (TIM_COUNTERCFG_Type *)TIM_ConfigStruct; - TIMx->CCR &= ~TIM_CTCR_INPUT_MASK; - if (pCounterCfg->CountInputSelect == TIM_COUNTER_INCAP1) - TIMx->CCR |= _BIT(2); - } - - // Clear interrupt pending - TIMx->IR = 0xFFFFFFFF; - -} - -/*********************************************************************//** - * @brief Close Timer/Counter device - * @param[in] TIMx Pointer to timer device, should be: - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * @return None - **********************************************************************/ -void TIM_DeInit (LPC_TIM_TypeDef *TIMx) -{ - CHECK_PARAM(PARAM_TIMx(TIMx)); - // Disable timer/counter - TIMx->TCR = 0x00; - - // Disable power - if (TIMx== LPC_TIM0) - CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM0, DISABLE); - - else if (TIMx== LPC_TIM1) - CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM1, DISABLE); - - else if (TIMx== LPC_TIM2) - CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM2, DISABLE); - - else if (TIMx== LPC_TIM3) - CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM2, DISABLE); - -} - -/*********************************************************************//** - * @brief Start/Stop Timer/Counter device - * @param[in] TIMx Pointer to timer device, should be: - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * @param[in] NewState - * - ENABLE : set timer enable - * - DISABLE : disable timer - * @return None - **********************************************************************/ -void TIM_Cmd(LPC_TIM_TypeDef *TIMx, FunctionalState NewState) -{ - CHECK_PARAM(PARAM_TIMx(TIMx)); - if (NewState == ENABLE) - { - TIMx->TCR |= TIM_ENABLE; - } - else - { - TIMx->TCR &= ~TIM_ENABLE; - } -} - -/*********************************************************************//** - * @brief Reset Timer/Counter device, - * Make TC and PC are synchronously reset on the next - * positive edge of PCLK - * @param[in] TIMx Pointer to timer device, should be: - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * @return None - **********************************************************************/ -void TIM_ResetCounter(LPC_TIM_TypeDef *TIMx) -{ - CHECK_PARAM(PARAM_TIMx(TIMx)); - TIMx->TCR |= TIM_RESET; - TIMx->TCR &= ~TIM_RESET; -} - -/*********************************************************************//** - * @brief Configuration for Match register - * @param[in] TIMx Pointer to timer device, should be: - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * @param[in] TIM_MatchConfigStruct Pointer to TIM_MATCHCFG_Type - * - MatchChannel : choose channel 0 or 1 - * - IntOnMatch : if SET, interrupt will be generated when MRxx match - * the value in TC - * - StopOnMatch : if SET, TC and PC will be stopped whenM Rxx match - * the value in TC - * - ResetOnMatch : if SET, Reset on MR0 when MRxx match - * the value in TC - * -ExtMatchOutputType: Select output for external match - * + 0: Do nothing for external output pin if match - * + 1: Force external output pin to low if match - * + 2: Force external output pin to high if match - * + 3: Toggle external output pin if match - * MatchValue: Set the value to be compared with TC value - * @return None - **********************************************************************/ -void TIM_ConfigMatch(LPC_TIM_TypeDef *TIMx, TIM_MATCHCFG_Type *TIM_MatchConfigStruct) -{ - - CHECK_PARAM(PARAM_TIMx(TIMx)); - CHECK_PARAM(PARAM_TIM_EXTMATCH_OPT(TIM_MatchConfigStruct->ExtMatchOutputType)); - - switch(TIM_MatchConfigStruct->MatchChannel) - { - case 0: - TIMx->MR0 = TIM_MatchConfigStruct->MatchValue; - break; - case 1: - TIMx->MR1 = TIM_MatchConfigStruct->MatchValue; - break; - case 2: - TIMx->MR2 = TIM_MatchConfigStruct->MatchValue; - break; - case 3: - TIMx->MR3 = TIM_MatchConfigStruct->MatchValue; - break; - default: - //Error match value - //Error loop - while(1); - } - //interrupt on MRn - TIMx->MCR &=~TIM_MCR_CHANNEL_MASKBIT(TIM_MatchConfigStruct->MatchChannel); - - if (TIM_MatchConfigStruct->IntOnMatch) - TIMx->MCR |= TIM_INT_ON_MATCH(TIM_MatchConfigStruct->MatchChannel); - - //reset on MRn - if (TIM_MatchConfigStruct->ResetOnMatch) - TIMx->MCR |= TIM_RESET_ON_MATCH(TIM_MatchConfigStruct->MatchChannel); - - //stop on MRn - if (TIM_MatchConfigStruct->StopOnMatch) - TIMx->MCR |= TIM_STOP_ON_MATCH(TIM_MatchConfigStruct->MatchChannel); - - // match output type - - TIMx->EMR &= ~TIM_EM_MASK(TIM_MatchConfigStruct->MatchChannel); - TIMx->EMR |= TIM_EM_SET(TIM_MatchConfigStruct->MatchChannel,TIM_MatchConfigStruct->ExtMatchOutputType); -} -/*********************************************************************//** - * @brief Update Match value - * @param[in] TIMx Pointer to timer device, should be: - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * @param[in] MatchChannel Match channel, should be: 0..3 - * @param[in] MatchValue updated match value - * @return None - **********************************************************************/ -void TIM_UpdateMatchValue(LPC_TIM_TypeDef *TIMx,uint8_t MatchChannel, uint32_t MatchValue) -{ - CHECK_PARAM(PARAM_TIMx(TIMx)); - switch(MatchChannel) - { - case 0: - TIMx->MR0 = MatchValue; - break; - case 1: - TIMx->MR1 = MatchValue; - break; - case 2: - TIMx->MR2 = MatchValue; - break; - case 3: - TIMx->MR3 = MatchValue; - break; - default: - //Error Loop - while(1); - } - -} -/*********************************************************************//** - * @brief Configuration for Capture register - * @param[in] TIMx Pointer to timer device, should be: - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * - CaptureChannel: set the channel to capture data - * - RisingEdge : if SET, Capture at rising edge - * - FallingEdge : if SET, Capture at falling edge - * - IntOnCaption : if SET, Capture generate interrupt - * @param[in] TIM_CaptureConfigStruct Pointer to TIM_CAPTURECFG_Type - * @return None - **********************************************************************/ -void TIM_ConfigCapture(LPC_TIM_TypeDef *TIMx, TIM_CAPTURECFG_Type *TIM_CaptureConfigStruct) -{ - - CHECK_PARAM(PARAM_TIMx(TIMx)); - TIMx->CCR &= ~TIM_CCR_CHANNEL_MASKBIT(TIM_CaptureConfigStruct->CaptureChannel); - - if (TIM_CaptureConfigStruct->RisingEdge) - TIMx->CCR |= TIM_CAP_RISING(TIM_CaptureConfigStruct->CaptureChannel); - - if (TIM_CaptureConfigStruct->FallingEdge) - TIMx->CCR |= TIM_CAP_FALLING(TIM_CaptureConfigStruct->CaptureChannel); - - if (TIM_CaptureConfigStruct->IntOnCaption) - TIMx->CCR |= TIM_INT_ON_CAP(TIM_CaptureConfigStruct->CaptureChannel); -} - -/*********************************************************************//** - * @brief Read value of capture register in timer/counter device - * @param[in] TIMx Pointer to timer/counter device, should be: - * - LPC_TIM0: TIMER0 peripheral - * - LPC_TIM1: TIMER1 peripheral - * - LPC_TIM2: TIMER2 peripheral - * - LPC_TIM3: TIMER3 peripheral - * @param[in] CaptureChannel: capture channel number, should be: - * - TIM_COUNTER_INCAP0: CAPn.0 input pin for TIMERn - * - TIM_COUNTER_INCAP1: CAPn.1 input pin for TIMERn - * @return Value of capture register - **********************************************************************/ -uint32_t TIM_GetCaptureValue(LPC_TIM_TypeDef *TIMx, TIM_COUNTER_INPUT_OPT CaptureChannel) -{ - CHECK_PARAM(PARAM_TIMx(TIMx)); - CHECK_PARAM(PARAM_TIM_COUNTER_INPUT_OPT(CaptureChannel)); - - if(CaptureChannel==0) - return TIMx->CR0; - else - return TIMx->CR1; -} - -/** - * @} - */ - -#endif /* _TIMER */ - -/** - * @} - */ - -/* --------------------------------- End Of File ------------------------------ */ diff --git a/platforms_startup/armcc/LPC1768/lpc17xx_timer.h b/platforms_startup/armcc/LPC1768/lpc17xx_timer.h deleted file mode 100644 index 314610bc4..000000000 --- a/platforms_startup/armcc/LPC1768/lpc17xx_timer.h +++ /dev/null @@ -1,348 +0,0 @@ -/********************************************************************** -* $Id$ lpc17xx_timer.h 2010-05-21 -*//** -* @file lpc17xx_timer.h -* @brief Contains all macro definitions and function prototypes -* support for Timer firmware library on LPC17xx -* @version 2.0 -* @date 21. May. 2010 -* @author NXP MCU SW Application Team -* -* Copyright(C) 2010, NXP Semiconductor -* All rights reserved. -* -*********************************************************************** -* Software that is described herein is for illustrative purposes only -* which provides customers with programming information regarding the -* products. This software is supplied "AS IS" without any warranties. -* NXP Semiconductors assumes no responsibility or liability for the -* use of the software, conveys no license or title under any patent, -* copyright, or mask work right to the product. NXP Semiconductors -* reserves the right to make changes in the software without -* notification. NXP Semiconductors also make no representation or -* warranty that such application will be suitable for the specified -* use without further testing or modification. -* Permission to use, copy, modify, and distribute this software and its -* documentation is hereby granted, under NXP Semiconductors' -* relevant copyright in the software, without fee, provided that it -* is used in conjunction with NXP Semiconductors microcontrollers. This -* copyright, permission, and disclaimer notice must appear in all copies of -* this code. -**********************************************************************/ - -/* Peripheral group ----------------------------------------------------------- */ -/** @defgroup TIM TIM (Timer) - * @ingroup LPC1700CMSIS_FwLib_Drivers - * @{ - */ - -#ifndef __LPC17XX_TIMER_H_ -#define __LPC17XX_TIMER_H_ - -/* Includes ------------------------------------------------------------------- */ -#include "LPC17xx.h" -#include "lpc_types.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Private Macros ------------------------------------------------------------- */ -/** @defgroup TIM_Private_Macros TIM Private Macros - * @{ - */ - -/* --------------------- BIT DEFINITIONS -------------------------------------- */ -/********************************************************************** -** Interrupt information -**********************************************************************/ -/** Macro to clean interrupt pending */ -#define TIM_IR_CLR(n) _BIT(n) - -/********************************************************************** -** Timer interrupt register definitions -**********************************************************************/ -/** Macro for getting a timer match interrupt bit */ -#define TIM_MATCH_INT(n) (_BIT(n & 0x0F)) -/** Macro for getting a capture event interrupt bit */ -#define TIM_CAP_INT(n) (_BIT(((n & 0x0F) + 4))) - -/********************************************************************** -* Timer control register definitions -**********************************************************************/ -/** Timer/counter enable bit */ -#define TIM_ENABLE ((uint32_t)(1<<0)) -/** Timer/counter reset bit */ -#define TIM_RESET ((uint32_t)(1<<1)) -/** Timer control bit mask */ -#define TIM_TCR_MASKBIT ((uint32_t)(3)) - -/********************************************************************** -* Timer match control register definitions -**********************************************************************/ -/** Bit location for interrupt on MRx match, n = 0 to 3 */ -#define TIM_INT_ON_MATCH(n) (_BIT((n * 3))) -/** Bit location for reset on MRx match, n = 0 to 3 */ -#define TIM_RESET_ON_MATCH(n) (_BIT(((n * 3) + 1))) -/** Bit location for stop on MRx match, n = 0 to 3 */ -#define TIM_STOP_ON_MATCH(n) (_BIT(((n * 3) + 2))) -/** Timer Match control bit mask */ -#define TIM_MCR_MASKBIT ((uint32_t)(0x0FFF)) -/** Timer Match control bit mask for specific channel*/ -#define TIM_MCR_CHANNEL_MASKBIT(n) ((uint32_t)(7<<(n*3))) - -/********************************************************************** -* Timer capture control register definitions -**********************************************************************/ -/** Bit location for CAP.n on CRx rising edge, n = 0 to 3 */ -#define TIM_CAP_RISING(n) (_BIT((n * 3))) -/** Bit location for CAP.n on CRx falling edge, n = 0 to 3 */ -#define TIM_CAP_FALLING(n) (_BIT(((n * 3) + 1))) -/** Bit location for CAP.n on CRx interrupt enable, n = 0 to 3 */ -#define TIM_INT_ON_CAP(n) (_BIT(((n * 3) + 2))) -/** Mask bit for rising and falling edge bit */ -#define TIM_EDGE_MASK(n) (_SBF((n * 3), 0x03)) -/** Timer capture control bit mask */ -#define TIM_CCR_MASKBIT ((uint32_t)(0x3F)) -/** Timer Capture control bit mask for specific channel*/ -#define TIM_CCR_CHANNEL_MASKBIT(n) ((uint32_t)(7<<(n*3))) - -/********************************************************************** -* Timer external match register definitions -**********************************************************************/ -/** Bit location for output state change of MAT.n when external match - happens, n = 0 to 3 */ -#define TIM_EM(n) _BIT(n) -/** Output state change of MAT.n when external match happens: no change */ -#define TIM_EM_NOTHING ((uint8_t)(0x0)) -/** Output state change of MAT.n when external match happens: low */ -#define TIM_EM_LOW ((uint8_t)(0x1)) -/** Output state change of MAT.n when external match happens: high */ -#define TIM_EM_HIGH ((uint8_t)(0x2)) -/** Output state change of MAT.n when external match happens: toggle */ -#define TIM_EM_TOGGLE ((uint8_t)(0x3)) -/** Macro for setting for the MAT.n change state bits */ -#define TIM_EM_SET(n,s) (_SBF(((n << 1) + 4), (s & 0x03))) -/** Mask for the MAT.n change state bits */ -#define TIM_EM_MASK(n) (_SBF(((n << 1) + 4), 0x03)) -/** Timer external match bit mask */ -#define TIM_EMR_MASKBIT 0x0FFF - -/********************************************************************** -* Timer Count Control Register definitions -**********************************************************************/ -/** Mask to get the Counter/timer mode bits */ -#define TIM_CTCR_MODE_MASK 0x3 -/** Mask to get the count input select bits */ -#define TIM_CTCR_INPUT_MASK 0xC -/** Timer Count control bit mask */ -#define TIM_CTCR_MASKBIT 0xF -#define TIM_COUNTER_MODE ((uint8_t)(1)) - - -/* ---------------- CHECK PARAMETER DEFINITIONS ---------------------------- */ -/** Macro to determine if it is valid TIMER peripheral */ -#define PARAM_TIMx(n) ((((uint32_t *)n)==((uint32_t *)LPC_TIM0)) || (((uint32_t *)n)==((uint32_t *)LPC_TIM1)) \ -|| (((uint32_t *)n)==((uint32_t *)LPC_TIM2)) || (((uint32_t *)n)==((uint32_t *)LPC_TIM3))) - -/* Macro check interrupt type */ -#define PARAM_TIM_INT_TYPE(TYPE) ((TYPE ==TIM_MR0_INT)||(TYPE ==TIM_MR1_INT)\ -||(TYPE ==TIM_MR2_INT)||(TYPE ==TIM_MR3_INT)\ -||(TYPE ==TIM_CR0_INT)||(TYPE ==TIM_CR1_INT)) - -/* Macro check TIMER mode */ -#define PARAM_TIM_MODE_OPT(MODE) ((MODE == TIM_TIMER_MODE)||(MODE == TIM_COUNTER_RISING_MODE)\ -|| (MODE == TIM_COUNTER_RISING_MODE)||(MODE == TIM_COUNTER_RISING_MODE)) - -/* Macro check TIMER prescale value */ -#define PARAM_TIM_PRESCALE_OPT(OPT) ((OPT == TIM_PRESCALE_TICKVAL)||(OPT == TIM_PRESCALE_USVAL)) - -/* Macro check TIMER counter intput mode */ -#define PARAM_TIM_COUNTER_INPUT_OPT(OPT) ((OPT == TIM_COUNTER_INCAP0)||(OPT == TIM_COUNTER_INCAP1)) - -/* Macro check TIMER external match mode */ -#define PARAM_TIM_EXTMATCH_OPT(OPT) ((OPT == TIM_EXTMATCH_NOTHING)||(OPT == TIM_EXTMATCH_LOW)\ -||(OPT == TIM_EXTMATCH_HIGH)||(OPT == TIM_EXTMATCH_TOGGLE)) - -/* Macro check TIMER external match mode */ -#define PARAM_TIM_CAP_MODE_OPT(OPT) ((OPT == TIM_CAPTURE_NONE)||(OPT == TIM_CAPTURE_RISING) \ -||(OPT == TIM_CAPTURE_FALLING)||(OPT == TIM_CAPTURE_ANY)) - -/** - * @} - */ - - -/* Public Types --------------------------------------------------------------- */ -/** @defgroup TIM_Public_Types TIM Public Types - * @{ - */ - -/*********************************************************************** - * Timer device enumeration -**********************************************************************/ -/** @brief interrupt type */ -typedef enum -{ - TIM_MR0_INT =0, /*!< interrupt for Match channel 0*/ - TIM_MR1_INT =1, /*!< interrupt for Match channel 1*/ - TIM_MR2_INT =2, /*!< interrupt for Match channel 2*/ - TIM_MR3_INT =3, /*!< interrupt for Match channel 3*/ - TIM_CR0_INT =4, /*!< interrupt for Capture channel 0*/ - TIM_CR1_INT =5 /*!< interrupt for Capture channel 1*/ -}TIM_INT_TYPE; - -/** @brief Timer/counter operating mode */ -typedef enum -{ - TIM_TIMER_MODE = 0, /*!< Timer mode */ - TIM_COUNTER_RISING_MODE, /*!< Counter rising mode */ - TIM_COUNTER_FALLING_MODE, /*!< Counter falling mode */ - TIM_COUNTER_ANY_MODE /*!< Counter on both edges */ -} TIM_MODE_OPT; - -/** @brief Timer/Counter prescale option */ -typedef enum -{ - TIM_PRESCALE_TICKVAL = 0, /*!< Prescale in absolute value */ - TIM_PRESCALE_USVAL /*!< Prescale in microsecond value */ -} TIM_PRESCALE_OPT; - -/** @brief Counter input option */ -typedef enum -{ - TIM_COUNTER_INCAP0 = 0, /*!< CAPn.0 input pin for TIMERn */ - TIM_COUNTER_INCAP1, /*!< CAPn.1 input pin for TIMERn */ -} TIM_COUNTER_INPUT_OPT; - -/** @brief Timer/Counter external match option */ -typedef enum -{ - TIM_EXTMATCH_NOTHING = 0, /*!< Do nothing for external output pin if match */ - TIM_EXTMATCH_LOW, /*!< Force external output pin to low if match */ - TIM_EXTMATCH_HIGH, /*!< Force external output pin to high if match */ - TIM_EXTMATCH_TOGGLE /*!< Toggle external output pin if match */ -}TIM_EXTMATCH_OPT; - -/** @brief Timer/counter capture mode options */ -typedef enum { - TIM_CAPTURE_NONE = 0, /*!< No Capture */ - TIM_CAPTURE_RISING, /*!< Rising capture mode */ - TIM_CAPTURE_FALLING, /*!< Falling capture mode */ - TIM_CAPTURE_ANY /*!< On both edges */ -} TIM_CAP_MODE_OPT; - -/** @brief Configuration structure in TIMER mode */ -typedef struct -{ - - uint8_t PrescaleOption; /**< Timer Prescale option, should be: - - TIM_PRESCALE_TICKVAL: Prescale in absolute value - - TIM_PRESCALE_USVAL: Prescale in microsecond value - */ - uint8_t Reserved[3]; /**< Reserved */ - uint32_t PrescaleValue; /**< Prescale value */ -} TIM_TIMERCFG_Type; - -/** @brief Configuration structure in COUNTER mode */ -typedef struct { - - uint8_t CounterOption; /**< Counter Option, should be: - - TIM_COUNTER_INCAP0: CAPn.0 input pin for TIMERn - - TIM_COUNTER_INCAP1: CAPn.1 input pin for TIMERn - */ - uint8_t CountInputSelect; - uint8_t Reserved[2]; -} TIM_COUNTERCFG_Type; - -/** @brief Match channel configuration structure */ -typedef struct { - uint8_t MatchChannel; /**< Match channel, should be in range - from 0..3 */ - uint8_t IntOnMatch; /**< Interrupt On match, should be: - - ENABLE: Enable this function. - - DISABLE: Disable this function. - */ - uint8_t StopOnMatch; /**< Stop On match, should be: - - ENABLE: Enable this function. - - DISABLE: Disable this function. - */ - uint8_t ResetOnMatch; /**< Reset On match, should be: - - ENABLE: Enable this function. - - DISABLE: Disable this function. - */ - - uint8_t ExtMatchOutputType; /**< External Match Output type, should be: - - TIM_EXTMATCH_NOTHING: Do nothing for external output pin if match - - TIM_EXTMATCH_LOW: Force external output pin to low if match - - TIM_EXTMATCH_HIGH: Force external output pin to high if match - - TIM_EXTMATCH_TOGGLE: Toggle external output pin if match. - */ - uint8_t Reserved[3]; /** Reserved */ - uint32_t MatchValue; /** Match value */ -} TIM_MATCHCFG_Type; - -/** @brief Capture Input configuration structure */ -typedef struct { - uint8_t CaptureChannel; /**< Capture channel, should be in range - from 0..1 */ - uint8_t RisingEdge; /**< caption rising edge, should be: - - ENABLE: Enable rising edge. - - DISABLE: Disable this function. - */ - uint8_t FallingEdge; /**< caption falling edge, should be: - - ENABLE: Enable falling edge. - - DISABLE: Disable this function. - */ - uint8_t IntOnCaption; /**< Interrupt On caption, should be: - - ENABLE: Enable interrupt function. - - DISABLE: Disable this function. - */ - -} TIM_CAPTURECFG_Type; - -/** - * @} - */ - - -/* Public Functions ----------------------------------------------------------- */ -/** @defgroup TIM_Public_Functions TIM Public Functions - * @{ - */ -/* Init/DeInit TIM functions -----------*/ -void TIM_Init(LPC_TIM_TypeDef *TIMx, TIM_MODE_OPT TimerCounterMode, void *TIM_ConfigStruct); -void TIM_DeInit(LPC_TIM_TypeDef *TIMx); - -/* TIM interrupt functions -------------*/ -void TIM_ClearIntPending(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag); -void TIM_ClearIntCapturePending(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag); -FlagStatus TIM_GetIntStatus(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag); -FlagStatus TIM_GetIntCaptureStatus(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag); - -/* TIM configuration functions --------*/ -void TIM_ConfigStructInit(TIM_MODE_OPT TimerCounterMode, void *TIM_ConfigStruct); -void TIM_ConfigMatch(LPC_TIM_TypeDef *TIMx, TIM_MATCHCFG_Type *TIM_MatchConfigStruct); -void TIM_UpdateMatchValue(LPC_TIM_TypeDef *TIMx,uint8_t MatchChannel, uint32_t MatchValue); -void TIM_SetMatchExt(LPC_TIM_TypeDef *TIMx,TIM_EXTMATCH_OPT ext_match ); -void TIM_ConfigCapture(LPC_TIM_TypeDef *TIMx, TIM_CAPTURECFG_Type *TIM_CaptureConfigStruct); -void TIM_Cmd(LPC_TIM_TypeDef *TIMx, FunctionalState NewState); - -uint32_t TIM_GetCaptureValue(LPC_TIM_TypeDef *TIMx, TIM_COUNTER_INPUT_OPT CaptureChannel); -void TIM_ResetCounter(LPC_TIM_TypeDef *TIMx); - -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif /* __LPC17XX_TIMER_H_ */ - -/** - * @} - */ - -/* --------------------------------- End Of File ------------------------------ */ diff --git a/platforms_startup/armcc/LPC1768/lpc_types.h b/platforms_startup/armcc/LPC1768/lpc_types.h deleted file mode 100644 index a67229664..000000000 --- a/platforms_startup/armcc/LPC1768/lpc_types.h +++ /dev/null @@ -1,212 +0,0 @@ -/********************************************************************** -* $Id$ lpc_types.h 2008-07-27 -*//** -* @file lpc_types.h -* @brief Contains the NXP ABL typedefs for C standard types. -* It is intended to be used in ISO C conforming development -* environments and checks for this insofar as it is possible -* to do so. -* @version 2.0 -* @date 27 July. 2008 -* @author NXP MCU SW Application Team -* -* Copyright(C) 2008, NXP Semiconductor -* All rights reserved. -* -*********************************************************************** -* Software that is described herein is for illustrative purposes only -* which provides customers with programming information regarding the -* products. This software is supplied "AS IS" without any warranties. -* NXP Semiconductors assumes no responsibility or liability for the -* use of the software, conveys no license or title under any patent, -* copyright, or mask work right to the product. NXP Semiconductors -* reserves the right to make changes in the software without -* notification. NXP Semiconductors also make no representation or -* warranty that such application will be suitable for the specified -* use without further testing or modification. -* Permission to use, copy, modify, and distribute this software and its -* documentation is hereby granted, under NXP Semiconductors' -* relevant copyright in the software, without fee, provided that it -* is used in conjunction with NXP Semiconductors microcontrollers. This -* copyright, permission, and disclaimer notice must appear in all copies of -* this code. -**********************************************************************/ - -/* Type group ----------------------------------------------------------- */ -/** @defgroup LPC_Types LPC_Types - * @ingroup LPC1700CMSIS_FwLib_Drivers - * @{ - */ - -#ifndef LPC_TYPES_H -#define LPC_TYPES_H - -/* Includes ------------------------------------------------------------------- */ -#include - - -/* Public Types --------------------------------------------------------------- */ -/** @defgroup LPC_Types_Public_Types LPC_Types Public Types - * @{ - */ - -/** - * @brief Boolean Type definition - */ -typedef enum {FALSE = 0, TRUE = !FALSE} Bool; - -/** - * @brief Flag Status and Interrupt Flag Status type definition - */ -typedef enum {RESET = 0, SET = !RESET} FlagStatus, IntStatus, SetState; -#define PARAM_SETSTATE(State) ((State==RESET) || (State==SET)) - -/** - * @brief Functional State Definition - */ -typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; -#define PARAM_FUNCTIONALSTATE(State) ((State==DISABLE) || (State==ENABLE)) - -/** - * @ Status type definition - */ -typedef enum {ERROR = 0, SUCCESS = !ERROR} Status; - - -/** - * Read/Write transfer type mode (Block or non-block) - */ -typedef enum -{ - NONE_BLOCKING = 0, /**< None Blocking type */ - BLOCKING /**< Blocking type */ -} TRANSFER_BLOCK_Type; - - -/** Pointer to Function returning Void (any number of parameters) */ -typedef void (*PFV)(); - -/** Pointer to Function returning int32_t (any number of parameters) */ -typedef int32_t(*PFI)(); - -/** - * @} - */ - - -/* Public Macros -------------------------------------------------------------- */ -/** @defgroup LPC_Types_Public_Macros LPC_Types Public Macros - * @{ - */ - -/* _BIT(n) sets the bit at position "n" - * _BIT(n) is intended to be used in "OR" and "AND" expressions: - * e.g., "(_BIT(3) | _BIT(7))". - */ -#undef _BIT -/* Set bit macro */ -#define _BIT(n) (1< = (any_expression) & _BITMASK(x), where 0 < x <= 32. - * If "any_expression" results in a value that is larger than can be - * contained in 'x' bits, the bits above 'x - 1' are masked off. When - * used with the _SBF example above, the example would be written: - * a_reg = ((_SBF(5,7) | _SBF(12,0xF)) & _BITMASK(16)) - * This ensures that the value written to a_reg is no wider than - * 16 bits, and makes the code easier to read and understand. - */ -#undef _BITMASK -/* Bitmask creation macro */ -#define _BITMASK(field_width) ( _BIT(field_width) - 1) - -/* NULL pointer */ -#ifndef NULL -#define NULL ((void*) 0) -#endif - -/* Number of elements in an array */ -#define NELEMENTS(array) (sizeof (array) / sizeof (array[0])) - -/* Static data/function define */ -#define STATIC static -/* External data/function define */ -#define EXTERN extern - -#if !defined(MAX) -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#endif -#if !defined(MIN) -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#endif - -/** - * @} - */ - - -/* Old Type Definition compatibility ------------------------------------------ */ -/** @addtogroup LPC_Types_Public_Types LPC_Types Public Types - * @{ - */ - -/** SMA type for character type */ -typedef char CHAR; - -/** SMA type for 8 bit unsigned value */ -typedef uint8_t UNS_8; - -/** SMA type for 8 bit signed value */ -typedef int8_t INT_8; - -/** SMA type for 16 bit unsigned value */ -typedef uint16_t UNS_16; - -/** SMA type for 16 bit signed value */ -typedef int16_t INT_16; - -/** SMA type for 32 bit unsigned value */ -typedef uint32_t UNS_32; - -/** SMA type for 32 bit signed value */ -typedef int32_t INT_32; - -/** SMA type for 64 bit signed value */ -typedef int64_t INT_64; - -/** SMA type for 64 bit unsigned value */ -typedef uint64_t UNS_64; - -/** 32 bit boolean type */ -typedef Bool BOOL_32; - -/** 16 bit boolean type */ -typedef Bool BOOL_16; - -/** 8 bit boolean type */ -typedef Bool BOOL_8; - -/** - * @} - */ - - -#endif /* LPC_TYPES_H */ - -/** - * @} - */ - -/* --------------------------------- End Of File ------------------------------ */ diff --git a/platforms_startup/armcc/LPC1768/startup_LPC17xx.asm b/platforms_startup/armcc/LPC1768/startup_LPC17xx.asm deleted file mode 100644 index c0a32bc01..000000000 --- a/platforms_startup/armcc/LPC1768/startup_LPC17xx.asm +++ /dev/null @@ -1,281 +0,0 @@ -;/***************************************************************************** -; * @file: startup_LPC17xx.s -; * @purpose: CMSIS Cortex-M3 Core Device Startup File -; * for the NXP LPC17xx Device Series -; * @version: V1.20 -; * @date: 07. October 2010 -; *------- <<< Use Configuration Wizard in Context Menu >>> ------------------ -; * -; * Copyright (C) 2010 ARM Limited. All rights reserved. -; * ARM Limited (ARM) is supplying this software for use with Cortex-M3 -; * processor based microcontrollers. This file can be freely distributed -; * within development tools that are supporting such ARM based processors. -; * -; * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED -; * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF -; * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. -; * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR -; * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. -; * -; *****************************************************************************/ - - -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Stack_Size EQU 0x00002000 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Heap_Size EQU 0x00006000 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - - PRESERVE8 - THUMB - -; Vector Table Mapped to Address 0 at Reset - - AREA RESET, CODE, READONLY - EXPORT __Vectors - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - -; External Interrupts - DCD WDT_IRQHandler ; 16: Watchdog Timer - DCD TIMER0_IRQHandler ; 17: Timer0 - DCD TIMER1_IRQHandler ; 18: Timer1 - DCD TIMER2_IRQHandler ; 19: Timer2 - DCD TIMER3_IRQHandler ; 20: Timer3 - DCD UART0_IRQHandler ; 21: UART0 - DCD UART1_IRQHandler ; 22: UART1 - DCD UART2_IRQHandler ; 23: UART2 - DCD UART3_IRQHandler ; 24: UART3 - DCD PWM1_IRQHandler ; 25: PWM1 - DCD I2C0_IRQHandler ; 26: I2C0 - DCD I2C1_IRQHandler ; 27: I2C1 - DCD I2C2_IRQHandler ; 28: I2C2 - DCD SPI_IRQHandler ; 29: SPI - DCD SSP0_IRQHandler ; 30: SSP0 - DCD SSP1_IRQHandler ; 31: SSP1 - DCD PLL0_IRQHandler ; 32: PLL0 Lock (Main PLL) - DCD RTC_IRQHandler ; 33: Real Time Clock - DCD EINT0_IRQHandler ; 34: External Interrupt 0 - DCD EINT1_IRQHandler ; 35: External Interrupt 1 - DCD EINT2_IRQHandler ; 36: External Interrupt 2 - DCD EINT3_IRQHandler ; 37: External Interrupt 3 - DCD ADC_IRQHandler ; 38: A/D Converter - DCD BOD_IRQHandler ; 39: Brown-Out Detect - DCD USB_IRQHandler ; 40: USB - DCD CAN_IRQHandler ; 41: CAN - DCD DMA_IRQHandler ; 42: General Purpose DMA - DCD I2S_IRQHandler ; 43: I2S - DCD ENET_IRQHandler ; 44: Ethernet - DCD RIT_IRQHandler ; 45: Repetitive Interrupt Timer - DCD MCPWM_IRQHandler ; 46: Motor Control PWM - DCD QEI_IRQHandler ; 47: Quadrature Encoder Interface - DCD PLL1_IRQHandler ; 48: PLL1 Lock (USB PLL) - DCD USBActivity_IRQHandler ; 49: USB Activity interrupt to wakeup - DCD CANActivity_IRQHandler ; 50: CAN Activity interrupt to wakeup - - - IF :LNOT::DEF:NO_CRP - AREA |.ARM.__at_0x02FC|, CODE, READONLY -CRP_Key DCD 0xFFFFFFFF - ENDIF - - - AREA |.text|, CODE, READONLY - - -; Reset Handler - -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT SystemInit - IMPORT __main - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP -BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP -UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WDT_IRQHandler [WEAK] - EXPORT TIMER0_IRQHandler [WEAK] - EXPORT TIMER1_IRQHandler [WEAK] - EXPORT TIMER2_IRQHandler [WEAK] - EXPORT TIMER3_IRQHandler [WEAK] - EXPORT UART0_IRQHandler [WEAK] - EXPORT UART1_IRQHandler [WEAK] - EXPORT UART2_IRQHandler [WEAK] - EXPORT UART3_IRQHandler [WEAK] - EXPORT PWM1_IRQHandler [WEAK] - EXPORT I2C0_IRQHandler [WEAK] - EXPORT I2C1_IRQHandler [WEAK] - EXPORT I2C2_IRQHandler [WEAK] - EXPORT SPI_IRQHandler [WEAK] - EXPORT SSP0_IRQHandler [WEAK] - EXPORT SSP1_IRQHandler [WEAK] - EXPORT PLL0_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT EINT0_IRQHandler [WEAK] - EXPORT EINT1_IRQHandler [WEAK] - EXPORT EINT2_IRQHandler [WEAK] - EXPORT EINT3_IRQHandler [WEAK] - EXPORT ADC_IRQHandler [WEAK] - EXPORT BOD_IRQHandler [WEAK] - EXPORT USB_IRQHandler [WEAK] - EXPORT CAN_IRQHandler [WEAK] - EXPORT DMA_IRQHandler [WEAK] - EXPORT I2S_IRQHandler [WEAK] - EXPORT ENET_IRQHandler [WEAK] - EXPORT RIT_IRQHandler [WEAK] - EXPORT MCPWM_IRQHandler [WEAK] - EXPORT QEI_IRQHandler [WEAK] - EXPORT PLL1_IRQHandler [WEAK] - EXPORT USBActivity_IRQHandler [WEAK] - EXPORT CANActivity_IRQHandler [WEAK] - -WDT_IRQHandler -TIMER0_IRQHandler -TIMER1_IRQHandler -TIMER2_IRQHandler -TIMER3_IRQHandler -UART0_IRQHandler -UART1_IRQHandler -UART2_IRQHandler -UART3_IRQHandler -PWM1_IRQHandler -I2C0_IRQHandler -I2C1_IRQHandler -I2C2_IRQHandler -SPI_IRQHandler -SSP0_IRQHandler -SSP1_IRQHandler -PLL0_IRQHandler -RTC_IRQHandler -EINT0_IRQHandler -EINT1_IRQHandler -EINT2_IRQHandler -EINT3_IRQHandler -ADC_IRQHandler -BOD_IRQHandler -USB_IRQHandler -DMA_IRQHandler -CAN_IRQHandler -I2S_IRQHandler -ENET_IRQHandler -RIT_IRQHandler -MCPWM_IRQHandler -QEI_IRQHandler -PLL1_IRQHandler -USBActivity_IRQHandler -CANActivity_IRQHandler - - B . - - ENDP - - - ALIGN - - -; User Initial Stack & Heap - - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_setup_stackheap -__user_setup_stackheap - - LDR R0, = Heap_Mem - LDR R2, = (Heap_Mem + Heap_Size) - LDR SP, =(Stack_Mem + Stack_Size) - BX LR - - ALIGN - - ENDIF - - - END diff --git a/platforms_startup/armcc/LPC1768/system_LPC17xx.c b/platforms_startup/armcc/LPC1768/system_LPC17xx.c deleted file mode 100644 index 9a3447a50..000000000 --- a/platforms_startup/armcc/LPC1768/system_LPC17xx.c +++ /dev/null @@ -1,642 +0,0 @@ -/**************************************************************************//** - * @file system_LPC17xx.c - * @brief CMSIS Cortex-M3 Device System Source File for - * NXP LPC17xx Device Series - * @version V1.13 - * @date 18. April 2012 - * - * @note - * Copyright (C) 2009-2012 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - - -#include -#include "LPC17xx.h" - -/** @addtogroup LPC17xx_System - * @{ - */ - -/* -//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ -*/ - -/*--------------------- Clock Configuration---------------- -// -// Clock Configuration -// System Controls and Status Register (SCS) with quartz 24 MHz -// OSCRANGE: Main Oscillator Range Select -// <0=> 1 MHz to 20 MHz -// <1=> 15 MHz to 25 MHz -// OSCEN: Main Oscillator Enable -// -// -// -// System Controls and Status Register (SCS) with quartz 12 MHz -// OSCRANGE: Main Oscillator Range Select -// <0=> 1 MHz to 20 MHz -// <1=> 15 MHz to 25 MHz -// OSCEN: Main Oscillator Enable -// -// - -// PLL0 Configuration (Main PLL) -// PLL0 Configuration Register (PLL0CFG) with quartz 24 MHz -// F_cco0 = (2 * M * F_in) / N -// F_in must be in the range of 32 kHz to 50 MHz -// F_cco0 must be in the range of 275 MHz to 550 MHz -// MSEL: PLL Multiplier Selection -// <6-32768><#-1> -// M Value -// NSEL: PLL Divider Selection -// <1-256><#-1> -// N Value -// -// PLL0 Configuration Register (PLL0CFG) with quartz 12 MHz -// F_cco0 = (2 * M * F_in) / N -// F_in must be in the range of 32 kHz to 50 MHz -// F_cco0 must be in the range of 275 MHz to 550 MHz -// MSEL: PLL Multiplier Selection -// <6-32768><#-1> -// M Value -// NSEL: PLL Divider Selection -// <1-256><#-1> -// N Value -// -// -// -// PLL1 Configuration (USB PLL) -// PLL1 Configuration Register (PLL1CFG) with quartz 24 MHz -// F_usb = M * F_osc or F_usb = F_cco1 / (2 * P) -// F_cco1 = F_osc * M * 2 * P -// F_cco1 must be in the range of 156 MHz to 320 MHz -// MSEL: PLL Multiplier Selection -// <1-32><#-1> -// M Value (for USB maximum value is 4) -// PSEL: PLL Divider Selection -// <0=> 1 -// <1=> 2 -// <2=> 4 -// <3=> 8 -// P Value -// -// PLL1 Configuration Register (PLL1CFG) with quartz 12 MHz -// F_usb = M * F_osc or F_usb = F_cco1 / (2 * P) -// F_cco1 = F_osc * M * 2 * P -// F_cco1 must be in the range of 156 MHz to 320 MHz -// MSEL: PLL Multiplier Selection -// <1-32><#-1> -// M Value (for USB maximum value is 4) -// PSEL: PLL Divider Selection -// <0=> 1 -// <1=> 2 -// <2=> 4 -// <3=> 8 -// P Value -// -// -// -// CPU Clock Configuration Register (CCLKCFG) -// CCLKSEL: Divide Value for CPU Clock from PLL0 -// <1-256><#-1> -// -// -// USB Clock Configuration Register (USBCLKCFG) -// USBSEL: Divide Value for USB Clock from PLL0 -// <0-15> -// Divide is USBSEL + 1 -// -// -// Clock Source Select Register (CLKSRCSEL) -// CLKSRC: PLL Clock Source Selection -// <0=> Internal RC oscillator -// <1=> Main oscillator -// <2=> RTC oscillator -// -// -// Peripheral Clock Selection Register 0 (PCLKSEL0) -// PCLK_WDT: Peripheral Clock Selection for WDT -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_TIMER0: Peripheral Clock Selection for TIMER0 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_TIMER1: Peripheral Clock Selection for TIMER1 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_UART0: Peripheral Clock Selection for UART0 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_UART1: Peripheral Clock Selection for UART1 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_PWM1: Peripheral Clock Selection for PWM1 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_I2C0: Peripheral Clock Selection for I2C0 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_SPI: Peripheral Clock Selection for SPI -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_SSP1: Peripheral Clock Selection for SSP1 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_DAC: Peripheral Clock Selection for DAC -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_ADC: Peripheral Clock Selection for ADC -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_CAN1: Peripheral Clock Selection for CAN1 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 6 -// PCLK_CAN2: Peripheral Clock Selection for CAN2 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 6 -// PCLK_ACF: Peripheral Clock Selection for ACF -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 6 -// -// -// Peripheral Clock Selection Register 1 (PCLKSEL1) -// PCLK_QEI: Peripheral Clock Selection for the Quadrature Encoder Interface -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_GPIO: Peripheral Clock Selection for GPIOs -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_PCB: Peripheral Clock Selection for the Pin Connect Block -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_I2C1: Peripheral Clock Selection for I2C1 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_SSP0: Peripheral Clock Selection for SSP0 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_TIMER2: Peripheral Clock Selection for TIMER2 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_TIMER3: Peripheral Clock Selection for TIMER3 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_UART2: Peripheral Clock Selection for UART2 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_UART3: Peripheral Clock Selection for UART3 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_I2C2: Peripheral Clock Selection for I2C2 -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_I2S: Peripheral Clock Selection for I2S -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_RIT: Peripheral Clock Selection for the Repetitive Interrupt Timer -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_SYSCON: Peripheral Clock Selection for the System Control Block -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// PCLK_MC: Peripheral Clock Selection for the Motor Control PWM -// <0=> Pclk = Cclk / 4 -// <1=> Pclk = Cclk -// <2=> Pclk = Cclk / 2 -// <3=> Pclk = Cclk / 8 -// -// -// Power Control for Peripherals Register (PCONP) -// PCTIM0: Timer/Counter 0 power/clock enable -// PCTIM1: Timer/Counter 1 power/clock enable -// PCUART0: UART 0 power/clock enable -// PCUART1: UART 1 power/clock enable -// PCPWM1: PWM 1 power/clock enable -// PCI2C0: I2C interface 0 power/clock enable -// PCSPI: SPI interface power/clock enable -// PCRTC: RTC power/clock enable -// PCSSP1: SSP interface 1 power/clock enable -// PCAD: A/D converter power/clock enable -// PCCAN1: CAN controller 1 power/clock enable -// PCCAN2: CAN controller 2 power/clock enable -// PCGPIO: GPIOs power/clock enable -// PCRIT: Repetitive interrupt timer power/clock enable -// PCMC: Motor control PWM power/clock enable -// PCQEI: Quadrature encoder interface power/clock enable -// PCI2C1: I2C interface 1 power/clock enable -// PCSSP0: SSP interface 0 power/clock enable -// PCTIM2: Timer 2 power/clock enable -// PCTIM3: Timer 3 power/clock enable -// PCUART2: UART 2 power/clock enable -// PCUART3: UART 3 power/clock enable -// PCI2C2: I2C interface 2 power/clock enable -// PCI2S: I2S interface power/clock enable -// PCGPDMA: GP DMA function power/clock enable -// PCENET: Ethernet block power/clock enable -// PCUSB: USB interface power/clock enable -// -// -// Clock Output Configuration Register (CLKOUTCFG) -// CLKOUTSEL: Selects clock source for CLKOUT -// <0=> CPU clock -// <1=> Main oscillator -// <2=> Internal RC oscillator -// <3=> USB clock -// <4=> RTC oscillator -// CLKOUTDIV: Selects clock divider for CLKOUT -// <1-16><#-1> -// CLKOUT_EN: CLKOUT enable control -// -// -// -*/ - - - -/** @addtogroup LPC17xx_System_Defines LPC17xx System Defines - @{ - */ - -#define CLOCK_SETUP 1 -#define SCS_24_Val 0x00000030 -#define SCS_12_Val 0x00000020 -#define PLL0_SETUP 1 -#define PLL0CFG_24_Val 0x00030018 -#define PLL0CFG_12_Val 0x00010018 -#define PLL1_SETUP 1 -#define PLL1CFG_24_Val 0x00000021 -#define PLL1CFG_12_Val 0x00000023 -#define CCLKCFG_Val 0x00000002 -#define USBCLKCFG_Val 0x00000001 -#define CLKSRCSEL_Val 0x00000001 -#define PCLKSEL0_Val 0x08000000 -#define PCLKSEL1_Val 0x00000000 -#define PCONP_Val 0x4000A00E -#define CLKOUTCFG_Val 0x00000110 - - -/*--------------------- Flash Accelerator Configuration ---------------------- -// -// Flash Accelerator Configuration -// FLASHTIM: Flash Access Time -// <0=> 1 CPU clock (for CPU clock up to 20 MHz) -// <1=> 2 CPU clocks (for CPU clock up to 40 MHz) -// <2=> 3 CPU clocks (for CPU clock up to 60 MHz) -// <3=> 4 CPU clocks (for CPU clock up to 80 MHz) -// <4=> 5 CPU clocks (for CPU clock up to 100 MHz) -// <5=> 6 CPU clocks (for any CPU clock) -// -*/ -#define FLASH_SETUP 1 -#define FLASHCFG_Val 0x00004000 - -/* -//-------- <<< end of configuration section >>> ------------------------------ -*/ - -/*---------------------------------------------------------------------------- - Check the register settings - *----------------------------------------------------------------------------*/ -#define CHECK_RANGE(val, min, max) ((val < min) || (val > max)) -#define CHECK_RSVD(val, mask) (val & mask) - -/* Clock Configuration -------------------------------------------------------*/ -#if (CHECK_RSVD((SCS_12_Val), ~0x00000030)) - #error "SCS_12: Invalid values of reserved bits!" -#endif -#if (CHECK_RSVD((SCS_24_Val), ~0x00000030)) - #error "SCS_24: Invalid values of reserved bits!" -#endif - -#if (CHECK_RANGE((CLKSRCSEL_Val), 0, 2)) - #error "CLKSRCSEL: Value out of range!" -#endif - -#if (CHECK_RSVD((PLL0CFG_12_Val), ~0x00FF7FFF)) - #error "PLL0CFG_12: Invalid values of reserved bits!" -#endif -#if (CHECK_RSVD((PLL0CFG_24_Val), ~0x00FF7FFF)) - #error "PLL0CFG_24: Invalid values of reserved bits!" -#endif - -#if (CHECK_RSVD((PLL1CFG_12_Val), ~0x0000007F)) - #error "PLL1CFG_12: Invalid values of reserved bits!" -#endif -#if (CHECK_RSVD((PLL1CFG_24_Val), ~0x0000007F)) - #error "PLL1CFG_24: Invalid values of reserved bits!" -#endif - -#if (PLL0_SETUP) /* if PLL0 is used */ - #if (CCLKCFG_Val < 2) /* CCLKSEL must be greater then 1 */ - #error "CCLKCFG_24: CCLKSEL must be greater then 1 if PLL0 is used!" - #endif -#endif - -#if (CHECK_RANGE((CCLKCFG_Val), 0, 255)) - #error "CCLKCFG_24: Value out of range!" -#endif - -#if (CHECK_RSVD((USBCLKCFG_Val), ~0x0000000F)) - #error "USBCLKCFG_24: Invalid values of reserved bits!" -#endif - -#if (CHECK_RSVD((PCLKSEL0_Val), 0x000C0C00)) - #error "PCLKSEL0: Invalid values of reserved bits!" -#endif - -#if (CHECK_RSVD((PCLKSEL1_Val), 0x03000300)) - #error "PCLKSEL1: Invalid values of reserved bits!" -#endif - -#if (CHECK_RSVD((PCONP_Val), 0x10100821)) - #error "PCONP: Invalid values of reserved bits!" -#endif - -#if (CHECK_RSVD((CLKOUTCFG_Val), ~0x000001FF)) - #error "CLKOUTCFG: Invalid values of reserved bits!" -#endif - -/* Flash Accelerator Configuration -------------------------------------------*/ -#if (CHECK_RSVD((FLASHCFG_Val), ~0x0000F000)) - #error "FLASHCFG: Invalid values of reserved bits!" -#endif - - -/*---------------------------------------------------------------------------- - DEFINES - *----------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------- - Define clocks - *----------------------------------------------------------------------------*/ -#define XTAL_24 (24000000UL) /* Oscillator frequency */ -#define XTAL_12 (12000000UL) /* Oscillator frequency */ -#define OSC_CLK_24 ( XTAL_24) /* Main oscillator frequency */ -#define OSC_CLK_12 ( XTAL_12) /* Main oscillator frequency */ -#define RTC_CLK ( 32768UL) /* RTC oscillator frequency */ -#define IRC_OSC ( 4000000UL) /* Internal RC oscillator frequency */ - - -/* F_cco0 = (2 * M * F_in) / N */ -#define __M_24 (((PLL0CFG_24_Val ) & 0x7FFF) + 1) -#define __M_12 (((PLL0CFG_12_Val ) & 0x7FFF) + 1) -#define __N_24 (((PLL0CFG_24_Val >> 16) & 0x00FF) + 1) -#define __N_12 (((PLL0CFG_12_Val >> 16) & 0x00FF) + 1) -#define __FCCO_24(__F_IN) ((2ULL * __M_24 * __F_IN) / __N_24) -#define __FCCO_12(__F_IN) ((2ULL * __M_12 * __F_IN) / __N_12) -#define __CCLK_DIV_24 (((CCLKCFG_Val ) & 0x00FF) + 1) -#define __CCLK_DIV_12 (((CCLKCFG_Val ) & 0x00FF) + 1) - -/* Determine core clock frequency according to settings */ - #if (PLL0_SETUP) - #if ((CLKSRCSEL_Val & 0x03) == 1) - #define __CORE_CLK_24 (__FCCO_24(OSC_CLK_24) / __CCLK_DIV_24) - #elif ((CLKSRCSEL_Val & 0x03) == 2) - #define __CORE_CLK_24 (__FCCO_24(RTC_CLK) / __CCLK_DIV_24) - #else - #define __CORE_CLK_24 (__FCCO_24(IRC_OSC) / __CCLK_DIV_24) - #endif - #if ((CLKSRCSEL_Val & 0x03) == 1) - #define __CORE_CLK_12 (__FCCO_12(OSC_CLK_12) / __CCLK_DIV_12) - #elif ((CLKSRCSEL_Val & 0x03) == 2) - #define __CORE_CLK_12 (__FCCO_12(RTC_CLK) / __CCLK_DIV_12) - #else - #define __CORE_CLK_12 (__FCCO_12(IRC_OSC) / __CCLK_DIV_12) - #endif - #else - #if ((CLKSRCSEL_Val & 0x03) == 1) - #define __CORE_CLK_24 (OSC_CLK_24 / __CCLK_DIV_24) - #elif ((CLKSRCSEL_Val & 0x03) == 2) - #define __CORE_CLK_24 (RTC_CLK / __CCLK_DIV_24) - #else - #define __CORE_CLK_24 (IRC_OSC / __CCLK_DIV_24) - #endif - #if ((CLKSRCSEL_Val & 0x03) == 1) - #define __CORE_CLK_12 (OSC_CLK_12 / __CCLK_DIV_12) - #elif ((CLKSRCSEL_Val & 0x03) == 2) - #define __CORE_CLK_12 (RTC_CLK / __CCLK_DIV_12) - #else - #define __CORE_CLK_12 (IRC_OSC / __CCLK_DIV_12) - #endif - #endif - - /** - * @} - */ - - -/** @addtogroup LPC17xx_System_Public_Variables LPC17xx System Public Variables - @{ - */ -/*---------------------------------------------------------------------------- - Clock Variable definitions - *----------------------------------------------------------------------------*/ -uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock)*/ -const uint32_t SystemCoreClock12 = __CORE_CLK_12; /*!< System Clock Frequency (Core Clock)*/ -const uint32_t SystemCoreClock24 = __CORE_CLK_24; /*!< System Clock Frequency (Core Clock)*/ - -/** - * @} - */ - - -/** @addtogroup LPC17xx_System_Public_Functions LPC17xx System Public Functions - @{ - */ - - -/** - * Initialize the system - * - * @param none - * @return none - * - * @brief Setup the microcontroller system. - * Initialize the System. - * Запрещено иÑпользовать любые вызовы, иÑпользующие указатель Ñтека (Ñ‚.к. Ñтек ещё не проинициализирован) - */ -void SystemInit (void) -{ - if (1) { /* for 12 MHz Quartz */ -#if (CLOCK_SETUP) /* Clock Setup */ - LPC_SC->SCS = SCS_12_Val; - if (LPC_SC->SCS & (1 << 5)) { /* If Main Oscillator is enabled */ - while ((LPC_SC->SCS & (1<<6)) == 0);/* Wait for Oscillator to be ready */ - } - - LPC_SC->CCLKCFG = CCLKCFG_Val; /* Setup Clock Divider */ - /* Periphral clock must be selected before PLL0 enabling and connecting - * - according errata.lpc1768-16.March.2010 - - */ - LPC_SC->PCLKSEL0 = PCLKSEL0_Val; /* Peripheral Clock Selection */ - LPC_SC->PCLKSEL1 = PCLKSEL1_Val; - - LPC_SC->CLKSRCSEL = CLKSRCSEL_Val; /* Select Clock Source sysclk / PLL0 */ - -#if (PLL0_SETUP) - LPC_SC->PLL0CFG = PLL0CFG_12_Val; /* configure PLL0 */ - LPC_SC->PLL0FEED = 0xAA; - LPC_SC->PLL0FEED = 0x55; - - LPC_SC->PLL0CON = 0x01; /* PLL0 Enable */ - LPC_SC->PLL0FEED = 0xAA; - LPC_SC->PLL0FEED = 0x55; - while (!(LPC_SC->PLL0STAT & (1<<26)));/* Wait for PLOCK0 */ - - LPC_SC->PLL0CON = 0x03; /* PLL0 Enable & Connect */ - LPC_SC->PLL0FEED = 0xAA; - LPC_SC->PLL0FEED = 0x55; - while ((LPC_SC->PLL0STAT & ((1<<25) | (1<<24))) != ((1<<25) | (1<<24))); /* Wait for PLLC0_STAT & PLLE0_STAT */ -#endif - -#if (PLL1_SETUP) - LPC_SC->PLL1CFG = PLL1CFG_12_Val; - LPC_SC->PLL1FEED = 0xAA; - LPC_SC->PLL1FEED = 0x55; - - LPC_SC->PLL1CON = 0x01; /* PLL1 Enable */ - LPC_SC->PLL1FEED = 0xAA; - LPC_SC->PLL1FEED = 0x55; - while (!(LPC_SC->PLL1STAT & (1<<10)));/* Wait for PLOCK1 */ - - LPC_SC->PLL1CON = 0x03; /* PLL1 Enable & Connect */ - LPC_SC->PLL1FEED = 0xAA; - LPC_SC->PLL1FEED = 0x55; - while ((LPC_SC->PLL1STAT & ((1<< 9) | (1<< 8))) != ((1<< 9) | (1<< 8))); /* Wait for PLLC1_STAT & PLLE1_STAT */ -#else - LPC_SC->USBCLKCFG = USBCLKCFG_12_Val; /* Setup USB Clock Divider */ -#endif - LPC_SC->PCONP = PCONP_Val; /* Power Control for Peripherals */ - - LPC_SC->CLKOUTCFG = CLKOUTCFG_Val; /* Clock Output Configuration */ -#endif - -#if (FLASH_SETUP == 1) /* Flash Accelerator Setup */ - LPC_SC->FLASHCFG = (LPC_SC->FLASHCFG & ~0x0000F000) | FLASHCFG_Val; -#endif - } else { /* for 24 MGz Quartz */ -#if (CLOCK_SETUP) /* Clock Setup */ - LPC_SC->SCS = SCS_24_Val; - if (LPC_SC->SCS & (1 << 5)) { /* If Main Oscillator is enabled */ - while ((LPC_SC->SCS & (1<<6)) == 0);/* Wait for Oscillator to be ready */ - } - - LPC_SC->CCLKCFG = CCLKCFG_Val; /* Setup Clock Divider */ - /* Periphral clock must be selected before PLL0 enabling and connecting - * - according errata.lpc1768-16.March.2010 - - */ - LPC_SC->PCLKSEL0 = PCLKSEL0_Val; /* Peripheral Clock Selection */ - LPC_SC->PCLKSEL1 = PCLKSEL1_Val; - - LPC_SC->CLKSRCSEL = CLKSRCSEL_Val; /* Select Clock Source sysclk / PLL0 */ - -#if (PLL0_SETUP) - LPC_SC->PLL0CFG = PLL0CFG_24_Val; /* configure PLL0 */ - LPC_SC->PLL0FEED = 0xAA; - LPC_SC->PLL0FEED = 0x55; - - LPC_SC->PLL0CON = 0x01; /* PLL0 Enable */ - LPC_SC->PLL0FEED = 0xAA; - LPC_SC->PLL0FEED = 0x55; - while (!(LPC_SC->PLL0STAT & (1<<26)));/* Wait for PLOCK0 */ - - LPC_SC->PLL0CON = 0x03; /* PLL0 Enable & Connect */ - LPC_SC->PLL0FEED = 0xAA; - LPC_SC->PLL0FEED = 0x55; - while ((LPC_SC->PLL0STAT & ((1<<25) | (1<<24))) != ((1<<25) | (1<<24))); /* Wait for PLLC0_STAT & PLLE0_STAT */ -#endif - -#if (PLL1_SETUP) - LPC_SC->PLL1CFG = PLL1CFG_24_Val; - LPC_SC->PLL1FEED = 0xAA; - LPC_SC->PLL1FEED = 0x55; - - LPC_SC->PLL1CON = 0x01; /* PLL1 Enable */ - LPC_SC->PLL1FEED = 0xAA; - LPC_SC->PLL1FEED = 0x55; - while (!(LPC_SC->PLL1STAT & (1<<10)));/* Wait for PLOCK1 */ - - LPC_SC->PLL1CON = 0x03; /* PLL1 Enable & Connect */ - LPC_SC->PLL1FEED = 0xAA; - LPC_SC->PLL1FEED = 0x55; - while ((LPC_SC->PLL1STAT & ((1<< 9) | (1<< 8))) != ((1<< 9) | (1<< 8))); /* Wait for PLLC1_STAT & PLLE1_STAT */ -#else - LPC_SC->USBCLKCFG = USBCLKCFG_24_Val; /* Setup USB Clock Divider */ -#endif - LPC_SC->PCONP = PCONP_Val; /* Power Control for Peripherals */ - - LPC_SC->CLKOUTCFG = CLKOUTCFG_Val; /* Clock Output Configuration */ -#endif - -#if (FLASH_SETUP == 1) /* Flash Accelerator Setup */ - LPC_SC->FLASHCFG = (LPC_SC->FLASHCFG & ~0x0000F000) | FLASHCFG_Val; -#endif - } -} diff --git a/platforms_startup/armcc/LPC1768/system_LPC17xx.h b/platforms_startup/armcc/LPC1768/system_LPC17xx.h deleted file mode 100644 index 1bcc97f35..000000000 --- a/platforms_startup/armcc/LPC1768/system_LPC17xx.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************//** - * @file system_LPC17xx.h - * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File - * for the NXP LPC17xx Device Series - * @version V1.02 - * @date 08. September 2009 - * - * @note - * Copyright (C) 2009 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - - -#ifndef __SYSTEM_LPC17xx_H -#define __SYSTEM_LPC17xx_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/** @addtogroup LPC17xx_System - * @{ - */ - - -extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ - - -/** - * Initialize the system - * - * @param none - * @return none - * - * @brief Setup the microcontroller system. - * Initialize the System and update the SystemCoreClock variable. - */ -extern void SystemInit (void); - -/** - * Update SystemCoreClock variable - * - * @param none - * @return none - * - * @brief Updates the SystemCoreClock with current core Clock - * retrieved from cpu registers. - */ -extern void SystemCoreClockUpdate (void); -#ifdef __cplusplus -} -#endif - -/** - * @} - */ - -#endif /* __SYSTEM_LPC17xx_H */ diff --git a/platforms_startup/armcc/LPC1833/Makefile b/platforms_startup/armcc/LPC1833/Makefile deleted file mode 100644 index 6fda31ef6..000000000 --- a/platforms_startup/armcc/LPC1833/Makefile +++ /dev/null @@ -1,139 +0,0 @@ -SHELL = cmd.exe - -CPU := Cortex-M3 -CPU_MODE := thumb -TARGET_PLATFORM :=armcc_$(CPU)_$(CPU_MODE) - -CPPUTEST_HOME := ../../.. - -# Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° -COMPONENT_NAME := Startup_LPC1833 - -# промежуточный каталог, где производитÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑ†Ð¸Ñ startup-файлов -OBJS_DIR = objs - -# каталог Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¾Ð¹` -LIB_DIR := $(CPPUTEST_HOME)/lib/$(TARGET_PLATFORM) - -# каталог Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ -SRC_DIRS := . - -# каталог Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ñ‡Ð½Ñ‹Ð¼Ð¸ файлами -INCLUDE_DIRS := . - -# CYGWIN path -CYGWIN :=C:/CYGWIN/bin -MKDIR :=@$(CYGWIN)/mkdir -RM :=@$(CYGWIN)/rm -TOUCH :=@$(CYGWIN)/touch - -KEIL_DIR:=D:/Keil/ARM/ARMCC -CC:=@$(KEIL_DIR)/bin/armcc.exe -AS:=@$(KEIL_DIR)/bin/armasm.exe -AR:=@$(KEIL_DIR)/bin/armar.exe -# armcc system include path -SYS_INCLUDE_DIRS :=$(KEIL_DIR)/include - -# добавление ÑиÑтемных заголовочных файлов Ð´Ð»Ñ Ñборки CRT библиотеки -INCLUDE_DIRS +=$(SYS_INCLUDE_DIRS) - -CPUFLAGS :=--cpu=$(CPU) --apcs=/interwork -DEPFLAGS =-M $(INCLUDES) --depend_format=unix_escaped --depend_single_line --no_depend_system_headers -OPTFLAGS :=-O0 -CCFLAGS =$(CPUFLAGS) \ - $(OPTFLAGS) \ - -c \ - --debug \ - $(INCLUDES) \ - --$(CPU_MODE) \ - --bss_threshold=0 \ - --strict_warnings \ - -D__CLK_TCK=1000 \ - -DCGU_IRC_FREQ=12000000 \ - -ARFLAGS := --debug_symbols - - -TARGET_LIB := \ - $(LIB_DIR)/lib$(COMPONENT_NAME).a - -#Helper Functions -get_src_from_dir = $(wildcard $1/*.c) $(wildcard $1/*.asm) -get_src_from_dir_list = $(foreach dir, $1, $(call get_src_from_dir,$(dir))) -__src_to = $(subst .asm,$1, $(subst .c,$1,$2)) -src_to = $(addprefix $3/,$(call __src_to,$1,$2)) -src_to_o = $(call src_to,.o,$1,$2) -src_to_d = $(call src_to,.d,$1,$2) -time = $(shell date +%s) -delta_t = $(eval minus, $1, $2) -debug_print_list = $(foreach word,$1,@echo " $(word)";) @echo - -# for building CRT library -SRC := $(call get_src_from_dir_list, $(SRC_DIRS)) -OBJ := $(call src_to_o,$(SRC),$(OBJS_DIR)) -INCLUDES += $(foreach dir, $(INCLUDE_DIRS), -I$(dir)) -DEP_FILES := $(call src_to_d, $(SRC), $(OBJS_DIR)) -STUFF_TO_CLEAN := $(OBJ) $(DEP_FILES) - -#Don't create CRT dependencies when we're cleaning, for instance -ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS)))) - -include $(DEP_FILES) -endif - -$(TARGET_LIB): $(OBJ) | $(LIB_DIR) - $(AR) $(ARFLAGS) --create $@ $^ - @echo Build CRT library done! - -.PHONY: crt -crt: - @echo - @echo CRT =$(CRT) - @echo SRC =$(SRC) - @echo OBJ =$(OBJ) - @echo INCLUDES =$(INCLUDES) - @echo DEP_FILES =$(DEP_FILES) - @echo STUFF_TO_CLEAN =$(STUFF_TO_CLEAN) - @echo OBJS_DIR =$(OBJS_DIR) - -$(LIB_DIR) $(OBJS_DIR): - @echo Updating directory $@ - $(MKDIR) -p $@ - -# Создание файлов завиÑимоÑти Ð´Ð»Ñ .c файлов -$(OBJS_DIR)/%.d: %.c | $(OBJS_DIR) - @echo Compiling C file $< for dependency. Out file $@. - $(CC) $(DEPFLAGS) --c99 $< --depend=$@ --depend_target='$(patsubst %.d,%.o,$@)' - -# Создание файлов завиÑимоÑти Ð´Ð»Ñ .cpp файлов -$(OBJS_DIR)/%.d: %.cpp | $(OBJS_DIR) - @echo Compiling C file $< for dependency. Out file $@. - $(CC) $(DEPFLAGS) $< --depend=$@ --depend_target='$(patsubst %.d,%.o,$@)' - -# Создание файлов завиÑимоÑти Ð´Ð»Ñ .asm файлов -$(OBJS_DIR)/%.d: %.asm | $(OBJS_DIR) - @echo Compiling ASM file $< for dependency. Out file $@. - $(TOUCH) $@ - - - -# КомпилÑÑ†Ð¸Ñ .asm файла -$(OBJS_DIR)/%.o: %.asm $(OBJS_DIR)/%.d - @echo Assembling file $<. Out file $@ - $(AS) $(CPUFLAGS) --keep --debug --predefine "NO_CRP SETL {TRUE}" $< -o $@ - -# КомпилÑÑ†Ð¸Ñ .c файла -$(OBJS_DIR)/%.o: %.c $(OBJS_DIR)/%.d - @echo Compiling C file $<. Out file $@ - $(CC) $(CCFLAGS) --c99 $< -o $@ - -# КомпилÑÑ†Ð¸Ñ .cpp файла -$(OBJS_DIR)/%.o: %.cpp $(OBJS_DIR)/%.d - @echo Compiling C++ file $<. Out file $@ - $(CC) $(CCFLAGS) $< -o $@ - -clean: - @$(RM) -f $(STUFF_TO_CLEAN) - - -all: $(TARGET_LIB) - @echo Done! diff --git a/platforms_startup/armcc/LPC1833/README b/platforms_startup/armcc/LPC1833/README deleted file mode 100644 index 68e7ff413..000000000 --- a/platforms_startup/armcc/LPC1833/README +++ /dev/null @@ -1,10 +0,0 @@ -Project for LPC1833 is based on LPCOpen. Unused functions is removed to make -a small code instead of a fat one. - -Semihosting is in use. For time measurement, SystemTimer in Cortex-M3 core is -used. Any pin is not initialized. - -Debug output is done using SWO (ITM channel 0). - -Working frequency is getting from Internal RC (12 MHz), so no PLL setup is used, -no quartz is required. diff --git a/platforms_startup/armcc/LPC1833/cmsis_18xx.h b/platforms_startup/armcc/LPC1833/cmsis_18xx.h deleted file mode 100644 index a4d610fda..000000000 --- a/platforms_startup/armcc/LPC1833/cmsis_18xx.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * @brief Basic CMSIS include file for LPC18XX - * - * @note - * Copyright(C) NXP Semiconductors, 2013 - * All rights reserved. - * - * @par - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * LPC products. This software is supplied "AS IS" without any warranties of - * any kind, and NXP Semiconductors and its licensor disclaim any and - * all warranties, express or implied, including all implied warranties of - * merchantability, fitness for a particular purpose and non-infringement of - * intellectual property rights. NXP Semiconductors assumes no responsibility - * or liability for the use of the software, conveys no license or rights under any - * patent, copyright, mask work right, or any other intellectual property rights in - * or to any products. NXP Semiconductors reserves the right to make changes - * in the software without notification. NXP Semiconductors also makes no - * representation or warranty that such application will be suitable for the - * specified use without further testing or modification. - * - * @par - * Permission to use, copy, modify, and distribute this software and its - * documentation is hereby granted, under NXP Semiconductors' and its - * licensor's relevant copyrights in the software, without fee, provided that it - * is used in conjunction with NXP Semiconductors microcontrollers. This - * copyright, permission, and disclaimer notice must appear in all copies of - * this code. - */ - -#ifndef __CMSIS_18XX_H_ -#define __CMSIS_18XX_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup CMSIS_18XX CHIP: LPC18xx CMSIS include file - * @ingroup CHIP_18XX_43XX_Drivers - * @{ - */ - - #pragma diag_suppress 2525 - #pragma push - #pragma anon_unions - -/** @defgroup CMSIS_18XX_COMMON CHIP: LPC18xx Cortex CMSIS definitions - * @{ - */ - -#define __CM3_REV 0x0201 -#define __MPU_PRESENT 1 /*!< MPU present or not */ -#define __NVIC_PRIO_BITS 3 /*!< Number of Bits used for Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ -#define __FPU_PRESENT 0 /*!< FPU present or not */ - -/** - * @} - */ - -/** @defgroup CMSIS_18XX_IRQ CHIP: LPC18xx peripheral interrupt numbers - * @{ - */ - -typedef enum { - /* ------------------------- Cortex-M3 Processor Exceptions Numbers ----------------------------- */ - Reset_IRQn = -15,/*!< 1 Reset Vector, invoked on Power up and warm reset */ - NonMaskableInt_IRQn = -14,/*!< 2 Non maskable Interrupt, cannot be stopped or preempted */ - HardFault_IRQn = -13,/*!< 3 Hard Fault, all classes of Fault */ - MemoryManagement_IRQn = -12,/*!< 4 Memory Management, MPU mismatch, including Access Violation and No Match */ - BusFault_IRQn = -11,/*!< 5 Bus Fault, Pre-Fetch-, Memory Access Fault, other address/memory related Fault */ - UsageFault_IRQn = -10,/*!< 6 Usage Fault, i.e. Undef Instruction, Illegal State Transition */ - SVCall_IRQn = -5, /*!< 11 System Service Call via SVC instruction */ - DebugMonitor_IRQn = -4, /*!< 12 Debug Monitor */ - PendSV_IRQn = -2, /*!< 14 Pendable request for system service */ - SysTick_IRQn = -1, /*!< 15 System Tick Timer */ - - /* --------------------------- LPC18xx/43xx Specific Interrupt Numbers ------------------------------- */ - DAC_IRQn = 0,/*!< 0 DAC */ - RESERVED0_IRQn = 1, - DMA_IRQn = 2,/*!< 2 DMA */ - RESERVED1_IRQn = 3,/*!< 3 EZH/EDM */ - RESERVED2_IRQn = 4, - ETHERNET_IRQn = 5,/*!< 5 ETHERNET */ - SDIO_IRQn = 6,/*!< 6 SDIO */ - LCD_IRQn = 7,/*!< 7 LCD */ - USB0_IRQn = 8,/*!< 8 USB0 */ - USB1_IRQn = 9,/*!< 9 USB1 */ - SCT_IRQn = 10,/*!< 10 SCT */ - RITIMER_IRQn = 11,/*!< 11 RITIMER */ - TIMER0_IRQn = 12,/*!< 12 TIMER0 */ - TIMER1_IRQn = 13,/*!< 13 TIMER1 */ - TIMER2_IRQn = 14,/*!< 14 TIMER2 */ - TIMER3_IRQn = 15,/*!< 15 TIMER3 */ - MCPWM_IRQn = 16,/*!< 16 MCPWM */ - ADC0_IRQn = 17,/*!< 17 ADC0 */ - I2C0_IRQn = 18,/*!< 18 I2C0 */ - I2C1_IRQn = 19,/*!< 19 I2C1 */ - RESERVED3_IRQn = 20, - ADC1_IRQn = 21,/*!< 21 ADC1 */ - SSP0_IRQn = 22,/*!< 22 SSP0 */ - SSP1_IRQn = 23,/*!< 23 SSP1 */ - USART0_IRQn = 24,/*!< 24 USART0 */ - UART1_IRQn = 25,/*!< 25 UART1 */ - USART2_IRQn = 26,/*!< 26 USART2 */ - USART3_IRQn = 27,/*!< 27 USART3 */ - I2S0_IRQn = 28,/*!< 28 I2S0 */ - I2S1_IRQn = 29,/*!< 29 I2S1 */ - RESERVED4_IRQn = 30, - RESERVED5_IRQn = 31, - PIN_INT0_IRQn = 32,/*!< 32 PIN_INT0 */ - PIN_INT1_IRQn = 33,/*!< 33 PIN_INT1 */ - PIN_INT2_IRQn = 34,/*!< 34 PIN_INT2 */ - PIN_INT3_IRQn = 35,/*!< 35 PIN_INT3 */ - PIN_INT4_IRQn = 36,/*!< 36 PIN_INT4 */ - PIN_INT5_IRQn = 37,/*!< 37 PIN_INT5 */ - PIN_INT6_IRQn = 38,/*!< 38 PIN_INT6 */ - PIN_INT7_IRQn = 39,/*!< 39 PIN_INT7 */ - GINT0_IRQn = 40,/*!< 40 GINT0 */ - GINT1_IRQn = 41,/*!< 41 GINT1 */ - EVENTROUTER_IRQn = 42,/*!< 42 EVENTROUTER */ - C_CAN1_IRQn = 43,/*!< 43 C_CAN1 */ - RESERVED6_IRQn = 44, - RESERVED7_IRQn = 45,/*!< */ - ATIMER_IRQn = 46,/*!< 46 ATIMER */ - RTC_IRQn = 47,/*!< 47 RTC */ - RESERVED8_IRQn = 48, - WWDT_IRQn = 49,/*!< 49 WWDT */ - RESERVED9_IRQn = 50, - C_CAN0_IRQn = 51,/*!< 51 C_CAN0 */ - QEI_IRQn = 52 /*!< 52 QEI */ -} LPC18XX_IRQn_Type; - -/** - * @} - */ - -typedef LPC18XX_IRQn_Type IRQn_Type; - -/* Cortex-M3 processor and core peripherals */ -#include "core_cm3.h" - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* ifndef __CMSIS_18XX_H_ */ diff --git a/platforms_startup/armcc/LPC1833/core_cm3.h b/platforms_startup/armcc/LPC1833/core_cm3.h deleted file mode 100644 index 956a86b3e..000000000 --- a/platforms_startup/armcc/LPC1833/core_cm3.h +++ /dev/null @@ -1,1550 +0,0 @@ -/**************************************************************************//** - * @file core_cm3.h - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V3.20 - * @date 25. February 2013 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2013 ARM LIMITED - - 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 ARM 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS 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 __CORE_CM3_H_GENERIC -#define __CORE_CM3_H_GENERIC - -#ifdef __cplusplus - extern "C" { -#endif - - /** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup Cortex_M3 - @{ - */ - -/* CMSIS CM3 definitions */ -#define __CM3_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ -#define __CM3_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ -#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | \ - __CM3_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x03) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all -*/ -#define __FPU_USED 0 - -#include /* standard types definitions */ -#include "core_cmInstr.h" /* Core Instruction Access */ -#include "core_cmFunc.h" /* Core Function Access */ - -#endif /* __CORE_CM3_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM3_H_DEPENDANT -#define __CORE_CM3_H_DEPENDANT - - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group Cortex_M3 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#if (__CM3_REV < 0x0201) /* core r2p1 */ -#define SCB_VTOR_TBLBASE_Pos 29 /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#else -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ -#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -#else - uint32_t RESERVED1[1]; -#endif -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __O union - { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29]; - __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43]; - __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6]; - __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL << ITM_IWR_ATVALIDM_Pos) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL << ITM_IRR_ATREADYM_Pos) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL << ITM_IMCR_INTEGRATION_Pos) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL << ITM_LSR_Present_Pos) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1]; - __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1]; - __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1]; - __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL << DWT_CTRL_CYCCNTENA_Pos) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL << DWT_CPICNT_CPICNT_Pos) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL << DWT_EXCCNT_EXCCNT_Pos) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL << DWT_SLEEPCNT_SLEEPCNT_Pos) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL << DWT_LSUCNT_LSUCNT_Pos) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL << DWT_FOLDCNT_FOLDCNT_Pos) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL << DWT_MASK_MASK_Pos) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL << DWT_FUNCTION_FUNCTION_Pos) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2]; - __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55]; - __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131]; - __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759]; - __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1]; - __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39]; - __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8]; - __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL << TPI_ACPR_PRESCALER_Pos) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL << TPI_SPPR_TXMODE_Pos) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL << TPI_FFSR_FlInProg_Pos) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL << TPI_TRIGGER_TRIGGER_Pos) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL << TPI_FIFO0_ETM0_Pos) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL << TPI_ITATBCTR2_ATREADY_Pos) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL << TPI_FIFO1_ITM0_Pos) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL << TPI_ITATBCTR0_ATREADY_Pos) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL << TPI_ITCTRL_Mode_Pos) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL << TPI_DEVID_NrTraceInput_Pos) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL << TPI_DEVTYPE_SubType_Pos) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M3 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/** \brief Set Priority Grouping - - The function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - - \param [in] PriorityGroup Priority grouping field. - */ -static inline void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** \brief Get Priority Grouping - - The function reads the priority grouping field from the NVIC Interrupt Controller. - - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -static inline uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ -} - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -static inline void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -static inline void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -static inline uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -static inline void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -static inline void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Get Active Interrupt - - The function reads the active register in NVIC and returns the active bit. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - */ -static inline uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -static inline void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ - else { - NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -static inline uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ - else { - return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief Encode Priority - - The function encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the samllest possible priority group is set. - - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -static inline uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - return ( - ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | - ((SubPriority & ((1 << (SubPriorityBits )) - 1))) - ); -} - - -/** \brief Decode Priority - - The function decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -static inline void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); - *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -static inline void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -static inline uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = ticks - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** \brief ITM Send Character - - The function transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - - \param [in] ch Character to transmit. - - \returns Character to transmit. - */ -static inline uint32_t ITM_SendChar (uint32_t ch) -{ - if ((ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ - (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0].u32 == 0) __nop(); - ITM->PORT[0].u8 = (uint8_t) ch; - } - return (ch); -} - - -/** \brief ITM Receive Character - - The function inputs a character via the external variable \ref ITM_RxBuffer. - - \return Received character. - \return -1 No character pending. - */ -static inline int32_t ITM_ReceiveChar (void) { - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** \brief ITM Check Character - - The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - - \return 0 No character available. - \return 1 Character available. - */ -static inline int32_t ITM_CheckChar (void) { - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - -#endif /* __CORE_CM3_H_DEPENDANT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CMSIS_GENERIC */ - diff --git a/platforms_startup/armcc/LPC1833/core_cmFunc.h b/platforms_startup/armcc/LPC1833/core_cmFunc.h deleted file mode 100644 index 526e1ef07..000000000 --- a/platforms_startup/armcc/LPC1833/core_cmFunc.h +++ /dev/null @@ -1,312 +0,0 @@ -/**************************************************************************//** - * @file core_cmFunc.h - * @brief CMSIS Cortex-M Core Function Access Header File - * @version V3.20 - * @date 25. February 2013 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2013 ARM LIMITED - - 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 ARM 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS 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 __CORE_CMFUNC_H -#define __CORE_CMFUNC_H - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/* ARM armcc specific functions */ - -#if (__ARMCC_VERSION < 400677) - #error "Please use ARM Compiler Toolchain V4.0.677 or later!" -#endif - -/* intrinsic void __enable_irq(); */ -/* intrinsic void __disable_irq(); */ - -/** \brief Get Control Register - - This function returns the content of the Control Register. - - \return Control Register value - */ -static inline uint32_t __get_CONTROL(void) -{ - register uint32_t __regControl __asm("control"); - return(__regControl); -} - - -/** \brief Set Control Register - - This function writes the given value to the Control Register. - - \param [in] control Control Register value to set - */ -static inline void __set_CONTROL(uint32_t control) -{ - register uint32_t __regControl __asm("control"); - __regControl = control; -} - - -/** \brief Get IPSR Register - - This function returns the content of the IPSR Register. - - \return IPSR Register value - */ -static inline uint32_t __get_IPSR(void) -{ - register uint32_t __regIPSR __asm("ipsr"); - return(__regIPSR); -} - - -/** \brief Get APSR Register - - This function returns the content of the APSR Register. - - \return APSR Register value - */ -static inline uint32_t __get_APSR(void) -{ - register uint32_t __regAPSR __asm("apsr"); - return(__regAPSR); -} - - -/** \brief Get xPSR Register - - This function returns the content of the xPSR Register. - - \return xPSR Register value - */ -static inline uint32_t __get_xPSR(void) -{ - register uint32_t __regXPSR __asm("xpsr"); - return(__regXPSR); -} - - -/** \brief Get Process Stack Pointer - - This function returns the current value of the Process Stack Pointer (PSP). - - \return PSP Register value - */ -static inline uint32_t __get_PSP(void) -{ - register uint32_t __regProcessStackPointer __asm("psp"); - return(__regProcessStackPointer); -} - - -/** \brief Set Process Stack Pointer - - This function assigns the given value to the Process Stack Pointer (PSP). - - \param [in] topOfProcStack Process Stack Pointer value to set - */ -static inline void __set_PSP(uint32_t topOfProcStack) -{ - register uint32_t __regProcessStackPointer __asm("psp"); - __regProcessStackPointer = topOfProcStack; -} - - -/** \brief Get Main Stack Pointer - - This function returns the current value of the Main Stack Pointer (MSP). - - \return MSP Register value - */ -static inline uint32_t __get_MSP(void) -{ - register uint32_t __regMainStackPointer __asm("msp"); - return(__regMainStackPointer); -} - - -/** \brief Set Main Stack Pointer - - This function assigns the given value to the Main Stack Pointer (MSP). - - \param [in] topOfMainStack Main Stack Pointer value to set - */ -static inline void __set_MSP(uint32_t topOfMainStack) -{ - register uint32_t __regMainStackPointer __asm("msp"); - __regMainStackPointer = topOfMainStack; -} - - -/** \brief Get Priority Mask - - This function returns the current state of the priority mask bit from the Priority Mask Register. - - \return Priority Mask value - */ -static inline uint32_t __get_PRIMASK(void) -{ - register uint32_t __regPriMask __asm("primask"); - return(__regPriMask); -} - - -/** \brief Set Priority Mask - - This function assigns the given value to the Priority Mask Register. - - \param [in] priMask Priority Mask - */ -static inline void __set_PRIMASK(uint32_t priMask) -{ - register uint32_t __regPriMask __asm("primask"); - __regPriMask = (priMask); -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Enable FIQ - - This function enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq - - -/** \brief Disable FIQ - - This function disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq - - -/** \brief Get Base Priority - - This function returns the current value of the Base Priority register. - - \return Base Priority register value - */ -static inline uint32_t __get_BASEPRI(void) -{ - register uint32_t __regBasePri __asm("basepri"); - return(__regBasePri); -} - - -/** \brief Set Base Priority - - This function assigns the given value to the Base Priority register. - - \param [in] basePri Base Priority value to set - */ -static inline void __set_BASEPRI(uint32_t basePri) -{ - register uint32_t __regBasePri __asm("basepri"); - __regBasePri = (basePri & 0xff); -} - - -/** \brief Get Fault Mask - - This function returns the current value of the Fault Mask register. - - \return Fault Mask register value - */ -static inline uint32_t __get_FAULTMASK(void) -{ - register uint32_t __regFaultMask __asm("faultmask"); - return(__regFaultMask); -} - - -/** \brief Set Fault Mask - - This function assigns the given value to the Fault Mask register. - - \param [in] faultMask Fault Mask value to set - */ -static inline void __set_FAULTMASK(uint32_t faultMask) -{ - register uint32_t __regFaultMask __asm("faultmask"); - __regFaultMask = (faultMask & (uint32_t)1); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - -#if (__CORTEX_M == 0x04) - -/** \brief Get FPSCR - - This function returns the current value of the Floating Point Status/Control register. - - \return Floating Point Status/Control register value - */ -static inline uint32_t __get_FPSCR(void) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - register uint32_t __regfpscr __asm("fpscr"); - return(__regfpscr); -#else - return(0); -#endif -} - - -/** \brief Set FPSCR - - This function assigns the given value to the Floating Point Status/Control register. - - \param [in] fpscr Floating Point Status/Control value to set - */ -static inline void __set_FPSCR(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - register uint32_t __regfpscr __asm("fpscr"); - __regfpscr = (fpscr); -#endif -} - -#endif /* (__CORTEX_M == 0x04) */ - - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -#endif /* __CORE_CMFUNC_H */ diff --git a/platforms_startup/armcc/LPC1833/core_cmInstr.h b/platforms_startup/armcc/LPC1833/core_cmInstr.h deleted file mode 100644 index a3043476b..000000000 --- a/platforms_startup/armcc/LPC1833/core_cmInstr.h +++ /dev/null @@ -1,303 +0,0 @@ -/**************************************************************************//** - * @file core_cmInstr.h - * @brief CMSIS Cortex-M Core Instruction Access Header File - * @version V3.20 - * @date 05. March 2013 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2013 ARM LIMITED - - 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 ARM 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS 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 __CORE_CMINSTR_H -#define __CORE_CMINSTR_H - - -#pragma push -#pragma diag_suppress 667 - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* ARM armcc specific functions */ - -#if (__ARMCC_VERSION < 400677) - #error "Please use ARM Compiler Toolchain V4.0.677 or later!" -#endif - - -/** \brief No Operation - - No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __nop - - -/** \brief Wait For Interrupt - - Wait For Interrupt is a hint instruction that suspends execution - until one of a number of events occurs. - */ -#define __WFI __wfi - - -/** \brief Wait For Event - - Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -#define __WFE __wfe - - -/** \brief Send Event - - Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __sev - - -/** \brief Instruction Synchronization Barrier - - Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or - memory, after the instruction has been completed. - */ -#define __ISB() __isb(0xF) - - -/** \brief Data Synchronization Barrier - - This function acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __dsb(0xF) - - -/** \brief Data Memory Barrier - - This function ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __dmb(0xF) - - -/** \brief Reverse byte order (32 bit) - - This function reverses the byte order in integer value. - - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __rev - - -/** \brief Reverse byte order (16 bit) - - This function reverses the byte order in two unsigned short values. - - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rev16_text"))) static inline __asm uint32_t __REV16(uint32_t value) -{ - rev16 r0, r0 - bx lr -} -#endif - -/** \brief Reverse byte order in signed short value - - This function reverses the byte order in a signed short value with sign extension to integer. - - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".revsh_text"))) static inline __asm int32_t __REVSH(int32_t value) -{ - revsh r0, r0 - bx lr -} -#endif - - -/** \brief Rotate Right in unsigned value (32 bit) - - This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - - \param [in] value Value to rotate - \param [in] value Number of Bits to rotate - \return Rotated value - */ -#define __ROR __ror - - -/** \brief Breakpoint - - This function causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __breakpoint(value) - - -#if (__CORTEX_M >= 0x03) - -/** \brief Reverse bit order of value - - This function reverses the bit order of the given value. - - \param [in] value Value to reverse - \return Reversed value - */ -#define __RBIT __rbit - - -/** \brief LDR Exclusive (8 bit) - - This function performs a exclusive LDR command for 8 bit value. - - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) - - -/** \brief LDR Exclusive (16 bit) - - This function performs a exclusive LDR command for 16 bit values. - - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) - - -/** \brief LDR Exclusive (32 bit) - - This function performs a exclusive LDR command for 32 bit values. - - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) - - -/** \brief STR Exclusive (8 bit) - - This function performs a exclusive STR command for 8 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXB(value, ptr) __strex(value, ptr) - - -/** \brief STR Exclusive (16 bit) - - This function performs a exclusive STR command for 16 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXH(value, ptr) __strex(value, ptr) - - -/** \brief STR Exclusive (32 bit) - - This function performs a exclusive STR command for 32 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXW(value, ptr) __strex(value, ptr) - - -/** \brief Remove the exclusive lock - - This function removes the exclusive lock which is created by LDREX. - - */ -#define __CLREX __clrex - - -/** \brief Signed Saturate - - This function saturates a signed value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __ssat - - -/** \brief Unsigned Saturate - - This function saturates an unsigned value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __usat - - -/** \brief Count leading zeros - - This function counts the number of leading zeros of a data value. - - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __clz - -#endif /* (__CORTEX_M >= 0x03) */ - - - - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - -#pragma pop - -#endif /* __CORE_CMINSTR_H */ diff --git a/platforms_startup/armcc/LPC1833/retarget.c b/platforms_startup/armcc/LPC1833/retarget.c deleted file mode 100644 index 5be075edd..000000000 --- a/platforms_startup/armcc/LPC1833/retarget.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * @brief IO redirection support - * - * This file adds re-direction support to the library for various - * projects. It can be configured in one of 3 ways - no redirection, - * redirection via a UART, or redirection via semihosting. If DEBUG - * is not defined, all printf statements will do nothing with the - * output being throw away. If DEBUG is defined, then the choice of - * output is selected by the DEBUG_SEMIHOSTING define. If the - * DEBUG_SEMIHOSTING is not defined, then output is redirected via - * the UART. If DEBUG_SEMIHOSTING is defined, then output will be - * attempted to be redirected via semihosting. If the UART method - * is used, then the Board_UARTPutChar and Board_UARTGetChar - * functions must be defined to be used by this driver and the UART - * must already be initialized to the correct settings. - * - * @note - * Copyright(C) NXP Semiconductors, 2012 - * All rights reserved. - * - * @par - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * LPC products. This software is supplied "AS IS" without any warranties of - * any kind, and NXP Semiconductors and its licensor disclaim any and - * all warranties, express or implied, including all implied warranties of - * merchantability, fitness for a particular purpose and non-infringement of - * intellectual property rights. NXP Semiconductors assumes no responsibility - * or liability for the use of the software, conveys no license or rights under any - * patent, copyright, mask work right, or any other intellectual property rights in - * or to any products. NXP Semiconductors reserves the right to make changes - * in the software without notification. NXP Semiconductors also makes no - * representation or warranty that such application will be suitable for the - * specified use without further testing or modification. - * - * @par - * Permission to use, copy, modify, and distribute this software and its - * documentation is hereby granted, under NXP Semiconductors' and its - * licensor's relevant copyrights in the software, without fee, provided that it - * is used in conjunction with NXP Semiconductors microcontrollers. This - * copyright, permission, and disclaimer notice must appear in all copies of - * this code. - */ - - -/* Keil (Realview) support */ -#include -#include -#include -#include - -#include "cmsis_18xx.h" - - -#pragma import(__use_no_semihosting_swi) - -/* Standard IO device handles. */ -const FILEHANDLE STDIN = 0x8001; -const FILEHANDLE STDOUT = 0x8002; -const FILEHANDLE STDERR = 0x8003; - -const char __stdin_name[] = "STDIN"; -const char __stdout_name[] = "STDOUT"; -const char __stderr_name[] = "STDERR"; - -struct __FILE { int handle; /* Add whatever you need here */ }; - - - -/* number of system timer ticks */ -static time_t timer_ticks = 0; - - -FILEHANDLE _sys_open(const char *name, int openmode) -{ - FILEHANDLE rc; - /* Register standard Input Output devices. */ - if (strcmp(name, "STDIN") == 0) rc = STDIN; - else if (strcmp(name, "STDOUT") == 0) rc = STDOUT; - else if (strcmp(name, "STDERR") == 0) rc = STDERR; - else rc = -1; - return (rc); -} - - -int _sys_close(FILEHANDLE fh) -{ - return fh > 0x8000 ? 0 : 0; -} - - -/* Write to SWO */ -void _ttywrch(int ch) -{ - ITM_SendChar(ch); -} - - -int _sys_istty(FILEHANDLE fh) -{ - return fh > 0x8000 ? 1 : 0; -} - - -int _sys_seek(FILEHANDLE fh, long pos) -{ - return fh > 0x8000 ? -1 : 0; -} - - -long _sys_flen(FILEHANDLE fh) -{ - return fh > 0x8000 ? 0 : -1; -} - -/*--------------------------- _sys_tmpnam ------------------------------------*/ -int _sys_tmpnam (char *name, int sig, unsigned maxlen) -{ - return (1); -} - - -int _sys_write(FILEHANDLE fh, const unsigned char *buf, - unsigned len, int mode) -{ - int rc; - if (fh == STDOUT) { - while (len) { - _ttywrch(*buf); - buf++; - len--; - rc = 0; - } - } else if (fh > 0x8000) rc = -1; - else rc = -1; - return rc; -} - -int _sys_read(FILEHANDLE fh, unsigned char *buf, - unsigned len, int mode) -{ - return -1; -} - - -void _sys_exit(int return_code) -{ -label: - __WFI(); - goto label; /* endless loop */ -} - - -char *_sys_command_string(char *cmd, int len) -{ - const char * const arg[] = { - "tst.axf", - "-v", - "-gSimpleStringBuffer", - "-ojunit"}; - int i, j; - char *rc = cmd; - if (len) { - /* Specify commandline arguments here as needed */ - len = sizeof(arg) / sizeof(char *); - for (i = 0; i < len; i++) { - j = strlen(arg[i])+1; - if (cmd - rc + j > len) { - rc = NULL; - break; - } - memcpy(cmd, arg[i], j); - cmd += j; - } - if (rc) rc = cmd; - } else rc = NULL; - return rc; -} - - -void _clock_init(void) -{ - SysTick_Config(CGU_IRC_FREQ / 1000); /* 1 ms system ticks interrupt period */ -} - - -clock_t clock(void) -{ - return timer_ticks; -} - - -time_t time(time_t *timer) -{ - time_t rc = timer_ticks / CLOCKS_PER_SEC; - if (timer) *timer = rc; - return rc; -} - - -/* IRQ handler for Sys Tick timer */ -__irq void SysTick_Handler(void) -{ - timer_ticks++; -} - - -/* - * Замена вÑтроенной в Keil MDK-ARM функции, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñоздаёт ÑвÑзанный ÑпиÑок - * адреÑов деÑтрукторов глобальных или ÑтатичеÑких объектов в "куче" при - * инициализации окружениÑ. - * Так как не планируетÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ðµ программы, то ни один такой деÑтруктор не - * должен вызыватьÑÑ, и можно подменить Ñтандартную верÑию __aeabi_atexit на - * другую, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ будет Ñоздавать такой ÑпиÑок в "куче". - * Ð˜Ð´ÐµÑ Ð²Ð·Ñта отÑюда - * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3951.html - * Пример реализации взÑÑ‚ отÑюда - * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0041d/IHI0041D_cppabi.pdf - */ -int __aeabi_atexit(void* object, void (*destroyer)(void*), void* dso_handle) -{ - return 1; // 0: failed; non-0: OK -// return __cxa_atexit(destroyer, object, dso_handle); /* ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¸Ð· Keil MDK-ARM */ -} diff --git a/platforms_startup/armcc/LPC1833/startup_LPC18xx.asm b/platforms_startup/armcc/LPC1833/startup_LPC18xx.asm deleted file mode 100644 index b730ee5bc..000000000 --- a/platforms_startup/armcc/LPC1833/startup_LPC18xx.asm +++ /dev/null @@ -1,337 +0,0 @@ -;/*********************************************************************** -; * @brief: LPC18xx/43xx M3/M4 startup code -; * -; * @note -; * Copyright(C) NXP Semiconductors, 2012 -; * All rights reserved. -; * -; * @par -; * Software that is described herein is for illustrative purposes only -; * which provides customers with programming information regarding the -; * LPC products. This software is supplied "AS IS" without any warranties of -; * any kind, and NXP Semiconductors and its licensor disclaim any and -; * all warranties, express or implied, including all implied warranties of -; * merchantability, fitness for a particular purpose and non-infringement of -; * intellectual property rights. NXP Semiconductors assumes no responsibility -; * or liability for the use of the software, conveys no license or rights under any -; * patent, copyright, mask work right, or any other intellectual property rights in -; * or to any products. NXP Semiconductors reserves the right to make changes -; * in the software without notification. NXP Semiconductors also makes no -; * representation or warranty that such application will be suitable for the -; * specified use without further testing or modification. -; * -; * @par -; * Permission to use, copy, modify, and distribute this software and its -; * documentation is hereby granted, under NXP Semiconductors' and its -; * licensor's relevant copyrights in the software, without fee, provided that it -; * is used in conjunction with NXP Semiconductors microcontrollers. This -; * copyright, permission, and disclaimer notice must appear in all copies of -; * this code. -; */ - -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Stack_Size EQU 0x00002000 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Heap_Size EQU 0x00004000 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - -; Vector Table Mapped to Address 0 at Reset - - AREA RESET, CODE, READONLY - EXPORT __Vectors - -Sign_Value EQU 0x5A5A5A5A - -__Vectors DCD __initial_sp ; 0 Top of Stack - DCD Reset_Handler ; 1 Reset Handler - DCD NMI_Handler ; 2 NMI Handler - DCD HardFault_Handler ; 3 Hard Fault Handler - DCD MemManage_Handler ; 4 MPU Fault Handler - DCD BusFault_Handler ; 5 Bus Fault Handler - DCD UsageFault_Handler ; 6 Usage Fault Handler - DCD Sign_Value ; 7 Reserved - DCD UnHandled_Vector ; 8 Reserved - DCD UnHandled_Vector ; 9 Reserved - DCD UnHandled_Vector ; 10 Reserved - DCD SVC_Handler ; 11 SVCall Handler - DCD DebugMon_Handler ; 12 Debug Monitor Handler - DCD UnHandled_Vector ; 13 Reserved - DCD PendSV_Handler ; 14 PendSV Handler - DCD SysTick_Handler ; 15 SysTick Handler - - ; External Interrupts - DCD DAC_IRQHandler ; 16 D/A Converter - DCD M0APP_IRQHandler ; 17 M0APP IRQ handler (LPC43XX ONLY) - DCD DMA_IRQHandler ; 18 General Purpose DMA - DCD UnHandled_Vector ; 19 Reserved - DCD FLASH_EEPROM_IRQHandler ; 20 ORed flash bank A, flash bank B, EEPROM interrupts - DCD ETH_IRQHandler ; 21 Ethernet - DCD SDIO_IRQHandler ; 22 SD/MMC - DCD LCD_IRQHandler ; 23 LCD - DCD USB0_IRQHandler ; 24 USB0 - DCD USB1_IRQHandler ; 25 USB1 - DCD SCT_IRQHandler ; 26 State Configurable Timer - DCD RIT_IRQHandler ; 27 Repetitive Interrupt Timer - DCD TIMER0_IRQHandler ; 28 Timer0 - DCD TIMER1_IRQHandler ; 29 Timer1 - DCD TIMER2_IRQHandler ; 30 Timer2 - DCD TIMER3_IRQHandler ; 31 Timer3 - DCD MCPWM_IRQHandler ; 32 Motor Control PWM - DCD ADC0_IRQHandler ; 33 A/D Converter 0 - DCD I2C0_IRQHandler ; 34 I2C0 - DCD I2C1_IRQHandler ; 35 I2C1 - DCD SPI_IRQHandler ; 36 SPI (LPC43XX ONLY) - DCD ADC1_IRQHandler ; 37 A/D Converter 1 - DCD SSP0_IRQHandler ; 38 SSP0 - DCD SSP1_IRQHandler ; 39 SSP1 - DCD UART0_IRQHandler ; 40 UART0 - DCD UART1_IRQHandler ; 41 UART1 - DCD UART2_IRQHandler ; 42 UART2 - DCD UART3_IRQHandler ; 43 UART3 - DCD I2S0_IRQHandler ; 44 I2S0 - DCD I2S1_IRQHandler ; 45 I2S1 - DCD SPIFI_IRQHandler ; 46 SPI Flash Interface - DCD SGPIO_IRQHandler ; 47 SGPIO (LPC43XX ONLY) - DCD GPIO0_IRQHandler ; 48 GPIO0 - DCD GPIO1_IRQHandler ; 49 GPIO1 - DCD GPIO2_IRQHandler ; 50 GPIO2 - DCD GPIO3_IRQHandler ; 51 GPIO3 - DCD GPIO4_IRQHandler ; 52 GPIO4 - DCD GPIO5_IRQHandler ; 53 GPIO5 - DCD GPIO6_IRQHandler ; 54 GPIO6 - DCD GPIO7_IRQHandler ; 55 GPIO7 - DCD GINT0_IRQHandler ; 56 GINT0 - DCD GINT1_IRQHandler ; 57 GINT1 - DCD EVRT_IRQHandler ; 58 Event Router - DCD CAN1_IRQHandler ; 59 C_CAN1 - DCD UnHandled_Vector ; 60 Reserved - DCD ADCHS_IRQHandler ; 61 ADCHS combined interrupt - DCD ATIMER_IRQHandler ; 62 ATIMER - DCD RTC_IRQHandler ; 63 RTC - DCD UnHandled_Vector ; 64 Reserved - DCD WDT_IRQHandler ; 65 WDT - DCD M0SUB_IRQHandler ; 66 M0SUB IRQ handler (LPC43XX ONLY) - DCD CAN0_IRQHandler ; 67 C_CAN0 - DCD QEI_IRQHandler ; 68 QEI - - -; IF :LNOT::DEF:NO_CRP -; AREA |.ARM.__at_0x02FC|, CODE, READONLY -;CRP_Key DCD 0xFFFFFFFF -; ENDIF - - AREA |.text|, CODE, READONLY - -; Reset Handler - -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP -BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP -UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP -UnHandled_Vector PROC - EXPORT UnHandled_Vector [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT DAC_IRQHandler [WEAK] - EXPORT M0APP_IRQHandler [WEAK] - EXPORT DMA_IRQHandler [WEAK] - EXPORT FLASH_EEPROM_IRQHandler [WEAK] - EXPORT ETH_IRQHandler [WEAK] - EXPORT SDIO_IRQHandler [WEAK] - EXPORT LCD_IRQHandler [WEAK] - EXPORT USB0_IRQHandler [WEAK] - EXPORT USB1_IRQHandler [WEAK] - EXPORT SCT_IRQHandler [WEAK] - EXPORT RIT_IRQHandler [WEAK] - EXPORT TIMER0_IRQHandler [WEAK] - EXPORT TIMER1_IRQHandler [WEAK] - EXPORT TIMER2_IRQHandler [WEAK] - EXPORT TIMER3_IRQHandler [WEAK] - EXPORT MCPWM_IRQHandler [WEAK] - EXPORT ADC0_IRQHandler [WEAK] - EXPORT I2C0_IRQHandler [WEAK] - EXPORT I2C1_IRQHandler [WEAK] - EXPORT SPI_IRQHandler [WEAK] - EXPORT ADC1_IRQHandler [WEAK] - EXPORT SSP0_IRQHandler [WEAK] - EXPORT SSP1_IRQHandler [WEAK] - EXPORT UART0_IRQHandler [WEAK] - EXPORT UART1_IRQHandler [WEAK] - EXPORT UART2_IRQHandler [WEAK] - EXPORT UART3_IRQHandler [WEAK] - EXPORT I2S0_IRQHandler [WEAK] - EXPORT I2S1_IRQHandler [WEAK] - EXPORT SPIFI_IRQHandler [WEAK] - EXPORT SGPIO_IRQHandler [WEAK] - EXPORT GPIO0_IRQHandler [WEAK] - EXPORT GPIO1_IRQHandler [WEAK] - EXPORT GPIO2_IRQHandler [WEAK] - EXPORT GPIO3_IRQHandler [WEAK] - EXPORT GPIO4_IRQHandler [WEAK] - EXPORT GPIO5_IRQHandler [WEAK] - EXPORT GPIO6_IRQHandler [WEAK] - EXPORT GPIO7_IRQHandler [WEAK] - EXPORT GINT0_IRQHandler [WEAK] - EXPORT GINT1_IRQHandler [WEAK] - EXPORT EVRT_IRQHandler [WEAK] - EXPORT CAN1_IRQHandler [WEAK] - EXPORT ADCHS_IRQHandler [WEAK] - EXPORT ATIMER_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT WDT_IRQHandler [WEAK] - EXPORT M0SUB_IRQHandler [WEAK] - EXPORT CAN0_IRQHandler [WEAK] - EXPORT QEI_IRQHandler [WEAK] - -DAC_IRQHandler -M0APP_IRQHandler -DMA_IRQHandler -FLASH_EEPROM_IRQHandler -ETH_IRQHandler -SDIO_IRQHandler -LCD_IRQHandler -USB0_IRQHandler -USB1_IRQHandler -SCT_IRQHandler -RIT_IRQHandler -TIMER0_IRQHandler -TIMER1_IRQHandler -TIMER2_IRQHandler -TIMER3_IRQHandler -MCPWM_IRQHandler -ADC0_IRQHandler -I2C0_IRQHandler -I2C1_IRQHandler -SPI_IRQHandler -ADC1_IRQHandler -SSP0_IRQHandler -SSP1_IRQHandler -UART0_IRQHandler -UART1_IRQHandler -UART2_IRQHandler -UART3_IRQHandler -I2S0_IRQHandler -I2S1_IRQHandler -SPIFI_IRQHandler -SGPIO_IRQHandler -GPIO0_IRQHandler -GPIO1_IRQHandler -GPIO2_IRQHandler -GPIO3_IRQHandler -GPIO4_IRQHandler -GPIO5_IRQHandler -GPIO6_IRQHandler -GPIO7_IRQHandler -GINT0_IRQHandler -GINT1_IRQHandler -EVRT_IRQHandler -CAN1_IRQHandler -ADCHS_IRQHandler -ATIMER_IRQHandler -RTC_IRQHandler -WDT_IRQHandler -M0SUB_IRQHandler -CAN0_IRQHandler -QEI_IRQHandler - - B . - - ENDP - - ALIGN - -; User Initial Stack & Heap - - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_setup_stackheap -__user_setup_stackheap - - LDR R0, = Heap_Mem - LDR R2, = (Heap_Mem + Heap_Size) - LDR SP, =(Stack_Mem + Stack_Size) - BX LR - - ALIGN - - ENDIF - - END - diff --git a/platforms_startup/armcc/LPC1833/sysinit.c b/platforms_startup/armcc/LPC1833/sysinit.c deleted file mode 100644 index 9f732581c..000000000 --- a/platforms_startup/armcc/LPC1833/sysinit.c +++ /dev/null @@ -1,45 +0,0 @@ -#include "cmsis_18xx.h" - -typedef struct { /*!< CREG Structure */ - __I uint32_t RESERVED0; - __IO uint32_t CREG0; /*!< Chip configuration register 32 kHz oscillator output and BOD control register. */ - __I uint32_t RESERVED1[62]; - __IO uint32_t MXMEMMAP; /*!< ARM Cortex-M3/M4 memory mapping */ - __I uint32_t RESERVED2[5]; - __IO uint32_t CREG5; /*!< Chip configuration register 5. Controls JTAG access. */ - __IO uint32_t DMAMUX; /*!< DMA muxing control */ - __IO uint32_t FLASHCFGA; /*!< Flash accelerator configuration register for flash bank A */ - __IO uint32_t FLASHCFGB; /*!< Flash accelerator configuration register for flash bank B */ - __IO uint32_t ETBCFG; /*!< ETB RAM configuration */ - __IO uint32_t CREG6; /*!< Chip configuration register 6. */ - __I uint32_t RESERVED4[52]; - __I uint32_t CHIPID; /*!< Part ID */ - __I uint32_t RESERVED5[191]; - __IO uint32_t USB0FLADJ; /*!< USB0 frame length adjust register */ - __I uint32_t RESERVED9[63]; - __IO uint32_t USB1FLADJ; /*!< USB1 frame length adjust register */ -} LPC_CREG_T; - -#define LPC_CREG_BASE 0x40043000 -#define LPC_CREG ((LPC_CREG_T *) LPC_CREG_BASE) - -static inline void Chip_CREG_SetFlashAcceleration(uint32_t Hz) -{ - uint32_t FAValue = Hz / 21510000; - - LPC_CREG->FLASHCFGA = (LPC_CREG->FLASHCFGA & (~(0xF << 12))) | (FAValue << 12); - LPC_CREG->FLASHCFGB = (LPC_CREG->FLASHCFGB & (~(0xF << 12))) | (FAValue << 12); -} - - -/* Set up and initialize hardware prior to call to main */ -void SystemInit(void) -{ - unsigned int *pSCB_VTOR = (unsigned int *) 0xE000ED08; - - extern void *__Vectors; - *pSCB_VTOR = (unsigned int) &__Vectors; - - Chip_CREG_SetFlashAcceleration(CGU_IRC_FREQ); -} - From 5b042a3ace6fbe2bd596847dbeeeb8ce47c8d47b Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Fri, 20 May 2016 13:04:20 +0100 Subject: [PATCH 0212/1345] Changes as discussed with basvodde --- include/CppUTest/SimpleString.h | 3 ++- src/CppUTest/SimpleString.cpp | 7 ++++++- tests/SimpleStringTest.cpp | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index c8aca4e78..b15f28d40 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -78,7 +78,8 @@ class SimpleString void replace(const char* to, const char* with); SimpleString lowerCase() const; - SimpleString subString(size_t beginPos, size_t amount = SimpleString::npos) const; + SimpleString subString(size_t beginPos) const; + SimpleString subString(size_t beginPos, size_t amount) const; SimpleString subStringFromTill(char startChar, char lastExcludedChar) const; void copyToBuffer(char* buffer, size_t bufferSize) const; diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 999018ce7..563f1e44e 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -369,6 +369,11 @@ SimpleString SimpleString::subString(size_t beginPos, size_t amount) const return newString; } +SimpleString SimpleString::subString(size_t beginPos) const +{ + return subString(beginPos, npos); +} + char SimpleString::at(size_t pos) const { return buffer_[pos]; @@ -393,7 +398,7 @@ SimpleString SimpleString::subStringFromTill(char startChar, char lastExcludedCh if (beginPos == npos) return ""; size_t endPos = findFrom(beginPos, lastExcludedChar); - if (endPos == npos) return subString(beginPos, size()); + if (endPos == npos) return subString(beginPos); return subString(beginPos, endPos - beginPos); } diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 3dedb94e1..3d0978912 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -370,7 +370,7 @@ TEST(SimpleString, subStringFromPos5WithAmountLargerThanString) STRCMP_EQUAL("World", str.subString(6, 10).asCharString()); } -TEST(SimpleString, subStringFromPos3ToEndOfStringUsingNposAsDefault) +TEST(SimpleString, subStringFromPos6ToEndOfString) { SimpleString str("Hello World"); STRCMP_EQUAL("World", str.subString(6).asCharString()); From a7219a442923a1a31532111dfed31e605889b0f3 Mon Sep 17 00:00:00 2001 From: liu nick Date: Sun, 22 May 2016 13:15:48 +0800 Subject: [PATCH 0213/1345] 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 0214/1345] 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 0215/1345] 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 7a8a2ef8ed07d7d1049e2988ad36fee85e96a66a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sun, 22 May 2016 21:52:44 +0800 Subject: [PATCH 0216/1345] Need -Werror for flag checking --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index dbbe9ec96..db37bd265 100644 --- a/configure.ac +++ b/configure.ac @@ -104,13 +104,13 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]])], [AC_MSG_RESULT([yes] CXXFLAGS="$saved_cxxflags" # Flag -Wno-c++98-compat -CXXFLAGS="-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])]) CXXFLAGS="$saved_cxxflags" # Flag -Wno-c++98-compat-pedantic -CXXFLAGS="-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])]) CXXFLAGS="$saved_cxxflags" From bc3a3d003f7330fc20dd5b8597499ce1082318fb Mon Sep 17 00:00:00 2001 From: Arno Moonen Date: Sat, 21 May 2016 11:02:41 +0200 Subject: [PATCH 0217/1345] 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 0d6576237bbf353581be97a01fd457030e60b89a Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 23 May 2016 09:57:33 +0800 Subject: [PATCH 0218/1345] Remove compile error for MacOSX --- examples/AllTests/FEDemoTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/AllTests/FEDemoTest.cpp b/examples/AllTests/FEDemoTest.cpp index 06483051d..7259c4ec6 100644 --- a/examples/AllTests/FEDemoTest.cpp +++ b/examples/AllTests/FEDemoTest.cpp @@ -78,7 +78,7 @@ IGNORE_TEST(FE_Demo, should_fail_when__FE_INEXACT____is_set) { IEEE754ExceptionsPlugin::enableInexact(); f = 10.0f; - DOUBLES_EQUAL(f / 3.0f, 3.333f, 0.001f); + DOUBLES_EQUAL((double) (f / 3.0f), (double) 3.333f, (double) 0.001f); } TEST(FE_Demo, should_succeed_when_no_flags_are_set) From dd6902fd53368ad6b860ba4854bf85473543a04d Mon Sep 17 00:00:00 2001 From: "Arnd R. Strube" Date: Mon, 23 May 2016 07:32:55 +0100 Subject: [PATCH 0219/1345] Add interface to compare byte-sized data as decimals --- include/CppUTest/SimpleString.h | 1 + include/CppUTest/TestFailure.h | 6 ++++ include/CppUTest/TestHarness_c.h | 10 ++++++ include/CppUTest/Utest.h | 1 + include/CppUTest/UtestMacros.h | 12 +++++++ src/CppUTest/SimpleString.cpp | 10 ++++++ src/CppUTest/TestFailure.cpp | 18 +++++++++++ src/CppUTest/TestHarness_c.cpp | 10 ++++++ src/CppUTest/Utest.cpp | 7 +++++ tests/SimpleStringTest.cpp | 15 +++++++-- tests/TestHarness_cTest.cpp | 32 +++++++++++++++++++ tests/TestUTestMacro.cpp | 54 ++++++++++++++++++++++++++++++++ 12 files changed, 174 insertions(+), 2 deletions(-) diff --git a/include/CppUTest/SimpleString.h b/include/CppUTest/SimpleString.h index b15f28d40..79293b3ac 100644 --- a/include/CppUTest/SimpleString.h +++ b/include/CppUTest/SimpleString.h @@ -146,6 +146,7 @@ SimpleString StringFrom(long value); SimpleString StringFrom(unsigned long value); SimpleString StringFrom(cpputest_longlong value); SimpleString StringFrom(cpputest_ulonglong value); +SimpleString HexStringFrom(signed char value); SimpleString HexStringFrom(long value); SimpleString HexStringFrom(unsigned long value); SimpleString HexStringFrom(cpputest_longlong value); diff --git a/include/CppUTest/TestFailure.h b/include/CppUTest/TestFailure.h index 9bb1f9b04..f13714f51 100644 --- a/include/CppUTest/TestFailure.h +++ b/include/CppUTest/TestFailure.h @@ -147,6 +147,12 @@ class UnsignedLongLongsEqualFailure : public TestFailure UnsignedLongLongsEqualFailure(UtestShell* test, const char* fileName, int 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); +}; + class StringEqualFailure : public TestFailure { public: diff --git a/include/CppUTest/TestHarness_c.h b/include/CppUTest/TestHarness_c.h index db059c48d..50c6cd218 100644 --- a/include/CppUTest/TestHarness_c.h +++ b/include/CppUTest/TestHarness_c.h @@ -45,6 +45,12 @@ #define CHECK_EQUAL_C_CHAR(expected,actual) \ CHECK_EQUAL_C_CHAR_LOCATION(expected,actual,__FILE__,__LINE__) +#define CHECK_EQUAL_C_UBYTE(expected,actual) \ + CHECK_EQUAL_C_UBYTE_LOCATION(expected,actual,__FILE__,__LINE__) + +#define CHECK_EQUAL_C_SBYTE(expected,actual) \ + CHECK_EQUAL_C_SBYTE_LOCATION(expected,actual,__FILE__,__LINE__) + #define CHECK_EQUAL_C_STRING(expected,actual) \ CHECK_EQUAL_C_STRING_LOCATION(expected,actual,__FILE__,__LINE__) @@ -120,6 +126,10 @@ 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, const char* fileName, int lineNumber); +extern void CHECK_EQUAL_C_UBYTE_LOCATION(unsigned char expected, unsigned char actual, + const char* fileName, int lineNumber); +extern void CHECK_EQUAL_C_SBYTE_LOCATION(signed char expected, signed char actual, + const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_STRING_LOCATION(const char* expected, const char* actual, const char* fileName, int lineNumber); extern void CHECK_EQUAL_C_POINTER_LOCATION(const void* expected, diff --git a/include/CppUTest/Utest.h b/include/CppUTest/Utest.h index 83509d899..7bb560fd9 100755 --- a/include/CppUTest/Utest.h +++ b/include/CppUTest/Utest.h @@ -115,6 +115,7 @@ class UtestShell 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()); diff --git a/include/CppUTest/UtestMacros.h b/include/CppUTest/UtestMacros.h index 448ecf71d..d38367d16 100755 --- a/include/CppUTest/UtestMacros.h +++ b/include/CppUTest/UtestMacros.h @@ -232,6 +232,18 @@ #define BYTES_EQUAL_TEXT(expected, actual, text)\ LONGS_EQUAL_TEXT((expected) & 0xff, (actual) & 0xff, text) +#define SIGNED_BYTES_EQUAL(expected, actual)\ + 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); } + +#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); } + #define POINTERS_EQUAL(expected, actual)\ POINTERS_EQUAL_LOCATION((expected), (actual), NULL, __FILE__, __LINE__) diff --git a/src/CppUTest/SimpleString.cpp b/src/CppUTest/SimpleString.cpp index 563f1e44e..b63fcc935 100644 --- a/src/CppUTest/SimpleString.cpp +++ b/src/CppUTest/SimpleString.cpp @@ -478,6 +478,16 @@ SimpleString HexStringFrom(long value) return StringFromFormat("%lx", value); } +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)); + } + return result; +} + SimpleString HexStringFrom(unsigned long value) { return StringFromFormat("%lx", value); diff --git a/src/CppUTest/TestFailure.cpp b/src/CppUTest/TestFailure.cpp index d98fd20a4..a077578dd 100644 --- a/src/CppUTest/TestFailure.cpp +++ b/src/CppUTest/TestFailure.cpp @@ -308,6 +308,24 @@ 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) +: TestFailure(test, fileName, lineNumber) +{ + 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; + message_ += createButWasString(expectedReported, actualReported); +} + StringEqualFailure::StringEqualFailure(UtestShell* test, const char* fileName, int lineNumber, const char* expected, const char* actual, const SimpleString& text) : TestFailure(test, fileName, lineNumber) { diff --git a/src/CppUTest/TestHarness_c.cpp b/src/CppUTest/TestHarness_c.cpp index 29f939f87..6fb9d3c29 100644 --- a/src/CppUTest/TestHarness_c.cpp +++ b/src/CppUTest/TestHarness_c.cpp @@ -50,6 +50,16 @@ void CHECK_EQUAL_C_CHAR_LOCATION(char expected, char actual, const char* fileNam UtestShell::getCurrent()->assertEquals(((expected) != (actual)), StringFrom(expected).asCharString(), StringFrom(actual).asCharString(), NULL, 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()); +} + +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()); +} + 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()); diff --git a/src/CppUTest/Utest.cpp b/src/CppUTest/Utest.cpp index 3bc31960e..14a025182 100755 --- a/src/CppUTest/Utest.cpp +++ b/src/CppUTest/Utest.cpp @@ -455,6 +455,13 @@ 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) +{ + 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) { getTestResult()->countCheck(); diff --git a/tests/SimpleStringTest.cpp b/tests/SimpleStringTest.cpp index 3d0978912..bd4997a38 100644 --- a/tests/SimpleStringTest.cpp +++ b/tests/SimpleStringTest.cpp @@ -482,8 +482,17 @@ TEST(SimpleString, FunctionPointers) TEST(SimpleString, Characters) { SimpleString s(StringFrom('a')); - SimpleString s2(StringFrom('a')); - CHECK(s == s2); + STRCMP_EQUAL("a", s.asCharString()); +} + +TEST(SimpleString, NegativeSignedBytes) +{ + STRCMP_EQUAL("-15", StringFrom((signed char)-15).asCharString()); +} + +TEST(SimpleString, PositiveSignedBytes) +{ + STRCMP_EQUAL("4", StringFrom(4).asCharString()); } TEST(SimpleString, LongInts) @@ -554,6 +563,8 @@ TEST(SimpleString, Sizes) TEST(SimpleString, HexStrings) { + STRCMP_EQUAL("f3", HexStringFrom((signed char)-13).asCharString()); + SimpleString h1 = HexStringFrom(0xffffL); STRCMP_EQUAL("ffff", h1.asCharString()); diff --git a/tests/TestHarness_cTest.cpp b/tests/TestHarness_cTest.cpp index 3d752a57c..531c0b0b2 100644 --- a/tests/TestHarness_cTest.cpp +++ b/tests/TestHarness_cTest.cpp @@ -131,6 +131,38 @@ TEST(TestHarness_c, checkChar) CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) } +static void _failUnsignedByteMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_UBYTE(254, 253); +} + +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("arness_c"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + +static void _failSignedByteMethod() +{ + HasTheDestructorBeenCalledChecker checker; + CHECK_EQUAL_C_SBYTE(-3, -5); +} + +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("arness_c"); + CHECK(!hasDestructorOfTheDestructorCheckedBeenCalled) +} + static void _failStringMethod() { HasTheDestructorBeenCalledChecker checker; diff --git a/tests/TestUTestMacro.cpp b/tests/TestUTestMacro.cpp index 6fad64b6a..04b7347ee 100755 --- a/tests/TestUTestMacro.cpp +++ b/tests/TestUTestMacro.cpp @@ -586,6 +586,60 @@ 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() +{ + SIGNED_BYTES_EQUAL(-1, -2); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} + +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>"); +#else + CHECK_TEST_FAILS_PROPER_WITH_TEXT("expected <-1 0xff>"); + CHECK_TEST_FAILS_PROPER_WITH_TEXT("but was <-2 0xfe>"); +#endif +} + +TEST(UnitTestMacros, CHARS_EQUALBehavesAsProperMacro) +{ + 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 +} // LCOV_EXCL_LINE + +static void _failingTestMethodWithSIGNED_BYTES_EQUAL_TEXT() +{ + SIGNED_BYTES_EQUAL_TEXT(-127, -126, "Failed because it failed"); + TestTestingFixture::lineExecutedAfterCheck(); // LCOV_EXCL_LINE +} + +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("Failed because it failed"); +} + +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") +} + +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() { POINTERS_EQUAL((void*)0xa5a5, (void*)0xf0f0); From d14e4e373d9decb8e2869fe44ca1286dff4f6a03 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Mon, 23 May 2016 21:52:35 +0800 Subject: [PATCH 0220/1345] Refactored the C++ warning flag checking --- cmake/Modules/CppUTestWarningFlags.cmake | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/cmake/Modules/CppUTestWarningFlags.cmake b/cmake/Modules/CppUTestWarningFlags.cmake index 143b182d0..57330aafb 100644 --- a/cmake/Modules/CppUTestWarningFlags.cmake +++ b/cmake/Modules/CppUTestWarningFlags.cmake @@ -56,18 +56,16 @@ else (MSVC) Wno-old-style-cast ) + if (C++11) + set(WARNING_CXX_FLAGS + ${WARNING_CXX_FLAGS} + Wno-c++98-compat + Wno-c++98-compat-pedantic + ) + endif (C++11) + 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}) - if (C++11) - check_cxx_compiler_flag("-Wno-c++98-compat" NO_WARNING_CXX_98_COMPAT_FLAG) - check_cxx_compiler_flag("-Wno-c++98-compat-pedantic" NO_WARNING_CXX_98_COMPAT_PEDANTIC_FLAG) - if (NO_WARNING_CXX_98_COMPAT_FLAG) - set(CPPUTEST_CXX_WARNING_FLAGS "${CPPUTEST_CXX_WARNING_FLAGS} -Wno-c++98-compat") - endif (NO_WARNING_CXX_98_COMPAT_FLAG) - if (NO_WARNING_CXX_98_COMPAT_PEDANTIC_FLAG) - set(CPPUTEST_CXX_WARNING_FLAGS "${CPPUTEST_CXX_WARNING_FLAGS} -Wno-c++98-compat-pedantic") - endif (NO_WARNING_CXX_98_COMPAT_PEDANTIC_FLAG) - endif (C++11) endif (MSVC) From 599adb5c450001e8abd4fc880b25b6d869c9b700 Mon Sep 17 00:00:00 2001 From: liu nick Date: Mon, 23 May 2016 22:52:05 +0800 Subject: [PATCH 0221/1345] 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 b5b70803f1a63dc6259b9bad3cfd5d35fcf7e8d5 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 24 May 2016 11:23:08 +0800 Subject: [PATCH 0222/1345] Remove the flag out of the variable names so that the C++ flags can also be added there --- 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 57330aafb..36f7067ea 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_${flag}) - if (WARNING_CXX_FLAG_${flag}) + check_cxx_compiler_flag("-${flag}" WARNING_CXX_FLAG_TO_CHECK) + if (WARNING_CXX_FLAG_TO_CHECK) set(CPPUTEST_CXX_WARNING_FLAGS "${CPPUTEST_CXX_WARNING_FLAGS} -${flag}") - endif (WARNING_CXX_FLAG_${flag}) + endif (WARNING_CXX_FLAG_TO_CHECK) endforeach (flag) endmacro(check_and_append_cxx_warning_flags) From 54d8beef7f4d2647838fdd4c115e6cce4c3aaac1 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Tue, 24 May 2016 16:58:42 +0800 Subject: [PATCH 0223/1345] Included operator delete with size for new gcc --- include/CppUTest/MemoryLeakDetectorNewMacros.h | 6 ++++-- src/CppUTest/MemoryLeakWarningPlugin.cpp | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/include/CppUTest/MemoryLeakDetectorNewMacros.h b/include/CppUTest/MemoryLeakDetectorNewMacros.h index a611dd096..02798e9f8 100644 --- a/include/CppUTest/MemoryLeakDetectorNewMacros.h +++ b/include/CppUTest/MemoryLeakDetectorNewMacros.h @@ -38,10 +38,12 @@ 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) UT_NOTHROW; - void operator delete[](void* mem) UT_NOTHROW; 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) UT_NOTHROW; + void operator delete[](void* mem) UT_NOTHROW; + void operator delete (void* mem, size_t size) UT_NOTHROW; + void operator delete[] (void* mem, size_t size) UT_NOTHROW; #endif diff --git a/src/CppUTest/MemoryLeakWarningPlugin.cpp b/src/CppUTest/MemoryLeakWarningPlugin.cpp index 6c4cb1a9a..00d6e164a 100644 --- a/src/CppUTest/MemoryLeakWarningPlugin.cpp +++ b/src/CppUTest/MemoryLeakWarningPlugin.cpp @@ -319,6 +319,11 @@ void operator delete(void* mem, const char*, int) UT_NOTHROW operator_delete_fptr(mem); } +void operator delete (void* mem, size_t) UT_NOTHROW +{ + operator_delete_fptr(mem); +} + void* operator new[](size_t size) UT_THROW(std::bad_alloc) { return operator_new_array_fptr(size); @@ -339,6 +344,10 @@ void operator delete[](void* mem, const char*, int) UT_NOTHROW operator_delete_array_fptr(mem); } +void operator delete[] (void* mem, size_t) UT_NOTHROW +{ + operator_delete_array_fptr(mem); +} #if CPPUTEST_USE_STD_CPP_LIB From 42f420f5242a99adea50e40f0d05162695eed662 Mon Sep 17 00:00:00 2001 From: liu nick Date: Tue, 24 May 2016 22:14:02 +0800 Subject: [PATCH 0224/1345] 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 0225/1345] 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 7ed013940615d0895e7e509d4b4325b723610181 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 25 May 2016 09:54:12 +0800 Subject: [PATCH 0226/1345] Added tests for the operator delete with sizeof as additional parameter --- tests/MemoryOperatorOverloadTest.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/MemoryOperatorOverloadTest.cpp b/tests/MemoryOperatorOverloadTest.cpp index 4731e8fc6..343f16988 100644 --- a/tests/MemoryOperatorOverloadTest.cpp +++ b/tests/MemoryOperatorOverloadTest.cpp @@ -38,6 +38,15 @@ TEST(BasicBehavior, deleteInvalidatesMemory) CHECK(*memory != 0xAD); } +TEST(BasicBehavior, DeleteWithSizeParameterWorks) +{ + char* charMemory = new char; + char* charArrayMemory = new char[10]; + ::operator delete(charMemory, sizeof(char)); + ::operator delete[](charArrayMemory, sizeof(char)* 10); +} + + static void deleteUnallocatedMemory() { delete (char*) 0x1234678; From f4b55c39b7c852ef94ec72dd284da7081658e2fe Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 25 May 2016 13:39:56 +0800 Subject: [PATCH 0227/1345] Removed test that fails before release :P --- 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 c4c223f82..b9400c5a3 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); } -TEST(FE__with_Plugin, should_not_fail_again_when_test_has_already_failed) +IGNORE_TEST(FE__with_Plugin, should_not_fail_again_when_test_has_already_failed) { fixture.setTestFunction(set_everything_but_already_failed); fixture.runAllTests(); From e25097614e1c4856036366877a02346c4b36bb5b Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 25 May 2016 13:41:47 +0800 Subject: [PATCH 0228/1345] Bumped up the version number --- CMakeLists.txt | 2 +- configure.ac | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 28d183bfd..b1900bb37 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ project(CppUTest) set(CppUTest_version_major 3) -set(CppUTest_version_minor 7.2) +set(CppUTest_version_minor 8) # 2.6.3 is needed for ctest support cmake_minimum_required(VERSION 2.8.7) diff --git a/configure.ac b/configure.ac index db37bd265..43d89a3cb 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.68]) -AC_INIT([CppUTest], [3.7.2], [https://github.com/cpputest/cpputest]) +AC_INIT([CppUTest], [3.8], [https://github.com/cpputest/cpputest]) AM_INIT_AUTOMAKE([subdir-objects]) AC_CONFIG_SRCDIR([src/CppUTest/Utest.cpp]) AC_CONFIG_HEADERS([config.h]) From 5c1c766c442b7c2fca3485ebeb2c54762d264070 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 25 May 2016 14:56:29 +0800 Subject: [PATCH 0229/1345] 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 0230/1345] 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 0231/1345] 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 0232/1345] 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 0233/1345] 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 0234/1345] 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 0235/1345] 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 0236/1345] 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 0237/1345] 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 0238/1345] 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 0239/1345] 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 0240/1345] 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 0241/1345] 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 0242/1345] 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 0243/1345] 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 0244/1345] 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 0245/1345] 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 0246/1345] 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 0247/1345] 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 0248/1345] 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 0249/1345] 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 0250/1345] 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 0251/1345] 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 0252/1345] 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 0253/1345] 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 0254/1345] 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 0255/1345] 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 0256/1345] 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 0257/1345] 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 0258/1345] 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 0259/1345] 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 0260/1345] 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 0261/1345] 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 0262/1345] 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 0263/1345] 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 0264/1345] 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 0265/1345] 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 0266/1345] 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 0267/1345] 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 0268/1345] 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 0269/1345] 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 0270/1345] 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 0271/1345] 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 0272/1345] 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 0273/1345] 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 0274/1345] 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 0275/1345] 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 0276/1345] 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 0277/1345] 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 0278/1345] 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 0279/1345] 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 0280/1345] 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 0281/1345] 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 0282/1345] 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 0283/1345] 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 0284/1345] 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 0285/1345] 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 0286/1345] 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 0287/1345] 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 0288/1345] 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 0289/1345] 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 0290/1345] 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 0291/1345] 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 0292/1345] 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 0293/1345] 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 0294/1345] 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 0295/1345] 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 0296/1345] 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 0297/1345] 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 0298/1345] 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 0299/1345] 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 0300/1345] 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 0342/1345] 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 0343/1345] 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 0344/1345] 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 0345/1345] 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 0346/1345] 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 0347/1345] 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 0348/1345] 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 0349/1345] 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 0350/1345] 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 0351/1345] 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 0352/1345] 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 0353/1345] 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 0354/1345] 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 0355/1345] 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 0356/1345] 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 0357/1345] 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 0358/1345] 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 0359/1345] 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 0360/1345] 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 0361/1345] 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 0362/1345] 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 0363/1345] 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 0364/1345] 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 0365/1345] 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 0366/1345] 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 0367/1345] 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 0368/1345] 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 0369/1345] 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 0370/1345] 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 0371/1345] 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 0372/1345] 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 0373/1345] 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 0374/1345] 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 0375/1345] 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 0376/1345] 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 0377/1345] 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 0378/1345] 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 0379/1345] 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 0380/1345] 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 0381/1345] 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 0382/1345] 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 0383/1345] 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 0384/1345] 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 0385/1345] 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 0386/1345] 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 0387/1345] 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 0388/1345] 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 0389/1345] 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 0390/1345] 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 0391/1345] 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 0392/1345] 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 0393/1345] 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 0394/1345] 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 0395/1345] 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 0396/1345] 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 0397/1345] [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 0398/1345] 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 0399/1345] 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 0400/1345] 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 0401/1345] 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 0402/1345] 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 0403/1345] 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 0404/1345] 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 0405/1345] 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 0406/1345] 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 0407/1345] 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 0408/1345] 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 0409/1345] 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 0410/1345] 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 0411/1345] 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 0412/1345] 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 0413/1345] 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 0414/1345] 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 0415/1345] 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 0416/1345] 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 0417/1345] 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 0418/1345] 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 0419/1345] 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 0420/1345] 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 0421/1345] 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 0422/1345] 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 0423/1345] 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 0424/1345] 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 0425/1345] 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 0426/1345] 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 0427/1345] 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 0428/1345] 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 0429/1345] 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 0430/1345] 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 0431/1345] 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 0432/1345] 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 0433/1345] 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 0434/1345] 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 0435/1345] 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 0436/1345] 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 0437/1345] 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 0438/1345] 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 0439/1345] 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 0440/1345] 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 0441/1345] 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 0442/1345] 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 0443/1345] 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 0444/1345] 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 0445/1345] 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 0446/1345] 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 0447/1345] 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 0448/1345] 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 0449/1345] 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 0450/1345] 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 0451/1345] 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 0452/1345] 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 0453/1345] 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 0454/1345] 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 0455/1345] 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 0456/1345] 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 0457/1345] 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 0458/1345] 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 0459/1345] 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 0460/1345] 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 0461/1345] 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 0462/1345] 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 0463/1345] 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 0464/1345] 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 0465/1345] 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 0466/1345] 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 0467/1345] 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 0468/1345] 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 0469/1345] 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 0470/1345] __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 0471/1345] 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 0472/1345] 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 0473/1345] 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 0474/1345] 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 0475/1345] 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 0476/1345] 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 0477/1345] 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 0478/1345] 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 0479/1345] 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 0480/1345] 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 0481/1345] 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 0482/1345] 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 0483/1345] 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 0484/1345] 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 0485/1345] 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 0486/1345] 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 0487/1345] 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 0488/1345] 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 0489/1345] 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 0490/1345] 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 0491/1345] 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 0492/1345] 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 0493/1345] 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 0494/1345] 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 0495/1345] 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 0496/1345] 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 0497/1345] 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 0498/1345] 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 0499/1345] 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 0500/1345] 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 0501/1345] 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 0502/1345] 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 0503/1345] 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 0504/1345] 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 0505/1345] 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 0506/1345] 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 0507/1345] 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 0508/1345] 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 0509/1345] 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 0510/1345] 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 0511/1345] 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 0512/1345] 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 0513/1345] 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 0514/1345] 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 0515/1345] 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 0516/1345] 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 0517/1345] 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 0518/1345] 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 0519/1345] 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 0520/1345] 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 0521/1345] 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 0522/1345] 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 0523/1345] 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 0524/1345] 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 0525/1345] 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 0526/1345] 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 0527/1345] 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 0528/1345] 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 0529/1345] 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 0530/1345] 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 0531/1345] 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 0532/1345] 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 0533/1345] 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 0534/1345] 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 0535/1345] 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 0536/1345] 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 0537/1345] 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 0538/1345] 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 0539/1345] 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 0540/1345] 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 0541/1345] 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 0542/1345] 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 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 From cb48f596e651b027af88a49254e47cd7fd391145 Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Wed, 22 Apr 2020 13:06:15 +0800 Subject: [PATCH 0543/1345] 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 0544/1345] 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 0545/1345] 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 0546/1345] 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 0547/1345] 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 0548/1345] 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 0549/1345] 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 0550/1345] 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 0551/1345] 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 0552/1345] 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 0553/1345] 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 0554/1345] 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 0555/1345] 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 0556/1345] 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 0557/1345] 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 0558/1345] 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 0559/1345] 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 0560/1345] 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 0561/1345] 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 0562/1345] 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 0563/1345] 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 0564/1345] 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 0565/1345] 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 0566/1345] 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 0567/1345] 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 0568/1345] 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 0569/1345] 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 0570/1345] 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 0571/1345] 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 0572/1345] 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 0573/1345] 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 0574/1345] 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 0575/1345] 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 0576/1345] 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 0577/1345] 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 0578/1345] 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 0579/1345] 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 0580/1345] 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 0581/1345] 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 0582/1345] 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 0583/1345] 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 0584/1345] 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 0585/1345] 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 0586/1345] 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 0587/1345] 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 0588/1345] 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 0589/1345] 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 0590/1345] 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 0591/1345] 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 0592/1345] 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 0593/1345] 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 0594/1345] 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 0595/1345] 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 0596/1345] 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 0597/1345] 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 0598/1345] 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 0599/1345] 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 0600/1345] 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 0601/1345] 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 0602/1345] 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 0603/1345] 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 0604/1345] 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 0605/1345] 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 0606/1345] 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 0607/1345] 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 0608/1345] 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 0609/1345] 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 0610/1345] 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 0611/1345] 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 0612/1345] 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 0613/1345] 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 0614/1345] 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 0615/1345] 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 0616/1345] 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 0617/1345] 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 0618/1345] 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 0619/1345] 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 0620/1345] 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 0621/1345] 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 0622/1345] 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 0623/1345] 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 0624/1345] 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 0625/1345] 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 0626/1345] 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 0627/1345] 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 0628/1345] 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 0629/1345] 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 0630/1345] 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 0631/1345] 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 0632/1345] 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 0633/1345] 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 0634/1345] 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 0635/1345] 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 0636/1345] 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 0637/1345] 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 0638/1345] 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 0639/1345] 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 0640/1345] 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 0641/1345] 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 0642/1345] 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 0643/1345] 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 0644/1345] 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 0645/1345] 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 0646/1345] 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 0647/1345] 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 0648/1345] 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 0649/1345] 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 0650/1345] 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 0651/1345] 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 0652/1345] 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 0653/1345] 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 0654/1345] 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 0655/1345] 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 0656/1345] 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 0657/1345] 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 0658/1345] 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 0659/1345] 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 0660/1345] 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 0661/1345] 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 0662/1345] 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 0663/1345] 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 0664/1345] 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 0665/1345] 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 0666/1345] 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 0667/1345] 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 0668/1345] 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 0669/1345] 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 0670/1345] 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 0671/1345] 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 0672/1345] 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 0673/1345] 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 0674/1345] 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 0675/1345] 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 0676/1345] 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 0677/1345] 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 0678/1345] 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 0679/1345] 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 0680/1345] 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 0681/1345] 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 0682/1345] 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 0683/1345] 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 0684/1345] 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 0685/1345] 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 0686/1345] 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 0687/1345] 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 0688/1345] 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 0689/1345] 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 0690/1345] 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 0691/1345] 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 0692/1345] 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 0693/1345] 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 0694/1345] 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 0695/1345] 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 0696/1345] 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 0697/1345] 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 0698/1345] 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 0699/1345] 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 0700/1345] 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 0701/1345] 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 0702/1345] 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 0703/1345] 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 0704/1345] 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 0705/1345] 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 0706/1345] 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 0707/1345] 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 0708/1345] 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 0709/1345] 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 0710/1345] 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 0711/1345] 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 0712/1345] 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 0713/1345] 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 0714/1345] 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 0715/1345] 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 0716/1345] 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 0717/1345] 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 0718/1345] 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 0719/1345] 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 0720/1345] 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 0721/1345] 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 0722/1345] 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 0723/1345] 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 0724/1345] 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 0725/1345] 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 0726/1345] 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 0727/1345] 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 0728/1345] 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 0729/1345] 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 0730/1345] 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 0731/1345] 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 0732/1345] 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 0733/1345] 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 0734/1345] 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 0735/1345] 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 0736/1345] 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 0737/1345] 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 0738/1345] 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 0739/1345] .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 0740/1345] 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 0741/1345] 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 0742/1345] 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 0743/1345] 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 0744/1345] 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 0745/1345] 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 0746/1345] 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 0747/1345] 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 0748/1345] 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 0749/1345] 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 0750/1345] 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 0751/1345] 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 0752/1345] 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 0753/1345] 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 0754/1345] 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 0755/1345] 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 0756/1345] 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 0757/1345] 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 0758/1345] 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 0759/1345] 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 0760/1345] 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 0761/1345] 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 0762/1345] 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 0763/1345] 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 0764/1345] 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 0765/1345] 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 0766/1345] 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 0767/1345] 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 0768/1345] 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 0769/1345] 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 0770/1345] 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 0771/1345] 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 0772/1345] 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 0773/1345] 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 0774/1345] 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 0775/1345] 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 0776/1345] 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 0777/1345] 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 0778/1345] 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 0779/1345] 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 0780/1345] 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 0781/1345] 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 0782/1345] 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 0783/1345] 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 0784/1345] 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 0785/1345] 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 0786/1345] 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 0787/1345] 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 0788/1345] 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 0789/1345] 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 0790/1345] 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 0791/1345] 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 0792/1345] 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 0793/1345] 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 0794/1345] 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 0795/1345] 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 0796/1345] 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 0797/1345] 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 0798/1345] 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 0799/1345] 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 0800/1345] 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 0801/1345] 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 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

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 zt{58%b=TWt1TEWC)+7+Q@^3I=SsCmJ_v|XjQpFM?kTDW6jPlK)OMleqOlU3_1xelo zGzUfenX-+^Dq^b+VIV5Hsv1iw)JIV@PO)g?1P2vzWiT~GX`{O#q!NoB{0lkF8A&^s zLcyge?Uy6l&^{agu>DnOA1zf$H!nC_vi#9HHpj5V+ZZgYJJR-~lD^XKMM7+k7j&ht4vZvRl{|ss_bfB<2+wq_CTfEeP2mb}L$l;6Q z0M6y6$nA~FnXH%1iKnuL0h`@Ytz1xOQfE%J+mzs0x|*WS`)yuy^mQU_V#}S-;8Q7N z2p*7k1ySpOxML%brQJu!6ZR4P!Lu*HMn{Lm$f)13$-u~{m z0~9|0LXB3#>-Hby zt$?GSzk9u2AJod(+ghw=Xw!wKoLsnu7KGKv_^l=QI_J*KU0Surq%M0d6}B-(4B2aN`P7=^I8z?m1pc`BtH^Wx$7A$%|vZ!k5Tc|?$7x_uyn~9 z!&^|ACYY z$g6BBwuYzG>}Feiax7W$LQ2I?OPdT;jsjPB2?(I$l2TAGFX!Z4)e~D)XAJkPJJ&9- zh-0tM(}gK7rRR>lIAxkYuqUdi5O(w8(C^0JhG9)yDV5l->;h#{`e=PLiEdHn|J= zBo5l0jU>nSy+8N(o!yCmx|pUT{qcQ?4o{H-Xbuj#9REt9TCxg`3^R1tB|Y6Fg_qB5Pia% z>RKA}`X$eW>Wmt*Vqg_cmDRP$u=Ab0)@GZ+FlaGUD$Imv+yvHxr0(II8xZ^GGd9OD zJ&6)xpf_zitbShTA>lCyAs^dRIF$+5*X*e?f2m{{l~F{kC3uJ|ZETNec67`JBlMRqL=uupLNNEn+4oM4Z#0D7nI7vO6=i$9EeubKgjk zX7~dqe7wWSh0q4~a2%W`u*8|1bHiYeb> zVpfZmC*RFp26Sm%7+oi0-lA2DpY_!Pj;#6L_fQBP@v|S4E)4kve|DT$&$%iksMyjmV)BS z3cv$uYz`6IQ;bE6n!A;vf+XFm(!GHsgTNYShO+r|&>NYRgTNo}Ixso2xS2J>0xL}# z57ONahc8@XWk|1I$@>n8Fn;syMZA9JNqn8oOdN#Ru+grI8so zFfBdrqkPM)MVh9gPs!a|E@@HqVAE@JhuNr|T@0DH_B!KlleGwKJ>CtF$aM(4e;NZ52;8!?Q{h37WEk4fMzm4Yv? z97rI5(!`>{f=E(+4{9>SLa${R%clW1V^&iE+rb7Vr()X-ZE4UbM&r1>Yb)U~5!zw% z**^fv^(&o0Vudx!C?3{Ui|a6B4F|8*G{Wap=DfuuGoKcaF3AqRv(up})?}IuL4TuW zeu0hzzmNI78~M?9na@fE8f!X=%I4M#*A+3IQ z52}E^VmvP1-t`QEk0Bu_S=!`cSaYXmd(GxHA>^RT4j;jzgA7KO$d1x8hwHr z%Z-CwEHnp>Plhsq=uW*;)i{!F;ToIPw*?Z1QjKXB)F;-d@L-+#wLikeoE2l{vtN17 zIn^?J?qBIYaa<9WfK(R&vk1_)Z1Y+7WbO@F6`?#ZW(OH~GD^WFDmq=bT@H@MYNt{yRN;>d%OvJvoowBqscDw8*LgxZnd!bK(1ptZ-#qY9>= zgp_p`gOKB7lSCyU{eyrm_R1tJ(}=w&)nr35HansIk^e|0F6AYb6&WtEzgNuZCuYd< zjdnVJEh+zxz5KoHjfbXED)c`tj?%1Wl9VDO>6IQdQ#CQqLE@&6A5*I%6hP;C2oQV6m|1q%6ogq~_Ih>k4=Oq< zGGs)XG@8Au<)Lc0L9E*GCikKRBUdme%CGkVEB>bZopHx}QG6dhA>P^6mhm&!F4=Bj zpiZNc(qF*-<`OG=8=Kt+Z?KPVd@`aD1czW)eV@Gwyd9*)8Kz!U2Eu{6CTL1Zh3g2LEdaZ~L&69(6MDXeaBt>7&I~nNri~rasfNcCKBl9Na3m&?c`}67 z+DrjTG9^8c$`JFL>n!z*Vw?&M9`6`2P7*L;Ak63%im=`dvoM z6{4HaBFRMpBiG}WXbz-|%Co zZO~EdiH?IIAg|qk8D3OvB1gW~NC|F9F`5uTyEZ|R?0fcO$n=Ei&@)n*N#5aLGOLOM z)Z!~>T#zo;XY;>!!ZwDfcn|ffIIW44f8i*1A+|P%8J5@(?GAvE(EXHXG_drIL3w>< z&q_=Lp)@_+fN=`W`0`BNs)%65tX-%7oD=~qctb?UF7P)w?N_nh~P_%rt*?O4@xau8d(wo!Os}E3*(N24S_>ro>HVcfNHf@|=zY*HDUL zYJb2DHaDk%yJziS^Vstyq{%lyS$>b;?f|>uq>jv{&`d}2Kic#&gm-Y^#ZHLA?(7zI z|M}q1f3|R%BU_K5P$StVmSYiUb@@af-e1IFtJ=-MyFfx$=A3}AA(#!Z!`h;+Te_-i zi2M5qhz7wGq**#MJCL2azxHPw)|0h9N(ZH(464t!R(iV>l*tQctE#hIwoPJa(L9+C z9H94rmqV73;`YEh|L_0*$Kn1j?!O--au+m_Y;TA((HFhJ#m@#Bm)fLBUeP&!q!eKh zs3uLqJ%^!R?bSx2ob1AGUXBqaF<@+5t)Y{jb}JOg2H^aRuGfSFzuxxG4L*@^9Pq&f zC~)R-mI_fsDXGA)11f&y?)5ocRwawgTg4j&&a$oPJVLloQ$J3vZNgftX z(FsSf2Tb@jN7fsg`#Y6QeM~(gN-n3D2)&%7W7LBDKi7Plldu3D4FpRu!!<*tC38uJ zODH?9ZQr!$SGI`*{4^}l5(Rd7#%-6^^Ue4(NfeQZ2ObIt1`o+QxK0tv}k}#rL zoI}y4cy^}$o(I?Dph=44iZ7xv3$?*NHw2;R5~FA2n)nM9NhdZ;N`#TTVQ+X|d4P(d z%XMOKt(MZA+#9YhlZa+S$P^jF;F8?aI}g};^g`+DZYp`txvqusKgVs8--1|x#y}L4 zb;9V@)D$eY<t|aC9=fzZ-EtN!q5RXLBi~ON&_t`Cf;~r2 z%``q3GXfC@g@0^)hMC%X=EIC(>laqb=nU~=O>urn9{n7WV4^<*yRE*dRX{ZR9c56j zh(+Y{F>@2zGP36V$!GPmhjSkv^g^kjhe*>NB@jh}%lfAiO5mq9|3>}m4%F=YeahDG zoMFVwf6)$yTq}e;QY#@R7nfzgeWmN1e0hK=NgBiUGBQ93UH0x>@MW_m!cr>!bHG}4 zr8FU4rW8XC(?rBlh7+mSXKq@&kW~k+R6`d(n!8;75?gBPy#IM2{OocFGAM|%?Uw^O zcB1e#^LBi`Axb?r$8r0gDHa%g~F9(hE?T4 ztYMb|mkYw0PRcC!B0&>H@}{QJ2Xe%}M9Yaq_{Z`GRJN;lvRG!o8A`o?H{tC@u(r$; zas(Hc&_wSWHg$pfT>M*RVZh_mMH}qG&V}ZmB#B1PMP#m8PTLPae^OZleDQxl;O{CR z{3kt)=o?oBCb~Mer?>0H2oduK`)5V?IJc~&C}cCbWBiXrL62K~nmd&HT#g715!~y#=9E;Mvf(+#9@y%4WSj1UYIVFbb;5Tv00$ z39GL)@Xhozf#%g=5{jvQcphstTHSE864=%V+^;B|)T$2vjsdIO+8)CTSSl&eDVftHXaJ@K zZ@aY$6MZYDvx7#S>qgAjU!|Hn8kZ0KXl&>+)L?3wL05)c>)f;baNox|<4(5`TOky9 z`AFN{C;K667f^8ab4e{|0mG-R^S%$aJBa}6VTGfq6LN{FnBMrzWy-9mRIQt7EYk)y zV^gtkocp7pXATTjR4?9wWQ=EECMBcJdd>nlzpU3`M`D^tr@o=J_|99QWm=-#No=F6 zv!Gg|38Pa(J<-wUL)qi6gpTG#lR*<0VzXXDCGG$3o$tij<_%)z=AGlm$>#qRQ<<7q zj)ievEPJ_~BOjhW507!7Xdl70+-)NdMO}Ok&ji-Uo-VFS{zxfH*%xsz||1XXabDHA$7zv!>^vjbQQ zCP{^n#pY_(H@ZvU8~Dn)d4!H{y|y~vN!kN1#uq;8c2r{@JFf?~ggRb9No^T@a8-Oa zeFLp+ZvGb)^xK>TQ02Nz69;1UHg8tJ@R7#uPQ9k?guO&;@P?C!1(d>`z50lC#kCVt#LYWO(Dqh}hz z-${Y!Qa)gKgvH)+HVWlR?!btxg?Wl$-F2x1=BLb<<_*h8Mtcl7kCf5QQJW{h7++Hp z&~lkuRmR6G*k-z^E)C#TLYGNAAwp+C{-KuWB^4Fq0gc^%Q1<`P^o;?PKwH~2+4f}D zWZN~lCfl}c+crwC6lWn`c?!DjpcmG~{@3o%wKq=Ike4Ptv>?Gc4%3vm*8cAw1 zo?04avcF|bib>HRBmZ$hQl5{koWY>O`h}OmOmmfU@ayy$E;nm}4D}{W3MtnJy`Qk( zRg_X$N?LJB+ukR+tUeIFu5-hQK$+no=N^5I@{c0CkR+V3Me{8pTI&)g{Ss}57`4Xp zUwhmrMlm56aFAIHv@j;IIGwkfEd#XL?Z$!fJ5zT5h3P*LjA=+FByqX;LJLMm_jOL_ z$m|?M(q;3*!AWk7CD4fc{M)1ynDC5)WXw z*+%GsX$3aZ{i~}tu}po=(#e*%z_Q|Z#V=R6i?XY=#cSlT0#{6uND5*k{*J_ zEYQH>RKw#$QX~D29c6F&y+P$&99+m;e3!6GjrcobEx2?v(~&*3Lul}Up8`()JR(~7 zbS%Q{ROjyP1`TZW=eYZ&oaBO*ahFy7lP$E59d#l1oTUf zZH$nP^s#vLC(esCxX0C_K+3~hpb?Dq71ukA;oCGNV$V_I+0WZNf@1FQRGwUBgOFd;ytHTZSO;)I}9^n3q52Aqkus4Ndp0U-LrQB#>Mgd44suWQw+3942 zjD-Tlj6GG?3E$H`0r!`ENHHNXkoBC5B}V9!&(k%IRhWXzVkQ1uj((%hi1)jAKJ?1mUpFB$W7kzw z{GX>+KbXyfAUSc~wcI}l)U%Wctit59{KGPE8Sv5x($56ASd|0HoXu7h`-qHdB=N>U z+Lt+@*n82(?FKk#82{T=r<@t}IECzyz~mH4Re6}cKPebLz+FiRWirAiJQDdK54~w< zf>OD-wS#^r|HP|A_^}?uCBlzna#&##Aml4)C1NHkEBmdK?_Of%_|D$tllTkty0Xr7 z*3b*I-Sj)wb>r_i4l47gE%<2h{rWJe+!J=X59o)ud+#tK>~Uh*?!OLNRECTd?0qZ; zd;+fk(;UF3_NP@5_!jjXD%6Unt*f^Iy)C}O3b8cmmjxy$ooB3qO{+h@)|4z1rN#=4 zKN9d};>_Al8^o>=HEf#pUNb!H0CVmarr$iSC^5BI``_! z0<6j_hOeDob?OIwMJ%6m|7hO!8_m{$e##JgKbJ(ox#~D7iS#&K=6ZcF%0%eT6%E53 zrBTqtlG66V6V*D2%`Oeg_#I#?|9b9|186V$9Yz2Mn&vkf{8l*H-%5+RUk9E9KF)PH z@E=aH%BcODtSw)r_FO>Ja+gbI#1e82qj)@2C33o6Th^8ow+OqL@gp~>N9J^bHXbvb zdG$osN;YkEH3W*MB&JSsPZvEeir@TRcPD}4uIwrl8^IS~kw+A*CBES8-mHK4e~7@M z{I?qdC-^NeM-J^A5dbRL~XQ8D8(|ggP(3HyB%Y9hp%i%`Kp`q>G?Xlp>%Zv z-)#c>ga#$fV15xA;e~y_TAV!zTUYceTD$F#7kt8izZd3x7@;B#wGBc&G1& zv-pn;VF9AMY>3+Uc0q;Xsx1t9d98mh=MqOVUYp*rtFW(iHt<4;w^VDJ%umpBN#n@SD@-+lBy)e5nCz9!+eKlaRiaq&kIeg=nF&8(z?{M7_B|13EatE0p4YE0OD^+;pGqN0<%Od`r2VOo+n zWtnvbd>D0bYn8f8bNtE5+wQ)*poU=HS4_Z1K}Wh$i-~-^_~Mj%*);HI2o1VY*orJB z-vf-EMmT)rxd+D20o8ITjHQ7e`8!^6e(|fRx;dW4aguO`w(zW3kyJK*{T5xN@@5o* z2pXXFm!y|wr4&%0@%NNe4qC3d@egB+fQnvY+gcSdYGQuWS*txr#W|^1(Z-90m;UzlwD`F}l)Fw@w zB%Lo@juur&76sm39ZN}x-fwvF%W5}}$>=jx>xUs5iRw_y(Adg~{}R&(3PFDmV?ze& z1MA)(vM(wHhg^sY&*h^>NfF|uN4+4f@6B!;VtAqL5k6b7nY{lauid{3sK#Gkw2{s| z2bTm`_RUAq%a7+TbbqZQx_$pO3FBV09p%o(me}&#d%qS3dC^1c?b&|){W|Zr4zW8K zvI@zv6xpbT{y}j4aQB$akJaLd{!6RWv?^YTj**I*{6<-3bu6+S z)~V19Ea|UVkEL?Cf}Dc-xqzI4$n9^u&pf)wu4)%V*Cyw>P7yh?97`%MwqKFv${jzp zzrZEZ%Hz1K)qSsZz#X?tspFxW?~fX>ln zj4HgR>TLJBW^D8m$@`vaAM@+2sLE=XL!d-5SLg7Dg2|c<14|r;N3zz@TDuMCr#a$k zakS>@QrNNU*|l)}e+F`Gq+`|)W5mTp)-?YjYbwgapZn-mg*1p0=GuFG+C$uk_7mbo zx+*S{(Kz!AoyUg#1`AHpIqt6~fUlPjj-N70op(!m@C2-N(nnKa6P49kFFUP$I(B~N zb`5Sn|G8XMV0{7qhSBn`moLXL4SifbA>n^jvxIZaN?KRW9`xV!*#Ff@eZZoS$@T4b zg%L`npyShI@7ReS4*PiAMeE2K<21$qiIOrQfb*+c$8d|~J_?C?RLm9B=6~oUPAa;Z zdZ~AW`#k{?aYwFBhMtfWkPVhmDLXg(^>@2`5YJQvA(-&RSORW@w)FS5hgSRc-*bwDj_^?wjk^&^5A_-~+XEKzP@VPT{kQ^94_ zB<-W;>*-6?;XK*_{EdQ*4G>Kz;Jlr`wzd|F&$GC^Tm(XZt<}6{IX;}{-ncUoO2Fr( z(U1D&YfkhYnaK6sx^~0%}nFdi)n)YO4d+1tJ!~XTy{mm=hcS26wgmof~XU$rC zPqnF~DKQT@0y-)j?oU2gzq~9~1#)>!8a@D;{QZ5Q^*`%wmuz-@u<~Z`Lqd|e8S9_s zoN_zr;;NbZ2d-S*2$}ZUP?$`)gBSzXyl=F;F(ivx_|61gG{q7VkFTd z=jx&jhrmn*dm4B&HMs)5V$X3VXbxP0?}y)2jiD)0O!{jTAEFkslah$mF0>6 zsZY{&gHUt|IG%5Nz)+hT=DX0s!9Z&w9CSGhdo=ptXyHXa}XsxVL(=wknx`%`O zyd2Qd{Ed`X!@HdNiLDoo`rmLrgtyg5Oq*Z6x5)7- zn*OdRe39Savg}21>x!+26eGt#VaBN4y|4Ce@U#s-%dvmcB5I(2tYgUUe#`}YRCVEmvGcX*k^~eikiRc-@B8d$?n92d;RlB z;11r0r3zm2t+^gy?YrJvg*dl77Um)S(uf0~$o%4?4JR|%Dm{31g0uV>P41iDhr~`M zHOzETeXdSPn=AFxzhP$UhpkI=jl2iOudc#+rq?H)D`!=A+&`%v_W;^y_nieiLf*jE zp1UcY18C8~T|M8p$tRVuf+-+LSaBH*?~E=VQG}?D4*s-&v#8KmMXk6Vw|Yv21pwYqfPnjn=~@uxEjY@N}l68H`Wo5Sywi zHMarItf;QZYs;X^jQ9Dv9Eu12Yy>p0pB#-KOZOrm>@@h0V_MVm7m22;CbJ$ZUE z=cY~XF}Ep61NmWTAv7W>uV{?4#)MUq-ejcK>r%O($dcXc$SyV(vCXS5;>Xwe0(EU3 zkH^FxIl8*ZufA3#lZ2%*yB>FxQiZxu%fl(O4qfgSl!Z(F8z2uSrN(uT1EAG>yVLqH zVF18DkzLP6DbU>Ts}?ATeS3E_jAUp#TV}qbqoe1|U$07*p%hNoy9x*yb4~Bxl3K{UUDr`=2m5-zOxTRq|;Vj z5)16*n26*T8Yi`Vk#(fus1@W67==~%k0kL~F>&)r%jF4Se&0*4B-K2vOUmuTwEaDv z(%}dy=0<#N)Dz}Crs8GQV#ybA>AwMs?E&#sManBqy__>J}$K`w;r zP@A3?i_BKG<5L|i8#hr}qR7(aHHYNHy=nOU9x&~Yg0s0`g&r)I{@`9?nFA60-Evie%%D24iE@M2oyjwd68m(&r4UtnsjbNjzu3D|xFi6qVR zv$WaH1PR3wkeuEUi@$zq9E)PK0@}0TorN_E=+&R{F4D?Prm{*ZMhK!V$1@4nvhGr1 zMnW`J4nu7rNr*n)D?TkUSFu-|x*U(8=C9A7U4+{1eE~j#@7F_zZv!Zg#NR%Oy)4QX z9cRSmbz7k+;V3WIolaZoY+(2}*A6-6Dwn;}G&#E)W?r1P*@B1-Eu}-kC7)=XqBK$6r7~adpqI&~RRpLC~c* zp0vt@k+DGHjM>kc(3;qCE5VaRSOlsHm&u#qm}>0M!BNY#>G~lRq!_Zp-b49*neT+f z0m&D42uo%j87g%iL=?rt!sEuhZZ&7Wk&HZVh`APBECC~bq`Krc4v33)UkG+GjPzRd zCd);ZY2Lf-qBxbb!oA^`vt`09!``e{Y(ple06+9&C+uFM8lLO#^;SkO`0;nZG9w=% zTzKFLvX3_-hdW~+xfnB9R3jk!9J_(ctlmw8d7v#qvvSUFd~=h= z?w<7uWYFS=yvh=1XvCH_;u<2sI;*LmE&a$M8I}WSxu{wOlhIImXlUG~{e4XaizzEB zEARWTfLs>)MTEdt+f}aDY&SY{7rrBqpS{2Rb?ZnU|s?rub$Dkv~ z=(syr5~25+TpRo3OSl-1d+n3)N>X z^tFN++-_|*Zb81pocd0nmQMs!?b;o7g^z_q|DN?IEA*om@dvC|WA;oV)Ajt0dMeeb zMRjjBcEyms96nC~+3jjy0kpV9e%{z@Y~r$$F|x8&nYcG@2&gEdO!0{d_B8=wF0!&V z__^3iON+}3OAAIjqI|iSx0}I9Xr2O{5F5Qx{G*`aD>pWXo(?}@KqaW1_lbgBk!P$9 zdh^9JtYt~uiT%?h|D~iE2$u-9+La){syesbJ}@1NavFDMuk|Lb>~YYmH_IzrFr5Kt-e57?`C zltg@HO$k3J!3WDIqz}^spH$ zwQ+PV@?|y|ui$JNZ@@CM^nxmFxF}fcsC#4Ru=x41J{^SS4Ms>ssQ$^p)OmVu6q?mi zitFTNl55?qn>cAaKEkAvM`=KmQgjBA3zEq(cRQXUXm?UwNKa{Y}X3C+QfQuymMHz_>#xNBUhOO$jDqQ41R&S7;(HA#;&Hg5UAh_d?W^Fq>kAla_*3Sk<#|-BGH#XcM8N%k`R;LYr6Q z=bFM^J_uGtLG8@BGsn6v>Zu! zmV?FPPY?yw^M^`q5mTm7Cb;b(X5l*C)d(jzq`YIK*pvL)-vVzAa!Mx}5nDxYA*Z-e zeQ9Wf7FI_{(Kn&=c(h!1K>WC1v0$j=ALBRzQS%1-e&JD}`utx%u?Ws5Q;==#ISo&S z%Uov`)5T5%?1>utCEl4vBgm7}LH8xaE-zh^5}?d6Y?B%6r~GB%gz@}{Bk5`S>%(z6 zIkp@tRjhECWIn7O*z+`3H_B_AlppxJ-8&|av?{jV>?;w!Uiz2ve9vnavuv9oM)%A% zsgB7_p(dB*P|YP;sx9$uJ_WS%{6Zkk!*-%ZMunjSjzQu5q7^kC`Zroo2J^B@pxKqJCWz zKJ_n_;|&4f&tc5Kw4Mdy1PI*+TO(4Id=&ma!$?2q z-amStTN7X-sA4Z~L<8<-u89!x_1+Fq82t9VIyu{VhAe~{BY*w~!1Yy*Tj|7cLb)f^ z2v4uHAV)7YFhEB-;Vo546g1$3*mObfBrUC_TQnp_t`Lj{X~&_ZWzmsg^dq#(q`3f5n%E`2KkmrVrq zx+Aa&WtEu)Vr5aW<6ky7kCZ+{^rN(_$OC~i)Kpd>)O5u|C|QGA%+AzaSS*n$z(6hj z(G|*{h4mJ%7ABtggsRnn)rf+%*rzF=m`HGnC%wxdI4s2t*ElPcBs&J1R(e0tPaTxH z6+lmDi!uKza_LtA>uKQpJ??#Ga3C7Y=C$*~qr04VU{vBvs?~#T%p>6#*F^;eGuX}gp!k5SFl2{_TNGR+@Az&Dyi{Pejm5{Fc zB`}>Ueg%)ynb6^_;l2SQ)~%Vx;FXSYaKwk+I~5IbH{zBKt36ic<20n?%xT9-^slCk zTYt0?onl@Twp;^_+lHgzFNhL;EWTQ@(h2kVMDyR$Ls@bB25k%bHF_6Q+U;?zdoP1m zcF--s;QTO%gbEDMYK}s6!@ZGI{S&*1p#b98!cyuOpx{B`d_JPB?ySOL0lLfo*6J(R zy#5ACu1wy@kiqE6jt;q z#De4g@-?zYq>8OF2KIyGCX^K(pfLLgUSZE9L-+|mzDTk-4U9R+&@8adR|z}OK|KD( zH!sH+-G+KgeyvxVI%+!ouuA<(H z$B?NjZZ5&R(!3UDLIIE^pDyf5K%GFqxMGFxZECgDpF(FIkNjLd+_n!N@cG~X%)hE2+D0s%#rL8TE&Jh|KxY+;ao zyM&^2{Jcap2DN1nbL~h4JQtW z8)V{OhsXBlH%Xl$Yjg{&W`*>mJ3`T) z`Z@x1u^tuJXYCs3os+s_NK}zv)H>p9h>kUn5XJr_X`VU#x6z0K^(D7SM9BG`=!aXJ zF)r!Z>_Lr8)nDauUY3WlDq;BL@nYt}7+5$Kj1elbj$XxaMpTo9=E=2Z?mYw0tg4`0 zDDd~XK6u2?E>`n{4~6Rt&RI{2CJ@qos%4GE=1ZOjVVu>!bp;|VmmbeCiua#>|MI-P zK0XkC0>RYkP0_<}Ek+~Y4))Lm6K1MhbYh?waT>kFar&`0Z9xrSwoLB^t+vqUQ=aIL z7cWrO!vf`wV~g^r??A^^7)*Fpf`Cb8F*dmcj1fpfcy_2>!9Q4VX&& zjT0n=)%!oPocABTZAb%0uT2X;PWyK@FbB26z{fWT{CU4|muts}ss@ylA-Vy*77Fp= z;>#YM%um&w7;>cW4Dny4+HtYM?RXJ0qn{ZP;jeYr)vFH&K$G2?s=B))$=Fwd=HXVA zpoZSBvHh@LP^=@_(lyL=RH8GG15?gUjb~gYgZV%J!pIm&={p_@%`+5Ye*!&M$chB} ziOvSN^mlkc$=-!1`x~Y5AKByE247+ARwxll7DE&Q0ciTayL$z-PD?CS4h zemQRYOd#zfg$jhK1R;}9Yc(0Pkc*dy)*iM>$znH75vr`9L1dDd3@+=|R4IVaFxNF3 z6<(*>VW!?O#WF12$FNBUj@%}~<8xXDFwV}s+ooGzl4t!L4#`41bT;%^4m6d*Nuh6) zdgTH}O}0EQ?8Uu*Zu))TM@%oRd)uyzIJ{44ToO#crxAZ0pvcq+OB^KQFdyE`7;+q{ z+?e9L`#pAp*F}lIK$p#c!iRfRZ!bArGJq5IKN@d$WKQ^2=hgkixRu zfe&&B!Ndk$|9k%xNa{cg6dS}5g0hc-gE3%KB#IT))=19T_{y$0Jw2^C?e=M?Q=Q*X z&g0hd(P_Ej(oxw&fkY(f^duR=UR#+?}e1 zD1=17jwqQh^1&;!2-<@{;e}^F?xV`k*%3yy9&A}tP$~WL+wUoaQw0Tmtu##1lGAT~?xx zG`II7FjC(fpSyS&^_@vAeUG7RGl`Y)AS#vCbbUq*OMl&m_ZN-oED3oNn(9;tOJQ^w z%$Y=nCU1cAk**X1E`+`lr><0q?c;%aTp zN&mR_@*r|2rH_hoX|F_B%4q_=-5nl#x}Hql0@($;<+JhN)l#haqWxf&S30!sZl-g4Shvr`<(;_oGbHu3 z@;dg4L4??OY7e{3^KvyfQ$5iEbu#)uI1G+|ytiYQT;pSKKSKo%^z7|yL$4bHq?Cls zHQ2Y<6(`A?g&!()-2=7iLOh-0>}UhIecjMY91@~Mrw}M~9Zd=bCH<3_ z^_!sB8#(GmA|kN)oK#V1t{InvRa$C)hS_2wh$K-}A2`Lsf2DzG|Lp2ST(cZ7LuQ1= z2A?tn-==}(LGo}YVbS&Rp|Ac$TStEw;GaMWR;vAJ49cPMYo3|9(JN#Got$wcn`_HHM~QL)#z1~Obz2Q^{%Bz7Y}Z6Gb&PFl|E_TBqV12s}Ywj|9Gp+u7HS*X!6qT6DKaEFw~Q?UZhYHyEc_VL@|OjUI`DL*l^g^ES^ZqC>H^*c zOgmha-f)?Sn#g}b1`6SUF}b`Tw)Lw`kE1^j&iDVQxC_k{Mt;u7R%7rxA-;wkV%eXt zXZ`Q@z(R>HI$g8#1L#d@C%w$vFQ(MI+~nG>!j%bC~DSn&`0btZOcS; z9y7HJfn52r_n?&?3h<~2W%6tpz_U;o<3f5Gm&4~}9RxXP;8&3z9CRnIb}PwvJHoScM-Dm^;S75)Q>uV;#`BL*_Zj!Qa7vpihdB7T!gmfyj!G60@mIB|7+58VBlQJ$bc9c48r=t9T z)rwr25kgZLuXsK=?xTX?x6KVG{#D|cf+Y#M6^tzH)DahTW8!Su$Ob}wX%S^y=DA*s zX3JqOY|34~?vXU{NmkcEip}zD`Yh7#@2Ho^K9xvc@6l?8$aNJn4>%QNn{h7?R5Pk^ci;q89rdOb zQdGP8K9{BfwkG%|Vfj8&qg+M6i}!vdErpEw{w5L20CO=*3s}>Bycbf-%Va_P7E!o- zscOOC-F}*ezy3ENgYeP|WC*?;L5rz#FS_5rPufbXx$|MW?p+6~hre*MqgM4?7HrX( zM^p3^5G=syiWKeO&DookM~7d1klV%b+AQ#lxWbQ|I~N{BT)k`KM#( zQ`|YZJX?>i#%RJ@z`Wykgb;$>{Y@??82vxsr$OQyI~CdfF6i`^Jvf|RE&eREkH$^H z8$)PNn$tfm#hZbUg`cj@ncLUC*1`rXEYb zvwrZ{T^3L zxPy518rqmm94BdnaqiQPcr$uw`$L>oEe3ugRxQ= zI~G7!&ML_}jX#r~;itvIeKjG7GiG2TO}j9Pzl*h(CT;dr@4+eZsbYK-VF>(HDq?-q zGi~5pC5=QPznPtZB62E~iibo6!L=4cHud3mBPrnMZXN~#yKuA{oBo76NwC3j+yM}9 z(!L{&N+j<=cTmx`CGrqIJHfuDc~ee$S6jD<`u{y2!^qIr zBKr~09oyr1yelQB29Aq-gp;1fr&Y_{-q`N?U#CT4weeVbZQzd3%?MvW=C@Kx-La47 z%1V(aU60)e93{sZJ!_k7gBjpaUdHwf=17wJ<0I_kni@4ltqMRi#bh2ZKR+WX_Es}jQ)@^ z9yt6D$N(o0(8s$1U&DC=IlmUD&zF7a7CNsaothh`=L-4CipM*j)k&KXv7Ar_z57|p zb-nCahRSI)#)soQV45wSgA3jy20yyg7)|Dl<16i7;<>|2lmR`@&po;`g0G9}qS{b! z&_BVS(^w%jMreiEGXpMu6gm*T_f(sN$5Ll3+&aI!5D_a8grq7fCE&e0Mu)8o*cY6+ z@o33KT~5*0$tSt$DnkI|i;~ld^xrt?aN)9V8hl|Dlf@()56>+Wc z@K0Vt>gIM&t?GUZqPbW);M(pU2I*7|J=j^+I?TEK4|&W0a@_ zsu_)bfNYr2VLGaU*YynXHF&s7=Zz4esTf(Fy?F`daoUCW1?T>paF1l;M=Y!>@@(_p zA!qmAgGTH|j0H-7lI_Qo=aC|MKx+vmx;=GRTn$|II*ezuqjD;>{XUF#FM))9lh9B2 ze$sa#K=~fxm6%JsFr9I&&;&NY|K55zA|l_^{XlcBUs9K@!>4*O+0f$z`c^)Z>EFh( z&ren~t8s{L#)AfEW{+)=WKTYY`q%kkp)p+*2yva%)09rTxB8nuZ1bx8IK8!Y|JqaA z`P>y#>dMOFeC|#_{UxKCv+18@&>c($OH&G`E5DkU38JpE4G1Bdps!5fOBj1rBEI0H zJYBrMm-u}tYyI0;{=mz4Wu%hnG>jOf02Wp_GWF@)BW#2F@KiP5Zv1t$S%P7!8(uB4 z_Z~p$CsEoD1~`W7gUxq18*h=*?0~xOWwJEND#>uDum#hRHukKKv`|_ZOlnnjV2DgZ z%6(T&AI5g?D5ET#fUS{_MmnK~tH=ft^o_2j*De9l!uXvv0+6(-mAP_ac8}*=FS_4% z;U2Raw{!hLgX!&M{&w%}Doxo5!2~~ieeOoNUaUc=QME8;woV;3C7RTXav2JD=v=SQ zc=_vqi^>LHN)(6s?W!!dzSYw(s zaS)~nLb|GU(E)J*G-u%+w5KF%PREXTOVS-}>9A6ZaL0JX6+*CpiWE=s=C=)2zTt%Y z`Gxs$XZ)Cz7^ILPEGc%lP4E~27g3t&vqjok-u&CLbg)xnYZm|)4M*dIyQ?#H&J@2D z-XELYlZ8LLcr~@tqbI@uH0VYCB!G6jPULD_Vr!`pXkfo;%YMyNFv-tQO@NTc%eJ&W zImcy7ZNT5zf~Do?z*kCNR}AfpZ!(+I$V|Q3Kp@Qi(VNN>Mu=^6j1A;l6B^;0{VLtB zo8zS`rtS3AIR4s`N)GWlwvCI>Co0Y4B?{4HqiyC(9@r=6j;}oV;5zuIP6Kj|nwKRz z;9VjZcpe%A>hpre>jpseTbl1DV(J|Phs$~_!UD%cDf)YsqUH4K{cUr8FQD4wY0CjQ z-e;xy$~7!x4Xe2)rL+C)pY2>jF@5*TjT&)GL{FViP!ukEr}_Sx9o^4#7)<_l{=a+9 zvm6#-EymlnU5;cGfzl}=HV^2UwdcK|g2VYdv;&mQ;q5fKE+k6nN6!<6lz?pq7+Chw zBz%%MTdXD&I86sXL(v>IGyf}{;c*6r&Gshe@zgxu=K}sttsytFX@5w9J{-khYGZ4n zDa5~(*7w_%}g`D`cg^JxyNvRGZ5Qw9o62?t$kG@}5 z_<6oM8VSh@5AUV2LRX(3Q0yN*Vp-BW+MYPwCF>Rt6T8v0uX)wzg0%F~6Kw0vZz~0f zs*wjXkpro}-tg)r7X)xiX*0Fm+tv<{uU*suVKCRY!vV2c@X{IA#*%`{3oatsE43P!e_PrP~*Gai-7tmxYy_vjc#^-2ARi5!o2-r1eNPn*VuOO0yfN9e(@oJw85|# zI?(cdaZHyzbI}t^a1g4w1x!ykso&%tA&;F=SvNd${puzKiVH*X_DpLs3)Q98yLMcS zB)kQqi;I9^;zM?qT+6GvF=$=LLbrBd8JD!eZ0P4g`<;tKO}eH~tN3jvv(+}caOX}B zu&tJ_(J9f+kpDy>)}j#VGU&w2f$!jAv7)3U$-!gHak00bY*&o-;of?JI)&1KpLM6-V%Ha#EyR? z33N=cBi^`pRc)EDk)U_TmSPzI3|uCz9sA??>or`q6x_rTq^#dr8k>#6>ob}p6vlLi zqhf}-3^KnCGxU2>^Q%VZFO{~X=x(X-gP=V|=b1%DM%Qv{0c%Ynkd^}NX&6k=^ z-l5+g4U0yj5UDReRJp2VuW$6A{9Nub!PkdPrK>g?+|_8R9R?HRPV~PZ8f0m#VE!*j|%jk5)^vNXY@Q=q264y4JXb5_ zRF&HHqwSvI+vwK*bm#9`aw_~`=$BJdDF~UDr!K{>eHMUTHIRjt{`O!a9nAw*06y zntakWUG$c)anm68olEqgvdC|0##Btk;ECo$?CivJ?zj>)cA;K+91oWwVb*t4u$3d@`#6ZL`6v`M_~t z=@;EP8V9Xi+PKOgs@uOzKI6MGbm{7C$%%jGffFWy>~wK*q4gj@h!rxNHYv*{qvo`% zc{Ms*D!r7v>;!RC9yIKhd`unwBFHPJf>Qwc44DU24wlyX^Np&Jh1WR#ksS28PRL8| zR6aw4|KzySPYJZ6IWDKT#kvNwx9xMXf0h^QTAB|;BYb_cbNx3n^7&xva$H(cBQ$DA zirLA(=H|;8e-GJU58jKV`En?%xR#`?QSkOa+twO`Pt^e5g9d9FNjl=;6cF3BYO}#? z4AYc-Ze^@x!i09z?jV~@xKGwQG91}CLZ@2-s5$t(?EMP&gRvmS=v-ty127{rm$-eQ zLDAMrRGmz%*b~whgSZC_*r_4-9l}JU6x~)qnW}%AfJt>JgkP+!Wum?Oqyywt5$9*O zgiq}yB57odzRE-;0+b^tpe`H<0Ii2;sdBN9=B9%&5P)my+JB~Y?7VW&=fm3tlXHk+ zx8JF(qLWQv_$z{)-zmlD1%zE2g37gr??1q^r+x^y@xIA38Q-kDCm)>7(|ODB@yVhDj6nL&|#rt;KGT;txyLmU&iO^y{@bv0wKj{ zNvVu^SQb~+R`Io8Ezfu@rqaBaT4qXjLb&BzROd+f1XRN06o-S|JUOTvrbF>-A30>` zM-KPdtX0tmInzzH-SXib5r_Z4=Uhzw&A}q29nF@P`*5s`;lTY_L z$X;#m;LjjghmgNz89!dG|Hb0h*p4dVvRLXb%{L21_qRlKSA%8hq}ehsesXo4IbE$G z62RRll_ha<%vhPIl|x%=smS@UV926wDufDY2HX%nYWQlK>A3LGO>e&L^oSL&#X{ti2Ho{c*a<37B5hIGvUBlsqd?Zvj+myVwRFUr#+9qfhg`OZAbX`R& z+)u3l{BfCEWKxC%MG$=hgZbbO9k3ed)%7r`@GS%#^Jy*qB=*s1+2lGP-Jv?G)4q zzU_uk!`-$Nc0t5&I!7#nBd>!S(?|h9gMO^+K9R?6AD*M6>~? zcvR3nud#nVeT;yL+p8pArH~G=eO0wxsY9)m30KWKV;;fcapU655vMcNC@~Ryp{=Rm z4(ar0r}5P&4a!<*3eQRs1E86~)mK)lL?sOvPlbz?`B_7>#!+r6r(c!ng+`g5w}P`pZn2&`?2$(uPLi( zSUqg3fAodKrfOWfd(>nO5ir?*wo>zcdv$m6M5tB|q1hpOYgTZ5V2(mG4M_sT5Q0ji z_-E6Ftj7WwDm-aa@|6jzu9_CrRE|k@w&(X*s$uCn>gu;3R8_U|bu$Abq>X`vuz}F& zAO2z2tXc=5mG0LilXk1Az5r#nvVo=2+SGE^${i8dK3Ed-0mc!W)cOgiXsZigXdP5F za0Y^EM&|8enKidB$5YG?v<*faD@!t&cWm3XZQHifvDLAioIKC_zF*aM>ijtWcJ10#YwbDL7;~=s zzQ&lkHaJbaHEAsaR(7B|mJOEM&Gg>oYh72*dHakH2tGY`1s_RY@24Smdq3Ehz5R5+ zMnS?pL?8)}f}$Un-@vuq3x^eBoU1yC-JF;%t#ArX5XZh{TD87VMYdRNSo~iS-KdYc zbdA}jEslru371m&ZwK(XNWnC>$qC^beJ;*fT7jG{)tx-2)77;uzoVj*=tesmBvm)a zYf6?~swdCgO^>S!+MT=}rEmL)wN1JNsXn>wl#a!YB#dV%MH#~Jg7u@o9c#{+U>|l4{sg1EoD0BE4b9}RM_C9c zUwTa|>j>1z(h-A?PmmybDdk`(Gc@7%s3|rJR3q6_fccXr|Lv7fuUp#7w=L1gR$9Ul zOC=|^0c~JJtx>7S>|Q49HUj+x1rhmnP~)$;($wJQM$ssCYH{H@)MzF>(B=qVvecO% z43>9P<-k#vR7+|QwSaKL9yoY2M2uh2WN+uGrA;9f2+6_XjUd@PVwFaOJtQ*SulDrhRJ zbQnwe3K5t?7Ci|zj2k>HuXg7{^X#@vD?Co!$8%BYlk z?1oFmM|K;EB`ynbj83Ts+ELFWE&O-ScX;JHBId4;WOa9ay15Bb}DK)@foI6MPE zrNOf1 zWzO!4`?)E)d}hC^{{Djgl2d1 z)8(R~-nO0jQ%&+u|G_Vtsd?*#t27;|@!SN$7a^JV?gCdIU+t* z>h?`q5r5{dt-cjkm7q~Rn9q`Z;oM%{uAC$6zTrd=EzU+49tMm?qd0*yEXlB2T+~T| zO;Z&UyG4yVC1qrL@71v(dAUnyw2jxY5dTpwtN$l9{w~V)RGvR%NGZ3fqatakleIBf{Q6)mfQFI+h4;%ZxSu5V>L}@& z=y)6=lu*|m*Mxf`@ECHns+{3~I5@nP_OdK3mBJ9n;@&T^a7xBhH)@zh-3aljMZsm1 zCUsmva2;iuc|#u|<<7Q$Ee=;?3xf%u%P+mkDUoXf!d$3H7M#d1vyh5bxu@fHoKEr< zLv=(jYZlqYIo6{ME+tO{wn}sk^u^eY^U{opw8>W5H0A z-zPA83{g8QT)R|4V81OH!Ci|h83Y+yRqN|e?XlxOl2jno;#Ov0^7%- zDnR&$LUqZ=#fpLflZ4{=;89~8XescA_7QU3e;v5aiz^%@A{sY+er9eq<-dgk$uy?? zM$gU)9=kz3V3&d{CnC3VfWjp$=;&NJnUK@Yz2F*izU=+omyXje-&1&1UXp{+X!ZMg zC$Ek6>fA*rVVIV{rZ+R1Eb zRCC+sY%Wo$w)t*?NkJ#y3HpC5K%M7xX<8&-0oMoi*G>-M4FO5ho80XX`p1c-K;8Ro zbQVdHulN8c>2Vag-XZlB(t+MM- z&sg5EP)j?gt+G$zy%~R{z2JZap@0{W&mb$T^}8)jrP#jQ^ekKYmNZ)zEs}rdcJ`lE zp@EEVSjDTGz#1l|s?CJTr7?%g3NE z_y^@A>$K{Kab$c?s|ZI4*mRH2v68T-hJ_G$+nEEC9|JZ3P2 zk>Rk>dgbJgQDTlxe9ZnjSW6-pOESnPHhg>Ej>1`n@GLLlDVV%eJ|K{4mfY*{rzOm_ z&s2|H5J0{~WeOgxb~un*SM5;wPAtdHSJ(+frauKnDi%V@!&~vg#W``kPKcRWhZY1; zaqH|VK}~KJ;uX>W?W-CMkkYJ=uh>12N;2gVf8;3~U8s(0CM)&#(hjrz&UFcn(e!$> zZrh>lDv!glRco&}zw<}l)xwG5NVp&Zo6Q!@#^E5t9kToF^DP-;Z=LZFejQF%@;Y!$ zkYyb)JC4U~K7X9oaJP!H_Tf|VCa}91E^AI{bIQNI?{{>)5KRq-H8?8B_;o^(B_TiF1?iV`%PdHP)jx8TaGW&! zO!$aY*!(7Us_wLj&4N|f*QZ%WcjTThwU=fn@s3HSEYjB~uzB$9%$UpW0E^{B!};uy zsmy0E?)m8POovvYN)@hqBotYwXrc=Wz*(C}MH7^Cu8sXcgm@CNs0cub7Xb{E-9P*~ zIkB$V^i9u6eCl<9ANTtmpq)>HpTRB*8eGBm4XKrZo(Ac0hoPq>f2#C#&7(S1k)Z2? z6BrctR^Rrb2{FSE495P!L{UWq7^1jxqIS+lkYXZPjP@u3`{06n=7SpWgYqR0xI$g{Ki0FyG~x1A@ki`J!`Tyhilh1K6{+bZ7LlBT zal8hj7rl(=$+I@EdBq$;2xphsyY+?JT8_W&= z)Obkm=&_o7!T32?gTVo^T`GFaYO&Z^e)^b|0J*gN@Pe`Oa9P6%FF^@7Hwf}si^58G zeOQQimBwG_wgwr?X<;b1QnS<(NODo=zo7p`@?vY18k-Jt#-cJwd%~li9zeVSjCDja zDgOJ^C<-?2xdTsA2=8+S!7X6ub%iwmF%<+GwyAOHmr_6 zw0uts*!niBA#K|Ij*MEo{?FJ4INeR>qO-)&`gW>{>>~%jZ8F=h)GbLt&XV1n(szdr zS!;0qsBu5i25^2L|6)I<9Z9EbuwF5JjDDhLIP z+CCO@mJyQolfXNY7XExV=dB&?T}=Srdr%N8_2HZ;%tViqE_83fG>`X)JuENor(7P2 zq2=2M**GlUTiESoyTx6X+rhTrcF?o!)d{UPfcxZ-LSTlt5(1tSK6jN5qTzx(n~qyDmz<$c)O=c%Nq z4830~PC&fH({-Bdn=(qz*jBql15?sT?k0Xs>Uf`BsXlt>j}}lfi@}Zk^7bD$Ho}ly zqK+-4jHw>)G`ub)AsOOp{adF*Q}`}6T^K{s&3-&Mf0}zd=Ajp^1d;q^%FUs_Gs=gU)oRVDn){hY zP$K11{FL+*9au=jar~$sD6`|^IGvPSWhxm!CR6U61VSE`r7kb$rWBrJS;~qKE>!Y+ z#}G=EhObQtQOk#iOCD^YSVMrn>!CscjZo;DU;2PbrT^~JDx_2AFcj{x<$?J3k1=NT z6#Kx4JvQED_d?S$jZ(9>q?+^2bJ|X%U5C!#(y}cgb2J-)v!14u6b;Q-WJCmMoxKy{ z%}7;!$3w~b42b1V7N7z4x`9q-aav3*AY_oCxqRxby4A)eB$zo_7?wl|yw0##4?8d* znB(4|QwWgX>sBQ|z{?+lsv#<%tdu$L9*<9DcSOL>p?llKs|(PS_-_9+pM0jcw%`sR#m(&Ju2;}kpQ7#d zX>2O^rokd7cBHs0@K^7{s|oWr@0Vf7@pEeE1IKLs{{773%hOFjU_V-s`srcodALp`>2NH?>!+pB z8Ea6`%F`)Aqh=>MzTEp<=9r|s~=0et&N{PDd;X; z_e{0~{-+HGNjIjYy}@tUl=>S(LkiMWmdP?AH6n6UR;<99XtB~~*@Qp-x#e$g6aegO z&WfQ%%N}g@&Bra$fv~9eI{9G~PWCZc5Sp~DJ~i{;oZ5+ym-?L(T_kJLox7e92|iw} z>prhp@+jKsE8{tc2gBmG`ls-53Pk8Yo}OcI?HqP)gR1pH=&nOd(Eg%(RDw8EvJ0!1mOv=s<%{mYc^yA1yy zUhE%;^547dJq-magt3~3r52}KD+@|gH4{{6QjQg5vGnfa`tsZlv3=^rnT*iTj%Ra1 zs~nW$U`4~DE8wE3HsyejiP(b<&eHa6B_owfWGabM#E5{jKv_ARs#rL8DxA`$r|X&^ zYTHOIDu`HP#mfUxho+~_%(STsZ<9SKu#rJ~+N{cs2W77!2t=TiQ3p!v`4_wGC6M!g zN{z6-&^Kqn0-Kfx%WsVwT@4CM&e9ld$bBalhQ0yN(zhQjbCvt?K;+W6)C$UL2}I8f zHlLI(A}A*LvieT#F!hIsbHF)riRTaa+r8Wa1tEhD9#1dJ1FI+L?iX40B|*2I!-y{7 zr{ypE|E869C6(Lbh5Wr)qh37yFV*zZ(<1>Y;IkPEcJ1pY+pL|pRnES!h0p)bMot-}T_N#_FXgkVFz zs8My?{c6EnvPEu6vO#1=aJ?lWsu}+g{x5^W0Hp*9?ATQWVJ15GeGj1k;87a2WdcMQ zUlcJ5`}td#OP&b!p?(B=jz(g6iTV@Z0jufZPl^<^Abzhnr86v=PTX-?gX^Ap2Ol9V z(^w?laXUVZB!OpbD7}TmBT6s?PrG}#lK)=nf3r_1=1Z$mFlVIUDxL&LekfNE3ezz^@J zP?H^h&SAdt1y>(FsjB~8`@DP?a(?Bc@RQovX z_{&7?IT(-x;7y>v6YTw7NS>?vYnDtI!XwR&7$;imPQr3*JH%=splgaeL}owX zm>)~?6(dMoZ=vNZ6Jfw0TDDaCFX{3fefS{hmNobtW&cSbOG3WGp-zrt>t#V%ZYR&> zrfm6W9Z=yXX@E*|^-Jj2XxQQoT)gDgNQbHiR2Sxsm>^2}L%eQb*%Y)dCD~D9KPMINAaGtx}8z zkc>(of=^e82qSk~5WJ>Zrk}lY@SalK<#cHDVQAG2 z^$;Q=t_#gmGu(%{EEpvKv9uibIzpveVm4rve^I{30lJuE!tq_1? z9aeoYXU{C;js?F&Ch$w~iWhPY4|2X7;u&Qqi%JcT{iGaXoGf9JX1Olo(uz=U4|w92 zmkGa{4!yaOji-L#og6z}8*#nJtU)>aKZ%SV2<*Kk9~g~Y%|cbPaT&hn``UJw1iiN~ ztQ~fpOtMvvkY-ni+g|t6ub^)}z6^Ed4X`%iT}Af$ckd$iO-NpQhe*LhC)oF9X+1d^ zUrS?isp#9-#~hZUltZjsp`7Vcxr4693Q8j$ePLI9@wG}U@y5>Pn76lRucw&=ubRjuA%YTQLJYDe0TYzqpv;3Sz`%?3o$$yZfdL%?dq8!W)LylUuy&-+Q3qZg-%XRE zFLYH^NJxM4^q4CmZS;Kg7Wee59nB-8=s1&h7IBpa3(T5#3B+`>;b`xsh(4}xqG+gh z{@uB+GmD@OCsC9Emx1(5?5J=e+u;7~buI%|X!w%lUXRTLd*A}6SCXTnvFX(G8^M}$ zsa$+h9)*+CmX3mWkhzIsTW6!eQD&1vkL5qlFSMUV8(ICC-9bg2z}CN+Xb}Yjsdhir zH(vWB#r_R*Q~tB&H?{7c+Q%eG%@(P)$8<5aoYuRCfo)Ga(*Pbsax#*}?ph9|u9r3H z-lGEHDuWf3=fSM1lGtTO(4Os~mG5?=%JgAxl=Dzj#Sga|j>Y^l`Kow4OUu=3d1C;Z z{9K$r5JP5uGm2)UJP1k6$v~v{iVsUDaM`mE4CuZ=CJ14@W;5}BlT>98J)-atQA(9&J?6^ z;CuW1&-xSW>-js_;emb`Lhj#CLV^Q+q_cT^R@WM)wT_mLAXww|bP?+5_L{cbaGhOi zbr13Wv0Aeao8hAS?d>|Rc;D5;Tz;9$uJd}CC@CvfdF)@MkZPTlU0=BI)c>4Y(~9W;6maBr-3&q$gU^~tj#29njMEv`eiIEPqtPB zSS)7<(lRi^pc)h+eLyJ@a8f3Rtx3?Dw*ctdbGUwMsEU|J<`c$)8VW| zc?1!+V*5E?uFHFjXZdQQ`|j-NiuY?6{FRaw?kGITuwe`ppQb-D-{5e*Wi0Ba{fb&4 zOhSPxk^ac3h|l@s_#t&kjP;d$v0Cla+R220AJX|Sf~w}d_(}?@3ZJtoqm5Y(Y`{6&u}>tg9G{h` zTFRnK*X_!oHmqN(X(GY02E)y*@=L}~+va-s(Vr?w#_`!{0gMZ^a6pJ@O{sKk;+UDM z%syPpPHZ!b)5Fm-Hj<`5elkH+j1=bBf>~(I>?!@%sejfzIYY4b zYHU^&8?^ra*oVjL;*y*Dy3c)njP++`STfACiZ^)}Oa#=Br!od^q7@ zJZKml)HvPkUVDA}2f~3S=WAV6j_Z$+l-{G_>8jUL;VHZHIRFt1U)PZt0&->19bsaf z^3IcZ$2kmb3D7mDS(tV7Q?2%Q)MXj~e1(Jpr53G<+Ly5;?^*$5B^k=x2xP5_rd3A0 zU9{3vOaDz6JEp(pYGtD+va#^=OSyt;nk;tP+8h_JTP z(F&lVns72hi^Z^zl3Zv8LEsnukjuMx@g39F%`zIkCTk=Qgv(v;cy>8Jd z;Bj7#Bg2Xo#ty3Kwd>MlLjA|&1Ckl1dR$FT8@qdz0-F$Th7}ge~eqBj{b0D4_&)?kP#xgRNrDh=4Y|Sk11kzKO zEEAf()@D_=j&sQ}xzD<#ygw)_2 z0HI-DPHH?38AIQ7mxrBABxE8WI%l%js>Aas&r&1{vuN$Jc>%0ewPa_RX z+Uk=jQtf>hp0qI12$`JEhu}tTedtKf|59ZtMpG_@3pyB1e!NlZFcJS~J9Xi_U3$BH z1i)w^#6BY1R=r;S16{V^@>ue1{a~wL(3{6l4(b9PJglrB(dZ>dX({_y4FBW&(12n| z5#s4I{;e}7T_rg^3{;MZ>VjjSN#}mfYFv`M6|nf&m<&qtx*~#Q!l#kSP*0y}0IB~? zly^Gl(z@mwWrq~08)0G<75 z>>^TTdiFmregZp61VC;>-CZ8CLB@s)1Un)84M$TSpfpV}K)%AfK1KPPOl-^fv3^R1838^m;Po*fHLnY5_!hI%@jQxd}c z30-*m2qs$b0#s4H{fq@J{@)f)c?S{HuX7am6ZBUbBCpPRmFK7&>!7CpH8h9_E2Cu3 z)**1WUW~C$y<~OA-PB)sB7vDkcInF7@OdDngi@;3fq8oc-mkm^IM7d5_Aw5MaJl9*Q@$IAXK+XMYVA4o_2uS| zg@O8bTNS}M@am_mDh^s{>j@rUswEeZM0|=^b#%TtuE^7Z-JO>KBYZrDTS_#$8ktap zG*}VJA1c~O_*Po4EuS;NYf%+N*D_fAyJz(k$mN7Ouim&jyyWqCx~zzodTiypv$^Cs6Im&SXKn_0UH%eZ`lM&hcZNJL4=bLp4EPXif2sWFI z#19;<_A4mpp-eL;`+=jVe(7jW#j9SIZ6BXL5#Ti(J|m0ej+T!uvvFxk!}?@dw`!(r z8hU&?TW%I+@6kQP5YIYSiE&o+7T%_3S+Bq+n)Az#l)Vl`YnDHwzEA<6{Yq`1TQ;-0 z2FsK{>4KL$re}fOf;KBDFhcy0{`EJVaxyeTVdLt4d^J0R{*qEYrTT*ng7TqeE!B0m zwv}c7+2tOCfE-C^Vwkr5N&swDTl}`4F!`Ogal!%xCcJZY^?1Q&$3Wn?S+~pWGK#BL z%(XQUd@{53%yelu5{=7lr`OYj&*MHhk?}l%%J=3eW;MR?p^HyC@+01m-3}R*C~Der zvD8iZZpK-rtM0QpoF0YK`C*=aOQ#KNMW9#ZWqFOBQ`c`F<)(~hbPYXXIsUWE`Z`^_ zCgP@`gl;C9e!Wh!TOxS9MVbKnn6}c0Dsd)MbuoNpS#dS%YQSv3r;w95LuTEgarf@Z`>Pof7&0x<^@=2OnbVo$ymD-$6Cn3!gToZuwrz1kKHDT{9clL5Jzal zpD)}t8=fQRO?<%G#MX04X1a4|_p{S)PsS&ag}hgyrb5R@*YYRhTsY`!IDG?2>)z>q z{Yu^FrMggZ;ZiKF8t?SFrbx#eI6H$sF9D{QXlKp*?-KQYMo~@-YBY{m*j}I+mAo7QpM!{f zS1yrtqLtX<+{5uTTs0XEE3;#NfpRJx*UDK3JyI+4|56`8L!$4MzokdBIW*jn*qjAr z$l6Vo&yV~Y2Ay6FsJ6bS7`o3BdEO(G|7ej1bAexUGIh1$ZjFBw1P_=X>Z}Hj!gcvn zn55Zqn3{w`_XR_ZH8*YZPq@6GxzECEughV63XL~bNfzg|Y(#uZlHr90?q!EDN4OZ2 z&a`n8%^sc*8M^%hEk&ZnICyp0Xv)MQenIN~yUf7!wPXYT2zB3nfH~NKFM*z&oy@-R z58Lmr7U6)|KtJy%^CM4NRK)m*)5 za)5;vw^Sn#jjfR>R7zjNNLun5i;kT;SFsyajaW6SLQap+hl8u=G!Sn<(m&N{CULO+S6FC(@tZl`^1R!aIV3AfY$)$5 zW`yu-!1B`w+jq49<_P)Yuji~TSdv}V!tXps@|i4y1q(3NeXOudN9%t4fs{uT3K3S~ zFjmUA8PdJ}RY&N=l-PJ9j@bZ>x3OL^_Yrj>bWQ;fJVQG%vk9>u>P%06<~q}bJzia} z?LbuyAyFxx8QxRwX~B=rT=-0DuTx-RzSx7W3!HWBt;+S`DhVpd+O`0?74D;P54C z@6$wr!Pl`_;V*J%02doYnNGGbMK6PcSU{;}$-^FD6(W6W*jsL21BVl^I&OzavJ%bk z??a_0cQA6ni1}VMW@{8K1_HzufRYA+#AHV2l8{Q3;9p_A=pcS=vgaazAFj$aNt8^8 zPqa)0ff@n|OCEX=VBWgnAo|6>6_T~^6|Uzg248;Ji`n9S{< z5etKP_Jwtt0_dJ}LmWXVDjAvc0T4gN+ z61x2+6eH_{;f#=5CG7X-NKJ{8C@0R08Eq#|4J!KEqYz2ZqGcy%8XL)z;vtpFApb~e zZbB>?+HI)-bP^JiMi+u~_J@6e1FU z@P_-i0mTdXgT3HQRic|zA|r>Vt(qHNli)m~$r>us4H18h(WH>2ONml%Ey5(F6!zzk z3oi+i3nsLOwU=GU|3=FurE~<_{F@cNRU-_)3Dow^mJjCIHk*fjI%swRU}98{)klMr zU$S$tUtPb}A%Q7nJ3%By6xUAG(cbJJ(wthLji8V@)* z6BD$TY)DC4$Y0ns%j^!QsSi#x?y%BQs?19$HMK&v~&m>>})y)Q=gO)A2hIvIog!4h3W*+EaxFY{z>9a-_$#s_1830 zqbW5dGk;ZMdeZNSgc@w*RFokMx|E7kuO#7^KwjDW?mF9$y#Pq4eFr+Y67on(q*=x> zb+EE3h1g$;JFSCfJ`~xA(u7g(&>`*aCr@R4_1wStA5#b?z7pfSR zsr+)y$dM&BD5k33 zCcH!<&c zMf}TT{!EgrzQc%(?@MENar@Ny<8mrMVfh)d?^MN8At{9na#OP^K)T{Fv8u`UI>U%` z%@8tZKOl;jec)C6uABr&@35(MXA%s=?_4i`ItE!b+8=yRT{xRC2}p7^*LOw;%;IiWzz{L zROX`eG_9ElW9qe=v>kr3G+>Ys?xna=*_lT}ZogR$83fnPZ+fef1DkyG7UYA{?wSF& zdG99Z(5;{h4OiU0wQx;nWH{znM{}G5ob~31N39l{@Dk;8D@{AD-Dx9kt&i9yktbcM z;jDMkL#!xWajQNT#4ID<&?w4}rlY(%rjNs zAbAsBC^P0Q3~%rbKhQ93XcD{@FJZ|B%pohW4v z@)CDHm1UL2M_IUNm5z|L0^vK|cRBSCq7$|_$kt&9>q6SgG8Ihb&qMTqi3#i-w;Ch4 z;#vrUN22q;EHGIuUA>UnVe)`3&J^bKi3*)*xfwJtH9eKP>+{H8v}%blIV=S`tKd^C z*K+XItY}YT51~6r6zT=zN6;qew++vDVjzX}MK~ElnD71$HY+2gN{2S|JfiR{j=fDE z)wwwfZJCGxq$ks&8!*tVwTPKBcCnzlH-0AgMnzfVtKWZo@r(}l3Ad{zvR@>J4 zjCos8L#+;h_^0+$6@1 zkIisO27RUN`q=(?pZw&i1qmJDJ04|vYP(oD5kmdEQ=ikYh7vzgYbOy!49tVDR;bUvq<#|rG3I>FdmIBaJ=#}9j)OQ{! zRb07m5_<&hsgK6g9S_iJrp*PvxXsH^aB43eI=MX;E8lz7D=K$)1wCHeAqkD?r<%(# z7lD`Rmr(231mtP6%bNg!J5yeDedx&1+Q{t^z&J*XX}TuPr4ZP?$ArbKgq+P4Dx8T+ zHx+H=;qolgnG4&Q4fQuPKPud$050>h=5Kd+50cH9ERMr+O~~xYo=ZQ^wu9h&f78qJ z2hIBhRI>uogs4?ig(qo6zv~x&L>dAjhNMadr+Ie$usALJp$QuB6=9NhB29I$wtnAtj>jfj<^$80A{sMOs474Ms zBQ&XuR*lN>Z5^F%ZPvw!L%SCPNGOK5iKsBek^|qvESQ4%_Us0S1M`m0)bGxj1KPsM zB~j%q+(L*TYVtrjOZefth-Ka0%4AcY8$dFiE7b@T5idN z&eF{#NK)|Qe`KSo8fc!N^|s$w)HTj!#hb?wkL!w&oheV>y9{6kr_Hb5%*(DeYX*heXNpT`mCeEB$Zl(3k}EGHC-<7Em0)G3Tewh zK{KO1>qJg0Vw!2O!JK|LLZ0!3>dBLzipq{SGMUk|^rmK;06ZBmj^c$R`i>kTH5HfD zZvuPr%}~P+9)46U5(5LQCHGgI;|Z7{clF<8Qi!IVjn6n6z1>i_uOiz)dgPl{4rv$WVbpp|fED6#J8MXGL(ep-!G(~dlr7}6em3aLY zVd|HKTara61wseSUOfmF>bi0Z$DH8L$gL_=qVCjOLaXRUC-I$*@aSRp26Ia#pGK>b zBzl7Tv?$PsLz!aB&?6eIjPn=CWPC)##eA46zlWgD@kFrGfXbXLtku zC4L>tIi&vzVZDOBLx$%K;lUjeN;tS`@-Z6c6x%8)uQz!Ce8rEaj^<~ucpG+R^c?TP z5xP0sm2L+8iDc60l|C27n0+U)e-7)x9w6+Trpq>F^*rg2Au4C>+Al%IXxqQfd7UzKjWE-wtL$_(U-p8$$06kR2ioNbYm6T!yihr9Yy(3ql&>v4EN< zNg049k%u6p)vrZG-J3VhXy8}XOO%o;2s3C;As) zFuM?L@h(3@oS?+-3AKk(KI-I_Q#6{*R{sa&XtG7b5u>(g?zmpnBc-JGhDnFqyB zUMVu8o(h>0t5l0i)MF+jmcoaL5M*HR^}5m{^KKnonsM`|F$B;3WdEW=`AS!VsYZ7@ zMlfX^+dp@gx;6yr9dKXP19WDW{1J z%$#O6`BKI`RuwUPkuY@znb1SO)ZzaA62@^3(qx^AsVg5){{0Gzzd=0U zCPO^SK&DlLCn{TMTCOJbeLM`?@4t-h@CK^Eue;Z+9al1MFEhKycE>qB-uuH**lbpR zO63bWO|$(XmgZVpQS*?B0pz1@B=2YTE{HGc+pVqadS$vjyl8@Xn605rR;zniE4a2on>fpd$Tj7OplV6SB|g@63G|PUhl8sn06>$jhDGk4#+{ zyU8Zp|6ReVBhl;RAIMeMBNtD1))$9s>(T^ZJ#RD&-zrPW7oJA(O*rdqD4O!ROl}-k;)#@Fi2LfCeDx_vv+GdsBTY=%`FpIoM=78A%R2Z z`_p8*j=`sVvE}kUdz0!O(zE?C_c`wKc|YK058unP(rm5n%VDy*lrME+2bHpAVNNPDBToc;cei}c_uRblTvj-hVJY#UTnV~O^;FdBf;J*PUk0lh+}fzt^?aLqm}*;NYq<`z#*r21QS_o7!xv+6dFTG zft^;D`S$#>GS^o9&EdQ!8tWc?8JoSqs@`6rzg4JVtb{PAVFDQoD)idRez6aZHo9`F zPjs;rqge|Lc4zaCXU9%$E(axu(=?lF5EdO99iAWBPxnooBxflBYxACUU_~d$A?3{z zfrMtGjd+1Fp+7)_p`^{9RTvvQ)$DJ;%*=1Sz_Eux2xdLS41HiTv0<{sC%0}v*6ME= z^MEys=gj0e0S!6q%qkq^)_hh7LBXIHQ0y|sid67@|8i0PFdQY|AiE}0dJ1pmyW#fz z1O$XYJPj(>y^A2j)Mg666?%EGnH$pCNWTw8cXxunsTjJ}>%9O-#3^ex(;n<}78^f$ ze&5mB0skej=#al7LFufK<}P|83zT9REoP_tU>Wcts%9-0%)T3sU*V#C2AAQRhgl)A zUC?DWE(o~sEjW@twfRWSK72kY4@DL3OpKFLrIW@p=e!wdP_Z^k2Sh*k9WSiQvr$rEJXlCZF2Y zvo2j!6wMj_!2r>Z4rei9d$Q`A;z=A@dzm-U7VJ}f|qxO!XToocT+RI zVz}g%7N_cZC4$ZRw=h`nivJiD)2v|EVqGfhl{zMt${%f|R$tZH#|91388cX5J1Ahx z(Rz8{)lI!;@~vd3`QOu_q4Vc&hHcM<^R9^ff$PAq^sfLzu_s)=5UH&H55twWfLtWv zmZ~`}r2RN7VK^T0TUy0RX!0C)?ARZ>y#;>KV*^Pjt{+VhiLfQINw8X8iiDd5B%)$i z)zipSUgh)xu_5*}HS^6r99XGIE8nwoNoA0e}f19?CCD{LHj!0JDalK@z` z&jT-H-?y*zJ%E29fC2J*IynW=C8CMGZgf& zwDf!)(Y@ROj0?lxZoaE}2);j?6h;>n0O#g?kcJgCe6|yQ$Y&xwFh$1q22!jnd!HLt zj1BZ`%l}eXZ@gMhc=vw!LUx$=%7tid!sjxCPrK(biWTP4iWg6wQfFX!pu>T;b1VJ* zMCOF7|P zwdP2FS5ThZUG3t0y?fOxkKNsJ>9rHM8jz<(a z)(~C`GE*M}^{|Hy1gK*6n=u~+ozHX}I(dK$?Igb!l>JjQgTt7rC@$)JvzREBbD8D2 zO(9Md@14Ps*tyS6{*Bmdw!|s8^C=1%ULu^LqKIutk|jIk9>6=sUmn6a#^y`F?Gd!e2kFcA$%G~Hql zoH^kUicJd=Cwq`q^5aTnG$-66;$5beVMWPtTIHF+3MF*3Y2g}qA2EP|g}&U_TQkO{ zpk;+m57^{6(z!p{)S}#Tm&Z3GIDEUP%btm*@AnBwZ9;5WNhI}Ck)+k2pK4eTUL^&8 z`oKb>nKJxfA<|!1{$uTaBkTWg)#XUv%huK!mZU+29UIE|ik642o!&!2pU zNn1fQui;7)OZU&0m8Z{_TYvvNEJbQQT8dSz+46esmvo4yjaheTef^n5O zyQLdR>Fy5cE~UG>lwZ+Wh;c*Iw04%%#3J-u|m{2~Fg$a+KxeRB@tINN2wTGMU*HN5I^_1n4A z^O3e(!CdY1NPKn~(Z*Lf?{NV>M{yL(c}`8RgrsEXiA? zT6dCA`PN!eV!iIK@H?)wDmxl=lI#oBt-NsD!{7^QVTgK+cv8FU@wPRq%8CGT^{SD+C?ES-Xgk{SH=@ltP?azdXPo$ebBO~B!@2`2n*3Hj4fFn*JpNbLDjb&4 z8v58T%7}UmQe)OV8}w?;@#t^r*UiMHxkXw3<5QPKlu!Z*aC_0PTY@jCqB zl|oG+S{?US#6Nw`aWy)>%~A&hukJsOX!-NW5C#AWu9k|#T`0IT52jmTn{PM( zY$*Xzh2awFp@(;9Q(=aT^OlLfnU6{}wfCtkHOEq-O-TL$JN>8V8z{SKP_Hx-8nOh6 z5%Rj=KI+&S;KtD>k$sjp$imH9@c$rdqhR=*)-wQ*A*h2>P35%# z%ELLVdb#Jo@R(qY@>81gZ{oDSFa~DeXNq-a!fTvw{o&)kHnsE$|HA_Ogmm zxJOIt=X$Y*hdV*z!~R?u?m0MoWibDpdkx=1WAv(1iKcAiT2b78Z6pc7zKK}yz-_py z4EAw(Cefg+KZ+sN#QJ+@kX)mwqAAw&z2P#u<*By6+) zmG+I`gX4Fs7VUd~StTdr!ZBXYe!dNy*Uw%b-+b%iq9#&CN+dNW)F<4?QP7pCU0@QK zJ{}gA8sI+zg*4QwC(W0t>k&e1J;CJP>NePbHxvrzzQ@+G5ax+pX#_}(A1aZzWEP&d zNk1O5sTo^-UM9(ovlbjtecy)rX5kwJ(T9S^1BK@N^DuQ|4b$p|-BmV+Ewqq-S)+pF z2TRd-W6d|rU|{UuPFm{b$U7JotuitSfKCa6BKt=Jk{Sj3cQTaot<}C{)kn9sF`_0a zD`QNTsgcrSny5mQbZTo#;G`~CcS_Ht^%mRMWm#=VAx0SF5}0DPxkfG+!s{s^GRVL2 zmYgFExsi8je;C^=C4M2O$waMKw$I`NiiJN>P#Ox7hl>|ayro1{jmR(2ti8hLDoOf= z$y*Fm;h64l!Q@3ewwwDY^iI0HxPn&=EQpry?+b8)n)q{vJxT>Bx6hnQ@m&ZLk(`-X zt6c#*e!kDe&e*?cx1mS^$E)8#L*u`8r-)w5TYP72Ai*H@i)I@i#o^FXO zItQ@#aboKXna3!-QZIR)?4avP!%~}Lbf!tLeYSrCh`4%iv zH`30ERJ{!!%r#IaPhPL^rUdzm(vt;ps-PhI&k{oQq}VvI8pL3OjyZmU4~o=i{oovm zb+XIi2d$w+PV#V$cwx9~hi%Acf(T=$xw^mFx2c}5ScR#I^$z|jsQy?|odJW3rh@QJ zrpMCqiqbM8ii7()%J8gqV6^dtQgSI z-+KQ!38BpMy;)*~9+DAWAv>fPQm>VL7#(U=cdjn!`GmcTcUvmWyqosfs=PHPg2}*A zZHb@37-ya8jftPzdo)7L0AD7+?-~CqsRhrVu~3;ccxx2K5SZ+JpGnq&`;{-rpxAIf zt>|6rRP#d0v~@kca_0PO z1iM;n-?`-S?m%nwMixl`;t!2!7m4+GB8qU7B!#85pG`N+?gR)ByQ5kQR6T~~vWh4ZpZ@H=VG`t~zx5V~K;36;KY{$q!%`*?Rf*O$OYZ0TWVLI5v0R|2b z^b#%$tVJG}dCBPIg4k(vsSu0hoD^m(Lpeqvv0kZzj(vL_aM{{2Grogyk^+#?|cXC&+H z^zw-rHyki2c+yMArN5lPwAxGm1FndeocO2`0;b#{s3IUk08Y0-K|`=yhN1TTqvg5%*N91<}{Wx@6*FlZ2^UxGCI$I z2|nQcf_80W*AQ&ajK-*wp;1#nPWjzp(2PZ0vY_PGyl-!;dDBEkASS{m#;lSr`A3Ve zu4l6oS(q}qu?G*+CdKA_KraW|0J(&e0wPFJI0X}z%fF^&;JdEGj1Q|3$ts;ue1FRO z31%Yyo)%3iD|mKH-5!EJU78va*xyMJvcQOCjk(ZZeHl7v7K9R17gh2w`1&zz?EN@cSm?XX3&~#5F zf4^TfjdslF#_a=^*pA!Q3gggKqm%_bkAA$Bkao^dn|V=Hi9 zMW~txkeUHq;6b`e6Svb3q7juE8={gigTH03ihjIQvC8^Pi#-hQFf*C(d8J^jOfu@U zod%bJg}D&Oc+6ZKS4~E1_^0$eMVv1X42Tn6?@HEJQ&a1)5|Yp0#w5&tAf9UXxYn#S zh3E|E*>3B9xX|X+P0F|P+SLX&_XjXj7x#UnQQqZ?AvGm_p<}>H+TX#3kX4q20dT|2 zmrcXQV8(2Qff4>lg{u=4pu?rAX5lZ9a8S13wE1bh2YqQE04N6QS5!m;{J}<93BylJ zOx*q2o*rc(4}CFGXi%xtLN3@431&cU&~#?v`a%rctBi_eESnmbW}ra-dSJq4j=VFg zMB>iVJ3d+Os}aWTt)c@(7sJPD-jsn9fpK5f8=Z92(M_?Qq1E(CIG~Vr_RA`DAATDJsT!RC~<|q{5lP6zLp&WxLH|N}RX5%=c>?>4Kt(qdtl-aj+zq=9pw%4^}2Sxw@N?$Rtda6QLqm9$aD;Q4} z5oPS3T#hD+s;RI3{4Cu0)r~AE9qQ`=-;y=iE#UY$<4AeN^j0%Ys|u8QH28erZrkNA zV1=*mpMSd0H;sX7sl+7hr(sVG}P!k zxXQ?E8iWc~aX>la{2Nwk(b)!@^kq&_UD3uVbl7yH)=B$bp8C+>C_jx{6SSjE**h`a z09b^rHoD}+Ac!^?F@&aX=lBOTG1qj4Ny?kt+dzLzSTV2^{AS=*>tRDo$5k|JqLq;5 zD69i6haQU-a_*OcH(IdV8y|hXU7lAVCBthve9Y5mn2gjl;-F;_ zS;zoVf#IZm!E}yTtbqm0Vy&2nH)gr5Od=|^T+;Ue+i&}Tj6YX)ClxV$Li2qUUM*mg z7_>PsfG|cV)z}Ev$F#Yz@bHTJC>5dBrU+0!|pzerM=wm+Gk0ST)r6 zC_+8 zW~gO2?Z_^Fiq$*&s1o<%MV`lNNcMF|aV1CDQ6=4d z(s)Ya)ka9E#A-P|H0ZsvqYly(xQ5tSC`Oa1Ygyu3x0dH_NG6{D{?QQGadhc+j{00` zxFaUP~`lI?ZR#$$4 zG=`IxH!jLK)A+ydofxR5i^M1|aL|?B;sNQ?Kv{iP42-U%08b5Ji;NC7%h@+}Rpt2%rwNs&} z?uv~4EL9sdi_q=)ZK-e=s#PA07LK*lZ6+NGI0qd{U#utmwwru&jXMFnnf95DOp!#> z&Dn;xQc(+p7Uon7^<3^#OPIkV9a{XP)K>Mx{<|U9tqA(jb_L5&$tz|UQE1hS0)zzX z%@nGi!n_}ReRv%&`yE~W_vUhm_8m5EU2|^NE4MGHQzuEPVl%HV6T-uHJ28I(X`{I- zK63m$9l~(mbPYzddFSGw0XGCrw8xckvkuu1^@T>w}2Ti}?vA2YrjHs_((5S*ZaA*A12KKw_sZyTPW zg9LQ!t8hx85&{EN`SDS{%9fZ%=ZD4~yE*bhxHEY@ai+acOXFpyG_0`Tj$Q0=PW!8Ku9At0lL*#45x*cRpW3l|Q3+Z${Ipcy zSnodg-VA@j1xg$c50=YM$CoHmDPqJ67xL^x?DmsU8rfV6?1Q$9_0jPI`GWO<^+3|5 zF6PFA0V_If_=c`r3B&vL5t1KNX=nr9Jm+ktJ-v|ps9Ve&lzQXJN8>*l5>PGyDc1Qd zG3&aCpCA2~vz3GNK94VzY+JrsN;e;nb)dpT|2l~ReSVcVICVbI`aJ~3^9k2>pK_AD z6|Bf|dq|+nr?%t-shj-qQ%*YLX}6mXV&5(SS71~mhG%7LiYVhr#O5h5v1pfR)kCaE zfp!)*K*wBP#lsXE2^2$tZJ^-|qlqfLTmD%R*x`#W3D3Y7*3_hqp#Iq)Foo3H^ zIPw8y%WP`9Ceu^qmkddBoy^d&R>Rx4E_e(C#_4j~ZBgjE!-LG18;&=6L+&s3Yki)d z;QPc1Exf(oHNkxl@6VYyGHAs7%px1{2%%=*p(B6_2ng2Cm!RHPl8^9#!#3od`Z-EN zmi90U3BX%3QI<2`Mf7GIW9Rb<<03PP%(_PSqn8=LmRPIVNL;q-wRJeu(g}knO4TcW zK0jTvnU2sgFrbO(g`1G@IKV?k=_*-E-W=TG&i<~C*+};#deK^1zykUShcpl_B+$Ph z*cf4{3jr!j=ycO#IfNk*Gu;RgeA9&*Kd;$*G=urdS(CHpEL{v`SmofCs|inBKBB$| z4yxbK&`|dC!>^ckcjn5<${M`!bokIMT^D7-6mPrwC3<7F8p3gz-nl zuERP2{tU>citqHwE$B%sf#@#D(CZ-0F-pbH$c9V_YRF+Q2XNqTW^qxDlHX+IlEH%Q z_tv|$-@a{iIdTHLA%sn92p>NB< zDmj?t-5=l;BAgZ@cBq?gh*7k<6bD15@oPyalgLZdhxKAQBSRTU>u@9<25kZ7ML7Jd zC4FgeKNpT(DGQ$nj@Siiv{hHL7#YCocTtA8rEBgvIPuPNTVlQ*jyFSwpS@sZ=%fu# zo|TFEu}F`X)w<=JgrilSC`?6;*|V%|{yOZ%D}liT1FM`wIuty8Zpi7eN*SgWxy6Z~B>sCB`y1@u1ug>%U7cTm?@7?-2F2+-qXFjY~-1aOQAwX^!FaToU#ji4RcpS(y#|Svbj9C%ccI!XLD=jNI$L`4{thi4(oNK&U?fOwyDqX#t2SS;fT z$;R^Ez&W*!Mwm-SEtxUUxF#D2Vb4t&QEu&br=44OX}rGHuo|T9%3w;KZx?Q^;c z*NBdyQ~Sk3jol|aO#eKjg5TZ%>&xwsu4{RWZugLyjLx(chp|qhl(IyGBC3x-T+!3v zNYbVqslP0OUP07_3Rz$^eK({GZCXfe)w4a%8VsEg_hS3#P3M1B_x zRDd@~@`;s-oy8Ci9{)Z8z25j6L6OWmU^SWTaLy zi|CsXB7flJ3^%Olsw<>MpfYw&yb2fpp}jWvvySTk#bF@j6&TK`ogu*(o7@i@n063C zhn4U}!z%QZ{R{;Qu=*b_F;vKu0(82a=naR|`FuEkz2+e6gI?j~;S$ZzgewvmSBP!b zY?9~DTW|~K3Q2*^O?zyzzCtBgxSl~znEz7ovmPZQ=uF^Gn}@SG7=4-gkX6Ly>=zUBUsQLbZ?w|C*i?v>5A^wvkUr(B<7= zBg%pqh{%ue(MnJa>h1mG;)nX0!Gl{UDba*&w>mwt&!#<+P83aSzok7W7aEJa(=3y7 zf_ig4D~*Txw(FO|B{Vgg-%Gu9i@e`gEaeck<)RF+m{9#eZxE=g^vLG^)*{_(&f_Bz zb~a7xR{QW2@G}{MC!J>Q$Im84k9UwB3j>0Vf|wh818V_3FaA=HTUTOi_W zDXBPhNkg@0wsc^;dX=6%CDC+D?3e~l1k{ZGCALo-=Hp@$e-^=+o%dbg!h7Xl{ywcy zotDRa*~GaRDKQ}jRD^@%xmW3|Z?C4NpJ&DswsTS*n@1kfc#T6X5xJ9mq|3|+&YiYL zQYq`DQd^`&Mbfla9%{+f3OE8J1iht6=qY_}rp810>!lS)C6uBY=KMEAlC{n0#HZG_ z3B)O#Ym5j3FVAc^{!EBp9tlaxMEBb_pop)aMB!8jTONF2kW_s2*L(U)?q?BSfu8G` zK6J;Q>E5lEG-Fb5HsHr3rXzyuuDNoBW2Qb=PVjHXQ!$;nd+{UMEdHEYsir~QISx2x zr#&GfWJ0rFWma1)3|w%g9L#bXTBuciOj`|CZ>+wt7b{4<)%c--t^-3tpWwW0`yL%2 zrdbn(XUf^g3@nEo=<+H1}!<_3_ry_cs)el0I4GT6|8+ zhop)h8CQ}uF^iv}(ecjo#$!svUT+}G)Zm5FQkqYsy+_7$I#sF^5YzoXTOGAGI+2l1^<3yzb+3^M50tyW0DpMQ(@Em;EUwioyAk+}}HP|eZzVmF7 z&wh7*eKL+laCUy)O?f&zmdW6>h=xE`39j}spUzu|q}6QwGy^!0!pr*}rTH4EM#uLh zPqK%w-n+NUXdDSIDs46wt%*%5z7`u`&2xDvLtJ2Dz9=G$9&>WSt_ZvR^A*DM)|Ua@?q%@ zJXPztgWU>j5y-8u@;jD5zA5S5!!EkTu=ua(ha;n;4$>P1L$V9bdC%G3} zy0(e&s25254eGNO$fQ4_@I~-__&{-|9F@!cElG(T7|>8?U?5H>pQFE4;kWDCeeH~) zHgmF~#9s#_KpE!RFbINE&fsbE8?$A?(e{r$ORrpNcQ zZH2#}zYs<@c?iBiGXkXdh)!wZnE>Hx`|F=?2rhdb;|LDbD)o!OLhkSJN?Up}YF3mJ zfC@!q`R4+m;bVx{iF?D-4l|et-XlPJ?uN3+s>E3hqES|))b~=pG#n<(&X$hinC!It zQ{RGwRkQ43JXA2Tl%$JA#qeYxM!QTcL^8|QBkO7=0I5}<=~_Um7xNJ4;B3| z_>QBkqp065w4kVOqfocc-%fpy1`1%hiZ*zO-ESnj{?KpeGc-UY3F;y50AoSXUYLAg zMc;}MQV&G2aeL`csI;&wRQU%u`&N$LOIoDq3|PcvD8`;E97b`wiDw)bU%%cD?{EcT+`NHeo$QuvVH`vhAMo@_?U4)~ICIuGY_d|VAUrgA6jZc9SKon9+ zXh4@nnIqxKZWBtpTsuHZ7ZX*CPz$cW6fTyh%tDKJL|=s zxI>tC=Hravu8b|S1EYdvlI9@(eWHGT!6sGOIwH-ae5HwXfT-0KCR#sSghSb5( zV7<6*tix^$SQb*(hBUug(=MDP_(oID9#+T@;}jxO8w8;yu2r~IkQbK8Kpw5>M+N19RNyjn?GtywmNhZ2E+3vmMbdt zzkZGe*jG9Tflf*UdJ5>US&&%p2km#T^XT6D%sQfg5k`BF#PMlROSnKiZIFu3ZV%&4 z%t`u@gr{v-Z*1Ua%ZQPGH6St=WTxcwVXPlt_hLE-6?-Cf<30NL=mPmU&jxi_v0pSi z)shO}X4pI9doM021epBh&1<{;lGcluZj;|kuJ3<;+O_9xk>ju5H(A^2;}a+3aG?5> z>NV*<>Xc{3DNDNzAMhuk&7W})Xxxubgomd3%43hD7ykkngt~4Kj1>1yGga@a4{1ig zGOe

>BCkoFj0e>Mc87`oBt=D%|%W2Xn~H&CN6n67F!xF|XrwIlEhOO83Dv@3f8v zoca?6-Lt@;Izl-J61bk@lq&PAUK4M@Rej@Uuwf&RuL$PM{ z&F&nke$R0t(H#+gy?q7^nZepVUK5r%S-EoJ3a4e)_!-Kr48<>8KV$q9E$-_aXUGMi zQ)a{0!^WLR|0KgL{y8O2MRYUAhlF&^K_?blH>PItr%WE;m%`f`GUERThjv^bG&eWL zs(0b>dAV<8KlATS$!c@tf)rv?D8?ov{Ao1UU7MUW?7v3$o%ksj2v&)AuoR8e!LZlb zPqXg9lezH<4~=*!A6ap+eCPcW`<^qb=7P3^q}237`TAlTj`4ZT%Gb6^LPfj!R8tc_ z^wB|PqQ&L9bNM3JA}RU-Lxv>T=k{89rHQB8S^$Ih=fiOywGY|0(?#eyyc#auC@UD? zp8ect-J8bfy1tnnCU5(O6g@Fn3#Vzz`aF5aQKB)cZe~^w;8f$GGI^9$1jSQ`A%^2&qvoa0Ofn2v^SyE#RlUM-*-daiER(!^6_3W)JCWX& z93_Jl^OV`{Qo*6Mb+Ay83?XhD9`$<8bcIPa>|2U_yEI=VTAyW39 zXD1Pr5RBK*wx#P)!(Q)pW8@nRenY^B!v>wGOzD8nJS<9 z`X>i1AsZZZbJ%*qs8_Q+Rc)lLrN!%f(1*wf6*LJ*=wf*}gBhg>SIcWRC|?49RLAdN zS)O$zZA@oz2Hv@_db*I>eV?fk&8|6;6XpFUJQ8xk^j#JdLxjQ|Enzo$Qdo?-=6=3= zym;n+ycp$LW&a&7n`gzVg+~n^Ssh?O6FFp%7l8e}0kN~}JD$ITKsP*?j*VeQY^b4; z%jRyCZCpqmI?7N%0Y*I%y12QULFS!(w+;;AN6t)M@px?6A8jC(`cwa;u;h^IJX(S< zME-zA7y2A)?v#{ z-@fJig5R?Ko;C^oQKqWdu0W}9zOj1&gbBof#eU zU^EMBYj_!GzWMFyg3*kWfE+pwF3wA_TLONeelwD7>}GpCZg?=mOfk`U|iG19+O!);Y>y>gHqN0iZg;+MkY8dN=R^GN0_>cs|VJcBhfCnl% z4&k^i1_`T3O+xUk7&Y#&uqLxzpR|Iu0nj2;4I*sQYL}y=J^m)*E_*sPf+o^7E=bk0;<@ zx^(9tyqqohqn0udj^m6+M5oJ)Q>9xx_~xKX%1useLii33UB~nUY8e}l z=agdY8{C(Q&hgYDHSm|k&I0p-IHrS@ju{A|`+>_7kb?tMEG1<%qP?WqKKhN-Gwt9x zOwKP9bB;56eM#yEmle9zA15tol7=fQ)n5P9sm`az(=O4{&}X$NFG^mL8<|E;R*U;~ z1$vj6{#Ip?TDI7D0XV!QV~a>a92a+i#jk=Ko7oMDwdA)b{2^9bSm2=eX)-OXkeXU% zG|j}Z^kXb~>ckd>n{cnPzR{dg-=$?r%4ew)g4oE@lrMxR1z-Rc06N8x51LZVyzhh| zk|zac`f^D%boo@Z`Qu69wkgNk9(7aYy(r&BUzqm@VYaMtg#YL@Fx+C;AQ^!3av(uQWm|n!na;)Yo_}uVx!U4;N3s5X;R2D zJP>fF!P8fa%Bhai-Kp@I+g4*px6`G*#vB25xPgD)23_?Ufs`-F1 z+Q&=xL(`=ty|!;kdY>5gXVdnAhW%3nCi>QC)W7;HFr}rX&(N*tBj9MIS@}tap=cYr z&90F6hXPXjFA6WM@KYw)hG$M^W>e~CPH-An)Yx84pi8CAk|SVBk-`LthDpv7^GixL%6|hH(o>uh4n*Rf@l#?F?cA`Nuy_0wy=q>Uo;}n zs>-2gu45n=omgJW-LgJ!S5Whxu9Oj~Uk3sP?yEI9p z_D7%)3i&&7QH(uI$T}Vi{GN4c$(aaiQe}pT81kV;>g|+zX8@Rw+_g5K393 zf`xV;tlvP4B1@Pi)QUBvq_;7jL(d1cZb$iYf}(qx&_6}*r{rSgV!5%J5srbdY-Gf0GrWbYiXgd+WEfvYglA0>1TaQ4mw!-us24sT}Ox&vczbq;vH${Gnp~dQ;4_8EW z77~jORc34NDMi;L=p4*cgu_pgrW?+Y(?4F9pOo^;Y6$COTD1BK^k%J>&b%uShzXJ$FHSlgT7%qMQM5dx^1Bl7Z4{gjV&f24c8aT7BzsH z5Ch$2ezq7+-*uWRBC21yh|nWs?tN&yHZo~=m~Fs{$RevsCabBKyka1WSV!jl%~WK*7-Pi-pdJ8&CD5WxFBv6x(c-o{b{f#}gBTBgUw z%{KwEKDW;DDGeBZA{RplD`7Uqy39?3_=%N>*SHDD00!(w!K`&pw?0p}i-8M)Rmh5d zDeHA}{_n?8#NMkRlYgq`?2UZ4Wy0q#j8YrnyXDE16)VsCeVrkXj~6KEazN5n#!C%w zR`WJwKufN|=SL_ZM>Cu`m>794FW1vWX!5_>R0l|bHs!|hEti7~1Pd=~7BCZXzkMHk zAy9Y0y?&F$xU(+Y!JlD3!0B7EXKh;(zo&879Zw~I%7sz;xr#ZcY(wjH#RX1JaLIoq zNxv#guu&HBc)+HFmY~S@PqSj~aeaSUH1zm#d~_vlS&0)NJ|j}!-<+i4)lz(5QK#Ny zYJlQQ{ui0Qq?%x04`%?m(jZu@*4}UvdU5Se2C*}KKL^4D^f?sLJjfjehFv2$Hv21%B$? zQWoI+UrK-kw9syRwoTn?g2>jN%cBOh{X#v!sz!Gj21H2+RtPlsVvLJ@CAWwGlv35m zrf=s=At!`V`f{mQ;K39pCAPsDt7^8a0XN16HO>Stt{*hXp#c>>e;`SH6%3aK7V6K% zvlR2-vy~F_G<<8<9QMCyHC6(@GsSWJ>os*J50{&Y-~l(@y{pSZJ2D)e+6gf9Pk?B! zau7hk6oV9LX-+*6xeR$*+O5=_tmsIv7lQA%o9xM9uOQ6&%2!O=Pue3Wjc3BV{K za0@NdjVXp>yxYKQZ!Y=3$-L#F^BtD444O6Y^Tq5+9!Es`R>%#U8?3QDqtH^DVXCdN zPN1OJ#eD-Ho&76R>*#*+7-Y%B7yEOB7?o+Yo)YsrLm6hB6mAIC0k)lHALa!sDzo@C zHJ^X%IR3ts(PX{t*ckV&CoP#zPUfO({Mm7l`)fF{(3lz4Awc)q^Agtr8P;ntzW8(_ zW637Kkf0#9?J%+?L}LSAwu4KP*e$kC`Bq(3ba{E+$C*zR=l)t~z)OsA=2-6x zb(Vqcl`4CvIcdKN8)kka&6oWnbqyL5p#b_9&0qOd>35iZIqLkLPo?^ciHIzzD&-)r|!OApUg)pMbIS{#};&Z zBx@A75TK8xLb{%1ZI}!g+&r3ms+!iL9c5>`~+64-R!iQFUaeK+T$9)^jmkh(O-FT4YWoEFzu zsQ061f6FUxL|`N#@vv?DYTZb0XM|BN(XiV1NZE{_DJNXteGsvso9aL5xEtAE zZ96EM6z^C|)2l+a(o=+6} zD7~NH3jf}USPtMR?hJ3tyr4_A!>Wg6Rxaa@SVF3J#V&WwP+>hHS?yE*71B`sFr!*P zeff+hNE@31c{0h_ib^xTgJgCYV$2}Br){lBOCfHd5omcb%>i(DEp+ccR==`RuhvZOJXv`-(F0U<0 z)7^V9vE>}#-*-`+Fdp-~fcVb?ghXJn9;(q5|Ef{2DzNI?gq5|q+i}kfg=*%vQ6|;` zBJ$MU4|p9yD~HYbnmdiUQhK=>e+Bz5c`sCE0|!36_OKke%IYIDmDnK8Rx3dpv$w zEqw1B#Y>43sv6e+za|F4^=CggB(-uagb%CAnuMCJ>uYkhV@@Ca`gM70T=ETH1mX#J zYK1Y*xKKb8uhyrPmY(i-?(oHwy7GP24sk9+Evg(u$x$yB$Nv}hb`b?4gT_d98?oHS zMKrt2l$4nZfaQw;hXWvWJk&sctmZ4AlgkHS>|0z<-dW9+1)<^>`7y=nYpk`jr#~%h z4Yzak;JrLG3Fv9Jmce{9HaradA6>}>UT5o{6}nI`-%{NmpYws!Jfm(ZuXi)688oXJ zI7wMye0JpTs)RAjsZ$?Kfo+Pfc!XPrjCtxWq^yh`xRn~G?)x(;Dry~rdj}z);H<|a zfu96E^8!%_Mc7*P`RWnemxBi7T_`&M^=WHT=qTXF;!zmq;`G$_#85VngNV@#{FOPgUnH zR|2|CC5*?L31!j|0`Y`xBJUmu>vt%pVU&C|Gg7^GSlRjRe1whd2iXOc0H*IbC>YrB za3%}Sf{tLH*O`2- z&}5MWQx|iR!ReRJOUjs7XhZ5+UuP&l5sIO3fC5wtu9}X(Rvxk@1DueC$>KA!644^; z*YgutVqiW@sR(<1xRzil`zkpsm!m29>la`jlnw0gXl@95COG(ru^|c!=Pb;8&_2z% zZ4rc;8xdcz1+B!#h5u z7Zq{U?!>@BUqj?0sx@gSVmHrYI|`yraAI+rUR|dwnr>xEKv=8q^A511R%fAl0huf5 znlf|s_e%CBMRB6z7Z<1rm|}<9Li7K(7u;Z zZz!yIa;*2nIXxgM0h;qIJRVqVa2F{)VPSo9FK5jP*p(ChYX5&d1~tO|9Ud0@{pb5Q z#gnf(YBic2y=}@J6bCC7hfuT>fX5$9SXTA z;9CL57mV9Du4dhY(So&79onp_#W)V6zz(Nb|My>6aSu*^4iIhUsfZ z1)WDUqi8p-`BtBgV{23I+|Np7)@pogztirvO;FCO+|a~Fe6i8DYY6b+n}Qh=4H4FHke$PRF0?X-{_;irDYu|-jdXRke7f7 z9xm0-xCGDKtgTB0gx7aAT-sUZ^a@1AVXgO4A~Y-Zm7p7&TVY z?oye+zV`#%kEu$!J?Mr|*OxF8mE@5<>`ny@EnTm9 zJfHa^Sk}f>{$>nHN7fe2Wup5BJ7x*a_E6QjZfoImc@{~XTJo6~FtdexHr;-#EJLJb zEDJNUsX1I!9nYEFT#~F9J-~00F6Z=&vvw5NFZFR+feb0zd3DA%vMTc<%SrA+k)W?z z-#prwy7fb|;A`IZHm5X4M?KgEu^$Eq5k_J*N27+Dpj!r{d0CPCVfL|?nA#jKl;^P& zDeknfDp3*-b@mO=H5xWcU|C<7mqy<8o3P>vn`ZUY`%%w9vuR^c*HhbB)@PHo^HK`o zgZhcgk;vEmkM)nXn&M)sih{-8%%6xWj;c&#$S;C_(3{H67{h^mnY7Hubs1PejMvL|DJ;-6oar4o3aTs|U$1KAZnPZRzK8O{38`^xZI3Rmze`LR=kY`-cW>Z}t> zJ=+fUp*SNj89yT~nn`@vPhAweo%U*dvboNh`@^pIr%`jQ_A$)iXE-fx8}f~n+n}*> zhU5MMf>D*RV`Z8nCs!kTHV>*$T)jjQ_Urx{4N(qRtXOcWTN7<2AeY?d5&9HdK=wnoF{WMQQypv)AziDpd|GSpQqd2kXN0j zJ*XZRdw=%wW4xiQqDZ8_4jow)gGx(xTp^JJf(5|;umJgZ2G|%nRJBINy4#$?n?4^n zNDvJOrPxvG!TqXzO9a&YHo<5wx*riZA=l+H+Y=>U-O*EwvUOycVn>B$ss& zO-yuTO4M3=6A3MVVQ$Q@urx@MgTOvWVx}O-*F|rPO}wb((0ciV%Vi_qF5K7_l=m^5 z@nj+U(~EXf1NaYL=fxgf`Zfq8+c$K2^c4T#n)OPvoSCpxcxfYZ;zra8weV#%udF0Q zT#=oS#A&o3KW0(;HB_dI;AoAJWLDF?k>q(@-xm--mAI3Nfx%}xl6?o+*>fJv2%c+c zh~ZGA^ckh!d?uijG=WkU${cN|3Pi?Z0KubgR*C1H+luT+Nj(s(=_PFPo~-u7K3{@j zNdY(%KW<3K-LbHK-U{a<2;A@?`f0zsPjxigpV#c$$)$bZJ?HYyq%CmZG;K+oZC`hu z=O1sNPX0Fn$SNWulI5>ohjIJ~CXi-;;TPwX(fFLDlmYZuxBT zT9(9?@ZNlqA-L_(faj_t(y}bjdI2eeJY8<(XfMC+;z|(c1>$c!HxE9_E%YJyGs78= zbYm(mRMypRWD667DabjzBn=_s#S`yjW!p4g?$~lo@dR4E0j6>?HO%JzyfuLjRT)$G z>m3rI#R0+cu&gH8QtipcDZ|EANZ1tgGthVAH7bIa2Ln)VieRE6gff*oPAG!Lsnm@a zu*ld~x2luzCP7?NBEX=SACi4A{`Ma)T-BTUc4gSF9YYXU*h01_@P|QE(VrY9m~K)u zed~^7k6xLcE!4yWufq0U^^c0@2WExk51T=6LVw9C!^?Qzr|8490~uyzheJ44sYs%w*;0+v+wS z$hy9Ujf8xSLQEq?dW8NezqTfid^JS$#SpB380K(N8OJ)`gFvi9{OUe1PTr{uicl$L zUbaV)-fp7{c5dR&1`n%GT~IV&-jqImO^(N+Isv1hlL`ftBXx;pss7gaFR&t2n&OrZ`_Ai!;cOLp($K%x-g7gO)P7>1{N4d$y#*e1KagmWiXQCM5z6d-?ohZ+8 zKYMjhz;73gr#V`gD<5kKhQ7Q(LX1-VAnSq)d8xbcY+(<}FSGHt3 zKvE$v+T$Ec@R|OeCA>`rCHzy~v**X5>L+yYuZ`O`hG-vYa1Wt`dLGH}MziC+HF)+VXc( zvniBeXiSW|CK+e}v}BWv7K{FQj>t3ljt0OS92+Fb&2j$Vfx~BS%`(k3L5jE zq)o_aE7a2|eO@A3b@qf95@bOs2VZR)4oT7iNV>1iH9$ZCg*`Xa4({YR*k@6EdW`WNuiUnv9Wbo zQQt42;CCIFfe^JXv#R2_xPNk@HT)zK(2GD%=TEAdo&S0R%vnuUoK%3fVTbKaBX{#H z!9krXQQWJW5HEWOCCbs?jCTM4NoPCN_EG>|eF9vqUy!nZIgpD$DU$j#dwm5=57xU& z)b$y>gi8_aU?I9(4@HmMfyXW@qaUTG#FHi9eRQ5@F!g@z-ABEM(>6kwXXu{^h*I6? z5QTh{6FDaCJDtl}Tpe5hY^N*}FWQ3f0fBhkF? zBg-S!vB=&bsZP@D66(vLa89KF z-(8Y>J$8<{O4ig%KM12{iowK>fz~c31uH~DL6Yr+2=`9=L=X}1MmpS0kFu9Ho2FRH z?QS6X%clp3ZropNyIgWP5v}V;HAn95e;-*f*C@o*v$!Z}H~?Z!7JSMZ{IZZXn@ruQ z2I;UkPQ^e66ytS^_#YJ-(3a=}bC6*HninJP36BjDKV?*VUKzb>;>OSc_Xktk^{2xM z@Ye07p!Xof55^91qX}F!iV5t3t9g*N{aY%iH~^VeYui5huq-()9>o@B{;?bSc8jN9 zQ`D{EDiE2Y)$RbQWu>)Wy(MjbD#c0fsYt(&soD`)=hU&Fp=9>0RbJ0ILW)PrY#Jg6 z97vc-0#ld50wmKUwgPYc)y%b~H{&S|63r_{gjT1kDQB?p1ibumvHU@lF;MNx--yI- zQIus;O#3~-qyfwoLn#gtg0Q{T!`Yg71|pB1xENRItY`s)YgFdyR~y+Gy9QzNrmS1$zbfX;OzT z)pBoSu%=3+C~~BZkK)+*-=K*_&I-^wXDD615-0l6RGC643X}cweip-=bM_f&b=kvv zZWwsJfS13;J+@yu%&$GPcpV2NF|IkNjZ~kx-I|S6yWCv0JV(B+Z|u^3`{uTIl;$k1 zry#d@Ua3~kWRiE!vv@k*%jM7CevV&Xy1EGHmc2dOyRPO633cgj#|r;|l#aqaVxzre z|2k$ZdvzJ?`QzMST*u%<#K-q0y-UvX`ieKLu%Er@>XN&*+3jK1)VF_F`w`>fvYx_A z^Zf0CT*qczbir#Qq~avUHuP%qJUch-t(3KASt->4QibpgEi?R7mu&8Q=Lmchwj0=VW>EEp* zyI!}A6V9DLVNUOHoyuDZm#=9MnG#3VCW)&f59pk4n_L2I#^CD%hMC(oK$Zt10(@43 z6G>~=Doee=CfrJ2Wo=Z+Hr|GzIC z5#R?*1yM&uz+|@QN5Q~AuD?wn3E~Nm`0($x$3G*i<0GTM`T9OR?C@QeKQpLR2rTJo zNQND6=O32KwVOWJxclXnf+jru5LE7dLvL`TVj=*L#B0F~c!y z-%ASdw}J~|&r={IFO(dhlc4YbUY_pO8|=3`g`v|$g>^0>Z9~9?O-*ELk2xi_#*13> zux13@Hv;1Adx3>M@TrT;yAo=g1<0_%e^WprZj=oi(G_`kE^L1pJ472HAs4*}9TETz zPyloiLL+>fDA(rZvdFfvViIhNh^7^jkul75d$FI93(3?d3d9((8%BlyBtC;bBITL( zfk7zh%^Gt-#mIy*OZD&5$wLH~rW5Z~^gDf)Wx!Au)(qN3XxlMdD#)lf1-&r+y96ffs^hU|}v%SG%6wB5FV z{qU%srPMJ~mpvX;E!OnJb#HG7#%>J*ozoR*ucsX72eYsyZy%)t>r`k||0cLq2XYr>v80}mFA=9X?0gmr!^Ut&oS|4BFc2otS#BlB#7?!149Sm` z`7IW`4R;Vwz%PDx2vL^N(0z zH?xM}G;E58j`O_c{mws}89ONga$?MWU>MMKwC2)}9;=IOPQWU`Gjzckw_L-qoL;m% ztDBFJa_agm)gL<55V?s)zG7Sxxq!`3~b@rCn?g z(0`z)C~fl)yc|6*to)0H>+lrrsrb&%xc~>6jM#7ijPG=@N6Z#~oAd&e-w3n>a}l*r z_LLwa$|FYHDBL-^49tXZn=6VCang4zYg~%#mZb6x>fEk%b$Oc&uJ*!6xa{N=`*hHx zZ;j9Yh_a~3tFWpaq9IT@f#|->8!Xmq7Kt@tk$23Bd$Sl%^@*@@(i_MxC0Fc1{=xt z^S4@!hUTVR!)GkbuZ=_l-=7VEIaX^d7!+jGOEe*m7U~5WCOp7Ad3p877LVK>A-&!o zG{1nwRLONNF1;Zj-VDLf)HHQqs{Z5fu`{ZsZg9=@_nSL5x=t2SvMLE7$K{V=lqQ=DM zfIV!7*zANzckuy&EVq>Xi<&O3-ie~QT783}VZm-C$SPu(x+t^(ks=4Z03!S?hmgVt zu`WAjAp6dzAT1t8+|Z3rqsBbZwIFwHtxgh$$aSHOoUiW1AA=r-axfzlKG!Ui1{d&u zuA!_70VQ4tY_?di;ulM}qA>DA>C_-Zg_^-E2p#uTQgSy3s+zby31pu4n{B8#wfM0_ zfFM@bi8@+c%5)J+O%J(v(FO$ZI}G*%F?r-&)m;1`utT>(PTr#)ZxEP9q|v>KgcrTu zjpv8%#5eE4=J2gm`}{S$-&hTi$X^S_S6hU=E-@4k&4Klz@n?NVZ2FSB2trwM8ZZ~H zRbQ;oFcEamtrZ*Z5lV7HjaU}`)P9LppYRH`s&fFtn^3Mc3Fkw1h>!aDPT&C>bSx5f zOj6BzfDPCKaeDmNA<;A}I|+Vj?&5H;_iM6~jnPvg%nb&9`C>nML7pd5ZGp!#YWfX% zfLZEx(ik9sYfli~c;r%1KaHzR0$*Hf6?A2W!7?dH#fs~*^rBkt;kg_^SV{eN>keWVbdR1>foe@(K{)4f4v?i72 zcZ+VkF&BM$&}Ih0@-uu%Tlb!K!l9Or33iYJ!s!}x-E~bf9x5?-U&bZ_WTmEVQYb!R8N3? zso7iw1d0gks|c!cr4Jjk5ukcEwd*q$-Z7vBZhTq_3HE>De~i6KTjtM9Y+t%k)fqeD zOG-p0z<7Rnf|GKP$=u=rWyP15@}hcE?aeUa{CqP#?jQxiHuTFmXoD`n%<5+Qj0I+U zA0LnB&xN`^iyZotjQX8$;Aq6fmIYLkAvB=7m=WenUd#5ave~QRq>%-u&SsNI85>!=q?!h$`EVY=IaE$;CJsc=jMtT-G zqrMWC)|fefwD2%2$#8efC{Qt*pjNuT=|EiuKUYXK1@IHM&SnHF|My%`fCa^mj;Kg( z)IbPhkXeg&bdI?a!o63NC0gK<2jtFl*CU3$QW?^#Ml}$uRL2npPR=L*CYpUQVT&ak zQXV8p;TPf8EbbhF^G|3Q=vNObzxLec4{z%R)sHCOQnJIu5qU~RP9JG+Dg)5!^9MqT zh!z&R%aL)_Ws`>pERpyLW0@~In{j|Ha4*;aYR_@rN%~wz(lR_>3)@-myl+t(-Ow73 z`lDEBl2q?CC=~x=5x)`UEX|=r`}!IQ-U+g{{0iT<{+6wYb*O1k2o27cGwa@^h$xpC z2M@)Pq_Z~ntEaRz*8wmczTC3=j6R^b1KL4FthEj4+=m@x%=LnWmzboZ%w@W{gyYp0 z*ENrw1?Cp5dS60D--|)YmX+HOH!8PFJ5L!~8(N{-h5csEm*?T~?cEg9*VM$|sMMZe z=z1%R%T%OG2b)5lmS>$ZHTJ2>Ts7G#CymnS1BY@o#>pG}N{ap55BlR5Ev$`F`Rb*2 z3s-}%GH+tYo7Sz<_V%aFe)=?t)O$)h#fFi+Tv!Hz_O7U+|1Q9$91-K6YJy#<< zfR6$^b>;+#LS)bD(32I!XSmlPcfcNk`~hms`?>lboQ1!YK!>aa@g|8eP7^o+enUvd zV6HKy%pw$$mPl6a1mwS${`-#w0({((UaJW)^n*y5)mas66;ucq1iyek)q7+Cx+0M` zDplj-*Kgb5{aPlHiJ@CZU;@^-<0X7(in~93_QRZE?4iWc^ym0TBP=(QKlN&W8dkkc z;SGq?foiUsKlu4nfBUvZvfiB19xqm_mKJ~H(9`o0B;f3msj#uzQLOyFlZwV?x&!+< zI45mg9M^8B3B(K~0;BC5_&@@9tO1V8!#_>J9nOlR!K!MJP3`+E$AZJ+H=KtP)cuWi zhy)?+vOydV14qz!Kp+soR_iWP3;mN{J~9~G3g$`LYQk82v*uj!1={1=1)}#ZxgY)x ze2M`4)`Mz#I;rc+5TT-q#UXqVTvfn-$?-J@!*To>lJlgh;OMtK%huT zJK&J3%EME9a75384E0kkEV?v5?G#U#fpDy+STOd0P`I@%Z1X7P%4I4nr7%{>Yc{wX zJ;nC~1K+8fy^(a85-isK`H6Qh;b^wElP$k4+d)J?H0wk?>^ATQ^EuJ_zQg0gYk0t! z%WcOa-0Qc3bZw8jO@1}qPT#>AaOVdBzmd?d_wK=p7Mu91UnQX`gEVP&f;pYWD4D zyuWX~9g1BV%B~K%NaABM14@5YGGnP2?~c-4Yz(VDSPpJ(7e_W>z1^#G|`Jl;Aj$-oi$NeT*F48goKMPc|`w!g+5PX>(hG6zLBrz!yUeSap)H za?*I@3v$9fJ72PzsO<6NC7(?h4`7g^OA-`m%7W1Nj_+RzQ4%X&)qKRbDs%>(*Ri?VE6=fUo zUAmISczF$OwjlR>V26S2VyR`10P}xK5APzC0Nh%TW#7jJIdwfWr1Jf`0C;m^QZQuO zqxecuPRy)AH~H0q%OTNTQA>-2gm@|=lCR38Hu_`l0Wmp>KV}){ZyWgwE92gROQDcU zlelE1RJ|UEUnZ)un%PvT^$5U5WjH$qIW_%TkT#K?iRNe*+&B5Jn+i$aMBIytJk&81 zO&?}5i%AP2=xItSQzFSMwTk>MvKv&YF!o}LE2zR2vG*C2T8T1_&dG@I>d~stM=`m7 zQF$OV#hP21vc{VyR0|{s04$flTZXF86RDYMOGJcc4d}#Th2y7ewqupU3g$a`ASmmV z=8g8@{L3bCZaEexWEy7^_A>}7Yk$&WmCdEgC$Jz!Yd8f}8lEp;1CXk-y#}wQ&9p}| zMXMFX-5!jjg21QC(OEy;z1(PzIp%<9p4Ez8BRPisVq>fZ*JPk_=bpXJT9a%MZ{6G5 zeWyQ`pslY0&n1_;n5oX>W3PD2%A00y3(sW>K&RaM2vNu8bRse_yxrMfZlm)0_zkY~ zk~@8)%sBNaO_S^xhxquS2yPJ-R2=SjD}wUdbcX4o_5HAw&XtG;f*jepe@%xDwWL7L z9;mZ{#A&CZ`<>Ekh3Ni_1mcRI<(rvZR4KT9Y;jql;B@<~+nmBzM2Y8a((YmXX@`Qf zu+lCG+i7kw1V8|Txu|IOnzgDCu%;df{aq)lco0J5Km=m*#TC;1DBWNwK7>GKd+8u8mq*&{#4_-H> zx(Zmq`V!0iR<8z%sab5v*FsFebhnUJ*{LtH{R}r%#;T$ol!>>YZe+l%i!&;~My{Q* zo%xtzxsoN~HMwn0Q0=D=V?Np{n-wv^>5}v1ml!H49}+|*Omld_UlbNd$`#XJL=k?U zOt9S8znIlmNqz{W8T44eh^CxYq1^L^ub@5_=w*|^c6|F*KS2!BC1}zUC&_=F^^pa+ zZg9NDS>bpbj$1yjH{?oKT+V$NHJOawDYcMId(UG74|MFZLJxkGc0!Fq` z*g?8*b}dnemQe{hKL(qU=LG1;`L$PwD?nH;1~K=@!bv$H-ArKCs+vq3)3)FMECy-C zF@^l&as9EqBkjK8aG@0Z7YT)<{(pQw!kgBJ{4>S;}Fmm&3#LYo`ksr>L`3i~}xk^VA zx2fE{I!d6NjEN$rj!K6tCAL9DnbIvRJp5;NP@&s!Kw6rDLe}Hphhg|RseSZ%1l&;m z%?1iOhRPe@xkT*>d~MkZ<_cjew}Yb@IRrTZ5nuNbP5^~GvF#pBwZef&(pz1`=jl== zV#Y!FQ6@#FuzZNSG!xjWmzw?~*OcUI3`N&-)?Ys|gsz|GHXNu~Gh|9#{RNz=!b$sO z>^-k!2zGbJUOt>x;iKSluMHhirnp>PLL*YTKR~a4>K@j-!{6EE>+a><8)X;S^4+@9 zPBZPhYa1W-Rc}s6OvRJEa`5qGF5nc=(Cx&@vO5SlKZ=bBcsuXxW=S<})I_di6E-p9 zeE7n@BKM@K^V&}clZv;hF1`r#BQ2HzzG2`|Px~8LHKF0Suere`3lCJIrS>?N>Gh4)qhcq@aJm zBE>1hd8-gi7F*9q#y(AeQ$pld1U;18&nPkI`n$G&czwB=(s~IIo^j zpl}SkI1uQ8_`6s@97+K{9!O@W^EO^tC!u(}-scM-13@n)woL_mX#c*RqQqRD1f9F4 zDYd3a3<*4%yk^zRpWd&(dafNuC(}jjz7~~T3#r~nF)JQpH0;;J`8oY_T~Lhof+FEG z({*6q(h@wo-2p_cCnGSu>Hs2{l!)(39z)On%JT=*TTk_VsejE28;{6MHZV=~l;MU2 z$>jbUbWS1rgDJqjxdT8g*hyI7DtP+tb6$EH(YjoXe}82hCSE4JV|k}8>;^WyDXsUA z`%PnbI9MheSyqcJgYL#)*?m9!jK{0u$xw!HA{_fCV(Q&R;Mqva_rzsdA={T=gR(B; z{5a0>^3}}C%Ze^gW_dZA*wV83d)bZCSD?+T`3_y@)YnB;=T?J?I=LtHvn;{zuqSyc zW7{#>Z-W>@)DRW`_*m%Iz91?;1-iok7T#!T`956hYGI-Vb$1us=pX-k-wgqB!L%MN zYCJApV?ii@mcc3;wmzV=ZbC)tUdP>kQM4gFXbM!y_-_CI~E#tsG{X& zm8Nnowze=)DC`e-fc9(PEhdTjg!?a%{9hP$mT(7Wt%R472vr;lOs<*~gMx#~kU8)S zgLEz2Opqxe;)2krw(?GKi<{;z^@peg<-ozjb5OUDZlIe1e-!!qV%BttDW%SIN#Tvh z_ce$xD-HP8^`-@nvaa6sKl;-u(IABJ$3#lh58S053kzu>3|8SVMg#y*s+ekk`778# zu2|FFe>z8~cU9dDB^QQ+bqL3>^zU!|J2E0X6sGdp^Or-p7&bRAnv)n_JT7u~zQ1<~ zaTT`X{L$iFDdRs6f~X6I17rYX>9&F+b2HBWx}`$%@=T36kLcG9+ZuA)J^$-%#rk$7 zX7vR(ZTF<+P_C^|6x`>+M9i48=Ya2T2Kw(&lN==wT`am1Bm}&g=$mDvQ9S#F3v+SM z3G!W}g@CuWwjGkG6`6t!oV2D?~tpL@!2Tf>WNakUI3Zi(;H;M_8BOc(H^QNL$!{FYi@E zob4Z8Bf?K27I#b%;t#)vgrqByr#bl!!u~h01HEgP2PSnbKW$7r@~E(iMM-WOlYeI_ za?~93n$EYg8twIN?V@oq#b3-E1&5qoQ6}n&XDHz>-LJs$idI{Ve}kX%l|cSJlEm#C zVs!3*_qKnr1Q8_1QTFFjNIgU>rr|#l2meJ70Lj%3(1ILpU7zpmE8vEBJ#X8-9xLlgu)bebJJxqn@_C+fnWL7}|R3`Mhq5PoV0RM*UDD zn)Wlj?>aidky`2uJUfqn9r-J~Jv#=GTt@pVmh8zuDI10MK4BxGexv)dUV6f5csk0n zcz<4t`P(&9#kn=bkj|5E-f-c0y3-#XPY)!e`?ulw_f7>AP|eKE-H*!ZLD;tGV#UI> zR?l}}M@9QVPI%V`8tSD|cAHSz3z2yLtYHBR6t~x8>;@bl>Dcz}jb-NcuCT7x=r9y^ zh^^e`Z%AIZhk`y%hr8=LySn_3xQx0wJRym$XKzV~sX=bLTi+P>uIs|om?jrAIu6%Q zS7Q?2*2goqb_w75TU%CYdkv;we&47bEGm|=a(bMzGVE;2^6l;>Oz+rNHKk+l`CK

_4|GzeH}=uE4$x1NnDO7d;X{!{vbfTLdXa$^YD=1t8N< z{ERVqn*9Jq*p+IfH8mKwbkos}$drQAW$ox~d)-x>VA!B#6Bt)N1fDJqpC| z2{BF8;^P_LRD!onq6D@AF-;bk?EDR}P1K_QRl57Te*GdqAU=?m&1F30r4ZHQS1Or! z%iK_%fnuPVCvh{s(WSO>9DFZhl52i z+1l9`^O?|_VGa-9=Zb8<@$r{@%k!lFZ_q~BGuX0HCwlIC?z^RlCH<9gY+47^5|3>* z?90b?w`1s4gaJSXizY);Fr&coDhigd8lfAb(BeL}*yqD1qk!XpOVE$_1$l?UXthlj0q19gq(35T=25c%Jb+;k zvQ9~Y)WMCO7&hm3%?qbllJzj`S!q!dGf8D|akhtw2%nCgIVSqUZPotqIM{NKDM0N-m0_}C{7JH6Ro${RDhKY!wE z$o$cwQpXLamrnPXiFju)f^Y;T4LCv;F#;NTR$&m>lN`fL%^_m^S(qUL2Qc{em%|{* z?Q-qrfhRbM2r5?B`SkZu;<>hD8tTJC^qHWG%ADJdyL_~Q{RfTrxqO4N6u@L6&%G{=qVGrHUA!s-p)f`Wfb%Yr%ds3OkitBC zcZ`%l-J+lW#d!cCY3$!!K>`^P^z{zayTu^ZLalHJ>==&F8UzT|NC_usTz{CLC;^M^ zi}M$FZHQrXjcbpQLtI&!jX*V|L-B*X8~|u74j4e{RRGqcMB6et*MR9v7+AKAm&DVY zn&%V~Ufy36TO>tn-e8i>fUm~--$0+2K!;rD08abd#ST^w1={Q~ax)jSFpx(J{{rJr z`rhj^>SPw+C8ydRBl{x9^@hWF{#S(EpNu4{jfRFf5bWn0&`j;v)4a-9-hNQxI$0sg#&^^+4X9j-2zR5qj{Gi5_mv;i200@N(Pn?C z@CE5V-;}EsAxtLJCBR%$Wz&-7dya zwgB%z_B&9lg>2{ux>}lvoXY|{@hjFNG-tUU^>D1&B{Zx)QPyqM++xdg_XLmyw2Fvo zVLr376M_gklixF{RoYxE`g&XUAm)qSRi3AP*Du|DlO8p?hhD>~Y#$=rEeU-ZEM``R zx@ofu-c%HlW*yfZU~;4WzkEV&R#DbmmRCyCcx0eD(s2uToK;d%+XCKvuKWCd zZ6xfe=mn0S)mf^fEK{E>>04~#Ias~Fi1LC&lQRLx)CUCp4c{Qv8qWHbe-c`Gn$_SS z1cEs<+yT||Qwv@%_N$?j7PS@lye;;$qpWgAx=mls{#b5Ogrt6hL^y;r!Dg@*W)lIy zE&XbdFGj{PTYuTGF}40*W+T>Ym$R$+Oxj^(*%SX|Hd50SM4j(EUSer@#~4pt_5vO0 zwKo@FDz^4EWFfcJmEtx>(cA{i$D%yUW%uB>w2_TP?4DbhnOT|fx>U3L_QX>JoC!A~ z5@X;&BJgKrXe6^8PS^n1cpD6dp!TnMvBnl;%f|@#wGh)#Qg*;w=M)3K&@}OMr-&}z zb;W9L|5nVzcm3N~`kdYgPQ-vzZ4X$Ak&Q}@2VB!l|-W(b*L zYN(Zwr&h2L_>;Z?F>eX_JHP6Af95(15ufFEN4>8xo1Y?1i2;z{N&Y)nA+T{a_lY;2 zhQKg~?zm$chQ+^t>?Ik44 z?IjfSDgK!Os5wlnl=sGKey#^Ible_{qo+U7)YvSnsZrI?GR!ofoL1-E!4z+Mq)F#J z*Yiv)*XFe&wX7pSIjO~BUEupGKMrgjH z?t>FX>9%e0dnH)t!0qnnYL$JtGZ1_3f14|$^|XAev3|xxFKdzv(Rlt)%svc0L~0rD z9i`>G4b_9dvXyO)Eltqywg&&5u}&d+@bd@*OQY*#J)Kwwr^fjIBL%2J9)aFfAH(da zn()-%vViBB?;Irn5E+aBuFel}SXO4s1C|q_z86qk*=NSb*$TIPR8c#D7z_O|1&o&1 zTp=Dg^M0Qiol>UdxN5k(?a{)`8!JzjiSifDt1TCz;m1mqq=aaEyuToHA^;bpgbpgu zc!jUoSl2p|`cXIwt``f;VppLz&^dVzC@4ROEea#CrTqa8XLV@FRVPieqKchmV^x!)A9V} z&!1+j)ev9@^WP9K#W>&EPN2h*P>fge+RhURt&Xg-iK``0aHB`$U(o$*sok?a`mIs{ zPzSUi7m9$@zS{%~O*i0?K#|dk!OukI!DT}nk*+JYuY9xliEo{ndz-NaQXtWK8e`R`U7_eYYqHxQbR!DKX)8V`3d zxX{Kl!rhQ27vMrVqbp+WP&@}lm)}PGNS=y{fjB)L( z7q3lqR^g#I4&DNN^J%*%b$GPhZO(Ld6@+H$te@@x!5}e#*33EDr#aA~B8}jCF?gJp z{~;YmooMW%(<#7`hxuBCaC@N8c7f~h0r~wP0m2jw3dPbb+@E2uyr%s+>hhdZAy@UJ zlG)qY>jLTVuj)&>#C@awU>uYbw_G5d+Oon15^01C{yg77uMWfW+Jm0XiE!tkt5g9Dc$*Sxt?uR0*OWVG+(gf=hePSaK0b9ADaSb)4aSCw0 zi=rAHkz%9(bw9AdXNacG24PFB+4WZyay1AQf(i~-hF!tBXpqIOFf_{t!H$u^QA-GZ zVapBwGVNw0>!mvL>2mMoI%@|9|Jih;9XNo$Ff{U-hWcWyfAQi){fzD4 zwa5H?ek>0c-!KPRCf%q7?(BVc%^>8nT>bHLd1jrFHrQ6H9b61vED>S7VTau*IVdn1 zyfr*N@;89r%2QXZsm}xzn1|9QX4B~XoWgzIg>Zu?KjgOt9O}#e4#a8tUI0NTEyXgG zp5^jGn6UARiM-y+wSX9#Bsw3a#(Meoe6!p8@!CH-5MiMM)ebuCtAnf1kBI_nnSL2- zE+>oSY{%vw>C1KIsqp-PIMMzcbCr($Khn9J4;JdQp~)Gs``BZxtW-(@^KVh|zp$~H zAi!;t@1%dHFfY`hfdNbmJ0q}fffvr1Q>bJgxSfaL9ZaA1Hn#(V79%8&*4-SWP8%f0$LQM}Z}NhVRAHcEB~GjUOigWZ zw@brj1pD4ewP^&dId{Iiy)<8EcBxopNVZ#on>G&ns6I{;j=bGkh^613`-W>gi|+hL zzdwekunA*PqsuWBexAaY)jB@_sEYO4P7911Ao$yQA8CTb9x{2{9aOMdWZCwnAFlS_ zT@gnzoMed8x#MhB7ssrdjskQ5_P0NN4l&+4pQZsOduvx?V-;g#<6uWDCP+C)`Y4*3 zDrBdD_~(96ClkBT^MVJMkfp}Z6fl96S*B&$F!aY7x)rfLPRb7h%Z}r$&%!QDbGknF zk-J(XPeG!uVeENXTZ11iwmr7k8T{nq47uMc^58@rk!2;UwjqGsnTLYf>p5IFxZ z(dJ+g{+<`2%Z8yo7Q-IOBEe{nb`vFd5rPy76Hr%QWF6KenZ&R7ej&J2xGV>MGuMEge;^B5FiXE z0i2Sey!tmh@rh`Vtf+4u42^7flNA<$lwAQPtmV=a)RK@1f}P-2A2ov7Z|%}fkoKhU zY?`B5?#GUOPD32kznWQcHhH_^3<+!nXwSf=7XUf@9S42m%!sE0W%|{)0O3^>{W)Al zaVUD#Uy+a+B`??A&3sS%eZZ35T@OS2j$j1bz{Ig#1pL6ES1fCpA*@RLaxE1U!p8fN zbtarW<+5M_cE}D@Wkr=+bs!;#vK)CT_{2*fx;sMxtedLy0ZYZ%te-iXX`JQ7BN}7Uv&0u@Y!N7&I zIveb^NWj#R-jzj|fnb>dayA6}7(dZJ*KDw2o+D{s`E*DzoG38^vB4>GKi?;Kowg$` zeevwRU#+$Y82{a|iu?-M`juDf2X{@pN9(iUUS$$SEC&ouwaeM}NiY$sNnj{ELuL^j z?xf`!o~aMBjG`>XSc;K(PY*PB6H6SVcG}`*pv^?QAl=xL)B|J7cIr(|AM}w)FSUUo z8$~BcYBCr4H>P1Y0N>HiBiD5dKt$4Eq_huR(!0)Hh@T%=yZz;?G!rT~<%Fn(;RhN2 zcCRYH>(rSRQJB6s*r~`Zx>_>t-KJpp{E4w~@#OV--w?^Y*avCRpOMG0FCe=^9NM%C zbQK23K{y|o*)SWL;cpC4Y6xd%*xELwY0VAgHWx79FokesKjGtsUrtM2uP(dCzheF> zGRyq{W=CZ&_XXKPIxq#A23Qy_T2Lq+jBY?I*-(X-*ecN}6-f%=#OG-Z+XZ5q$hL(DQu)t}or-G+(F+aIM<;I?hf#PwOPa={>9 z>7Odr$K_s#$vVWr41rYVO{asY?X_yrTwa5o%Pcf9lKCv^z=c3F&d8} zv7g`v{#di}1O-iLTYNLqE;tR5CaYyHnW)cDRKB)2t*rwek=v*^>y%Qy%G%)g2CnTw zG51r!BpVnxOTU73CD&2j>SFMLyT#>1z{e8iz8`(h8oUb@B}@?b#VF=oJ8ugIyup_` z%FX4AhIb(5Wu5d@*B?p%l=!$-P5JR`fy1M@i0yQ!>|g?YvZjc+YsUHO@&fmKy4mI9 z596qpMd>5m@*9s7zR}afQ;~dYJZU(N8DyP(x}|1iW+I!Vd-JiJ%SovWKiI$k^39%} zA512kuF1`$NpO4*UR;>z<`ZBoa`OPB(WSjjX=GA>zM?U%2BZepZ-R-E-+@!DsdLfGtwSGk(dcerea7$qaAshEKRe?)2PLTLLfp z`y`^n_#H(PCe7Opj?*z|Bgso)HfuF&S>O{YovC4U@xrM>@Ji=X5M_UieuGz~SXF3X znx`Xg!Ar#m2^2jDAPW2(_f@oi91c@b&eHi?Hb4Q#gX!Q6;Wwy%z_u|H>by3u9t^{T z-e6gc^VaJfetIU$k76J>nkS^kO+U>q^t_Fh;xgU5VY8+i)FC;?O<%4Ft%hzX;c~|5 z8PK$nR{`wtdCKC#3yHA%R376UT5UmOYFl#|#gAsjhz_$eVmH-^_!qe(`T)yU~U zFDoR_hvBZ{cHNI*`5v)h6jyI9pai0WgvG9&1ur|Tp`z=I&5vrF5PZ9?Ya7nmsk7b2 zpW`2;t0b5SVu06gJjERpKmBy;-DCC7k@RMRE&aM_3d*p|U)Q$3M9I+Ob3}&^yVva9 zn0rt2wn5~bQ{&2ly33~{xNZ1hU-k46F^%kOmg!2M(i%oic+O{n{AoqM%yjqbu5c&C zI21??W}|a{j(hy+Gha#_c=kz6H2D${Ux~|R)+N}>rU9Y+v(yoM>}Sjuj5`hCLPP=o zz&dx1Yl>gt$v~_wD*1cLW19|aTBYrYic~+iGSZEP=2!HuG^dA#5d>5!rj zrzou0e%)ve6ktvHQxigt@|wK$#^u!GWB%7~g0xzcAMl!=xU;OyQ_-G(nH}*U$Sl#uuO^Vwz?t{HZl;n1wS}J+j!5A zaB?P#W1qSQ#J(rBuc&@L5FSy{k2rQK=n5xPJVXGbOjBr3KONz~0Yg=0Bo&LOhKZ0| z10RHE2Q_2Srid}DC4B=}2g`a}R+*B5Jj+VzwLTJVl!^wh3ps(>%0iGU9)4)R@?L*Q zJ8Xv=F${MJKvN)tcw1~h9g!YAbXjL3SoK8LsR!AOQ_!P^wQ-hL@_HC~z~|d2=Ru3q zb1n`@C1xn4wA(C9qkOTzYRGT@yn2o>dg~weXue5Ga)M+%G&Gh#&8@CdE|EV|)6<`ae z*1T1U4o9V6(35+kESi9I?rev~qr zWJ9S@l-bJDJHZYeq)r7BJhUY5cn~ElJn6frA5Qj-!}?EbU3<>v9bjML`B;@%#&(D5 z0m8HJySo4Y2TSHMA-m9x!MK}{iG&An?qE@e2NSSf z8K|N=|BI`)fQqYWqD2QEeDL7zt|1WI-GjS3!QEYgLjnYMcMER8o!~)&y9S3hkng|m zzBg+P!|FNRr{}a))vnsrdy|$!6GO@Nv%vK9)`A%8%HvPYl`qHvq(Rwm#yKpgz}0cz z6DLIJkksa>r8wVKCYmiMOIEm}>xM#yJN$*R!5PKyB{!j<;UmrtGPWJh(73`0ovtce z>3caQT&}M~WU&lVr_oZyt7^lMNgY&LkkinSHt>7f31LcNiVoNE(`~KI!Mbcv8u5lf z`U_P>v{M%6O<4?6R-mW<+c&_U+yGna?5l7jLm(0>X8*$#{^W`~B+_kLeDq@nwcE;Z zQ5s2H@sq{R<0i~v>%x}DTgEUHb;6}Mb^VU-G5v?wIClG;ISAopgJHZdz5yD3&7~cM zR|_j4_zDS+pFMbQYNx!9C4Pp+rD@@za?JZm)=odYPkBBpi7PUdk$gsw{;*JOFg$pT(ywxf%R(x6s2F&miG4G3)^o+VZvZMAU! z6PAsmyB?*uS>!u~@!uKw_VEt#(~Z`dE)I*RsyMKb1GBto278$DK&De4~e<#Qe}`Zyu-xYCFrX3y(`Z zhC%7n73%Uj`KBmJ7KQPG_Zq`hvPB9+lqMOGGQy6`4?|^V8r3U_zg{K}^iR@(RaLgWF8HHJNv!ZsLn(X@ zM1#!!mNB~ct~+CT@IvBQto>W@wYK@Uq^SEUirxpw`sm8uVflSdH>FKOJ$?f4hz0rW ze|*?#(@&X~)v9CU6^~xFQ|_e@FJSW045j9-et_vfiRTH1)5WOiiz%yS<%22J#;TNL zumKhOs!wrONZdI#`HI_$unlz=4ZIgZ@{klQzvmbQU5SdA(X&ajqXvLmTX8S<%ztb~ z;mIM_?od8BkVM}rs`Y`ICy@~GSY9clBtb05j9s-)o&& zFW3pWg0968gK!g8w(&1QN0|b09w%$3rM5(<$lN^SETs(L(;d$kiZ#Xl1W;_^vL__@ zX=up*Ja_O#8ZTS?O7x3i?8!e9^i|{xe|xt|qt4)>jTq&(Fnd^1M|%w8&)lJzms=;6 z5eRdZsqW2~71P7Z(6Q?#lTkuMI*oHukHld3xRsj3Piy)*wVuzmP&gp!qlVBvTeaV3CRlLX*`@bgy&aOnx$Xb7motMq@!_w4mwk zfhSTaW(sm1WOq{QmDLpQ9xjEwqjS46r9CycN4DPbtYSm-Wf`Y zYR*p8F~y?PJenPq9jt6j#JxZw9d~_E$3N4gCZ~?E@3J$YPN=hym6PQ39;Z?z!|o^r zfo^Pa27Q8~#b|R;<_h_3jUNKnB^b+%Lo&eLMxZC4#?k;|3)*-*>7HY`ye~@M_*spj z34X3VA5Z1%;JyFS8(vr)1n^r;ynfHWahP+I9o6<)wH*izWZdJ9i-FmO$T?s$sWkiu zVzVG8c?T5<^#4NlYS=>nRTJro2Gm%*#&NvzW*9Vrb3!3QiG0py{!V8R5L3-sTi=bR z!MqI^@p+8p^z~u7{V0}UA31r0U-Ehnap+$a+BZ#|PZbRfoY6cO>T0P>x^`{n0}rR2 z0<$0kXEdu|rB~mnU|fhqJ4OeK91NL-NV>08HtzPkAL#q%pjCb~=4f<5LZaaL!<2xD zmitg4%Z5jOxbCyr|8AR|oxMG$i{$&@v?HsghSk+k9o=C8!g%X!xW5auyK|1uL=i}f z0_u;dB=Ted3iZF ze;>H3kuYAyzXvk;yi&lg)JvSdVuOV4jLA>x!N~sv$(hPiBGNpi*VwW?0OX{Mp#JCc z&HlKhVJM_7 z%R=bYD*@{OuLX_+nm`H9qY@&Y3!}T^CYDeBXua_&FL~r3sW<;JaN;YF`W{(DCy8{Y zpRr*ufy_b#T?SvJ>nG`Xg;ZCay%F(J7wDC8l|!v~476}G=)TWp(O>Z&%+ki@B%0hn zx=7=a;R;paZhYA;;H1xF4$qHw;qQuwwJhYO2GG#O(hC^vTp)$IcZc82mg-gX|0AF# zK?nAo7`#Wf5UY}>mFCbwA^9esO5PjtWU3U8_g<8F&*C)*OB4bULXW?!KJLr)qPsrP zRh0RTAz&+wJs2LY5lL1L5u2)__#ZDTKJbjRLht9+HN6(JR_UhX@4O<2>%We?a_O(xK|RFa6wEG1M+%Mxtb`va<$<} zc+6DWGHLko#VBFF&fDG`C=3`F((BwJZ=rv7{3Ji|<$7Yi-KxC#xG_?EwOkS8G8@zG zCw7u!Tniub!z}^p27jrNJOE#sShfU0NhQz`9)McfQ_b==n<63se*U>W3`Qz|-siDq`y0E~E-KkPGd^=Sec|#WfZw8KmoWWLLS2mz~m7&Ffwkuz0&XE5+xB%1^o3lXkl~A z4Z7^NN8+Qqx4@d-l+B`}60LfnS@!$nyhG@jlB$nd=zQBmC1a|%n_-zdWJqHH0t<*i zWUBun`4&Ly`W2IE=DhWBn{dYwm5?M$8X!}O9x~%PqGSxnuE|RWjqKH!geQrWKk&WT7>rEa!v(-XSt`b zNOZUtiMpOgJm@_#Jnfc_L)G1sy;S(=>JP#I*d_-4mNMtF9y#h&bR0$b)#>U|L<>|l z63Chuf2%`(X7j1v#>!e;ONTJSvbSNB9h}BjqhcLRYql3$?GKHyyPsQ`i)aK^%SgOt zE~6az`KI!zMGXoy%Q10K$OP`ThEC0=ub!yE{~fz2?7hqWP1<7vrJJA@*jK3T*F&MC zWP=)##nk-E5R_4nV!xGzct7iHdIA8VXwR|BIp&->k}dmrQG=0L6(nML zcivF+lsmPfsW(d9at(8EwS4=^*ae@tq>^6Xlg3JxdWSvJxl&A+7tKHYT61Mq(`oO} zsvnjC&W(u@3S`$SCYAI$taFdnOrlGVG<;H8mgeH}xP1O|6T3}NaLM*7L7xQY3!eBt z3iLiK$R#&b?r#loqyb)Wj$2H6rGuYHZGLl__M~_Ye^>u}8{ngr4w$0;4{R)%QCaNO4!dX%+V^U20?WOBEO!jD~Nbr^_#it-^yjM|s5nA9d< zrL2Ybn{FaDflj;((Ca`yrK9x`YP@mV?m1aSW1qwRnsi`rm%yM!sm5Td6_!Ogy*`&; zpU0hZ?vswPN@J*WN=UfTH;B>2D;MOZHpGE)Vomnc#m)|^ouLo`%;VkAfTx?0zZg=_ zRtG3Lk?ikaBd5sgMu!QlwD~&^%*XE&FbK*L$-)0Z`QZRF)39=g$PnGlf z-bO6+BZv=N_Ml`0(;4=A;%57vu0PCNAJ6%Qsi>Cm5kZ2Fc)NaG5VLN$K((?Jvo6xKNb1M%N6vWcyMrF*u z74m}I(TrwF(_d^f9voaHqETvc?+Fv*RMXz@UPDyTS|11j`PMpKi11Lis>)0C zg_4{gaOPs-gu&}mf? zo**==UBt9bfm%Wg0&KUi63*bKmP5B=^OjCEJv6|Sn6SSgCX|F1nKr0Z6Y-gi?)dT} z<;PMd@6;rC?l|(CW{JwD}PhM2cH3Va1fCs4RbZ zNyl&cfRQF3Af4uh=}7jmtTQC}FJ??~=yf!p$a&mMJ*X-r9=lE>5TyiAM;cpwFG*Q7ol9d8=`1rQ_mj+zCEn>-de%5sR0tW5Ed>o^ zgCRf)NXVsg4>EVcDt_r3U2RtJw%h>US8a`qgk(ZX5Y?jTG?5HJAfH2(#3G?OW;tto zUP!8*M~*fXIQHWtL+%%GIo32XO#k0X)zu8zp+Q2<|9d3P4|M#NL&{356{=!(A zd;M6R%^uUWLn)E!r-SBRq@xMc6#|R3=4()QFwR1%{o`#PE_h7p93Ay$O72PbaUFcn zcPJ%ulyaicLPQ!>J6yxs4rqf)|K`0*=FDLyJ^jTWH-Rmxb~2hSmddp#_35~&YOr-n zq)fl$d$SFarLQf%&3zY)lIsDg2O5MAw6e1D_;=paloT+t6|E0Seru$lrzZ~prTPb* z8p!NP>3jEzFHN-YH?Y4ZG?(4VZ9k5FePg56<`>UGCf(MnlU1*QXk4lks_YRei-qA$ zpYOFlFA*6DWOeq+=D~mJXiGX)wmAz_5O$FbNAeBau1S0S0~}K@Q;>4JGi%e-?g9!P zoG@2v3|8BSk(Pu*x8#hJkyV-85Y+Eo%hPn*2qmMv1CpmP~&jG#21W zCJyRI4zWmswdF?pm#@6os-q7Z1_e(o#?%!Z#GkBcY*&nGt0X0AE8n+_{MzlN0y*F| zepVnOK48Gg|2w*Y>xmI=iUZLSX6+jZd=I@VJJV%;8@ z+g*{3dJvrll^x$lr4J)DkJWuCW!y#D45cV#{Hxg}XS{yOq@o{B+5fy(W2ZP)H9e_? z)l7Zym}4vWey<oFhpNdIAk1449Oh%m*gm2j>~EwYGMmfs9%d0_@OxULRZ!lE*I42DgO^ zW{{s^dHy;OkT7&97%vL(Vp*Ot`+=bVAqG*s1KR1<3%47;DvPYOmi?EG}v=-hS z9KxctiZ;M2vDe1piOd4~FE}|Mj?qR?a*p4sX^8u;iJlWGra*`cSO}3o{9K&ccAN=a zJ|SoBVE>_CUk}80b!OWRd7j+a$a_3n{n$d1_mvO=cQh(}=U&sON2>F8sKf$@#n$=j zzo!vR-bGyO3?d`UFxvbi2%A_7-fEkp07$hP%ik-D1|pX$ab|3>VpRF#g4wHXzK4-q z=D6vo%fP@Q;RiZ?(`2HUC&<ClUR>qMOETlPhA@`Hm-?D#@B-XDisyVe3!$)B zGgjF-I>X?tKWeGCxq^_lE&)RU6`Gve>>qzE96JQ`ri@jSzt8b#K$8*f4H$pbsaMF? zDWOr^CvZA*&g2!noFEYR_UagKU1@wc^HQi!YJ}nPFd*jP3aRO$#M|!v#7-P_MDVn^ z`5w3-`VgOX#Bh1=oP`}Fgl-dOeRD}XOsjxAl4ZTNKF@wXo`L)G>gcI6MmUON7&=%ps&a^s#?I1AmhqMvSR9(!qpau@4apg^PaNsl%2}h9rxOKwPrp zaKfpzK*>^3+u3Glpz=fG{%nXsy93_A{nLRNyt{=QNmzuyGYbfQQzXP(l5X}k>prJ~ z0Dk874~-8bt!Nhr*dG^rT}+k_ z4E)43ox5ar{5dP%QFoj?FaT*cuZ?Op{rG;p)Z@?A;zX>D91oAA3}_BCY3d{xIK+v_ zSRUeGb<9vcDU-&^OL+5ud5J6cLpst=cOp_=tMht@_2_7;lD9#W29B@x^lD%TwSs?Z zVgkW3vEZGENo`;GTmU9A6V*0QM_GFRB0A-J>^=T)rB+k433`sF4{?8Fr?o_fn9w4|aWjtbTNc@f%R7RhY%#Dno2r3v^Q6=8 zFsD}=b?y-iPSna}K{&0V6OxHBlwe3Ly`;}AnkK!R{n}o8ucO$7wQx~@!K47Bgp9X6 zFaAeFt4Iz&6O-VzY!{9#Q%_j;ANlKgv2YxF{E?9!j*LKkdB`+eWTCssCv53sQY;W! zlq5Wv+f(e}?+Cx5u9tGWOYOd-d?6gs_6{bFtbSurv**g@lPBeB4$KwKy9|rzdl+ST zVI3viwp|)IFYIl_A=OTrtSoxkI4Ew0O-hX#)4ZohZq~8L5ux+R$vCQtxVT_!VbPoz zrUhr%Sjq+3^tE-gLGvtPa*sbhtAV7(n;FaL`00`fOz~pms{L|4VJ8gC9@q7D3nV2| zV`4_oXa=0I|2TY_#Q?&H_HfWx`PXbMkUuH$gas{X9Dfc=MOK6yAM=wm*2j%7ZlM#T z(kS4Mx)}&VlSKlearTjd(rHgKe-1{5;HN`>dqvcRBE^el#)ehZ@9T?*dGG7cY1icD zR8vlX8WA-rso(Vfq#j`)|89aF_n`>8hb<{-ya%`_IwXFs0jnxvCjBE|_9}(H5d8&x zRFN)c_JXOaRz_N4W{A0gQwW3S>kz>-6G8DMOo!i^uV*60s*;e27Q7!qD@K0aZU?!3 zmy~AgIpZ1J40U9MdedG-Nq(PAxH?K*rxN7{VRwTpU#nB}<6jxQDp0gVO3&*{$HLxHbeY3!!bC_c>!?BCLRFk$E+srfXfr9vh#y(wa1mRjJ2crLMO70)Uoc5`aktzM{4eE znxn)UKThVrVE?>Aa(-<9R~%RG4@7qYumZxjYJX@GZf{rdcc?W|;9cs|Q|@0Cg_L{C zxYZ<`zx1%c+Z?D6tii9mMOpZhrcXv+is^Jokr;y=dJM(`QJ=6N1Wzv3UYv)6X@g4C z&y<%gAU$(sFrO-Ye9w+h7sT}Xi{7b+SFd;eceuxk`3vL+KQPMaxt{`k9BBDqpD$Cc zpE941XGHXFw+~sYKW{tAu-RONb_G&2+(^Poo7hT#&vp_}j+?Zm`HFcGt;zR(B_Pi|Z=Fc=Mj2qR3%a8QjFuA_Ar zebQ8yK!-GxtDYsR*`Xf-^Zx`0ief=}|AB@^Vljr$?+H>u3`UkZyAaBp_N}e_`^C63 zvo0AaWDzNx(j8V5$J1Urf^K5+>#YO{CFS-?i<70LB{-lg64id@pTof5cd(QIL{Q($ zL1yd{HFeJU2EG}LX1LjA_ZRPWDFnVW!f%67uRLjYSGx<7{MyNc5nn6zsJQE z7y@uOM2YFR+?@!LSWk_={jUd(7Nld?Q!rViGC5zE0@(=2BeK_fd;S|kOb8%ZLZVb^ zWwileA!R~1bBWV#{ubu>@B7_3V&l!Q7@O@KiQPDXi(YAAXj#x# zPU}x%V*N`E*2_yvvI|Buh*Xr7ozM4RXye^thCdU&&;|k@f$mo;P1W$+sO&-p?i5cl zmKBGB?>V41b1*twz}7fJeRE0}_Ek*y(03mY+vx9_S}!-@d&c4lpWDs;D10uv5Qp56 zhSk1ovKFV^r15uJ6!IbwpA_W8H>Ru{t6eFxN4ka0bodE!Ldy9>mBbvfs1*uwGKZIba46H z_Ll371OaUlo)PjS&uu-Ft`MjhzR^|RB?fk9WDy60E^os|LIw~L-ObOhjQl~X$Po_{ z0FNNKTA8Op;GGM#i4e~83NeBKr60h(VC+%c8{$8R8^Q0?`aU_M{lJP&dGkAYLy;E3 zk;5*0I2=lFv;>`nDvzo9usBEz;r`K*kp=qG=e@Y^_31$Lv>|-n>>(f?{m&~P4&*Ng zd4dPhI$OrbxHJ%fL2E-q;PQ40_=bS(es(5;A3#$5Hp;S3JqATzo? zc*OIy>~)0cmuzQa!?&>jTYm(D0I`&N)Mpye-8kai5p-bHehP-cKajTuQ{BKKCltQw z6=3TFp4EVJZmp+(7ec8Zzk0TrIxr~T1vLjXHjc~>Hgx6E2K~o+761(v;JKsq_EGFT z!@OAZq5Iz(0|b6sqc^u_ABGF|f#Nn1ssXuC1_>ao;A6zyB@JPjn!Q--rz&Ga2E0g{ z|7K{oKP&{1Bt@_KWgm>vJ1q-A;a6xcm;i!Ey-OcRr<2(L?EjHd?+zrt+rym%$NKXP zSey$Z{2P41M>0TDwme9;y0<~X>>Lrt^EFL;j-X&9(_VyvyC0#qE$FuqoFA!6;C6cC zRvtZ{c%==+=BVB6kwpj_t)3C-Cxwt%Y7=Xe!nx)DpzO3H>dHFJnQwgQ9@~ zH`;GtX9BAJJ@AQ78x0pjiTUa zZ!lmE)BS5t(uHa=F>s@}_W;T(ayQZx#bC@|c~O(v=0HMuop-{<>`-=PSD#AXCsRpj z-JTJoE64v6kt`$tJOZm~&{KBrmtIML&%rv-&=z^bXqJE<*qew&6M}W1+OU_T(*KLh z`})bhW;{7!&7bRtb=PnCS6sGA`HLO64YELf(&iTlwcy?6M=5T|zqxJ*t(u6XY(7Zb z&_&+8f<`_(GD2=cSqe7M2Q-WO3*?1$l8ZcSTFmjiH|J2+J^bAQbOgJ7_wfl>I~HujAt#u^)y^*lkA0+OzL%9&tC?y0|gV+M$-4RcXJbi#4%>v|}{( zu$E4dE!pC?k{V@c?bXMc?-5VvvjiN3TX&7bzX5%Wg0&j`g(UJ<*2`3ptn>(=IJ&4T zK^+L)xPyMh`WM57tgI|lzq=%u3_+DCOGdn+t;wG15X<3ag>}Nx2geF2q{$F%j6j_f zG=Fg<3H&Ti&35c7S?c7Xm@5ewGAY1oY))3$KObP8))mC>Q%mH&krv=o*XOl zq<{UPGFt>wB~cCgi(OYFLk?8LTzG91jfnb(u@jpnbWW&RAZ0{m+pFQ`z{>r_h zQ2;`c7Ib%Kg#F}7#>UbSPc5y<>KbTVMS#T8c1UhPCy^eK#veVD!I|(Einl9qCrf*& zU%kMrmxM#5%kNZ#@$-IpvR+zRPgYb60;&2d@0G7#E5?@fY z(0c8V3ebMnW%|3(1gmLCf6Pc*LBfc7pS(Yow{oVhA-FgO5x5?TQ;l+Y07^?g%uI$~ zSec|D(_?YJL$-5n`;s|eq8NLES1j(Y){2zcU7#o(NsLKd>*3i#HzaJV*lhAC=fpEp za(cGGX2z|AJL4>9;=3oWfmI;UDsQ~L?en!;=acQTCk>HOmwq#ntB@-9-_KDF{`O0M zi)8BINopl%A=R~q=E}BS8Wb;YSL?Oi9AS*3XeyXEUR{fA$S0S?D;wi4BQ2w>D@iK| zdo(iEDmHRR+Wfbb%WjxYUkuN}PaEn*)`d`c5DKC%K!M0>YFxl3xuBwe3puq1isfuc z{}NCPL;@d)0*5?-ApON?_RJvCRiN}enNMh}FWXPi&gg06ylhHADX+ys-dkkdx_pr! zYQ}=g$ic zy`S~Hb9_)YuafRPIaIEK$aVG#)#d~TurD{AE@*ewSzV{yy%h0TFO1|xO|$P+J+@y;KlWuTfIWP|OJj6&0$CX2e7H&a%$ESe_M>!VTME5PO9SxXSZgp&gWzV`j5w$29mt(6bY`nOJJ&j&1LH=6!0Vh3p*)MI9g24 ze?~f=VmW$#_j|T8RKK@EcLCo@V4Sdnd zxx|~?#m8Y@_X1~M!p-`K|K9F#Gm2SDTl-IM`~PL9J^@<`{YoFUq^;@KFf9UQ%T2l& z8?95Bns!j;Id3;Z5E)#TvqRyZEYpC8Pfj7GR2JJ=QHWk%SqW`Dgg3MvSU*$9AM>H!j&QlJn zt>UT<9%GXbkd~yvC+@YZ=c}oTrr*jM8iUMpGnSvq*66b0Kcla5JELeMv3(uzOQ8^b zuM(VA1k-TjDuvP45m%|x;s|!dS)2C-Ok4&}26Aqs& zr=YMfR8j7oSa069(o%59;oox2Rx6Cj?I*v-z4VtW1#(-HPOhQV(>Ug&sIWOMVqU7xwNXeOO;|f zpg;C?C!58YHlIjxVieF8!_|`}8ir}YIXSO#u!vV|FnAtD!X&JT5xj7*d z%ja`zFPZW2Q?s+ssa;L>FAolq*M+v_T9J(j6=xPQxJrTXJJpw*Y?NC28*VdS#K&d) zbl#hp=-IX03KS_!4GeSzOG16I=*K!nV1(4q;^VFR&wq+mzZgTSfHe7co%zJ{v~prq zCRoE@Y2knLLk2(n$}?}${Pi$7?!Mmjsozh2lXDA@BmB&|k6Fy_%n}bRBdJK51#@=I+k`?rzGq%xwZ)O%q+q+P{g|&e;aUHj?HL z(#pGpI6ORDAHscx7RAVr_}WlhUjF!d&znfg0#PPYrqG&Jyg=vrQyDZZ8zi7X+m<80 zx>2uX)^qz}UjIpV+Hw1Wl3TbGGem+B@+<>;VDmGEI$)f|6E?PsnS2yu(sVDa)#V45 z-6le@rbZ_m5w1&1o5I6=^uowpwwg|d<6Ui`RJC2Y@;-c9P*~=S*N3*IpF4Smf3J0t zz55xpD>PH8Xba35JmmC0n0%eZ#$%&nC%~$u(99Ydg?K`jFELtuNLAlg7sFKU&1N1! z*G%p%rI8&@R^W)C>jI9sW7=or4UqXG4A_A?sE+qw#lDj50Ov6iM2z_Ic}kyl7WZLF z8TKC1N8V7tK)PTGMlP;5a}V(`8k}J2L#|-Ksn9d%dN~1^X3K2X&uoA9Y}Jnt<#TYp z9FVaCOuk}|ijNSb<~skVC#-0VZc?J<56{j_6em_huhuLj{;r=KUE+Q8i8^@B3h?w5OrURp%hO~0}hGGXuQIK}iC#e=;i>ayKe{V4q z9)Dse=(w%Ayj;(}@Vg$pdqGa;fGG&{9~~y@&XuizN&uOoyVDj>YGHjAnQB}DwNTB4 zxEO3CLrwlRkV`T_Zwmr^0cnOC8AC!G9#d1T)EJpSw%Wj?+^%o}UGj0<@ht5v zf4XYVTP^nX%lpVeX99)%d2mzz3v$WTQtTqPAfCkm7A9BTNkBUQhp$?)A}NLjI_v6(>|dzcku?40X^I4seSN#g(>!nY&? z_!pdWFqFajh|j#c0&atojpj4B0y3^}FcJEOG6`(#>|wj!aNr$|#6XAo8%-xELS`+4 zUTyvj^7|F9)Asi(liIF53EsnY3%3jqMzK=3Y0GrDzcYJMENjNfy$~VDmiv*lG51l# zT4NrFUy6&p;VTU_leSpeW{_xVjs>)c2_RdKsk!5WkG{D*CB?`}o(wDe{COLB&e zp0mT)_b*=_yV!ovp9o<>NLZJxj5N4)`5oUpKbo($x`gpj&+9nJNh3VAz`Ba}h)Xs5 zO+x@zTjlhzVYmc4E$t%y{59tAf;iCW6ySM3J?Oz7&OYpte!@cnfvg&98x3dBO3swi zEJV9XmLLU=s@Fy~fxVJUIc4yz&L**#fjpeFb@Lrd|4f4)ogq_F3;0eP(&?m zd-?7F&NWa-p88%&)PjMBcu<8ihq?1{vmjM3@D9OL2Lk<3j~~&)?_rr1$bXeYhK%L_ z1EJq^@&esGpw^!*zHvBiZzw_nLO zm?@ZLav3N+;lJa=&kO6Nb)D~U+zHH8+Q-Lw^#hGlyOU2((r#1hI2jZnsjK|LJ=TSl zN&X0G38oSb&N4ba?!`ku!4iCUz6O@ngj9Z=MBj)}aHyyITiy$Won5Z`=s7Ms;a3i7VSp&oh4}T&Nai)?0D`#$~jvwpXf^OCzP7z zVIa$U@RlDTA|0OB&mxTDV|>`#DgMHk9hKLvQ`Qy|twIvc^^GGOlwbTWpV51?Y$xKc zpa2IlLHim#=H*s!@SHW8{9~R9PV|>m*_hKd&G$5AS;8irM=Sbjrv=am{`RMjXi;$O zNIeNXOu)Np0v#%P}L8gcC<875(LCR8<#g$o}*( zXbnV;Fr9h(JW5s_F-)^3ceTNgRxemOxm@pXGN=*5!Du1OAe0rm^9!s!vSOkb=2{E# z@_^IVkO%Y#iNv7j{KXX>RpJ2KS480B%uAKhD2~!?_fftuqJY0m zdd&``BK@EbUiZomz6 z5Yl%O$OP$Z=598u@bRs z38f-Ai{y5M)u98}&}30ZMm~3yN|rCMmza?_Yc;;8ULWQ`;zHnc0BQglSfDkiVKjxF zt7p^P*v=@D+aS_yV$UzQj&8$FHf3`cweIKJ*JHlV_~@H$@@VmU(lHVd?1|}P&ZH&K zVPh;bcQpu&Bd-J7IoPw5IP)au>o?SVu*oM;w)faum=MxqO&3Cp6}1*(Y9O7Q^v_>Y z2D!*Xh0{;TXqJnT$NW6cV}>NtUsV6m`SB3Kcc8Gal$snfsr(3{lh5;GdIq5jVk$^j z0K$^_dvTn);M7lAaD+d|5%VbVL0jr*)lF4UjCN>@m@jX{dS=v5uHWSS2%ik(# zdC@_+xVTP1x|r#_BQ|pmHOo6BF{S_M#1sOBMy+;=x0R;I3bhEpuNqyOWGf5VO5p7k zHW)Zq12w7~M=miD$8LVx2+xx@RYr}>SdUqWZxlt|`E;ylm_qLEB}<{mu`a-)L`sCI zn~44|C|)pw#J>*vvvNG^7Hkyx?Vdz+nu^gN49A=cv;oCo?P%Lid_8ZYv#tPHoAEr( zsx>jVwH_#MJZ->-r^+ItRb6hwlA?`>)0T4nYHo9;qP1(!82bZo7;Q@+E!c}OUV`7t zStMtj_FC<0-a5iU$OPiH33v9aZuKYGLPhTj@AUU)#q`z3XdB$mQ^Z65`xo`lF^tc* zKiNx4{Iu$Jnhccaybs9`sn{hCG&#kpaf}ch!I`YG5GoMM6%whViosdnDC@P9c-}0n zO8&2FL=hg|J}}7s2gOIT&oBT)&Q%mfK#r2k;bCf|WCWgFMyp5NqYztjX_nQ-g9+C; z3U@ftfN8f`H^o7!K#18O|L`;2#=6C=N;oka7avM*^M^9`%opLpO!7iG>MJMr%fh>= zAiQ-62(H$1d}VGf2kXxm{A?j>HIu?Ym|)X;xCAs<#rvrxmIVsX5Fw$+5pxcT^JkK% z72bQ_7TeV)KG>uwIxRK(I)TCkx6ryK$u3;{u}L7|zX(27gx9fIqs37-YKfVw#G6xy zf=MLHF-Zfl9PlDCKnqApN^;sA2fGk~2~&oR;%Urf z6cpfIrFUMi^sa&Fyg$8dU3I*)v}6S>V>9)`c^{GpKI*&Ci1UBVDUyMkqnQ$WHBW

`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 0802/1345] 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 0803/1345] 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 0804/1345] 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 0805/1345] 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 0806/1345] 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 0807/1345] 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 0808/1345] 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 0809/1345] * 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 0810/1345] * 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 0838/1345] 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 0839/1345] 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 0840/1345] 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 0841/1345] 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 0842/1345] 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 0843/1345] =?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 0844/1345] 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 0845/1345] 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 0846/1345] 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 0847/1345] 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 0848/1345] 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 0849/1345] 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 0850/1345] 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 0851/1345] 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 0852/1345] 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 0853/1345] 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 0854/1345] 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 0855/1345] 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 0856/1345] 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 0857/1345] 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 0858/1345] 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 0859/1345] 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 0860/1345] 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 0861/1345] 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 0862/1345] 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 0863/1345] 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 0864/1345] 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 0865/1345] 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 0866/1345] 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 0867/1345] 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 0868/1345] 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 0869/1345] 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 0870/1345] 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 0871/1345] 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 0872/1345] 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 0873/1345] 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 0874/1345] 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 0875/1345] 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 0876/1345] 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 0877/1345] 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 0878/1345] 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 0879/1345] 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 0880/1345] 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 0881/1345] 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 0882/1345] 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 0883/1345] 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 0884/1345] 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 0885/1345] 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 0886/1345] 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 0887/1345] 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 0888/1345] 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 0889/1345] 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 0890/1345] 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 0891/1345] 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 0892/1345] 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 0893/1345] 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 0894/1345] 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 0895/1345] 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 0896/1345] 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 0897/1345] 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 0898/1345] 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 0899/1345] 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 0900/1345] 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 0901/1345] 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 0902/1345] 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 0903/1345] 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 0904/1345] 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 0905/1345] 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 0906/1345] 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 0907/1345] 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 0908/1345] 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 0909/1345] 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 0910/1345] 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 0911/1345] 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 0912/1345] 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 0913/1345] 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 0914/1345] 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 0915/1345] 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 0916/1345] 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 0917/1345] 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 0918/1345] 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 0919/1345] 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 0920/1345] 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 0921/1345] 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 0922/1345] 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 0923/1345] 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 0924/1345] 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 0925/1345] 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 0926/1345] 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 0927/1345] 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 0928/1345] 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 0929/1345] 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 0930/1345] 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 0931/1345] 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 0932/1345] 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 0933/1345] 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 0934/1345] 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 0935/1345] 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 0936/1345] 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 0937/1345] 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 0938/1345] 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 0939/1345] 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 0940/1345] 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 0941/1345] 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 0942/1345] 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 0943/1345] 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 0944/1345] 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 0945/1345] 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 0946/1345] 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 0947/1345] 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 0948/1345] 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 0949/1345] 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 0950/1345] 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 0951/1345] 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 0952/1345] 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 0953/1345] 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 0954/1345] 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 0955/1345] 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 0956/1345] 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 0957/1345] 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 0958/1345] 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 0959/1345] 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 0960/1345] 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 0961/1345] 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 0962/1345] 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 0963/1345] 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 0964/1345] 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 0965/1345] 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 0966/1345] 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 0967/1345] 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 0968/1345] 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 0969/1345] 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 0970/1345] 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 0971/1345] 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 0972/1345] 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 0973/1345] 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 0974/1345] 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 0975/1345] 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 0976/1345] 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 0977/1345] 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 0978/1345] 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 0979/1345] 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 0980/1345] 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 0981/1345] 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 0982/1345] 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 0983/1345] 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 0984/1345] 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 0985/1345] 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 0986/1345] 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 0987/1345] 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 0988/1345] 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 0989/1345] 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 0990/1345] 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 0991/1345] 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 0992/1345] 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 0993/1345] 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 0994/1345] 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 0995/1345] 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 0996/1345] 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 0997/1345] 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 0998/1345] 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 0999/1345] 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 1000/1345] 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 1001/1345] 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 1002/1345] 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 1003/1345] 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 1004/1345] 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 1005/1345] 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 1006/1345] 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 1007/1345] 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 1008/1345] 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 1009/1345] 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 1010/1345] 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 1011/1345] 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 1012/1345] 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 1013/1345] 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 1014/1345] 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 1015/1345] 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 1016/1345] 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 1017/1345] 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 1018/1345] 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 1019/1345] 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 1020/1345] 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 1021/1345] 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 1022/1345] 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 1023/1345] 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 1024/1345] 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 1025/1345] 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 1026/1345] 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 1027/1345] 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 1028/1345] 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 1029/1345] 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 1030/1345] 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 1031/1345] 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 1032/1345] 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 1033/1345] 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 1034/1345] 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 1035/1345] 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 1036/1345] 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 1037/1345] 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 1038/1345] 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 1039/1345] 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 1040/1345] 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 1041/1345] 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 1042/1345] 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 1043/1345] 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 1044/1345] 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 1045/1345] 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 1046/1345] 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 1047/1345] 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 1048/1345] 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 1049/1345] 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 1050/1345] 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 1051/1345] 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 1052/1345] 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 1053/1345] 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 1054/1345] 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 1055/1345] 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 1056/1345] 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 1057/1345] 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 1058/1345] 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 1059/1345] 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 1060/1345] 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 1061/1345] 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 1062/1345] 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 1063/1345] 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 1064/1345] 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 1065/1345] 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 1066/1345] 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 1067/1345] 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 1068/1345] 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 1069/1345] 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 1070/1345] 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 1071/1345] 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 1072/1345] 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 1073/1345] 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 1074/1345] 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 1075/1345] 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 1076/1345] 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 1077/1345] 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 1078/1345] 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 1079/1345] 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 1080/1345] 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 1081/1345] 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 1082/1345] 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 1083/1345] 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 1084/1345] 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 1085/1345] 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 1086/1345] 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 1087/1345] 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 1088/1345] 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 1089/1345] 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 1090/1345] 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 1091/1345] 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 1092/1345] 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 1093/1345] 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 1094/1345] 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 1095/1345] 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 1096/1345] 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 1097/1345] 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 1098/1345] 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 1099/1345] 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 1100/1345] 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 1101/1345] 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 1102/1345] 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 1103/1345] 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 1104/1345] 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 1105/1345] 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 1106/1345] 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 1107/1345] 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 1108/1345] 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 1109/1345] 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 1110/1345] 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 1111/1345] 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 1112/1345] 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 1113/1345] 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 1114/1345] 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 1115/1345] 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 1116/1345] 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 1117/1345] 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 1118/1345] 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 1119/1345] 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 1120/1345] 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 1121/1345] 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 1122/1345] 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 1123/1345] 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 1124/1345] 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 1125/1345] 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 1126/1345] 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 1127/1345] 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 1128/1345] 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 1129/1345] 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 1130/1345] 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 1131/1345] 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 1132/1345] 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 1133/1345] 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 1134/1345] 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 1135/1345] 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 1136/1345] 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 1137/1345] 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 1138/1345] 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 1139/1345] 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 1140/1345] 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 1141/1345] 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 1142/1345] 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 1143/1345] 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 1144/1345] 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 1145/1345] 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 1146/1345] 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 1147/1345] 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 1148/1345] 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 1149/1345] 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 1150/1345] 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 1151/1345] 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 1152/1345] 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 1153/1345] 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 1154/1345] 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 1155/1345] 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 1156/1345] 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 1157/1345] 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 1158/1345] 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 1159/1345] 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 1160/1345] 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 1161/1345] 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 1162/1345] 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 1163/1345] 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 1164/1345] 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 1165/1345] 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 1166/1345] 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 1167/1345] 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 1168/1345] 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 1169/1345] 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 1170/1345] 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 1171/1345] 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 1172/1345] 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 1173/1345] 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 1174/1345] 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 1175/1345] 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 1176/1345] 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 1177/1345] 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 1178/1345] 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 1179/1345] 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 1180/1345] 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 1181/1345] 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 1182/1345] 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 1183/1345] 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 1184/1345] 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 1185/1345] 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 1186/1345] 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 1187/1345] 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 1188/1345] 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 1189/1345] 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 1190/1345] 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 1191/1345] 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 1192/1345] 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 1193/1345] 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 1194/1345] 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 1195/1345] 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 1196/1345] 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 1197/1345] 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 1198/1345] 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 1199/1345] 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 1200/1345] 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 1201/1345] 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 1202/1345] 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 1203/1345] 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 1204/1345] 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 1205/1345] 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 1206/1345] 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 1207/1345] 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 1208/1345] 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 1209/1345] 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 1210/1345] 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 1211/1345] 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 1212/1345] 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 1213/1345] 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 1214/1345] 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 1215/1345] 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 1216/1345] 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 1217/1345] 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 1218/1345] 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 1219/1345] 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 1220/1345] 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 1221/1345] 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 1222/1345] 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 1223/1345] 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 1224/1345] 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 1225/1345] 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 1226/1345] 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 1227/1345] 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 1228/1345] 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 1229/1345] 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 1230/1345] 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 1231/1345] 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 1232/1345] 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 1233/1345] 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 1234/1345] 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 1235/1345] 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 1236/1345] 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 1237/1345] 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 1238/1345] 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 1239/1345] 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 1240/1345] 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 1241/1345] 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 1242/1345] 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 1243/1345] 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 1244/1345] 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 1245/1345] 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 1246/1345] 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 1247/1345] 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 1248/1345] 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 1249/1345] 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 1250/1345] 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 1251/1345] 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 1252/1345] 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 1253/1345] 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 1254/1345] 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 1255/1345] 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 1256/1345] 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 1257/1345] 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 1258/1345] 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 1259/1345] 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 1260/1345] 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 1261/1345] 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 1262/1345] 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 1263/1345] 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 1264/1345] 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 1265/1345] 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 1266/1345] 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 1267/1345] 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 1268/1345] 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 1269/1345] 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 1270/1345] 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 1271/1345] 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 1272/1345] 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 1273/1345] 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 1274/1345] 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 1275/1345] 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 1276/1345] 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 1277/1345] 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 1278/1345] 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 1279/1345] 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 1280/1345] 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 1281/1345] 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 1282/1345] 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 1283/1345] 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 1284/1345] 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 1285/1345] 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 1286/1345] 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 1287/1345] 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 1288/1345] 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 1289/1345] 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 1290/1345] 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 1291/1345] 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 1292/1345] 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 @@

    -ep8{MI`DuV@{A??m}4`sA-<{ipThU%lYf{dS!EcAWfn zocurQIQc8^5dFE&4EgNF7FpXC+g*y$NQOa7X)Xz2W32*QM)(#o&xAEkIr%b&xu5#K$aPQBrm zy;kOFP2H1$)@cm-Oy`!XblI11;XAWQmiLuN9g!0`UQVL(i97n@;zRPh8toC4X=k}I zrfh;3u}i-3&X-L#_i&L$yuatJnY2~X-Kp{&Za<(A8(EJ}YQYXpb@?VG7=uOu^j3YM$n-R~O^S%07+TQSl9JUCl9~2V zbA3@>LdLaEB$q5g7v{MPL=KIrHvK>q2R2-`O;|>_SIUNL7C(-q3enCV=gQspR<#D* zIVEYoX_>k*CnW|Ch1B3*39^(^od4v(t<-B`lt=4riMByEKSYCiZMdwM)nZ+&SgYfe zM#VZ*EaaJ>ZUct0`_*`1BnicGjjKQ(&K1^sk4UZq<+^v`uw4_tjk5%`td?}wF?*qlFA*vHfZCF=~c~YWL zAF5?QK=ZurUs5isJzMYi`H6e`b027f2H$Fn4!lS-!GoVzL$KF*|IOFaqpqi=sY@^h zHs=f|E;8hSzGp?*Hf-Zw+ul@fiXv_swN_u-MYF&Xa@|361?^9;h(ddC*d|q`F@Swk zLZNV!b;ytd^lAx5=@|H&Q717O0aq&B1fID&`HVgES_JPn3N~mUpSdt1ZCvBSY=w&N z+V9)~K2(g1F>iA4mTnBfu8_1~0KHTsdwNW1P^+GzN0UoA8r!n3M#M zC^~*kc(m@Cq(#k&kXZM|AZCW%X^OASWA5sBbniZMp2&UJW=2P}Q^qEkf#_|nlglK2 zXD`RWH-nERf?cXVW_UO=@vzT?>osoQK$OP! z%O+7I-rQmRluSpULzbC|AigV*lMK5AO>+@(Eev`QfV-VUB54d3(2ueT*cJ|w2mh-J zl2X~FXG@8!G$KHtp(9IThi262CoyR0aZL~{Y)ymj#yB=3W?OD41YXW#b0023cRAGW zSw~!nN45Od8FdTzOUxkSPM9Jk)L%!o?~VPYmy!~CLzNbgca)IkwV z_o2r3Ok#MGA?PTl;d`pTRzdnyWen~(!Jw18cTo2C*o|;sCk9KC_q*`xvFkU-z4-7q zz_bgco}nzIjq& zMs2QO#EvM9eB6)c|FQNS_>+maH3zwSzY~aNYlQHuk|jr-{9U#$8q|u|0A!BEO8t`#hXV_YTaiMkQ>!6sm6uP;(b@ zPYaE=7l#R5t_$MPS2ttzjQnMNud=oUH@BsRwuzb5BIXcY*2OF&niUW^$%1!Gsvoz? zis_yAf8Y?QpGrZ6%a!JV6x8<2fXLh}2&AaYmaafu{W)xLb_Noiu=vXg!nkT;!Qp^_ z7c@;}I1wbk=<6iB&hYV%xjvETsczewv$I~TH94Ny^1LN0v&O_O64|2=jiX|hyD410 z@T4W8JYYWrVQ(^ihOsxvz*0a=ODu-BQdI{Y(bM~7U)bb zF4kXfLo>Xoxig$g2F|C`qI}cCW?a2BS-N&Mgb#kfeR?5lR}^&G{0eUjq6_$lo&thi zRe9R><;1DQ(Fi~&F$WiimpKvFzC*k>1`YXPc0QDPzlC2{j$^uPg$feP;;p6ahGQQ| z+VdtDVbb5(n{T1aUb{`{`(OtDkF3Gan46_Gb`S4xU*zYhE08pS3AbXTai5wKXfQ8! zTYm?E6YX{n*KY^$Huw*nwFTxnO$9n7r86FnYSZI>HN?X!<}!BqX#yRWx7kI4aQ18a zsc|dc3gpsh5#K&V_In|yJ)bMclbd;G$b>byrig#-4$!{|=pY}HQ!hbG14rLPiAMkt z+MunB(S-tz8Al}=p_v7s{}d0Jv+pZJfOvdlL)*=higd(PEY$>bSRuUI3ghnQFCyXT znN;0P&$r+lBJGKOEdwmz$xji@!v7o#-~}hhEhT_oQp{TtmTd5u&tk1k2Ezfp`WY|} zQSgGPq5V8$B^=t1Jj<+#7@q<&)5U#DD4#bOAH{EC=G`ZfJ z=V3bx@R=(_Pwj&w8-Oi(>}iTMz%bShjDUK&RZoI^o>`Cy&qJuSp-F<=I9wt@Ms+zQ zN!qEF=QdCv7VjGB$w(CDRwxDnH^8ErP98++6SJ5+M%n5B7ExN%mpo!_YW(8!McKRn z6#8T_7-dn{odkI(vkVKXT>uCwDC30hECNO3=S%UL8DEB}ZaXb428+{{UwK_+c|Sn^ zgogd9dK>C`t9~-K0e)@&fF?IEv@moqv@q49(bIMKLv;9yQupTv@k!`mKK&Wl>1X7h z0sr=c_}}YkduvBKeZ&94oyYtvo&Umv^IsO3U$K0&pc0IK*5=&o003D3G}bTq)XqWw zf2$+Eg8th6p(dYG|7quZbocBCyahl}SBiKs9^t&7YV7Q^b810OQ+(t&`EsEB`Q~=iw@qjVcu{Hr zD*!OPk{=taoi&87;OEqHu-Z0A|4dH97_H#TjkSwpU9Lskm;jdO0e*<56ZmE~sM;lq zZJ5UbnT)?6TD{iQxL5WFJ3(ZrqQ~~1JNZ*pn!vj;S`pWs zN3=l*F;%Oguey9e<>xZeVds!&Et`b7!2cw4RgT4gKK2G^Dr|C=N{hLXiq^;P;w+Li z72U>ty`$e1&Ars1eP_#hq`vzB6|u<9xVg$;k$2#;X3eS1G~z>RT<8T>2y@mBT7+gK zesTnM>;COWcB&>86S(7Z)>zUKC+J(Z)3atz^;Y;%MyzDp1m`GjsWbDy=|d-j6mxjP zHn3#)tU6k=ejfa7d6Mpxu&y>*2G8QMF)((GxrM*c&36Idd%=OFd;@03GHVCuwW?=s z`Gzi@84jGoI~+Fp&C$c!Y<)8_9RKuLH|-olHS)I53B;^HLZ_p*Ov_hK-^_G1a5Xh$ zPUZll+gf|%{HhqhHlo#fiF6GU^*0(gY&9F1Z!6~hp1%Cz`o(u@oZTdil`w~9pMj;? z_j3a=yM@?Q2m`o<8Qq1TaH^r95#M|2abd%{hrm@McJFHr2F6!dtv60Be2(Bq?e*s7 z<7um(@T3?0dG~th-)mMeVfI^@KRh6W;PI=zq=5CXSFhdZqeiU)`qSG7izEbti%bZI zf798N>U4+gKny>~asCpo>cOi2g~cswC{D0;|LK%{fX&gi-WxN8B%Iaiut_<-D4^Ov zc6^4ZU;t3?ZmNE0`xSuw0A0!^x8dH*#d$|+|GQTJcMIMo)Hqk`iD#r$4bQBA>#4w6 z80yeSMJwurLTc<0$Bi{nH9oF%1l^LydblzuBDE|A_P$<)N-Z2e+$$DpKSE(WP7C8#Zn6TcE5fNN3yw_iEVizMIJjN8;$7-UFy7=U$cm>~TNH)u%{Y}uK!l;K27H2)paQUn_8rPSDhp7I*<*^XRrnX5FMrryywJ1#xmB)>Ydyhjpdg~`3l zjTnhKQY)eUsT}oldY^+?Zoo*A&Xqk1WGrG1IqZRdO1*-DdN_osU(XMS+TNu!Y+PrF ziW)x~yU0Fo@;b-w>X&&-k6x2(K#NOs9?MCcmWR50K%?5W@4HWvcHfxt2k=*~c4IJk)5u?rX4c>J>Nxjl(4ANsoJRsdA2=8L%fU&jf5w`yp)E`5~pKZKLa?5Y){SR4&syex@ZBCDEVs-D-`5dMEkpb6nMc{zOatmj0$lEeDSD9i316K6Y#9bD&r{VTf!uYw z6Bp_HR#E_rJWi1uBga844qP5!+!f+9;npoIm!Vb{jEa;apBr@#?;M~M$h8c7ieQ%b zb%EiXi{WM@N6m82!A*M4L99ud9#9JLj>B&CW}9B7)>+0GGC9|xBpW6WFbMY{mP?6~4}FSMPcX(v_2s zsHQr1Et=@aG86WZ|%Efe5TO-jIw>>t2ZMG7?Fr@V|B@wPayS67=bV>Ssxs;_O_ zVH`&^_{@>{d^Rpyca(28BNO8%5;EXhQSjbz0rBVrRx?BPokrb8U9=^?a45T2OIq!XNle^*(!{L2>(O zX$PTVp@$`6+DK_#BvmdxX@1a7Z34!q0qiyt*f`q=JD3|D33MGKX1oOIF%a4JoA z2YuA^UV-i_xUZ zV~@fz+{| zC~eHrlb|71LA1gqT2Yg3*>%@v6Y5TqBqU9L>{Qn7mrTKmBRXF2Dq)S@V$^G}so>Sk z!#7~_-KpXJ;NTXMD00H2Sp~Jf#K4-a(qizm7u~CkEiJ4Ow=!JZB?X$jCrlA;%KA)h zSz>%Wt)}3;q$lrJILPUfzKeBL=ps))^o2&?!2FsKrh!JwUSj$dLL~EGSAfL!86wH7 z;X0;baXKj>`kcGXYm^ozQY+jmYL10d2(j|-`Fy`>*LN^X%;KN5s{-fG(KdfsyBgb= zTL0_f^-TT01Z6G!4_zxbmBppj$IsSM@_bc$UwuBmP!|YRkps;YVgZI3h}gxqwVYdT zV93Q$s8<^hU!jE0BsXu{JaYAHjm9WMJuu=HJCsghMDaw|rK=-h)-6+@?{{WC;@U3~ z-*PWxg2c=@UaaxlS_J!AaWjZyvS`d^U383DUYH0F4ikD@dcew)ZP z0R~1!dV%IO)0FJ+9si~a3x2$a@0i7OgSr;ZYQo`!M_$M>tNVSOT>l*ve71kK&3%C$ z2H9_`u`KFIW|0NJ9wO*k7E~UqSa>zZhEG9f^==IKTCtoFx74#vKPtF+p1!kD@!4}S zm{g<8rtH3Dav|ZQeOQt5+4#^*KY<5dGmYlm-=9!oP3FTfc$B#SPSY@ZwKzz}CofXu zQ&o(gl=dX9IhgEWWH4~I*eBUg(R!@=&c-i!BrFQI=T+Gt&Ox7m3(C6h4hrgu!I?kl zLt2Qt$Epd=%+VlXmYEPocFZ6kGuy|Qinq55<6X3^xI0HQu7=iRGdn(R2RppapgwOV z6I*e;RzGv3P(P}}>g=v;P)G%Mk1i#QY5DmBh+xX5pH-tFh>s$lc+}D*wT~)Mk$0%K zTY5TbF#uCx?y!kmG29MTsGpEVqI>wm13!bH9&k;sZ&b#-&!I(Yr)qEgkeFRJtns9| z)M%4%EXyK&Lte0Jjq0KPScdf%`z||`IPSmKJepIHO08vrHvQBLH<3^kDp+p;#iCi* zb+yp+jN4l58a2GV$Hr;W1XTyN5Xd)8*mm6t_~G!uHo*1S_$7a zph}l{X+tuBmXne61YzkSa0i{KtJidy$Y0>(;2>K-52S@ejdX+vwZN(oP~FXPm^o6c zJK7z1QNh}J?r;CFR#Q}M$f#*`vF1H^6a|Tb}G{m|M$xNAq117+I2A6iM;Z86$yDSzylI)o^^BCB69179)w{@52hF^gZB zC+#gz?=Dd9|FIwYp%|uJM%|%A(4j>CYd??4D+*GhHd`P2Bueq~c2CVhX5ghT@{${T z&A%PZOxkubv+(-BBapWvp#iC44*n>F8Txp|e)lx~r<& zLE!E9%~1((`Dj=(Ip|X^^=`PpAleGwd)0^2$*s+W`!_{lanOFF+48*>L-h>6q z*!M37Nzpsk93xIhkscmIw`eLlMoLA&w4bGwvwG%iSLhxr(0pSV%$G3dq8r5tNgpIwN2)XFO8EHw1m#tAG0T}yxO8w{ zMB)Z_oHlQx<4p;riu99%i32d}d_1_7eKHo|a_5)fb@q8aghv!gN0$#C%p6Q`E(Tr0 zlI@;gbm>HDGb?NC|1*g`_-?b zp>6kA;;ZzJ7X4vJaOe{qe0~=vimG2eS(9$NVP27r9ts-h#{d>xzPnI7_9ty(sr&xm zW?e`1vKN0G`@F>(zFE{JkCoHVLL>AE`cR%TTfQ0lqj#Bdg!{>XjH)oh+AMD`yDBi> z`Jq&tjYXX@Fr(?Dla=ovDbDv`tm>BW$+1-$lJFbF3Y{7VTwdS~fKbC$MpN-p4))d) zL#cypT_n4`vn@k-Q-j$73WKkMqjC6N6f%>zT2nLepciYMdL}tdJdT*{#@vyX?++UW^~f^ohtVj z3{HNTztpb<+d|f8lLJZrfs) z@4c#-H4l`ki{qv0G~7rzy-DykMD*6WSs}17jF0Rro9rv;CwsDx$rkN!B~8 zJxY|S7^Ipzc`E=MH)bN6A+J^aX+`9TSoSO-4d^Sra9}Lf;Uzoiox90X)jkrpM^Ys_ z7cybGT)&oFmasMvB!4rT*^_7b5r?E(wRGZ9a?T^JPsi+XD2aCJ#g?^S()CMJ?2LdU^W-NqG(eWcgM*v!R2@lzY+E3=kBfpCHPA6 zsQ%!_qegffL}5ssv(O*Q&W_WZ0{BzSV;Y%P0vi3b$lY1vMfNxxglVT}N=VQg%EZ+# z5_zz-up2nW&B<(qn@gk|9FV=cnf`lHTYj$*6(YE86eA-n9PSJP)Nd=B)nxCAvWUc0 z=28Y@5?CR@+E4Hqhf)VcHvzqwiHqw=Jx63tBC7y-Dz8!7Dh}Tg+h5e00!t72%g0!i zT5ib&mFdi^juh;hGgF_|^K5>gvZH=1pJE9GYFuz=yuE+N5hOrBNVEbc&GiLa?4R3J z;JLvbaL+BP&82SlD^yad)KaRHRjO1~s#H|E%>TY=s@hdk?I+fe^^Kn;AgS^BsihCi z)zQ$y#}$AUj`Ilk5tX-bujjirU^9c89Wrf}_>3^i(AtumlVn1BLl;?lfqLvJ`c1L< zI(!S9Pf5$@CL;c4SJ9+b(e_uGXiv z@^=<}lJ8=YLuaMCLKx<4_p2v&9OhTLHM!rj$56__=f}dTbJ;15Z|fBjQ1(S-?bQWU zukcVD-Bu`v#h{Ceo9c4EN65Mh@%{Rn#6g9CievpEtiyu8NSp0D&PX{evF%Q3aVSsi z=n%rn>r+{&^HKDzo0@iHQtx_8#~=Nxe=4_(Rw7JeU;qHJ`2R||bvAYUH^r~2rFHsG zC)>+YX zF-=7jBV%J@qbygWq|=LeXp<7oY_%Ty6}Gb`8wZ<9EVgr>7tv9H{UT9pTW!9z>9I)7 z!|NE|BTf2ZA@Fyu)~1xJ?`QD=aRu>gzI{`^zNNkl--1>jj3#6im0Ebshs>WRXQ91j+`&BNjx%NsXp5d1F>ic@5Kqt z_UAe3Wtvm#iDs}}_JRYdr|NW}_R2mY5cvj#a;bqRWy)32(lkyIU3jWgy?2du$rk*m zy&mo%tWJs@@zQpOEV5i+%Or_3g#0;Hrr$v>dS26niE>xba8JD4qSDs#N0!6jv9=KH z1po&khEVTJ+Vm=5+NRbZuWrPMTE-UVr3bGR5U!>G<_HG8ArGEC^@lty{~Wq1Kc#XI z2t`@FoZsg7`rFVbP@C8NBB)+w44%5`|v>+CzPCr5(Wct?p)NyY-EXaW4sQ>WY zyd1PsGGTp9)78U17=WI_ASu1`$V=yaHATQz1oYtt=nyGldjQi#ch1VKtQ`_Vck3f( zJhV1~_ZYPibcPZ($;UmCeyFQ1KXE1U-5sTGgsf=uqL*wNBl|!L)9E;B$b$kXg;^QQA-{$K7heshnGz684C0p} zvz3F?uWi}nY5b&L;PJ=JYXFA1pqHP(TT2mUFwd_U~XSLUtwFD>U z3^&Ef+cPI$E{KQdAx>x$vXJyd{pz5R($x7w^qjKYvXvNx(C(-~SBTj_OF(MDKgEbD z%BdDR3rOj$IN=j?h7;QlE+@>(SA32y4aa%jS4p^%45Ng5(4znZW@ z*ppY~q6;`y33vTkmxW<{Euo1Wd|ro)Q)Igq`UCHuFpOXNP@aj7B;ij?X_(5t%8*8urvD~GYPegk z2qAv(^0oKWgM-BFu;spnlw|-9A{rvi^^hE)1H!_in;Ie|iX`Tr7D{%!jGfYKh{wj^ zuscJj*D^HStSqJe{9Pj1I2WanJDC+VcDNH=prMhRwqTM9(SzXuvlStC`xTGjH~Su-Ff88z+y)DJR?nLF~mTuwbpntd>K#5bhnl+ zk^cUa0pje#JsEN_?gu`SXHaiPDsqGeFpH!;xLR-qUhz;6*r5wQMhd&FX$C)bxg_i5 z6Xv4C^l05#>dnZts zSTvBs+owv$u}*^9+bJJNSa=D1V;62c4gX0(jQZfU1`maf9|Wxoe{n zDA^B`?pN&R$d)WY=`@$^@ert*1tKWtW!gc=`iK)sD`DmO7# zpA7awlrue}wWuDe^W{0*p$)(gCM^!=r}skeb$tWuO&l!kSeG7a259cVZ_SpWjw^ud ztjClSY`Q@hp`Zx6^IV2tFV?RuPHtZ5)dul{-m%xbHgg47`cXsF40L287L!JRaPip9 zD!vu9sc^vw4(hu>0q;Mq+IcM;b*njP7#nSfZCiz33R8uYq8pVT&E~a7`!1v+ZoETz zbrHWq^W}G)S7i+Y^3#o}RsfO2;#Nv&vUWzn;9DVhi;~@sf}sa|Ku@p%3FQ4CY6>R- z6d&=o^`RN+wHq|PB!;~qg$Oe;ZKagl|0djX$D`X(l4gW(-=>_?sOzU8u3F z42rFvR|4gmG!`+Cz`;hTPS4H$wNB7sA znN@&~$)_-!`LFyXedCVz@Y&BmJFYkDifKFLRkDuR#yO!Gm<8M9KW=Y=?1~#(cQTqxBf)E|OAPGQh`z?D>IbSu1iMR<;4S;1Q1Wp0 zL05A)OqPPfQKsOH(zEcZW-syGb1WE2I*aQ6BnuM*5c`v3B+n0OY}(c5sJFl|4i>%a z?5>0`2Q9?>0sjr3Bdko*AWgdj`hAer^N&}X*v(g8oro79mi^RKz%>8?1dnxb!B=W( zA%Hp|wQkE60cc4S0lY{R`X(w+1{O*~jbKtfa=(YzaJ00k-|xEj5U((q)#gthLf_S{ z*%Zz$EbR<`&B2c5!efm+C}`41?8YY~^d0FwA@$MMN?q;Oi_l(eaABrDt#y?EMS0q~ ziKNO>kiQWiodB5UfWL@1rUHM&9};;^nh0!iGKSFm`L1Tb*{OpksP!Qm%(y1XF$qmi zLuu*ahJDM1eAkFXsfXXfe}_za{mJuG=3j%L9P-6*8AK9Fo1*!NmL4Q<^II)wX`Z28 z)26oj8VzYt?GO{VT2kL%!29M@fgqzKUky;wuXZNhl6l%3NJqU{lt{77F$H!QS& z^_HVv7Vb zq@kvO(7^(~|4s-DkNit%ug1TUIL9(^250OPa^xh&*k0h!Ziu;M&#@I2d0m)!ofUbl zjhPj%kc&iBnw!|B=GZ|2X2 z&@7Y!rO3fhM+%n=%-FLm&Atlr=b>ubfNIs|z-^PX+Pi{d!bv`eBoRji$6-j4IV&+^ zGb&-QHOV2tcz7B}dw#P=ib@P|gf-fSl(B$5PVcjZ$zhp4S!ma*ad3g0`4-|4b28)3 z+kDEDt(q+<-Ibz&%M2vVl^IX}mM58>=CuE*JCL+*5ah4Hm!V5h(IDn&0QaVRT(nFT zz&x)9FC7KV{Ud9xZ2p8v`vfh2V>}M=@ry}2CCj4VMbt$w(Z)!f_@vueTgxs66m|3m z8X>tk95&jsj!1`h7u<|ojO(B5bNIZ5VfrF(JuYr-xFpKD$J&AhGv*n?TjGav23GjP zJUb~GypDEC`VRw&d*jOum}F(onlGW0u>s{}|(Re|QtLb$OPK-YmD` zu=T{2v7-KWgGd`A(N4J;ro63kdt@mzRI0N2PI>fyhEu;oi*#jmUB&gyNo5j$T+R#I z8{|P@DdDO}!`@+bS*xKJ%I%2NdjcZ#jSacV0H|kehq&{U1*1ZZgE~+J|A=+GiVKv$ zQag|*E$!e33%Bg2BF2oaY~MXvMgzkW?>m36t~O`OT3qWl`(!T8H(d0POAsf{(Oj=- z-%Q_~{vc9{ar=P%2ijHT2t{AIOoIF9=a`SHh&p@Y#?aDd9XDE=;{%Gf)w)?H&1U;Z z3RSRNt+4RWIv{=DZnj}@ek;*(EPZ8H!~RqUsp=&-{>NP(4#~4JY;_h+&EaWnzVq36 z=uZi5xd$dTrzTg^oWt>jQH+NUgQ4EAUe$;wQ#%Pzn<#wevgRM$u&A1ZV=QeIg*<~3h_X1ExF-{jlp#E^yaWL= z-twIyE;TpKg5NAAoxw$cyg?p;RC z0v=I&2dTG~Cba8Q+6`EjVYJ_6RfF%jpkUqb(|L%x@i}xYr+45b%l||Y?o|lyd3lC~ zPSC6WJ;)<=sr@Lt^S*iruK#W;eG+-%h%^&~CoeMN*A) z|DRCTZ>X>4Hv}??WQzg@{Tu544FT50x-O&y*LJ4tkizl}$7S?8RIgTxoTK>ff*ltf zfSIexD`gvq`zCPAAP^hN*DrRgMI~^KYj7?y*rH|m`?APxdT*AzIPt2KU&E7pUf@s) zEXcJ<)WT&CRGW6WR^;9VYJ!qX!Ynfo>j2AI?)q3l!&z?ftXyb%(?hlV5{T?|JL9~% z03cyeD_AN2T&)~+#qnp>#7%WJ|Dw_{-K8M$b9@e)Hj7~2oY=_cMeA~fzBQ`bpDYLU ze*S303y7hG+HPOndmz0ccHf<@<5aZs&TG!Oyp*2!nQTFB%&DJ*s>AV)@4;-DvBR8i zSbb%pO@q1ZLEh{^jO3=y=J4*P3eoT;|9#5^PRewm;5ffMSEey|-#iX6Bod`#u2E%(8*lvZNkph{X?spW0AOlS;x;93L9bx+KeiRSD7l>@=6VsOXRU zhW_u@&UHisJOKm%fcRg#+y7gZ;H>ZPe;mjE4^8cr_V2xu9qGpd`jN}-#kc>uDC(+v zO9pTx8F}w>R6^2YNFR}c6&Ko4N=IVa(DsFQaLa2qgOD=JeKt9sS;FOlPeF74lbs1? z8YU#M{iAVL$YP80EINi4`@JtuL?de0(m+GVbl<~CfIRP}ZJLBYq%a1bht$hdU~E)J z0m*0mQ2XKD$ogaN0h0Bsa-i)5`B$nmU=!n{QW3;dCp6+1CUQl}dc8&n`j-zP3=hPT zb7(k9wPUKKBeIG0P5cXhGJOU+(iaSQN1Y)SV=J8tFpbcXYKQBW=plGE5a{P19l;$S z`jscpS>?p9t!ELK-{RETyajCHatfTjsak)+DKu(O3}qyuRGn^5bOy@U%aMMe@2+w# zj>hGst&b8Nx7vE0V_>~GmAb%(*~EXZ5`d4m*D#%17;$5HlHq!p#YclOAH=xJ;p4_$ z*O^C!r0WxHl5cT>JQ%P&BF4gVCG+AT3UQrcT>fz?#TMV@y4E0LCNeB2!K|ceWg}Tm zP0fnIs(Z|P&csAs=SnTzJFS1$24^p$SL_F^g+g2fHPV z_&)3!+DSy;3pTM|*oDi)NXrIAilEFxkV76Z47i5%mVYHqmD^ zRm}(%?RkRpCG6UiugKW}i9hNa2w@g2WlNIEZ{#id;(^Q97?1;rtdx6Dh1}^p?+Ena zBp_Ei<`VZ|q4oUnwe3=BMuKk5+Gl1HNyM=>Y+NvBHpJd3j~7e`(-}d0^>P``Ofe@x2)?YOFc-tNjz5Ee_HBy}(Dafr)S|TOLsnezP6$9VQXXIkA z?3VQwa?sv6+@M?AcL@9hTfAM23Rk0TRs}V6HzvItZXeFvYjyS+ENH_^?VMO~PAf@Q zO;A&@=9@rOj$E~I7f1}-@?MU{FG{cj-c-RAN5TU&;oPVRbb2gE*~LUXO(HBRy(+1L z`kI#!V0T$`bK1Br8)CmE+Aw>GS_b_p)X)#!CZFqRYd$(AwhoXu7Sh$_>_ELWK<5$| z7Vvd^CpakQ(A+8BZ*0G3^yf7HCc;S^Qpp~w3xte6e_etp!SfMLXE`#^FTSJn$YBGoppQ$9t@O@{^dL2?4I%v&sjr}u=lO@IozWMc?Ww~j za~BYahc%3YsZlMGSqoR$p!3ppo#7f_N`7F09KjeQV;G{~cwkzR>QF=34)5-WmF};+ zR~^WZQt8as`~Q_*bL#h56u_e6v>vTOpQz5tH1@WVP(e){FMf9NTVQgAdVP&oj8qohP@ zOkUDmqVDWi6Y$*a{iQ&nn%j2WAMofN!@R1b)??Yq~%JU+Hf6}Z{5 zq6oau2tsfC#S)1M&W!U9+~?xsF(qczqe{nTJ@9D8LmzbYbPe2W4p)Hn3nYGDr9hs1 z=O)Z{p8beZTz54|6eGd$aaL+_AWk)8hVOAJuI;ecsA_qzIwxKOt5x=&MAaK-cbuYP zVW@l72ydQ-*Ul-RRdJ5?yp{L@*VHlfGbm$;2p&CBXTF|zf;iDQFG5#Iern*BfdH|1VOZ;4${MF@ z#f=F|+^FpVynOIDyUm<6$SHiDC%=;J|SZ_q*2;PL$s9ws)a zT)+{yK)zg*NV^b%U>;@K_Xz%2gnKfeB{Z;#I#~Ee$|zgVP`6z=k9bW?06qjM!Lx~I$s_wcoG)>vw(>t zWZ0E@#y{}~lkr-4ZfkNjlGGBsV_q8`HO12NWBs4jit9r2kgKkoq}XQrMrJXc9yIeA z^YUcp!g4aA5M0MNOCn$w3mqhIo=6SZe z8W4r07===RK@+QgEI*N+SckBDgy|*`tSV%*+ySdWrY18`ml?w+Kmv2@L!r_AsbbTY z{>3uMce>fZfe%->TI0dibm_H+C84a`T+eg>uLv9-fsQZ!v9C%@@0qh^B;@SJEEq1?Po>ofz;u@QG=bjw`No0^hNgSKx2c%PAc^%o+G<0AyRGuSK88H zDX%tehRmKQC(D7$Khrd`A%ya7VxYgz9P+c<^2BA?z(UnO(_th7JJTb1Yr7P5H2aqj zRIE%isT>dt@q7dGj0;}9UE4tDFyu^V?s&!r2uMV`HknP499ypEyzm!PJBGL>8%})` zf_%drDbeg$br0$$M%jqtUErlJ-H1z<-?&MyJ~a5b2z#vky$Fw377JI=l<|T z(@C)T5A7fP-~{?pI%@{l2Wrs-Kq6`fj)yK%;!a$bID>tVp$J9d%czSgoI3k75>ZXF zpG_)ro04#jAC+bEv>|613py@9-t7BB)e{{1gin;2-LL`jo(CVIm)!gq#b81AI@1mj zu!Ce{dK-#>xTL-4E-fdsS1ild*G`7(6fdfbtuZ4x_?0cCS%m`}b56xx`IPbS=<1ZJ zH0_!b^0jPy{LY&H;&#gAi;N$_~}~=hE*DyHs7#z9oLm1M(*Nl zZ4dft0DJ#W)pXlhqr4<&Z6xw=L3FvbxGF}B%IYPulFClyC}!m~jk|Fb7Lc}57DJIL zi^u$ag=UVO+qvY5TS>{u)nUXAwQgOoMO`{HiRfXyTLqDS?2_pjlJvpU%HbInf>$*G zRJ@vy-oH|Q^pSC-L6+8e5c#qi5I=q0L>j=9kPQt8T6pDr94$O6OZisr#C&FIZ(VSE zMYmQ)T~LwzdyF>)d(d^QzE*DQZYwQ;Yw0`oV(OeIbp%xfOatx$@u@}X$e`EI2IU_j z_%X7*ZUW#{g**YgBH~dxjmvt0nOlfEIFIbpQD}vdD2{5g_)JKy*z8pCXJlL#NxGs0 z%uH(enGpCxWxN29_at<7YI8&}3_}&9bMp9$csTtqXUq%B80HHIYhz@HNn4y03=^9d zCih%{c*R1`;4#C-@7Vn_x_qXiBXdNpwDK@ImqKtcWqkqM$Hcx?z>8}0K zr#(79-f|cXAmVIfYcR5qCE2?ZN4=7Lz+Sp$PQ@1M{++kd;1V zCoFjL;q)py$t5N6hQIu!qN(&6O!%?g``B;?-x%<%)FD|;?WaxyY^xk@x|dId|(3Dp$67%Sz&O6@A7vkVxehR#llKUFM z-<2#)XSM%es-ss+iv4TRyuDmRpIzCl)94+vc z*G65oVD?eghuq8{dGa-uVN+_l0ifARN;SB$L@!~GY5f^}q#q<0+oBs96x226&}!p0 zqV6Ivf@g2lf6N?6)SN$420du2J5#Ed8P1e#i){Ju(~q3yk}BVPR}j$A9#adT$XO;J zS~Q#}-RY9ab#B;SN7L<}sgcQ7o%+Vy#>A{JnSe0t$n;*Mn~?0;dBN-SHMXf3*fjy` zb`9w8KLl+Lf9>5K&y~C?T)Elz_)!xCO3=4gW*CXknTePjvR(BuBSXGO&VV^!a8HoR zCpDKNYYS~tATew{o)tghX?r2JrDkVVz?A+@8hd%VO)yq!5IoBoGv{iLmM7Em5vGcC z{vfTQe;L1oQc3lZYBmZIVO2ZoiJ24S`IMu5f9FR|fBV1K@SjrkoGcgsfV$-Wi4Ff} z{{M0MUTJ^)hYkPc;r|Y4!~47HXBgqIPvW5MTWprW&Vv(QkG%;BCRAmRUtb!Zn4q=( zv0;nv=_p}&X1ZY&>J|>#B2Ct2WQtpOyDZ4{L;+)rl*Mr}i@M1dKPG zm<{SP=p?u|fY;|4D7urwKh80Tpv(PM_RZb?s%?X|EU!9WiqH3RDIjkd+_^2&qZ--m z8_4QVD{kD2Tu{vfK~yhr4@ySjX!-*8=nBqS9e(;R0#ac8RvrLKyI)J8pu*X65qf`Q zqZQ`s$~H>S?&JxAHW51$GsKtr;}9gmqzZHj!GJaOc{JU8D>7Z==dNaq=QRaaD}F1o zEp*muk#TFT)c7{ac)P?}g~dryYo(3ebspPu7+guQ%^5Lvgd2nEiC~Nk`Jz@MueZA5U;H+>ZG5lQH)YfOT?1~#>W{ek zm1OI$wYxE-!@%DOQ)!Ls)G;=bWvs0R@e(DR8kB1Mgj2b6|7mLa2v#oNesdqB?SkMO z2(24KoZ;V+t!vlURXYePQ!YPtKF#W9*WqBF-Lk-#kUL(73z)-p#LS?FWFTEffBc{$AZY8LgjW zl15)VYZTSFXS+_qcb#jYd7XJMwObH5vhB=W?i~cDfMH`B{gTn)5~uMJ!0S!F+Wj|d z(gZ3z$V++0L)m0z3ChB1Csjejc=Mc3LeKD56vV^H?tN6v6)~jX=@u3q-EDgFgHBRi z{jwYQ5wn48znM5E(GBp~umey{&W^d=tF|RdFGX$fG zlm;v)iB?dp#x6ZL3W%^=LgVTiqrI}ZbSPhjynqjPX&+9(DE*Eh5Mq^J_1Z4fqK2SG z5QsO{MZgkcKZs8-9}t?aw)<;E%j;xIuocz|ffmt9hTCceQdz{(5;--XR1v2cZmMBS z%M=Sox*>HIfQv81zbsJCej_74BuFM7-j|-;;KAj!gYdo;DfS!uk!n_R!~7ma`1)xk zX~e?C03}DW@AzG)TpQxib*~i$?*^SOOiMvl;HQgPhzP zM{t81qO-p6?kl%;cOb`_f%AGu@8T_O>4{(or|?Uh%CM|?Wd)o{0rD_S8X4BLP)#*U zXBPAkVHWGS-)79KpaPVhN(uUUN+~fGwJ-%0OVWr%ea!UbCecnAok7kT1r-~5*ci$s z6@9E=reEnNOV+ip3)LRuTVNaPZ0BT>Eq$zyx>m$2(M08atQ3-a`B+u~`R!Ut0oH#P zY0;PTuvb?y!cBHeYwK!_VC7-A z;okq$ahl^e3^NBe!@V_-Bx`Hx$5qNThAnfUk}02LU2d*6{JBuX>J#Q$&nn!(kh=Zgrw=pXAw z8Sp}d@OX&)D$l>E>PJ4mF=_1^Pti0iLX0+K_0JGlN7q~BR`A#q%S#U<)fGe}P)U_1 z14xvq3rLhF^M1ei-@!_8U~@K5dIE_`#TjZIL-ZO^V?m+g)}T@KE?DxE3G_QJ6w^-u z06|hd3?dPse~7t0wImr-0Mq@E<8KzvwnHbLDNuXAI{g zE4(S1zSIJyTh4M6R(hPDcm&~cwPo54bFKu*VSLVm9*NW9(rO@QZC4p;)zdaQsF{3G zNSJ(KNSFX(F#+I7nS601O#nm^Cjs2;n3-usPodR4ssiQ5L)ZN8zQARl$>iWq|2X## zAsRz2fC=LF)Gtu=8b~sD5l!-ltuf%1+dTzxa5%oBn5o~3FOytII1Az)sOGbKHmA*} zu=BJj$X4x4mbC?PqUA3_A`(=KRA=7USpj*%`9$zqy3CtLCz4C8R6V%&dq<*C5D;JU zy9*18u9&8dDppV7gl;s7$L5n%o%oVe&G5%B2NXX2u8gPOmGShuGM=Uyvyr>;gAN_n z31#2j1hXxG5RfbRw4r=Ac&+`{b5TQSlyzIpNHBpJ5|vj@Cp^h5t=Xbp)?x2vq6b4OM*oJeS;wkU_;SjQzXN_i4k{EIeKFvUOg-znnw_?bRQJ_fmG*d+Z{`zMraK@!EJX~{+!@#d(1&Y& z@yE~k8#Qt#8Z~nKLgW|Jq4DGQ!V?*?jg^->iDLjA_qJnU_%&gQ0WF)81fTmNsR+mQ z0iTwR)d6m9CE(IdZo1~`F3mZK_e>98kS0ZrC|Z*VstOAiioTh;2QEQ|Ea9zK{ih&J zPD4$DD1ZOX*-(izx8|$vhhr?EEIza+;fbit=uq)!>+{%ZoUNfQKd5NQNoRnfc3Bpg z5mbwt?;%p~+0G9rFZPquOVU-A1?lFx`PSy6dHWT^^@nS`2IVaa%0c(=KOpOi(BKGV z&O=mK>|yV7i>oPPzx2kF>nqdXfK0Rsvp8$ALnIeLT3QTXnVFFPP86cImRnnlM(b}9 z`#Vu9M7k3cmBk*hS@xgG(x4b|1xKC^Aq6j~~CYga#Sxx~b$k^r;sLE(sH5^YJKPEsL#;?>-QEHlNAhLvOuzw>~{QX->kPO!;_|rVVxoWbPez& ztjvvJ^Oc|hlLugSo172(L7?LjdlUygzdy@cSv;q=zP}C`CJGg7Z}Tl}*90kBceh>S zxL=bDMex0aknR$Hnk?|O2W5<)U7Cx`V0sE;U{nH1B+1xnXlMo>iv~WnU>mEazP%t$ zRY0+xUKsvE835(%7Nne>^tjByX>g1hkPZSrr+%)JTw)(2$sBvvlL6QP^sXR+lHH6YZgv3I+ z^Uv%Ycwf-$XN#SZ7p<@9{FPx8S7r$`#mF)D*^ra+t@94^$#r@2u{*drxL_Bl9s?rl zEq>M_=yx2#z-=X)4DZR%Swr7om4hC=$3?9^aneXC14GTYjb<40?Z#jp)(6(#xO=G0 z-42E}J7BU8u1E*frwYzfMGsf1>Q)GN6-Qd$!bXX__Vj$jmnfhW(R3fX4yl-LIB~ny z`kEvs6;gDWsH8|KAq+I!9fQ;`qYRQsm?R}CrS4JpW#u@!YG=?wGpdT!4uev(^J}Kz z#GjX+rIDjB3FWBPb+CPQTZg)QfBZ@~Zk$}`jm6pZ>(Kcpt7~!ff&G|?u<#V&T-6Ea zRngi*i!giyhJ`%_J9A9T+oDbw*X<&JFgE>eg6zg}Ay@A-Nk|bLh1;H{pAb`B^^9j( zQ{_j^229M+LMpK7I_S@BhK(%c!w(fWo4kcwyfBo1H-av4LP zb&0~0SH8<1S*3|(ivj_<+feFO0YU+T7Y(8@v2CwrvmG-3fm6%nF@*JMW{7f%`^* zSMab0WcwwcY281DCKgu(O@3A&otc3V`6$^d2?ZXu448C0?Y&6mx{O$A&dWDxts0p` z%l|x&+<`=ulnb~{slfB%COc}xDz~((698hxs+f38xcq$MLJwik~hKt_G>g6 ze0eI#+h|_29gt7d4=)&9>R)&%(q&z1UA`LKnHbj=^K8>WZSYM7^|0Ilb`%JWK#DRL0~UQeu19u+*0R}71$ zd=5Ai+z!Jf+;&;|dC+)<6YzF>D3|c5&N9ByACs*%;VfjjIF+Y+k*QOS=G;~HpyoN# zD$W|u6J$jxa`?@qdeM#u7hb4)mX{Az3N69*Qsu(6J_qIWlmZs@PoF;uJ1d2XAoI;4 z1sGWoDoWYLCYY`;J}IucKh_`@`~1Rxc)-Fjiy8G}D>G@`dR^}U>rgIsXakxpdCe4= zJ^IFyjN0t!I&Q@q@ZnZG92bZ+!Z>`QwY{km>Jl~0lXQw5?lrSzDZFa!(N`K!2Zy4S zd|HGVdiai?I+|N`b@5X-KJS#+Sl%CGM^4Y$ZoUEk`*B!(p)Ak(>mR*{_@5pC4fSpQ z=dXcAY>Ws046^B>lWyQNi zAWqcL)jEtsgDuFVSCl={XdGNUZUe#%Pw0iEH|Ihmj5V{u4n(FNGjnlvovBq^&*k! zvW+hWwGO^{jOJx0xH4S8dS)3Aw!3k@KuC?~o&}%n+-ZE=^Tk*fSjd&j6WZ!M&N^r| z79?e4=1dpp@OSYtfDK#oEJ2jIvD8e=$rS?7!+WWOJyhzlhH1)PZjRjJx6K&jwt99q zqHh$JA`a205ps8LSX!VMJ>DfgI|W5ncf6f3;9}@-W z!qung1qE#Muv!ha*+*y}u8nCW;s-Dwyb9JfzyqE$z+wf@vSuZ5u(BxJxil+$vKOGS z@}tA7!?1yNCtNM&o#mt_5CSGTdt3vE?O#Fpy}{dN7qt9pNJsFS0qJa+vkJtmbvg(p zeOh7g-a2NnPJHC}V8tBY6Q6xhT6O!BkPI!9vyV`I!E0-8=bYmr_jW;0iVV^6`M6XjNr){2z)PX*y{r_C|)J0?P3afMFz6iir5T`0O;*roqdJ69NNDF zOY420_xHZi%Y;U(b*Ls9!4@*?LQcl4;XcpEPV=#&Wlj$Oj+zk*f_n!EMiR!31S0pf zdy+WvNgCg$S|f3ovS=y?09QL1@DfdpI<}o$}@ofrQp=P4gj0G4(z+x)f)v39G@RPd-ymF1w?f`X-3Kx}k)Kv1jwG8=3P?uDiY!%`V_Nt_ zsI5y9iQ@WCFK7c#sG z*o{7kUER@|-xpj_EZ8C|e1cdGz#NRsAxRWY( z=yHH_*kDdej2@%%BT^r5y?r*W$0^5WF#ZU1t}R#B-$Jkk;MHE7UC|z+G)=f5&#KIi z4ZUkd0eGeo@wIn>9O!VQDAL&G8`&b7fj!B06$BVkJ|OG50M@4 z90)F?pTO+r6I2-sY7fCdL^Kw|d}fR-WD-xP$)fM~ZEdK%~m7uFc` zZpoM|0ZV!a7yCWjIL4t-xPfZqUVeE{BOrr(FN#(aL>|%r!o0yyR7@oOpu^#th-o*> zqkhQFz$0@VNp!rSZ{77BmJU4qooj-M%>HPTD?0^?H|*^vqDNWUDkzvKJg&Py6f4>7 zKcIgiNG2xzBu`}Zk~>z9Ar5j5u%V+_HL;q2G?x(qpq&~`@KkO7+PGSGh;ArXU@ z8&nxQ(+DOLo4D7-t`)@LN6xV`5)$uCV(Q~?t3an332Ms$6uzd*)8mUA1M`R8>InNl(WoJbhIfaO+p~^0}N1wmvA_TJHUkVqNzX(w%Q(566UxA_g|% zl#k$0Lsb^~wvq2SS=G&KJy>*{fJC2Jp&EuU7rq=zAPOEe>D@eICW+?Zl#`FvVn;6_ zfJw1&lHH_8gxy|F039S%5Rr^nI%5QGg)e|{);Y%Xc)U8$+lshCUwFAqMe*z0S=Zhgm`V;Lpnjwsrp+vl58v@zsE5(xr{q6Q z;=NKdyZ2p$9vq!>_-8tS@jbKF__o!@fdL*7WVD>Er1@kqj23q!fC39$;C!ZqWRo#yZ+TV9 zz(}t2OoBM^niIT_6r(FLhzGpj_JLHoU)9zrx&uY<_~*;Rn}PUd%ibwlK{?Rvc@##`uks?7i zy2}vLfrXi#WnSwhSm4xX5!+#ji`7px(waU=)jCj<)zj3p49U0|!LpPfg_ykAkx%mj zTJ8-)TRcufR$o*#f`L2hZ2euhQa#Y0#|B{gl&G>lmlWVy!8>&QOlIl-EI%YlBRg1I zPxZuG6ldh$EaQM;%mjA9$!>RW`qlX5jI>JOTT@Kg>#X+SN}Em6Q`?dD1KP@Z_a<~R z3y1ib2QaYM86_Ybb2qI3+Y-QQc4;kSRy&~t4&`Jw$1bq66L#yzvi;=MMs1VEt|1N8j?{*X2y-`fal)j zI6l>?T;QU-zx14|Ln0q#djH(-rB3j7*kY3}gKJaQ?WtO;vFp0*NhP|FmG*9Rap_l1 zWYJ%*X1O|%U5}@Y7J1I}NF(C~2NA~%iWi0HonWD12H_Oiy9DrHaWG+=jP8Mx`6{_l zn!9+OW@nY$v4@xrg&rF6%WI*+9>$e1!L(lw-mK{-ib8~TpUJVxog_f!?z$UtW1NCp z8WK*hFF&uAvRCJJibj8sCJVopSGa`iix3JErRUM_b(3*^(A!~31U4siy!J9&uzHw8 zrf>SRgU^`KZXtDoAYH5>Je-1MXi-mnISxj3Vvr80jD0fyZHa8z$m&2gEG{9h!2O^&&qkjg00AQ?52cFOT7F#4TjXVorzA zSOo$4w^|UK!G=VT7Bm9?0IZ1JT#2qsc9Jejl<{~?rK0hahfg%qv>l?ZnfLDGc$W`L z5;SZc3}ef!jD`m@IbY81+3zKgT8&y#6)Yk>cz&qgh?O{g$(qIoT`!aycbJ|6Uzp9t zb<$o0+(nqfHook7A8Dq1Sa3*(8U@)^4iB%!i%#9MTNEcr04Np4O@W=x{x-*XH)RH|T6H2DTeAh0e zPi@XeT1@8?@J-Bi1GRfOj??((eEWT%zCs*&V)0}W&^rei5D$*7mFh-~DwU%=$Ng8n zl!Pg^cXmEIFpwf@M+X0JE?7n{Pp0>9Xm};yzxF85icCDahL?F2&gSq$6vo3^?!8vr z+@V~T(qbG2BL&L;;0N+~)gpB-a&)@#Urw zzfY^MpycIZLsbqR-f!NGrXkPqY)q)YBcO3wx(OlhJSamuue2%fFDnQ-npcf)Ird^ja&A3W>RL1M!3Pc@k3gnb?%^Q53oR4r3D3r zS`1T*7Iw}t+V~d0jm;8eS-|VW>7*&wQGOKHEX%NGL++IRXRCA|(w~y3&C6OX?6@a1 zU!XAdKG`x*H{Hh~$tKKa&$p3Fi)C~wgeyfbJ5ipmUXYs;T%MEV?~V2Lb$R@J+ZEh-ZMO* z)TleYS6ycBLg}h#piTvCJOn@*%7ofh`0U=ne8p{&g>85ZS~2R? zH`EhJtqCluEhQ1020c#1_9==P+n$(j5te*uM{x#Eue8pcP15FSvTuDXwJ!+DK4?#8 zBCeqx=Nc?400*(o6n@2VC5?o%Vb%zh7 zwQNKKAnrufa1Vs>Pv^I#5`rw8ZWx>+hIn=fo6awK`WgDk|>(sVR5aWF@5()yHL)oDX!;US;Efi=X3i^iieaZ}o-`K0+e`(DZzJ6jL&VdQ_{X z$2&;!_S><_HAz*L8(n)Yb+@K<(DRfVS*@$&9Wi0?4rl$~4SpS8V4O}RM+V18z+>se zGEN=(gjNoQ6{W@NjMzR_nYI4&mb06YR8%e;JxJo}W4KT_pyY5>I$WW|6v0zeEgFq* z<5qci{B_+eS@j&1XY(*T;eA_Ge1@7-7iwx3q56u@U2MxrxV)*UuIM&N;h-Q#XqH2B zcgOrM!rn1RmMBcuZQHhO+qUiAZQHhO+qP}nwr%X*r)SQ&aqpdonG=yeR;`#|KW1nrGow%p}0&>ZSJ7145>%F_w2RQka)6d z->=aK(x^li#iQqzA7_Be;9Skp%0>AxxVsAZmBgPGNx}9YV!JVp2Nh{4^p3x(>af?K7DOO7}MF z>B-ru3oZV>)BjxjG>9rRGJF4du^j;f&_nd9}H+VO$MSp@5u zo*FNz$(Qp`(4wRAB7C81BM|{U!cHwI`lri#;=GSK6(&U|UaCuKbEqgT)YslTL9FIA zJ6&xL7nCnprU=6C!4d^YOFih^Y@JlMr|bdnFaH0(6bZ(Ss}leY0FXiSKb0cgjLrV% zQsj!3jZ@KY7V(zqUzl92rM%Gh zTU4DF7y^Vs%~6{5`=5vlkIpjv+zZT)^ZcWL06q{O*O!3?Iyzns%$Q!_wX8=1S&dufoB5_a$NQ zp43UK-vbFvGa>66Y0L;A<9*cJmRN1zw>Q?iR&bDQ>1qEW(V&kqgVWX03OBhRo4y_co3Ac| z&J1xjVNcaxL(kXg+Oe_za_?_cfKD6i$(;L;&7A4|_^vTAa;HT7s6}L>AAZ0nL+J zZp5A}B8|>kOSK{q1iBx0ZD4F$IcuE=&#=WVC+=^u8dhSGW&5qWN14v&JEk_;9MK1^ z&}^~T3&uvsH6C+g#}pb`7%wHwPRd3||_o2%o9aHcGGk@E+Cu-D%2ZzZy(?%DRu z1nTsP-l$XllfWV5tI-@slV=QUUPC~P8M~IOQsPT2A7(bi5o!eBoiGCAL8Fmw~V{S)0}@V{M*})bOE6K%TrhY6x9MRe7ATYl(90=MD7n>YD$1g?nDIVs|j^$ zr?5JYeFF$xB-D)zW(LhphteRm*Zl}r!nS0``5X0}%2WOE0Mg9>*<0>$P-<`N;pU9$nyvaDHxH=8b zQpw*7m(Ba&f{CFh%A%w3HJbhC*&#WUeXq*P6cbrv zF`lZs?}>$9i4ke`|l1r#zV_e>{yf6KY=OY7bN_^JjC6-T*H z6$xUZle@}+)9pIgF{o-Az!s&ui3ioKn`3wWc5RGmQ6=1@5ZFy zJxclBlD)fZjN#o=5wB7Hy!tl_$8g}4b8)Q#Mpi!b$2rv9k&vzoC6Jn6zosCDQRURjuNe}|w@&Ud&2DTEa zhjGh+YgGy+kYzmyl@!RLy%b$!AbnQx z-T&62I3yC+=B_$i*5mJ6_gpQ6CLXCvu1lzde&hZbOx!KZQL-=K7QmtaQhu7IgepF{ z&-YUp(Rw~r$~J?&Y@EshJl*cSXzjH$x=mL#qM{|J3jKa+k3UThq4$#>CioD$9aMrv zokWgOB+kHF&$dGN_=KNa!qqaI#x82qg^u^GQ+cYAYRf;~trQ_EP|=)IgTV}Mcwux?tTU_k?$gFQA6GlH#!_BatEne2L(|;=d zYu?64bsTyH769N&=YLw&oh@ws=T-ei=YQ)MxmL^QS@ zHGjzm2L|P>*$}EU!iibWnYVWQaFRXBjmF%uT^xp4EhPu`rtj1C9L3&`I`#tzjxdpY zpB$^R^fK{UHTnY#;Iqqb)@!+;y>0fTfZ>^ZK94w_u~tL#oehM&T=#LWJ0#Awda?;Z zdLe7M@E29Uz$MU+ju%|Y)Xv?Y>8&n7!@AVXkn;Qxg3y5}yuyd8d-9uh^5w?3?si{* zt>%4}3t+AcFFB+pNKWi^IRK{=8;ftf9L(GRQ!a$vtpm$o2<}h!tB*G6b!f`gnB7Fx zuHFUq=yJbChBY`}GARipst0W`NJ`Jw(sF|=ern|(KoT~36^s~FVcblEbKa*Q9<_s^ zkWw9gQvrGWp^uW)l(0ys&-#Ce#x@52)`@JNUcbD(Il&GV8K3-E*!TPl^l{~d3t$_G zOn77Er7#Ayxf8}7X|Cnb^=_|0#BV&KC#c2tJF`Q$Hb4=H4niV^7}ZW|k^U_M)AyqeT4?mVeX zK9`Tv18(!rW$k>4o~;kzoIcJdyl-sb=*!$jZhuygxc6EZwp}Zc+zpM;R-U#pcCC$- zn9iRbigo0J^|#Vg=vg|JeH`)LCr~4`cNdGf>kl>>Cmcw2GebLC;*$u)yBuUNhWfxc zlJupozI(j!p^5V$1E%;G{zQzOPOFy98k!V7Bt=ONsuEtsuyaR5Mx`D^1s7Ig(bdkY zm)(~~l|=uwEg*Wy{;M`UJ?Wl*y?ePBm6%q7?Je3Kw#iUI`5E@gUP87?xmhHKWG5Xi zQQM7LOtyBvFKW_auGsYuwcQHjQuwIil^H8@=t3E>qh*}7IUVCz_G$DQ`8c*Y)Z&bp zCysXTJkQTzJ)PpTaM%tb|0`8W9dB=0?dmZPM9YXHwZH{~*Vg7JAn>~c;IpS$`=DoJ z4vi_1#Y@_kK0IC4j(461wPFO`>m{0i9o?ND8lHSe(7wGiKxk64l^6%+CfT=FXOnG} zV4qS=FD3EWaoJCOHXg#2sR8vSa((H+HaA4Cdyp4kUZjXac7~vIuwehBl6hMSC}^vH z7+8l>|0#SoXhX+bqR(ZP-uQ;#&jcCPWzyskFNw?J`v8;A1K@Zf_VxrfGh5Gh@%GF6 z+2!LCtF(Iu?^mEBe>~p_ujCfH!jmOiulx(-9?!uiDunh|`#$;+Kf^g|O1Op6JFr-cNGQA(U@+iivyAF@+ zURv;5iUaof-)q^39qTeXIN8wx+8*DePP<=V&wUQ)+>Txeon`QkC01%DrKVd4;Dm91 z;j#pJ0aZS&`f!|W&V8m9_ld8ub#Sba_L7x`79V0jv_wVRVs5(i@#tbv2L_ye2o8*L z$JOg5A?_{`>-<6v$K^EJ{T8^StI?RO*dayT;ZwEfd>l_oO^cXmzSKaA zK->pnE2QO;bj&>9$7v#_nX^=F7#(MvAU7ULv*S&_cpI7WR zOLDS{>ETQ{UcXbCT6Z>}fyG>|U++vrQZU8z0>oq)vBR|#kRdlV1U`Xg!Hz`9L#u5& zsjgN*J-^I8O_*^71-?}a9dF;sN` z$AWQ6)2_xeeZMbp?3JN0-N@VM`P*Ax?>sB6MBxZt+U%67SE8I_mJwQJ(t&$WxQmEF zOY;_d>``)ki|l&YC*#7C{8biRss)R7s~ppHb{U*98LRnarzm8Pq`Bw@(je)cI*R&{lzx5J%FXB6%G1NhAU`#6vrwmk_FxIfx?aaCZ#~y$ci=9WQ}J*j{dTc zM(cS8XZNGY0#RA@)x*l?r_QT$4`|{D!dmV(GSEd?;d%$x6Bt;#JV!}oGdFlbGh=vh zC_!SSpvrT;b%hrUU;tRK7~*M2NEfT zrR|r^wr|tJXDaCAX9JZyvQ_ND+Y6AoXa!Y32w`PHf8qQvrV4bAtz*Tx3QNN>VyCB& zrq!uSLbcYR5QY^+1A+Gl(i+si252KL9dbmpP`^cuY^WxY+O9_n*5GZ8!j4O0+pRK8 zcwW)uN~;+Q&0-Plg2s!-t%EWZ$`}_>wW?Ll5e))8h7}EZRfhB0!Mc3!oKChqH3<%z zbg;m7;%aH2I_cCmMK0x%smwB1WLCbVU*wEUtL2LLmir|iZcD2dZ>t|9NJ<%@?TArN zNG&g~+S*77e(mh)WY%6SN7QKTLnPmtX-t3zUfDel9bJUo&4I_dT0OQZCl@Go`?6$| zl1<}y)tOhf5=%>Jb7{|p6n0qOg3?zQ?Ul93vMKdkwBi*Fud=oaWswv%W=nJI(sudD zN(q@5?TAIrZ){U(q0&z=>nDU4zVG3QI_Fz?)3}ejBC>68N9e?qY+GIx{W?4MY-k#C z-HZkB-gR(iLVOeC1p+Z=oBN@ZWNTPwy$vB)O{q@K>RzhbE`lC>n7cn=dzXmP!>jgc z=a14T9HC3F_4!Mplv(=Y`n5lz7N0V!v+X&ZLI_I6=_f>eN85HjEAPn$;7AK?U-8G0 z-PCASBP7{Wt0`v)UW|J@sDSe@*=EWle>5*wY_+wsR1>};E#1{3rQD}Pf4Dfbp+|i% zGIldg)gWdw3-GtMJtEm|fXaDj8N;-K+f$EfxOmdUn5w}X1CxkXvFl;$l)G>eS1!Vb zILR&zM3VUoid{H9zh``8O#-|UXOG^AQ2cv2Skm%gl@-|oZVD!Q2>eW)lLP|i+oeq^ zlZyu3<{jS=_HNn6m!cq%rR3j>FFXfd+c1Z-J7V)yvCkCTTfC!qtevm{cOT~rplE)O zO^!gQB0@gp7>vh^a?0=pBb%Px-MALSf{*D|Qvdhi-1HBI2L%MDHuS=Rzg6RnE&~Fl zTVnu#y2{pYfNZN!`qr)RxS%D6x380hgp3ZdH0DxY3-tsyP|%BUA)pq18u6Kif}8wk zFib@?=8A=YFhFp?YR5CMKg1>dP*uLD>KCuk5HnUrUs|b0U}&k6Mg`+BNjg0}u-_M4 zrtT#ENlY$I(ZwvpmRW0@Tl0u$EA)@R?gAD*ATok{_?()?$?sq`2p?)HH&NxYvm(Mt zdTr>hs1$vROVfxQBqV!JLSE?0RRZS|lP$b|aq`I*+cucRuQeUn$zkTl7TS36 z(e&QW>0-D}6s1RoS$U|M>D_K$PM#n$D!Dr{L?WnfDJ*5_lrYgN_|TQbkrynpenwu; zL~u8MqmrwNNjeA{0;ssEl!i&?i`J!hn{8sXrBa3f;-QvAbQcjJN8lM<$mmpDDfN~8 zMQ}=_f?+)p(tCT}sXU|SLn88^2z*~lUnPp6$R!f5I+J6Uwk+u*?Sb+^?`JmW3bZu< zPaxC)($8vVz#vJu!N|);{|-pd<$RCLAMd{)6O5K)V4qV6wy7e5u(%iFhohL^nLS@I zqJ+Fr!gflf8%1TAN%)A%NlE8de*Y#Nd@K2s(D)nQu{JH z;vUSne;y#yokOU=%t{>I<@~@queW75!+*7+dY^RDSJ60#JQ_f4#rDgT*~3Vs@UNSyjo>SoT;SJoYpP_t2U zfb6*(s_ifVmoU-_q^`< z5v;+6Y?V+fz)q(*&-6~Gid_gh_LF`voy{K4Glvr3FIQC2dG;btw>We{o{X{Uiay|s zb?4^j_UW`j48Z3IkJa&QQ~FG+&bLmo5jOceBHI+YKMgLx%(G^wGQlNL>IUG0%z&^3 zk%-P*)BHQOZiYYu>bPi6N=I^D4*0fj%flQ!M!18!KG-(x6SH^xB30ruA3pTib$ME^5uE=8q%)@f-d61mEGKfER5WwpJd0t(qLKB_(cVmN^VD0-grR* zjSD58m z7ocnGC*EYkD?Fi35RFpb-JaiZ_R;Ri28~A346s4>)a)cr5RV-Da-T}@*FH!}tA7~W zM$J!)MC^Z>r=a5OqCbtAixG|L2b|Mm-`{%PP3aahY|njgRQF!}Bw9E4NW7y^-@Th) zsM$27?oIPh*w(Qfh~ z*$6)=Y?Y~QtyHd+YjxY;UA$P#Tv^V{7MPZKWalhp<{%%ndQoiJ;F-TQo40Yz?-rQW zb(r2Yo5ooQVbNr#A5Sx3*D{4?!v?JSQ$t)iqB-Za#h?|IGsRUUP>bPNY!;Zw?Y2fZjbEt2psb_xu#3i4nmgAEcS@yLfe2Am26@1)k=KX!q;Uvm`(4?n&r zPNXr=tQU|c#p7rnE;8ncOcqa-gQI&W$Bd&oNuVXd(K)m*a;UpkKqKK0Y$v1K%SkH6Hcd? zZ%_@{qc-<{7}i=q;}&JR$Wzt5(?esm29zuzsAK$&XXSXw=j zKB*#5riLJiR+qBZ*WEoS^bS0MM^xpJ@K82V7$k3U6e8gN`E4r>_BRcjXKXQGh$ett z1fVrgXy$b{0MBZf^D$+`xrsgu*Y=NaqYf$8;$z%rb-gf{LuKKOM&t2E>w$Adq75Ht zLfsOZFdWt}8CFU$1xWDaRT4pIpwZ4NhJnG;+>@il6CTG$k-^LG#ZMd_$ znS~zl!!%}TV*2D2>3{wp#|^``HVeNZ$}PunkMoa}oX!vReHeMp_KoGbi}F9-shVOx z>*sPiO*gv#SKTbY>&Eo)FW1$@9RL99ztzp!{NMN~xK_VZ*T*N+bHDu?pbp~(n;dJm zEvI>49L?B}rz@HbvA3v#b!VDtV$8&CYrCzl-#yE?p)e7tLgTTDq-)WBTk9m|Z1k|9 z0|lQa;envo7-ZvTaQv`UlPy8BmQDI`*UnuUn0u(XLx%ev&EQCZUr7OAOE;<*?;BXr zaYa#I-Va|-Mo+F_*eIDE7-3=_*Cm$hvPPZy?sQB~zc`$$UB1&&45J{X7-M6hdC=K> z$Lmwp(wiNHp$p5XAqYZQofQgzc+1(UM?KZxEf#G8?z-asw7RZc?H3 zGhbmTD@l(Zh>lvE4`C1zlUM6U9pb^ZrL#iQf{jil+mU}Xo4;N#nt*{b#+L9D7@F3Q zFSFYCCS}h;a<1*!{Z3HP#V9sje%It<`-c0o)--MXY5z>iQ5K#(MITx z6c~Q+F8Mve!x?Mt(Fh+)|2~pf;LOv5o{R~@Zu@Z1EqMvdsJ!iYhkBKd@!aw|?^&yr z%$Mv??j{G=nC4fHT2;AMGhtsCBIyBIqq=7@6D`th(^RG*3=SrDvD{|Oz<-?Ns8ehN^NOjw08B~+Q~q-gTm%1c(JWm5{cJViML zT&}a{^x&y5ISroXDfv#O{1`3L*3eqar6tX-Qo&#~NZ0fo31c@%If7L(Z(TB0Wy5;; zs-ZKPQwEE(nMS3mp|+-4+@#2WS|;n)BIoQkNV39KKs%NvWCa$;+FFL}!LM!nIXS1> zxA)GM8a)R>fDTddK z`vhGfDBujLjzSQY+p|<_l%a&a}|hGl6+N5W1jajh(H-FpWDhdP4-g~_~; zMO+hanhCpJJS@_-?r83h)t)iCj;DpV^+0NJ4LqR>x)1Rs$$NzA^V1ELn$}3|gR2%B z+--B%WTqDIfCdu}k}7Jm6Z{5sb9WCl0DWHI@23jMZ{81pV=~-{NG!61jv)61oEegF z>n=v=B8AuD&_wJO(~mE(>V5=M!f>353I7b*V_^kCQN|&`EsW2SH3Dyo|fja1= zG+sp`8hR-Zk;O^)^%v96v)PyU^)LQCPz`=b9Z)0yy&#-92czgNMZG4BC{jV6<|tW= z?~P^LStM%^A&b#p-KQ*7L;1^;3=~VBZimk5YXXIgigQVuiueAF9O~}}h&}@q8{4Rc zOmVwWQN)5JB@l-U9}XK7BZLQT6r0^vrLq<X~Z^H*|qGg=)RcSBs8u zT`9skWR2y$oCfJY+AQFt7|s;Jgef-w7|WprHU?q0V&KAp8862bawN2cDkIG@lqJm^ zt4g9C(x%f1&7q|WGB^p<`_>eLBcu}a&GzP-1g#~v=0bs+WxQ-zfEvWiCFTwtSHemY z>D|`zfbgwlafsYMO2DB&Um64>99l4(-EgK&kC4GgL5_D#Dkb>4`_|9{^XKn3_sREt z_Xyk5UGiKXNrocBKc?ZVyl~?6M9@vQOq1ZhRNiO5AYJXRq+opIGx_&SvB2n#0#=!s%vm)Kr4?pkTSHL{LPfRr4lTjZ z#hix1?^2Vp3mr7iATrmpSht`#RW!>97G_sH^hIw|xr9ZP$Z~}KJ-!f0)E& zlB+NG6zKE!JM-j-%p?Y*Q!$#VVJ)Ek$t< z@Ne+N2V^)S9)3xL?*#8(WnMHb4&5A54moZwSsqeGC5A%a0mT5p7%x<;I^fcMWVbGWIxDzlI&aQ4Op?cOGE$8=L=w?*BW~17p}&1t8M` zPCth=NJMJMVIlw87%;ZuPTyXEBl|zYYXk5>D6A^gKaiuYuJh;4&8Z3vXyrN7-=l3! z4QC^#x5?-m>rG*P5b*!50Q<@oZLqvQUH~ zntiBVZW7--jOL0@3dFZy&pxWZJs7*2!DUH(LMU2y30w>Wz@1lxnY zDVe6Y*<2t*w%-VoaV^Ej7u8E$EZtjG=_O6-DRq}{I5IJY(ANRk>|r{4zbTHn;k!7# zDUx@^RTft_DX;(HGA`z$!l5lXs!%_Q28bT5RnfA!72{#|^QUqgnCW%S)@kC3t*r+P z+e$Y9_rw@tuExjO!hJ;sgn)Cr%tt&NspMW|_%s(UyXyhQ4@v;zuD3JBA2i0-bQ#&j zKm_^2MWaA04#^?L-D^Oa!+|X>G}QT&kh#ZYHdEDYm9VFX4K&xGP~<3~7|cX&I)Gs7 zPKwRVCCG_{2hzPIv?n(d2QzRO(F`gK?kEiFfZ$IWfMk_os4#f0Q9`JgGS3Htds^kY_07lt!MKsj1Hn zom0W7567m<6xFEnw@g=EdGe`8)t=i;nJ~m%$~Tcw1=4BZ6@5Qq*tGG?4%m#%`EJ)84i;{=Js`g%f#@?Mzf$3C%NGD9$YmuVlUmx4;hx(rPOULfW2$_-`Kf8M0sDsyWSUA--JvO^8@Tk5Q^=9`An zJ-1vL&GyLM=@a_vhj`QJDA6Tv+hJOX(9y5JU9pO~yZnSCY>TS!O4VKzO`-#fH;8dE z^t!M;MZcNS{!IeM)`SgcOIbEG`QPz)s^U(>ZBg)T*p?+i1nI`epi79e#1nv}W+B^H zjzM*m0>hco_!zUWF(HoKE;S8FKrMxdOj3ieo>w)BMP*B!Bk$?JixhLgiqtP-2`Xk$ z&ZXj?(JE<)LOb^>ZJpR?s9u=lh=WpYpnwC;3XUh*c_8dp=4YOI8@~^wQ=4F#^S_O*Lt}jfVRi{03NXQFX$XD!F?w#=4kX@TE2+ z115222bQuVp|5QT{94Wg1%#&aE>Q%~9(u)(4GgbWX?Z(K*z4v)(4)GZo+IV|SUL1F zFJ(j-E8%}efCcLd0xDZcB{_}h3#P*}Ci;^np%@Q_1hRxTnUyoUkxZLHI*Csy#pQl@ zp=2GT;ptK;r9pO{U90oGHvvBfU&xE;P7C)j2A{l2Dk_%I96VnbtByYL40 zPPf27T=`qYv_-^Bpb|t`1v)bDv?0i4`Y;+Lsuz{Ew_wj;Q*$EaXKTS9xhK31=e^tt?n66yKKI4Uq>h)&(sL!v z#=J~AR>6o$sd5b(Q}#Nk2EKK8V9qJar^NJ&*dR4G|TP$VUsGVri@eh;@t z$j>WqkmpH6Fn9%VVA)6Z3qXJP#5B_HR<+w$w8ZX6wADsXKydB?yJOe{{Nc}+o~8Eb z)ga~jbPzshdY2u+Jjv{af`pNaPCx* zZElDX7ALQAiK>&WZvHGbLPDO0216cFK)q%BM@BeXrNB?XKeYH~TkcKHL}#Y09E#vl zjkD881tc~g?4#z>UX+hkDa1wj@NPYb9JPEppY#so>t*z7U~kHegp^Ji{toD2E_Q1Q zxjAe95}rJH0vwqJ9%n^58aSZ`5yY?jWf=hC5C2%jZ+ijUgF{5pnzb2-_YMc8+6D)1 zSPOGxtBZ1#0Q1(&84m9(l_h~%NTKjhno-U%*gCK&t|Zt63U*Rho4NI>r($5 zB}H4(nDq~)K+kLq7oU$_V);dpuoDC2P|Le1w#}@nGB;wC*k{ul790P}w;_M80QG^{h4 zns$d02)?-zAMm7NTBL}=1R2EA$q6`HAkqeAHp~?AeZ#9c0S z895i=C~j*HD+{V7XZHp}fxIsGDp!w_Y;>J;IILND0}fwl4-iBCzxbsYpo0b#5yJLt*$53IO7RSb#J~g+%(sa4kBfR2 zM~Z}&1ME2DLvz;5!~k+V8dIflp-yf@$Y{t7npoSAIb;JtfQ#UuU3P+q(F@!t&giCj z;@RSW!d-X7_F9QW3SaZ3J@erOM9c@1k?^9Ajj_srnnUZX2Y$eYt(AktRoortfd;Ny zg$5T4SJ)QlP+;7t(5Qd{%F@aplh;}S#!om3x<`#Ym>C9o0bGvSl{K5NVOZF%+CMzlL(6|1gx7Q1M&^Sp^h%FAcDMdJ6wXyc=*f|7?{~ z8Fr=hIk&d6)dZ^&SWf-orN3E+W38a-jpZD3(nCIt2=xhyWk~FjYl3O|8!&}PW@+Ic zR{sAXFQIoPY5Q-|ML;#g1GJ=N*n}KS^l5oUahx-_sm0n{&?8m-hofAuHCB%4I5#5yTq98D<#@~N`QUc;c9!rEs)wM6 z`sH9H%D5N3gQt9^YP7huH_JU^Tl6Nap}hnvfp5BfZmbSaa8nvdF%#mWs#@!PJm)?* zC@h84#1N{D2JMh|6sM6Yh~?ZcVk+nMOXSTG0KZ5ir;0gbXR zx(J0^lr9|uZLkmF6O~>blPz_vWL9fCb=Idw#Ou}_MsSeQT5!}*cBk7+!Ag=?Y6zWr zm*^n{EPk3@x3OogW=7jv8%*~|jA9XXr!58>C=LXAc<(&TLu`%%N!EQj(8N*s@TepF z;;?}x{*kH*1!AMP;d8pNnMd*$#&pp?x%fEo*nj$qWLgPo(`5o^OSqTD+blZ!yOV?O z47Oh$l(5L#mpofPQQxxwQE`=@wVeMdpXO@lS~LD5%?trPX^_B4Oyu+sYoT$8Jdth)n)7(Ux@k|o2pQhoUW@%C zZaRB9oDntmus=$JL}*GzO14$&U6k1saZeTw9yV!c>~nZ7f^5UaXobXRzqu>zm4krq1;XTi*>v3SPSdmmM7W1>e~<2 zuy9v!`ZD^*tgz)2#{~&b>f6>CpqIY`&Tn@_I3~#>sFUQq<2&l}3|gr;+>gg@t8>yk zyEducRKe+5znxIc2hjTvkWW)^Z?#^Gkaqz6CFSkG6onck&MjU?*i9zR^)ZC|Py8cR z_5h@ga!yLMzlA!{MWX>v^q;(OtvqRG`NKT;%<=Zh2Bb($J_99$(d-Gd`(i*P(AA~K zU@455@^%)|0;ed)wpvD=BeMKNRJvO`W_UIzAzHI~ShbJJIeV=z7E?neu_z$C-Ta{Q z(y1WI*$0mV&&8iOENRSxf9(iq1{bCD)J{(FrzGT8Byl6QFE2&=SCaW15lT;m7#tt8 z5$3bhwlJhem7MZgMq&@ipv7npr|<&u(Atyb<0PK5l-EK(P1h3(N^-}oG%sj^pMGW~ zHOh&KnT;0p)bf$*u=jkC_oWyOgc%O<(V%bavvka8MPi(ZQT8VHlRe7>QEk)m$un;^ z+{;r3z6;}5HJ^x}r|AI6f8+!riUbSFt5s{}@W*x!fYyP{81eqBU_)E*7D5t<1wm$t zU82{yf5B3~eASdTo#>E3iyGbzEN;BGsN+;~+U6bq)hO*c{=8pNu%U4DbZSXVTC@n6 z+nsJ>Yf$+Jm47|P z7$a`u6|EZp&XTlceci0Bz{1817;wKD%Nwd=Vt3|wUR+*QT5h7#JJP8n&BgQdewACb z`5?1iy|6J&7Z`ov=^1c8^R6`jC$GJHG@+ND(J)|XN=Lu1{Q6RR<*F-uY=xmMaA$e( zOX}#bCZQ64-EcdSG)N0|7rTD=T(1EPELPwt~qDL>FC)H8AM*RMGF;84K z{=i#qYAC@)Sx)2v%=^|SUi#UTaPch~`S!61#p4wBrUykQMl9N0Y|k*WkjwDB{vEx@ z!MXoxpz|Vr&EyaZh{5Kgb9C&W)*^F}!TdmDruw38otEXq$e2gDAA*aj&%Y66pJL2% z_SJ=(o>B>7P0^!;ed5ICf&h}FXUx7e6dUKLW3M3`c-0*Ne3mBo^v86*d9mUz1*Vn< zh>Odb;-#+O{8C}J6FoNAMTpQ)y^8GW z*rh;uI(_>u)<4z*%rT^1Q>22(!P5hm(#EFnAl;v9xtmDOq;s@uBhbe4s+oeO)+QDSqTd9{ z6Iy%dQ*PDrQNm=BV2pZ!h9z*k>Ga%2;^A0%|GYK#(tf4r@X1&Ve%GSF^%?;*5LZgb zO7*8)hH~D^r0h74;|*xDehhKpMCg}C;7ASrS1`Qpr|`0_+E%Reh=9eQp~LHzOUaKdB1&XkR?IRI@l3d z>DJDAgvR4<$QQRexMZK%OL#34!OeaZu>`#wUAvnS3(@T>Z%La%1*GQNa6nXST8gC& z@@T?St-OAh?eGbt`3502W~ciWwXoGRc?!i;PTLxB$&Hex%|dGZ1kY=1nAYC8R+J7- zL2OrrDdK5P`L?J=h*E03ikrFET5uT+{m>swPI#+)(yaffK6}mZt|Y*vAYYjIkT+de z&Sj?ZOi(nRT#gx^N8cs>kS=}M)|Mem56p^FGoLHl6*hhVIbPWcs3^*U*{y23{~P4U zjp-hT%pBSQHiT9_ofGE4%JjF!_!Gn|2u=vG#htc#NWm|{v6z%*of4?Ax@gbNfb{0& z*otKPA9bE%Fn5K#!Asc_w{U}E${#ECNLVSv9uHwpcI1{(<1EyP$(}3SayDfZ`U101 z>nfrRH9K|-ZOYCYSqu8AgcL9C#2%RhpB~BAO0135TH`t;;}Y4%8!6+6dhSGp%E2y!AK9@o8Z=bjzGZ`z5?H+0CRN?7-o=-P8bkau*?LNZRcFsS;um*kTc~@+46sl%iY& zRRy&n%Fkg#GPpYbB@%hrqCqxlE`4zqZs*1$CoRF5O zTe5@w`;>{d+T)_}HZ|0#kGtCAqwzNDyTdH4w3ve};-KDpdVd8bnqk7&g(*LC5drtm z+`i(qs_t{wJ@1YM80*xi9dzd1QE?K zXZ4gM)A)`QXWl?(e(EKi{?tz-GQh80n6Bty^H-}o=P{ygclSaJXNH_EdM6gmd^b)^ zc~9P)yN%;`crWPEtuZ%DrKBuz=UQ)s$qD8XLl`?|Ka?-{F?Ft8S}dhjx@Y%g0vxs# zI(i;zP4L!#!pYk2mpU16(Hg6eR#3zmbOXkei16*s=h##4UI<)6cLj(CoImG8-oP<; z#3?JrMyEF2Ju>JOtb|bo=K56h+g44=O@8!7qL{JVMe)!xPKpZyWbZ2O zFGD=slYdg&|INJQx7s#yGCvH0R&6b>J^&Xh(O;N8<)HVcIg`G!nH`0aR49M5(h-bc z{6>Q97F3mhA_32}8XkedY9*@egp%BTbhq*2?6Wm#OPzwS%>1oJ(;q&8rPGdxH09ro zRSKoR2Ff22K`U8zyCcT)a{eBXVPUQ^UG}fJJ|1W8e9rz1vnI}zqLA&Ruc?S&Zfct- zJbPv!%pXsboF_{xP^1+;JS%n6B@}AXi9TJFycdZ?s&$~$EJ-EMi~p@sA(}AhAW4(w z$9t)}lR9pvN;|qVix;L#DAJ`9|B^f=(18x5Fr#k^U!X)Ua?)ay(`HIUUw;&A{Juua z1>-@KwzKZFHGiqnfe6l_C$C*r!ABi%@U@WH9! zMO)7E$i zwD*S4m4XWT?i;pVLz8y)h4VX$l6_|vzB9>W)>}vDdUc&(PWGC;p*h>_U^1o>tBfC$ zJ#}h*>`R`QahCmXV>}n!8rLXij>N+?+}0@jP|U8+U=u}i%{q`f*ZH88DaEeLWw-_2 zQ2X8`^T5VNbx4t7CK$EswYugoC(qZ)_q0~R=3#X`qFuyf7X$2WbvvTn^m~K(9o>v* zS25Yu0K0c>N3~5&cI)ExZ>{Kc>#CmKR07$Rhj+Z{O}9`puki^uxpAT~LXfi7U^P7G$hSV20(A`75qutJ=Z@mb3>_;b6N z#8~`9j{Axl%i|`1UUc#^n}>15l2iUYo0%v~r||?vRO)GG$h8d##u8TyA--D~h?yK+ zN@k(@DkCBNImz|yD684|QMvcwUIWXH}5_gUC0WDjNnL|hHrr0uLL3&<#592GzJe;bYh8n~0$G{Aa zu6)&uHhRm(iQzib{v(NMJj7%>)z?7dZRB+ZtkD`sYvN=zkYW@ct)W@d&GtHjLA3?*j96f-5xvrdhKM|j?9NJk9cqoci*x0`fQ-Y0guLo`lG{ik}44I&~ot^+IsV*;W{8` zr*l*pM8`|KUa!6Swf#iffn8Bhruq};Zw0;DZ)^w!g+ghGIT+odsSYX}WByqqf;u6Q zXL2Krq<2&6i@U_=Ub$#`O%7D8nVsBZ9B{;br=`(4@03Tt+K^Po6`~$+q)M3FZ(wJ! zGaO$w=l(XmKJ9?X)Q!bzaBni|>I#{&zH4>Pv!P}Umj+3iX$hv0&Zzvoecd%wGP=21 zqux1S&vZh45o$@ZAB}A%$1FQ}YL2w^LneI+>;j+qaH=ZSmm1_5%lf;4gBP`hDtt+8 z@L7b?v_kxjpSlK}?zA4ReQLdIc2oLQ9u*l@ z1S&T9npLQ{6b-s%gb1Ch#-g~VH#HhUgM~V>!=%0^ghZfI&{Q1uV=KrTOi_Y22j{ZNi z#J@)(q~pdTq+LB=fq=ozK!Je3&c6@;r$L2McU{F12oTUA?0;t+{~ryS+POGcnmYgA zG|JT}{BiqYa6{fd^oQ8Su${~{ieVMvTCGzj-gxZp9v?rty1Tpe*Xvr(4Q*zOw_du>*Vo@YE!g$9 zXZ$bdYPsI>7i^yVx= zf}TYQZNm}OrG{GG%d}#FRMkPl*b|_aBR9T|02pa=ny^(srSi-w%7d2J@2od!-HC(E zFQU#(I_WWph-aXD)w$$&mBPnCsF3ueDxt9Q9p@#zI9Dnh!?Aj{X=8;aU7GLIVbO(G z_;>?^7D^uEDhGaQ;-Lk+@f8C~lodhq+s9S#Wcj*=XfDb?(uHpA-CoHMUAd_lQw#zI zRGBCihL>cKDLf0xUTOL2ZH?qZemxpQl>i+`b-O9-)c{a~93VpEAkeL7C``K?1spz) zHTjLwyHJ37Xo(=GS#=h~S1a7F(o2&T>;k{&)kySOS5%$`C0IbxwA7H?9BE-T6H30c0*bv|HWf!FVTz{q&w#CsW@J3ofBkVwrqE<|D97sXnm zrjVCn4U=7#L46k|QM0vky(NNGoDyGav1{BN@<-@#gYNMmmqHx|jF(dfMxBVV3nm7d zfHQAZB81{Iw#wa26WY{Zf8FQ~OzSRBwX+k&tr3vk2=DvEKC|%pt&90M?|{M`l53oD zbj^1%Fb0LJDlwlF`l|C0^Pkc4zlNjRe;JNH{`=wR;AHRc)5y@-^nVS^e?iI)=yi21+2>;Jduf9MfTF5fAdf1U;Zakc;3 zgJ4P9R(^dPcRkE)Z3713mZzhvQyXDw`2XEclVQl-D3NoD{=tb5a7%@K|F{* z>=6RRua8p@P2JGJIozi4df|V!H?LC-c~%JGL)hX*1fgEekvhC!n^tZ1;5SxaeH_xb z$#zq4nVY@^pJ|FL=E5j;@6CdCUwrxn#O3XW_4jV8m{!ahb5DK7cL7EiTjPakkSjhXg&`C35HDx_NK+jr-zw zS6lTT9NAB`558c3t#C5$Y%tjr9tUjNbL+EA1kjt8_(7DwU;Y6v#Wa&XKZUsW&aTZ% z*TrRlbbZa8N?GLw|LAvn)g5TqjXupvknNt~o+PMnXC1kC>SdB+jc(lom5pB1#_TXI zM7pm|F}x8s)W^)?TUj#)#cQ;-2{yZ{5(0e`9a$|hVRfyvcY)iif8|wf?c-bE!asSy z=V08KJZZ`^wxYlf&Rq1;&o|Yg?2ep4$sHwjJN?M9efJH_$<%_>(o*MU4MDwcaz-nv zj|c81*=Ui;)UnY1phLvda!|-#w+{9V6qGhDd(h(UCu^&NKe74=D);B8AQY!xj8lU+ zgjbx|TMQPz0S*r3bD)I)A*z22QuEirW8?A2^g6r!_JvKrDI&SE(b94feZvc({7NwY z;UME@;|31=Q5Wl%50n@ZQN3^)!~kc*=AAJ{>;`Z!qjR`KayX>KjCgdm!H!(7H$o3e z^l`qsaFV7EyRk5vSJYUdXw%Wl1?LEdt7D5lP8wM>`#*Znq|%TE6UFHTmf{g$(TBN~ zvAuU7&SNY&hl18eD-ZX5xuYt-5Z+G09oT7}u5;fQyGFi6AYtf7o-vu3<*pO)Y zSm3*hF_NqI=64+W()S>_H_+|`$KDMH(L;B$Gp?j@17~|@bY}F7vUC!St@fW!kMKZS z`tV`K*Isb47I=yamucg_aWI4T$uHQ>7AJ=UrFy*GNv}dzFd}bKa_{xi+BB0|_)4nURXm*73B-b*JGXm6BL5 zc>1mOt>>*_9!@^KGJA#oUhYv>*0sfEdEKt>86Kb>W7MF)_iJzKI;Nn5IzH+BjW?o{ znU8;eoBY5qSpgq?mahz;&;Yl!Mm;ycdutk<{s)t0u2Exf&xW1XcqJN~LvHg&=WsRM z^2Q99{`^fBW{?}I$3Rvp>o*n6O1r0Raaw-5U3p_+?T{?W4u^M*7bON`qDe*@rW)gC z=8%h3LC8dk!HqLIbOK5~CBkuVT8oN`b~Kb_&_FFz)8J|b9)Y_|O=FOQQ_PS*WwUFQ z_TR$QXTMnvkd;*ipS6@;+Y>_pkV$>V&x4m)rz#eqdzpOM>PSIDZuRB4##YG55u%No zgLoYN49d6Dg{@DcX6~af>g-L#XxEZJ!Z=ka$Y@tP>^C+S^Z{vV$qoH~9d;~u!`gdE- zC=pqphaNDQTCo1ON^!nTT(Bn=Rf82US=;pD-7%xGWjSZxZ{je~(Ygwi5)r^f(ZLLk zAIsg4A5+xWV5Np`21ri|@Y*1J>63Cm^u`Qu=Qwb6p{6bw^nurdv_x-qc`+#3G*xQ6 z5*MvBXmyBrUxeF?SHHMYmR55(25P=?LF^-vdx%;n&l>0jvej=90MjQA)7?bAmhGX7 zm;9lNRJ%OcRXjBX9<{9^L?2Qssvs1FnSA4)TW>PlmbG`VVEZs8Pn2pMZI%$>H1PMo z8E%3`oay0JO1~7Z(F^Tc$louhdBJ>4rDahx)=(k^Y|Q9v4y4&$+g!7f71FGIU{#V_ z$GuvtcKj^ubIr39@^2-{wk@FGlSitZ$!DY~nuQAMXLQ@4K)#@{u?{tZ*%Odtud6`Z^`?j1qoy21(v%=-ibWMlSZ*^oRQx}&FDzy`@ow%-ZQOM_&&?bpk@iw0B zz`ovxaHQxr&4521^{)*6(v+@>6kiG*JuG2>U!z)9S9Q2-nswt&<#z^3e}S&)x%;a7 z7t`H&{Y=4~`A%5ZLd*s>LoNt>r7!>{nax`&BJ%S@)}O*;YBQ7XluvgSm~jEOaZ*Ow zK1ghzioZ4gqMec9srhN;hp5i%E}_=>Ij6zydcZBep=TKa&%RZHueLN@MdFSe z_gxy3>njD*xc{}~1FexNemq85UAL!{v`WkL0q?kRoG(N(FH%8C-^~ofOskc_LkL!?ceMBJ+ z80WgjU=MDh!ize<|1)|Huml;aFU~(QHSVi4I*UMkY0-h3XQ3*q;xUvt&Jih>gQ}t5 zxfZ&*lV!V$RN$os{`DgwepKqC@t&p_sflS$98&66E;yX;&Q6a4Kre(~?R9HeLv_!kX`cH^o zE2$~2JNVLI)f_g2qu?^n(794%zunyX!GDc4Sfc3P1wjApN1BHYW;O;RCMad5H)NP5 z&Q*(ItMIxNJbGx8*gr51&zXxUByrk*(ze6)^c@H0vo&J zI)kPi-k6jB*z1sIz3RZl#4@DfS~vO0NjcmLJT%0*%q`43sjMI#YYp$R-sjNCJ72El z)X(7fBH#!=0jABbYV(4@&SIlg6Z0+2`SFi5=TMD<9S8s-?pYda4R_x%h-Mc7lcl)r zD{8^2vOfRTakiFXS%$#DTf7aq;Iu0ep0fqWv!|r+)vZvObe@I7E!N-FdqJfdqFQ3Y z|ENXwvZM5!O%8ObIF_5W6GkJ|mIz#%*=&Ii*Ev~R7JxutZEMpxI}c*+&r@Yok+J1> zhZc)P02N)>J@EOV)kX}c$E)HADftg!j&Mt?V88$Kv`8Uk*8J#tf)9eqwY{B<-NkiK zl9%ER8Svjx#KwTWElkAu7w2-b%7fUk{EyvrF2}$VR{#!~XVx3dSI2P>Ha+pfM6t!;LRX_4Yg!}8ERMf} zkigpM27MTViqFU-fgzDRT3~89O7-+~ZL=iTz8dwPeN%mk#kEbh;{(JEDG3vP`rgo` zwg8SCvKUk7JgJ0X7p1smT?-cK169*Q>1vxgN88$5m(eqQG5TvDE);CB!G(7D3FPUy zX3$AX{ShUa9V@=cd$DNey(}qBf}P$|9S#)q)y@5Jg^T-&SLmNucN4T@xVQu{`v=ti z!=>ZbR0Fd__MZ7HbK~=(xZDQA$c50EyUTNDgGmTrBd(Ld;}6S9aBiu@EsgCrPe%|y zMk=G^jP4U}y^jr4AtK0F<4J{q5E{$#YahL1~2YQ}Pw>O@%lFpN2htZZbj8UwA0g4>^>FO7XoifcCY{=O!(ya6OY~@iz3z@jze-WDtB2|a_qA|LbNJIyKZVP13C1^@-=@g% z*t7C+2UYJD;PtS`W@dJg2fJXFhuREn;e)+qqc{x#N+@{Bt&sK^CU(em$tOn_6x%$g zVVQzedf?3`Q*Y|P8cCpZx5r_7T~Zo0VNbcqu0%%6VA!md9>|)y2tU!Lj(zEcl9%=v z%z+zJC6g%omOy%kV|ORd(A(?z=TC^H1fg^`G+ zts8;HdEnMwAiFA1(ApO)HChb%;g25RYa$M0|I~5YOW4O>VRtw$a9OnK6aHyJtK=+D zdweast(s(lrX9#~FBVOGZU+ACCVZX9#EaUjphPkGMMQaYdp>z7ts4o4Rfy7CSh5$q ziZNszAaf>E^wQ+q2~0zeph5TQP#K|O+H!b82Oj!ou!CFv>nGwIJO99va`H)bk3BR|GKCi|C)`fwUU#gE1qv2Oc~9hBsg44_pSXAV>M+L& z1JIK}-Y4@am>uW3UhbDehktx>GfXni#0ml2FG*oQXJQ4#UiV5<86JHwOP2dXFF1m} z@Hce1V9$HW-QiNlT(JT@@cPo3f_A53u2HbO3^6iAc2TZpOpme($d}r7g$Ae%TZMsA68YA z;TYt?lb~hH$+OBFD&)i%=E5jYe>dRC@efEW++6wgOJ_C^Qlc$o;hcTx8ca0rf{6_@ z?usuNeDg<-59k&{85GE?Ry)k%$$vepV$c0%5Fsb8-?V`n2FLl?xa+{>HI)H|83toM zkN`uG>uik->2_;uga1rHY2M@<&;jX*>v!@`T7u@tM`77^8jPx zFDZ1pGz_`_g83I~ViV21#(l!v*jsW&34WU78n-X~;0<2v$p=+50s=(*;0XLm>?e(* zjt10VW_rcoO(weMGNykLf`MD94m3uN<_!SLEw%pqLI~@5d+r{pC895SR+AX!&Tnto z5E4bt?>6h;)u{+4)m(W0nw$9VUTaA*=Ne~3`QMi(qMXPh*v^@F^;oSVV2o=eG zq4rW&&r1AA4FRhIgjJ)wo3d_~e6z$SUJ}$6ES)t)eMR8Q(n-mGGo*Q|Cni2YrCA#H zQm@|_J+ha(?&AU;j|i4)h4?oV+r&bK_gJ;INSny#gECDM-NzG}2>i&LID^)$F{Mwq z>#BkNw9Rf4UJzdOtonC;O?-CxsvN2-v5vUFC8%y?z2@ccTVE)acxTO-;TX#eLJaOQ zHRuw9hITH3#2NsL(-nHmI`+q)=hr8&+edcYpty!kw=b#$_Qc?2E?|zSzx*0+&UC2fHaG^BLmsXS@eP z^-IfjlpA=F>SxE?FOn%De*@Mxx7Vg7{Cd;IaZUqp#OI{a?X0OaUA6k{iElDpivU4EuV|AU>+vR+Tb zS=u%yj36mSFzw(YP-8R9?4d%OY-^Dth``ZkT%*UtiKZwSQOSYCi%i3LY?f&#C|Pu{C{kbfse^08aGYgvl)2BP!`)<6K(Uvs z9>O|S<#C(o(me?q0!6f7i6g6itDNCKQhP0sy$baRtYyg59ZBI_DkQk8lcYEGs3~I) zd+HyB{4682TajRGORW;juBx%Jbxgi9itXi9iep+_SA*DqtGvTYF|AkkXXcZ4P3can zAa!RY9fM~UV@-AX$)Kq2;_(i5Mh;OyB%AB;b3#i)RsMRz2XA~1c{jq9Gz9S96fh`5uTb+!qEK@$Ll{nw?C>}h$Vd7~?WPg$@;{drFF=6`LvMAt8@N7X@zSrr0T|!csa!7tin04+H5C|2ZAB*;yb{Kr08x ztAE3fk0{`0ER^5k&9|CsmYP){6<10{*KV||V?!bT%qiGmF%G#U5wFOC0s(oD0vIug zgy2C`{SyUtHC`x#YM%W}%w?b2itN=Z+Z{b50rm=Ci>ldlmw<)c`zzlCZM(2OlwGB= zy>M8u^+BmBwV?=6KeXFqjo6eJ(f!4jojuls-vza>i)NeZSzx&->#aE zrY`wOV2NL*P}&8Yu-k_w_VA(lGBmPR(^x)TSbcPw)MM*@ocN*McFW?rUDx=tyZt$O zY(|8v?|yz^N~dySyK+mXRJ;)Hqu)6L1{-%`n4_ppN3gWu7S1j$l+T_;NhfPH`Z!yD z-5-xXsXo{J&+^#Ai&Q)L!5RsiO04m?`y4Swj{A(3SkmB9LN7IjB)@2X6{F-*#;>wD z>eX$jF=4A>j`@#EOus#)i#R)L$qlsEUGIKR4QUy75h<{~@l>jo0>@F=;)e75u=ti7 zxOA~fGA<9%Sh}db2{!mAFIVU--pE}1a%iR1gS|{JjZKFTQyShD-eZxFE8KCm!tMm^ zIt+@HyJiIlJ(okwzJl!saz7VdZ>N5kkPe;9$Pp5%UyA1EZMavr{HDH581`O%nVO?@ zn?|+2QCoR?An5GAIqXZ>7cp^nr>`S%--Uo)XCBNz1-KzY-+78~k&)l669OZ5bm?(e z^=sajK+0d148nqo4}Qjb8m?F9+QhS59PR}(lq>h4sahxxW2$(Z3FX)__~zRF*yOkY zL4d{AaMtgr!b;CU>daDE@e+8~FX9R-wqk z3riLRnQ23oH+nebIX>fik*$JRu52#zBZ$c(LttUj)wrq&y9S*DhR4;WbX?SJRN!ml+&V*i3ka{cNmP)xi zM>*z9*XuB=0+(uyN0?Fyv;h@6WG>&qMiEH>Rv@sMj~1GW31F|!JP z)eX@3MCzQ=0I=UG3kcmf6_JR3YDGz<@YO1WM5q|Hqm&3OQd%pb)H0natzNt#okyr> zOOS3wGo7-x;N6k5NzSopVqW&i9we;JFeqdC z%MKjmEh}}%+!W-yTuE4$<2xkJxbxeqRNE*CHYX~24xLYV^UB>hJ10(0tnC#r*85Fg zC060Dk7a4d^v0$7p>H=6PbHV?ImJvx!9uvNzCG&mw5Y&EtRLtFQ&2~?)%nH65a2@O z>;93wv;8rU9z`hVsn?TcxNx;w@`HC&MtN$j@)t=br*x_mnKrfT*zKv4DW8*hj$S6o zT#M&eEU@Ni#OV-Al<2!E*1OW@6cxpF1w*`zabMuIfPh+t7g~dNC|oQILngL6#m@uS zwDr7lZMY3qG!^Z$kvh78E}OQS6VzbX(pDoOvu^qkgUQ`$fSt*UB~}xzYE_z*aEt$A zWYd!FY}ceaKUF2LVKS-cRwDK8w*~%iDF_3R*M^3eyfh`Ns<># zEmn8MHE!ve6S(6r;n0`)^~5^K%HEv}ND%;&sKfHCMoW5R>)g<8zv*fT8yeSkar}tx zpTocDz)X<0(U#7g1Pt1NY}5Lm4hKo61O>hoZRkrQRBG_0gURC}-=&L6MtOjTIXQCj z@N$+`oQeD{?0UFBZIfFg8Fshn2Z1!m|3Ig!>#LLI6SupDu}TdhQ}^x^=hUvNIZfEc zK0u|YWUF=ej0Ah*fxkK&hz8J0`-ZJLV{@c&QsH0R`VSbS=DYLS=V&+|p>Jg^`N(PT z4(U}(HZ>*TxQiivXQ#~KxKA~ZuZ_{_95D4~NjYM>AmaGqN4wl*;bzha`eY?0a8U5n z$QeZ&)3!v^Y`65h%jSMki`Q*U2u-(dcRdz*nAx4`wHwk)4^KIIh079`TozJV(>snv z1z)zcjf!TWqInqN|1g6fX$X%69a&YcxU*E(_#yr1(xsM1i3qKzM@RRY!hUTKb~KY2 zHAG?-$w&((U1m>28Y2j8ba0VH#%8wqI1d$7l3UjHMZ}KxNMgWGH^)bQgWR#J)=4tP zwm%jnq_{`KkhNe%yC32uo$eeRcfAE5w-@qvbSY7UC?-L44}S_Tt?PmuImxssiiCvoxwk*o@;du zC%Kdbcu%o49=wVC+G~q136NYcuY|-MXer@F2i?!lw+2{ULhS@@^DS{K zz#WP#JIhqDtu6VGjI)nIme$Z`|0vF=VT+V8R;Zx`R$Glj=&BksOBeh_1YbfyKAae` zOyGATQE8umIY1Oj$cS>ViZVziwJ8x%YG$Its0d=n{oU`U2UBaeW>UZkb)d?W+{vb? zh&0hb`M{wTKmUn`<6nC^gV8PdGWwf|npL$?h(+bPRzb@$)z>CwzC(^*$==S6PH)H$ ziLpklyMF{kjarQ*Q>4~y$hDqO9V5yK-}<)+nelsPCk$W4Me1_)5V3?Bkf8i3sHxkh zCV(#|!(rvR2Xuhv?t-$&K!R`3#+V^dI6KyWEv%kR(KG1H|Nqqb{qNX{e_8kQ9~6s! zN%!+_oW;L!7XQXs{2OQSZ=A)yaTfo^S^OJk@o${Pzi}4-###IuXYp^G#s6<`78lR4 z<*nZ;yZCRM1>3(`IbvvGWa#h>xcHYgk(-+5_IqMTU*AHzffG3{K^N%w7646q*1-z7 z21w@GQ9)S+@d&MXrb+EtGgKh3zR&BJT<3-@G2ntWy<)tIdfQVC@4bZSUo|gPQQa zJ7CFyUU^f+2|1*@%MNCwGKIt>q5UEqTZxFsSC9#O^Be%a!B>j@mTQx6ZU=I%HRGIrfy9$Mb5vM$qQz&p`k%R+#c zWmLtdZFEP7nsXO$Oc;4JvIz5pIh%E?{$s}t=5E%e3&&V*m^Qklt~0>Yw=9pY{T>AZ zpSjYUf5s&NmQsD%f)wiQ>+sVdnVzdnOrIa=M<@t#FZScc6IyMUmA03>y6!p?{1R|! z<-M1I7G2iK?21|aY( zOODAF@dB?Jdha(bX7i4hPFfWbVZmcE!&Klf26wkMu=c{!Lu=`|KeW*am$QFKHmEsO zc$Ox10I0495b-IGw7x`+68r8N_)9EN!YX6v-*+F-uv~NDcdzy}OHC@J>NC?wlTkq# zX?Zz+ldNKlQb?JlB&(!v(f8!!IlJp-Fd{OmOEeBbQ*{e!rx7F`mmg(NW3Ye7)2!*? z`tP(2bq9O}mU3RZxHFhaa2VEO3QX42;TwVmvJm4CC?j}i5;3S_bVL+m`3nw$1YUS<7!&KALahP&L>OKy{-b z)K%-Szg2N=x}{+E*U{G0{mZ$1YvATa=%Z&=_{`6B4`U26AO^CMmm@eQFbPBF_C6xH zq&jr+y%Ocr0)p6I#Zg5#_Nh;5M#9Dh^u~}!u#4J|v>%RO!(12%_pH^Ze zC?8${^k^v4R#)jpXkXH>D!}eSaZMpQgi@MpxUe*Tgc0IftT_1eP@2EqvS>e`m~0qT zIJ(ro@KmhNw%WFG0l@1g5m)%jzxTHB5QqC{H&#d1!#{fS*A!rku8;E?(xFdRa!BDQVFnZ@1KB6^8>V-oF2{luxMdB#!v zNCin3zuQu-b!6>Z?5%~5;w)9#7$}?)VwymM{gK>-3e-OOMIkpew%?YUjj&9QC6@UQFfN z3Sy8(6WN{lH$x~9j&w35RDpH|kf}rq0O%)`b0GRc!+NhsQ#`f&L1UO5VYld9AkO`& zE84dGKpdeC*Iw7mrE%_h*d`xpc=0oz9{iBAaNoy0%0a=lkXv-R?2{2oAt|s`?A3ha z!g+@F7x^{wU0Ds>!$YvnV|~?GmDLmlm|?FE&M2=M0oe05RjYs#0S&*?cnQBlj$s}= zk?|O^!x6?kYO1T8fAq_2vt1+`l|Di3;Z}6&M5`rl#VfRB&b*qd*5?>iS(*ZIW2r%` zGuoXG=9cy8O`TFlsH04^XtmEtH6yiigZ0k-qbY+w!+wiPNoijvS?Log*fo5q)qdR>i+ngt3SJ=%KTvO<$id zZTpLYK3A07ZG>&8_ORJ2#ing}(&Jlb;~kQ# zl~%{U+p6pguJYL*BN0kV>`qB=t8Nl}Ycja9a zxGO?u{^|w9N8v;8%O)`0rs?^06D83epWxtCD@d`7gh9A zB!JCelMO!FWp@-0@wC?vnk`J(Q`|uIZ(gx+S?nu!l{7=W3s!|MJ_7%N7%WNJuUmuq zA9$-3jPq}8!X>eg&|h)aF%E^J4)bCd;4}aMl4!9ZlbpbaY0IAg6WQ>73@V ze8#EEB+G%=V!g4LYbDDlShW>NAvLnx+G8u6Al*ZbB{LlH2rSJpTt;=%IaA-g56CBqba>`{;+P9=F6#UqOQ2jLRLjVY6m%kwHGH8(ykr3u|yz zHV5fSVy5fI0#XJ>1u-yh7l+qT4G-k-!iT@`h?t(!8*lVdnwl4XK<}{|$@f}Fa+5uQ zZ(OIX2zCpQ6a!Uh9FJ&3H1YhvCRCG4Gf4acEmm|zUlOZ&MdqkARA8?j`-5{cFmZ9r z24-@7DHeL?$uZBycB%S7T`d!1?R0c@I<$McwvYI1@mipm)TFiG!AW&O>$G+lAkn}? zdCL0m3P%~XjX{vBg=$uJU>3E6v_irBaL$95nEJu|!}vik z0(8BeD_fr@Tf=N{o``ga0hyjFnJDGaOG^~Az|zHB7Wiq#ajjFVoEgTn*+A|Aly2GJ zKK&*pfhf?-{(Mh8J7I&%tNT%X0BMeE!jT#_OXGqbWyFSQW*Ow7#b6a@i_gRzm^?d@ z(W79ubHTJE_jw2mfm$3v7{dDw^W*+DKI&O?O3b+Oq1L@&T!ha0dX z?T~o`lvjz?_KakRq!Yv?E>(E8{PIFBm0(4vc+ zAC)9S1C`V`t2(&C$|V`(;yxCJ3bR<3%&t&Zt-{K616(ZC(#k$I2=kAO<0acV_=Otp z@lA+z4)!y0sn$NWdwm-c)>z_-J~m3J-2xn&;DQbvm0(+iMLNtS1Kbrrmi%*0M<1J9 z+!mpgPcrdv)`gG@xnexn0gKd#AQ!@Ho#83lGq9%6+~t(F=5LM+?p*A`GKF6#mGTiQ zR;|+42#zGXK*_#N3z>alYUqA@rW2V(d+sUo@vmUBo-fSP(K}Bvd-D8;uKoN7ds`Ic z3cX=y+iT{nvpgcjLQ#1`{_*~aIAohJ^6q~y>D#;8qS<&k?0J~%#&GKc25HG`tAa>v zCj}DOf{J2zl8a(EzeDspgqjit_a7|w2kM5C4S0~OSz;1CA_fyGKk3KuHRIs4BLt4x z^kSv`gqZmSoPd>>B*#d}l9FYZ;u8NezH4wbW9N&BJ{a!nM;Qqsgb8?w1FOzHX&Oe} zKe6c?n@%vatiny!NW|_Z$vw8B=`qaY?Uj{GE6U^)i)5GD)~^V#o1@erhcC3EsXd z&5y6JYYTqd0DZP93imlDv#F^eOQ-aue>UuFBjzdEjn5d*Nmcq$Hh*XYPq&`tDgk<2 zA9#fj@^od}4{|SsDB%3hLhnh^6Vhv;XYE%Q>on8XJ878%&`6mB;7FN);<14c$(RH1 zq|AUslP7_^99UTB#7(UW9V2K#)+Y_;q0d z)_EK3Wy7tDcveXRS}^aPxKCVF$CG41-#ynKnuNmC@w`2|6v>XY9Y2i z1Tb+M!etw)PUX)nKl%*zSJ&n${AKN{^}V{mm&w30Hb{4f$>$&%RHIUN;~;8pNct87 zBaHsWCy=VSI8bmhEsaQ|;g*aVj$N)Qk-hLkfr#F2QlTS}5-J_oBb@~Kg5f%FkUV@~ z``lq{Pu)6}ZosBV$PInk)S1AMC;7?Fx(~NeLU!SHy1>ViaB%u3&efK0ra3t*(q>i$ zrI>k%`77IgR=j~WaO})X^4M<*VT?2s1^NCjq-jZ9F=KGW{4z^=g$-OvZKbn7;;b2w zq=g`g7J(GX8s2vhpV>=T45?j4C8YJty0of0-q01IuwECp8XK<~>E|RfViTUXt3xPL zGkm5>5E5qj|MoY^JH;jKx7jOcVAQ-hG1^ftM)SY{Au;gmq)T#!i>+_^rr9rd(6i#dh)-Q0J}vSR`R>q;hcU#w5}Eo@g4; zeJ=`Y32pJN<2Qk*#*7{fudX4lz1Ha}`tqHcj=W4JIC{5ru?10$gyk+WCBOarfa+pD z1%niQRe7j>o@YQ^0ft{-2||CA)^lk7vXDG%kH8(Oq3BOM;jDS6N~>MmJst@SRotiE zL<&RIpLk#sZ6d6$+8j_R#n9GP12`6D6yFVn8?5Hlm0-{XnZ2JO>2lxekO$uLVi_wP-9SNJKS;@a>GpyqA+-mn(vwdea_OT65bl~nh~ z-iGiT+-DbdnH_o_b}%h|v`W`pIN zub}3RO6dPtA>s9w8=KWqK+*kq8-081(Nc#{z{^j7Wm|uaip>tMM^$c{X=#xlkjv( zj<>yhxqQ`27MObg?`*{NbP(i3p-GDqxx^_U&?2h-=tl7+WX)4?XpiByFEGNMt`*YM z-&IAwfG7_&mS_9kde8Di8eP`Ke92#mGhLSF)a~tyT&W_=681$&(bm=L1a2x!IFI}Z zEo=-D>tGpk;?Zs zjPMpBVqWS?n(BXT1SXLg*9cXOtUw4Yt`l zy_s+@jkQbBE%~M1H$Qsno5o-6Qp_*8Sac)$-snd_#c>tp=YP7vlK|Fy=WP+!FsTW_ z9^Js<6EML}?qBL$r+R*RbW4DBFw)#jMtSOA;ZK{sFl!i0~ z1R0xz4vBKGtgk6t_6NA2hk$+ccmH4r-7}FXA$z&U_;@^oeLub=U<8>+*V;;6nKt>8 zp>%6@4y*Wu-v5sG8q=98Dxcx8Hyr`n2q1xV?+CKAGx>)!pE)bB8 zvi%9`*GKvZCs5RPRi8T!EXXjWSp!0rKu{;A%ibFcPh^MeFG=w@34s;z1vkS1B2-vQ z(jH9)EIkqI7(h2R=rn5nmlWZS9E!>L*!ii?&8~gy?I#tSj=ez*i`GHi%lS)c!0YXm z2zRllTr72ybxXuNPxb8II?;>~3UnNT=Fxhk;XPoTbAjoE55Zr3EDOIf9H!uO&9j~G z7$VIT70?}n{F15XZPXT@48eU(v?W&6=y{syv~ zV{6#ZXB=xzDZ99^UDTR$1j}t3cjR$lb%x@apZ4=}$4LGbMrProgk$0=iepc~7m&g| zz{d^^v6JGl5GKe&zNuI3XjrJ}c}=_XZ_9E{wb5+`-GUu)N)IY+w* ziM7Az>)>!Hj6G;29t7+*e1-&={)sZ}9uoLQ)*vumW9Belb9pRLj9mUzUy0BN0u(mZ z&5c;4t%C&ag3`7nR}7>hSq$_fT@;Y4L={pb12ck6b~j(?fufIbU3qyoOj9}sv>8uM+i(}&Rd`L1NZ*s6gh zsP-Z1&$uSaFbGUfLul$?hkZ$heANg=sfFLbeuYeXk>`0T@vefA4f&$E3?c}mO;LSE zOAg|>`K=VRG|y13YEjyLj)t_Tbcpa>E~@R#<9x9zgOQMtt^_EmTl6vHHlaOQNdMId zqV5qEe@|aRH7K-u@m@}gJ5%FkN-an%7P)Yvzj~{*x`-3ir^d${8E+?)4syW3f)tuO z1&E`8%U(mzVu=JXprZT(ri}r5_mvPB9w|#^r^>sW_?Kzo6voIgl zj%_n6@~SZNDl76z3q31dJ{N(aHc>k6Z_=5J*r`leB@b~C4{=q`^&bM_BTiNtc;A<8 zG#1gd8FtU^ep7!IxMqPA2n9B}I%1e)K>D5~N!Ar8^82bSeTo(9eYXwbYVQiR2}ijg zqC_lZEc+pG#;nAQji`jd)+GA`qv7e_T5}sc5)>lvBh1l0#PkKUak?Kh4E9UB$pSlG zjf3-~j5lBp=#v?@-eyxKEY&PY>8^hoI81@kTp4lnZn%>Y~sORUxt&rHPqS33G%>7bwV#DAp)f6{m4GZSI|mEIC_CDW)s zbaNx!Kh(0z3?AlG%rFyq-wZw%gadDZNtou2Ueh;>@125FXC0S3LD{DPD+=pJgq_bS zft&}oyklo6Z3o-b7v+fAsvJ~CYP!Y8JQ{rTT`fA7EJGXwA<~LR4m@i7&D_Yt5c#(j z35;?*&lM%Q#4tYr>26*-cbe7*swhe7kATDj+I|z4XSVq4*-XBwp5jou5q*~1mH!z1 zbbojgq*ZyAw(cya!m!oErjdf)SA$R+J;8RlDY~4EQhQ`6Bt)u`+ID&Lzot_^Q}c8s zH64YujY%aUe{A-1n`^{DK?%XCNQ2&CR%y$jXR@t`l{-8F)b(|l$^eKbE&I5$lzGEK z_5C_vdH;wtoQiX#z*1YFM@_BZdvmw!$0GWSu5903YI=QxWA9skkghf-i&|`}SG!~m z_E&7wkP9G3_R(CgY2QrW?fxL*KjU@*d-v2UN)ZaaG?{pJ(N8h&ml1V#MvbARPugzO z)<^q)URUa79W|QmBLAp>>UTcV6#h6v~&d=wU=I%iN3crnK8R8QKte`H4z$^7oNKo*5;bP0!@IW z4e5-+m4QxpwZ&KUP_7tz^FlT&lJ;gFU~yAqa2w`p^=Z{`P32?ME7U8<8VOza8xX^K zU0C;9{m!<--xktOSte(8pFufWDrDZQVS(i0j|UR%)u|bcq~jn~ym(Qt#EaMu)cyS=!+eLRmqc z2BMwGyY7bRu2cTUf)lN?j1FB+$Jq@-^$^F|z^uM?GMS=PriX%65aKf(9JpHI&-<>8 znO7sXrfi$(`+x6TMot4Bkb4IyHy0QmbFnU|on-lSE6?>Hc!-Eh;n2)c3EbS$Q~ zVa3bIBk^}D1b4kW!$K!$)nxbc2wiI53vazI?}O{V+DadV9@!#I`C$o+xvIad$L?Fd zkIA?P-!vK&kdkrj{bU5+<6lG&l+j^*IBP%h6Qw4ffg4xkjzHq9I88BotTDGB!YT$^ z`S-~Es$*Nl8!3pY5$^sK>iP-w)%=8jCJ}6qKp=lY{XZdqx>(owl;GOVlx<>Yp5eHR ze*5Z`YN0bE{~eH{qJ0oE6*8wi!4=Bf0v8j@76H_HlLg1v(p)EPr1n=?(9V zl4nP5hXLcD4{l6mv+0?c8%3e_ftSkNu1{!Poz) z9fzvHaF6doZJM$|ovmAbW}-}kxb1>p?}Clwrq1SY@1+V*aVN{Z<^m>VI{slhyE#*$ z(tq3jYl3(#R)fst^ZDlW@F~d1^H=6;A4DU|8f?>oa-bm=Hw<=aT_sH-2}5CgXguqJ zBnMhKMC+r|Oy<0zKk^Imzc=RoZyL>id;;R%aGL*cJNgf$<{wJUKa`q(C^i33YW|_r z{6nevhf?zorRE<>%|Dcye<(HoKTvA^4`5;qULS`K?$@t)<6plR|I=dvPI~r^|7qJ# z>!M_yy^gOvem8Y(2Q{k?HVzHhrKdcm#WZz>fuz#xf^;|jW`ZZt!o1O3ERmJK9M!r$~ z&rn7pQq{@UL}#Fsoec3O>dp%L!f0Gx+S(|=QLByD85+i`W2p;ln05Tu3LfZ)dkw>x zxgjTpCkeKfX?!#=<9>|03@&!;Rh?N>NV*=u2I(d{(7is(1AHtjM>01Kya2}u+6B2| zDW>Qa$CWw>BY{Cd33??(D+|$5YHC&tM%_c+Qzkl+BiOH_+uk)kjm3^(RZLT@3AC7p zYO%?IX;&EF@NU>X24V6)h^bf~eqCJnXJ_TKy@)g)Sz;Q=?1HnwAC2WXNc@4dV zpFObY8v}B{5fyXys}MV#<{W;%JMziYj=99Wn`=J3e{Q*yni8Q}G548TM-s5D4jUEx zH63E@l*0+ehw6+Vy!L+smW4VZUiBK6MOg{2T-h!HEf7HW!;nRhi?`_k(#;>yUnSP= zkpSQPpe9fRpE_AwTh{l@d_pV+$!=L|AqDRJiyd@h^9F{SV1u)RR^e*6#VoI?=Ek6# z!|B7Gd!@!Yg8^x9p_LOW%5Ev{ssU^w(tI7L!j`K#?gEZxQ{Kzg_(=w`&z;J@?0~*=)R!gT>g&g|M-Q;sM zZN)>wz|sK}$3(oclpUzM3gA=%#RR&B>j(qk6q-B5{e|iGg!+``--JJjMJ(P!aSoS3 zE(4duQWJei3nL7_pIIM0IOo?os%v`v_0-2Y#;{?+HRq_q}+W~}5 zJccd`h6}1CsSY`m<>2;~Q1R~4d&QmvA(h5#t>3xyie0bIyZ{;%tMzaN@>pe7sm!?uE70NV4Ts`- zYl{t|0KdnRNRIM}w|$ZCy?rRpJZXf>VRB@5{e}oQ6XpHq=O@(xVeA@uIR442Td`x) z@6a-TfF)^Z)e3B@z=?pj_bO&VeJ76Bh?uHyQ-dT)4$NFqhcPjdDx6=J191+ zS{kg*iC4#Hm39`ZdS&m9Q&1=jbS&e58)6rJaoI--06rY{k~AqaSj z#Jh)&$iHXg@S2u}=635XIe464f2D9+EOmfEw{nLe3>dOF`^^CwVA*ZXqJxsg(sDI* z{#sdOa&t$b{Y%mCI%Bfy7r)UvWpN#ZV%^2{n$2Q-3F4 zTvthcYT%|mAE9VrSnF=eD!XgNwJ}rNsLejCT<|!n^hyBLhp#7@Bqq`v-bWCEIfJ0Eee3>Yrb^$p4JhHT}5!|r|_hbMINI+#Zkns1E zQI?>g?0#+tKx9mEK06tSU(^Nm__Ho3x`PYZlMd+b@zgSX(AuoAPr1WIPEGD=URj-( z@jfQ>G?QsGzFeBHL`?pt0TW4x(98Aob9l9kG*4r_Ui~u=gozo)#o4DEB zcAq(*$mH43f2xK)E?3CPU3?MD%h+y5r-_Y+A_x%OEPVl8yUiBpW87Vyl@T31xZQ39 zW}*adX=JlgS2UCT3c^fvg9Jl2CF&g9RAx*$WJAv(Jg+`_&)z24L)GI!Y#aYo_bCA| z@JwF=&_7Vg3lIN-LF=Vhz^k`i1E@a>?lfI?NJ;k6&kWxKuFZR`3O#ja#iGjYi|EyX z!UB$&RO(Uum*l2|K&b^(aZ{VAyxOQ4JbR*?BnKw{RKwI7AHutdj`l8d$j^4u6Psxr z16l7>o1O&ZRF~+r?SkLI)HxxjScza#DIgf^=^E+@8?<_>wgKOM$O+%f;gkmefPi{+ zGW$<*Y`Lz}yezO*3}H<+jM^yDjZ~V*!zm3MS-&}Yfjc*U7=SlWjs8(I;AR2tLB(=H5->V?!q_N6#~tv8zy`i(}De!tvBp9|C>+%piXK}Wc2W|B)JO2-rbemekyd+311k!MRRGHPdDtffa>P3>0 z%1)&yMx|Bt+i_(kpte#b1EDJOhx~r|X148{zsVIh;^LDl!|)xd-8vu(Iy5L^(Zjko z@{QVwL~IvvnxX{sOiH<#5ZD7HoB*M>Bve*PGk6g+17(CW()jau7`-qj z^mB_C#&a+$BSf%C8>|#GW9w%I_gubsg+kBZGN-5w0eHcys;0UY@1W_o*X)C6ZA%mh z7K+fKj5{?$=VE5-$H0Yj*M7;99_?>$8MFqVvwL&^l_c;M(|*xwGN$O9LJH}KTkH1r z;B;v7$?fY^P4Y?HTuR#Ue3r7GKlrycEbq!%J4w{?G z&faBP?VaM)Z0k*-YSh;sk>q-N0}b+40V!v2ED>kebwUki?fDY?v;BMcz&bEM_pE?2 z54y8Ub_VvL0^4QYNH!Hf^Q;^xn!lVdThYv6_Maj3+dw~$@wWx@u^b`bp2}GZL2y9_SbSE;-mtM0&RRGUwN_;ZcgF@E`seKGAo?=F=@yTkQ)(KGlqHeD?9T@$! z&TSYoFhuO~^OA|fV`azTJa>6*)I|$=A6b3K^$db1Ph%M-nTFdh6dQ4g23Mx&MKlsk z^3ey{LAgfT%z;FWxl<+J{kFPO#fq8XOzF1BmUlnB z$Y~CV@{KonK5eZr)qp=aOLzne1{0;*T~fJD4SQ=SI{h;>Qu!)VU+7!t=oQ8jUSVBRj&Bb#{1T@hE-iz?R=rKkyhZXI~4S# zdZ#QBs{8YMu^1B|+)&g$p{wJ{W*c2T{zrmjNOX%FF`v@DXZylAusa#682!wEQ|eeg ziyqA#)0Clsh|#o0hIZ7O{et7LLiE73oDCGa=ybiw{a_j5XU#<~n$4`akaOKLWp!=J zPcTm4dE*(I!wki)C41yBlC7F|*``Z>9v9f5JStm;8<-2+=PxDJ>TIvc!*evdb`$ps z@K}nw=n9G=>FF_@M6@;q%HfO7m+`*k;xYca77Mf=6oiG)3hbv$kwcl&XSpj~YGE7L zuKkMd*y0T5{)KDx7Db5xt#6mC|2K49{T%9CP6Owih1YVcoED=ZxI9A_%HxRCsItFA zqsjp?9iVF$&HAdbI^RVR?d)?V*Ax&C3Gp3@$6QOQ$8S1I4+ivX1mDwVts7wtxlB$kdm)Zr^C)jSDMZ$sAN6nSsgy4oFuDip+ho##K9j47Q`-IkzeF+Q zGA`>;;Uy-K&OIAxle;ICDgN|mbX$2jY10EzVC=Js-qJseR%@J-M4@>GzyZDip&WD0 zZEe@ael4QL=%nfF)<`aF88vuO-)MG8I#uM5d?GE|cSa9Tey_m^<4oq$oItZvk3XY3n(b2Q8O2BfYzk^4FSDjpO{_ zr8+u}d-J$#Q-1%g!u!2sUQ5o<$v_wI=`_nSOs>$&7Kftf~lm`*~qp0h=Uv(4ej4cR@ z;b*cI^tT^nm);R)vS3G+`ZJcyQ=Vw2QJ$WJ52&iT#>yojG*mJwIRlG! z>$K07sD5$u7ONPGF|88#Wxy~v+^VZg%#xfejg~5^5Z??9Jyf1{qedMJGd@T?w<>G$ zo{g4CJa$Q0Dh9Zf=r%r!EAr^pp>7!kERt3^;M+(|EY|PB%@j{DjjYrKDcClBq~h*F zk0nH9_@B%s3U8WGg#|ZweMl1b-5ERKzel+G5g6(s@iZ5AL#$n(zPr>9G0FO^Z_hw< zrF)ZaMb5s?kw4T{a$E>R%14((CGT;jX$rP`K9!N{NFW?d9RXRE5Gh1t_69=GWRfUVVr+?cT|-P$OCk5FsWpiC{IS`3=0u{X zt==rat-lKAG729dSFj zgbWR00ZMMZT*+RBlXoyR{A##ZwotqsBwnVdc3C2JO1cy<^IAHng(09$6gYAf+OfU| z*T^ThUL8p(iZgA@3l4MZf(l)p%OzNuHOPZ9+s=Dgc#o6g{f?*V9vEJoI%U8KvdGqH z)q!9Og7$w2x9n!Nm9FMt?Y`2NJK8lxu{l_c^$iLaes9d*jGagjj-v>Q5Jqa@BKo9@ zi8W$Uz6j8xuF5C|byPwId5J5AO!P-=`Nb(pO!(70FUVDYiKpnL9nQ@MM7dp#2_N_E z*}4U@f1ZYy6zNe^U@cb=t8z6R1e3VStC1@$l_5@kP{K@@gX~v2q|s0*@rt2xCt<#Y zE)r1{yK32-B!nBE_f=BlpMe0&w}%qv3wpKPH!&D5J+PbX%4*csgQt3M*90&uk6GCG z>PImqSZ$dlDh7z`A#mB1x>gRVWj8#NtF26zYfy6`<_#vpMSq|`(rwWTIwW>Qg$2dZ zTdDF|BINqZXjaGg#1L=w*m#yH*U?M2_wrQ#a@wAcY6rhl3!o8IAY?wY0ym_q7GOtT zX~Io$*1vLBplEy{>W-pF`6;erxZZt~-ITGk;iqJo&mSr<*2E*~)vca;mR)fRd)-~e z9s-jE1OXuHA-0D`k)+Q+A-9If^{nYV1?^SjtX?o18bwA2znQWzI-6Inya$D~`oME2 zJ_jB_r)4lWd+MUBGd3Fz6AA~92*Jf`Ke*f&cd|79(bq>$ClLR<#A2d@gqK+h^p&Ar zCOXdf!472KK9+4M(Z&O2EfyToJxN3?;x#QuFkP5B2^{Jvmdv@CER)K8|3LDDz+6AU?kmfbJ=I2)> zwh%r%e3CUNNxmP*%JAZWBKJMkh(~@!V?JfKf3dQ1t+sNloN}$2a;=i`O=0DZnOa{% zy}x)*P8J_?U~=o*YsV0(o0E~JuiGygSdLS`7Zje>!+}a4fOdL!dnB41iFpy`vCUO^ zXQ{;QmOj$%B8|8WwEI$vEw~O?-?EO$NiejV2<}r`<~6EM8=hZDv7Lv^oiFbOV+ulJ z>5uS+jT)e2#MU3Bw8=IH6D$n}8LxL$l&{L&A7aTLV%;BR$scCjA8N@TYTX}h$scar zA416=L-O42N*x=wD)bh1WDb9w;;|nG@4Zkaxl(*^1J>UU3Q*rd!2-69s%F02%}qcJ#CynvRmBhHRM<3P9ax;E=`5k z=d+QWJv1vOA|Hv#IcNx}-QprUxv!Iti$j%`wl(EfM#^~z^Zsj2?5K)Q!M=4J-ebvE zqQhE=JyAtNWVfGI8pho?IR?M}@mf*tavJmCuC5c6Jh;`-^XtEBB}0Xa_N0DHOg@GF z2S@iD9Blv7mtxIxoApunZ%>dr9?2SCJy0>qS9h1POrTieIg)Y}F?K#UBoL`8N&+OZ z*hJjrVjmBeCq8N&1myK_jYM38kj&311Ct-H<}#bR+HEi2HJtnYn8`dVN6T*O;u|!j z$4Q%%IO30z3S!BQC5q_STG;XVt}SsX6X)kZ`DZTt1kjAGcn zf#TkCCc?VGghUyJkRGncCVYh(+akPJ1y(&UDlk8yd=q0pc`uq_@k$ zyzWouF1VVmG1p?AZa+qN8!e0Py8p+yWU3MFDnTzt;aDFx5+0lTVr|$JsMvXlX;ou< zme$VoJKsbj5p394hXI}9%?j)Zt@26)+R~u3OYch%UH;d(zHSe{43qoOPv?$n9V;d> z8+gghh1U1)O0WX-bQ2#gi14#xF5T$W3Bv<)f_x7@rNQ7gUz$9fNb=J&WO>_PY~CJ@ zi)=HLWncRYJme%`0C&LZW;4}Nf9vRwKNP>^;V`XOmipRrg(a+3upeVu#clP>XfK|a zSU)q>AVqdWtSPBAjA;TdF$k+;(7(kFHg%IluTl)fjbY&dUnxS7rXWWH9?0>ivC@Tc zjZ1&;MIpLPCw;@+moS92*@~GyWhRW?@R(@4_fKfnb%zf|)^Nu37xKw`2;cy5d--b=<2VR(?5*_tJZ@(n4Rv zb;b|N#M5>igBKhm-hu|`KVVCTFlJ?@?wiX?X+~?`QiRYOvlQY_h=~2IoGyqj2{3_D zhN2O3l3o?^w_hw!Zg3@ATX&Br`tXyFo_wq@iS*(%?|re5yIekhrCpnkHSDDS@`Xse zB=C1L1U~h$iRN$u9H6&F3r(O*`yLOcC(g58Q=($ZvI4fXk3NvLyxf`N31p1-9afIC z3}rP4KSe@dUX)50#Im0p8r+9&ydg61A#BY1tXl_oSDF4I;K$!$ z>qSxq6iSy6ny0Tl9>C$4{i(*wYF>N`)yu8Zw>g10F^qQ*l*V~B9^WHXm=28wPXnkTWO*x z$>jwH?YHYOKKfh0qrlOGolkMnS3yM-1&qb3%|a3p7|?iv?h&cCErf_UEp&RTZX{+e zm;FL9*zhwt0aoN4v_C5>H3*hTO2+*Nz>p69l^g%CRjnNujCz!9t~h^FB*_E{`@8| zW7+4;bteX~hKMMN#;9Re7W2~RDtVmDI?LPA1u zn_fpU0iyg4QQ;hie5_KRsO_vnCV%w6mBY#zcT)USv}yJUSlvlveR9>P&q+2EV`UkR zrPs=&mr>O~+_XX+Y_K%RQ2=*8?M#+@y%C#k8gq+DNk1z&+l<5rSO#hN1kazX%F;?) zfXt>UTGkn_QC`lfk`_88t0Y=vuhPpLZk`0Y?V;4LO4G25SrqS*j4iX~v#Tqn$O7;_ z4g`gMDAwoXwj+PfXw4GX=+{i5FOTpF3ekgk3a=nG49MPVLNqr(! z`6W`JeH504$kwB zHoU;%AiCmn}W%V4~s;XEu#q-%~ z-J&TWVYjgoQHQ&(GLALSk&t0szj}yxL@`LIs(O+|yt^iPcSfDUI6sP;M^mz2d!_Y3 zoJPPoY8{htd|0<%mHgcE>>5;h@lNn4I#o15ziD?Evc-rk()@d>}}7sF=P>M?+0G>bHv1uReUbcG%3juwV2QyJ^N^GI*koNw0iCO#`w6(n=U66sm$7p19Yj1C*= z&ff(k67c4UO;qmbt?%O{(+^-7UPeEDO|pg-MSR1B-QOo_@?4 z*iY-c1PYtRNLfC7sP=7RbW&^-Wjq2W3EAV>zLBX!7ct4*V+izi9Y+&Nh*}y^-UCWC z(rd?E7}6i`DO`om+B@QmuI`45vk#uvg-JH7q8fCBxAP@5hMN4`o+OUScG~VYY~pmo zF+W+7PIc5tK|*qJi0=PrYR#PAJ;96{lL(854wUP&?T;~7W`UnC8DV@BGfr^}Y4aa| zdu&TyQyF?`RNG1V6D@ZYHD05yOs~VuC0S^NVrJFMM$k&DmI8%Erjjk6pLN$saE<1r zzXx-Xn)Rqc+fm;nXi_Ix#OTkzy|amwO_n(*vQAGFCC;fiUlHG(?G0PC%g57c ztzeH+bP9}3m(6vciaU8dcc!bYR>>s3fFeoD?4_FtPs|)3wlsZwTr4*?l3&d-ua;N^ zZrAwMm^)rFCQpm{qq_a|t!Q#%|5`q36Sh-jn*{b@(16jC9Ut1k%JndJs zT1xa)9Pjl)#Ktp0f7sbzeI98XJBFkCI6>FVG{%IJ(52s#O$%;dXPhigtH_s#y_jXx z;@Xft3|V|YP2uy3H-^UT>8msGi*lWEV8uW!K4ywY4D`ALBw2+NC|Wu#oLp8EKlxn~ zV`4K}-@YqkZ_%)WanxWLtx|K5M44cS+*7H3645uu-XfzDlIjJU<-i1Eij_d?RvIEe zZvw(4X55>}ARXfXPhcw~fVtCy^wP%_%*UPPgO#Qo4D`X#Ci%^;-BqlvAkluao#qCu zf?UvBtk8F?)JIY$dGqtH(A=MzyBDRlttj=2hZ}N@k=574h`U6TJ5r6l9KB}mw*bRa zIE}*XmY~S@(J;D>;dG8$S$~~O$A?;>IM|OY8-cR9;Lq58Hm=dvK4QjfOjJWNS@Gp8 z%!s6m?~$$;uZ{O!{+Zg>g{$191U)&Zgh!EjaT;?6DcKv9B6?kL{m{qJZlJAdqEeWN z5M-o0K+bi>q<+qW*XV6vg$|BGf}cP4Pi$#^ptLiyGfWO^es*$fwAL zL2C%8#jNxZA17>CmYKu3-gs0zb3oIK?-C)*$J_6O*(g5}N6)%v-2c9F$x-~!*8OoQ zuK#f<{*O<2S(^Q)7R60!S~dm3NM13C-?mNf^_W)sz6Kn2O|WPr%<%xIwsV|nl~I_A zBdW~N?Nx8v9@o8amLLPx@xY?eYus+(EwY_&x~Cwf8B^rx zpkhcheXs#0zcKj`2#%doeB0J92Y~%**r^VShq4}bxi_v#L+ss#I08Ffnb&ONGdF$0 zook6qGORujsQR&iDv&Mt1-XOPb(;dDu&NLX*?9n07eh?3iREg;zm7m?3@uBaW>ef zp-PJLR@nhZaCrQU)p1O@pX{!r1{yeOZlof#{Eu$wLV&g$FMRUyEYGS3h9#f1Mwp#o zJL8yf0xn-@b!qht0Edg2(HNx5R%3Kisq=esmDLG_E$6V;4SJ;L>=iHr^3>L1i}+&K zfcy@Ez#i-{nl0Rs`m@eeIqgPw3|yvNK(~+*l8!X5v1gh=QY! z+;Xad??bmQGDtW7g{-n2dzK0HH%NYQd3eFvLAfF6HyBRQ#RT3~wh=po-?#6{ zzAwUEekCfd{GxRkHa#j3wEb$FfQYe)d^2b)gg2<|b4-nXdG2~Krk+c)KJmg*+J5p8 zZC>Rj@{B-!@oa#iU{({qG0s6^S#g58Wk0ak)^U0;k8e2V@M=Gks6Q7ykqjndCVU-lPgkJeKeaoH=ml$GcIw<%$iTnLfmim__Jn( zWBS}^+QL4&m1kVjW_;af9Am+cL7AC)FiDSDO&^*G?f;nL>3z(?+9uSc%V?9_I=Rj} zU4!(hV{#9UyvjMfPOi9+KYsqel}C`#S_5Q{oL=wN6(-6p!C69F+ivfax-aQf5VC6 zu&a!P(N{Fvf_&_EGBD(W;+|iC1gH3LfvB6IgMWZUfE#TIbO0ZbTQ1B2z=S_&JB7y1 zffLNlvaLGGHUy?uUm!>|^P|6q*U$J8BSbgT+gkd?J0>!9dne?qu zeKVegO6=HO)=zZV|DxSr(wSELCmfA;{_|mJPO@&vC1k@*2>MkqlArHz_pempBjLy| ze4$^B!s{se_Z1hr2~ofPU)S5|{+m>ayI?%*nJ;zipVZurdf;g-liqoXlw&}*!8p!7 zIh+W8&dsDlHixJWU{$I87S|V)m@RS;n=$bkg} zdke=?ARjf9Pzk3=DD#)B!b_miBJ1{cbxjDq294tsQoO_8lL{9A${8O9^ZVbwZQ1V5 zny%xNH5wGb7@!j`q$(2Stkx>PaWz9Ox|9e9!K>c#&OUa;9@%nilNI6kkBl76mp)?5AZ&A^z!SXmLJY?!&q&eH>_E?}f%|mN zNVcmG&)v0>G3J9#HiyGxz3VsNe_zZJLS!P6ezf!r>i>hq%#8j&_7cXj_;Jv>bNGG0 zbMg2~;EuSturRDb5WqC7KJ09l@Dzy8j@Hx+88J>QsnD`S>ifq*D?n3TLd@~w}U=Egk&1Zx2+ zzA_fgDH17*_l6D51;g~(0brDVpy?G8+OH_mxE@_m`HQO{+yr#{=Fol$A8~`dsbiwH z+(C0EF|6r$3z~exW+)Oc^lN}}4)54D10L!A6AMh90Jtg?h+7g;L5b)tb>v#I;qky8 z(CAHrgv^yJPFtnvv{9s7heOTog z4D7h8vi<0g;!C{tm}C#A;USPpcwboPWsI0mD;#v@cN8#nX8&jDj%vV!(Uq$-W

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