Unit test practices in Phobos

Daniel Keep daniel.keep.lists at gmail.com
Mon Aug 10 09:05:32 PDT 2009



Lars T. Kyllingstad wrote:
> Lars T. Kyllingstad wrote:
>> Daniel Keep wrote:
>>>
>>> Lars T. Kyllingstad wrote:
>>>> ...
>>>
>>> Knocked this up in about two minutes.  Might be handy.
>>>
>>> template TestInstantiateImpl(alias Tmpl, Ts...)
>>> {
>>>     static if( Ts.length > 0 )
>>>     {
>>>         alias Tmpl!(Ts[0]) test;
>>>         alias TestInstantiateImpl!(Tmpl, Ts[1..$]).next next;
>>>     }
>>>     else
>>>     {
>>>         enum next = true;
>>>     }
>>> }
>>>
>>> template TestInstantiate(alias Tmpl, Ts...)
>>> {
>>>     alias TestInstantiateImpl!(Tmpl, Ts).next TestInstantiate;
>>> }
>>>
>>> template Blah(T)
>>> {
>>>     pragma(msg, "Blah!("~T.stringof~")");
>>>     alias T Blah;
>>> }
>>>
>>> T nanFor(T)()
>>> {
>>>     pragma(msg, "nanFor!("~T.stringof~")");
>>>     return T.nan;
>>> }
>>>
>>> unittest
>>> {
>>>     static assert( TestInstantiate!(Blah, float, double, real) );
>>>     static assert( TestInstantiate!(nanFor, float, double, real) );
>>>
>>>     static assert( TestInstantiate!(Blah, int) );
>>>     static assert( TestInstantiate!(nanFor, int) );
>>> }
>>>
>>> void main()
>>> {
>>> }
>>>
>>> $ dmd -unittest irc
>>> Blah!(float)
>>> Blah!(double)
>>> Blah!(real)
>>> nanFor!(float)
>>> nanFor!(double)
>>> nanFor!(real)
>>> Blah!(int)
>>> nanFor!(int)
>>> irc.d(34): Error: no property 'nan' for type 'int'
>>> irc.d(43): Error: template instance irc.TestInstantiate!(nanFor,int)
>>> error instantiating
>>
>> If something like this was to go into a library, I'd remove the
>> pragma(msg)s, though. They'd get pretty annoying after a while. ;)
> 
> ....except the pragmas are defined in Blah and nanFor themselves, not in
> TestInstantiate... Note to self: Think before you post.
> 
> -Lars

Oh, it's worse than that: Tuples flatten so what you're actually doing
is instantiating TestInstantiate with SIX parameters.  TestInstantiate
doesn't actually know how many arguments each template is supposed to
get.  You could get around this with a tuple struct type.

The problem then is that you couldn't pass alias or value arguments.

You might be able to fix THAT by having a second argument that specifies
how many arguments the template takes, then slice the required number of
elements from the tuple...

But I'm really not sufficiently married to the idea to bother with all
that.  :P



More information about the Digitalmars-d mailing list