Thread overview
Problem with unittest in templates.
Dec 29, 2006
Peter C. Chapin
Dec 29, 2006
Thomas Kuehne
Dec 30, 2006
Peter C. Chapin
Dec 30, 2006
Peter C. Chapin
Dec 31, 2006
Jason House
December 29, 2006
Hello! I'm using dmd 0.178. I'm having trouble getting the unittest section of a class template to execute. I have two files:

----> main.d <----

import other;

int main( )
{
  Foo!(int) my_foo = new Foo!(int);
  return( 0 );
}

----> other.d <----

class Foo(T) {
  unittest {
    assert( 1 == 0 );
  }
};

I compile this program using 'dmd -unittest main.d other.d'. It compiles without error but when it executes there is no assertion failure. However, if I move the definition of class Foo(T) into main.d (and throw away other.d) I *do* get the assertion failure. Am I doing something wrong? Is this supposed to work?

I'm also noticing that the unittest section isn't as useful in a template as it is in a non-template. It's awkward writing unittests generically without knowledge of a specific type T. Is this "the way it is" or is there some nice programming technique that I should be using here? I find myself thinking about writing a separate test program (C++ style) where I can work with specific specializations of the template.

Peter
December 29, 2006
Peter C. Chapin <pchapin@sover.net> schrieb:
> Hello! I'm using dmd 0.178. I'm having trouble getting the unittest section of a class template to execute. I have two files:
>
> ----> main.d <----
>
> import other;
>
> int main( )
> {
>   Foo!(int) my_foo = new Foo!(int);
>   return( 0 );
> }
>
> ----> other.d <----
>
> class Foo(T) {
>   unittest {
>     assert( 1 == 0 );
>   }
> };
>
> I compile this program using 'dmd -unittest main.d other.d'. It compiles without error but when it executes there is no assertion failure. However, if I move the definition of class Foo(T) into main.d (and throw away other.d) I *do* get the assertion failure. Am I doing something wrong? Is this supposed to work?

Please file a bug report:
http://d.puremagic.com/issues

Thomas

December 29, 2006
Peter C. Chapin wrote:
> Hello! I'm using dmd 0.178. I'm having trouble getting the unittest section of a class template to execute. I have two files:
> 
> ----> main.d <----
> 
> import other;
> 
> int main( )
> {
>   Foo!(int) my_foo = new Foo!(int);
>   return( 0 );
> }
> 
> ----> other.d <----
> 
> class Foo(T) {
>   unittest {
>     assert( 1 == 0 );
>   }
> };
> 
> I compile this program using 'dmd -unittest main.d other.d'. It compiles without error but when it executes there is no assertion failure. However, if I move the definition of class Foo(T) into main.d (and throw away other.d) I *do* get the assertion failure. Am I doing something wrong? Is this supposed to work?
> 
> I'm also noticing that the unittest section isn't as useful in a template as it is in a non-template. It's awkward writing unittests generically without knowledge of a specific type T. Is this "the way it is" or is there some nice programming technique that I should be using here? I find myself thinking about writing a separate test program (C++ style) where I can work with specific specializations of the template.
> 
> Peter

While this is most certainly a bug, for the meantime you could try writing a module level unittest block for your template.  Something like:

# class Foo (T) {
#   // ...
# }
# unittest {
#   // ...
# }

You won't be writing a "generic" test, but you should be able to check the particular things you're wanting to.

-- Chris Nicholson-Sauls
December 30, 2006
Thomas Kuehne <thomas-dloop@kuehne.cn> wrote in news:slrnepaeuk.8ki.gast@birke.kuehne.cn:

> Please file a bug report:
> http://d.puremagic.com/issues

Done.

Peter
December 30, 2006
Chris Nicholson-Sauls <ibisbasenji@gmail.com> wrote in news:en3n33$1vck$1@digitaldaemon.com:

> While this is most certainly a bug, for the meantime you could try writing a module level unittest block for your template.  Something like:
> 
> # class Foo (T) {
> #   // ...
> # }
> # unittest {
> #   // ...
> # }

That's cool. I didn't realize you could do that. This has the advantage in this case of not requiring the unittest block to be generic. I find building completely generic tests that are also reasonably exhaustive to be something of a challenge.

Peter
December 31, 2006
Peter C. Chapin wrote:
> Hello! I'm using dmd 0.178. I'm having trouble getting the unittest section of a class template to execute. I have two files:
> 
> ----> main.d <----
> 
> import other;
> 
> int main( )
> {
>   Foo!(int) my_foo = new Foo!(int);
>   return( 0 );
> }
> 
> ----> other.d <----
> 
> class Foo(T) {
>   unittest {
>     assert( 1 == 0 );
>   }
> };
> 
> I compile this program using 'dmd -unittest main.d other.d'. It compiles without error but when it executes there is no assertion failure. However, if I move the definition of class Foo(T) into main.d (and throw away other.d) I *do* get the assertion failure. Am I doing something wrong? Is this supposed to work?
> 
> I'm also noticing that the unittest section isn't as useful in a template as it is in a non-template. It's awkward writing unittests generically without knowledge of a specific type T. Is this "the way it is" or is there some nice programming technique that I should be using here? I find myself thinking about writing a separate test program (C++ style) where I can work with specific specializations of the template.
> 
> Peter

In my experiments with D, I've found that you must instantiate the templated class in order to get the unittest to run.  I don't know if it's one unit test execution per instantiation or one unit test run for each complete type (such as T=int, T=char, etc...).  I'd guess the latter.