"Nick Sabalausky" <a...@a.a> wrote in message news:gpunvp$20u...@digitalmars.com... > > Granted, this doesn't currently output foo's actual value, but it probably > wouldn't be too hard to modify it to do so via std.algorithm-style > trickery. >
Done <g>. New alternate-assert module is attached. Sample usage: -------------- module nonFatalAssertTest.main; import semitwist.util.nonFatalAssert; void main() { FatalizeAsserts(); // Main program code here } unittest { int foo = 2; char[] bar = "hello"; // *REALLY* need a way for a template to automatically get // the file/line of instantiation. // Improvement to mixin syntax would also be nice // Also, my editor doesn't know that backticks indicate a string, // so it's still properly highlighted as code :) mixin(NonFatalAssert!(__LINE__, __FILE__, `foo == 3 || foo > 5`, "foo is bad")); mixin(NonFatalAssert!(__LINE__, __FILE__, `2 + 2 == 4`, "Basic arithmetic")); mixin(NonFatalAssert!(__LINE__, __FILE__, `false`)); mixin(NonFatalEnsure!(__LINE__, __FILE__, foo, `_ == 3 || _ > 5`, "ensure foo failed")); mixin(NonFatalEnsure!(__LINE__, __FILE__, foo, `_ > 0`)); mixin(NonFatalEnsure!(__LINE__, __FILE__, bar, `_ == "hola"`)); } -------------- Output: -------------- nonFatalAssertTest\main.d(21): Assert Failed (foo == 3 || foo > 5): foo is bad nonFatalAssertTest\main.d(23): Assert Failed (false) nonFatalAssertTest\main.d(25): Ensure Failed: ensure foo failed Value 'foo': Expected: _ == 3 || _ > 5 Actual: 2 nonFatalAssertTest\main.d(27): Ensure Failed Value 'bar': Expected: _ == "hola" Actual: hello tango.core.exception.assertexcept...@semitwist\util\nonfatalassert.d(86): 4 Assert Failures -------------- Sorry if this comes across as thread hijacking, that wasn't my intent. My main point is that in D, we don't have to choose between having detailed assert messages and having natural syntax for assert's conditional. We can have both. begin 666 nonFatalAssert.d m...@4v5m:51W:7-T($QI8G)A<GD-"B\O(%=R:71T96X@:6...@=&AE($0@<')O M9W)A;6UI;F<@;&%N9W5A9V4N#0H-"B\J*B -"D%U=&AO<CH-"B0H5T5"('=W M=RYS96UI='=I<W0N8V]M+"!.:6-K(%-A8F%L875S:WDI#0H-"D-O;G-I9&5R M('1H:7,@=&\...@8f4@=6YD97(@=&AE('IL:6(@;&EC96YS92X-"BHO#0H-"FUO M9'5L92!S96UI='=I<W0N=71I;"YN;VY&871A;$%S<V5R=#L-"@T*:6UP;W)T M('1A;F=O+FEO+E-T9&]U=#L-"FEM<&]R="!T86YG;RYU=&EL+D-O;G9E<G0[ M#0H-"b...@t*4v]u;F1S(&QI:v...@82!c;VYT<F%D:6-T:6]N(&]F('1E<FUS M+"!b...@=&AI<R!I<R!J=7-T#0II;G1E;F1E9"!T;R!A;&QO=R!U;FET=&5S M=',@=&\@;W5T<'5T($%,3"!F86EL=7)E<R!I;G-T96%D#0IO9B!O;FQY(&]U M='!U='1I;F<@=&AE(&9I<G-T(&]N92!A;f...@=&AE;B!S=&]P<&EN9RX-"BHO M#0HO+R J4D5!3$Q9*B!N965D(&$...@=v%y('1O(&=E="!F:6QE+VQI;F4@;V8@ M=&5M<&QA=&4G<R!I;G-T86YT:6%T:6]N#0IT96UP;&%T92!.;VY&871A;$%S M<V5R="AL;VYG(&QI;F4L(&-H87);72!F:6QE+"!C:&%r...@8v]n9%-t<BP@ M8VAA<EM=(&US9STB(BD-"GL-"@EC;VYS="!C:&%r...@3f]n1f%t86q!<W-E M<G0@/0T*"2)[7&x...@t*"2(@(" @8F]O;"!?3F]N1F%T86Q!<W-E<G1?8V]N M9%)E<W5L=" ]("@B?F-O;F13=')^(BD[7&x...@t*"2(@(" @7TYO;D9A=&%L M07-S97)T(2...@b?fqi;F4N<W1R:6YG;V9^(BP@(GYF:6QE+G-T<FEN9V]F?B(L M(")^8V]N9%-T<BYS=')I;F=O9GXB+" B?FUS9RYS=')I;F=O9GXB*2A?3F]N M1F%T86Q!<W-E<G1?8V]N9%)E<W5L="D[7&x...@t*"2)]7&XB.PT*"2\O<')A M9VUA*&US9RP@(DYO;D9A=&%L07-S97)T.B B?DYO;D9A=&%L07-S97)T*3L- M"GT-"@T*8F]O;"!?3F]N1F%T86Q!<W-E<G0H;&]N9R!L:6YE+"!C:&%R6UT@ m9fel...@8vaa<EM=(&-O;F13='(L(&-H87);72!M<V<](B(I*&)O;v...@8v]n M9%)E<W5L="D-"GL-"@e...@a8v]n9%)E<W5L="D-"@E[#0H)"6YO;D9A=&%L M07-S97)T0V]U;G0K*SL-"@D)4W1D;W5T+F9O<FUA=&QN*")[?2A[?2DZ($%S M<V5R="!&86el...@*'M]*7M](BP-"@D)"0D)"69I;&4L(&QI;F4L(&-O;F13 M='(L#0H)"0D)"0EM<V<]/2(B(#\@(B(@.B B.B B('X@;7-G*3L-"@E]#0H) M#0H)<F5T=7)N(&-O;F1297-U;'0[#0I]#0H-"G1E;7!L871E($YO;D9A=&%L M16YS=7)E*&QO;F<@;&en...@8vaa<EM=(&9I;&4L(&%L:6%S('9A;'5E+"!C M:&%r...@8v]n9%-t<b...@8vaa<EM=(&US9STB(BD-"GL-"@EC;VYS="!C:&%R m...@3f]n1f%t86q%;G-U<F4@/0T*"2)[7&x...@t*"2(@(" @(GYT>7!E;V8H M=F%L=64I+G-T<FEN9V]F?B(@7R ]("@B?G9A;'5E+G-T<FEN9V]F?B(I.UQN M(GX-"@DB(" @(&)O;v...@7tyo;D9A=&%L16YS=7)E7V-O;F1297-U;'0@/2 H M(GYC;VYD4W1R?B(I.UQN(GX-"@DB(" @(%].;VY&871A;$5N<W5R92$H(GYL M:6YE+G-T<FEN9V]F?B(L(")^9FEL92YS=')I;F=O9GXB+"!@(GYV86QU92YS M=')I;F=O9GXB8"P@(GYC;VYD4W1R+G-T<FEN9V]F?B(L(")^='EP96]F*'9A M;'5E*2YS=')I;F=O9GXB+" B?FUS9RYS=')I;F=O9GXB*2A?+"!?3F]N1F%T M86Q%;G-U<F5?8V]N9%)E<W5L="D[7&x...@t*"2)]7&XB.PT*"2\O<')A9VUA M*&US9RP@(DYO;D9A=&%L16YS=7)E.B B?DYO;D9A=&%L16YS=7)E*3L-"GT- M"@T*8F]O;"!?3F]N1F%T86Q%;G-U<F4H;&]N9R!L:6YE+"!C:&%r...@9fel m...@8vaa<EM=('9A;'5E4W1R+"!C:&%r...@8v]n9%-t<b...@5"p...@8vaa<EM= M(&US9STB(BDH5"!V86QU95)E<W5L="p...@8f]o;"!C;VYD4F5S=6QT*0T*>PT* M"6EF*"%C;VYD4F5S=6QT*0T*"7L-"@D);F]N1F%T86Q!<W-E<G1#;W5N="LK M.PT*"0E3=&1O=70N9F]R;6%T;&XH(GM]*'m]...@16ys=7)E($9A:6QE9'M] M7&x...@t*"0D@(" @(" @(" @(" @(" @(E9A;'5E("=[?2<Z7&x...@t*"0D) M"0D)(D5X<&5C=&5D.B![?5QN(GX-"@D)"0D)"2)!8W1U86PZ('M](BP-"@D) M"0D)"69I;&4L(&QI;F4L(&US9ST](B(@/R B(B Z("(Z("(@?B!M<V<L#0H) M"0D)"0EV86QU95-T<b...@8v]n9%-t<b...@=f%l=65297-u;'0I.PT*"7T-"@D- M"@ER971U<f...@8v]n9%)E<W5L=#L-"GT-"G!R:79A=&4...@=6en="!N;VY&871A M;$%S<V5R=$-O=6YT/3 [#0IU:6YT(&=E=$YO;D9A=&%L07-S97)T0V]U;G0H M*0T*>PT*"7)E='5R;B!N;VY&871A;$%S<V5R=$-O=6YT.PT*?0T*=F]I9"!R M97-E=$YO;D9A=&%L07-S97)T0V]U;G0H*0T*>PT*"6YO;D9A=&%L07-S97)T M0V]U;G0@/2 P.PT*?0T*#0IV;VED($9A=&%L:7IE07-S97)T<r...@i#0i[#0h) M:68H9V5T3F]N1F%T86Q!<W-E<G1#;W5N="@I(#X@,"D-"@E[#0H)"5-T9&]U M="YF;'5S:"@I.PT*"0EA<W-E<G0H9F%L<V4L#0H)"0ET;R$H8VAA<EM=*2AG M971.;VY&871A;$%S<V5R=$-O=6YT*"DI('X-"@D)"2(@07-S97)T($9A:6QU M<F4B('X-"@D)"2AG971.;VY&871A;$%S<V5R=$-O=6YT*"D@/3T@,2 _("(B 6(#H@(G,B*0T*"0DI.PT*"7T-"GT-"@`` ` end