mirror of
https://github.com/NixOS/nix
synced 2025-06-25 10:41:16 +02:00
Today, with the tests inside a `tests` intermingled with the corresponding library's source code, we have a few problems: - We have to be careful that wildcards don't end up with tests being built as part of Nix proper, or test headers being installed as part of Nix proper. - Tests in libraries but not executables is not right: - It means each executable runs the previous unit tests again, because it needs the libraries. - It doesn't work right on Windows, which doesn't want you to load a DLL just for the side global variable . It could be made to work with the dlopen equivalent, but that's gross! This reorg solves these problems. There is a remaining problem which is that sibbling headers (like `hash.hh` the test header vs `hash.hh` the main `libnixutil` header) end up shadowing each other. This PR doesn't solve that. That is left as future work for a future PR. Co-authored-by: Valentin Gagarin <valentin.gagarin@tweag.io>
82 lines
1.8 KiB
C++
82 lines
1.8 KiB
C++
#include <regex>
|
|
|
|
#include <rapidcheck.h>
|
|
|
|
#include "path-regex.hh"
|
|
#include "store-api.hh"
|
|
|
|
#include "tests/hash.hh"
|
|
#include "tests/path.hh"
|
|
|
|
namespace nix {
|
|
|
|
void showValue(const StorePath & p, std::ostream & os)
|
|
{
|
|
os << p.to_string();
|
|
}
|
|
|
|
}
|
|
|
|
namespace rc {
|
|
using namespace nix;
|
|
|
|
Gen<StorePathName> Arbitrary<StorePathName>::arbitrary()
|
|
{
|
|
auto len = *gen::inRange<size_t>(
|
|
1,
|
|
StorePath::MaxPathLen - StorePath::HashLen);
|
|
|
|
std::string pre;
|
|
pre.reserve(len);
|
|
|
|
for (size_t c = 0; c < len; ++c) {
|
|
switch (auto i = *gen::inRange<uint8_t>(0, 10 + 2 * 26 + 6)) {
|
|
case 0 ... 9:
|
|
pre += '0' + i;
|
|
case 10 ... 35:
|
|
pre += 'A' + (i - 10);
|
|
break;
|
|
case 36 ... 61:
|
|
pre += 'a' + (i - 36);
|
|
break;
|
|
case 62:
|
|
pre += '+';
|
|
break;
|
|
case 63:
|
|
pre += '-';
|
|
break;
|
|
case 64:
|
|
// names aren't permitted to start with a period,
|
|
// so just fall through to the next case here
|
|
if (c != 0) {
|
|
pre += '.';
|
|
break;
|
|
}
|
|
case 65:
|
|
pre += '_';
|
|
break;
|
|
case 66:
|
|
pre += '?';
|
|
break;
|
|
case 67:
|
|
pre += '=';
|
|
break;
|
|
default:
|
|
assert(false);
|
|
}
|
|
}
|
|
|
|
return gen::just(StorePathName {
|
|
.name = std::move(pre),
|
|
});
|
|
}
|
|
|
|
Gen<StorePath> Arbitrary<StorePath>::arbitrary()
|
|
{
|
|
return gen::just(StorePath {
|
|
*gen::arbitrary<Hash>(),
|
|
(*gen::arbitrary<StorePathName>()).name,
|
|
});
|
|
}
|
|
|
|
} // namespace rc
|