From 4821ee32411f751154bb26eb018543dd2c527996 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Fri, 6 Oct 2023 23:31:01 -0700 Subject: [PATCH 01/68] initial commit attemt make file --- src/exposuretime.o | Bin 9468 -> 0 bytes src/flowVC | Bin 161640 -> 0 bytes src/ftle.o | Bin 26672 -> 0 bytes src/globals.o | Bin 5476 -> 0 bytes src/integration.o | Bin 20620 -> 0 bytes src/io.o | Bin 1556 -> 0 bytes src/main.o | Bin 19828 -> 0 bytes src/memory.o | Bin 3388 -> 0 bytes src/mesh.o | Bin 17184 -> 0 bytes src/mymath.o | Bin 5872 -> 0 bytes src/parameters.o | Bin 43284 -> 0 bytes src/residencetime.o | Bin 6708 -> 0 bytes src/strainrate.o | Bin 19304 -> 0 bytes src/tracers.o | Bin 29252 -> 0 bytes src/velocity.o | Bin 18108 -> 0 bytes src/velout.o | Bin 11892 -> 0 bytes src/vorticity.o | Bin 11212 -> 0 bytes 17 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/exposuretime.o delete mode 100755 src/flowVC delete mode 100644 src/ftle.o delete mode 100644 src/globals.o delete mode 100644 src/integration.o delete mode 100644 src/io.o delete mode 100644 src/main.o delete mode 100644 src/memory.o delete mode 100644 src/mesh.o delete mode 100644 src/mymath.o delete mode 100644 src/parameters.o delete mode 100644 src/residencetime.o delete mode 100644 src/strainrate.o delete mode 100644 src/tracers.o delete mode 100644 src/velocity.o delete mode 100644 src/velout.o delete mode 100644 src/vorticity.o diff --git a/src/exposuretime.o b/src/exposuretime.o deleted file mode 100644 index f63ed52622d900f03cb17219f2931a0e461b0b49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9468 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

FOZf>oP8Bj+9syO~}#l>{z3y9+L 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 diff --git a/src/globals.o b/src/globals.o deleted file mode 100644 index 203b2121b3a3b4f083b9eb73e785ca3281b90aa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5476 zcmc(iUuYaf9LHB1YiN~5?L+)S301KV1q&?_(bA^5yY}>wo_CuxPu;9{o7~d9-Rs`2 zxk$C?TNR<9^dUmk_z#5&=0PNAAq5cv+L{L+3Zj$>wJ(K$1&h|=@3-@vy}h|B>Vr72 znf?6!&2Q#6Gkf{&_iMNA*0ej;X!M7kE_xRDrH>wJ57N`me4Dm-mr$%o8xBN`Vnz>8 zGmOA$1d%HGV;FjROmDLK7RPHUW}2@W#VdK$s^?0XVWbB10ZG(j;Ke(eGM<}kGF{1r zQ8oip6318KNfqL9e#v-JE&IplrH5hNx=6%n^wP6JPDiMpy+_l&@7A>S^q!|D*=z!S z9!LuR)%)sFXYALl1o>J|H4Qom{YZ2F_=%S->T z-=)~8EaOPI+DpCcrCwzzm;G(^a(=Q`<|)@pU6;7N(ogn^f4okAr&s+HzFi)1Uef;m z?vK#9+(3tI2Iurc@GST|_%!%B_yh1N`Le$}+gkKmi& zZ^1Xf?|`p@UjttRzY1Ofe*#_wp8{V3p9NnB)AYoAz=x>k`RqWxZ-G^I&w{zmoL>#R7F+>e1FwMZr7_vQi{{B~Kjymy`aR%2@Iml4@OE%7_)Y3L z-pAmx;6?Bm@B(-hd=dO8eV^H1!*}}ewSxD7FM?;l@56oz_!aOY;1l3J@R#7N;F}o# z2F4$Qek1fxW4s)A2lU|AhUs;9tP~;Ek}~4K9Oqa0d20US-8v*3rIp94P$ zJ`Jvb7r^Vmr@$%jJoq3D%;WVTht1$_@KfL(@N?i^@Dz9p_zmzj@VnrC@C5GL26!!v z9nBYf68hudMerQ>GI$>R0{qW``@jp}e()mr7V;Sbe-7Raz5w0_z5>pJAIA9O;2q!! zcnDkruh4pvsB4+xa62J*%{T+Kd4+#g>{k{3f_^h5<9)60PK65!KcTRr@TW>XU5fsG zg^ww`r1;M%`ZEe2Q|vV(Wmhe?ZhLNBGjd+Zbc&Ygmnwr5t8~bACpBZ#a*RRK52zpT zeRJ9v=^z{JAUn{M6$9V2-GUidQHZ8u)bmBqsYWN^bSL4V;l*+a|+ZD*QU4eXuta>HwShU&!7GW^08|_kFZwWw~0?Fd>Sq!YYDN{bIYM zFk#95t!9u&8-&U@=47H!#n7KHOO{M3o1z%(k(7tkM5u%!>rR<|dD!!-rbBKi`mZmV zojzT&fclW_#;+#rgUCoPaH`@pWjXZEA|P-1wpX@G;4y`Z;lza9NW_F786#u+^&sP$ zRhdH0RM<1iRyh$Q2LY$IKMZPNVCcnwPDK;bZn+5_PXG3ZsvnZ}JM>jrwx zawmfd1bZ#l^68lHT0;bnQPa20fX*qzG1C|s-#QHOa99KS{9TdrDoX{>CqjtUI z2^S%VBRsDe1EmODuZ2AnB#y51@iJ{dmVai#^!vCKN{Al}H6RJb@EH2j(2 z%@Gd;xlVgYS~s_<@Rs{nkPMVqABggv?FMmRUNrt@$*AIv&)AkjXO*rnnoP6)U|OU+ zM*y~#5W?1JLnu~;mpyjox;hqbXV{3!jktDDtW_*uD5B4+(8TxS9xrsul!dr7=q$9< zJZ6OD?{gx6NH6bObQ2;(c94q;piG&hfml=FBv-1F$^H@D*keb#ByaMS6**=HI|zr9 lvet2^CY)-ku%IggVq(cOA(DA=3ehKlF9LcM%TK@Y{sL+FruF~; diff --git a/src/integration.o b/src/integration.o deleted file mode 100644 index 320b8c8df7e653f315f7feb4bf9c211f8f18237b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20620 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 PU@^WIU(YY(KGy#OqU())q#0Z2C!`Zn1fh~d z9ph*>f*YYraibeWT(m(e&Ca@W=SonjE(E{Oj^|F^#29hmh5ODu_xJA1yf-g@eq66* z%;RNPpjA+|0op1`H`e3}{0GF8htuW&Nmj z9!ouitJo}oD?&u4jl|gG1?i~l=k`%#-0uz|x!lHWhxwvY6Y=4wA(E4+vB?o3!pBNM z7>({+(%FrE^v+my@x8(NqookBQK2V>Ct}5d%K5rwHZO+RklRo4O^l67(}7m3Dp_@P z4yW=)s1N%impuWV1(MwdC87Dszbk!@|CK>*z73uZo(c{I2m1Nt4+S&`nQNK6(WV5l zJ+^Ht0jtk}+vgp)8+RZ!s{|(Ilt6M`30!&@Hmz>B!)CSr6+Sr-4_2eNQ?Oo!Rf6OD8ig2^Qz1oTuQqA6_)su4w=6U+Z zuGG0w#Ao*ASI;QTvnW8{5hZ&cMkz7%XQIJ#T7g^K$IaftXGO&W9&CN+37cP?hr%T9 z&(KqqW$|3&b#ErGWR6h4ey;0!htiy(?U=IgJ(Szq>eOEMBACf1SKn`|=#W!sm#%!+ zTrchNW!<)WGPcoBs;9l*z)OxrI#$J8R653D>CM+^k;uu&fjZ_NVSe42!(Hf}y&9_i z>kqM2CU`GKm}f@ysP(nJIb^lLzXN)24I@L`d&+`a)GHf~Zm#J|*WReHs&7`^a;}#L z{c*J0zoE7U_zCC(z6N6C_Gdtx>-Ia6pOySE_CRUV10Y;YSAiRmHv@z;O<=*5bIuv! zHOIiW&|XlI6Hwv}lJ`qaJ`&V0g%&BBfn}5(uHgGCcuNJ}UBT&Ym-h=)a3+oq8^hyT zA~BV~&r3`jBe6sx&V-&yj2SUt9DhecXCj_7qC|_Jk0+-`nTXAd87wS1@DG)+M`9Oa FzW`6JHAVmc diff --git a/src/main.o b/src/main.o deleted file mode 100644 index 46aeef7fc58614d41c2d9240c08d23f5d55728f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19828 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 KGj3p{I{yWTsqPH` diff --git a/src/mesh.o b/src/mesh.o deleted file mode 100644 index 10d9b41918d8b432ab759ecd97b6c6f13a5f6ee5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17184 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 diff --git a/src/mymath.o b/src/mymath.o deleted file mode 100644 index 7f2030ca0b45b84f083a6f3ff82da6b86ba0da8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5872 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 diff --git a/src/parameters.o b/src/parameters.o deleted file mode 100644 index a1f362a915070b81fbb516cf19a6186a01bc727c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43284 zcmeI53w#vS-S;QliO2>;1#0SYu|*VQLV$pxSwb*DKrZ1fENikM!H|T_hMV<*fohCa z@KP&%w4$_CS}RbikMt1(Qn^$sv9tnSp;#5F1-v2J@_hd@|C!yLEWFjX_`aX#Nj`>e ze*bfR=bSln&Y3fl?D+Dr5B}NOFjATu{KIz(z8`AFKYqUX>dbdf(I@y?Gu=+8*F27< zOhdj~sV^9eh8ILtfMBp7cXB~YJ3npCwSSWGq%D;*4P!t{erRFb#J}!WFj!U^4M##{ zS$4=<-c~KAr#f!UGYmOK=S#|t|8mPS2UuZmd55&TG&QZEy!bNO#}~%W!C+xkG*VhV zOXJ@1jNx{|xU+56d&={6IptN%sSFiHgVp8pOUsLb!I8tXXbY3Cw$)7<>=d+**MFPa z&V(X^!Ei~iI1-u@whi9)?b7mgX?Z`=@>Ck98Agfov#R^OziT4AZI6W`g?|7`}A z|33`l<93Glj4@UY!*~kHxAfzBzKi(&s$UcGYTpS=3QP=42o#LZTl_a^Z+`8kd37>o zjJ!G{uQqo_&GBZwrFs2Hsk@;~-W~j481Gr>wa@1*eXaV8{JMF>he*h*w^BydSt`Ho z^8C7qjz`lDez&-f@4O|F+o(C}k9Mj#+P%70vG2TL)L8qL<*zxKTK!Q>oOk1&i9|oF zIeL2Z{n{;gwQt(>+il6a<6h(V@#AK_W6(C{)tx1E#Nr3jo9eSVy{SK&#tQ?XX+G#; z(=;EF&4-b7)>3b+pCfCJSbcS{S216wc>T`5Bkr2vEb0gSzVlAe^@95Rdd-NtSe(-O zdVa(8Wq-r<<$aU&XmxSUy>WBQ(E6QxxUHy>-!C^r&8aTZ?L|m_4|Ls`u$B`FPiFWdVbOL z{G#dk#s8Gwhc@khPvQM&)BgA0_xA$d^!G^Ea-(UQ1{QHYhwV(W7 z{0ZAP@%I<{{G#daKTh4>n+opa~&s6(Z98I{-*X{aGbcT|5M5lUz+nr3~N$6HJvQ& zD;?31fG;h#aWz)Bjdp3Qb}Q^p9(E?PC$}@_JYi>Q#KQXL)+al%ubXz_9ywWwU(a>2 z62ETRiCc2wl#|u<^;}=C#Jt+)F*a{JW_)QmNd_2EXF@g_8Ygb{S4%nJBuXO_Y)o0`_-YlP}nijY^Fg-9M5S;$J zHOSm-S^0HmC)V|xe2UP@WPKjW{d|`7>8u^31!`ZF4`|hXp-kzR@QiT(L6_js+(qt*PallrY5(IeJHME8)!@vTREy|(HH&Pbc$JK~$XHLp&u zXdO<|+gP!kUF_?#X(!&at~ToO(vENQP1;6d_@1%xh_6F-CmNmIlhkZ~U0&Zt$ys@Ir^`Xq z3~FAzNV4Wh*6g~xF^#fLKDa>I+)DoG*n@1FPO+^@id5!Bq@g>KwI$eJ@4tg9Z%g)MX$H(wW(&7ukCDkB6@6R0fjX-mmv(kt{Z2Wi)P#24J7+|h--&?v(&wcfRlhj8i zh3zij$ih3UV@#-Tj&YC<``5ek{U35Du~9dD$I|*6a_H@M>|XDXTTidQ?d!RjLg$?5 z^yG3}dVcJWaUNtuq*>A5@xy7-ASp)%7mfZZB^~iy#2m5aWGy>l9p%Gn|7nebx_)lR z(%Kaabl;LUV+U53ljfULUvo5taUShVi>_=#gK3tWkjZC##%E_~-F6ywWv9BFzGRH1 zlPjkuxpMsWcX~ zcbrg1a85R@=6vYKXx#xPi$-j~ZOO4lxb}-Kr_O!-()wsW=V#wj!#W+WIeKw)NZuXR zl+Ck0Uu%B4ek&!K_4&0&t&Tf*uBK={H-mPobppPLimU^dg=$e^gLJa!A-l~RReLDE zcDFXt8XS568>AogAisJhs}-C8HzeLcZgD9zV% z7tuX@!x_JKQ#!Qq_1wgeVsJZ^VV}$rJehGgW1}1HVCWFftJ&Nswjp?5jxY9kx`gW= zn+vNe;?G^pB}VlH8n7yqCnfeW?(2}k8t(UX2>4+(%+}rx)U~R4`=2#On?;=qie6x9 zE@>X|gtWmmSt&OrPhkeqX~qeBb!z4DW zHrQR^(&W0D)5hBhnXP_F>6t7gTT=447(45a)sgOXqD7CT^*6G;(Z$J14AgPIV)rj) zxBMk9WT23gd1rE%-}4ltjjL-e2h~kGGVW?KP=>O5wW(_!S8jn*?pbn{+{3n4;e?#M zG^g)A#+LQ@cG}a-ci*Nq+qFDtAE|8`d{1qw`8=gsnp*8?s$N3_b**cT9*>?aD`f}o zfwzw9Y;skfOTjIF!FikK=_5Ku&PK~SC2fd1;?wAB{@m(CKxwJ=0GmpXs=ewK>!RfC+(6A`jfTE^3@xJ0-NgpZjXg8<*qwE= z<}x-Qb=HAeS56)2Ic>ZZk)Z2NvXpEYpN-ZX##*CO%2-Ph8)MwqT|4gJnQr@AdY3qN z{b3n9*%Ib4uB=LG6}OSdg- z)L^DoA1%L5Zpykc&p;QA#RjeUihFTzW{Pi#>>FaO^DSBS|HDa4KAY;eg_SFYH#Onn zZylK&bIs;9p4|gSreBAi`|Y!@?tbfguUS_x!#E>5Q6IXT+j{xB(fSugjGT(C>lAsxc-M zEeQ?_MMG`d4rzP7*|$nVS5-$T%?+j+!%F9b%d1K&%BwV3L=0bWRJf|7U}0t06V5Lm zPD{o_!o{Tv+@dYR`08R}1*1yKJr+$E7A~VXR%@I(3dV)K)fU*n4Fd9LOnX#VuvS|RuxtxCfKJmSTH^sia2MM{7yKbi=AL%C#M?u<)HisKTTp0-9rd_sOs zaam|qtO-{{Li0E!)A~-=7@3`znIx7G7aLhYi^qpUk;0Okl5pX*ZsUu1z0~l6k-5Pf z-iB2j*K|92MYx=IfdC2`^lMuy90MN9OY$V`dr&WWK&X((ZUS*dQA2{Akp zo}1Vd2{u~fQjG#eeYo*?vcu!TW#Ld2(?!nKtc7lY38@8f6J3i-dV+0}z0~S)agOci zsOqw4X=Pd1PK|Y9yl1#fps1$}Nsmek9bG+VWT?8lutX-Mx6D||c;46Mj$C@$snb0N z&Z=rB1j^=z7FOA7j;Ap>Nr$R!i%W|eb)K|@!P+S8#J+^#>hUFvS5MmH_@U=XOBk`9 zw1gpRr%kMoC5e^9nexs&u#*F0oVd5oatoZ4L`P0;L7;j;X<1n)vM^zx(6;0jNYr!9 zcGJdJUsJ^*?>+0|+{!%77*~*VB&8Y?!)2s2o*)`eI?^@GJJb`xp3$snjc2IafTUwf zZOI3hH!)#!HBO8hUf#rn@zpr-B+i5p=5;0vF>hl07)v#(t3tEFgV`(EJI7*HvQz_g zey=LPkL-EiX!z?Dsn*kRi5Yr%not8=XJ;ioyQTYAhtQRyKw)u^0b zM6X_K^tl+EUlqJ+LP4KvO3N+LCqKsyTFvopMf`=Ka@pix6ZV&fXK@ho!g0HC|D5V7 zD~%%#l}Tk8eh#i*!dbJ9P3E@j-Ry0|6H+Uf3wIzIg(zbRQV46X>#QhI!$zf$+(_GzmqClniAa$XV|>mTAjzsRmY z+8?(w_g^+7meq}i7BtE%b2M3I*@rjEEYs3|S)+nw#dn9S^xUN!wlhNQo^sAZrEI(9 z9J#||LOGk)idp5Qix`jdWQthhPxhj6J}#0`5|z=y$?L0oY~3QeXUHve+?B%T{7c4RCw+DP^3t1 zFl9=`4p(Z5?aXxt?k}xkQdUJvqt(_dEUXA~7g$&tF6Wk&lO9(|QCuw{R)^SdD+^au z`J*MFa=*!x9a<4Bv8K0kC1I?XesSo0v^UCDG&Y5B7nN}y3M{-LiS<+>R9P9RsFZ!RJ>c!r z;@JRO6FfDwwZU!atXbiRTvBBJ9AUUvJ7ue=#1+CFd)8X+j8qnP!`q;^zK9JYS(MoV zQJFoMoKBHTQE&IUW8EfOW7BST{3cbpCDmx#mP?;AckN7Z^|5dj%W)+fwQTI^xxR5n zd*Z{)7{+K0l`X6)t#WtJvYWB@Iqu0lzbLMi$$D4KaXT7ojk6mT7iHLbV)g*{H;OjS zsUzHz(;DKQn2vF?QC;>RZxpvixh%IQSVryQ?Tw+`Gg@-uy^1wn?YxcdQ{1j}=ZRCO zJCo#`>B`6^LvFzR;RR%`j)bk{ugY3@B4OF)lovX&ghfXCA-BNUNW0bQl~JBuBwg03?y$*$6VuZlDseTyfGSD<~`_nYOM z-fB!u>)Tu1(eei^?zCQaFZoCEyq9)VrZ55nIVM*4k_zpd-N3_gjz3AQ2M zLXAh@uZf3M&w%UDV^xoUYtchg4}fdX-Bq6ppFp=&-3aMrVJo-;a#n|I zgJ;vediXf`o`RfveLs|Tya9hs`VRO7@ogI41b;^S zDJboJ9R3vjkfz@cSD|lLy%auzUZ8p|d>B1L^(43wJxuiw_z?O+_z~rIfuF!LHN6@9 z3F)5>wd?;ol=i*{A0+;o>YeZb^z+c5pZ^oe@vnu=INqN?IUhfQ{4WL4YhWjI6#f`J z3(EN^fPcZ45BI{MP|C@GAHoZv)ZYWHz;_Oma!-Tzqf?-i^GU!kJ|O=)@Hl)Eitkl; zC;95($Hbq}_&WF_;y;5g6aR_Ee+2I%z7%dJeuKv6L;mtDeKu^y@m&L7B7K^s7r=W- z&s5zT-h=k5?hNlnw^Q8`-i1DrZMX9vT#nwQx&bajKL@u`&wpxsEtKQ=DU{>68*YQQ zL+Rh^;SWf!g3>Ruq19g4oOVxyyU9OF;{hoBG#K82&(ydd{*`=ZYq}5KPWl&@8^#{u zA4Bnd0QtRj`VP30cs=|xTnDAz)$mpHN+|hPz}v`wtES%sUn6}!l=hdvTGD4gY5y4b zI_ddP{6pcbr1ynVeoy!|>FJt&HoS%O)^HzjL*t)cW*FZm{#PjFyakt{UsU}&xCH%c z_$f~HBic*25&--f}6=VT;rF+8;M^GHxlou z@viU&;%C9%5pS>Y*6@1bUktI!{TQF^w-nyP3nIfZXo_MDD7Jb zufun<>I%3BT?F4J-zc~rUIO2MU10<40;QkZ!&lHPRey1*wg)bxoVTHjm)$Ux`ZmD@ z#D5D95`R+T55W1ve+aq84Y^a}*TFB*QTQ&L1Lu*i82$}C70P%Y52gHESWWt6Q1bWJ zcn{U-FiLtmcrN)3$Y1&NK6;5^R1rT6#diQod9On$?@#bO;xB6ax2m6nQr;s_%DWFr zd3Qo7?^YJ$j}Ef)H9#46PeRH6D3ttn!ae94ptOHBte~Em zP})BUith@z37!Wfe_JT|k7e2U4?)TQ7L;-SG?aDnIwOcs_p`d(d|^Xgkkh2nYRB!ScHC4^{cQDy+w6Byav5S^uj7r`0mX;Ai&V>Lbkwnpc`>7)Ou2M?ov0Vk2Z zQsXP&MD%j_chYas_)TyE@%iu&@i`hVh6Ti@!w-m$*Z4>{o_G#Sq5Xq2o&m=Z@2>h> zI2L`n>Q-FZSg0&K@K536>gP7)cEHY8^(+1Bal$~dr;=tUdVsx zyZGn#r2j$VTVNmJ8=$QFPip*e*qit&_!jXM8owJ}M0|*0mya@Dh7FZ2}nM|@Xl zJP%$#{BrmX@%|d;7hFb9;@#nX;+-{q2K+AZ)=>5}|Dcg_9G}AP5dQ%FiTGbM{yIFL zcmv!`e2d2GVGrU@!(GH5*Z9w1cj6B~xlY}!@!MfH;)~&*iO<(~CG1LE9(=q?e454! zpr3d?+)4a$jc390i1&uC5$~??bK$p%p9xVEJnba&O~!j9;6s$0S{(Vs9#r2QYlGtlqA7pV6&jqijVi2ojLCcaVQ>tP!4C*bqM zf2#2Zp^y08a3k?rjo%F06JH2_N4!GgCGd3OLHHc;2^t>_+Y!%&^~5jHcqaTUx;H$H z^zIrz7p9`mgd0e2tMO*AE%DD8{9B0s9m?^(2j4^Qg>6WGRpUG0yTrG_*2JHK9mxMQ zlzqzMuqE+_RWFCl(YHa_m&}E-FDX)90mU~2iZ4TTS17(NP<$y+d>=C@g|9;Ky#&R# zN%dMNzSU5C%c107qMQZAHyySj%Q)2mD89i^d|jdVIx0V7(u?l{D87BF8=&~ML-DPJ z;#;M>1&Z%_D87j55ES23D82v`U#9XLD8AF7_?oFc%pxPc1G3nV-T=k7S^0A)z6YTA z?oz!Nif<7VUkHk?K-n9L&kyCfSZ65yGc=wearCk8+Wx&z{5zG8L-9WXWncCmumxG~ z)%X%9{_CMtKeXys4u<0I3uWJS0hIIFP2(M)_*0?y4}Zt@?^kYz;;)CY&wB<+{p&Qo z5{iEX6#rr<^+%Ocq4>u@*$3uBseh=(O(_0eQ2ZUB_**CsoNxQzhO%GW4aNV8#y3Lo zuZQAa3B`YpauJmJE1~Q!OQE#?8jX*I;vWIUZ$k0+P^Loh%f&pub|z88vr z4;24KDE=pvE1=|C29Mycg)PZ?v&QE_@y~|h9}C4lOxX*H-wzMt?+jaz^$d-tK=B{z zZu|E_@$XcwhvHuY|BnALDD^+A@#U~N`Zg%_&xPVIQjUP)&xVKa4}#*)(0Eta9Nh(q zKLv{aV=j`yJy85R;0O4(LGf?W_*y9b)lmG)q4<_4XG8JNgtFhB0>wX0;{hoC!BG5N zq4+y0k8)8K|A$a~`&2hT@ok6VTMNavN_i_3-wjZF5!E3mzNt`r0VuvqWhW@U_E3Dy zR3By&Aie{#86dp@if^;>Q7FC#VJouSrFtr}6V;#&d5w-|~qs+sA?06uNM?w2PnQ4%JHOS;-3n|AAsV|RCa;lPlKQ1ZwtlWOyh^y zyovvSY~sk*0L8yqxf+W9A@~LU`=PY|E{!jS;$H;CAA;g9P!5LT?+d@ge*u*BqnpM% zK=G$S@gHW>DE|G*?NI#nQ10iRfl~iEjjx2_UjfCx7>YltoC?K12FiV3J{12@jhj&X zy`cCzK=HRw9$>R7{#Q{#P`<5sH636#q&n{(F>*p!h4{C-_UD)PIe}$3pRs zfZ{iy_Mx&exBI~3nqD85z7 zTcP-FfZ~g&4ngrvh2jf9@ntGILGiVR;%lb*FgHcwJ0Lelq&GnEZB{-C#rGhT5DCa=&&4gR!{6q1N z(|7=ie=rn(S1A6D%46JIivJLN5&!#8#{WKzH$d@khvHug#lK2<8x;Rd@b~x^LTfx| zJOsr*6^cIq#hz&Ox8ZLKt#P68!`$SG|A5@=lCJ@Zf3tEm6#ql;E&TUG@!zHK z#Zdfj`~}J^DE>ZB`mLMl4p4llP<)5eY~Oz6Rw%v=P<-oDuY}@T0mZi%N_|n~ zC@8*c_($412#P;L<6WWnyFl@$K=FUf&AV_96#owR4*qRWj(3yB*Fy2HhT>li#kWK` z8;XA>+>d_>w8o3Z15o^fq4>K(@pn`n<6(jL55d3Ue;=*b#a|Eq zjQ<%Z?O&(yl~DXEp!gRM zBT(Xdq4@Ve@o$9Ue^R*uO1@?AZTz)R>c3gzbD{WWL-CJ=;vc5$1;y`&`|x*$a{kWH zcnTE%v9`8#eW-=`sYIN7b!li#lJ*33yOa_6yG@20Vuw~P<&mX z_&O>-Yi;{Jfa2Syx&exBI~3nqD85z7TcFf;JrrL=bqI=YDimJ;iZ4@n4iw+%P<+i) zA4Z7pfCNczfa2S%{5cfg1CamH?^3-Oif@qwNe@Bs$@@fvy`lL0@L3rbkpI%p(0B?I z|1lXXJOr3&?-z85-{j z#otAOTDE>59kH0Mxe>06AZf5%rK=C&~@o!eHhT?w+{uclJP!9DjjW322 zmA(jyKLo{Jpd1Xv-xqGce*u*GyJ@@w6n`od|KSwdzhAi>ioYIi!T$^t|2mDYgyLTT z#lILz{ZZvqDE=|^4qTP;6ploj6y z#lIekeI+n-WQkWRR>kyqPj%&1FGk${NToMR6nD7vFc5#SE&BI>R+kesd|&@H&p*w^aqJepdBB)w@(@tNuuJzUuZ@+U=8lgp8L9R8LbqRCST+ znX2cgzCrao)hkrrsCupHTUEcTTJ|+k-}|apsBSURZqFmCyQu!9>MYg2Q9WMu2Gtd+ zx2V2dwd}W~zF(@|t@?MW_o;qc^+DBNs+Rqm_&do$$k#tqXR2=1)=nRz+NZiqbtl!g zs+N7Cl($NCFV*#``>B3i^`)x6P@Su~<7m4*qgD4-JxTRQ)iYI>s4i7~v+9WIAFIAj z^?KDyRKKG74%Hv3{-NrYSK00PiR!MZA60#c>b0sTtCoGa^hdSo=T+aO`bE`GsQ#1c z7gfKh`hC^!s&1v%gF~vjtCsr%sV|_qMXIf5t8TCQA-NFp)lv0>n*MFo&#CUI`c2gt zsy|VEsp`>V?ed1JE>S&3^{p`aIPU)fcF~S#>|vD^(9sy<7Dasy|aL_r=nl z?y@1`YntlGs>7<6sjg6+GQrNjQ1wXFHL9ys-=X?J)%U4>LABh+OZ{)C{)Os~RsTkH z$BA}*&#CUOdYkIms{g2ZiRw30?@;}&>a!-<b#K)-svfBNG1URp8&zMadbjEcst>CUs{Ym#yS`G@nX0Q)Pgi}t>WJ!F zRIgRNT=gE+KURIwRJ;72s{RkvPpICiTAmZh`TJP)^Q!$i{$El(NcF3#$En_{`dZZo zRllqHI5!*oeY4?wUhE9j&gaiaveNC=GLD`61MEmKTJktw_whr#Ug}Ag`;YkaTRr)I z>(Q${dbdYk?kWGTp7g^W{RfZccjpQ1`JN~JCT?ot+dIyq<-RdKeWpiOdGwtg{RfYJ z+M|1W+SAR`Ub(-EuRqh{U+PK!yGO6`=(|07t4Hth=-+tse2<>v(Vu(HR~q*xWO2WS zc-lY1I zcyu~*JwE+3kM8f$BRu*QPkH-1$M-Ey`o$hy;L*SI=(|07h(}-V(Ip-|-P7K3kCx{( z@yFlBzDdcOfr@W;e{RfY}*Q4b*S$z4=cyu?SsO{Ce`ANt@!! z8|2Y_J>|{!l-JIqk9f+z#N(H3etdmFkN-QK^kE)-wMSp?@lWz-d0rV`-@P9FfJe(V zCqBOswBKvQivjiRnMN=etcvp9lVD-VwZU1{y#2%o7R$Rgjo@(Ji&T~yiBv@FTzu*~ zQb{VWzbKCu^TVugw9p7v^XemEaTRYQA?&_>Q-8EyMPUSEZ`i>-8WAfLFdI9)~hsP z(rSd0rp@5R8P>~ijG*#u2Cdjx*evb8KrJ%m%(Fi7ak0Tuv_rgI{@h>~mkp03&C%3*-%1LwI z?c$_+Uf7~x@7r25OsC6xADnTcZ=|q`FoOEFhr|~YdcyJo6DO3|_V^b|I5|A;AaueB zuT0QtlQu2!6&{Yg(fd1`1cr{j`NoOFzqG}PId431wD&c8PTYN&jT7MYc{z!F<$a-E zT+Y~=^x}ffn?Ib8`(}+;z|#-TJ1LxcRVQ|R!kZ|JV1m?FqBz0$)9;k+4zc1w-ro^U zT;_^HrDaAiyr4AdEQs!l-i#pcxEN-?-XeaLaqk~RFm;DOfn@sDA%c`rWcmi+E8edt$ zTaAp7!9KKEVJb5m-8c4AKR1@?{?uQ8a?+d>Cq6*a2P(6agOp}p=Le@|)2+}c({u_o zol;GwSU&P;H{Wy$Hl33BG?Sf_;grnh(=_6g%qI&q;*^}>l$_y|oZ*z5;gsCZDY>6h zazCf!eoo2#oRa%FCHHem?&p-;&ndZ|Q*x$La;8&qrc-jJQ*x$La;8&qrc-jJQ*x$L za;8&qf2ZXBPRae9lKVR)_jgL}@08r%DY?H>a(}1f{!YmQoRSAPB@b{)9^jNbz$uxJ zrrI4oz$tlvQ}O_(9op>O|#fMi%qoHOp8r5 zcdnW4WHYVVMvF|VN39>+8rM0~=c4IOM$?^*raK)?cRrf#gf!h5X}VL=bmye$PD<0Am8Lr_O?O_J?!+|R wnQ6LH({$&i=}u15ot>sTJxzChn(hQO-5F}SQ`B_lsOe5p)0(B$Fvv9i8-$TdApigX diff --git a/src/residencetime.o b/src/residencetime.o deleted file mode 100644 index ae425e23f783b6a418232dcba96b02b3a28eed25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6708 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 diff --git a/src/strainrate.o b/src/strainrate.o deleted file mode 100644 index e8d0760d24a14e14212b63bb659f7459af5df0a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19304 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 b;jyaAu}bn-C3&opJXT2_t0a%5_s? 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 TrpgjiXNjq_#MH|Frse+tHM0cS diff --git a/src/velout.o b/src/velout.o deleted file mode 100644 index 861f1f6534341919c6dc450089c1745ef2c99758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11892 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 Z&DDnHYD06ip}EG;Tw`dislqZL{XaeQQ1}1< diff --git a/src/vorticity.o b/src/vorticity.o deleted file mode 100644 index 13d311f0c158129e18d54bb311cb1d91e17399b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11212 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 Date: Wed, 28 Feb 2024 23:58:44 -0700 Subject: [PATCH 02/68] re-pull from compiled binar --- src/globals.h | 2 +- src/makefile | 2 +- src/mesh.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) mode change 100755 => 100644 src/makefile diff --git a/src/globals.h b/src/globals.h index 5a45499..18ad20e 100644 --- a/src/globals.h +++ b/src/globals.h @@ -154,6 +154,6 @@ extern char Path_Data[LONGSTRING]; extern char Path_Output[LONGSTRING]; /* Globally defined arrays */ -double UnitSphere[32][3]; +extern double UnitSphere[32][3]; #endif diff --git a/src/makefile b/src/makefile old mode 100755 new mode 100644 index e1efb67..c356164 --- a/src/makefile +++ b/src/makefile @@ -28,7 +28,7 @@ endif @echo "Building in "$(mode)" mode..." $(EXE): $(OBJ) - $(CC) $(LFLAGS) $(OBJ) -o $@ + $(CC) $(OBJ) -o $@ $(LFLAGS) .c.o: $(CC) $(CFLAGS) -c $< -o $@ diff --git a/src/mesh.c b/src/mesh.c index 4bba470..e90bc69 100644 --- a/src/mesh.c +++ b/src/mesh.c @@ -142,7 +142,7 @@ void LoadUnstructMeshData(void) { /* Read number of nodes */ if(fread(&Vel_MeshNumNodes, sizeof(int), 1, Mesh_BinFileID) < 1) FatalError("Could not read number of mesh nodes from %s", Mesh_BinFilePath); - + printf("DEBUG Mesh File Path: %s", Mesh_BinFilePath); printf("Loading coordinate data for %d nodes...", Vel_MeshNumNodes); fflush(stdout); @@ -173,7 +173,7 @@ void LoadUnstructMeshData(void) { /* Read number of elements */ if(fread(&Vel_MeshNumElements, sizeof(int), 1, Mesh_BinFileID) < 1) FatalError("Could not read number of mesh elements from %s", Mesh_BinFilePath); - + printf("DEBUG Mesh_Bin_FilePath", Mesh_BinFilePath); printf("Loading connectivity and adjacency data for %d elements...", Vel_MeshNumElements); fflush(stdout); From 0da250d8c28a5fcf80642640a1b92003ff28a5a7 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Thu, 29 Feb 2024 00:06:54 -0700 Subject: [PATCH 03/68] add setting files --- .gitignore | 1 + .../LCS_settings_course_resolution.in | 403 +++++++++++++++++ src/settings/LCS_settings_med_resolution.in | 406 ++++++++++++++++++ .../LCS_settings_med_resolution_back.in | 405 +++++++++++++++++ 4 files changed, 1215 insertions(+) create mode 100644 .gitignore create mode 100644 src/settings/LCS_settings_course_resolution.in create mode 100644 src/settings/LCS_settings_med_resolution.in create mode 100644 src/settings/LCS_settings_med_resolution_back.in diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..819675a --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +flowVC \ No newline at end of file diff --git a/src/settings/LCS_settings_course_resolution.in b/src/settings/LCS_settings_course_resolution.in new file mode 100644 index 0000000..f4d62eb --- /dev/null +++ b/src/settings/LCS_settings_course_resolution.in @@ -0,0 +1,403 @@ +################################# flowVC INPUT FILE ##################################### +# +# NOTE: Order of parameters listed must be maintained for proper parsing of input file +# Comment lines begin with #, comments can be added or removed as desired +# Standard format: VARIABLE_NAME = VALUE +# +################################################################################### +# pts all over the domain, released once, outputTres increased +# Path_Data: String, Directory containing data files +# Can be set to pwd (i.e. present working directory) +#Path_Data = ~/masters/ECMO/Data/CFD-Solutions/Bin-File-Series/ +Path_Data = ../../../../Data/CFD-Solutions/Bin-File-Series/ +# Path_Output: String, Directory where output files will be written +# Can be set to pwd (i.e. present working directory) +Path_Output = ../../../../Data/CFD-Solutions/Bin-File-Series/ + +# Dimensions: Integer, Specifies if velocity data is 2D or 3D +Dimensions = 3 + +# Data_MeshType: Integer, Specifies mesh type of velocity data +# 0: Cartesian +# 1: Unstructured static mesh (tetrahedral for 3D and triangular for 2D) +# 2: Unstructured moving mesh +Data_MeshType = 1 + +# Data_InFilePrefix: String, common prefix for input files +# (e.g. velocity, adjacency, connectivity, coordinate files) +Data_InFilePrefix = interpolated_velocity + +# Data_SuffixTMin: Integer, number appended to the name of first velocity data file +# Assumes naming convention of Data_InFilePrefix_vel.N.bin, where Data_InFilePrefix is +# specified above and N varies from Data_SuffixTMin +Data_SuffixTMin = 1200 + +# Data_SuffixTDelta: Integer, Increment between successive velocity data files +Data_SuffixTDelta = 5 + +# Data_SuffixTRes: Integer, number of velocity data files +Data_TRes = 20 + +# Data_TDelta: (Positive) Float, "Real" time spacing between successive velocity data files +# Assumes time spacing between velocity data files is constant +Data_TDelta = 0.05 + +# Data_TMin: Float, Absolute time assigned to first velocity data file +# Choice is arbitrary, but it usually makes sense to set this to zero, which in that case +# would mean that the first velocity data file specifies the velocity at time zero +Data_TMin = 0.0 + +# Data_TPeriodic: Binary flag, Specifies if data is periodic +# 0: Not periodic +# 1: Periodic (make sure first and last data file correspond to same point in cycle) +Data_TPeriodic = 0 + +#adding this to see if it resolves the issue of not reading the +Data_XPeriodic = 0 +# Data_MeshBounds.XMin, ..., Data_MeshBounds.ZMax: Specifies bounding box of velocity data to consider +# Can be used to set a region for computing residence times +Data_MeshBounds.XMin = -0.07324 +Data_MeshBounds.XMax = 0.061596 +Data_MeshBounds.YMin = 0.11067 +Data_MeshBounds.YMax = 0.238690 +Data_MeshBounds.ZMin = -0.02736 +Data_MeshBounds.ZMax = 0.439045 + +# Fluid_Density: Float, specifies fluid density (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Density = 1.2e-3 + +# Fluid_Viscosity: Float, specifies fluid viscosity (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Viscosity = 1.81e-4 + +# Output_TStart: Float, initial time to start simulation and begin writing output +# If FTLE_Compute: Specifies time at which first FTLE field is generated +# If Trace_Compute: Specifies start time to begin integrating tracer trajectories and outputing position to file +Output_TStart = 0.0 + +# Output_TRes: (Positive) Integer, Desired number of output times +# If FTLE_Compute: Specifies number of time instances when the FTLE field will be computed and output +# If Trace_Compute: Specifies number of time instances that tracer positions will be written to file +Output_TRes = 20 + +# Output_TDelta: (Positive) Float, Desired time between successive output +# If FTLE_Compute: How often the FTLE field will be computed and output +# If Trace_Compute: How often the tracer positions will be output +Output_TDelta = 0.05 + +# Int_Type: Integer, specified integration routine used +# If Particle_Radius > 0 ==> Euler integration method is taken automatically +# Runge Kutta methods are integration option for ideal tracers without mass +# 0: Euler +# 1: 4th order Runge Kutta +# 2: Runge Kutta Fehlberg (adaptive time stepping) +Int_Type = 1 + +# Int_BMR: flag (Backward Maxey-Riley [BMR] resembles solving Maxey-Riley equation backward in time) +# 0: Integrate the trajectories via traditional method by solving Maxey-Riley equation +# 1: Integrate the trajectories by solving motion equation on slow manifolds +#Int_BMR = 0 + +# Int_TimeStep: (Positive) Float, Time step used for integration Euler or RK4 routines (i.e. Int_Type = 0 or 1) +# Valid only for Int_Type = 0 or 1 +# Int_TimeStep = 5e-4 # not useful when doing particle deposition +#Int_TimeStep = 1e-5 # good in case of steady simulation + Int_TimeStep = 5e-6 # good while doing unsteady simulations +# Int_TimeStep = 5e-7 # high resolution + +# Int_Accuracy: (Positive) Float, Absolute error tolorance (between RK4 and RK5) +# Valid only for Int_Type = 2 +Int_Accuracy = 0.0001 + +# Int_MinTimeStep: (Positive) Float, Minimum allowable time step used in RKF routine +# Once this time step is reached, RK4 approximation automatically accepted +# Valid only for Int_Type = 2 +Int_MinTimeStep = 0.0001 + +# Int_MaxTimeStep: (Positive) Float, Maximum allowable time step used in RKF routine +# Used as initialize guess for suitable time step when RKF routine is called +# Time step will not be increased beyond this limit even if error between RK4 and RK5 is less than Int_Accuracy +# Valid only for Int_Type = 2 +Int_MaxTimeStep = 0.001 + +# Int_TimeDirection: Integer, Should be set to 1 or -1 +# 1: Advect particles forward in time +# -1: Advect particles backward in time (used to compute backward time FTLE field) +Int_TimeDirection = 1 + +# Int_NormalFlow: flag +# 0: Do not impose inward flow on no-slip boundaries +# 1: Replace no-slip condition on boundaries with inward velocity (magnitude specified by NormalFlowScaling) +# 2: Capture particles once their distance to wall is less than a threshold (Distance_Threshold) [painfully slow] +# Currently valid only for Data_MeshType = 1 and Dimensions = 3 +Int_NormalFlow = 0 + +# Int_NormalFlowScaling: (Positive) Float, Scaling for inward pointing boundary velocity (to prevent tracers from crossing +# no-slip boundaries) +# Valid only for Dimensions = 3, Data_MeshType = 1 or 2, Int_NormalFlow = 1 +Int_NormalFlowScaling = 0.05 + +#Int_Extrapolate: Integer, allows particles to be integrated outside of domain of data by extrapolation of data set +# 0: End integration once particle leaves domain +# 1: Extrapolate velocity outside domain by continuing particle with exit velocity +# 2: Linear extrapolation of entire data set +Int_Extrapolate = 0 + +# Distance_Threshold: (Positive) Float, Specify a threshold for capturing particles by the distance to wall +# A conservative assumption is .4D +# Over .5D(=R) does not make any physical sense! +# Valid only if Int_NormalFlow = 2 +#Distance_Threshold = 12e-5 + +# Particle_Radius: Float, Radius of all things treated as Lagrangian points +# Set to zero if you want points to behave as perfect tracers +Particle_Radius = 0.0 + +# Particle_Density: Float, Mass density of all things treated as Lagrangian points +# Respectively, set =, >, or < fluid density for neutrally buoyant, aerosols, or bubbles +# Only valid if Particle_Radius > 0 +Particle_Density = 1.0 + +# Particle_ICType: Int, Specified type of initial condition assigned to particles +# 0: Start particles from rest +# 1: Start particles with velocity equal to fluid velocity at particle release location +# Valid only if Particle_Radius > 0 +Particle_ICType = 0 + +# Gravity_Vector[i]: Floats, Specifies components of gravity vector (use consistent units) +# Valid only if Particle_Radius > 0 +# VERY VERY IMPORTANT WHILE DOING PARTICLE TRACKING! BE CAREFUL OF THE DIRECTIONS (+?-) +Gravity_Vector[0] = 0 +Gravity_Vector[1] = 0 +Gravity_Vector[2] = -981 + +# Local_Search_Checking: Binary flag +# 0: Only use local search protocol to determine elements containing initial location of points +# where velocity will need to be interpolated (fastest) +# 1: Use global search to check failures of local search protocol (safest, but painfully slow if many points located +# outside of the domain) +# Valid only if Data_MeshType = 1 or 2 +LocalSearchChecking = 0 + +# FTLE_Compute: Binary flag +# 0: Do not compute FTLE fields +# 1: Compute FTLE fields (Trace_Compute must be 0) +FTLE_Compute = 1 + +# FTLE_GenerateMesh: Binary flag +# 0: Read in FTLE mesh data from file FTLE_ICFile (this file created by running flowVC with FTLE_GenerateMesh = 1) +# 1: Generate a Cartesian mesh over which FTLE will be computed (mesh parameters specified below, resulting data +# saved to file FTLE_ICFile) +# Valid only if FTLE_Compute = 1 +FTLE_GenerateMesh = 1 + +# FTLE_ICFile: String, Name of file storing FTLE mesh information +# If FTLE_GenerateMesh = 0, this file should be located in Path_Work directory +# If FTLE_GenerateMesh = 1, this file will be written to Path_Work directory +# Valid only if FTLE_Compute = 1 +FTLE_ICFile = FTLE_mesh.bin + +# FTLE_MeshBounds.XMin, ..., FTLE_MeshBounds.ZRes: Specifies structured grid over which FTLE is computed +# Valid only if FTLE_Compute = 1 +#delta_x = (Xmax - Xmin) / (Xres-1) we need delta_x=delta_y=delta_z +FTLE_MeshBounds.XMin = -0.07324 +FTLE_MeshBounds.XMax = 0.061596 +FTLE_MeshBounds.YMin = 0.11067 +FTLE_MeshBounds.YMax = 0.238690 +FTLE_MeshBounds.ZMin = -0.02736 +FTLE_MeshBounds.ZMax = 0.439045 +FTLE_MeshBounds.XRes = 101 +FTLE_MeshBounds.YRes = 94 +FTLE_MeshBounds.ZRes = 345 + +# FTLE_IntTLength: (Positive) Float, Integration time used to compute FTLE +# Valid only if FTLE_Compute = 1 +FTLE_IntTLength = 1.0 #cardiac cycle duration + +# FTLE_ComputeVariation: Binary flag +# 0: Compute FTLE at each output time with integration time set to FTLE_IntTimeLength +# 1: Compute variation of FTLE with integration time +# Output_TRes should be 1 if FTLE_ComputeVariation = 1 +# Valid only if FTLE_Compute = 1 +FTLE_ComputeVariation = 0 + +# FTLE_VariationOutFreq: (Positive) Integer, controls how often FTLE is output when computing variation of FTLE with +# integration time +# If set to one, output is generated at every time instance that velocity data is defined, if set to say 5, then output +# is generated at 1/5 of that rate (i.e. every 5 velocity data frames) +# Valid only if FTLE_ComputeVariation = 1 +FTLE_VariationOutFreq = 1 + +# FTLE_OutFilePrefix: String, Filename prefix where FTLE output data is written +# A separate file is generated for each output time +# Valid only if FTLE_Compute = 1 +FTLE_OutFilePrefix = FTLEfwd_ + +# Trace_Compute: Binary flag +# 0: Do not compute tracer trajectories +# 1: Compute tracer trajectories (FTLE_Compute must be 0) +Trace_Compute = 0 + +# Trace_ReleaseStrategy: Integer flag +# 0: Traditional release based on launch time parameters below +# 1: Staggered release based on flow rate +# Valid only if Trace_Compute = 1 and (currently) for Data_MeshType = 1 and Dimensions = 3 +Trace_ReleaseStrategy = 0 + +# Trace_ReleaseTMax: (Positive) Float, how long to generate staggered release +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 1 +Trace_ReleaseTMax = 0.000755 + +# Trace_GenerateMesh: Binary Flag +# 0: Read in tracer initial positions from a file (specified by Trace_InFile) +# 1: Generate a Cartesian mesh of tracers to integrate (mesh parameters specified below) +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_GenerateMesh = 0 + +# Trace_InFile: String, Name of File containing tracer initial positions +# Valid only if Trace_Compute = 1 and Trace_GenerateMesh = 0 +# inlet1 : initially 1,225 particles with spacing 0.04 at main inlet (it might get updated!) +# inlet2 : initially 4,889 particles with spacing 0.02 at main inlet (it might get updated!) +# inlet3 : initially 19,597 particles with spacing 0.01 at main inlet (it might get updated!) +# inlet4 : initially 40,009 particles with spacing 0.007 at main inlet (it might get updated!) +# inlet_1mil : initially 1,014,218 particles with spacing 0.00139 at main inlet (it might get updated!) +# inlet5 : initially 542,807 particles with spacing 0.0019 at main inlet (it might get updated!) +# inlet6 : initially 253,553 particles with spacing 0.0019 at main inlet (it might get updated!) +# inlet7 : initially 100,314 particles with spacing 0.00443 at main inlet (it might get updated!) +# RML_1 : initially 69,315 particles with spacing 0.0025 at RML inlet (it might get updated!) +# trachea_1 : initially 128,924 particles with spacing 0.004 at trachea inlet (it might get updated!) +Trace_InFile = trachea_1.vtk + +# Trace_MultipleInFiles: Binary Flag +# 0: Default +# 1: Tracer initial conditions change over time and are specified by multiple files +Trace_MultipleInFiles = 0 + +# Trace_InFileFormat: Integer, specifies format of Trace_InFile +# 0: Use this if you want to reuse the .IC file that is generated from flowVC (use with care) +# 1: ASCII file, first line lists the number of tracers and subsequent lines list the coordinates +# 2: ASCII legacy VTK polydata mesh format (as output from Paraview) +# 3: ASCII legacy VTK unstructured mesh format (as output from Paraview) +# 4: Binary file, first entry lists number of points and subsequent entries list coordinates of points +# If set to 1, residence time data will be output as unstructured mesh +# Valid only if Trace_Compute = 1, Trace_ReleaseStrategy = 0 and Trace_GenerateMesh = 0 +Trace_InFileFormat = 4 + +# Trace_OutFile: String, Prefix of files where tracer position data will be written +# Tracer positions written to separate files for each output time +# Valid only if Trace_Compute = 1 +Trace_OutFilePrefix = trachea_1_5e-5 + +# Trace_NumLaunchTimes: (Positive) Integer, Number of times to release tracers from initial positions +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_NumLaunchTimes = 1 + +# Trace_LaunchTimeSpacing: (Positive) Float, Time between successive release of tracers from starting locations +# Valid only if Trace_Compute = 1, Trace_ReleaseStrategy = 0 and Trace_NumLaunchTimes > 1 +Trace_LaunchTimeSpacing = 0.02 + +# Trace_IntTLength: (Positive) Float, Limits amount of time any tracer will be integrated +# Useful when computing the residence time field at more than one point in time, that is +# to ensure all releases are integrated the same length of time +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_IntTLength = 1000 # 3 cardiacs + +# Trace_AlwaysOutput: Binary Flag +# 0: Do not write out tracer position to file once it has left the domain +# 1: Always write out tracer position to file, even if it left the domain +# Valid only if Trace_Compute = 1 +Trace_AlwaysOutput = 1 + +# Trace_MeshBounds.XMin, ..., Trace_MeshBounds.ZRes: Specifies Cartesian mesh of tracers to be intergrated +# Valid only if Trace_Compute = 1 AND Trace_GenerateMesh = 1 #spacing = .075 , 34682 integrated for.1 +Trace_CartMesh.XMin = -1.9 +Trace_CartMesh.XMax = .43 +Trace_CartMesh.YMin = -11.3 +Trace_CartMesh.YMax = -9.7 +Trace_CartMesh.ZMin = 26.1 +Trace_CartMesh.ZMax = 26.3 +Trace_CartMesh.XRes = 200 +Trace_CartMesh.YRes = 200 +Trace_CartMesh.ZRes = 4 + +###### +Trace_VorticityCompute = 0 + +# Trace_APCompute: Binary flag +# Requires Data_InFilePrefix_strain-rate.#.bin files. +# 0: Do not compute +# 1: Compute activation potential (integrated strain rate) for each particle. +# Valid only if Tracer_Compute = 1 +Trace_APCompute = 0 + +# Trace_ComputeCET: Binary flag +# 1: Compute exposure time data for elements in velocity mesh using the tracer paths +# 0: Do not compute exposure time data +# Valid only if Tracer_Compute = 1 and NOT VALID for Trace_ComputeRT = 1 +Trace_CETCompute = 0 + +# Trace_CETAuxillaryMesh: Binary flag +# 1: Use an auxillary mesh for CET computations, specificed by Trace_CETAuxillaryMeshPrefix +# 0; Use velocity field mesh for CET computations +# Valid only for Trace_Compute = 1 and Trace_ComputeCET = 1 +Trace_CETAuxillaryMesh = 1 + +# Trace_CETAuxillaryMeshPrefix: String +# Prefix for files containing coordinates, connectivity and adjacency data for auxillary mesh +Trace_CETMeshPrefix = meshfile #AMIR + +# Trace_CETSubsteps: Integer, numer of intervals used to discretize exposure time contributions when particle path +# intersects multiple elements during a single integration time step +# Valid only for Tracer_Compute = 1 and Trace_ComputeCET = 1 +Trace_CETSubsteps = 50 + +# Trace_ComputeRT: Binary flag +# 0: Do not compute residence time +# 1: Compute residence time of tracers +# Will compute output for Trace_NumLaunchTimes +# Valid only if Tracer_Compute = 1 and NOT VALID for Trace_ComputeCET = 1 +Trace_RTCompute = 0 #AMIR + +# Trace_RTOutFilePrefix: String, Filename prefix for residence time or exposure time computations +# Valid only if Trace_Compute = 1 and Trace_ComputeCET = 1 or Trace_ComputeRT = 1 +Trace_RTOutFilePrefix = AAA18rt + +# VelOut_Compute: Binary flag, Used to generate interpolated velocity fields +# 0: Do not generate interpolated velocity fields +# 1: Generate interploated velocity fields +VelOut_Compute = 0 + +# VelOut_GenerateMesh: Binary flag +# 0: Read interpolation locations from file specified by VelOut_InFile +# 1: Generate a Cartesian mesh of positions where velocity will be interpolated (mesh parameters specified below) +# Valid only for VelOut_Compute = 1 +VelOut_GenerateMesh = 1 + +# VelOut_InFile: String, filename containing locations of points for interpolation +# Valid only for VelOut_Compute = 1 and VelOut_GenerateMesh = 0 +VelOut_InFile = transient-interpolated.vtk + +# VelOut_InFileFormat, Integer, specified format of VelOut_InFile +# 1: ASCII file, first line lists the number of locations and subsequent lines list the coordinates +# 3: ASCII legacy VTK polydata mesh format (as output from Paraview) +# 4: ASCII legacy VTK unstructured mesh format (as output from Paraview) +# Valid only if VelOut_Compute = 1 AND VelOut_GenerateMesh = 0 +VelOut_InFileFormat = 1 + +# VelOut_FilePrefix: String, Filename prefix for files that interpolated velocity is data is written to +# Velocity output written to separate files, one per output time +# Valid only if VelOut_Compute = 1 +VelOut_FilePrefix = transient-interpolated + +# VelOut_MeshBounds.XMin, ..., VelOut_MeshBounds.ZRes: Specifies Cartesian mesh of interpolation positions +# Valid only if VelOut_Compute = 1 +VelOut_CartMesh.XMin = -3.0 +VelOut_CartMesh.XMax = 6.0 +VelOut_CartMesh.YMin = -1.577 +VelOut_CartMesh.YMax = 1.577 +VelOut_CartMesh.ZMin = 0.0 +VelOut_CartMesh.ZMax = 0.0 +VelOut_CartMesh.XRes = 91 +VelOut_CartMesh.YRes = 32 +VelOut_CartMesh.ZRes = 1 diff --git a/src/settings/LCS_settings_med_resolution.in b/src/settings/LCS_settings_med_resolution.in new file mode 100644 index 0000000..8f277a8 --- /dev/null +++ b/src/settings/LCS_settings_med_resolution.in @@ -0,0 +1,406 @@ +################################# flowVC INPUT FILE ##################################### +# +# NOTE: Order of parameters listed must be maintained for proper parsing of input file +# Comment lines begin with #, comments can be added or removed as desired +# Standard format: VARIABLE_NAME = VALUE +# +################################################################################### +# pts all over the domain, released once, outputTres increased +# Path_Data: String, Directory containing data files +# Can be set to pwd (i.e. present working directory) +Path_Data = /media/share/ECMO/Data/CFD-Solutions/Bin-File-Series/ +#Path_Data = ../../../../Data/CFD-Solutions/Bin-File-Series/ +# Path_Output: String, Directory where output files will be written +# Can be set to pwd (i.e. present working directory) +#Path_Output = ../../../../Data/CFD-Solutions/Bin-File-Series/ +Path_Output = /media/share/ECMO/Data/CFD-Solutions/Bin-File-Series/ +# Dimensions: Integer, Specifies if velocity data is 2D or 3D +Dimensions = 3 + +# Data_MeshType: Integer, Specifies mesh type of velocity data +# 0: Cartesian +# 1: Unstructured static mesh (tetrahedral for 3D and triangular for 2D) +# 2: Unstructured moving mesh +Data_MeshType = 1 + +# Data_InFilePrefix: String, common prefix for input files +# (e.g. velocity, adjacency, connectivity, coordinate files) +Data_InFilePrefix = interpolated_velocity + +# Data_SuffixTMin: Integer, number appended to the name of first velocity data file +# Assumes naming convention of Data_InFilePrefix_vel.N.bin, where Data_InFilePrefix is +# specified above and N varies from Data_SuffixTMin +Data_SuffixTMin = 1200 + +# Data_SuffixTDelta: Integer, Increment between successive velocity data files +Data_SuffixTDelta = 5 + +# Data_SuffixTRes: Integer, number of velocity data files +Data_TRes = 20 + +# Data_TDelta: (Positive) Float, "Real" time spacing between successive velocity data files +# Assumes time spacing between velocity data files is constant +Data_TDelta = 0.05 + +# Data_TMin: Float, Absolute time assigned to first velocity data file +# Choice is arbitrary, but it usually makes sense to set this to zero, which in that case +# would mean that the first velocity data file specifies the velocity at time zero +Data_TMin = 0.0 + +# Data_TPeriodic: Binary flag, Specifies if data is periodic +# 0: Not periodic +# 1: Periodic (make sure first and last data file correspond to same point in cycle) +Data_TPeriodic = 0 + +#adding this to see if it resolves the issue of not reading the +Data_XPeriodic = 0 +# Data_MeshBounds.XMin, ..., Data_MeshBounds.ZMax: Specifies bounding box of velocity data to consider +# Can be used to set a region for computing residence times +Data_MeshBounds.XMin = -0.07324 +Data_MeshBounds.XMax = 0.061596 +Data_MeshBounds.YMin = 0.11067 +Data_MeshBounds.YMax = 0.238690 +Data_MeshBounds.ZMin = -0.02736 +Data_MeshBounds.ZMax = 0.439045 + +# Fluid_Density: Float, specifies fluid density (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Density = 1.2e-3 + +# Fluid_Viscosity: Float, specifies fluid viscosity (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Viscosity = 1.81e-4 + +# Output_TStart: Float, initial time to start simulation and begin writing output +# If FTLE_Compute: Specifies time at which first FTLE field is generated +# If Trace_Compute: Specifies start time to begin integrating tracer trajectories and outputing position to file +Output_TStart = 0.0 + +# Output_TRes: (Positive) Integer, Desired number of output times +# If FTLE_Compute: Specifies number of time instances when the FTLE field will be computed and output +# If Trace_Compute: Specifies number of time instances that tracer positions will be written to file +Output_TRes = 20 + +# Output_TDelta: (Positive) Float, Desired time between successive output +# If FTLE_Compute: How often the FTLE field will be computed and output +# If Trace_Compute: How often the tracer positions will be output +Output_TDelta = 0.05 + +# Int_Type: Integer, specified integration routine used +# If Particle_Radius > 0 ==> Euler integration method is taken automatically +# Runge Kutta methods are integration option for ideal tracers without mass +# 0: Euler +# 1: 4th order Runge Kutta +# 2: Runge Kutta Fehlberg (adaptive time stepping) +Int_Type = 1 + +# Int_BMR: flag (Backward Maxey-Riley [BMR] resembles solving Maxey-Riley equation backward in time) +# 0: Integrate the trajectories via traditional method by solving Maxey-Riley equation +# 1: Integrate the trajectories by solving motion equation on slow manifolds +#Int_BMR = 0 + +# Int_TimeStep: (Positive) Float, Time step used for integration Euler or RK4 routines (i.e. Int_Type = 0 or 1) +# Valid only for Int_Type = 0 or 1 +# Int_TimeStep = 5e-4 # not useful when doing particle deposition +#Int_TimeStep = 1e-5 # good in case of steady simulation + Int_TimeStep = 5e-6 # good while doing unsteady simulations +# Int_TimeStep = 5e-7 # high resolution + +# Int_Accuracy: (Positive) Float, Absolute error tolorance (between RK4 and RK5) +# Valid only for Int_Type = 2 +Int_Accuracy = 0.0001 + +# Int_MinTimeStep: (Positive) Float, Minimum allowable time step used in RKF routine +# Once this time step is reached, RK4 approximation automatically accepted +# Valid only for Int_Type = 2 +Int_MinTimeStep = 0.0001 + +# Int_MaxTimeStep: (Positive) Float, Maximum allowable time step used in RKF routine +# Used as initialize guess for suitable time step when RKF routine is called +# Time step will not be increased beyond this limit even if error between RK4 and RK5 is less than Int_Accuracy +# Valid only for Int_Type = 2 +Int_MaxTimeStep = 0.001 + +# Int_TimeDirection: Integer, Should be set to 1 or -1 +# 1: Advect particles forward in time +# -1: Advect particles backward in time (used to compute backward time FTLE field) +Int_TimeDirection = 1 + +# Int_NormalFlow: flag +# 0: Do not impose inward flow on no-slip boundaries +# 1: Replace no-slip condition on boundaries with inward velocity (magnitude specified by NormalFlowScaling) +# 2: Capture particles once their distance to wall is less than a threshold (Distance_Threshold) [painfully slow] +# Currently valid only for Data_MeshType = 1 and Dimensions = 3 +Int_NormalFlow = 0 + +# Int_NormalFlowScaling: (Positive) Float, Scaling for inward pointing boundary velocity (to prevent tracers from crossing +# no-slip boundaries) +# Valid only for Dimensions = 3, Data_MeshType = 1 or 2, Int_NormalFlow = 1 +Int_NormalFlowScaling = 0.05 + +#Int_Extrapolate: Integer, allows particles to be integrated outside of domain of data by extrapolation of data set +# 0: End integration once particle leaves domain +# 1: Extrapolate velocity outside domain by continuing particle with exit velocity +# 2: Linear extrapolation of entire data set +Int_Extrapolate = 0 + +# Distance_Threshold: (Positive) Float, Specify a threshold for capturing particles by the distance to wall +# A conservative assumption is .4D +# Over .5D(=R) does not make any physical sense! +# Valid only if Int_NormalFlow = 2 +#Distance_Threshold = 12e-5 + +# Particle_Radius: Float, Radius of all things treated as Lagrangian points +# Set to zero if you want points to behave as perfect tracers +Particle_Radius = 0.0 + +# Particle_Density: Float, Mass density of all things treated as Lagrangian points +# Respectively, set =, >, or < fluid density for neutrally buoyant, aerosols, or bubbles +# Only valid if Particle_Radius > 0 +Particle_Density = 1.0 + +# Particle_ICType: Int, Specified type of initial condition assigned to particles +# 0: Start particles from rest +# 1: Start particles with velocity equal to fluid velocity at particle release location +# Valid only if Particle_Radius > 0 +Particle_ICType = 0 + +# Gravity_Vector[i]: Floats, Specifies components of gravity vector (use consistent units) +# Valid only if Particle_Radius > 0 +# VERY VERY IMPORTANT WHILE DOING PARTICLE TRACKING! BE CAREFUL OF THE DIRECTIONS (+?-) +Gravity_Vector[0] = 0 +Gravity_Vector[1] = 0 +Gravity_Vector[2] = -981 + +# Local_Search_Checking: Binary flag +# 0: Only use local search protocol to determine elements containing initial location of points +# where velocity will need to be interpolated (fastest) +# 1: Use global search to check failures of local search protocol (safest, but painfully slow if many points located +# outside of the domain) +# Valid only if Data_MeshType = 1 or 2 +LocalSearchChecking = 0 + +# FTLE_Compute: Binary flag +# 0: Do not compute FTLE fields +# 1: Compute FTLE fields (Trace_Compute must be 0) +FTLE_Compute = 1 + +# FTLE_GenerateMesh: Binary flag +# 0: Read in FTLE mesh data from file FTLE_ICFile (this file created by running flowVC with FTLE_GenerateMesh = 1) +# 1: Generate a Cartesian mesh over which FTLE will be computed (mesh parameters specified below, resulting data +# saved to file FTLE_ICFile) +# Valid only if FTLE_Compute = 1 +FTLE_GenerateMesh = 1 + +# FTLE_ICFile: String, Name of file storing FTLE mesh information +# If FTLE_GenerateMesh = 0, this file should be located in Path_Work directory +# If FTLE_GenerateMesh = 1, this file will be written to Path_Work directory +# Valid only if FTLE_Compute = 1 +FTLE_ICFile = FTLE_mesh.bin + +# FTLE_MeshBounds.XMin, ..., FTLE_MeshBounds.ZRes: Specifies structured grid over which FTLE is computed +# Valid only if FTLE_Compute = 1 +#delta_x = (Xmax - Xmin) / (Xres-1) we need delta_x=delta_y=delta_z +FTLE_MeshBounds.XMin = -0.07324 +FTLE_MeshBounds.XMax = 0.061596 +FTLE_MeshBounds.YMin = 0.11067 +FTLE_MeshBounds.YMax = 0.238690 +FTLE_MeshBounds.ZMin = -0.02736 +FTLE_MeshBounds.ZMax = 0.439045 +FTLE_MeshBounds.XRes = 202 +FTLE_MeshBounds.YRes = 188 +FTLE_MeshBounds.ZRes = 690 + +# FTLE_IntTLength: (Positive) Float, Integration time used to compute FTLE +# Valid only if FTLE_Compute = 1 +FTLE_IntTLength = 1.0 #cardiac cycle duration + +# FTLE_ComputeVariation: Binary flag +# 0: Compute FTLE at each output time with integration time set to FTLE_IntTimeLength +# 1: Compute variation of FTLE with integration time +# Output_TRes should be 1 if FTLE_ComputeVariation = 1 +# Valid only if FTLE_Compute = 1 +FTLE_ComputeVariation = 0 + +# FTLE_VariationOutFreq: (Positive) Integer, controls how often FTLE is output when computing variation of FTLE with +# integration time +# If set to one, output is generated at every time instance that velocity data is defined, if set to say 5, then output +# is generated at 1/5 of that rate (i.e. every 5 velocity data frames) +# Valid only if FTLE_ComputeVariation = 1 +FTLE_VariationOutFreq = 1 + +# FTLE_OutFilePrefix: String, Filename prefix where FTLE output data is written +# A separate file is generated for each output time +# Valid only if FTLE_Compute = 1 +FTLE_OutFilePrefix = FTLEfwd_ + +# Trace_Compute: Binary flag +# 0: Do not compute tracer trajectories +# 1: Compute tracer trajectories (FTLE_Compute must be 0) +Trace_Compute = 0 + +# Trace_ReleaseStrategy: Integer flag +# 0: Traditional release based on launch time parameters below +# 1: Staggered release based on flow rate +# Valid only if Trace_Compute = 1 and (currently) for Data_MeshType = 1 and Dimensions = 3 +Trace_ReleaseStrategy = 0 + +# Trace_ReleaseTMax: (Positive) Float, how long to generate staggered release +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 1 +Trace_ReleaseTMax = 0.000755 + +# Trace_GenerateMesh: Binary Flag +# 0: Read in tracer initial positions from a file (specified by Trace_InFile) +# 1: Generate a Cartesian mesh of tracers to integrate (mesh parameters specified below) +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_GenerateMesh = 0 + +# Trace_InFile: String, Name of File containing tracer initial positions +# Valid only if Trace_Compute = 1 and Trace_GenerateMesh = 0 +# inlet1 : initially 1,225 particles with spacing 0.04 at main inlet (it might get updated!) +# inlet2 : initially 4,889 particles with spacing 0.02 at main inlet (it might get updated!) +# inlet3 : initially 19,597 particles with spacing 0.01 at main inlet (it might get updated!) +# inlet4 : initially 40,009 particles with spacing 0.007 at main inlet (it might get updated!) +# inlet_1mil : initially 1,014,218 particles with spacing 0.00139 at main inlet (it might get updated!) +# inlet5 : initially 542,807 particles with spacing 0.0019 at main inlet (it might get updated!) +# inlet6 : initially 253,553 particles with spacing 0.0019 at main inlet (it might get updated!) +# inlet7 : initially 100,314 particles with spacing 0.00443 at main inlet (it might get updated!) +# RML_1 : initially 69,315 particles with spacing 0.0025 at RML inlet (it might get updated!) +# trachea_1 : initially 128,924 particles with spacing 0.004 at trachea inlet (it might get updated!) +Trace_InFile = trachea_1.vtk + +# Trace_MultipleInFiles: Binary Flag +# 0: Default +# 1: Tracer initial conditions change over time and are specified by multiple files +Trace_MultipleInFiles = 0 + +# Trace_InFileFormat: Integer, specifies format of Trace_InFile +# 0: Use this if you want to reuse the .IC file that is generated from flowVC (use with care) +# 1: ASCII file, first line lists the number of tracers and subsequent lines list the coordinates +# 2: ASCII legacy VTK polydata mesh format (as output from Paraview) +# 3: ASCII legacy VTK unstructured mesh format (as output from Paraview) +# 4: Binary file, first entry lists number of points and subsequent entries list coordinates of points +# If set to 1, residence time data will be output as unstructured mesh +# Valid only if Trace_Compute = 1, Trace_ReleaseStrategy = 0 and Trace_GenerateMesh = 0 +Trace_InFileFormat = 4 + +# Trace_OutFile: String, Prefix of files where tracer position data will be written +# Tracer positions written to separate files for each output time +# Valid only if Trace_Compute = 1 +Trace_OutFilePrefix = trachea_1_5e-5 + +# Trace_NumLaunchTimes: (Positive) Integer, Number of times to release tracers from initial positions +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_NumLaunchTimes = 1 + +# Trace_LaunchTimeSpacing: (Positive) Float, Time between successive release of tracers from starting locations +# Valid only if Trace_Compute = 1, Trace_ReleaseStrategy = 0 and Trace_NumLaunchTimes > 1 +Trace_LaunchTimeSpacing = 0.02 + +# Trace_IntTLength: (Positive) Float, Limits amount of time any tracer will be integrated +# Useful when computing the residence time field at more than one point in time, that is +# to ensure all releases are integrated the same length of time +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_IntTLength = 1000 # 3 cardiacs + +# Trace_AlwaysOutput: Binary Flag +# 0: Do not write out tracer position to file once it has left the domain +# 1: Always write out tracer position to file, even if it left the domain +# Valid only if Trace_Compute = 1 +Trace_AlwaysOutput = 1 + +# Trace_MeshBounds.XMin, ..., Trace_MeshBounds.ZRes: Specifies Cartesian mesh of tracers to be intergrated +# Valid only if Trace_Compute = 1 AND Trace_GenerateMesh = 1 #spacing = .075 , 34682 integrated for.1 +Trace_CartMesh.XMin = -1.9 +Trace_CartMesh.XMax = .43 +Trace_CartMesh.YMin = -11.3 +Trace_CartMesh.YMax = -9.7 +Trace_CartMesh.ZMin = 26.1 +Trace_CartMesh.ZMax = 26.3 +Trace_CartMesh.XRes = 200 +Trace_CartMesh.YRes = 200 +Trace_CartMesh.ZRes = 4 + +###### +Trace_VorticityCompute = 0 + +# Trace_APCompute: Binary flag +# Requires Data_InFilePrefix_strain-rate.#.bin files. +# 0: Do not compute +# 1: Compute activation potential (integrated strain rate) for each particle. +# Valid only if Tracer_Compute = 1 +Trace_APCompute = 0 + +# Trace_ComputeCET: Binary flag +# 1: Compute exposure time data for elements in velocity mesh using the tracer paths +# 0: Do not compute exposure time data +# Valid only if Tracer_Compute = 1 and NOT VALID for Trace_ComputeRT = 1 +Trace_CETCompute = 0 + +# Trace_CETAuxillaryMesh: Binary flag +# 1: Use an auxillary mesh for CET computations, specificed by Trace_CETAuxillaryMeshPrefix +# 0; Use velocity field mesh for CET computations +# Valid only for Trace_Compute = 1 and Trace_ComputeCET = 1 +Trace_CETAuxillaryMesh = 1 + +# Trace_CETAuxillaryMeshPrefix: String +# Prefix for files containing coordinates, connectivity and adjacency data for auxillary mesh +Trace_CETMeshPrefix = meshfile #AMIR + +# Trace_CETSubsteps: Integer, numer of intervals used to discretize exposure time contributions when particle path +# intersects multiple elements during a single integration time step +# Valid only for Tracer_Compute = 1 and Trace_ComputeCET = 1 +Trace_CETSubsteps = 50 + +# Trace_ComputeRT: Binary flag +# 0: Do not compute residence time +# 1: Compute residence time of tracers +# Will compute output for Trace_NumLaunchTimes +# Valid only if Tracer_Compute = 1 and NOT VALID for Trace_ComputeCET = 1 +Trace_RTCompute = 0 #AMIR + +# Trace_RTOutFilePrefix: String, Filename prefix for residence time or exposure time computations +# Valid only if Trace_Compute = 1 and Trace_ComputeCET = 1 or Trace_ComputeRT = 1 +Trace_RTOutFilePrefix = AAA18rt + +# VelOut_Compute: Binary flag, Used to generate interpolated velocity fields +# 0: Do not generate interpolated velocity fields +# 1: Generate interploated velocity fields +VelOut_Compute = 0 + +# VelOut_GenerateMesh: Binary flag +# 0: Read interpolation locations from file specified by VelOut_InFile +# 1: Generate a Cartesian mesh of positions where velocity will be interpolated (mesh parameters specified below) +# Valid only for VelOut_Compute = 1 +VelOut_GenerateMesh = 1 + +# VelOut_InFile: String, filename containing locations of points for interpolation +# Valid only for VelOut_Compute = 1 and VelOut_GenerateMesh = 0 +VelOut_InFile = transient-interpolated.vtk + +# VelOut_InFileFormat, Integer, specified format of VelOut_InFile +# 1: ASCII file, first line lists the number of locations and subsequent lines list the coordinates +# 3: ASCII legacy VTK polydata mesh format (as output from Paraview) +# 4: ASCII legacy VTK unstructured mesh format (as output from Paraview) +# Valid only if VelOut_Compute = 1 AND VelOut_GenerateMesh = 0 +VelOut_InFileFormat = 1 + +# VelOut_FilePrefix: String, Filename prefix for files that interpolated velocity is data is written to +# Velocity output written to separate files, one per output time +# Valid only if VelOut_Compute = 1 +VelOut_FilePrefix = transient-interpolated + +# VelOut_MeshBounds.XMin, ..., VelOut_MeshBounds.ZRes: Specifies Cartesian mesh of interpolation positions +# Valid only if VelOut_Compute = 1 +VelOut_CartMesh.XMin = -3.0 +VelOut_CartMesh.XMax = 6.0 +VelOut_CartMesh.YMin = -1.577 +VelOut_CartMesh.YMax = 1.577 +VelOut_CartMesh.ZMin = 0.0 +VelOut_CartMesh.ZMax = 0.0 +VelOut_CartMesh.XRes = 91 +VelOut_CartMesh.YRes = 32 +VelOut_CartMesh.ZRes = 1 + + +#Hello Again \ No newline at end of file diff --git a/src/settings/LCS_settings_med_resolution_back.in b/src/settings/LCS_settings_med_resolution_back.in new file mode 100644 index 0000000..1e364e7 --- /dev/null +++ b/src/settings/LCS_settings_med_resolution_back.in @@ -0,0 +1,405 @@ +################################# flowVC INPUT FILE ##################################### +# +# NOTE: Order of parameters listed must be maintained for proper parsing of input file +# Comment lines begin with #, comments can be added or removed as desired +# Standard format: VARIABLE_NAME = VALUE +# +################################################################################### +# pts all over the domain, released once, outputTres increased +# Path_Data: String, Directory containing data files +# Can be set to pwd (i.e. present working directory) +Path_Data = /media/share/ECMO/Data/CFD-Solutions/Bin-File-Series/input +#Path_Data = ../../../../Data/CFD-Solutions/Bin-File-Series/ +# Path_Output: String, Directory where output files will be written +# Can be set to pwd (i.e. present working directory) +#Path_Output = ../../../../Data/CFD-Solutions/Bin-File-Series/ +Path_Output = /media/share/ECMO/Data/CFD-Solutions/Bin-File-Series/med_mesh_size +# Dimensions: Integer, Specifies if velocity data is 2D or 3D +Dimensions = 3 + +# Data_MeshType: Integer, Specifies mesh type of velocity data +# 0: Cartesian +# 1: Unstructured static mesh (tetrahedral for 3D and triangular for 2D) +# 2: Unstructured moving mesh +Data_MeshType = 1 + +# Data_InFilePrefix: String, common prefix for input files +# (e.g. velocity, adjacency, connectivity, coordinate files) +Data_InFilePrefix = interpolated_velocity + +# Data_SuffixTMin: Integer, number appended to the name of first velocity data file +# Assumes naming convention of Data_InFilePrefix_vel.N.bin, where Data_InFilePrefix is +# specified above and N varies from Data_SuffixTMin +Data_SuffixTMin = 1200 + +# Data_SuffixTDelta: Integer, Increment between successive velocity data files +Data_SuffixTDelta = 5 + +# Data_SuffixTRes: Integer, number of velocity data files +Data_TRes = 20 + +# Data_TDelta: (Positive) Float, "Real" time spacing between successive velocity data files +# Assumes time spacing between velocity data files is constant +Data_TDelta = 0.05 + +# Data_TMin: Float, Absolute time assigned to first velocity data file +# Choice is arbitrary, but it usually makes sense to set this to zero, which in that case +# would mean that the first velocity data file specifies the velocity at time zero +Data_TMin = 0.00 + +# Data_TPeriodic: Binary flag, Specifies if data is periodic +# 0: Not periodic +# 1: Periodic (make sure first and last data file correspond to same point in cycle) +Data_TPeriodic = 0 + +#adding this to see if it resolves the issue of not reading the +Data_XPeriodic = 0 +# Data_MeshBounds.XMin, ..., Data_MeshBounds.ZMax: Specifies bounding box of velocity data to consider +# Can be used to set a region for computing residence times +Data_MeshBounds.XMin = -0.07324 +Data_MeshBounds.XMax = 0.061596 +Data_MeshBounds.YMin = 0.11067 +Data_MeshBounds.YMax = 0.238690 +Data_MeshBounds.ZMin = -0.02736 +Data_MeshBounds.ZMax = 0.439045 + +# Fluid_Density: Float, specifies fluid density (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Density = 1.2e-3 + +# Fluid_Viscosity: Float, specifies fluid viscosity (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Viscosity = 1.81e-4 + +# Output_TStart: Float, initial time to start simulation and begin writing output +# If FTLE_Compute: Specifies time at which first FTLE field is generated +# If Trace_Compute: Specifies start time to begin integrating tracer trajectories and outputing position to file +Output_TStart = 0.95 + +# Output_TRes: (Positive) Integer, Desired number of output times +# If FTLE_Compute: Specifies number of time instances when the FTLE field will be computed and output +# If Trace_Compute: Specifies number of time instances that tracer positions will be written to file +Output_TRes = 19 + +# Output_TDelta: (Positive) Float, Desired time between successive output +# If FTLE_Compute: How often the FTLE field will be computed and output +# If Trace_Compute: How often the tracer positions will be output +Output_TDelta = 0.05 + +# Int_Type: Integer, specified integration routine used +# If Particle_Radius > 0 ==> Euler integration method is taken automatically +# Runge Kutta methods are integration option for ideal tracers without mass +# 0: Euler +# 1: 4th order Runge Kutta +# 2: Runge Kutta Fehlberg (adaptive time stepping) +Int_Type = 1 + +# Int_BMR: flag (Backward Maxey-Riley [BMR] resembles solving Maxey-Riley equation backward in time) +# 0: Integrate the trajectories via traditional method by solving Maxey-Riley equation +# 1: Integrate the trajectories by solving motion equation on slow manifolds +#Int_BMR = 0 + +# Int_TimeStep: (Positive) Float, Time step used for integration Euler or RK4 routines (i.e. Int_Type = 0 or 1) +# Valid only for Int_Type = 0 or 1 +# Int_TimeStep = 5e-4 # not useful when doing particle deposition +#Int_TimeStep = 1e-5 # good in case of steady simulation + Int_TimeStep = 5e-6 # good while doing unsteady simulations +# Int_TimeStep = 5e-7 # high resolution + +# Int_Accuracy: (Positive) Float, Absolute error tolorance (between RK4 and RK5) +# Valid only for Int_Type = 2 +Int_Accuracy = 0.0001 + +# Int_MinTimeStep: (Positive) Float, Minimum allowable time step used in RKF routine +# Once this time step is reached, RK4 approximation automatically accepted +# Valid only for Int_Type = 2 +Int_MinTimeStep = 0.0001 + +# Int_MaxTimeStep: (Positive) Float, Maximum allowable time step used in RKF routine +# Used as initialize guess for suitable time step when RKF routine is called +# Time step will not be increased beyond this limit even if error between RK4 and RK5 is less than Int_Accuracy +# Valid only for Int_Type = 2 +Int_MaxTimeStep = 0.001 + +# Int_TimeDirection: Integer, Should be set to 1 or -1 +# 1: Advect particles forward in time +# -1: Advect particles backward in time (used to compute backward time FTLE field) +Int_TimeDirection = -1 + +# Int_NormalFlow: flag +# 0: Do not impose inward flow on no-slip boundaries +# 1: Replace no-slip condition on boundaries with inward velocity (magnitude specified by NormalFlowScaling) +# 2: Capture particles once their distance to wall is less than a threshold (Distance_Threshold) [painfully slow] +# Currently valid only for Data_MeshType = 1 and Dimensions = 3 +Int_NormalFlow = 0 + +# Int_NormalFlowScaling: (Positive) Float, Scaling for inward pointing boundary velocity (to prevent tracers from crossing +# no-slip boundaries) +# Valid only for Dimensions = 3, Data_MeshType = 1 or 2, Int_NormalFlow = 1 +Int_NormalFlowScaling = 0.05 + +#Int_Extrapolate: Integer, allows particles to be integrated outside of domain of data by extrapolation of data set +# 0: End integration once particle leaves domain +# 1: Extrapolate velocity outside domain by continuing particle with exit velocity +# 2: Linear extrapolation of entire data set +Int_Extrapolate = 0 + +# Distance_Threshold: (Positive) Float, Specify a threshold for capturing particles by the distance to wall +# A conservative assumption is .4D +# Over .5D(=R) does not make any physical sense! +# Valid only if Int_NormalFlow = 2 +#Distance_Threshold = 12e-5 + +# Particle_Radius: Float, Radius of all things treated as Lagrangian points +# Set to zero if you want points to behave as perfect tracers +Particle_Radius = 0.0 + +# Particle_Density: Float, Mass density of all things treated as Lagrangian points +# Respectively, set =, >, or < fluid density for neutrally buoyant, aerosols, or bubbles +# Only valid if Particle_Radius > 0 +Particle_Density = 1.0 + +# Particle_ICType: Int, Specified type of initial condition assigned to particles +# 0: Start particles from rest +# 1: Start particles with velocity equal to fluid velocity at particle release location +# Valid only if Particle_Radius > 0 +Particle_ICType = 0 + +# Gravity_Vector[i]: Floats, Specifies components of gravity vector (use consistent units) +# Valid only if Particle_Radius > 0 +# VERY VERY IMPORTANT WHILE DOING PARTICLE TRACKING! BE CAREFUL OF THE DIRECTIONS (+?-) +Gravity_Vector[0] = 0 +Gravity_Vector[1] = 0 +Gravity_Vector[2] = -981 + +# Local_Search_Checking: Binary flag +# 0: Only use local search protocol to determine elements containing initial location of points +# where velocity will need to be interpolated (fastest) +# 1: Use global search to check failures of local search protocol (safest, but painfully slow if many points located +# outside of the domain) +# Valid only if Data_MeshType = 1 or 2 +LocalSearchChecking = 0 + +# FTLE_Compute: Binary flag +# 0: Do not compute FTLE fields +# 1: Compute FTLE fields (Trace_Compute must be 0) +FTLE_Compute = 1 + +# FTLE_GenerateMesh: Binary flag +# 0: Read in FTLE mesh data from file FTLE_ICFile (this file created by running flowVC with FTLE_GenerateMesh = 1) +# 1: Generate a Cartesian mesh over which FTLE will be computed (mesh parameters specified below, resulting data +# saved to file FTLE_ICFile) +# Valid only if FTLE_Compute = 1 +FTLE_GenerateMesh = 1 + +# FTLE_ICFile: String, Name of file storing FTLE mesh information +# If FTLE_GenerateMesh = 0, this file should be located in Path_Work directory +# If FTLE_GenerateMesh = 1, this file will be written to Path_Work directory +# Valid only if FTLE_Compute = 1 +FTLE_ICFile = FTLE_mesh.bin + +# FTLE_MeshBounds.XMin, ..., FTLE_MeshBounds.ZRes: Specifies structured grid over which FTLE is computed +# Valid only if FTLE_Compute = 1 +#delta_x = (Xmax - Xmin) / (Xres-1) we need delta_x=delta_y=delta_z +FTLE_MeshBounds.XMin = -0.07324 +FTLE_MeshBounds.XMax = 0.061596 +FTLE_MeshBounds.YMin = 0.11067 +FTLE_MeshBounds.YMax = 0.238690 +FTLE_MeshBounds.ZMin = -0.02736 +FTLE_MeshBounds.ZMax = 0.439045 +FTLE_MeshBounds.XRes = 202 +FTLE_MeshBounds.YRes = 188 +FTLE_MeshBounds.ZRes = 690 + +# FTLE_IntTLength: (Positive) Float, Integration time used to compute FTLE +# Valid only if FTLE_Compute = 1 +FTLE_IntTLength = 0.95 #cardiac cycle duration + +# FTLE_ComputeVariation: Binary flag +# 0: Compute FTLE at each output time with integration time set to FTLE_IntTimeLength +# 1: Compute variation of FTLE with integration time +# Output_TRes should be 1 if FTLE_ComputeVariation = 1 +# Valid only if FTLE_Compute = 1 +FTLE_ComputeVariation = 0 + +# FTLE_VariationOutFreq: (Positive) Integer, controls how often FTLE is output when computing variation of FTLE with +# integration time +# If set to one, output is generated at every time instance that velocity data is defined, if set to say 5, then output +# is generated at 1/5 of that rate (i.e. every 5 velocity data frames) +# Valid only if FTLE_ComputeVariation = 1 +FTLE_VariationOutFreq = 1 + +# FTLE_OutFilePrefix: String, Filename prefix where FTLE output data is written +# A separate file is generated for each output time +# Valid only if FTLE_Compute = 1 +FTLE_OutFilePrefix = FTLEbwd__ + +# Trace_Compute: Binary flag +# 0: Do not compute tracer trajectories +# 1: Compute tracer trajectories (FTLE_Compute must be 0) +Trace_Compute = 0 + +# Trace_ReleaseStrategy: Integer flag +# 0: Traditional release based on launch time parameters below +# 1: Staggered release based on flow rate +# Valid only if Trace_Compute = 1 and (currently) for Data_MeshType = 1 and Dimensions = 3 +Trace_ReleaseStrategy = 0 + +# Trace_ReleaseTMax: (Positive) Float, how long to generate staggered release +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 1 +Trace_ReleaseTMax = 0.000755 + +# Trace_GenerateMesh: Binary Flag +# 0: Read in tracer initial positions from a file (specified by Trace_InFile) +# 1: Generate a Cartesian mesh of tracers to integrate (mesh parameters specified below) +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_GenerateMesh = 0 + +# Trace_InFile: String, Name of File containing tracer initial positions +# Valid only if Trace_Compute = 1 and Trace_GenerateMesh = 0 +# inlet1 : initially 1,225 particles with spacing 0.04 at main inlet (it might get updated!) +# inlet2 : initially 4,889 particles with spacing 0.02 at main inlet (it might get updated!) +# inlet3 : initially 19,597 particles with spacing 0.01 at main inlet (it might get updated!) +# inlet4 : initially 40,009 particles with spacing 0.007 at main inlet (it might get updated!) +# inlet_1mil : initially 1,014,218 particles with spacing 0.00139 at main inlet (it might get updated!) +# inlet5 : initially 542,807 particles with spacing 0.0019 at main inlet (it might get updated!) +# inlet6 : initially 253,553 particles with spacing 0.0019 at main inlet (it might get updated!) +# inlet7 : initially 100,314 particles with spacing 0.00443 at main inlet (it might get updated!) +# RML_1 : initially 69,315 particles with spacing 0.0025 at RML inlet (it might get updated!) +# trachea_1 : initially 128,924 particles with spacing 0.004 at trachea inlet (it might get updated!) +Trace_InFile = trachea_1.vtk + +# Trace_MultipleInFiles: Binary Flag +# 0: Default +# 1: Tracer initial conditions change over time and are specified by multiple files +Trace_MultipleInFiles = 0 + +# Trace_InFileFormat: Integer, specifies format of Trace_InFile +# 0: Use this if you want to reuse the .IC file that is generated from flowVC (use with care) +# 1: ASCII file, first line lists the number of tracers and subsequent lines list the coordinates +# 2: ASCII legacy VTK polydata mesh format (as output from Paraview) +# 3: ASCII legacy VTK unstructured mesh format (as output from Paraview) +# 4: Binary file, first entry lists number of points and subsequent entries list coordinates of points +# If set to 1, residence time data will be output as unstructured mesh +# Valid only if Trace_Compute = 1, Trace_ReleaseStrategy = 0 and Trace_GenerateMesh = 0 +Trace_InFileFormat = 4 + +# Trace_OutFile: String, Prefix of files where tracer position data will be written +# Tracer positions written to separate files for each output time +# Valid only if Trace_Compute = 1 +Trace_OutFilePrefix = trachea_1_5e-5 + +# Trace_NumLaunchTimes: (Positive) Integer, Number of times to release tracers from initial positions +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_NumLaunchTimes = 1 + +# Trace_LaunchTimeSpacing: (Positive) Float, Time between successive release of tracers from starting locations +# Valid only if Trace_Compute = 1, Trace_ReleaseStrategy = 0 and Trace_NumLaunchTimes > 1 +Trace_LaunchTimeSpacing = 0.02 + +# Trace_IntTLength: (Positive) Float, Limits amount of time any tracer will be integrated +# Useful when computing the residence time field at more than one point in time, that is +# to ensure all releases are integrated the same length of time +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_IntTLength = 1000 # 3 cardiacs + +# Trace_AlwaysOutput: Binary Flag +# 0: Do not write out tracer position to file once it has left the domain +# 1: Always write out tracer position to file, even if it left the domain +# Valid only if Trace_Compute = 1 +Trace_AlwaysOutput = 1 + +# Trace_MeshBounds.XMin, ..., Trace_MeshBounds.ZRes: Specifies Cartesian mesh of tracers to be intergrated +# Valid only if Trace_Compute = 1 AND Trace_GenerateMesh = 1 #spacing = .075 , 34682 integrated for.1 +Trace_CartMesh.XMin = -1.9 +Trace_CartMesh.XMax = .43 +Trace_CartMesh.YMin = -11.3 +Trace_CartMesh.YMax = -9.7 +Trace_CartMesh.ZMin = 26.1 +Trace_CartMesh.ZMax = 26.3 +Trace_CartMesh.XRes = 200 +Trace_CartMesh.YRes = 200 +Trace_CartMesh.ZRes = 4 + +###### +Trace_VorticityCompute = 0 + +# Trace_APCompute: Binary flag +# Requires Data_InFilePrefix_strain-rate.#.bin files. +# 0: Do not compute +# 1: Compute activation potential (integrated strain rate) for each particle. +# Valid only if Tracer_Compute = 1 +Trace_APCompute = 0 + +# Trace_ComputeCET: Binary flag +# 1: Compute exposure time data for elements in velocity mesh using the tracer paths +# 0: Do not compute exposure time data +# Valid only if Tracer_Compute = 1 and NOT VALID for Trace_ComputeRT = 1 +Trace_CETCompute = 0 + +# Trace_CETAuxillaryMesh: Binary flag +# 1: Use an auxillary mesh for CET computations, specificed by Trace_CETAuxillaryMeshPrefix +# 0; Use velocity field mesh for CET computations +# Valid only for Trace_Compute = 1 and Trace_ComputeCET = 1 +Trace_CETAuxillaryMesh = 1 + +# Trace_CETAuxillaryMeshPrefix: String +# Prefix for files containing coordinates, connectivity and adjacency data for auxillary mesh +Trace_CETMeshPrefix = meshfile #AMIR + +# Trace_CETSubsteps: Integer, numer of intervals used to discretize exposure time contributions when particle path +# intersects multiple elements during a single integration time step +# Valid only for Tracer_Compute = 1 and Trace_ComputeCET = 1 +Trace_CETSubsteps = 50 + +# Trace_ComputeRT: Binary flag +# 0: Do not compute residence time +# 1: Compute residence time of tracers +# Will compute output for Trace_NumLaunchTimes +# Valid only if Tracer_Compute = 1 and NOT VALID for Trace_ComputeCET = 1 +Trace_RTCompute = 0 #AMIR + +# Trace_RTOutFilePrefix: String, Filename prefix for residence time or exposure time computations +# Valid only if Trace_Compute = 1 and Trace_ComputeCET = 1 or Trace_ComputeRT = 1 +Trace_RTOutFilePrefix = AAA18rt + +# VelOut_Compute: Binary flag, Used to generate interpolated velocity fields +# 0: Do not generate interpolated velocity fields +# 1: Generate interploated velocity fields +VelOut_Compute = 0 + +# VelOut_GenerateMesh: Binary flag +# 0: Read interpolation locations from file specified by VelOut_InFile +# 1: Generate a Cartesian mesh of positions where velocity will be interpolated (mesh parameters specified below) +# Valid only for VelOut_Compute = 1 +VelOut_GenerateMesh = 1 + +# VelOut_InFile: String, filename containing locations of points for interpolation +# Valid only for VelOut_Compute = 1 and VelOut_GenerateMesh = 0 +VelOut_InFile = transient-interpolated.vtk + +# VelOut_InFileFormat, Integer, specified format of VelOut_InFile +# 1: ASCII file, first line lists the number of locations and subsequent lines list the coordinates +# 3: ASCII legacy VTK polydata mesh format (as output from Paraview) +# 4: ASCII legacy VTK unstructured mesh format (as output from Paraview) +# Valid only if VelOut_Compute = 1 AND VelOut_GenerateMesh = 0 +VelOut_InFileFormat = 1 + +# VelOut_FilePrefix: String, Filename prefix for files that interpolated velocity is data is written to +# Velocity output written to separate files, one per output time +# Valid only if VelOut_Compute = 1 +VelOut_FilePrefix = transient-interpolated + +# VelOut_MeshBounds.XMin, ..., VelOut_MeshBounds.ZRes: Specifies Cartesian mesh of interpolation positions +# Valid only if VelOut_Compute = 1 +VelOut_CartMesh.XMin = -3.0 +VelOut_CartMesh.XMax = 6.0 +VelOut_CartMesh.YMin = -1.577 +VelOut_CartMesh.YMax = 1.577 +VelOut_CartMesh.ZMin = 0.0 +VelOut_CartMesh.ZMax = 0.0 +VelOut_CartMesh.XRes = 91 +VelOut_CartMesh.YRes = 32 +VelOut_CartMesh.ZRes = 1 + +# Test 4 \ No newline at end of file From 8603a0b2994b25378a6bd75661d374710cca4712 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Thu, 29 Feb 2024 00:32:39 -0700 Subject: [PATCH 04/68] add binary to git --- .gitignore | 1 - src/flowVC | Bin 0 -> 171400 bytes 2 files changed, 1 deletion(-) create mode 100755 src/flowVC diff --git a/.gitignore b/.gitignore index 819675a..e69de29 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +0,0 @@ -flowVC \ No newline at end of file diff --git a/src/flowVC b/src/flowVC new file mode 100755 index 0000000000000000000000000000000000000000..dc04d7ca028df0cda0da1d44f497434e16425c90 GIT binary patch literal 171400 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

O=K5i$U#a`N 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

&}Yzd@BkPs|d7&wI` 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 Date: Sun, 31 Mar 2024 21:01:19 -0700 Subject: [PATCH 05/68] Project restructure (#3) * refactor, redo global check * bugfix: set index to zero based on searched to found * move global search into function * refactor: move global search check deceleration to header file * refactor: update global_search_check documentation * restructure project for running tests * refactor: update gitignore to ignore settings file. remove old files --- .gitignore | 64 + README.md | 2 + makefile | 140 + src/flowVC | Bin 171400 -> 0 bytes src/ftle.c | 412 +-- src/ftle.h | 6 +- src/makefile | 40 - src/mesh.c | 192 +- src/scratch.c | 9 + src/scratch.h | 3 + .../LCS_settings_course_resolution.in | 403 --- src/settings/LCS_settings_med_resolution.in | 406 --- .../LCS_settings_med_resolution_back.in | 405 --- src/structs.h | 7 +- test/Testscratch.c | 29 + unity/src/meson.build | 17 + unity/src/unity.c | 2488 +++++++++++++++++ unity/src/unity.h | 698 +++++ unity/src/unity_internals.h | 1170 ++++++++ 19 files changed, 5026 insertions(+), 1465 deletions(-) create mode 100644 makefile delete mode 100755 src/flowVC delete mode 100644 src/makefile create mode 100644 src/scratch.c create mode 100644 src/scratch.h delete mode 100644 src/settings/LCS_settings_course_resolution.in delete mode 100644 src/settings/LCS_settings_med_resolution.in delete mode 100644 src/settings/LCS_settings_med_resolution_back.in create mode 100644 test/Testscratch.c create mode 100644 unity/src/meson.build create mode 100644 unity/src/unity.c create mode 100644 unity/src/unity.h create mode 100644 unity/src/unity_internals.h diff --git a/.gitignore b/.gitignore index e69de29..ad2512a 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,64 @@ +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +# Build directory +/build/ + + +# temp +*tmp* + +#settings file +settings_script_controlled.in + + diff --git a/README.md b/README.md index 76794b1..6f40ee0 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ flowVC Flow Visualization Code + +Forked from FlowPhysics/flowVC Copyright 2013 Shadden Research Group. All rights reserved. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS diff --git a/makefile b/makefile new file mode 100644 index 0000000..ff8cba0 --- /dev/null +++ b/makefile @@ -0,0 +1,140 @@ +ifeq ($(OS),Windows_NT) + ifeq ($(shell uname -s),) # not in a bash-like shell + CLEANUP = del /F /Q + MKDIR = mkdir + else # in a bash-like shell, like msys + CLEANUP = rm -f + MKDIR = mkdir -p + endif + TARGET_EXTENSION=exe +else + CLEANUP = rm -f + MKDIR = mkdir -p + TARGET_EXTENSION=out +endif + +.PHONY: clean +.PHONY: test +.PHONY: all + +PATHU = unity/src/ +PATHS = src/ +PATHT = test/ +PATHB = build/ +PATHD = build/depends/ +PATHO = build/objs/ +PATHR = build/results/ + +BUILD_PATHS = $(PATHB) $(PATHD) $(PATHO) $(PATHR) + +SRCT = $(wildcard $(PATHT)*.c) + +COMPILE=gcc -c +LINK=gcc +DEPEND=gcc -MM -MG -MF +LFLAG= -lm + +# Set build mode +ifeq ($(mode),debug) + CFLAGS = -g -Wall -O0 -I. -I$(PATHU) -I$(PATHS) -DTEST +else + mode = release + CFLAGS = -Wall -O3 -I. -I$(PATHU) -I$(PATHS) -DTEST +endif + + + +all: info project + +info: +ifneq ($(mode),release) +ifneq ($(mode),debug) + @echo "Invalid build mode." + @echo "Please use 'make mode=release' or 'make mode=debug'" + @exit 1 +endif +endif + @echo "Building in "$(mode)" mode..." + +# Define the output filename +OUTPUT_NAME = flowVC + +# List of source files for your project +SRCS = $(wildcard $(PATHS)*.c) + +# List of object files for your project +OBJS = $(patsubst $(PATHS)%.c,$(PATHO)%.o,$(SRCS)) + +# Target for building your project +project: $(BUILD_PATHS) $(OBJS) + $(LINK) -o $(PATHB)$(OUTPUT_NAME).$(TARGET_EXTENSION) $(OBJS) $(LFLAG) + +# Dependency rule for object files +$(PATHO)%.o: $(PATHS)%.c + $(COMPILE) $(CFLAGS) $< -o $@ + + + + +############################ Testing ####################################### +############################################################################ + +RESULTS = $(patsubst $(PATHT)Test%.c,$(PATHR)Test%.txt,$(SRCT) ) + +PASSED = `grep -s PASS $(PATHR)*.txt` +FAIL = `grep -s FAIL $(PATHR)*.txt` +IGNORE = `grep -s IGNORE $(PATHR)*.txt` + +test: $(BUILD_PATHS) $(RESULTS) + @echo "-----------------------\nIGNORES:\n-----------------------" + @echo "$(IGNORE)" + @echo "-----------------------\nFAILURES:\n-----------------------" + @echo "$(FAIL)" + @echo "-----------------------\nPASSED:\n-----------------------" + @echo "$(PASSED)" + @echo "\nDONE" + +$(PATHR)%.txt: $(PATHB)%.$(TARGET_EXTENSION) + -./$< > $@ 2>&1 + +$(PATHB)Test%.$(TARGET_EXTENSION): $(PATHO)Test%.o $(PATHO)%.o $(PATHO)unity.o + $(LINK) -o $@ $^ + +$(PATHO)%.o:: $(PATHT)%.c + $(COMPILE) $(CFLAGS) $< -o $@ + +$(PATHO)%.o:: $(PATHS)%.c + $(COMPILE) $(CFLAGS) $< -o $@ + +$(PATHO)%.o:: $(PATHU)%.c $(PATHU)%.h + $(COMPILE) $(CFLAGS) $< -o $@ + +$(PATHD)%.d:: $(PATHT)%.c + $(DEPEND) $@ $< + +$(PATHB): + $(MKDIR) $(PATHB) + +$(PATHD): + $(MKDIR) $(PATHD) + +$(PATHO): + $(MKDIR) $(PATHO) + +$(PATHR): + $(MKDIR) $(PATHR) + + +clean: + $(CLEANUP) $(PATHO)*.o + $(CLEANUP) $(PATHB)*.$(TARGET_EXTENSION) + $(CLEANUP) $(PATHR)*.txt + +.PRECIOUS: $(PATHB)Test%.$(TARGET_EXTENSION) +.PRECIOUS: $(PATHD)%.d +.PRECIOUS: $(PATHO)%.o +.PRECIOUS: $(PATHR)%.txt + + + + diff --git a/src/flowVC b/src/flowVC deleted file mode 100755 index dc04d7ca028df0cda0da1d44f497434e16425c90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171400 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

O=K5i$U#a`N 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

&}Yzd@BkPs|d7&wI` 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 0) - FTLE_MeshPt[i-1][j][k].HaveFTLE = 1; - if(i < FTLE_CartMesh.XRes - 1) - FTLE_MeshPt[i+1][j][k].HaveFTLE = 1; - if(j > 0) - FTLE_MeshPt[i][j-1][k].HaveFTLE = 1; - if(j < FTLE_CartMesh.YRes - 1) - FTLE_MeshPt[i][j+1][k].HaveFTLE = 1; - if(k > 0) - FTLE_MeshPt[i][j][k-1].HaveFTLE = 1; - if(k < FTLE_CartMesh.ZRes - 1) - FTLE_MeshPt[i][j][k+1].HaveFTLE = 1; + FTLE_dont_compute(i,j,k); } } } @@ -101,150 +103,99 @@ void InitializeFTLEArray(void) { fflush(stdout); guess = seed; } - + + /* // BRAY RE_WRITE COMMENT START */ /* Search over all the points */ for(i = 0; i < FTLE_CartMesh.XRes; i++) { - iguess = -1; - for(j = 0; j < FTLE_CartMesh.YRes; j++) { - jguess = -1; - for(k = 0; k < FTLE_CartMesh.ZRes; k++) { - if(!FTLE_MeshPt[i][j][k].Pt.LeftDomain) { - if(seed < 0) { - seed = Get_Element_Global_Search(FTLE_MeshPt[i][j][k].Pt.X); - if(seed < 0) { - FTLE_MeshPt[i][j][k].Pt.LeftDomain = 1; - FTLE_MeshPt[i][j][k].Pt.LeftDomainTime = -1.0; - /* No need to calculate FTLE for this point */ - FTLE_MeshPt[i][j][k].HaveFTLE = 1; - FTLE_MeshPt[i][j][k].FTLEwT = FTLE_outside; - FTLE_MeshPt[i][j][k].FTLEwoT = FTLE_outside; - /* Or its neighbors */ - if(i > 0) - FTLE_MeshPt[i-1][j][k].HaveFTLE = 1; - if(i < FTLE_CartMesh.XRes - 1) - FTLE_MeshPt[i+1][j][k].HaveFTLE = 1; - if(j > 0) - FTLE_MeshPt[i][j-1][k].HaveFTLE = 1; - if(j < FTLE_CartMesh.YRes - 1) - FTLE_MeshPt[i][j+1][k].HaveFTLE = 1; - if(k > 0) - FTLE_MeshPt[i][j][k-1].HaveFTLE = 1; - if(k < FTLE_CartMesh.ZRes - 1) - FTLE_MeshPt[i][j][k+1].HaveFTLE = 1; - } - else { - printf(" Using first located element seed.\n"); - fflush(stdout); - FTLE_MeshPt[i][j][k].Pt.ElementIndex = seed; - found++; - guess = seed; - jguess = seed; - iguess = seed; - } - } - else { - count++; - if(100 * count / (FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes) > percentage) { - printf(" %d%%", percentage); - fflush(stdout); - percentage = percentage + 10; - } - index = Get_Element_Local_Search(FTLE_MeshPt[i][j][k].Pt.X, guess); - if(index < 0) { - /* An element not found, try searching from seed location */ - index = Get_Element_Local_Search(FTLE_MeshPt[i][j][k].Pt.X, seed); - if(index < 0) { - /* If an element still not found, do global search if local search checking requested */ - if(LocalSearchChecking) { - index = Get_Element_Global_Search(FTLE_MeshPt[i][j][k].Pt.X); - if(index < 0) { /* Point is definitely not in any element */ - FTLE_MeshPt[i][j][k].Pt.LeftDomain = 1; - FTLE_MeshPt[i][j][k].Pt.LeftDomainTime = -1.0; - /* No need to calculate FTLE for this point or its neighbors */ - FTLE_MeshPt[i][j][k].HaveFTLE = 1; - FTLE_MeshPt[i][j][k].FTLEwT = FTLE_outside; - FTLE_MeshPt[i][j][k].FTLEwoT = FTLE_outside; - if(i > 0) - FTLE_MeshPt[i-1][j][k].HaveFTLE = 1; - if(i < FTLE_CartMesh.XRes - 1) - FTLE_MeshPt[i+1][j][k].HaveFTLE = 1; - if(j > 0) - FTLE_MeshPt[i][j-1][k].HaveFTLE = 1; - if(j < FTLE_CartMesh.YRes - 1) - FTLE_MeshPt[i][j+1][k].HaveFTLE = 1; - if(k > 0) - FTLE_MeshPt[i][j][k-1].HaveFTLE = 1; - if(k < FTLE_CartMesh.ZRes - 1) - FTLE_MeshPt[i][j][k+1].HaveFTLE = 1; - } - else { - FTLE_MeshPt[i][j][k].Pt.ElementIndex = index; - foundGS++; - found++; - guess = index; - if(jguess < 0) - jguess = index; - if(iguess < 0) - iguess = index; - } - } - else { - FTLE_MeshPt[i][j][k].Pt.LeftDomain = 1; - FTLE_MeshPt[i][j][k].Pt.LeftDomainTime = -1.0; - /* No need to calculate FTLE for this point or its neighbors */ - FTLE_MeshPt[i][j][k].HaveFTLE = 1; - FTLE_MeshPt[i][j][k].FTLEwT = FTLE_outside; - FTLE_MeshPt[i][j][k].FTLEwoT = FTLE_outside; - if(i > 0) - FTLE_MeshPt[i-1][j][k].HaveFTLE = 1; - if(i < FTLE_CartMesh.XRes - 1) - FTLE_MeshPt[i+1][j][k].HaveFTLE = 1; - if(j > 0) - FTLE_MeshPt[i][j-1][k].HaveFTLE = 1; - if(j < FTLE_CartMesh.YRes - 1) - FTLE_MeshPt[i][j+1][k].HaveFTLE = 1; - if(k > 0) - FTLE_MeshPt[i][j][k-1].HaveFTLE = 1; - if(k < FTLE_CartMesh.ZRes - 1) - FTLE_MeshPt[i][j][k+1].HaveFTLE = 1; - } - } - else { - FTLE_MeshPt[i][j][k].Pt.ElementIndex = index; - found++; - guess = index; - if(jguess < 0) - jguess = index; - if(iguess < 0) - iguess = index; - } - } - else { - FTLE_MeshPt[i][j][k].Pt.ElementIndex = index; - found++; - guess = index; - if(jguess < 0) - jguess = index; - if(iguess < 0) - iguess = index; - } - } - } - } + iguess = -1; + for(j = 0; j < FTLE_CartMesh.YRes; j++) { + jguess = -1; + for(k = 0; k < FTLE_CartMesh.ZRes; k++) { + if(!FTLE_MeshPt[i][j][k].Pt.LeftDomain) { + count++; + + //todo wrap this into a #ifdef DEBUG_3 + if (count>count_report){ + printf( + "found: %d, searched:%d total to search %d \n", + found, + count, + FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes); + fflush(stdout); + count_report+=100; } - if(jguess >= 0) - guess = jguess; - } + + // Original report in 10% increments + /* if(100 * count / (FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes) > percentage) { */ + /* printf(" %d%%", percentage); */ + /* fflush(stdout); */ + /* percentage = percentage + 10; */ + /* } */ + // + + index = -1; + //if we dont have a seed yet, try a global search + if(seed < 0) { + index = Get_Element_Global_Search(FTLE_MeshPt[i][j][k].Pt.X); + if (index >= 0){ + // record the index as seed and best guess + printf(" Using first located element seed.\n"); + fflush(stdout); + seed = index; + guess = index; + jguess = index; + iguess = index; + + } + } + + // If we do have a seed try a local search + if(index < 0 && seed >=0) { + index = Get_Element_Local_Search(FTLE_MeshPt[i][j][k].Pt.X, guess); + } + // If we do have a seed, but did not find an index yet, try a local search from seed + if(index < 0 && seed >=0) { + index = Get_Element_Local_Search(FTLE_MeshPt[i][j][k].Pt.X, seed); + } + + + //If we found a point + if (index >= 0){ + global_search_success[i][j][k].searched = 1; // mark the point as searched + global_search_success[i][j][k].found = 1; // mark the point as found + FTLE_MeshPt[i][j][k].Pt.ElementIndex = index; // record the element the pont was found inside + found++; + guess = index; + + if(jguess < 0) + jguess = index; + if(iguess < 0) + iguess = index; + } + + + + } //pt left domain close + + } //k loop close + + }// j loop close + if(jguess >= 0) + guess = jguess; + }// i loop close if(iguess >= 0) - guess = iguess; + guess = iguess; - - if(LocalSearchChecking) - printf(" %d of %d located in domain (%d caught by local search checking)\n", found, FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes, foundGS); - else - printf(" %d of %d located in domain\n", found, FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes); + /* // Try a global search for points next to found points */ + if(LocalSearchChecking){ + global_search_check(10000, 100, &found,global_search_success); + } + + //else + printf(" %d of %d located in domain\n", found, FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes); fflush(stdout); - } + } + /* Open bin file to store FTLE_MeshPt initialization data */ sprintf(FTLE_BinFilePath, "%s%s", Path_Data, FTLE_ICFile); @@ -836,6 +787,134 @@ LagrangianPoint Advect_FTLEPoint(int i, int j, int k, double t1, double t2) { } +void global_search_check(int max_loops, int count_report_interval, int *found, Search ***global_search_success) { + /** + * Perform a global search on all points next to a found point + * + * Loop through all of the data points max_loops times, + * performing a global search on every point that is next to a found point + * stopping if no points are found in a full loop or if max_loops is reached + * + * + * max_loops: The maximum number of times to loop through the data + * count_report_interval: + * number of itterations to do before printing the status + * *found: a pointer to the global found counter + * ***global_search_success: a pointer to a 3d array that stores the following + * global_search_success[i][j][k].found: + * 1 if a point has been found (else 0) + * global_search_success[i][j][k].searched: + * 1 if a point has already been searched using a global search, else 0 + * + */ + + // perform a global_search for any points directly next to a found point + int i, j, k,index,top, left, right, bottom, front, back, outside, me,count,count_report, global_count_total, global_count, stop, loops; + global_count_total =0; + stop = 0; + loops = 0; + + + while (stop==0){ + global_count = 0; + loops++; + count = 0; + count_report = 0; + for(i = 1; i < FTLE_CartMesh.XRes-1; i++) { + for(j = 1; j < FTLE_CartMesh.YRes-1; j++) { + for(k = 1; k < FTLE_CartMesh.ZRes-1; k++) { + count++; + if (count>count_report){ + printf( + "found: %d, from local: %d: this loop: %d, searched:%d total to search %d \n", + *found, + global_count_total, + global_count, + count, + (FTLE_CartMesh.XRes-2) * (FTLE_CartMesh.YRes-2) * (FTLE_CartMesh.ZRes-2)); + fflush(stdout); + count_report+=count_report_interval; + } + + //If my point has not had a global search + me = global_search_success[i][j][k].searched; + //But i am next to a point that has been found + left = global_search_success[i-1][j][k].found; + right = global_search_success[i+1][j][k].found; + top = global_search_success[i][j+1][k].found; + bottom = global_search_success[i][j-1][k].found; + front = global_search_success[i][j][k+1].found; + back = global_search_success[i][j][k-1].found; + // And i am not outside the domain + outside = TestOutsideDomain(FTLE_MeshPt[i][j][k].Pt.X); + + index = -1; + // Try searching using a global search + if((me == 0) && (top == 1 || bottom == 1 || front == 1 || back ==1 || left == 1 || right == 1) && (outside != 1) ){ + + index = Get_Element_Global_Search(FTLE_MeshPt[i][j][k].Pt.X); + global_search_success[i][j][k].searched = 1; // record that this point saw a global search + if(index >= 0){ + global_search_success[i][j][k].found =1; + + //Set index and reset other settings that were zeroed + FTLE_MeshPt[i][j][k].Pt.ElementIndex = index; + + + // Increment counters + // pts found this while loop + global_count++; + + // total number found by global counting + global_count_total++; + // Total found overall + *found = *found + 1; + + } + } + } + } // end + }//End i loop + + + //If no points were found + // Or we have reached our max loops + if(global_count == 0 || loops>=max_loops){ + stop = 1; + } + + } +} + +void FTLE_dont_compute(int i, int j, int k) { + // For a point and its neighbors, set the values to indicate that the FTLE doesnt need to be computed + + //printf("point not found"); + FTLE_MeshPt[i][j][k].Pt.LeftDomain = 1; + FTLE_MeshPt[i][j][k].Pt.LeftDomainTime = -1.0; + /* No need to calculate FTLE for this point */ + FTLE_MeshPt[i][j][k].HaveFTLE = 1; + FTLE_MeshPt[i][j][k].FTLEwT = -1.0; + FTLE_MeshPt[i][j][k].FTLEwoT = -1.0; +} +void FTLE_dont_compute_neighbors(int i, int j, int k, int i_max, int j_max, int k_max){ + //Dont compute FTLE for neighbors + if(i > 0) + FTLE_MeshPt[i-1][j][k].HaveFTLE = 1; + if(i < i_max - 1) + FTLE_MeshPt[i+1][j][k].HaveFTLE = 1; + if(j > 0) + FTLE_MeshPt[i][j-1][k].HaveFTLE = 1; + if(j < j_max - 1) + FTLE_MeshPt[i][j+1][k].HaveFTLE = 1; + if(k > 0) + FTLE_MeshPt[i][j][k-1].HaveFTLE = 1; + if(k < k_max - 1) + FTLE_MeshPt[i][j][k+1].HaveFTLE = 1; +} + + + void UpdateFTLELocations(void) { /* Copies contents of FTLE_NewArray to FTLE_MeshPt */ int i, j, k; @@ -955,15 +1034,30 @@ void FreeFTLEData(void) { FTLE_NewArray[i][j] = NULL; free(FTLE_MeshPt[i][j]); FTLE_MeshPt[i][j] = NULL; + } free(FTLE_NewArray[i]); FTLE_NewArray[i] = NULL; free(FTLE_MeshPt[i]); FTLE_MeshPt[i] = NULL; + } free(FTLE_NewArray); FTLE_NewArray = NULL; free(FTLE_MeshPt); FTLE_MeshPt = NULL; + } + + +void free_global_search_success (Search ***global_search_success, int l, int m){ + + for (int i = 0;i #include #include +#include #include "exposuretime.h" #include "globals.h" #include "io.h" #include "macros.h" #include "memory.h" #include "mesh.h" +//#define DEBUG +int check_bounds(int *i, int *stop_flag, double x, int coord); + void LoadMeshData(void) { printf("Loading mesh data..."); @@ -142,7 +146,6 @@ void LoadUnstructMeshData(void) { /* Read number of nodes */ if(fread(&Vel_MeshNumNodes, sizeof(int), 1, Mesh_BinFileID) < 1) FatalError("Could not read number of mesh nodes from %s", Mesh_BinFilePath); - printf("DEBUG Mesh File Path: %s", Mesh_BinFilePath); printf("Loading coordinate data for %d nodes...", Vel_MeshNumNodes); fflush(stdout); @@ -173,7 +176,7 @@ void LoadUnstructMeshData(void) { /* Read number of elements */ if(fread(&Vel_MeshNumElements, sizeof(int), 1, Mesh_BinFileID) < 1) FatalError("Could not read number of mesh elements from %s", Mesh_BinFilePath); - printf("DEBUG Mesh_Bin_FilePath", Mesh_BinFilePath); + printf("Loading connectivity and adjacency data for %d elements...", Vel_MeshNumElements); fflush(stdout); @@ -314,56 +317,93 @@ int Get_Element_Global_Search(const double *X) { double a11, a12, a13, a21, a22, a23, a31, a32, a33; double r, s, t, d; double V; - + double x_min, x_max, y_min, y_max, z_min, z_max; x = X[0]; y = X[1]; z = X[2]; i = 0; + int stop_flag; + #ifdef DEBUG + //clock_t tic = clock(); + //printf("DEBUG: starting global search \n"); + #endif + //int fist_pt_debug = 0; + //double point_check; while(i < Vel_MeshNumElements) { /* Search over all elements */ + if(Dimensions == 3) { - /* Physical coordinates of nodes of the test element */ - x0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][0]; - y0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][1]; - z0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][2]; - x1 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[1]][0]; - y1 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[1]][1]; - z1 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[1]][2]; - x2 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[2]][0]; - y2 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[2]][1]; - z2 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[2]][2]; - x3 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[3]][0]; - y3 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[3]][1]; - z3 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[3]][2]; - - /* Entries for mapping of physical to natural coordinates of test element */ - a11 = (z3 - z0) * (y2 - y3) - (z2 - z3) * (y3 - y0); - a21 = (z3 - z0) * (y0 - y1) - (z0 - z1) * (y3 - y0); - a31 = (z1 - z2) * (y0 - y1) - (z0 - z1) * (y1 - y2); - a12 = (x3 - x0) * (z2 - z3) - (x2 - x3) * (z3 - z0); - a22 = (x3 - x0) * (z0 - z1) - (x0 - x1) * (z3 - z0); - a32 = (x1 - x2) * (z0 - z1) - (x0 - x1) * (z1 - z2); - a13 = (y3 - y0) * (x2 - x3) - (y2 - y3) * (x3 - x0); - a23 = (y3 - y0) * (x0 - x1) - (y0 - y1) * (x3 - x0); - a33 = (y1 - y2) * (x0 - x1) - (y0 - y1) * (x1 - x2); - - /* Determinant of mapping from natural to physical coordinates of test element */ - V = (x1 - x0) * ((y2 - y0) * (z3 - z0) - (z2 - z0) * (y3 - y0)) + - (x2 - x0) * ((y0 - y1) * (z3 - z0) - (z0 - z1) * (y3 - y0)) + - (x3 - x0) * ((y1 - y0) * (z2 - z0) - (z1 - z0) * (y2 - y0)); - - /* Natural coordinates of point to be interpolated */ - r = (a11 * (x - x0) + a12 * (y - y0) + a13 * (z - z0)) / V; - s = (a21 * (x - x0) + a22 * (y - y0) + a23 * (z - z0)) / V; - t = (a31 * (x - x0) + a32 * (y - y0) + a33 * (z - z0)) / V; - - d = fmin(r, fmin(s, fmin(t, 1 - r - s - t))); - - if(d > -TINY) /* Point inside test element */ - return(i); - else /* Check next element */ - i++; - } + // Check to ensure we are not outside the boudning rectangle + // First check if x < x_min or x>x_max. If so stop early + stop_flag = 0; + check_bounds(&i, &stop_flag, x, 0); + // check if y < y_min or y>y_max. If so stop early + if(stop_flag==0){ + check_bounds(&i, &stop_flag, y, 1); + } + // check if z < z_min or z>z_max. If so stop early + if(stop_flag==0){ + check_bounds(&i, &stop_flag, z, 2); + } + + // If we are inside the boudning rectangle, check if we are inside the tetrahedron + if(stop_flag==0){ + #ifdef DEBUG + // printf("DEBUG: checking tetrahedron \n"); + // printf("x_min %f, x_max %f, x %f \n",x_min, x_max, x); + // printf("y_min %f, y_max %f, y %f \n",y_min, y_max, y); + // printf("z_min %f, z_max %f, z %f \n",z_min, z_max, z); + #endif + /* Check if any coordinate is further than the tolerance away */ + //if (!((fabs(x0 - x) > 0.01 || fabs(y0 - y) > 0.01 || fabs(z0 - z) > 0.01))){ + x0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][0]; + y0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][1]; + z0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][2]; + x1 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[1]][0]; + y1 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[1]][1]; + z1 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[1]][2]; + x2 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[2]][0]; + y2 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[2]][1]; + z2 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[2]][2]; + x3 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[3]][0]; + y3 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[3]][1]; + z3 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[3]][2]; + + /* Entries for mapping of physical to natural coordinates of test element */ + a11 = (z3 - z0) * (y2 - y3) - (z2 - z3) * (y3 - y0); + a21 = (z3 - z0) * (y0 - y1) - (z0 - z1) * (y3 - y0); + a31 = (z1 - z2) * (y0 - y1) - (z0 - z1) * (y1 - y2); + a12 = (x3 - x0) * (z2 - z3) - (x2 - x3) * (z3 - z0); + a22 = (x3 - x0) * (z0 - z1) - (x0 - x1) * (z3 - z0); + a32 = (x1 - x2) * (z0 - z1) - (x0 - x1) * (z1 - z2); + a13 = (y3 - y0) * (x2 - x3) - (y2 - y3) * (x3 - x0); + a23 = (y3 - y0) * (x0 - x1) - (y0 - y1) * (x3 - x0); + a33 = (y1 - y2) * (x0 - x1) - (y0 - y1) * (x1 - x2); + + /* Determinant of mapping from natural to physical coordinates of test element */ + V = (x1 - x0) * ((y2 - y0) * (z3 - z0) - (z2 - z0) * (y3 - y0)) + + (x2 - x0) * ((y0 - y1) * (z3 - z0) - (z0 - z1) * (y3 - y0)) + + (x3 - x0) * ((y1 - y0) * (z2 - z0) - (z1 - z0) * (y2 - y0)); + + /* Natural coordinates of point to be interpolated */ + r = (a11 * (x - x0) + a12 * (y - y0) + a13 * (z - z0)) / V; + s = (a21 * (x - x0) + a22 * (y - y0) + a23 * (z - z0)) / V; + t = (a31 * (x - x0) + a32 * (y - y0) + a33 * (z - z0)) / V; + + d = fmin(r, fmin(s, fmin(t, 1 - r - s - t))); + + if(d > -TINY){ /* Point inside test element */ + #ifdef DEBUG + printf("DEBUG: global search sucessful \n"); + #endif + return(i); + } + else /* Check next element */ + i++; + } + + + } else { /* Dimensions == 2 */ /* Physical coordinates of nodes of the test element */ x0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][0]; @@ -388,13 +428,18 @@ int Get_Element_Global_Search(const double *X) { d = fmin(r, fmin(s, 1 - r - s)); - if(d > -TINY) /* Point inside test element */ + if(d > -TINY) {/* Point inside test element */ + return(i); + } else /* Check next element */ i++; } + } - + #ifdef DEBUG + //printf("global search did not return \n"); + #endif return -1; } @@ -504,10 +549,13 @@ int Get_Element_Local_Search(const double *X, int guess) { double a11, a12, a13, a21, a22, a23, a31, a32, a33; double r, s, t, d; double V; - + x = X[0]; y = X[1]; z = X[2]; + #ifdef DEBUG + printf("DEBUG: starting local search \n"); + #endif while(1) { if(Dimensions == 3) { @@ -548,8 +596,12 @@ int Get_Element_Local_Search(const double *X, int guess) { d = fmin(r, fmin(s, fmin(t, 1 - r - s - t))); - if(d > -TINY) /* Point inside test element */ - return(guess); + if(d > -TINY){ /* Point inside test element */ + #ifdef DEBUG + printf("DEBUG: Local Search Successful \n"); + #endif + return(guess); + } else { /* Reset test element to neighbor */ if(fabs(r - d) < TINY) guess = Vel_MeshElementArray[guess].NeighborIndex[0]; @@ -728,3 +780,43 @@ int Get_Element_Local_Search_Aux(const double *X, int guess) { } + +int check_bounds(int *i, int *stop_flag, double x, int coord){ + double x0, x1, x2, x3; + double x_max, x_min; + // Function to determine if a points value (either x, y or z) is between an elements min and max of that cordinate + // Arguments + // *i : a pointer to the i counter wich is the element of interest + // *stop_flag: a pointer to the stop flag. If the cordinate cannot possibly be in the element the value stored in this location will be set to 1 + // *x: the cordinate value that you are checking (either the x, y or z value) + // coord: (0 = x , 1= y, 2 = z) + // + + // + //get the value of the cordinate ( + x0 = Vel_MeshNodeArray[Vel_MeshElementArray[*i].Nodes[0]][coord]; + x1 = Vel_MeshNodeArray[Vel_MeshElementArray[*i].Nodes[1]][coord]; + x2 = Vel_MeshNodeArray[Vel_MeshElementArray[*i].Nodes[2]][coord]; + x3 = Vel_MeshNodeArray[Vel_MeshElementArray[*i].Nodes[3]][coord]; + x_min = fmin(x0, fmin(x1, fmin(x2,x3))); + x_max = fmax(x0, fmax(x1, fmax(x2,x3))); + // If we are not in y range, move to next element + if(x> x_max || x< x_min){ + *i =*i+1; + *stop_flag = 1; + #ifdef DEBUG + if(coord ==0){ + //printf("DEBUG: stop at x \n"); + } + else if (coord ==1){ + //printf("DEBUG: stop at y \n"); + } + else{ + //printf("DEBUG: stop at z \n"); + } + + #endif + } +} + + diff --git a/src/scratch.c b/src/scratch.c new file mode 100644 index 0000000..8178354 --- /dev/null +++ b/src/scratch.c @@ -0,0 +1,9 @@ +#include +#include +#include +#include "scratch.h" + + +int bray_add(int a, int b){ + return(a+b); +} diff --git a/src/scratch.h b/src/scratch.h new file mode 100644 index 0000000..b0b3773 --- /dev/null +++ b/src/scratch.h @@ -0,0 +1,3 @@ +#include + +int bray_add(int a, int b); diff --git a/src/settings/LCS_settings_course_resolution.in b/src/settings/LCS_settings_course_resolution.in deleted file mode 100644 index f4d62eb..0000000 --- a/src/settings/LCS_settings_course_resolution.in +++ /dev/null @@ -1,403 +0,0 @@ -################################# flowVC INPUT FILE ##################################### -# -# NOTE: Order of parameters listed must be maintained for proper parsing of input file -# Comment lines begin with #, comments can be added or removed as desired -# Standard format: VARIABLE_NAME = VALUE -# -################################################################################### -# pts all over the domain, released once, outputTres increased -# Path_Data: String, Directory containing data files -# Can be set to pwd (i.e. present working directory) -#Path_Data = ~/masters/ECMO/Data/CFD-Solutions/Bin-File-Series/ -Path_Data = ../../../../Data/CFD-Solutions/Bin-File-Series/ -# Path_Output: String, Directory where output files will be written -# Can be set to pwd (i.e. present working directory) -Path_Output = ../../../../Data/CFD-Solutions/Bin-File-Series/ - -# Dimensions: Integer, Specifies if velocity data is 2D or 3D -Dimensions = 3 - -# Data_MeshType: Integer, Specifies mesh type of velocity data -# 0: Cartesian -# 1: Unstructured static mesh (tetrahedral for 3D and triangular for 2D) -# 2: Unstructured moving mesh -Data_MeshType = 1 - -# Data_InFilePrefix: String, common prefix for input files -# (e.g. velocity, adjacency, connectivity, coordinate files) -Data_InFilePrefix = interpolated_velocity - -# Data_SuffixTMin: Integer, number appended to the name of first velocity data file -# Assumes naming convention of Data_InFilePrefix_vel.N.bin, where Data_InFilePrefix is -# specified above and N varies from Data_SuffixTMin -Data_SuffixTMin = 1200 - -# Data_SuffixTDelta: Integer, Increment between successive velocity data files -Data_SuffixTDelta = 5 - -# Data_SuffixTRes: Integer, number of velocity data files -Data_TRes = 20 - -# Data_TDelta: (Positive) Float, "Real" time spacing between successive velocity data files -# Assumes time spacing between velocity data files is constant -Data_TDelta = 0.05 - -# Data_TMin: Float, Absolute time assigned to first velocity data file -# Choice is arbitrary, but it usually makes sense to set this to zero, which in that case -# would mean that the first velocity data file specifies the velocity at time zero -Data_TMin = 0.0 - -# Data_TPeriodic: Binary flag, Specifies if data is periodic -# 0: Not periodic -# 1: Periodic (make sure first and last data file correspond to same point in cycle) -Data_TPeriodic = 0 - -#adding this to see if it resolves the issue of not reading the -Data_XPeriodic = 0 -# Data_MeshBounds.XMin, ..., Data_MeshBounds.ZMax: Specifies bounding box of velocity data to consider -# Can be used to set a region for computing residence times -Data_MeshBounds.XMin = -0.07324 -Data_MeshBounds.XMax = 0.061596 -Data_MeshBounds.YMin = 0.11067 -Data_MeshBounds.YMax = 0.238690 -Data_MeshBounds.ZMin = -0.02736 -Data_MeshBounds.ZMax = 0.439045 - -# Fluid_Density: Float, specifies fluid density (use consistent units) -# Valid only if Particle_Radius > 0 -Fluid_Density = 1.2e-3 - -# Fluid_Viscosity: Float, specifies fluid viscosity (use consistent units) -# Valid only if Particle_Radius > 0 -Fluid_Viscosity = 1.81e-4 - -# Output_TStart: Float, initial time to start simulation and begin writing output -# If FTLE_Compute: Specifies time at which first FTLE field is generated -# If Trace_Compute: Specifies start time to begin integrating tracer trajectories and outputing position to file -Output_TStart = 0.0 - -# Output_TRes: (Positive) Integer, Desired number of output times -# If FTLE_Compute: Specifies number of time instances when the FTLE field will be computed and output -# If Trace_Compute: Specifies number of time instances that tracer positions will be written to file -Output_TRes = 20 - -# Output_TDelta: (Positive) Float, Desired time between successive output -# If FTLE_Compute: How often the FTLE field will be computed and output -# If Trace_Compute: How often the tracer positions will be output -Output_TDelta = 0.05 - -# Int_Type: Integer, specified integration routine used -# If Particle_Radius > 0 ==> Euler integration method is taken automatically -# Runge Kutta methods are integration option for ideal tracers without mass -# 0: Euler -# 1: 4th order Runge Kutta -# 2: Runge Kutta Fehlberg (adaptive time stepping) -Int_Type = 1 - -# Int_BMR: flag (Backward Maxey-Riley [BMR] resembles solving Maxey-Riley equation backward in time) -# 0: Integrate the trajectories via traditional method by solving Maxey-Riley equation -# 1: Integrate the trajectories by solving motion equation on slow manifolds -#Int_BMR = 0 - -# Int_TimeStep: (Positive) Float, Time step used for integration Euler or RK4 routines (i.e. Int_Type = 0 or 1) -# Valid only for Int_Type = 0 or 1 -# Int_TimeStep = 5e-4 # not useful when doing particle deposition -#Int_TimeStep = 1e-5 # good in case of steady simulation - Int_TimeStep = 5e-6 # good while doing unsteady simulations -# Int_TimeStep = 5e-7 # high resolution - -# Int_Accuracy: (Positive) Float, Absolute error tolorance (between RK4 and RK5) -# Valid only for Int_Type = 2 -Int_Accuracy = 0.0001 - -# Int_MinTimeStep: (Positive) Float, Minimum allowable time step used in RKF routine -# Once this time step is reached, RK4 approximation automatically accepted -# Valid only for Int_Type = 2 -Int_MinTimeStep = 0.0001 - -# Int_MaxTimeStep: (Positive) Float, Maximum allowable time step used in RKF routine -# Used as initialize guess for suitable time step when RKF routine is called -# Time step will not be increased beyond this limit even if error between RK4 and RK5 is less than Int_Accuracy -# Valid only for Int_Type = 2 -Int_MaxTimeStep = 0.001 - -# Int_TimeDirection: Integer, Should be set to 1 or -1 -# 1: Advect particles forward in time -# -1: Advect particles backward in time (used to compute backward time FTLE field) -Int_TimeDirection = 1 - -# Int_NormalFlow: flag -# 0: Do not impose inward flow on no-slip boundaries -# 1: Replace no-slip condition on boundaries with inward velocity (magnitude specified by NormalFlowScaling) -# 2: Capture particles once their distance to wall is less than a threshold (Distance_Threshold) [painfully slow] -# Currently valid only for Data_MeshType = 1 and Dimensions = 3 -Int_NormalFlow = 0 - -# Int_NormalFlowScaling: (Positive) Float, Scaling for inward pointing boundary velocity (to prevent tracers from crossing -# no-slip boundaries) -# Valid only for Dimensions = 3, Data_MeshType = 1 or 2, Int_NormalFlow = 1 -Int_NormalFlowScaling = 0.05 - -#Int_Extrapolate: Integer, allows particles to be integrated outside of domain of data by extrapolation of data set -# 0: End integration once particle leaves domain -# 1: Extrapolate velocity outside domain by continuing particle with exit velocity -# 2: Linear extrapolation of entire data set -Int_Extrapolate = 0 - -# Distance_Threshold: (Positive) Float, Specify a threshold for capturing particles by the distance to wall -# A conservative assumption is .4D -# Over .5D(=R) does not make any physical sense! -# Valid only if Int_NormalFlow = 2 -#Distance_Threshold = 12e-5 - -# Particle_Radius: Float, Radius of all things treated as Lagrangian points -# Set to zero if you want points to behave as perfect tracers -Particle_Radius = 0.0 - -# Particle_Density: Float, Mass density of all things treated as Lagrangian points -# Respectively, set =, >, or < fluid density for neutrally buoyant, aerosols, or bubbles -# Only valid if Particle_Radius > 0 -Particle_Density = 1.0 - -# Particle_ICType: Int, Specified type of initial condition assigned to particles -# 0: Start particles from rest -# 1: Start particles with velocity equal to fluid velocity at particle release location -# Valid only if Particle_Radius > 0 -Particle_ICType = 0 - -# Gravity_Vector[i]: Floats, Specifies components of gravity vector (use consistent units) -# Valid only if Particle_Radius > 0 -# VERY VERY IMPORTANT WHILE DOING PARTICLE TRACKING! BE CAREFUL OF THE DIRECTIONS (+?-) -Gravity_Vector[0] = 0 -Gravity_Vector[1] = 0 -Gravity_Vector[2] = -981 - -# Local_Search_Checking: Binary flag -# 0: Only use local search protocol to determine elements containing initial location of points -# where velocity will need to be interpolated (fastest) -# 1: Use global search to check failures of local search protocol (safest, but painfully slow if many points located -# outside of the domain) -# Valid only if Data_MeshType = 1 or 2 -LocalSearchChecking = 0 - -# FTLE_Compute: Binary flag -# 0: Do not compute FTLE fields -# 1: Compute FTLE fields (Trace_Compute must be 0) -FTLE_Compute = 1 - -# FTLE_GenerateMesh: Binary flag -# 0: Read in FTLE mesh data from file FTLE_ICFile (this file created by running flowVC with FTLE_GenerateMesh = 1) -# 1: Generate a Cartesian mesh over which FTLE will be computed (mesh parameters specified below, resulting data -# saved to file FTLE_ICFile) -# Valid only if FTLE_Compute = 1 -FTLE_GenerateMesh = 1 - -# FTLE_ICFile: String, Name of file storing FTLE mesh information -# If FTLE_GenerateMesh = 0, this file should be located in Path_Work directory -# If FTLE_GenerateMesh = 1, this file will be written to Path_Work directory -# Valid only if FTLE_Compute = 1 -FTLE_ICFile = FTLE_mesh.bin - -# FTLE_MeshBounds.XMin, ..., FTLE_MeshBounds.ZRes: Specifies structured grid over which FTLE is computed -# Valid only if FTLE_Compute = 1 -#delta_x = (Xmax - Xmin) / (Xres-1) we need delta_x=delta_y=delta_z -FTLE_MeshBounds.XMin = -0.07324 -FTLE_MeshBounds.XMax = 0.061596 -FTLE_MeshBounds.YMin = 0.11067 -FTLE_MeshBounds.YMax = 0.238690 -FTLE_MeshBounds.ZMin = -0.02736 -FTLE_MeshBounds.ZMax = 0.439045 -FTLE_MeshBounds.XRes = 101 -FTLE_MeshBounds.YRes = 94 -FTLE_MeshBounds.ZRes = 345 - -# FTLE_IntTLength: (Positive) Float, Integration time used to compute FTLE -# Valid only if FTLE_Compute = 1 -FTLE_IntTLength = 1.0 #cardiac cycle duration - -# FTLE_ComputeVariation: Binary flag -# 0: Compute FTLE at each output time with integration time set to FTLE_IntTimeLength -# 1: Compute variation of FTLE with integration time -# Output_TRes should be 1 if FTLE_ComputeVariation = 1 -# Valid only if FTLE_Compute = 1 -FTLE_ComputeVariation = 0 - -# FTLE_VariationOutFreq: (Positive) Integer, controls how often FTLE is output when computing variation of FTLE with -# integration time -# If set to one, output is generated at every time instance that velocity data is defined, if set to say 5, then output -# is generated at 1/5 of that rate (i.e. every 5 velocity data frames) -# Valid only if FTLE_ComputeVariation = 1 -FTLE_VariationOutFreq = 1 - -# FTLE_OutFilePrefix: String, Filename prefix where FTLE output data is written -# A separate file is generated for each output time -# Valid only if FTLE_Compute = 1 -FTLE_OutFilePrefix = FTLEfwd_ - -# Trace_Compute: Binary flag -# 0: Do not compute tracer trajectories -# 1: Compute tracer trajectories (FTLE_Compute must be 0) -Trace_Compute = 0 - -# Trace_ReleaseStrategy: Integer flag -# 0: Traditional release based on launch time parameters below -# 1: Staggered release based on flow rate -# Valid only if Trace_Compute = 1 and (currently) for Data_MeshType = 1 and Dimensions = 3 -Trace_ReleaseStrategy = 0 - -# Trace_ReleaseTMax: (Positive) Float, how long to generate staggered release -# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 1 -Trace_ReleaseTMax = 0.000755 - -# Trace_GenerateMesh: Binary Flag -# 0: Read in tracer initial positions from a file (specified by Trace_InFile) -# 1: Generate a Cartesian mesh of tracers to integrate (mesh parameters specified below) -# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 -Trace_GenerateMesh = 0 - -# Trace_InFile: String, Name of File containing tracer initial positions -# Valid only if Trace_Compute = 1 and Trace_GenerateMesh = 0 -# inlet1 : initially 1,225 particles with spacing 0.04 at main inlet (it might get updated!) -# inlet2 : initially 4,889 particles with spacing 0.02 at main inlet (it might get updated!) -# inlet3 : initially 19,597 particles with spacing 0.01 at main inlet (it might get updated!) -# inlet4 : initially 40,009 particles with spacing 0.007 at main inlet (it might get updated!) -# inlet_1mil : initially 1,014,218 particles with spacing 0.00139 at main inlet (it might get updated!) -# inlet5 : initially 542,807 particles with spacing 0.0019 at main inlet (it might get updated!) -# inlet6 : initially 253,553 particles with spacing 0.0019 at main inlet (it might get updated!) -# inlet7 : initially 100,314 particles with spacing 0.00443 at main inlet (it might get updated!) -# RML_1 : initially 69,315 particles with spacing 0.0025 at RML inlet (it might get updated!) -# trachea_1 : initially 128,924 particles with spacing 0.004 at trachea inlet (it might get updated!) -Trace_InFile = trachea_1.vtk - -# Trace_MultipleInFiles: Binary Flag -# 0: Default -# 1: Tracer initial conditions change over time and are specified by multiple files -Trace_MultipleInFiles = 0 - -# Trace_InFileFormat: Integer, specifies format of Trace_InFile -# 0: Use this if you want to reuse the .IC file that is generated from flowVC (use with care) -# 1: ASCII file, first line lists the number of tracers and subsequent lines list the coordinates -# 2: ASCII legacy VTK polydata mesh format (as output from Paraview) -# 3: ASCII legacy VTK unstructured mesh format (as output from Paraview) -# 4: Binary file, first entry lists number of points and subsequent entries list coordinates of points -# If set to 1, residence time data will be output as unstructured mesh -# Valid only if Trace_Compute = 1, Trace_ReleaseStrategy = 0 and Trace_GenerateMesh = 0 -Trace_InFileFormat = 4 - -# Trace_OutFile: String, Prefix of files where tracer position data will be written -# Tracer positions written to separate files for each output time -# Valid only if Trace_Compute = 1 -Trace_OutFilePrefix = trachea_1_5e-5 - -# Trace_NumLaunchTimes: (Positive) Integer, Number of times to release tracers from initial positions -# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 -Trace_NumLaunchTimes = 1 - -# Trace_LaunchTimeSpacing: (Positive) Float, Time between successive release of tracers from starting locations -# Valid only if Trace_Compute = 1, Trace_ReleaseStrategy = 0 and Trace_NumLaunchTimes > 1 -Trace_LaunchTimeSpacing = 0.02 - -# Trace_IntTLength: (Positive) Float, Limits amount of time any tracer will be integrated -# Useful when computing the residence time field at more than one point in time, that is -# to ensure all releases are integrated the same length of time -# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 -Trace_IntTLength = 1000 # 3 cardiacs - -# Trace_AlwaysOutput: Binary Flag -# 0: Do not write out tracer position to file once it has left the domain -# 1: Always write out tracer position to file, even if it left the domain -# Valid only if Trace_Compute = 1 -Trace_AlwaysOutput = 1 - -# Trace_MeshBounds.XMin, ..., Trace_MeshBounds.ZRes: Specifies Cartesian mesh of tracers to be intergrated -# Valid only if Trace_Compute = 1 AND Trace_GenerateMesh = 1 #spacing = .075 , 34682 integrated for.1 -Trace_CartMesh.XMin = -1.9 -Trace_CartMesh.XMax = .43 -Trace_CartMesh.YMin = -11.3 -Trace_CartMesh.YMax = -9.7 -Trace_CartMesh.ZMin = 26.1 -Trace_CartMesh.ZMax = 26.3 -Trace_CartMesh.XRes = 200 -Trace_CartMesh.YRes = 200 -Trace_CartMesh.ZRes = 4 - -###### -Trace_VorticityCompute = 0 - -# Trace_APCompute: Binary flag -# Requires Data_InFilePrefix_strain-rate.#.bin files. -# 0: Do not compute -# 1: Compute activation potential (integrated strain rate) for each particle. -# Valid only if Tracer_Compute = 1 -Trace_APCompute = 0 - -# Trace_ComputeCET: Binary flag -# 1: Compute exposure time data for elements in velocity mesh using the tracer paths -# 0: Do not compute exposure time data -# Valid only if Tracer_Compute = 1 and NOT VALID for Trace_ComputeRT = 1 -Trace_CETCompute = 0 - -# Trace_CETAuxillaryMesh: Binary flag -# 1: Use an auxillary mesh for CET computations, specificed by Trace_CETAuxillaryMeshPrefix -# 0; Use velocity field mesh for CET computations -# Valid only for Trace_Compute = 1 and Trace_ComputeCET = 1 -Trace_CETAuxillaryMesh = 1 - -# Trace_CETAuxillaryMeshPrefix: String -# Prefix for files containing coordinates, connectivity and adjacency data for auxillary mesh -Trace_CETMeshPrefix = meshfile #AMIR - -# Trace_CETSubsteps: Integer, numer of intervals used to discretize exposure time contributions when particle path -# intersects multiple elements during a single integration time step -# Valid only for Tracer_Compute = 1 and Trace_ComputeCET = 1 -Trace_CETSubsteps = 50 - -# Trace_ComputeRT: Binary flag -# 0: Do not compute residence time -# 1: Compute residence time of tracers -# Will compute output for Trace_NumLaunchTimes -# Valid only if Tracer_Compute = 1 and NOT VALID for Trace_ComputeCET = 1 -Trace_RTCompute = 0 #AMIR - -# Trace_RTOutFilePrefix: String, Filename prefix for residence time or exposure time computations -# Valid only if Trace_Compute = 1 and Trace_ComputeCET = 1 or Trace_ComputeRT = 1 -Trace_RTOutFilePrefix = AAA18rt - -# VelOut_Compute: Binary flag, Used to generate interpolated velocity fields -# 0: Do not generate interpolated velocity fields -# 1: Generate interploated velocity fields -VelOut_Compute = 0 - -# VelOut_GenerateMesh: Binary flag -# 0: Read interpolation locations from file specified by VelOut_InFile -# 1: Generate a Cartesian mesh of positions where velocity will be interpolated (mesh parameters specified below) -# Valid only for VelOut_Compute = 1 -VelOut_GenerateMesh = 1 - -# VelOut_InFile: String, filename containing locations of points for interpolation -# Valid only for VelOut_Compute = 1 and VelOut_GenerateMesh = 0 -VelOut_InFile = transient-interpolated.vtk - -# VelOut_InFileFormat, Integer, specified format of VelOut_InFile -# 1: ASCII file, first line lists the number of locations and subsequent lines list the coordinates -# 3: ASCII legacy VTK polydata mesh format (as output from Paraview) -# 4: ASCII legacy VTK unstructured mesh format (as output from Paraview) -# Valid only if VelOut_Compute = 1 AND VelOut_GenerateMesh = 0 -VelOut_InFileFormat = 1 - -# VelOut_FilePrefix: String, Filename prefix for files that interpolated velocity is data is written to -# Velocity output written to separate files, one per output time -# Valid only if VelOut_Compute = 1 -VelOut_FilePrefix = transient-interpolated - -# VelOut_MeshBounds.XMin, ..., VelOut_MeshBounds.ZRes: Specifies Cartesian mesh of interpolation positions -# Valid only if VelOut_Compute = 1 -VelOut_CartMesh.XMin = -3.0 -VelOut_CartMesh.XMax = 6.0 -VelOut_CartMesh.YMin = -1.577 -VelOut_CartMesh.YMax = 1.577 -VelOut_CartMesh.ZMin = 0.0 -VelOut_CartMesh.ZMax = 0.0 -VelOut_CartMesh.XRes = 91 -VelOut_CartMesh.YRes = 32 -VelOut_CartMesh.ZRes = 1 diff --git a/src/settings/LCS_settings_med_resolution.in b/src/settings/LCS_settings_med_resolution.in deleted file mode 100644 index 8f277a8..0000000 --- a/src/settings/LCS_settings_med_resolution.in +++ /dev/null @@ -1,406 +0,0 @@ -################################# flowVC INPUT FILE ##################################### -# -# NOTE: Order of parameters listed must be maintained for proper parsing of input file -# Comment lines begin with #, comments can be added or removed as desired -# Standard format: VARIABLE_NAME = VALUE -# -################################################################################### -# pts all over the domain, released once, outputTres increased -# Path_Data: String, Directory containing data files -# Can be set to pwd (i.e. present working directory) -Path_Data = /media/share/ECMO/Data/CFD-Solutions/Bin-File-Series/ -#Path_Data = ../../../../Data/CFD-Solutions/Bin-File-Series/ -# Path_Output: String, Directory where output files will be written -# Can be set to pwd (i.e. present working directory) -#Path_Output = ../../../../Data/CFD-Solutions/Bin-File-Series/ -Path_Output = /media/share/ECMO/Data/CFD-Solutions/Bin-File-Series/ -# Dimensions: Integer, Specifies if velocity data is 2D or 3D -Dimensions = 3 - -# Data_MeshType: Integer, Specifies mesh type of velocity data -# 0: Cartesian -# 1: Unstructured static mesh (tetrahedral for 3D and triangular for 2D) -# 2: Unstructured moving mesh -Data_MeshType = 1 - -# Data_InFilePrefix: String, common prefix for input files -# (e.g. velocity, adjacency, connectivity, coordinate files) -Data_InFilePrefix = interpolated_velocity - -# Data_SuffixTMin: Integer, number appended to the name of first velocity data file -# Assumes naming convention of Data_InFilePrefix_vel.N.bin, where Data_InFilePrefix is -# specified above and N varies from Data_SuffixTMin -Data_SuffixTMin = 1200 - -# Data_SuffixTDelta: Integer, Increment between successive velocity data files -Data_SuffixTDelta = 5 - -# Data_SuffixTRes: Integer, number of velocity data files -Data_TRes = 20 - -# Data_TDelta: (Positive) Float, "Real" time spacing between successive velocity data files -# Assumes time spacing between velocity data files is constant -Data_TDelta = 0.05 - -# Data_TMin: Float, Absolute time assigned to first velocity data file -# Choice is arbitrary, but it usually makes sense to set this to zero, which in that case -# would mean that the first velocity data file specifies the velocity at time zero -Data_TMin = 0.0 - -# Data_TPeriodic: Binary flag, Specifies if data is periodic -# 0: Not periodic -# 1: Periodic (make sure first and last data file correspond to same point in cycle) -Data_TPeriodic = 0 - -#adding this to see if it resolves the issue of not reading the -Data_XPeriodic = 0 -# Data_MeshBounds.XMin, ..., Data_MeshBounds.ZMax: Specifies bounding box of velocity data to consider -# Can be used to set a region for computing residence times -Data_MeshBounds.XMin = -0.07324 -Data_MeshBounds.XMax = 0.061596 -Data_MeshBounds.YMin = 0.11067 -Data_MeshBounds.YMax = 0.238690 -Data_MeshBounds.ZMin = -0.02736 -Data_MeshBounds.ZMax = 0.439045 - -# Fluid_Density: Float, specifies fluid density (use consistent units) -# Valid only if Particle_Radius > 0 -Fluid_Density = 1.2e-3 - -# Fluid_Viscosity: Float, specifies fluid viscosity (use consistent units) -# Valid only if Particle_Radius > 0 -Fluid_Viscosity = 1.81e-4 - -# Output_TStart: Float, initial time to start simulation and begin writing output -# If FTLE_Compute: Specifies time at which first FTLE field is generated -# If Trace_Compute: Specifies start time to begin integrating tracer trajectories and outputing position to file -Output_TStart = 0.0 - -# Output_TRes: (Positive) Integer, Desired number of output times -# If FTLE_Compute: Specifies number of time instances when the FTLE field will be computed and output -# If Trace_Compute: Specifies number of time instances that tracer positions will be written to file -Output_TRes = 20 - -# Output_TDelta: (Positive) Float, Desired time between successive output -# If FTLE_Compute: How often the FTLE field will be computed and output -# If Trace_Compute: How often the tracer positions will be output -Output_TDelta = 0.05 - -# Int_Type: Integer, specified integration routine used -# If Particle_Radius > 0 ==> Euler integration method is taken automatically -# Runge Kutta methods are integration option for ideal tracers without mass -# 0: Euler -# 1: 4th order Runge Kutta -# 2: Runge Kutta Fehlberg (adaptive time stepping) -Int_Type = 1 - -# Int_BMR: flag (Backward Maxey-Riley [BMR] resembles solving Maxey-Riley equation backward in time) -# 0: Integrate the trajectories via traditional method by solving Maxey-Riley equation -# 1: Integrate the trajectories by solving motion equation on slow manifolds -#Int_BMR = 0 - -# Int_TimeStep: (Positive) Float, Time step used for integration Euler or RK4 routines (i.e. Int_Type = 0 or 1) -# Valid only for Int_Type = 0 or 1 -# Int_TimeStep = 5e-4 # not useful when doing particle deposition -#Int_TimeStep = 1e-5 # good in case of steady simulation - Int_TimeStep = 5e-6 # good while doing unsteady simulations -# Int_TimeStep = 5e-7 # high resolution - -# Int_Accuracy: (Positive) Float, Absolute error tolorance (between RK4 and RK5) -# Valid only for Int_Type = 2 -Int_Accuracy = 0.0001 - -# Int_MinTimeStep: (Positive) Float, Minimum allowable time step used in RKF routine -# Once this time step is reached, RK4 approximation automatically accepted -# Valid only for Int_Type = 2 -Int_MinTimeStep = 0.0001 - -# Int_MaxTimeStep: (Positive) Float, Maximum allowable time step used in RKF routine -# Used as initialize guess for suitable time step when RKF routine is called -# Time step will not be increased beyond this limit even if error between RK4 and RK5 is less than Int_Accuracy -# Valid only for Int_Type = 2 -Int_MaxTimeStep = 0.001 - -# Int_TimeDirection: Integer, Should be set to 1 or -1 -# 1: Advect particles forward in time -# -1: Advect particles backward in time (used to compute backward time FTLE field) -Int_TimeDirection = 1 - -# Int_NormalFlow: flag -# 0: Do not impose inward flow on no-slip boundaries -# 1: Replace no-slip condition on boundaries with inward velocity (magnitude specified by NormalFlowScaling) -# 2: Capture particles once their distance to wall is less than a threshold (Distance_Threshold) [painfully slow] -# Currently valid only for Data_MeshType = 1 and Dimensions = 3 -Int_NormalFlow = 0 - -# Int_NormalFlowScaling: (Positive) Float, Scaling for inward pointing boundary velocity (to prevent tracers from crossing -# no-slip boundaries) -# Valid only for Dimensions = 3, Data_MeshType = 1 or 2, Int_NormalFlow = 1 -Int_NormalFlowScaling = 0.05 - -#Int_Extrapolate: Integer, allows particles to be integrated outside of domain of data by extrapolation of data set -# 0: End integration once particle leaves domain -# 1: Extrapolate velocity outside domain by continuing particle with exit velocity -# 2: Linear extrapolation of entire data set -Int_Extrapolate = 0 - -# Distance_Threshold: (Positive) Float, Specify a threshold for capturing particles by the distance to wall -# A conservative assumption is .4D -# Over .5D(=R) does not make any physical sense! -# Valid only if Int_NormalFlow = 2 -#Distance_Threshold = 12e-5 - -# Particle_Radius: Float, Radius of all things treated as Lagrangian points -# Set to zero if you want points to behave as perfect tracers -Particle_Radius = 0.0 - -# Particle_Density: Float, Mass density of all things treated as Lagrangian points -# Respectively, set =, >, or < fluid density for neutrally buoyant, aerosols, or bubbles -# Only valid if Particle_Radius > 0 -Particle_Density = 1.0 - -# Particle_ICType: Int, Specified type of initial condition assigned to particles -# 0: Start particles from rest -# 1: Start particles with velocity equal to fluid velocity at particle release location -# Valid only if Particle_Radius > 0 -Particle_ICType = 0 - -# Gravity_Vector[i]: Floats, Specifies components of gravity vector (use consistent units) -# Valid only if Particle_Radius > 0 -# VERY VERY IMPORTANT WHILE DOING PARTICLE TRACKING! BE CAREFUL OF THE DIRECTIONS (+?-) -Gravity_Vector[0] = 0 -Gravity_Vector[1] = 0 -Gravity_Vector[2] = -981 - -# Local_Search_Checking: Binary flag -# 0: Only use local search protocol to determine elements containing initial location of points -# where velocity will need to be interpolated (fastest) -# 1: Use global search to check failures of local search protocol (safest, but painfully slow if many points located -# outside of the domain) -# Valid only if Data_MeshType = 1 or 2 -LocalSearchChecking = 0 - -# FTLE_Compute: Binary flag -# 0: Do not compute FTLE fields -# 1: Compute FTLE fields (Trace_Compute must be 0) -FTLE_Compute = 1 - -# FTLE_GenerateMesh: Binary flag -# 0: Read in FTLE mesh data from file FTLE_ICFile (this file created by running flowVC with FTLE_GenerateMesh = 1) -# 1: Generate a Cartesian mesh over which FTLE will be computed (mesh parameters specified below, resulting data -# saved to file FTLE_ICFile) -# Valid only if FTLE_Compute = 1 -FTLE_GenerateMesh = 1 - -# FTLE_ICFile: String, Name of file storing FTLE mesh information -# If FTLE_GenerateMesh = 0, this file should be located in Path_Work directory -# If FTLE_GenerateMesh = 1, this file will be written to Path_Work directory -# Valid only if FTLE_Compute = 1 -FTLE_ICFile = FTLE_mesh.bin - -# FTLE_MeshBounds.XMin, ..., FTLE_MeshBounds.ZRes: Specifies structured grid over which FTLE is computed -# Valid only if FTLE_Compute = 1 -#delta_x = (Xmax - Xmin) / (Xres-1) we need delta_x=delta_y=delta_z -FTLE_MeshBounds.XMin = -0.07324 -FTLE_MeshBounds.XMax = 0.061596 -FTLE_MeshBounds.YMin = 0.11067 -FTLE_MeshBounds.YMax = 0.238690 -FTLE_MeshBounds.ZMin = -0.02736 -FTLE_MeshBounds.ZMax = 0.439045 -FTLE_MeshBounds.XRes = 202 -FTLE_MeshBounds.YRes = 188 -FTLE_MeshBounds.ZRes = 690 - -# FTLE_IntTLength: (Positive) Float, Integration time used to compute FTLE -# Valid only if FTLE_Compute = 1 -FTLE_IntTLength = 1.0 #cardiac cycle duration - -# FTLE_ComputeVariation: Binary flag -# 0: Compute FTLE at each output time with integration time set to FTLE_IntTimeLength -# 1: Compute variation of FTLE with integration time -# Output_TRes should be 1 if FTLE_ComputeVariation = 1 -# Valid only if FTLE_Compute = 1 -FTLE_ComputeVariation = 0 - -# FTLE_VariationOutFreq: (Positive) Integer, controls how often FTLE is output when computing variation of FTLE with -# integration time -# If set to one, output is generated at every time instance that velocity data is defined, if set to say 5, then output -# is generated at 1/5 of that rate (i.e. every 5 velocity data frames) -# Valid only if FTLE_ComputeVariation = 1 -FTLE_VariationOutFreq = 1 - -# FTLE_OutFilePrefix: String, Filename prefix where FTLE output data is written -# A separate file is generated for each output time -# Valid only if FTLE_Compute = 1 -FTLE_OutFilePrefix = FTLEfwd_ - -# Trace_Compute: Binary flag -# 0: Do not compute tracer trajectories -# 1: Compute tracer trajectories (FTLE_Compute must be 0) -Trace_Compute = 0 - -# Trace_ReleaseStrategy: Integer flag -# 0: Traditional release based on launch time parameters below -# 1: Staggered release based on flow rate -# Valid only if Trace_Compute = 1 and (currently) for Data_MeshType = 1 and Dimensions = 3 -Trace_ReleaseStrategy = 0 - -# Trace_ReleaseTMax: (Positive) Float, how long to generate staggered release -# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 1 -Trace_ReleaseTMax = 0.000755 - -# Trace_GenerateMesh: Binary Flag -# 0: Read in tracer initial positions from a file (specified by Trace_InFile) -# 1: Generate a Cartesian mesh of tracers to integrate (mesh parameters specified below) -# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 -Trace_GenerateMesh = 0 - -# Trace_InFile: String, Name of File containing tracer initial positions -# Valid only if Trace_Compute = 1 and Trace_GenerateMesh = 0 -# inlet1 : initially 1,225 particles with spacing 0.04 at main inlet (it might get updated!) -# inlet2 : initially 4,889 particles with spacing 0.02 at main inlet (it might get updated!) -# inlet3 : initially 19,597 particles with spacing 0.01 at main inlet (it might get updated!) -# inlet4 : initially 40,009 particles with spacing 0.007 at main inlet (it might get updated!) -# inlet_1mil : initially 1,014,218 particles with spacing 0.00139 at main inlet (it might get updated!) -# inlet5 : initially 542,807 particles with spacing 0.0019 at main inlet (it might get updated!) -# inlet6 : initially 253,553 particles with spacing 0.0019 at main inlet (it might get updated!) -# inlet7 : initially 100,314 particles with spacing 0.00443 at main inlet (it might get updated!) -# RML_1 : initially 69,315 particles with spacing 0.0025 at RML inlet (it might get updated!) -# trachea_1 : initially 128,924 particles with spacing 0.004 at trachea inlet (it might get updated!) -Trace_InFile = trachea_1.vtk - -# Trace_MultipleInFiles: Binary Flag -# 0: Default -# 1: Tracer initial conditions change over time and are specified by multiple files -Trace_MultipleInFiles = 0 - -# Trace_InFileFormat: Integer, specifies format of Trace_InFile -# 0: Use this if you want to reuse the .IC file that is generated from flowVC (use with care) -# 1: ASCII file, first line lists the number of tracers and subsequent lines list the coordinates -# 2: ASCII legacy VTK polydata mesh format (as output from Paraview) -# 3: ASCII legacy VTK unstructured mesh format (as output from Paraview) -# 4: Binary file, first entry lists number of points and subsequent entries list coordinates of points -# If set to 1, residence time data will be output as unstructured mesh -# Valid only if Trace_Compute = 1, Trace_ReleaseStrategy = 0 and Trace_GenerateMesh = 0 -Trace_InFileFormat = 4 - -# Trace_OutFile: String, Prefix of files where tracer position data will be written -# Tracer positions written to separate files for each output time -# Valid only if Trace_Compute = 1 -Trace_OutFilePrefix = trachea_1_5e-5 - -# Trace_NumLaunchTimes: (Positive) Integer, Number of times to release tracers from initial positions -# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 -Trace_NumLaunchTimes = 1 - -# Trace_LaunchTimeSpacing: (Positive) Float, Time between successive release of tracers from starting locations -# Valid only if Trace_Compute = 1, Trace_ReleaseStrategy = 0 and Trace_NumLaunchTimes > 1 -Trace_LaunchTimeSpacing = 0.02 - -# Trace_IntTLength: (Positive) Float, Limits amount of time any tracer will be integrated -# Useful when computing the residence time field at more than one point in time, that is -# to ensure all releases are integrated the same length of time -# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 -Trace_IntTLength = 1000 # 3 cardiacs - -# Trace_AlwaysOutput: Binary Flag -# 0: Do not write out tracer position to file once it has left the domain -# 1: Always write out tracer position to file, even if it left the domain -# Valid only if Trace_Compute = 1 -Trace_AlwaysOutput = 1 - -# Trace_MeshBounds.XMin, ..., Trace_MeshBounds.ZRes: Specifies Cartesian mesh of tracers to be intergrated -# Valid only if Trace_Compute = 1 AND Trace_GenerateMesh = 1 #spacing = .075 , 34682 integrated for.1 -Trace_CartMesh.XMin = -1.9 -Trace_CartMesh.XMax = .43 -Trace_CartMesh.YMin = -11.3 -Trace_CartMesh.YMax = -9.7 -Trace_CartMesh.ZMin = 26.1 -Trace_CartMesh.ZMax = 26.3 -Trace_CartMesh.XRes = 200 -Trace_CartMesh.YRes = 200 -Trace_CartMesh.ZRes = 4 - -###### -Trace_VorticityCompute = 0 - -# Trace_APCompute: Binary flag -# Requires Data_InFilePrefix_strain-rate.#.bin files. -# 0: Do not compute -# 1: Compute activation potential (integrated strain rate) for each particle. -# Valid only if Tracer_Compute = 1 -Trace_APCompute = 0 - -# Trace_ComputeCET: Binary flag -# 1: Compute exposure time data for elements in velocity mesh using the tracer paths -# 0: Do not compute exposure time data -# Valid only if Tracer_Compute = 1 and NOT VALID for Trace_ComputeRT = 1 -Trace_CETCompute = 0 - -# Trace_CETAuxillaryMesh: Binary flag -# 1: Use an auxillary mesh for CET computations, specificed by Trace_CETAuxillaryMeshPrefix -# 0; Use velocity field mesh for CET computations -# Valid only for Trace_Compute = 1 and Trace_ComputeCET = 1 -Trace_CETAuxillaryMesh = 1 - -# Trace_CETAuxillaryMeshPrefix: String -# Prefix for files containing coordinates, connectivity and adjacency data for auxillary mesh -Trace_CETMeshPrefix = meshfile #AMIR - -# Trace_CETSubsteps: Integer, numer of intervals used to discretize exposure time contributions when particle path -# intersects multiple elements during a single integration time step -# Valid only for Tracer_Compute = 1 and Trace_ComputeCET = 1 -Trace_CETSubsteps = 50 - -# Trace_ComputeRT: Binary flag -# 0: Do not compute residence time -# 1: Compute residence time of tracers -# Will compute output for Trace_NumLaunchTimes -# Valid only if Tracer_Compute = 1 and NOT VALID for Trace_ComputeCET = 1 -Trace_RTCompute = 0 #AMIR - -# Trace_RTOutFilePrefix: String, Filename prefix for residence time or exposure time computations -# Valid only if Trace_Compute = 1 and Trace_ComputeCET = 1 or Trace_ComputeRT = 1 -Trace_RTOutFilePrefix = AAA18rt - -# VelOut_Compute: Binary flag, Used to generate interpolated velocity fields -# 0: Do not generate interpolated velocity fields -# 1: Generate interploated velocity fields -VelOut_Compute = 0 - -# VelOut_GenerateMesh: Binary flag -# 0: Read interpolation locations from file specified by VelOut_InFile -# 1: Generate a Cartesian mesh of positions where velocity will be interpolated (mesh parameters specified below) -# Valid only for VelOut_Compute = 1 -VelOut_GenerateMesh = 1 - -# VelOut_InFile: String, filename containing locations of points for interpolation -# Valid only for VelOut_Compute = 1 and VelOut_GenerateMesh = 0 -VelOut_InFile = transient-interpolated.vtk - -# VelOut_InFileFormat, Integer, specified format of VelOut_InFile -# 1: ASCII file, first line lists the number of locations and subsequent lines list the coordinates -# 3: ASCII legacy VTK polydata mesh format (as output from Paraview) -# 4: ASCII legacy VTK unstructured mesh format (as output from Paraview) -# Valid only if VelOut_Compute = 1 AND VelOut_GenerateMesh = 0 -VelOut_InFileFormat = 1 - -# VelOut_FilePrefix: String, Filename prefix for files that interpolated velocity is data is written to -# Velocity output written to separate files, one per output time -# Valid only if VelOut_Compute = 1 -VelOut_FilePrefix = transient-interpolated - -# VelOut_MeshBounds.XMin, ..., VelOut_MeshBounds.ZRes: Specifies Cartesian mesh of interpolation positions -# Valid only if VelOut_Compute = 1 -VelOut_CartMesh.XMin = -3.0 -VelOut_CartMesh.XMax = 6.0 -VelOut_CartMesh.YMin = -1.577 -VelOut_CartMesh.YMax = 1.577 -VelOut_CartMesh.ZMin = 0.0 -VelOut_CartMesh.ZMax = 0.0 -VelOut_CartMesh.XRes = 91 -VelOut_CartMesh.YRes = 32 -VelOut_CartMesh.ZRes = 1 - - -#Hello Again \ No newline at end of file diff --git a/src/settings/LCS_settings_med_resolution_back.in b/src/settings/LCS_settings_med_resolution_back.in deleted file mode 100644 index 1e364e7..0000000 --- a/src/settings/LCS_settings_med_resolution_back.in +++ /dev/null @@ -1,405 +0,0 @@ -################################# flowVC INPUT FILE ##################################### -# -# NOTE: Order of parameters listed must be maintained for proper parsing of input file -# Comment lines begin with #, comments can be added or removed as desired -# Standard format: VARIABLE_NAME = VALUE -# -################################################################################### -# pts all over the domain, released once, outputTres increased -# Path_Data: String, Directory containing data files -# Can be set to pwd (i.e. present working directory) -Path_Data = /media/share/ECMO/Data/CFD-Solutions/Bin-File-Series/input -#Path_Data = ../../../../Data/CFD-Solutions/Bin-File-Series/ -# Path_Output: String, Directory where output files will be written -# Can be set to pwd (i.e. present working directory) -#Path_Output = ../../../../Data/CFD-Solutions/Bin-File-Series/ -Path_Output = /media/share/ECMO/Data/CFD-Solutions/Bin-File-Series/med_mesh_size -# Dimensions: Integer, Specifies if velocity data is 2D or 3D -Dimensions = 3 - -# Data_MeshType: Integer, Specifies mesh type of velocity data -# 0: Cartesian -# 1: Unstructured static mesh (tetrahedral for 3D and triangular for 2D) -# 2: Unstructured moving mesh -Data_MeshType = 1 - -# Data_InFilePrefix: String, common prefix for input files -# (e.g. velocity, adjacency, connectivity, coordinate files) -Data_InFilePrefix = interpolated_velocity - -# Data_SuffixTMin: Integer, number appended to the name of first velocity data file -# Assumes naming convention of Data_InFilePrefix_vel.N.bin, where Data_InFilePrefix is -# specified above and N varies from Data_SuffixTMin -Data_SuffixTMin = 1200 - -# Data_SuffixTDelta: Integer, Increment between successive velocity data files -Data_SuffixTDelta = 5 - -# Data_SuffixTRes: Integer, number of velocity data files -Data_TRes = 20 - -# Data_TDelta: (Positive) Float, "Real" time spacing between successive velocity data files -# Assumes time spacing between velocity data files is constant -Data_TDelta = 0.05 - -# Data_TMin: Float, Absolute time assigned to first velocity data file -# Choice is arbitrary, but it usually makes sense to set this to zero, which in that case -# would mean that the first velocity data file specifies the velocity at time zero -Data_TMin = 0.00 - -# Data_TPeriodic: Binary flag, Specifies if data is periodic -# 0: Not periodic -# 1: Periodic (make sure first and last data file correspond to same point in cycle) -Data_TPeriodic = 0 - -#adding this to see if it resolves the issue of not reading the -Data_XPeriodic = 0 -# Data_MeshBounds.XMin, ..., Data_MeshBounds.ZMax: Specifies bounding box of velocity data to consider -# Can be used to set a region for computing residence times -Data_MeshBounds.XMin = -0.07324 -Data_MeshBounds.XMax = 0.061596 -Data_MeshBounds.YMin = 0.11067 -Data_MeshBounds.YMax = 0.238690 -Data_MeshBounds.ZMin = -0.02736 -Data_MeshBounds.ZMax = 0.439045 - -# Fluid_Density: Float, specifies fluid density (use consistent units) -# Valid only if Particle_Radius > 0 -Fluid_Density = 1.2e-3 - -# Fluid_Viscosity: Float, specifies fluid viscosity (use consistent units) -# Valid only if Particle_Radius > 0 -Fluid_Viscosity = 1.81e-4 - -# Output_TStart: Float, initial time to start simulation and begin writing output -# If FTLE_Compute: Specifies time at which first FTLE field is generated -# If Trace_Compute: Specifies start time to begin integrating tracer trajectories and outputing position to file -Output_TStart = 0.95 - -# Output_TRes: (Positive) Integer, Desired number of output times -# If FTLE_Compute: Specifies number of time instances when the FTLE field will be computed and output -# If Trace_Compute: Specifies number of time instances that tracer positions will be written to file -Output_TRes = 19 - -# Output_TDelta: (Positive) Float, Desired time between successive output -# If FTLE_Compute: How often the FTLE field will be computed and output -# If Trace_Compute: How often the tracer positions will be output -Output_TDelta = 0.05 - -# Int_Type: Integer, specified integration routine used -# If Particle_Radius > 0 ==> Euler integration method is taken automatically -# Runge Kutta methods are integration option for ideal tracers without mass -# 0: Euler -# 1: 4th order Runge Kutta -# 2: Runge Kutta Fehlberg (adaptive time stepping) -Int_Type = 1 - -# Int_BMR: flag (Backward Maxey-Riley [BMR] resembles solving Maxey-Riley equation backward in time) -# 0: Integrate the trajectories via traditional method by solving Maxey-Riley equation -# 1: Integrate the trajectories by solving motion equation on slow manifolds -#Int_BMR = 0 - -# Int_TimeStep: (Positive) Float, Time step used for integration Euler or RK4 routines (i.e. Int_Type = 0 or 1) -# Valid only for Int_Type = 0 or 1 -# Int_TimeStep = 5e-4 # not useful when doing particle deposition -#Int_TimeStep = 1e-5 # good in case of steady simulation - Int_TimeStep = 5e-6 # good while doing unsteady simulations -# Int_TimeStep = 5e-7 # high resolution - -# Int_Accuracy: (Positive) Float, Absolute error tolorance (between RK4 and RK5) -# Valid only for Int_Type = 2 -Int_Accuracy = 0.0001 - -# Int_MinTimeStep: (Positive) Float, Minimum allowable time step used in RKF routine -# Once this time step is reached, RK4 approximation automatically accepted -# Valid only for Int_Type = 2 -Int_MinTimeStep = 0.0001 - -# Int_MaxTimeStep: (Positive) Float, Maximum allowable time step used in RKF routine -# Used as initialize guess for suitable time step when RKF routine is called -# Time step will not be increased beyond this limit even if error between RK4 and RK5 is less than Int_Accuracy -# Valid only for Int_Type = 2 -Int_MaxTimeStep = 0.001 - -# Int_TimeDirection: Integer, Should be set to 1 or -1 -# 1: Advect particles forward in time -# -1: Advect particles backward in time (used to compute backward time FTLE field) -Int_TimeDirection = -1 - -# Int_NormalFlow: flag -# 0: Do not impose inward flow on no-slip boundaries -# 1: Replace no-slip condition on boundaries with inward velocity (magnitude specified by NormalFlowScaling) -# 2: Capture particles once their distance to wall is less than a threshold (Distance_Threshold) [painfully slow] -# Currently valid only for Data_MeshType = 1 and Dimensions = 3 -Int_NormalFlow = 0 - -# Int_NormalFlowScaling: (Positive) Float, Scaling for inward pointing boundary velocity (to prevent tracers from crossing -# no-slip boundaries) -# Valid only for Dimensions = 3, Data_MeshType = 1 or 2, Int_NormalFlow = 1 -Int_NormalFlowScaling = 0.05 - -#Int_Extrapolate: Integer, allows particles to be integrated outside of domain of data by extrapolation of data set -# 0: End integration once particle leaves domain -# 1: Extrapolate velocity outside domain by continuing particle with exit velocity -# 2: Linear extrapolation of entire data set -Int_Extrapolate = 0 - -# Distance_Threshold: (Positive) Float, Specify a threshold for capturing particles by the distance to wall -# A conservative assumption is .4D -# Over .5D(=R) does not make any physical sense! -# Valid only if Int_NormalFlow = 2 -#Distance_Threshold = 12e-5 - -# Particle_Radius: Float, Radius of all things treated as Lagrangian points -# Set to zero if you want points to behave as perfect tracers -Particle_Radius = 0.0 - -# Particle_Density: Float, Mass density of all things treated as Lagrangian points -# Respectively, set =, >, or < fluid density for neutrally buoyant, aerosols, or bubbles -# Only valid if Particle_Radius > 0 -Particle_Density = 1.0 - -# Particle_ICType: Int, Specified type of initial condition assigned to particles -# 0: Start particles from rest -# 1: Start particles with velocity equal to fluid velocity at particle release location -# Valid only if Particle_Radius > 0 -Particle_ICType = 0 - -# Gravity_Vector[i]: Floats, Specifies components of gravity vector (use consistent units) -# Valid only if Particle_Radius > 0 -# VERY VERY IMPORTANT WHILE DOING PARTICLE TRACKING! BE CAREFUL OF THE DIRECTIONS (+?-) -Gravity_Vector[0] = 0 -Gravity_Vector[1] = 0 -Gravity_Vector[2] = -981 - -# Local_Search_Checking: Binary flag -# 0: Only use local search protocol to determine elements containing initial location of points -# where velocity will need to be interpolated (fastest) -# 1: Use global search to check failures of local search protocol (safest, but painfully slow if many points located -# outside of the domain) -# Valid only if Data_MeshType = 1 or 2 -LocalSearchChecking = 0 - -# FTLE_Compute: Binary flag -# 0: Do not compute FTLE fields -# 1: Compute FTLE fields (Trace_Compute must be 0) -FTLE_Compute = 1 - -# FTLE_GenerateMesh: Binary flag -# 0: Read in FTLE mesh data from file FTLE_ICFile (this file created by running flowVC with FTLE_GenerateMesh = 1) -# 1: Generate a Cartesian mesh over which FTLE will be computed (mesh parameters specified below, resulting data -# saved to file FTLE_ICFile) -# Valid only if FTLE_Compute = 1 -FTLE_GenerateMesh = 1 - -# FTLE_ICFile: String, Name of file storing FTLE mesh information -# If FTLE_GenerateMesh = 0, this file should be located in Path_Work directory -# If FTLE_GenerateMesh = 1, this file will be written to Path_Work directory -# Valid only if FTLE_Compute = 1 -FTLE_ICFile = FTLE_mesh.bin - -# FTLE_MeshBounds.XMin, ..., FTLE_MeshBounds.ZRes: Specifies structured grid over which FTLE is computed -# Valid only if FTLE_Compute = 1 -#delta_x = (Xmax - Xmin) / (Xres-1) we need delta_x=delta_y=delta_z -FTLE_MeshBounds.XMin = -0.07324 -FTLE_MeshBounds.XMax = 0.061596 -FTLE_MeshBounds.YMin = 0.11067 -FTLE_MeshBounds.YMax = 0.238690 -FTLE_MeshBounds.ZMin = -0.02736 -FTLE_MeshBounds.ZMax = 0.439045 -FTLE_MeshBounds.XRes = 202 -FTLE_MeshBounds.YRes = 188 -FTLE_MeshBounds.ZRes = 690 - -# FTLE_IntTLength: (Positive) Float, Integration time used to compute FTLE -# Valid only if FTLE_Compute = 1 -FTLE_IntTLength = 0.95 #cardiac cycle duration - -# FTLE_ComputeVariation: Binary flag -# 0: Compute FTLE at each output time with integration time set to FTLE_IntTimeLength -# 1: Compute variation of FTLE with integration time -# Output_TRes should be 1 if FTLE_ComputeVariation = 1 -# Valid only if FTLE_Compute = 1 -FTLE_ComputeVariation = 0 - -# FTLE_VariationOutFreq: (Positive) Integer, controls how often FTLE is output when computing variation of FTLE with -# integration time -# If set to one, output is generated at every time instance that velocity data is defined, if set to say 5, then output -# is generated at 1/5 of that rate (i.e. every 5 velocity data frames) -# Valid only if FTLE_ComputeVariation = 1 -FTLE_VariationOutFreq = 1 - -# FTLE_OutFilePrefix: String, Filename prefix where FTLE output data is written -# A separate file is generated for each output time -# Valid only if FTLE_Compute = 1 -FTLE_OutFilePrefix = FTLEbwd__ - -# Trace_Compute: Binary flag -# 0: Do not compute tracer trajectories -# 1: Compute tracer trajectories (FTLE_Compute must be 0) -Trace_Compute = 0 - -# Trace_ReleaseStrategy: Integer flag -# 0: Traditional release based on launch time parameters below -# 1: Staggered release based on flow rate -# Valid only if Trace_Compute = 1 and (currently) for Data_MeshType = 1 and Dimensions = 3 -Trace_ReleaseStrategy = 0 - -# Trace_ReleaseTMax: (Positive) Float, how long to generate staggered release -# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 1 -Trace_ReleaseTMax = 0.000755 - -# Trace_GenerateMesh: Binary Flag -# 0: Read in tracer initial positions from a file (specified by Trace_InFile) -# 1: Generate a Cartesian mesh of tracers to integrate (mesh parameters specified below) -# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 -Trace_GenerateMesh = 0 - -# Trace_InFile: String, Name of File containing tracer initial positions -# Valid only if Trace_Compute = 1 and Trace_GenerateMesh = 0 -# inlet1 : initially 1,225 particles with spacing 0.04 at main inlet (it might get updated!) -# inlet2 : initially 4,889 particles with spacing 0.02 at main inlet (it might get updated!) -# inlet3 : initially 19,597 particles with spacing 0.01 at main inlet (it might get updated!) -# inlet4 : initially 40,009 particles with spacing 0.007 at main inlet (it might get updated!) -# inlet_1mil : initially 1,014,218 particles with spacing 0.00139 at main inlet (it might get updated!) -# inlet5 : initially 542,807 particles with spacing 0.0019 at main inlet (it might get updated!) -# inlet6 : initially 253,553 particles with spacing 0.0019 at main inlet (it might get updated!) -# inlet7 : initially 100,314 particles with spacing 0.00443 at main inlet (it might get updated!) -# RML_1 : initially 69,315 particles with spacing 0.0025 at RML inlet (it might get updated!) -# trachea_1 : initially 128,924 particles with spacing 0.004 at trachea inlet (it might get updated!) -Trace_InFile = trachea_1.vtk - -# Trace_MultipleInFiles: Binary Flag -# 0: Default -# 1: Tracer initial conditions change over time and are specified by multiple files -Trace_MultipleInFiles = 0 - -# Trace_InFileFormat: Integer, specifies format of Trace_InFile -# 0: Use this if you want to reuse the .IC file that is generated from flowVC (use with care) -# 1: ASCII file, first line lists the number of tracers and subsequent lines list the coordinates -# 2: ASCII legacy VTK polydata mesh format (as output from Paraview) -# 3: ASCII legacy VTK unstructured mesh format (as output from Paraview) -# 4: Binary file, first entry lists number of points and subsequent entries list coordinates of points -# If set to 1, residence time data will be output as unstructured mesh -# Valid only if Trace_Compute = 1, Trace_ReleaseStrategy = 0 and Trace_GenerateMesh = 0 -Trace_InFileFormat = 4 - -# Trace_OutFile: String, Prefix of files where tracer position data will be written -# Tracer positions written to separate files for each output time -# Valid only if Trace_Compute = 1 -Trace_OutFilePrefix = trachea_1_5e-5 - -# Trace_NumLaunchTimes: (Positive) Integer, Number of times to release tracers from initial positions -# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 -Trace_NumLaunchTimes = 1 - -# Trace_LaunchTimeSpacing: (Positive) Float, Time between successive release of tracers from starting locations -# Valid only if Trace_Compute = 1, Trace_ReleaseStrategy = 0 and Trace_NumLaunchTimes > 1 -Trace_LaunchTimeSpacing = 0.02 - -# Trace_IntTLength: (Positive) Float, Limits amount of time any tracer will be integrated -# Useful when computing the residence time field at more than one point in time, that is -# to ensure all releases are integrated the same length of time -# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 -Trace_IntTLength = 1000 # 3 cardiacs - -# Trace_AlwaysOutput: Binary Flag -# 0: Do not write out tracer position to file once it has left the domain -# 1: Always write out tracer position to file, even if it left the domain -# Valid only if Trace_Compute = 1 -Trace_AlwaysOutput = 1 - -# Trace_MeshBounds.XMin, ..., Trace_MeshBounds.ZRes: Specifies Cartesian mesh of tracers to be intergrated -# Valid only if Trace_Compute = 1 AND Trace_GenerateMesh = 1 #spacing = .075 , 34682 integrated for.1 -Trace_CartMesh.XMin = -1.9 -Trace_CartMesh.XMax = .43 -Trace_CartMesh.YMin = -11.3 -Trace_CartMesh.YMax = -9.7 -Trace_CartMesh.ZMin = 26.1 -Trace_CartMesh.ZMax = 26.3 -Trace_CartMesh.XRes = 200 -Trace_CartMesh.YRes = 200 -Trace_CartMesh.ZRes = 4 - -###### -Trace_VorticityCompute = 0 - -# Trace_APCompute: Binary flag -# Requires Data_InFilePrefix_strain-rate.#.bin files. -# 0: Do not compute -# 1: Compute activation potential (integrated strain rate) for each particle. -# Valid only if Tracer_Compute = 1 -Trace_APCompute = 0 - -# Trace_ComputeCET: Binary flag -# 1: Compute exposure time data for elements in velocity mesh using the tracer paths -# 0: Do not compute exposure time data -# Valid only if Tracer_Compute = 1 and NOT VALID for Trace_ComputeRT = 1 -Trace_CETCompute = 0 - -# Trace_CETAuxillaryMesh: Binary flag -# 1: Use an auxillary mesh for CET computations, specificed by Trace_CETAuxillaryMeshPrefix -# 0; Use velocity field mesh for CET computations -# Valid only for Trace_Compute = 1 and Trace_ComputeCET = 1 -Trace_CETAuxillaryMesh = 1 - -# Trace_CETAuxillaryMeshPrefix: String -# Prefix for files containing coordinates, connectivity and adjacency data for auxillary mesh -Trace_CETMeshPrefix = meshfile #AMIR - -# Trace_CETSubsteps: Integer, numer of intervals used to discretize exposure time contributions when particle path -# intersects multiple elements during a single integration time step -# Valid only for Tracer_Compute = 1 and Trace_ComputeCET = 1 -Trace_CETSubsteps = 50 - -# Trace_ComputeRT: Binary flag -# 0: Do not compute residence time -# 1: Compute residence time of tracers -# Will compute output for Trace_NumLaunchTimes -# Valid only if Tracer_Compute = 1 and NOT VALID for Trace_ComputeCET = 1 -Trace_RTCompute = 0 #AMIR - -# Trace_RTOutFilePrefix: String, Filename prefix for residence time or exposure time computations -# Valid only if Trace_Compute = 1 and Trace_ComputeCET = 1 or Trace_ComputeRT = 1 -Trace_RTOutFilePrefix = AAA18rt - -# VelOut_Compute: Binary flag, Used to generate interpolated velocity fields -# 0: Do not generate interpolated velocity fields -# 1: Generate interploated velocity fields -VelOut_Compute = 0 - -# VelOut_GenerateMesh: Binary flag -# 0: Read interpolation locations from file specified by VelOut_InFile -# 1: Generate a Cartesian mesh of positions where velocity will be interpolated (mesh parameters specified below) -# Valid only for VelOut_Compute = 1 -VelOut_GenerateMesh = 1 - -# VelOut_InFile: String, filename containing locations of points for interpolation -# Valid only for VelOut_Compute = 1 and VelOut_GenerateMesh = 0 -VelOut_InFile = transient-interpolated.vtk - -# VelOut_InFileFormat, Integer, specified format of VelOut_InFile -# 1: ASCII file, first line lists the number of locations and subsequent lines list the coordinates -# 3: ASCII legacy VTK polydata mesh format (as output from Paraview) -# 4: ASCII legacy VTK unstructured mesh format (as output from Paraview) -# Valid only if VelOut_Compute = 1 AND VelOut_GenerateMesh = 0 -VelOut_InFileFormat = 1 - -# VelOut_FilePrefix: String, Filename prefix for files that interpolated velocity is data is written to -# Velocity output written to separate files, one per output time -# Valid only if VelOut_Compute = 1 -VelOut_FilePrefix = transient-interpolated - -# VelOut_MeshBounds.XMin, ..., VelOut_MeshBounds.ZRes: Specifies Cartesian mesh of interpolation positions -# Valid only if VelOut_Compute = 1 -VelOut_CartMesh.XMin = -3.0 -VelOut_CartMesh.XMax = 6.0 -VelOut_CartMesh.YMin = -1.577 -VelOut_CartMesh.YMax = 1.577 -VelOut_CartMesh.ZMin = 0.0 -VelOut_CartMesh.ZMax = 0.0 -VelOut_CartMesh.XRes = 91 -VelOut_CartMesh.YRes = 32 -VelOut_CartMesh.ZRes = 1 - -# Test 4 \ No newline at end of file diff --git a/src/structs.h b/src/structs.h index cc53433..6cef967 100644 --- a/src/structs.h +++ b/src/structs.h @@ -75,4 +75,9 @@ typedef struct _CETE { int Encounters; } CETE; -#endif \ No newline at end of file +typedef struct _Search { + int searched; + int found; +} Search; + +#endif diff --git a/test/Testscratch.c b/test/Testscratch.c new file mode 100644 index 0000000..414056a --- /dev/null +++ b/test/Testscratch.c @@ -0,0 +1,29 @@ +#include "unity.h" +#include "scratch.h" + +void setUp(void) { + // set stuff up here +} + +void tearDown(void) { + // clean stuff up here +} + +void test_add_numbers_correct(void) +{ + TEST_ASSERT_EQUAL(5, bray_add(2,3) ); +} + +void test_add_numbers_incorrect(void) +{ + TEST_ASSERT_EQUAL(8, bray_add(4,3) ); +} + + +int main(void) +{ +UNITY_BEGIN(); + RUN_TEST(test_add_numbers_correct); + RUN_TEST(test_add_numbers_incorrect); +return UNITY_END(); +} diff --git a/unity/src/meson.build b/unity/src/meson.build new file mode 100644 index 0000000..5365227 --- /dev/null +++ b/unity/src/meson.build @@ -0,0 +1,17 @@ +# +# build script written by : Michael Gene Brockus. +# github repo author: Mike Karlesky, Mark VanderVoord, Greg Williams. +# +# license: MIT +# + +unity_inc += include_directories('.') +unity_src += files('unity.c') + +if not meson.is_subproject() + install_headers( + 'unity.h', + 'unity_internals.h', + subdir: meson.project_name() + ) +endif diff --git a/unity/src/unity.c b/unity/src/unity.c new file mode 100644 index 0000000..7fd703a --- /dev/null +++ b/unity/src/unity.c @@ -0,0 +1,2488 @@ +/* ========================================================================= + Unity - A Test Framework for C + ThrowTheSwitch.org + Copyright (c) 2007-24 Mike Karlesky, Mark VanderVoord, & Greg Williams + SPDX-License-Identifier: MIT +========================================================================= */ + +#include "unity.h" + +#ifndef UNITY_PROGMEM +#define UNITY_PROGMEM +#endif + +/* If omitted from header, declare overrideable prototypes here so they're ready for use */ +#ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION +void UNITY_OUTPUT_CHAR(int); +#endif + +/* Helpful macros for us to use here in Assert functions */ +#define UNITY_FAIL_AND_BAIL do { Unity.CurrentTestFailed = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } while (0) +#define UNITY_IGNORE_AND_BAIL do { Unity.CurrentTestIgnored = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } while (0) +#define RETURN_IF_FAIL_OR_IGNORE do { if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) { TEST_ABORT(); } } while (0) + +struct UNITY_STORAGE_T Unity; + +#ifdef UNITY_OUTPUT_COLOR +const char UNITY_PROGMEM UnityStrOk[] = "\033[42mOK\033[0m"; +const char UNITY_PROGMEM UnityStrPass[] = "\033[42mPASS\033[0m"; +const char UNITY_PROGMEM UnityStrFail[] = "\033[41mFAIL\033[0m"; +const char UNITY_PROGMEM UnityStrIgnore[] = "\033[43mIGNORE\033[0m"; +#else +const char UNITY_PROGMEM UnityStrOk[] = "OK"; +const char UNITY_PROGMEM UnityStrPass[] = "PASS"; +const char UNITY_PROGMEM UnityStrFail[] = "FAIL"; +const char UNITY_PROGMEM UnityStrIgnore[] = "IGNORE"; +#endif +static const char UNITY_PROGMEM UnityStrNull[] = "NULL"; +static const char UNITY_PROGMEM UnityStrSpacer[] = ". "; +static const char UNITY_PROGMEM UnityStrExpected[] = " Expected "; +static const char UNITY_PROGMEM UnityStrWas[] = " Was "; +static const char UNITY_PROGMEM UnityStrGt[] = " to be greater than "; +static const char UNITY_PROGMEM UnityStrLt[] = " to be less than "; +static const char UNITY_PROGMEM UnityStrOrEqual[] = "or equal to "; +static const char UNITY_PROGMEM UnityStrNotEqual[] = " to be not equal to "; +static const char UNITY_PROGMEM UnityStrElement[] = " Element "; +static const char UNITY_PROGMEM UnityStrByte[] = " Byte "; +static const char UNITY_PROGMEM UnityStrMemory[] = " Memory Mismatch."; +static const char UNITY_PROGMEM UnityStrDelta[] = " Values Not Within Delta "; +static const char UNITY_PROGMEM UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; +static const char UNITY_PROGMEM UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; +static const char UNITY_PROGMEM UnityStrNullPointerForActual[] = " Actual pointer was NULL"; +#ifndef UNITY_EXCLUDE_FLOAT +static const char UNITY_PROGMEM UnityStrNot[] = "Not "; +static const char UNITY_PROGMEM UnityStrInf[] = "Infinity"; +static const char UNITY_PROGMEM UnityStrNegInf[] = "Negative Infinity"; +static const char UNITY_PROGMEM UnityStrNaN[] = "NaN"; +static const char UNITY_PROGMEM UnityStrDet[] = "Determinate"; +static const char UNITY_PROGMEM UnityStrInvalidFloatTrait[] = "Invalid Float Trait"; +#endif +const char UNITY_PROGMEM UnityStrErrShorthand[] = "Unity Shorthand Support Disabled"; +const char UNITY_PROGMEM UnityStrErrFloat[] = "Unity Floating Point Disabled"; +const char UNITY_PROGMEM UnityStrErrDouble[] = "Unity Double Precision Disabled"; +const char UNITY_PROGMEM UnityStrErr64[] = "Unity 64-bit Support Disabled"; +static const char UNITY_PROGMEM UnityStrBreaker[] = "-----------------------"; +static const char UNITY_PROGMEM UnityStrResultsTests[] = " Tests "; +static const char UNITY_PROGMEM UnityStrResultsFailures[] = " Failures "; +static const char UNITY_PROGMEM UnityStrResultsIgnored[] = " Ignored "; +#ifndef UNITY_EXCLUDE_DETAILS +static const char UNITY_PROGMEM UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; +static const char UNITY_PROGMEM UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; +#endif +/*----------------------------------------------- + * Pretty Printers & Test Result Output Handlers + *-----------------------------------------------*/ + +/*-----------------------------------------------*/ +/* Local helper function to print characters. */ +static void UnityPrintChar(const char* pch) +{ + /* printable characters plus CR & LF are printed */ + if ((*pch <= 126) && (*pch >= 32)) + { + UNITY_OUTPUT_CHAR(*pch); + } + /* write escaped carriage returns */ + else if (*pch == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (*pch == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)*pch, 2); + } +} + +/*-----------------------------------------------*/ +/* Local helper function to print ANSI escape strings e.g. "\033[42m". */ +#ifdef UNITY_OUTPUT_COLOR +static UNITY_UINT UnityPrintAnsiEscapeString(const char* string) +{ + const char* pch = string; + UNITY_UINT count = 0; + + while (*pch && (*pch != 'm')) + { + UNITY_OUTPUT_CHAR(*pch); + pch++; + count++; + } + UNITY_OUTPUT_CHAR('m'); + count++; + + return count; +} +#endif + +/*-----------------------------------------------*/ +void UnityPrint(const char* string) +{ + const char* pch = string; + + if (pch != NULL) + { + while (*pch) + { +#ifdef UNITY_OUTPUT_COLOR + /* print ANSI escape code */ + if ((*pch == 27) && (*(pch + 1) == '[')) + { + pch += UnityPrintAnsiEscapeString(pch); + continue; + } +#endif + UnityPrintChar(pch); + pch++; + } + } +} +/*-----------------------------------------------*/ +void UnityPrintLen(const char* string, const UNITY_UINT32 length) +{ + const char* pch = string; + + if (pch != NULL) + { + while (*pch && ((UNITY_UINT32)(pch - string) < length)) + { + /* printable characters plus CR & LF are printed */ + if ((*pch <= 126) && (*pch >= 32)) + { + UNITY_OUTPUT_CHAR(*pch); + } + /* write escaped carriage returns */ + else if (*pch == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (*pch == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)*pch, 2); + } + pch++; + } + } +} + +/*-----------------------------------------------*/ +void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style) +{ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (style == UNITY_DISPLAY_STYLE_CHAR) + { + /* printable characters plus CR & LF are printed */ + UNITY_OUTPUT_CHAR('\''); + if ((number <= 126) && (number >= 32)) + { + UNITY_OUTPUT_CHAR((int)number); + } + /* write escaped carriage returns */ + else if (number == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (number == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)number, 2); + } + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrintNumber(number); + } + } + else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) + { + UnityPrintNumberUnsigned((UNITY_UINT)number); + } + else + { + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0xF) * 2)); + } +} + +/*-----------------------------------------------*/ +void UnityPrintNumber(const UNITY_INT number_to_print) +{ + UNITY_UINT number = (UNITY_UINT)number_to_print; + + if (number_to_print < 0) + { + /* A negative number, including MIN negative */ + UNITY_OUTPUT_CHAR('-'); + number = (~number) + 1; + } + UnityPrintNumberUnsigned(number); +} + +/*----------------------------------------------- + * basically do an itoa using as little ram as possible */ +void UnityPrintNumberUnsigned(const UNITY_UINT number) +{ + UNITY_UINT divisor = 1; + + /* figure out initial divisor */ + while (number / divisor > 9) + { + divisor *= 10; + } + + /* now mod and print, then divide divisor */ + do + { + UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); + divisor /= 10; + } while (divisor > 0); +} + +/*-----------------------------------------------*/ +void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print) +{ + int nibble; + char nibbles = nibbles_to_print; + + if ((unsigned)nibbles > UNITY_MAX_NIBBLES) + { + nibbles = UNITY_MAX_NIBBLES; + } + + while (nibbles > 0) + { + nibbles--; + nibble = (int)(number >> (nibbles * 4)) & 0x0F; + if (nibble <= 9) + { + UNITY_OUTPUT_CHAR((char)('0' + nibble)); + } + else + { + UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); + } + } +} + +/*-----------------------------------------------*/ +void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number) +{ + UNITY_UINT current_bit = (UNITY_UINT)1 << (UNITY_INT_WIDTH - 1); + UNITY_INT32 i; + + for (i = 0; i < UNITY_INT_WIDTH; i++) + { + if (current_bit & mask) + { + if (current_bit & number) + { + UNITY_OUTPUT_CHAR('1'); + } + else + { + UNITY_OUTPUT_CHAR('0'); + } + } + else + { + UNITY_OUTPUT_CHAR('X'); + } + current_bit = current_bit >> 1; + } +} + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_FLOAT_PRINT +/* + * This function prints a floating-point value in a format similar to + * printf("%.7g") on a single-precision machine or printf("%.9g") on a + * double-precision machine. The 7th digit won't always be totally correct + * in single-precision operation (for that level of accuracy, a more + * complicated algorithm would be needed). + */ +void UnityPrintFloat(const UNITY_DOUBLE input_number) +{ +#ifdef UNITY_INCLUDE_DOUBLE + static const int sig_digits = 9; + static const UNITY_INT32 min_scaled = 100000000; + static const UNITY_INT32 max_scaled = 1000000000; +#else + static const int sig_digits = 7; + static const UNITY_INT32 min_scaled = 1000000; + static const UNITY_INT32 max_scaled = 10000000; +#endif + + UNITY_DOUBLE number = input_number; + + /* print minus sign (does not handle negative zero) */ + if (number < 0.0f) + { + UNITY_OUTPUT_CHAR('-'); + number = -number; + } + + /* handle zero, NaN, and +/- infinity */ + if (number == 0.0f) + { + UnityPrint("0"); + } + else if (UNITY_IS_NAN(number)) + { + UnityPrint("nan"); + } + else if (UNITY_IS_INF(number)) + { + UnityPrint("inf"); + } + else + { + UNITY_INT32 n_int = 0; + UNITY_INT32 n; + int exponent = 0; + int decimals; + int digits; + char buf[16] = {0}; + + /* + * Scale up or down by powers of 10. To minimize rounding error, + * start with a factor/divisor of 10^10, which is the largest + * power of 10 that can be represented exactly. Finally, compute + * (exactly) the remaining power of 10 and perform one more + * multiplication or division. + */ + if (number < 1.0f) + { + UNITY_DOUBLE factor = 1.0f; + + while (number < (UNITY_DOUBLE)max_scaled / 1e10f) { number *= 1e10f; exponent -= 10; } + while (number * factor < (UNITY_DOUBLE)min_scaled) { factor *= 10.0f; exponent--; } + + number *= factor; + } + else if (number > (UNITY_DOUBLE)max_scaled) + { + UNITY_DOUBLE divisor = 1.0f; + + while (number > (UNITY_DOUBLE)min_scaled * 1e10f) { number /= 1e10f; exponent += 10; } + while (number / divisor > (UNITY_DOUBLE)max_scaled) { divisor *= 10.0f; exponent++; } + + number /= divisor; + } + else + { + /* + * In this range, we can split off the integer part before + * doing any multiplications. This reduces rounding error by + * freeing up significant bits in the fractional part. + */ + UNITY_DOUBLE factor = 1.0f; + n_int = (UNITY_INT32)number; + number -= (UNITY_DOUBLE)n_int; + + while (n_int < min_scaled) { n_int *= 10; factor *= 10.0f; exponent--; } + + number *= factor; + } + + /* round to nearest integer */ + n = ((UNITY_INT32)(number + number) + 1) / 2; + +#ifndef UNITY_ROUND_TIES_AWAY_FROM_ZERO + /* round to even if exactly between two integers */ + if ((n & 1) && (((UNITY_DOUBLE)n - number) == 0.5f)) + n--; +#endif + + n += n_int; + + if (n >= max_scaled) + { + n = min_scaled; + exponent++; + } + + /* determine where to place decimal point */ + decimals = ((exponent <= 0) && (exponent >= -(sig_digits + 3))) ? (-exponent) : (sig_digits - 1); + exponent += decimals; + + /* truncate trailing zeroes after decimal point */ + while ((decimals > 0) && ((n % 10) == 0)) + { + n /= 10; + decimals--; + } + + /* build up buffer in reverse order */ + digits = 0; + while ((n != 0) || (digits <= decimals)) + { + buf[digits++] = (char)('0' + n % 10); + n /= 10; + } + + /* print out buffer (backwards) */ + while (digits > 0) + { + if (digits == decimals) + { + UNITY_OUTPUT_CHAR('.'); + } + UNITY_OUTPUT_CHAR(buf[--digits]); + } + + /* print exponent if needed */ + if (exponent != 0) + { + UNITY_OUTPUT_CHAR('e'); + + if (exponent < 0) + { + UNITY_OUTPUT_CHAR('-'); + exponent = -exponent; + } + else + { + UNITY_OUTPUT_CHAR('+'); + } + + digits = 0; + while ((exponent != 0) || (digits < 2)) + { + buf[digits++] = (char)('0' + exponent % 10); + exponent /= 10; + } + while (digits > 0) + { + UNITY_OUTPUT_CHAR(buf[--digits]); + } + } + } +} +#endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */ + +/*-----------------------------------------------*/ +static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) +{ +#ifdef UNITY_OUTPUT_FOR_ECLIPSE + UNITY_OUTPUT_CHAR('('); + UnityPrint(file); + UNITY_OUTPUT_CHAR(':'); + UnityPrintNumber((UNITY_INT)line); + UNITY_OUTPUT_CHAR(')'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(Unity.CurrentTestName); + UNITY_OUTPUT_CHAR(':'); +#else +#ifdef UNITY_OUTPUT_FOR_IAR_WORKBENCH + UnityPrint("'); + UnityPrint(Unity.CurrentTestName); + UnityPrint(" "); +#else +#ifdef UNITY_OUTPUT_FOR_QT_CREATOR + UnityPrint("file://"); + UnityPrint(file); + UNITY_OUTPUT_CHAR(':'); + UnityPrintNumber((UNITY_INT)line); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(Unity.CurrentTestName); + UNITY_OUTPUT_CHAR(':'); +#else + UnityPrint(file); + UNITY_OUTPUT_CHAR(':'); + UnityPrintNumber((UNITY_INT)line); + UNITY_OUTPUT_CHAR(':'); + UnityPrint(Unity.CurrentTestName); + UNITY_OUTPUT_CHAR(':'); +#endif +#endif +#endif +} + +/*-----------------------------------------------*/ +static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) +{ + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint(UnityStrFail); + UNITY_OUTPUT_CHAR(':'); +} + +/*-----------------------------------------------*/ +void UnityConcludeTest(void) +{ + if (Unity.CurrentTestIgnored) + { + Unity.TestIgnores++; + } + else if (!Unity.CurrentTestFailed) + { + UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); + UnityPrint(UnityStrPass); + } + else + { + Unity.TestFailures++; + } + + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; + UNITY_PRINT_EXEC_TIME(); + UNITY_PRINT_EOL(); + UNITY_FLUSH_CALL(); +} + +/*-----------------------------------------------*/ +static void UnityAddMsgIfSpecified(const char* msg) +{ +#ifdef UNITY_PRINT_TEST_CONTEXT + UnityPrint(UnityStrSpacer); + UNITY_PRINT_TEST_CONTEXT(); +#endif +#ifndef UNITY_EXCLUDE_DETAILS + if (Unity.CurrentDetail1) + { + UnityPrint(UnityStrSpacer); + UnityPrint(UnityStrDetail1Name); + UnityPrint(Unity.CurrentDetail1); + if (Unity.CurrentDetail2) + { + UnityPrint(UnityStrDetail2Name); + UnityPrint(Unity.CurrentDetail2); + } + } +#endif + if (msg) + { + UnityPrint(UnityStrSpacer); + UnityPrint(msg); + } +} + +/*-----------------------------------------------*/ +static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual) +{ + UnityPrint(UnityStrExpected); + if (expected != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrint(expected); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } + UnityPrint(UnityStrWas); + if (actual != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrint(actual); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } +} + +/*-----------------------------------------------*/ +static void UnityPrintExpectedAndActualStringsLen(const char* expected, + const char* actual, + const UNITY_UINT32 length) +{ + UnityPrint(UnityStrExpected); + if (expected != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrintLen(expected, length); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } + UnityPrint(UnityStrWas); + if (actual != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrintLen(actual, length); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } +} + +/*----------------------------------------------- + * Assertion & Control Helpers + *-----------------------------------------------*/ + +/*-----------------------------------------------*/ +static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_LINE_TYPE lineNumber, + const char* msg) +{ + /* Both are NULL or same pointer */ + if (expected == actual) { return 0; } + + /* print and return true if just expected is NULL */ + if (expected == NULL) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrNullPointerForExpected); + UnityAddMsgIfSpecified(msg); + return 1; + } + + /* print and return true if just actual is NULL */ + if (actual == NULL) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrNullPointerForActual); + UnityAddMsgIfSpecified(msg); + return 1; + } + + return 0; /* return false if neither is NULL */ +} + +/*----------------------------------------------- + * Assertion Functions + *-----------------------------------------------*/ + +/*-----------------------------------------------*/ +void UnityAssertBits(const UNITY_INT mask, + const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if ((mask & expected) != (mask & actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)expected); + UnityPrint(UnityStrWas); + UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualNumber(const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (expected != actual) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expected, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold, + const UNITY_INT actual, + const UNITY_COMPARISON_T compare, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + int failed = 0; + RETURN_IF_FAIL_OR_IGNORE; + + if ((threshold == actual) && (compare & UNITY_EQUAL_TO)) { return; } + if ((threshold == actual)) { failed = 1; } + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if ((actual > threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } + if ((actual < threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } + } + else /* UINT or HEX */ + { + if (((UNITY_UINT)actual > (UNITY_UINT)threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } + if (((UNITY_UINT)actual < (UNITY_UINT)threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } + } + + if (failed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(actual, style); + if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } + if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } + if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } + if (compare == UNITY_NOT_EQUAL) { UnityPrint(UnityStrNotEqual); } + UnityPrintNumberByStyle(threshold, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#define UnityPrintPointlessAndBail() \ +do { \ + UnityTestResultsFailBegin(lineNumber); \ + UnityPrint(UnityStrPointless); \ + UnityAddMsgIfSpecified(msg); \ + UNITY_FAIL_AND_BAIL; \ +} while (0) + +/*-----------------------------------------------*/ +void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 elements = num_elements; + unsigned int length = style & 0xF; + unsigned int increment = 0; + + RETURN_IF_FAIL_OR_IGNORE; + + if (num_elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + while ((elements > 0) && (elements--)) + { + UNITY_INT expect_val; + UNITY_INT actual_val; + + switch (length) + { + case 1: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual; + if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) + { + expect_val &= 0x000000FF; + actual_val &= 0x000000FF; + } + increment = sizeof(UNITY_INT8); + break; + + case 2: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; + if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) + { + expect_val &= 0x0000FFFF; + actual_val &= 0x0000FFFF; + } + increment = sizeof(UNITY_INT16); + break; + +#ifdef UNITY_SUPPORT_64 + case 8: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; + increment = sizeof(UNITY_INT64); + break; +#endif + + default: /* default is length 4 bytes */ + case 4: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; +#ifdef UNITY_SUPPORT_64 + if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) + { + expect_val &= 0x00000000FFFFFFFF; + actual_val &= 0x00000000FFFFFFFF; + } +#endif + increment = sizeof(UNITY_INT32); + length = 4; + break; + } + + if (expect_val != actual_val) + { + if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8))) + { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ + UNITY_INT mask = 1; + mask = (mask << 8 * length) - 1; + expect_val &= mask; + actual_val &= mask; + } + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expect_val, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual_val, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + /* Walk through array by incrementing the pointers */ + if (flags == UNITY_ARRAY_TO_ARRAY) + { + expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment); + } + actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment); + } +} + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_FLOAT +/* Wrap this define in a function with variable types as float or double */ +#define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \ + if (UNITY_IS_INF(expected) && UNITY_IS_INF(actual) && (((expected) < 0) == ((actual) < 0))) return 1; \ + if (UNITY_NAN_CHECK) return 1; \ + (diff) = (actual) - (expected); \ + if ((diff) < 0) (diff) = -(diff); \ + if ((delta) < 0) (delta) = -(delta); \ + return !(UNITY_IS_NAN(diff) || UNITY_IS_INF(diff) || ((diff) > (delta))) + /* This first part of this condition will catch any NaN or Infinite values */ +#ifndef UNITY_NAN_NOT_EQUAL_NAN + #define UNITY_NAN_CHECK UNITY_IS_NAN(expected) && UNITY_IS_NAN(actual) +#else + #define UNITY_NAN_CHECK 0 +#endif + +#ifndef UNITY_EXCLUDE_FLOAT_PRINT + #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ + do { \ + UnityPrint(UnityStrExpected); \ + UnityPrintFloat(expected); \ + UnityPrint(UnityStrWas); \ + UnityPrintFloat(actual); \ + } while (0) +#else + #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ + UnityPrint(UnityStrDelta) +#endif /* UNITY_EXCLUDE_FLOAT_PRINT */ + +/*-----------------------------------------------*/ +static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual) +{ + UNITY_FLOAT diff; + UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); +} + +/*-----------------------------------------------*/ +void UnityAssertWithinFloatArray(const UNITY_FLOAT delta, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual; + UNITY_FLOAT in_delta = delta; + UNITY_FLOAT current_element_delta = delta; + + RETURN_IF_FAIL_OR_IGNORE; + + if (elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if (UNITY_IS_INF(in_delta)) + { + return; /* Arrays will be force equal with infinite delta */ + } + + if (UNITY_IS_NAN(in_delta)) + { + /* Delta must be correct number */ + UnityPrintPointlessAndBail(); + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + /* fix delta sign if need */ + if (in_delta < 0) + { + in_delta = -in_delta; + } + + while (elements--) + { + current_element_delta = *ptr_expected * UNITY_FLOAT_PRECISION; + + if (current_element_delta < 0) + { + /* fix delta sign for correct calculations */ + current_element_delta = -current_element_delta; + } + + if (!UnityFloatsWithin(in_delta + current_element_delta, *ptr_expected, *ptr_actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)*ptr_expected, (UNITY_DOUBLE)*ptr_actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + if (flags == UNITY_ARRAY_TO_ARRAY) + { + ptr_expected++; + } + ptr_actual++; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatsWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + + if (!UnityFloatsWithin(delta, expected, actual)) + { + UnityTestResultsFailBegin(lineNumber); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatsNotWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (UnityFloatsWithin(delta, expected, actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintFloat((UNITY_DOUBLE)expected); + UnityPrint(UnityStrNotEqual); + UnityPrintFloat((UNITY_DOUBLE)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertGreaterOrLessFloat(const UNITY_FLOAT threshold, + const UNITY_FLOAT actual, + const UNITY_COMPARISON_T compare, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + int failed; + + RETURN_IF_FAIL_OR_IGNORE; + + failed = 0; + + /* Checking for "not success" rather than failure to get the right result for NaN */ + if (!(actual < threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } + if (!(actual > threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } + + if ((compare & UNITY_EQUAL_TO) && UnityFloatsWithin(threshold * UNITY_FLOAT_PRECISION, threshold, actual)) { failed = 0; } + + if (failed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintFloat(actual); + if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } + if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } + if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } + UnityPrintFloat(threshold); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatSpecial(const UNITY_FLOAT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style) +{ + const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; + UNITY_INT should_be_trait = ((UNITY_INT)style & 1); + UNITY_INT is_trait = !should_be_trait; + UNITY_INT trait_index = (UNITY_INT)(style >> 1); + + RETURN_IF_FAIL_OR_IGNORE; + + switch (style) + { + case UNITY_FLOAT_IS_INF: + case UNITY_FLOAT_IS_NOT_INF: + is_trait = UNITY_IS_INF(actual) && (actual > 0); + break; + case UNITY_FLOAT_IS_NEG_INF: + case UNITY_FLOAT_IS_NOT_NEG_INF: + is_trait = UNITY_IS_INF(actual) && (actual < 0); + break; + + case UNITY_FLOAT_IS_NAN: + case UNITY_FLOAT_IS_NOT_NAN: + is_trait = UNITY_IS_NAN(actual) ? 1 : 0; + break; + + case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ + case UNITY_FLOAT_IS_NOT_DET: + is_trait = !UNITY_IS_INF(actual) && !UNITY_IS_NAN(actual); + break; + + case UNITY_FLOAT_INVALID_TRAIT: /* Supress warning */ + default: /* including UNITY_FLOAT_INVALID_TRAIT */ + trait_index = 0; + trait_names[0] = UnityStrInvalidFloatTrait; + break; + } + + if (is_trait != should_be_trait) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + if (!should_be_trait) + { + UnityPrint(UnityStrNot); + } + UnityPrint(trait_names[trait_index]); + UnityPrint(UnityStrWas); +#ifndef UNITY_EXCLUDE_FLOAT_PRINT + UnityPrintFloat((UNITY_DOUBLE)actual); +#else + if (should_be_trait) + { + UnityPrint(UnityStrNot); + } + UnityPrint(trait_names[trait_index]); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#endif /* not UNITY_EXCLUDE_FLOAT */ + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_DOUBLE +static int UnityDoublesWithin(UNITY_DOUBLE delta, UNITY_DOUBLE expected, UNITY_DOUBLE actual) +{ + UNITY_DOUBLE diff; + UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); +} + +/*-----------------------------------------------*/ +void UnityAssertWithinDoubleArray(const UNITY_DOUBLE delta, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual; + UNITY_DOUBLE in_delta = delta; + UNITY_DOUBLE current_element_delta = delta; + + RETURN_IF_FAIL_OR_IGNORE; + + if (elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if (UNITY_IS_INF(in_delta)) + { + return; /* Arrays will be force equal with infinite delta */ + } + + if (UNITY_IS_NAN(in_delta)) + { + /* Delta must be correct number */ + UnityPrintPointlessAndBail(); + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + /* fix delta sign if need */ + if (in_delta < 0) + { + in_delta = -in_delta; + } + + while (elements--) + { + current_element_delta = *ptr_expected * UNITY_DOUBLE_PRECISION; + + if (current_element_delta < 0) + { + /* fix delta sign for correct calculations */ + current_element_delta = -current_element_delta; + } + + if (!UnityDoublesWithin(in_delta + current_element_delta, *ptr_expected, *ptr_actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + if (flags == UNITY_ARRAY_TO_ARRAY) + { + ptr_expected++; + } + ptr_actual++; + } +} + +/*-----------------------------------------------*/ +void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (!UnityDoublesWithin(delta, expected, actual)) + { + UnityTestResultsFailBegin(lineNumber); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertDoublesNotWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (UnityDoublesWithin(delta, expected, actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintFloat((UNITY_DOUBLE)expected); + UnityPrint(UnityStrNotEqual); + UnityPrintFloat((UNITY_DOUBLE)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertGreaterOrLessDouble(const UNITY_DOUBLE threshold, + const UNITY_DOUBLE actual, + const UNITY_COMPARISON_T compare, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + int failed; + + RETURN_IF_FAIL_OR_IGNORE; + + failed = 0; + + /* Checking for "not success" rather than failure to get the right result for NaN */ + if (!(actual < threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } + if (!(actual > threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } + + if ((compare & UNITY_EQUAL_TO) && UnityDoublesWithin(threshold * UNITY_DOUBLE_PRECISION, threshold, actual)) { failed = 0; } + + if (failed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintFloat(actual); + if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } + if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } + if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } + UnityPrintFloat(threshold); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style) +{ + const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; + UNITY_INT should_be_trait = ((UNITY_INT)style & 1); + UNITY_INT is_trait = !should_be_trait; + UNITY_INT trait_index = (UNITY_INT)(style >> 1); + + RETURN_IF_FAIL_OR_IGNORE; + + switch (style) + { + case UNITY_FLOAT_IS_INF: + case UNITY_FLOAT_IS_NOT_INF: + is_trait = UNITY_IS_INF(actual) && (actual > 0); + break; + case UNITY_FLOAT_IS_NEG_INF: + case UNITY_FLOAT_IS_NOT_NEG_INF: + is_trait = UNITY_IS_INF(actual) && (actual < 0); + break; + + case UNITY_FLOAT_IS_NAN: + case UNITY_FLOAT_IS_NOT_NAN: + is_trait = UNITY_IS_NAN(actual) ? 1 : 0; + break; + + case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ + case UNITY_FLOAT_IS_NOT_DET: + is_trait = !UNITY_IS_INF(actual) && !UNITY_IS_NAN(actual); + break; + + case UNITY_FLOAT_INVALID_TRAIT: /* Supress warning */ + default: /* including UNITY_FLOAT_INVALID_TRAIT */ + trait_index = 0; + trait_names[0] = UnityStrInvalidFloatTrait; + break; + } + + if (is_trait != should_be_trait) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + if (!should_be_trait) + { + UnityPrint(UnityStrNot); + } + UnityPrint(trait_names[trait_index]); + UnityPrint(UnityStrWas); +#ifndef UNITY_EXCLUDE_FLOAT_PRINT + UnityPrintFloat(actual); +#else + if (should_be_trait) + { + UnityPrint(UnityStrNot); + } + UnityPrint(trait_names[trait_index]); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#endif /* not UNITY_EXCLUDE_DOUBLE */ + +/*-----------------------------------------------*/ +void UnityAssertNumbersWithin(const UNITY_UINT delta, + const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (actual > expected) + { + Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta); + } + else + { + Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta); + } + } + else + { + if ((UNITY_UINT)actual > (UNITY_UINT)expected) + { + Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta); + } + else + { + Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta); + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrDelta); + UnityPrintNumberByStyle((UNITY_INT)delta, style); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expected, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertNumbersArrayWithin(const UNITY_UINT delta, + UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 elements = num_elements; + unsigned int length = style & 0xF; + unsigned int increment = 0; + + RETURN_IF_FAIL_OR_IGNORE; + + if (num_elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + while ((elements > 0) && (elements--)) + { + UNITY_INT expect_val; + UNITY_INT actual_val; + + switch (length) + { + case 1: + /* fixing problems with signed overflow on unsigned numbers */ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual; + increment = sizeof(UNITY_INT8); + } + else + { + expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT8*)expected; + actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT8*)actual; + increment = sizeof(UNITY_UINT8); + } + break; + + case 2: + /* fixing problems with signed overflow on unsigned numbers */ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; + increment = sizeof(UNITY_INT16); + } + else + { + expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT16*)expected; + actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT16*)actual; + increment = sizeof(UNITY_UINT16); + } + break; + +#ifdef UNITY_SUPPORT_64 + case 8: + /* fixing problems with signed overflow on unsigned numbers */ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; + increment = sizeof(UNITY_INT64); + } + else + { + expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT64*)expected; + actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT64*)actual; + increment = sizeof(UNITY_UINT64); + } + break; +#endif + + default: /* default is length 4 bytes */ + case 4: + /* fixing problems with signed overflow on unsigned numbers */ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; + increment = sizeof(UNITY_INT32); + } + else + { + expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT32*)expected; + actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT32*)actual; + increment = sizeof(UNITY_UINT32); + } + length = 4; + break; + } + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (actual_val > expect_val) + { + Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta); + } + else + { + Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta); + } + } + else + { + if ((UNITY_UINT)actual_val > (UNITY_UINT)expect_val) + { + Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta); + } + else + { + Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta); + } + } + + if (Unity.CurrentTestFailed) + { + if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8))) + { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ + UNITY_INT mask = 1; + mask = (mask << 8 * length) - 1; + expect_val &= mask; + actual_val &= mask; + } + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrDelta); + UnityPrintNumberByStyle((UNITY_INT)delta, style); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expect_val, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual_val, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + /* Walk through array by incrementing the pointers */ + if (flags == UNITY_ARRAY_TO_ARRAY) + { + expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment); + } + actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment); + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualString(const char* expected, + const char* actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + UNITY_UINT32 i; + + RETURN_IF_FAIL_OR_IGNORE; + + /* if both pointers not null compare the strings */ + if (expected && actual) + { + for (i = 0; expected[i] || actual[i]; i++) + { + if (expected[i] != actual[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* fail if either null but not if both */ + if (expected || actual) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStrings(expected, actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualStringLen(const char* expected, + const char* actual, + const UNITY_UINT32 length, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + UNITY_UINT32 i; + + RETURN_IF_FAIL_OR_IGNORE; + + /* if both pointers not null compare the strings */ + if (expected && actual) + { + for (i = 0; (i < length) && (expected[i] || actual[i]); i++) + { + if (expected[i] != actual[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* fail if either null but not if both */ + if (expected || actual) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStringsLen(expected, actual, length); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, + const char** actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 i = 0; + UNITY_UINT32 j = 0; + const char* expd = NULL; + const char* act = NULL; + + RETURN_IF_FAIL_OR_IGNORE; + + /* if no elements, it's an error */ + if (num_elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if ((const void*)expected == (const void*)actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + if (flags != UNITY_ARRAY_TO_ARRAY) + { + expd = (const char*)expected; + } + + do + { + act = actual[j]; + if (flags == UNITY_ARRAY_TO_ARRAY) + { + expd = ((const char* const*)expected)[j]; + } + + /* if both pointers not null compare the strings */ + if (expd && act) + { + for (i = 0; expd[i] || act[i]; i++) + { + if (expd[i] != act[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expd != act) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + if (num_elements > 1) + { + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(j); + } + UnityPrintExpectedAndActualStrings(expd, act); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + } while (++j < num_elements); +} + +/*-----------------------------------------------*/ +void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 length, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) +{ + UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; + UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; + UNITY_UINT32 elements = num_elements; + UNITY_UINT32 bytes; + + RETURN_IF_FAIL_OR_IGNORE; + + if (elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + if (length == 0) + { + UnityPrintPointlessAndBail(); + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + while (elements--) + { + bytes = length; + while (bytes--) + { + if (*ptr_exp != *ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrMemory); + if (num_elements > 1) + { + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + } + UnityPrint(UnityStrByte); + UnityPrintNumberUnsigned(length - bytes - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp++; + ptr_act++; + } + if (flags == UNITY_ARRAY_TO_VAL) + { + ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; + } + } +} + +/*-----------------------------------------------*/ + +static union +{ + UNITY_INT8 i8; + UNITY_INT16 i16; + UNITY_INT32 i32; +#ifdef UNITY_SUPPORT_64 + UNITY_INT64 i64; +#endif +#ifndef UNITY_EXCLUDE_FLOAT + float f; +#endif +#ifndef UNITY_EXCLUDE_DOUBLE + double d; +#endif +} UnityQuickCompare; + +UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) +{ + switch(size) + { + case 1: + UnityQuickCompare.i8 = (UNITY_INT8)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8); + + case 2: + UnityQuickCompare.i16 = (UNITY_INT16)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16); + +#ifdef UNITY_SUPPORT_64 + case 8: + UnityQuickCompare.i64 = (UNITY_INT64)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64); +#endif + + default: /* 4 bytes */ + UnityQuickCompare.i32 = (UNITY_INT32)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32); + } +} + +#ifndef UNITY_EXCLUDE_FLOAT +/*-----------------------------------------------*/ +UNITY_INTERNAL_PTR UnityFloatToPtr(const float num) +{ + UnityQuickCompare.f = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.f); +} +#endif + +#ifndef UNITY_EXCLUDE_DOUBLE +/*-----------------------------------------------*/ +UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num) +{ + UnityQuickCompare.d = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.d); +} +#endif + +#ifdef UNITY_INCLUDE_PRINT_FORMATTED + +/*----------------------------------------------- + * printf length modifier helpers + *-----------------------------------------------*/ + +enum UnityLengthModifier { + UNITY_LENGTH_MODIFIER_NONE, + UNITY_LENGTH_MODIFIER_LONG_LONG, + UNITY_LENGTH_MODIFIER_LONG, +}; + +#define UNITY_EXTRACT_ARG(NUMBER_T, NUMBER, LENGTH_MOD, VA, ARG_T) \ +do { \ + switch (LENGTH_MOD) \ + { \ + case UNITY_LENGTH_MODIFIER_LONG_LONG: \ + { \ + NUMBER = (NUMBER_T)va_arg(VA, long long ARG_T); \ + break; \ + } \ + case UNITY_LENGTH_MODIFIER_LONG: \ + { \ + NUMBER = (NUMBER_T)va_arg(VA, long ARG_T); \ + break; \ + } \ + case UNITY_LENGTH_MODIFIER_NONE: \ + default: \ + { \ + NUMBER = (NUMBER_T)va_arg(VA, ARG_T); \ + break; \ + } \ + } \ +} while (0) + +static enum UnityLengthModifier UnityLengthModifierGet(const char *pch, int *length) +{ + enum UnityLengthModifier length_mod; + switch (pch[0]) + { + case 'l': + { + if (pch[1] == 'l') + { + *length = 2; + length_mod = UNITY_LENGTH_MODIFIER_LONG_LONG; + } + else + { + *length = 1; + length_mod = UNITY_LENGTH_MODIFIER_LONG; + } + break; + } + case 'h': + { + // short and char are converted to int + length_mod = UNITY_LENGTH_MODIFIER_NONE; + if (pch[1] == 'h') + { + *length = 2; + } + else + { + *length = 1; + } + break; + } + case 'j': + case 'z': + case 't': + case 'L': + { + // Not supported, but should gobble up the length specifier anyway + length_mod = UNITY_LENGTH_MODIFIER_NONE; + *length = 1; + break; + } + default: + { + length_mod = UNITY_LENGTH_MODIFIER_NONE; + *length = 0; + } + } + return length_mod; +} + +/*----------------------------------------------- + * printf helper function + *-----------------------------------------------*/ +static void UnityPrintFVA(const char* format, va_list va) +{ + const char* pch = format; + if (pch != NULL) + { + while (*pch) + { + /* format identification character */ + if (*pch == '%') + { + pch++; + + if (pch != NULL) + { + int length_mod_size; + enum UnityLengthModifier length_mod = UnityLengthModifierGet(pch, &length_mod_size); + pch += length_mod_size; + + switch (*pch) + { + case 'd': + case 'i': + { + UNITY_INT number; + UNITY_EXTRACT_ARG(UNITY_INT, number, length_mod, va, int); + UnityPrintNumber((UNITY_INT)number); + break; + } +#ifndef UNITY_EXCLUDE_FLOAT_PRINT + case 'f': + case 'g': + { + const double number = va_arg(va, double); + UnityPrintFloat((UNITY_DOUBLE)number); + break; + } +#endif + case 'u': + { + UNITY_UINT number; + UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); + UnityPrintNumberUnsigned(number); + break; + } + case 'b': + { + UNITY_UINT number; + UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); + const UNITY_UINT mask = (UNITY_UINT)0 - (UNITY_UINT)1; + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('b'); + UnityPrintMask(mask, number); + break; + } + case 'x': + case 'X': + { + UNITY_UINT number; + UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex(number, UNITY_MAX_NIBBLES); + break; + } + case 'p': + { + UNITY_UINT number; + char nibbles_to_print = 8; + if (UNITY_POINTER_WIDTH == 64) + { + length_mod = UNITY_LENGTH_MODIFIER_LONG_LONG; + nibbles_to_print = 16; + } + UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)number, nibbles_to_print); + break; + } + case 'c': + { + const int ch = va_arg(va, int); + UnityPrintChar((const char *)&ch); + break; + } + case 's': + { + const char * string = va_arg(va, const char *); + UnityPrint(string); + break; + } + case '%': + { + UnityPrintChar(pch); + break; + } + default: + { + /* print the unknown format character */ + UNITY_OUTPUT_CHAR('%'); + UnityPrintChar(pch); + break; + } + } + } + } +#ifdef UNITY_OUTPUT_COLOR + /* print ANSI escape code */ + else if ((*pch == 27) && (*(pch + 1) == '[')) + { + pch += UnityPrintAnsiEscapeString(pch); + continue; + } +#endif + else if (*pch == '\n') + { + UNITY_PRINT_EOL(); + } + else + { + UnityPrintChar(pch); + } + + pch++; + } + } +} + +void UnityPrintF(const UNITY_LINE_TYPE line, const char* format, ...) +{ + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint("INFO"); + if(format != NULL) + { + UnityPrint(": "); + va_list va; + va_start(va, format); + UnityPrintFVA(format, va); + va_end(va); + } + UNITY_PRINT_EOL(); +} +#endif /* ! UNITY_INCLUDE_PRINT_FORMATTED */ + + +/*----------------------------------------------- + * Control Functions + *-----------------------------------------------*/ + +/*-----------------------------------------------*/ +void UnityFail(const char* msg, const UNITY_LINE_TYPE line) +{ + RETURN_IF_FAIL_OR_IGNORE; + + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint(UnityStrFail); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + +#ifdef UNITY_PRINT_TEST_CONTEXT + UNITY_PRINT_TEST_CONTEXT(); +#endif +#ifndef UNITY_EXCLUDE_DETAILS + if (Unity.CurrentDetail1) + { + UnityPrint(UnityStrDetail1Name); + UnityPrint(Unity.CurrentDetail1); + if (Unity.CurrentDetail2) + { + UnityPrint(UnityStrDetail2Name); + UnityPrint(Unity.CurrentDetail2); + } + UnityPrint(UnityStrSpacer); + } +#endif + if (msg[0] != ' ') + { + UNITY_OUTPUT_CHAR(' '); + } + UnityPrint(msg); + } + + UNITY_FAIL_AND_BAIL; +} + +/*-----------------------------------------------*/ +void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) +{ + RETURN_IF_FAIL_OR_IGNORE; + + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint(UnityStrIgnore); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(msg); + } + UNITY_IGNORE_AND_BAIL; +} + +/*-----------------------------------------------*/ +void UnityMessage(const char* msg, const UNITY_LINE_TYPE line) +{ + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint("INFO"); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(msg); + } + UNITY_PRINT_EOL(); +} + +/*-----------------------------------------------*/ +/* If we have not defined our own test runner, then include our default test runner to make life easier */ +#ifndef UNITY_SKIP_DEFAULT_RUNNER +void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) +{ + Unity.CurrentTestName = FuncName; + Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; + Unity.NumberOfTests++; + UNITY_CLR_DETAILS(); + UNITY_EXEC_TIME_START(); + if (TEST_PROTECT()) + { + setUp(); + Func(); + } + if (TEST_PROTECT()) + { + tearDown(); + } + UNITY_EXEC_TIME_STOP(); + UnityConcludeTest(); +} +#endif + +/*-----------------------------------------------*/ +void UnitySetTestFile(const char* filename) +{ + Unity.TestFile = filename; +} + +/*-----------------------------------------------*/ +void UnityBegin(const char* filename) +{ + Unity.TestFile = filename; + Unity.CurrentTestName = NULL; + Unity.CurrentTestLineNumber = 0; + Unity.NumberOfTests = 0; + Unity.TestFailures = 0; + Unity.TestIgnores = 0; + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; + + UNITY_CLR_DETAILS(); + UNITY_OUTPUT_START(); +} + +/*-----------------------------------------------*/ +int UnityEnd(void) +{ + UNITY_PRINT_EOL(); + UnityPrint(UnityStrBreaker); + UNITY_PRINT_EOL(); + UnityPrintNumber((UNITY_INT)(Unity.NumberOfTests)); + UnityPrint(UnityStrResultsTests); + UnityPrintNumber((UNITY_INT)(Unity.TestFailures)); + UnityPrint(UnityStrResultsFailures); + UnityPrintNumber((UNITY_INT)(Unity.TestIgnores)); + UnityPrint(UnityStrResultsIgnored); + UNITY_PRINT_EOL(); + if (Unity.TestFailures == 0U) + { + UnityPrint(UnityStrOk); + } + else + { + UnityPrint(UnityStrFail); +#ifdef UNITY_DIFFERENTIATE_FINAL_FAIL + UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D'); +#endif + } + UNITY_PRINT_EOL(); + UNITY_FLUSH_CALL(); + UNITY_OUTPUT_COMPLETE(); + return (int)(Unity.TestFailures); +} + +/*----------------------------------------------- + * Command Line Argument Support + *-----------------------------------------------*/ +#ifdef UNITY_USE_COMMAND_LINE_ARGS + +char* UnityOptionIncludeNamed = NULL; +char* UnityOptionExcludeNamed = NULL; +int UnityVerbosity = 1; + +/*-----------------------------------------------*/ +int UnityParseOptions(int argc, char** argv) +{ + int i; + UnityOptionIncludeNamed = NULL; + UnityOptionExcludeNamed = NULL; + + for (i = 1; i < argc; i++) + { + if (argv[i][0] == '-') + { + switch (argv[i][1]) + { + case 'l': /* list tests */ + return -1; + case 'n': /* include tests with name including this string */ + case 'f': /* an alias for -n */ + if (argv[i][2] == '=') + { + UnityOptionIncludeNamed = &argv[i][3]; + } + else if (++i < argc) + { + UnityOptionIncludeNamed = argv[i]; + } + else + { + UnityPrint("ERROR: No Test String to Include Matches For"); + UNITY_PRINT_EOL(); + return 1; + } + break; + case 'q': /* quiet */ + UnityVerbosity = 0; + break; + case 'v': /* verbose */ + UnityVerbosity = 2; + break; + case 'x': /* exclude tests with name including this string */ + if (argv[i][2] == '=') + { + UnityOptionExcludeNamed = &argv[i][3]; + } + else if (++i < argc) + { + UnityOptionExcludeNamed = argv[i]; + } + else + { + UnityPrint("ERROR: No Test String to Exclude Matches For"); + UNITY_PRINT_EOL(); + return 1; + } + break; + default: + UnityPrint("ERROR: Unknown Option "); + UNITY_OUTPUT_CHAR(argv[i][1]); + UNITY_PRINT_EOL(); + /* Now display help */ + /* FALLTHRU */ + case 'h': + UnityPrint("Options: "); UNITY_PRINT_EOL(); + UnityPrint("-l List all tests and exit"); UNITY_PRINT_EOL(); + UnityPrint("-f NAME Filter to run only tests whose name includes NAME"); UNITY_PRINT_EOL(); + UnityPrint("-n NAME (deprecated) alias of -f"); UNITY_PRINT_EOL(); + UnityPrint("-h show this Help menu"); UNITY_PRINT_EOL(); + UnityPrint("-q Quiet/decrease verbosity"); UNITY_PRINT_EOL(); + UnityPrint("-v increase Verbosity"); UNITY_PRINT_EOL(); + UnityPrint("-x NAME eXclude tests whose name includes NAME"); UNITY_PRINT_EOL(); + UNITY_OUTPUT_FLUSH(); + return 1; + } + } + } + + return 0; +} + +/*-----------------------------------------------*/ +int IsStringInBiggerString(const char* longstring, const char* shortstring) +{ + const char* lptr = longstring; + const char* sptr = shortstring; + const char* lnext = lptr; + + if (*sptr == '*') + { + return 1; + } + + while (*lptr) + { + lnext = lptr + 1; + + /* If they current bytes match, go on to the next bytes */ + while (*lptr && *sptr && (*lptr == *sptr)) + { + lptr++; + sptr++; + + /* We're done if we match the entire string or up to a wildcard */ + if (*sptr == '*') + return 1; + if (*sptr == ',') + return 1; + if (*sptr == '"') + return 1; + if (*sptr == '\'') + return 1; + if (*sptr == ':') + return 2; + if (*sptr == 0) + return 1; + } + + /* Otherwise we start in the long pointer 1 character further and try again */ + lptr = lnext; + sptr = shortstring; + } + + return 0; +} + +/*-----------------------------------------------*/ +int UnityStringArgumentMatches(const char* str) +{ + int retval; + const char* ptr1; + const char* ptr2; + const char* ptrf; + + /* Go through the options and get the substrings for matching one at a time */ + ptr1 = str; + while (ptr1[0] != 0) + { + if ((ptr1[0] == '"') || (ptr1[0] == '\'')) + { + ptr1++; + } + + /* look for the start of the next partial */ + ptr2 = ptr1; + ptrf = 0; + do + { + ptr2++; + if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')) + { + ptrf = &ptr2[1]; + } + } while ((ptr2[0] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')); + + while ((ptr2[0] != 0) && ((ptr2[0] == ':') || (ptr2[0] == '\'') || (ptr2[0] == '"') || (ptr2[0] == ','))) + { + ptr2++; + } + + /* done if complete filename match */ + retval = IsStringInBiggerString(Unity.TestFile, ptr1); + if (retval == 1) + { + return retval; + } + + /* done if testname match after filename partial match */ + if ((retval == 2) && (ptrf != 0)) + { + if (IsStringInBiggerString(Unity.CurrentTestName, ptrf)) + { + return 1; + } + } + + /* done if complete testname match */ + if (IsStringInBiggerString(Unity.CurrentTestName, ptr1) == 1) + { + return 1; + } + + ptr1 = ptr2; + } + + /* we couldn't find a match for any substrings */ + return 0; +} + +/*-----------------------------------------------*/ +int UnityTestMatches(void) +{ + /* Check if this test name matches the included test pattern */ + int retval; + if (UnityOptionIncludeNamed) + { + retval = UnityStringArgumentMatches(UnityOptionIncludeNamed); + } + else + { + retval = 1; + } + + /* Check if this test name matches the excluded test pattern */ + if (UnityOptionExcludeNamed) + { + if (UnityStringArgumentMatches(UnityOptionExcludeNamed)) + { + retval = 0; + } + } + + return retval; +} + +#endif /* UNITY_USE_COMMAND_LINE_ARGS */ +/*-----------------------------------------------*/ diff --git a/unity/src/unity.h b/unity/src/unity.h new file mode 100644 index 0000000..8337c8c --- /dev/null +++ b/unity/src/unity.h @@ -0,0 +1,698 @@ +/* ========================================================================= + Unity - A Test Framework for C + ThrowTheSwitch.org + Copyright (c) 2007-24 Mike Karlesky, Mark VanderVoord, & Greg Williams + SPDX-License-Identifier: MIT +========================================================================= */ + +#ifndef UNITY_FRAMEWORK_H +#define UNITY_FRAMEWORK_H +#define UNITY + +#define UNITY_VERSION_MAJOR 2 +#define UNITY_VERSION_MINOR 6 +#define UNITY_VERSION_BUILD 0 +#define UNITY_VERSION ((UNITY_VERSION_MAJOR << 16) | (UNITY_VERSION_MINOR << 8) | UNITY_VERSION_BUILD) + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "unity_internals.h" + +/*------------------------------------------------------- + * Test Setup / Teardown + *-------------------------------------------------------*/ + +/* These functions are intended to be called before and after each test. + * If using unity directly, these will need to be provided for each test + * executable built. If you are using the test runner generator and/or + * Ceedling, these are optional. */ +void setUp(void); +void tearDown(void); + +/* These functions are intended to be called at the beginning and end of an + * entire test suite. suiteTearDown() is passed the number of tests that + * failed, and its return value becomes the exit code of main(). If using + * Unity directly, you're in charge of calling these if they are desired. + * If using Ceedling or the test runner generator, these will be called + * automatically if they exist. */ +void suiteSetUp(void); +int suiteTearDown(int num_failures); + +/*------------------------------------------------------- + * Test Reset and Verify + *-------------------------------------------------------*/ + +/* These functions are intended to be called before during tests in order + * to support complex test loops, etc. Both are NOT built into Unity. Instead + * the test runner generator will create them. resetTest will run teardown and + * setup again, verifying any end-of-test needs between. verifyTest will only + * run the verification. */ +void resetTest(void); +void verifyTest(void); + +/*------------------------------------------------------- + * Configuration Options + *------------------------------------------------------- + * All options described below should be passed as a compiler flag to all files using Unity. If you must add #defines, place them BEFORE the #include above. + + * Integers/longs/pointers + * - Unity attempts to automatically discover your integer sizes + * - define UNITY_EXCLUDE_STDINT_H to stop attempting to look in + * - define UNITY_EXCLUDE_LIMITS_H to stop attempting to look in + * - If you cannot use the automatic methods above, you can force Unity by using these options: + * - define UNITY_SUPPORT_64 + * - set UNITY_INT_WIDTH + * - set UNITY_LONG_WIDTH + * - set UNITY_POINTER_WIDTH + + * Floats + * - define UNITY_EXCLUDE_FLOAT to disallow floating point comparisons + * - define UNITY_FLOAT_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_FLOAT + * - define UNITY_FLOAT_TYPE to specify doubles instead of single precision floats + * - define UNITY_INCLUDE_DOUBLE to allow double floating point comparisons + * - define UNITY_EXCLUDE_DOUBLE to disallow double floating point comparisons (default) + * - define UNITY_DOUBLE_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_DOUBLE + * - define UNITY_DOUBLE_TYPE to specify something other than double + * - define UNITY_EXCLUDE_FLOAT_PRINT to trim binary size, won't print floating point values in errors + + * Output + * - by default, Unity prints to standard out with putchar. define UNITY_OUTPUT_CHAR(a) with a different function if desired + * - define UNITY_DIFFERENTIATE_FINAL_FAIL to print FAILED (vs. FAIL) at test end summary - for automated search for failure + + * Optimization + * - by default, line numbers are stored in unsigned shorts. Define UNITY_LINE_TYPE with a different type if your files are huge + * - by default, test and failure counters are unsigned shorts. Define UNITY_COUNTER_TYPE with a different type if you want to save space or have more than 65535 Tests. + + * Test Cases + * - define UNITY_SUPPORT_TEST_CASES to include the TEST_CASE macro, though really it's mostly about the runner generator script + + * Parameterized Tests + * - you'll want to create a define of TEST_CASE(...), TEST_RANGE(...) and/or TEST_MATRIX(...) which basically evaluates to nothing + + * Tests with Arguments + * - you'll want to define UNITY_USE_COMMAND_LINE_ARGS if you have the test runner passing arguments to Unity + + *------------------------------------------------------- + * Basic Fail and Ignore + *-------------------------------------------------------*/ + +#define TEST_FAIL_MESSAGE(message) UNITY_TEST_FAIL(__LINE__, (message)) +#define TEST_FAIL() UNITY_TEST_FAIL(__LINE__, NULL) +#define TEST_IGNORE_MESSAGE(message) UNITY_TEST_IGNORE(__LINE__, (message)) +#define TEST_IGNORE() UNITY_TEST_IGNORE(__LINE__, NULL) +#define TEST_MESSAGE(message) UnityMessage((message), __LINE__) +#define TEST_ONLY() +#ifdef UNITY_INCLUDE_PRINT_FORMATTED +#define TEST_PRINTF(message, ...) UnityPrintF(__LINE__, (message), ##__VA_ARGS__) +#endif + +/* It is not necessary for you to call PASS. A PASS condition is assumed if nothing fails. + * This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */ +#define TEST_PASS() TEST_ABORT() +#define TEST_PASS_MESSAGE(message) do { UnityMessage((message), __LINE__); TEST_ABORT(); } while (0) + +/*------------------------------------------------------- + * Build Directives + *------------------------------------------------------- + + * These macros do nothing, but they are useful for additional build context. + * Tools (like Ceedling) can scan for these directives and make use of them for + * per-test-executable #include search paths and linking. */ + +/* Add source files to a test executable's compilation and linking. Ex: TEST_SOURCE_FILE("sandwiches.c") */ +#define TEST_SOURCE_FILE(a) + +/* Customize #include search paths for a test executable's compilation. Ex: TEST_INCLUDE_PATH("src/module_a/inc") */ +#define TEST_INCLUDE_PATH(a) + +/*------------------------------------------------------- + * Test Asserts (simple) + *-------------------------------------------------------*/ + +/* Boolean */ +#define TEST_ASSERT(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expression Evaluated To FALSE") +#define TEST_ASSERT_TRUE(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expected TRUE Was FALSE") +#define TEST_ASSERT_UNLESS(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expression Evaluated To TRUE") +#define TEST_ASSERT_FALSE(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expected FALSE Was TRUE") +#define TEST_ASSERT_NULL(pointer) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, " Expected NULL") +#define TEST_ASSERT_NOT_NULL(pointer) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, " Expected Non-NULL") +#define TEST_ASSERT_EMPTY(pointer) UNITY_TEST_ASSERT_EMPTY( (pointer), __LINE__, " Expected Empty") +#define TEST_ASSERT_NOT_EMPTY(pointer) UNITY_TEST_ASSERT_NOT_EMPTY((pointer), __LINE__, " Expected Non-Empty") + +/* Integers (of all sizes) */ +#define TEST_ASSERT_EQUAL_INT(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_size_t(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX8(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX16(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX32(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX64(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_CHAR(expected, actual) UNITY_TEST_ASSERT_EQUAL_CHAR((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS(mask, expected, actual) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS_HIGH(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT)(-1), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS_LOW(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT)(0), (actual), __LINE__, NULL) +#define TEST_ASSERT_BIT_HIGH(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT)1 << (bit)), (UNITY_UINT)(-1), (actual), __LINE__, NULL) +#define TEST_ASSERT_BIT_LOW(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT)1 << (bit)), (UNITY_UINT)(0), (actual), __LINE__, NULL) + +/* Integer Not Equal To (of all sizes) */ +#define TEST_ASSERT_NOT_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) + +/* Integer Greater Than/ Less Than (of all sizes) */ +#define TEST_ASSERT_GREATER_THAN(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_CHAR(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_CHAR((threshold), (actual), __LINE__, NULL) + +#define TEST_ASSERT_LESS_THAN(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_CHAR(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_CHAR((threshold), (actual), __LINE__, NULL) + +#define TEST_ASSERT_GREATER_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) + +#define TEST_ASSERT_LESS_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) + +/* Integer Ranges (of all sizes) */ +#define TEST_ASSERT_INT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_size_t_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_CHAR_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_CHAR_WITHIN((delta), (expected), (actual), __LINE__, NULL) + +/* Integer Array Ranges (of all sizes) */ +#define TEST_ASSERT_INT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_INT8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_INT16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_INT32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_size_t_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_CHAR_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) + + +/* Structs and Strings */ +#define TEST_ASSERT_EQUAL_PTR(expected, actual) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING(expected, actual) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_MEMORY(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, NULL) + +/* Arrays */ +#define TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_size_t_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_CHAR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) + +/* Arrays Compared To Single Value */ +#define TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_size_t(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_CHAR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_CHAR((expected), (actual), (num_elements), __LINE__, NULL) + +/* Floating Point (If Enabled) */ +#define TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_FLOAT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual) UNITY_TEST_ASSERT_LESS_THAN_FLOAT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual) UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, NULL) + +/* Double (If Enabled) */ +#define TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_LESS_THAN_DOUBLE((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, NULL) + +/* Shorthand */ +#ifdef UNITY_SHORTHAND_AS_OLD +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal") +#endif +#ifdef UNITY_SHORTHAND_AS_INT +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif +#ifdef UNITY_SHORTHAND_AS_MEM +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_MEMORY((&expected), (&actual), sizeof(expected), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif +#ifdef UNITY_SHORTHAND_AS_RAW +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) == (actual)), __LINE__, " Expected Equal") +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal") +#endif +#ifdef UNITY_SHORTHAND_AS_NONE +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif + +/*------------------------------------------------------- + * Test Asserts (with additional messages) + *-------------------------------------------------------*/ + +/* Boolean */ +#define TEST_ASSERT_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) +#define TEST_ASSERT_TRUE_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) +#define TEST_ASSERT_UNLESS_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) +#define TEST_ASSERT_FALSE_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) +#define TEST_ASSERT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, (message)) +#define TEST_ASSERT_NOT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, (message)) +#define TEST_ASSERT_EMPTY_MESSAGE(pointer, message) UNITY_TEST_ASSERT_EMPTY( (pointer), __LINE__, (message)) +#define TEST_ASSERT_NOT_EMPTY_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_EMPTY((pointer), __LINE__, (message)) + +/* Integers (of all sizes) */ +#define TEST_ASSERT_EQUAL_INT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_size_t_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_MESSAGE(mask, expected, actual, message) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_HIGH_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(-1), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_LOW_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(0), (actual), __LINE__, (message)) +#define TEST_ASSERT_BIT_HIGH_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(-1), (actual), __LINE__, (message)) +#define TEST_ASSERT_BIT_LOW_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(0), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_CHAR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_CHAR((expected), (actual), __LINE__, (message)) + +/* Integer Not Equal To (of all sizes) */ +#define TEST_ASSERT_NOT_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) + + +/* Integer Greater Than/ Less Than (of all sizes) */ +#define TEST_ASSERT_GREATER_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_CHAR((threshold), (actual), __LINE__, (message)) + +#define TEST_ASSERT_LESS_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_CHAR((threshold), (actual), __LINE__, (message)) + +#define TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) + +#define TEST_ASSERT_LESS_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) + +/* Integer Ranges (of all sizes) */ +#define TEST_ASSERT_INT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_size_t_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_CHAR_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_CHAR_WITHIN((delta), (expected), (actual), __LINE__, (message)) + +/* Integer Array Ranges (of all sizes) */ +#define TEST_ASSERT_INT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_INT8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_INT16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_INT32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_INT64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_size_t_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_CHAR_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) + + +/* Structs and Strings */ +#define TEST_ASSERT_EQUAL_PTR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_MEMORY_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, (message)) + +/* Arrays */ +#define TEST_ASSERT_EQUAL_INT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_size_t_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_PTR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_MEMORY_ARRAY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_CHAR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) + +/* Arrays Compared To Single Value*/ +#define TEST_ASSERT_EACH_EQUAL_INT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_size_t_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_PTR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_STRING_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_MEMORY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_CHAR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_CHAR((expected), (actual), (num_elements), __LINE__, (message)) + +/* Floating Point (If Enabled) */ +#define TEST_ASSERT_FLOAT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_FLOAT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_FLOAT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_FLOAT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_THAN_FLOAT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, (message)) + +/* Double (If Enabled) */ +#define TEST_ASSERT_DOUBLE_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_DOUBLE_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_THAN_DOUBLE((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, (message)) + +/* Shorthand */ +#ifdef UNITY_SHORTHAND_AS_OLD +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, (message)) +#endif +#ifdef UNITY_SHORTHAND_AS_INT +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, message) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif +#ifdef UNITY_SHORTHAND_AS_MEM +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((&expected), (&actual), sizeof(expected), __LINE__, message) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif +#ifdef UNITY_SHORTHAND_AS_RAW +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) == (actual)), __LINE__, message) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, message) +#endif +#ifdef UNITY_SHORTHAND_AS_NONE +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif + +/* end of UNITY_FRAMEWORK_H */ +#ifdef __cplusplus +} +#endif +#endif diff --git a/unity/src/unity_internals.h b/unity/src/unity_internals.h new file mode 100644 index 0000000..1214bf0 --- /dev/null +++ b/unity/src/unity_internals.h @@ -0,0 +1,1170 @@ +/* ========================================================================= + Unity - A Test Framework for C + ThrowTheSwitch.org + Copyright (c) 2007-24 Mike Karlesky, Mark VanderVoord, & Greg Williams + SPDX-License-Identifier: MIT +========================================================================= */ + +#ifndef UNITY_INTERNALS_H +#define UNITY_INTERNALS_H + +#ifdef UNITY_INCLUDE_CONFIG_H +#include "unity_config.h" +#endif + +#ifndef UNITY_EXCLUDE_SETJMP_H +#include +#endif + +#ifndef UNITY_EXCLUDE_MATH_H +#include +#endif + +#ifndef UNITY_EXCLUDE_STDDEF_H +#include +#endif + +#ifdef UNITY_INCLUDE_PRINT_FORMATTED +#include +#endif + +/* Unity Attempts to Auto-Detect Integer Types + * Attempt 1: UINT_MAX, ULONG_MAX in , or default to 32 bits + * Attempt 2: UINTPTR_MAX in , or default to same size as long + * The user may override any of these derived constants: + * UNITY_INT_WIDTH, UNITY_LONG_WIDTH, UNITY_POINTER_WIDTH */ +#ifndef UNITY_EXCLUDE_STDINT_H +#include +#endif + +#ifndef UNITY_EXCLUDE_LIMITS_H +#include +#endif + +#if defined(__GNUC__) || defined(__clang__) + #define UNITY_FUNCTION_ATTR(a) __attribute__((a)) +#else + #define UNITY_FUNCTION_ATTR(a) /* ignore */ +#endif + +#ifndef UNITY_NORETURN + #if defined(__cplusplus) + #if __cplusplus >= 201103L + #define UNITY_NORETURN [[ noreturn ]] + #endif + #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #if defined(_WIN32) && defined(_MSC_VER) + /* We are using MSVC compiler on Windows platform. */ + /* Not all Windows SDKs supports , but compiler can support C11: */ + /* https://devblogs.microsoft.com/cppblog/c11-and-c17-standard-support-arriving-in-msvc/ */ + /* Not sure, that Mingw compilers has Windows SDK headers at all. */ + #include + #endif + + /* Using Windows SDK predefined macro for detecting supported SDK with MSVC compiler. */ + /* Mingw GCC should work without that fixes. */ + /* Based on: */ + /* https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170 */ + /* NTDDI_WIN10_FE is equal to Windows 10 SDK 2104 */ + #if defined(_MSC_VER) && ((!defined(NTDDI_WIN10_FE)) || WDK_NTDDI_VERSION < NTDDI_WIN10_FE) + /* Based on tests and: */ + /* https://docs.microsoft.com/en-us/cpp/c-language/noreturn?view=msvc-170 */ + /* https://en.cppreference.com/w/c/language/_Noreturn */ + #define UNITY_NORETURN _Noreturn + #else /* Using newer Windows SDK or not MSVC compiler */ + #include + #define UNITY_NORETURN noreturn + #endif + #endif +#endif +#ifndef UNITY_NORETURN + #define UNITY_NORETURN UNITY_FUNCTION_ATTR(__noreturn__) +#endif + +/*------------------------------------------------------- + * Guess Widths If Not Specified + *-------------------------------------------------------*/ + +/* Determine the size of an int, if not already specified. + * We cannot use sizeof(int), because it is not yet defined + * at this stage in the translation of the C program. + * Also sizeof(int) does return the size in addressable units on all platforms, + * which may not necessarily be the size in bytes. + * Therefore, infer it from UINT_MAX if possible. */ +#ifndef UNITY_INT_WIDTH + #ifdef UINT_MAX + #if (UINT_MAX == 0xFFFF) + #define UNITY_INT_WIDTH (16) + #elif (UINT_MAX == 0xFFFFFFFF) + #define UNITY_INT_WIDTH (32) + #elif (UINT_MAX == 0xFFFFFFFFFFFFFFFF) + #define UNITY_INT_WIDTH (64) + #endif + #else /* Set to default */ + #define UNITY_INT_WIDTH (32) + #endif /* UINT_MAX */ +#endif + +/* Determine the size of a long, if not already specified. */ +#ifndef UNITY_LONG_WIDTH + #ifdef ULONG_MAX + #if (ULONG_MAX == 0xFFFF) + #define UNITY_LONG_WIDTH (16) + #elif (ULONG_MAX == 0xFFFFFFFF) + #define UNITY_LONG_WIDTH (32) + #elif (ULONG_MAX == 0xFFFFFFFFFFFFFFFF) + #define UNITY_LONG_WIDTH (64) + #endif + #else /* Set to default */ + #define UNITY_LONG_WIDTH (32) + #endif /* ULONG_MAX */ +#endif + +/* Determine the size of a pointer, if not already specified. */ +#ifndef UNITY_POINTER_WIDTH + #ifdef UINTPTR_MAX + #if (UINTPTR_MAX <= 0xFFFF) + #define UNITY_POINTER_WIDTH (16) + #elif (UINTPTR_MAX <= 0xFFFFFFFF) + #define UNITY_POINTER_WIDTH (32) + #elif (UINTPTR_MAX <= 0xFFFFFFFFFFFFFFFF) + #define UNITY_POINTER_WIDTH (64) + #endif + #else /* Set to default */ + #define UNITY_POINTER_WIDTH UNITY_LONG_WIDTH + #endif /* UINTPTR_MAX */ +#endif + +/*------------------------------------------------------- + * Int Support (Define types based on detected sizes) + *-------------------------------------------------------*/ + +#if (UNITY_INT_WIDTH == 32) + typedef unsigned char UNITY_UINT8; + typedef unsigned short UNITY_UINT16; + typedef unsigned int UNITY_UINT32; + typedef signed char UNITY_INT8; + typedef signed short UNITY_INT16; + typedef signed int UNITY_INT32; +#elif (UNITY_INT_WIDTH == 16) + typedef unsigned char UNITY_UINT8; + typedef unsigned int UNITY_UINT16; + typedef unsigned long UNITY_UINT32; + typedef signed char UNITY_INT8; + typedef signed int UNITY_INT16; + typedef signed long UNITY_INT32; +#else + #error Invalid UNITY_INT_WIDTH specified! (16 or 32 are supported) +#endif + +/*------------------------------------------------------- + * 64-bit Support + *-------------------------------------------------------*/ + +/* Auto-detect 64 Bit Support */ +#ifndef UNITY_SUPPORT_64 + #if UNITY_LONG_WIDTH == 64 || UNITY_POINTER_WIDTH == 64 + #define UNITY_SUPPORT_64 + #endif +#endif + +/* 64-Bit Support Dependent Configuration */ +#ifndef UNITY_SUPPORT_64 + /* No 64-bit Support */ + typedef UNITY_UINT32 UNITY_UINT; + typedef UNITY_INT32 UNITY_INT; + #define UNITY_MAX_NIBBLES (8) /* Maximum number of nibbles in a UNITY_(U)INT */ +#else + /* 64-bit Support */ + #if (UNITY_LONG_WIDTH == 32) + typedef unsigned long long UNITY_UINT64; + typedef signed long long UNITY_INT64; + #elif (UNITY_LONG_WIDTH == 64) + typedef unsigned long UNITY_UINT64; + typedef signed long UNITY_INT64; + #else + #error Invalid UNITY_LONG_WIDTH specified! (32 or 64 are supported) + #endif + typedef UNITY_UINT64 UNITY_UINT; + typedef UNITY_INT64 UNITY_INT; + #define UNITY_MAX_NIBBLES (16) /* Maximum number of nibbles in a UNITY_(U)INT */ +#endif + +/*------------------------------------------------------- + * Pointer Support + *-------------------------------------------------------*/ + +#if (UNITY_POINTER_WIDTH == 32) + #define UNITY_PTR_TO_INT UNITY_INT32 + #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX32 +#elif (UNITY_POINTER_WIDTH == 64) + #define UNITY_PTR_TO_INT UNITY_INT64 + #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX64 +#elif (UNITY_POINTER_WIDTH == 16) + #define UNITY_PTR_TO_INT UNITY_INT16 + #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX16 +#else + #error Invalid UNITY_POINTER_WIDTH specified! (16, 32 or 64 are supported) +#endif + +#ifndef UNITY_PTR_ATTRIBUTE + #define UNITY_PTR_ATTRIBUTE +#endif + +#ifndef UNITY_INTERNAL_PTR + #define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const void* +#endif + +/* optionally define UNITY_COMPARE_PTRS_ON_ZERO_ARRAY */ + +/*------------------------------------------------------- + * Float Support + *-------------------------------------------------------*/ + +#ifdef UNITY_EXCLUDE_FLOAT + +/* No Floating Point Support */ +#ifndef UNITY_EXCLUDE_DOUBLE +#define UNITY_EXCLUDE_DOUBLE /* Remove double when excluding float support */ +#endif +#ifndef UNITY_EXCLUDE_FLOAT_PRINT +#define UNITY_EXCLUDE_FLOAT_PRINT +#endif + +#else + +/* Floating Point Support */ +#ifndef UNITY_FLOAT_PRECISION +#define UNITY_FLOAT_PRECISION (0.00001f) +#endif +#ifndef UNITY_FLOAT_TYPE +#define UNITY_FLOAT_TYPE float +#endif +typedef UNITY_FLOAT_TYPE UNITY_FLOAT; + +/* isnan macro should be provided by math.h. Override if not macro */ +#ifndef UNITY_IS_NAN +#ifndef isnan +/* NaN is the only floating point value that does NOT equal itself. + * Therefore if n != n, then it is NaN. */ +#define UNITY_IS_NAN(n) ((n != n) ? 1 : 0) +#else +#define UNITY_IS_NAN(n) isnan(n) +#endif +#endif + +/* isinf macro should be provided by math.h. Override if not macro */ +#ifndef UNITY_IS_INF +#ifndef isinf +/* The value of Inf - Inf is NaN */ +#define UNITY_IS_INF(n) (UNITY_IS_NAN((n) - (n)) && !UNITY_IS_NAN(n)) +#else +#define UNITY_IS_INF(n) isinf(n) +#endif +#endif + +#endif + +/*------------------------------------------------------- + * Double Float Support + *-------------------------------------------------------*/ + +/* unlike float, we DON'T include by default */ +#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(UNITY_INCLUDE_DOUBLE) + + /* No Floating Point Support */ + #ifndef UNITY_EXCLUDE_DOUBLE + #define UNITY_EXCLUDE_DOUBLE + #else + #undef UNITY_INCLUDE_DOUBLE + #endif + + #ifndef UNITY_EXCLUDE_FLOAT + #ifndef UNITY_DOUBLE_TYPE + #define UNITY_DOUBLE_TYPE double + #endif + typedef UNITY_FLOAT UNITY_DOUBLE; + /* For parameter in UnityPrintFloat(UNITY_DOUBLE), which aliases to double or float */ + #endif + +#else + + /* Double Floating Point Support */ + #ifndef UNITY_DOUBLE_PRECISION + #define UNITY_DOUBLE_PRECISION (1e-12) + #endif + + #ifndef UNITY_DOUBLE_TYPE + #define UNITY_DOUBLE_TYPE double + #endif + typedef UNITY_DOUBLE_TYPE UNITY_DOUBLE; + +#endif + +/*------------------------------------------------------- + * Output Method: stdout (DEFAULT) + *-------------------------------------------------------*/ +#ifndef UNITY_OUTPUT_CHAR + /* Default to using putchar, which is defined in stdio.h */ + #include + #define UNITY_OUTPUT_CHAR(a) (void)putchar(a) +#else + /* If defined as something else, make sure we declare it here so it's ready for use */ + #ifdef UNITY_OUTPUT_CHAR_HEADER_DECLARATION + extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION; + #endif +#endif + +#ifndef UNITY_OUTPUT_FLUSH + #ifdef UNITY_USE_FLUSH_STDOUT + /* We want to use the stdout flush utility */ + #include + #define UNITY_OUTPUT_FLUSH() (void)fflush(stdout) + #else + /* We've specified nothing, therefore flush should just be ignored */ + #define UNITY_OUTPUT_FLUSH() (void)0 + #endif +#else + /* If defined as something else, make sure we declare it here so it's ready for use */ + #ifdef UNITY_OUTPUT_FLUSH_HEADER_DECLARATION + extern void UNITY_OUTPUT_FLUSH_HEADER_DECLARATION; + #endif +#endif + +#ifndef UNITY_OUTPUT_FLUSH +#define UNITY_FLUSH_CALL() +#else +#define UNITY_FLUSH_CALL() UNITY_OUTPUT_FLUSH() +#endif + +#ifndef UNITY_PRINT_EOL +#define UNITY_PRINT_EOL() UNITY_OUTPUT_CHAR('\n') +#endif + +#ifndef UNITY_OUTPUT_START +#define UNITY_OUTPUT_START() +#endif + +#ifndef UNITY_OUTPUT_COMPLETE +#define UNITY_OUTPUT_COMPLETE() +#endif + +#ifdef UNITY_INCLUDE_EXEC_TIME + #if !defined(UNITY_EXEC_TIME_START) && \ + !defined(UNITY_EXEC_TIME_STOP) && \ + !defined(UNITY_PRINT_EXEC_TIME) && \ + !defined(UNITY_TIME_TYPE) + /* If none any of these macros are defined then try to provide a default implementation */ + + #if defined(UNITY_CLOCK_MS) + /* This is a simple way to get a default implementation on platforms that support getting a millisecond counter */ + #define UNITY_TIME_TYPE UNITY_UINT + #define UNITY_EXEC_TIME_START() Unity.CurrentTestStartTime = UNITY_CLOCK_MS() + #define UNITY_EXEC_TIME_STOP() Unity.CurrentTestStopTime = UNITY_CLOCK_MS() + #define UNITY_PRINT_EXEC_TIME() { \ + UNITY_UINT execTimeMs = (Unity.CurrentTestStopTime - Unity.CurrentTestStartTime); \ + UnityPrint(" ("); \ + UnityPrintNumberUnsigned(execTimeMs); \ + UnityPrint(" ms)"); \ + } + #elif defined(_WIN32) + #include + #define UNITY_TIME_TYPE clock_t + #define UNITY_GET_TIME(t) t = (clock_t)((clock() * 1000) / CLOCKS_PER_SEC) + #define UNITY_EXEC_TIME_START() UNITY_GET_TIME(Unity.CurrentTestStartTime) + #define UNITY_EXEC_TIME_STOP() UNITY_GET_TIME(Unity.CurrentTestStopTime) + #define UNITY_PRINT_EXEC_TIME() { \ + UNITY_UINT execTimeMs = (Unity.CurrentTestStopTime - Unity.CurrentTestStartTime); \ + UnityPrint(" ("); \ + UnityPrintNumberUnsigned(execTimeMs); \ + UnityPrint(" ms)"); \ + } + #elif defined(__unix__) || defined(__APPLE__) + #include + #define UNITY_TIME_TYPE struct timespec + #define UNITY_GET_TIME(t) clock_gettime(CLOCK_MONOTONIC, &t) + #define UNITY_EXEC_TIME_START() UNITY_GET_TIME(Unity.CurrentTestStartTime) + #define UNITY_EXEC_TIME_STOP() UNITY_GET_TIME(Unity.CurrentTestStopTime) + #define UNITY_PRINT_EXEC_TIME() { \ + UNITY_UINT execTimeMs = ((Unity.CurrentTestStopTime.tv_sec - Unity.CurrentTestStartTime.tv_sec) * 1000L); \ + execTimeMs += ((Unity.CurrentTestStopTime.tv_nsec - Unity.CurrentTestStartTime.tv_nsec) / 1000000L); \ + UnityPrint(" ("); \ + UnityPrintNumberUnsigned(execTimeMs); \ + UnityPrint(" ms)"); \ + } + #endif + #endif +#endif + +#ifndef UNITY_EXEC_TIME_START +#define UNITY_EXEC_TIME_START() do { /* nothing*/ } while (0) +#endif + +#ifndef UNITY_EXEC_TIME_STOP +#define UNITY_EXEC_TIME_STOP() do { /* nothing*/ } while (0) +#endif + +#ifndef UNITY_TIME_TYPE +#define UNITY_TIME_TYPE UNITY_UINT +#endif + +#ifndef UNITY_PRINT_EXEC_TIME +#define UNITY_PRINT_EXEC_TIME() do { /* nothing*/ } while (0) +#endif + +/*------------------------------------------------------- + * Footprint + *-------------------------------------------------------*/ + +#ifndef UNITY_LINE_TYPE +#define UNITY_LINE_TYPE UNITY_UINT +#endif + +#ifndef UNITY_COUNTER_TYPE +#define UNITY_COUNTER_TYPE UNITY_UINT +#endif + +/*------------------------------------------------------- + * Internal Structs Needed + *-------------------------------------------------------*/ + +typedef void (*UnityTestFunction)(void); + +#define UNITY_DISPLAY_RANGE_INT (0x10) +#define UNITY_DISPLAY_RANGE_UINT (0x20) +#define UNITY_DISPLAY_RANGE_HEX (0x40) +#define UNITY_DISPLAY_RANGE_CHAR (0x80) + +typedef enum +{ + UNITY_DISPLAY_STYLE_INT = (UNITY_INT_WIDTH / 8) + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT8 = 1 + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT16 = 2 + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT32 = 4 + UNITY_DISPLAY_RANGE_INT, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_INT64 = 8 + UNITY_DISPLAY_RANGE_INT, +#endif + + UNITY_DISPLAY_STYLE_UINT = (UNITY_INT_WIDTH / 8) + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT8 = 1 + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT16 = 2 + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT32 = 4 + UNITY_DISPLAY_RANGE_UINT, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_UINT64 = 8 + UNITY_DISPLAY_RANGE_UINT, +#endif + + UNITY_DISPLAY_STYLE_HEX8 = 1 + UNITY_DISPLAY_RANGE_HEX, + UNITY_DISPLAY_STYLE_HEX16 = 2 + UNITY_DISPLAY_RANGE_HEX, + UNITY_DISPLAY_STYLE_HEX32 = 4 + UNITY_DISPLAY_RANGE_HEX, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_HEX64 = 8 + UNITY_DISPLAY_RANGE_HEX, +#endif + + UNITY_DISPLAY_STYLE_CHAR = 1 + UNITY_DISPLAY_RANGE_CHAR + UNITY_DISPLAY_RANGE_INT, + + UNITY_DISPLAY_STYLE_UNKNOWN +} UNITY_DISPLAY_STYLE_T; + +typedef enum +{ + UNITY_WITHIN = 0x0, + UNITY_EQUAL_TO = 0x1, + UNITY_GREATER_THAN = 0x2, + UNITY_GREATER_OR_EQUAL = 0x2 + UNITY_EQUAL_TO, + UNITY_SMALLER_THAN = 0x4, + UNITY_SMALLER_OR_EQUAL = 0x4 + UNITY_EQUAL_TO, + UNITY_NOT_EQUAL = 0x0, + UNITY_UNKNOWN +} UNITY_COMPARISON_T; + +#ifndef UNITY_EXCLUDE_FLOAT +typedef enum UNITY_FLOAT_TRAIT +{ + UNITY_FLOAT_IS_NOT_INF = 0, + UNITY_FLOAT_IS_INF, + UNITY_FLOAT_IS_NOT_NEG_INF, + UNITY_FLOAT_IS_NEG_INF, + UNITY_FLOAT_IS_NOT_NAN, + UNITY_FLOAT_IS_NAN, + UNITY_FLOAT_IS_NOT_DET, + UNITY_FLOAT_IS_DET, + UNITY_FLOAT_INVALID_TRAIT +} UNITY_FLOAT_TRAIT_T; +#endif + +typedef enum +{ + UNITY_ARRAY_TO_VAL = 0, + UNITY_ARRAY_TO_ARRAY, + UNITY_ARRAY_UNKNOWN +} UNITY_FLAGS_T; + +struct UNITY_STORAGE_T +{ + const char* TestFile; + const char* CurrentTestName; +#ifndef UNITY_EXCLUDE_DETAILS + const char* CurrentDetail1; + const char* CurrentDetail2; +#endif + UNITY_LINE_TYPE CurrentTestLineNumber; + UNITY_COUNTER_TYPE NumberOfTests; + UNITY_COUNTER_TYPE TestFailures; + UNITY_COUNTER_TYPE TestIgnores; + UNITY_COUNTER_TYPE CurrentTestFailed; + UNITY_COUNTER_TYPE CurrentTestIgnored; +#ifdef UNITY_INCLUDE_EXEC_TIME + UNITY_TIME_TYPE CurrentTestStartTime; + UNITY_TIME_TYPE CurrentTestStopTime; +#endif +#ifndef UNITY_EXCLUDE_SETJMP_H + jmp_buf AbortFrame; +#endif +}; + +extern struct UNITY_STORAGE_T Unity; + +/*------------------------------------------------------- + * Test Suite Management + *-------------------------------------------------------*/ + +void UnityBegin(const char* filename); +int UnityEnd(void); +void UnitySetTestFile(const char* filename); +void UnityConcludeTest(void); + +#ifndef RUN_TEST +void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum); +#else +#define UNITY_SKIP_DEFAULT_RUNNER +#endif + +/*------------------------------------------------------- + * Details Support + *-------------------------------------------------------*/ + +#ifdef UNITY_EXCLUDE_DETAILS +#define UNITY_CLR_DETAILS() +#define UNITY_SET_DETAIL(d1) +#define UNITY_SET_DETAILS(d1,d2) +#else +#define UNITY_CLR_DETAILS() do { Unity.CurrentDetail1 = 0; Unity.CurrentDetail2 = 0; } while (0) +#define UNITY_SET_DETAIL(d1) do { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = 0; } while (0) +#define UNITY_SET_DETAILS(d1,d2) do { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = (d2); } while (0) + +#ifndef UNITY_DETAIL1_NAME +#define UNITY_DETAIL1_NAME "Function" +#endif + +#ifndef UNITY_DETAIL2_NAME +#define UNITY_DETAIL2_NAME "Argument" +#endif +#endif + +#ifdef UNITY_PRINT_TEST_CONTEXT +void UNITY_PRINT_TEST_CONTEXT(void); +#endif + +/*------------------------------------------------------- + * Test Output + *-------------------------------------------------------*/ + +void UnityPrint(const char* string); + +#ifdef UNITY_INCLUDE_PRINT_FORMATTED +void UnityPrintF(const UNITY_LINE_TYPE line, const char* format, ...); +#endif + +void UnityPrintLen(const char* string, const UNITY_UINT32 length); +void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number); +void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style); +void UnityPrintNumber(const UNITY_INT number_to_print); +void UnityPrintNumberUnsigned(const UNITY_UINT number); +void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print); + +#ifndef UNITY_EXCLUDE_FLOAT_PRINT +void UnityPrintFloat(const UNITY_DOUBLE input_number); +#endif + +/*------------------------------------------------------- + * Test Assertion Functions + *------------------------------------------------------- + * Use the macros below this section instead of calling + * these directly. The macros have a consistent naming + * convention and will pull in file and line information + * for you. */ + +void UnityAssertEqualNumber(const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold, + const UNITY_INT actual, + const UNITY_COMPARISON_T compare, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags); + +void UnityAssertBits(const UNITY_INT mask, + const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualString(const char* expected, + const char* actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualStringLen(const char* expected, + const char* actual, + const UNITY_UINT32 length, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualStringArray( UNITY_INTERNAL_PTR expected, + const char** actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); + +void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 length, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); + +void UnityAssertNumbersWithin(const UNITY_UINT delta, + const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertNumbersArrayWithin(const UNITY_UINT delta, + UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags); + +#ifndef UNITY_EXCLUDE_SETJMP_H +UNITY_NORETURN void UnityFail(const char* message, const UNITY_LINE_TYPE line); +UNITY_NORETURN void UnityIgnore(const char* message, const UNITY_LINE_TYPE line); +#else +void UnityFail(const char* message, const UNITY_LINE_TYPE line); +void UnityIgnore(const char* message, const UNITY_LINE_TYPE line); +#endif + +void UnityMessage(const char* message, const UNITY_LINE_TYPE line); + +#ifndef UNITY_EXCLUDE_FLOAT +void UnityAssertFloatsWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertFloatsNotWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertGreaterOrLessFloat(const UNITY_FLOAT threshold, + const UNITY_FLOAT actual, + const UNITY_COMPARISON_T compare, + const char* msg, + const UNITY_LINE_TYPE linenumber); + +void UnityAssertWithinFloatArray(const UNITY_FLOAT delta, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); + +void UnityAssertFloatSpecial(const UNITY_FLOAT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style); +#endif + +#ifndef UNITY_EXCLUDE_DOUBLE +void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertDoublesNotWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertGreaterOrLessDouble(const UNITY_DOUBLE threshold, + const UNITY_DOUBLE actual, + const UNITY_COMPARISON_T compare, + const char* msg, + const UNITY_LINE_TYPE linenumber); + +void UnityAssertWithinDoubleArray(const UNITY_DOUBLE delta, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); + +void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style); +#endif + +/*------------------------------------------------------- + * Helpers + *-------------------------------------------------------*/ + +UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size); +#ifndef UNITY_EXCLUDE_FLOAT +UNITY_INTERNAL_PTR UnityFloatToPtr(const float num); +#endif +#ifndef UNITY_EXCLUDE_DOUBLE +UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num); +#endif + +/*------------------------------------------------------- + * Error Strings We Might Need + *-------------------------------------------------------*/ + +extern const char UnityStrOk[]; +extern const char UnityStrPass[]; +extern const char UnityStrFail[]; +extern const char UnityStrIgnore[]; + +extern const char UnityStrErrFloat[]; +extern const char UnityStrErrDouble[]; +extern const char UnityStrErr64[]; +extern const char UnityStrErrShorthand[]; + +/*------------------------------------------------------- + * Test Running Macros + *-------------------------------------------------------*/ + +#ifdef UNITY_TEST_PROTECT +#define TEST_PROTECT() UNITY_TEST_PROTECT() +#else +#ifndef UNITY_EXCLUDE_SETJMP_H +#define TEST_PROTECT() (setjmp(Unity.AbortFrame) == 0) +#else +#define TEST_PROTECT() 1 +#endif +#endif + +#ifdef UNITY_TEST_ABORT +#define TEST_ABORT() UNITY_TEST_ABORT() +#else +#ifndef UNITY_EXCLUDE_SETJMP_H +#define TEST_ABORT() longjmp(Unity.AbortFrame, 1) +#else +#define TEST_ABORT() return +#endif +#endif + +/* Automatically enable variadic macros support, if it not enabled before */ +#ifndef UNITY_SUPPORT_VARIADIC_MACROS + #ifdef __STDC_VERSION__ + #if __STDC_VERSION__ >= 199901L + #define UNITY_SUPPORT_VARIADIC_MACROS + #endif + #endif +#endif + +/* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */ +#ifndef RUN_TEST +#ifdef UNITY_SUPPORT_VARIADIC_MACROS +#define RUN_TEST(...) RUN_TEST_AT_LINE(__VA_ARGS__, __LINE__, throwaway) +#define RUN_TEST_AT_LINE(func, line, ...) UnityDefaultTestRun(func, #func, line) +#endif +#endif + +/* Enable default macros for masking param tests test cases */ +#ifdef UNITY_SUPPORT_TEST_CASES + #ifdef UNITY_SUPPORT_VARIADIC_MACROS + #if !defined(TEST_CASE) && !defined(UNITY_EXCLUDE_TEST_CASE) + #define TEST_CASE(...) + #endif + #if !defined(TEST_RANGE) && !defined(UNITY_EXCLUDE_TEST_RANGE) + #define TEST_RANGE(...) + #endif + #if !defined(TEST_MATRIX) && !defined(UNITY_EXCLUDE_TEST_MATRIX) + #define TEST_MATRIX(...) + #endif + #endif +#endif + +/* If we can't do the tricky version, we'll just have to require them to always include the line number */ +#ifndef RUN_TEST +#ifdef CMOCK +#define RUN_TEST(func, num) UnityDefaultTestRun(func, #func, num) +#else +#define RUN_TEST(func) UnityDefaultTestRun(func, #func, __LINE__) +#endif +#endif + +#define TEST_LINE_NUM (Unity.CurrentTestLineNumber) +#define TEST_IS_IGNORED (Unity.CurrentTestIgnored) +#define UNITY_NEW_TEST(a) \ + Unity.CurrentTestName = (a); \ + Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)(__LINE__); \ + Unity.NumberOfTests++; + +#ifndef UNITY_BEGIN +#define UNITY_BEGIN() UnityBegin(__FILE__) +#endif + +#ifndef UNITY_END +#define UNITY_END() UnityEnd() +#endif + +#ifndef UNITY_SHORTHAND_AS_INT +#ifndef UNITY_SHORTHAND_AS_MEM +#ifndef UNITY_SHORTHAND_AS_NONE +#ifndef UNITY_SHORTHAND_AS_RAW +#define UNITY_SHORTHAND_AS_OLD +#endif +#endif +#endif +#endif + +/*----------------------------------------------- + * Command Line Argument Support + *-----------------------------------------------*/ + +#ifdef UNITY_USE_COMMAND_LINE_ARGS +int UnityParseOptions(int argc, char** argv); +int UnityTestMatches(void); +#endif + +/*------------------------------------------------------- + * Basic Fail and Ignore + *-------------------------------------------------------*/ + +#define UNITY_TEST_FAIL(line, message) UnityFail( (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_IGNORE(line, message) UnityIgnore( (message), (UNITY_LINE_TYPE)(line)) + +/*------------------------------------------------------- + * Test Asserts + *-------------------------------------------------------*/ + +#define UNITY_TEST_ASSERT(condition, line, message) do { if (condition) { /* nothing*/ } else { UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), (message)); } } while (0) +#define UNITY_TEST_ASSERT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) == NULL), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) != NULL), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_EMPTY(pointer, line, message) UNITY_TEST_ASSERT(((pointer[0]) == 0), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_EMPTY(pointer, line, message) UNITY_TEST_ASSERT(((pointer[0]) != 0), (UNITY_LINE_TYPE)(line), (message)) + +#define UNITY_TEST_ASSERT_EQUAL_INT(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_EQUAL_INT8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_EQUAL_INT16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_EQUAL_INT32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_EQUAL_UINT(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_EQUAL_UINT8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_EQUAL_UINT16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_EQUAL_UINT32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_EQUAL_HEX8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_EQUAL_HEX16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_EQUAL_HEX32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_EQUAL_CHAR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) +#define UNITY_TEST_ASSERT_BITS(mask, expected, actual, line, message) UnityAssertBits((UNITY_INT)(mask), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line)) + +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_NOT_EQUAL_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_GREATER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_GREATER_THAN_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT) (threshold), (UNITY_INT) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 ) (threshold), (UNITY_INT)(UNITY_INT8 ) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16) (threshold), (UNITY_INT)(UNITY_INT16) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32) (threshold), (UNITY_INT)(UNITY_INT32) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT) (threshold), (UNITY_INT) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 ) (threshold), (UNITY_INT)(UNITY_INT8 ) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT) (threshold), (UNITY_INT) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 ) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT) (threshold), (UNITY_INT) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 ) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_INT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin( (delta), (UNITY_INT) (expected), (UNITY_INT) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_INT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_INT8 ) (expected), (UNITY_INT)(UNITY_INT8 ) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_INT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_INT16) (expected), (UNITY_INT)(UNITY_INT16) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_INT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_INT32) (expected), (UNITY_INT)(UNITY_INT32) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_UINT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin( (delta), (UNITY_INT) (expected), (UNITY_INT) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_UINT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_UINT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_UINT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_HEX8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_CHAR_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_INT8 ) (expected), (UNITY_INT)(UNITY_INT8 ) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_INT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin( (delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8 )(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT16)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT32)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin( (delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8 )(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT16)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT32)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8 )(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT16)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT32)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8 )(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR, UNITY_ARRAY_TO_ARRAY) + + +#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_PTR_TO_INT)(expected), (UNITY_PTR_TO_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char*)(expected), (const char*)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char*)(expected), (const char*)(actual), (UNITY_UINT32)(len), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), 1, (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) + +#define UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR, UNITY_ARRAY_TO_ARRAY) + +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) (expected), (UNITY_INT_WIDTH / 8)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) (expected), (UNITY_INT_WIDTH / 8)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT16)(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT32)(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_PTR_TO_INT) (expected), (UNITY_POINTER_WIDTH / 8)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_CHAR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR, UNITY_ARRAY_TO_VAL) + +#ifdef UNITY_SUPPORT_64 +#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT64)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT64)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT64)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) +#else +#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#endif + +#ifdef UNITY_EXCLUDE_FLOAT +#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#else +#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsWithin((UNITY_FLOAT)(delta), (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsNotWithin((UNITY_FLOAT)(delta), (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((UNITY_FLOAT)(expected) * (UNITY_FLOAT)UNITY_FLOAT_PRECISION, (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN((UNITY_FLOAT)(expected) * (UNITY_FLOAT)UNITY_FLOAT_PRECISION, (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertWithinFloatArray((UNITY_FLOAT)(delta), (const UNITY_FLOAT*)(expected), (const UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UnityAssertWithinFloatArray((UNITY_FLOAT)0, (const UNITY_FLOAT*)(expected), (const UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UnityAssertWithinFloatArray((UNITY_FLOAT)0, UnityFloatToPtr(expected), (const UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) +#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) +#endif + +#ifdef UNITY_EXCLUDE_DOUBLE +#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#else +#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesNotWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((UNITY_DOUBLE)(expected) * (UNITY_DOUBLE)UNITY_DOUBLE_PRECISION, (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN((UNITY_DOUBLE)(expected) * (UNITY_DOUBLE)UNITY_DOUBLE_PRECISION, (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertWithinDoubleArray((UNITY_DOUBLE)(delta), (const UNITY_DOUBLE*)(expected), (const UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertWithinDoubleArray((UNITY_DOUBLE)0, (const UNITY_DOUBLE*)(expected), (const UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UnityAssertWithinDoubleArray((UNITY_DOUBLE)0, UnityDoubleToPtr(expected), (const UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) +#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) +#endif + +/* End of UNITY_INTERNALS_H */ +#endif From 7aeb85708334e2923dca2db835929d609b534f65 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Fri, 5 Apr 2024 20:34:24 -0700 Subject: [PATCH 06/68] add debug level def and a print statement in velocity --- makefile | 2 +- src/macros.h | 14 +++++++++++++- src/velocity.c | 5 ++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/makefile b/makefile index ff8cba0..49397f6 100644 --- a/makefile +++ b/makefile @@ -36,7 +36,7 @@ LFLAG= -lm # Set build mode ifeq ($(mode),debug) - CFLAGS = -g -Wall -O0 -I. -I$(PATHU) -I$(PATHS) -DTEST + CFLAGS = -g -Wall -O0 -I. -I$(PATHU) -I$(PATHS) -DTEST -DDEBUG_LEVEL=1 else mode = release CFLAGS = -Wall -O3 -I. -I$(PATHU) -I$(PATHS) -DTEST diff --git a/src/macros.h b/src/macros.h index e71b384..d15ef62 100644 --- a/src/macros.h +++ b/src/macros.h @@ -39,4 +39,16 @@ #define SHORTSTRING 100 #define LONGSTRING 200 -#endif \ No newline at end of file +#ifdef DEBUG_LEVEL +#if DEBUG_LEVEL >= 3 +#define DEBUG_3 +#endif +#if DEBUG_LEVEL >= 2 +#define DEBUG_2 +#endif +#if DEBUG_LEVEL >= 1 +#define DEBUG_1 +#endif +#endif + +#endif diff --git a/src/velocity.c b/src/velocity.c index 508b542..8d0069c 100644 --- a/src/velocity.c +++ b/src/velocity.c @@ -480,7 +480,10 @@ void GetVelocity_Unstructured(const double tq, LagrangianPoint *pt, double *dXdt double r, s, t, d; double V; double tloc; - + + #ifdef DEBUG_1 + printf("DEBUG:1 velocity.c:GetVelocity_Unstructured ElementIndex = %d \n", pt->ElementIndex); + #endif if(pt->ElementIndex == -1) FatalError("Attempting to interpolate velocity at point with Element_Index = -1"); From 909f39b280f9db9943158a6364ab4a399945a431 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Fri, 5 Apr 2024 21:14:16 -0700 Subject: [PATCH 07/68] initialize all indexes to 0, implement index overflow check --- src/ftle.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/ftle.c b/src/ftle.c index 224beb0..d8baa81 100644 --- a/src/ftle.c +++ b/src/ftle.c @@ -29,6 +29,7 @@ void InitializeFTLEArray(void) { int ss, i, j, k, seed = -1, index = -1, found = 0, guess = -1, iguess = -1, jguess = -1, count = 0 ,count_report =0; + int percentage = 0; //int foundGS = 0, percentage = 0 ; double Xseed[3]; //double FTLE_outside = -1.0; /* Used to mask FTLE values outside of domain */ @@ -73,6 +74,7 @@ void InitializeFTLEArray(void) { FTLE_MeshPt[i][j][k].HaveFTLE = 0; FTLE_MeshPt[i][j][k].Pt.LeftDomain = 0; FTLE_MeshPt[i][j][k].Pt.LeftDomainTime = 0.0; + FTLE_MeshPt[i][j][k].Pt.ElementIndex = -1; global_search_success[i][j][k].searched = 0; global_search_success[i][j][k].found = 0; @@ -114,7 +116,8 @@ void InitializeFTLEArray(void) { if(!FTLE_MeshPt[i][j][k].Pt.LeftDomain) { count++; - //todo wrap this into a #ifdef DEBUG_3 + #ifdef DEBUG_1 + // If debugging, print the status every 1000 points if (count>count_report){ printf( "found: %d, searched:%d total to search %d \n", @@ -122,16 +125,17 @@ void InitializeFTLEArray(void) { count, FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes); fflush(stdout); - count_report+=100; + count_report+=1000; } + #endif // Original report in 10% increments - /* if(100 * count / (FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes) > percentage) { */ - /* printf(" %d%%", percentage); */ - /* fflush(stdout); */ - /* percentage = percentage + 10; */ - /* } */ - // + if(100 * count / (FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes) > percentage) { + printf(" %d%%", percentage); + fflush(stdout); + percentage = percentage + 10; + } + index = -1; //if we dont have a seed yet, try a global search @@ -157,7 +161,10 @@ void InitializeFTLEArray(void) { if(index < 0 && seed >=0) { index = Get_Element_Local_Search(FTLE_MeshPt[i][j][k].Pt.X, seed); } - + + if (index < -1){ + FatalError("Incorrect Index (likely overflow): Index = %d \n", index); + }; //If we found a point if (index >= 0){ From 4ded652e84fbaec52698664c8f32e70bb9dd0d03 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Fri, 5 Apr 2024 21:22:59 -0700 Subject: [PATCH 08/68] add index overflow checking to global check --- src/ftle.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ftle.c b/src/ftle.c index d8baa81..1314b95 100644 --- a/src/ftle.c +++ b/src/ftle.c @@ -861,6 +861,10 @@ void global_search_check(int max_loops, int count_report_interval, int *found, S index = Get_Element_Global_Search(FTLE_MeshPt[i][j][k].Pt.X); global_search_success[i][j][k].searched = 1; // record that this point saw a global search + if (index < -1){ + FatalError("Incorrect Index (likely overflow): Index = %d \n", index); + }; + if(index >= 0){ global_search_success[i][j][k].found =1; From 09e6c0ceec1118fd7c2e1baf511abbb06e990cbf Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Fri, 5 Apr 2024 22:25:06 -0700 Subject: [PATCH 09/68] add dont compute for points not found --- src/ftle.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/ftle.c b/src/ftle.c index 1314b95..96b8cd5 100644 --- a/src/ftle.c +++ b/src/ftle.c @@ -196,7 +196,29 @@ void InitializeFTLEArray(void) { /* // Try a global search for points next to found points */ if(LocalSearchChecking){ global_search_check(10000, 100, &found,global_search_success); + } + // + + //Dont compute the FTLE for any points (or neighbors) that were not found + for(i = 0; i < FTLE_CartMesh.XRes; i++) { + for(j = 0; j < FTLE_CartMesh.YRes; j++) { + for(k = 0; k < FTLE_CartMesh.ZRes; k++) { + if(global_search_success[i][j][k].found != 1) { + FTLE_dont_compute(i,j,k); + FTLE_dont_compute_neighbors( + i, + j, + k, + FTLE_CartMesh.XRes, + FTLE_CartMesh.YRes, + FTLE_CartMesh.ZRes + ); + } + } + } + } + //else printf(" %d of %d located in domain\n", found, FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes); From abdf0ee39b6b4c06c96b3045b88d4824308d4711 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Sat, 6 Apr 2024 10:14:11 -0700 Subject: [PATCH 10/68] wrap global print into debug level 1 --- src/ftle.c | 6 ++++-- src/velocity.c | 4 +--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ftle.c b/src/ftle.c index 96b8cd5..9aa0966 100644 --- a/src/ftle.c +++ b/src/ftle.c @@ -842,8 +842,8 @@ void global_search_check(int max_loops, int count_report_interval, int *found, S global_count_total =0; stop = 0; loops = 0; - - + printf("Starting Global Search Checking \n"); + while (stop==0){ global_count = 0; loops++; @@ -853,6 +853,7 @@ void global_search_check(int max_loops, int count_report_interval, int *found, S for(j = 1; j < FTLE_CartMesh.YRes-1; j++) { for(k = 1; k < FTLE_CartMesh.ZRes-1; k++) { count++; + #ifdef Debug_1 if (count>count_report){ printf( "found: %d, from local: %d: this loop: %d, searched:%d total to search %d \n", @@ -864,6 +865,7 @@ void global_search_check(int max_loops, int count_report_interval, int *found, S fflush(stdout); count_report+=count_report_interval; } + #endif //If my point has not had a global search me = global_search_success[i][j][k].searched; diff --git a/src/velocity.c b/src/velocity.c index 8d0069c..fe048d5 100644 --- a/src/velocity.c +++ b/src/velocity.c @@ -481,9 +481,7 @@ void GetVelocity_Unstructured(const double tq, LagrangianPoint *pt, double *dXdt double V; double tloc; - #ifdef DEBUG_1 - printf("DEBUG:1 velocity.c:GetVelocity_Unstructured ElementIndex = %d \n", pt->ElementIndex); - #endif + if(pt->ElementIndex == -1) FatalError("Attempting to interpolate velocity at point with Element_Index = -1"); From 0b3dd9c726558c5105ae2afec5856c54faf8d140 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Sat, 6 Apr 2024 10:19:13 -0700 Subject: [PATCH 11/68] correct Debug_1 to DEBUG_1 in ftle --- src/ftle.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ftle.c b/src/ftle.c index 9aa0966..3bb7262 100644 --- a/src/ftle.c +++ b/src/ftle.c @@ -853,7 +853,7 @@ void global_search_check(int max_loops, int count_report_interval, int *found, S for(j = 1; j < FTLE_CartMesh.YRes-1; j++) { for(k = 1; k < FTLE_CartMesh.ZRes-1; k++) { count++; - #ifdef Debug_1 + #ifdef DEBUG_1 if (count>count_report){ printf( "found: %d, from local: %d: this loop: %d, searched:%d total to search %d \n", From a3d83cb8b48b93a1ef907788db930271d48e9b00 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Sat, 6 Apr 2024 10:21:38 -0700 Subject: [PATCH 12/68] update report interval to 100000 --- src/ftle.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ftle.c b/src/ftle.c index 3bb7262..b0ac491 100644 --- a/src/ftle.c +++ b/src/ftle.c @@ -195,7 +195,7 @@ void InitializeFTLEArray(void) { /* // Try a global search for points next to found points */ if(LocalSearchChecking){ - global_search_check(10000, 100, &found,global_search_success); + global_search_check(100000, 100000, &found,global_search_success); } // From d84e17c9a9ac859bbf7c0179a604275282b3c71b Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Thu, 6 Feb 2025 01:03:43 -0700 Subject: [PATCH 13/68] Unit Testing (#6) * wip: create Testftle (not compiling) * get a mymath unit test running * test my_math * remove test directory from git ignore * add unit_tests for my_math functions * remove scratch files used to setup testing framework * remove include io.h from test case * move testing over to ceedling * enable ceedling release * test a github actions work flow * update yaml syntax * update ruby version * create an empty .gitignore in the test/support directory directory exists * break a test to make sure it fails * fix test back to passing * add gcov * update gh actions to use gcov * add gcovr install step to gh actions * test if i can run ceedling from gcov * change gcovr to pip install * add cobertua coverage report * try code cov * add codecove secret to repo * add code coverage file back in * update gh actions to show coverage report for debugging * fix typo in path * test removing the coverage file path again * change readme to an orgfile * try add src to gcov * test coverage * revert to gcov * add strainrate test file * fix includes * readme updates * update readme * fix readme typo --- .github/workflows/tests.yml | 27 +++ README.md | 16 -- README.org | 57 +++++ makefile | 8 +- project.yml | 404 ++++++++++++++++++++++++++++++++++++ src/ftle.c | 3 +- src/scratch.c | 9 - src/scratch.h | 3 - test/Testscratch.c | 29 --- test/support/.gitignore | 0 test/test_mymath.c | 117 +++++++++++ test/test_strainrate.c | 22 ++ unity/src/unity_config.h | 251 ++++++++++++++++++++++ 13 files changed, 884 insertions(+), 62 deletions(-) create mode 100644 .github/workflows/tests.yml delete mode 100644 README.md create mode 100644 README.org create mode 100644 project.yml delete mode 100644 src/scratch.c delete mode 100644 src/scratch.h delete mode 100644 test/Testscratch.c create mode 100644 test/support/.gitignore create mode 100644 test/test_mymath.c create mode 100644 test/test_strainrate.c create mode 100644 unity/src/unity_config.h diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..523ad32 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,27 @@ +name: Tests + +on: + - push + - pull_request + +jobs: + test: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.0' + - name: Install Ceedling + run: gem install ceedling + - name: Install gcovr + run: pip install gcovr + - name: Run Unit tests + run: ceedling gcov:all + - name: Upload coverage report to Codecov + uses: codecov/codecov-action@v5 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/README.md b/README.md deleted file mode 100644 index 6f40ee0..0000000 --- a/README.md +++ /dev/null @@ -1,16 +0,0 @@ -flowVC -====== - -Flow Visualization Code - - -Forked from FlowPhysics/flowVC -Copyright 2013 Shadden Research Group. All rights reserved. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.org b/README.org new file mode 100644 index 0000000..490e5fd --- /dev/null +++ b/README.org @@ -0,0 +1,57 @@ +* flowVC + +Flow Visualization Code forked from FlowPhysics/flowVC + +[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/actions/workflows/tests.yml/badge.svg]] +[[https://codecov.io/gh/bkm82/flowVC][https://codecov.io/gh/bkm82/flowVC/graph/badge.svg?token=1U1152BG8T]] + + +Copyright 2013 Shadden Research Group. All rights reserved. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +** Installation +*** Binaries +Currently this project does not have any pre-build binaries, so the code must be build from source. Reference the Development section below. +*** Development +**** Dependencies +[[https://www.ruby-lang.org/en/][Ruby]] > v 3.0: A programing language used for Ceedling + +[[https://github.com/ThrowTheSwitch/Ceedling][Ceedling]] : A collection of tools for C project including Unity and CMock for testing + +gcovr: a code coverage reporter + +**** Instalation +1. Install [[https://www.ruby-lang.org/en/][Ruby]] + +2. Install Ceedling gem from the RubyGems repository + #+begin_src shell + gem install ceedling + #+end_src +3. Install gcovr + #+begin_src shell + sudo apt install gcovr + #+end_src +4. Clone the repository + #+begin_src shell + https://github.com/bkm82/flowVC.git + cd flowVC + #+end_src +5. To compile and run all of the tests, run + #+begin_src shell + ceedling test:all + #+end_src +6. To build the relese run + + #+begin_src shell + ceedling release + #+end_src + this will create the ./build/release/flowVC.out executable + + diff --git a/makefile b/makefile index 49397f6..e41abfd 100644 --- a/makefile +++ b/makefile @@ -36,10 +36,10 @@ LFLAG= -lm # Set build mode ifeq ($(mode),debug) - CFLAGS = -g -Wall -O0 -I. -I$(PATHU) -I$(PATHS) -DTEST -DDEBUG_LEVEL=1 + CFLAGS = -g -Wall -O0 -I. -I$(PATHU) -I$(PATHS) -DTEST -DUNITY_INCLUDE_CONFIG_H -DDEBUG_LEVEL=1 else mode = release - CFLAGS = -Wall -O3 -I. -I$(PATHU) -I$(PATHS) -DTEST + CFLAGS = -Wall -O3 -I. -I$(PATHU) -I$(PATHS) -DTEST -DUNITY_INCLUDE_CONFIG_H endif @@ -97,8 +97,8 @@ test: $(BUILD_PATHS) $(RESULTS) $(PATHR)%.txt: $(PATHB)%.$(TARGET_EXTENSION) -./$< > $@ 2>&1 -$(PATHB)Test%.$(TARGET_EXTENSION): $(PATHO)Test%.o $(PATHO)%.o $(PATHO)unity.o - $(LINK) -o $@ $^ +$(PATHB)Test%.$(TARGET_EXTENSION): $(PATHO)Test%.o $(PATHO)%.o $(PATHO)unity.o build/objs/io.o + $(LINK) -o $@ $^ $(LFLAG) $(PATHO)%.o:: $(PATHT)%.c $(COMPILE) $(CFLAGS) $< -o $@ diff --git a/project.yml b/project.yml new file mode 100644 index 0000000..1ad2a48 --- /dev/null +++ b/project.yml @@ -0,0 +1,404 @@ +# ========================================================================= +# Ceedling - Test-Centered Build System for C +# ThrowTheSwitch.org +# Copyright (c) 2010-25 Mike Karlesky, Mark VanderVoord, & Greg Williams +# SPDX-License-Identifier: MIT +# ========================================================================= + +--- +:project: + # how to use ceedling. If you're not sure, leave this as `gem` and `?` + :which_ceedling: gem + :ceedling_version: 1.0.1 + + # optional features. If you don't need them, keep them turned off for performance + :use_mocks: TRUE + :use_test_preprocessor: :none # options are :none, :mocks, :tests, or :all + :use_deep_preprocessor: :none # options are :none, :mocks, :tests, or :all + :use_backtrace: :simple # options are :none, :simple, or :gdb + :use_decorators: :auto # decorate Ceedling's output text. options are :auto, :all, or :none + + # tweak the way ceedling handles automatic tasks + :build_root: build + :test_file_prefix: test_ + :default_tasks: + - test:all + + # performance options. If your tools start giving mysterious errors, consider + # dropping this to 1 to force single-tasking + :test_threads: 8 + :compile_threads: 8 + + # enable release build (more details in release_build section below) + :release_build: TRUE + +# Specify where to find mixins and any that should be enabled automatically +:mixins: + :enabled: [] + :load_paths: [] + +# further details to configure the way Ceedling handles test code +:test_build: + :use_assembly: FALSE + +# further details to configure the way Ceedling handles release code +:release_build: + :output: flowVC.out + :use_assembly: FALSE + :artifacts: [] + +# Plugins are optional Ceedling features which can be enabled. Ceedling supports +# a variety of plugins which may effect the way things are compiled, reported, +# or may provide new command options. Refer to the readme in each plugin for +# details on how to use it. +:plugins: + :load_paths: + :enabled: + #- beep # beeps when finished, so you don't waste time waiting for ceedling + - module_generator # handy for quickly creating source, header, and test templates + - gcov # test coverage using gcov. Requires gcc, gcov, and a coverage analyzer like gcovr + #- bullseye # test coverage using bullseye. Requires bullseye for your platform + #- command_hooks # write custom actions to be called at different points during the build process + #- compile_commands_json_db # generate a compile_commands.json file + #- dependencies # automatically fetch 3rd party libraries, etc. + #- subprojects # managing builds and test for static libraries + #- fake_function_framework # use FFF instead of CMock + + # Report options (You'll want to choose one stdout option, but may choose multiple stored options if desired) + #- report_build_warnings_log + #- report_tests_gtestlike_stdout + #- report_tests_ide_stdout + #- report_tests_log_factory + - report_tests_pretty_stdout + #- report_tests_raw_output_log + #- report_tests_teamcity_stdout + +# Specify which reports you'd like from the log factory +:report_tests_log_factory: + :reports: + - json + - junit + - cppunit + - html + +# override the default extensions for your system and toolchain +:extension: + #:header: .h + #:source: .c + #:assembly: .s + #:dependencies: .d + #:object: .o + :executable: .out + #:testpass: .pass + #:testfail: .fail + #:subprojects: .a + +# This is where Ceedling should look for your source and test files. +# see documentation for the many options for specifying this. +:paths: + :test: + - +:test/** + - -:test/support + :source: + - src/** + :include: + - src/** # In simple projects, this entry often duplicates :source + :support: + - test/support + :libraries: [] + +# You can even specify specific files to add or remove from your test +# and release collections. Usually it's better to use paths and let +# Ceedling do the work for you! +:files: + :test: [] + :source: [] + +# Compilation symbols to be injected into builds +# See documentation for advanced options: +# - Test name matchers for different symbols per test executable build +# - Referencing symbols in multiple lists using advanced YAML +# - Specifiying symbols used during test preprocessing +:defines: + :test: + - TEST # Simple list option to add symbol 'TEST' to compilation of all files in all test executables + :release: [] + + # Enable to inject name of a test as a unique compilation symbol into its respective executable build. + :use_test_definition: FALSE + +# Configure additional command line flags provided to tools used in each build step +# :flags: +# :release: +# :compile: # Add '-Wall' and '--02' to compilation of all files in release target +# - -Wall +# - --O2 +# :test: +# :compile: +# '(_|-)special': # Add '-pedantic' to compilation of all files in all test executables with '_special' or '-special' in their names +# - -pedantic +# '*': # Add '-foo' to compilation of all files in all test executables +# - -foo + +# Configuration Options specific to CMock. See CMock docs for details +:cmock: + # Core conffiguration + :plugins: # What plugins should be used by CMock? + - :ignore + - :callback + :verbosity: 2 # the options being 0 errors only, 1 warnings and errors, 2 normal info, 3 verbose + :when_no_prototypes: :warn # the options being :ignore, :warn, or :erro + + # File configuration + :skeleton_path: '' # Subdirectory to store stubs when generated (default: '') + :mock_prefix: 'mock_' # Prefix to append to filenames for mocks + :mock_suffix: '' # Suffix to append to filenames for mocks + + # Parser configuration + :strippables: ['(?:__attribute__\s*\([ (]*.*?[ )]*\)+)'] + :attributes: + - __ramfunc + - __irq + - __fiq + - register + - extern + :c_calling_conventions: + - __stdcall + - __cdecl + - __fastcall + :treat_externs: :exclude # the options being :include or :exclud + :treat_inlines: :exclude # the options being :include or :exclud + + # Type handling configuration + #:unity_helper_path: '' # specify a string of where to find a unity_helper.h file to discover custom type assertions + :treat_as: # optionally add additional types to map custom types + uint8: HEX8 + uint16: HEX16 + uint32: UINT32 + int8: INT8 + bool: UINT8 + #:treat_as_array: {} # hint to cmock that these types are pointers to something + #:treat_as_void: [] # hint to cmock that these types are actually aliases of void + :memcmp_if_unknown: true # allow cmock to use the memory comparison assertions for unknown types + :when_ptr: :compare_data # hint to cmock how to handle pointers in general, the options being :compare_ptr, :compare_data, or :smart + + # Mock generation configuration + :weak: '' # Symbol to use to declare weak functions + :enforce_strict_ordering: true # Do we want cmock to enforce ordering of all function calls? + :fail_on_unexpected_calls: true # Do we want cmock to fail when it encounters a function call that wasn't expected? + :callback_include_count: true # Do we want cmock to include the number of calls to this callback, when using callbacks? + :callback_after_arg_check: false # Do we want cmock to enforce an argument check first when using a callback? + #:includes: [] # You can add additional includes here, or specify the location with the options below + #:includes_h_pre_orig_header: [] + #:includes_h_post_orig_header: [] + #:includes_c_pre_header: [] + #:includes_c_post_header: [] + #:array_size_type: [] # Specify a type or types that should be used for array lengths + #:array_size_name: 'size|len' # Specify a name or names that CMock might automatically recognize as the length of an array + :exclude_setjmp_h: false # Don't use setjmp when running CMock. Note that this might result in late reporting or out-of-order failures. + +# Configuration options specific to Unity. +:unity: + :defines: + - UNITY_INCLUDE_DOUBLE + + +# You can optionally have ceedling create environment variables for you before +# performing the rest of its tasks. +:environment: [] +# :environment: +# # List enforces order allowing later to reference earlier with inline Ruby substitution +# - :var1: value +# - :var2: another value +# - :path: # Special PATH handling with platform-specific path separators +# - #{ENV['PATH']} # Environment variables can use inline Ruby substitution +# - /another/path/to/include + +# LIBRARIES +# These libraries are automatically injected into the build process. Those specified as +# common will be used in all types of builds. Otherwise, libraries can be injected in just +# tests or releases. These options are MERGED with the options in supplemental yaml files. +:libraries: + :placement: :end + :flag: "-l${1}" + :path_flag: "-L ${1}" + :system: # for example, you might list 'm' to grab the math library + - m + :test: [] + :release: [] + +################################################################ +# PLUGIN CONFIGURATION +################################################################ + +# Add -gcov to the plugins list to make sure of the gcov plugin +# You will need to have gcov and gcovr both installed to make it work. +# For more information on these options, see docs in plugins/gcov +:gcov: + :summaries: TRUE # Enable simple coverage summaries to console after tests + :report_task: FALSE # Disabled dedicated report generation task (this enables automatic report generation) + :utilities: + - gcovr # Use gcovr to create the specified reports (default). + #- ReportGenerator # Use ReportGenerator to create the specified reports. + :reports: # Specify one or more reports to generate. + # Make an HTML summary report. + - HtmlBasic + # - HtmlDetailed + # - Text + - Cobertura + # - SonarQube + # - JSON + # - HtmlInline + # - HtmlInlineAzure + # - HtmlInlineAzureDark + # - HtmlChart + # - MHtml + - Badges + # - CsvSummary + # - Latex + # - LatexSummary + # - PngChart + # - TeamCitySummary + # - lcov + # - Xml + # - XmlSummary + :gcovr: + # :html_artifact_filename: TestCoverageReport.html + # :html_title: Test Coverage Report + :html_medium_threshold: 75 + :html_high_threshold: 90 + # :html_absolute_paths: TRUE + # :html_encoding: UTF-8 + +# :module_generator: +# :naming: :snake #options: :bumpy, :camel, :caps, or :snake +# :includes: +# :tst: [] +# :src: [] +# :boilerplates: +# :src: "" +# :inc: "" +# :tst: "" + +# :dependencies: +# :libraries: +# - :name: WolfSSL +# :source_path: third_party/wolfssl/source +# :build_path: third_party/wolfssl/build +# :artifact_path: third_party/wolfssl/install +# :fetch: +# :method: :zip +# :source: \\shared_drive\third_party_libs\wolfssl\wolfssl-4.2.0.zip +# :environment: +# - CFLAGS+=-DWOLFSSL_DTLS_ALLOW_FUTURE +# :build: +# - "autoreconf -i" +# - "./configure --enable-tls13 --enable-singlethreaded" +# - make +# - make install +# :artifacts: +# :static_libraries: +# - lib/wolfssl.a +# :dynamic_libraries: +# - lib/wolfssl.so +# :includes: +# - include/** + +# :subprojects: +# :paths: +# - :name: libprojectA +# :source: +# - ./subprojectA/source +# :include: +# - ./subprojectA/include +# :build_root: ./subprojectA/build +# :defines: [] + +# :command_hooks: +# :pre_mock_preprocess: +# :post_mock_preprocess: +# :pre_test_preprocess: +# :post_test_preprocess: +# :pre_mock_generate: +# :post_mock_generate: +# :pre_runner_generate: +# :post_runner_generate: +# :pre_compile_execute: +# :post_compile_execute: +# :pre_link_execute: +# :post_link_execute: +# :pre_test_fixture_execute: +# :post_test_fixture_execute: +# :pre_test: +# :post_test: +# :pre_release: +# :post_release: +# :pre_build: +# :post_build: +# :post_error: + +################################################################ +# TOOLCHAIN CONFIGURATION +################################################################ + +#:tools: +# Ceedling defaults to using gcc for compiling, linking, etc. +# As [:tools] is blank, gcc will be used (so long as it's in your system path) +# See documentation to configure a given toolchain for use +# :tools: +# :test_compiler: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :test_linker: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :test_assembler: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :test_fixture: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :test_includes_preprocessor: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :test_file_preprocessor: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :test_file_preprocessor_directives: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :release_compiler: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :release_linker: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :release_assembler: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :release_dependencies_generator: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +... diff --git a/src/ftle.c b/src/ftle.c index b0ac491..ba6d330 100644 --- a/src/ftle.c +++ b/src/ftle.c @@ -1,7 +1,8 @@ /* * ftle.c * flowVC - * + * forked from FlowPhysics/flowVC + * Modified by Bray Moll * Created by Shawn Shadden. * Copyright 2010 Flow Physics Group. All rights reserved. * diff --git a/src/scratch.c b/src/scratch.c deleted file mode 100644 index 8178354..0000000 --- a/src/scratch.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include -#include "scratch.h" - - -int bray_add(int a, int b){ - return(a+b); -} diff --git a/src/scratch.h b/src/scratch.h deleted file mode 100644 index b0b3773..0000000 --- a/src/scratch.h +++ /dev/null @@ -1,3 +0,0 @@ -#include - -int bray_add(int a, int b); diff --git a/test/Testscratch.c b/test/Testscratch.c deleted file mode 100644 index 414056a..0000000 --- a/test/Testscratch.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "unity.h" -#include "scratch.h" - -void setUp(void) { - // set stuff up here -} - -void tearDown(void) { - // clean stuff up here -} - -void test_add_numbers_correct(void) -{ - TEST_ASSERT_EQUAL(5, bray_add(2,3) ); -} - -void test_add_numbers_incorrect(void) -{ - TEST_ASSERT_EQUAL(8, bray_add(4,3) ); -} - - -int main(void) -{ -UNITY_BEGIN(); - RUN_TEST(test_add_numbers_correct); - RUN_TEST(test_add_numbers_incorrect); -return UNITY_END(); -} diff --git a/test/support/.gitignore b/test/support/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/test/test_mymath.c b/test/test_mymath.c new file mode 100644 index 0000000..eebdaac --- /dev/null +++ b/test/test_mymath.c @@ -0,0 +1,117 @@ +#ifdef TEST +#include "unity.h" +#include "mymath.h" +#include "mock_io.h" + + +void setUp(void) { + // set stuff up here +} + +void tearDown(void) { + // clean stuff up here +} + +void test_vdot(void) { + double v1[] = {1.0, 2.0, 3.0}; + double v2[] = {4.0, 5.0, 6.0}; + int dim = 3; + + double expected = 1.0 * 4.0 + 2.0 * 5.0 + 3.0 * 6.0; // Expected result: 32.0 + double result = vdot(v1, v2, dim); + + TEST_ASSERT_DOUBLE_WITHIN(1e-6, expected, result); +} + +// Test for cross function +void test_cross(void) { + double u[] = {1.0, 2.0, 3.0}; + double v[] = {4.0, 5.0, 6.0}; + double result[3]; + cross(u, v, result); + TEST_ASSERT_EQUAL_DOUBLE(-3.0, result[0]); + TEST_ASSERT_EQUAL_DOUBLE(6.0, result[1]); + TEST_ASSERT_EQUAL_DOUBLE(-3.0, result[2]); +} + +// Test for dist function +void test_dist(void) { + double v1[] = {1.0, 2.0, 3.0}; + double v2[] = {4.0, 5.0, 6.0}; + double distance = dist(v1, v2, 3); + TEST_ASSERT_EQUAL_DOUBLE(sqrt(27), distance); // sqrt((4-1)^2 + (5-2)^2 + (6-3)^2) +} + +// Test for vdiff function +void test_vdiff(void) { + double v1[] = {5.0, 2.0, 1.0}; + double v2[] = {3.0, 2.0, 0.0}; + double result[3]; + vdiff(v1, v2, result); + TEST_ASSERT_EQUAL_DOUBLE(2.0, result[0]); + TEST_ASSERT_EQUAL_DOUBLE(0.0, result[1]); + TEST_ASSERT_EQUAL_DOUBLE(1.0, result[2]); +} + +// Test for distline function +void test_distline(void) { + double x1[] = {0.0, 0.0, 0.0}; + double x2[] = {1.0, 0.0, 0.0}; + double x0[] = {1.0, 3.0, 4.0}; + double result = distline(x1, x2, x0); + double expected = 5.0; + TEST_ASSERT_DOUBLE_WITHIN(0.001, expected, result); + +} + +// Test for TwoVectorMean function +void test_TwoVectorMean(void) { + double v1[] = {1.0, 2.0, 3.0}; + double v2[] = {5.0, 6.0, 7.0}; + double mean[3]; + TwoVectorMean(v1, v2, mean); + TEST_ASSERT_EQUAL_DOUBLE(3.0, mean[0]); + TEST_ASSERT_EQUAL_DOUBLE(4.0, mean[1]); + TEST_ASSERT_EQUAL_DOUBLE(5.0, mean[2]); +} + +// Test for ThreeVectorMean function +void test_ThreeVectorMean(void) { + double v1[] = {1.0, 2.0, 3.0}; + double v2[] = {4.0, 5.0, 6.0}; + double v3[] = {7.0, 8.0, 9.0}; + double mean[3]; + ThreeVectorMean(v1, v2, v3, mean); + TEST_ASSERT_EQUAL_DOUBLE(4.0, mean[0]); + TEST_ASSERT_EQUAL_DOUBLE(5.0, mean[1]); + TEST_ASSERT_EQUAL_DOUBLE(6.0, mean[2]); +} + +void test_GetMaxEigenvalue(void) { + double matrix[3][3] = { + {1.0, 2.0, 3.0}, + {2.0, 5.0, 8.0}, + {3.0, 8.0, 14.0} + }; + + double expected = 19.384; + double result = GetMaxEigenvalue(matrix); + + TEST_ASSERT_DOUBLE_WITHIN(0.01, expected, result); +} + +/* int main(void) */ +/* { */ +/* UNITY_BEGIN(); */ +/* RUN_TEST(test_vdot); */ +/* RUN_TEST(test_cross); */ +/* RUN_TEST(test_dist); */ +/* RUN_TEST(test_vdiff); */ +/* RUN_TEST(test_distline); */ +/* RUN_TEST(test_TwoVectorMean); */ +/* RUN_TEST(test_ThreeVectorMean); */ +/* RUN_TEST(test_GetMaxEigenvalue); */ + +/* return UNITY_END(); */ +/* } */ +#endif // TEST diff --git a/test/test_strainrate.c b/test/test_strainrate.c new file mode 100644 index 0000000..d6fa7c7 --- /dev/null +++ b/test/test_strainrate.c @@ -0,0 +1,22 @@ +#ifdef TEST +#include "unity.h" +#include "globals.h" +#include "io.h" +#include "macros.h" +#include "memory.h" +#include "mock_mesh.h" +#include "structs.h" +#include "mock_tracers.h" +#include "velocity.h" +#include "strainrate.h" + +void setUp(void) { + // set stuff up here +} + +void tearDown(void) { + // clean stuff up here +} + + +#endif // TEST diff --git a/unity/src/unity_config.h b/unity/src/unity_config.h new file mode 100644 index 0000000..eaaee25 --- /dev/null +++ b/unity/src/unity_config.h @@ -0,0 +1,251 @@ +/* ========================================================================= + Unity - A Test Framework for C + ThrowTheSwitch.org + Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams + SPDX-License-Identifier: MIT +========================================================================= */ + +/* Unity Configuration + * As of May 11th, 2016 at ThrowTheSwitch/Unity commit 837c529 + * Update: December 29th, 2016 + * See Also: Unity/docs/UnityConfigurationGuide.pdf + * + * Unity is designed to run on almost anything that is targeted by a C compiler. + * It would be awesome if this could be done with zero configuration. While + * there are some targets that come close to this dream, it is sadly not + * universal. It is likely that you are going to need at least a couple of the + * configuration options described in this document. + * + * All of Unity's configuration options are `#defines`. Most of these are simple + * definitions. A couple are macros with arguments. They live inside the + * unity_internals.h header file. We don't necessarily recommend opening that + * file unless you really need to. That file is proof that a cross-platform + * library is challenging to build. From a more positive perspective, it is also + * proof that a great deal of complexity can be centralized primarily to one + * place in order to provide a more consistent and simple experience elsewhere. + * + * Using These Options + * It doesn't matter if you're using a target-specific compiler and a simulator + * or a native compiler. In either case, you've got a couple choices for + * configuring these options: + * + * 1. Because these options are specified via C defines, you can pass most of + * these options to your compiler through command line compiler flags. Even + * if you're using an embedded target that forces you to use their + * overbearing IDE for all configuration, there will be a place somewhere in + * your project to configure defines for your compiler. + * 2. You can create a custom `unity_config.h` configuration file (present in + * your toolchain's search paths). In this file, you will list definitions + * and macros specific to your target. All you must do is define + * `UNITY_INCLUDE_CONFIG_H` and Unity will rely on `unity_config.h` for any + * further definitions it may need. + */ + +#ifndef UNITY_CONFIG_H +#define UNITY_CONFIG_H + +/* ************************* AUTOMATIC INTEGER TYPES *************************** + * C's concept of an integer varies from target to target. The C Standard has + * rules about the `int` matching the register size of the target + * microprocessor. It has rules about the `int` and how its size relates to + * other integer types. An `int` on one target might be 16 bits while on another + * target it might be 64. There are more specific types in compilers compliant + * with C99 or later, but that's certainly not every compiler you are likely to + * encounter. Therefore, Unity has a number of features for helping to adjust + * itself to match your required integer sizes. It starts off by trying to do it + * automatically. + **************************************************************************** */ + +/* The first attempt to guess your types is to check `limits.h`. Some compilers + * that don't support `stdint.h` could include `limits.h`. If you don't + * want Unity to check this file, define this to make it skip the inclusion. + * Unity looks at UINT_MAX & ULONG_MAX, which were available since C89. + */ +/* #define UNITY_EXCLUDE_LIMITS_H */ + +/* The second thing that Unity does to guess your types is check `stdint.h`. + * This file defines `UINTPTR_MAX`, since C99, that Unity can make use of to + * learn about your system. It's possible you don't want it to do this or it's + * possible that your system doesn't support `stdint.h`. If that's the case, + * you're going to want to define this. That way, Unity will know to skip the + * inclusion of this file and you won't be left with a compiler error. + */ +/* #define UNITY_EXCLUDE_STDINT_H */ + +/* ********************** MANUAL INTEGER TYPE DEFINITION *********************** + * If you've disabled all of the automatic options above, you're going to have + * to do the configuration yourself. There are just a handful of defines that + * you are going to specify if you don't like the defaults. + **************************************************************************** */ + + /* Define this to be the number of bits an `int` takes up on your system. The + * default, if not auto-detected, is 32 bits. + * + * Example: + */ +/* #define UNITY_INT_WIDTH 16 */ + +/* Define this to be the number of bits a `long` takes up on your system. The + * default, if not autodetected, is 32 bits. This is used to figure out what + * kind of 64-bit support your system can handle. Does it need to specify a + * `long` or a `long long` to get a 64-bit value. On 16-bit systems, this option + * is going to be ignored. + * + * Example: + */ +/* #define UNITY_LONG_WIDTH 16 */ + +/* Define this to be the number of bits a pointer takes up on your system. The + * default, if not autodetected, is 32-bits. If you're getting ugly compiler + * warnings about casting from pointers, this is the one to look at. + * + * Example: + */ +/* #define UNITY_POINTER_WIDTH 64 */ + +/* Unity will automatically include 64-bit support if it auto-detects it, or if + * your `int`, `long`, or pointer widths are greater than 32-bits. Define this + * to enable 64-bit support if none of the other options already did it for you. + * There can be a significant size and speed impact to enabling 64-bit support + * on small targets, so don't define it if you don't need it. + */ +/* #define UNITY_SUPPORT_64 */ + + +/* *************************** FLOATING POINT TYPES **************************** + * In the embedded world, it's not uncommon for targets to have no support for + * floating point operations at all or to have support that is limited to only + * single precision. We are able to guess integer sizes on the fly because + * integers are always available in at least one size. Floating point, on the + * other hand, is sometimes not available at all. Trying to include `float.h` on + * these platforms would result in an error. This leaves manual configuration as + * the only option. + **************************************************************************** */ + + /* By default, Unity guesses that you will want single precision floating point + * support, but not double precision. It's easy to change either of these using + * the include and exclude options here. You may include neither, just float, + * or both, as suits your needs. + */ +/* #define UNITY_EXCLUDE_FLOAT */ +#define UNITY_INCLUDE_DOUBLE +/* #define UNITY_EXCLUDE_DOUBLE */ + +/* For features that are enabled, the following floating point options also + * become available. + */ + +/* Unity aims for as small of a footprint as possible and avoids most standard + * library calls (some embedded platforms don't have a standard library!). + * Because of this, its routines for printing integer values are minimalist and + * hand-coded. To keep Unity universal, though, we eventually chose to develop + * our own floating point print routines. Still, the display of floating point + * values during a failure are optional. By default, Unity will print the + * actual results of floating point assertion failures. So a failed assertion + * will produce a message like "Expected 4.0 Was 4.25". If you would like less + * verbose failure messages for floating point assertions, use this option to + * give a failure message `"Values Not Within Delta"` and trim the binary size. + */ +/* #define UNITY_EXCLUDE_FLOAT_PRINT */ + +/* If enabled, Unity assumes you want your `FLOAT` asserts to compare standard C + * floats. If your compiler supports a specialty floating point type, you can + * always override this behavior by using this definition. + * + * Example: + */ +/* #define UNITY_FLOAT_TYPE float16_t */ + +/* If enabled, Unity assumes you want your `DOUBLE` asserts to compare standard + * C doubles. If you would like to change this, you can specify something else + * by using this option. For example, defining `UNITY_DOUBLE_TYPE` to `long + * double` could enable gargantuan floating point types on your 64-bit processor + * instead of the standard `double`. + * + * Example: + */ +/* #define UNITY_DOUBLE_TYPE long double */ + +/* If you look up `UNITY_ASSERT_EQUAL_FLOAT` and `UNITY_ASSERT_EQUAL_DOUBLE` as + * documented in the Unity Assertion Guide, you will learn that they are not + * really asserting that two values are equal but rather that two values are + * "close enough" to equal. "Close enough" is controlled by these precision + * configuration options. If you are working with 32-bit floats and/or 64-bit + * doubles (the normal on most processors), you should have no need to change + * these options. They are both set to give you approximately 1 significant bit + * in either direction. The float precision is 0.00001 while the double is + * 10^-12. For further details on how this works, see the appendix of the Unity + * Assertion Guide. + * + * Example: + */ +/* #define UNITY_FLOAT_PRECISION 0.001f */ +/* #define UNITY_DOUBLE_PRECISION 0.001f */ + + +/* *************************** MISCELLANEOUS *********************************** + * Miscellaneous configuration options for Unity + **************************************************************************** */ + +/* Unity uses the stddef.h header included in the C standard library for the + * "NULL" macro. Define this in order to disable the include of stddef.h. If you + * do this, you have to make sure to provide your own "NULL" definition. + */ +/* #define UNITY_EXCLUDE_STDDEF_H */ + +/* Define this to enable the unity formatted print macro: + * "TEST_PRINTF" + */ +/* #define UNITY_INCLUDE_PRINT_FORMATTED */ + + +/* *************************** TOOLSET CUSTOMIZATION *************************** + * In addition to the options listed above, there are a number of other options + * which will come in handy to customize Unity's behavior for your specific + * toolchain. It is possible that you may not need to touch any of these but + * certain platforms, particularly those running in simulators, may need to jump + * through extra hoops to operate properly. These macros will help in those + * situations. + **************************************************************************** */ + +/* By default, Unity prints its results to `stdout` as it runs. This works + * perfectly fine in most situations where you are using a native compiler for + * testing. It works on some simulators as well so long as they have `stdout` + * routed back to the command line. There are times, however, where the + * simulator will lack support for dumping results or you will want to route + * results elsewhere for other reasons. In these cases, you should define the + * `UNITY_OUTPUT_CHAR` macro. This macro accepts a single character at a time + * (as an `int`, since this is the parameter type of the standard C `putchar` + * function most commonly used). You may replace this with whatever function + * call you like. + * + * Example: + * Say you are forced to run your test suite on an embedded processor with no + * `stdout` option. You decide to route your test result output to a custom + * serial `RS232_putc()` function you wrote like thus: + */ +/* #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) */ +/* #define UNITY_OUTPUT_CHAR_HEADER_DECLARATION RS232_putc(int) */ +/* #define UNITY_OUTPUT_FLUSH() RS232_flush() */ +/* #define UNITY_OUTPUT_FLUSH_HEADER_DECLARATION RS232_flush(void) */ +/* #define UNITY_OUTPUT_START() RS232_config(115200,1,8,0) */ +/* #define UNITY_OUTPUT_COMPLETE() RS232_close() */ + +/* Some compilers require a custom attribute to be assigned to pointers, like + * `near` or `far`. In these cases, you can give Unity a safe default for these + * by defining this option with the attribute you would like. + * + * Example: + */ +/* #define UNITY_PTR_ATTRIBUTE __attribute__((far)) */ +/* #define UNITY_PTR_ATTRIBUTE near */ + +/* Print execution time of each test when executed in verbose mode + * + * Example: + * + * TEST - PASS (10 ms) + */ +/* #define UNITY_INCLUDE_EXEC_TIME */ + +#endif /* UNITY_CONFIG_H */ From 6bb8aecfdd4b2d21592906ec0e61e988ecc0a7f0 Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 00:23:40 -0700 Subject: [PATCH 14/68] Build (#7) * Use the Ceedling Docker image for running tests. * Ensure the docker CI uploads to with codecov * remove code covr * Add a semantic release github actions file * fix(config): move releaserc to main directory --- .github/workflows/.semantic-release.yaml | 53 +++++++++++++++ .github/workflows/ci.yaml | 32 +++++++++ .github/workflows/{tests.yml => test.backup} | 0 .releaserc.yaml | 10 +++ Dockerfile.ubuntu | 71 ++++++++++++++++++++ project.yml | 8 +-- releaserc.prerelease.yaml | 15 +++++ 7 files changed, 185 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/.semantic-release.yaml create mode 100644 .github/workflows/ci.yaml rename .github/workflows/{tests.yml => test.backup} (100%) create mode 100644 .releaserc.yaml create mode 100644 Dockerfile.ubuntu create mode 100644 releaserc.prerelease.yaml diff --git a/.github/workflows/.semantic-release.yaml b/.github/workflows/.semantic-release.yaml new file mode 100644 index 0000000..6231b90 --- /dev/null +++ b/.github/workflows/.semantic-release.yaml @@ -0,0 +1,53 @@ +name: Semantic Release + +on: + push: + branches: + - main + - dev/* + - feature/* + - hotfix/* + +jobs: + semantic-release: + if: "!contains(github.event.head_commit.message, '[skip ci]')" + + name: Semantic Release + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + persist-credentials: false + + - uses: actions/setup-node@v3 + with: + node-version: "lts/*" + + - name: Prepare prerelease semantic + if: github.ref != 'refs/heads/main' + run: mv .releaserc.prerelease.yaml .releaserc.yaml + + - name: Semantic Release + uses: cycjimmy/semantic-release-action@v2 + id: semantic # Need an `id` for output variables + with: + semantic_version: 17 + extra_plugins: | + @semantic-release/changelog@5 + @semantic-release/exec@5 + @semantic-release/git@9 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Do something when a new release published + if: steps.semantic.outputs.new_release_published == 'true' + run: | + echo ${{ steps.semantic.outputs.new_release_version }} + echo ${{ steps.semantic.outputs.new_release_major_version }} + echo ${{ steps.semantic.outputs.new_release_minor_version }} + echo ${{ steps.semantic.outputs.new_release_patch_version }} \ No newline at end of file diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..d4c6a1c --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,32 @@ +name: CI + +on: + # Manually triggered testing + workflow_dispatch: + push: + # Check every PR to main + pull_request: + branches: + - main + +jobs: + docker-test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Run all Tests using Docker + run: | + docker run \ + --interactive \ + --rm \ + -u $(id -u):$(id -g) \ + --volume .:/home/dev/project \ + throwtheswitch/madsciencelab-plugins:1.0.0 \ + ceedling gcov:all + + - name: Upload Coverage Report to Codecov + uses: codecov/codecov-action@v5 + with: + token: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/tests.yml b/.github/workflows/test.backup similarity index 100% rename from .github/workflows/tests.yml rename to .github/workflows/test.backup diff --git a/.releaserc.yaml b/.releaserc.yaml new file mode 100644 index 0000000..ee3d4df --- /dev/null +++ b/.releaserc.yaml @@ -0,0 +1,10 @@ +plugins: + - "@semantic-release/commit-analyzer" + - "@semantic-release/release-notes-generator" + - "@semantic-release/changelog" + - "@semantic-release/git" + - "@semantic-release/github" + +branches: + - "+([0-9])?(.{+([0-9]),x}).x" + - main \ No newline at end of file diff --git a/Dockerfile.ubuntu b/Dockerfile.ubuntu new file mode 100644 index 0000000..517abe2 --- /dev/null +++ b/Dockerfile.ubuntu @@ -0,0 +1,71 @@ +FROM ubuntu:22.04 as base + +MAINTAINER lior.dux@develeap.com +LABEL maintainer.description='C Development environment with ceedling, cmock unity, and doxygen' +LABEL ceedling.version=ceedling-0.32.0-d76db35 +LABEL unity.version=2.5.4 +LABEL cmock.version=2.5.4 +LABEL cexception.version=1.3.3 +LABEL doxygen.version=v1.9.1 + +# Install the required packages +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && \ + apt-get install --yes --no-install-recommends \ + ca-certificates \ + systemd \ + build-essential \ + git \ + make \ + gcc \ + gcc-avr \ + valgrind \ + vim \ + bash \ + wget \ + curl \ + libz-dev \ + doxygen \ + libssl-dev \ + libreadline-dev \ + zlib1g-dev \ + autoconf \ + bison \ + libyaml-dev \ + libreadline-dev \ + libncurses5-dev \ + libffi-dev \ + libgdbm-dev + +# Clean the apt cache +RUN apt-get clean &&\ + rm -rf /var/cache/apt/archives/* && \ + rm -rf /var/lib/apt/lists/* + +# Set the timezone on build time +# ARG TZ Asia/Jerusalem +# ENV TZ $TZ +# RUN timedatectl set-timezone $TZ + +# Install rbenv-build +RUN curl --fail --silent --show-error --location https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash +ENV PATH="$PATH:/root/.rbenv/bin:/root/.rbenv/shims" + +# Validate rbenv using rbev-doctor +RUN curl --fail --silent --show-error --location https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-doctor | bash +RUN echo 'eval "$(~/.rbenv/bin/rbenv init -)"' >> /etc/profile.d/rbenv.sh + +# Install rbenv and set the desired version +ARG RBENV_VERSION=3.3.0 +ENV RBENV_VERSION $RBENV_VERSION +RUN rbenv install $RBENV_VERSION &&\ + rbenv global $RBENV_VERSION + +# Install ceedling, cmock and unity +COPY ./ceedling-0.32.0-d76db35.gem ceedling-0.32.0-d76db35.gem +RUN gem install constructor deep_merge thor +RUN gem install --local ./ceedling-0.32.0-d76db35.gem +HEALTHCHECK --interval=35s --timeout=4s --retries=2 CMD ceedling version || exit 1 + +WORKDIR /project +CMD bash \ No newline at end of file diff --git a/project.yml b/project.yml index 1ad2a48..37f1e56 100644 --- a/project.yml +++ b/project.yml @@ -238,14 +238,14 @@ :summaries: TRUE # Enable simple coverage summaries to console after tests :report_task: FALSE # Disabled dedicated report generation task (this enables automatic report generation) :utilities: - - gcovr # Use gcovr to create the specified reports (default). + #- gcovr # Use gcovr to create the specified reports (default). #- ReportGenerator # Use ReportGenerator to create the specified reports. :reports: # Specify one or more reports to generate. # Make an HTML summary report. - - HtmlBasic + # - HtmlBasic # - HtmlDetailed # - Text - - Cobertura + # - Cobertura # - SonarQube # - JSON # - HtmlInline @@ -253,7 +253,7 @@ # - HtmlInlineAzureDark # - HtmlChart # - MHtml - - Badges + # - Badges # - CsvSummary # - Latex # - LatexSummary diff --git a/releaserc.prerelease.yaml b/releaserc.prerelease.yaml new file mode 100644 index 0000000..d351999 --- /dev/null +++ b/releaserc.prerelease.yaml @@ -0,0 +1,15 @@ +plugins: + - "@semantic-release/commit-analyzer" + - "@semantic-release/release-notes-generator" + - "@semantic-release/changelog" + - "@semantic-release/github" + +branches: + - "+([0-9])?(.{+([0-9]),x}).x" + - main + - name: dev/* + prerelease: '${name.replace(/^dev\//g, "dev-")}' + - name: feature/* + prerelease: '${name.replace(/^feature\//g, "feature-")}' + - name: hotfix/* + prerelease: '${name.replace(/^hotfix\//g, "hotfix-")}' \ No newline at end of file From e3e4780622d2024a7e362cd749e008c938a824cc Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 01:01:10 -0700 Subject: [PATCH 15/68] README: update readme (#8) --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index 490e5fd..3b5a843 100644 --- a/README.org +++ b/README.org @@ -18,7 +18,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ** Installation *** Binaries -Currently this project does not have any pre-build binaries, so the code must be build from source. Reference the Development section below. +Currently this project does not have any pre-build binaries, so the code must be build from source. Reference the Development section below. The intent is to implement trunk based development. *** Development **** Dependencies [[https://www.ruby-lang.org/en/][Ruby]] > v 3.0: A programing language used for Ceedling From 1bcdaefa25728b5bc210cc298c7f60cf396cdbed Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 01:27:09 -0700 Subject: [PATCH 16/68] try uploading artifacts (#9) --- .github/workflows/release.yml | 45 +++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..c73f977 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,45 @@ +name: CD + +on: + # Publish on every approved PR + pull_request: + types: + - closed + branches: + - main + +permissions: + id-token: write + contents: write + packages: write + +jobs: + check: + name: check pr status + runs-on: ubuntu-latest + steps: + - name: check if PR is merged + uses: zmynx/github-actions/.github/actions/git/check-merge@feature/gha + + cd: + name: continuous-delivery + needs: [check] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Generate Release using Docker + run: | + docker run \ + --interactive \ + --rm \ + -u $(id -u):$(id -g) \ + --volume .:/home/dev/project \ + throwtheswitch/madsciencelab-plugins:1.0.0 \ + ceedling release + - name Upload Artifact + uses actions/upload-artifact@v3 + with: + name: flowVC.out + path: ./build/artifacts/release/flowVC.out From 6d2e18847ec20c2acfc888acd5163f41b2fd1f43 Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 01:36:30 -0700 Subject: [PATCH 17/68] Fix release artifacts yaml (#10) * update yaml * change tabs to spaces --- .github/workflows/release.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c73f977..907e402 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,8 +38,8 @@ jobs: --volume .:/home/dev/project \ throwtheswitch/madsciencelab-plugins:1.0.0 \ ceedling release - - name Upload Artifact - uses actions/upload-artifact@v3 - with: - name: flowVC.out - path: ./build/artifacts/release/flowVC.out + - name: Upload Artifact + uses: actions/upload-artifact@v3 + with: + name: flowVC.out + path: ./build/artifacts/release/flowVC.out From b4febb71f1eb538a7796ed037bf39b38c593eb7f Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 01:52:40 -0700 Subject: [PATCH 18/68] Update release.yml (#11) --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 907e402..5962c35 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,7 +39,7 @@ jobs: throwtheswitch/madsciencelab-plugins:1.0.0 \ ceedling release - name: Upload Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: flowVC.out path: ./build/artifacts/release/flowVC.out From 56f0f0c8374509bf1942198261db2b6a8cf5d6c0 Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 02:14:26 -0700 Subject: [PATCH 19/68] fix(devtools): Update release github actions to try update version (#12) --- .github/workflows/release.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5962c35..52c68a4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ jobs: uses: zmynx/github-actions/.github/actions/git/check-merge@feature/gha cd: - name: continuous-delivery + name: build needs: [check] runs-on: ubuntu-latest steps: @@ -43,3 +43,19 @@ jobs: with: name: flowVC.out path: ./build/artifacts/release/flowVC.out + - name: Bump version and push tag + id: semantic + uses: mathieudutour/github-tab-action@v6.1 + with: + github_token: ${{ secrets.ORG_GH_ACCESS_TOKEN}} + + - name: Create Release + uses: softprops/action-gh-release@v1 + #if: startsWith(github.ref, 'refs/tags/v*') + with: + token: ${{ secrets.ORG_GH_ACCESS_TOKEN }} + tag_name: ${{ steps.semantic.outputs.new_tag }} + draft: true + prerelease: true + generate_release_notes: true + From 3886408d2ff083d724a0819d6588148ee3df58f2 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 7 Feb 2025 09:15:00 +0000 Subject: [PATCH 20/68] chore(release): 0.0.1 [skip ci] ## [0.0.1](https://github.com/bkm82/flowVC/compare/v0.0.0...v0.0.1) (2025-02-07) ### Bug Fixes * **devtools:** Update release github actions to try update version ([#12](https://github.com/bkm82/flowVC/issues/12)) ([56f0f0c](https://github.com/bkm82/flowVC/commit/56f0f0c8374509bf1942198261db2b6a8cf5d6c0)) --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fd26925 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,6 @@ +## [0.0.1](https://github.com/bkm82/flowVC/compare/v0.0.0...v0.0.1) (2025-02-07) + + +### Bug Fixes + +* **devtools:** Update release github actions to try update version ([#12](https://github.com/bkm82/flowVC/issues/12)) ([56f0f0c](https://github.com/bkm82/flowVC/commit/56f0f0c8374509bf1942198261db2b6a8cf5d6c0)) From 754731b018abee1ad4b5ba00ae1a6aa33fad1ed5 Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 02:50:32 -0700 Subject: [PATCH 21/68] ci(devtools): update semantic-release to try build project (#13) --- .github/workflows/.semantic-release.yaml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/.semantic-release.yaml b/.github/workflows/.semantic-release.yaml index 6231b90..9f8c2bd 100644 --- a/.github/workflows/.semantic-release.yaml +++ b/.github/workflows/.semantic-release.yaml @@ -50,4 +50,19 @@ jobs: echo ${{ steps.semantic.outputs.new_release_version }} echo ${{ steps.semantic.outputs.new_release_major_version }} echo ${{ steps.semantic.outputs.new_release_minor_version }} - echo ${{ steps.semantic.outputs.new_release_patch_version }} \ No newline at end of file + echo ${{ steps.semantic.outputs.new_release_patch_version }} + echo ${{ steps.semantic.outputs.new_release_git_tag }} + docker run \ + --interactive \ + --rm \ + -u $(id -u):$(id -g) \ + --volume .:/home/dev/project \ + throwtheswitch/madsciencelab-plugins:1.0.0 \ + ceedling release + + - name: Publish GitHub Release + uses: softprops/action-gh-release@v0.1.15 + with: + tag_name: ${{ steps.semantic.outputs.new_release_git_tag }} + files: | + .build/release/flowVC.out From 871f69746e427c45bc797b70bf80475aeb4cb91d Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 02:54:21 -0700 Subject: [PATCH 22/68] fix(devtools): Try fix the adding artifacts to a release (#14) --- .github/workflows/.semantic-release.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/.semantic-release.yaml b/.github/workflows/.semantic-release.yaml index 9f8c2bd..3ad489e 100644 --- a/.github/workflows/.semantic-release.yaml +++ b/.github/workflows/.semantic-release.yaml @@ -61,6 +61,7 @@ jobs: ceedling release - name: Publish GitHub Release + if: steps.semantic.outputs.new_release_published == 'true' uses: softprops/action-gh-release@v0.1.15 with: tag_name: ${{ steps.semantic.outputs.new_release_git_tag }} From 0365f19cf85349227bdd3e52ec49c73f3701677d Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 7 Feb 2025 09:54:52 +0000 Subject: [PATCH 23/68] chore(release): 0.0.2 [skip ci] ## [0.0.2](https://github.com/bkm82/flowVC/compare/v0.0.1...v0.0.2) (2025-02-07) ### Bug Fixes * **devtools:** Try fix the adding artifacts to a release ([#14](https://github.com/bkm82/flowVC/issues/14)) ([871f697](https://github.com/bkm82/flowVC/commit/871f69746e427c45bc797b70bf80475aeb4cb91d)) --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd26925..85f7005 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [0.0.2](https://github.com/bkm82/flowVC/compare/v0.0.1...v0.0.2) (2025-02-07) + + +### Bug Fixes + +* **devtools:** Try fix the adding artifacts to a release ([#14](https://github.com/bkm82/flowVC/issues/14)) ([871f697](https://github.com/bkm82/flowVC/commit/871f69746e427c45bc797b70bf80475aeb4cb91d)) + ## [0.0.1](https://github.com/bkm82/flowVC/compare/v0.0.0...v0.0.1) (2025-02-07) From 3fae1776860b9ba8ee9ab7bf5ad1df0bfcf9d7d2 Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 03:09:31 -0700 Subject: [PATCH 24/68] fix(devtools): Try another gh action build (#15) --- .github/workflows/.semantic-release.yaml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/.semantic-release.yaml b/.github/workflows/.semantic-release.yaml index 3ad489e..c417340 100644 --- a/.github/workflows/.semantic-release.yaml +++ b/.github/workflows/.semantic-release.yaml @@ -61,9 +61,7 @@ jobs: ceedling release - name: Publish GitHub Release - if: steps.semantic.outputs.new_release_published == 'true' - uses: softprops/action-gh-release@v0.1.15 + uses: softprops/action-gh-release@v2 + if: startsWith(github.ref, 'ref/tags/') with: - tag_name: ${{ steps.semantic.outputs.new_release_git_tag }} - files: | - .build/release/flowVC.out + files: ./build/release/flowVC.out From 57ad0b17b23d5cd6a5a743568a2c1f24bd6c4b19 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 7 Feb 2025 10:10:00 +0000 Subject: [PATCH 25/68] chore(release): 0.0.3 [skip ci] ## [0.0.3](https://github.com/bkm82/flowVC/compare/v0.0.2...v0.0.3) (2025-02-07) ### Bug Fixes * **devtools:** Try another gh action build ([#15](https://github.com/bkm82/flowVC/issues/15)) ([3fae177](https://github.com/bkm82/flowVC/commit/3fae1776860b9ba8ee9ab7bf5ad1df0bfcf9d7d2)) --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85f7005..a1031b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [0.0.3](https://github.com/bkm82/flowVC/compare/v0.0.2...v0.0.3) (2025-02-07) + + +### Bug Fixes + +* **devtools:** Try another gh action build ([#15](https://github.com/bkm82/flowVC/issues/15)) ([3fae177](https://github.com/bkm82/flowVC/commit/3fae1776860b9ba8ee9ab7bf5ad1df0bfcf9d7d2)) + ## [0.0.2](https://github.com/bkm82/flowVC/compare/v0.0.1...v0.0.2) (2025-02-07) From 01787143d8624beb8bee4634937e79074d0b7b5d Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 03:25:46 -0700 Subject: [PATCH 26/68] Cd build 3 (#16) * fix: try using fresa trunk based commit for versioning * fix: update relase yaml --- .github/workflows/release.yml | 18 ++++++++++-------- ...ic-release.yaml => semantic-release.backup} | 0 2 files changed, 10 insertions(+), 8 deletions(-) rename .github/workflows/{.semantic-release.yaml => semantic-release.backup} (100%) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 52c68a4..5e0d13d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,6 +28,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Generate Release using Docker run: | @@ -43,18 +45,18 @@ jobs: with: name: flowVC.out path: ./build/artifacts/release/flowVC.out - - name: Bump version and push tag - id: semantic - uses: mathieudutour/github-tab-action@v6.1 - with: - github_token: ${{ secrets.ORG_GH_ACCESS_TOKEN}} + + - name: Determine Release Info + id: release + uses: Fresa/trunk-based-release-versioning@main + - run: echo "Release version: ${{ steps.release.outputs.version }}" - name: Create Release - uses: softprops/action-gh-release@v1 - #if: startsWith(github.ref, 'refs/tags/v*') + uses: softprops/action-gh-release@v2 with: token: ${{ secrets.ORG_GH_ACCESS_TOKEN }} - tag_name: ${{ steps.semantic.outputs.new_tag }} + tag_name: ${{ steps.release.outputs.version }} + files: ./build/release/flowVC.out draft: true prerelease: true generate_release_notes: true diff --git a/.github/workflows/.semantic-release.yaml b/.github/workflows/semantic-release.backup similarity index 100% rename from .github/workflows/.semantic-release.yaml rename to .github/workflows/semantic-release.backup From cd9ca24da264ac9d4225cc541ce2137b0f3f90a7 Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 03:47:30 -0700 Subject: [PATCH 27/68] Cd build 4 (#17) * yaml fix * yaml fix again * fix: try this yaml foramt --- .github/workflows/release.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5e0d13d..f305308 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,7 +49,6 @@ jobs: - name: Determine Release Info id: release uses: Fresa/trunk-based-release-versioning@main - - run: echo "Release version: ${{ steps.release.outputs.version }}" - name: Create Release uses: softprops/action-gh-release@v2 @@ -60,4 +59,3 @@ jobs: draft: true prerelease: true generate_release_notes: true - From 21b8c7fc8386f10d3a87d1f93acc3c16d1d025df Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 03:53:59 -0700 Subject: [PATCH 28/68] fix: remove token and use default (#18) --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f305308..f2bddfd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,7 +53,6 @@ jobs: - name: Create Release uses: softprops/action-gh-release@v2 with: - token: ${{ secrets.ORG_GH_ACCESS_TOKEN }} tag_name: ${{ steps.release.outputs.version }} files: ./build/release/flowVC.out draft: true From ad29d065ed5df5aca4407dab43fe07b4201f6179 Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 04:10:22 -0700 Subject: [PATCH 29/68] docs: update readme (#19) --- .github/workflows/{release.yml => cd.yml} | 0 .github/workflows/test.backup | 27 ----------------------- README.org | 19 ++++++++++++++-- 3 files changed, 17 insertions(+), 29 deletions(-) rename .github/workflows/{release.yml => cd.yml} (100%) delete mode 100644 .github/workflows/test.backup diff --git a/.github/workflows/release.yml b/.github/workflows/cd.yml similarity index 100% rename from .github/workflows/release.yml rename to .github/workflows/cd.yml diff --git a/.github/workflows/test.backup b/.github/workflows/test.backup deleted file mode 100644 index 523ad32..0000000 --- a/.github/workflows/test.backup +++ /dev/null @@ -1,27 +0,0 @@ -name: Tests - -on: - - push - - pull_request - -jobs: - test: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Setup Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: '3.0' - - name: Install Ceedling - run: gem install ceedling - - name: Install gcovr - run: pip install gcovr - - name: Run Unit tests - run: ceedling gcov:all - - name: Upload coverage report to Codecov - uses: codecov/codecov-action@v5 - with: - token: ${{ secrets.CODECOV_TOKEN }} diff --git a/README.org b/README.org index 3b5a843..58a86ca 100644 --- a/README.org +++ b/README.org @@ -2,7 +2,7 @@ Flow Visualization Code forked from FlowPhysics/flowVC -[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/actions/workflows/tests.yml/badge.svg]] +[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/actions/workflows/CI.yml/badge.svg]] [[https://codecov.io/gh/bkm82/flowVC][https://codecov.io/gh/bkm82/flowVC/graph/badge.svg?token=1U1152BG8T]] @@ -18,7 +18,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ** Installation *** Binaries -Currently this project does not have any pre-build binaries, so the code must be build from source. Reference the Development section below. The intent is to implement trunk based development. +This project has a pre-compiled binary for linux in the releases. + *** Development **** Dependencies [[https://www.ruby-lang.org/en/][Ruby]] > v 3.0: A programing language used for Ceedling @@ -53,5 +54,19 @@ gcovr: a code coverage reporter ceedling release #+end_src this will create the ./build/release/flowVC.out executable + + + +**** Guidlines + +***** Semantic Versioning: +This project intends to use a Trunk-Based Release with semantic versioning. Commit messages should follow [[https://www.conventionalcommits.org/en/v1.0.0/][conventional commits]] +#+begin_src shell +[optional scope]: +#+end_src + +Where the type determines the version updates. + +Valid types are fix, feat, BREAKING CHANGE, build, chore, ci, docs, style, refactor, perf, test From dee255676fb4d923a4c17782443ac8898d0061b7 Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 04:21:42 -0700 Subject: [PATCH 30/68] fix badges (#20) --- .github/workflows/{ci.yaml => ci.yml} | 0 README.org | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) rename .github/workflows/{ci.yaml => ci.yml} (100%) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yml similarity index 100% rename from .github/workflows/ci.yaml rename to .github/workflows/ci.yml diff --git a/README.org b/README.org index 58a86ca..ca7bcd1 100644 --- a/README.org +++ b/README.org @@ -2,7 +2,8 @@ Flow Visualization Code forked from FlowPhysics/flowVC -[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/actions/workflows/CI.yml/badge.svg]] +[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/actions/workflows/ci.yml/badge.svg]] +[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/actions/workflows/cd.yml/badge.svg]] [[https://codecov.io/gh/bkm82/flowVC][https://codecov.io/gh/bkm82/flowVC/graph/badge.svg?token=1U1152BG8T]] From 82a986526ba3383af1f79fb4f64ed14f38b1092d Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Fri, 7 Feb 2025 04:28:19 -0700 Subject: [PATCH 31/68] Update README.org (#21) Update badges --- README.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.org b/README.org index ca7bcd1..aba4c35 100644 --- a/README.org +++ b/README.org @@ -2,8 +2,8 @@ Flow Visualization Code forked from FlowPhysics/flowVC -[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/actions/workflows/ci.yml/badge.svg]] -[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/actions/workflows/cd.yml/badge.svg]] +[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/workflows/CI/badge.svg]] +[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/workflows/CD/badge.svg]] [[https://codecov.io/gh/bkm82/flowVC][https://codecov.io/gh/bkm82/flowVC/graph/badge.svg?token=1U1152BG8T]] From c212ba1e75ad54856d613137bbb0cd220f8ae5fa Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Sat, 8 Feb 2025 01:15:30 -0700 Subject: [PATCH 32/68] refactor: remove docker (#22) * refactor: remove vendord unity directory and docker file * ci: move to semantic-release github action. Need to test when merged to main --- .github/workflows/{cd.yml => cd.backup} | 0 ...ic-release.backup => semantic-release.yml} | 33 +- ...release.yaml => .releaserc.prerelease.yaml | 2 + .releaserc.yaml | 6 +- Dockerfile.ubuntu | 71 - unity/src/meson.build | 17 - unity/src/unity.c | 2488 ----------------- unity/src/unity.h | 698 ----- unity/src/unity_config.h | 251 -- unity/src/unity_internals.h | 1170 -------- 10 files changed, 22 insertions(+), 4714 deletions(-) rename .github/workflows/{cd.yml => cd.backup} (100%) rename .github/workflows/{semantic-release.backup => semantic-release.yml} (82%) rename releaserc.prerelease.yaml => .releaserc.prerelease.yaml (81%) delete mode 100644 Dockerfile.ubuntu delete mode 100644 unity/src/meson.build delete mode 100644 unity/src/unity.c delete mode 100644 unity/src/unity.h delete mode 100644 unity/src/unity_config.h delete mode 100644 unity/src/unity_internals.h diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.backup similarity index 100% rename from .github/workflows/cd.yml rename to .github/workflows/cd.backup diff --git a/.github/workflows/semantic-release.backup b/.github/workflows/semantic-release.yml similarity index 82% rename from .github/workflows/semantic-release.backup rename to .github/workflows/semantic-release.yml index c417340..f3c6570 100644 --- a/.github/workflows/semantic-release.backup +++ b/.github/workflows/semantic-release.yml @@ -1,12 +1,11 @@ +--- name: Semantic Release on: push: branches: - main - - dev/* - - feature/* - - hotfix/* + - remove_docker jobs: semantic-release: @@ -28,19 +27,30 @@ jobs: with: node-version: "lts/*" + - name: Generate Release using Docker + run: | + docker run \ + --interactive \ + --rm \ + -u $(id -u):$(id -g) \ + --volume .:/home/dev/project \ + throwtheswitch/madsciencelab-plugins:1.0.0 \ + ceedling release + - name: Prepare prerelease semantic if: github.ref != 'refs/heads/main' run: mv .releaserc.prerelease.yaml .releaserc.yaml - name: Semantic Release - uses: cycjimmy/semantic-release-action@v2 - id: semantic # Need an `id` for output variables + uses: cycjimmy/semantic-release-action@v4 + id: semantic # Need an `id` for output variables with: semantic_version: 17 extra_plugins: | @semantic-release/changelog@5 @semantic-release/exec@5 @semantic-release/git@9 + env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -52,16 +62,3 @@ jobs: echo ${{ steps.semantic.outputs.new_release_minor_version }} echo ${{ steps.semantic.outputs.new_release_patch_version }} echo ${{ steps.semantic.outputs.new_release_git_tag }} - docker run \ - --interactive \ - --rm \ - -u $(id -u):$(id -g) \ - --volume .:/home/dev/project \ - throwtheswitch/madsciencelab-plugins:1.0.0 \ - ceedling release - - - name: Publish GitHub Release - uses: softprops/action-gh-release@v2 - if: startsWith(github.ref, 'ref/tags/') - with: - files: ./build/release/flowVC.out diff --git a/releaserc.prerelease.yaml b/.releaserc.prerelease.yaml similarity index 81% rename from releaserc.prerelease.yaml rename to .releaserc.prerelease.yaml index d351999..d837b94 100644 --- a/releaserc.prerelease.yaml +++ b/.releaserc.prerelease.yaml @@ -9,6 +9,8 @@ branches: - main - name: dev/* prerelease: '${name.replace(/^dev\//g, "dev-")}' + - name: remove_docker/* + prerelease: '${name.replace(/^remove_docker\//g, "remove_docker-")}' - name: feature/* prerelease: '${name.replace(/^feature\//g, "feature-")}' - name: hotfix/* diff --git a/.releaserc.yaml b/.releaserc.yaml index ee3d4df..5531b87 100644 --- a/.releaserc.yaml +++ b/.releaserc.yaml @@ -4,7 +4,11 @@ plugins: - "@semantic-release/changelog" - "@semantic-release/git" - "@semantic-release/github" + - assets: + -path: ./build/release/flowVC.out + -label: flowVC.out branches: - "+([0-9])?(.{+([0-9]),x}).x" - - main \ No newline at end of file + - main + - remove_docker \ No newline at end of file diff --git a/Dockerfile.ubuntu b/Dockerfile.ubuntu deleted file mode 100644 index 517abe2..0000000 --- a/Dockerfile.ubuntu +++ /dev/null @@ -1,71 +0,0 @@ -FROM ubuntu:22.04 as base - -MAINTAINER lior.dux@develeap.com -LABEL maintainer.description='C Development environment with ceedling, cmock unity, and doxygen' -LABEL ceedling.version=ceedling-0.32.0-d76db35 -LABEL unity.version=2.5.4 -LABEL cmock.version=2.5.4 -LABEL cexception.version=1.3.3 -LABEL doxygen.version=v1.9.1 - -# Install the required packages -ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update && \ - apt-get install --yes --no-install-recommends \ - ca-certificates \ - systemd \ - build-essential \ - git \ - make \ - gcc \ - gcc-avr \ - valgrind \ - vim \ - bash \ - wget \ - curl \ - libz-dev \ - doxygen \ - libssl-dev \ - libreadline-dev \ - zlib1g-dev \ - autoconf \ - bison \ - libyaml-dev \ - libreadline-dev \ - libncurses5-dev \ - libffi-dev \ - libgdbm-dev - -# Clean the apt cache -RUN apt-get clean &&\ - rm -rf /var/cache/apt/archives/* && \ - rm -rf /var/lib/apt/lists/* - -# Set the timezone on build time -# ARG TZ Asia/Jerusalem -# ENV TZ $TZ -# RUN timedatectl set-timezone $TZ - -# Install rbenv-build -RUN curl --fail --silent --show-error --location https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash -ENV PATH="$PATH:/root/.rbenv/bin:/root/.rbenv/shims" - -# Validate rbenv using rbev-doctor -RUN curl --fail --silent --show-error --location https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-doctor | bash -RUN echo 'eval "$(~/.rbenv/bin/rbenv init -)"' >> /etc/profile.d/rbenv.sh - -# Install rbenv and set the desired version -ARG RBENV_VERSION=3.3.0 -ENV RBENV_VERSION $RBENV_VERSION -RUN rbenv install $RBENV_VERSION &&\ - rbenv global $RBENV_VERSION - -# Install ceedling, cmock and unity -COPY ./ceedling-0.32.0-d76db35.gem ceedling-0.32.0-d76db35.gem -RUN gem install constructor deep_merge thor -RUN gem install --local ./ceedling-0.32.0-d76db35.gem -HEALTHCHECK --interval=35s --timeout=4s --retries=2 CMD ceedling version || exit 1 - -WORKDIR /project -CMD bash \ No newline at end of file diff --git a/unity/src/meson.build b/unity/src/meson.build deleted file mode 100644 index 5365227..0000000 --- a/unity/src/meson.build +++ /dev/null @@ -1,17 +0,0 @@ -# -# build script written by : Michael Gene Brockus. -# github repo author: Mike Karlesky, Mark VanderVoord, Greg Williams. -# -# license: MIT -# - -unity_inc += include_directories('.') -unity_src += files('unity.c') - -if not meson.is_subproject() - install_headers( - 'unity.h', - 'unity_internals.h', - subdir: meson.project_name() - ) -endif diff --git a/unity/src/unity.c b/unity/src/unity.c deleted file mode 100644 index 7fd703a..0000000 --- a/unity/src/unity.c +++ /dev/null @@ -1,2488 +0,0 @@ -/* ========================================================================= - Unity - A Test Framework for C - ThrowTheSwitch.org - Copyright (c) 2007-24 Mike Karlesky, Mark VanderVoord, & Greg Williams - SPDX-License-Identifier: MIT -========================================================================= */ - -#include "unity.h" - -#ifndef UNITY_PROGMEM -#define UNITY_PROGMEM -#endif - -/* If omitted from header, declare overrideable prototypes here so they're ready for use */ -#ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION -void UNITY_OUTPUT_CHAR(int); -#endif - -/* Helpful macros for us to use here in Assert functions */ -#define UNITY_FAIL_AND_BAIL do { Unity.CurrentTestFailed = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } while (0) -#define UNITY_IGNORE_AND_BAIL do { Unity.CurrentTestIgnored = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } while (0) -#define RETURN_IF_FAIL_OR_IGNORE do { if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) { TEST_ABORT(); } } while (0) - -struct UNITY_STORAGE_T Unity; - -#ifdef UNITY_OUTPUT_COLOR -const char UNITY_PROGMEM UnityStrOk[] = "\033[42mOK\033[0m"; -const char UNITY_PROGMEM UnityStrPass[] = "\033[42mPASS\033[0m"; -const char UNITY_PROGMEM UnityStrFail[] = "\033[41mFAIL\033[0m"; -const char UNITY_PROGMEM UnityStrIgnore[] = "\033[43mIGNORE\033[0m"; -#else -const char UNITY_PROGMEM UnityStrOk[] = "OK"; -const char UNITY_PROGMEM UnityStrPass[] = "PASS"; -const char UNITY_PROGMEM UnityStrFail[] = "FAIL"; -const char UNITY_PROGMEM UnityStrIgnore[] = "IGNORE"; -#endif -static const char UNITY_PROGMEM UnityStrNull[] = "NULL"; -static const char UNITY_PROGMEM UnityStrSpacer[] = ". "; -static const char UNITY_PROGMEM UnityStrExpected[] = " Expected "; -static const char UNITY_PROGMEM UnityStrWas[] = " Was "; -static const char UNITY_PROGMEM UnityStrGt[] = " to be greater than "; -static const char UNITY_PROGMEM UnityStrLt[] = " to be less than "; -static const char UNITY_PROGMEM UnityStrOrEqual[] = "or equal to "; -static const char UNITY_PROGMEM UnityStrNotEqual[] = " to be not equal to "; -static const char UNITY_PROGMEM UnityStrElement[] = " Element "; -static const char UNITY_PROGMEM UnityStrByte[] = " Byte "; -static const char UNITY_PROGMEM UnityStrMemory[] = " Memory Mismatch."; -static const char UNITY_PROGMEM UnityStrDelta[] = " Values Not Within Delta "; -static const char UNITY_PROGMEM UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; -static const char UNITY_PROGMEM UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; -static const char UNITY_PROGMEM UnityStrNullPointerForActual[] = " Actual pointer was NULL"; -#ifndef UNITY_EXCLUDE_FLOAT -static const char UNITY_PROGMEM UnityStrNot[] = "Not "; -static const char UNITY_PROGMEM UnityStrInf[] = "Infinity"; -static const char UNITY_PROGMEM UnityStrNegInf[] = "Negative Infinity"; -static const char UNITY_PROGMEM UnityStrNaN[] = "NaN"; -static const char UNITY_PROGMEM UnityStrDet[] = "Determinate"; -static const char UNITY_PROGMEM UnityStrInvalidFloatTrait[] = "Invalid Float Trait"; -#endif -const char UNITY_PROGMEM UnityStrErrShorthand[] = "Unity Shorthand Support Disabled"; -const char UNITY_PROGMEM UnityStrErrFloat[] = "Unity Floating Point Disabled"; -const char UNITY_PROGMEM UnityStrErrDouble[] = "Unity Double Precision Disabled"; -const char UNITY_PROGMEM UnityStrErr64[] = "Unity 64-bit Support Disabled"; -static const char UNITY_PROGMEM UnityStrBreaker[] = "-----------------------"; -static const char UNITY_PROGMEM UnityStrResultsTests[] = " Tests "; -static const char UNITY_PROGMEM UnityStrResultsFailures[] = " Failures "; -static const char UNITY_PROGMEM UnityStrResultsIgnored[] = " Ignored "; -#ifndef UNITY_EXCLUDE_DETAILS -static const char UNITY_PROGMEM UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; -static const char UNITY_PROGMEM UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; -#endif -/*----------------------------------------------- - * Pretty Printers & Test Result Output Handlers - *-----------------------------------------------*/ - -/*-----------------------------------------------*/ -/* Local helper function to print characters. */ -static void UnityPrintChar(const char* pch) -{ - /* printable characters plus CR & LF are printed */ - if ((*pch <= 126) && (*pch >= 32)) - { - UNITY_OUTPUT_CHAR(*pch); - } - /* write escaped carriage returns */ - else if (*pch == 13) - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('r'); - } - /* write escaped line feeds */ - else if (*pch == 10) - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('n'); - } - /* unprintable characters are shown as codes */ - else - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('x'); - UnityPrintNumberHex((UNITY_UINT)*pch, 2); - } -} - -/*-----------------------------------------------*/ -/* Local helper function to print ANSI escape strings e.g. "\033[42m". */ -#ifdef UNITY_OUTPUT_COLOR -static UNITY_UINT UnityPrintAnsiEscapeString(const char* string) -{ - const char* pch = string; - UNITY_UINT count = 0; - - while (*pch && (*pch != 'm')) - { - UNITY_OUTPUT_CHAR(*pch); - pch++; - count++; - } - UNITY_OUTPUT_CHAR('m'); - count++; - - return count; -} -#endif - -/*-----------------------------------------------*/ -void UnityPrint(const char* string) -{ - const char* pch = string; - - if (pch != NULL) - { - while (*pch) - { -#ifdef UNITY_OUTPUT_COLOR - /* print ANSI escape code */ - if ((*pch == 27) && (*(pch + 1) == '[')) - { - pch += UnityPrintAnsiEscapeString(pch); - continue; - } -#endif - UnityPrintChar(pch); - pch++; - } - } -} -/*-----------------------------------------------*/ -void UnityPrintLen(const char* string, const UNITY_UINT32 length) -{ - const char* pch = string; - - if (pch != NULL) - { - while (*pch && ((UNITY_UINT32)(pch - string) < length)) - { - /* printable characters plus CR & LF are printed */ - if ((*pch <= 126) && (*pch >= 32)) - { - UNITY_OUTPUT_CHAR(*pch); - } - /* write escaped carriage returns */ - else if (*pch == 13) - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('r'); - } - /* write escaped line feeds */ - else if (*pch == 10) - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('n'); - } - /* unprintable characters are shown as codes */ - else - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('x'); - UnityPrintNumberHex((UNITY_UINT)*pch, 2); - } - pch++; - } - } -} - -/*-----------------------------------------------*/ -void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style) -{ - if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) - { - if (style == UNITY_DISPLAY_STYLE_CHAR) - { - /* printable characters plus CR & LF are printed */ - UNITY_OUTPUT_CHAR('\''); - if ((number <= 126) && (number >= 32)) - { - UNITY_OUTPUT_CHAR((int)number); - } - /* write escaped carriage returns */ - else if (number == 13) - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('r'); - } - /* write escaped line feeds */ - else if (number == 10) - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('n'); - } - /* unprintable characters are shown as codes */ - else - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('x'); - UnityPrintNumberHex((UNITY_UINT)number, 2); - } - UNITY_OUTPUT_CHAR('\''); - } - else - { - UnityPrintNumber(number); - } - } - else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) - { - UnityPrintNumberUnsigned((UNITY_UINT)number); - } - else - { - UNITY_OUTPUT_CHAR('0'); - UNITY_OUTPUT_CHAR('x'); - UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0xF) * 2)); - } -} - -/*-----------------------------------------------*/ -void UnityPrintNumber(const UNITY_INT number_to_print) -{ - UNITY_UINT number = (UNITY_UINT)number_to_print; - - if (number_to_print < 0) - { - /* A negative number, including MIN negative */ - UNITY_OUTPUT_CHAR('-'); - number = (~number) + 1; - } - UnityPrintNumberUnsigned(number); -} - -/*----------------------------------------------- - * basically do an itoa using as little ram as possible */ -void UnityPrintNumberUnsigned(const UNITY_UINT number) -{ - UNITY_UINT divisor = 1; - - /* figure out initial divisor */ - while (number / divisor > 9) - { - divisor *= 10; - } - - /* now mod and print, then divide divisor */ - do - { - UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); - divisor /= 10; - } while (divisor > 0); -} - -/*-----------------------------------------------*/ -void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print) -{ - int nibble; - char nibbles = nibbles_to_print; - - if ((unsigned)nibbles > UNITY_MAX_NIBBLES) - { - nibbles = UNITY_MAX_NIBBLES; - } - - while (nibbles > 0) - { - nibbles--; - nibble = (int)(number >> (nibbles * 4)) & 0x0F; - if (nibble <= 9) - { - UNITY_OUTPUT_CHAR((char)('0' + nibble)); - } - else - { - UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); - } - } -} - -/*-----------------------------------------------*/ -void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number) -{ - UNITY_UINT current_bit = (UNITY_UINT)1 << (UNITY_INT_WIDTH - 1); - UNITY_INT32 i; - - for (i = 0; i < UNITY_INT_WIDTH; i++) - { - if (current_bit & mask) - { - if (current_bit & number) - { - UNITY_OUTPUT_CHAR('1'); - } - else - { - UNITY_OUTPUT_CHAR('0'); - } - } - else - { - UNITY_OUTPUT_CHAR('X'); - } - current_bit = current_bit >> 1; - } -} - -/*-----------------------------------------------*/ -#ifndef UNITY_EXCLUDE_FLOAT_PRINT -/* - * This function prints a floating-point value in a format similar to - * printf("%.7g") on a single-precision machine or printf("%.9g") on a - * double-precision machine. The 7th digit won't always be totally correct - * in single-precision operation (for that level of accuracy, a more - * complicated algorithm would be needed). - */ -void UnityPrintFloat(const UNITY_DOUBLE input_number) -{ -#ifdef UNITY_INCLUDE_DOUBLE - static const int sig_digits = 9; - static const UNITY_INT32 min_scaled = 100000000; - static const UNITY_INT32 max_scaled = 1000000000; -#else - static const int sig_digits = 7; - static const UNITY_INT32 min_scaled = 1000000; - static const UNITY_INT32 max_scaled = 10000000; -#endif - - UNITY_DOUBLE number = input_number; - - /* print minus sign (does not handle negative zero) */ - if (number < 0.0f) - { - UNITY_OUTPUT_CHAR('-'); - number = -number; - } - - /* handle zero, NaN, and +/- infinity */ - if (number == 0.0f) - { - UnityPrint("0"); - } - else if (UNITY_IS_NAN(number)) - { - UnityPrint("nan"); - } - else if (UNITY_IS_INF(number)) - { - UnityPrint("inf"); - } - else - { - UNITY_INT32 n_int = 0; - UNITY_INT32 n; - int exponent = 0; - int decimals; - int digits; - char buf[16] = {0}; - - /* - * Scale up or down by powers of 10. To minimize rounding error, - * start with a factor/divisor of 10^10, which is the largest - * power of 10 that can be represented exactly. Finally, compute - * (exactly) the remaining power of 10 and perform one more - * multiplication or division. - */ - if (number < 1.0f) - { - UNITY_DOUBLE factor = 1.0f; - - while (number < (UNITY_DOUBLE)max_scaled / 1e10f) { number *= 1e10f; exponent -= 10; } - while (number * factor < (UNITY_DOUBLE)min_scaled) { factor *= 10.0f; exponent--; } - - number *= factor; - } - else if (number > (UNITY_DOUBLE)max_scaled) - { - UNITY_DOUBLE divisor = 1.0f; - - while (number > (UNITY_DOUBLE)min_scaled * 1e10f) { number /= 1e10f; exponent += 10; } - while (number / divisor > (UNITY_DOUBLE)max_scaled) { divisor *= 10.0f; exponent++; } - - number /= divisor; - } - else - { - /* - * In this range, we can split off the integer part before - * doing any multiplications. This reduces rounding error by - * freeing up significant bits in the fractional part. - */ - UNITY_DOUBLE factor = 1.0f; - n_int = (UNITY_INT32)number; - number -= (UNITY_DOUBLE)n_int; - - while (n_int < min_scaled) { n_int *= 10; factor *= 10.0f; exponent--; } - - number *= factor; - } - - /* round to nearest integer */ - n = ((UNITY_INT32)(number + number) + 1) / 2; - -#ifndef UNITY_ROUND_TIES_AWAY_FROM_ZERO - /* round to even if exactly between two integers */ - if ((n & 1) && (((UNITY_DOUBLE)n - number) == 0.5f)) - n--; -#endif - - n += n_int; - - if (n >= max_scaled) - { - n = min_scaled; - exponent++; - } - - /* determine where to place decimal point */ - decimals = ((exponent <= 0) && (exponent >= -(sig_digits + 3))) ? (-exponent) : (sig_digits - 1); - exponent += decimals; - - /* truncate trailing zeroes after decimal point */ - while ((decimals > 0) && ((n % 10) == 0)) - { - n /= 10; - decimals--; - } - - /* build up buffer in reverse order */ - digits = 0; - while ((n != 0) || (digits <= decimals)) - { - buf[digits++] = (char)('0' + n % 10); - n /= 10; - } - - /* print out buffer (backwards) */ - while (digits > 0) - { - if (digits == decimals) - { - UNITY_OUTPUT_CHAR('.'); - } - UNITY_OUTPUT_CHAR(buf[--digits]); - } - - /* print exponent if needed */ - if (exponent != 0) - { - UNITY_OUTPUT_CHAR('e'); - - if (exponent < 0) - { - UNITY_OUTPUT_CHAR('-'); - exponent = -exponent; - } - else - { - UNITY_OUTPUT_CHAR('+'); - } - - digits = 0; - while ((exponent != 0) || (digits < 2)) - { - buf[digits++] = (char)('0' + exponent % 10); - exponent /= 10; - } - while (digits > 0) - { - UNITY_OUTPUT_CHAR(buf[--digits]); - } - } - } -} -#endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */ - -/*-----------------------------------------------*/ -static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) -{ -#ifdef UNITY_OUTPUT_FOR_ECLIPSE - UNITY_OUTPUT_CHAR('('); - UnityPrint(file); - UNITY_OUTPUT_CHAR(':'); - UnityPrintNumber((UNITY_INT)line); - UNITY_OUTPUT_CHAR(')'); - UNITY_OUTPUT_CHAR(' '); - UnityPrint(Unity.CurrentTestName); - UNITY_OUTPUT_CHAR(':'); -#else -#ifdef UNITY_OUTPUT_FOR_IAR_WORKBENCH - UnityPrint("'); - UnityPrint(Unity.CurrentTestName); - UnityPrint(" "); -#else -#ifdef UNITY_OUTPUT_FOR_QT_CREATOR - UnityPrint("file://"); - UnityPrint(file); - UNITY_OUTPUT_CHAR(':'); - UnityPrintNumber((UNITY_INT)line); - UNITY_OUTPUT_CHAR(' '); - UnityPrint(Unity.CurrentTestName); - UNITY_OUTPUT_CHAR(':'); -#else - UnityPrint(file); - UNITY_OUTPUT_CHAR(':'); - UnityPrintNumber((UNITY_INT)line); - UNITY_OUTPUT_CHAR(':'); - UnityPrint(Unity.CurrentTestName); - UNITY_OUTPUT_CHAR(':'); -#endif -#endif -#endif -} - -/*-----------------------------------------------*/ -static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) -{ - UnityTestResultsBegin(Unity.TestFile, line); - UnityPrint(UnityStrFail); - UNITY_OUTPUT_CHAR(':'); -} - -/*-----------------------------------------------*/ -void UnityConcludeTest(void) -{ - if (Unity.CurrentTestIgnored) - { - Unity.TestIgnores++; - } - else if (!Unity.CurrentTestFailed) - { - UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); - UnityPrint(UnityStrPass); - } - else - { - Unity.TestFailures++; - } - - Unity.CurrentTestFailed = 0; - Unity.CurrentTestIgnored = 0; - UNITY_PRINT_EXEC_TIME(); - UNITY_PRINT_EOL(); - UNITY_FLUSH_CALL(); -} - -/*-----------------------------------------------*/ -static void UnityAddMsgIfSpecified(const char* msg) -{ -#ifdef UNITY_PRINT_TEST_CONTEXT - UnityPrint(UnityStrSpacer); - UNITY_PRINT_TEST_CONTEXT(); -#endif -#ifndef UNITY_EXCLUDE_DETAILS - if (Unity.CurrentDetail1) - { - UnityPrint(UnityStrSpacer); - UnityPrint(UnityStrDetail1Name); - UnityPrint(Unity.CurrentDetail1); - if (Unity.CurrentDetail2) - { - UnityPrint(UnityStrDetail2Name); - UnityPrint(Unity.CurrentDetail2); - } - } -#endif - if (msg) - { - UnityPrint(UnityStrSpacer); - UnityPrint(msg); - } -} - -/*-----------------------------------------------*/ -static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual) -{ - UnityPrint(UnityStrExpected); - if (expected != NULL) - { - UNITY_OUTPUT_CHAR('\''); - UnityPrint(expected); - UNITY_OUTPUT_CHAR('\''); - } - else - { - UnityPrint(UnityStrNull); - } - UnityPrint(UnityStrWas); - if (actual != NULL) - { - UNITY_OUTPUT_CHAR('\''); - UnityPrint(actual); - UNITY_OUTPUT_CHAR('\''); - } - else - { - UnityPrint(UnityStrNull); - } -} - -/*-----------------------------------------------*/ -static void UnityPrintExpectedAndActualStringsLen(const char* expected, - const char* actual, - const UNITY_UINT32 length) -{ - UnityPrint(UnityStrExpected); - if (expected != NULL) - { - UNITY_OUTPUT_CHAR('\''); - UnityPrintLen(expected, length); - UNITY_OUTPUT_CHAR('\''); - } - else - { - UnityPrint(UnityStrNull); - } - UnityPrint(UnityStrWas); - if (actual != NULL) - { - UNITY_OUTPUT_CHAR('\''); - UnityPrintLen(actual, length); - UNITY_OUTPUT_CHAR('\''); - } - else - { - UnityPrint(UnityStrNull); - } -} - -/*----------------------------------------------- - * Assertion & Control Helpers - *-----------------------------------------------*/ - -/*-----------------------------------------------*/ -static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected, - UNITY_INTERNAL_PTR actual, - const UNITY_LINE_TYPE lineNumber, - const char* msg) -{ - /* Both are NULL or same pointer */ - if (expected == actual) { return 0; } - - /* print and return true if just expected is NULL */ - if (expected == NULL) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrNullPointerForExpected); - UnityAddMsgIfSpecified(msg); - return 1; - } - - /* print and return true if just actual is NULL */ - if (actual == NULL) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrNullPointerForActual); - UnityAddMsgIfSpecified(msg); - return 1; - } - - return 0; /* return false if neither is NULL */ -} - -/*----------------------------------------------- - * Assertion Functions - *-----------------------------------------------*/ - -/*-----------------------------------------------*/ -void UnityAssertBits(const UNITY_INT mask, - const UNITY_INT expected, - const UNITY_INT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - RETURN_IF_FAIL_OR_IGNORE; - - if ((mask & expected) != (mask & actual)) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)expected); - UnityPrint(UnityStrWas); - UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)actual); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -/*-----------------------------------------------*/ -void UnityAssertEqualNumber(const UNITY_INT expected, - const UNITY_INT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style) -{ - RETURN_IF_FAIL_OR_IGNORE; - - if (expected != actual) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(expected, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(actual, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -/*-----------------------------------------------*/ -void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold, - const UNITY_INT actual, - const UNITY_COMPARISON_T compare, - const char *msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style) -{ - int failed = 0; - RETURN_IF_FAIL_OR_IGNORE; - - if ((threshold == actual) && (compare & UNITY_EQUAL_TO)) { return; } - if ((threshold == actual)) { failed = 1; } - - if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) - { - if ((actual > threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } - if ((actual < threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } - } - else /* UINT or HEX */ - { - if (((UNITY_UINT)actual > (UNITY_UINT)threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } - if (((UNITY_UINT)actual < (UNITY_UINT)threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } - } - - if (failed) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(actual, style); - if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } - if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } - if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } - if (compare == UNITY_NOT_EQUAL) { UnityPrint(UnityStrNotEqual); } - UnityPrintNumberByStyle(threshold, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -#define UnityPrintPointlessAndBail() \ -do { \ - UnityTestResultsFailBegin(lineNumber); \ - UnityPrint(UnityStrPointless); \ - UnityAddMsgIfSpecified(msg); \ - UNITY_FAIL_AND_BAIL; \ -} while (0) - -/*-----------------------------------------------*/ -void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, - UNITY_INTERNAL_PTR actual, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style, - const UNITY_FLAGS_T flags) -{ - UNITY_UINT32 elements = num_elements; - unsigned int length = style & 0xF; - unsigned int increment = 0; - - RETURN_IF_FAIL_OR_IGNORE; - - if (num_elements == 0) - { -#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY - UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); -#else - UnityPrintPointlessAndBail(); -#endif - } - - if (expected == actual) - { - return; /* Both are NULL or same pointer */ - } - - if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) - { - UNITY_FAIL_AND_BAIL; - } - - while ((elements > 0) && (elements--)) - { - UNITY_INT expect_val; - UNITY_INT actual_val; - - switch (length) - { - case 1: - expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected; - actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual; - if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) - { - expect_val &= 0x000000FF; - actual_val &= 0x000000FF; - } - increment = sizeof(UNITY_INT8); - break; - - case 2: - expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; - actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; - if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) - { - expect_val &= 0x0000FFFF; - actual_val &= 0x0000FFFF; - } - increment = sizeof(UNITY_INT16); - break; - -#ifdef UNITY_SUPPORT_64 - case 8: - expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; - actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; - increment = sizeof(UNITY_INT64); - break; -#endif - - default: /* default is length 4 bytes */ - case 4: - expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; - actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; -#ifdef UNITY_SUPPORT_64 - if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) - { - expect_val &= 0x00000000FFFFFFFF; - actual_val &= 0x00000000FFFFFFFF; - } -#endif - increment = sizeof(UNITY_INT32); - length = 4; - break; - } - - if (expect_val != actual_val) - { - if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8))) - { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ - UNITY_INT mask = 1; - mask = (mask << 8 * length) - 1; - expect_val &= mask; - actual_val &= mask; - } - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberUnsigned(num_elements - elements - 1); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(expect_val, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(actual_val, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - /* Walk through array by incrementing the pointers */ - if (flags == UNITY_ARRAY_TO_ARRAY) - { - expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment); - } - actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment); - } -} - -/*-----------------------------------------------*/ -#ifndef UNITY_EXCLUDE_FLOAT -/* Wrap this define in a function with variable types as float or double */ -#define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \ - if (UNITY_IS_INF(expected) && UNITY_IS_INF(actual) && (((expected) < 0) == ((actual) < 0))) return 1; \ - if (UNITY_NAN_CHECK) return 1; \ - (diff) = (actual) - (expected); \ - if ((diff) < 0) (diff) = -(diff); \ - if ((delta) < 0) (delta) = -(delta); \ - return !(UNITY_IS_NAN(diff) || UNITY_IS_INF(diff) || ((diff) > (delta))) - /* This first part of this condition will catch any NaN or Infinite values */ -#ifndef UNITY_NAN_NOT_EQUAL_NAN - #define UNITY_NAN_CHECK UNITY_IS_NAN(expected) && UNITY_IS_NAN(actual) -#else - #define UNITY_NAN_CHECK 0 -#endif - -#ifndef UNITY_EXCLUDE_FLOAT_PRINT - #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ - do { \ - UnityPrint(UnityStrExpected); \ - UnityPrintFloat(expected); \ - UnityPrint(UnityStrWas); \ - UnityPrintFloat(actual); \ - } while (0) -#else - #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ - UnityPrint(UnityStrDelta) -#endif /* UNITY_EXCLUDE_FLOAT_PRINT */ - -/*-----------------------------------------------*/ -static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual) -{ - UNITY_FLOAT diff; - UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); -} - -/*-----------------------------------------------*/ -void UnityAssertWithinFloatArray(const UNITY_FLOAT delta, - UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, - UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLAGS_T flags) -{ - UNITY_UINT32 elements = num_elements; - UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected; - UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual; - UNITY_FLOAT in_delta = delta; - UNITY_FLOAT current_element_delta = delta; - - RETURN_IF_FAIL_OR_IGNORE; - - if (elements == 0) - { -#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY - UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); -#else - UnityPrintPointlessAndBail(); -#endif - } - - if (UNITY_IS_INF(in_delta)) - { - return; /* Arrays will be force equal with infinite delta */ - } - - if (UNITY_IS_NAN(in_delta)) - { - /* Delta must be correct number */ - UnityPrintPointlessAndBail(); - } - - if (expected == actual) - { - return; /* Both are NULL or same pointer */ - } - - if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) - { - UNITY_FAIL_AND_BAIL; - } - - /* fix delta sign if need */ - if (in_delta < 0) - { - in_delta = -in_delta; - } - - while (elements--) - { - current_element_delta = *ptr_expected * UNITY_FLOAT_PRECISION; - - if (current_element_delta < 0) - { - /* fix delta sign for correct calculations */ - current_element_delta = -current_element_delta; - } - - if (!UnityFloatsWithin(in_delta + current_element_delta, *ptr_expected, *ptr_actual)) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberUnsigned(num_elements - elements - 1); - UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)*ptr_expected, (UNITY_DOUBLE)*ptr_actual); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - if (flags == UNITY_ARRAY_TO_ARRAY) - { - ptr_expected++; - } - ptr_actual++; - } -} - -/*-----------------------------------------------*/ -void UnityAssertFloatsWithin(const UNITY_FLOAT delta, - const UNITY_FLOAT expected, - const UNITY_FLOAT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - RETURN_IF_FAIL_OR_IGNORE; - - - if (!UnityFloatsWithin(delta, expected, actual)) - { - UnityTestResultsFailBegin(lineNumber); - UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -/*-----------------------------------------------*/ -void UnityAssertFloatsNotWithin(const UNITY_FLOAT delta, - const UNITY_FLOAT expected, - const UNITY_FLOAT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - RETURN_IF_FAIL_OR_IGNORE; - - if (UnityFloatsWithin(delta, expected, actual)) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - UnityPrintFloat((UNITY_DOUBLE)expected); - UnityPrint(UnityStrNotEqual); - UnityPrintFloat((UNITY_DOUBLE)actual); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -/*-----------------------------------------------*/ -void UnityAssertGreaterOrLessFloat(const UNITY_FLOAT threshold, - const UNITY_FLOAT actual, - const UNITY_COMPARISON_T compare, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - int failed; - - RETURN_IF_FAIL_OR_IGNORE; - - failed = 0; - - /* Checking for "not success" rather than failure to get the right result for NaN */ - if (!(actual < threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } - if (!(actual > threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } - - if ((compare & UNITY_EQUAL_TO) && UnityFloatsWithin(threshold * UNITY_FLOAT_PRECISION, threshold, actual)) { failed = 0; } - - if (failed) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - UnityPrintFloat(actual); - if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } - if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } - if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } - UnityPrintFloat(threshold); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -/*-----------------------------------------------*/ -void UnityAssertFloatSpecial(const UNITY_FLOAT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLOAT_TRAIT_T style) -{ - const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; - UNITY_INT should_be_trait = ((UNITY_INT)style & 1); - UNITY_INT is_trait = !should_be_trait; - UNITY_INT trait_index = (UNITY_INT)(style >> 1); - - RETURN_IF_FAIL_OR_IGNORE; - - switch (style) - { - case UNITY_FLOAT_IS_INF: - case UNITY_FLOAT_IS_NOT_INF: - is_trait = UNITY_IS_INF(actual) && (actual > 0); - break; - case UNITY_FLOAT_IS_NEG_INF: - case UNITY_FLOAT_IS_NOT_NEG_INF: - is_trait = UNITY_IS_INF(actual) && (actual < 0); - break; - - case UNITY_FLOAT_IS_NAN: - case UNITY_FLOAT_IS_NOT_NAN: - is_trait = UNITY_IS_NAN(actual) ? 1 : 0; - break; - - case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ - case UNITY_FLOAT_IS_NOT_DET: - is_trait = !UNITY_IS_INF(actual) && !UNITY_IS_NAN(actual); - break; - - case UNITY_FLOAT_INVALID_TRAIT: /* Supress warning */ - default: /* including UNITY_FLOAT_INVALID_TRAIT */ - trait_index = 0; - trait_names[0] = UnityStrInvalidFloatTrait; - break; - } - - if (is_trait != should_be_trait) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - if (!should_be_trait) - { - UnityPrint(UnityStrNot); - } - UnityPrint(trait_names[trait_index]); - UnityPrint(UnityStrWas); -#ifndef UNITY_EXCLUDE_FLOAT_PRINT - UnityPrintFloat((UNITY_DOUBLE)actual); -#else - if (should_be_trait) - { - UnityPrint(UnityStrNot); - } - UnityPrint(trait_names[trait_index]); -#endif - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -#endif /* not UNITY_EXCLUDE_FLOAT */ - -/*-----------------------------------------------*/ -#ifndef UNITY_EXCLUDE_DOUBLE -static int UnityDoublesWithin(UNITY_DOUBLE delta, UNITY_DOUBLE expected, UNITY_DOUBLE actual) -{ - UNITY_DOUBLE diff; - UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); -} - -/*-----------------------------------------------*/ -void UnityAssertWithinDoubleArray(const UNITY_DOUBLE delta, - UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected, - UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLAGS_T flags) -{ - UNITY_UINT32 elements = num_elements; - UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected; - UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual; - UNITY_DOUBLE in_delta = delta; - UNITY_DOUBLE current_element_delta = delta; - - RETURN_IF_FAIL_OR_IGNORE; - - if (elements == 0) - { -#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY - UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); -#else - UnityPrintPointlessAndBail(); -#endif - } - - if (UNITY_IS_INF(in_delta)) - { - return; /* Arrays will be force equal with infinite delta */ - } - - if (UNITY_IS_NAN(in_delta)) - { - /* Delta must be correct number */ - UnityPrintPointlessAndBail(); - } - - if (expected == actual) - { - return; /* Both are NULL or same pointer */ - } - - if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) - { - UNITY_FAIL_AND_BAIL; - } - - /* fix delta sign if need */ - if (in_delta < 0) - { - in_delta = -in_delta; - } - - while (elements--) - { - current_element_delta = *ptr_expected * UNITY_DOUBLE_PRECISION; - - if (current_element_delta < 0) - { - /* fix delta sign for correct calculations */ - current_element_delta = -current_element_delta; - } - - if (!UnityDoublesWithin(in_delta + current_element_delta, *ptr_expected, *ptr_actual)) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberUnsigned(num_elements - elements - 1); - UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - if (flags == UNITY_ARRAY_TO_ARRAY) - { - ptr_expected++; - } - ptr_actual++; - } -} - -/*-----------------------------------------------*/ -void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, - const UNITY_DOUBLE expected, - const UNITY_DOUBLE actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - RETURN_IF_FAIL_OR_IGNORE; - - if (!UnityDoublesWithin(delta, expected, actual)) - { - UnityTestResultsFailBegin(lineNumber); - UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -/*-----------------------------------------------*/ -void UnityAssertDoublesNotWithin(const UNITY_DOUBLE delta, - const UNITY_DOUBLE expected, - const UNITY_DOUBLE actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - RETURN_IF_FAIL_OR_IGNORE; - - if (UnityDoublesWithin(delta, expected, actual)) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - UnityPrintFloat((UNITY_DOUBLE)expected); - UnityPrint(UnityStrNotEqual); - UnityPrintFloat((UNITY_DOUBLE)actual); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -/*-----------------------------------------------*/ -void UnityAssertGreaterOrLessDouble(const UNITY_DOUBLE threshold, - const UNITY_DOUBLE actual, - const UNITY_COMPARISON_T compare, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - int failed; - - RETURN_IF_FAIL_OR_IGNORE; - - failed = 0; - - /* Checking for "not success" rather than failure to get the right result for NaN */ - if (!(actual < threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } - if (!(actual > threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } - - if ((compare & UNITY_EQUAL_TO) && UnityDoublesWithin(threshold * UNITY_DOUBLE_PRECISION, threshold, actual)) { failed = 0; } - - if (failed) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - UnityPrintFloat(actual); - if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } - if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } - if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } - UnityPrintFloat(threshold); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -/*-----------------------------------------------*/ -void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLOAT_TRAIT_T style) -{ - const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; - UNITY_INT should_be_trait = ((UNITY_INT)style & 1); - UNITY_INT is_trait = !should_be_trait; - UNITY_INT trait_index = (UNITY_INT)(style >> 1); - - RETURN_IF_FAIL_OR_IGNORE; - - switch (style) - { - case UNITY_FLOAT_IS_INF: - case UNITY_FLOAT_IS_NOT_INF: - is_trait = UNITY_IS_INF(actual) && (actual > 0); - break; - case UNITY_FLOAT_IS_NEG_INF: - case UNITY_FLOAT_IS_NOT_NEG_INF: - is_trait = UNITY_IS_INF(actual) && (actual < 0); - break; - - case UNITY_FLOAT_IS_NAN: - case UNITY_FLOAT_IS_NOT_NAN: - is_trait = UNITY_IS_NAN(actual) ? 1 : 0; - break; - - case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ - case UNITY_FLOAT_IS_NOT_DET: - is_trait = !UNITY_IS_INF(actual) && !UNITY_IS_NAN(actual); - break; - - case UNITY_FLOAT_INVALID_TRAIT: /* Supress warning */ - default: /* including UNITY_FLOAT_INVALID_TRAIT */ - trait_index = 0; - trait_names[0] = UnityStrInvalidFloatTrait; - break; - } - - if (is_trait != should_be_trait) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - if (!should_be_trait) - { - UnityPrint(UnityStrNot); - } - UnityPrint(trait_names[trait_index]); - UnityPrint(UnityStrWas); -#ifndef UNITY_EXCLUDE_FLOAT_PRINT - UnityPrintFloat(actual); -#else - if (should_be_trait) - { - UnityPrint(UnityStrNot); - } - UnityPrint(trait_names[trait_index]); -#endif - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -#endif /* not UNITY_EXCLUDE_DOUBLE */ - -/*-----------------------------------------------*/ -void UnityAssertNumbersWithin(const UNITY_UINT delta, - const UNITY_INT expected, - const UNITY_INT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style) -{ - RETURN_IF_FAIL_OR_IGNORE; - - if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) - { - if (actual > expected) - { - Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta); - } - else - { - Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta); - } - } - else - { - if ((UNITY_UINT)actual > (UNITY_UINT)expected) - { - Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta); - } - else - { - Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta); - } - } - - if (Unity.CurrentTestFailed) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrDelta); - UnityPrintNumberByStyle((UNITY_INT)delta, style); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(expected, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(actual, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -/*-----------------------------------------------*/ -void UnityAssertNumbersArrayWithin(const UNITY_UINT delta, - UNITY_INTERNAL_PTR expected, - UNITY_INTERNAL_PTR actual, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style, - const UNITY_FLAGS_T flags) -{ - UNITY_UINT32 elements = num_elements; - unsigned int length = style & 0xF; - unsigned int increment = 0; - - RETURN_IF_FAIL_OR_IGNORE; - - if (num_elements == 0) - { -#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY - UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); -#else - UnityPrintPointlessAndBail(); -#endif - } - - if (expected == actual) - { - return; /* Both are NULL or same pointer */ - } - - if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) - { - UNITY_FAIL_AND_BAIL; - } - - while ((elements > 0) && (elements--)) - { - UNITY_INT expect_val; - UNITY_INT actual_val; - - switch (length) - { - case 1: - /* fixing problems with signed overflow on unsigned numbers */ - if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) - { - expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected; - actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual; - increment = sizeof(UNITY_INT8); - } - else - { - expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT8*)expected; - actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT8*)actual; - increment = sizeof(UNITY_UINT8); - } - break; - - case 2: - /* fixing problems with signed overflow on unsigned numbers */ - if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) - { - expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; - actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; - increment = sizeof(UNITY_INT16); - } - else - { - expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT16*)expected; - actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT16*)actual; - increment = sizeof(UNITY_UINT16); - } - break; - -#ifdef UNITY_SUPPORT_64 - case 8: - /* fixing problems with signed overflow on unsigned numbers */ - if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) - { - expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; - actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; - increment = sizeof(UNITY_INT64); - } - else - { - expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT64*)expected; - actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT64*)actual; - increment = sizeof(UNITY_UINT64); - } - break; -#endif - - default: /* default is length 4 bytes */ - case 4: - /* fixing problems with signed overflow on unsigned numbers */ - if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) - { - expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; - actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; - increment = sizeof(UNITY_INT32); - } - else - { - expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT32*)expected; - actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT32*)actual; - increment = sizeof(UNITY_UINT32); - } - length = 4; - break; - } - - if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) - { - if (actual_val > expect_val) - { - Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta); - } - else - { - Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta); - } - } - else - { - if ((UNITY_UINT)actual_val > (UNITY_UINT)expect_val) - { - Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta); - } - else - { - Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta); - } - } - - if (Unity.CurrentTestFailed) - { - if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8))) - { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ - UNITY_INT mask = 1; - mask = (mask << 8 * length) - 1; - expect_val &= mask; - actual_val &= mask; - } - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrDelta); - UnityPrintNumberByStyle((UNITY_INT)delta, style); - UnityPrint(UnityStrElement); - UnityPrintNumberUnsigned(num_elements - elements - 1); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(expect_val, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(actual_val, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - /* Walk through array by incrementing the pointers */ - if (flags == UNITY_ARRAY_TO_ARRAY) - { - expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment); - } - actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment); - } -} - -/*-----------------------------------------------*/ -void UnityAssertEqualString(const char* expected, - const char* actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - UNITY_UINT32 i; - - RETURN_IF_FAIL_OR_IGNORE; - - /* if both pointers not null compare the strings */ - if (expected && actual) - { - for (i = 0; expected[i] || actual[i]; i++) - { - if (expected[i] != actual[i]) - { - Unity.CurrentTestFailed = 1; - break; - } - } - } - else - { /* fail if either null but not if both */ - if (expected || actual) - { - Unity.CurrentTestFailed = 1; - } - } - - if (Unity.CurrentTestFailed) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrintExpectedAndActualStrings(expected, actual); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -/*-----------------------------------------------*/ -void UnityAssertEqualStringLen(const char* expected, - const char* actual, - const UNITY_UINT32 length, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - UNITY_UINT32 i; - - RETURN_IF_FAIL_OR_IGNORE; - - /* if both pointers not null compare the strings */ - if (expected && actual) - { - for (i = 0; (i < length) && (expected[i] || actual[i]); i++) - { - if (expected[i] != actual[i]) - { - Unity.CurrentTestFailed = 1; - break; - } - } - } - else - { /* fail if either null but not if both */ - if (expected || actual) - { - Unity.CurrentTestFailed = 1; - } - } - - if (Unity.CurrentTestFailed) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrintExpectedAndActualStringsLen(expected, actual, length); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -/*-----------------------------------------------*/ -void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, - const char** actual, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLAGS_T flags) -{ - UNITY_UINT32 i = 0; - UNITY_UINT32 j = 0; - const char* expd = NULL; - const char* act = NULL; - - RETURN_IF_FAIL_OR_IGNORE; - - /* if no elements, it's an error */ - if (num_elements == 0) - { -#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY - UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); -#else - UnityPrintPointlessAndBail(); -#endif - } - - if ((const void*)expected == (const void*)actual) - { - return; /* Both are NULL or same pointer */ - } - - if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) - { - UNITY_FAIL_AND_BAIL; - } - - if (flags != UNITY_ARRAY_TO_ARRAY) - { - expd = (const char*)expected; - } - - do - { - act = actual[j]; - if (flags == UNITY_ARRAY_TO_ARRAY) - { - expd = ((const char* const*)expected)[j]; - } - - /* if both pointers not null compare the strings */ - if (expd && act) - { - for (i = 0; expd[i] || act[i]; i++) - { - if (expd[i] != act[i]) - { - Unity.CurrentTestFailed = 1; - break; - } - } - } - else - { /* handle case of one pointers being null (if both null, test should pass) */ - if (expd != act) - { - Unity.CurrentTestFailed = 1; - } - } - - if (Unity.CurrentTestFailed) - { - UnityTestResultsFailBegin(lineNumber); - if (num_elements > 1) - { - UnityPrint(UnityStrElement); - UnityPrintNumberUnsigned(j); - } - UnityPrintExpectedAndActualStrings(expd, act); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - } while (++j < num_elements); -} - -/*-----------------------------------------------*/ -void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, - UNITY_INTERNAL_PTR actual, - const UNITY_UINT32 length, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLAGS_T flags) -{ - UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; - UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; - UNITY_UINT32 elements = num_elements; - UNITY_UINT32 bytes; - - RETURN_IF_FAIL_OR_IGNORE; - - if (elements == 0) - { -#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY - UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); -#else - UnityPrintPointlessAndBail(); -#endif - } - if (length == 0) - { - UnityPrintPointlessAndBail(); - } - - if (expected == actual) - { - return; /* Both are NULL or same pointer */ - } - - if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) - { - UNITY_FAIL_AND_BAIL; - } - - while (elements--) - { - bytes = length; - while (bytes--) - { - if (*ptr_exp != *ptr_act) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrMemory); - if (num_elements > 1) - { - UnityPrint(UnityStrElement); - UnityPrintNumberUnsigned(num_elements - elements - 1); - } - UnityPrint(UnityStrByte); - UnityPrintNumberUnsigned(length - bytes - 1); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - ptr_exp++; - ptr_act++; - } - if (flags == UNITY_ARRAY_TO_VAL) - { - ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; - } - } -} - -/*-----------------------------------------------*/ - -static union -{ - UNITY_INT8 i8; - UNITY_INT16 i16; - UNITY_INT32 i32; -#ifdef UNITY_SUPPORT_64 - UNITY_INT64 i64; -#endif -#ifndef UNITY_EXCLUDE_FLOAT - float f; -#endif -#ifndef UNITY_EXCLUDE_DOUBLE - double d; -#endif -} UnityQuickCompare; - -UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) -{ - switch(size) - { - case 1: - UnityQuickCompare.i8 = (UNITY_INT8)num; - return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8); - - case 2: - UnityQuickCompare.i16 = (UNITY_INT16)num; - return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16); - -#ifdef UNITY_SUPPORT_64 - case 8: - UnityQuickCompare.i64 = (UNITY_INT64)num; - return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64); -#endif - - default: /* 4 bytes */ - UnityQuickCompare.i32 = (UNITY_INT32)num; - return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32); - } -} - -#ifndef UNITY_EXCLUDE_FLOAT -/*-----------------------------------------------*/ -UNITY_INTERNAL_PTR UnityFloatToPtr(const float num) -{ - UnityQuickCompare.f = num; - return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.f); -} -#endif - -#ifndef UNITY_EXCLUDE_DOUBLE -/*-----------------------------------------------*/ -UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num) -{ - UnityQuickCompare.d = num; - return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.d); -} -#endif - -#ifdef UNITY_INCLUDE_PRINT_FORMATTED - -/*----------------------------------------------- - * printf length modifier helpers - *-----------------------------------------------*/ - -enum UnityLengthModifier { - UNITY_LENGTH_MODIFIER_NONE, - UNITY_LENGTH_MODIFIER_LONG_LONG, - UNITY_LENGTH_MODIFIER_LONG, -}; - -#define UNITY_EXTRACT_ARG(NUMBER_T, NUMBER, LENGTH_MOD, VA, ARG_T) \ -do { \ - switch (LENGTH_MOD) \ - { \ - case UNITY_LENGTH_MODIFIER_LONG_LONG: \ - { \ - NUMBER = (NUMBER_T)va_arg(VA, long long ARG_T); \ - break; \ - } \ - case UNITY_LENGTH_MODIFIER_LONG: \ - { \ - NUMBER = (NUMBER_T)va_arg(VA, long ARG_T); \ - break; \ - } \ - case UNITY_LENGTH_MODIFIER_NONE: \ - default: \ - { \ - NUMBER = (NUMBER_T)va_arg(VA, ARG_T); \ - break; \ - } \ - } \ -} while (0) - -static enum UnityLengthModifier UnityLengthModifierGet(const char *pch, int *length) -{ - enum UnityLengthModifier length_mod; - switch (pch[0]) - { - case 'l': - { - if (pch[1] == 'l') - { - *length = 2; - length_mod = UNITY_LENGTH_MODIFIER_LONG_LONG; - } - else - { - *length = 1; - length_mod = UNITY_LENGTH_MODIFIER_LONG; - } - break; - } - case 'h': - { - // short and char are converted to int - length_mod = UNITY_LENGTH_MODIFIER_NONE; - if (pch[1] == 'h') - { - *length = 2; - } - else - { - *length = 1; - } - break; - } - case 'j': - case 'z': - case 't': - case 'L': - { - // Not supported, but should gobble up the length specifier anyway - length_mod = UNITY_LENGTH_MODIFIER_NONE; - *length = 1; - break; - } - default: - { - length_mod = UNITY_LENGTH_MODIFIER_NONE; - *length = 0; - } - } - return length_mod; -} - -/*----------------------------------------------- - * printf helper function - *-----------------------------------------------*/ -static void UnityPrintFVA(const char* format, va_list va) -{ - const char* pch = format; - if (pch != NULL) - { - while (*pch) - { - /* format identification character */ - if (*pch == '%') - { - pch++; - - if (pch != NULL) - { - int length_mod_size; - enum UnityLengthModifier length_mod = UnityLengthModifierGet(pch, &length_mod_size); - pch += length_mod_size; - - switch (*pch) - { - case 'd': - case 'i': - { - UNITY_INT number; - UNITY_EXTRACT_ARG(UNITY_INT, number, length_mod, va, int); - UnityPrintNumber((UNITY_INT)number); - break; - } -#ifndef UNITY_EXCLUDE_FLOAT_PRINT - case 'f': - case 'g': - { - const double number = va_arg(va, double); - UnityPrintFloat((UNITY_DOUBLE)number); - break; - } -#endif - case 'u': - { - UNITY_UINT number; - UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); - UnityPrintNumberUnsigned(number); - break; - } - case 'b': - { - UNITY_UINT number; - UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); - const UNITY_UINT mask = (UNITY_UINT)0 - (UNITY_UINT)1; - UNITY_OUTPUT_CHAR('0'); - UNITY_OUTPUT_CHAR('b'); - UnityPrintMask(mask, number); - break; - } - case 'x': - case 'X': - { - UNITY_UINT number; - UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); - UNITY_OUTPUT_CHAR('0'); - UNITY_OUTPUT_CHAR('x'); - UnityPrintNumberHex(number, UNITY_MAX_NIBBLES); - break; - } - case 'p': - { - UNITY_UINT number; - char nibbles_to_print = 8; - if (UNITY_POINTER_WIDTH == 64) - { - length_mod = UNITY_LENGTH_MODIFIER_LONG_LONG; - nibbles_to_print = 16; - } - UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); - UNITY_OUTPUT_CHAR('0'); - UNITY_OUTPUT_CHAR('x'); - UnityPrintNumberHex((UNITY_UINT)number, nibbles_to_print); - break; - } - case 'c': - { - const int ch = va_arg(va, int); - UnityPrintChar((const char *)&ch); - break; - } - case 's': - { - const char * string = va_arg(va, const char *); - UnityPrint(string); - break; - } - case '%': - { - UnityPrintChar(pch); - break; - } - default: - { - /* print the unknown format character */ - UNITY_OUTPUT_CHAR('%'); - UnityPrintChar(pch); - break; - } - } - } - } -#ifdef UNITY_OUTPUT_COLOR - /* print ANSI escape code */ - else if ((*pch == 27) && (*(pch + 1) == '[')) - { - pch += UnityPrintAnsiEscapeString(pch); - continue; - } -#endif - else if (*pch == '\n') - { - UNITY_PRINT_EOL(); - } - else - { - UnityPrintChar(pch); - } - - pch++; - } - } -} - -void UnityPrintF(const UNITY_LINE_TYPE line, const char* format, ...) -{ - UnityTestResultsBegin(Unity.TestFile, line); - UnityPrint("INFO"); - if(format != NULL) - { - UnityPrint(": "); - va_list va; - va_start(va, format); - UnityPrintFVA(format, va); - va_end(va); - } - UNITY_PRINT_EOL(); -} -#endif /* ! UNITY_INCLUDE_PRINT_FORMATTED */ - - -/*----------------------------------------------- - * Control Functions - *-----------------------------------------------*/ - -/*-----------------------------------------------*/ -void UnityFail(const char* msg, const UNITY_LINE_TYPE line) -{ - RETURN_IF_FAIL_OR_IGNORE; - - UnityTestResultsBegin(Unity.TestFile, line); - UnityPrint(UnityStrFail); - if (msg != NULL) - { - UNITY_OUTPUT_CHAR(':'); - -#ifdef UNITY_PRINT_TEST_CONTEXT - UNITY_PRINT_TEST_CONTEXT(); -#endif -#ifndef UNITY_EXCLUDE_DETAILS - if (Unity.CurrentDetail1) - { - UnityPrint(UnityStrDetail1Name); - UnityPrint(Unity.CurrentDetail1); - if (Unity.CurrentDetail2) - { - UnityPrint(UnityStrDetail2Name); - UnityPrint(Unity.CurrentDetail2); - } - UnityPrint(UnityStrSpacer); - } -#endif - if (msg[0] != ' ') - { - UNITY_OUTPUT_CHAR(' '); - } - UnityPrint(msg); - } - - UNITY_FAIL_AND_BAIL; -} - -/*-----------------------------------------------*/ -void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) -{ - RETURN_IF_FAIL_OR_IGNORE; - - UnityTestResultsBegin(Unity.TestFile, line); - UnityPrint(UnityStrIgnore); - if (msg != NULL) - { - UNITY_OUTPUT_CHAR(':'); - UNITY_OUTPUT_CHAR(' '); - UnityPrint(msg); - } - UNITY_IGNORE_AND_BAIL; -} - -/*-----------------------------------------------*/ -void UnityMessage(const char* msg, const UNITY_LINE_TYPE line) -{ - UnityTestResultsBegin(Unity.TestFile, line); - UnityPrint("INFO"); - if (msg != NULL) - { - UNITY_OUTPUT_CHAR(':'); - UNITY_OUTPUT_CHAR(' '); - UnityPrint(msg); - } - UNITY_PRINT_EOL(); -} - -/*-----------------------------------------------*/ -/* If we have not defined our own test runner, then include our default test runner to make life easier */ -#ifndef UNITY_SKIP_DEFAULT_RUNNER -void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) -{ - Unity.CurrentTestName = FuncName; - Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; - Unity.NumberOfTests++; - UNITY_CLR_DETAILS(); - UNITY_EXEC_TIME_START(); - if (TEST_PROTECT()) - { - setUp(); - Func(); - } - if (TEST_PROTECT()) - { - tearDown(); - } - UNITY_EXEC_TIME_STOP(); - UnityConcludeTest(); -} -#endif - -/*-----------------------------------------------*/ -void UnitySetTestFile(const char* filename) -{ - Unity.TestFile = filename; -} - -/*-----------------------------------------------*/ -void UnityBegin(const char* filename) -{ - Unity.TestFile = filename; - Unity.CurrentTestName = NULL; - Unity.CurrentTestLineNumber = 0; - Unity.NumberOfTests = 0; - Unity.TestFailures = 0; - Unity.TestIgnores = 0; - Unity.CurrentTestFailed = 0; - Unity.CurrentTestIgnored = 0; - - UNITY_CLR_DETAILS(); - UNITY_OUTPUT_START(); -} - -/*-----------------------------------------------*/ -int UnityEnd(void) -{ - UNITY_PRINT_EOL(); - UnityPrint(UnityStrBreaker); - UNITY_PRINT_EOL(); - UnityPrintNumber((UNITY_INT)(Unity.NumberOfTests)); - UnityPrint(UnityStrResultsTests); - UnityPrintNumber((UNITY_INT)(Unity.TestFailures)); - UnityPrint(UnityStrResultsFailures); - UnityPrintNumber((UNITY_INT)(Unity.TestIgnores)); - UnityPrint(UnityStrResultsIgnored); - UNITY_PRINT_EOL(); - if (Unity.TestFailures == 0U) - { - UnityPrint(UnityStrOk); - } - else - { - UnityPrint(UnityStrFail); -#ifdef UNITY_DIFFERENTIATE_FINAL_FAIL - UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D'); -#endif - } - UNITY_PRINT_EOL(); - UNITY_FLUSH_CALL(); - UNITY_OUTPUT_COMPLETE(); - return (int)(Unity.TestFailures); -} - -/*----------------------------------------------- - * Command Line Argument Support - *-----------------------------------------------*/ -#ifdef UNITY_USE_COMMAND_LINE_ARGS - -char* UnityOptionIncludeNamed = NULL; -char* UnityOptionExcludeNamed = NULL; -int UnityVerbosity = 1; - -/*-----------------------------------------------*/ -int UnityParseOptions(int argc, char** argv) -{ - int i; - UnityOptionIncludeNamed = NULL; - UnityOptionExcludeNamed = NULL; - - for (i = 1; i < argc; i++) - { - if (argv[i][0] == '-') - { - switch (argv[i][1]) - { - case 'l': /* list tests */ - return -1; - case 'n': /* include tests with name including this string */ - case 'f': /* an alias for -n */ - if (argv[i][2] == '=') - { - UnityOptionIncludeNamed = &argv[i][3]; - } - else if (++i < argc) - { - UnityOptionIncludeNamed = argv[i]; - } - else - { - UnityPrint("ERROR: No Test String to Include Matches For"); - UNITY_PRINT_EOL(); - return 1; - } - break; - case 'q': /* quiet */ - UnityVerbosity = 0; - break; - case 'v': /* verbose */ - UnityVerbosity = 2; - break; - case 'x': /* exclude tests with name including this string */ - if (argv[i][2] == '=') - { - UnityOptionExcludeNamed = &argv[i][3]; - } - else if (++i < argc) - { - UnityOptionExcludeNamed = argv[i]; - } - else - { - UnityPrint("ERROR: No Test String to Exclude Matches For"); - UNITY_PRINT_EOL(); - return 1; - } - break; - default: - UnityPrint("ERROR: Unknown Option "); - UNITY_OUTPUT_CHAR(argv[i][1]); - UNITY_PRINT_EOL(); - /* Now display help */ - /* FALLTHRU */ - case 'h': - UnityPrint("Options: "); UNITY_PRINT_EOL(); - UnityPrint("-l List all tests and exit"); UNITY_PRINT_EOL(); - UnityPrint("-f NAME Filter to run only tests whose name includes NAME"); UNITY_PRINT_EOL(); - UnityPrint("-n NAME (deprecated) alias of -f"); UNITY_PRINT_EOL(); - UnityPrint("-h show this Help menu"); UNITY_PRINT_EOL(); - UnityPrint("-q Quiet/decrease verbosity"); UNITY_PRINT_EOL(); - UnityPrint("-v increase Verbosity"); UNITY_PRINT_EOL(); - UnityPrint("-x NAME eXclude tests whose name includes NAME"); UNITY_PRINT_EOL(); - UNITY_OUTPUT_FLUSH(); - return 1; - } - } - } - - return 0; -} - -/*-----------------------------------------------*/ -int IsStringInBiggerString(const char* longstring, const char* shortstring) -{ - const char* lptr = longstring; - const char* sptr = shortstring; - const char* lnext = lptr; - - if (*sptr == '*') - { - return 1; - } - - while (*lptr) - { - lnext = lptr + 1; - - /* If they current bytes match, go on to the next bytes */ - while (*lptr && *sptr && (*lptr == *sptr)) - { - lptr++; - sptr++; - - /* We're done if we match the entire string or up to a wildcard */ - if (*sptr == '*') - return 1; - if (*sptr == ',') - return 1; - if (*sptr == '"') - return 1; - if (*sptr == '\'') - return 1; - if (*sptr == ':') - return 2; - if (*sptr == 0) - return 1; - } - - /* Otherwise we start in the long pointer 1 character further and try again */ - lptr = lnext; - sptr = shortstring; - } - - return 0; -} - -/*-----------------------------------------------*/ -int UnityStringArgumentMatches(const char* str) -{ - int retval; - const char* ptr1; - const char* ptr2; - const char* ptrf; - - /* Go through the options and get the substrings for matching one at a time */ - ptr1 = str; - while (ptr1[0] != 0) - { - if ((ptr1[0] == '"') || (ptr1[0] == '\'')) - { - ptr1++; - } - - /* look for the start of the next partial */ - ptr2 = ptr1; - ptrf = 0; - do - { - ptr2++; - if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')) - { - ptrf = &ptr2[1]; - } - } while ((ptr2[0] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')); - - while ((ptr2[0] != 0) && ((ptr2[0] == ':') || (ptr2[0] == '\'') || (ptr2[0] == '"') || (ptr2[0] == ','))) - { - ptr2++; - } - - /* done if complete filename match */ - retval = IsStringInBiggerString(Unity.TestFile, ptr1); - if (retval == 1) - { - return retval; - } - - /* done if testname match after filename partial match */ - if ((retval == 2) && (ptrf != 0)) - { - if (IsStringInBiggerString(Unity.CurrentTestName, ptrf)) - { - return 1; - } - } - - /* done if complete testname match */ - if (IsStringInBiggerString(Unity.CurrentTestName, ptr1) == 1) - { - return 1; - } - - ptr1 = ptr2; - } - - /* we couldn't find a match for any substrings */ - return 0; -} - -/*-----------------------------------------------*/ -int UnityTestMatches(void) -{ - /* Check if this test name matches the included test pattern */ - int retval; - if (UnityOptionIncludeNamed) - { - retval = UnityStringArgumentMatches(UnityOptionIncludeNamed); - } - else - { - retval = 1; - } - - /* Check if this test name matches the excluded test pattern */ - if (UnityOptionExcludeNamed) - { - if (UnityStringArgumentMatches(UnityOptionExcludeNamed)) - { - retval = 0; - } - } - - return retval; -} - -#endif /* UNITY_USE_COMMAND_LINE_ARGS */ -/*-----------------------------------------------*/ diff --git a/unity/src/unity.h b/unity/src/unity.h deleted file mode 100644 index 8337c8c..0000000 --- a/unity/src/unity.h +++ /dev/null @@ -1,698 +0,0 @@ -/* ========================================================================= - Unity - A Test Framework for C - ThrowTheSwitch.org - Copyright (c) 2007-24 Mike Karlesky, Mark VanderVoord, & Greg Williams - SPDX-License-Identifier: MIT -========================================================================= */ - -#ifndef UNITY_FRAMEWORK_H -#define UNITY_FRAMEWORK_H -#define UNITY - -#define UNITY_VERSION_MAJOR 2 -#define UNITY_VERSION_MINOR 6 -#define UNITY_VERSION_BUILD 0 -#define UNITY_VERSION ((UNITY_VERSION_MAJOR << 16) | (UNITY_VERSION_MINOR << 8) | UNITY_VERSION_BUILD) - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "unity_internals.h" - -/*------------------------------------------------------- - * Test Setup / Teardown - *-------------------------------------------------------*/ - -/* These functions are intended to be called before and after each test. - * If using unity directly, these will need to be provided for each test - * executable built. If you are using the test runner generator and/or - * Ceedling, these are optional. */ -void setUp(void); -void tearDown(void); - -/* These functions are intended to be called at the beginning and end of an - * entire test suite. suiteTearDown() is passed the number of tests that - * failed, and its return value becomes the exit code of main(). If using - * Unity directly, you're in charge of calling these if they are desired. - * If using Ceedling or the test runner generator, these will be called - * automatically if they exist. */ -void suiteSetUp(void); -int suiteTearDown(int num_failures); - -/*------------------------------------------------------- - * Test Reset and Verify - *-------------------------------------------------------*/ - -/* These functions are intended to be called before during tests in order - * to support complex test loops, etc. Both are NOT built into Unity. Instead - * the test runner generator will create them. resetTest will run teardown and - * setup again, verifying any end-of-test needs between. verifyTest will only - * run the verification. */ -void resetTest(void); -void verifyTest(void); - -/*------------------------------------------------------- - * Configuration Options - *------------------------------------------------------- - * All options described below should be passed as a compiler flag to all files using Unity. If you must add #defines, place them BEFORE the #include above. - - * Integers/longs/pointers - * - Unity attempts to automatically discover your integer sizes - * - define UNITY_EXCLUDE_STDINT_H to stop attempting to look in - * - define UNITY_EXCLUDE_LIMITS_H to stop attempting to look in - * - If you cannot use the automatic methods above, you can force Unity by using these options: - * - define UNITY_SUPPORT_64 - * - set UNITY_INT_WIDTH - * - set UNITY_LONG_WIDTH - * - set UNITY_POINTER_WIDTH - - * Floats - * - define UNITY_EXCLUDE_FLOAT to disallow floating point comparisons - * - define UNITY_FLOAT_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_FLOAT - * - define UNITY_FLOAT_TYPE to specify doubles instead of single precision floats - * - define UNITY_INCLUDE_DOUBLE to allow double floating point comparisons - * - define UNITY_EXCLUDE_DOUBLE to disallow double floating point comparisons (default) - * - define UNITY_DOUBLE_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_DOUBLE - * - define UNITY_DOUBLE_TYPE to specify something other than double - * - define UNITY_EXCLUDE_FLOAT_PRINT to trim binary size, won't print floating point values in errors - - * Output - * - by default, Unity prints to standard out with putchar. define UNITY_OUTPUT_CHAR(a) with a different function if desired - * - define UNITY_DIFFERENTIATE_FINAL_FAIL to print FAILED (vs. FAIL) at test end summary - for automated search for failure - - * Optimization - * - by default, line numbers are stored in unsigned shorts. Define UNITY_LINE_TYPE with a different type if your files are huge - * - by default, test and failure counters are unsigned shorts. Define UNITY_COUNTER_TYPE with a different type if you want to save space or have more than 65535 Tests. - - * Test Cases - * - define UNITY_SUPPORT_TEST_CASES to include the TEST_CASE macro, though really it's mostly about the runner generator script - - * Parameterized Tests - * - you'll want to create a define of TEST_CASE(...), TEST_RANGE(...) and/or TEST_MATRIX(...) which basically evaluates to nothing - - * Tests with Arguments - * - you'll want to define UNITY_USE_COMMAND_LINE_ARGS if you have the test runner passing arguments to Unity - - *------------------------------------------------------- - * Basic Fail and Ignore - *-------------------------------------------------------*/ - -#define TEST_FAIL_MESSAGE(message) UNITY_TEST_FAIL(__LINE__, (message)) -#define TEST_FAIL() UNITY_TEST_FAIL(__LINE__, NULL) -#define TEST_IGNORE_MESSAGE(message) UNITY_TEST_IGNORE(__LINE__, (message)) -#define TEST_IGNORE() UNITY_TEST_IGNORE(__LINE__, NULL) -#define TEST_MESSAGE(message) UnityMessage((message), __LINE__) -#define TEST_ONLY() -#ifdef UNITY_INCLUDE_PRINT_FORMATTED -#define TEST_PRINTF(message, ...) UnityPrintF(__LINE__, (message), ##__VA_ARGS__) -#endif - -/* It is not necessary for you to call PASS. A PASS condition is assumed if nothing fails. - * This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */ -#define TEST_PASS() TEST_ABORT() -#define TEST_PASS_MESSAGE(message) do { UnityMessage((message), __LINE__); TEST_ABORT(); } while (0) - -/*------------------------------------------------------- - * Build Directives - *------------------------------------------------------- - - * These macros do nothing, but they are useful for additional build context. - * Tools (like Ceedling) can scan for these directives and make use of them for - * per-test-executable #include search paths and linking. */ - -/* Add source files to a test executable's compilation and linking. Ex: TEST_SOURCE_FILE("sandwiches.c") */ -#define TEST_SOURCE_FILE(a) - -/* Customize #include search paths for a test executable's compilation. Ex: TEST_INCLUDE_PATH("src/module_a/inc") */ -#define TEST_INCLUDE_PATH(a) - -/*------------------------------------------------------- - * Test Asserts (simple) - *-------------------------------------------------------*/ - -/* Boolean */ -#define TEST_ASSERT(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expression Evaluated To FALSE") -#define TEST_ASSERT_TRUE(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expected TRUE Was FALSE") -#define TEST_ASSERT_UNLESS(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expression Evaluated To TRUE") -#define TEST_ASSERT_FALSE(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expected FALSE Was TRUE") -#define TEST_ASSERT_NULL(pointer) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, " Expected NULL") -#define TEST_ASSERT_NOT_NULL(pointer) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, " Expected Non-NULL") -#define TEST_ASSERT_EMPTY(pointer) UNITY_TEST_ASSERT_EMPTY( (pointer), __LINE__, " Expected Empty") -#define TEST_ASSERT_NOT_EMPTY(pointer) UNITY_TEST_ASSERT_NOT_EMPTY((pointer), __LINE__, " Expected Non-Empty") - -/* Integers (of all sizes) */ -#define TEST_ASSERT_EQUAL_INT(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_INT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_INT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_INT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_INT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_UINT(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_UINT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_UINT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_UINT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_UINT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_size_t(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_HEX(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_HEX8(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_HEX16(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_HEX32(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_HEX64(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_CHAR(expected, actual) UNITY_TEST_ASSERT_EQUAL_CHAR((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_BITS(mask, expected, actual) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_BITS_HIGH(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT)(-1), (actual), __LINE__, NULL) -#define TEST_ASSERT_BITS_LOW(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT)(0), (actual), __LINE__, NULL) -#define TEST_ASSERT_BIT_HIGH(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT)1 << (bit)), (UNITY_UINT)(-1), (actual), __LINE__, NULL) -#define TEST_ASSERT_BIT_LOW(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT)1 << (bit)), (UNITY_UINT)(0), (actual), __LINE__, NULL) - -/* Integer Not Equal To (of all sizes) */ -#define TEST_ASSERT_NOT_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) - -/* Integer Greater Than/ Less Than (of all sizes) */ -#define TEST_ASSERT_GREATER_THAN(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_INT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_CHAR(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_CHAR((threshold), (actual), __LINE__, NULL) - -#define TEST_ASSERT_LESS_THAN(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_INT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_HEX64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_CHAR(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_CHAR((threshold), (actual), __LINE__, NULL) - -#define TEST_ASSERT_GREATER_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) - -#define TEST_ASSERT_LESS_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) - -/* Integer Ranges (of all sizes) */ -#define TEST_ASSERT_INT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_INT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_INT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_INT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_INT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_UINT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_UINT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_UINT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_UINT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_UINT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_size_t_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_HEX_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_HEX8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_HEX16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_HEX32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_HEX64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_CHAR_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_CHAR_WITHIN((delta), (expected), (actual), __LINE__, NULL) - -/* Integer Array Ranges (of all sizes) */ -#define TEST_ASSERT_INT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_INT8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_INT16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_INT32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_UINT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_UINT8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_UINT16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_UINT32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_size_t_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_HEX_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_HEX8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_HEX16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_HEX32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) -#define TEST_ASSERT_CHAR_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) - - -/* Structs and Strings */ -#define TEST_ASSERT_EQUAL_PTR(expected, actual) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_STRING(expected, actual) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_MEMORY(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, NULL) - -/* Arrays */ -#define TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_size_t_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_HEX_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_CHAR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) - -/* Arrays Compared To Single Value */ -#define TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_size_t(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_HEX(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_CHAR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_CHAR((expected), (actual), (num_elements), __LINE__, NULL) - -/* Floating Point (If Enabled) */ -#define TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_FLOAT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual) UNITY_TEST_ASSERT_LESS_THAN_FLOAT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual) UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_FLOAT_IS_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, NULL) -#define TEST_ASSERT_FLOAT_IS_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, NULL) -#define TEST_ASSERT_FLOAT_IS_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, NULL) -#define TEST_ASSERT_FLOAT_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, NULL) -#define TEST_ASSERT_FLOAT_IS_NOT_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, NULL) -#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, NULL) -#define TEST_ASSERT_FLOAT_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, NULL) -#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, NULL) - -/* Double (If Enabled) */ -#define TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN((delta), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, NULL) -#define TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_LESS_THAN_DOUBLE((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, NULL) -#define TEST_ASSERT_DOUBLE_IS_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, NULL) -#define TEST_ASSERT_DOUBLE_IS_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, NULL) -#define TEST_ASSERT_DOUBLE_IS_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, NULL) -#define TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, NULL) -#define TEST_ASSERT_DOUBLE_IS_NOT_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, NULL) -#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, NULL) -#define TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, NULL) -#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, NULL) - -/* Shorthand */ -#ifdef UNITY_SHORTHAND_AS_OLD -#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal") -#endif -#ifdef UNITY_SHORTHAND_AS_INT -#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) -#endif -#ifdef UNITY_SHORTHAND_AS_MEM -#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_MEMORY((&expected), (&actual), sizeof(expected), __LINE__, NULL) -#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) -#endif -#ifdef UNITY_SHORTHAND_AS_RAW -#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) == (actual)), __LINE__, " Expected Equal") -#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal") -#endif -#ifdef UNITY_SHORTHAND_AS_NONE -#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) -#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) -#endif - -/*------------------------------------------------------- - * Test Asserts (with additional messages) - *-------------------------------------------------------*/ - -/* Boolean */ -#define TEST_ASSERT_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) -#define TEST_ASSERT_TRUE_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) -#define TEST_ASSERT_UNLESS_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) -#define TEST_ASSERT_FALSE_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) -#define TEST_ASSERT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, (message)) -#define TEST_ASSERT_NOT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, (message)) -#define TEST_ASSERT_EMPTY_MESSAGE(pointer, message) UNITY_TEST_ASSERT_EMPTY( (pointer), __LINE__, (message)) -#define TEST_ASSERT_NOT_EMPTY_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_EMPTY((pointer), __LINE__, (message)) - -/* Integers (of all sizes) */ -#define TEST_ASSERT_EQUAL_INT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_INT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_INT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_INT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_INT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_UINT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_UINT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_UINT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_UINT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_UINT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_size_t_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_HEX_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_HEX8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_HEX16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_HEX32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_HEX64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_BITS_MESSAGE(mask, expected, actual, message) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_BITS_HIGH_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(-1), (actual), __LINE__, (message)) -#define TEST_ASSERT_BITS_LOW_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(0), (actual), __LINE__, (message)) -#define TEST_ASSERT_BIT_HIGH_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(-1), (actual), __LINE__, (message)) -#define TEST_ASSERT_BIT_LOW_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(0), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_CHAR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_CHAR((expected), (actual), __LINE__, (message)) - -/* Integer Not Equal To (of all sizes) */ -#define TEST_ASSERT_NOT_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) - - -/* Integer Greater Than/ Less Than (of all sizes) */ -#define TEST_ASSERT_GREATER_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_CHAR((threshold), (actual), __LINE__, (message)) - -#define TEST_ASSERT_LESS_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_CHAR((threshold), (actual), __LINE__, (message)) - -#define TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) - -#define TEST_ASSERT_LESS_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) - -/* Integer Ranges (of all sizes) */ -#define TEST_ASSERT_INT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_INT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_INT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_INT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_INT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_UINT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_UINT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_UINT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_UINT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_UINT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_size_t_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_HEX_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_HEX8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_HEX16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_HEX32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_HEX64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_CHAR_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_CHAR_WITHIN((delta), (expected), (actual), __LINE__, (message)) - -/* Integer Array Ranges (of all sizes) */ -#define TEST_ASSERT_INT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_INT8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_INT16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_INT32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_INT64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_UINT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_UINT8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_UINT16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_UINT32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_UINT64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_size_t_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_HEX_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_HEX8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_HEX16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_HEX32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_HEX64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) -#define TEST_ASSERT_CHAR_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) - - -/* Structs and Strings */ -#define TEST_ASSERT_EQUAL_PTR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_MEMORY_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, (message)) - -/* Arrays */ -#define TEST_ASSERT_EQUAL_INT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_INT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_INT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_INT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_INT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_UINT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_UINT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_UINT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_UINT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_size_t_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_HEX_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_HEX8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_HEX16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_HEX32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_HEX64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_PTR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_STRING_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_MEMORY_ARRAY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_CHAR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) - -/* Arrays Compared To Single Value*/ -#define TEST_ASSERT_EACH_EQUAL_INT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_INT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_INT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_INT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_INT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_UINT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_UINT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_UINT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_UINT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_UINT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_size_t_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_HEX_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_HEX8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_HEX16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_HEX32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_HEX64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_PTR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_STRING_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_MEMORY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_CHAR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_CHAR((expected), (actual), (num_elements), __LINE__, (message)) - -/* Floating Point (If Enabled) */ -#define TEST_ASSERT_FLOAT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_FLOAT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_FLOAT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_FLOAT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_FLOAT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_THAN_FLOAT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_FLOAT_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, (message)) -#define TEST_ASSERT_FLOAT_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, (message)) -#define TEST_ASSERT_FLOAT_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, (message)) -#define TEST_ASSERT_FLOAT_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, (message)) -#define TEST_ASSERT_FLOAT_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, (message)) -#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, (message)) -#define TEST_ASSERT_FLOAT_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, (message)) -#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, (message)) - -/* Double (If Enabled) */ -#define TEST_ASSERT_DOUBLE_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_DOUBLE_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_DOUBLE_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_GREATER_THAN_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_THAN_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_THAN_DOUBLE((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_DOUBLE_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, (message)) -#define TEST_ASSERT_DOUBLE_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, (message)) -#define TEST_ASSERT_DOUBLE_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, (message)) -#define TEST_ASSERT_DOUBLE_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, (message)) -#define TEST_ASSERT_DOUBLE_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, (message)) -#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, (message)) -#define TEST_ASSERT_DOUBLE_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, (message)) -#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, (message)) - -/* Shorthand */ -#ifdef UNITY_SHORTHAND_AS_OLD -#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, (message)) -#endif -#ifdef UNITY_SHORTHAND_AS_INT -#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, message) -#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) -#endif -#ifdef UNITY_SHORTHAND_AS_MEM -#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((&expected), (&actual), sizeof(expected), __LINE__, message) -#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) -#endif -#ifdef UNITY_SHORTHAND_AS_RAW -#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) == (actual)), __LINE__, message) -#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, message) -#endif -#ifdef UNITY_SHORTHAND_AS_NONE -#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) -#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) -#endif - -/* end of UNITY_FRAMEWORK_H */ -#ifdef __cplusplus -} -#endif -#endif diff --git a/unity/src/unity_config.h b/unity/src/unity_config.h deleted file mode 100644 index eaaee25..0000000 --- a/unity/src/unity_config.h +++ /dev/null @@ -1,251 +0,0 @@ -/* ========================================================================= - Unity - A Test Framework for C - ThrowTheSwitch.org - Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams - SPDX-License-Identifier: MIT -========================================================================= */ - -/* Unity Configuration - * As of May 11th, 2016 at ThrowTheSwitch/Unity commit 837c529 - * Update: December 29th, 2016 - * See Also: Unity/docs/UnityConfigurationGuide.pdf - * - * Unity is designed to run on almost anything that is targeted by a C compiler. - * It would be awesome if this could be done with zero configuration. While - * there are some targets that come close to this dream, it is sadly not - * universal. It is likely that you are going to need at least a couple of the - * configuration options described in this document. - * - * All of Unity's configuration options are `#defines`. Most of these are simple - * definitions. A couple are macros with arguments. They live inside the - * unity_internals.h header file. We don't necessarily recommend opening that - * file unless you really need to. That file is proof that a cross-platform - * library is challenging to build. From a more positive perspective, it is also - * proof that a great deal of complexity can be centralized primarily to one - * place in order to provide a more consistent and simple experience elsewhere. - * - * Using These Options - * It doesn't matter if you're using a target-specific compiler and a simulator - * or a native compiler. In either case, you've got a couple choices for - * configuring these options: - * - * 1. Because these options are specified via C defines, you can pass most of - * these options to your compiler through command line compiler flags. Even - * if you're using an embedded target that forces you to use their - * overbearing IDE for all configuration, there will be a place somewhere in - * your project to configure defines for your compiler. - * 2. You can create a custom `unity_config.h` configuration file (present in - * your toolchain's search paths). In this file, you will list definitions - * and macros specific to your target. All you must do is define - * `UNITY_INCLUDE_CONFIG_H` and Unity will rely on `unity_config.h` for any - * further definitions it may need. - */ - -#ifndef UNITY_CONFIG_H -#define UNITY_CONFIG_H - -/* ************************* AUTOMATIC INTEGER TYPES *************************** - * C's concept of an integer varies from target to target. The C Standard has - * rules about the `int` matching the register size of the target - * microprocessor. It has rules about the `int` and how its size relates to - * other integer types. An `int` on one target might be 16 bits while on another - * target it might be 64. There are more specific types in compilers compliant - * with C99 or later, but that's certainly not every compiler you are likely to - * encounter. Therefore, Unity has a number of features for helping to adjust - * itself to match your required integer sizes. It starts off by trying to do it - * automatically. - **************************************************************************** */ - -/* The first attempt to guess your types is to check `limits.h`. Some compilers - * that don't support `stdint.h` could include `limits.h`. If you don't - * want Unity to check this file, define this to make it skip the inclusion. - * Unity looks at UINT_MAX & ULONG_MAX, which were available since C89. - */ -/* #define UNITY_EXCLUDE_LIMITS_H */ - -/* The second thing that Unity does to guess your types is check `stdint.h`. - * This file defines `UINTPTR_MAX`, since C99, that Unity can make use of to - * learn about your system. It's possible you don't want it to do this or it's - * possible that your system doesn't support `stdint.h`. If that's the case, - * you're going to want to define this. That way, Unity will know to skip the - * inclusion of this file and you won't be left with a compiler error. - */ -/* #define UNITY_EXCLUDE_STDINT_H */ - -/* ********************** MANUAL INTEGER TYPE DEFINITION *********************** - * If you've disabled all of the automatic options above, you're going to have - * to do the configuration yourself. There are just a handful of defines that - * you are going to specify if you don't like the defaults. - **************************************************************************** */ - - /* Define this to be the number of bits an `int` takes up on your system. The - * default, if not auto-detected, is 32 bits. - * - * Example: - */ -/* #define UNITY_INT_WIDTH 16 */ - -/* Define this to be the number of bits a `long` takes up on your system. The - * default, if not autodetected, is 32 bits. This is used to figure out what - * kind of 64-bit support your system can handle. Does it need to specify a - * `long` or a `long long` to get a 64-bit value. On 16-bit systems, this option - * is going to be ignored. - * - * Example: - */ -/* #define UNITY_LONG_WIDTH 16 */ - -/* Define this to be the number of bits a pointer takes up on your system. The - * default, if not autodetected, is 32-bits. If you're getting ugly compiler - * warnings about casting from pointers, this is the one to look at. - * - * Example: - */ -/* #define UNITY_POINTER_WIDTH 64 */ - -/* Unity will automatically include 64-bit support if it auto-detects it, or if - * your `int`, `long`, or pointer widths are greater than 32-bits. Define this - * to enable 64-bit support if none of the other options already did it for you. - * There can be a significant size and speed impact to enabling 64-bit support - * on small targets, so don't define it if you don't need it. - */ -/* #define UNITY_SUPPORT_64 */ - - -/* *************************** FLOATING POINT TYPES **************************** - * In the embedded world, it's not uncommon for targets to have no support for - * floating point operations at all or to have support that is limited to only - * single precision. We are able to guess integer sizes on the fly because - * integers are always available in at least one size. Floating point, on the - * other hand, is sometimes not available at all. Trying to include `float.h` on - * these platforms would result in an error. This leaves manual configuration as - * the only option. - **************************************************************************** */ - - /* By default, Unity guesses that you will want single precision floating point - * support, but not double precision. It's easy to change either of these using - * the include and exclude options here. You may include neither, just float, - * or both, as suits your needs. - */ -/* #define UNITY_EXCLUDE_FLOAT */ -#define UNITY_INCLUDE_DOUBLE -/* #define UNITY_EXCLUDE_DOUBLE */ - -/* For features that are enabled, the following floating point options also - * become available. - */ - -/* Unity aims for as small of a footprint as possible and avoids most standard - * library calls (some embedded platforms don't have a standard library!). - * Because of this, its routines for printing integer values are minimalist and - * hand-coded. To keep Unity universal, though, we eventually chose to develop - * our own floating point print routines. Still, the display of floating point - * values during a failure are optional. By default, Unity will print the - * actual results of floating point assertion failures. So a failed assertion - * will produce a message like "Expected 4.0 Was 4.25". If you would like less - * verbose failure messages for floating point assertions, use this option to - * give a failure message `"Values Not Within Delta"` and trim the binary size. - */ -/* #define UNITY_EXCLUDE_FLOAT_PRINT */ - -/* If enabled, Unity assumes you want your `FLOAT` asserts to compare standard C - * floats. If your compiler supports a specialty floating point type, you can - * always override this behavior by using this definition. - * - * Example: - */ -/* #define UNITY_FLOAT_TYPE float16_t */ - -/* If enabled, Unity assumes you want your `DOUBLE` asserts to compare standard - * C doubles. If you would like to change this, you can specify something else - * by using this option. For example, defining `UNITY_DOUBLE_TYPE` to `long - * double` could enable gargantuan floating point types on your 64-bit processor - * instead of the standard `double`. - * - * Example: - */ -/* #define UNITY_DOUBLE_TYPE long double */ - -/* If you look up `UNITY_ASSERT_EQUAL_FLOAT` and `UNITY_ASSERT_EQUAL_DOUBLE` as - * documented in the Unity Assertion Guide, you will learn that they are not - * really asserting that two values are equal but rather that two values are - * "close enough" to equal. "Close enough" is controlled by these precision - * configuration options. If you are working with 32-bit floats and/or 64-bit - * doubles (the normal on most processors), you should have no need to change - * these options. They are both set to give you approximately 1 significant bit - * in either direction. The float precision is 0.00001 while the double is - * 10^-12. For further details on how this works, see the appendix of the Unity - * Assertion Guide. - * - * Example: - */ -/* #define UNITY_FLOAT_PRECISION 0.001f */ -/* #define UNITY_DOUBLE_PRECISION 0.001f */ - - -/* *************************** MISCELLANEOUS *********************************** - * Miscellaneous configuration options for Unity - **************************************************************************** */ - -/* Unity uses the stddef.h header included in the C standard library for the - * "NULL" macro. Define this in order to disable the include of stddef.h. If you - * do this, you have to make sure to provide your own "NULL" definition. - */ -/* #define UNITY_EXCLUDE_STDDEF_H */ - -/* Define this to enable the unity formatted print macro: - * "TEST_PRINTF" - */ -/* #define UNITY_INCLUDE_PRINT_FORMATTED */ - - -/* *************************** TOOLSET CUSTOMIZATION *************************** - * In addition to the options listed above, there are a number of other options - * which will come in handy to customize Unity's behavior for your specific - * toolchain. It is possible that you may not need to touch any of these but - * certain platforms, particularly those running in simulators, may need to jump - * through extra hoops to operate properly. These macros will help in those - * situations. - **************************************************************************** */ - -/* By default, Unity prints its results to `stdout` as it runs. This works - * perfectly fine in most situations where you are using a native compiler for - * testing. It works on some simulators as well so long as they have `stdout` - * routed back to the command line. There are times, however, where the - * simulator will lack support for dumping results or you will want to route - * results elsewhere for other reasons. In these cases, you should define the - * `UNITY_OUTPUT_CHAR` macro. This macro accepts a single character at a time - * (as an `int`, since this is the parameter type of the standard C `putchar` - * function most commonly used). You may replace this with whatever function - * call you like. - * - * Example: - * Say you are forced to run your test suite on an embedded processor with no - * `stdout` option. You decide to route your test result output to a custom - * serial `RS232_putc()` function you wrote like thus: - */ -/* #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) */ -/* #define UNITY_OUTPUT_CHAR_HEADER_DECLARATION RS232_putc(int) */ -/* #define UNITY_OUTPUT_FLUSH() RS232_flush() */ -/* #define UNITY_OUTPUT_FLUSH_HEADER_DECLARATION RS232_flush(void) */ -/* #define UNITY_OUTPUT_START() RS232_config(115200,1,8,0) */ -/* #define UNITY_OUTPUT_COMPLETE() RS232_close() */ - -/* Some compilers require a custom attribute to be assigned to pointers, like - * `near` or `far`. In these cases, you can give Unity a safe default for these - * by defining this option with the attribute you would like. - * - * Example: - */ -/* #define UNITY_PTR_ATTRIBUTE __attribute__((far)) */ -/* #define UNITY_PTR_ATTRIBUTE near */ - -/* Print execution time of each test when executed in verbose mode - * - * Example: - * - * TEST - PASS (10 ms) - */ -/* #define UNITY_INCLUDE_EXEC_TIME */ - -#endif /* UNITY_CONFIG_H */ diff --git a/unity/src/unity_internals.h b/unity/src/unity_internals.h deleted file mode 100644 index 1214bf0..0000000 --- a/unity/src/unity_internals.h +++ /dev/null @@ -1,1170 +0,0 @@ -/* ========================================================================= - Unity - A Test Framework for C - ThrowTheSwitch.org - Copyright (c) 2007-24 Mike Karlesky, Mark VanderVoord, & Greg Williams - SPDX-License-Identifier: MIT -========================================================================= */ - -#ifndef UNITY_INTERNALS_H -#define UNITY_INTERNALS_H - -#ifdef UNITY_INCLUDE_CONFIG_H -#include "unity_config.h" -#endif - -#ifndef UNITY_EXCLUDE_SETJMP_H -#include -#endif - -#ifndef UNITY_EXCLUDE_MATH_H -#include -#endif - -#ifndef UNITY_EXCLUDE_STDDEF_H -#include -#endif - -#ifdef UNITY_INCLUDE_PRINT_FORMATTED -#include -#endif - -/* Unity Attempts to Auto-Detect Integer Types - * Attempt 1: UINT_MAX, ULONG_MAX in , or default to 32 bits - * Attempt 2: UINTPTR_MAX in , or default to same size as long - * The user may override any of these derived constants: - * UNITY_INT_WIDTH, UNITY_LONG_WIDTH, UNITY_POINTER_WIDTH */ -#ifndef UNITY_EXCLUDE_STDINT_H -#include -#endif - -#ifndef UNITY_EXCLUDE_LIMITS_H -#include -#endif - -#if defined(__GNUC__) || defined(__clang__) - #define UNITY_FUNCTION_ATTR(a) __attribute__((a)) -#else - #define UNITY_FUNCTION_ATTR(a) /* ignore */ -#endif - -#ifndef UNITY_NORETURN - #if defined(__cplusplus) - #if __cplusplus >= 201103L - #define UNITY_NORETURN [[ noreturn ]] - #endif - #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L - #if defined(_WIN32) && defined(_MSC_VER) - /* We are using MSVC compiler on Windows platform. */ - /* Not all Windows SDKs supports , but compiler can support C11: */ - /* https://devblogs.microsoft.com/cppblog/c11-and-c17-standard-support-arriving-in-msvc/ */ - /* Not sure, that Mingw compilers has Windows SDK headers at all. */ - #include - #endif - - /* Using Windows SDK predefined macro for detecting supported SDK with MSVC compiler. */ - /* Mingw GCC should work without that fixes. */ - /* Based on: */ - /* https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170 */ - /* NTDDI_WIN10_FE is equal to Windows 10 SDK 2104 */ - #if defined(_MSC_VER) && ((!defined(NTDDI_WIN10_FE)) || WDK_NTDDI_VERSION < NTDDI_WIN10_FE) - /* Based on tests and: */ - /* https://docs.microsoft.com/en-us/cpp/c-language/noreturn?view=msvc-170 */ - /* https://en.cppreference.com/w/c/language/_Noreturn */ - #define UNITY_NORETURN _Noreturn - #else /* Using newer Windows SDK or not MSVC compiler */ - #include - #define UNITY_NORETURN noreturn - #endif - #endif -#endif -#ifndef UNITY_NORETURN - #define UNITY_NORETURN UNITY_FUNCTION_ATTR(__noreturn__) -#endif - -/*------------------------------------------------------- - * Guess Widths If Not Specified - *-------------------------------------------------------*/ - -/* Determine the size of an int, if not already specified. - * We cannot use sizeof(int), because it is not yet defined - * at this stage in the translation of the C program. - * Also sizeof(int) does return the size in addressable units on all platforms, - * which may not necessarily be the size in bytes. - * Therefore, infer it from UINT_MAX if possible. */ -#ifndef UNITY_INT_WIDTH - #ifdef UINT_MAX - #if (UINT_MAX == 0xFFFF) - #define UNITY_INT_WIDTH (16) - #elif (UINT_MAX == 0xFFFFFFFF) - #define UNITY_INT_WIDTH (32) - #elif (UINT_MAX == 0xFFFFFFFFFFFFFFFF) - #define UNITY_INT_WIDTH (64) - #endif - #else /* Set to default */ - #define UNITY_INT_WIDTH (32) - #endif /* UINT_MAX */ -#endif - -/* Determine the size of a long, if not already specified. */ -#ifndef UNITY_LONG_WIDTH - #ifdef ULONG_MAX - #if (ULONG_MAX == 0xFFFF) - #define UNITY_LONG_WIDTH (16) - #elif (ULONG_MAX == 0xFFFFFFFF) - #define UNITY_LONG_WIDTH (32) - #elif (ULONG_MAX == 0xFFFFFFFFFFFFFFFF) - #define UNITY_LONG_WIDTH (64) - #endif - #else /* Set to default */ - #define UNITY_LONG_WIDTH (32) - #endif /* ULONG_MAX */ -#endif - -/* Determine the size of a pointer, if not already specified. */ -#ifndef UNITY_POINTER_WIDTH - #ifdef UINTPTR_MAX - #if (UINTPTR_MAX <= 0xFFFF) - #define UNITY_POINTER_WIDTH (16) - #elif (UINTPTR_MAX <= 0xFFFFFFFF) - #define UNITY_POINTER_WIDTH (32) - #elif (UINTPTR_MAX <= 0xFFFFFFFFFFFFFFFF) - #define UNITY_POINTER_WIDTH (64) - #endif - #else /* Set to default */ - #define UNITY_POINTER_WIDTH UNITY_LONG_WIDTH - #endif /* UINTPTR_MAX */ -#endif - -/*------------------------------------------------------- - * Int Support (Define types based on detected sizes) - *-------------------------------------------------------*/ - -#if (UNITY_INT_WIDTH == 32) - typedef unsigned char UNITY_UINT8; - typedef unsigned short UNITY_UINT16; - typedef unsigned int UNITY_UINT32; - typedef signed char UNITY_INT8; - typedef signed short UNITY_INT16; - typedef signed int UNITY_INT32; -#elif (UNITY_INT_WIDTH == 16) - typedef unsigned char UNITY_UINT8; - typedef unsigned int UNITY_UINT16; - typedef unsigned long UNITY_UINT32; - typedef signed char UNITY_INT8; - typedef signed int UNITY_INT16; - typedef signed long UNITY_INT32; -#else - #error Invalid UNITY_INT_WIDTH specified! (16 or 32 are supported) -#endif - -/*------------------------------------------------------- - * 64-bit Support - *-------------------------------------------------------*/ - -/* Auto-detect 64 Bit Support */ -#ifndef UNITY_SUPPORT_64 - #if UNITY_LONG_WIDTH == 64 || UNITY_POINTER_WIDTH == 64 - #define UNITY_SUPPORT_64 - #endif -#endif - -/* 64-Bit Support Dependent Configuration */ -#ifndef UNITY_SUPPORT_64 - /* No 64-bit Support */ - typedef UNITY_UINT32 UNITY_UINT; - typedef UNITY_INT32 UNITY_INT; - #define UNITY_MAX_NIBBLES (8) /* Maximum number of nibbles in a UNITY_(U)INT */ -#else - /* 64-bit Support */ - #if (UNITY_LONG_WIDTH == 32) - typedef unsigned long long UNITY_UINT64; - typedef signed long long UNITY_INT64; - #elif (UNITY_LONG_WIDTH == 64) - typedef unsigned long UNITY_UINT64; - typedef signed long UNITY_INT64; - #else - #error Invalid UNITY_LONG_WIDTH specified! (32 or 64 are supported) - #endif - typedef UNITY_UINT64 UNITY_UINT; - typedef UNITY_INT64 UNITY_INT; - #define UNITY_MAX_NIBBLES (16) /* Maximum number of nibbles in a UNITY_(U)INT */ -#endif - -/*------------------------------------------------------- - * Pointer Support - *-------------------------------------------------------*/ - -#if (UNITY_POINTER_WIDTH == 32) - #define UNITY_PTR_TO_INT UNITY_INT32 - #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX32 -#elif (UNITY_POINTER_WIDTH == 64) - #define UNITY_PTR_TO_INT UNITY_INT64 - #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX64 -#elif (UNITY_POINTER_WIDTH == 16) - #define UNITY_PTR_TO_INT UNITY_INT16 - #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX16 -#else - #error Invalid UNITY_POINTER_WIDTH specified! (16, 32 or 64 are supported) -#endif - -#ifndef UNITY_PTR_ATTRIBUTE - #define UNITY_PTR_ATTRIBUTE -#endif - -#ifndef UNITY_INTERNAL_PTR - #define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const void* -#endif - -/* optionally define UNITY_COMPARE_PTRS_ON_ZERO_ARRAY */ - -/*------------------------------------------------------- - * Float Support - *-------------------------------------------------------*/ - -#ifdef UNITY_EXCLUDE_FLOAT - -/* No Floating Point Support */ -#ifndef UNITY_EXCLUDE_DOUBLE -#define UNITY_EXCLUDE_DOUBLE /* Remove double when excluding float support */ -#endif -#ifndef UNITY_EXCLUDE_FLOAT_PRINT -#define UNITY_EXCLUDE_FLOAT_PRINT -#endif - -#else - -/* Floating Point Support */ -#ifndef UNITY_FLOAT_PRECISION -#define UNITY_FLOAT_PRECISION (0.00001f) -#endif -#ifndef UNITY_FLOAT_TYPE -#define UNITY_FLOAT_TYPE float -#endif -typedef UNITY_FLOAT_TYPE UNITY_FLOAT; - -/* isnan macro should be provided by math.h. Override if not macro */ -#ifndef UNITY_IS_NAN -#ifndef isnan -/* NaN is the only floating point value that does NOT equal itself. - * Therefore if n != n, then it is NaN. */ -#define UNITY_IS_NAN(n) ((n != n) ? 1 : 0) -#else -#define UNITY_IS_NAN(n) isnan(n) -#endif -#endif - -/* isinf macro should be provided by math.h. Override if not macro */ -#ifndef UNITY_IS_INF -#ifndef isinf -/* The value of Inf - Inf is NaN */ -#define UNITY_IS_INF(n) (UNITY_IS_NAN((n) - (n)) && !UNITY_IS_NAN(n)) -#else -#define UNITY_IS_INF(n) isinf(n) -#endif -#endif - -#endif - -/*------------------------------------------------------- - * Double Float Support - *-------------------------------------------------------*/ - -/* unlike float, we DON'T include by default */ -#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(UNITY_INCLUDE_DOUBLE) - - /* No Floating Point Support */ - #ifndef UNITY_EXCLUDE_DOUBLE - #define UNITY_EXCLUDE_DOUBLE - #else - #undef UNITY_INCLUDE_DOUBLE - #endif - - #ifndef UNITY_EXCLUDE_FLOAT - #ifndef UNITY_DOUBLE_TYPE - #define UNITY_DOUBLE_TYPE double - #endif - typedef UNITY_FLOAT UNITY_DOUBLE; - /* For parameter in UnityPrintFloat(UNITY_DOUBLE), which aliases to double or float */ - #endif - -#else - - /* Double Floating Point Support */ - #ifndef UNITY_DOUBLE_PRECISION - #define UNITY_DOUBLE_PRECISION (1e-12) - #endif - - #ifndef UNITY_DOUBLE_TYPE - #define UNITY_DOUBLE_TYPE double - #endif - typedef UNITY_DOUBLE_TYPE UNITY_DOUBLE; - -#endif - -/*------------------------------------------------------- - * Output Method: stdout (DEFAULT) - *-------------------------------------------------------*/ -#ifndef UNITY_OUTPUT_CHAR - /* Default to using putchar, which is defined in stdio.h */ - #include - #define UNITY_OUTPUT_CHAR(a) (void)putchar(a) -#else - /* If defined as something else, make sure we declare it here so it's ready for use */ - #ifdef UNITY_OUTPUT_CHAR_HEADER_DECLARATION - extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION; - #endif -#endif - -#ifndef UNITY_OUTPUT_FLUSH - #ifdef UNITY_USE_FLUSH_STDOUT - /* We want to use the stdout flush utility */ - #include - #define UNITY_OUTPUT_FLUSH() (void)fflush(stdout) - #else - /* We've specified nothing, therefore flush should just be ignored */ - #define UNITY_OUTPUT_FLUSH() (void)0 - #endif -#else - /* If defined as something else, make sure we declare it here so it's ready for use */ - #ifdef UNITY_OUTPUT_FLUSH_HEADER_DECLARATION - extern void UNITY_OUTPUT_FLUSH_HEADER_DECLARATION; - #endif -#endif - -#ifndef UNITY_OUTPUT_FLUSH -#define UNITY_FLUSH_CALL() -#else -#define UNITY_FLUSH_CALL() UNITY_OUTPUT_FLUSH() -#endif - -#ifndef UNITY_PRINT_EOL -#define UNITY_PRINT_EOL() UNITY_OUTPUT_CHAR('\n') -#endif - -#ifndef UNITY_OUTPUT_START -#define UNITY_OUTPUT_START() -#endif - -#ifndef UNITY_OUTPUT_COMPLETE -#define UNITY_OUTPUT_COMPLETE() -#endif - -#ifdef UNITY_INCLUDE_EXEC_TIME - #if !defined(UNITY_EXEC_TIME_START) && \ - !defined(UNITY_EXEC_TIME_STOP) && \ - !defined(UNITY_PRINT_EXEC_TIME) && \ - !defined(UNITY_TIME_TYPE) - /* If none any of these macros are defined then try to provide a default implementation */ - - #if defined(UNITY_CLOCK_MS) - /* This is a simple way to get a default implementation on platforms that support getting a millisecond counter */ - #define UNITY_TIME_TYPE UNITY_UINT - #define UNITY_EXEC_TIME_START() Unity.CurrentTestStartTime = UNITY_CLOCK_MS() - #define UNITY_EXEC_TIME_STOP() Unity.CurrentTestStopTime = UNITY_CLOCK_MS() - #define UNITY_PRINT_EXEC_TIME() { \ - UNITY_UINT execTimeMs = (Unity.CurrentTestStopTime - Unity.CurrentTestStartTime); \ - UnityPrint(" ("); \ - UnityPrintNumberUnsigned(execTimeMs); \ - UnityPrint(" ms)"); \ - } - #elif defined(_WIN32) - #include - #define UNITY_TIME_TYPE clock_t - #define UNITY_GET_TIME(t) t = (clock_t)((clock() * 1000) / CLOCKS_PER_SEC) - #define UNITY_EXEC_TIME_START() UNITY_GET_TIME(Unity.CurrentTestStartTime) - #define UNITY_EXEC_TIME_STOP() UNITY_GET_TIME(Unity.CurrentTestStopTime) - #define UNITY_PRINT_EXEC_TIME() { \ - UNITY_UINT execTimeMs = (Unity.CurrentTestStopTime - Unity.CurrentTestStartTime); \ - UnityPrint(" ("); \ - UnityPrintNumberUnsigned(execTimeMs); \ - UnityPrint(" ms)"); \ - } - #elif defined(__unix__) || defined(__APPLE__) - #include - #define UNITY_TIME_TYPE struct timespec - #define UNITY_GET_TIME(t) clock_gettime(CLOCK_MONOTONIC, &t) - #define UNITY_EXEC_TIME_START() UNITY_GET_TIME(Unity.CurrentTestStartTime) - #define UNITY_EXEC_TIME_STOP() UNITY_GET_TIME(Unity.CurrentTestStopTime) - #define UNITY_PRINT_EXEC_TIME() { \ - UNITY_UINT execTimeMs = ((Unity.CurrentTestStopTime.tv_sec - Unity.CurrentTestStartTime.tv_sec) * 1000L); \ - execTimeMs += ((Unity.CurrentTestStopTime.tv_nsec - Unity.CurrentTestStartTime.tv_nsec) / 1000000L); \ - UnityPrint(" ("); \ - UnityPrintNumberUnsigned(execTimeMs); \ - UnityPrint(" ms)"); \ - } - #endif - #endif -#endif - -#ifndef UNITY_EXEC_TIME_START -#define UNITY_EXEC_TIME_START() do { /* nothing*/ } while (0) -#endif - -#ifndef UNITY_EXEC_TIME_STOP -#define UNITY_EXEC_TIME_STOP() do { /* nothing*/ } while (0) -#endif - -#ifndef UNITY_TIME_TYPE -#define UNITY_TIME_TYPE UNITY_UINT -#endif - -#ifndef UNITY_PRINT_EXEC_TIME -#define UNITY_PRINT_EXEC_TIME() do { /* nothing*/ } while (0) -#endif - -/*------------------------------------------------------- - * Footprint - *-------------------------------------------------------*/ - -#ifndef UNITY_LINE_TYPE -#define UNITY_LINE_TYPE UNITY_UINT -#endif - -#ifndef UNITY_COUNTER_TYPE -#define UNITY_COUNTER_TYPE UNITY_UINT -#endif - -/*------------------------------------------------------- - * Internal Structs Needed - *-------------------------------------------------------*/ - -typedef void (*UnityTestFunction)(void); - -#define UNITY_DISPLAY_RANGE_INT (0x10) -#define UNITY_DISPLAY_RANGE_UINT (0x20) -#define UNITY_DISPLAY_RANGE_HEX (0x40) -#define UNITY_DISPLAY_RANGE_CHAR (0x80) - -typedef enum -{ - UNITY_DISPLAY_STYLE_INT = (UNITY_INT_WIDTH / 8) + UNITY_DISPLAY_RANGE_INT, - UNITY_DISPLAY_STYLE_INT8 = 1 + UNITY_DISPLAY_RANGE_INT, - UNITY_DISPLAY_STYLE_INT16 = 2 + UNITY_DISPLAY_RANGE_INT, - UNITY_DISPLAY_STYLE_INT32 = 4 + UNITY_DISPLAY_RANGE_INT, -#ifdef UNITY_SUPPORT_64 - UNITY_DISPLAY_STYLE_INT64 = 8 + UNITY_DISPLAY_RANGE_INT, -#endif - - UNITY_DISPLAY_STYLE_UINT = (UNITY_INT_WIDTH / 8) + UNITY_DISPLAY_RANGE_UINT, - UNITY_DISPLAY_STYLE_UINT8 = 1 + UNITY_DISPLAY_RANGE_UINT, - UNITY_DISPLAY_STYLE_UINT16 = 2 + UNITY_DISPLAY_RANGE_UINT, - UNITY_DISPLAY_STYLE_UINT32 = 4 + UNITY_DISPLAY_RANGE_UINT, -#ifdef UNITY_SUPPORT_64 - UNITY_DISPLAY_STYLE_UINT64 = 8 + UNITY_DISPLAY_RANGE_UINT, -#endif - - UNITY_DISPLAY_STYLE_HEX8 = 1 + UNITY_DISPLAY_RANGE_HEX, - UNITY_DISPLAY_STYLE_HEX16 = 2 + UNITY_DISPLAY_RANGE_HEX, - UNITY_DISPLAY_STYLE_HEX32 = 4 + UNITY_DISPLAY_RANGE_HEX, -#ifdef UNITY_SUPPORT_64 - UNITY_DISPLAY_STYLE_HEX64 = 8 + UNITY_DISPLAY_RANGE_HEX, -#endif - - UNITY_DISPLAY_STYLE_CHAR = 1 + UNITY_DISPLAY_RANGE_CHAR + UNITY_DISPLAY_RANGE_INT, - - UNITY_DISPLAY_STYLE_UNKNOWN -} UNITY_DISPLAY_STYLE_T; - -typedef enum -{ - UNITY_WITHIN = 0x0, - UNITY_EQUAL_TO = 0x1, - UNITY_GREATER_THAN = 0x2, - UNITY_GREATER_OR_EQUAL = 0x2 + UNITY_EQUAL_TO, - UNITY_SMALLER_THAN = 0x4, - UNITY_SMALLER_OR_EQUAL = 0x4 + UNITY_EQUAL_TO, - UNITY_NOT_EQUAL = 0x0, - UNITY_UNKNOWN -} UNITY_COMPARISON_T; - -#ifndef UNITY_EXCLUDE_FLOAT -typedef enum UNITY_FLOAT_TRAIT -{ - UNITY_FLOAT_IS_NOT_INF = 0, - UNITY_FLOAT_IS_INF, - UNITY_FLOAT_IS_NOT_NEG_INF, - UNITY_FLOAT_IS_NEG_INF, - UNITY_FLOAT_IS_NOT_NAN, - UNITY_FLOAT_IS_NAN, - UNITY_FLOAT_IS_NOT_DET, - UNITY_FLOAT_IS_DET, - UNITY_FLOAT_INVALID_TRAIT -} UNITY_FLOAT_TRAIT_T; -#endif - -typedef enum -{ - UNITY_ARRAY_TO_VAL = 0, - UNITY_ARRAY_TO_ARRAY, - UNITY_ARRAY_UNKNOWN -} UNITY_FLAGS_T; - -struct UNITY_STORAGE_T -{ - const char* TestFile; - const char* CurrentTestName; -#ifndef UNITY_EXCLUDE_DETAILS - const char* CurrentDetail1; - const char* CurrentDetail2; -#endif - UNITY_LINE_TYPE CurrentTestLineNumber; - UNITY_COUNTER_TYPE NumberOfTests; - UNITY_COUNTER_TYPE TestFailures; - UNITY_COUNTER_TYPE TestIgnores; - UNITY_COUNTER_TYPE CurrentTestFailed; - UNITY_COUNTER_TYPE CurrentTestIgnored; -#ifdef UNITY_INCLUDE_EXEC_TIME - UNITY_TIME_TYPE CurrentTestStartTime; - UNITY_TIME_TYPE CurrentTestStopTime; -#endif -#ifndef UNITY_EXCLUDE_SETJMP_H - jmp_buf AbortFrame; -#endif -}; - -extern struct UNITY_STORAGE_T Unity; - -/*------------------------------------------------------- - * Test Suite Management - *-------------------------------------------------------*/ - -void UnityBegin(const char* filename); -int UnityEnd(void); -void UnitySetTestFile(const char* filename); -void UnityConcludeTest(void); - -#ifndef RUN_TEST -void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum); -#else -#define UNITY_SKIP_DEFAULT_RUNNER -#endif - -/*------------------------------------------------------- - * Details Support - *-------------------------------------------------------*/ - -#ifdef UNITY_EXCLUDE_DETAILS -#define UNITY_CLR_DETAILS() -#define UNITY_SET_DETAIL(d1) -#define UNITY_SET_DETAILS(d1,d2) -#else -#define UNITY_CLR_DETAILS() do { Unity.CurrentDetail1 = 0; Unity.CurrentDetail2 = 0; } while (0) -#define UNITY_SET_DETAIL(d1) do { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = 0; } while (0) -#define UNITY_SET_DETAILS(d1,d2) do { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = (d2); } while (0) - -#ifndef UNITY_DETAIL1_NAME -#define UNITY_DETAIL1_NAME "Function" -#endif - -#ifndef UNITY_DETAIL2_NAME -#define UNITY_DETAIL2_NAME "Argument" -#endif -#endif - -#ifdef UNITY_PRINT_TEST_CONTEXT -void UNITY_PRINT_TEST_CONTEXT(void); -#endif - -/*------------------------------------------------------- - * Test Output - *-------------------------------------------------------*/ - -void UnityPrint(const char* string); - -#ifdef UNITY_INCLUDE_PRINT_FORMATTED -void UnityPrintF(const UNITY_LINE_TYPE line, const char* format, ...); -#endif - -void UnityPrintLen(const char* string, const UNITY_UINT32 length); -void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number); -void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style); -void UnityPrintNumber(const UNITY_INT number_to_print); -void UnityPrintNumberUnsigned(const UNITY_UINT number); -void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print); - -#ifndef UNITY_EXCLUDE_FLOAT_PRINT -void UnityPrintFloat(const UNITY_DOUBLE input_number); -#endif - -/*------------------------------------------------------- - * Test Assertion Functions - *------------------------------------------------------- - * Use the macros below this section instead of calling - * these directly. The macros have a consistent naming - * convention and will pull in file and line information - * for you. */ - -void UnityAssertEqualNumber(const UNITY_INT expected, - const UNITY_INT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style); - -void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold, - const UNITY_INT actual, - const UNITY_COMPARISON_T compare, - const char *msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style); - -void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, - UNITY_INTERNAL_PTR actual, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style, - const UNITY_FLAGS_T flags); - -void UnityAssertBits(const UNITY_INT mask, - const UNITY_INT expected, - const UNITY_INT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber); - -void UnityAssertEqualString(const char* expected, - const char* actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber); - -void UnityAssertEqualStringLen(const char* expected, - const char* actual, - const UNITY_UINT32 length, - const char* msg, - const UNITY_LINE_TYPE lineNumber); - -void UnityAssertEqualStringArray( UNITY_INTERNAL_PTR expected, - const char** actual, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLAGS_T flags); - -void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, - UNITY_INTERNAL_PTR actual, - const UNITY_UINT32 length, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLAGS_T flags); - -void UnityAssertNumbersWithin(const UNITY_UINT delta, - const UNITY_INT expected, - const UNITY_INT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style); - -void UnityAssertNumbersArrayWithin(const UNITY_UINT delta, - UNITY_INTERNAL_PTR expected, - UNITY_INTERNAL_PTR actual, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style, - const UNITY_FLAGS_T flags); - -#ifndef UNITY_EXCLUDE_SETJMP_H -UNITY_NORETURN void UnityFail(const char* message, const UNITY_LINE_TYPE line); -UNITY_NORETURN void UnityIgnore(const char* message, const UNITY_LINE_TYPE line); -#else -void UnityFail(const char* message, const UNITY_LINE_TYPE line); -void UnityIgnore(const char* message, const UNITY_LINE_TYPE line); -#endif - -void UnityMessage(const char* message, const UNITY_LINE_TYPE line); - -#ifndef UNITY_EXCLUDE_FLOAT -void UnityAssertFloatsWithin(const UNITY_FLOAT delta, - const UNITY_FLOAT expected, - const UNITY_FLOAT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber); - -void UnityAssertFloatsNotWithin(const UNITY_FLOAT delta, - const UNITY_FLOAT expected, - const UNITY_FLOAT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber); - -void UnityAssertGreaterOrLessFloat(const UNITY_FLOAT threshold, - const UNITY_FLOAT actual, - const UNITY_COMPARISON_T compare, - const char* msg, - const UNITY_LINE_TYPE linenumber); - -void UnityAssertWithinFloatArray(const UNITY_FLOAT delta, - UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, - UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLAGS_T flags); - -void UnityAssertFloatSpecial(const UNITY_FLOAT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLOAT_TRAIT_T style); -#endif - -#ifndef UNITY_EXCLUDE_DOUBLE -void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, - const UNITY_DOUBLE expected, - const UNITY_DOUBLE actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber); - -void UnityAssertDoublesNotWithin(const UNITY_DOUBLE delta, - const UNITY_DOUBLE expected, - const UNITY_DOUBLE actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber); - -void UnityAssertGreaterOrLessDouble(const UNITY_DOUBLE threshold, - const UNITY_DOUBLE actual, - const UNITY_COMPARISON_T compare, - const char* msg, - const UNITY_LINE_TYPE linenumber); - -void UnityAssertWithinDoubleArray(const UNITY_DOUBLE delta, - UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected, - UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLAGS_T flags); - -void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLOAT_TRAIT_T style); -#endif - -/*------------------------------------------------------- - * Helpers - *-------------------------------------------------------*/ - -UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size); -#ifndef UNITY_EXCLUDE_FLOAT -UNITY_INTERNAL_PTR UnityFloatToPtr(const float num); -#endif -#ifndef UNITY_EXCLUDE_DOUBLE -UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num); -#endif - -/*------------------------------------------------------- - * Error Strings We Might Need - *-------------------------------------------------------*/ - -extern const char UnityStrOk[]; -extern const char UnityStrPass[]; -extern const char UnityStrFail[]; -extern const char UnityStrIgnore[]; - -extern const char UnityStrErrFloat[]; -extern const char UnityStrErrDouble[]; -extern const char UnityStrErr64[]; -extern const char UnityStrErrShorthand[]; - -/*------------------------------------------------------- - * Test Running Macros - *-------------------------------------------------------*/ - -#ifdef UNITY_TEST_PROTECT -#define TEST_PROTECT() UNITY_TEST_PROTECT() -#else -#ifndef UNITY_EXCLUDE_SETJMP_H -#define TEST_PROTECT() (setjmp(Unity.AbortFrame) == 0) -#else -#define TEST_PROTECT() 1 -#endif -#endif - -#ifdef UNITY_TEST_ABORT -#define TEST_ABORT() UNITY_TEST_ABORT() -#else -#ifndef UNITY_EXCLUDE_SETJMP_H -#define TEST_ABORT() longjmp(Unity.AbortFrame, 1) -#else -#define TEST_ABORT() return -#endif -#endif - -/* Automatically enable variadic macros support, if it not enabled before */ -#ifndef UNITY_SUPPORT_VARIADIC_MACROS - #ifdef __STDC_VERSION__ - #if __STDC_VERSION__ >= 199901L - #define UNITY_SUPPORT_VARIADIC_MACROS - #endif - #endif -#endif - -/* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */ -#ifndef RUN_TEST -#ifdef UNITY_SUPPORT_VARIADIC_MACROS -#define RUN_TEST(...) RUN_TEST_AT_LINE(__VA_ARGS__, __LINE__, throwaway) -#define RUN_TEST_AT_LINE(func, line, ...) UnityDefaultTestRun(func, #func, line) -#endif -#endif - -/* Enable default macros for masking param tests test cases */ -#ifdef UNITY_SUPPORT_TEST_CASES - #ifdef UNITY_SUPPORT_VARIADIC_MACROS - #if !defined(TEST_CASE) && !defined(UNITY_EXCLUDE_TEST_CASE) - #define TEST_CASE(...) - #endif - #if !defined(TEST_RANGE) && !defined(UNITY_EXCLUDE_TEST_RANGE) - #define TEST_RANGE(...) - #endif - #if !defined(TEST_MATRIX) && !defined(UNITY_EXCLUDE_TEST_MATRIX) - #define TEST_MATRIX(...) - #endif - #endif -#endif - -/* If we can't do the tricky version, we'll just have to require them to always include the line number */ -#ifndef RUN_TEST -#ifdef CMOCK -#define RUN_TEST(func, num) UnityDefaultTestRun(func, #func, num) -#else -#define RUN_TEST(func) UnityDefaultTestRun(func, #func, __LINE__) -#endif -#endif - -#define TEST_LINE_NUM (Unity.CurrentTestLineNumber) -#define TEST_IS_IGNORED (Unity.CurrentTestIgnored) -#define UNITY_NEW_TEST(a) \ - Unity.CurrentTestName = (a); \ - Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)(__LINE__); \ - Unity.NumberOfTests++; - -#ifndef UNITY_BEGIN -#define UNITY_BEGIN() UnityBegin(__FILE__) -#endif - -#ifndef UNITY_END -#define UNITY_END() UnityEnd() -#endif - -#ifndef UNITY_SHORTHAND_AS_INT -#ifndef UNITY_SHORTHAND_AS_MEM -#ifndef UNITY_SHORTHAND_AS_NONE -#ifndef UNITY_SHORTHAND_AS_RAW -#define UNITY_SHORTHAND_AS_OLD -#endif -#endif -#endif -#endif - -/*----------------------------------------------- - * Command Line Argument Support - *-----------------------------------------------*/ - -#ifdef UNITY_USE_COMMAND_LINE_ARGS -int UnityParseOptions(int argc, char** argv); -int UnityTestMatches(void); -#endif - -/*------------------------------------------------------- - * Basic Fail and Ignore - *-------------------------------------------------------*/ - -#define UNITY_TEST_FAIL(line, message) UnityFail( (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_IGNORE(line, message) UnityIgnore( (message), (UNITY_LINE_TYPE)(line)) - -/*------------------------------------------------------- - * Test Asserts - *-------------------------------------------------------*/ - -#define UNITY_TEST_ASSERT(condition, line, message) do { if (condition) { /* nothing*/ } else { UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), (message)); } } while (0) -#define UNITY_TEST_ASSERT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) == NULL), (UNITY_LINE_TYPE)(line), (message)) -#define UNITY_TEST_ASSERT_NOT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) != NULL), (UNITY_LINE_TYPE)(line), (message)) -#define UNITY_TEST_ASSERT_EMPTY(pointer, line, message) UNITY_TEST_ASSERT(((pointer[0]) == 0), (UNITY_LINE_TYPE)(line), (message)) -#define UNITY_TEST_ASSERT_NOT_EMPTY(pointer, line, message) UNITY_TEST_ASSERT(((pointer[0]) != 0), (UNITY_LINE_TYPE)(line), (message)) - -#define UNITY_TEST_ASSERT_EQUAL_INT(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_EQUAL_INT8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_EQUAL_INT16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_EQUAL_INT32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_EQUAL_UINT(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_EQUAL_UINT8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_EQUAL_UINT16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_EQUAL_UINT32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_EQUAL_HEX8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_EQUAL_HEX16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_EQUAL_HEX32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_EQUAL_CHAR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) -#define UNITY_TEST_ASSERT_BITS(mask, expected, actual, line, message) UnityAssertBits((UNITY_INT)(mask), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line)) - -#define UNITY_TEST_ASSERT_NOT_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_NOT_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_NOT_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_NOT_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_NOT_EQUAL_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) - -#define UNITY_TEST_ASSERT_GREATER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_GREATER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_GREATER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_GREATER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_GREATER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_GREATER_THAN_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) - -#define UNITY_TEST_ASSERT_SMALLER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_SMALLER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_SMALLER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_SMALLER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_SMALLER_THAN_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) - -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT) (threshold), (UNITY_INT) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 ) (threshold), (UNITY_INT)(UNITY_INT8 ) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16) (threshold), (UNITY_INT)(UNITY_INT16) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32) (threshold), (UNITY_INT)(UNITY_INT32) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT) (threshold), (UNITY_INT) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 ) (threshold), (UNITY_INT)(UNITY_INT8 ) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) - -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT) (threshold), (UNITY_INT) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 ) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT) (threshold), (UNITY_INT) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 ) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) - -#define UNITY_TEST_ASSERT_INT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin( (delta), (UNITY_INT) (expected), (UNITY_INT) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_INT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_INT8 ) (expected), (UNITY_INT)(UNITY_INT8 ) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_INT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_INT16) (expected), (UNITY_INT)(UNITY_INT16) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_INT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_INT32) (expected), (UNITY_INT)(UNITY_INT32) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_UINT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin( (delta), (UNITY_INT) (expected), (UNITY_INT) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_UINT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_UINT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_UINT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_HEX8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_CHAR_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_INT8 ) (expected), (UNITY_INT)(UNITY_INT8 ) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) - -#define UNITY_TEST_ASSERT_INT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin( (delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8 )(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT16)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT32)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin( (delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8 )(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT16)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT32)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8 )(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT16)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT32)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8 )(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR, UNITY_ARRAY_TO_ARRAY) - - -#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_PTR_TO_INT)(expected), (UNITY_PTR_TO_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) -#define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char*)(expected), (const char*)(actual), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char*)(expected), (const char*)(actual), (UNITY_UINT32)(len), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), 1, (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) - -#define UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR, UNITY_ARRAY_TO_ARRAY) - -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) (expected), (UNITY_INT_WIDTH / 8)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) (expected), (UNITY_INT_WIDTH / 8)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT16)(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT32)(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_PTR_TO_INT) (expected), (UNITY_POINTER_WIDTH / 8)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_CHAR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR, UNITY_ARRAY_TO_VAL) - -#ifdef UNITY_SUPPORT_64 -#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) -#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) -#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) -#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) -#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) -#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) -#define UNITY_TEST_ASSERT_NOT_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) -#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) -#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) -#define UNITY_TEST_ASSERT_GREATER_THAN_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) -#define UNITY_TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) -#define UNITY_TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) -#define UNITY_TEST_ASSERT_SMALLER_THAN_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) -#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) -#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) -#define UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT64)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT64)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT64)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) -#else -#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_GREATER_THAN_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_SMALLER_THAN_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#define UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) -#endif - -#ifdef UNITY_EXCLUDE_FLOAT -#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) -#else -#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsWithin((UNITY_FLOAT)(delta), (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsNotWithin((UNITY_FLOAT)(delta), (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((UNITY_FLOAT)(expected) * (UNITY_FLOAT)UNITY_FLOAT_PRECISION, (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (UNITY_LINE_TYPE)(line), (message)) -#define UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN((UNITY_FLOAT)(expected) * (UNITY_FLOAT)UNITY_FLOAT_PRECISION, (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (UNITY_LINE_TYPE)(line), (message)) -#define UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertWithinFloatArray((UNITY_FLOAT)(delta), (const UNITY_FLOAT*)(expected), (const UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UnityAssertWithinFloatArray((UNITY_FLOAT)0, (const UNITY_FLOAT*)(expected), (const UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UnityAssertWithinFloatArray((UNITY_FLOAT)0, UnityFloatToPtr(expected), (const UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) -#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) -#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) -#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) -#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) -#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) -#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) -#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) -#endif - -#ifdef UNITY_EXCLUDE_DOUBLE -#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) -#else -#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesNotWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((UNITY_DOUBLE)(expected) * (UNITY_DOUBLE)UNITY_DOUBLE_PRECISION, (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (UNITY_LINE_TYPE)(line), (message)) -#define UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN((UNITY_DOUBLE)(expected) * (UNITY_DOUBLE)UNITY_DOUBLE_PRECISION, (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (UNITY_LINE_TYPE)(line), (message)) -#define UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertWithinDoubleArray((UNITY_DOUBLE)(delta), (const UNITY_DOUBLE*)(expected), (const UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertWithinDoubleArray((UNITY_DOUBLE)0, (const UNITY_DOUBLE*)(expected), (const UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UnityAssertWithinDoubleArray((UNITY_DOUBLE)0, UnityDoubleToPtr(expected), (const UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) -#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) -#endif - -/* End of UNITY_INTERNALS_H */ -#endif From 67301993abe3943c022d14fdeeafb8b8dced0c04 Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Sat, 8 Feb 2025 03:06:30 -0700 Subject: [PATCH 33/68] CI: Alpha (#23) * docs: update readme * ci: test config * ci: test config * ci: wip * ci: wip * chore(release): 0.0.4 [skip ci] ## [0.0.4](https://github.com/bkm82/flowVC/compare/v0.0.3...v0.0.4) (2025-02-08) ### Bug Fixes * remove token and use default ([#18](https://github.com/bkm82/flowVC/issues/18)) ([21b8c7f](https://github.com/bkm82/flowVC/commit/21b8c7fc8386f10d3a87d1f93acc3c16d1d025df)) * ci: update relase config * docs: update README * cd: try implement a sematntic-release unsquash * cd: yaml fix * ci: revert the semantic-release-unsquash --------- Co-authored-by: semantic-release-bot --- .github/workflows/cd.backup | 60 ----------------- .../{semantic-release.yml => cd.yml} | 6 +- .releaserc.json | 17 +++++ .releaserc.prerelease.json | 18 +++++ .releaserc.prerelease.yaml | 17 ----- .releaserc.yaml | 14 ---- CHANGELOG.md | 7 ++ README.org | 65 ++++++++++++++----- 8 files changed, 92 insertions(+), 112 deletions(-) delete mode 100644 .github/workflows/cd.backup rename .github/workflows/{semantic-release.yml => cd.yml} (94%) create mode 100644 .releaserc.json create mode 100644 .releaserc.prerelease.json delete mode 100644 .releaserc.prerelease.yaml delete mode 100644 .releaserc.yaml diff --git a/.github/workflows/cd.backup b/.github/workflows/cd.backup deleted file mode 100644 index f2bddfd..0000000 --- a/.github/workflows/cd.backup +++ /dev/null @@ -1,60 +0,0 @@ -name: CD - -on: - # Publish on every approved PR - pull_request: - types: - - closed - branches: - - main - -permissions: - id-token: write - contents: write - packages: write - -jobs: - check: - name: check pr status - runs-on: ubuntu-latest - steps: - - name: check if PR is merged - uses: zmynx/github-actions/.github/actions/git/check-merge@feature/gha - - cd: - name: build - needs: [check] - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate Release using Docker - run: | - docker run \ - --interactive \ - --rm \ - -u $(id -u):$(id -g) \ - --volume .:/home/dev/project \ - throwtheswitch/madsciencelab-plugins:1.0.0 \ - ceedling release - - name: Upload Artifact - uses: actions/upload-artifact@v4 - with: - name: flowVC.out - path: ./build/artifacts/release/flowVC.out - - - name: Determine Release Info - id: release - uses: Fresa/trunk-based-release-versioning@main - - - name: Create Release - uses: softprops/action-gh-release@v2 - with: - tag_name: ${{ steps.release.outputs.version }} - files: ./build/release/flowVC.out - draft: true - prerelease: true - generate_release_notes: true diff --git a/.github/workflows/semantic-release.yml b/.github/workflows/cd.yml similarity index 94% rename from .github/workflows/semantic-release.yml rename to .github/workflows/cd.yml index f3c6570..0a670c8 100644 --- a/.github/workflows/semantic-release.yml +++ b/.github/workflows/cd.yml @@ -1,11 +1,11 @@ --- -name: Semantic Release +name: CD on: push: branches: - main - - remove_docker + - alpha jobs: semantic-release: @@ -39,7 +39,7 @@ jobs: - name: Prepare prerelease semantic if: github.ref != 'refs/heads/main' - run: mv .releaserc.prerelease.yaml .releaserc.yaml + run: mv .releaserc.prerelease.json .releaserc.json - name: Semantic Release uses: cycjimmy/semantic-release-action@v4 diff --git a/.releaserc.json b/.releaserc.json new file mode 100644 index 0000000..551f8a9 --- /dev/null +++ b/.releaserc.json @@ -0,0 +1,17 @@ +{ + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + "@semantic-release/changelog", + [ + "@semantic-release/github", + { + "assets": ["build/release/flowVC.out"] + } + ], + "@semantic-release/git" + ], + "branches": [ + "main" + ] +} diff --git a/.releaserc.prerelease.json b/.releaserc.prerelease.json new file mode 100644 index 0000000..f4c43ac --- /dev/null +++ b/.releaserc.prerelease.json @@ -0,0 +1,18 @@ +{ + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + "@semantic-release/changelog", + [ + "@semantic-release/github", + { + "assets": ["build/release/flowVC.out"] + } + ], + "@semantic-release/git" + ], + "branches": [ + "main", + "alpha" + ] +} diff --git a/.releaserc.prerelease.yaml b/.releaserc.prerelease.yaml deleted file mode 100644 index d837b94..0000000 --- a/.releaserc.prerelease.yaml +++ /dev/null @@ -1,17 +0,0 @@ -plugins: - - "@semantic-release/commit-analyzer" - - "@semantic-release/release-notes-generator" - - "@semantic-release/changelog" - - "@semantic-release/github" - -branches: - - "+([0-9])?(.{+([0-9]),x}).x" - - main - - name: dev/* - prerelease: '${name.replace(/^dev\//g, "dev-")}' - - name: remove_docker/* - prerelease: '${name.replace(/^remove_docker\//g, "remove_docker-")}' - - name: feature/* - prerelease: '${name.replace(/^feature\//g, "feature-")}' - - name: hotfix/* - prerelease: '${name.replace(/^hotfix\//g, "hotfix-")}' \ No newline at end of file diff --git a/.releaserc.yaml b/.releaserc.yaml deleted file mode 100644 index 5531b87..0000000 --- a/.releaserc.yaml +++ /dev/null @@ -1,14 +0,0 @@ -plugins: - - "@semantic-release/commit-analyzer" - - "@semantic-release/release-notes-generator" - - "@semantic-release/changelog" - - "@semantic-release/git" - - "@semantic-release/github" - - assets: - -path: ./build/release/flowVC.out - -label: flowVC.out - -branches: - - "+([0-9])?(.{+([0-9]),x}).x" - - main - - remove_docker \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index a1031b8..982b522 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [0.0.4](https://github.com/bkm82/flowVC/compare/v0.0.3...v0.0.4) (2025-02-08) + + +### Bug Fixes + +* remove token and use default ([#18](https://github.com/bkm82/flowVC/issues/18)) ([21b8c7f](https://github.com/bkm82/flowVC/commit/21b8c7fc8386f10d3a87d1f93acc3c16d1d025df)) + ## [0.0.3](https://github.com/bkm82/flowVC/compare/v0.0.2...v0.0.3) (2025-02-07) diff --git a/README.org b/README.org index aba4c35..53724e6 100644 --- a/README.org +++ b/README.org @@ -18,28 +18,27 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ** Installation -*** Binaries -This project has a pre-compiled binary for linux in the releases. -*** Development -**** Dependencies -[[https://www.ruby-lang.org/en/][Ruby]] > v 3.0: A programing language used for Ceedling +*** Automated Release +If you are on ubuntu, the code here can be ran directly using the compiled binary in the latest release. Otherwise follow the instructions below for building the source code from the source code . + +*** Build From Source +To build the code from source the there are two options. The first option involved installing Ceedling and its dependencies. Alternativly, if you have docker, you can download the docker image with the dependencies all bundeled together. -[[https://github.com/ThrowTheSwitch/Ceedling][Ceedling]] : A collection of tools for C project including Unity and CMock for testing +**** Ceedling +***** Dependencies +[[https://www.ruby-lang.org/en/][Ruby]] > v 3.0: A programing language used for Ceedling -gcovr: a code coverage reporter +[[https://github.com/ThrowTheSwitch/Ceedling][Ceedling]] : Ceedling is a Test-Centered Build System for C. It utilizes a collection of tools for testing (Unity) and mocking (CMock) -**** Instalation -1. Install [[https://www.ruby-lang.org/en/][Ruby]] +***** Instalation +1. Install [[https://www.ruby-lang.org/en/][Ruby]] by refering to the ruby documentation for your operating system. 2. Install Ceedling gem from the RubyGems repository #+begin_src shell gem install ceedling #+end_src -3. Install gcovr - #+begin_src shell - sudo apt install gcovr - #+end_src + 4. Clone the repository #+begin_src shell https://github.com/bkm82/flowVC.git @@ -54,14 +53,43 @@ gcovr: a code coverage reporter #+begin_src shell ceedling release #+end_src - this will create the ./build/release/flowVC.out executable - - + this will create the ./build/release/flowVC.out executable that you can run. -**** Guidlines +**** Docker +Alternatly, if you dont want to install the tooling and would prefer to use a docker container you can do that -***** Semantic Versioning: +1. Install docker (outside the scope of this documentation) +2. Clone the repository + #+begin_src shell + https://github.com/bkm82/flowVC.git + cd flowVC + #+end_src + +3. Pull the docker image from docker hub [[https://hub.docker.com/r/throwtheswitch/madsciencelab][madsciencelab]] + #+begin_src shell + docker pull throwtheswitch/madsciencelab:latest + #+end_src +4. Run the tests: if you are in the flowVC directory you can replace the with a "." (without the quotes) + #+begin_src shell + docker run -it --rm -v :/home/dev/project throwtheswitch/madsciencelab:latest + ceedling test:all + #+end_src +5. Build the executable + #+begin_src shell + docker run -it --rm -v :/home/dev/project throwtheswitch/madsciencelab:latest + ceedling release + #+end_src +6. This will create the ./build/release/flowVC.out executable. NOTE: as this was compiled using a linux (Ubuntu) docker container, this might not work if you are on another operating system. In that case you can run the command through the docker container (i.e.) + #+begin_src shell + docker run -it --rm -v .:/home/dev/project throwtheswitch/madsciencelab:latest + .build/release/flowVC.out + #+end_src + +**** Make +The third option is to compile the source code using the provided Make file, however this file is not currently part of the CI/CD pipeline so there may be compilation bugs. Issue reports and/or contributions are welcome +** Development Guidlines +*** Semantic Versioning: This project intends to use a Trunk-Based Release with semantic versioning. Commit messages should follow [[https://www.conventionalcommits.org/en/v1.0.0/][conventional commits]] #+begin_src shell [optional scope]: @@ -71,3 +99,4 @@ Where the type determines the version updates. Valid types are fix, feat, BREAKING CHANGE, build, chore, ci, docs, style, refactor, perf, test + From b61beab96c6b6d9ed1cc8c9cb6fa7a3f8c4d65bf Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Sat, 8 Feb 2025 03:27:14 -0700 Subject: [PATCH 34/68] docs: update readme (#24) --- .gitignore | 1 + README.org | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index ad2512a..906c6bc 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,4 @@ dkms.conf settings_script_controlled.in +/ltximg/ \ No newline at end of file diff --git a/README.org b/README.org index 53724e6..8db986c 100644 --- a/README.org +++ b/README.org @@ -17,6 +17,52 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +** Usage +This code is used to perform flow visualization post processing. It can be used to calculate the Finite Time Lyoponove Exponent (FTLE) field +*** Quick Start +#+begin_src shell +./flowvc.out settings_file +#+end_src + +*** Data Files +To run the [[id:f888271a-2f1f-47b3-8a3c-482c0df3e64c][flowVC]] code the _velocity.bin, _coordinates.bin, _connectivity.bin, and _adjacency.bin files need to be created from the velocity data. For each of these files, the full file name should incldue a file prefix before the _ to create a descriptive file name. Refer to https://shaddenlab.berkeley.edu/uploads/releasenotes.pdf for a more detailed description of each of these files. +***** Cordinates File +For an unstructured velocity data set, the _cordinates.bin is a binary file stored in the following order. +\begin{equation} +n \; \underbrace{x_0\; y_0\; z_0}_{\text{node 0}} \underbrace{x_1\; y_1 \; z_1}_{\text{node 1}} ....\; \underbrace{x_{n-1} \; y_{n-1}\; z_{n-1}}_{\text{node n-1}} +\end{equation} + +****** Data Type +n(int): the number of points in the data set +$x_i, y_i, z_i$(double): The cordinates of each node + +***** Connectivity +The _connectivity.bin file contains the nodes that make up each element. For a tetrahedral mesh this results in 4 points per element. + + \begin{equation} + e\; \underbrace{i_0^0\; i_0^1\; i_0^2\; i_0^3}_{\text{element 0}} \underbrace{i_1^0\; i_1^1\; i_1^2\; i_1^3}_{\text{element 1}} ... \underbrace{i_{e-1}^0\; i_{e-1}^1\; i_{e-1}^2\; i_{e-1}^3}_{\text{element e-1}} + \end{equation} + +****** Data Type +e(int): The number of elements in the data set +$i_i^j$ (int): The index of the jth point making ith element in the dataset + +***** Adjacency +The _adjacency.bin file contains the indices of the adacent elements that share a face with the current element. The number of the element is based on the order of the coordinates.bin file. + + \begin{equation} + e\; \underbrace{e_0^0\; e_0^1\; e_0^2\; e_0^3}_{\text{element 0}} \underbrace{e_1^0\; e_1^1\; e_1^2\; e_1^3}_{\text{element 1}} ... \underbrace{e_{e-1}^0\; e_{e-1}^1\; e_{e-1}^2\; e_{e-1}^3}_{\text{element e-1}} + \end{equation} + +****** Data Type +e(int): The number of elements in the data set +$e_i^j$ (int): The index of the element that shares the j'th face for the ith element in the dataset. Note if the element face is not shared with another element (i.e. on the edge this is a -1) + + + + + + ** Installation *** Automated Release @@ -88,8 +134,8 @@ Alternatly, if you dont want to install the tooling and would prefer to use a do **** Make The third option is to compile the source code using the provided Make file, however this file is not currently part of the CI/CD pipeline so there may be compilation bugs. Issue reports and/or contributions are welcome -** Development Guidlines -*** Semantic Versioning: +*** Development Guidlines +**** Semantic Versioning: This project intends to use a Trunk-Based Release with semantic versioning. Commit messages should follow [[https://www.conventionalcommits.org/en/v1.0.0/][conventional commits]] #+begin_src shell [optional scope]: From 7151eed9491e58c89ea44f7d746330759f7417da Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 8 Feb 2025 10:27:58 +0000 Subject: [PATCH 35/68] chore(release): 0.0.4 [skip ci] ## [0.0.4](https://github.com/bkm82/flowVC/compare/v0.0.3...v0.0.4) (2025-02-08) ### Bug Fixes * remove token and use default ([#18](https://github.com/bkm82/flowVC/issues/18)) ([21b8c7f](https://github.com/bkm82/flowVC/commit/21b8c7fc8386f10d3a87d1f93acc3c16d1d025df)) --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 982b522..8bacd40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ ## [0.0.4](https://github.com/bkm82/flowVC/compare/v0.0.3...v0.0.4) (2025-02-08) +### Bug Fixes + +* remove token and use default ([#18](https://github.com/bkm82/flowVC/issues/18)) ([21b8c7f](https://github.com/bkm82/flowVC/commit/21b8c7fc8386f10d3a87d1f93acc3c16d1d025df)) + +## [0.0.4](https://github.com/bkm82/flowVC/compare/v0.0.3...v0.0.4) (2025-02-08) + + ### Bug Fixes * remove token and use default ([#18](https://github.com/bkm82/flowVC/issues/18)) ([21b8c7f](https://github.com/bkm82/flowVC/commit/21b8c7fc8386f10d3a87d1f93acc3c16d1d025df)) From b613474791c04f61ff0bbf047e17b2ab00f1d515 Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Sat, 8 Feb 2025 03:44:30 -0700 Subject: [PATCH 36/68] docs: update readme to point to flowVC uitils (#25) --- README.org | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.org b/README.org index 8db986c..cd84145 100644 --- a/README.org +++ b/README.org @@ -20,12 +20,18 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ** Usage This code is used to perform flow visualization post processing. It can be used to calculate the Finite Time Lyoponove Exponent (FTLE) field *** Quick Start +1. Ensure your simulation results for a tetrahedral mesh. If they are not, interpolate them onto a tetrahedral mesh using something like paraview. Save them into evenly spaced time steps in a directory using a name_xxxxx.vtu file format. +2. Use the vtu_2_bin section [[https://github.com/bkm82/flowVC-utils][flowVC-Utils]] python project to convert the .vtu to a binary format +3. Use the inigenerator section [[https://github.com/bkm82/flowVC-utils][flowVC-Utils]] python project to create a settings file (.ini) + + #+begin_src shell ./flowvc.out settings_file #+end_src *** Data Files -To run the [[id:f888271a-2f1f-47b3-8a3c-482c0df3e64c][flowVC]] code the _velocity.bin, _coordinates.bin, _connectivity.bin, and _adjacency.bin files need to be created from the velocity data. For each of these files, the full file name should incldue a file prefix before the _ to create a descriptive file name. Refer to https://shaddenlab.berkeley.edu/uploads/releasenotes.pdf for a more detailed description of each of these files. + +To run the [[id:f888271a-2f1f-47b3-8a3c-482c0df3e64c][flowVC]] code the _velocity.bin, _coordinates.bin, _connectivity.bin, and _adjacency.bin files need to be created from the velocity data. For each of these files, the full file name should incldue a file prefix before the _ to create a descriptive file name. Refer to https://shaddenlab.berkeley.edu/uploads/releasenotes.pdf for a more detailed description of each of these files. ***** Cordinates File For an unstructured velocity data set, the _cordinates.bin is a binary file stored in the following order. \begin{equation} @@ -146,3 +152,5 @@ Where the type determines the version updates. Valid types are fix, feat, BREAKING CHANGE, build, chore, ci, docs, style, refactor, perf, test +* Planned Updates +** TODO Add an example settings file From 83e15862e848c99964acc4c7f6a582dd0ca324d6 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 8 Feb 2025 10:45:14 +0000 Subject: [PATCH 37/68] chore(release): 0.0.4 [skip ci] ## [0.0.4](https://github.com/bkm82/flowVC/compare/v0.0.3...v0.0.4) (2025-02-08) ### Bug Fixes * remove token and use default ([#18](https://github.com/bkm82/flowVC/issues/18)) ([21b8c7f](https://github.com/bkm82/flowVC/commit/21b8c7fc8386f10d3a87d1f93acc3c16d1d025df)) --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bacd40..7182bfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,13 @@ ## [0.0.4](https://github.com/bkm82/flowVC/compare/v0.0.3...v0.0.4) (2025-02-08) +### Bug Fixes + +* remove token and use default ([#18](https://github.com/bkm82/flowVC/issues/18)) ([21b8c7f](https://github.com/bkm82/flowVC/commit/21b8c7fc8386f10d3a87d1f93acc3c16d1d025df)) + +## [0.0.4](https://github.com/bkm82/flowVC/compare/v0.0.3...v0.0.4) (2025-02-08) + + ### Bug Fixes * remove token and use default ([#18](https://github.com/bkm82/flowVC/issues/18)) ([21b8c7f](https://github.com/bkm82/flowVC/commit/21b8c7fc8386f10d3a87d1f93acc3c16d1d025df)) From a2cba2798949a99c772920dc4f5bbc5c30152234 Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Mon, 10 Feb 2025 03:35:44 -0700 Subject: [PATCH 38/68] ci: deploy docs to github-pages (#26) * docs: create a docs directory using org-html-themes (readtheorg). * ci: add docs build gh-action that builds the documentation (using emacs) deploys to the docs branch * docs: update the README.org for clarity --- .github/workflows/docs.yml | 29 + .gitignore | 6 +- README.org | 159 +- docs/build-site.el | 53 + docs/build.sh | 3 + docs/content/FTLE_example.org | 353 +++ docs/content/css/htmlize.css | 145 + docs/content/css/readtheorg.css | 1144 +++++++ docs/content/css/rtd-full.css | 3910 ++++++++++++++++++++++++ docs/content/css/search.css | 47 + docs/content/header.org | 3 + docs/content/index.org | 13 + docs/content/js/readtheorg.js | 145 + docs/content/js/search.js | 187 ++ docs/content/vtu_2bin.org | 103 + docs/org-themes/theme-readtheorg.setup | 30 + examples/inputfile.in | 345 +++ 17 files changed, 6607 insertions(+), 68 deletions(-) create mode 100644 .github/workflows/docs.yml create mode 100644 docs/build-site.el create mode 100755 docs/build.sh create mode 100644 docs/content/FTLE_example.org create mode 100644 docs/content/css/htmlize.css create mode 100644 docs/content/css/readtheorg.css create mode 100644 docs/content/css/rtd-full.css create mode 100644 docs/content/css/search.css create mode 100644 docs/content/header.org create mode 100644 docs/content/index.org create mode 100644 docs/content/js/readtheorg.js create mode 100644 docs/content/js/search.js create mode 100644 docs/content/vtu_2bin.org create mode 100644 docs/org-themes/theme-readtheorg.setup create mode 100644 examples/inputfile.in diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..556cb98 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,29 @@ +name: Docs + +on: + push: + branches: + - main + +permissions: + contents: write + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: Check out + uses: actions/checkout@v4 + + - name: Install Emacs + run: sudo apt install emacs-nox --yes + + - name: Build the site + run: ./build.sh + working-directory: docs/ + + - name: Publish generated content to GitHub Pages + uses: JamesIves/github-pages-deploy-action@4.1.4 + with: + branch: docs + folder: docs/public/ \ No newline at end of file diff --git a/.gitignore b/.gitignore index 906c6bc..4ae392f 100644 --- a/.gitignore +++ b/.gitignore @@ -62,4 +62,8 @@ dkms.conf settings_script_controlled.in -/ltximg/ \ No newline at end of file +**ltximg** + +# packaged directory +.packages/ +/docs/public/ \ No newline at end of file diff --git a/README.org b/README.org index cd84145..9dd52bf 100644 --- a/README.org +++ b/README.org @@ -1,11 +1,19 @@ * flowVC -Flow Visualization Code forked from FlowPhysics/flowVC + + [[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/workflows/CI/badge.svg]] [[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/workflows/CD/badge.svg]] +[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/workflows/Docs/badge.svg]] [[https://codecov.io/gh/bkm82/flowVC][https://codecov.io/gh/bkm82/flowVC/graph/badge.svg?token=1U1152BG8T]] +Flow Visualization Code forked from FlowPhysics/flowVC + +#+begin_quote +[!TIP] +Check out the [[https://bkm82.github.io/flowVC/][Docs]] +#+end_quote Copyright 2013 Shadden Research Group. All rights reserved. @@ -17,131 +25,148 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +** Capabilities +flowVC is capable of reading in 2D or 3D velocity data and + +- Computing Finite Time Lyoponove Exponent (FTLE) fields +- Computing tracer/partile tragectories +- Interpolating the velocity onto another mesh + +#+begin_quote +[!Note] +You cannot compute FTLE and particle trajectories at the same time. The feature to interpolate velocity data onto another mesh is mainly useful to check if the program is reading in and interpolating your velocity data correctly. The velocity data must be defined on a Cartesian OR tetrahedral (3D) / triangular (2D) mesh. +#+end_quote + + ** Usage -This code is used to perform flow visualization post processing. It can be used to calculate the Finite Time Lyoponove Exponent (FTLE) field *** Quick Start -1. Ensure your simulation results for a tetrahedral mesh. If they are not, interpolate them onto a tetrahedral mesh using something like paraview. Save them into evenly spaced time steps in a directory using a name_xxxxx.vtu file format. -2. Use the vtu_2_bin section [[https://github.com/bkm82/flowVC-utils][flowVC-Utils]] python project to convert the .vtu to a binary format -3. Use the inigenerator section [[https://github.com/bkm82/flowVC-utils][flowVC-Utils]] python project to create a settings file (.ini) +**** Create the input data files + #+begin_quote + [!Note] + For the Input Data Files Format reference the [[https://bkm82.github.io/flowVC/][Docs]] + #+end_quote + + #+begin_quote + [!TIP] + For 3d Tetrahedral Data, the vtu_2bin in [[https://github.com/bkm82/flowVC-utils][flowVC-utils]] might be helpful! + #+end_quote + +**** Create a settings.in file. + #+begin_quote + [!TIP] + [[./examples/inputfile.in][Example Input File]] + #+end_quote + + +**** Download or Build the Latest Verison + #+begin_quote + [!Note] + For linux, get the pre-compiled binary [[https://github.com/bkm82/flowVC/releases/latest][here]] + For windos and mac, see below how to compile the code from source + #+end_quote +**** Run the code #+begin_src shell ./flowvc.out settings_file #+end_src -*** Data Files - -To run the [[id:f888271a-2f1f-47b3-8a3c-482c0df3e64c][flowVC]] code the _velocity.bin, _coordinates.bin, _connectivity.bin, and _adjacency.bin files need to be created from the velocity data. For each of these files, the full file name should incldue a file prefix before the _ to create a descriptive file name. Refer to https://shaddenlab.berkeley.edu/uploads/releasenotes.pdf for a more detailed description of each of these files. -***** Cordinates File -For an unstructured velocity data set, the _cordinates.bin is a binary file stored in the following order. -\begin{equation} -n \; \underbrace{x_0\; y_0\; z_0}_{\text{node 0}} \underbrace{x_1\; y_1 \; z_1}_{\text{node 1}} ....\; \underbrace{x_{n-1} \; y_{n-1}\; z_{n-1}}_{\text{node n-1}} -\end{equation} - -****** Data Type -n(int): the number of points in the data set -$x_i, y_i, z_i$(double): The cordinates of each node - -***** Connectivity -The _connectivity.bin file contains the nodes that make up each element. For a tetrahedral mesh this results in 4 points per element. - - \begin{equation} - e\; \underbrace{i_0^0\; i_0^1\; i_0^2\; i_0^3}_{\text{element 0}} \underbrace{i_1^0\; i_1^1\; i_1^2\; i_1^3}_{\text{element 1}} ... \underbrace{i_{e-1}^0\; i_{e-1}^1\; i_{e-1}^2\; i_{e-1}^3}_{\text{element e-1}} - \end{equation} - -****** Data Type -e(int): The number of elements in the data set -$i_i^j$ (int): The index of the jth point making ith element in the dataset - -***** Adjacency -The _adjacency.bin file contains the indices of the adacent elements that share a face with the current element. The number of the element is based on the order of the coordinates.bin file. - - \begin{equation} - e\; \underbrace{e_0^0\; e_0^1\; e_0^2\; e_0^3}_{\text{element 0}} \underbrace{e_1^0\; e_1^1\; e_1^2\; e_1^3}_{\text{element 1}} ... \underbrace{e_{e-1}^0\; e_{e-1}^1\; e_{e-1}^2\; e_{e-1}^3}_{\text{element e-1}} - \end{equation} - -****** Data Type -e(int): The number of elements in the data set -$e_i^j$ (int): The index of the element that shares the j'th face for the ith element in the dataset. Note if the element face is not shared with another element (i.e. on the edge this is a -1) - - - - - +**** Report any Issues +[[https://github.com/bkm82/flowVC/issues][Issues]] ** Installation -*** Automated Release -If you are on ubuntu, the code here can be ran directly using the compiled binary in the latest release. Otherwise follow the instructions below for building the source code from the source code . - *** Build From Source -To build the code from source the there are two options. The first option involved installing Ceedling and its dependencies. Alternativly, if you have docker, you can download the docker image with the dependencies all bundeled together. +If you are not on ubuntu, or you want to edit / modify the code, there are various ways to compile the code from source. **** Ceedling + +#+begin_quote +[!Note] +[[https://github.com/ThrowTheSwitch/Ceedling][Ceedling]] is a test-centered build system for C. It is how we test and build the release versions. It bundles some tools (Unity, CMock) together and provides a testing interface. +#+end_quote + ***** Dependencies [[https://www.ruby-lang.org/en/][Ruby]] > v 3.0: A programing language used for Ceedling -[[https://github.com/ThrowTheSwitch/Ceedling][Ceedling]] : Ceedling is a Test-Centered Build System for C. It utilizes a collection of tools for testing (Unity) and mocking (CMock) +[[https://github.com/ThrowTheSwitch/Ceedling][Ceedling]]: Ceedling is a Test-Centered Build System for C. It utilizes a collection of tools for testing (Unity) and mocking (CMock) ***** Instalation -1. Install [[https://www.ruby-lang.org/en/][Ruby]] by refering to the ruby documentation for your operating system. +****** Install [[https://www.ruby-lang.org/en/][Ruby]] by refering to the ruby documentation for your operating system. -2. Install Ceedling gem from the RubyGems repository +****** Install Ceedling gem from the RubyGems repository #+begin_src shell gem install ceedling #+end_src -4. Clone the repository +****** Clone the repository #+begin_src shell https://github.com/bkm82/flowVC.git cd flowVC #+end_src -5. To compile and run all of the tests, run +****** To compile and run all of the tests, run #+begin_src shell ceedling test:all #+end_src -6. To build the relese run +****** To build the relese run #+begin_src shell ceedling release #+end_src - this will create the ./build/release/flowVC.out executable that you can run. + this will create the executable in the ./build/release/flowVC.out path. **** Docker -Alternatly, if you dont want to install the tooling and would prefer to use a docker container you can do that +Alternatly, there is a docker image has the tooling installed. + -1. Install docker (outside the scope of this documentation) -2. Clone the repository +***** Install [[https://docs.docker.com/engine/install/][Docker]] +***** Clone the repository #+begin_src shell https://github.com/bkm82/flowVC.git cd flowVC #+end_src -3. Pull the docker image from docker hub [[https://hub.docker.com/r/throwtheswitch/madsciencelab][madsciencelab]] +***** Pull the docker image from docker hub [[https://hub.docker.com/r/throwtheswitch/madsciencelab][madsciencelab]] #+begin_src shell docker pull throwtheswitch/madsciencelab:latest #+end_src -4. Run the tests: if you are in the flowVC directory you can replace the with a "." (without the quotes) +***** Run the tests: if you are in the flowVC directory #+begin_src shell docker run -it --rm -v :/home/dev/project throwtheswitch/madsciencelab:latest ceedling test:all #+end_src -5. Build the executable + + #+begin_quote + [!Note] + If you are in the flowVC directory, you can replace the with a "." (without the quotes) + #+end_quote +***** Build the executable #+begin_src shell docker run -it --rm -v :/home/dev/project throwtheswitch/madsciencelab:latest ceedling release #+end_src -6. This will create the ./build/release/flowVC.out executable. NOTE: as this was compiled using a linux (Ubuntu) docker container, this might not work if you are on another operating system. In that case you can run the command through the docker container (i.e.) +***** This will create the ./build/release/flowVC.out executable. + + #+begin_quote + [!Warning] + This method compiles the code using a linux (Ubuntu) docker container, if you you are on another operating system, you might need to run the program through that docker container + #+end_quote + #+begin_src shell docker run -it --rm -v .:/home/dev/project throwtheswitch/madsciencelab:latest .build/release/flowVC.out #+end_src + **** Make -The third option is to compile the source code using the provided Make file, however this file is not currently part of the CI/CD pipeline so there may be compilation bugs. Issue reports and/or contributions are welcome -*** Development Guidlines -**** Semantic Versioning: +The third option is to compile the source code using the provided Make file, however this file is not currently part of the CI/CD. Issues or contributions are welcome! + +** Contributing +Contributions or fixes to issues are welcome. + + +*** Semantic Versioning: This project intends to use a Trunk-Based Release with semantic versioning. Commit messages should follow [[https://www.conventionalcommits.org/en/v1.0.0/][conventional commits]] #+begin_src shell [optional scope]: @@ -152,5 +177,5 @@ Where the type determines the version updates. Valid types are fix, feat, BREAKING CHANGE, build, chore, ci, docs, style, refactor, perf, test -* Planned Updates -** TODO Add an example settings file +*** Planned Updates +**** TODO Add support for windows in the CI/CD pipeline diff --git a/docs/build-site.el b/docs/build-site.el new file mode 100644 index 0000000..baa273c --- /dev/null +++ b/docs/build-site.el @@ -0,0 +1,53 @@ +;; Set the package installation directory so that packages aren't stored in the +;; ~/.emacs.d/elpa path. +(require 'package) +(setq package-user-dir (expand-file-name "./.packages")) +(setq package-archives '(("melpa" . "https://melpa.org/packages/") + ("elpa" . "https://elpa.gnu.org/packages/"))) + +;; Initialize the package system +(package-initialize) +(unless package-archive-contents + (package-refresh-contents)) + +;; Install dependencies +(package-install 'htmlize) + +;; Load the publishing system +(require 'ox-publish) + +;; Define the publishing project +(setq org-publish-project-alist + (list + '("my-org-site" + :recursive t + :base-directory "./content" + :publishing-directory "./public" + :base-extension "org" + :publishing-function org-html-publish-to-html + :with-author nil ;; Don't include author name + :with-creator t ;; Emacs and Org versions in footer + + :with-toc t ;; Include a table of contents + :section-numbers nil ;; Don't include section numbers + :time-stamp-file nil ;; Don't include time stamp in file + ) + '("org-static" + :base-directory "./content" + :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf" + :publishing-directory "./public" + :recursive t + :publishing-function org-publish-attachment + ) + )) +;; Remove validate ling at bottom +(setq org-html-validation-link nil ;; Dont show validation link + org-html-head-include-scripts nil ;; Use our own scripts + org-html-head-include-default-style nil) ;; Use our own styles + ;;org-html-head "") + ;;org-html-head "") +;; Generate the site output +(org-publish-all t) + + +(message "Build complete!") diff --git a/docs/build.sh b/docs/build.sh new file mode 100755 index 0000000..b2ca9cb --- /dev/null +++ b/docs/build.sh @@ -0,0 +1,3 @@ +#!/bin/sh +SCRIPT_DIR="$(dirname "$(realpath "$0")")" +emacs -Q --script $SCRIPT_DIR/build-site.el diff --git a/docs/content/FTLE_example.org b/docs/content/FTLE_example.org new file mode 100644 index 0000000..60bfaaa --- /dev/null +++ b/docs/content/FTLE_example.org @@ -0,0 +1,353 @@ +#+SETUPFILE: ../org-themes/theme-readtheorg.setup +#+INCLUDE: "./header.org" +* Input File + +#+begin_src shell :tangle ../../examples/inputfile.in + +################################# flowVC INPUT FILE ##################################### +# +# NOTE: Order of parameters listed must be maintained for proper parsing of input file +# Comment lines begin with #, comments can be added or removed as desired +# Comments cannot occur on lines containing variable declartations +# Standard format: VARIABLE_NAME = VALUE +# +####################################################################################### + +# Path_Data: String, Directory containing data files, e.g. velocity data, etc. +# Can be set to pwd (i.e. present working directory) +Path_Data = ../bin/ + +# Path_Output: String, Directory where output files will be written +# Can be set to pwd (i.e. present working directory) +Path_Output = ../output/ + +# Dimensions: Integer, Specifies if velocity data is 2D or 3D +Dimensions = 2 + +# Data_MeshType: Integer, Specifies mesh type of velocity data +# 0: Cartesian +# You will need files Data_InFilePrefix_vel.*.bin and Data_InFilePrefix_Cartesian.bin +# 1: Unstructured (tetrahedral for 3D and triangular for 2D) +# You will need files Data_InFilePrefix_vel.*.bin and Data_InFilePrefix_coordinates.bin, +# Data_InFilePrefix_connectivity.bin and Data_InFilePrefix_adjacency.bin +Data_MeshType = 0 + +# Data_InFilePrefix: String, common prefix for input velocity files (see minimum files needed above) +Data_InFilePrefix = dg + +# Data_SuffixTMin: Integer, number appended to the name of first velocity data file +# Assumes naming convention of Data_InFilePrefix_vel.N.bin, where Data_InFilePrefix is +# specified above and N varies from Data_SuffixTMin to (Data_SuffixTMin + Data_SuffixTDelta * Data_SuffixTRes) +Data_SuffixTMin = 0 + +# Data_SuffixTDelta: Integer, Increment between successive velocity data files +Data_SuffixTDelta = 1 + +# Data_SuffixTRes: Integer, number of velocity data files +Data_TRes = 51 + +# Data_TDelta: (Positive) Float, actual time spacing between successive velocity data files +# Assumes time spacing between velocity data files is constant +Data_TDelta = 0.02 + +# Data_TMin: Float, actual time assigned to first velocity data file +# Choice is arbitrary, but it usually makes sense to set this to 0.0, which would +# imply that the first velocity data file specifies the velocity at time 0.0 +Data_TMin = 0.0 + +# Data_TPeriodic: Binary flag, Specifies if data is periodic in time +# 0: Not periodic +# 1: Periodic (make sure first and last data file correspond to same point in cycle) +Data_TPeriodic = 1 + +# Data_XPeriodic: Binary flag, Specifies if data is periodic in space +# 0: Not periodic +# 1: Periodic +Data_XPeriodic = 0 + +# Data_MeshBounds.XMin, ..., Data_MeshBounds.ZMax: Specifies bounding box of velocity data +# Setting these bounds LARGER than the actual velocity domain will NOT affect the results +# Setting these bounds SMALLER than the actual velocity domain WILL limit the velocity data considered +Data_MeshBounds.XMin = 0.0 +Data_MeshBounds.XMax = 2.0 +Data_MeshBounds.YMin = 0.0 +Data_MeshBounds.YMax = 1.0 +Data_MeshBounds.ZMin = 0.0 +Data_MeshBounds.ZMax = 0.0 + +# Fluid_Density: Float, specifies fluid density (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Density = 1.0 + +# Fluid_Viscosity: Float, specifies fluid viscosity (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Viscosity = 1.0 + +# Output_TStart: Float, initial time to start simulation and begin writing output +# If FTLE_Compute = 1: Specifies time at which first FTLE field is computed AND output +# If Trace_Compute = 1: Specifies start time to begin computing tracer trajectories AND outputting positions to file +Output_TStart = 0.0 + +# Output_TRes: (Positive) Integer, Number of output times +# If FTLE_Compute: Specifies number of time instances when the FTLE field will be computed AND output +# If Trace_Compute: Specifies number of time instances that tracer positions will be output to file +Output_TRes = 11 + +# Output_TDelta: (Positive) Float, Time between successive output +# If FTLE_Compute: How often the FTLE field will be computed AND output +# If Trace_Compute: How often the tracer positions will be output to file +Output_TDelta = 0.1 + +# Int_Type: Integer, specified integration routine used +# 0: Euler +# 1: 4th order Runge Kutta +# 2: Runge Kutta Fehlberg (adaptive time stepping) +Int_Type = 1 + +# Int_TimeStep: (Positive) Float, Time step used for integration Euler or RK4 routines (i.e. Int_Type = 0 or 1) +# Valid only for Int_Type = 0 or 1 +Int_TimeStep = 0.001 + +# Int_Accuracy: (Positive) Float, Absolute error tolorance (between RK4 and RK5) +# Valid only for Int_Type = 2 +Int_Accuracy = 0.001 + +# Int_MinTimeStep: (Positive) Float, Minimum allowable time step used in RKF routine +# Once this time step is reached, RK4 approximation automatically accepted +# Valid only for Int_Type = 2 +Int_MinTimeStep = 0.00001 + +# Int_MaxTimeStep: (Positive) Float, Maximum allowable time step used in RKF routine +# Time step will not be increased beyond this limit even if error between RK4 and RK5 is less than Int_Accuracy +# Valid only for Int_Type = 2 +Int_MaxTimeStep = 0.1 + +# Int_TimeDirection: Integer, Should be set to 1 or -1 +# 1: Advect particles forward in time +# -1: Advect particles backward in time (used to compute backward time FTLE field) +Int_TimeDirection = 1 + +# Int_NormalFlow: Binary flag +# 0: Do not impose inward flow on no-slip boundaries +# 1: Replace no-slip condition on boundaries with inward velocity (magnitude specified by NormalFlowScaling below) +# Requires the file Data_InFilePrefix_normals.bin generated from program GetNormals.exe +# Currently valid only for Data_MeshType = 1 +Int_NormalFlow = 0 + +# Int_NormalFlowScaling: Float, Scaling for inward pointing boundary velocity (to prevent tracers from crossing +# no-slip boundaries), Need to set the number negative if file contains outward normals +# Valid only for Data_MeshType = 1, Int_NormalFlow = 1 +Int_NormalFlowScaling = 1.0 + +# Int_Extrapolate: Integer, allows particles to be integrated outside of domain of data by extrapolation of data set +# 0: End integration once particle leaves domain (or subset defined by Data_MeshBounds above). +# Computes FTLE for such points (and neighbors) early. +# 1: Extrapolate velocity outside domain by continuing particle with exit velocity (usually better than below) +# 2: Linear extrapolation of entire data set (NOT recommended unless you know what you're doing) +Int_Extrapolate = 0 + +# Particle_Radius: Float, Radius of all things treated as Lagrangian points +# Set to zero if you want points to behave as perfect tracers (recommended unless you know what you're doing) +Particle_Radius = 0.0 + +# Particle_Density: Float, Mass density of all things treated as Lagrangian points +# Respectively, set =, >, or < fluid density for neutrally buoyant, aerosols, or bubbles +# Only valid if Particle_Radius > 0 +Particle_Density = 1.0 + +# Particle_ICType: Int, Specified type of initial condition assigned to particles +# 0: Start particles from rest +# 1: Start particles with velocity equal to fluid velocity at particle release location (recommended) +# Valid only if Particle_Radius > 0 +Particle_ICType = 1 + +# Gravity_Vector[i]: Floats, Specifies components of gravity vector (use consistent units) +# Valid only if Particle_Radius > 0 +Gravity_Vector[0] = 0.0 +Gravity_Vector[1] = 0.0 +Gravity_Vector[2] = 0.0 + +# Local_Search_Checking: Binary flag +# 0: Only use local search protocol to determine elements containing initial location of points +# where velocity will need to be interpolated (recommended) +# 1: Use global search to check failures of local search protocol (safest, but can be painfully slow +# if you're not careful) +# Valid only if Data_MeshType = 1 +LocalSearchChecking = 0 + +# FTLE_Compute: Binary flag +# 0: Do not compute FTLE fields +# 1: Compute FTLE fields (Trace_Compute MUST be 0) +FTLE_Compute = 1 + +# FTLE_GenerateMesh: Binary flag +# 0: Read in FTLE mesh data from file FTLE_ICFile (this file created by running flowVC with FTLE_GenerateMesh = 1) +# 1: Generate a Cartesian mesh over which FTLE will be computed (mesh parameters specified below, resulting data +# saved to file FTLE_ICFile) +# Valid only if FTLE_Compute = 1 +FTLE_GenerateMesh = 1 + +# FTLE_ICFile: String, Name of file storing FTLE mesh information +# If FTLE_GenerateMesh = 0, this file should be located in Path_Work directory +# If FTLE_GenerateMesh = 0, this file will be written to Path_Work directory +# Valid only if FTLE_Compute = 1 +FTLE_ICFile = dg_FTLEgrid + +# FTLE_MeshBounds.XMin, ..., FTLE_MeshBounds.ZRes: Specifies structured grid over which FTLE is computed +# Valid only if FTLE_Compute = 1 +FTLE_MeshBounds.XMin = 0.0 +FTLE_MeshBounds.XMax = 2.0 +FTLE_MeshBounds.YMin = 0.0 +FTLE_MeshBounds.YMax = 1.0 +FTLE_MeshBounds.ZMin = 0.0 +FTLE_MeshBounds.ZMax = 0.0 +FTLE_MeshBounds.XRes = 201 +FTLE_MeshBounds.YRes = 101 +FTLE_MeshBounds.ZRes = 1 + +# FTLE_IntTLength: (Positive) Float, Integration time used to compute FTLE +# Valid only if FTLE_Compute = 1 +FTLE_IntTLength = 1.0 + +# FTLE_ComputeVariation: Binary flag, Used to help determine appropriate integration time by ah hoc means +# 0: Compute FTLE at each output time with integration time set to FTLE_IntTimeLength (nominally, can be reduced when a tracer leaves early) +# 1: Compute variation of FTLE with integration time +# Output_TRes MUST be 1 if FTLE_ComputeVariation = 1 +# Valid only if FTLE_Compute = 1 +FTLE_ComputeVariation = 0 + +# FTLE_VariationOutFreq: (Positive) Integer, controls how often FTLE is output when computing variation of FTLE with +# integration time +# If set to 1, output is generated at every time instance that velocity data is defined, if set to, e.g., 5, then output +# is generated at 1/5 of that rate (i.e. every 5 velocity data frames) +# Valid only if FTLE_ComputeVariation = 1 +FTLE_VariationOutFreq = 1 + +# FTLE_OutFilePrefix: String, Filename prefix where FTLE output data is written +# A separate file is generated for each output time (e.g. dg_forFTLE.0.bin, ..., dg_forFTLE.10.bin if Output_TRes = 11) +# NOTE: Two types of output files are generated, one set with the 1/T scaling in the definition of FTLE (*_noT.bin files), and ones with the scaling +# Valid only if FTLE_Compute = 1 +FTLE_OutFilePrefix = dg_forwardFTLE + + +# Trace_Compute: Binary flag +# 0: Do not compute tracer trajectories +# 1: Compute tracer trajectories (FTLE_Compute MUST be 0) +Trace_Compute = 0 + +Trace_ReleaseStrategy = 0 +Trace_ReleaseTMax = 0.000755 + + +# Trace_GenerateMesh: Binary Flag +# 0: Read in tracer initial positions from a file (specified by Trace_InFile) +# 1: Generate a Cartesian grid of tracers to integrate (mesh parameters specified below) +# Valid only if Trace_Compute = 1 +Trace_GenerateMesh = 1 + +# Trace_InFile: String, Name of File containing tracer initial positions +# Valid only if Trace_Compute = 1 and Trace_GenerateMesh = 0 +Trace_InFile = tracer_grid.bin + +# Trace_MultipleInFiles: Binary Flag +# 0: Default +# 1: Tracer initial conditions change over time and are specified by multiple files +Trace_MultipleInFiles = 0 + +# Trace_InFileFormat: Integer, specifies format of Trace_InFile +# 0: Use this if you want to reuse the .IC file that is generated from flowVC (use with care) +# 1: ASCII file, first line lists the number of tracers and subsequent lines list the x,y,z coordinates +# 2: ASCII legacy VTK polydata mesh format +# 3: ASCII legacy VTK unstructured mesh format +# 4: Binary file, first entry (int) lists the number of tracers and subsequent entries (doubles) list the x,y,z coordinates (binary version of format 1) +# Valid only if Compute_Tracers = 1 and Trace_GenerateMesh = 0 +Trace_InFileFormat = 4 + +# Trace_OutFile: String, Prefix for files where tracer position data will be written +# Tracer positions written to separate files for each output time +# Valid only if Trace_Compute = 1 +Trace_OutFilePrefix = dg_tracer-positions + +# Trace_NumLaunchTimes: (Positive) Integer, Number of times to release tracers from initial positions +# If Trace_MultipleInFiles = 1, then this should be number of files +# Valid only if Trace_Compute = 1 +Trace_NumLaunchTimes = 1 + +# Trace_LaunchTimeSpacing: (Positive) Float, Time between successive release of tracers from initial positions +# Valid only if Trace_Compute = 1 and Trace_NumLaunchTimes > 1 +Trace_LaunchTimeSpacing = 0.1 + +# Trace_IntTLength: (Positive) Float, Can be used to limit amount of time any tracer will be integrated +# Recommended to set this to some value larger than (Output_TRes x Output_TDelta) unless you know what you're doing +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_IntTLength = 100 + +# Trace_AlwaysOutput: Binary Flag +# 0: Do not write out tracer position to file once it has left the domain +# 1: Always write out tracer position to file, even if it left the domain +# Valid only if Trace_Compute = 1 +Trace_AlwaysOutput = 0 + +# Trace_CartMesh.XMin, ..., Trace_CartMesh.ZRes: Specifies Cartesian mesh of tracers to be intergrated +# Valid only if Trace_Compute = 1 AND Trace_GenerateMesh = 1 +Trace_CartMesh.XMin = 0.0 +Trace_CartMesh.XMax = 2.0 +Trace_CartMesh.YMin = 0.0 +Trace_CartMesh.YMax = 0.1 +Trace_CartMesh.ZMin = 0.0 +Trace_CartMesh.ZMax = 0.0 +Trace_CartMesh.XRes = 201 +Trace_CartMesh.YRes = 101 +Trace_CartMesh.ZRes = 1 + +# TODO Fill in this documentation +# These are required but their functionality is not +Trace_VorticityCompute = 0 +Trace_APCompute = 0 +Trace_CETCompute = 0 +Trace_CETAuxillaryMesh = 0 +Trace_CETMeshPrefix = specified +Trace_CETSubsteps = 0 +Trace_RTCompute = 0 +Trace_RTOutFilePrefix = dg_tracer-rt + +# VelOut_Compute: Binary flag, Used to generate interpolated velocity fields +# 0: Do not generate interpolated velocity fields +# 1: Generate interploated velocity fields +VelOut_Compute = 0 + +# VelOut_GenerateMesh: Binary flag +# 0: Read interpolation locations from file specified by VelOut_InFile +# 1: Generate a Cartesian mesh of positions where velocity will be interpolated (mesh parameters specified below) +# Valid only for VelOut_Compute = 1 +VelOut_GenerateMesh = 1 + +# VelOut_InFile: String, filename containing locations of points for interpolation +# Valid only for VelOut_Compute = 1 and VelOut_GenerateMesh = 0 +VelOut_InFile = interpolation-positions.vtk + +# VelOut_InFileFormat, Integer, specified format of VelOut_InFile +# 1: ASCII file, first line lists the number of locations and subsequent lines list the coordinates +# 3: ASCII legacy VTK polydata mesh format (as output from Paraview) +# 4: ASCII legacy VTK unstructured mesh format (as output from Paraview) +# Valid only if VelOut_Compute = 1 AND VelOut_GenerateMesh = 0 +VelOut_InFileFormat = 1 + +# VelOut_FilePrefix: String, Filename prefix for files that interpolated velocity is data is written to +# Velocity output written to separate files, one per output time +# Valid only if VelOut_Compute = 1 +VelOut_FilePrefix = dg-interpolated + +# VelOut_CartMesh.XMin, ..., VelOut_CartMesh.ZRes: Specifies Cartesian mesh of interpolation positions +# Valid only if VelOut_Compute = 1 +VelOut_CartMesh.XMin = 0.0 +VelOut_CartMesh.XMax = 2.0 +VelOut_CartMesh.YMin = 0.0 +VelOut_CartMesh.YMax = 1.0 +VelOut_CartMesh.ZMin = 0.0 +VelOut_CartMesh.ZMax = 0.0 +VelOut_CartMesh.XRes = 21 +VelOut_CartMesh.YRes = 11 +VelOut_CartMesh.ZRes = 1 +#+end_src + diff --git a/docs/content/css/htmlize.css b/docs/content/css/htmlize.css new file mode 100644 index 0000000..0b32a03 --- /dev/null +++ b/docs/content/css/htmlize.css @@ -0,0 +1,145 @@ +.org-bold { /* bold */ font-weight: bold; } +.org-bold-italic { /* bold-italic */ font-weight: bold; font-style: italic; } +.org-buffer-menu-buffer { /* buffer-menu-buffer */ font-weight: bold; } +.org-builtin { /* font-lock-builtin-face */ color: #7a378b; } +.org-button { /* button */ text-decoration: underline; } +.org-calendar-today { /* calendar-today */ text-decoration: underline; } +.org-change-log-acknowledgement { /* change-log-acknowledgement */ color: #b22222; } +.org-change-log-conditionals { /* change-log-conditionals */ color: #a0522d; } +.org-change-log-date { /* change-log-date */ color: #8b2252; } +.org-change-log-email { /* change-log-email */ color: #a0522d; } +.org-change-log-file { /* change-log-file */ color: #0000ff; } +.org-change-log-function { /* change-log-function */ color: #a0522d; } +.org-change-log-list { /* change-log-list */ color: #a020f0; } +.org-change-log-name { /* change-log-name */ color: #008b8b; } +.org-comint-highlight-input { /* comint-highlight-input */ font-weight: bold; } +.org-comint-highlight-prompt { /* comint-highlight-prompt */ color: #00008b; } +.org-comment { /* font-lock-comment-face */ color: #999988; font-style: italic; } +.org-comment-delimiter { /* font-lock-comment-delimiter-face */ color: #999988; font-style: italic; } +.org-completions-annotations { /* completions-annotations */ font-style: italic; } +.org-completions-common-part { /* completions-common-part */ color: #000000; background-color: #ffffff; } +.org-completions-first-difference { /* completions-first-difference */ font-weight: bold; } +.org-constant { /* font-lock-constant-face */ color: #008b8b; } +.org-diary { /* diary */ color: #ff0000; } +.org-diff-context { /* diff-context */ color: #7f7f7f; } +.org-diff-file-header { /* diff-file-header */ background-color: #b3b3b3; font-weight: bold; } +.org-diff-function { /* diff-function */ background-color: #cccccc; } +.org-diff-header { /* diff-header */ background-color: #cccccc; } +.org-diff-hunk-header { /* diff-hunk-header */ background-color: #cccccc; } +.org-diff-index { /* diff-index */ background-color: #b3b3b3; font-weight: bold; } +.org-diff-nonexistent { /* diff-nonexistent */ background-color: #b3b3b3; font-weight: bold; } +.org-diff-refine-change { /* diff-refine-change */ background-color: #d9d9d9; } +.org-dired-directory { /* dired-directory */ color: #0000ff; } +.org-dired-flagged { /* dired-flagged */ color: #ff0000; font-weight: bold; } +.org-dired-header { /* dired-header */ color: #228b22; } +.org-dired-ignored { /* dired-ignored */ color: #7f7f7f; } +.org-dired-mark { /* dired-mark */ color: #008b8b; } +.org-dired-marked { /* dired-marked */ color: #ff0000; font-weight: bold; } +.org-dired-perm-write { /* dired-perm-write */ color: #b22222; } +.org-dired-symlink { /* dired-symlink */ color: #a020f0; } +.org-dired-warning { /* dired-warning */ color: #ff0000; font-weight: bold; } +.org-doc { /* font-lock-doc-face */ color: #8b2252; } +.org-escape-glyph { /* escape-glyph */ color: #a52a2a; } +.org-file-name-shadow { /* file-name-shadow */ color: #7f7f7f; } +.org-flyspell-duplicate { /* flyspell-duplicate */ color: #cdad00; font-weight: bold; text-decoration: underline; } +.org-flyspell-incorrect { /* flyspell-incorrect */ color: #ff4500; font-weight: bold; text-decoration: underline; } +.org-fringe { /* fringe */ background-color: #f2f2f2; } +.org-function-name { /* font-lock-function-name-face */ color: teal; } +.org-header-line { /* header-line */ color: #333333; background-color: #e5e5e5; } +.org-help-argument-name { /* help-argument-name */ font-style: italic; } +.org-highlight { /* highlight */ background-color: #b4eeb4; } +.org-holiday { /* holiday */ background-color: #ffc0cb; } +.org-isearch { /* isearch */ color: #b0e2ff; background-color: #cd00cd; } +.org-isearch-fail { /* isearch-fail */ background-color: #ffc1c1; } +.org-italic { /* italic */ font-style: italic; } +.org-keyword { /* font-lock-keyword-face */ color: #0086b3; } +.org-lazy-highlight { /* lazy-highlight */ background-color: #afeeee; } +.org-link { /* link */ color: #0000ff; text-decoration: underline; } +.org-link-visited { /* link-visited */ color: #8b008b; text-decoration: underline; } +.org-log-edit-header { /* log-edit-header */ color: #a020f0; } +.org-log-edit-summary { /* log-edit-summary */ color: #0000ff; } +.org-log-edit-unknown-header { /* log-edit-unknown-header */ color: #b22222; } +.org-match { /* match */ background-color: #ffff00; } +.org-next-error { /* next-error */ background-color: #eedc82; } +.org-nobreak-space { /* nobreak-space */ color: #a52a2a; text-decoration: underline; } +.org-org-archived { /* org-archived */ color: #7f7f7f; } +.org-org-block { /* org-block */ color: #7f7f7f; } +.org-org-block-begin-line { /* org-block-begin-line */ color: #b22222; } +.org-org-block-end-line { /* org-block-end-line */ color: #b22222; } +.org-org-checkbox { /* org-checkbox */ font-weight: bold; } +.org-org-checkbox-statistics-done { /* org-checkbox-statistics-done */ color: #228b22; font-weight: bold; } +.org-org-checkbox-statistics-todo { /* org-checkbox-statistics-todo */ color: #ff0000; font-weight: bold; } +.org-org-clock-overlay { /* org-clock-overlay */ background-color: #ffff00; } +.org-org-code { /* org-code */ color: #7f7f7f; } +.org-org-column { /* org-column */ background-color: #e5e5e5; } +.org-org-column-title { /* org-column-title */ background-color: #e5e5e5; font-weight: bold; text-decoration: underline; } +.org-org-date { /* org-date */ color: #a020f0; text-decoration: underline; } +.org-org-document-info { /* org-document-info */ color: #191970; } +.org-org-document-info-keyword { /* org-document-info-keyword */ color: #7f7f7f; } +.org-org-document-title { /* org-document-title */ color: #191970; font-size: 144%; font-weight: bold; } +.org-org-done { /* org-done */ color: #228b22; font-weight: bold; } +.org-org-drawer { /* org-drawer */ color: #0000ff; } +.org-org-ellipsis { /* org-ellipsis */ color: #b8860b; text-decoration: underline; } +.org-org-footnote { /* org-footnote */ color: #a020f0; text-decoration: underline; } +.org-org-formula { /* org-formula */ color: #b22222; } +.org-org-headline-done { /* org-headline-done */ color: #bc8f8f; } +.org-org-hide { /* org-hide */ color: #ffffff; } +.org-org-latex-and-export-specials { /* org-latex-and-export-specials */ color: #8b4513; } +.org-org-level-1 { /* org-level-1 */ color: #0000ff; } +.org-org-level-2 { /* org-level-2 */ color: #a0522d; } +.org-org-level-3 { /* org-level-3 */ color: #a020f0; } +.org-org-level-4 { /* org-level-4 */ color: #b22222; } +.org-org-level-5 { /* org-level-5 */ color: #228b22; } +.org-org-level-6 { /* org-level-6 */ color: #008b8b; } +.org-org-level-7 { /* org-level-7 */ color: #7a378b; } +.org-org-level-8 { /* org-level-8 */ color: #8b2252; } +.org-org-link { /* org-link */ color: #0000ff; text-decoration: underline; } +.org-org-meta-line { /* org-meta-line */ color: #b22222; } +.org-org-mode-line-clock { /* org-mode-line-clock */ color: #000000; background-color: #bfbfbf; } +.org-org-mode-line-clock-overrun { /* org-mode-line-clock-overrun */ color: #000000; background-color: #ff0000; } +.org-org-quote { /* org-quote */ color: #7f7f7f; } +.org-org-scheduled { /* org-scheduled */ color: #006400; } +.org-org-scheduled-previously { /* org-scheduled-previously */ color: #b22222; } +.org-org-scheduled-today { /* org-scheduled-today */ color: #006400; } +.org-org-sexp-date { /* org-sexp-date */ color: #a020f0; } +.org-org-special-keyword { /* org-special-keyword */ color: #a020f0; } +.org-org-table { /* org-table */ color: #0000ff; } +.org-org-tag { /* org-tag */ font-weight: bold; } +.org-org-target { /* org-target */ text-decoration: underline; } +.org-org-time-grid { /* org-time-grid */ color: #b8860b; } +.org-org-todo { /* org-todo */ color: #ff0000; font-weight: bold; } +.org-org-upcoming-deadline { /* org-upcoming-deadline */ color: #b22222; } +.org-org-verbatim { /* org-verbatim */ color: #7f7f7f; } +.org-org-verse { /* org-verse */ color: #7f7f7f; } +.org-org-warning { /* org-warning */ color: #ff0000; font-weight: bold; } +.org-outline-1 { /* outline-1 */ color: #0000ff; } +.org-outline-2 { /* outline-2 */ color: #a0522d; } +.org-outline-3 { /* outline-3 */ color: #a020f0; } +.org-outline-4 { /* outline-4 */ color: #b22222; } +.org-outline-5 { /* outline-5 */ color: #228b22; } +.org-outline-6 { /* outline-6 */ color: #008b8b; } +.org-outline-7 { /* outline-7 */ color: #7a378b; } +.org-outline-8 { /* outline-8 */ color: #8b2252; } +.org-preprocessor { /* font-lock-preprocessor-face */ color: #7a378b; } +.org-query-replace { /* query-replace */ color: #b0e2ff; background-color: #cd00cd; } +.org-regexp-grouping-backslash { /* font-lock-regexp-grouping-backslash */ font-weight: bold; } +.org-regexp-grouping-construct { /* font-lock-regexp-grouping-construct */ font-weight: bold; } +.org-region { /* region */ background-color: #eedc82; } +.org-secondary-selection { /* secondary-selection */ background-color: #ffff00; } +.org-shadow { /* shadow */ color: #7f7f7f; } +.org-show-paren-match { /* show-paren-match */ background-color: #40e0d0; } +.org-show-paren-mismatch { /* show-paren-mismatch */ color: #ffffff; background-color: #a020f0; } +.org-string { /* font-lock-string-face */ color: #dd1144; } +.org-tool-bar { /* tool-bar */ color: #000000; background-color: #bfbfbf; } +.org-tooltip { /* tooltip */ color: #000000; background-color: #ffffe0; } +.org-trailing-whitespace { /* trailing-whitespace */ background-color: #ff0000; } +.org-type { /* font-lock-type-face */ color: #228b22; } +.org-underline { /* underline */ text-decoration: underline; } +.org-variable-name { /* font-lock-variable-name-face */ color: teal; } +.org-warning { /* font-lock-warning-face */ color: #ff0000; font-weight: bold; } +.org-widget-button { /* widget-button */ font-weight: bold; } +.org-widget-button-pressed { /* widget-button-pressed */ color: #ff0000; } +.org-widget-documentation { /* widget-documentation */ color: #006400; } +.org-widget-field { /* widget-field */ background-color: #d9d9d9; } +.org-widget-inactive { /* widget-inactive */ color: #7f7f7f; } +.org-widget-single-line-field { /* widget-single-line-field */ background-color: #d9d9d9; } diff --git a/docs/content/css/readtheorg.css b/docs/content/css/readtheorg.css new file mode 100644 index 0000000..56c0b09 --- /dev/null +++ b/docs/content/css/readtheorg.css @@ -0,0 +1,1144 @@ +@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic|Roboto+Slab:400,700|Inconsolata:400,700"); +@import url("https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"); + +h1,h2,h3,h4,h5,h6,legend{ + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight:700; + margin-top:0; +} + +h1{ + font-size:175%; + text-align: left !important; + margin-bottom: 0.83em !important; +} + +.subtitle{ + font-size:95%; /* of h1 */ +} + +h2{ + font-size:150%; +} + +h3{ + font-size:125%; +} + +h4{ + font-size:115%; +} + +h5{ + font-size:110%; +} + +h6{ + font-size:100%; +} + +h4,h5,h6{ + color:#2980B9; + font-weight:300; +} + +html{ + -ms-text-size-adjust:100%; + -webkit-text-size-adjust:100%; + font-size:100%; + height:100%; +} + +body{ + background:#edf0f2; + color:#404040; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + font-weight:normal; + margin:0; + min-height:100%; +} + +#content{ + background:#fcfcfc; + margin-left:300px; + /* margin:auto; */ + max-width:800px; + min-height:100%; + padding:1.618em 3.236em; +} + +p{ + font-size:16px; + line-height:24px; + margin:0px 0px 24px 0px; +} + +b,strong{ + font-weight:bold} + +blockquote{ + background-color: #F0F0F0; + border-left:5px solid #CCCCCC; + font-style:italic; + line-height:24px; + margin:0px 0px 24px 0px; + /* margin-left:24px; */ + padding: 6px 20px; +} + +ul,ol,dl{ + line-height:24px; + list-style-image:none; + /* list-style:none; */ + margin:0px 0px 24px 0px; + padding:0; +} + +li{ + margin-left: 24px; +} + +dd{ + margin:0; +} + +#content .section ul,#content .toctree-wrapper ul,article ul{ + list-style:disc; + line-height:24px; + margin-bottom:24px} + +#content .section ul li,#content .toctree-wrapper ul li,article ul li{ + list-style:disc; + margin-left:24px} + +#content .section ul li p:last-child,#content .toctree-wrapper ul li p:last-child,article ul li p:last-child{ + margin-bottom:0} + +#content .section ul li ul,#content .toctree-wrapper ul li ul,article ul li ul{ + margin-bottom:0} + +#content .section ul li li,#content .toctree-wrapper ul li li,article ul li li{ + list-style:circle} + +#content .section ul li li li,#content .toctree-wrapper ul li li li,article ul li li li{ + list-style:square} + +#content .section ul li ol li,#content .toctree-wrapper ul li ol li,article ul li ol li{ + list-style:decimal} + +#content .section ol,#content ol,article ol{ + list-style:decimal; + line-height:24px; + margin-bottom:24px} + +#content .section ol li,#content ol li,article ol li{ + list-style:decimal; + margin-left:24px} + +#content .section ol li p:last-child,#content ol li p:last-child,article ol li p:last-child{ + margin-bottom:0} + +#content .section ol li ul,#content ol li ul,article ol li ul{ + margin-bottom:0} + +#content .section ol li ul li,#content ol li ul li,article ol li ul li{ + list-style:disc} + +dl dt{ + font-weight:bold; +} + +dl p,dl table,dl ul,dl ol{ + margin-bottom:12px !important; +} + +dl dd{ + margin:0 0 12px 24px; +} + +@media print{ + .codeblock,pre.src{ + white-space:pre.src-wrap} +} + +@media print{ + html,body,section{ + background:none !important} + + *{ + box-shadow:none !important; + text-shadow:none !important; + filter:none !important; + -ms-filter:none !important} + + a,a:visited{ + text-decoration:underline} + + pre.src,blockquote{ + page-break-inside:avoid} + + thead{ + display:table-header-group} + + tr,img{ + page-break-inside:avoid} + + img{ + max-width:100% !important} + + @page{ + margin:0.5cm} + + p,h2,h3{ + orphans:3; + widows:3} + + h2,h3{ + page-break-after:avoid} +} + +@media print{ + #postamble{ + display:none} + + #content{ + margin-left:0} +} + +@media print{ + #table-of-contents{ + display:none} + + @page{ + size: auto; + margin: 25mm 25mm 25mm 25mm;} + + body { + margin: 0px;} +} + +@media screen and (max-width: 768px){ +} + +@media only screen and (max-width: 480px){ +} + +@media screen and (max-width: 768px){ + .tablet-hide{ + display:none} +} + +@media screen and (max-width: 480px){ + .mobile-hide{ + display:none} +} + +@media screen and (max-width: 480px){ +} + +@media screen and (max-width: 768px){ + #content{ + margin-left:0} + + #content #content{ + padding:1.618em} + + #content.shift{ + position:fixed; + min-width:100%; + left:85%; + top:0; + height:100%; + overflow:hidden} +} + +@media screen and (min-width: 1400px){ + #content{ + background:rgba(0,0,0,0.05)} + + #content{ + background:#fcfcfc} +} + +@media screen and (max-width: 768px){ + #copyright{ + width:85%; + display:none} + + #copyright.shift{ + display:block} + + img{ + width:100%; + height:auto} +} + +@media screen and (max-width: 480px){ + #content .sidebar{ + width:100%} +} + +code{ + background:#fff; + border:solid 1px #e1e4e5; + /* color:#000; for clickable code */ + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:75%; + max-width:100%; + overflow-x:auto; + padding:0 5px; + white-space:nowrap; +} + +.codeblock-example{ + border:1px solid #e1e4e5; + border-bottom:none; + padding:24px; + padding-top:48px; + font-weight:500; + background:#fff; + position:relative} + +.codeblock-example:after{ + content:"Example"; + position:absolute; + top:0px; + left:0px; + background:#9B59B6; + color:#fff; + padding:6px 12px} + +.codeblock-example.prettyprint-example-only{ + border:1px solid #e1e4e5; + margin-bottom:24px} + +.codeblock,pre.src,#content .literal-block{ + border:1px solid #e1e4e5; + padding:12px; + overflow-x:auto; + background:#fff; + margin:1px 0 24px 0} + +pre.src{ + /* color:#404040; */ + display:block; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:12px; + line-height:1.5; + margin:1px 0px 24px 0px; + overflow:auto; + padding:12px; + white-space:pre; +} + +.example{ + background:#f3f6f6; + border:1px solid #e1e4e5; + color:#404040; + font-size: 12px; + line-height: 1.5; + margin-bottom:24px; + padding:12px; + overflow: auto; +} + +table{ + border-collapse:collapse; + border-spacing:0; + empty-cells:show; + margin-bottom:24px; + border-bottom:1px solid #e1e4e5; +} + +td{ + vertical-align:top} + +table td,table th{ + font-size:90%; + margin:0; + overflow:visible; + padding:8px 16px; + background-color:white; + border:1px solid #e1e4e5; +} + +table thead th{ + font-weight:bold; + border-top:3px solid #e1e4e5; + border-bottom:1px solid #e1e4e5; +} + +table caption{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; +} + +table tr:nth-child(2n-1) td{ + background-color:#f3f6f6; +} + +table tr:nth-child(2n) td{ + background-color:white; +} + +.figure p{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; +} + +.rotate-90{ + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg); +} + +.rotate-270{ + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg); +} + +#toggle-sidebar, +#table-of-contents .close-sidebar { + display: none; +} + +@media screen and (max-width: 768px) { + #table-of-contents { + display: none; + width: 60%; + } + + #table-of-contents h2 a { + display: block; + } + + #table-of-contents:target { + display: block; + } + + #copyright, #postamble { + display: none; + } + + #toggle-sidebar { + display: block; + margin-bottom: 1.6em; + padding: 0.6em; + text-align: center; + } + + #toggle-sidebar h2 { + background-color:#2980B9; + width:100%; + height:50px; + left:0; + top:0; + color: white; + font-size: 100%; + line-height: 50px; + position:fixed; + margin: 0; + padding: 0; + opacity:0.7; + z-index: 10; + } + + #table-of-contents .close-sidebar { + color: rgba(255, 255, 255, 0.3); + display: inline-block; + margin: 0px 10px 0px 45px; + padding: 10px; + } +} + +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; +} + +figcaption,figure,footer,header,hgroup,nav{ + display:block} + +ins{ + background:#ff9; + color:#000; + text-decoration:none} + +mark{ + background:#ff0; + color:#000; + font-style:italic; + font-weight:bold} + +small{ + font-size:85%} + +sub,sup{ + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline} + +sup{ + top:-0.5em} + +sub{ + bottom:-0.25em} + +img{ + -ms-interpolation-mode:bicubic; + vertical-align:middle; + max-width:100%} + +svg:not(:root){ + overflow:hidden} + +figure{ + margin:0} + +label{ + cursor:pointer} + +legend{ + border:0; + margin-left:-7px; + padding:0; + white-space:normal} + +.fa:before,#content .admonition-title:before,#content h1 .headerlink:before,#content h2 .headerlink:before,#content h3 .headerlink:before,#content h4 .headerlink:before,#content h5 .headerlink:before,#content h6 .headerlink:before,#content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,#content .note,#content .attention,#content .caution,#content .danger,#content .error,#content .hint,#content .important,#content .tip,#content .warning,#content .seealso,#content .admonitiontodo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,#table-of-contents li.on a,#table-of-contents li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{ + -webkit-font-smoothing:antialiased} + +/*! + * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{ + font-family:'FontAwesome'; + src:url("../fonts/fontawesome-webfont.eot?v=4.1.0"); + src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.1.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.1.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular") format("svg"); + font-weight:normal; + font-style:normal} + +.fa,#content .admonition-title,.icon{ + display:inline-block; + font-family:FontAwesome; + font-style:normal; + font-weight:normal; + line-height:1; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale} + +.fa-ul{ + padding-left:0; + margin-left:2.14286em; + list-style-type:none} + +.fa-ul>li{ + position:relative} + +.fa-li{ + position:absolute; + left:-2.14286em; + width:2.14286em; + top:0.14286em; + text-align:center} + +.fa-li.fa-lg{ + left:-1.85714em} + +.fa-border{ + padding:.2em .25em .15em; + border:solid 0.08em #eee; + border-radius:.1em} + +.fa,#content .admonition-title{ + font-family:inherit} + +.fa:before,#content .admonition-title:before{ + font-family:"FontAwesome"; + display:inline-block; + font-style:normal; + font-weight:normal; + line-height:1; + text-decoration:inherit} + +a .fa,a #content .admonition-title,#content a .admonition-title{ + display:inline-block; + text-decoration:inherit} + +.nav #content .admonition-title,#content .nav .admonition-title,.nav .icon{ + display:inline} + +.wy-alert-title,#content .admonition-title{ + color:#fff; + font-weight:bold; + display:block; + color:#fff; + /* background:#6ab0de; */ + /* margin:-12px; */ + padding:6px 12px; + margin-bottom:0px} + +.admonition-title + div{ + padding: 12px; + margin-bottom: 24px; +} + +.admonition-title + div > p{ + margin: 0; +} + +.danger + div, .error + div, #content .danger,#content .error{ + background:#fdf3f2} + +.wy-alert.wy-alert-warning,#content .wy-alert-warning.note, #content .attention,#content .caution, #content .warning, #content .admonitiontodo, .attention + div, .caution + div, .warning + div, #content .wy-alert-warning.danger,#content .wy-alert-warning.error, #content .wy-alert-warning.hint,#content .wy-alert-warning.important,#content .wy-alert-warning.tip,#content .wy-alert-warning.seealso{ + background:#ffedcc} + +#content .admonition-title.note:before, #content .admonition-title.seealso:before, +#content .admonition-title.warning:before, #content .admonition-title.caution:before, +#content .admonition-title.attention:before, +#content .admonition-title.tip:before, #content .admonition-title.hint:before, +#content .admonition-title.important:before, +#content .admonition-title.error:before, #content .admonition-title.danger:before{ + font-family:FontAwesome; + content: "";} + +.seealso + div, .note + div, #content .note,#content .seealso{ + background:#e7f2fa; +} + +#content .admonition-title.tip,#content .admonition-title.important,#content .admonition-title.hint{ + line-height: 1; + background:#1abc9c} + +.important + div, .tip + div, .hint + div, #content .important, #content .tip, #content .hint{ + background:#dbfaf4} + +#content .admonition-title.note,#content .admonition-title.seealso{ + line-height: 1; + background:#6ab0de} + +#content .admonition-title.warning,#content .admonition-title.caution,#content .admonition-title.attention{ + line-height: 1; + background:#F0B37E} + +#content .admonition-title.error,#content .admonition-title.danger{ + line-height: 1; + background:#f29f97} + +legend{ + display:block; + width:100%; + border:0; + padding:0; + white-space:normal; + margin-bottom:24px; + font-size:150%; + *margin-left:-7px} + +label{ + display:block; + margin:0 0 0.3125em 0; + color:#333; + font-size:90%} + +a{ + color:#2980B9; + text-decoration:none; + cursor:pointer} + + +a:hover,a:active{ + outline:0; +} + +a:hover{ + color:#3091d1} + +a:visited{ + color:#9B59B6} + +.left{ + text-align:left} + +.center{ + text-align:center} + +.right{ + text-align:right} + +hr{ + display:block; + height:1px; + border:0; + border-top:1px solid #e1e4e5; + margin:24px 0; + padding:0} + +#table-of-contents li{ + list-style:none; + margin-left: 0px; +} + +#table-of-contents header{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 1.618em; + display:block; + font-weight:bold; + text-transform:uppercase; + font-size:80%; + color:#2980B9; + white-space:nowrap} + +#table-of-contents ul{ + margin-bottom:0} + +#table-of-contents li.divide-top{ + border-top:solid 1px #404040} + +#table-of-contents li.divide-bottom{ + border-bottom:solid 1px #404040} + +#table-of-contents li.current{ + background:#e3e3e3} + +#table-of-contents li.current a{ + color:gray; + border-right:solid 1px #c9c9c9; + padding:0.4045em 2.427em} + +#table-of-contents li.current a:hover{ + background:#d6d6d6} + +#table-of-contents li a{ + /* color:#404040; */ + padding:0.4045em 1.618em; + position:relative; + /* background:#fcfcfc; */ + border:none; + /* border-bottom:solid 1px #c9c9c9; */ + /* border-top:solid 1px #c9c9c9; */ + padding-left:1.618em -4px} + +#table-of-contents li.on a:hover,#table-of-contents li.current>a:hover{ + background:#fcfcfc} + +#table-of-contents li ul li a{ + /* background:#c9c9c9; */ + padding:0.4045em 2.427em} + +#table-of-contents li ul li ul li a{ + padding:0.4045em 3.236em} + +#table-of-contents li.current ul{ + display:block} + +/* #table-of-contents li ul{ */ +/* margin-bottom:0; */ +/* display:none} */ + +#table-of-contents .local-toc li ul{ + display:block} + +#table-of-contents li ul li a{ + margin-bottom:0; + color:#b3b3b3; + font-weight:normal} + +#table-of-contents a{ + display:inline-block; + line-height:18px; + padding:0.4045em 1.618em; + display:block; + position:relative; + font-size:90%; + color:#b3b3b3; + direction: ltr; +} + +#table-of-contents a:hover{ + color: #ffffff !important; + background-color:#4e4a4a; + cursor:pointer} + +/* #text-table-of-contents { */ +/* overflow:scroll; */ +/* } */ + +#table-of-contents{ + position:fixed; + top:0; + left:0; + width:300px; + overflow-x:hidden; + overflow-y:scroll; + height:100%; + background:#343131; + z-index:200; + scrollbar-base-color: #1F1D1D; + scrollbar-arrow-color: #b3b3b3; + scrollbar-shadow-color: #1F1D1D; + scrollbar-track-color : #343131; +} + +#table-of-contents h2{ + z-index:200; + background-color:#2980B9; + text-align:center; + padding:0.809em; + display:block; + color:#fcfcfc; + font-size: 100%; + margin-bottom:0.809em} + +ul.nav > li ul { + display: none; +} + +li.active { + background-color: #e3e3e3; +} + +li.active>a { + color: black !important; +} + +ul.nav>li.active a { + color: #404040 !important; +} + +ul.nav>li.active li.active { + background-color: #c9c9c9; +} + +ul.nav>li.active li.active>a { + color: black !important; + border-right:solid 1px #c9c9c9 !important; + font-weight: bold !important; + display: block !important; +} + +ul.nav>li.active>a { + background-color: #fcfcfc; + color: black !important; + border-bottom:solid 1px #c9c9c9 !important; /* XXX Restrict it to 2nd level */ + border-right:solid 1px #c9c9c9 !important; + font-weight: bold !important; + display: block !important; +} + +li.active>ul { + display: inline !important; +} +/* ul.nav li ul li { */ +/* display: none; */ +/* } */ + +/* ul.nav li ul li ul li { */ +/* display: none; */ +/* } */ + +/* ul.nav li.active ul li { */ +/* display: inline; */ +/* } */ + +/* ul.nav li.active ul li ul li { */ +/* display: inline; */ +/* } */ + +/* ul.nav li.active ul li a { */ +/* background-color: #E3E3E3; */ +/* color: #8099B0; */ +/* border-right:solid 1px #c9c9c9 !important; */ +/* } */ + +/* ul.nav li.active ul li.active a { */ +/* background-color: #C9C9C9; */ +/* color: black !important; */ +/* font-weight: bold !important; */ +/* } */ + +/* ul.nav li.active ul li.active ul li.active a { */ + /* color: black !important; */ + /* font-weight: bold !important; */ + /* display: block !important; */ +/* } */ + +/* ul.nav li.active ul li.active ul li a { */ +/* color: #808080 !important; */ +/* font-weight: normal !important; */ +/* display: block !important; */ +/* } */ + +/* ul.nav li.active ul li ul li a { */ +/* display: none !important; */ +/* } */ + +/* ul.nav li ul li ul li { */ +/* display: none !important; /\* as long as nav is on multiple levels of ul *\/ */ +/* /\* display: none; /\* as long as nav is on multiple levels of ul *\\/ *\/ */ +/* } */ + +/* ul.nav li ul li ul li ul li { */ +/* display: none !important; /\* as long as nav is on multiple levels of ul *\/ */ +/* /\* display: none; /\* as long as nav is on multiple levels of ul *\\/ *\/ */ +/* } */ + +/* ul.nav li.active > a { */ + /* border-bottom:solid 1px #c9c9c9 !important; /\* XXX Restrict it to 2nd level *\/ */ + /* border-right:solid 1px #c9c9c9 !important; */ +/* } */ + +/* ul.nav li.active a { */ +/* color: gray !important; */ +/* font-weight:bold; */ +/* background-color: white; */ +/* border-right:solid 0px white !important; */ +/* } */ + +/* ul.nav > li.active > a { */ +/* color: black !important; */ +/* } */ + +footer{ + color:#999} + +footer p{ + margin-bottom:12px} + +#copyright, #postamble{ + position:fixed; + bottom:0; + left:0; + width:300px; + color:#fcfcfc; + background:#1f1d1d; + border-top:solid 10px #343131; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + font-size: 90%; + z-index:400; + padding:12px; +} + +#postamble .author { + font-size: 100%; + margin-bottom: 0px; +} + +#postamble .date { + font-size: 90%; + margin-bottom: 0px; + color: #27AE60; +} + +#postamble .creator,#postamble .validation { + display:none; +} + +#copyright a{ + color:#2980B9; + text-decoration:none} + +#copyright .rst-current-version{ + padding:12px; + background-color:#272525; + display:block; + text-align:right; + font-size:90%; + cursor:pointer; + color:#27AE60; + *zoom:1} + +#content img{ + max-width:100%; +} + +#content div.figure{ + margin-bottom:24px} + +#content div.figure.align-center{ + text-align:center} + +#content .section>img,#content .section>a>img{ + margin-bottom:24px} + +.verse{ + border-left:5px solid #6AB0DE; + background-color: #E7F2FA; + padding: 6px 20px; + font-style:italic; +} + +#content .note .last,#content .attention .last,#content .caution .last,#content .danger .last,#content .error .last,#content .hint .last,#content .important .last,#content .tip .last,#content .warning .last,#content .seealso .last,#content .admonitiontodo .last{ + margin-bottom:0} + +#content .admonition-title:before{ + margin-right:4px} + +#content .section ol p,#content .section ul p{ + margin-bottom:12px} + +#content h1 .headerlink,#content h2 .headerlink,#content h3 .headerlink,#content h4 .headerlink,#content h5 .headerlink,#content h6 .headerlink,#content dl dt .headerlink{ + display:none; + visibility:hidden; + font-size:14px} + +#content h1 .headerlink:after,#content h2 .headerlink:after,#content h3 .headerlink:after,#content h4 .headerlink:after,#content h5 .headerlink:after,#content h6 .headerlink:after,#content dl dt .headerlink:after{ + visibility:visible; + content:""; + font-family:FontAwesome; + display:inline-block} + +#content h1:hover .headerlink,#content h2:hover .headerlink,#content h3:hover .headerlink,#content h4:hover .headerlink,#content h5:hover .headerlink,#content h6:hover .headerlink,#content dl dt:hover .headerlink{ + display:inline-block} + +#content .sidebar{ + float:right; + width:40%; + display:block; + margin:0 0 24px 24px; + padding:24px; + background:#f3f6f6; + border:solid 1px #e1e4e5} + +#content .sidebar p,#content .sidebar ul,#content .sidebar dl{ + font-size:90%} + +#content .sidebar .last{ + margin-bottom:0} + +#content .sidebar .sidebar-title{ + display:block; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight:bold; + background:#e1e4e5; + padding:6px 12px; + margin:-24px; + margin-bottom:24px; + font-size:100%} + +#content .highlighted{ + background:#F1C40F; + display:inline-block; + font-weight:bold; + padding:0 6px} + +#content .footnote-reference,#content .citation-reference{ + vertical-align:super; + font-size:90%} + +span[id*='MathJax-Span']{ + color:#404040} + +.math{ + text-align:center} + +#footnotes{ + border-top:1px solid #e1e4e5; + padding-top: 36px; +} + +h2.footnotes{ + display:none; +} + +.footnum, .footref{ + color: #2980b9; + font-size: 90%; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; +} + +.footnum:before, .footref:before{ + content:"["; +} + +.footnum:after, .footref:after{ + content:"]"; +} + +.footpara { + color: #999; + font-size: 90%; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + padding-bottom: 8px; + padding-left: 16px; + padding-right: 16px; + padding-top: 8px; + line-height: 1.25em; + /* display: inline; */ +} + +.todo{ + background-color: #f29f97; + padding: 0px 4px; + color: #fff; +} + +.WAIT, .nilWAIT{ + background-color: #6ab0de; + padding: 0px 4px; + color: #fff; +} + +.done{ + background-color: #6AB097; +} + +.tag span { + background-color: #EDEDED; + border: 1px solid #EDEDED; + color: #939393; + cursor: pointer; + display: block; + float: right; + font-size: 80%; + font-weight: normal; + margin: 0 3px; + padding: 1px 2px; + border-radius: 10px; +} + +.tag .FLAGGED { + background-color: #DB2D27; + border: 1px solid #DB2D27; + color: white; + font-weight: bold; +} + +.timestamp { + font-family: Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size: 90%; + color: navy; +} + +.nav .timestamp { + color: inherit; +} + +.inlinetask { + background: #FFF9E3; /* url(dialog-todo.png) no-repeat 10px 8px; */ + border: 3px solid #FFEB8E; + /* border-right-style: none; */ + /* border-left-style: none; */ + /* padding: 10px 20px 10px 60px; */ + padding: 9px 12px; + margin-bottom: 24px; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif} + +#org-div-home-and-up { + text-align: right; + padding-right: 10pt; +} + +.underline { + text-decoration:underline +} diff --git a/docs/content/css/rtd-full.css b/docs/content/css/rtd-full.css new file mode 100644 index 0000000..6cb3346 --- /dev/null +++ b/docs/content/css/rtd-full.css @@ -0,0 +1,3910 @@ +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box} + +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{ + display:block} + +audio,canvas,video{ + display:inline-block; + *display:inline; + *zoom:1} + +audio:not([controls]){ + display:none} + +[hidden]{ + display:none} + +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box} + +html{ + font-size:100%; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100%} + +body{ + margin:0} + +a:hover,a:active{ + outline:0} + +abbr[title]{ + border-bottom:1px dotted} + +b,strong{ + font-weight:bold} + +blockquote{ + margin:0} + +dfn{ + font-style:italic} + +ins{ + background:#ff9; + color:#000; + text-decoration:none} + +mark{ + background:#ff0; + color:#000; + font-style:italic; + font-weight:bold} + +pre,code,.rst-content tt,kbd,samp{ + font-family:monospace,serif; + _font-family:"courier new",monospace; + font-size:1em} + +pre{ + white-space:pre} + +q{ + quotes:none} + +q:before,q:after{ + content:""; + content:none} + +small{ + font-size:85%} + +sub,sup{ + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline} + +sup{ + top:-0.5em} + +sub{ + bottom:-0.25em} + +ul,ol,dl{ + margin:0; + padding:0; + list-style:none; + list-style-image:none} + +li{ + list-style:none} + +dd{ + margin:0} + +img{ + border:0; + -ms-interpolation-mode:bicubic; + vertical-align:middle; + max-width:100%} + +svg:not(:root){ + overflow:hidden} + +figure{ + margin:0} + +form{ + margin:0} + +fieldset{ + border:0; + margin:0; + padding:0} + +label{ + cursor:pointer} + +legend{ + border:0; + *margin-left:-7px; + padding:0; + white-space:normal} + +button,input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle} + +button,input{ + line-height:normal} + +button,input[type="button"],input[type="reset"],input[type="submit"]{ + cursor:pointer; + -webkit-appearance:button; + *overflow:visible} + +button[disabled],input[disabled]{ + cursor:default} + +input[type="checkbox"],input[type="radio"]{ + box-sizing:border-box; + padding:0; + *width:13px; + *height:13px} + +input[type="search"]{ + -webkit-appearance:textfield; + -moz-box-sizing:content-box; + -webkit-box-sizing:content-box; + box-sizing:content-box} + +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{ + -webkit-appearance:none} + +button::-moz-focus-inner,input::-moz-focus-inner{ + border:0; + padding:0} + +textarea{ + overflow:auto; + vertical-align:top; + resize:vertical} + +table{ + border-collapse:collapse; + border-spacing:0} + +td{ + vertical-align:top} + +.chromeframe{ + margin:0.2em 0; + background:#ccc; + color:#000; + padding:0.2em 0} + +.ir{ + display:block; + border:0; + text-indent:-999em; + overflow:hidden; + background-color:transparent; + background-repeat:no-repeat; + text-align:left; + direction:ltr; + *line-height:0} + +.ir br{ + display:none} + +.hidden{ + display:none !important; + visibility:hidden} + +.visuallyhidden{ + border:0; + clip:rect(0 0 0 0); + height:1px; + margin:-1px; + overflow:hidden; + padding:0; + position:absolute; + width:1px} + +.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{ + clip:auto; + height:auto; + margin:0; + overflow:visible; + position:static; + width:auto} + +.invisible{ + visibility:hidden} + +.relative{ + position:relative} + +big,small{ + font-size:100%} + +@media print{ + html,body,section{ + background:none !important} + + *{ + box-shadow:none !important; + text-shadow:none !important; + filter:none !important; + -ms-filter:none !important} + + a,a:visited{ + text-decoration:underline} + + .ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{ + content:""} + + pre,blockquote{ + page-break-inside:avoid} + + thead{ + display:table-header-group} + + tr,img{ + page-break-inside:avoid} + + img{ + max-width:100% !important} + + @page{ + margin:0.5cm} + + p,h2,h3{ + orphans:3; + widows:3} + + h2,h3{ + page-break-after:avoid} + +} + +.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{ + -webkit-font-smoothing:antialiased} + +.clearfix{ + *zoom:1} + +.clearfix:before,.clearfix:after{ + display:table; + content:""} + +.clearfix:after{ + clear:both} + +/*! + * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{ + font-family:'FontAwesome'; + src:url("../fonts/fontawesome-webfont.eot?v=4.1.0"); + src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.1.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.1.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular") format("svg"); + font-weight:normal; + font-style:normal} + +.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon{ + display:inline-block; + font-family:FontAwesome; + font-style:normal; + font-weight:normal; + line-height:1; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale} + +.fa-lg{ + font-size:1.33333em; + line-height:0.75em; + vertical-align:-15%} + +.fa-2x{ + font-size:2em} + +.fa-3x{ + font-size:3em} + +.fa-4x{ + font-size:4em} + +.fa-5x{ + font-size:5em} + +.fa-fw{ + width:1.28571em; + text-align:center} + +.fa-ul{ + padding-left:0; + margin-left:2.14286em; + list-style-type:none} + +.fa-ul>li{ + position:relative} + +.fa-li{ + position:absolute; + left:-2.14286em; + width:2.14286em; + top:0.14286em; + text-align:center} + +.fa-li.fa-lg{ + left:-1.85714em} + +.fa-border{ + padding:.2em .25em .15em; + border:solid 0.08em #eee; + border-radius:.1em} + +.pull-right{ + float:right} + +.pull-left{ + float:left} + +.fa.pull-left,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.pull-left.icon{ + margin-right:.3em} + +.fa.pull-right,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.pull-right.icon{ + margin-left:.3em} + +.fa-spin{ + -webkit-animation:spin 2s infinite linear; + -moz-animation:spin 2s infinite linear; + -o-animation:spin 2s infinite linear; + animation:spin 2s infinite linear} + +@-moz-keyframes spin{ + 0%{ + -moz-transform:rotate(0deg)} + + 100%{ + -moz-transform:rotate(359deg)} + +} + +@-webkit-keyframes spin{ + 0%{ + -webkit-transform:rotate(0deg)} + + 100%{ + -webkit-transform:rotate(359deg)} + +} + +@-o-keyframes spin{ + 0%{ + -o-transform:rotate(0deg)} + + 100%{ + -o-transform:rotate(359deg)} + +} + +@keyframes spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg)} + + 100%{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg)} + +} + +.fa-rotate-90{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg)} + +.fa-rotate-180{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform:rotate(180deg); + -moz-transform:rotate(180deg); + -ms-transform:rotate(180deg); + -o-transform:rotate(180deg); + transform:rotate(180deg)} + +.fa-rotate-270{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg)} + +.fa-flip-horizontal{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0); + -webkit-transform:scale(-1, 1); + -moz-transform:scale(-1, 1); + -ms-transform:scale(-1, 1); + -o-transform:scale(-1, 1); + transform:scale(-1, 1)} + +.fa-flip-vertical{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform:scale(1, -1); + -moz-transform:scale(1, -1); + -ms-transform:scale(1, -1); + -o-transform:scale(1, -1); + transform:scale(1, -1)} + +.fa-stack{ + position:relative; + display:inline-block; + width:2em; + height:2em; + line-height:2em; + vertical-align:middle} + +.fa-stack-1x,.fa-stack-2x{ + position:absolute; + left:0; + width:100%; + text-align:center} + +.fa-stack-1x{ + line-height:inherit} + +.fa-stack-2x{ + font-size:2em} + +.fa-inverse{ + color:#fff} + +.fa-glass:before{ + content:""} + +.fa-music:before{ + content:""} + +.fa-search:before,.icon-search:before{ + content:""} + +.fa-envelope-o:before{ + content:""} + +.fa-heart:before{ + content:""} + +.fa-star:before{ + content:""} + +.fa-star-o:before{ + content:""} + +.fa-user:before{ + content:""} + +.fa-film:before{ + content:""} + +.fa-th-large:before{ + content:""} + +.fa-th:before{ + content:""} + +.fa-th-list:before{ + content:""} + +.fa-check:before{ + content:""} + +.fa-times:before{ + content:""} + +.fa-search-plus:before{ + content:""} + +.fa-search-minus:before{ + content:""} + +.fa-power-off:before{ + content:""} + +.fa-signal:before{ + content:""} + +.fa-gear:before,.fa-cog:before{ + content:""} + +.fa-trash-o:before{ + content:""} + +.fa-home:before,.icon-home:before{ + content:""} + +.fa-file-o:before{ + content:""} + +.fa-clock-o:before{ + content:""} + +.fa-road:before{ + content:""} + +.fa-download:before{ + content:""} + +.fa-arrow-circle-o-down:before{ + content:""} + +.fa-arrow-circle-o-up:before{ + content:""} + +.fa-inbox:before{ + content:""} + +.fa-play-circle-o:before{ + content:""} + +.fa-rotate-right:before,.fa-repeat:before{ + content:""} + +.fa-refresh:before{ + content:""} + +.fa-list-alt:before{ + content:""} + +.fa-lock:before{ + content:""} + +.fa-flag:before{ + content:""} + +.fa-headphones:before{ + content:""} + +.fa-volume-off:before{ + content:""} + +.fa-volume-down:before{ + content:""} + +.fa-volume-up:before{ + content:""} + +.fa-qrcode:before{ + content:""} + +.fa-barcode:before{ + content:""} + +.fa-tag:before{ + content:""} + +.fa-tags:before{ + content:""} + +.fa-book:before,.icon-book:before{ + content:""} + +.fa-bookmark:before{ + content:""} + +.fa-print:before{ + content:""} + +.fa-camera:before{ + content:""} + +.fa-font:before{ + content:""} + +.fa-bold:before{ + content:""} + +.fa-italic:before{ + content:""} + +.fa-text-height:before{ + content:""} + +.fa-text-width:before{ + content:""} + +.fa-align-left:before{ + content:""} + +.fa-align-center:before{ + content:""} + +.fa-align-right:before{ + content:""} + +.fa-align-justify:before{ + content:""} + +.fa-list:before{ + content:""} + +.fa-dedent:before,.fa-outdent:before{ + content:""} + +.fa-indent:before{ + content:""} + +.fa-video-camera:before{ + content:""} + +.fa-photo:before,.fa-image:before,.fa-picture-o:before{ + content:""} + +.fa-pencil:before{ + content:""} + +.fa-map-marker:before{ + content:""} + +.fa-adjust:before{ + content:""} + +.fa-tint:before{ + content:""} + +.fa-edit:before,.fa-pencil-square-o:before{ + content:""} + +.fa-share-square-o:before{ + content:""} + +.fa-check-square-o:before{ + content:""} + +.fa-arrows:before{ + content:""} + +.fa-step-backward:before{ + content:""} + +.fa-fast-backward:before{ + content:""} + +.fa-backward:before{ + content:""} + +.fa-play:before{ + content:""} + +.fa-pause:before{ + content:""} + +.fa-stop:before{ + content:""} + +.fa-forward:before{ + content:""} + +.fa-fast-forward:before{ + content:""} + +.fa-step-forward:before{ + content:""} + +.fa-eject:before{ + content:""} + +.fa-chevron-left:before{ + content:""} + +.fa-chevron-right:before{ + content:""} + +.fa-plus-circle:before{ + content:""} + +.fa-minus-circle:before{ + content:""} + +.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{ + content:""} + +.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{ + content:""} + +.fa-question-circle:before{ + content:""} + +.fa-info-circle:before{ + content:""} + +.fa-crosshairs:before{ + content:""} + +.fa-times-circle-o:before{ + content:""} + +.fa-check-circle-o:before{ + content:""} + +.fa-ban:before{ + content:""} + +.fa-arrow-left:before{ + content:""} + +.fa-arrow-right:before{ + content:""} + +.fa-arrow-up:before{ + content:""} + +.fa-arrow-down:before{ + content:""} + +.fa-mail-forward:before,.fa-share:before{ + content:""} + +.fa-expand:before{ + content:""} + +.fa-compress:before{ + content:""} + +.fa-plus:before{ + content:""} + +.fa-minus:before{ + content:""} + +.fa-asterisk:before{ + content:""} + +.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{ + content:""} + +.fa-gift:before{ + content:""} + +.fa-leaf:before{ + content:""} + +.fa-fire:before,.icon-fire:before{ + content:""} + +.fa-eye:before{ + content:""} + +.fa-eye-slash:before{ + content:""} + +.fa-warning:before,.fa-exclamation-triangle:before{ + content:""} + +.fa-plane:before{ + content:""} + +.fa-calendar:before{ + content:""} + +.fa-random:before{ + content:""} + +.fa-comment:before{ + content:""} + +.fa-magnet:before{ + content:""} + +.fa-chevron-up:before{ + content:""} + +.fa-chevron-down:before{ + content:""} + +.fa-retweet:before{ + content:""} + +.fa-shopping-cart:before{ + content:""} + +.fa-folder:before{ + content:""} + +.fa-folder-open:before{ + content:""} + +.fa-arrows-v:before{ + content:""} + +.fa-arrows-h:before{ + content:""} + +.fa-bar-chart-o:before{ + content:""} + +.fa-twitter-square:before{ + content:""} + +.fa-facebook-square:before{ + content:""} + +.fa-camera-retro:before{ + content:""} + +.fa-key:before{ + content:""} + +.fa-gears:before,.fa-cogs:before{ + content:""} + +.fa-comments:before{ + content:""} + +.fa-thumbs-o-up:before{ + content:""} + +.fa-thumbs-o-down:before{ + content:""} + +.fa-star-half:before{ + content:""} + +.fa-heart-o:before{ + content:""} + +.fa-sign-out:before{ + content:""} + +.fa-linkedin-square:before{ + content:""} + +.fa-thumb-tack:before{ + content:""} + +.fa-external-link:before{ + content:""} + +.fa-sign-in:before{ + content:""} + +.fa-trophy:before{ + content:""} + +.fa-github-square:before{ + content:""} + +.fa-upload:before{ + content:""} + +.fa-lemon-o:before{ + content:""} + +.fa-phone:before{ + content:""} + +.fa-square-o:before{ + content:""} + +.fa-bookmark-o:before{ + content:""} + +.fa-phone-square:before{ + content:""} + +.fa-twitter:before{ + content:""} + +.fa-facebook:before{ + content:""} + +.fa-github:before,.icon-github:before{ + content:""} + +.fa-unlock:before{ + content:""} + +.fa-credit-card:before{ + content:""} + +.fa-rss:before{ + content:""} + +.fa-hdd-o:before{ + content:""} + +.fa-bullhorn:before{ + content:""} + +.fa-bell:before{ + content:""} + +.fa-certificate:before{ + content:""} + +.fa-hand-o-right:before{ + content:""} + +.fa-hand-o-left:before{ + content:""} + +.fa-hand-o-up:before{ + content:""} + +.fa-hand-o-down:before{ + content:""} + +.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{ + content:""} + +.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{ + content:""} + +.fa-arrow-circle-up:before{ + content:""} + +.fa-arrow-circle-down:before{ + content:""} + +.fa-globe:before{ + content:""} + +.fa-wrench:before{ + content:""} + +.fa-tasks:before{ + content:""} + +.fa-filter:before{ + content:""} + +.fa-briefcase:before{ + content:""} + +.fa-arrows-alt:before{ + content:""} + +.fa-group:before,.fa-users:before{ + content:""} + +.fa-chain:before,.fa-link:before,.icon-link:before{ + content:""} + +.fa-cloud:before{ + content:""} + +.fa-flask:before{ + content:""} + +.fa-cut:before,.fa-scissors:before{ + content:""} + +.fa-copy:before,.fa-files-o:before{ + content:""} + +.fa-paperclip:before{ + content:""} + +.fa-save:before,.fa-floppy-o:before{ + content:""} + +.fa-square:before{ + content:""} + +.fa-navicon:before,.fa-reorder:before,.fa-bars:before{ + content:""} + +.fa-list-ul:before{ + content:""} + +.fa-list-ol:before{ + content:""} + +.fa-strikethrough:before{ + content:""} + +.fa-underline:before{ + content:""} + +.fa-table:before{ + content:""} + +.fa-magic:before{ + content:""} + +.fa-truck:before{ + content:""} + +.fa-pinterest:before{ + content:""} + +.fa-pinterest-square:before{ + content:""} + +.fa-google-plus-square:before{ + content:""} + +.fa-google-plus:before{ + content:""} + +.fa-money:before{ + content:""} + +.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{ + content:""} + +.fa-caret-up:before{ + content:""} + +.fa-caret-left:before{ + content:""} + +.fa-caret-right:before{ + content:""} + +.fa-columns:before{ + content:""} + +.fa-unsorted:before,.fa-sort:before{ + content:""} + +.fa-sort-down:before,.fa-sort-desc:before{ + content:""} + +.fa-sort-up:before,.fa-sort-asc:before{ + content:""} + +.fa-envelope:before{ + content:""} + +.fa-linkedin:before{ + content:""} + +.fa-rotate-left:before,.fa-undo:before{ + content:""} + +.fa-legal:before,.fa-gavel:before{ + content:""} + +.fa-dashboard:before,.fa-tachometer:before{ + content:""} + +.fa-comment-o:before{ + content:""} + +.fa-comments-o:before{ + content:""} + +.fa-flash:before,.fa-bolt:before{ + content:""} + +.fa-sitemap:before{ + content:""} + +.fa-umbrella:before{ + content:""} + +.fa-paste:before,.fa-clipboard:before{ + content:""} + +.fa-lightbulb-o:before{ + content:""} + +.fa-exchange:before{ + content:""} + +.fa-cloud-download:before{ + content:""} + +.fa-cloud-upload:before{ + content:""} + +.fa-user-md:before{ + content:""} + +.fa-stethoscope:before{ + content:""} + +.fa-suitcase:before{ + content:""} + +.fa-bell-o:before{ + content:""} + +.fa-coffee:before{ + content:""} + +.fa-cutlery:before{ + content:""} + +.fa-file-text-o:before{ + content:""} + +.fa-building-o:before{ + content:""} + +.fa-hospital-o:before{ + content:""} + +.fa-ambulance:before{ + content:""} + +.fa-medkit:before{ + content:""} + +.fa-fighter-jet:before{ + content:""} + +.fa-beer:before{ + content:""} + +.fa-h-square:before{ + content:""} + +.fa-plus-square:before{ + content:""} + +.fa-angle-double-left:before{ + content:""} + +.fa-angle-double-right:before{ + content:""} + +.fa-angle-double-up:before{ + content:""} + +.fa-angle-double-down:before{ + content:""} + +.fa-angle-left:before{ + content:""} + +.fa-angle-right:before{ + content:""} + +.fa-angle-up:before{ + content:""} + +.fa-angle-down:before{ + content:""} + +.fa-desktop:before{ + content:""} + +.fa-laptop:before{ + content:""} + +.fa-tablet:before{ + content:""} + +.fa-mobile-phone:before,.fa-mobile:before{ + content:""} + +.fa-circle-o:before{ + content:""} + +.fa-quote-left:before{ + content:""} + +.fa-quote-right:before{ + content:""} + +.fa-spinner:before{ + content:""} + +.fa-circle:before{ + content:""} + +.fa-mail-reply:before,.fa-reply:before{ + content:""} + +.fa-github-alt:before{ + content:""} + +.fa-folder-o:before{ + content:""} + +.fa-folder-open-o:before{ + content:""} + +.fa-smile-o:before{ + content:""} + +.fa-frown-o:before{ + content:""} + +.fa-meh-o:before{ + content:""} + +.fa-gamepad:before{ + content:""} + +.fa-keyboard-o:before{ + content:""} + +.fa-flag-o:before{ + content:""} + +.fa-flag-checkered:before{ + content:""} + +.fa-terminal:before{ + content:""} + +.fa-code:before{ + content:""} + +.fa-mail-reply-all:before,.fa-reply-all:before{ + content:""} + +.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{ + content:""} + +.fa-location-arrow:before{ + content:""} + +.fa-crop:before{ + content:""} + +.fa-code-fork:before{ + content:""} + +.fa-unlink:before,.fa-chain-broken:before{ + content:""} + +.fa-question:before{ + content:""} + +.fa-info:before{ + content:""} + +.fa-exclamation:before{ + content:""} + +.fa-superscript:before{ + content:""} + +.fa-subscript:before{ + content:""} + +.fa-eraser:before{ + content:""} + +.fa-puzzle-piece:before{ + content:""} + +.fa-microphone:before{ + content:""} + +.fa-microphone-slash:before{ + content:""} + +.fa-shield:before{ + content:""} + +.fa-calendar-o:before{ + content:""} + +.fa-fire-extinguisher:before{ + content:""} + +.fa-rocket:before{ + content:""} + +.fa-maxcdn:before{ + content:""} + +.fa-chevron-circle-left:before{ + content:""} + +.fa-chevron-circle-right:before{ + content:""} + +.fa-chevron-circle-up:before{ + content:""} + +.fa-chevron-circle-down:before{ + content:""} + +.fa-html5:before{ + content:""} + +.fa-css3:before{ + content:""} + +.fa-anchor:before{ + content:""} + +.fa-unlock-alt:before{ + content:""} + +.fa-bullseye:before{ + content:""} + +.fa-ellipsis-h:before{ + content:""} + +.fa-ellipsis-v:before{ + content:""} + +.fa-rss-square:before{ + content:""} + +.fa-play-circle:before{ + content:""} + +.fa-ticket:before{ + content:""} + +.fa-minus-square:before{ + content:""} + +.fa-minus-square-o:before{ + content:""} + +.fa-level-up:before{ + content:""} + +.fa-level-down:before{ + content:""} + +.fa-check-square:before{ + content:""} + +.fa-pencil-square:before{ + content:""} + +.fa-external-link-square:before{ + content:""} + +.fa-share-square:before{ + content:""} + +.fa-compass:before{ + content:""} + +.fa-toggle-down:before,.fa-caret-square-o-down:before{ + content:""} + +.fa-toggle-up:before,.fa-caret-square-o-up:before{ + content:""} + +.fa-toggle-right:before,.fa-caret-square-o-right:before{ + content:""} + +.fa-euro:before,.fa-eur:before{ + content:""} + +.fa-gbp:before{ + content:""} + +.fa-dollar:before,.fa-usd:before{ + content:""} + +.fa-rupee:before,.fa-inr:before{ + content:""} + +.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{ + content:""} + +.fa-ruble:before,.fa-rouble:before,.fa-rub:before{ + content:""} + +.fa-won:before,.fa-krw:before{ + content:""} + +.fa-bitcoin:before,.fa-btc:before{ + content:""} + +.fa-file:before{ + content:""} + +.fa-file-text:before{ + content:""} + +.fa-sort-alpha-asc:before{ + content:""} + +.fa-sort-alpha-desc:before{ + content:""} + +.fa-sort-amount-asc:before{ + content:""} + +.fa-sort-amount-desc:before{ + content:""} + +.fa-sort-numeric-asc:before{ + content:""} + +.fa-sort-numeric-desc:before{ + content:""} + +.fa-thumbs-up:before{ + content:""} + +.fa-thumbs-down:before{ + content:""} + +.fa-youtube-square:before{ + content:""} + +.fa-youtube:before{ + content:""} + +.fa-xing:before{ + content:""} + +.fa-xing-square:before{ + content:""} + +.fa-youtube-play:before{ + content:""} + +.fa-dropbox:before{ + content:""} + +.fa-stack-overflow:before{ + content:""} + +.fa-instagram:before{ + content:""} + +.fa-flickr:before{ + content:""} + +.fa-adn:before{ + content:""} + +.fa-bitbucket:before,.icon-bitbucket:before{ + content:""} + +.fa-bitbucket-square:before{ + content:""} + +.fa-tumblr:before{ + content:""} + +.fa-tumblr-square:before{ + content:""} + +.fa-long-arrow-down:before{ + content:""} + +.fa-long-arrow-up:before{ + content:""} + +.fa-long-arrow-left:before{ + content:""} + +.fa-long-arrow-right:before{ + content:""} + +.fa-apple:before{ + content:""} + +.fa-windows:before{ + content:""} + +.fa-android:before{ + content:""} + +.fa-linux:before{ + content:""} + +.fa-dribbble:before{ + content:""} + +.fa-skype:before{ + content:""} + +.fa-foursquare:before{ + content:""} + +.fa-trello:before{ + content:""} + +.fa-female:before{ + content:""} + +.fa-male:before{ + content:""} + +.fa-gittip:before{ + content:""} + +.fa-sun-o:before{ + content:""} + +.fa-moon-o:before{ + content:""} + +.fa-archive:before{ + content:""} + +.fa-bug:before{ + content:""} + +.fa-vk:before{ + content:""} + +.fa-weibo:before{ + content:""} + +.fa-renren:before{ + content:""} + +.fa-pagelines:before{ + content:""} + +.fa-stack-exchange:before{ + content:""} + +.fa-arrow-circle-o-right:before{ + content:""} + +.fa-arrow-circle-o-left:before{ + content:""} + +.fa-toggle-left:before,.fa-caret-square-o-left:before{ + content:""} + +.fa-dot-circle-o:before{ + content:""} + +.fa-wheelchair:before{ + content:""} + +.fa-vimeo-square:before{ + content:""} + +.fa-turkish-lira:before,.fa-try:before{ + content:""} + +.fa-plus-square-o:before{ + content:""} + +.fa-space-shuttle:before{ + content:""} + +.fa-slack:before{ + content:""} + +.fa-envelope-square:before{ + content:""} + +.fa-wordpress:before{ + content:""} + +.fa-openid:before{ + content:""} + +.fa-institution:before,.fa-bank:before,.fa-university:before{ + content:""} + +.fa-mortar-board:before,.fa-graduation-cap:before{ + content:""} + +.fa-yahoo:before{ + content:""} + +.fa-google:before{ + content:""} + +.fa-reddit:before{ + content:""} + +.fa-reddit-square:before{ + content:""} + +.fa-stumbleupon-circle:before{ + content:""} + +.fa-stumbleupon:before{ + content:""} + +.fa-delicious:before{ + content:""} + +.fa-digg:before{ + content:""} + +.fa-pied-piper-square:before,.fa-pied-piper:before{ + content:""} + +.fa-pied-piper-alt:before{ + content:""} + +.fa-drupal:before{ + content:""} + +.fa-joomla:before{ + content:""} + +.fa-language:before{ + content:""} + +.fa-fax:before{ + content:""} + +.fa-building:before{ + content:""} + +.fa-child:before{ + content:""} + +.fa-paw:before{ + content:""} + +.fa-spoon:before{ + content:""} + +.fa-cube:before{ + content:""} + +.fa-cubes:before{ + content:""} + +.fa-behance:before{ + content:""} + +.fa-behance-square:before{ + content:""} + +.fa-steam:before{ + content:""} + +.fa-steam-square:before{ + content:""} + +.fa-recycle:before{ + content:""} + +.fa-automobile:before,.fa-car:before{ + content:""} + +.fa-cab:before,.fa-taxi:before{ + content:""} + +.fa-tree:before{ + content:""} + +.fa-spotify:before{ + content:""} + +.fa-deviantart:before{ + content:""} + +.fa-soundcloud:before{ + content:""} + +.fa-database:before{ + content:""} + +.fa-file-pdf-o:before{ + content:""} + +.fa-file-word-o:before{ + content:""} + +.fa-file-excel-o:before{ + content:""} + +.fa-file-powerpoint-o:before{ + content:""} + +.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{ + content:""} + +.fa-file-zip-o:before,.fa-file-archive-o:before{ + content:""} + +.fa-file-sound-o:before,.fa-file-audio-o:before{ + content:""} + +.fa-file-movie-o:before,.fa-file-video-o:before{ + content:""} + +.fa-file-code-o:before{ + content:""} + +.fa-vine:before{ + content:""} + +.fa-codepen:before{ + content:""} + +.fa-jsfiddle:before{ + content:""} + +.fa-life-bouy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{ + content:""} + +.fa-circle-o-notch:before{ + content:""} + +.fa-ra:before,.fa-rebel:before{ + content:""} + +.fa-ge:before,.fa-empire:before{ + content:""} + +.fa-git-square:before{ + content:""} + +.fa-git:before{ + content:""} + +.fa-hacker-news:before{ + content:""} + +.fa-tencent-weibo:before{ + content:""} + +.fa-qq:before{ + content:""} + +.fa-wechat:before,.fa-weixin:before{ + content:""} + +.fa-send:before,.fa-paper-plane:before{ + content:""} + +.fa-send-o:before,.fa-paper-plane-o:before{ + content:""} + +.fa-history:before{ + content:""} + +.fa-circle-thin:before{ + content:""} + +.fa-header:before{ + content:""} + +.fa-paragraph:before{ + content:""} + +.fa-sliders:before{ + content:""} + +.fa-share-alt:before{ + content:""} + +.fa-share-alt-square:before{ + content:""} + +.fa-bomb:before{ + content:""} + +.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{ + font-family:inherit} + +.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{ + font-family:"FontAwesome"; + display:inline-block; + font-style:normal; + font-weight:normal; + line-height:1; + text-decoration:inherit} + +a .fa,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .icon{ + display:inline-block; + text-decoration:inherit} + +.btn .fa,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .icon,.nav .fa,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .icon{ + display:inline} + +.btn .fa.fa-large,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .fa-large.icon{ + line-height:0.9em} + +.btn .fa.fa-spin,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .fa-spin.icon{ + display:inline-block} + +.btn.fa:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.btn.icon:before{ + opacity:0.5; + -webkit-transition:opacity 0.05s ease-in; + -moz-transition:opacity 0.05s ease-in; + transition:opacity 0.05s ease-in} + +.btn.fa:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.btn.icon:hover:before{ + opacity:1} + +.btn-mini .fa:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .icon:before{ + font-size:14px; + vertical-align:-15%} + +.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo{ + padding:12px; + line-height:24px; + margin-bottom:24px; + background:#e7f2fa} + +.wy-alert-title,.rst-content .admonition-title{ + color:#fff; + font-weight:bold; + display:block; + color:#fff; + background:#6ab0de; + margin:-12px; + padding:6px 12px; + margin-bottom:12px} + +.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo{ + background:#fdf3f2} + +.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title{ + background:#f29f97} + +.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo{ + background:#ffedcc} + +.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title{ + background:#f0b37e} + +.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo{ + background:#e7f2fa} + +.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title{ + background:#6ab0de} + +.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo{ + background:#dbfaf4} + +.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title{ + background:#1abc9c} + +.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo{ + background:#f3f6f6} + +.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title{ + color:#404040; + background:#e1e4e5} + +.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a{ + color:#2980B9} + +.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child{ + margin-bottom:0} + +.wy-tray-container{ + position:fixed; + bottom:0px; + left:0; + z-index:600} + +.wy-tray-container li{ + display:block; + width:300px; + background:transparent; + color:#fff; + text-align:center; + box-shadow:0 5px 5px 0 rgba(0,0,0,0.1); + padding:0 24px; + min-width:20%; + opacity:0; + height:0; + line-height:56px; + overflow:hidden; + -webkit-transition:all 0.3s ease-in; + -moz-transition:all 0.3s ease-in; + transition:all 0.3s ease-in} + +.wy-tray-container li.wy-tray-item-success{ + background:#27AE60} + +.wy-tray-container li.wy-tray-item-info{ + background:#2980B9} + +.wy-tray-container li.wy-tray-item-warning{ + background:#E67E22} + +.wy-tray-container li.wy-tray-item-danger{ + background:#E74C3C} + +.wy-tray-container li.on{ + opacity:1; + height:56px} + +@media screen and (max-width: 768px){ + .wy-tray-container{ + bottom:auto; + top:0; + width:100%} + + .wy-tray-container li{ + width:100%} + +} + +button{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle; + cursor:pointer; + line-height:normal; + -webkit-appearance:button; + *overflow:visible} + +button::-moz-focus-inner,input::-moz-focus-inner{ + border:0; + padding:0} + +button[disabled]{ + cursor:default} + +.btn{ + display:inline-block; + border-radius:2px; + line-height:normal; + white-space:nowrap; + text-align:center; + cursor:pointer; + font-size:100%; + padding:6px 12px 8px 12px; + color:#fff; + border:1px solid rgba(0,0,0,0.1); + background-color:#27AE60; + text-decoration:none; + font-weight:normal; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset; + outline-none:false; + vertical-align:middle; + *display:inline; + zoom:1; + -webkit-user-drag:none; + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; + -webkit-transition:all 0.1s linear; + -moz-transition:all 0.1s linear; + transition:all 0.1s linear} + +.btn-hover{ + background:#2e8ece; + color:#fff} + +.btn:hover{ + background:#2cc36b; + color:#fff} + +.btn:focus{ + background:#2cc36b; + outline:0} + +.btn:active{ + box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset; + padding:8px 12px 6px 12px} + +.btn:visited{ + color:#fff} + +.btn:disabled{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:0.4; + cursor:not-allowed; + box-shadow:none} + +.btn-disabled{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:0.4; + cursor:not-allowed; + box-shadow:none} + +.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:0.4; + cursor:not-allowed; + box-shadow:none} + +.btn::-moz-focus-inner{ + padding:0; + border:0} + +.btn-small{ + font-size:80%} + +.btn-info{ + background-color:#2980B9 !important} + +.btn-info:hover{ + background-color:#2e8ece !important} + +.btn-neutral{ + background-color:#f3f6f6 !important; + color:#404040 !important} + +.btn-neutral:hover{ + background-color:#e5ebeb !important; + color:#404040} + +.btn-neutral:visited{ + color:#404040 !important} + +.btn-success{ + background-color:#27AE60 !important} + +.btn-success:hover{ + background-color:#295 !important} + +.btn-danger{ + background-color:#E74C3C !important} + +.btn-danger:hover{ + background-color:#ea6153 !important} + +.btn-warning{ + background-color:#E67E22 !important} + +.btn-warning:hover{ + background-color:#e98b39 !important} + +.btn-invert{ + background-color:#222} + +.btn-invert:hover{ + background-color:#2f2f2f !important} + +.btn-link{ + background-color:transparent !important; + color:#2980B9; + box-shadow:none; + border-color:transparent !important} + +.btn-link:hover{ + background-color:transparent !important; + color:#409ad5 !important; + box-shadow:none} + +.btn-link:active{ + background-color:transparent !important; + color:#409ad5 !important; + box-shadow:none} + +.btn-link:visited{ + color:#9B59B6} + +.wy-btn-group .btn,.wy-control .btn{ + vertical-align:middle} + +.wy-btn-group{ + margin-bottom:24px; + *zoom:1} + +.wy-btn-group:before,.wy-btn-group:after{ + display:table; + content:""} + +.wy-btn-group:after{ + clear:both} + +.wy-dropdown{ + position:relative; + display:inline-block} + +.wy-dropdown-active .wy-dropdown-menu{ + display:block} + +.wy-dropdown-menu{ + position:absolute; + left:0; + display:none; + float:left; + top:100%; + min-width:100%; + background:#fcfcfc; + z-index:100; + border:solid 1px #cfd7dd; + box-shadow:0 2px 2px 0 rgba(0,0,0,0.1); + padding:12px} + +.wy-dropdown-menu>dd>a{ + display:block; + clear:both; + color:#404040; + white-space:nowrap; + font-size:90%; + padding:0 12px; + cursor:pointer} + +.wy-dropdown-menu>dd>a:hover{ + background:#2980B9; + color:#fff} + +.wy-dropdown-menu>dd.divider{ + border-top:solid 1px #cfd7dd; + margin:6px 0} + +.wy-dropdown-menu>dd.search{ + padding-bottom:12px} + +.wy-dropdown-menu>dd.search input[type="search"]{ + width:100%} + +.wy-dropdown-menu>dd.call-to-action{ + background:#e3e3e3; + text-transform:uppercase; + font-weight:500; + font-size:80%} + +.wy-dropdown-menu>dd.call-to-action:hover{ + background:#e3e3e3} + +.wy-dropdown-menu>dd.call-to-action .btn{ + color:#fff} + +.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{ + bottom:100%; + top:auto; + left:auto; + right:0} + +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{ + background:#fcfcfc; + margin-top:2px} + +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{ + padding:6px 12px} + +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{ + background:#2980B9; + color:#fff} + +.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{ + right:0; + text-align:right} + +.wy-dropdown-arrow:before{ + content:" "; + border-bottom:5px solid #f5f5f5; + border-left:5px solid transparent; + border-right:5px solid transparent; + position:absolute; + display:block; + top:-4px; + left:50%; + margin-left:-3px} + +.wy-dropdown-arrow.wy-dropdown-arrow-left:before{ + left:11px} + +.wy-form-stacked select{ + display:block} + +.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle} + +.wy-form-aligned .wy-control-group>label{ + display:inline-block; + vertical-align:middle; + width:10em; + margin:6px 12px 0 0; + float:left} + +.wy-form-aligned .wy-control{ + float:left} + +.wy-form-aligned .wy-control label{ + display:block} + +.wy-form-aligned .wy-control select{ + margin-top:6px} + +fieldset{ + border:0; + margin:0; + padding:0} + +legend{ + display:block; + width:100%; + border:0; + padding:0; + white-space:normal; + margin-bottom:24px; + font-size:150%; + *margin-left:-7px} + +label{ + display:block; + margin:0 0 0.3125em 0; + color:#333; + font-size:90%} + +input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle} + +.wy-control-group{ + margin-bottom:24px; + *zoom:1; + max-width:68em; + margin-left:auto; + margin-right:auto; + *zoom:1} + +.wy-control-group:before,.wy-control-group:after{ + display:table; + content:""} + +.wy-control-group:after{ + clear:both} + +.wy-control-group:before,.wy-control-group:after{ + display:table; + content:""} + +.wy-control-group:after{ + clear:both} + +.wy-control-group.wy-control-group-required>label:after{ + content:" *"; + color:#E74C3C} + +.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{ + padding-bottom:12px} + +.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{ + width:100%} + +.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{ + width:100%} + +.wy-control-group .wy-form-full{ + float:left; + display:block; + margin-right:2.35765%; + width:100%; + margin-right:0} + +.wy-control-group .wy-form-full:last-child{ + margin-right:0} + +.wy-control-group .wy-form-halves{ + float:left; + display:block; + margin-right:2.35765%; + width:48.82117%} + +.wy-control-group .wy-form-halves:last-child{ + margin-right:0} + +.wy-control-group .wy-form-halves:nth-of-type(2n){ + margin-right:0} + +.wy-control-group .wy-form-halves:nth-of-type(2n+1){ + clear:left} + +.wy-control-group .wy-form-thirds{ + float:left; + display:block; + margin-right:2.35765%; + width:31.76157%} + +.wy-control-group .wy-form-thirds:last-child{ + margin-right:0} + +.wy-control-group .wy-form-thirds:nth-of-type(3n){ + margin-right:0} + +.wy-control-group .wy-form-thirds:nth-of-type(3n+1){ + clear:left} + +.wy-control-group.wy-control-group-no-input .wy-control{ + margin:6px 0 0 0; + font-size:90%} + +.wy-control-no-input{ + display:inline-block; + margin:6px 0 0 0; + font-size:90%} + +.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{ + width:100%} + +.wy-form-message-inline{ + display:inline-block; + padding-left:0.3em; + color:#666; + vertical-align:middle; + font-size:90%} + +.wy-form-message{ + display:block; + color:#999; + font-size:70%; + margin-top:0.3125em; + font-style:italic} + +input{ + line-height:normal} + +input[type="button"],input[type="reset"],input[type="submit"]{ + -webkit-appearance:button; + cursor:pointer; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + *overflow:visible} + +input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{ + -webkit-appearance:none; + padding:6px; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + box-shadow:inset 0 1px 3px #ddd; + border-radius:0; + -webkit-transition:border 0.3s linear; + -moz-transition:border 0.3s linear; + transition:border 0.3s linear} + +input[type="datetime-local"]{ + padding:0.34375em 0.625em} + +input[disabled]{ + cursor:default} + +input[type="checkbox"],input[type="radio"]{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + padding:0; + margin-right:0.3125em; + *height:13px; + *width:13px} + +input[type="search"]{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box} + +input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{ + -webkit-appearance:none} + +input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{ + outline:0; + outline:thin dotted \9; + border-color:#333} + +input.no-focus:focus{ + border-color:#ccc !important} + +input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{ + outline:thin dotted #333; + outline:1px auto #129FEA} + +input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{ + cursor:not-allowed; + background-color:#f3f6f6; + color:#cad2d3} + +input:focus:invalid,textarea:focus:invalid,select:focus:invalid{ + color:#E74C3C; + border:1px solid #E74C3C} + +input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{ + border-color:#E74C3C} + +input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{ + outline-color:#E74C3C} + +input.wy-input-large{ + padding:12px; + font-size:100%} + +textarea{ + overflow:auto; + vertical-align:top; + width:100%; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif} + +select,textarea{ + padding:0.5em 0.625em; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + box-shadow:inset 0 1px 3px #ddd; + -webkit-transition:border 0.3s linear; + -moz-transition:border 0.3s linear; + transition:border 0.3s linear} + +select{ + border:1px solid #ccc; + background-color:#fff} + +select[multiple]{ + height:auto} + +select:focus,textarea:focus{ + outline:0} + +select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{ + cursor:not-allowed; + background-color:#fff; + color:#cad2d3; + border-color:transparent} + +.wy-checkbox,.wy-radio{ + margin:6px 0; + color:#404040; + display:block} + +.wy-checkbox input,.wy-radio input{ + vertical-align:baseline} + +.wy-form-message-inline{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle} + +.wy-input-prefix,.wy-input-suffix{ + white-space:nowrap; + padding:6px} + +.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{ + line-height:27px; + padding:0 8px; + display:inline-block; + font-size:80%; + background-color:#f3f6f6; + border:solid 1px #ccc; + color:#999} + +.wy-input-suffix .wy-input-context{ + border-left:0} + +.wy-input-prefix .wy-input-context{ + border-right:0} + +.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{ + color:#E74C3C} + +.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{ + border:solid 1px #E74C3C} + +.wy-control-group.wy-control-group-error textarea{ + border:solid 1px #E74C3C} + +.wy-inline-validate{ + white-space:nowrap} + +.wy-inline-validate .wy-input-context{ + padding:0.5em 0.625em; + display:inline-block; + font-size:80%} + +.wy-inline-validate.wy-inline-validate-success .wy-input-context{ + color:#27AE60} + +.wy-inline-validate.wy-inline-validate-danger .wy-input-context{ + color:#E74C3C} + +.wy-inline-validate.wy-inline-validate-warning .wy-input-context{ + color:#E67E22} + +.wy-inline-validate.wy-inline-validate-info .wy-input-context{ + color:#2980B9} + +.rotate-90{ + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg)} + +.rotate-180{ + -webkit-transform:rotate(180deg); + -moz-transform:rotate(180deg); + -ms-transform:rotate(180deg); + -o-transform:rotate(180deg); + transform:rotate(180deg)} + +.rotate-270{ + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg)} + +.mirror{ + -webkit-transform:scaleX(-1); + -moz-transform:scaleX(-1); + -ms-transform:scaleX(-1); + -o-transform:scaleX(-1); + transform:scaleX(-1)} + +.mirror.rotate-90{ + -webkit-transform:scaleX(-1) rotate(90deg); + -moz-transform:scaleX(-1) rotate(90deg); + -ms-transform:scaleX(-1) rotate(90deg); + -o-transform:scaleX(-1) rotate(90deg); + transform:scaleX(-1) rotate(90deg)} + +.mirror.rotate-180{ + -webkit-transform:scaleX(-1) rotate(180deg); + -moz-transform:scaleX(-1) rotate(180deg); + -ms-transform:scaleX(-1) rotate(180deg); + -o-transform:scaleX(-1) rotate(180deg); + transform:scaleX(-1) rotate(180deg)} + +.mirror.rotate-270{ + -webkit-transform:scaleX(-1) rotate(270deg); + -moz-transform:scaleX(-1) rotate(270deg); + -ms-transform:scaleX(-1) rotate(270deg); + -o-transform:scaleX(-1) rotate(270deg); + transform:scaleX(-1) rotate(270deg)} + +@media only screen and (max-width: 480px){ + .wy-form button[type="submit"]{ + margin:0.7em 0 0} + + .wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{ + margin-bottom:0.3em; + display:block} + + .wy-form label{ + margin-bottom:0.3em; + display:block} + + .wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{ + margin-bottom:0} + + .wy-form-aligned .wy-control-group label{ + margin-bottom:0.3em; + text-align:left; + display:block; + width:100%} + + .wy-form-aligned .wy-control{ + margin:1.5em 0 0 0} + + .wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{ + display:block; + font-size:80%; + padding:6px 0} + +} + +@media screen and (max-width: 768px){ + .tablet-hide{ + display:none} + +} + +@media screen and (max-width: 480px){ + .mobile-hide{ + display:none} + +} + +.float-left{ + float:left} + +.float-right{ + float:right} + +.full-width{ + width:100%} + +.wy-table,.rst-content table.docutils,.rst-content table.field-list{ + border-collapse:collapse; + border-spacing:0; + empty-cells:show; + margin-bottom:24px} + +.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; + text-align:center} + +.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{ + font-size:90%; + margin:0; + overflow:visible; + padding:8px 16px} + +.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{ + border-left-width:0} + +.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{ + color:#000; + text-align:left; + vertical-align:bottom; + white-space:nowrap} + +.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{ + font-weight:bold; + border-bottom:solid 2px #e1e4e5} + +.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{ + background-color:transparent; + vertical-align:middle} + +.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{ + line-height:18px} + +.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{ + margin-bottom:0} + +.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{ + width:1%; + padding-right:0} + +.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{ + margin:0} + +.wy-table-secondary{ + color:gray; + font-size:90%} + +.wy-table-tertiary{ + color:gray; + font-size:80%} + +.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{ + background-color:#f3f6f6} + +.wy-table-backed{ + background-color:#f3f6f6} + +.wy-table-bordered-all,.rst-content table.docutils{ + border:1px solid #e1e4e5} + +.wy-table-bordered-all td,.rst-content table.docutils td{ + border-bottom:1px solid #e1e4e5; + border-left:1px solid #e1e4e5} + +.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{ + border-bottom-width:0} + +.wy-table-bordered{ + border:1px solid #e1e4e5} + +.wy-table-bordered-rows td{ + border-bottom:1px solid #e1e4e5} + +.wy-table-bordered-rows tbody>tr:last-child td{ + border-bottom-width:0} + +.wy-table-horizontal tbody>tr:last-child td{ + border-bottom-width:0} + +.wy-table-horizontal td,.wy-table-horizontal th{ + border-width:0 0 1px 0; + border-bottom:1px solid #e1e4e5} + +.wy-table-horizontal tbody>tr:last-child td{ + border-bottom-width:0} + +.wy-table-responsive{ + margin-bottom:24px; + max-width:100%; + overflow:auto} + +.wy-table-responsive table{ + margin-bottom:0 !important} + +.wy-table-responsive table td,.wy-table-responsive table th{ + white-space:nowrap} + +a{ + color:#2980B9; + text-decoration:none; + cursor:pointer} + +a:hover{ + color:#3091d1} + +a:visited{ + color:#9B59B6} + +html{ + height:100%; + overflow-x:hidden} + +body{ + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + font-weight:normal; + color:#404040; + min-height:100%; + overflow-x:hidden; + background:#edf0f2} + +.wy-text-left{ + text-align:left} + +.wy-text-center{ + text-align:center} + +.wy-text-right{ + text-align:right} + +.wy-text-large{ + font-size:120%} + +.wy-text-normal{ + font-size:100%} + +.wy-text-small,small{ + font-size:80%} + +.wy-text-strike{ + text-decoration:line-through} + +.wy-text-warning{ + color:#E67E22 !important} + +a.wy-text-warning:hover{ + color:#eb9950 !important} + +.wy-text-info{ + color:#2980B9 !important} + +a.wy-text-info:hover{ + color:#409ad5 !important} + +.wy-text-success{ + color:#27AE60 !important} + +a.wy-text-success:hover{ + color:#36d278 !important} + +.wy-text-danger{ + color:#E74C3C !important} + +a.wy-text-danger:hover{ + color:#ed7669 !important} + +.wy-text-neutral{ + color:#404040 !important} + +a.wy-text-neutral:hover{ + color:#595959 !important} + +h1,h2,h3,h4,h5,h6,legend{ + margin-top:0; + font-weight:700; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif} + +p{ + line-height:24px; + margin:0; + font-size:16px; + margin-bottom:24px} + +h1{ + font-size:175%} + +h2{ + font-size:150%} + +h3{ + font-size:125%} + +h4{ + font-size:115%} + +h5{ + font-size:110%} + +h6{ + font-size:100%} + +hr{ + display:block; + height:1px; + border:0; + border-top:1px solid #e1e4e5; + margin:24px 0; + padding:0} + +code,.rst-content tt{ + white-space:nowrap; + max-width:100%; + background:#fff; + border:solid 1px #e1e4e5; + font-size:75%; + padding:0 5px; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + color:#E74C3C; + overflow-x:auto} + +code.code-large,.rst-content tt.code-large{ + font-size:90%} + +.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{ + list-style:disc; + line-height:24px; + margin-bottom:24px} + +.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{ + list-style:disc; + margin-left:24px} + +.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{ + margin-bottom:0} + +.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{ + margin-bottom:0} + +.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{ + list-style:circle} + +.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{ + list-style:square} + +.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{ + list-style:decimal} + +.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{ + list-style:decimal; + line-height:24px; + margin-bottom:24px} + +.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{ + list-style:decimal; + margin-left:24px} + +.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{ + margin-bottom:0} + +.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{ + margin-bottom:0} + +.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{ + list-style:disc} + +.codeblock-example{ + border:1px solid #e1e4e5; + border-bottom:none; + padding:24px; + padding-top:48px; + font-weight:500; + background:#fff; + position:relative} + +.codeblock-example:after{ + content:"Example"; + position:absolute; + top:0px; + left:0px; + background:#9B59B6; + color:#fff; + padding:6px 12px} + +.codeblock-example.prettyprint-example-only{ + border:1px solid #e1e4e5; + margin-bottom:24px} + +.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{ + border:1px solid #e1e4e5; + padding:0px; + overflow-x:auto; + background:#fff; + margin:1px 0 24px 0} + +.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{ + border:none; + background:none; + margin:0} + +div[class^='highlight'] td.code{ + width:100%} + +.linenodiv pre{ + border-right:solid 1px #e6e9ea; + margin:0; + padding:12px 12px; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:12px; + line-height:1.5; + color:#d9d9d9} + +div[class^='highlight'] pre{ + white-space:pre; + margin:0; + padding:12px 12px; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:12px; + line-height:1.5; + display:block; + overflow:auto; + color:#404040} + +@media print{ + .codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{ + white-space:pre-wrap} + +} + +.hll{ + background-color:#ffc; + margin:0 -12px; + padding:0 12px; + display:block} + +.c{ + color:#998; + font-style:italic} + +.err{ + color:#a61717; + background-color:#e3d2d2} + +.k{ + font-weight:bold} + +.o{ + font-weight:bold} + +.cm{ + color:#998; + font-style:italic} + +.cp{ + color:#999; + font-weight:bold} + +.c1{ + color:#998; + font-style:italic} + +.cs{ + color:#999; + font-weight:bold; + font-style:italic} + +.gd{ + color:#000; + background-color:#fdd} + +.gd .x{ + color:#000; + background-color:#faa} + +.ge{ + font-style:italic} + +.gr{ + color:#a00} + +.gh{ + color:#999} + +.gi{ + color:#000; + background-color:#dfd} + +.gi .x{ + color:#000; + background-color:#afa} + +.go{ + color:#888} + +.gp{ + color:#555} + +.gs{ + font-weight:bold} + +.gu{ + color:purple; + font-weight:bold} + +.gt{ + color:#a00} + +.kc{ + font-weight:bold} + +.kd{ + font-weight:bold} + +.kn{ + font-weight:bold} + +.kp{ + font-weight:bold} + +.kr{ + font-weight:bold} + +.kt{ + color:#458; + font-weight:bold} + +.m{ + color:#099} + +.s{ + color:#d14} + +.n{ + color:#333} + +.na{ + color:teal} + +.nb{ + color:#0086b3} + +.nc{ + color:#458; + font-weight:bold} + +.no{ + color:teal} + +.ni{ + color:purple} + +.ne{ + color:#900; + font-weight:bold} + +.nf{ + color:#900; + font-weight:bold} + +.nn{ + color:#555} + +.nt{ + color:navy} + +.nv{ + color:teal} + +.ow{ + font-weight:bold} + +.w{ + color:#bbb} + +.mf{ + color:#099} + +.mh{ + color:#099} + +.mi{ + color:#099} + +.mo{ + color:#099} + +.sb{ + color:#d14} + +.sc{ + color:#d14} + +.sd{ + color:#d14} + +.s2{ + color:#d14} + +.se{ + color:#d14} + +.sh{ + color:#d14} + +.si{ + color:#d14} + +.sx{ + color:#d14} + +.sr{ + color:#009926} + +.s1{ + color:#d14} + +.ss{ + color:#990073} + +.bp{ + color:#999} + +.vc{ + color:teal} + +.vg{ + color:teal} + +.vi{ + color:teal} + +.il{ + color:#099} + +.gc{ + color:#999; + background-color:#EAF2F5} + +.wy-breadcrumbs li{ + display:inline-block} + +.wy-breadcrumbs li.wy-breadcrumbs-aside{ + float:right} + +.wy-breadcrumbs li a{ + display:inline-block; + padding:5px} + +.wy-breadcrumbs li a:first-child{ + padding-left:0} + +.wy-breadcrumbs-extra{ + margin-bottom:0; + color:#b3b3b3; + font-size:80%; + display:inline-block} + +@media screen and (max-width: 480px){ + .wy-breadcrumbs-extra{ + display:none} + + .wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none} + +} + +@media print{ + .wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none} + +} + +.wy-affix{ + position:fixed; + top:1.618em} + +.wy-menu a:hover{ + text-decoration:none} + +.wy-menu-horiz{ + *zoom:1} + +.wy-menu-horiz:before,.wy-menu-horiz:after{ + display:table; + content:""} + +.wy-menu-horiz:after{ + clear:both} + +.wy-menu-horiz ul,.wy-menu-horiz li{ + display:inline-block} + +.wy-menu-horiz li:hover{ + background:rgba(255,255,255,0.1)} + +.wy-menu-horiz li.divide-left{ + border-left:solid 1px #404040} + +.wy-menu-horiz li.divide-right{ + border-right:solid 1px #404040} + +.wy-menu-horiz a{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 16px} + +.wy-menu-vertical header{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 1.618em; + display:block; + font-weight:bold; + text-transform:uppercase; + font-size:80%; + color:#2980B9; + white-space:nowrap} + +.wy-menu-vertical ul{ + margin-bottom:0} + +.wy-menu-vertical li.divide-top{ + border-top:solid 1px #404040} + +.wy-menu-vertical li.divide-bottom{ + border-bottom:solid 1px #404040} + +.wy-menu-vertical li.current{ + background:#e3e3e3} + +.wy-menu-vertical li.current a{ + color:gray; + border-right:solid 1px #c9c9c9; + padding:0.4045em 2.427em} + +.wy-menu-vertical li.current a:hover{ + background:#d6d6d6} + +.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{ + color:#404040; + padding:0.4045em 1.618em; + font-weight:bold; + position:relative; + background:#fcfcfc; + border:none; + border-bottom:solid 1px #c9c9c9; + border-top:solid 1px #c9c9c9; + padding-left:1.618em -4px} + +.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{ + background:#fcfcfc} + +.wy-menu-vertical li.toctree-l2.current>a{ + background:#c9c9c9; + padding:0.4045em 2.427em} + +.wy-menu-vertical li.current ul{ + display:block} + +.wy-menu-vertical li ul{ + margin-bottom:0; + display:none} + +.wy-menu-vertical .local-toc li ul{ + display:block} + +.wy-menu-vertical li ul li a{ + margin-bottom:0; + color:#b3b3b3; + font-weight:normal} + +.wy-menu-vertical a{ + display:inline-block; + line-height:18px; + padding:0.4045em 1.618em; + display:block; + position:relative; + font-size:90%; + color:#b3b3b3} + +.wy-menu-vertical a:hover{ + background-color:#4e4a4a; + cursor:pointer} + +.wy-menu-vertical a:active{ + background-color:#2980B9; + cursor:pointer; + color:#fff} + +.wy-side-nav-search{ + z-index:200; + background-color:#2980B9; + text-align:center; + padding:0.809em; + display:block; + color:#fcfcfc; + margin-bottom:0.809em} + +.wy-side-nav-search input[type=text]{ + width:100%; + border-radius:50px; + padding:6px 12px; + border-color:#2472a4} + +.wy-side-nav-search img{ + display:block; + margin:auto auto 0.809em auto; + height:45px; + width:45px; + background-color:#2980B9; + padding:5px; + border-radius:100%} + +.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{ + color:#fcfcfc; + font-size:100%; + font-weight:bold; + display:inline-block; + padding:4px 6px; + margin-bottom:0.809em} + +.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{ + background:rgba(255,255,255,0.1)} + +.wy-nav .wy-menu-vertical header{ + color:#2980B9} + +.wy-nav .wy-menu-vertical a{ + color:#b3b3b3} + +.wy-nav .wy-menu-vertical a:hover{ + background-color:#2980B9; + color:#fff} + +[data-menu-wrap]{ + -webkit-transition:all 0.2s ease-in; + -moz-transition:all 0.2s ease-in; + transition:all 0.2s ease-in; + position:absolute; + opacity:1; + width:100%; + opacity:0} + +[data-menu-wrap].move-center{ + left:0; + right:auto; + opacity:1} + +[data-menu-wrap].move-left{ + right:auto; + left:-100%; + opacity:0} + +[data-menu-wrap].move-right{ + right:-100%; + left:auto; + opacity:0} + +.wy-body-for-nav{ + background:left repeat-y #fcfcfc; + background-image:url(data:image/png; + base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC); + background-size:300px 1px} + +.wy-grid-for-nav{ + position:absolute; + width:100%; + height:100%} + +.wy-nav-side{ + position:absolute; + top:0; + left:0; + width:300px; + overflow:hidden; + min-height:100%; + background:#343131; + z-index:200} + +.wy-nav-top{ + display:none; + background:#2980B9; + color:#fff; + padding:0.4045em 0.809em; + position:relative; + line-height:50px; + text-align:center; + font-size:100%; + *zoom:1} + +.wy-nav-top:before,.wy-nav-top:after{ + display:table; + content:""} + +.wy-nav-top:after{ + clear:both} + +.wy-nav-top a{ + color:#fff; + font-weight:bold} + +.wy-nav-top img{ + margin-right:12px; + height:45px; + width:45px; + background-color:#2980B9; + padding:5px; + border-radius:100%} + +.wy-nav-top i{ + font-size:30px; + float:left; + cursor:pointer} + +.wy-nav-content-wrap{ + margin-left:300px; + background:#fcfcfc; + min-height:100%} + +.wy-nav-content{ + padding:1.618em 3.236em; + height:100%; + max-width:800px; + margin:auto} + +.wy-body-mask{ + position:fixed; + width:100%; + height:100%; + background:rgba(0,0,0,0.2); + display:none; + z-index:499} + +.wy-body-mask.on{ + display:block} + +footer{ + color:#999} + +footer p{ + margin-bottom:12px} + +.rst-footer-buttons{ + *zoom:1} + +.rst-footer-buttons:before,.rst-footer-buttons:after{ + display:table; + content:""} + +.rst-footer-buttons:after{ + clear:both} + +#search-results .search li{ + margin-bottom:24px; + border-bottom:solid 1px #e1e4e5; + padding-bottom:24px} + +#search-results .search li:first-child{ + border-top:solid 1px #e1e4e5; + padding-top:24px} + +#search-results .search li a{ + font-size:120%; + margin-bottom:12px; + display:inline-block} + +#search-results .context{ + color:gray; + font-size:90%} + +@media screen and (max-width: 768px){ + .wy-body-for-nav{ + background:#fcfcfc} + + .wy-nav-top{ + display:block} + + .wy-nav-side{ + left:-300px} + + .wy-nav-side.shift{ + width:85%; + left:0} + + .wy-nav-content-wrap{ + margin-left:0} + + .wy-nav-content-wrap .wy-nav-content{ + padding:1.618em} + + .wy-nav-content-wrap.shift{ + position:fixed; + min-width:100%; + left:85%; + top:0; + height:100%; + overflow:hidden} + +} + +@media screen and (min-width: 1400px){ + .wy-nav-content-wrap{ + background:rgba(0,0,0,0.05)} + + .wy-nav-content{ + margin:0; + background:#fcfcfc} + +} + +@media print{ + .rst-versions,footer,.wy-nav-side{ + display:none} + + .wy-nav-content-wrap{ + margin-left:0} + +} + +nav.stickynav{ + position:fixed; + top:0} + +.rst-versions{ + position:fixed; + bottom:0; + left:0; + width:300px; + color:#fcfcfc; + background:#1f1d1d; + border-top:solid 10px #343131; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + z-index:400} + +.rst-versions a{ + color:#2980B9; + text-decoration:none} + +.rst-versions .rst-badge-small{ + display:none} + +.rst-versions .rst-current-version{ + padding:12px; + background-color:#272525; + display:block; + text-align:right; + font-size:90%; + cursor:pointer; + color:#27AE60; + *zoom:1} + +.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{ + display:table; + content:""} + +.rst-versions .rst-current-version:after{ + clear:both} + +.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .icon{ + color:#fcfcfc} + +.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{ + float:left} + +.rst-versions .rst-current-version .icon-book{ + float:left} + +.rst-versions .rst-current-version.rst-out-of-date{ + background-color:#E74C3C; + color:#fff} + +.rst-versions .rst-current-version.rst-active-old-version{ + background-color:#F1C40F; + color:#000} + +.rst-versions.shift-up .rst-other-versions{ + display:block} + +.rst-versions .rst-other-versions{ + font-size:90%; + padding:12px; + color:gray; + display:none} + +.rst-versions .rst-other-versions hr{ + display:block; + height:1px; + border:0; + margin:20px 0; + padding:0; + border-top:solid 1px #413d3d} + +.rst-versions .rst-other-versions dd{ + display:inline-block; + margin:0} + +.rst-versions .rst-other-versions dd a{ + display:inline-block; + padding:6px; + color:#fcfcfc} + +.rst-versions.rst-badge{ + width:auto; + bottom:20px; + right:20px; + left:auto; + border:none; + max-width:300px} + +.rst-versions.rst-badge .icon-book{ + float:none} + +.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{ + float:none} + +.rst-versions.rst-badge.shift-up .rst-current-version{ + text-align:right} + +.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{ + float:left} + +.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{ + float:left} + +.rst-versions.rst-badge .rst-current-version{ + width:auto; + height:30px; + line-height:30px; + padding:0 6px; + display:block; + text-align:center} + +@media screen and (max-width: 768px){ + .rst-versions{ + width:85%; + display:none} + + .rst-versions.shift{ + display:block} + + img{ + width:100%; + height:auto} + +} + +.rst-content img{ + max-width:100%; + height:auto !important} + +.rst-content div.figure{ + margin-bottom:24px} + +.rst-content div.figure.align-center{ + text-align:center} + +.rst-content .section>img,.rst-content .section>a>img{ + margin-bottom:24px} + +.rst-content blockquote{ + margin-left:24px; + line-height:24px; + margin-bottom:24px} + +.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last{ + margin-bottom:0} + +.rst-content .admonition-title:before{ + margin-right:4px} + +.rst-content .admonition table{ + border-color:rgba(0,0,0,0.1)} + +.rst-content .admonition table td,.rst-content .admonition table th{ + background:transparent !important; + border-color:rgba(0,0,0,0.1) !important} + +.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{ + list-style:lower-alpha} + +.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{ + list-style:upper-alpha} + +.rst-content .section ol p,.rst-content .section ul p{ + margin-bottom:12px} + +.rst-content .line-block{ + margin-left:24px} + +.rst-content .topic-title{ + font-weight:bold; + margin-bottom:12px} + +.rst-content .toc-backref{ + color:#404040} + +.rst-content .align-right{ + float:right; + margin:0px 0px 24px 24px} + +.rst-content .align-left{ + float:left; + margin:0px 24px 24px 0px} + +.rst-content .align-center{ + margin:auto; + display:block} + +.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink{ + display:none; + visibility:hidden; + font-size:14px} + +.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after{ + visibility:visible; + content:""; + font-family:FontAwesome; + display:inline-block} + +.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink{ + display:inline-block} + +.rst-content .sidebar{ + float:right; + width:40%; + display:block; + margin:0 0 24px 24px; + padding:24px; + background:#f3f6f6; + border:solid 1px #e1e4e5} + +.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{ + font-size:90%} + +.rst-content .sidebar .last{ + margin-bottom:0} + +.rst-content .sidebar .sidebar-title{ + display:block; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight:bold; + background:#e1e4e5; + padding:6px 12px; + margin:-24px; + margin-bottom:24px; + font-size:100%} + +.rst-content .highlighted{ + background:#F1C40F; + display:inline-block; + font-weight:bold; + padding:0 6px} + +.rst-content .footnote-reference,.rst-content .citation-reference{ + vertical-align:super; + font-size:90%} + +.rst-content table.docutils.citation,.rst-content table.docutils.footnote{ + background:none; + border:none; + color:#999} + +.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{ + border:none; + background-color:transparent !important; + white-space:normal} + +.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{ + padding-left:0; + padding-right:0; + vertical-align:top} + +.rst-content table.field-list{ + border:none} + +.rst-content table.field-list td{ + border:none; + padding-top:5px} + +.rst-content table.field-list td>strong{ + display:inline-block; + margin-top:3px} + +.rst-content table.field-list .field-name{ + padding-right:10px; + text-align:left; + white-space:nowrap} + +.rst-content table.field-list .field-body{ + text-align:left; + padding-left:0} + +.rst-content tt{ + color:#000} + +.rst-content tt big,.rst-content tt em{ + font-size:100% !important; + line-height:normal} + +.rst-content tt .xref,a .rst-content tt{ + font-weight:bold} + +.rst-content a tt{ + color:#2980B9} + +.rst-content dl{ + margin-bottom:24px} + +.rst-content dl dt{ + font-weight:bold} + +.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{ + margin-bottom:12px !important} + +.rst-content dl dd{ + margin:0 0 12px 24px} + +.rst-content dl:not(.docutils){ + margin-bottom:24px} + +.rst-content dl:not(.docutils) dt{ + display:inline-block; + margin:6px 0; + font-size:90%; + line-height:normal; + background:#e7f2fa; + color:#2980B9; + border-top:solid 3px #6ab0de; + padding:6px; + position:relative} + +.rst-content dl:not(.docutils) dt:before{ + color:#6ab0de} + +.rst-content dl:not(.docutils) dt .headerlink{ + color:#404040; + font-size:100% !important} + +.rst-content dl:not(.docutils) dl dt{ + margin-bottom:6px; + border:none; + border-left:solid 3px #ccc; + background:#f0f0f0; + color:gray} + +.rst-content dl:not(.docutils) dl dt .headerlink{ + color:#404040; + font-size:100% !important} + +.rst-content dl:not(.docutils) dt:first-child{ + margin-top:0} + +.rst-content dl:not(.docutils) tt{ + font-weight:bold} + +.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname{ + background-color:transparent; + border:none; + padding:0; + font-size:100% !important} + +.rst-content dl:not(.docutils) tt.descname{ + font-weight:bold} + +.rst-content dl:not(.docutils) .optional{ + display:inline-block; + padding:0 4px; + color:#000; + font-weight:bold} + +.rst-content dl:not(.docutils) .property{ + display:inline-block; + padding-right:8px} + +.rst-content .viewcode-link,.rst-content .viewcode-back{ + display:inline-block; + color:#27AE60; + font-size:80%; + padding-left:24px} + +.rst-content .viewcode-back{ + display:block; + float:right} + +.rst-content p.rubric{ + margin-bottom:12px; + font-weight:bold} + +@media screen and (max-width: 480px){ + .rst-content .sidebar{ + width:100%} + +} + +span[id*='MathJax-Span']{ + color:#404040} + +.math{ + text-align:center} + + +/*# sourceMappingURL=theme.css.map */ diff --git a/docs/content/css/search.css b/docs/content/css/search.css new file mode 100644 index 0000000..7be21f9 --- /dev/null +++ b/docs/content/css/search.css @@ -0,0 +1,47 @@ +/* -*- mode: css -*- */ + +/* read-the-org search styles, v1.6 */ + +#search-container { + padding: 10px; + background-color: #343131; +} + +#search-input { + width: 100%; + padding: 5px; + border: 1px solid #ccc; + border-radius: 4px; + font-size: 14px; +} + +#search-results { + list-style-type: none; + padding: 0; + margin: 10px 0 0 0; + max-height: 300px; + overflow-y: auto; +} + +#search-results li { + background-color: #2980B9; + color: white; + margin-bottom: 5px; + padding: 5px; + border-radius: 4px; + cursor: pointer; + font-size: 14px; +} + +#search-results li:hover { + background-color: #3091d1; +} + +#search-description { + color: #b3b3b3; /* Lighter color, matching the TOC text color in readtheorg.css */ +} + +mark { + background-color: yellow; + color: black; +} diff --git a/docs/content/header.org b/docs/content/header.org new file mode 100644 index 0000000..d2f35cd --- /dev/null +++ b/docs/content/header.org @@ -0,0 +1,3 @@ +#+OPTIONS: ^:nil +| [[./index.org][Home]] |[[./FTLE_example.org][Settings File]] | + diff --git a/docs/content/index.org b/docs/content/index.org new file mode 100644 index 0000000..e1ca632 --- /dev/null +++ b/docs/content/index.org @@ -0,0 +1,13 @@ +#+SETUPFILE: ../org-themes/theme-readtheorg.setup +#+INCLUDE: "./header.org" +* Welcome +Welcome to the flowVC documentation. +* Input Data Files +#+INCLUDE: "./vtu_2bin.org::Data Format" + + +* Setting File +The input settings are controlled using a settings.in file + + +For an example input file [[./FTLE_example.org][Click Here]] diff --git a/docs/content/js/readtheorg.js b/docs/content/js/readtheorg.js new file mode 100644 index 0000000..355cbf3 --- /dev/null +++ b/docs/content/js/readtheorg.js @@ -0,0 +1,145 @@ +function collapse_toc_elements_on_click (nav_li_a){ + /* + When an `a' element in the TOC is clicked, its parent + `li' element's active attribute is toggled. This causes + the element to toggle between minimized and maximized + states. The active attribute is documented in bootstrap. + https://getbootstrap.com/docs/4.0/components/navbar/#nav + */ + $(nav_li_a).parent().toggleClass("active"); +} + +$( document ).ready(function() { + // When the document is loaded and ready, bind the + // function `collapse_toc_elements_on_click' to the + // `a' elements in the table of contents. + $("#text-table-of-contents a").click(function() { + collapse_toc_elements_on_click(this); + }); +}); + +$(function() { + function replace_admonition (tag, map, language) { + var language = document.documentElement.lang; + var translations = map.get(tag); + var readable = translations.get(language) || translations.get("en"); // fallback to english + $(`span.${tag}:not(#table-of-contents *)`) .parent().parent() + .replaceWith(`

${readable}

`); + $(`div.${tag}`).before(`

${readable}

`) + } + const map = new Map() + .set("note", new Map() + .set("en", "Note") + .set("de", "Hinweis")) + .set("seealso", new Map() + .set("en", "See also") + .set("de", "Siehe auch")) + .set("warning", new Map() + .set("en", "Warning") + .set("de", "Warnung")) + .set("caution", new Map() + .set("en", "Caution") + .set("de", "Vorsicht")) + .set("attention", new Map() + .set("en", "Attention") + .set("de", "Obacht")) + .set("tip", new Map() + .set("en", "Tip") + .set("de", "Tipp")) + .set("important", new Map() + .set("en", "Important") + .set("de", "Wichtig")) + .set("hint", new Map() + .set("en", "Hint") + .set("de", "Hinweis")) + .set("error", new Map() + .set("en", "Error") + .set("de", "Fehler")) + .set("danger", new Map() + .set("en", "Danger") + .set("de", "Gefahr")) + ; + replace_admonition('note', map); + replace_admonition('seealso', map); + replace_admonition('warning', map); + replace_admonition('caution', map); + replace_admonition('attention', map); + replace_admonition('tip', map); + replace_admonition('important', map); + replace_admonition('hint', map); + replace_admonition('error', map); + replace_admonition('danger', map); +}); + +$( document ).ready(function() { + + // Shift nav in mobile when clicking the menu. + $(document).on('click', "[data-toggle='wy-nav-top']", function() { + $("[data-toggle='wy-nav-shift']").toggleClass("shift"); + $("[data-toggle='rst-versions']").toggleClass("shift"); + }); + // Close menu when you click a link. + $(document).on('click', ".wy-menu-vertical .current ul li a", function() { + $("[data-toggle='wy-nav-shift']").removeClass("shift"); + $("[data-toggle='rst-versions']").toggleClass("shift"); + }); + $(document).on('click', "[data-toggle='rst-current-version']", function() { + $("[data-toggle='rst-versions']").toggleClass("shift-up"); + }); + // Make tables responsive + $("table.docutils:not(.field-list)").wrap("
"); +}); + +$( document ).ready(function() { + $('#text-table-of-contents ul').first().addClass('nav'); + // ScrollSpy also requires that we use + // a Bootstrap nav component. + $('body').scrollspy({target: '#text-table-of-contents'}); + + // DON'T add sticky table headers (Fix issue #69?) + // $('table').stickyTableHeaders(); + + // set the height of tableOfContents + var $postamble = $('#postamble'); + var $tableOfContents = $('#table-of-contents'); + $tableOfContents.css({paddingBottom: $postamble.outerHeight()}); + + // add TOC button + var toggleSidebar = $('
'); + $('#content').prepend(toggleSidebar); + + // add close button when sidebar showed in mobile screen + var closeBtn = $('Close'); + var tocTitle = $('#table-of-contents').find('h2'); + tocTitle.append(closeBtn); +}); + +window.SphinxRtdTheme = (function (jquery) { + var stickyNav = (function () { + var navBar, + win, + stickyNavCssClass = 'stickynav', + applyStickNav = function () { + if (navBar.height() <= win.height()) { + navBar.addClass(stickyNavCssClass); + } else { + navBar.removeClass(stickyNavCssClass); + } + }, + enable = function () { + applyStickNav(); + win.on('resize', applyStickNav); + }, + init = function () { + navBar = jquery('nav.wy-nav-side:first'); + win = jquery(window); + }; + jquery(init); + return { + enable : enable + }; + }()); + return { + StickyNav : stickyNav + }; +}($)); diff --git a/docs/content/js/search.js b/docs/content/js/search.js new file mode 100644 index 0000000..99b676c --- /dev/null +++ b/docs/content/js/search.js @@ -0,0 +1,187 @@ +// -*- mode: js2 -*- + +// read-the-org-search + +// Configuration +const SEARCH_VERSION = "v1.12"; + +// Default configuration +window.searchConfig = { + enableSearch: true, + searchResultLimit: 0 +}; + +// Configuration function + + +function enableSearch(enableSearch, searchResultLimit) { + window.searchConfig.enableSearch = true; +} + + +function disableSearch() { + window.searchConfig.enableSearch = false; +} + + +function setSearchLimit(searchResultLimit) { + window.searchConfig.searchResultLimit = searchResultLimit; +} + + +console.log(`custom-search.js ${SEARCH_VERSION} is being loaded`); + + +$(document).ready(function() { + console.log(`Document ready, initializing search ${SEARCH_VERSION}`); + + const ENABLE_SEARCH = window.searchConfig.enableSearch; + const SEARCH_RESULT_LIMIT = window.searchConfig.searchResultLimit; + + if (!ENABLE_SEARCH) { + console.log('Search functionality is disabled'); + return; + } + + $('#table-of-contents').prepend(` +
+ + +
Type to search the document. Use arrow keys to navigate results.
+
    +
    + `); + + const searchInput = $('#search-input'); + const searchResults = $('#search-results'); + const searchDescription = $('#search-description'); + const content = $('#content'); + let searchIndex = []; + + function createSearchIndex() { + console.log('Creating search index'); + content.find('h1, h2, h3, h4, h5, h6, p').each(function() { + const element = $(this); + const text = element.text().trim(); + if (text) { + searchIndex.push({ + text: text.toLowerCase(), + element: element, + type: element.prop('tagName').toLowerCase() + }); + } + }); + console.log(`Search index created with ${searchIndex.length} items`); + } + + createSearchIndex(); + + function debounce(func, wait) { + let timeout; + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; + } + + function highlightText(text, term) { + const regex = new RegExp(`(${term})`, 'gi'); + return text.replace(regex, '$1'); + } + + function performSearch() { + const searchTerm = searchInput.val().toLowerCase(); + searchResults.empty(); + + if (searchTerm.length === 0) { + searchDescription.show(); + searchResults.hide(); + return; + } + + searchDescription.hide(); + searchResults.show(); + + if (searchTerm.length < 3) { + searchResults.html('
  • Please enter at least 3 characters
  • '); + return; + } + + const matches = searchIndex.filter(item => item.text.includes(searchTerm)); + + if (matches.length === 0) { + searchResults.append('
  • No results found
  • '); + return; + } + + // Apply the search result limit + const limitedMatches = SEARCH_RESULT_LIMIT > 0 ? matches.slice(0, SEARCH_RESULT_LIMIT) : matches; + + limitedMatches.forEach((match, index) => { + const snippet = match.text.length > 100 ? match.text.substr(0, 100) + '...' : match.text; + const highlightedSnippet = highlightText(snippet, searchTerm); + const li = $(`
  • ${highlightedSnippet}
  • `); + li.data('element', match.element); + searchResults.append(li); + }); + + searchResults.children().first().attr('tabindex', '0'); + } + + const debouncedSearch = debounce(performSearch, 300); + + searchInput.on('input', debouncedSearch); + + searchResults.on('click keypress', 'li', function(e) { + if (e.type === 'click' || (e.type === 'keypress' && e.which === 13)) { + const element = $(this).data('element'); + const searchTerm = searchInput.val(); + + // Remove existing highlights + content.find('mark').each(function() { + const text = $(this).text(); + $(this).replaceWith(text); + }); + + // Highlight all occurrences + element.html(highlightText(element.text(), searchTerm)); + + // Scroll to element + $('html, body').animate({ + scrollTop: element.offset().top - 50 + }, 500); + + // Set focus to the highlighted element + element.attr('tabindex', '-1').focus(); + } + }); + + // Keyboard navigation for search results + searchResults.on('keydown', 'li', function(e) { + const current = $(this); + let target; + + switch(e.which) { + case 38: // Up arrow + target = current.prev(); + break; + case 40: // Down arrow + target = current.next(); + break; + default: return; + } + + if (target.length > 0) { + current.attr('tabindex', '-1'); + target.attr('tabindex', '0').focus(); + } + + e.preventDefault(); + }); + + console.log(`Search ${SEARCH_VERSION} initialization complete`); +}); diff --git a/docs/content/vtu_2bin.org b/docs/content/vtu_2bin.org new file mode 100644 index 0000000..8b767d9 --- /dev/null +++ b/docs/content/vtu_2bin.org @@ -0,0 +1,103 @@ +#+SETUPFILE: ../org-themes/theme-readtheorg.setup +#+OPTIONS: ^:nil + +#+INCLUDE: "./header.org" + + + +* Data Format +To use flowVC, you'll need to supply velocity data in binary format. The velocity data typically requires separate files for the velocity field at each time point. A single (Cartesian) or multiple (Unstructured) files define the mesh. These files all share a common prefix, which can be any name you choose and is referred to here as InFilePrefix. + + +** Velocity +If the velocity is defined discretely in time, each time instant should have its own separate file. The velocity data must be equally spaced in time. File names should follow the format InFilePrefix_vel.#.bin, where # is a unique index for each time instant. The difference between successive file time points must be consistent + +Each file's content should begin with a time stamp, followed by the velocity vectors at each node. + +\begin{equation} +t_s \; \underbrace{u_0\; v_0\; w_0}_{\text{node 0}} \underbrace{u_1\; v_1 \; w_1}_{\text{node 1}} ....\; \underbrace{u_{n-1} \; v_{n-1}\; w_{n-1}}_{\text{node n-1}} +\end{equation} + +- Cartesian Data: the order should loop over the x-direction in the innermost loop, followed by y, and then z in the outer loop. +- Unstructured Data: The ordering must align with the nodes specified in the InFilePrefix coordinates.#.bin file. +- 2D Data: you must still specify a third velocity component, $w_i$, which can be set to 0.0. +#+ATTR_HTML: :width 100% +| Value | Data Type | +|-------+-----------| +| t | double | +| u,v,w | double | + + + +** Cartesian Mesh +To define a cartesian mesh, the mesh bounds and resolution needs to be defined. + + \begin{equation} + x_{min} \;\; x_{max} \;\; x_{res} \;\; y_{min} \;\; y_{max}\;\; y_{res} \;\; z_{min} \;\; z_{max} \; \; z_{res} + \end{equation} + +- Resolution: Number of *nodes* in each direction (not intervals) +- 2D: Set $z_{min} = z_{max} = 0.0$ and $z_{res}=1$ +#+Latex: \hfill +#+ATTR_HTML: :width 100% +| | | +| Value | Type | +|---------+--------| +| min/max | double | +| res | int | + +** Unstructured Mesh +The unstructured mesh is defined by three files: +- Coordinates File : InFilePrefix_coordinates.bin +- Connectivity File: InFilePrefix_connectivity.bin +- Adjacency File: InFilePrefix_adjacency.bin + +*** Cordinates File +\begin{equation} +n \; \underbrace{x_0\; y_0\; z_0}_{\text{node 0}} \underbrace{x_1\; y_1 \; z_1}_{\text{node 1}} ....\; \underbrace{x_{n-1} \; y_{n-1}\; z_{n-1}}_{\text{node n-1}} +\end{equation} + +- n: The the number of points in the data set +- $x_i \; y_i \; z_i$: The cordinates of each node +- 2D: set $z_i = 0$ + + +#+ATTR_HTML: :width 100% +| Value | Data Type | +|---------------------+-----------| +| n | int | +| $x_i \; y_i \; z_i$ | double | +*** Connectivity +The connectivity specifies the indices of the 4 nodes that make up each element. The index of each node is based on coordinates file ordering counting from 0. + + \begin{equation} + e\; \underbrace{i_0^0\; i_0^1\; i_0^2\; i_0^3}_{\text{element 0}} \underbrace{i_1^0\; i_1^1\; i_1^2\; i_1^3}_{\text{element 1}} ... \underbrace{i_{e-1}^0\; i_{e-1}^1\; i_{e-1}^2\; i_{e-1}^3}_{\text{element e-1}} + \end{equation} + + - e: The number of elements in the data set + - $i_i^j$: The index of the j'th node making i'th element in the dataset + - 2D: $n_i^3 = -1$ + + #+ATTR_HTML: :width 100% +| Value | Data Type | +|---------+-----------| +| e | int | +| $i_i^j$ | int | + + +*** Adjacency +The adjacency file contains the indices of the adacent elements that share a face with the current element. The index of each element is based on the order of the connectivity file. + + \begin{equation} + e\; \underbrace{e_0^0\; e_0^1\; e_0^2\; e_0^3}_{\text{element 0}} \underbrace{e_1^0\; e_1^1\; e_1^2\; e_1^3}_{\text{element 1}} ... \underbrace{e_{e-1}^0\; e_{e-1}^1\; e_{e-1}^2\; e_{e-1}^3}_{\text{element e-1}} + \end{equation} + + - Boundary Elements: For faces not shared with other elements set $e=-1$ + - 2D: $e_i^3=-1$ + - Ordering: +**** Data Type +e(int): The number of elements in the data set +$e_i^j$ (int): The index of the element that shares the j'th face for the ith element in the dataset. Note if the element face is not shared with another element (i.e. on the edge this is a -1) + + + diff --git a/docs/org-themes/theme-readtheorg.setup b/docs/org-themes/theme-readtheorg.setup new file mode 100644 index 0000000..964acb0 --- /dev/null +++ b/docs/org-themes/theme-readtheorg.setup @@ -0,0 +1,30 @@ +# -*- mode: org; -*- + +#+OPTIONS: html-style:nil +#+HTML_HEAD: +#+HTML_HEAD: + +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: + + +#+MACRO: enable-search #+HTML_HEAD: +#+MACRO: disable-search #+HTML_HEAD: +#+MACRO: set-search-limit #+HTML_HEAD: + +* Search Configuration (v1.12) :noexport: + +Usage: Optionally place these macros after including this file, before your content. + +- {{{enable-search}}} :: Enable search bar (default) +- {{{disable-search}}} :: Disable search bar +- {{{set-search-limit(N)}}} :: Limit results to N (default: 0 for no limit) + +Example: + +#+begin_src org +{{{enable-search}}} +{{{set-search-limit(10)}}} +#+end_src diff --git a/examples/inputfile.in b/examples/inputfile.in new file mode 100644 index 0000000..abd3807 --- /dev/null +++ b/examples/inputfile.in @@ -0,0 +1,345 @@ +################################# flowVC INPUT FILE ##################################### +# +# NOTE: Order of parameters listed must be maintained for proper parsing of input file +# Comment lines begin with #, comments can be added or removed as desired +# Comments cannot occur on lines containing variable declartations +# Standard format: VARIABLE_NAME = VALUE +# +####################################################################################### + +# Path_Data: String, Directory containing data files, e.g. velocity data, etc. +# Can be set to pwd (i.e. present working directory) +Path_Data = ../bin/ + +# Path_Output: String, Directory where output files will be written +# Can be set to pwd (i.e. present working directory) +Path_Output = ../output/ + +# Dimensions: Integer, Specifies if velocity data is 2D or 3D +Dimensions = 2 + +# Data_MeshType: Integer, Specifies mesh type of velocity data +# 0: Cartesian +# You will need files Data_InFilePrefix_vel.*.bin and Data_InFilePrefix_Cartesian.bin +# 1: Unstructured (tetrahedral for 3D and triangular for 2D) +# You will need files Data_InFilePrefix_vel.*.bin and Data_InFilePrefix_coordinates.bin, +# Data_InFilePrefix_connectivity.bin and Data_InFilePrefix_adjacency.bin +Data_MeshType = 0 + +# Data_InFilePrefix: String, common prefix for input velocity files (see minimum files needed above) +Data_InFilePrefix = dg + +# Data_SuffixTMin: Integer, number appended to the name of first velocity data file +# Assumes naming convention of Data_InFilePrefix_vel.N.bin, where Data_InFilePrefix is +# specified above and N varies from Data_SuffixTMin to (Data_SuffixTMin + Data_SuffixTDelta * Data_SuffixTRes) +Data_SuffixTMin = 0 + +# Data_SuffixTDelta: Integer, Increment between successive velocity data files +Data_SuffixTDelta = 1 + +# Data_SuffixTRes: Integer, number of velocity data files +Data_TRes = 51 + +# Data_TDelta: (Positive) Float, actual time spacing between successive velocity data files +# Assumes time spacing between velocity data files is constant +Data_TDelta = 0.02 + +# Data_TMin: Float, actual time assigned to first velocity data file +# Choice is arbitrary, but it usually makes sense to set this to 0.0, which would +# imply that the first velocity data file specifies the velocity at time 0.0 +Data_TMin = 0.0 + +# Data_TPeriodic: Binary flag, Specifies if data is periodic in time +# 0: Not periodic +# 1: Periodic (make sure first and last data file correspond to same point in cycle) +Data_TPeriodic = 1 + +# Data_XPeriodic: Binary flag, Specifies if data is periodic in space +# 0: Not periodic +# 1: Periodic +Data_XPeriodic = 0 + +# Data_MeshBounds.XMin, ..., Data_MeshBounds.ZMax: Specifies bounding box of velocity data +# Setting these bounds LARGER than the actual velocity domain will NOT affect the results +# Setting these bounds SMALLER than the actual velocity domain WILL limit the velocity data considered +Data_MeshBounds.XMin = 0.0 +Data_MeshBounds.XMax = 2.0 +Data_MeshBounds.YMin = 0.0 +Data_MeshBounds.YMax = 1.0 +Data_MeshBounds.ZMin = 0.0 +Data_MeshBounds.ZMax = 0.0 + +# Fluid_Density: Float, specifies fluid density (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Density = 1.0 + +# Fluid_Viscosity: Float, specifies fluid viscosity (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Viscosity = 1.0 + +# Output_TStart: Float, initial time to start simulation and begin writing output +# If FTLE_Compute = 1: Specifies time at which first FTLE field is computed AND output +# If Trace_Compute = 1: Specifies start time to begin computing tracer trajectories AND outputting positions to file +Output_TStart = 0.0 + +# Output_TRes: (Positive) Integer, Number of output times +# If FTLE_Compute: Specifies number of time instances when the FTLE field will be computed AND output +# If Trace_Compute: Specifies number of time instances that tracer positions will be output to file +Output_TRes = 11 + +# Output_TDelta: (Positive) Float, Time between successive output +# If FTLE_Compute: How often the FTLE field will be computed AND output +# If Trace_Compute: How often the tracer positions will be output to file +Output_TDelta = 0.1 + +# Int_Type: Integer, specified integration routine used +# 0: Euler +# 1: 4th order Runge Kutta +# 2: Runge Kutta Fehlberg (adaptive time stepping) +Int_Type = 1 + +# Int_TimeStep: (Positive) Float, Time step used for integration Euler or RK4 routines (i.e. Int_Type = 0 or 1) +# Valid only for Int_Type = 0 or 1 +Int_TimeStep = 0.001 + +# Int_Accuracy: (Positive) Float, Absolute error tolorance (between RK4 and RK5) +# Valid only for Int_Type = 2 +Int_Accuracy = 0.001 + +# Int_MinTimeStep: (Positive) Float, Minimum allowable time step used in RKF routine +# Once this time step is reached, RK4 approximation automatically accepted +# Valid only for Int_Type = 2 +Int_MinTimeStep = 0.00001 + +# Int_MaxTimeStep: (Positive) Float, Maximum allowable time step used in RKF routine +# Time step will not be increased beyond this limit even if error between RK4 and RK5 is less than Int_Accuracy +# Valid only for Int_Type = 2 +Int_MaxTimeStep = 0.1 + +# Int_TimeDirection: Integer, Should be set to 1 or -1 +# 1: Advect particles forward in time +# -1: Advect particles backward in time (used to compute backward time FTLE field) +Int_TimeDirection = 1 + +# Int_NormalFlow: Binary flag +# 0: Do not impose inward flow on no-slip boundaries +# 1: Replace no-slip condition on boundaries with inward velocity (magnitude specified by NormalFlowScaling below) +# Requires the file Data_InFilePrefix_normals.bin generated from program GetNormals.exe +# Currently valid only for Data_MeshType = 1 +Int_NormalFlow = 0 + +# Int_NormalFlowScaling: Float, Scaling for inward pointing boundary velocity (to prevent tracers from crossing +# no-slip boundaries), Need to set the number negative if file contains outward normals +# Valid only for Data_MeshType = 1, Int_NormalFlow = 1 +Int_NormalFlowScaling = 1.0 + +# Int_Extrapolate: Integer, allows particles to be integrated outside of domain of data by extrapolation of data set +# 0: End integration once particle leaves domain (or subset defined by Data_MeshBounds above). +# Computes FTLE for such points (and neighbors) early. +# 1: Extrapolate velocity outside domain by continuing particle with exit velocity (usually better than below) +# 2: Linear extrapolation of entire data set (NOT recommended unless you know what you're doing) +Int_Extrapolate = 0 + +# Particle_Radius: Float, Radius of all things treated as Lagrangian points +# Set to zero if you want points to behave as perfect tracers (recommended unless you know what you're doing) +Particle_Radius = 0.0 + +# Particle_Density: Float, Mass density of all things treated as Lagrangian points +# Respectively, set =, >, or < fluid density for neutrally buoyant, aerosols, or bubbles +# Only valid if Particle_Radius > 0 +Particle_Density = 1.0 + +# Particle_ICType: Int, Specified type of initial condition assigned to particles +# 0: Start particles from rest +# 1: Start particles with velocity equal to fluid velocity at particle release location (recommended) +# Valid only if Particle_Radius > 0 +Particle_ICType = 1 + +# Gravity_Vector[i]: Floats, Specifies components of gravity vector (use consistent units) +# Valid only if Particle_Radius > 0 +Gravity_Vector[0] = 0.0 +Gravity_Vector[1] = 0.0 +Gravity_Vector[2] = 0.0 + +# Local_Search_Checking: Binary flag +# 0: Only use local search protocol to determine elements containing initial location of points +# where velocity will need to be interpolated (recommended) +# 1: Use global search to check failures of local search protocol (safest, but can be painfully slow +# if you're not careful) +# Valid only if Data_MeshType = 1 +LocalSearchChecking = 0 + +# FTLE_Compute: Binary flag +# 0: Do not compute FTLE fields +# 1: Compute FTLE fields (Trace_Compute MUST be 0) +FTLE_Compute = 1 + +# FTLE_GenerateMesh: Binary flag +# 0: Read in FTLE mesh data from file FTLE_ICFile (this file created by running flowVC with FTLE_GenerateMesh = 1) +# 1: Generate a Cartesian mesh over which FTLE will be computed (mesh parameters specified below, resulting data +# saved to file FTLE_ICFile) +# Valid only if FTLE_Compute = 1 +FTLE_GenerateMesh = 1 + +# FTLE_ICFile: String, Name of file storing FTLE mesh information +# If FTLE_GenerateMesh = 0, this file should be located in Path_Work directory +# If FTLE_GenerateMesh = 0, this file will be written to Path_Work directory +# Valid only if FTLE_Compute = 1 +FTLE_ICFile = dg_FTLEgrid + +# FTLE_MeshBounds.XMin, ..., FTLE_MeshBounds.ZRes: Specifies structured grid over which FTLE is computed +# Valid only if FTLE_Compute = 1 +FTLE_MeshBounds.XMin = 0.0 +FTLE_MeshBounds.XMax = 2.0 +FTLE_MeshBounds.YMin = 0.0 +FTLE_MeshBounds.YMax = 1.0 +FTLE_MeshBounds.ZMin = 0.0 +FTLE_MeshBounds.ZMax = 0.0 +FTLE_MeshBounds.XRes = 201 +FTLE_MeshBounds.YRes = 101 +FTLE_MeshBounds.ZRes = 1 + +# FTLE_IntTLength: (Positive) Float, Integration time used to compute FTLE +# Valid only if FTLE_Compute = 1 +FTLE_IntTLength = 1.0 + +# FTLE_ComputeVariation: Binary flag, Used to help determine appropriate integration time by ah hoc means +# 0: Compute FTLE at each output time with integration time set to FTLE_IntTimeLength (nominally, can be reduced when a tracer leaves early) +# 1: Compute variation of FTLE with integration time +# Output_TRes MUST be 1 if FTLE_ComputeVariation = 1 +# Valid only if FTLE_Compute = 1 +FTLE_ComputeVariation = 0 + +# FTLE_VariationOutFreq: (Positive) Integer, controls how often FTLE is output when computing variation of FTLE with +# integration time +# If set to 1, output is generated at every time instance that velocity data is defined, if set to, e.g., 5, then output +# is generated at 1/5 of that rate (i.e. every 5 velocity data frames) +# Valid only if FTLE_ComputeVariation = 1 +FTLE_VariationOutFreq = 1 + +# FTLE_OutFilePrefix: String, Filename prefix where FTLE output data is written +# A separate file is generated for each output time (e.g. dg_forFTLE.0.bin, ..., dg_forFTLE.10.bin if Output_TRes = 11) +# NOTE: Two types of output files are generated, one set with the 1/T scaling in the definition of FTLE (*_noT.bin files), and ones with the scaling +# Valid only if FTLE_Compute = 1 +FTLE_OutFilePrefix = dg_forwardFTLE + + +# Trace_Compute: Binary flag +# 0: Do not compute tracer trajectories +# 1: Compute tracer trajectories (FTLE_Compute MUST be 0) +Trace_Compute = 0 + +Trace_ReleaseStrategy = 0 +Trace_ReleaseTMax = 0.000755 + + +# Trace_GenerateMesh: Binary Flag +# 0: Read in tracer initial positions from a file (specified by Trace_InFile) +# 1: Generate a Cartesian grid of tracers to integrate (mesh parameters specified below) +# Valid only if Trace_Compute = 1 +Trace_GenerateMesh = 1 + +# Trace_InFile: String, Name of File containing tracer initial positions +# Valid only if Trace_Compute = 1 and Trace_GenerateMesh = 0 +Trace_InFile = tracer_grid.bin + +# Trace_MultipleInFiles: Binary Flag +# 0: Default +# 1: Tracer initial conditions change over time and are specified by multiple files +Trace_MultipleInFiles = 0 + +# Trace_InFileFormat: Integer, specifies format of Trace_InFile +# 0: Use this if you want to reuse the .IC file that is generated from flowVC (use with care) +# 1: ASCII file, first line lists the number of tracers and subsequent lines list the x,y,z coordinates +# 2: ASCII legacy VTK polydata mesh format +# 3: ASCII legacy VTK unstructured mesh format +# 4: Binary file, first entry (int) lists the number of tracers and subsequent entries (doubles) list the x,y,z coordinates (binary version of format 1) +# Valid only if Compute_Tracers = 1 and Trace_GenerateMesh = 0 +Trace_InFileFormat = 4 + +# Trace_OutFile: String, Prefix for files where tracer position data will be written +# Tracer positions written to separate files for each output time +# Valid only if Trace_Compute = 1 +Trace_OutFilePrefix = dg_tracer-positions + +# Trace_NumLaunchTimes: (Positive) Integer, Number of times to release tracers from initial positions +# If Trace_MultipleInFiles = 1, then this should be number of files +# Valid only if Trace_Compute = 1 +Trace_NumLaunchTimes = 1 + +# Trace_LaunchTimeSpacing: (Positive) Float, Time between successive release of tracers from initial positions +# Valid only if Trace_Compute = 1 and Trace_NumLaunchTimes > 1 +Trace_LaunchTimeSpacing = 0.1 + +# Trace_IntTLength: (Positive) Float, Can be used to limit amount of time any tracer will be integrated +# Recommended to set this to some value larger than (Output_TRes x Output_TDelta) unless you know what you're doing +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_IntTLength = 100 + +# Trace_AlwaysOutput: Binary Flag +# 0: Do not write out tracer position to file once it has left the domain +# 1: Always write out tracer position to file, even if it left the domain +# Valid only if Trace_Compute = 1 +Trace_AlwaysOutput = 0 + +# Trace_CartMesh.XMin, ..., Trace_CartMesh.ZRes: Specifies Cartesian mesh of tracers to be intergrated +# Valid only if Trace_Compute = 1 AND Trace_GenerateMesh = 1 +Trace_CartMesh.XMin = 0.0 +Trace_CartMesh.XMax = 2.0 +Trace_CartMesh.YMin = 0.0 +Trace_CartMesh.YMax = 0.1 +Trace_CartMesh.ZMin = 0.0 +Trace_CartMesh.ZMax = 0.0 +Trace_CartMesh.XRes = 201 +Trace_CartMesh.YRes = 101 +Trace_CartMesh.ZRes = 1 + +# TODO Fill in this documentation +# These are required but their functionality is not +Trace_VorticityCompute = 0 +Trace_APCompute = 0 +Trace_CETCompute = 0 +Trace_CETAuxillaryMesh = 0 +Trace_CETMeshPrefix = specified +Trace_CETSubsteps = 0 +Trace_RTCompute = 0 +Trace_RTOutFilePrefix = dg_tracer-rt + +# VelOut_Compute: Binary flag, Used to generate interpolated velocity fields +# 0: Do not generate interpolated velocity fields +# 1: Generate interploated velocity fields +VelOut_Compute = 0 + +# VelOut_GenerateMesh: Binary flag +# 0: Read interpolation locations from file specified by VelOut_InFile +# 1: Generate a Cartesian mesh of positions where velocity will be interpolated (mesh parameters specified below) +# Valid only for VelOut_Compute = 1 +VelOut_GenerateMesh = 1 + +# VelOut_InFile: String, filename containing locations of points for interpolation +# Valid only for VelOut_Compute = 1 and VelOut_GenerateMesh = 0 +VelOut_InFile = interpolation-positions.vtk + +# VelOut_InFileFormat, Integer, specified format of VelOut_InFile +# 1: ASCII file, first line lists the number of locations and subsequent lines list the coordinates +# 3: ASCII legacy VTK polydata mesh format (as output from Paraview) +# 4: ASCII legacy VTK unstructured mesh format (as output from Paraview) +# Valid only if VelOut_Compute = 1 AND VelOut_GenerateMesh = 0 +VelOut_InFileFormat = 1 + +# VelOut_FilePrefix: String, Filename prefix for files that interpolated velocity is data is written to +# Velocity output written to separate files, one per output time +# Valid only if VelOut_Compute = 1 +VelOut_FilePrefix = dg-interpolated + +# VelOut_CartMesh.XMin, ..., VelOut_CartMesh.ZRes: Specifies Cartesian mesh of interpolation positions +# Valid only if VelOut_Compute = 1 +VelOut_CartMesh.XMin = 0.0 +VelOut_CartMesh.XMax = 2.0 +VelOut_CartMesh.YMin = 0.0 +VelOut_CartMesh.YMax = 1.0 +VelOut_CartMesh.ZMin = 0.0 +VelOut_CartMesh.ZMax = 0.0 +VelOut_CartMesh.XRes = 21 +VelOut_CartMesh.YRes = 11 +VelOut_CartMesh.ZRes = 1 From 1d4d9832fc0a5d846ab5c48a8b7e63c0fd93d7b1 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Mon, 10 Feb 2025 23:14:00 -0700 Subject: [PATCH 39/68] build: create a build.yml for macos, linux and windows --- .github/workflows/build.yml | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..0f0450f --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,38 @@ +--- +name: Build Project + +on: + workflow_call: + push: + branches: + - windows_build +jobs: + build: + + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows_latest, macos-latest] + + steps: + - uses: actions/checkout@v2 + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.0' + - name: Install Ceedling + run: gem install ceedling + + - name: Build release + run: ceedling release + + - name: Rename build binary + shell: pwsh + run: Move-Item -Path build/release/flowVC.out -Destination build/release/${{ runner.os}}.flowVC.out + + - name: Upload Build Artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ runner.os }}.flowVC.out + path: build/release/${{ runner.os}}.flowVC.out + overwrite: true From bbfc4380cd92add1bd5c5200f1df61912eda557a Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Mon, 10 Feb 2025 23:17:51 -0700 Subject: [PATCH 40/68] build: fix typo in requesting windows runner --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0f0450f..f813a2a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, windows_latest, macos-latest] + os: [ubuntu-latest, windows-latest, macos-latest] steps: - uses: actions/checkout@v2 From 78dd75639d70021c392e5e55f62c09bc1bcf9fb5 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Mon, 10 Feb 2025 23:50:25 -0700 Subject: [PATCH 41/68] build: update build to run using make --- .github/workflows/build.yml | 7 +++-- makefile | 61 +++++-------------------------------- 2 files changed, 12 insertions(+), 56 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f813a2a..b10434a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,8 +23,11 @@ jobs: - name: Install Ceedling run: gem install ceedling - - name: Build release - run: ceedling release + - name: Run Tests + run: ceedling test + + - name: Build + run: make - name: Rename build binary shell: pwsh diff --git a/makefile b/makefile index e41abfd..17dafe2 100644 --- a/makefile +++ b/makefile @@ -14,18 +14,15 @@ else endif .PHONY: clean -.PHONY: test .PHONY: all -PATHU = unity/src/ PATHS = src/ PATHT = test/ -PATHB = build/ -PATHD = build/depends/ -PATHO = build/objs/ -PATHR = build/results/ +PATHB = build/release/ +PATHD = build/release/dependencies/ +PATHO = build/release/out/ -BUILD_PATHS = $(PATHB) $(PATHD) $(PATHO) $(PATHR) +BUILD_PATHS = $(PATHB) $(PATHD) $(PATHO) SRCT = $(wildcard $(PATHT)*.c) @@ -36,10 +33,10 @@ LFLAG= -lm # Set build mode ifeq ($(mode),debug) - CFLAGS = -g -Wall -O0 -I. -I$(PATHU) -I$(PATHS) -DTEST -DUNITY_INCLUDE_CONFIG_H -DDEBUG_LEVEL=1 + CFLAGS = -g -Wall -O0 -I. -I$(PATHS) -DDEBUG_LEVEL=1 else mode = release - CFLAGS = -Wall -O3 -I. -I$(PATHU) -I$(PATHS) -DTEST -DUNITY_INCLUDE_CONFIG_H + CFLAGS = -Wall -O3 -I. -I$(PATHS) endif @@ -74,44 +71,6 @@ $(PATHO)%.o: $(PATHS)%.c $(COMPILE) $(CFLAGS) $< -o $@ - - -############################ Testing ####################################### -############################################################################ - -RESULTS = $(patsubst $(PATHT)Test%.c,$(PATHR)Test%.txt,$(SRCT) ) - -PASSED = `grep -s PASS $(PATHR)*.txt` -FAIL = `grep -s FAIL $(PATHR)*.txt` -IGNORE = `grep -s IGNORE $(PATHR)*.txt` - -test: $(BUILD_PATHS) $(RESULTS) - @echo "-----------------------\nIGNORES:\n-----------------------" - @echo "$(IGNORE)" - @echo "-----------------------\nFAILURES:\n-----------------------" - @echo "$(FAIL)" - @echo "-----------------------\nPASSED:\n-----------------------" - @echo "$(PASSED)" - @echo "\nDONE" - -$(PATHR)%.txt: $(PATHB)%.$(TARGET_EXTENSION) - -./$< > $@ 2>&1 - -$(PATHB)Test%.$(TARGET_EXTENSION): $(PATHO)Test%.o $(PATHO)%.o $(PATHO)unity.o build/objs/io.o - $(LINK) -o $@ $^ $(LFLAG) - -$(PATHO)%.o:: $(PATHT)%.c - $(COMPILE) $(CFLAGS) $< -o $@ - -$(PATHO)%.o:: $(PATHS)%.c - $(COMPILE) $(CFLAGS) $< -o $@ - -$(PATHO)%.o:: $(PATHU)%.c $(PATHU)%.h - $(COMPILE) $(CFLAGS) $< -o $@ - -$(PATHD)%.d:: $(PATHT)%.c - $(DEPEND) $@ $< - $(PATHB): $(MKDIR) $(PATHB) @@ -121,19 +80,13 @@ $(PATHD): $(PATHO): $(MKDIR) $(PATHO) -$(PATHR): - $(MKDIR) $(PATHR) - - clean: $(CLEANUP) $(PATHO)*.o $(CLEANUP) $(PATHB)*.$(TARGET_EXTENSION) - $(CLEANUP) $(PATHR)*.txt -.PRECIOUS: $(PATHB)Test%.$(TARGET_EXTENSION) .PRECIOUS: $(PATHD)%.d .PRECIOUS: $(PATHO)%.o -.PRECIOUS: $(PATHR)%.txt + From f001d520ec23b189d8c1bfa1734abe12a4d351b5 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 00:17:22 -0700 Subject: [PATCH 42/68] fix: update ReMapPt function call correcting pointer type for MP#.X --- src/integration.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/integration.c b/src/integration.c index 34d1264..d7165d4 100644 --- a/src/integration.c +++ b/src/integration.c @@ -517,21 +517,21 @@ double RK4(LagrangianPoint *pt, double tstart, double tend) { MP2.X[0] = pt->X[0] + 0.5 * k1[0] * h; MP2.X[1] = pt->X[1] + 0.5 * k1[1] * h; MP2.X[2] = pt->X[2] + 0.5 * k1[2] * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP2, &MP2.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP2, MP2.X); GetVelocity(tc + h/2, &MP2, k2); /* k3 */ MP3.X[0] = pt->X[0] + 0.5 * k2[0] * h; MP3.X[1] = pt->X[1] + 0.5 * k2[1] * h; MP3.X[2] = pt->X[2] + 0.5 * k2[2] * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP3, &MP3.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP3, MP3.X); GetVelocity(tc + h/2, &MP3, k3); /* k4 */ MP4.X[0] = pt->X[0] + k3[0] * h; MP4.X[1] = pt->X[1] + k3[1] * h; MP4.X[2] = pt->X[2] + k3[2] * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP4, &MP4.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP4, MP4.X); GetVelocity(tc + h, &MP4, k4); /* Update position, time, and (if needed) element index */ @@ -686,7 +686,7 @@ double RKF(LagrangianPoint *pt, double tstart, double tend) { MP2.X[0] = pt->X[0] + 0.25 * k1[0] * h; MP2.X[1] = pt->X[1] + 0.25 * k1[1] * h; MP2.X[2] = pt->X[2] + 0.25 * k1[2] * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP2, &MP2.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP2, MP2.X); ts = tc + 0.25 * h; GetVelocity(ts, &MP2, k2); @@ -694,7 +694,7 @@ double RKF(LagrangianPoint *pt, double tstart, double tend) { MP3.X[0] = pt->X[0] + (a3 * k1[0] + b3 * k2[0]) * h; MP3.X[1] = pt->X[1] + (a3 * k1[1] + b3 * k2[1]) * h; MP3.X[2] = pt->X[2] + (a3 * k1[2] + b3 * k2[2]) * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP3, &MP3.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP3, MP3.X); ts = tc + 0.375 * h; GetVelocity(ts, &MP3, k3); @@ -702,7 +702,7 @@ double RKF(LagrangianPoint *pt, double tstart, double tend) { MP4.X[0] = pt->X[0] + (a4 * k1[0] + b4 * k2[0] + c4 * k3[0]) * h; MP4.X[1] = pt->X[1] + (a4 * k1[1] + b4 * k2[1] + c4 * k3[1]) * h; MP4.X[2] = pt->X[2] + (a4 * k1[2] + b4 * k2[2] + c4 * k3[2]) * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP4, &MP4.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP4, MP4.X); ts = tc + (12.0 * h) / 13.0; GetVelocity(ts, &MP4, k4); @@ -710,7 +710,7 @@ double RKF(LagrangianPoint *pt, double tstart, double tend) { MP5.X[0] = pt->X[0] + (a5 * k1[0] + b5 * k2[0] + c5 * k3[0] + d5 * k4[0]) * h; MP5.X[1] = pt->X[1] + (a5 * k1[1] + b5 * k2[1] + c5 * k3[1] + d5 * k4[1]) * h; MP5.X[2] = pt->X[2] + (a5 * k1[2] + b5 * k2[2] + c5 * k3[2] + d5 * k4[2]) * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP5, &MP5.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP5, MP5.X); ts = tc + h; GetVelocity(ts, &MP5, k5); @@ -718,7 +718,7 @@ double RKF(LagrangianPoint *pt, double tstart, double tend) { MP6.X[0] = pt->X[0] + (a6 * k1[0] + b6 * k2[0] + c6 * k3[0] + d6 * k4[0] + e6 * k5[0]) * h; MP6.X[1] = pt->X[1] + (a6 * k1[1] + b6 * k2[1] + c6 * k3[1] + d6 * k4[1] + e6 * k5[1]) * h; MP6.X[2] = pt->X[2] + (a6 * k1[2] + b6 * k2[2] + c6 * k3[2] + d6 * k4[2] + e6 * k5[2]) * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP6, &MP6.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP6, MP6.X); ts = tc + 0.5 * h; GetVelocity(ts, &MP6, k6); From cbaaae517d08758ea37d11c20c8122ef9af50660 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 00:22:51 -0700 Subject: [PATCH 43/68] build: revert to ceedling for building release. --- .github/workflows/build.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b10434a..acc5742 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,10 +24,9 @@ jobs: run: gem install ceedling - name: Run Tests - run: ceedling test + run: ceedling release + - - name: Build - run: make - name: Rename build binary shell: pwsh From e8a4b5036255c73ec8a2beb76c278a7054bd616a Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 00:38:13 -0700 Subject: [PATCH 44/68] build: handle output extension difference between windows and unix --- .github/workflows/build.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index acc5742..28a5856 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,6 +14,9 @@ jobs: matrix: os: [ubuntu-latest, windows-latest, macos-latest] + name: Set output file extension + run: echo "OUTPUT_EXTENSION=$(if [ ${{ runner.os }} == 'Windows' ]; then echo 'exe'; else echo 'out'; fi)" >> $GITHUB_ENV + steps: - uses: actions/checkout@v2 - name: Setup Ruby @@ -27,14 +30,13 @@ jobs: run: ceedling release - - name: Rename build binary shell: pwsh - run: Move-Item -Path build/release/flowVC.out -Destination build/release/${{ runner.os}}.flowVC.out + run: Move-Item -Path build/release/flowVC.out -Destination build/release/${{ runner.os}}.flowVC.$OUTPUT_EXTENSION - name: Upload Build Artifact uses: actions/upload-artifact@v4 with: - name: ${{ runner.os }}.flowVC.out - path: build/release/${{ runner.os}}.flowVC.out + name: ${{ runner.os }}.flowVC.$OUTPUT_EXTENSION + path: build/release/${{ runner.os}}.flowVC.$OUTPUT_EXTENSION overwrite: true From 5f1d8e3f9d26b8dcbfb524f0d1435ca629d43f61 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 00:40:40 -0700 Subject: [PATCH 45/68] build: fix build yml location of handling output extension --- .github/workflows/build.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 28a5856..a3860e5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,8 +14,7 @@ jobs: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - name: Set output file extension - run: echo "OUTPUT_EXTENSION=$(if [ ${{ runner.os }} == 'Windows' ]; then echo 'exe'; else echo 'out'; fi)" >> $GITHUB_ENV + steps: - uses: actions/checkout@v2 @@ -23,6 +22,10 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: '3.0' + + - name: Set output file extension + run: echo "OUTPUT_EXTENSION=$(if [ ${{ runner.os }} == 'Windows' ]; then echo 'exe'; else echo 'out'; fi)" >> $GITHUB_ENV + - name: Install Ceedling run: gem install ceedling From 321cca4f8251b20f401479b0eaa6de7b6eac563f Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 01:02:59 -0700 Subject: [PATCH 46/68] build: try using matrix release_suffix to set executable extension --- .github/workflows/build.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a3860e5..22329b4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,8 +13,13 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - - + include: + - os: ubuntu-latest + release_suffix: out + - os: windows-latest + release_suffix: exe + - os: macos-latest + release_suffix: out steps: - uses: actions/checkout@v2 @@ -23,9 +28,6 @@ jobs: with: ruby-version: '3.0' - - name: Set output file extension - run: echo "OUTPUT_EXTENSION=$(if [ ${{ runner.os }} == 'Windows' ]; then echo 'exe'; else echo 'out'; fi)" >> $GITHUB_ENV - - name: Install Ceedling run: gem install ceedling @@ -35,11 +37,11 @@ jobs: - name: Rename build binary shell: pwsh - run: Move-Item -Path build/release/flowVC.out -Destination build/release/${{ runner.os}}.flowVC.$OUTPUT_EXTENSION + run: Move-Item -Path build/release/flowVC.out -Destination build/release/${{ runner.os}}.flowVC.{{ matrix.release_suffix}} - name: Upload Build Artifact uses: actions/upload-artifact@v4 with: - name: ${{ runner.os }}.flowVC.$OUTPUT_EXTENSION - path: build/release/${{ runner.os}}.flowVC.$OUTPUT_EXTENSION + name: ${{ runner.os }}.flowVC.{{ matrix.release_suffix}} + path: build/release/${{ runner.os}}.flowVC.{{ matrix.release_suffix}} overwrite: true From 30de589cfe63e37cd6c38e4660453fdd7360bc48 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 01:09:32 -0700 Subject: [PATCH 47/68] build: fix missing $ bug in build.yml --- .github/workflows/build.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 22329b4..12ee676 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,8 +8,8 @@ on: - windows_build jobs: build: - - runs-on: ${{ matrix.os }} + name: Build Release + strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] @@ -20,9 +20,12 @@ jobs: release_suffix: exe - os: macos-latest release_suffix: out - + runs-on: ${{ matrix.os }} + steps: + - name: Checkout Code - uses: actions/checkout@v2 + - name: Setup Ruby uses: ruby/setup-ruby@v1 with: @@ -31,17 +34,17 @@ jobs: - name: Install Ceedling run: gem install ceedling - - name: Run Tests + - name: Build Release run: ceedling release - name: Rename build binary shell: pwsh - run: Move-Item -Path build/release/flowVC.out -Destination build/release/${{ runner.os}}.flowVC.{{ matrix.release_suffix}} + run: Move-Item -Path build/release/flowVC.out -Destination build/release/${{ runner.os}}.flowVC.${{ matrix.release_suffix}} - name: Upload Build Artifact uses: actions/upload-artifact@v4 with: - name: ${{ runner.os }}.flowVC.{{ matrix.release_suffix}} - path: build/release/${{ runner.os}}.flowVC.{{ matrix.release_suffix}} + name: ${{ runner.os }}.flowVC.${{ matrix.release_suffix}} + path: build/release/${{ runner.os}}.flowVC.${{ matrix.release_suffix}} overwrite: true From 6a2abd752ed72aa14d0a4d79e073c2067996d1ed Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 01:10:25 -0700 Subject: [PATCH 48/68] build: remove checkout code name --- .github/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 12ee676..c959779 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,7 +23,6 @@ jobs: runs-on: ${{ matrix.os }} steps: - - name: Checkout Code - uses: actions/checkout@v2 - name: Setup Ruby From 00a44aec4f954cd5ac18a8c272c77d3237616731 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 01:18:05 -0700 Subject: [PATCH 49/68] build: update build naming --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c959779..6faff72 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,11 +39,11 @@ jobs: - name: Rename build binary shell: pwsh - run: Move-Item -Path build/release/flowVC.out -Destination build/release/${{ runner.os}}.flowVC.${{ matrix.release_suffix}} + run: Move-Item -Path build/release/flowVC.out -Destination build/release/flowVC.${{ matrix.release_suffix}} - name: Upload Build Artifact uses: actions/upload-artifact@v4 with: - name: ${{ runner.os }}.flowVC.${{ matrix.release_suffix}} - path: build/release/${{ runner.os}}.flowVC.${{ matrix.release_suffix}} + name: flowVC_${{ runner.os }} + path: build/release/flowVC.${{ matrix.release_suffix}} overwrite: true From 55d6acd5749ee959dc5419e23e821c2587676641 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 02:10:42 -0700 Subject: [PATCH 50/68] build: update build system to include windows macos and linux builds --- .github/workflows/build.yml | 4 ++-- .github/workflows/cd.yml | 18 +++++------------- .releaserc.json | 2 +- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6faff72..aca3e88 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,9 +3,9 @@ name: Build Project on: workflow_call: - push: + pull_request: branches: - - windows_build + - main jobs: build: name: Build Release diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 0a670c8..cd6ee0a 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -5,7 +5,7 @@ on: push: branches: - main - - alpha + jobs: semantic-release: @@ -27,19 +27,11 @@ jobs: with: node-version: "lts/*" - - name: Generate Release using Docker - run: | - docker run \ - --interactive \ - --rm \ - -u $(id -u):$(id -g) \ - --volume .:/home/dev/project \ - throwtheswitch/madsciencelab-plugins:1.0.0 \ - ceedling release + - name: Build Release + uses: ./.github/workflows/build.yml - - name: Prepare prerelease semantic - if: github.ref != 'refs/heads/main' - run: mv .releaserc.prerelease.json .releaserc.json + - name: Download Artifacts + uses: actions/download-artifact@v4 - name: Semantic Release uses: cycjimmy/semantic-release-action@v4 diff --git a/.releaserc.json b/.releaserc.json index 551f8a9..5eab74b 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -6,7 +6,7 @@ [ "@semantic-release/github", { - "assets": ["build/release/flowVC.out"] + "assets": ["flowVC_Linux", "flowVC_Windows", "flowVC_macOS"] } ], "@semantic-release/git" From 87240433966613580cb8fb68ab58da77c7c13097 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 02:29:54 -0700 Subject: [PATCH 51/68] build: debug using a local action --- .github/workflows/cd.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index cd6ee0a..ad7279d 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -8,6 +8,9 @@ on: jobs: + build-release: + uses: ./.github/workflows/build.yml + semantic-release: if: "!contains(github.event.head_commit.message, '[skip ci]')" @@ -27,8 +30,7 @@ jobs: with: node-version: "lts/*" - - name: Build Release - uses: ./.github/workflows/build.yml + - name: Download Artifacts uses: actions/download-artifact@v4 From 46aa400b59f605a231a8c0d57f36621a7ac20991 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 11 Feb 2025 09:32:08 +0000 Subject: [PATCH 52/68] chore(release): 0.0.5 [skip ci] ## [0.0.5](https://github.com/bkm82/flowVC/compare/v0.0.4...v0.0.5) (2025-02-11) ### Bug Fixes * update ReMapPt function call correcting pointer type for MP#.X ([f001d52](https://github.com/bkm82/flowVC/commit/f001d520ec23b189d8c1bfa1734abe12a4d351b5)) --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7182bfb..4d0e1c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [0.0.5](https://github.com/bkm82/flowVC/compare/v0.0.4...v0.0.5) (2025-02-11) + + +### Bug Fixes + +* update ReMapPt function call correcting pointer type for MP#.X ([f001d52](https://github.com/bkm82/flowVC/commit/f001d520ec23b189d8c1bfa1734abe12a4d351b5)) + ## [0.0.4](https://github.com/bkm82/flowVC/compare/v0.0.3...v0.0.4) (2025-02-08) From 78c053ed64b9c5e628d461977458da11b6f54e1d Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 02:53:50 -0700 Subject: [PATCH 53/68] build: update semantic version to need build --- .github/workflows/cd.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index ad7279d..e2e6da3 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -12,12 +12,14 @@ jobs: uses: ./.github/workflows/build.yml semantic-release: + needs: build-release: if: "!contains(github.event.head_commit.message, '[skip ci]')" name: Semantic Release runs-on: ubuntu-latest permissions: contents: write + steps: - name: Checkout From fee167fa6fe60b5c8337dd351bce69e61302d19d Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 03:00:47 -0700 Subject: [PATCH 54/68] fix: fix yaml formating --- .github/workflows/cd.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index e2e6da3..d928bf7 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -12,14 +12,13 @@ jobs: uses: ./.github/workflows/build.yml semantic-release: - needs: build-release: + needs: build-release if: "!contains(github.event.head_commit.message, '[skip ci]')" name: Semantic Release runs-on: ubuntu-latest permissions: contents: write - steps: - name: Checkout @@ -32,8 +31,6 @@ jobs: with: node-version: "lts/*" - - - name: Download Artifacts uses: actions/download-artifact@v4 From 91cdc9c6bf22ec591bc7d4bc030e9bbabb44d8d5 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 11 Feb 2025 10:06:12 +0000 Subject: [PATCH 55/68] chore(release): 0.0.6 [skip ci] ## [0.0.6](https://github.com/bkm82/flowVC/compare/v0.0.5...v0.0.6) (2025-02-11) ### Bug Fixes * fix yaml formating ([fee167f](https://github.com/bkm82/flowVC/commit/fee167fa6fe60b5c8337dd351bce69e61302d19d)) --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d0e1c6..fbfed01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [0.0.6](https://github.com/bkm82/flowVC/compare/v0.0.5...v0.0.6) (2025-02-11) + + +### Bug Fixes + +* fix yaml formating ([fee167f](https://github.com/bkm82/flowVC/commit/fee167fa6fe60b5c8337dd351bce69e61302d19d)) + ## [0.0.5](https://github.com/bkm82/flowVC/compare/v0.0.4...v0.0.5) (2025-02-11) From fe67c3c624b109c075165a3383cf1fd795105ba3 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 03:09:31 -0700 Subject: [PATCH 56/68] fix: Add OS identifier to build artifact names for uniqueness. --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aca3e88..d290853 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,11 +39,11 @@ jobs: - name: Rename build binary shell: pwsh - run: Move-Item -Path build/release/flowVC.out -Destination build/release/flowVC.${{ matrix.release_suffix}} + run: Move-Item -Path build/release/flowVC.out -Destination build/release/flowVC_${{ runner.os }}.${{ matrix.release_suffix}} - name: Upload Build Artifact uses: actions/upload-artifact@v4 with: name: flowVC_${{ runner.os }} - path: build/release/flowVC.${{ matrix.release_suffix}} + path: build/release/flowVC_${{ runner.os }}.${{ matrix.release_suffix}} overwrite: true From c5d9eff591191540f2cbb466bdf5fcdf0b2d15b7 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 11 Feb 2025 10:17:05 +0000 Subject: [PATCH 57/68] chore(release): 0.0.7 [skip ci] ## [0.0.7](https://github.com/bkm82/flowVC/compare/v0.0.6...v0.0.7) (2025-02-11) ### Bug Fixes * Add OS identifier to build artifact names for uniqueness. ([fe67c3c](https://github.com/bkm82/flowVC/commit/fe67c3c624b109c075165a3383cf1fd795105ba3)) --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fbfed01..35d8987 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [0.0.7](https://github.com/bkm82/flowVC/compare/v0.0.6...v0.0.7) (2025-02-11) + + +### Bug Fixes + +* Add OS identifier to build artifact names for uniqueness. ([fe67c3c](https://github.com/bkm82/flowVC/commit/fe67c3c624b109c075165a3383cf1fd795105ba3)) + ## [0.0.6](https://github.com/bkm82/flowVC/compare/v0.0.5...v0.0.6) (2025-02-11) From 018b5497bb22838771dcd59e1c5f800e68b547e6 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 03:41:38 -0700 Subject: [PATCH 58/68] docs: update readme to point users to pre-compiled binarys --- README.org | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/README.org b/README.org index 9dd52bf..04fc8fc 100644 --- a/README.org +++ b/README.org @@ -40,6 +40,14 @@ You cannot compute FTLE and particle trajectories at the same time. The feature ** Usage *** Quick Start +**** Download or Build the Latest Verison of flowVC + + #+begin_quote + [!Note] + Grab a pre-compiled binary for Windows Linux or macOS [[https://github.com/bkm82/flowVC/releases/latest][here]] + Alternatly build it from source as shown below + #+end_quote + **** Create the input data files #+begin_quote [!Note] @@ -58,17 +66,9 @@ You cannot compute FTLE and particle trajectories at the same time. The feature #+end_quote -**** Download or Build the Latest Verison - - #+begin_quote - [!Note] - For linux, get the pre-compiled binary [[https://github.com/bkm82/flowVC/releases/latest][here]] - For windos and mac, see below how to compile the code from source - #+end_quote - -**** Run the code +**** Run the code from the command line #+begin_src shell -./flowvc.out settings_file +./flowvc.out settings_file.in #+end_src **** Report any Issues @@ -77,7 +77,7 @@ You cannot compute FTLE and particle trajectories at the same time. The feature ** Installation *** Build From Source -If you are not on ubuntu, or you want to edit / modify the code, there are various ways to compile the code from source. +If you want to edit / modify the code, there are various ways to compile the code from source. **** Ceedling @@ -118,7 +118,10 @@ If you are not on ubuntu, or you want to edit / modify the code, there are vario **** Docker Alternatly, there is a docker image has the tooling installed. - + #+begin_quote + [!Warning] + The method shown here should work, but i havent tested it extensivly. + #+end_quote ***** Install [[https://docs.docker.com/engine/install/][Docker]] ***** Clone the repository @@ -148,11 +151,6 @@ Alternatly, there is a docker image has the tooling installed. #+end_src ***** This will create the ./build/release/flowVC.out executable. - #+begin_quote - [!Warning] - This method compiles the code using a linux (Ubuntu) docker container, if you you are on another operating system, you might need to run the program through that docker container - #+end_quote - #+begin_src shell docker run -it --rm -v .:/home/dev/project throwtheswitch/madsciencelab:latest .build/release/flowVC.out From 883681e8e3692cef17e50ab1ed2ffbe40b604b3a Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 03:42:38 -0700 Subject: [PATCH 59/68] docs: remove the completed plan to add windows to the CI/CD pipeline --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index 04fc8fc..75689e7 100644 --- a/README.org +++ b/README.org @@ -176,4 +176,4 @@ Valid types are fix, feat, BREAKING CHANGE, build, chore, ci, docs, style, refac *** Planned Updates -**** TODO Add support for windows in the CI/CD pipeline + From d0627e9aa33a1e50c305352880a66ac0ca2a77dc Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 20:07:46 -0700 Subject: [PATCH 60/68] ci: run tests on all operating systems --- .github/workflows/ci.yml | 53 +++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d4c6a1c..832ce97 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,30 +3,43 @@ name: CI on: # Manually triggered testing workflow_dispatch: + + # Called from another work flow + workflow_call: push: - # Check every PR to main - pull_request: - branches: - - main jobs: - docker-test: - runs-on: ubuntu-latest + build: + name: Run Tests + + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + include: + - os: ubuntu-latest + release_suffix: out + - os: windows-latest + release_suffix: exe + - os: macos-latest + release_suffix: out + runs-on: ${{ matrix.os }} + steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Run all Tests using Docker - run: | - docker run \ - --interactive \ - --rm \ - -u $(id -u):$(id -g) \ - --volume .:/home/dev/project \ - throwtheswitch/madsciencelab-plugins:1.0.0 \ - ceedling gcov:all - + - uses: actions/checkout@v2 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.0' + + - name: Install Ceedling + run: gem install ceedling + + - name: Run Tests + run: ceedling test:all + - name: Upload Coverage Report to Codecov uses: codecov/codecov-action@v5 + if: matrix.os == 'ubuntu-latest' with: - token: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file + token: ${{ secrets.CODECOV_TOKEN }} From a3768d2927fef7506e0efd09616c8e228d5217f6 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 20:11:20 -0700 Subject: [PATCH 61/68] ci: fix tests to run gcov --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 832ce97..7ae9e2e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,7 +36,7 @@ jobs: run: gem install ceedling - name: Run Tests - run: ceedling test:all + run: ceedling gcov:all - name: Upload Coverage Report to Codecov uses: codecov/codecov-action@v5 From 8ecd999d11d4bd1cfce29a2d879fd02aa88ec3b9 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 20:39:51 -0700 Subject: [PATCH 62/68] ci: fix yaml linting issues, run unit tests from cd --- .github/workflows/build.yml | 52 ++++++++++++++++++------------------- .github/workflows/cd.yml | 7 ++++- .github/workflows/ci.yml | 7 +++++ .github/workflows/docs.yml | 2 +- 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d290853..ed9efdf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,7 +9,7 @@ on: jobs: build: name: Build Release - + strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] @@ -21,29 +21,29 @@ jobs: - os: macos-latest release_suffix: out runs-on: ${{ matrix.os }} - + steps: - - uses: actions/checkout@v2 - - - name: Setup Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: '3.0' - - - name: Install Ceedling - run: gem install ceedling - - - name: Build Release - run: ceedling release - - - - name: Rename build binary - shell: pwsh - run: Move-Item -Path build/release/flowVC.out -Destination build/release/flowVC_${{ runner.os }}.${{ matrix.release_suffix}} - - - name: Upload Build Artifact - uses: actions/upload-artifact@v4 - with: - name: flowVC_${{ runner.os }} - path: build/release/flowVC_${{ runner.os }}.${{ matrix.release_suffix}} - overwrite: true + - uses: actions/checkout@v2 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.0' + + - name: Install Ceedling + run: gem install ceedling + + - name: Build Release + run: ceedling release + + + - name: Rename build binary + shell: pwsh + run: Move-Item -Path build/release/flowVC.out -Destination build/release/flowVC_${{ runner.os }}.${{ matrix.release_suffix}} + + - name: Upload Build Artifact + uses: actions/upload-artifact@v4 + with: + name: flowVC_${{ runner.os }} + path: build/release/flowVC_${{ runner.os }}.${{ matrix.release_suffix}} + overwrite: true diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index d928bf7..1d1ed4f 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -8,11 +8,16 @@ on: jobs: + + run-tests: + uses: ./.github/workflows/ci.yml + build-release: uses: ./.github/workflows/build.yml semantic-release: - needs: build-release + needs: [run-tests, build-release] + if: "!contains(github.event.head_commit.message, '[skip ci]')" name: Semantic Release diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ae9e2e..fdbd49b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,3 +1,4 @@ +--- name: CI on: @@ -6,7 +7,13 @@ on: # Called from another work flow workflow_call: + # + pull_request: + - main push: + # Called from CD, prevents duplicate running + branches-ignore: + - main jobs: build: diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 556cb98..6f856ae 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -26,4 +26,4 @@ jobs: uses: JamesIves/github-pages-deploy-action@4.1.4 with: branch: docs - folder: docs/public/ \ No newline at end of file + folder: docs/public/ From dd77f50b43f85d33cb78fa68668f53b576635908 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 20:42:25 -0700 Subject: [PATCH 63/68] ci: fix ci syntax --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fdbd49b..2b02c12 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,9 +7,10 @@ on: # Called from another work flow workflow_call: - # + pull_request: - - main + branches: + - main push: # Called from CD, prevents duplicate running branches-ignore: From f9e1fb583f7751d32c31f915d9a100e2408ad337 Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Tue, 11 Feb 2025 21:20:01 -0700 Subject: [PATCH 64/68] fix: Update README.org and tagging with fix to force a deployment --- README.org | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/README.org b/README.org index 75689e7..8f43224 100644 --- a/README.org +++ b/README.org @@ -1,11 +1,9 @@ * flowVC - - -[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/workflows/CI/badge.svg]] -[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/workflows/CD/badge.svg]] -[[https://github.com/bkm82/flowVC/actions][https://github.com/bkm82/flowVC/workflows/Docs/badge.svg]] +[[../../actions][../../workflows/CI/badge.svg]] +[[../../actions][../../workflows/CD/badge.svg]] +[[../../actions][../../workflows/Docs/badge.svg]] [[https://codecov.io/gh/bkm82/flowVC][https://codecov.io/gh/bkm82/flowVC/graph/badge.svg?token=1U1152BG8T]] Flow Visualization Code forked from FlowPhysics/flowVC @@ -44,7 +42,7 @@ You cannot compute FTLE and particle trajectories at the same time. The feature #+begin_quote [!Note] - Grab a pre-compiled binary for Windows Linux or macOS [[https://github.com/bkm82/flowVC/releases/latest][here]] + Grab a pre-compiled binary for Windows Linux or macOS [[../../releases/latest][here]] Alternatly build it from source as shown below #+end_quote @@ -72,7 +70,7 @@ You cannot compute FTLE and particle trajectories at the same time. The feature #+end_src **** Report any Issues -[[https://github.com/bkm82/flowVC/issues][Issues]] +[[../../issues][Issues]] ** Installation @@ -101,7 +99,7 @@ If you want to edit / modify the code, there are various ways to compile the cod ****** Clone the repository #+begin_src shell - https://github.com/bkm82/flowVC.git + git clone cd flowVC #+end_src ****** To compile and run all of the tests, run @@ -126,7 +124,7 @@ Alternatly, there is a docker image has the tooling installed. ***** Install [[https://docs.docker.com/engine/install/][Docker]] ***** Clone the repository #+begin_src shell - https://github.com/bkm82/flowVC.git + git clone cd flowVC #+end_src From ca6d7cd6ffad7d57e2285055a9e30081b29d6292 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 12 Feb 2025 04:25:36 +0000 Subject: [PATCH 65/68] chore(release): 0.0.8 [skip ci] ## [0.0.8](https://github.com/bkm82/flowVC/compare/v0.0.7...v0.0.8) (2025-02-12) ### Bug Fixes * Update README.org and tagging with fix to force a deployment ([f9e1fb5](https://github.com/bkm82/flowVC/commit/f9e1fb583f7751d32c31f915d9a100e2408ad337)) --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35d8987..9a2b9ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [0.0.8](https://github.com/bkm82/flowVC/compare/v0.0.7...v0.0.8) (2025-02-12) + + +### Bug Fixes + +* Update README.org and tagging with fix to force a deployment ([f9e1fb5](https://github.com/bkm82/flowVC/commit/f9e1fb583f7751d32c31f915d9a100e2408ad337)) + ## [0.0.7](https://github.com/bkm82/flowVC/compare/v0.0.6...v0.0.7) (2025-02-11) From 8f38758d1563245b1ab5fdd0c814db4df746ae1e Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 21:32:35 -0700 Subject: [PATCH 66/68] ci: use the bundler-cache for ruby --- .github/workflows/build.yml | 1 + .github/workflows/ci.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ed9efdf..c2cf088 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,6 +29,7 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: '3.0' + bundler-cache: true - name: Install Ceedling run: gem install ceedling diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2b02c12..87cee27 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,6 +39,7 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: '3.0' + bundler-cache: true - name: Install Ceedling run: gem install ceedling From 10e8b050af45ffa4a8fc23368659364100fef231 Mon Sep 17 00:00:00 2001 From: Bray Moll Date: Tue, 11 Feb 2025 21:59:48 -0700 Subject: [PATCH 67/68] ci: update workflows to work on main or master --- .github/workflows/build.yml | 1 + .github/workflows/cd.yml | 1 + .github/workflows/ci.yml | 2 ++ .github/workflows/docs.yml | 1 + 4 files changed, 5 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c2cf088..eee3932 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,6 +6,7 @@ on: pull_request: branches: - main + - master jobs: build: name: Build Release diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 1d1ed4f..de9a28e 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -5,6 +5,7 @@ on: push: branches: - main + - master jobs: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 87cee27..e633fb3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,10 +11,12 @@ on: pull_request: branches: - main + - master push: # Called from CD, prevents duplicate running branches-ignore: - main + - master jobs: build: diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 6f856ae..126c248 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - master permissions: contents: write From e5d2fc6ce0ad6b0bed7b9a5c3e95b18ff57a50ff Mon Sep 17 00:00:00 2001 From: bkm82 <130317980+bkm82@users.noreply.github.com> Date: Wed, 12 Feb 2025 08:24:34 -0700 Subject: [PATCH 68/68] docs: Update README.org to reference the FlowPhysics future doc location --- README.org | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.org b/README.org index 8f43224..9f49444 100644 --- a/README.org +++ b/README.org @@ -4,13 +4,13 @@ [[../../actions][../../workflows/CI/badge.svg]] [[../../actions][../../workflows/CD/badge.svg]] [[../../actions][../../workflows/Docs/badge.svg]] -[[https://codecov.io/gh/bkm82/flowVC][https://codecov.io/gh/bkm82/flowVC/graph/badge.svg?token=1U1152BG8T]] + Flow Visualization Code forked from FlowPhysics/flowVC #+begin_quote [!TIP] -Check out the [[https://bkm82.github.io/flowVC/][Docs]] +Check out the [[https://FlowPhysics.github.io/flowVC/][Docs]] #+end_quote Copyright 2013 Shadden Research Group. All rights reserved. @@ -49,7 +49,7 @@ You cannot compute FTLE and particle trajectories at the same time. The feature **** Create the input data files #+begin_quote [!Note] - For the Input Data Files Format reference the [[https://bkm82.github.io/flowVC/][Docs]] + For the Input Data Files Format reference the [[https://FlowPhysics.github.io/flowVC/][Docs]] #+end_quote #+begin_quote