[M6] tests: levenshtein + pc_scan + brute_scan + findmodule_scan + last_failure_dir + cmd_linkdb_add + codegen PkgConfig/brute-force

This commit is contained in:
2026-05-15 14:41:17 +00:00
parent 94e658fdf1
commit 65a749f088
9 changed files with 557 additions and 0 deletions

89
tests/pc_scan_parse.cpp Normal file
View File

@@ -0,0 +1,89 @@
#include <catch2/catch_test_macros.hpp>
import cargoxx.resolver;
import cargoxx.util;
import std;
using cargoxx::resolver::pc_scan;
using cargoxx::util::ErrorCode;
namespace {
auto fresh_store() -> std::filesystem::path {
auto d = std::filesystem::temp_directory_path() /
std::format("cargoxx-pc-scan-{}", std::random_device{}());
std::filesystem::create_directories(d / "lib" / "pkgconfig");
return d;
}
void touch_pc(const std::filesystem::path& store, std::string_view name,
std::string_view content =
"Name: x\nDescription: x\nLibs: -lx\n") {
std::ofstream{store / "lib" / "pkgconfig" / std::string{name}} << content;
}
} // namespace
TEST_CASE("pc_scan picks the exact-name .pc when present",
"[resolver][pc_scan]") {
auto store = fresh_store();
touch_pc(store, "sqlite3.pc");
auto r = pc_scan(store, "sqlite3");
REQUIRE(r.has_value());
REQUIRE(r->pc_module == "sqlite3");
REQUIRE(r->pc_file.filename() == "sqlite3.pc");
}
TEST_CASE("pc_scan picks sqlite3.pc for nixpkgs name 'sqlite'",
"[resolver][pc_scan]") {
auto store = fresh_store();
touch_pc(store, "sqlite3.pc");
auto r = pc_scan(store, "sqlite");
REQUIRE(r.has_value());
REQUIRE(r->pc_module == "sqlite3");
}
TEST_CASE("pc_scan picks the best match among multiple .pc files",
"[resolver][pc_scan]") {
auto store = fresh_store();
touch_pc(store, "zlib.pc");
touch_pc(store, "sqlite3.pc");
touch_pc(store, "unrelated.pc");
auto r = pc_scan(store, "zlib");
REQUIRE(r.has_value());
REQUIRE(r->pc_module == "zlib");
}
TEST_CASE("pc_scan returns ResolutionUnknownPackage when nothing matches",
"[resolver][pc_scan]") {
auto store = fresh_store();
touch_pc(store, "totally-unrelated.pc");
auto r = pc_scan(store, "sqlite");
REQUIRE_FALSE(r.has_value());
REQUIRE(r.error().code == ErrorCode::ResolutionUnknownPackage);
}
TEST_CASE("pc_scan errors when lib/pkgconfig is missing",
"[resolver][pc_scan]") {
auto d = std::filesystem::temp_directory_path() /
std::format("cargoxx-pc-empty-{}", std::random_device{}());
std::filesystem::create_directories(d);
auto r = pc_scan(d, "sqlite");
REQUIRE_FALSE(r.has_value());
REQUIRE(r.error().code == ErrorCode::ResolutionUnknownPackage);
}
TEST_CASE("pc_scan skips .pc files that look like junk",
"[resolver][pc_scan]") {
auto store = fresh_store();
touch_pc(store, "sqlite3.pc", "this is not a real pc file\n");
auto r = pc_scan(store, "sqlite3");
REQUIRE_FALSE(r.has_value());
REQUIRE(r.error().code == ErrorCode::ResolutionUnknownPackage);
}