How can one reliably run unittests

jfondren julian.fondren at gmail.com
Fri Aug 27 12:08:53 UTC 2021


On Friday, 27 August 2021 at 11:33:14 UTC, Johan wrote:
> On Friday, 27 August 2021 at 11:15:44 UTC, jfondren wrote:
>> On Friday, 27 August 2021 at 10:33:02 UTC, Johan wrote:
>>>
>>> (by the way, I'm convinced `unittest` is a misfeature of the 
>>> language. Besides the clear downside that is apparent from 
>>> this thread,
>>
>> What clear downside is that? A minor nit about -main? That 
>> there's a discussion happening at all?
>
> The downside that people expect it to work well.

Look at this:

```d
#! /usr/bin/env dub
/++ dub.sdl:
     configuration "release" {
         targetType "executable"
     }
     configuration "unittest" {
         targetType "library"
         dependency "silly" version="~>1.1.1"
     }
+/

T factorial(T)(T number) {
     if (number <= 1)
         return 1;
     else
         return number * factorial!T(number - 1);
}

@("!5") unittest {
     assert(factorial(5) == 120);
}

@("!0 and !1") unittest {
     assert(factorial(0) == 1);
     assert(factorial(1) == 1);
}

version (unittest) {
} else {
     void main(string[] args) {
         import std.conv : to;
         import std.stdio : writeln;

         writeln(args[1].to!int.factorial);
     }
}
```

Use it like a script:

```
$ ./fact.d 5; ./fact.d 10
120
3628800
```

Run its tests (colors lost in translation):

```
$ dub -q test --single fact.d
  ✓ fact !5
  ✓ fact !0 and !1

Summary: 2 passed, 0 failed in 0 ms
```

That's not too bad, is it? It can definitely be improved, but 
none of my Perl scripts have tests in them.

Nevermind the factorial, it's just something I picked out of the 
pile.


More information about the Digitalmars-d mailing list