Detached unit tests
Steven Schveighoffer
schveiguy at gmail.com
Tue Apr 30 17:02:51 UTC 2024
I want to propose that we provide a mechanism to semantically
detach unit tests from the scope they are written in. Such
unittests would be treated as if they were not in the same scope
or module. This includes detached unit tests inside templates.
The only stipulation is that the current module is assumed
imported.
For a strawman syntax, let's do what everyone does ... overload
`static`!
```d
import std.stdio;
// static unittests help validate API does not include private
functions
struct S
{
private int x;
unittest {
auto s = S(42);
s.foo(); // ok, this is not a detached unittest
}
static unittest {
auto s = S(23);
//s.x == 23; // error, x not visible
}
}
private void foo(S s) {
assert(s.x == 42);
}
static unittest {
auto s = S(42);
//s.foo(); // error, foo not visible.
}
// static unittests help with documentation on templated types
struct Arr(T) {
private T[] arr;
void append(T val) {
arr ~= val;
}
///
static unittest {
// Arr arr; // Error, you are not in this scope, so Arr is
an uninstantiated template
Arr!int arr; // ok
arr.append(1);
import std.stdio; // must re-import things as if you weren't
in this module
// writeln(arr.arr); // nope, this is a private member
writeln(arr.getArray()); // must use public API
}
T[] getArray() => arr;
}
```
thoughts?
-Steve
More information about the dip.ideas
mailing list