[M5+] add resolver::vcpkg_probe
This commit is contained in:
@@ -30,3 +30,5 @@ cargoxx_add_test(nix_cmake_scan_parse)
|
||||
cargoxx_add_test(nix_cmake_scan_live)
|
||||
cargoxx_add_test(conan_probe_parse)
|
||||
cargoxx_add_test(conan_probe_live)
|
||||
cargoxx_add_test(vcpkg_probe_parse)
|
||||
cargoxx_add_test(vcpkg_probe_live)
|
||||
|
||||
43
tests/vcpkg_probe_live.cpp
Normal file
43
tests/vcpkg_probe_live.cpp
Normal file
@@ -0,0 +1,43 @@
|
||||
// Network-gated integration test for resolver::vcpkg_probe.
|
||||
|
||||
#include <catch2/catch_test_macros.hpp>
|
||||
|
||||
import cargoxx.resolver;
|
||||
import cargoxx.util;
|
||||
import std;
|
||||
|
||||
namespace {
|
||||
|
||||
auto network_tests_enabled() -> bool {
|
||||
auto* env = std::getenv("CARGOXX_NETWORK_TESTS");
|
||||
return env != nullptr && std::string_view{env} == "1";
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
TEST_CASE("vcpkg_probe finds 'fmt' in microsoft/vcpkg",
|
||||
"[resolver][network]") {
|
||||
if (!network_tests_enabled()) {
|
||||
SKIP("CARGOXX_NETWORK_TESTS != 1");
|
||||
}
|
||||
auto r = cargoxx::resolver::vcpkg_probe("fmt");
|
||||
REQUIRE(r.has_value());
|
||||
REQUIRE(r->find_package.starts_with("fmt"));
|
||||
REQUIRE_FALSE(r->targets.empty());
|
||||
// fmt's vcpkg port should expose at least one fmt:: target.
|
||||
REQUIRE(std::ranges::any_of(r->targets, [](const std::string& t) {
|
||||
return t.starts_with("fmt::");
|
||||
}));
|
||||
}
|
||||
|
||||
TEST_CASE("vcpkg_probe returns ResolutionUnknownPackage for a 404",
|
||||
"[resolver][network]") {
|
||||
if (!network_tests_enabled()) {
|
||||
SKIP("CARGOXX_NETWORK_TESTS != 1");
|
||||
}
|
||||
auto r = cargoxx::resolver::vcpkg_probe(
|
||||
"definitely_not_a_real_pkg_cargoxx_xyzzy");
|
||||
REQUIRE_FALSE(r.has_value());
|
||||
REQUIRE(r.error().code ==
|
||||
cargoxx::util::ErrorCode::ResolutionUnknownPackage);
|
||||
}
|
||||
71
tests/vcpkg_probe_parse.cpp
Normal file
71
tests/vcpkg_probe_parse.cpp
Normal file
@@ -0,0 +1,71 @@
|
||||
#include <catch2/catch_test_macros.hpp>
|
||||
|
||||
import cargoxx.resolver;
|
||||
import cargoxx.util;
|
||||
import std;
|
||||
|
||||
using cargoxx::resolver::parse_vcpkg_usage;
|
||||
using cargoxx::util::ErrorCode;
|
||||
|
||||
TEST_CASE("parse_vcpkg_usage extracts find_package and a target",
|
||||
"[resolver][vcpkg]") {
|
||||
constexpr std::string_view text = R"(fmt provides CMake targets:
|
||||
|
||||
find_package(fmt CONFIG REQUIRED)
|
||||
target_link_libraries(main PRIVATE fmt::fmt)
|
||||
)";
|
||||
auto r = parse_vcpkg_usage(text);
|
||||
REQUIRE(r.has_value());
|
||||
REQUIRE(r->find_package == "fmt CONFIG REQUIRED");
|
||||
REQUIRE(r->targets == std::vector<std::string>{"fmt::fmt"});
|
||||
}
|
||||
|
||||
TEST_CASE("parse_vcpkg_usage adds REQUIRED when missing", "[resolver][vcpkg]") {
|
||||
constexpr std::string_view text = R"(
|
||||
find_package(spdlog CONFIG)
|
||||
target_link_libraries(main PRIVATE spdlog::spdlog)
|
||||
)";
|
||||
auto r = parse_vcpkg_usage(text);
|
||||
REQUIRE(r.has_value());
|
||||
REQUIRE(r->find_package == "spdlog CONFIG REQUIRED");
|
||||
}
|
||||
|
||||
TEST_CASE("parse_vcpkg_usage dedupes targets", "[resolver][vcpkg]") {
|
||||
constexpr std::string_view text = R"(
|
||||
find_package(boost CONFIG REQUIRED)
|
||||
target_link_libraries(main PRIVATE Boost::filesystem Boost::system Boost::filesystem)
|
||||
)";
|
||||
auto r = parse_vcpkg_usage(text);
|
||||
REQUIRE(r.has_value());
|
||||
REQUIRE(r->targets == std::vector<std::string>{"Boost::filesystem", "Boost::system"});
|
||||
}
|
||||
|
||||
TEST_CASE("parse_vcpkg_usage skips generator-expression and bare-name tokens",
|
||||
"[resolver][vcpkg]") {
|
||||
constexpr std::string_view text = R"(
|
||||
find_package(qt6 CONFIG REQUIRED)
|
||||
target_link_libraries(main PRIVATE Qt6::Core $<TARGET_NAME:Qt6::Gui> mylib)
|
||||
)";
|
||||
auto r = parse_vcpkg_usage(text);
|
||||
REQUIRE(r.has_value());
|
||||
// mylib lacks "::", $<...> contains '$' — both excluded.
|
||||
REQUIRE(r->targets == std::vector<std::string>{"Qt6::Core"});
|
||||
}
|
||||
|
||||
TEST_CASE("parse_vcpkg_usage errors when no find_package directive present",
|
||||
"[resolver][vcpkg]") {
|
||||
auto r = parse_vcpkg_usage("nothing useful here");
|
||||
REQUIRE_FALSE(r.has_value());
|
||||
REQUIRE(r.error().code == ErrorCode::ResolutionUnknownPackage);
|
||||
}
|
||||
|
||||
TEST_CASE("parse_vcpkg_usage handles target_link_libraries with PUBLIC visibility",
|
||||
"[resolver][vcpkg]") {
|
||||
constexpr std::string_view text = R"(
|
||||
find_package(eigen3 CONFIG REQUIRED)
|
||||
target_link_libraries(main PUBLIC Eigen3::Eigen)
|
||||
)";
|
||||
auto r = parse_vcpkg_usage(text);
|
||||
REQUIRE(r.has_value());
|
||||
REQUIRE(r->targets == std::vector<std::string>{"Eigen3::Eigen"});
|
||||
}
|
||||
Reference in New Issue
Block a user