From d0bb53ce3d37617ba57caa85c4ad7c97c62d96dc Mon Sep 17 00:00:00 2001 From: Bas Vodde Date: Sat, 30 May 2020 08:12:00 +0800 Subject: [PATCH 001/497] 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 002/497] 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 003/497] 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 004/497] 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 005/497] * 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)` zj#QL!@ky=htIdTH{yF@I9s?iJYbvd4wV`9gJ3qzoF-eOE@v;b-MP|vMR6QmR!G?ud zVO*6C+nT^xIaJ~Eq*xGCb|Us49d}x?q%D8`0<(MsM&WMe6VueIHm~hr95+#^5?!U# z*@gz<&iqz{*9gW|{WP@aCNwqb^L93EBTgnqwoo9{Z>18y{U$g{(%gE;x?X58a+u#` zi>GkgMI-`j5V#9E@LHU4K1bvO{v=oTc8+zah!OrRUhF0*IB=z`UNNs@*094(g}R|w zY1{hySe|L!(k5w2?JPit`$dNF*12NNXgvAd#c^)FyW={0ET$aOX{q0DM>wUQc)he# zaMSOqi!UAdq144EU0r7nknW`(rVo$%#S^ zah+eg8JNaSD8R>0U%x~sM30EI9rnt;W>9QUFey=WNz5?G1tWZwyd0`c>L&R&AGw7d z*)B(7J!#ZDG|+A^VdfxNYiwR=;gs!MyB)(_PR&!dLCo-Ml*Ou5&6> zp5B`3H))clACG1Mi%wH~`?V(TlQUb4ujTOTq34YcZO%zVn=tfM-$M=b)e}2~sL4*6 zyuB&%yfk*yUz|AUO5fFtKq3Sa+6)u+&7NzgCIxNG^OjqXl*$AfJ5uXEhL-w0#XFC_ zf+m4{v2$UkAYy8toCI}X_Ry6*Xt|J6t;6d@)}8NZYmMDCtRv3R9mZS5-I6AQdscfc z`UhBFPW`IhC(Y_vjr4$CE`-y&cqe|j_Xt0chDJ{=$zFgN&O;fec0KkcRds(9Gv3^b zjQYcpGl(gTL`wOzF&V=T{m_jSE~fZWG8dc&2zk2##t!#gjc_YMDrZn z;pXT!1Pc?sJXS*M#$TfGPJk{qs6G!6-Em5f#{glK9uQs|+`!y$$Z~CISC*vc`e)0i zb-gt8a*l$fm#r8etgiI{Q9qK4-e?3^m|ohfrch4?(A?iowEw=$*VNEo^Hsb4V%!1% z(Ei)G+rZGm(818+t8%8N>+tv4&|jF_e=>!CeFB$=4jSU`vxVe0hsKnznjnGE7kv8P zUh%(Du>Y*uN$Q$f{qJSFe{u2i|D?}&K%RNSu6nI4(wMp@ecPlq7%*K}t)Kdsp({0Y($0pU&RNFEusJuN=V=Gxg!D5XDn6g22o zjkzEcaULI>SFsHFvUFpXi&E-l)pz0G$AFaN4nW{jlC2Hvq!>7>`5T^nEa;|f9+vcd z4C=yoJmJHKa7&z!a;#uUZj>KmzkNJW@ct)W@ctCQ<<4vW@ct8 zGnAQ`nagZnf8FoRO!u1ZxpRNy%E-vGl*))WN76ppQkH_CTC2PnK0*B*Xs z95x!>KzJj{Rz-C=)iJcztcz6@YqTTT1=s!<3+}h&v1ZkXbG2r#O;8>a?^3-~V1d31 z9KjjX;D?nW7SA)K0e8Gm)RgE(kN4OW5Dr`{$(X^8GxBH=a%QOsbjo{HLIeIOq%A&`k^)9s>P{a-~J^P&M3Ao$f1ED^;7nQq>uq`nqA^5|s`qdq-WG$m-_B3^o>ykBA(%MavtW5B(1w4# zs48~hnh!b-ru$Qs@H%L920AWVg_cnoj$o?j!yurD9U$Ub)LF&>|Dq9#K%{O$gC1to zN;=8JBIJ%ai^~eR(dZ}g&EG3z9$?fX`oL3hzyPD;!HRb9OpJ6CD}CsG@Cy0VTp2D3 zr!o$JkO+K>;7Crv#Vi`;q;XtGW>kqxln(CtE{!j-g#O)WwbD6tT5hl?_moLBW}?U$ zVz}lt?aj;-2}|w8Ngn%%({5(ltY|(QYXtK*ad&m&nC{46eJYMsaxWcP0tiP zT6W~*rgtVOE6iR?LVZ4KPuG(_-gB49yvJQu0Fu254$&+We`|w$7U{d-Tt=8Np_Ou! zr0$s_zqF+E+wygj$dZABpDuw}0`xyP<%Z(M#&VL6e_8OnB^;Va(gzA}lSC6N95>G> z^n|+PT3Lt^dV;tqaLUlPmykBXW0nAUJIN%I$Kim~R8%8$aFIO*-&~QEE3UlQ%H(E{ z0E3L4*pj-mqt8A|!O2hQg6ZMvnpB$OIgDHFc%>2fxlb;9dWb#zr2WV};YmJe6uix9 zS|VIw1)FlimH+|apiJ=#9TJJ-CYG`yEhmPLn@*1miV-7!NR!Y8N3lGFojS0H<4=VG zP|qR_)Qi+X2h?Sa?76{Xl6~}04-Ght^WG+h$x{w_2pVx3wG26 z$A`r%ut->nH9HB>W`BTgT3AvXRDB0Ot|~wQ0!`^|8R9eO0)fA};1~kVi&Oay>qci6 zg5DZ?B19Xww@9bJIOM4s2c6-Gd@BvP<+-r)Zu{dXfLtn`-_k5P?-(V1`?r~opYhG)6N8LHBYi>H;g35&dE{W`X+FyI=G<* zzdx=&o-NnM7!P-_x8Mzg>=3KqplII#=YEdg3;c6O1R8U0FjY3N!gqd;o~QU3#ok6~>{z^GeQoazGc>o*UmDPH9H4A{U9n_JPs_3uK0*HXJvdf&c6M;-6<37M5o>&4eP<(dffurq0kPT7mu}N7~ zn*`t$RI0tjAXIYc46I9?(Na+a6(l|u5jFbv;P-WE5xV8j1Jgj-`_KkD=>7e;ECBf) zC?_Ib=Gs|>tHyp6T}xhGD=l5qbL%Cn;r#5&xv2DOU`nz@AJ{ZC_v)&dy??Cw8ByG5 zpUc6;tJD@jRJ0DPKq$Ozh~#LjR&KyOgSi~>_J)()a0DxgB6%9(ArV19mvk)^xRGTb z7@K7LE(i%vd0@zlG5i6pYwUrnw<)2ARSw?R&XlJ5bC+U&npo{blx~jPgu(?Qp#jN zd54J}@5 z{tfiA@fhr#2rOh?pk*zC0;u$7Rw-qyiuGX}l8hMP0#aUD!qUrS#e$G;jHy!a>XM#& zNy@NRSvGe2Ku|QW=1G-oLM4=!D~Y;U!ecb|y|y+Zr5USl{GN*ZpWy%K4ezS@EFpZg zVIlYeBx(MwH*EWt_iOC%Pn*{N!uz#V?6VpGz;!|1BKCK16rC-{z;pko9mp#%b}4a% zOXP?mQVcRS4^8mTJ*WRw*fr8g!FzJ!Qvj&3B?>gveXL9DY8ziIM%J)FlM36S%b%}^ z{H2IX#R7ouh6&|~C@{taZv8&8gN&~Pc_(F|5rE0p6VA;fd`IIMX9IoicKtBCP{o?f zYI9Fa7rg+bepRz{&$rNI>_vY|b|ELh%B6m5Knkrn1j4RnaThdpO$uLj)M@ou_ER>V|mxn()gMo`7W{`u@!hVYK*y zySs)K@!_y52EA^N=X@-sTX?P?><9=M#`^=A=Oq{vlP^xpT~|mvVtO*bnYz0ej8NO5 zFyeJfl_f{du43U=GC&!wS+2I}T?;V}4>_{zSQopkn$vQ(704z(oRO=dOK>&c8E8mu zxdXURU0Nn4R+ByDF#rJj8#g{zjNzlnmklj*zgK(%H`!V_+-(Z9>c-R;-Z3Gsun-&9 z2~HAh1mor*$stZqIPzdq3hCg59-JzJHv~82UJ&4yBo06%)VDB0O7;LJdYHp9MU;F< z+~67>QF=6(*@M$2ti1ClKwK{vTx9ywBpcj&ftkN5>s`xFBOUjqal>+C{6gVzd}0*F zmp@M?I?fx8l2#L#YlXpmrQ!MYx2ZuocMX$Bz%3?4stG| zw`FYlBd#f-2CL2pgLDZ*P_u*4PsC5c1t=c5I)lN9we~8fzin z5s?(wf&@&&(m|+5p^ScHHBu9TR>JR!gI4xq<<2>_vva+K@Nu=R%_yqbDn&FUcdHqE z1?){T7AnrTVH6s6k|N24m1l!E7}S=QQ%*?)`zgM2tz#(C6fh+S`f(ZZowt3CD-6m$Zs4!y|$YAo0kdo$9{n)@TvB>I|;VHihijW8IzyFPwr# zV|_d5uV(LQHP%DR{F75BrM^gmx1&uHQky5|>7}%}NDe?*H;qxrUXuCE@54ldf%omj zfV%O8hA2l0YZhPx^|bp-giM`p`0N*-Fk2ozT5C%QWeR9*f(@Iqu2p(hF+Ig!jXc4i6gBXF4y z<3gQ?nwq~fgdsWU+{rqt$5ZcpNX=Wzv$wOH`1WL&kY0cN%~@VWMf+HmcB)`g0ihE& zm#5beY$N3io#)S@hXuY{N}!mJPzb`jH~8c*c4O49M}}@ z0VsM6r!+w@ZZ~;ciG_}n6gnI3cMQKF+m^OQev9H&`}9AlC5*X|yn^!=pku`gt*7AK zq_OXK24skAl8JjOuz9}xe~|Q0jsRV?JWfjWn%+??XK3(LBr^&pzWCIA!ch<_22E2B zc@S3(d@DHT;{#+2ny$XvWYTQ>`U+j&d$@Vo`sZ@LlVkpXqj{ZzE|0?;IE911TC+hIbLEYon$-Uj_#Yhz*?PP&l`m^{iV6h8_HP}CzjiafN;}(` zIy>td>suN+(OdkZA^R7;M3cI${i+1ghhEvIVfDL0cx9oxzFfOn@(;~^z39mma?8R* z9b<;R@*CnFQd|G`$#ZNQLej=bQ7cV1^PF@~H#4_Z4)14>sosP$dr_~B$~=t6o!A!p zPZooOp>YWl0E%K0ny6*(){In=gJw97{GE3AEf|C%v^tYyNDyNK9GVPtD5a<)MS?Sz zLRgN(Y(4d?r*09G`l>4x;pERGS7g{GX8F6)CkR;0%HP|*T6BWwr^<`TL7Jnax`mD+ zgb*U30Zo)@mZ}k8i=my;s5&a+rTw2^Ag1Y^6!ymH6jW5nQkG=pJ!tsv7u@PWIyRk= zra`l=nuZdpA)6>REUE4;^R><3AS0&9L;V6}jUjN1(B;N0yO-;Q~Php@tapc$)#0#ZT zO`K!^x6zANrj9rVC+?<)phF7h&+!#DA}45b@C7r+^^`Nw_5h3|UCdOlc#2jU%J|<^ z$(3Lho8|R5=w30;FtBJdGRaPg8_LxzCy)nPgGt_{IZA5iNv>^EJ@xB@MSx(&$3A!Q zzNQn#-iLYTnx{B;LxhHJ(;QH*p?^kxeN03;=6afHw2my#d!& z)q4&8W+Fc=2YzRzrB0|jbWuR{ozUBi)BFtNCt%p7J0t1;7xnhQ5?z+@Z7YKdRz^w^NtS5t06C+^*zOLz=O%AA9}EZ zO5;$x$8q2_YrR6w#x&ec7YQTqSchphvS4=TGGNeiST34mNH=CoaDYC^c&&_OAM!=n zUcGOMa5Ja&kwUzeV`wvTNbLOHF279z2vg4zvOojC`fQr~$p4MauAVoxy?YRq%0NGr z^H4*_a0qEUN76p<ocPG4yC0#^3xE^Rj4mL? zFvS|$L5X$XpZp~(e({slY;hRrY@kt?X0Y-+qGq}8`X@_%Yk5H>;%EM2nA6V-EppSV z?jYpvBz6se!O-YY{O|935WHrqkU$G4kf5hvh^yqudqXYl{QD4YY*&T7lGmQZB}%UJ z@=WET{)^`$`)-)E@`4r*)H2IMBIX^U#dpfvm3kOOpbjvgYWCb}=OJr>D=?VX?G1jI z@4GUfPhR;^b(QRh9bP4Lyg79N0U*wX@1*-5h#< zqhN_0&(Gt%T;Vr0X7)x@9;F{^ShKM~WY*Z~@rS{7Sjs5iLC!Ck|8VE`?fBYb%HGgt z`Y-#wS<(d~sq|QJ)r`JV*eFEO-9Wf`rDApRZFU z9hy_CvyQ{@tK8A6=ztm7R}hu>BZvWyH;n9@kF9|)YkT`p>&eiwnt&*G_NwDmS!U>p_PmKca(P5lR^#Bg=2#qhgvYi2T*?^ZFVjLf7WTuM>lA3 z3)`V~KSATH)2ietGq&p~%c5P= zs<7jKA5Wb9GE%0D{e^5tU4j!=rypVq%=hgKc+>AUf9S^bOwgIL?o`J$B>X<*2fh94 zaz<~-b`EuCFvzLs`<^=~d4Y-x+jb@;1`s38In5Z%AE zVSlw)G`6=h`)AYjFJiDJby@p04x}!~5r53Q)aK)%gxiHfG3iE86#~6@skp?S%Ps|r zDN34~Hh-3`6e4vqt?Q_N7x`Xidfu6FU^7l^zsG~yZ@6y{CBBA4`vS+9>H=dJ@>NK+ zB{j5DNBJ~=H~v{dab=jqKqj&x)o-`aOYwSjQb~($9vdmd_F$~p_t75s`yqgbm+nqe z?Z^~Z$c#qxPrX*YMN@TP)e;V;y2+W7fj=%w(ME4ofg@*%;=+&%+{^>pNFnH3s%mcJxz@^518{LfKVUyFHn;`o6k2Zv@one4&y; zoY7#{9;BBNLOWCD)rda^DCG>Ym|{ifLpfkB18d_zkug!Xm|{hZ9hB*Ji4Lu~lqDUl;(@3Mgq1KCpdY92~BoNB+WU!R|#s~@zOw@)63cZJevLAu~_rMNE zw8Bl#9AwF>me>t%!)=uh0?OCujSG?oMFbK14s1&*>4Jza9rq6G+|-jq+`i7Sdq0il zJ|zK!4?UXJoT;!vE}_yy3CwQMk`1VC21xDJTH;be!P(!7^(xz}R)>+^LR_Q}9-s;B zDq?P4xx$iY!FOre!jcGTi14l}2-QhGiE4+4mbtNs;=A2G%HMC_i}-HtM;Xy$0J6)~ zv7#_#Z>V|%mGvYhy}X!usdI!wv;=XmaRyfh`oIz~uw`C<)B-2`z5|Gi3 z9n||wMKRQ>SlLeX8C3B3MEk3{Jrd)51P@x2N_(u@R9%e6w9)X?*EiWH)9et`Y5S?^z7M^;X@|lSe zrK+V4Tsm>+#@x{li>B_?k2@|Lw0?{Vmk^z;p?wYFnuxStRIKowKgDgz!I8#&U~rsI zTBdUyp6ynWV3pc2+)#%p<7##ZuEN3HFtD5T=--|4`m;qOI-gf$s67z#eVWzh=Z-YI zzU7nF00HaUXzQFvntW7OHPHg)FWozi^N=_TG#Gd?OV-fC1f_&a8p);+0VZ41RrM7hcF`Cwl;aa_UUBcsa<@0ERucxc;{8Hw%&)eBC z??gu{1shv);_lb<>GMNV$1v+lz*6Zu_u8K^*UHSE>n*})9@n3EbphROFMr#z{?8mf zqdB)yI&dH$RNnsyGW%OY*8l5-vrJw2Jr1<*SMg7X;tlM~Bw&rqufMV-b*!ie$Q(}` zLWQh~2{5c6_^b$?nY!CQuLMns@-3Efpm*yyFV| zeHU1%HcmXPqL|z(>Q({ynvR00vIQ-#w5Y|%!NUfkcvP>E zPB=Z&kPoItO=Q}j6bIv}z7LX6t|&@%DvZ{BSESq*#Sn>Y#}dy&v!f-TTmY`xw_X?l zzv2XKMI`Vx5<1%cy}d2vY+})Ho>8aR;xsm~9)~lA8X?H-S;sTx6C}VEeuqF*NUriy}Lpk-4=ri78x?qZN zhovT>cg_U@h9udNV2Uc6_;^}1KFf_j4?LIPq}Y1({D9z@ zDsyLQ=q%@C)2U+uyhl`J7K5WCVE|_(7=37H+)6z}N*4doQv=^EqgKWKK!jgxg$u`g z#r@+HH6Gs|U*EPM$g}QGtqp!6W4>a5q=gg-f+f!`bAm!zbUHgkNJKN^&{tWTd0dUhbYtS9a)X(-m7F%aHDlq^ORKtO`yuO$&nQieuu6a}w0*Nf+u zAQAa3Y719?VG^7_bOqm@CgI85&`J^cYC*HzxDq)-^b zU=szPnw%qD5q}oO3j~0h4HffG2o{-(KYl%foOL2A# zJ}~fOwd+}|QF%&qjrX1Bv%Fr@qgiSEDxlh*gr`=G-PHCjqDnO(zFaz)a}*;|Dwe{) zz4<7#?ykz{fAU&j_tDt%`1rBO|B3qQGPEhsMc2Vvjw{?{I0v#HfyOR$5QQgEqfp+6 zUVkP;+ey+ZF^5|de+_?tV&R^^&hru!mhV`PK0=VBefXA_an9fPk0jv)6( zth;&5f?fXBt!>y_9>#NE!#?EVD57^f0hhF&MfO{&-hK~<^hcEL?cBW!&k9~we8;HY zS{vSzApcWf$2I8qwX*%{Uf@_}J9PKiDu^4lVmG(D{`lALn686(@ssk7gbm7G>Mo(z zdXui=aYt?pZo1k6dmmrO@!qe8Y~I-HjSO7@f*%0|s6Xgvb zl1=QA-e+8#jVl!2{O`vlY&ORarCeGUSUVlxkc6mR0sLS2MbaLYJ)+lTU)H8<-=s}k{8snO z=0-L`dM-L)KV9GKpFf$RecmZLkztR$R{j48gLouLp>g^0-x$8?I8**x|INnK-OG@Qni+iuB4Gp_V z@>^3BkT<>g60^CPjdpX>uxOGADug{h>t*msP>Fa$3uR7i8Z3nHG`v?1cMxn3H;3M6 zkKbiXSMp)7?aUGV0qSv`Bw(r#6DkZA9y(LS=B&e3uzQ5-iMq|~NQavy4b-Cdgo?w$ zZ@Cl~$SU|J`|VIN`SRi(n-^{mnjfeSGXiwa)PR9@6ZKQVR%k|`p9a9khr{Qie31<) z%AgzQ+I-LxbM#&`fS+VDG$CvWT6tQWY>=2$x9>ZJQx`vXRqFdq zr`cOy%#xhM%wjvK-vD4`Owy}bp+^Pb0s9k#cN~^w0tH?%L98Xu$$o&!>Ceo{fxAwT z6MRA;a3oH6M584o$+nEQAjjhYTIH+??j5%IkwuA$Ef%b@Ml6(}M zcAm`Gc*2eT&|}*R^-~TOwsUi)*o-$S3uyDoi=8&FfZ?pK>)iv@M+XCW2yL(UVYhNMe#@1(ARd!*-{X)>b%V4G@ z$RQI$Vc~Klj{){fgIl?(KF-e`T_!89<5D|&-h0+E<-LjBr%&d{>F7p2ek~)Yp&)z5 zxt2}J+#)YPr!iWUQqd%Vl-+X)AR1LQ_|w~XL1ZJdvuGU` zU#TD8odPz?4SW^!bFJ3<#uM)9>;Vygt?%SxYy#bElMaJ#_&#_0LhnX!?BcEGD7W_V zw^{w4Y+bkq@Ir>Kw7|b!c>m3;HnDV~`wtfI-x#!isgbKWjI*hWi=~~pGYmDoiKzn&jHsN*e@Peoi!GQ4Y^T=cX$)yxQ*v4G~ozmbgA6nEf^KYj$PD=XuAA5Kc$Is77rCori__lEI38ckK~vp zaY^5HZ6L-Y zfDeJc5nx)c&f3?Sh?KRLQKj5O4cCL8vuB~;-Ps2pUA4XPYi6FDbsWdoy*1Z4Ob=xr zf>}5xjcRW=G(TX;bwgeE2OWosOFLs5R}<5}|M9;d{ePk0e+E<^F;=CXU*_8v z7U)Y9F3^7xVkjq7L<<3EC=*V55 z%EFY1rS%v{lH8-(c}bPnbh~9Bt89rgP4|bb*WFR$^f~&a%ZA3TnbQVn`>2)j13ATG zp$u{rN$vDNf% zYns-$v@sih->Y0-S!&V`t7_$}_N|fq6dt0^t3^>!sumc6b(IGTeGTvg20%w?^fDRp z?cj%|g&_)PkOoqk>~bG6cY`s+Q^%CXIZUe<@OHK88{poAQ=&T~xk!reM**kTw&r?B z|?A8Syy&SjXz1LsrEWuAK z%(PWPAHfx-^W)b#oH0EF<5e0vX|C*HLaFnJcM9C7zwFW1p~M?I{OIDjE{ZEcn@*ia zIG<{S2(76@I*d&)rQyBnB)eKOKu7JY`$0Hd^>^J{)5vdxkwGma|R& zQM%7sB-g$2qt<30_Kj@mXesq_m9d-qmfnTem7i=EQ`5|I$>%{Yi_oU$E>D0kP4L-# zXP)`6=IBybOftM0yPib#c){6aK*XC9{?9vtx6Tqe=>r)t(G+sWB;mFBf#6t!L1t(- z4+_JFtO5P5VZuxCY;B=hQO8U(1^=nOSr>!5XWE#4VmZ`nQx9t_IYD6;7Qo+7hfTId$1M&!k_@qV-0P_ItR+`t%Aq`k)EhxoNq{I#g zceHe~yGJ_2Xz#)#H%)x`HG(;EQDJ~YKvYcw;B`gt-ri5bAMHpqR0sz_Hb#ZP=E8XZX5@Id$MM{)vaeitA%|6GJVCCIVt_^D?ZmF64}7=QQb#r)`1nL1LC+z|9B8@uRgYm}_Q1APHeH6`5R+z+{h1Fk9V*)rBVnp>LI`%l z3>6a%1v~TeE6vOP_4f642-^vZ94Q)=9hWCVA_x-}T`m0;*`Oqgb}7vJ9ylV>(W^&> z%syIB05-hcltD;vqLPWRLK&=5+BTbiM6dL`G@pmKko!)j^J}%zZtNWkO|50J?Ln2) zKDQfw{2=(gXmfZZ_*dCc^Ga;|K#9l%MGyqU4^E!mn5L)slD0rIzq>;vx$cyLu4$`z zPl;udgi)TFp=p&^*zZj7njCYrns(S4_n?p;MY;RYu^Fw!`k98tEt6m9$X90`DTk&6 z*;J66kfnyxyc51Z?eYQ-9QuYGvFi$cMre{RfW$-`PjS&!vhM-kB_12W>m}{rQe3}V zn@;p+`eZHxRsh!!G>djEOW$ijrgezE`rs5VA<1r`8ExZOCpV}KE_Y}VHz$-Lb&spz zzN>-FJ?OOvWi=B&9jwNFeXC$RuHm(zHW<)h7kb=6l4i{{o@^y<(9j8x8eBm@FxFMN zfU-N2Q4jw>0GsPp#VvuUqlS{Zs4gOYBKzZ`W5-iMneL(E0qkaHJ1BWPV21C{ihi|Z zCWy=1$J=`A8F2IsBQ?^Kz>d1eysb{nW*Vhi{{Gc*=~H>M$@&X#ZNt%snF5v1Uad99 zwbEYr*c0<9Q%P@Fl1@&(D_mWK>C&@(3|eS9rTN2F)wNVp?y|u3C)w^krvxVPk58Vn ze^Y>bc=Eep=7n<2yRN|}-Moyl?<2N+XrL?^APq3=fu#e(U+_lDtn0ES?8WJPfjG1@ zFX$2AyXN?{<2kdKIb6<-l!nuu0a3j7Ow+^0-AUTv#sk4}R$2sQ7rIBP#(QaLWpVwNMeEaRB`7+rJ0}keG0m4^ zZVy)qJ;v&-1AWQTdcWMEL?&uUcWqVf1#tDMg}s?2>{2|Z&iaM0g@BUF1039g-;pOp zbB!I6ne~dML|LBTzPxn@!7p`;EuA|<{7wFYRqb%KJ%zeYWX(69t zAoApi3`>rRU2sjIA@%~vs_%=&KF(x%yM3Q51IarkZMp6WNwp|K%qOgY>zezjdQlG& zG@=i?V!SpD%2rKY;X*6s0hp-V741*WB%Ucn znsh!FYGV9u+p(#QV}6BtoLdD)H)yrr=Joy~s6cFX7Zj>wuVp% z?=F{)8ubm6d@MD?T7!J~rOT|LWjW7K`T5>(mrDbh*1LSIl8RP4$U3lq_jDUu`W=EL z%#;WuD=gGoHgPR&Ii>qIMYV1E&>*mRH68jF%e!;Qu$rN`7SQ+zn@z-e2Py-PW36wj zy&|6!E{Zzta?g)nd-T0IpsacR@}Uy7vFV#yp&q3{{Ybkl4#GwML~{zQgM@?Pln1i| zKET2hj@8*K(-j&Y7cXU1CG3&FYDP$O$O3`}_UDP!_cHl9;pP~@{?F^|h++$lbVG|Br}|j-ojij1aI{s1iI+GD8@~l`H_WJ~Y^lnZFU|ODqDS$-I8BZYvr0HBbBU zHrNBe(Qm_S(t$zq_4C6J(fTum4($vBr9Y9t4-DL)FJiQhAK!8GR{6SREsYfVp6{XB zP?~LKM}T`$EzhDSb~ET2OFbcuE|c>H(p%)v78xm1>u$3^Ri0{iFwb#o_jZZw{3zE* zhKcx1Xdsquv-2&XrO2O4%rUZV6n*{5wnA=@j8F0%@a|@XUq#bAHFqOZPFldZ_(KnQ z;e33%YiVMu3;$I?M@L7uGw0=W!Srg*;rD>}iEh7rPoP&sktZw~81G_8c%g(uS43JN zn%O8HQDewTRm-hwjOm3>m$Bv+&F~J}@`6$BwjW6(YQ#xSqUI21GXM3XnLAQa=A;J7 z60dlff|Pg?v0&LZsf%zWveJ(&%;GKNxl{v)YBe?A&a zw5HHkyN)Wed@5uz74HZX&rMptT{c0lxd$h{oKP8x#Or?7=5$@p>nA$m{DZiil|Vv| zj|(@oo!3vr3mh|m77JIhWNU!abQlS4Dn{VTHlF#07*XIw2sWf$>Lqg$R*t^pCBeBi zd>lPk8@(yi&b|shUBba_0=rSOs4UOEVp)aPsrBk)l6Md1~H)8YvYD zeu_l`GyE>P!^k80PuZu8!+4e%P1x_d-MWLenMDxISWauL+Nsu(!Q$5r2Gr2^S7J_&L*Q;8ly&N<)lc;TfJSaJ)kA&w+F-5hen@OY!8{yH&^ z{B?rXF=y!O#9t$Z-qgEVGc{gDhYxpEb>uyyC!g^mtwYys9q$Bd7!W8A;m})dMuH*H^)2x)&Vvu;;A35|ilM zgs6P2Z;9(8^YZV_2tA_7_tj59lS_1*-E>f*sI+!LY?-c3meKkZ5;b9wnZ&f66qXOg z3cuNxen$!z!n3X;@x8pFw&lIs%j4`_xHj*%OWb!M)URY)LFF&Tdzyt( zdrV0jXii640*srN^q3zuuu#~aV>sgC%o7*lE>(`;`slCDI{t@+)E ze`_yY{D9G_F1a|e{`f@P$eQKnn*I^0_u={YUowdP!ozl3@*<7DV&1~9K0W^i!gBs< zBl_O{TB6*>LRsR!)+>e&Wa~iU=Q+DVD^YVzSWk za(h9Z0H7E^N&_!AgX*_4_@z`$5kx3BKc{^anz1veJjtt8Q{;d(NgM1HttHh!EEJez zN$jns#c&Qvj*@$9SN3oN)fdf}iM(u6qD5Mvg;x)iD4HS|fJ5J3p^Y#_8o~lo1iMx2 zC5|-*Gq06GO&?iG7C?I+kes#l;jstNtdE-(q$Y&9nj`e(6@S6tH}OX^W0KUjKV~1= zI8$6#=XQK#bABJla#?b=eSRU}IV1rkuin98gPdl3W?x|4UJJJ*F~CoYfgPZlQ`Khf zt*hczSXl;5-orkknM>ydvpsb*w`s*6^)>bhdC-sn;H1W?PT}I{7?-yHqQo|#r&}t) zenbKpUVv`_ggP5H)WOaiX+pW^#Q=BvFooDaO7`quFxY^5#t{;h-|}UX2BK%yruaQ5uVS8MTu&Hht0x zrnTRUgiF1obw(3nB^K=tPV9+2-TB<+CFUh~T!m49FMN#0Wmj?#MTv2|jy@MGTw)e4YW_#yeoP&cQ`Wy~@5lb^|kCA_@7kN>d*F*e!3UG6qyS4Pt zIJG1hTUCA4o4RzVM0VJ(pCK~E&oYP0{*fF5`8&uW#gtfN4sI_?D^voTU4=#6=|<*k zi7r?YtyS_rP~o=!6!I0y;#yEoee{g^C#F-(XG-%qk|g?$HE zr`FA-AeN^N9OJfBCP-&}iKZI)#9oze$*qNUsqmc4 z;}m0OppS29HQIi#&$p3^^sXFlexQ<+9jm-aokz&ByZ^A>KEg4#CvAtAGcaYHc;^!N z9U>@9+NsdU3;xHQh~40~xvFOivA%(y-o-@-?}9m9Ip-{;dOg52T`YH$TvR`&tKzaH zjN1}wtZSEmZs9dh&zqfGo8AxGirj*aTV7ir*`C!+I~!N+Z>z?hMh!n_ho8DB{q~8i zOJTC^J+TK@P_7P!-bwqvF(dOuyl+%iH<|{#f2wy9t3ShJ|Gu!(Ck;wk#BYea(ap^4+1l(8_WmIcs4;v4SkSL+ zGx!pnHH{k3po{d=&|(Byvv zE4S>w7H+@Tq))^7?m|_1Ho4vV1PT~yoYC*NaU!1elzPJwV6=Xu(dDmO_GW>sm^PfU z_KA?4%v1a*Ygmnk})-j5)1<0Qce<>MfH0^d+Y zBqu7OWzG}nbuZ4TbaNAoGNqpPsDm}@SVQ(b85DU{X z;|`qak->YcCFlAa`_eN3MTqkZ7D)b`R09@e^s+h#EoDEQKs+5ogv!GZY9(@jDb`0x z&MCgo5g6I!d`{VDN5EoO9Ragyp9)NXdN2?ShO!9v7^1s4No61!qba-sGz6b6}R|RNV zZS!V8XgyXdI>#w5=u%o8vjSdxsKoZV?1r+Gop1vkn`wr%cJWWnZJGHKG@0?xD>!nS z@_~7U9{KbE>4RfMq=R3eqWX8YUVQp~p<@ewxpD=}Um@uZ``R^z~KtDQ9Okf}g?uWIF%=92& zD%AQRq|5{{81j{v1%q=94?cHNPOy-N`Ucz3*3Kg`)_wJkg%x`eDbDG7SUFX;jC$7@ zmi%5-VL?yO5}Gw1_=9qUa57QKuagr(}B|ii~*l{!FWPEf-&}&9Y3#wMEyyOxM0nhkc2z+awypu|^F~ zgq=(gjKPJKEhIGgn2)f@;YHPMMfRFnZ0WDF4n6UZx!T<2mENN@DDTmqge-@XIaKi0 zw$2n^*Q)BoAXlNePQ40HW%lmyE@tEP|W-p8LKF zjHDTv*8^Fs0w@Ak{?iNb&E|Iy{GZ+_nq^N|w{A!`#Xfqi+9=-IaTvFiAl=JAc$(!} zaGc9PUDetO^m7>Oj%QqDnsbBxH6^42$DGK)>OaaSu=G@D9%HrjFkER_gkCUhCRAx+ zBy7aRLd!-!XB?c-yySK5Vv0{arW(DM6&_!M<8@f0zFIIFDi;Sq7X~7*JqX&@GmaJ; ziT9rR<}oea7!Ihmt@W92OgBkZkv2xVqjNRE?JWg`SLb}>FqQou_TDNsvMy=UEi*GS zv&+oPoOYR+q0G$8Ol4+fW@eX}nVFgGG9Q0EIx{`3nf`mO4(LlMcc!+KTY0l$#fo_2 zd22_cPU?l1+scXu$zdc;2>KS4l~~!-RY$iGo2oR*Ye(!A>EQLxsC%)~D};<)AvINv z7nhCfsJH&Qx%_ogU6eP_syy0aV2;kL&S>y9p(Ilyodv_HrsP8EaW$e@u8hm@op7}X zH8Q{->4A+Uih9e$64zBT!C#&VQ?fd}uJd%!0B7L4ETs|4-UTJwSzDw%qA`!;t<&N{ z1gxqvF&F-5e|0?+7MdJ8V8Q=bW^H=D9YLFzjZ{--w~%baT^7CC#l>Xhp!_W2o7HZf zMEQLmjnUPP&>Yzkq^4JV`N`s-6AzI+56q(EwNP>u20c^Bsd0 z4wjAd5!)6#-zcTm8-p>{NHT|7DBKLEwy@msQ*!!hN6JQ9p?4y(cn1f|w}JU~{bsf7 zE{t1HWAvjxdN@pC^z!rt4@ZaS&LH-N2sB4vC@`Q&Qj|gmIa2&pmk}}rb2~x zu{=N@I(hRZT3aQCsMEY#I&V2vznFM z2aUgpZ9M{=fAe^>h?ia#ey~$cJvdwM0;7z6SM-oM2E8{fP5c6&^BDQ)I>jzya(cgG zWF(XNCUWynBiw(b`;bMn16N-|Z~2v9TCBE@L8xPN>ZlOdKF4QQ^N=5hK=fWgB>%RTbGDcMRg36RwK$!t@dtDf zfmVp4*-(zfs%EGGyCw$bTAh>fe!Hc1U&_fCMz#JgD=gO&ynx4-Z&wrulC69h8+pNY zCDwPqZA%cg0GP;k@AS$!>M<9@`g{1q$_9gsdPdk$uJq4RpV( z?ssvOb-Y#_l63X@t?RTGG2gafglp>SMkDA6uCpkr&Qktxli79l7WL=JkUE#?eG31s z1rS0?igaKS`ylCJ5&6-ir?E{#qI*M*p*6xzk#2iTvSQ9h^@O%Y`AB|0{obo3T6-18 z;7^0SHf;6+oP*Eq5|#3TA82G2C^U*Ui#So4h$XHC^)^kMYdgS*VL(8<7bhU2Z4WL+ zx*CfjLPOylumPBurhsSMn|><65;Vez2FW7m&+rA{!r+>Z;}KKBU18H=+h4G+t9pe* z;xc*B6Z=%U9?skLFliY|o{~;$_MkDMlQLv-UBrr|^by}{%X3U3Iym$;`Y~49SZ2P4<}rZ%6h;4;P83= zn$2?1D)d}nD6#KKS>|0+{!#Pb_jJG;VA;HhFB0#g^;_}x$BiXKBn8q-uNKp{T1S+qvW}yard4p<+5<+#n$KmIGQ3I zMHonfI%1L@mlFW8(Xul`ScSwLGy#zl)8jYS?|j6_TOPfvXQF?B$FU>^pzji6>}j;k zr$zTGLQM_sqy|o)5OpLk~WGK3huobt8xu98|*B@OU)abw~=fF zw{YB=F_#2vn5}Tr!`J0}nL&RtC4p^S$cj6N81sM%a~0+<>99)j`c$YN>W8RZg>WHo zC*;ARw~4BBS!7?jLB)0N>5EH8y4!VPlCJbahOl8(VbCqon=h_9qfN*`5DVTf(*;F% zA8<*vnIc%B4q5(IFoll5w4?I(>Q-2HGq?(otH@Vsu2?j5_KJvPptwA}njFnSFhhyR znXFwXT(_0jMYIW2Bpz}mfKoX<1}Hv-f^2aLjw4ZgdPcT%Cq$b&Kc1*mQQTNYG02+g zV}+&L1S2HpQ(|EEi&^M*a6W2)z+uA&t=8=P;KBO26oXTTG!8Nt)6%THSYWj)DMzWH zb_K2NP=i2WB~jmHJG-V7Z^#p#a9RXjhk$wl>b|BDCnBFC=+lpEkXuo1Fn4|Gs$8p| zIwWe3s;e&jOnf|Y0!`XVtP4KBWd7*qsW6AIpJ^orMi(6+4OTSU|Lu=<8|F6~90HJi z?L8ykacp{!eXl(+!P9<$J#pts{g_9Lt@{{~AJr4+y}Ax}p;Q~_LBVUa=?}HPA&*!N ziyyqxwH4~meq6BSi7{UUgh{W9SPz(AsaNIh=c)wS^pwrpRRhMbT{N9jJW>LGw zChKUa+?u2l-1|Tm-22_y5XTTcG{uUGu|V==-qNp#5(0NOwR$p~3bW!B&CPd9BUb_9 zLg0+@#Rf_WUxZ}D0T^<6l@f4`b_`sK4!LWBi^rS%%L`&{sj*`1CY`wLZ6M?_fz zZ`3)j1VP%Qt9^v8lS}J(nse;^WoSA$hCaek`#^MMdE9rbgZ;-=%LKr-Z?$8sLu1%+ z_PYTr&!hT!&WKl*)#``Emn6a7Q9q>YPWdj`W*H~t80O591SlzO`o{epR>%h!t`*i=%pM2vP6=jMwhTj?Gdk)Oz0;}^ z25?qv*CX;C1WwbM5xeb2+nrnevj|5=*MT_RuKFJ$H$gmN{*@1i|M}=O{){JA`{kT6 zLHlnv(Z7tX|9#C&L)#%;3farK?3SRYgI;#@7tmPrVwG196;n9RhE2cb zx{fe9RJxND1VJA&mfTFNf@MP?+b=PK*~xYg&`!K%8dry8F1G_>+9u%-M?tm1F8M}t zO?4vyJ&SciljAB`hel@B0YFcnO??;Kci_&W7!1`BOp2ReTlr0O0d$;6Pws(Hpq|m8 zQ`_CE4={xHspPCcn|is>E7?t@{qYGAvB4d`zE)%?tGzoecImRgHuA(h)#%dRO*_X1yZea?r3A_0^Zibn0M_#rcYzmU!LM);N%Q-Hk0m7^{ zPuaR*{F5ev5eQ(HfDltxgy#+wt}TVuvFz?`$n7e_R`yyU`~|joA~zJ17L)X+#%s-5 z9xctW;O#E&Z&GA_(zP;;eoCG~4zuGB--Cn5odjTx}xARPhus|^0ghM%%e9u6>! z3*%!MnTXMDScZILKv1z>qtl60X)ZcM#H|BB#tmEndMO`MaMWY=Uw_`O3?UHkXVji* zfg_Qr!;(q*%utd*Xb7Y`-VyXN-JZmaAAKt69`=XvbqAz-(iu8FyUVENbR55z-poQM zR{WlfWRLLWYeNRo6x1U+MQY{W0^!$$deI*U>tnke|E2&A>66$yVz_C?aJ*5Fit;8} z4Rcjy=eb@-#t<~L?}kRJGJp-%I-tE#MIh)Oq&!^vsw1|zDJRv0qxQUNS!fLP?f@fa zYzNVuRutyBs=iPU-&ib0B<~#Wn0j`osDnux1>!>(XMyntE$RAO+}W z)AX)?T*BPQiXOMTJ~L=Ke((a7$I4A%pxCCN#MB$1@u$NFF|qMr!Eba$$2x%e5z5T- zJT!u$o2~WXBY}g7oSC#WLQ1}YscP_In(4ASm6c`K6^W}8g7ysH^fyL^UXMj|PsVSuoEZFI0MjkDMr%3=h#b zPCYL8Aw}{2owC4A`hdN25O|EtV|=!xYqCqIQ3K@qE6?eST#20P6^aTzXOd-Ksa7Tm zwBHF3Ipu;b!sGJZ7i|6=Ck!N`=mzte5>grCV@)SiH%Yb;h6GfW2FG^0yaacn!PR+D zNdrf7z2tSuGgW@O8jY5DHFs>8QNWsw*1IhcOl<9RZIGqOTCBniu$>eJHR3#!Zj{e} z=%K?|)<{`KM)?$SSj~N}R4ck;7)}-U&dsI0q72hbsd(`kq914>Wspk!x!AzGL%Bzg z4Kc#6koUkLI)u~Gxb9&B-MiD(Zc?Gup%+mSUFv?^7w<^mTNj$s?gVMkYA7^~n^m{K zhad85%6be<&`s`fpe1a+;B>T$og~CB{BzB>-)YfXsFB%gn;M|p zjDDF5EdYmWjxIJF?)qtts??JsH!D>bq9sq-aSuSNfbFV;Hg3eLDToy~FrPpJ{S+f8MAX4A7egR(2z&b!ivo>+_0BH%hh|`)eE*UJK z48~P+S^n*-7TnyN0WkWtO^q!=+O5nID&bykinz8?nI~^a(HuTlo4H1fJ?Ly+en?lJ zPBMBmmD;yCf|nTZ8$SX9Y&7?gH%$w0%q6SSZFG~&`gzvy?DQV4EaqXMG+G+Ex^2~{ zZHHG;(uk&9>hn}MY4gW5no`QkveQAYkMAW;z-0K>Jo4i$(HEF<3p9AOPrmyl}%vImLtLTpia^5sl zKm4|nVM>xqgnk)j`nx_SVH{yo&t9E^d+4|7?jUD}MpQvR|LOFbEpzxar|Ue)3>Xhg z&}rXB5j20(ZNKe5#^cvvcy{ak@GoT>=AE3k7)-|Z%n2en?>Vxtjm5j&M<+IYD1qQy z^HBt?CVU`NeVi}-(JL*%ZMnN2M6GnqGz))gELV$;WRX1ktRFo*CMgkWUnYsW52hh6 zad8XM@jPK6Hj}rDr-VCVOUW$~?&llT(=IsadK5HvWw)!!dwgX~D|T*J$&geL5QkQH zkns8{m5iyBze$Ej_8l3r667MwG+|zX<>hNX9M!5*`Bau`SllEI^LYjB9&K3{d!zZ- z;v+$M{0Ilp4fMqu$*h^muA+H*-dOcB_cj;jTZ+z>O)qxemf7M^mvy-ZInB)yq+ zt?VlxY%#H!d2iAlh?at<*~xy#q4Q?c4dZ5`)2~@^>=D07VOLa>|K)LX9)f%DEpnn3 zuDoPV*6v~v3e3}#>uMOjoF(c_Z$#x`l>SEIMzQD7X_!7{;w1L{*v=>laC6u9uX15t zDruJZuUZP%zpua>>RbO8X`q^>%^Dl3w~p^yNWcZz_u1c%v#b^`LSLGHk>rE|hh7HE zZ~(=r(MbG0%RtR%m#~z*rKEFRdKTp^cXLcgh&Y$`+HH^D132yHZBqSRZlF%_9SY=0 za6F6rue5zL7g9P&nfG}4b1QaB8;5vg`h zNahr?DRRjS2>lE}MA2A&%9QVWVcmp8L-{ZLU$dl1M63PBbFcRHekD(?8SyUX-|Nuyi6M*IxJAv z!w+v4VcG(boq}SoH;uLXZXH8Qg$T;mOvPSgI{|hQK&XmJ>TvQ)QkW$a`uFg!5U$?T z0k6{^()L@1N#7Vrzp5$pxpMjvcsRIXFYv6?VJG20?(ZN;e*OkZ zZ`scXCkAeCE|ouyP|@QQUCw~Q>+^lBdQ_$nAyaTTLJ)|IZ9oh8T^|z>t4B)N^1Eod z+si~+`gp*c5P3DO|7T z^TQn^7L3B&o=XTLDQ0Gkj@y@bG>#BdUO;#VcJ>;WD=93CsZ9(6`5)9E z)ipZD0auN=ZZ#b4f4Uk(ve6~e40oud#=0Ag98X{RcNs!x<&xt)!_Z11m4q9J0HU=m z-A_Xw_&vAt36-^pzw56*m?UaNj?};>$9H3R>z5JkP+{mM-%E8Hp~6OO%O_7~^oS;I z2`4|@L{^pODSwQyNEF+uVh+u|VFt?EVo*i>xUts>*5fgXLy;WXkUiS1VO;Up$~f<| z5$v)-b78!s{;>~L-3A$di(g(XH9?n5ii7{Gra-i06EvwqE*xKqKnA8@{JbbLW0u$HM)UzpZqwGjSFM-1 zaf887ELRcXq{jPoGbNus{o)3rh7W06W2p$GtfVLaGx}zD{Kz%QuY4=H9kQ0=6gzAU zPDoZ>yPS=E*n6#N^kC0o@&cn}fgw3G0=vQv8cEExyK5p!F_gh8-hOLkpwf>s!|isq zzS*H%|2EhMeKvoI?N`k~OHZodkbsEV^iJfV{8>p>xg-+ARHze zA5KmD3twCV<@pQSmUWz|_U>Ca2RFccxyXRefuh2F(!0o%$Z ztmaH#abr7!w>v9wA`TCr(ocxs&H1kEBI>JKdw1Stj$8(7;5@U@7)V&aYw|ei5(%Qa z^b*O6CeMLzS7Ca)=;jz2TbOkP58sx}=hSYqjpw-4&;$LBedzfz|JvGT^=Lh{)$v*5 z6wo&^M4BPAK-ni)X&l(R5Xex`&8Zn*qfC@f!G;c9q4TEs5;!_`_#kj)xFWqsgp3t^ z1xGwJ@AZUOreBR|qT7WY(C(NUWR^y5wz8eTC3eH4sL0;_bk&6kNI@9cNd9j6JTHI_ zE)?&oS@6fY)cl-Ow|s}8!-pfV9dt}Bm`H3?4q}Ja&fhYg0-YaRojE5FsTvJU=F!FKrLI&0Qp;0p3ceXD^^`s5HFJn;AhdjG!Z~>vt zw(jzZ<{mpWE&sa#O_o_CMwm5>Hmwzen#ee2^#-}rPsbppJ+4vt-h7Q*Y>GkJY8lp~ zG40SO6Jp2;pp=n_*Z%;R)V zK&$j?kj+=H^inlnmqSh?TA$xCw=z(#%zeIrSjLa>WB%)u`r(I5Eez9!utoD2pf&gV`T|h<}k-O81 zuV7ok_Lrk$y911mW7bdmL^cc~eam@b`t9p=e+v!0ils4@Xr;8Dghma-hBOMuj1dYz z^kY#n!!7Tc<#QHhCe60=5pg_R6HU&s###jyaCO2M5eW4O;#h5-B!y zDUs4@7_FlVV;Xr>x58vQnY`l%KMoxpP|=W+PK1%r=m8BMBO$wMW~H~g2T3189qrnq zuTS|M?OTrQ#jGcmPSp!%K6eM*KJh{>PeV4Kg53J9SJqMqu>kYe zsO1RfPJ-t{Ve3{4o)M`f5q4N?Tj8{*3DvL3+ld69qQyaBM#Vzrb1^s%_im zUopU$xhmGU`YtX74s@PEfQzQ-41eGn9bfi6SPZO z3kp#XbYYS}fMYQ4!ratVrCbVXkO*X{2J^o7)%+I(Rk?xk`r`w!T7buRUm$R>=&r^g z5tV{P+)(1%Gu}p9TSuGa3|VGzDrn+fVSEge;*Vk10Iz3CqKVxDF_+`&E6%`YX|5?` z&XAQza5$aG)Tq7!XnWH68BS4&>$Gl~9_~C<*K0rE$~-5B8-1KG-s(G{o$0c{(HOB= zh6K~na6rY6Yxa-cLx*JY*$M(GN|$@lg2y4=j9q5##pC~4FRv>n%A_-z~w=i z&Z?i7Eg({8#;33R5(~rFPEkq%RwI21^$V}UG%6Cv9^6s_E~8CkVcT%lO~<=N^$po; zYYsE!>*v1Gu03bDr-YsCg4Qe&SGW?QU1hk0>K$+kpAE<{sY{0LZnfb_O7HI5B$tU; zvD$b$*Jqg_$EJ{VbKejx-IN+s?SpWTvPz~-m)o9A-Z7l|ss^he5U8Aca0s0nGURTF zTRDJ^5e1H<;rvQYz?bO5%E5sw=KQgP|2xLlaugWp82kNIo;qJSzFwWOb^@U9B<#Meu@bu)un*( zNXJtS3mUt7KY|a+kN4cVz@{C6f8ctlU-?H=elrEzD#B{W#$j**X?W+02F?~Y1IE8| z0k-^;L1didkmIIP^TRi!TQ|CjzR-}p#z>uxRt!Vftml?6;!7;4|I{Q8kF%o|OTHcx zhx^6>-ep`v6(`{9u>6xs?s+bY2=yIBO0dLJ2JhCfpZ^srfa4|Md1VgF-{+PjDO-$F zuD%%O24}CU4cYE{RIF$Cu&0DCmD_nL&;Aj4=}FQbI(qv`>3+GXtAQ=Xpe?If zInx+|Ia8xGc&FirgV9#dx?n_cuEZ{nnCoEVl_R+(Sjol`HMUSGX@c9AAFiB#-Mo2JyqSz#d*=lqm=nPNKs7Cwjqnc!@0AN0$;%}n&^lI(<0jhQV&#w^| z<>q9!#@QygI4Ua&-i~Cw#ChXxDxhy~=V#AY0*o)dm8Mo#>cLjbZVYp=8%?NL1eS`0 zv7sH+2xS&CbBlMd?ZpK372k1-)qDD$M;$rY_DG7d0HuPCKI*(17luv!#IhoaWyT5n!h{EvR6QBXpWBtF|^Meiiav1to0j7e7e(UC$?$f2vGTcLZT_f_(oAjnA!l9pF6cwu|z~i zU)EtlR7fC#4983wl63rz1Gr(vifuL*IP_0=aM^_B>nO!flj#Z)xXp*W66{I$nJ2G; z!0)d$G-Q?wA)ShSztv{_Ix#jgAxk-7F94j0HHSPr%>nb8XNR7J1=LQ`#tDVicGs=t zuN+Hfu2rvG6W7!mrprq!I#w=D1#?G@8?T0$oE45s{W^hrscf8hhLy_V>J|%jQWql< zg^xxR3LZ?W_8W>fDmslMmlk1~E78A!EM49+V|2avdD3c1}wW)5V zYg~>>o;+LtSuuoRR9o47G54vxFyIH3DZObaNNSdUKIaGQsYf>ZYhQcyIwVSNvghJA z%>nKiN-n*_wIQE?P=nu0pd3rl=|@Xc`4!C0~B!_ZLQ zCKwd{NGQF1>gZ8=kXGX|p}-rLCXTP~+;P|%dn4US2$~yz6Pg*ZaT3)t9w;SHd9`!Q zpiY?GxlB+GT0~=8wmWyRgAnZO%=5xK5bSyRcIuRJy3~)wZIHW}K}O{66ymkRA`=;W z@TYP!p{%bR(z4gz17sNsA-jZ-EB!cWXzJ;WLY!9k4TYhIS;5O8JNsW1kM=VWCy8Hf zsol8$w(aI|+x85}E0ti=tIZxW3&%pT5~-=0C4<7KnW$%?;kO|{6@9IVckQEKu%fJUdS)Cak=W(GW%%@r zn*F>Hekrz-H+eqdeu?xRV|sq?I%;0O-@qLdDSHjxec)Ham2paOYpdo4`cs9(LzM+D zr>L0ee-g0c&XAg(wp+s068!*#I`=3DWgGcwYF@+)t9gbGft;R7}DFY!V6<m+m7hbh)rCy84q%dEo6ID%Vn!v^gv`-cx0<>i0qb|LLgyd_<;b{!y*|QhU<(eE?E$TAik?^G#`%+kp1m5^ckUI}Fbz50`D3q$>D5#J=+p^n?6bdM`TNl>T8ut7ABujR~X~CfwWPn|(StzTWsCo_wje z)st89?nX_ImPJ89@6SUAgfng5L^zjt59$CwV#KU@fanGNthBv%j%)A2WjeP-cS%x} zE1cX!Swp0~3(mngqQ?3ah9wU#x^YUcFH8=kIGw@V(vl+#saF1>mC3nh+$c%01(yDU#~ zxj2g~_tCB^Q^v+QA9~MsUqrdn-!=^PAdeHEJgv1;z4@2xdHu_+&pD$@(vY{-X>Ygd zc_IwrE@Vg#l-1E&QwCXY13XfYx0`S)Pa8z_?7dI76d6}?j!auY&a@BhH~e@eYu2p+ zs^3-L(WZtR_o7%&eVTJioPcKf0Q6wPQKR-|jb9sdwt%%tIxX{6Ms8T4# z;jIM9x)310CTxcH=;wtY!2Gg8fJ(cv(l4oy=gM*Cln97qPfv&OmL6@T(rITOy?<0y zUp(6KX}plA{PF@QIxuaJVcLwnTaS62?tfC8ZXSiB^uIjPk_=wB>WZp1I3<;~UzBQg z1)5=#1(p1%MQI)d`=jR_xwBy7SaZUj7viLTX}}?6{R6_oOSM52m_-vyBX>E-EZ)7` ze0)^q>UcSaY;qUEo@o4{uK;^-K4(>l2w<7IZueGVe2bOjq{olfEVJ2Mfg!!2PfvXP zR-VfDN;#`4&1%=V1HJNx<&6Z%WBuEi!LuIb1mSnORr$;_a{Q#*@NVo_9jb!d)s-@#c*K(-9I>z7mK0&#w|9Bza@b?coAN_^ z!;Fw(Pp2KkspbY&Y3FwN@P?+d+8gdJWpS*#l|0sXgJy_a>u^Q2v$QO%ezj!-=Bk>k ziOrie?qH8KLiM8a(!=?2FPYmlLYGhbV(VFr+2VS|qLSc}8}>W0qPvi%7L6-idlyAn z`a*0X1iR#78mq2H!((S~TH)Cr^}q`2*Ep6g>vR$0wKq(1Wm4zXR_}aQt2MX2b6A(I z5>F9F3@4VtF62Rn2WL}Y=6pz>o+Fa^1PXL3#8yGw<}+TcT#fs6vZ>nd@k$R z2hSeQU!)$5cEp4xwxkae9!=ZOk?yHMP|ss9$tYg5$I?ExYolhw7k?hAycpDY>g7&` z;;;+LT>**pcZ;1H@$lL7&z15nEH8fj4BtCHsCNEErg|iu>(TKAR(ktV*%18i!Akn3 z2Ku)D6n{@q@0j184CcD4lwkdhE}i>kwM#W|K0iDp6Damm4r)Nz>XxWxPClN} z)p4Ln3oc68M+2C-x7eApe-7Q#=`y(f?1tdZSQj^7Nn)s}*dj{uPD%>WC{;=p%_>Ce z0KL%C@=vcs1s&1o-K^S~`fyI7C5W34c99gUSRBg>6mAFKa`v@iE2jlGs_YXg*A?ke z%s`usNd=UYX-rTpzs#TcT&C_;?WiQ85xr=SeN#$IS{aNzUpZhZ*ApBl6s?M@CfhGsL)g?Vp~#|(eiA-d@_wd661CsG;^@&QPJm7nLzj26=Yd)LZC?N!W* zK05-YmS6M)DnIS!U-VoaZ(3>JAI~$4K7|MD$MunKQXr6brxRUhcWv3xA2CH>tucE| zsd3Slar=7OA;{k_Q$%E3X>gGud$IR8-yJQfdgM$;dW;e_5KoxLBnv|D z%llG)oEL(pHyEEifwl!gTm;iAs5Onk;5P|3tigwIcqYuDU%w~YE&wIL%HK~325DJm z&Y9G}yf;c{3o-;2c_(-($Td9gg4M`x&O*cAY`pg;e8|qbpGK%DhwOkkDJ&@pkV{Q& zXuiaskgjhL#GHU%LsB0vVV6#HTo}A<#Sye$0GJM!Q~3jIsl-K&XNN`^M@CA(5u<7?9~LAVMs%o&{NFwZBf<2F?Zcvu`N-kQfJm zb7sR+^lGI(xL}})XCeIWzk@(ozzqOCzMaOvp^~G*xgxrG zx}k%YtU%FLZNK|9yOnW7^G41$v13N{C`Cp#^9I}7D?La|4($^_yW**n#^?%At#?x5 zn?iT=h(<>{x9)LxO(ihru|00zhK^~*`SUOM>QzdNUl?COf#Hj@@h@1#f36Zay4f24 z7Y6|4EsHert3nq3MJMe+d?n2=u#Xu@d+99yEh#YjW6Xenul8NY?5{VUX%K+-2g2F0a zGwt$1AOyarkYq2-RZMH8Qo!$POFfVTorIIYxbqctun6MnIF=>TiY3>dr!%qp(hm9M zq}43**w1sgakK&Eg|OO3E0p6k3dV6KPc^i2-;->EkJ&eK;K2kH-(PkOhMy3pFLSfhx8=V;lk@*F&~T85}3e6()jy$3jGh zBt$mM!#S+8g_fl?Lj6GpyYW39e>=W`o%Z)1UkUV}o|6RIvw_ISbXRug0s%yk^}_YT zzV>fMp#JMWVrg@JJ|Y>2ks{X8%T2tRz{ixx;f>_Sasmg6dlK|X^r3;pywLrL)Owy* zh_eN!`|7a{Xhj)I+>C|^3Htn|%tRv4LXM?Eivk^YjuKFeAhLZEWB=JFk#bF0lPL@y zwv%K7Ogvb1kuD+Byd~kU_5(6hddK{+S(`j>$CQ0+8q1_l=roT|_6vS5tQ#tt>by#f z!2L{s{~-BU;xf-Idv#mb7V!LL#y-w_pGPyHJmxVE!d(fTjrQzyx5V`@@Z5aV!?kqc z6}`6(zLYJtArK{9>JE>q;|PLLzOU!8kh}#S;Yr5qYklBN#tf|4syhH8a*z3Na?{?_}|oI%^d%WwU#XXmyyKK70@jn_=Wyj z-kEBf6}!h@Y{Q%oVFfz}Ce*NCFpfB)8L`(3?u7LU0;&b8x&U0u37d~QLQ$@F7dgxh zyG?(TiA#=jcVw}EUU5XG;khy;i^S71+S`WUVj+6^&0bPn8pwDEuo!1JAB1i?`wdMj zU(1KGitXttB3muO^a-x7!gVs3L?RF7GN3_dq-?S0)V-Vu1mWWpf&VGJ?`!K-ZVbbG z1PAz*%~5Z$5XYR_Coa{n1QiRM_+`^OjGMk8+({Ch!CDSKzswI-O``UP?glI=2>#1&C<2o_62;Rpc#v;1h%##1G z`O)bsmS$43C{b_hcCDv2GilqT)ZQj9y%=+ak$PKnTYW! zKG27)RZgs*_R_@v%-niXseVj7UIM6_@$}p`PcYx5%7lcwmMm~l-Cvboq6ILm?Gm+? z-ez*TxJV{aJe_ToJvI!6fL_HUAG%+Cve%=9`PzU5qO4I!3R73IwgA=AaF8~D z_{}w{U1HhIlJD5-Wr6_r)9D$3EDzVxvjaaKpc|N|3iMQMZ?!#g+O9B`aGq&g(#K^+ z-a`Gi2ba@r2Y~fx^Tt?3u%@p^W@dkLT`DCWOZJ60-YbOWx4w6HrT`yZU(e}GF9{}UYQx3QIN?!Q6?-2XOf|Hl)JtsU*n zjQ<;T_%F`tUvDQ@m~TL!r(eGYJ^Q*;CXYq$u_1~+33(4V^FAMIC#}f3v!>@rpnI^G zwZmyI?uJvaSvTG8#!d|YZ? zD|Gj1@A&hvKc?T&-qHD;AQ^t_!1?9f*1OSIi%SQg`|Zu_>FlmJ(lJHu;bHNu+shR@ zRF1*z=^h`bhnwD^Lw zmP6T3m}hSehRuzxi+Pd;M%GeT6#;Hka2E92R0V2SY-SXN;@mOiPHg6b zs~!^MPK2P&Q9AOlOsH&Yz%oQb+-lsb8ce@AxR&Z`O@IE%TPEaA&;nj=h2jvt+n-VGpe~)1MoEdI?gW+4qPk0% zN;K*T;Fa4Ny;Qsn>f^O{ed0vR(n1y&rbJ2A5g@KB~CK1;OrJ=%BJY6-QP@y#{ z%vxQ+d6J_}71Dw*X_?TH8HCS~ZSIr^F+4gFObMJGP0sDvP4Z`?ujx+uXNUak+|zqaxJHS?MH->mZgQ||L$!=(Q`e0+WRchCM8_Va&) zRvs-T-6;6doX~$cTe19`|NTFn{TFH3-tntN{8x7iar_5nvis*Q~z+ zjF+|VTfZI#Wt||lZreuD2nvZj8<4hE*d(!Buu74kf$>P}v6jaD7Iy(%7skqY(nx?r z7UxeB7TlT4I}nh`3Isi{{MT5xVBD9DON!7Iig;p-QVFGBKbfd@Voy#+I60WmwufMV zE?R>5-KXM($dVnR2x(ZSV3u*0w$<5U510}qD~z&$Fm8kbF4Um*X{Ep_XjKi$dN;PX zI?JPPzMuyp^5zkn#!Hx?OjP@`u?^>*bkbjX%Ouec%HljwRt!XY7=`D;&FPQk)&*WY7?gTs9ps8)u3EjWt|SKv!AdXTT6bQU1+Y|E3Ylt z2|ArFwECX`L!J`)sI#FjxOqK0*^&}Fcd_cidPp3CkO7SKVK(xRo=^CYcf^FaR{q>3 z%s$^1Id=WT`yu(5`Q|fJ^w?5j4)J$ruZapkkkgb=jdIzVhtOjXK?P0crX_Z=Ab5O3 z*X6gz^OFUL6@w)ZqqMzq%hT2M1+>j?7_L*%1X)O{V7z;FlKNuX*jggj+va~Df8txB z6TbjAmQhTEYN~9D-%l}$O@_j--3&hIsmP%|?Iy&F9l4_7*HSy) zb{=Lpc{zDcjupd;#e7F^7{bJVQBjK2^|g7T64sMyr$WCUunIeLCD+3u5X+Fa&286a z>CJRxs}O5Oh-I3AZGh^KT|+;FBW#-Gigt8lbeAWJ1$oZn$+*B=Y`ajivJ_IQgmLjc zzutrDIe|f$*eZ9d&(C2XVNBe8>Crk;W%khTNPjPxzr@H!0XRBmWC`L^j{dl7D5O>< zm=+gG+*)eLd1Tvi0}kA0AdmAyrugwxmu)Yd41$weNbjvr9p{dWbtvB?2n&?#iZ(yO z%N4B5kCUEBJ3=l8p}lL|6KP{Gq~%?ol~T-0fXI)Xe+m^N{Et{_NBkOj6UlTe26da zsWjLz`&AtAy&T&A5>L?al>n~b)zb-6zkZlSS7csthCA}=WxOT0zesq47gTc30LY@% zOC+(maSSIdS{l5)%)N5KO2WkquH=`sD}q1v1J_Yw2bE1lOk!)l65xQ5&ghNIOOaqs z&=NmIH1eta>NJGaaPDT+Vt!51#p}&lYC1BeH6zV(&3|X$LS~A8-LgVl=tT2KeGYvB z&k>{dAW!JH3*5aaf`R_E!b)E6P%}sHdmvz9Bto=;E@y#fOBHXvjN5jv=eY|eU@!>J z^I+l`$fsLY${|%x4e;h*p&vh5(|2Xmas|@p>t@6L?F@M)%{;tRTzos7ZKg?wQ znJVy~@9+PB4E$#+|8LsB-?V|hX#;=L2L7fE{7oD9n>O$_ZQyU(!2g$M1OF_EWB-rO zh5xrg?mx>A|CY-AEtUIQD);{bsoW16ONYd-?wRG6c;`PqOS%~S{7%y z4PM?nH*dY(QZMi(A1{n+9bJLqg%{9V%(9kYV`@X~{nT)24petfNBAl!GS?ZcJ`?S} ztBau`{yDW#3u6Q+s5i6ff~ z_{;e}{s^N7g1U@}61>h>+9LFaByD#=0G+A()fx!l|7c;Z6AhK!hJc5Wp47ac*zoHI zx%ZY+TQ4VIpqjlGdOU(mbg=jq&D!8jTY;w6WN|A*2dal)z5;|G>5ubAcvs37lDNdV z3uXs0qNz0ZfOA3vIZ_B*cuaq~b4?|J*tDKbWx`66-oLSB2p1KVffkva4MB3IiRer3 zMzA$Av6sJ>PmVVmHcEPoi;(FVn;I-Mi1v680Gc>pX3TZpZ-K7=Q9!OvOu>LZm($zN zd6~~x8h?%jaF)eF<~gjEx(+{Q#n1SW=hk34E~}EdyhlvW0$=G~;b}uIM3h-bSEfcl z@b2ZQ)W|=>f{kz|qGLsH!4ktC;->t&een!9#4zE@dOhh--d;5FlMy|O>N^8US3&s^ zm#t?K*XVt-#maq88fyx6mCoWSM;D;zN+YIHrTo3hO?D5RS#G|8x+H}YRXI2ccuZob z{{Ld{o`NiCqlH12ZQHhO+qTtZ+jf_2+qThV>|&Q~qYKmLpSk$YnK=>PxtNHFiSH_N z=iU)J@@8eO_g!l}WcfpQrZ|v6p;^-)g?a#U$inN&qXGJokHCt|sWKyzwhZ1-kMsB7 zm)YN3^UTX1f_`IZ5~M3<>&aA`0OWMry;TP10Jnx|TunBo~k zZq8WHU;hZxm!r5)j$aCTDFV9l*L?%TLOH?0oW_(ha zf|H^X(*_X(qm=AOY|Ns%^zJe@hJ8mWP33-%@>Y6%xAqxbsTkC1WIjS|4(Rrud&+K% z;{OsiV3z`UQFOeI{hXT@SnuiAcU!)3SZynwJ!Spbit!!LS{BxKFk ztX$Y07O<*?G{u7Yo z;tW@~P{MCQ-K2#pX>5*~KVSc9E$(UEm1pNN)Pm?5e7TG>V*TN8SwAXzQEBOA`z+=o6J^=kNOj;0L^S9H+Oy+Uw8%+Ef0&i+uk)1pY6e@1MOa{VVnT zEA{;=_5CaL{VVnTEA{;=_5CaL{l6{sg=;T6?P3D~9T)yjaymQXzi{6_dZD?>{X2$I zswps^Qs_(6^u;(?js>|go8PNQYKnqHMkmP~1q@X5r?oDw_Wc5RI{!p~px<8U`&1gG z)4gNl=q%jKyOw@U-F20{3S&Ms!sAFl^vC3*K1yzm#e`j}H`UDksBiOZ`kQaNc0I-e zy-JjT|05hc<}_ZMWjl9Oyx>CP!_mIG`^z|d=g{Vj{VFb4f}rvx&ICS%Z+jzPC z{fup=c=m^P87WRNF(Az%nM+RPkzz^#dMSTiP|TE$z(<=6yO@mc4#gW| zhe;;V)A87nx(`Y|iAe6W_IAf4MPBJVH-ai={}%DEbh(m=h#%K{E~;L_p9Na7FrPfx z>9CxN|4D+BEzisfsc6X&tw8w@UV>QM`@n-L62swgWiS$AQ3FZ zW{+9gf@Dk~6M5WUZQS<^jCaZFGHM3pIK*cqrI9?HtqT5ji8rf^!^@66ZRr16XxyovZd%_PzU! zT}bQBkPcT1mSRD38S3sHAz@ntxd1?S~@UH+S^R%I~GacG76ew;-F98$d}m z@{CrAxOS}XS~l*1vU7m61+5#H1Cb*RZ630+&3fbmvJ*UK!-X}Qxjk84B3CA>cl`gv z{Q`=hMG3c;zHguWw#;`ZM0;1oMw3(CR5wGYn+KH`cqM(%LFwBfcV zg&eU~tW0QsYgj`k*gKUZLMr1g6-Ycd=O&UF?~5+RHjx+3Vu$PC-2*o`-aAxoYsrE% zW&cr-MX9Sd6GH4$u;O4;ONiMCsRItV3d1w&)BcSK@6yNF7ugO-M*QCMu6NQ9%hz2p zTb!SCv<-o`%2LDW(#}BJXsBQ_ypg7BJgq8-fo}?C*1A+`>-ZZkSGuseG||xDaHcu_ zbmK=eI8F6*=-i%Tb!lLfl~QDqSY@&S{Ls<;i`HFEiOBd38 z-nrTCH-OeZ>0JUnX=;yBZ8K)owR6DK^?qSN!VUh#Ea{}4Qc{2=61(Jm(-I_dP_S&7 z6JX&2BVW%d?>rVntHP!)pSOGaE~YAZpF&M-Zd87N&MNO%R9RixVIdO%pcG(yqBdp9 zBc*4choCNprLL2@gDUlkboN$9Ym$C6D0rkD+tye(v29&DyXU=_OcV6JN@%7Le@ef2 z8}}ibURs#QkBuOQ_%63zEFCSmS!8=?Vr7XSU--$s#_$ln(IdTo2c12QY-bgXIj8Y@ zwv}X(7X`+od^~=30i*gS+d`paX-rU>!p#o!7j0&%VndkGmfaciEHIX2i1fK_^7!ru z`%dMGk_jGdtm()IWe&%}5z5@{YWgVKoEbLq!I~)^z6H*Es(^3t(B@|nchhxd6xN9V zR>TFIfMs^qOLbT3ZHs5DX`GWB769j_j3u68fOxx*9EHt{{bht4_U{4g2BvX`KyT zlKpt*()4TpvaSHDxXQ?>J+Bw--OE&QJ|P9!5^$R4itA@<%I$ETzaFRUxeQ}cPiN>0 zZ1I6>s*&~DdX3Jbf5Yjb--?~V4y79A8c3-bgYIH#F5Z?%5JwXBXw{e%@Qd+IaI%Tv z3@h4;5!=phK8(hiWy?lVSD_2bSls%PYnlMl9}IK!X~AL=ceHJ$3{$MVyy zEwdqz#>_{gF5=`p{A`F7I=-bEyjI@91vmSc;V~;U&_HTzWPL#6<7|@~-Z-aoiZ|6& z@-oikv$RD%{FJaC%I{gR`7XOe)@N>ojx0Z|{XWe!DZ8s=gx7b!uD%UFiaLQc2P>GW zntW=m%JAg`~JA0%?6S;K3(0?H}Ob8HD?C{8HDIc+umnEoD{f1%Y$Sxx;>3a_*C1hB_vi zUfqV;rQXn$Yp<*pt~~_NCM|h8#2BLvJ7r{ULN>eJs3p=_ZkVy}uwjh;mLlcW3E+qi zZwxqBpX2<^=n=z>4dKRlOeRSoeK)4W5*=uUX6-RBu_2*6Abn3eD5FT-if@xQegRBaR9NSawqcmOPeqH&Yuxq?4=+E*=cY$1jsnMADS z6C<@saG_Gr`x8(8?mO8XCHT0&og#gEJCR;D8-#d8ZrA961Dq8)3)8o7X8qa%w>pdn z2D#k_J#lPe`o}&sJF~q>GSR`nfrSLPSx&&Zx^Ab_tZ5bV?r{bC-AgunrQwg%J>tyz z#gfo@0*|n;7(NB|9CC-|D3xSmww(Dhc5H84K6qS>Pgkmul)6DWwfp2tN5M%l!AXRd zWV!!`55Fz?kWCIKGY=`(_xzKj{gd!_DaBLzC99+?6Tkz z_C#hIK64f*s;{5b?6oaLDeez=+ns@Emz6F zT2)#AA1NhAK8H~PK%8?3ZQ?C!w(OW-tB1OCosJ}LDxy5iMK87#N4SeuEc@dxuZa5K zu_+0DQnX_h`XS)Z#L7_kmuRy`-Fu)Oth~x1}J5A*~_PVbQdbX ziwrBxU`aqSC0XS}WfZ~u(BIb}3Z3HB&t#bk9M`ron@}|*7kxxV7o~9;ZaU0{T5XV# zP^YgoeqWAa0TW-2<*tWr*Q)VtTbl9K6!VW0Hj>tZDkS54NLh1f`>@I=9YB@__L4S? z&-#gf?VVPU^`~!h-&L2)^(IBReHFI6+HjQC#OVae*$=fH4h!d+b8!a|U+RFJY)4Qb zG0yOd4b?)h`E90)23dERM7Wdt;h-`}qqk&U3e@eyism@F##jHkyQv@u#1-PD0(ASl z_k5$TzDi8C%wf7^*CN_X<4gT{Fu+6!p`40EWssL3i}iFzVr~+#yQTk z@bX+o)6BPaan$X{^P#GJB*VQ;#HlW27e}_uYkn)&kBN>2qH-m(I%?yc{5r>yz}{kL z(|!S#zac62c4=kSqqMq7XkppJ`6e~Bc&&Y6LqYvWHDS}Z6tu3%#0@{l z7)Q=^bhb&Cr5-aiZjWCPz#k688zE@f78X~q7yAnDUg7T|<#|ZDV<{^7QLnz zo{60ezlA&A{euNE9J$%fNs_;b^k>SYP32?nf&p-w${Ez`;l#Q^tP2v$86<4RC8G|U ztT8Y7M%l!#pju?zG09ArCa?Tf>SS4XM!^I=u<$-_Waon!0lObD=D6A2F|}royJ2^; zs1feF8R_7I`L4qibs7-|W;_1=Rp+a_`$Y}?4dZPqH) zrmbiAgM=I{bCo1K8j4b7l>nC}zJ}?EqUpDt;kqAZKlCbqgO@0qa)cvjnyE{H8z>in z;fc2ZJ^8l_@@?=cYA7QPR$1p4mk)S$0Ra%aDSkhxE+#tMfz~fz*FGz(Vgr{zz?)`q z%-|j5A4Nx!*SQz|2|%~2=X zU*hH@as68IRO+)_G_IOOk&j@o$f(_RYZu{f9ee2klyvE8rxtVVdWgmU)3^{?`wf#V2r)1= zA}$LlydY|#p;5YX`?6*+G^10st^Ad>sX6wJJ`{X0%ZXv{8eQuBA#| z-Dc&dRFVcv>n!OG@ErVbxKb@!e!XToE1t+i*bK(7W-AyTx6GDna|gXqv_S2m0~NO? zCeKMCk7vkWcv6Um*cfCh1tL;a%u}21^xvta=zk^8?#ZaQwr>%SUD;wp!m6_aJWp$= z8co6D@~yD=W044hSEJ#))jYCzzl>Ueb3@|KyJ3P=~u(5OVWzdOkUz`x;ZXS8q@ zl=-6HO5;rR>2w{Y1d7jAqsGba^8IDKfu zU(|_;lj4meMV&N2oodiZV5@BqyHvo@ufG?7^vH#nf4Q;;w!sl?>I5Of2q}UWq|*S$ zgPmRg#iQ)X1d`$psDo^v>}o+;(E{T`@16nSlNZneL+}V`LZ3$C@G?c%#4pM!o{|Pf&cFAk(HwX^?@gh!jL8A6bN9yek05c%QxLwf!?(tE>6rh(}Ey)t?4x zUZhGQFzpB7Y@3MmKGM>c)#j9jiG{Zj>`$0QMjPU;=%NNB{X$}w?TDDbVMBn7Xk4mQ zX8t?!n_n*ZDoR4#%GzCW_#$R21P19DBCZS}6=qWSOi(T01Eu(QcURfv_Pe<3s)C!# zb=g;FQ|6$ob?0kY`9YYTEH0;CW``p#3(>Z4uilz?DRPod?VI4Qf#JV1+_DhqKIHZ0 zw|JcQav%rEYuMT}M)z8Bp4eZFxsyjTnrq=SPIS!?(+zRw-t4(a^xGQa25Y2yW?w(V zvtGN$66uCB=0)}{;^F1~PmnHyfmX+dD41$fpMg$obX`B}k0(WQ;&CD}FAwTNoKUiS zhOiBY!slT@`7T>%|M?fgOXb!3N^NDyP0fcmExO)4*zF`*iN59QUtQ&!{I zm3n-K;_Q3cXsK)z)&3ZW<$8FbD=7n0#8a(8MAEB|bY#<|f<)5kw^_J4wU2j292`{| z&wq#W0wmc+`M+2w84ns5{csWpm(Or%3ryelju8L+*c=`4K4XM}w4`hsqrXUKi-sK) z9@J6HyA_0u&f^aYGGsvCnBpz%shyrT8$1?qqG041K;_Y|d!nYCi#Qc=ehhIdtVfCL z3cTSn(Vx1M%N=RuqTY*8g0W^$2AJ(VV~qzoT`|`IFSU)gz-PqsmzfT@UNP%~mRTm8 zVKe#p$bApKqfW<$U4seU8a!9h1Zj{@y5A>#tG_kn_8fYupW9OI2y9gyRm(+Ww|PU$ zL~0C4_D6X;R_+;HU8DD$rx&7a+zH3(0=UGw_x$*rE23{j8HNyVkoP7fSrJ#m`r^pX zK?KGl+$s&gP=3EzWAJ*8vRu7iM2$rN7G=&{JP`R}fLpn*1BDxoF zuw}UI19VP135O+j2z5uC!Ck8@bhJbfxsl=12?5ryo>t8-q3TcV;}N@aI?TdRs@5~?-Lg4v6QZVtPaA~sw*_b4U)ir&=ll=ukx zqSpLb97zd+SUoYO==Szi`ISRdM7xkL4;`~NxcaS>Oyv#_HxJaS)F`MrXiW$XA`UX% z@|CY1D>u3y4ND!taCl_7K2Tj#X1U9(V3c>&Q!>Wm(G!4k^IP&y8+)H0q3<}(&cZ&g zw=V!^XJxSr@+1R@}C-+$J>I$#^iB@^>NCH;;0GF2^)6Cso);1%~(#CQn4w82W(C1P_{2 zhw#Kb7DQD*YVgDhN*c=xV)79Sj6xGhq;8j*EhvRafpqLAlSzye#ag5jdF-hW8LRC` z%ij}bHf1wBh7ce;Z)n6SLxW>!1=h)*(nVobH0yHC=1Ep$S-Kp_8!VOdaW8D!wia$? zXlR7Ul>IP%9!;C z7m7rd#vWO7#-B)R+aT(>evtIZ&ei7o9wt$e`gpXzg?Xcg=sA5IT<(3ly7G()Pr3sO zsNdB0luI7cuFhG+?JMVnY%!P*Gg%nYAE)2{WxUt_ zPA>fOHq-wQ82-^_QmfXEL-v16-Aws5{+D9-mty#rV)&P0_?Ke%|0Tun&xwpl*nI(5S$P7VU8#ph{HXZ`>2i4)ZFLwIc;v|i_WWYgBV*QW23Opt z(kq!K`%C)KYVBnW(ycMA@e}U0Ur+PFqWHi4-C&Fr9EGl!gUmRGu-d%h(F5a)CB4;d zC>)g-z!phP3CS(P)?M76{ZoB?D^u|dEYL_s9(8Rl3Dw~GGgKFNec`j5DGa@`Es~TV zR2gQ_8~!6|kR}GBg)7Vs)-hJ%`V-wo}k3$gwxe&hK&@a-#KRIm5p9u(mpG zC z*8sZ%yJqZuc$@70*k5a;0}2noq~C}>D?jKluq2SVyQ%u1@=9bM33TJXZ#bD zs`{dDX>mc|X==w3lzA{b5!%SjY-IAIIEp%P;}RCDEvA|=(tPd^atm!G$Ll!Y`tGoe z16VZMroD_(F|d1kfo3@j=v|Cpvz4DG_=rb!F*OkCZqhv-{5L<2ou#Oqh2A9TV6Wwn z8mkA_)yG4|Z z$XMZn6U%_S{7GMSN@QZ@o7sq4#?v0x+fE>%vVqb)LbxtaPtPN|-bB+MjpB;&(7vFx zhVxyuR-Xqg2ErGuMeqp=buV4|?L}@01Wy(Y9Re*wm6o3lna|8GNKX0gXwJ8uN%WrK z(8THT9kbQ6s1!}#ELE;)3Rbl!)Ggt7+&3GKy+5c-_~NjmnAi`ZX;_ zsRu;bDnZSwcg^u`tWkg?@Fh=e9y_zik*S z{$N}SM&%!2czR&6F(DAC^qd3XA7fd~uTo#mG#?fr1H*wONM^s%3O(D=W`N$>)fN)#oYIj`s zbYFDxFs7MrLzN(x4T5sGd~lB?3PD{1t?k{BMJ~!u+%2A_^*=y&SV3vGgnEKkhi0t} zM?ayB-g<|NFteg~zeO9YS)1^E^Jk%lrx5FFYQ)c3-gUDm-c{(eG@KHLMzQO-jR)~D z#OG~nX)|QI-#`N?v?acHcDz-6txSy0lOz3u3d}Nijc9`nkix-*zZF2PrO<#E)TILRbd)U} zxTv;unD$|S2X9Ff1r$LeWu@}{e1%%^S&bx>Xx`vQW=q^;P7i>Inaxpn; zhv=tU-08)=*Ra8eIBm(Ry70m0t$cX*>7<+J>)o+R>1_k9eT&_GW|BEIA*T5IfB9mJ zuyI_1yP}pD;yM+Ff*aB{>}!nb`J})dz*OrhSk@Y294*3Bv;LZ)y0`t2GK~S(-}kx~ z&W&9UnD-^H0^W`0kQ1B}e*(+GeA*6vhT$+fu-6{Opc{6{ZtAKD=30*~#FdZjGdq>Q zmB<^eiv7)i+S(Yi9eOI0ye1D;nwf30i{_*ha!^AmN`<(Vt7$~bnsg#2l(flj+;2&D zq;(?B<0V>r`w#2nh!e+h`_FhvGIqxhcZV2JKc+bxhVCw7mT@x}zpAMTT|39v22Yp5x^1x0?dPeFxj24L%>i zKqQ|2QX^oR8<8X|zl5#y+JMvYP<~ZfN_48sj0&rXT_DOT^7X5Msm)JL#XpRlQ}?TD zvo}Ds*Gc(pw5V7IDlN4Z;Imxdd=xAut3ay`(d)2$hBj%(W6&>Mo?MP=e)eN~D(nEd zy_9?$Nglk&umcZ0(zFR4yvncx2fc!{NnX6vumcM{)k2%ovyM%H_bf;Qnu|LQ#psWu z)1NVEWs6(gcvanU3?}j~G_Ae2(%+Tfc7%~tHsVYb+p4fyojx>1sg6_@y0JDqn0 z7|2(x8=_T>^T7*;Q6VG<6R4X^I3&ge5+bk?$(o4Kkwo?OrU~BrcxXXEQOz<1Fy@ru z&mfha9u+FqJ;lqNpb22E2tZvjlYXcLlzl6Hlm#CbyA)bvcL}fh0g_w&Nxq~?Sl_yM z3=b3`3yc+l(>q2-4mm8K{U7(r`W{v*qyAlN#1e-NtLBM#n+F@R=h^1X5E}N$MpsVW z83~i58fqfTn62F)Dgk{bhHAeug&jue zeN2vT^1mVfvvRTDUJz~iR~{}w{+~2exVZe&ri#`KS(m@-;Nx@dsr{mwf2H3h43$I4 zOVoX0d2|r^*rfZYp~Z=^V4Pj^s5@vMdD>rNFq zq;)!Y%`mCbS;ApBjKg)hD08GSY%pc8d*uO=1WPc>1{u`M2|%h4+UKzJ;tyXw2N3P1 z#5rLaBAA;cB0qk~cT7RE05l60X+wuo&av$aOCO??nxs#=B2f?JD zsc-0$mK+mqdV=~a9{=xt?2n7q*BX>|t9EI_GH%CEleUPf1}*!ShbTL~ zWMR4hf$~;g4Cx>@jh_7^T9(erg5Ht09Cgf~`ywj+QhfY_)FcXJrGm1`Oosy3VS$K_ z!Y~^}?QuDR_z=117S+Sn8PN^lelWo5FJVw+n;L!1cXrZIjsdVz_U-AUG( z6-bNW4=P_zy&o^BqF3WYsPIFiD>pa~kc}FBJW3J;n!wS{`srmTp+yicVVt999*j4f zz}a>a;$c{JQvD*29EUDpR(4YLA`o^`?IOz@VwH)E^b_fSlHr}VgY_JKR%0BV_f@4% zV;nkHJ1+$5Z2@TOkk1^{1pw~tbbyjea?f+jz2QLtz($>fHQ7TI{_=1Q87FpC zt0td_b>Gl&lS7nKet*Uu33pK17RlZ<@+U-agsgLki8p-ggP8pY`cmzimBiq1p-)*U z!l!UvZ{8(ag+V_sZ7Sdd=TkGd>XQ_M0Y5Sjc zNRBs6^PZLshx^*8*Gc2=#qrlZD*r>09~Ce;k6t(<>nJxzW1nP0=&Z;BQJ>p2buH$B zpWm82Bx=!{irM*Sq4!}|)X*p9Si#qaFOM#M%$Vz5Z;rYlSw9t5^!z%oZlf_%@#CB; zRCwGo+j2OyIRIWzB#MjO5%hU6gx&TowWkd7AlWZCV+m-(pZ0g9-cCd9&NP`}Qb#|F z@*+=`88*$V<1uXIYGCWUCgYn@$*P5!{`}4hYR4-v5DPfeCgwnM=DpW|Ii0_C{eKeBty%v0#-{v#1oYnSsqaGC&JpT*I_lpe7daA4QmT8y zuoKkzRIw5q=-6t3w&fgucG`V}P(&u$F6k((-)DTb`T6-lDG7B6UJLMpj`j39O}Oq0 zcdq;)=GynEWRK(|#M3C8QbaeGheHyKMp&WUJt>W!a)u3i|Ca7Z=IV+xh&yFlC|WPm$+bTz(Oh>wx(K*kBXsI;>>Rfv z3XH6e|`8h8^#K(k(8E#t0s(Y}zc8tzs>^0z2n6j3x%+VEaC< zwk6_%Z|^+gfv;;t;7MwcWyC80#}(UA8A81_a2TDm{+IT{To@lAzr06`F3N5j|0Xa! z49+ZIje+mflnAuJ3>7hq6k?rj(BD&r3ct`gq(vr)QtWhryB*7DQAfzE%}*g7Tstsg z&K=&h$)(Q{9%Ioib-3_Frbp!fFcYPlCWYcOFHp14QgX7s{h@t7yxqOs4dpmvQy@d5 zw&(F;Oa@`Wrf*=lAs>-u)2)E{JOD>TI{D+7C3lDx9EbyNKWh{klB{B8s#FQ9lCjGX z5H%pXEGytCDdMr$8lZyih>%dBK^$bC;sf6PKZJcfyvE zzX_W3J5zEpu9u{E2YGm4xYSDvc$2g}T$)?>5A$C`*}mCpOzTXy5VWiI?SSwGkU2f# zcRQ#u0FwL;n#nHikJM(3k+p6elD4D@q`qklyiX0Vr6+@Sk(@S?*Q1SuzuzjEPHTB@ zYm5YT+lQUDlV<$jnNGElG-~c)lKIaYPun@-MALQ@2_X<2g$4rm*BDAL|wd`!v zu$@EcQ+)j61o&2+Z2h7A>!A}@D}EMKF?XZE63<3=|tYqx8|2uNHZ*5t*|^FmGbMmTfLnojGEJibP`+xmS!vDx%UEBmkuXgLzDVy8n; zb)|oyZh4fIRh2Y+U;S}@s{%!@^Wf}>DWUyd#_Q=uX~0~!b7Ux8(d3^$mdrvU?V+pA zy8^CRyK=Aqz^TA@?rBraP z*dP368&2Ib>&*91N@+k5VLf9H+R{E$H;8$Xq7{GIm*BT;rm$f7Wp(Y+9ACI}W(!^) zA>J{3^rOj6ta8Kb4_sLFG7}amZ*|ve8>v@XsW!dum4<|%`))#d%anhK0ryVv$sJk) z`m({Z@ms6$pY;<|N`tl2?r35;1HZvn#Q&TlK$X#r-ar5WQQ`bg9w{!SZvVAb=D*wQ z)V6cUmO%Q-%lwGQbuUY{P{B23S6)i(7HKFHe!e(_w z*?x43`>-i*@=x6KSX+31E3g@U+CA>$sT=sMyQCQ!4cj;AuVQ`d!iqLDH%-Mb65i%f z)?H-0@{&9C4welU$&tBN8GVb6G|Ce}NsIMhkpv(cViO0^W@mBCLt*$sO{2HM&5`Z; z%(7!G#|=bw#sx^zpVJTOi8tOPF$L4&Y))9egA@>Odc93%^V=jagltzpZ)TA=eTI(;FsX>c3Wt(Ot&-G+7~kGzsw@*@q4b z#f`VXAQM%UI*zR99+v3VJ!>53z0kO&}KW z^_&9B9WZO}?n^9^w5u?j?lzQtd?J4(h75Cq#=lE(O9rWUYw$3rczVjPoxlA>#{V*g?<98gT;(Z_ENzQNl>j#<=$x zvuJJVx|xOX9Rb&tL>^xcRoa@;Q9d8WSEt-uFez=j zY^CJUpSiBkG`GdcHoDTLwS5=aL3jt(s~rm<?FF6Ge_$*r8|&@Vi$%6R3>CqF zU5ClA%4oB?;f_9|2uULRxW*6`(`AKdhc<3IqGAOTgXKgW?ANcdh2d4%S3s7elt6jhiHu&Q!v}OQo7|RwU6Wws!B5MP6(}Wek!l}5(&D)E&L0a z^4mAIqdz6y#{KzBqmJ^>J7Hk#tzr$R2cbLa*${JD2rFoM<-+5fn20EJMSj9O686I&GXXaw z40vBh0(oXUGhdQ=b-^(?!nyB@K;#_gI={bDhhhxfXNTWvWZ=pf!RO7Q+s^<%1u-@# zw%(tx{kM`&tp042#Gh#524d^3Ha2-JD^+!Pz4yZEc@^HmTf zRzg(IuVlBkjxPduFz9a~@>0~heGnrr9ms6(B5KT5UPc!SJ?+t4o6QA_==}0d#!MR% zA`}Hl3V;_lCD;gW4&Eju>dHyn^k;9E)<6w)wp6g&-_wK#r-G34dzJeX+U4BT6IgRA zQlMq@8K0k&pQNJzs;5jYZhh)#Ey^3%*fGcFcA4nt@&r_=qoXJUi^o zgaa;;y$YDJ1OtcT(lYUo-NbR}#5f|Kog3Q(twH2g%Pe{JTNbz$yZEt;Khn z(wH{N;scqEoLVt9n`)GGaCXfZW~uZ0v+j^gEBv`FjMlTk&3*2gV3PLebQl)&x%Xvv zbT~Wo2@+)M;6Qbkb8!TbvX_lD#Zc`;yNKmu_&oq zr9y)Ac41|VvKHe1IfDGabqfp)5@`agi3Y)TOKfyVQxKjc#<|-JR*T4_@lb+|e7_&L zbb+ifD+MF~EuGIHerhGkw%ln2!e}+6fCV6bOyXi2A`TJq7zTg}h%B_>Buxm~$OI#o zBcbFEt;oyLKU#5hnXscs1UE#!Ybl8+lYNYLLM1OcXOY>F@Ayj+UR|H|lYVB-HtPk` z+%_lEX3|m}wT$I=2<>?)IH-m4~o zE?=+y(<^S~@y~UI5Y|Tn=R-neqMlkUlILhvz+*2`^V$l%P(5X-GcZeCwbp zEMMbbGo|B5J%lJMfBV1y1fvd#XK_4?f-DJ+vhm>GgCLncAWecGs>@2YWZtLDPnLY& z!?>J$DUxhRV~x92S=Z#`mxNthZko!kCmz`oJuNHCtF34I{o(lf3oR=^d#O6pGw)Lu zeJ#p@`mmifyYV)-tFF$%T=2R{XF2}z)HMG^L7LXJ7i6n@iI4GBXH+ggTDIEw=6$N} zY-Ih}(H4Wwb5LdEcx!sv-^|`97lk$vy>p0ne9JDyGPz7Dr z%O*oT1TV1ggdA!my5`{)jedSu7|?kLc##hx-JC6E*kpY>S1WGGM;Yj+c`h085jU^* zj>{1*Gw`8eMw(aapaP$q~xOndM3{G`qN9A#s`$q1>GUw<(X&7zucGZWNJ`Jl}K zxn)#)0b`3Wdvf66U$!s-@E9h5J$=S_X8g~|gT8BmyUpMD_V7P)EIq9MZ^^@dr?&kk z&xxFRW3A}Ho-tZ%6YOz9#x*zxWTgz%7=JRcf=}tvV+VWE>2z(wE<1c;aR1}v300gW zR}mNDlB;_+^hEO~794ql{R@)GS@{8pCM)}@cwXrN3P-2CgI};ek17(G2Ta-lnnKO^ zMMTR+H+h);*=7%rOHS}jhtb?gvun;N+ni94bmZ3dPf}AfVXRKRD%HXnNNf>XL&wCS z6Q3uRkx(om0bj`MgL1#n=xm_#vSUl3fN4G^fze04_`;<UnN|?{fol92oXGN4wv&Qq6ZYRhnn%`B*~Cf@Mp#MP-hD@|*DfMSu=l z0fj6w+GIC(VQh-m#&5acZvy#e3Ig8(F^@^#o9AH?)PS6mu(8_eb-mwN(4>oBq)lp~ zl`%Fov|C|R9CTUa==`X05{ho)M2ax|t)XFC37aih|eTJ8IXg(ZB zymUyz!$}I6Ng@?>?$CC&m5S$(Re+nkvxr*p`B-h0&)mH{Sx(_6#o% zYkV;<-$K-e@b}d8Vq(5Us4f2Qsrkjoe2b9s91x&q$*F@pvA*wlA^Y%(GFBR&RnEJWCq zvI(xb>5mbp=|+KnEl4}d<^`u$#0@rvm`9{8eEU&y&)@+3uv|$(4<5HYUhunIzDo`U zAWulS7M^08D=CfHu=D~Gg}bO=Q!B;QF}%9w=h3~Fd4r_0sG*WugFmr{0ekgcPYueJ zw4lUptu!*8{$og742d%ovY67T7~E2+HSlZlG+`yBb%ECU)uq6Q0xuEie!3f2_G*># zBe%9jpeY6^XJbj1>)PNkB=t#b0IM2+r{(!V;-RcdaWz>z+cM7E5?&Hrh)pS+{>eJk zuLc$Kq_dX>x+VHF$M9250gC?g^Z$drcMR^VYx94Tj?IqUaniAE+qP}n>ab(GW81cE z+jjEL{meOao|&4t=b2N7Rr$TxzrFX1t5&U5``UY5_ar^s)mU3fa-u8Iz50B1Y z4aI|6S{9b?_6K(3a01PxKwyYMObDzY3T;kk2Y`rm5N(tCM~Sle@gd*P;ZeZx5cP8~ z_p5Cnr6>)MWvHOne#YT!#?>-Y_CETEpagav{kA#ji-<^dVRp*nffrcKU)}F+0Wbje zTa}5X%rd@5&=VqrucDS7dohBI`Xh}!lpD?ZEkM`5;ZQza?_Sb$1Y8ZoXtM9WfJdEv@yLhc+q?=f8+VH&U6NL&^Mi(NC0KtW z=r2D@72#{x5b;xy0S^)1GP`fkB+l6~VIG-8H|pj)&cTza5`E;?4iQXtS|)&Ff5OGN z6aDz(Jj*V1ah>1n|MY6gJj!{SLouc};yw$+UIv=^{mJuYf$gsEso|iLZQ;l>a%UBE zAya6L=a+bq8!VQV0}yJ-u8#X$;s$KE2NAuG)t(m-{WtYb(ej8+r*q4gt#5tUt5%)$ zKVOOLln3g|{`wod54`29UGuk8cgJk9?ympY{%h4)w?+N~Si!X|XoCiyYrNkXEzNJ2 z7KCAgv0eC46sYeveP^`Nwkz$$cvZ21CZKK2@jIOGQiDggC%@5gh z>QQI1A?VQK?X0vN4`#>SNdCY|dXZq_6;6QR-#TKA7@+rn(~ z`JsR(2j+V3|Io$9NhZz^_ZgaG`yXYy^mVQN)rU~!QxlR2*-OjkHQ4`*=;w6r{WPQb zGoQGFgh1l&Jo_#hv@l7MV}qf%U538Ok9K}BI}1^#>eLL=Q1d$wtUDWwzR zJVL+!iBRCL#g`PUYV3Fzc*p6yp8Z``72jKP`A#QNC2*huIzGA`#aXimcY_Q?HU3tl zT?Y|5Y*R9RJf(v_c8xdw;VQ7KI7=!s!XQ#;ql`8%{fZVKYlBMmOXkW>D@cdKAQnk< zU`^^^yOMUveIxC(&6>B}`nxmjIl0U(L`5@r+%--~h1eKXA|WQulZqVvf_31ye4+ia zX(uJ6o#Ub?k`dCn&s_@5aLO`UAxx5q|EDYiqXOUwqb`oQ!17Uo#1`nj3#yU;Z#r4m zfTuT&ODI`@ET!!_l!WOb5yCb|0ervpYk2dN6%w(!jw2sJ5Ho*V5gZYSoZ-{F#FS}H zn=AhNH)8ANmYoWn^tCHgnnLN)a7Pu+&zniP)Tw7zsFhp@qiPEUNX35&{Lvz>21gHE z5`0TG5?jElSdKA5S77+0WHn2emeL&7miZ6OhaTsqpve#wW> zc*fanEcKQ7vZlFSPuDcqm*`#xd816{E-=MZ?o~E73yAQUk*RQ(5|wKEJ2E#irrp<9 zAKyopV>S($Rq?{0F>zs5#yxYz){>q+Gi_MKnrLpnhOw|qnk^RSe|}$n9>GuMIPDb^ zKpu|!fpe7-$vUO6FjEs zQBr=YsLep_>^O&EX&qX5qAS0)na0_X5kD4-EveLl2j|85rsyo_qg{1#+HQte46Wxh zwN@8^m&a*zKkOU$VWJ@NwP69w=20AH+Ifo7!Lj^f|qkR526LTtLU`I}AXicVghx#i)a z9ZfO`ZfGs>r^(YS4+oQrziqg9dFDWP`B7EP-+OF#?oh)NK?(6BVv7NxD9MH~qV zH>fO&pp^)6yihUcANFp=JU@we^k==&tJ+WwO1M#V6&2oy`{gqUWUsqA(Nv%5?kMG> zX4vkuetB==%=-R0xN4i~^9zbwjO3KupL!G-rV*&2R#2LhmS8FZqi7Xt#A3z{fpj}; z!?InuYS|bh{gf3Fj0q!}y#f|%18kAjU5c3@loSh$GjqCT{zD8Q^pqxs%zp~hV zllEZqv)lvyfAj*>HTajqhyT>aKHHwBNW~>Crc(bvlQ(6zlj$3@2 z^iuxN4+qyXP!`^frp*}EPNQdIc%rG{azZIDdw+>sDvPUJx8SpWZ$Wp{T@_w<)9xbq zwj@Nq^c$fH6ynf%xgT=EZZfWLGO7TX zi!S(5SPxy4hn$pddar6)TN!I{jyEY``*`*-M&1>j`yC>z?&XiG*arI9_a6UKX+MVW zxCV2#en&Xa+VhhBX0Z6v9Bicg-)CV9ADdO|x;EzY!O2uC^Mjr;mY{G*{HZ=$orBf7 z9>#~oMYNTpM?e1bj{?pKMmSm@2C;&kjoX%?*I>KQtU}nDCBUN*cN-U*s}L_*lrHO` zz+fHnYhOl&S!$ zwg?Jd2ZGm{R#~jrm_YnkNeS)5_Yb$}V*Yjj>rbrzC&jHo1#y)X+NgMZ^F{xsS_mmi zy}x3>q=RCQ0UOnz5!z=YkrgRD#|DxlHRkmOeT|(frvoSch%SW1fHnc!drKA+;=z7& z6cv_tH@InVssk2HrqT;GVaktMm#fgoAB1h7_o)DWkJ8gtW44W8)Hv^v(jdoaLS%0^Gsd6Q$OrR7|xx!{Sf2ji1enKbu#7 zVw|IB)(J+ktdPUtW5kpAqq3o=^YM*6Pj@y`u*nh&S*D5{Y}wD zD;}LeUH~ipE%R*~5MDJbs{^b+fhHeB{=O6RyTzm*%zfuL#iA>eQ#+WGY!{VUWjJT$ z2&B`JpXRwQ48>w42sBiX8l&ZAMsc`MvxR6crh=%W!2i zBwJD%o*QJ70a=pJ4<>>FzD2$4DI0raH)&0)$bw^+@mlvqnTHqu7!Ag76nJV~`2s(P zJYQI*J6`K*+MxnH;m%{vEV}tC-5$lJl`iA8i8|3T!rEWXC~S4mI}3gx;Kg@b%?tB~?Rq@>H<8C*)lisik~|F5v3QhVzRC zw&WXs-CX>c9PD$GMzL>*ufieh+aF+&xJ!P zI}xzq4EI#jK%jq@W|o}uJCs+n9N#awZ$+;Qx>=?Zc?8w_a>Ah z*^NTnu>QTd3{_BNE^BOtW3)M1QW;iouC?U1AvcHV+HE%N%&L9^q}z~5V_|v)BeC~) z?s}%xa1`$K!{Gu>YAM+MHfhzMOr0~-V(M+deflVruGkdeGfA!chnwHZuwgl^y-xXzxONhW;vIMPN_TDJ2xAz~1Zb`9pq4AVTZ+2)}W#~{rNn^|G zx*CY`J%l4TtW`^d7y7|CLZ3YNnbJ@ggRD&ce4Y4ah!MJ6#RZHt`);gI&sbB$r~eG? z7Hb=|ThwHxvD45gQOq%_Qc{JCiO38&?N`e&(K3M-lpSV``HP(9I1}Im^gu^FnBzH5 z2U?x9XJ#nCbUY>Zy)tXkNVQl$9tEBR;xIozFnK&gqmz8Xp+H+1u?P*t?Dv+ z5aroDOA&b3x*9E z7{{&_aP~$xj!Ng2E?yd72)vsYz+0$I@`24|+tv>nT1a0(lbsDHWfxByV%^;+7x-@f z5YW7%M^Jd2lqeNKk5B1UW8WpgU;;dQ=WPM}*iJYN95m&SUwGH}1`k*SwA;p=d^16$ z@KQmt{>$ntz7xT#q2D%;q`vp8@`iL1_Q);Iy`UsCcnS z^mfN<)dCDVR*EX>Ork#y3BL>YyD9L1?maN9}OWePhmxN7i8gjK6wPs zYGo>zsS>kx{&4!P6ejWD^yBy93cNmvxV*uzYu!eBDL{frav_VN?aM`2SavjL#*iiU zZTj>~v@m?3{fz{*JuuzROaq*b@YH+SW9)t0Nweq$H89RCB=ulT_ATlX%7I4{VpKM% zJ8y0nd(b=GiV~(fy4RAsX*1PI6iM6OWt37)eQc=tqN;Kb_KGTVsQI$W`kx8mkSB|u zZ-SHM$`Z(ydR^!atB^al{WTZ=Fb73578#6=*#M_ zbjoZ@ATRMUGxnchnwq`ZNGG;u(=KKzV7H_{EiURAi^-{h)W<#joh(Q?cqbq@y$_OI zM^*dL45q6a<`O3BALbJ#tC$xPY^*M-e`cFo*Zth;Ubj~7&Tl)a51?>Au!Ok1(`eYR zFWA33jb$*GV%GFSD#VDU&a`%R4OaQ}vlT2UeNtk=GuzCX;(>nT?iSjBqk|o}XWYQc z{N`pB$1ZSll`-Acbl%dc` zO~kSq*3!Kn<}pU%&YobVNew{iCEc2)v;y#Aq2uYo-1#^*>3c8(NzFs}4*_)p|t;-m4z)BbfI&7QDQ?vB->Dc2`WpCs?eU@=!EuNKrt6 z0K{$&NbtkmI3WyHjA@lnv(txhfO!Mj*tmX<#eOsQ2|~h~0p@WMWzw>tgNJmLfy%Dw zcNO_HehOJ>YXjT&sI!(%zv#_FA-4K?!2VXFC2!)pUrX~SWcKavkiR1)9PuN3rCPetF1kZP{>OE@V8iaIBa+@z$ZV0L}FY97TeE2BM|?28xuL%5(`2 z>IKk4+W`dWF>lvtM_*V zD*o=H-2vZ%1h>`p@yX=OV+Z12pRm`On_HVLrijuDlY!%R^5dfDW~-+@;x3&h*~fTo%)C|%A{SU9g6+jvc&e>1b04*cQOOJX zZmv~f2?}p+n?KIu(W5o7w=Pf8gAYx>t7ibVh+h{O2)IRagv4lO3qrTS6VCCtYe&{EZxdu7$-ixN1otmy3Q*}VD>fj7Xoto=`YH$T<<<)pyTIX6D?k)?a2o~p9OGplzV>U{u zA@^}k;1wXpy8pWuYm8O-i53R0+s$S+l^}nyfAF*FOaW}`Z&zzmdhaWliaTEgFgQm; zhQADauhM#(%C+&WU4h1Xc1z<@Y?xZ8N2pB(qfY0@ebepY*Gz-$j&yf`L$bt+IZFJf z4r6c!3h^p5r2x=6e%Ont-_UMV_=vqf-F!RT_{;Zy&iCifsacKVA1D9Y0q1X);2)Du z{g2uIt0FmSI7Hmh1quKV`1muQ2Ym8*_^<6^{f%7*OPhbQ`q!HNkE{~^H&*`|@lQQn zd&B>eqyF#gI~ck+{FD9v@%Rb;h4I_}w_`{CTs!c8tmHrAoBxX$XQg$~{s*u5@1CN% zFHG|nruhrg{Do=$|1PHapQ(m_rvsAv5)BiC z^}KdY64FQ#M}S%+q7Y+DN46DxbTq`uLic@h01EJ|F^Jo3B94zJ(f$`61>*$NBG$sD zDpT|xUA$cYM?=BrnFO8YMwc4C1bwB(EJVbPnr$e5xayqv% zMMbu5qE-2I5LkG@{b_4Lt!2SI9&o^K2=K5h{n(A@y#eM~wta?0c}->}MYb})IDA4@Wj9B26L|>agGAteX?kUsq^j!j zXqsKoTqb|#Wgskv^6K15=#Fk?YK&NIo|QrTz_CCfc>Y#bOfnXtuCyt9J3%Wn9sjpkBfJK8t5Y0DlDLw|Z13vuII0l$kSXA>c{`|M4q zelll!QBoc1*a?f$dk^N^Zce4jFUJapUGUVGHBfounVhuDLfdp~$%w|=F&Qxor5`lWSP`W9|8n718CFETg z+`4JDU~6kyM@hU;pvNq>gfrCHrZYJsLq54uC>!U~%Pp{uBM5|%jbiKS>e$U^ z>sM>C#16_0Vef+3bClFCNtU)LDcrcEgGVN*o|ZkNGJPlq6sP&)(mj>j&$u-lc4u{H0-@OKy7YF zRKnRCzTb!-(`63#irws6a_hCz6is=l|cHPWAi$^;KJm+ zcsQcz)(kRe3(Sg6u}54yk2VJN6!5Qc0*mhG0h%{?3dA?mjbNrkii5TkyOqsZia49X z{E4x0f%C(-V>_s8C9^J#if`&skldrCGI%BOl*gUnwZKUdjCg3dI1XmipSfB#pIs4k z_I$Mxn~aERN=va=@!RSF-u2ii~){q-6G++tXiNlHMSB zd9YI{e6^dt9k2w2YO~{a8iUtloZ?bz#+{gW4tuB5E1A~_qYd1(mVrF0|M*k?TS1fd zS(NpYqOhm>1|jzT^!<3j$NPWKUHE4`nZNOT{}7P*ThI5U8}p?b^Q9Z}r5p4Aux`vh zW5clj^RmgmN*n);6ZUrw>gMHz_zVKjQc(5-#*cTq`{}w#hKdTe}&2H-- za>Rf4u~PS?Lj0vd{G~$tr9%Awk_z!Z3tRlnuIt~FEdJh+eF<2630QmySbPas{9h_y z@t-#_BmMjMkfo`l8Cd>G`0`R z&sUGaf%uFf&yG?GsR!qPXep(gDd*@d#2G_TVi@M!AMkKbNJiS3@A`g8otkg29rxCG z3eNz#WXI({^H8q*P-eT*#M@fhU8m(p|I^Eu5LCqWB%&PIcF730n7V;M)x;zbG*Ukr z44$lupg3b;oUO)lv3_XAewnP;P=3E%Q?ze{>k9jkxZc2i;?H-J8&n3wf}H2G+Ws2qU^%CX_XvPI zESJbeaZBH1rwoSS^;pVIMam7q?O}ymtNsYsJoGDkH*yuvLwn`f*cR=P zk|^li*bmBxVSM$u-3x`8g$0t0)bO30W8u1st6c=WxMS3~iej&vdyrj3qyAe1;-X1#g>k(P0!tEi2r4nbA2ZbO-lT8u>=|4{WSAd?aklyGhR2!G z9mu73WphJ?-crkD6px9m-1wQzM5M!qQCwtiqU`|P&kvyJ&wlnG=L!50>Mvp(!gZ_W zkBa3XhPP12@TKu|iB$T4b2%MKZ-H9U{eAI{J0DoS0SGik%5yO&czEYzZ{V_ zEkLSk!e=-&PBe&X!E~zVGH++LbP7$~>mmgR-j7JvXH86v)p9dWL$MI)+?$IXVpsl1 zwya;)E9oAFl-ZdZ;5@9t?^vG8;Cz$dr>s%gJVwq)o$Z|o``@_F70 zGH>M1s^~hBQuKGyQ_@4596`gmncF_((xRw?*1o<)%?(9VJjp}RrLh3H+$irw63wv$ zcL&pz)W%!OqR;wwsa3Z>>8=u$Cr|LX92`RG9Ka7Pf;HsNl}0O=N>lA1Za>KGjqUgB zwbLkW&i}|jNg;ar)UydVD#PK(z28?j5P7_%J!ox0W7L^ge-` zQ5dwu!_wfL3XVyk9w+FF>{yR1Ja%mUNn^^8X$Q=yo^wbe1`tbPPF?Oj?2F{XU7W1Z8UyCVs980Ni zk*8{7FsOCKkZQ7NGLe&r4}-8E6`cRJ^Ubxv8DJrEg7GIgg2|qBS#H6)JEGah9IZ)m z3u-y0K8O7Ht<|!Glr*Q3eqAa0^E?$K8UAC?1A=h;m(7lMRO$X~DCJ_ub5QmZd$k zFUU;7I&q)gjd?#ASZhcYtQFBDGr_Jf#h4PMbE4X%D57tQB)Qy=Ps7!6m7zOvSOI0K zxvU618SIDpTCN#D*P1yqf`VQ&x?tK8N!l7;27pVJ9{4F}gplpN7S?sY_c-4=kcw@S z$t}qtG1J8SR@+3u$G7{1Kg<&?z}Kg|jG8N3c@fs%UDl{}Nu#k*R&yzN{1IUeNMs|) z|7hd2k}vH|XU^qQk2be$8TSKziSGkfMp=CvhpskTF1bQ$EOxsrhqB z-ZK2XBP`KNYfo}8c#R}`tnksn-oZ?FjhczbQC zhO@yn@Dj0v+~RFb7kBeEXdC04GJ?3INc#~hcS}`JHaKetSi8%re>odRT7q;|J`1?# zmZR#RU8fO@E*h55jnHH+$3RdO?UHvKR)Fo$4r`X<0IR|)po#8f{%y@Sh`G!tZ5(M_ znm|Gd9oJ_MiCS1V)n}?61)zk&31QW!+>7vFc~@^1LM^*zn#}i$mNO42Ll934CJHY= z-h6&YjY*g7*94GEu)s*Yq_aLqIWQTx>@^_1ARNHX!Sqo&EE^(`9h>71zNA|r&!VZ- z9}f*dPT}Av%|^wrBdgV#g6dCUZkzjTT|MhKmApC;bsRew9Qh%_Kzx!gsDl^QifD#7 zN)7>l!?YtZaHz%k{?^B6%*<@jqtzTWnhQMotfy6iPM3Y1=%CrF>HrqY4^LzcOT~JG z8EM}JMDJ5N6OlB2VN2~cAp)kQ97WXc6lV0bN>3NE?D7iQ@f-{Zfv}-D$jd{B zBsggVAC`;UUKIX?#>w+MYVe75%Zt42e87l_)bHR|i`eMaCVMY>jIcx#%oJfq-xh*{ z{h{P9A)x;A`S;*#O2(m$aZxA@g3HiL%T(`FpS4@oUNlur8G2mId-i%6m8(1?usgUOrJZD z)*S9ynGBCFRihD2f%~R_HNo4vB8&`xYw05JhK0_*m4ACa<9H@}-^uLCwEZ=Iq5Ft8 zsQ_AGpVOicA=8{b<>nknK5#e4JXXYk+LC4Wf_tc4{ouIIiq-OzGcMShoJfh`brqtva+GDGtW{?&&MaTN2;S@|bwngJYcexE?J8;tLCXSZ3{Qo$i&ZV~x>y zBJGf7p1@xZh0p#yI-PGY7jiI{Z*T{4aEEWO;d`_-6uvY$o-`!>h9XZpMF2;c568~{ z4{gAwc6hlz(*a5d1`Uwan!sdAyiQ?w?t9VKl#0@)>G|+Kie%{C?9}M1;O%5!$;J(e z0IK`&_!IGZ;Ug|}pLO~Z(hV&Sr3U0JrWa4p%XLyfWEJQP)X=D;DtZ3sq+GcGgJ8KQ zW8~JF#Ol_Vz8n8mGQ#167ws}|J3)RG@=p~MF3i^5JaiL+zJ|&~2d4IVCd(#uFfxvu zQSZkoH>oBo&uf0Ii&SyPww+H5stIrJrN)o#FKr2?mvnb<B^vzx98 zqNTf@N7HUuygX-PIxv>-S_>KyEkGlT<&{eyd1Y#Ax2l~~JH7l9JCi40qUGN_MXAi9 zExw?K&9(|$GhkI&5y|N6#lFLU%>g`{)F6`mEQ!L00Nx>!A;t}M8En?paw%l9Zuyh%zU9LYxt#;|l zdE1t0L!K}7ldpn2KDfnO8l;P<)Eeq)-3kc3Uq|HqVL}||H|j+VLnB#sC*Z6@(oFOBPQN1EszaNpZ_VeJ+ZgUE@!s23Y`NTBaP1aaX^-_ z3;2b^xu$>QvN$ag0ljAok*sw7aOd+rg=niHx$VoCL~`fj{=BFpx$VlB1ajy5I3a7R zD7-fAVFT8EanBIA=xNgYFcCgx5O?qzTN;IqP8S}&9b0daaOY?ajRWfP| zm?Cw0nLNn3E50l>NyhL}RI#$JAn&bg;rcEgfY?BO$J?d!pxLKgc1vTQofTrbF+-rs zE#^&dP-?AL50B|2$4cix9MeDTsh1zFmhRoH5yy~=E=OW(^x@{EUx4_*Rmi2Y9ALmg zN{XspXtOIRPkP1AZ=OJ0Uxk~Z-J+*R)rI8&&P zPfvVMGbu%4`sPb%5OnT=!X`b)*MBi?y!8m7I{0|-M485g4~5RnwUMH@95|3vKsPdS zBV&k$)5D+ax$F9;8aiq#dz9yzLm@e6;8Mm2pB0DPvPa*Als*OvF1~+@mgD!5NMx|s z$t4=ja0KB1f4=KtL@+l$mH<*$OAN@vL#FC`MoL1% zN-*~|4K8w2Qe;=AY@$h4fUcx78}?nGsFEon0@6Z?7#k~fcjs(ic<{G3)+ocIP*J%M z`Yll-pKjm>A>`u#B%F(Tm5WUDgzNgH-qHt`Dl+E@VLxVzyjs)8wv49X2(3Bj3=UNP zI}7xeo@_B`jEGY!WA=RKu=3=3CfvxVZWuqPfkr60B_r+rDJkT{GZ0!1W#$TPA#zKm zil4TfGUN>~4IWT6=MrGPYhjI?+>2Kgo4g9x(b893m%9np6Dr5!=FE#bxZvfNTTvt- zhvLm8?zDTP+zkL=>5Qt&&RCuaP`{K>0+2|FZtdAtQs6Qm!Nmm5VP+!gt8>n?U_pd& zvy8StvApQ7ySjJ@0Xe`*3ujuzd+X+d%(J9zY5T+({Bt+Z%7YKwIzuqfd~8Zg34Np6 zPg&ddWpT7@jiUpt5Fd^K!lSNUQO;QlMY6_0_KLK~PI*EbIdDh-CA9(Q{e@;{T@pF= zol$?^N-8T0J*QidpMk&hUG4}X0Fb7(>A=&n=N=_Oew+X09FE-mO9P}2tlbop;oCT7 zH^6NDY zx)HOv6>SBbsfFpt5zZV*Ic@e1seDygNJFvV5pnqv)|p3!ZB7AWoZ7oWSvVO+D$~W$ zIJ5O)?-egz)FKjqh?Wq&v1j2S-oUdLlFw#AOS2aea>W^AUoO-2cNZ8*s_E{9qb?2> zHwGNV#zZi1c+!GvCbY!~vXoHHjzHSSc_vgEP*vyC`qUabP1{kl+)v1nU#G)Z_g#u;d0##nHI36JFe#ZQsGyDAUO>t1j`+GC| znX@axa`c~5BeLJTVmbug*Ao?Jx(T{hOWzCXWlYYF!W^)2^48-dh&Ns)F~t%k3V`yI zI(Q-E_p~Drr@^G(FN!jr`-<{?sAh-rl|j`PVb`<|Jc}c;T%bA)is8C^^`4p^+yL{m zgc10`BUNsuP9t;XW#?3q@&KQ~k3;T$-7&NqW$%+&Z9yyrYY&<{6Sdc{Mt^ViJGHq7 zC(v>Uy$CburF9f@mwrGCHs+9-@R0FnnzE{ky?6oKp%!gJVk|b*_0N_0L_C=3)v7d2 zGjfzWbmc2gCN0b{Vm1r555IJ|O%kH+gB&x*8*bCEZH#fpZO|uJ?k!J!JWygvPy>vG zQEl&f+$KcwT?|7-PK>{lKS^~h&3ZNToqYexPIfsmgFeG3fTJX+V5br|#JA%OiBI`R3$WEZ=l4 zsrkRBiHu3{Fk;)Z;4HF^(>l7jIBZ8eb2)Wny(8+BFt#@Vk=o5J^Lv} z;Noccb!aR|1S1Zq3xv<$hh6lC;54W3!BypB7W`oii^IKCuyh%r_-xsIAj5g+P6l5U}&ou5?-9oya`6Ymp>#*-239_kceWsFdFh0DpkMoQ$M3CoeSAx29i zEb&57lla5&m}njSP23adRdd@N&2^22D~mt->oNWqmOzanqnnUie%Nt%Fnvk`7pA7y zDz4O^4tZZggoUVnX3Q)Vb)kgeGJ}h!gy^({j9>lRDlZxE+zvUVh>qM8TI>hL@bmgx+yrlQ_!14iqp%mf|87HFj78uw!eXQ zR^@4gR$QxFVBrE75p}_gw4F@xT7-3lNXYZVg%EMX#`rxzyJnssFWBIz+z(sbFsb-q7uDEQb-6#uENLT zde?+C(Q?kIofu4B&zSJm#I7gon9vrqFbfPqfehZI6W9rX?&lZ(8W%F$0p3>otuhmc zuy4Jyc{!6K09 zk7TD3!2~;o+}|GUo2TVQlxV_-k)ubXcluD&*9P@;w#nE#r-3*x>5Z~&y&~ldH|C9M z@M^=?XYwx33r_XY_eBYv6{pQ5IW&6{E(4&zGUGG!u@9& z6a=Z5knTU!j9WihL~pXe&!Zj*v@am`N2>y*o5z4ZJwb*f~D-A@au@(72xoV{t*>Y1c{DwP}i@<*3rYP(7n z#;#eULDkEybts6M?zYPb-`2*rjmrt3r(A>$Z2-++4*b`ekL~C}F@uD_ytJ93m%(=q2absIH>SkE#%_$n|6sy)vz+IWTdU*>pxrPiN z)o+JmEl77GT z*t2wKchkwQJWH9-8f~qDkXVqe;-d|ti8P}fpp4G8=x>!Y$qCG~CpzjXNaA$vl`w-W zA>*ThjGTUcOA)q~28A*u?KCKXX+48~yI#N|R!{bd7!B5{UUD&8_T3_Fa^1t))J!!3 zxWsg`9*!#NHl$=OC^KD;M!`U8-yDI1P=u+1{j*nr9`pPrl$XIypn~X#;4P3D>o91m z8o^t&os%24kd4?JZgB6^O4AiD2th|x3{umusqH{kpeqIkmjSB%rHx!>|{Sud?CCP-c3jUTgb6VsU}RttV(W0C;8&0`rjH`p=tc zXnA%FtF`p{fMy$5VQ=E5NJ0o4z}+Cmv6k>?Z*``Tp$f|wyNNIYdJVz?Rx12soGECq zluL+p4s(Y^6lf|3($saklwojI_8L(GTZ9-JclC#1o)strUt;7`?SjAF-=XAz*ew9Nv)4XRuVuW{CZWSjWOF93~F&*RKv38dN6$hnI9WYEbD zI5C1H6YUmfH!JI|v6R58fTdsmSfOw*b?U&tmSBaGgC>bLPB|AVD-aO6B zdggI7(U0y81zkg?2V$L5%2+Ix&m#YD z3f-KCdX!pgqRl$5%I|Yp*WZp8SI60X5 zva$BFl>Qx{%lj&lY8JCIE4HaaYMIh(iado&ZX(j1wZAcYt0IU=$pn3i@XCr)0B@6i zN(;_*5#euwhL-J#-0e2Mar}MvFt6-J|M&;5?l}uCv4N|ARaSnF1mk#(OY&q1FAEIh&`WOMZkY`VhOcENq@MP3P$zE2P7(!brP@Z?cDQm=Y8oyNgz%YZ&1o9qRY zHxuE9@8^+Af!zMXgs9+S%%fkpl5*S#1|j#}&98d}NC!poNb6hoV~e<+8(c)P%A6J@go@=#^`S7R%Z8 zLKj1!QdsKY#<%q9a|hQvx)DuOd(B@v2}b4hQr;Z!KxhZ4~+e|2{@&2c;mHEuQn>nMCpc zGf@rfF3~&g0ssD}(7qQ8;2n&O#wU>z$Q|?$^wIquO!T4zde-VMY?-dBXStvesRyM-X7BFO9TI7Zqm)Y3Q&>EJ^q`gT6& z$gymEWCKOLNwjQ_uEN2pz;>d;%xohlEP)eb0s^}CW-<4p_ECJ8G-;$Gp}gA64j+a$ z1YH~|a8fZ+0+tq~NQp3xYVz4@k?YrSt@E=vIOv~I=pD-3w`Pk5VfruY;$C{To6>Ob zY%>es>_+!5)l_;B4H{>V&BZAJR6p`hW@eSvi+`=Io9TW#!(RFxr=&O{p7@h-!ZBMt zDmP=s-MWs~TtJCuPB?Tg0AzdiWTehbinYHpNiZp|VkFq(Yyc?S3l_{SApUKrslwI` z^Ih6DqyzIu5S~vw#wGYvo0;N@ayDT#4u@}LC3@7+%>Zg~>>KSsbpACwBp)Nk3Sn5c zwoYH6>8mFpLzsXa14@Oo?)?-a(dcODSjJ4^m9fgwR5Z#C#>*p9)f9Z9anLM{?&EYz|F(q>I4!jea6&KF~^*LRoP zZ3pTP6K?{Hz!P5s_d}g3!>$V zVKlnfG``R*ys27?1Gnv4r8v_katq!0#YuyD#5Aw48B%&(p>z|I<_mOI=5vvu{^U5nV(x?l*oY ziz$naB)f>GK<7~86)H=DJ zB2>pkJfgT4~!vdu1X$t7sH^X4Oz43Nf1E;f||Izg*3G5FyTZ zi%V4q*hZrpWVq9HV3irZ>sf`l=+D*If$o%7)Lv3b zfBc%2p(rG!G?3;=gNR0wNF{|dQ)$vX$&j&(MM`8UV-gWbWr`AIN=QXX6h)-aC*OTK zZs+XVJ@@XTKYqVIe4eN0@%=r&=e+jXd+oK}d+l}4$p{pRGI8FNoYk2fGt3 zwTZ0TQJwUk)s~a_qB+kEJ)I@xt{)mYc(KC0cfKF1GZyF049gSK+aCQ~Ue?blM6j>C zW5C|opQjdYOgqp#_R|5I{NxK|wR{yy^EdyJ7)FX6i9Ucwzujj`KIswdTy#uaS2t1D%Ze*O?+{jbqq zbK_6@$a;i-yDR=l(R$5p5v6x_a(jg)-U{L0ys={cSflI}K6-H@&+S>VW#q=k&HLus z4^-* z7rpMpw2La$yw2zE?{D_a7Cm01e=+II+?rvrf(eE4>!jC?=gZi7b(wtZseS`4MmRne zj_7>%HYIL**3dPs8|p7Talh2xf86Ou_mj8P*$s~PHt)>&i`uEBJCc2FlM*0Q) zzXywqyt(|peB#p$p)8+-plE!=zh8X*n zs;(!xdI$KqyW-#Y*bN?x{jq#y;_Qx`dAF7MjlyH>O{S?uN`H`X-*-04|G*dT_y-1A zx7q|8HX3eTYiYMVy-B41giR_uW>Si&Y1whAX^qxe`=;iX1TM=G)KdI#zxBRR)8&iu zb!VhZU%nfYT@~@d)G~hl&dm)!Lfm%0Ro|rU{iJzQ!SFs8N4<}JI^vYt!y{)8t{V8! zL`JoyVNyx`?XS~HR(ug1la$=&NXy};x-H2A*PlM0Y&R}M`RW+HqopfF4Mlw9b!Rk9 zKOFsP#L~@PCjy6w9oXP4oYE)Y*uf8GhQ4}}his`D@nU&*t>Ngu|}+)?O^$k1heCF!_C-M^;0e@%D)n(qEJ-TiC2``2{$ zuj%ez)7`(OyMIl0|C;XpHQoJdy8G93_y45nj%bX^o;Cb)5coI|`1K(Jy)nuSsWGa| z#?=3q7JuISvX0H^FHK`xw6>n`@Cf$5DWtPUEMwY4ok_e=TNcJ_TvYg_y?Upih`h^3 zE$#lsMbZZ&KQvm;xRUp?<3q!-;hF>L51cxcv}4A`yj1OezN;&;MEE?-#8yg1$%UGg z8U^r#WxcfMxZ?0IC;LaxAWM-2*Omocms-#^e7t#y>f?29-k#J|Fgx;aS3e`|qw{5& z`aV~8mT{8V^kcNL-9I=MaGZ4P7M_pd`#xp zs@Yd^hbTLi_Zhaj`-zMp^S}$DEUiUR5HKeD1|O$rm>#z6zS55tBY+&Bz($ zVh66(zdNVZ{GjqyZCFS7kH)OFpasbciMv%2ZXP8iuf_xq{ZBsSOG)E|QrVG;kJPHG zl}i^@8ueTCyWb=!W1gA(-|Td*@b#Tn+kdY4Mr+^E+r-_DZ7nOGn0{OC(eU6cz+_Kdi}cFTJ92cRl>dx&n7mytCf05sH(1gcYnw=v8)jZB{QOTYR-zt&#Ng* zl$=*CH_$Uj|GI0=xoTURbC;*9FRZw{qT=0!6)!tQM>-!46&^fy|LmdbR(u(GNLA!k z!QL&qryuxGRk!i*(yB|MH;$AZoN{*T^Br}zW;bjOPdX@3#@An4CQTeD_Hbx@&Z*1qrugscYq~XSs6w^K z4x?0lv)H!iuotz?(et9Sv<_r7R~b~dOxW1W9x|LJKhMZHP62BY|stE2=~|;f7NN> z>sCjU2<-Z)KRLsGbA^a)q)3}-^U8C9J7e+%0zKE9T52DD&F{gjK#_;LL`7e0*fi*6 zwdy6u#Q)WMEX`$}z9ZWN7LI6By=prfe4eDHycSwq6>3T4e_ zkI+snIi8U5cFR?%W5v4y4_AE3%I#eHzR&VTi>Dg>0vlx{mzHnec>Vl=(c6CT4&pKT zJ!A8+2Yo)Q{MoMOKTz@gv!~CdW%|sU+dM1o(39H{>1%(fW(~P;^VCPaUzhaj&L|Ff zJp72V>>0g4=UpKyCszK)I55U#>n~TQU5XR=M&2v%7#Q1dz~XLB{$bUlv+qxFetRQe za_y?;p?fziEnXUSRHJrk)AXt-2W|4|9mRH6#N0gfEyiP<_Up4x8|D<7+w9df_u?CL z?UDx|p5D{uQMNCXZ%A2Q-QX&wduH4|N;p ztl@TaUh|zd_E^Iz(E^;Teb-_=XaTnF!(d2qX#8~a^i&9T#@bdnwgG>&R#vT(RV>bw zou4H;XWM)e`Ak_;1=*7OrB4(T?!Do)R935dJm}t-y83gX?ce;>;$l=y{j-<;xAaPE^pJ0{ z+1Geptni+lz4|AAjziY+hmW2O%{a@T?#CU^!MrZRxW0@Mf3qdlISpp4`#+X0vAaj&gPYt}=kHK&RUppNI$9U{pS9%JZ@hQ&)dZ3jMlVOIYRp>;HBS@Tm-beJAeMhV85S>~OW~GsaQ(%$)2!nO9|F zBC<9)A2~6p*>R7OwBd_6H@z#bPx{sTAx(btik;E=8m-Q@H#)Dbd)T^m+H{4lw$}Bo zee{>h8GXO7_^8{Z^mS*;$7wHeY4megBch&KdHrnKGufNEnfn>p$qRp2N?x$!YuPM& zX4%Y9yVtz1GTWh+^7~yX@8_?9cGgOo4Vt4Hv`#++ZxTLuwz(!hDZ_rX-M9`h+0nWi zP4u<5_x~Is)ihiGP05OMzHPT;<~bZt-D#+}QH!@}UB<3{BZLI1Rd*UW`&ug2?3yUj zl<;})@o}2NM>~eh?jIvL`+b7c_E7>C3^#_KlGBP6pEqs4`l*Lw)^AxCw}f~7#&1Ih z``j5gAVhczpNB|d(rxv_>9cFLWQ$yxzn*c_=K8Mn^ZW7jHQv<6OUfjGZ@lTQ|N8h} z%HJb#^_5o5w^G62lG%*$JVgmvN#-vm&bGQF(?`?o@h8SWyogNOQjGrn%= z`7(X8RLj6m@#1xY`ZWuLs+t3bNG=|hYwI;cQqRV4`YUt&^Cs;^OEwst3eqqdAJoz| z|J&doeh?O>dVRO-o9whay=B*LEkD0&RNj>{ zeu{4z2Ufq$KCt)9UU`p`V$$;W>Mlf-#3*H0d3crFa5$qIv3lPMU_i z^gR2ict^I}vjFvfJ@h@vhOn+6%?2%IdCk78#tF z&{!b|{-37akM?=C;LPf$4I-D4$C-+>Dy@3D=ea`Q-N$(rv!~2?<5;tJ;CVd;Z(;Zw{~nQof2{6jp;CZ_x8oN#HMrBV2dWlMSa>(yJ7fDGt%qBJN@F6|N?u<0>sE%ZVdk}j zt7XMkOX4$5zHQqszg+3_qO4c5Lw>#ZU0s9GasaWk9SeUm4y5^~8fZEZbc@P6ZneoyR`PbOR1v^&1y z-E#JAL~@Gxnt6^X9*5=kEf8v-HrL5FF<;#ALH*ES$HxwmEcV+bvQcN!r=}BGgBu0& zGSnrvd!LaMv>Bc9#zM%}c2<4H+_=W4_SYAx=FTb_6Is|Mem^9(>d<4IJ0THsRU((h ze7W*=_46J1OFoY;{*=#uUgx2sXX6ga2)Z6fANpPtVX+VA*X@1R!tl*eA1@7oDAF~-eO9x6~aD|)5P#OGo5=Ld`u71lVl zQlKo*e6akICth!OLnVC`eD^3#y>e%^&(Mw~RluxfCnc@dZRX?%&Z_%Cp>C#^B+e-H*#f z6Z?dXixa$~Kk(_1xfL2BbB?T7A{o7R=+P1TGBU$n&*i_!Yf$j?rK)s-*3@l+W}CmB zle;)ODq*Dj*a}`H)iXlJ(;fA*c8HH%zud|E_GrCy$roW?I^FUkjcWUB)7sK9x%l<_ z7kn=|{AE7fxM6=ac$wg`OYa74Jh4i+>fx&THd77P%z7=U`BP%t6t=y{ROLTECg@ep z*9Z;gQv#jFYUv}SLhr}f9!t@DGx+L*z1MOTtFs$hH7u63Yb`mn*?0PNRq=e2H?Hrk zJKYSvL~hC7|6segcZd47b4Tm<>|f7FkjZKsyQW zLw=6;0*N~-WhJ5prJlPmH2+!SDqFt?XP)kV6Ih$GHRBRpXHUjb#}$( zxNYEFQ|iU_P9;A=Z%^0~`&!3E-%fq_X#Dn_5g|oEyLapm_ zF7s$jvmJSCo~D3J&9=I>z?$qs^S!2SAMDlEf6R<4`g81@GFD!=p?=@Z=A6k(d51T{ z`pro0dtyS?VC{_dyKlpcOYg1i`1sJ*bh5?dvQ*>S-Zp#QbQs;6bmeNj)~n;5MfEB9 zt0q`|&6l3t-(_R%z=B^V4}N+gy_TolBD3R@X!F8xF@5*UY1y}V9 zqj>40^&6i-#mC$;%d2D(FFa=ChBqBtQT=J*k$Zb&zcqb0ni3xPN+(vtVoKxb^{)d* zSWlgBQ(0le!~blb{mf0-s(7*?KmX(RA>pSZ+~;mvuxeXUW6_+N@Q_SVE3cEY6K-q8 zW*&~;ay22|I3O-hIc3?D;s!aM`;EWu?Y=18CU_y&f6+RRq1r?F5_e|q)8I=;Ez(cd zn`V1?iCaob=h5R4heO`axsjweQ)yTjU-ZfWhbpuqlVaqr>DJ~J<_BFV{hBs+?lY&8 z-(tMq*DZLuVaDp?^Cc?x?i%fDzU!jm-qU(T3O9M~`QDzRzvz`#{V?7J{?RW2$Hr}Y z&p-L?@h4J?M|dXoQ>o64dne|h9cwl{VN%^CTWxJ|*@zWw#d};s-qa*&PnS6}&CEmb zrfuzJQ1&{b6yLGzx}L+e&?hzutJl~qX-P73?`-qf@GPiQzwUzDe9sw^y6yy$73Suk5qDvYOOwrFF8CgbE(lhw5y4eti1k z+{m8`!u8v$D|AAmbK?TT`PSHkdnp~9@!0;!uHl1k9l7|@>9^9$kLTwXI348;`p+~^ zB5h5Pf%MX)H;ztvyTL>3`uxMH%}aObU+ zFLbBuIXyW<>^rZeU#fa;cLonIQFay{m3=%*UL@`!lhm0cYIo^JZbw4{8pwwvq; z>J!o;wDvpi^*HOc4~*#a2;Rub8U1IB7;TZ0^w~>B*!kmgq0E~~7cByfPB&j2H$W@& zB4g+9gcBV~hMH4;=6IJ1H57~u|F3~1M>{~N+t(M@X z=H2alvobZ+B>P`f`&DqzWU0qwG3iwwd^hTQ9N#_XaiECM#h1VH?#^3xJY$Ud{lz=N z7QBeuS^Deg^m%FD-+z@G6Y))V-I)1`0zn$@l&9%-4zn0PIy>#Q#oIa7uDi=W?+;kh zthOyWb*)U!sLufhuOEsMTeNZN{Z_`~lSa~xU#G5n_;p>Hb+JUL)q=g(je^b$`jt3R z$l@8Vjh&`b`XI62Ve0L*g;GI%$LK#>tfDndqwj+H3pR=3rH?X?_P3Uu;F@W%i#K%9 z+rF`<7Z^=$Fc8f9nre9?Mk!j@TYdL5xi^bvS{@s)@W!i@t;1gU@pw#_*-^N$=<24c z+3}6{pE*92u=GuuK67vV_6@)E6&~{6iQP5bKxgUBWCcSWExRu+A?uDA+KMG4HZ&Ml zuCQ1)@MX>d>Y`xJB(PxQz@yI>d1LIfePjBfpE>yd=Z{uU_ z2bUUF#SROJNjspl%0zsvc3OYMjT?8pxG*sOz>NC#Ox+fh#b@5$+8Vj@On}zYGvC@u zWJPtquU?(Keo$lH@5PlfCOGRJS2l5*BRSlCT8&z)dBXNY&4KYZW#+y1ycaPtRIo?dq45NEjWb!PurVy|63>4=WVxu!Me!wtn(G6iUnMKY7S8aPenUN#f8?Q?AL<4wTU}Jia=$cG za-NOhYV|$lDI1hLW0WU9cp~+}=tpPFPq#JA`;Ok)H+@GQucp_ z3n$;7_59?6YvanJr|I@4C5mkJ;!DDnU4;4GKZD;U`b7kH~t6RJ_cN`w`V_oLkLC=c#!gq^J zHH~yT*s*Wf+k7q4&KSFvC*K05y%5daol_K9kuBP;H=})B&gXu`pDle})~>skbd@Ks z@nzp2;RSg*!S=;~P3TSF=`$nT)Key?Cdv(hv-DWXJeH8pchE5yi7KrfwX+0{{034bS(j zC#Np{H1VfGbx>iOjP~MB@}b28CYeo|{_L7{j!9(kWziPwpE{;hE&KTtJ1TD+dyWrb z(zUy{1o0u%)|;i>%~t;NKbE$STd{h)(~{hz&-Njg3-a#{tY{E@=Mx$?Mf+RG9GYk`2pNDLJW%je8#H+*9B_Q%;?eZsul^gOuT^sT{u*2ua zZ`JJ)|4q6!V#xcjmuvbEmlW9PsBJ>LTmYzFUDeaAaNK{cdSA} zBxqQ;77lPru^v{`@5V$UX@@=w$|e=7tbBeu?NQUzIaYPmI<=Rw1%)q}jJg!V2v=ND zuC`*i=aQ^Tca8SA2n_U@F{LT$!}=4mGB3*{XCw?6Xiz#VELms$kbE7jWkvasO*?Y; zzKimDRIgYk@cz7sa!HEN;LSsZ@g!M!Hs*NgY4FE5 z5sD<*`)1)CD8Q>gXYDLdMD(B3Yg=1@kXXG6kBv2S^z#KnrOU!v69gl7Ic8fvm2 zzWLnvJtPH6Fz$=6SQFtKQ~{8MRX=lem5??PUO3H+WnWXQFu>T|oyRPHM8Rj+k; z_~GGNIkkMg<`%Z?yxccL zzUG_kYM(R4K^iw)&z}0^r1MkkYK_wJ#d=zEcT92%sGmQk{|`Blw3myDXJ~FeWj23l zK*r;b*BdXFgjWgQu$Nw?y((y8@#ndEHs)quwJQ!vsa>8wQ^Dr8bICpHWnmK@6j+t+ z=-h6o`=e=rORSV;Xt}ac%-P#V!kx#fPV+n)7^1VtE zJqra(D+_HERfW0kPKvIw{zJ z`LgGL^)HQ%EiBD@yF#E)s9xg5vEX4UDdI1W6rJnSQ2NlR@^{tpS}@zTQ|w;z5U z)i`{3$e1vxwFMn7qs7PXuw1UNL#;x_)q1{W--LF-B8>tO`_u(4W;_S`Wk;?&?XT%N zY0h;G*>%^%X6W}X9~(5zaps}u1>>TX7e!Tw$yBY}Xa4*|)6jxXggVkoAxW3s(L32i1yye9WnirONZCGp~e0PIt zs8_P_P_tyAx$U2<=W1_1HNe+FTKD>s%Pn#~8d0Vzg-2X>$=tBOxNq4dEs>nq2YzzF z8cl6E_Se4LO4Xc})8_r^m#JmiL@USWzs)f=E(H}j~<+t;;mn$KQd}`@=D$G zud1RCdH5Uk4vapw{m!lV+uxPVFm{&veY#}jzG*>k`WjbxOcu7fKJL(|N|nh^f~FqS z=Z#WH@%Pp|c7KELK~>4oyY?IuH$3>nKfze}M?kuRre}rsmYoWbZ^b%uI^*nj530GF zm3gaGG--Kg?Ssh`RadiL9}7;kmht};wf?@Q-;3FIN{p6%vz=1%`+2HYaOdSuXPeKB z?KA$V_xj~kk(#PX(NCwBSMqh9U9m3gYaRG=IO(iv9$aavWh6AQ;H&AXuZuuACJJMgZZ>MdT;AL*7s1>IyvG4W%(MkP3IBHE2`eB?JKjDT{AIBFFPx`%; zG8q+Ht1KC75vTDeP_5K=aQ)gyP1!4^{cn!gX)Gfq6~(J}-Q|_gz#jtU_scFj?irq% za$8rSYRS=W8Is{DtFHX&slFdcEjCRU3(MP zID><`rH>s}Qkv8>^ry7x9Bs?1+g*M0g8K|N($#xAGQ;-4RQ(B?Zix3CoTKL8dthns z;NM9Sygv>&Y?xlKT*1L-ud%Rew)7KY1DVB}_0xIGBvzFxzSB7P?ni;&s3X%V&edF8 zKj45-b6xtq7kkS;O}prGU|D^d@x`=rH6rJAo84li2h1?w-&1hz^vJhak8VZoi9hAH z(7R>pBU_tXT@(ZlH>WZ@y6(e0z0SLeYjZCZ_jP zj9-m#RGxOl)#gEZ)uytWl?rAZ-i^t>zZ`h)Z`(0rQK~)#*zfTL5#!Lz>lv6siWtiiZkxeRqB*lbsQ$FLv+~%2>q>SJ^{0z}HS*6Jc3MWS^W^@r^%BmW9cdSq>8PDru!T2v z_q-|E^G~#-oUpXhKd_`g+sSYK!*84JYwS6BPHwD9otO6AAu30F?jE|~zv#{TPnXR6_RBl{^4nTI z*HwW}KK2_BI^({Np{I@F!mRtEG(Jj+~{y->kK{#Mf=Frt!CRdX4QWW?{{gV-5QnmXUlT~UY#$` z*Ixfh%PvHvZVtof#`jH&8Ipw#8zx@jad>81zjBh!?^0p6vT{vNfeAdt^I94kn>{4H zU#)sD=D*XKEpN}>JyFr7xIg4SPt)hGUUuGFSQwl={c~btT%k+lMVC3c(`7E!?zR(G za5(YasdQ{!@%Td_pv_D2RLk(xnalRMh(1ZUH&$%j_W?IUzNsJDRd_&b;<`<*Rl>hL zJh{4J<2|7>yhAq~6}l>+K1tuPsA+5RRyPeLIXzYBg*;Y#x9j}p7q4%Kedww3jkn;| zmI?ev^54eAzWWmPYEjzybH^@;UtQZIzUkfe_!-m3>$oL`h#RlDRjiRnhV+ZJzY`@EL1dQ0ZG@$K5Dr8iyu zG4=iMrHL(Ok4FwWeXmLSjdjUuao&bqS%+*At1n%%SRFPaYOL#Hr8|#qnGM?a$y+Y! z%2Tl;`H`>X%tHq4=)YnyzkbwC&sA&tY@IXb-AC7Bj+#@hZ;^cx)p+9QJ*S4tBO0Hq ze|hlU)ZKUeg2m^UF1mU(uf}21r8PPJ%Ql|*{CJVSTc65s?ad$j0vck1*N!@+_T<;Z zWVL`9;laO@Y#!|roN*<28;HK+?+ISevsc=zlE37N@l@5u$~Dz7gOYHD0q0lW99SZlb;uQlpV@Y2foBiZBiC-d$8X1-Y5>~Z8!eX|YbMH!bG#w`q+eJ1+3%69t{ z>&zt=j0*m%UfdEkF>AKMVS9a#&D*`!u8zI1D90ez?D$9PqWdeow>kK>>n<2@KCCvY zy-m~Hv`^ph{qP{Qp?Kn4CW1bosL|Bs*XNe}xMAq_#3&;Uk1HaFq;1MwCi?15$% zM8Qiz8H@%224no62ZFXXM#?%P_<>fg{sFTc{k&cM{q3FY-5vd~8+T3&s!tk|2mJ+* zNrUzeaP$iZ#Ja!0gR%EJvRvbnXQSuaJ;@K&1^0q%9^CaF$*!kk@A_o>bfSAoe4X|U z2AB)2t~Y(+PwxZ%58&fT9G>3&-cRl(^nCdx*@O>+sZAg^vh|i@1dbV0Q$=oQ1h#R^R!gw?>j0#O&0h&k%uP zOgRSz)}M&7Z&{swB1BLCA1kMHMwSjv`qsd#?Oa%>&d+{zBp|y!abcmX5c^Fg+P%rJ zplt$tpUwOcyNdG?5eV{Tf)U46DG^<57ogXf)5_ooEcL`!ueY=X3E&*aG?I`Ne7X?A zz!#J_K>A^pJr3-|R<7yU0ln)0xQw#)h0SHuJ2!Xt?2RmalU;)B|#Rs_l zeh;?28F=tG=)vN~(1W`z0BZwA9?TiQ-l0bR0pQ!+ZWaXaboXBA>c?dR607Su=Awo* z81zbzW5l6>pJMymu6k35y@j5cqPz2Qlm*7NxzgCYprwB(auCIK4!hC+p%~BAvz%?u zoHFh}e7acmz!+${gw5CiX~}^g;gTWKfEP6Yi1owyDrS ztQXQ82(}q$^BEe__s@VRB?QL6%u2Z9O4?BJd#O#BDFY8yvbK~Ql*GqA9x?+ij#x*H z_*-Qn4Q;?@oB_StgfME#V#?{lY(d?K?57Rh?|V3-P*#W7?_@_O91W8t&1^B`EruHA zSr5U2&?2SSK{MwX;^^h;>5BbihEqbvCyMpSW1%OvP&|2-xygJkk0%t*FPBUeS#T#? z2~-cPc#M{@A9&Z}EnFR4yj&FnLIOD3L4eE#`BZ2Fh=e|a!CY{Vy1+`@cjN$C;p^^0 zM_8?3%n6GCk4*-DFvh`+JBEu2BCKg>J)-#*1W#!Yw_%K?J9i8hHOF2(FcUl;T!Q>K zV30)w=3oa#37$F&R$}S^U=EZEO1Lt}T7puXviD^f$d_LRa5IM`n)Qk{Esz_HC7@B# z*n5OFG>yqLXn)+@7tW{%c=Gmw@vV{Q#xi#sZ9F-Q=s?yV*@%uOq6+N+koP@o|IDrE z1NdWqFm1e5YfXC*2&2K^=RmOiO3~`aXRa)|Z-c%%+$$%7p{5_C1f_IvH1Hvp^w zk~ZEv&SdAN{-7|)$6#ne>pyf4Ivzjl(uOzHggh<*@xCt@z+?#CFOeIZRa8=LHTF?V z>JJVN%If>M;YjL*CW)zDa8fK+Qn$pU$&rUFYC_`lE;hqNt0Zo7$VPC|v=PodSCNP) zD@SAl@_rEOc1cX_h#cTxAHD%lB^5d7z}oHCVGa-?%AkVC!39=36H>W=@OElWQkR%C zqhDE`Kyol1fInGi(oUXckFmsWXDprlTwSsHn}3(M=4=-GjVuJYeIz)Xl4_RSqTRyE z09V#=obPHdU8Pp&vHcZ@$im=;40eHs9G>nM;M^^D5g;lq!;e}69Xe?)D`db0Y7=k> zu0kmx_&l-Ju;5el#jDg1ER5rm#pPlPo2+Y6@;6g~2-N@+#*C?WL10J@7X(>@axsSW zJT(bg^x?T&NGxHlS1=!LFct+$2_v?TOnahQIM_M|!5^H1AELu>*I*Gq2yn6^!tiT( zT&9(<^p9V{0ssL{-fA#B>Ml*V3vD?6lutJvf;!e5aJYqQX%9glqlzM3yMttT_j#H& z-%xh4Yax)H{y=)de8ES^d?F{%=97O<1D90I%V_a?3QvTkcbsIG;0uC=BtHlq-8lm* z=r+GZrnA$X2<*pCk4qPV&GrqItae$EoC#69IgB)s@=MkKd@_~8=iP*w<;s_2oq`-H9g`YTcy5%N+MqSzI(TwkV#JitZ=aYUb$!sO{)NkTo+G zV_2OF4rKa+xR6-Fbgy8?xWQOLG$jm=G?-;%hl7=4|G``=BVd304^~bHaPqE#mD_E8 zWH_S^+DQnUP+{X!1(Er<@hq|#!FZLXa}~EhNVz$TRkk(>Bg2W*Lfd$9 z6o8GF7DML$2@15~Q#SdQyMXh;Ks``0g;eVZab!4Vd{51cF!dYsDz~+P*2fx2R?S>L z5t+_TGb6B7M5LYAYvy?>T-dCdnUcmnE5e#NM3oDTq`qi^V9i{{4b-ifX<}drtE|Sw z9t_jFU4Uz&MMduP}mB^vS61L_P|b{rE!^yfLzJ@@l*&9?51X{NX9~X zNL;=nATJ*+n8j2ru$9$z^pJSBE+rCo8P){B&o)0iwl{+QRV_= zrr5oTSVe0MI*csvxfsYQ@KydW@jbDBIkJH)*`-(50V|NPEIEb}OY9S}(;7iD?E5!Z zV%xB^Z6FMV93%{(p{(%ziy0td1}sStMnVoA@T8~({KZI!NnyE5Ko|;nhr>fr3GCHS zSWYPjL(!bm`u;u$;y$3b4zJIa@V^)ek#T9S&zkMCr(OUdp?Nxkp$~b=<28RdlAebL zgc%uLlvX1J#<3Q3dd!5z!PxW{<6w7;Kp4fmFwG_4c7d@Jw0x*SqezZH9tG=xf|AQ# zJTQ|F9w@7~A#+J0l_nCF;KtjLk==(3nn3377h|pm&irr?L^!mVVdn55|(sMpj=vlMh<7NCJozzGQULpLe-??um$&Yq$QvdyUz}k z7P6OWaIeD6WNIEQffk{$-v#tNFrB`G=`ng@EF2GqQqeKFlJQ)Pk5;uV7@+{;3tkNkm~`;tFOq;08;WB zsQbc^@HYa5Q1+;iS8cE8QD!xOxn_9%;phqKDP&rO>38sNI<@{~55vx#TA2~!3Co8O=Ft84d$NjiX z%p^HOFgGMVlY1Mu(?}_Svw66`u(t2RcY_Z`}{`t)Y<&T7LbFimNC_5GI2N4Z> zXA|>o5I0BS3-!~94BKS|0*74TW*$g!j?i~%j=L&&%URd`9GCaZu$RbiImE1k8q}p8 zyKLdohK9{q`Xh~>K;JX;K}LehAt~GtWJydpYwXt^J`|qr25w(9Z|!dhYg zERq*t0OTD34?un3J4R4vTE!z0nFJ|k=iN(gjeY(9fYumytU!}HyurC5J_YsFv!6Z)@>FusToAHaQCwJ4fg7;I#ZfMz#`XY|M#&kgAoPF>hM`EY942Eh-BTh{0J8AeOKt8d`tKL=LF7|3@x`#Gav$P%85QLN4f z2k(Hz2u87Fi(Ua=pa5C21tpO1N3!$JfC^)}OAst1fP~Ai$a#c8l$}^L&i&6-3_J)8 z@b*hidz?km6N6xp^az6>?@YK%Ddb9P5X44>RV~68+?;L1?*Ucq1ynUWh6p!WV<2(` z?JwI;E>}Y zteUoM;>;leA?HaXSmgLe6bP}3bXGKXR=03Qu!@}am>Uiko_f1DlZe2EpKB;#?0tiI z7QlD+kVIjPH=3XwTEpK#c#PB@J8Imq2A zTFTS)UT-9H%`9!j)kGhA<9yoxbHRKn*_w#cf#rn4hLS4tz3L z)G)#z$PpKw424YEgCK%1?a3fVW4MLE|MFjrqo*Q8n2m*wjGZgMzCR1T@dN8};au9I zU?&I>#^5Spe2MuU2-q!t+@w7Q+$~s6Y6ye4vS*M1cuf;S9jH>ckK)rU#6hqsQ%WlP zKnUv^nF2&AimqV~g!?GAqXN4XDoy*~c81S%aJ>umFxc)6;>2Qh60sL0Z?hIw;4E{G z4j5%si7Z3jL9pIZyUX3$KU;>gg#?V8(qI^0Au5c^y*U9RrwkZ2y95=6Tp=e1Ls*Ot zE9VX)34h9+K^R6(L$IEF`ieV?$UCU3Mou?Gc@Y!;eczz*x(@)9*0EQwaJ$3qchodm zs+A|#*7Xty*yDk6B~CNgZQ*-vh+e2wrVru=j9>L!jOktAf?-SFbAho0E6Sr2;e<&F z4_n#)`XiScte44-dDDf@-O!LII-s z2m6VHopE?0qJ@8cvqR~O>|tY}o=YDJ*g`!EEBv~RG9(ecUfs0wfGs$DOa_M!rc>ZG ziJP1r9|%4>2@YMzImF#ZS}p>FrJmot2>Ql;%DSxhgF(JEjxXwa=OB=(3Sj=2dkMG3 ztd#?XIJ}|eje^{lQP|s)$AZ>#c-m(DjSyJi4z%s@&u8dx!3}&{)%@OU#%^a4TLFwA;cMeQj!z9lQ!Prd%Q>*xaK}OiuL;rVnb-+U0mr` zFUV00wqAEQO*{x{w5=zH9k@G?cMLk7h(fdnP+mPX@GdCBI)ck9cmN_I=mQ|+GwlJ8 zbu_#HHsbUK@K^Pk75y%nYk?B9!dTW<1-470<7pLYh&bbW{)>hf$ZgmkQ-9zA^oRmC zxQn}=LU&|CO+Ht{zj%}b*and4nAHj#D6Pm1*h_)RJW}9M+g^zqj-*g2V<<6`z^3m1 znAb}rvQn?=}a=osRT*r4tRGbv&M&u?|LLomoqr~`-Uny zIdb`KAMWO?3K>3&Da=7J4$E{%?>@t3^3loRQF6efYM^xBcc1M*hxI};!!LfBFc;at z?i9o2T*y9rz}Ri*Sk$P+-iKy&Z*c4|()Kr4$fanDn(4dxZe9!$5_V{X@5B}^K%RPH z4)9>-?M{0ffkx>D;I&%da**{cUvd_IJr1W8E&;ShQleh#a0-k<25bQMy;kqgN773P z0>9VlmnHHHpky@m8-S_maE;((g^c`LQ3AhQ>MlKC?>0M()>uf(R>Iji=Ro$;49A&N zdT5l@CE^TuYs2>p{MINIGxsuQGYKAf3p4c}o*PSO@UT70naF-(;V%7Ei`ZLeY-YkG zJrMQ?R-D~q0CK%qk1sCV;_!6hgv;3qfS&VO1ID z$PL1!G>NYVt5AXOepWb9Lukp99Wx~AP6My%`IWLfZirrp5?FQJap7W2@1he7o8-y` zh8m9uha)>S{5#7n=rF?1X=hln!^7|WpW%*d>>vN94R;%7ecuFJ20S)pEu(Dlp$Vs7 zL?iD)*mC_4nsEAkE}sjH?%x6NY-^A1Z^ck#IB^1`J@e$FpcbTi-B#1$|5f=cYwO7a zaiExFK7#e9ne6#D+V!Hc99{kd!^YQpUT53%i#>l6khrRh`yWE;JN@!9M*m z&-OTIFE`NNibhzaen!FcE*QhWh0$Cl5VH$4AhVxHIQm~j0ivuL;f&+}2rGecG1S)K z;TE}wMc!@9OFdi*=EhM&=+&^u@r+sX!5JqLs2M~6LzPbCxW();$2s>7aOV7N1q;@) z3y!j<=oxbR5-xiWW6l-6RgZCaI?ERqC~xu!=eo0UVCNfiI2# z?dUMF^yOk8Yc-YSz%dY*!P>2`< zOIU=FWa{lY4l*($d?;&`GWYsljD*NVv`50TmB2_$|xpmZt1N^;O(-rM6=o_mXeB%KowXyl*`Ytp%mC^RBU zqfRL~IK!3qY0ap_?z01>h3o|>Tz8$ucY+ z7}L851H(kyxWG_j3gPxHBdzzd@41iU2J2;Rg3CZ=?OaSliCOGJC0qtN%?6llgLc)JQnwOquWwAeb-r z`0ac&0)_Lg<$_lC`cIV;?wl2lsODgp3uXJrF{y(w>m}gO@*-10{vw zprimFxyf!7iRVR#KUS0#4+?zIWkiW9u%)?B2xcei!hu0aiEwMBJgjOB>aYe^>lE(3;Zy+ znGP5=__J4*aK>4xO=E&lR+Y#&roI3HO7DzMj-l|0TV*D91BsxCsx!&460Tr4 z8lv$~&-bj~w1e*kn@rf#7MU!>``jo$Jc6$i_Vn4CR=Z;wy|qW5+srxCPbV^O*PJ16 z)CxVeW4|XA2EQkTFP>%RQFDUb1H1d&5FkRO9tRf!J-!P3))$7@TXBQn8k`csUJ}Fg zmSJ|(5M(KgEsBO|%=qI#3is@DbK!;{OJFX>usRof>U6W`Vhl?J>=mqt8;m9DQNjqv zmQ`^W%ItZByRBp$xL8KOaQ|abbqH{>Bf{{}jx^yc+64hl-qLV~-z#@yII+WFDT%-* zZ*|!CDlcUIpPf$|-kNuKEx3E?`d~P0yj%b>oJa|@`4@j!#w36^_Xy}{xX;Z!gciT2 zeny!3es%ktPXT%x_?5B-bk6gSM5eQos|akDfI%mU*!HB_s(N1Pj$sbR+&mk z!=o^3;DQUBmp5{uk%SCQ5M1CC+{6XcElX))VA<`1g6Ul_hJjB}fJBVstN_@r7@TUf zHzQ0W%Bm63pS%&^7PS2wU?kZ|xnu-`9BP>*w8q3iJopTbIL*=u7BrUtx^ zj6uv4_T##joE}fsOk95I%sKQ#gKw9y3v^vZux!!Ycej`Zh74i!>E8g-Rex|9$uKwV z(|3G7e70CSvEUe2&k4k`H7PB^Jq!aG{mSz61ECxH3J+X_GECxN5dpFc0I$ml^tE*M zb9MCwirwGQ%h%HtPM%!Gfz7P!rPG$X!20=u&%eRRQ}qDSI9x-z!2VzeETWBax`|oX z7yhen5}1LlUj?z^Mx=g#a;doiV>5&4N%)r;2#oVo+RshjC&U<&~gG>=g}+{+p4QT)t}fN1kk z5dcLp#yx;xiZC4U?hGY@IKp&I69R^OO#)jInn8)_vIM_SqeQUJfbiFUPG(Uekdq)5 zM18`a6s3a6Q3dA!rt9Kitdk3YoCmp>!kPz}B|bcgF|s+ELT~ePW;t+SvFv?Hy9j?C zf9ir=81UZ%;E&mOhEL#iWLB3`&`Uv>nPdlq(WkC*o>Ib0+#liGi(oZ*i@`5A`g|P~ zP3$<@cybVdEl(;y#p5xBHrio^%;!QNzXHJ(9BjE$2`ZXU^|bMay*s@Xz+N2*Dh6=5 z$x!(-LqYR)i}bk3f`Oy@YKgA1oychR(ldEtRmtY34s2BY*Y`og@c2s|P* zan8f+XA#aUm)~yAnZZ3%>fS$6oltORR-G#M06nzwn~$Xu=l*dwN@N zOD^^kaETswM5{PF-QVB0TdyKOR$57)O#ymUxyN_R1%6SRK%~#E^+4c|-^mWIhX7*$ z+foEJRk$&K)dR+KUp(3v4y1-)c@SR|gu;#N$Idk;fFt$1@Jix_Ad6PY8Dk$>m|5pf zA{flY7?!w6SyN;0$uO)B4;L6q(4@4Ch%&cVq+77R@Nz-uWUzulfRlF{eCIP*02xkfKH7ZpE`*I27eeO$*_5>5T22GE6axu`HITu^yN^eP z6PbV(AB(5tA4tPByOR>M_&xP2g40`e1g7PJXx>kf^}=hG3^JXafaT(LnB~_VsSPaz z0=DOi9RgIiuvrx>rKRix7xP$;2d-pr(q~t7#zH-|oLz$Nk07Eni+#{yN(mhFiyNq0 z!_u?|zJIb-<6;jR5lho97?^_sL=DL7R}7B+;_8SNa$7Y*){r*>eBrf@1B@gxDVL03 zkV6gg5QVG1`03OJ5wQhT)sRC9^ALq|a`iZKx@9JUHROB=YbV25)RaF7lCvr7eE`<7 zLbKUJ49)a#*+i+7iLCp;Q{g)^<-;a;aCo|lmm_vRf~xs7e&m!t0U=hzg0-ni*M!;x z9D-cn_1UU?#SUb#kREMl9v0LPB4=|p244@(FDa9>rsi}-(JllREsNFg(mT~wv2WfA zS<2;S?_6+ziL~Kj42zcS6|9;Yj3snZ!q_`Dtf*$%a?LKPJ+y4J7c!s7 zH?;ZW!~<*D+pB2tdumyP**|o0@u!6#{tX$;s%4#nk?HKTECM@7)uNSs^OnpSE^JmU zOG#rNxL_@7xt0s<@5`~Umd)S>>ejL}?SZA`kab+_VWVYx1@uJ$5-}1bZ?fLM!KtPU z1&Fe0MD!;IU|7~@tf!t%Jlu1+h$SH8-3ANh6u z!OYPeYYM`}AeZI~40QR@?ejozGO$0UXvXz_W(ovyarJZ!aP@R|LVclr5O_LxX!n03 zpg}-Uj*#AYnKh#vjR-dbZrJ>+@I&-qqb%HTx^;B0-P0{ zyH*(i&^b_8_#^;W=>Rbf0Y+u88#o47;p^^$PEhlnt^NS~>TQ8Is|f-*R0OO85ZQ!d zZVqM=Ah}1|umYysqyk_sA4CSc9N{!xkDtMa1wIPTQ5v}BBvncNEG{-j_&fAbSK;?b z+d~Jz8=%g|vzlP=hKdm6PGgxrw(mG~87#ssQSgyVXql%pQ2`v?oE&|f(5ETAap3|D z;JS@5tVS5NQZbwzz0m;!bwro016n3gf)!B8Gmv5(f?Zai1DqEY4k;VPVEkIj3P>G6 z1;9Rdi|k2q46R7~;-Vyov zCSO-bQkiUQ1fKr{yQu32mS-00SQCQUSnka=BT6%S6`0`j|g6 zgjXWP=CT7IAJegLZIPRC8hkL8Q3tN*h;4@T3j0z&oP0p1jM%sVtf>Z;pXu`{4PZH% z_X@*fPKjaBfRq^a36A*#R=i=u1qIWc@8Dw@0+^hZV6fH_1p6>>SC*m;USC!wvl{#Y zJaG?$0fYUV5W$!#b*2p_M>iO}GyoCY73^q($;k))0a5aLL@+ZK(Pon~D{OSZRz!AJ zqNNQcs}dMo8jlF>5-GI7t>EFK_p|vfBKu5tR&!7HmpDdcL@vH7RPO#AF~%Ij7;#2 zCm1}U1`+J83i35=Fj@V&qA+bon>*Xl&q@d^v85a95`Pm%1{!H-rys^bUe zY8~*>W}>Eog|1Zafz+NSysnvMtx-~n4))p&?s^(Am6AiMbJ0XF1vIX2-KY`WbxE24 z`0ZV}oB_SlpfE~AhjO|wTTpc<`;~!JbvS1f%IXkummEErtAp2bp0UMXd$=oHqE-^f zdlv>=pUZB_FhJL4MFo&E9t=>hqXb|n4i!Mw$1tGOoeIz;h&cn;p8)xx6X20>2++05 zyPnGBh8C+Y-rW{jzZD$)CV~PZ^IVA^WE$B#m3-#oQoLk6^D&S0_@*w1>^WqXjkc4j z%!p43Hu&z^CHM#Y{IP3#KA&ZGQH~#Xd#uvm5;MIbAH>#-C9J;)@Z$JzWj4TTrc91xh8% zS5V;&@j03k*xkG5MIS;~CfB!>A@!XW%LxaSyI~_Ksf3Z_^1Tj39UsSu+C950)qL6m zs96|MJ{&|)F|fSMTQYo><&!xL0KaqbWx3AgVln2*@zv`sZ9xU>98mnQ#fJ`Y0#aB^ z?=l~AXtN8V_pHDG8U$ExbiIyq8US{A0Li3n+nO9q}SA%*HQSoPeIL zF36IXh`d8v2c#&0@Pz#_6(R1wcdz!O{ndx>gZ|5r5d&KUds7yXP%(qda(W_IRV`(7 zXRn<`Lkac9wVnWyV4{qo#QcD1>Hbd;diIFip3m;qu{1}`tkvQ<)t=(Xz00dG<1z&U zHMg>#eK>dX<*}b3^c7&$9sLMFIOSE+vu2xEK9l6*NO0V@$A69ylbFK7lSOGcR0 z2B%6&0(L4vCfxraI{!Qnm=EMx2`AoC60lPPGGY2;Q}sAt!_*$Ll-@*1!0JB8gm<06 z=ZApbcU|kTANGM4DH2jxiR`Udy#txBu*!PEBe2pRfOH@-0oH8M{)3VLN=V26zeh12 z_5#hDFT%PE<3ZyEg$dZD0y3fA^hh}PL=&R}EH>Q6!!wwY@aOgb8S+wQ%>$pLiOg{g?WYzts&PlM*U{oN{1-ZPYB;Y~`6+zC}uo1hfC=p#L8kIl}*su|{wUh)rLUTs2k6LiKx!-#T;pOh^=N{;V z{8Ji(Q)`3HNii6=KePS-$ejIyow#=`;KSxzZdovlhr9`x!^ZLkQn>}Ycau19<@OJ- zX%)dOCtPkh#^LGYatq~68~d4uBU0;dY7-#^^y$$D|70 zR?zim%1d8-;Mk+dO*tc=M=KaXkH))jP#;TfQeY-6d_Eq{g&x~=!5HwT84h8* Date: Wed, 9 Sep 2020 12:47:28 +0200 Subject: [PATCH 006/497] * 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 034/497] 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 035/497] 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 036/497] 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 037/497] 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 038/497] 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 039/497] =?UTF-8?q?fix=20missing=C2=A0=20${CMAKE=5FCURRENT?= =?UTF-8?q?=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 040/497] 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 041/497] 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 042/497] 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 043/497] 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 044/497] 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 045/497] 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 046/497] 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 047/497] 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 048/497] 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 049/497] 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 050/497] 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 051/497] 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 052/497] 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 053/497] 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 054/497] 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 055/497] 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 056/497] 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 057/497] 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 058/497] 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 059/497] 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 060/497] 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 061/497] 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 062/497] 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 063/497] 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 064/497] 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 065/497] 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 066/497] 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 067/497] 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 068/497] 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 069/497] 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 070/497] 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 071/497] 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 072/497] 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 073/497] 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 074/497] 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 075/497] 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 076/497] 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 077/497] 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 078/497] 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 079/497] 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 080/497] 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 081/497] 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 082/497] 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 083/497] 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 084/497] 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 085/497] 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 086/497] 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 087/497] 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 088/497] 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 089/497] 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 090/497] 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 091/497] 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 092/497] 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 093/497] 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 094/497] 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 095/497] 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 096/497] 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 097/497] 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 098/497] 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 099/497] 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 100/497] 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 101/497] 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 102/497] 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 103/497] 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 104/497] 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 105/497] 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 106/497] 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 107/497] 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 108/497] 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 109/497] 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 110/497] 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 111/497] 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 112/497] 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 113/497] 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 114/497] 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 115/497] 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 116/497] 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 117/497] 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 118/497] 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 119/497] 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 120/497] 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 121/497] 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 122/497] 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 123/497] 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 124/497] 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 125/497] 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 126/497] 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 127/497] 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 128/497] 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 129/497] 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 130/497] 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 131/497] 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 132/497] 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 133/497] 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 134/497] 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 135/497] 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 136/497] 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 137/497] 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 138/497] 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 139/497] 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 140/497] 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 141/497] 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 142/497] 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 143/497] 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 144/497] 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 145/497] 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 146/497] 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 147/497] 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 148/497] 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 149/497] 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 150/497] 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 151/497] 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 152/497] 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 153/497] 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 154/497] 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 155/497] 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 156/497] 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 157/497] 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 158/497] 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 159/497] 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 160/497] 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 161/497] 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 162/497] 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 163/497] 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 164/497] 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 165/497] 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 166/497] 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 167/497] 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 168/497] 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 169/497] 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 170/497] 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 171/497] 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 172/497] 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 173/497] 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 174/497] 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 175/497] 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 176/497] 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 177/497] 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 178/497] 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 179/497] 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 180/497] 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 181/497] 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 182/497] 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 183/497] 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 184/497] 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 185/497] 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 186/497] 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 187/497] 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 188/497] 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 189/497] 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 190/497] 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 191/497] 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 192/497] 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 193/497] 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 194/497] 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 195/497] 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 196/497] 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 197/497] 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 198/497] 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 199/497] 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 200/497] 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 201/497] 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 202/497] 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 203/497] 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 204/497] 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 205/497] 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 206/497] 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 207/497] 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 208/497] 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 209/497] 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 210/497] 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 211/497] 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 212/497] 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 213/497] 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 214/497] 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 215/497] 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 216/497] 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 217/497] 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 218/497] 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 219/497] 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 220/497] 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 221/497] 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 222/497] 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 223/497] 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 224/497] 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 225/497] 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 226/497] 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 227/497] 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 228/497] 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 229/497] 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 230/497] 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 231/497] 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 232/497] 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 233/497] 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 234/497] 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 235/497] 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 236/497] 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 237/497] 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 238/497] 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 239/497] 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 240/497] 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 241/497] 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 242/497] 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 243/497] 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 244/497] 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 245/497] 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 246/497] 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 247/497] 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 248/497] 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 249/497] 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 250/497] 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 251/497] 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 252/497] 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 253/497] 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 254/497] 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 255/497] 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 256/497] 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 257/497] 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 258/497] 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 259/497] 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 260/497] 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 261/497] 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 262/497] 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 263/497] 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 264/497] 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 265/497] 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 266/497] 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 267/497] 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 268/497] 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 269/497] 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 270/497] 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 271/497] 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 272/497] 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 273/497] 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 274/497] 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 275/497] 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 276/497] 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 277/497] 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 278/497] 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 279/497] 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 280/497] 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 281/497] 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 282/497] 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 283/497] 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 284/497] 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 285/497] 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 286/497] 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 287/497] 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 288/497] 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 289/497] 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 290/497] 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 291/497] 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 292/497] 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 293/497] 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 294/497] 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 295/497] 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 296/497] 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 297/497] 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 298/497] 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 299/497] 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 300/497] 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 301/497] 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 302/497] 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 303/497] 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 304/497] 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 305/497] 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 306/497] 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 307/497] 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 308/497] 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 309/497] 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 310/497] 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 311/497] 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 312/497] 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 313/497] 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 314/497] 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 315/497] 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 316/497] 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 317/497] 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 318/497] 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 319/497] 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 320/497] 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 321/497] 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 322/497] 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 323/497] 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 324/497] 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 325/497] 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 326/497] 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 327/497] 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 328/497] 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 329/497] 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 330/497] 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 331/497] 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 332/497] 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 333/497] 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 334/497] 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 335/497] 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 336/497] 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 337/497] 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 338/497] 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 339/497] 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 340/497] 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 341/497] 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 342/497] 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 343/497] 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 344/497] 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 345/497] 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 346/497] 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 347/497] 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 348/497] 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 349/497] 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 350/497] 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 351/497] 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 352/497] 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 353/497] 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 354/497] 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 355/497] 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 356/497] 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 357/497] 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 358/497] 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 359/497] 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 360/497] 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 361/497] 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 362/497] 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 363/497] 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 364/497] 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 365/497] 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 366/497] 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 367/497] 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 368/497] 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 369/497] 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 370/497] 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 371/497] 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 372/497] 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 373/497] 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 374/497] 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 375/497] 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 376/497] 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 377/497] 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 378/497] 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 379/497] 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 380/497] 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 381/497] 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 382/497] 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 383/497] 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 384/497] 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 385/497] 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 386/497] 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 387/497] 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 388/497] 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 389/497] 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 390/497] 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 391/497] 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 392/497] 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 393/497] 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 394/497] 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 395/497] 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 396/497] 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 397/497] 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 398/497] 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 399/497] 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 400/497] 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 401/497] 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 402/497] 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 403/497] 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 404/497] 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 405/497] 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 406/497] 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 407/497] 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 408/497] 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 409/497] 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 410/497] 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 411/497] 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 412/497] 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 413/497] 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 414/497] 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 415/497] 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 416/497] 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 417/497] 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 418/497] 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 419/497] 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 420/497] 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 421/497] 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 422/497] 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 423/497] 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 424/497] 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 425/497] 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 426/497] 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 427/497] 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 428/497] 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 429/497] 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 430/497] 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 431/497] 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 432/497] 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 433/497] 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 434/497] 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 435/497] 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 436/497] 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 437/497] 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 438/497] 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 439/497] 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 440/497] 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 441/497] 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 442/497] 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 443/497] 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 444/497] 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 445/497] 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 446/497] 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 447/497] 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 448/497] 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 449/497] 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 450/497] 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 451/497] 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 452/497] 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 453/497] 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 454/497] 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 455/497] 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 456/497] 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 457/497] 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 458/497] 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 459/497] 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 460/497] 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 461/497] 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 462/497] 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 463/497] 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 464/497] 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 465/497] 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 466/497] 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 467/497] 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 468/497] 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 469/497] 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 470/497] 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 471/497] 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 472/497] 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 473/497] 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 474/497] 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 475/497] 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 476/497] 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 18fb3ea53701afa78a65c64d144408e3e9a0c638 Mon Sep 17 00:00:00 2001 From: Mara Furland Date: Mon, 13 Jan 2025 17:05:59 -0500 Subject: [PATCH 477/497] 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 478/497] 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 479/497] 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 480/497] 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 481/497] 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 482/497] 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 483/497] 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 484/497] 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 485/497] 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 486/497] 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 487/497] Repair old VS builds --- CppUTest.vcproj | 4 ++++ CppUTest.vcxproj | 1 + Makefile.am | 1 + include/CppUTest/MemoryLeakDetectorForceInclude.h | 4 ++++ platforms/iar/CppUTest.ewp | 3 +-- platforms/iar/CppUTestExt.ewp | 3 +-- platforms/iar/CppUTestExtTest.ewp | 3 +-- platforms/iar/CppUTestTest.ewp | 3 +-- src/CppUTest/CMakeLists.txt | 6 +++--- tests/AllTests.vcproj | 2 +- 10 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 include/CppUTest/MemoryLeakDetectorForceInclude.h diff --git a/CppUTest.vcproj b/CppUTest.vcproj index 82d843b40..9a8bfdcc2 100644 --- a/CppUTest.vcproj +++ b/CppUTest.vcproj @@ -947,6 +947,10 @@ RelativePath=".\include\CppUTest\MemoryLeakDetector.h" > + + diff --git a/CppUTest.vcxproj b/CppUTest.vcxproj index 8f7a5148a..4a2f18e61 100644 --- a/CppUTest.vcxproj +++ b/CppUTest.vcxproj @@ -271,6 +271,7 @@ + diff --git a/Makefile.am b/Makefile.am index fd1870225..3406079c7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -77,6 +77,7 @@ include_cpputest_HEADERS = \ include/CppUTest/CppUTestConfig.h \ include/CppUTest/JUnitTestOutput.h \ include/CppUTest/MemoryLeakDetector.h \ + include/CppUTest/MemoryLeakDetectorForceInclude.h \ include/CppUTest/MemoryLeakDetectorMallocMacros.h \ include/CppUTest/MemoryLeakDetectorNewMacros.h \ include/CppUTest/MemoryLeakWarningPlugin.h \ diff --git a/include/CppUTest/MemoryLeakDetectorForceInclude.h b/include/CppUTest/MemoryLeakDetectorForceInclude.h new file mode 100644 index 000000000..6de90e177 --- /dev/null +++ b/include/CppUTest/MemoryLeakDetectorForceInclude.h @@ -0,0 +1,4 @@ +// Not all toolchains support multiple force includes (namely IAR), +// so we wrap the two in a single header. +#include "MemoryLeakDetectorMallocMacros.h" +#include "MemoryLeakDetectorNewMacros.h" diff --git a/platforms/iar/CppUTest.ewp b/platforms/iar/CppUTest.ewp index 72be22fbc..f2f1fbe16 100644 --- a/platforms/iar/CppUTest.ewp +++ b/platforms/iar/CppUTest.ewp @@ -262,8 +262,7 @@

-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