Thread overview
Why do failed contracts don't dump stack backtrace in unittests?
Sep 04, 2022
Ali Çehreli
Sep 04, 2022
Paul Backus
Sep 04, 2022
Ali Çehreli
September 04, 2022
The program output is different whether an Error is thrown from main or from the unittest block:

void foo(string s)
in (s != "hello") {
}

unittest {
  foo("hello");  // No stack backtrace
}

void main() {
  foo("hello");  // Yes stack backtrace
}

Ali
September 04, 2022
On Sunday, 4 September 2022 at 14:14:55 UTC, Ali Çehreli wrote:
> The program output is different whether an Error is thrown from main or from the unittest block:

Because the default test runner catches the Error, and doesn't print the stack trace:

https://github.com/dlang/dmd/blob/25799d3841ea87246c56532f6f91d9a1e34d8d8f/druntime/src/core/runtime.d#L599-L620

There's even a comment about it:

    // TODO: omit stack trace only if assert was thrown
    // directly by the unittest.
September 04, 2022
On 9/4/22 09:35, Paul Backus wrote:

>      // TODO: omit stack trace only if assert was thrown
>      // directly by the unittest.

Thank you but I mean... :) I can understand removing a backtrace from the eyes of an end user but the consumer of a unittest output is a developer, no?

Ali