Hack to name unit tests?

Robert Fraser fraserofthenight at gmail.com
Wed Nov 28 23:09:02 PST 2007


Christopher Wright wrote:
> Robert Fraser wrote:
>> I'm creating a Flectioned-based way to run unit tests individually 
>> (it'll be hooked into a front-end, so you can run test suites, repeat 
>> only failed tests after a code change, etc.)
>>
>> However, I have run into a problem: unit tests can't be named. Right 
>> now I have a signature system, but I was wondering if there's any 
>> hackish way to predictably insert a string into the generated object 
>> file in a way that users can name unittests. That is to say, given a 
>> function pointer, is there any way I can scan the code to see if a 
>> name has been given to the unit test, and if so extract that name at 
>> runtime?
>>
>> Ideally, it'd be as easy for the user as something like:
>>
>> unittest
>> {
>>    assert(":testName:");
>>    // Rest of test goes here...
>> }
>>
>> Right now, I have the associations being done in the front-end I'm 
>> working on, that scans the code for comments in a particular format 
>> and associates those with the unit tests. However, that ties the unit 
>> test executor back-end to the code analysis front-end, so I was hoping 
>> there's a better way.
>>
>> Thanks!
> 
> class Unittest (string _name, alias _dg) : IUnittest {
>    static string name = _name;
>    static void delegate() test = _dg;
> }
> 
> Usage:
> Unittest!("my test for wossname", {
>    assert (false, "haven't gotten around to implementing this yet");
> });
> 
> Not guaranteed to work.
> 
> Another tactic would be something like:
> 
> class UnittestManager {
>    static void registerCurrentTest (string name) {}
>    static void endTest (bool success) {}
>    static bool performTest () {}
> }
> 
> template Unittest (string _name, alias _dg) {
>    unittest {
>       UnittestManager.registerCurrentTest(_name);
> 
>       // This lets us skip the test if we're just trying
>       // to find out what tests there are currently.
>       if (UnittestManager.performTest) {
>          scope(success) UnittestManager.endTest(true);
>          scope(failure) UnittestManager.endTest(false);
>          _dg();
>       }
>    }
> }
> 
> mixin Unittest!("my test name", { assert (false, "not yet implemented"); 
> });

Thanks! That's a good idea, but I want something compatible with current 
unittest {} declarations.



More information about the Digitalmars-d mailing list