assert unittest doesn't respect assertThrown (correction)
Brother Bill
brotherbill at mail.com
Tue Jan 20 20:43:57 UTC 2026
On Tuesday, 20 January 2026 at 20:42:21 UTC, Brother Bill wrote:
> In a unittest, we have assertThrown average([1], [1, 2]));
> As assert statement throws an exception.
> But the unittest fails, which seems odd, as an assert did throw.
> Have I found another bug in DMD?
>
> ```
> import std.stdio : writeln;
> import std.exception : enforce, assertThrown, assertNotThrown;
>
> void main()
> {
> auto result = average([], []);
>
> // assert is not caught in catch block
> // enforce is caught in catch block
> try
> {
> result = average([1], [1, 2]);
> }
> catch (Exception e)
> {
> writeln("Caught exception: ", e.msg);
> }
> }
>
> int[] average(int[] a, int[] b)
> {
> assert( a.length == b.length, "assert: Input slices must have
> the same length"); // assert will not be caught in catch block
> // enforce(a.length == b.length, "enforce: Input slices must
> have the same length"); // enforce will be caught in catch
> block
>
> // Implementation goes here
> return cast(int[])[]; // Initial result, so it compiles
> }
>
> unittest
> {
> /* Must throw for uneven slices */
> assertThrown(average([1], [1, 2]));
>
> /* Must not throw for empty slices */
> assertNotThrown(average([], []));
> }
> ```
>
> Running it in Linux Terminal
> ```
> bb at fedora:~/temp/c42_p217_6a_testing_for_exceptions$ dub test
> --force # with assert only
> No source files found in configuration 'library'.
> Falling back to default configuration for test runner.
> Starting Performing "unittest" build using /usr/bin/dmd for
> x86_64.
> Building c42_6a_testing_for_exceptions ~master: building
> configuration [application]
> Linking c42_6a_testing_for_exceptions
> Running c42_6a_testing_for_exceptions
> core.exception.AssertError at source/app.d(22): assert: Input
> slices must have the same length
> ----------------
> ??:? _d_assert_msg [0x40301c]
> source/app.d:22 int[] app.average(int[], int[]) [0x400d6e]
> source/app.d:32 pure @safe int[]
> app.__unittest_L29_C1().__dgliteral_L32_C22() [0x400e46]
> /usr/include/dmd/phobos/std/exception.d:294 pure nothrow @safe
> void std.exception.assertThrown!(Exception,
> int[]).assertThrown(lazy int[], immutable(char)[],
> immutable(char)[], ulong) [0x4025b2]
> source/app.d:32 void app.__unittest_L29_C1() [0x400daf]
> ??:? void app.__modtest() [0x402cbc]
> ??:? int
> core.runtime.runModuleUnitTests().__foreachbody_L603_C5(object.ModuleInfo*) [0x40c52e]
> ??:? int object.ModuleInfo.opApply(scope int
> delegate(object.ModuleInfo*)).__lambda_L2519_C13(immutable(object.ModuleInfo*)) [0x40a087]
> ??:? int rt.minfo.moduleinfos_apply(scope int
> delegate(immutable(object.ModuleInfo*))).__foreachbody_L585_C5(ref rt.sections_elf_shared.DSO) [0x412593]
> ??:? int rt.sections_elf_shared.DSO.opApply(scope int
> delegate(ref rt.sections_elf_shared.DSO)) [0x412be5]
> ??:? int rt.minfo.moduleinfos_apply(scope int
> delegate(immutable(object.ModuleInfo*))) [0x412521]
> ??:? int object.ModuleInfo.opApply(scope int
> delegate(object.ModuleInfo*)) [0x40a059]
> ??:? runModuleUnitTests [0x40c363]
> ??:? void rt.dmain2._d_run_main2(char[][], ulong, extern (C)
> int function(char[][])*).runAll() [0x403c0c]
> ??:? void rt.dmain2._d_run_main2(char[][], ulong, extern (C)
> int function(char[][])*).tryExec(scope void delegate())
> [0x403b99]
> ??:? _d_run_main2 [0x403b0f]
> ??:? _d_run_main [0x403917]
> /usr/include/dmd/druntime/import/core/internal/entrypoint.d:29
> main [0x400e99]
> ??:? [0x7f80e860f5b4]
> ??:? __libc_start_main [0x7f80e860f667]
> ??:? _start [0x400b64]
> 1/1 modules FAILED unittests
> Error Program exited with code 1
> ```
More information about the Digitalmars-d-learn
mailing list