[M6] manifest: add dev_dependencies and [build].include_dirs

This commit is contained in:
2026-05-13 23:53:23 +00:00
parent 654fd8d245
commit 1e6667a20a
6 changed files with 124 additions and 25 deletions

View File

@@ -199,9 +199,6 @@ TEST_CASE("parse accepts reserved top-level tables", "[manifest][parse]") {
name = "foo"
version = "0.1.0"
[dev-dependencies]
gtest = "1.14"
[features]
default = []
@@ -212,6 +209,63 @@ members = ["a"]
REQUIRE(r.has_value());
}
TEST_CASE("parse extracts dev-dependencies", "[manifest][parse]") {
auto p = write_manifest(R"(
[package]
name = "foo"
version = "0.1.0"
[dev-dependencies]
catch2 = "3.5.0"
gtest = { version = "1.14", components = ["gmock"] }
)");
auto r = parse(p);
REQUIRE(r.has_value());
REQUIRE(r->dev_dependencies.size() == 2);
auto find = [&](std::string_view n) {
return std::ranges::find_if(r->dev_dependencies,
[&](const auto& d) { return d.name == n; });
};
auto catch2 = find("catch2");
REQUIRE(catch2 != r->dev_dependencies.end());
REQUIRE(catch2->version_spec == "3.5.0");
REQUIRE(catch2->components.empty());
auto gtest = find("gtest");
REQUIRE(gtest != r->dev_dependencies.end());
REQUIRE(gtest->version_spec == "1.14");
REQUIRE(gtest->components == std::vector<std::string>{"gmock"});
}
TEST_CASE("parse extracts [build].include_dirs", "[manifest][parse]") {
auto p = write_manifest(R"(
[package]
name = "foo"
version = "0.1.0"
[build]
include_dirs = ["third_party", "vendor/spdlog"]
)");
auto r = parse(p);
REQUIRE(r.has_value());
REQUIRE(r->build.include_dirs ==
std::vector<std::string>{"third_party", "vendor/spdlog"});
}
TEST_CASE("parse rejects [build].include_dirs that escape the project",
"[manifest][parse]") {
auto p = write_manifest(R"(
[package]
name = "foo"
version = "0.1.0"
[build]
include_dirs = ["../escape"]
)");
auto r = parse(p);
REQUIRE_FALSE(r.has_value());
REQUIRE(r.error().code == cargoxx::util::ErrorCode::ManifestInvalidField);
}
TEST_CASE("parse rejects invalid name with spaces", "[manifest][parse]") {
auto p = write_manifest(R"(
[package]