On Tuesday, 16 June 2020 at 06:19:51 UTC, Joel wrote:
I've tired different unit test libraries, but they jump out on
errors instead of just adding to failed numbers.
I'm thinking like this:
```
@("dummy");
unittset {
0.shouldEqual(0);
1.shouldEqual(2);
2.shouldEqual(3);
}
```
Test: dummy
test passed line 10: 0 is equal to 0
test failed line 11: 1 is not equal to 2
test failed line 12: 2 is not equal to 3
1 passed
2 failed
The unit tests I tried would jump out on the first failure.
I have solved this. In my project, I have two modules like this:
```
module assertions;
auto assert_(A)(A canditate)
{ assert(canditate);
}
auto assertOp(alias pred, A)(A canditate)
if (is(typeof(cast(bool) pred(canditate))))
{ assert(pred(canditate));
}
auto assertOp(alias pred, A, B)(A canditate, B check)
if (is(typeof(cast(bool) pred(canditate, check))))
{ assert(pred(canditate, check));
}
auto assertEmpty(A)(A aEl)
{ assertOp!(a => a.empty)(aEl);
}
auto assertEqual(A, B)(A aEl, B bEl)
{ assertOp!((a,b) => a == b)(aEl, bEl);
}
auto assertClose(A, B)(A aEl, B bEl)
{ import std.math;
assertOp!((a,b) => a.isClose(b))(aEl, bEl);
}
```
```
module assertions.characterization;
auto assert_(A)(A canditate)
{ import std.stdio : writeln;
writeln(canditate, cast(bool) canditate? " (passes)": "
(fails)");
}
auto assertOp(alias pred, A)(A canditate)
if (is(typeof(cast(bool) pred(canditate))))
{ import std.stdio : writeln;
writeln(canditate, cast(bool) pred(canditate)? " (passes)": "
(fails)");
}
auto assertOp(alias pred, A, B)(A canditate, B check)
if (is(typeof(cast(bool) pred(canditate, check))))
{ import std.stdio : writeln;
writeln(canditate, cast(bool) pred(canditate, check)? "
(passes)": " (fails)");
}
auto assertEmpty(A)(A aEl)
{ assertOp!(a => a.empty)(aEl);
}
auto assertEqual(A, B)(A aEl, B bEl)
{ assertOp!((a,b) => a == b)(aEl, bEl);
}
auto assertClose(A, B)(A aEl, B bEl)
{ import std.math;
assertOp!((a,b) => a.isClose(b))(aEl, bEl);
}
```
So I usually have the test like this:
```
@safe unittest
{ import assertions;
0.assertEqual(0);
1.assertEqual(2);
2.assertEqual(3);
}
```
...but when it fails, I just change the import to
`assertions.characterization`, and all test results, along with
info whether they're correct, are printed.