On Friday, 20 August 2021 at 16:02:22 UTC, Pablo De Nápoli wrote:
Consider the following code:

    void main()
    {
      mpd_context_t ctx;
      mpd_t* a;
      mpd_ieee_context(&ctx, 128);
      a= mpd_new(&ctx);
    }

It seems to work fine.
...
However, if I put the very same code in the unittest section of a module, it fails with
a segmentation fault and I don't understand why!

unittest blocks are just functions, so this is pretty strange. At a guess, you have some library setup code and are putting that in a module with main() instead of in `shared static this()` in the module you're getting mpd_new from, so unit testing is skipping this setup code.


Personally, I found the unittest mechanism rather obscure. For instance I have tried to debug the problem using gdb and I found that the following code was run
        
    module dub_test_root;
...

dub, probably mainly for historical dmd reasons, has some extra steps to make unittests more convenient. You can call dmd directly with -unittest to avoid that, or accept that it's there.

I rather prefer a separate test program!

unittest builds are generally separate programs. dub manually removes your main(), but recent dmd also skip it automatically.

If you mean that you'd prefer to have your tests in separate source files, there's nothing stopping you from doing that, you're just going slightly off the beaten path. Probably the easiest way to do it is to have a configuration that excludes your main(), and other configurations that exclude your tests. dcd's dub.json shows this off well with its client/server/library builds: https://github.com/dlang-community/DCD/blob/master/dub.json

Another way to do this is to create a separate 'tests' dub application in a subdirectory which includes all of the library. Whatever works for you.

Reply via email to