Validate static asserts

Ali Çehreli acehreli at
Fri Sep 9 18:15:39 UTC 2022

On 9/9/22 10:35, Dennis wrote:
 > On Friday, 9 September 2022 at 16:41:54 UTC, Andrey Zherikov wrote:
 >> What's about new `compileOutput` trait that returns compiler output?
 >> ```d
 >> static assert(__traits(compileOutput, { <my code> }) == "message");
 >> ```
 > As a compiler dev, that sounds terrifying. It would make basically every
 > change to dmd a breaking change.

For that very reason, I wrote the function 'assertErrorStringContains()' 
a couple of days ago to ensure *my* strings were in the output:

A precondition:

     void test_1(int i)
     in (i > 0, fooError("The value must be positive", i, 42))
         // ...

A unit test that ensures it fails and checks string pieces appear in the 

         The .msg text of the error contains both the error string and 
the data
         that is included in the error.
     assertErrorStringContains(() => test_1(-1), [ "The value must be 
                                                   "-1, 42" ]);
Here is assertErrorStringContains:

     // Assert that the expression throws an Error object and that its 
     // representation contains all expected strings.
     void assertErrorStringContains(void delegate() expr, string[] expected)
         bool thrown = false;


         catch (Error err)
             thrown = true;

             import std.algorithm : any, canFind, splitter;
             import std.conv : to;
             import std.format : format;

             auto lines =!string.splitter('\n');
             foreach (exp; expected)
                 assert(lines.any!(line => line.canFind(exp)),
                        format!"Failed to find \"%s\" in the output: 
%-(\n  |%s%)"(
                            exp, lines));



More information about the Digitalmars-d-learn mailing list