[M6] codegen: dev_recipes, [build].include_dirs, baseline warnings, catch_discover_tests
This commit is contained in:
@@ -69,7 +69,7 @@ TEST_CASE("cmake_lists for a binary-only project", "[codegen][cmake]") {
|
||||
.examples = {},
|
||||
};
|
||||
Lockfile lock = lock_minimal();
|
||||
GenerateInputs in{m, layout, lock, {}, ROOT};
|
||||
GenerateInputs in{m, layout, lock, {}, {}, ROOT};
|
||||
|
||||
auto out = cmake_lists(in);
|
||||
REQUIRE(out.find("project(hello LANGUAGES CXX)") != std::string::npos);
|
||||
@@ -91,7 +91,7 @@ TEST_CASE("cmake_lists for a library-only project", "[codegen][cmake]") {
|
||||
.examples = {},
|
||||
};
|
||||
Lockfile lock = lock_minimal();
|
||||
GenerateInputs in{m, layout, lock, {}, ROOT};
|
||||
GenerateInputs in{m, layout, lock, {}, {}, ROOT};
|
||||
|
||||
auto out = cmake_lists(in);
|
||||
REQUIRE(out.find("add_library(widget STATIC)") != std::string::npos);
|
||||
@@ -110,7 +110,7 @@ TEST_CASE("cmake_lists wires up library + primary binary", "[codegen][cmake]") {
|
||||
.examples = {},
|
||||
};
|
||||
Lockfile lock = lock_minimal();
|
||||
GenerateInputs in{m, layout, lock, {}, ROOT};
|
||||
GenerateInputs in{m, layout, lock, {}, {}, ROOT};
|
||||
|
||||
auto out = cmake_lists(in);
|
||||
REQUIRE(out.find("add_library(app STATIC)") != std::string::npos);
|
||||
@@ -133,7 +133,7 @@ TEST_CASE("cmake_lists emits extra binaries from src/bin/", "[codegen][cmake]")
|
||||
.examples = {},
|
||||
};
|
||||
Lockfile lock = lock_minimal();
|
||||
GenerateInputs in{m, layout, lock, {}, ROOT};
|
||||
GenerateInputs in{m, layout, lock, {}, {}, ROOT};
|
||||
|
||||
auto out = cmake_lists(in);
|
||||
REQUIRE(out.find("add_executable(app_bin ../src/main.cpp)") != std::string::npos);
|
||||
@@ -150,7 +150,7 @@ TEST_CASE("cmake_lists emits tests with add_test", "[codegen][cmake]") {
|
||||
.examples = {},
|
||||
};
|
||||
Lockfile lock = lock_minimal();
|
||||
GenerateInputs in{m, layout, lock, {}, ROOT};
|
||||
GenerateInputs in{m, layout, lock, {}, {}, ROOT};
|
||||
|
||||
auto out = cmake_lists(in);
|
||||
REQUIRE(out.find("enable_testing()") != std::string::npos);
|
||||
@@ -167,7 +167,7 @@ TEST_CASE("cmake_lists emits examples", "[codegen][cmake]") {
|
||||
.examples = {src_target(TargetKind::Example, "demo", "examples/demo.cpp")},
|
||||
};
|
||||
Lockfile lock = lock_minimal();
|
||||
GenerateInputs in{m, layout, lock, {}, ROOT};
|
||||
GenerateInputs in{m, layout, lock, {}, {}, ROOT};
|
||||
|
||||
auto out = cmake_lists(in);
|
||||
REQUIRE(out.find("add_executable(example_demo ../examples/demo.cpp)") !=
|
||||
@@ -188,7 +188,7 @@ TEST_CASE("cmake_lists emits find_package per dep", "[codegen][cmake]") {
|
||||
recipe("Boost REQUIRED COMPONENTS filesystem system",
|
||||
{"Boost::filesystem", "Boost::system"}),
|
||||
};
|
||||
GenerateInputs in{m, layout, lock, recipes, ROOT};
|
||||
GenerateInputs in{m, layout, lock, recipes, {}, ROOT};
|
||||
|
||||
auto out = cmake_lists(in);
|
||||
REQUIRE(out.find("find_package(fmt CONFIG REQUIRED)") != std::string::npos);
|
||||
@@ -216,7 +216,7 @@ TEST_CASE("cmake_lists honors warnings_as_errors", "[codegen][cmake]") {
|
||||
.examples = {},
|
||||
};
|
||||
Lockfile lock = lock_minimal();
|
||||
GenerateInputs in{m, layout, lock, {}, ROOT};
|
||||
GenerateInputs in{m, layout, lock, {}, {}, ROOT};
|
||||
|
||||
auto out = cmake_lists(in);
|
||||
REQUIRE(out.find("foreach(target_name IN ITEMS app_bin)") != std::string::npos);
|
||||
@@ -236,7 +236,7 @@ TEST_CASE("cmake_lists honors sanitizers", "[codegen][cmake]") {
|
||||
.examples = {},
|
||||
};
|
||||
Lockfile lock = lock_minimal();
|
||||
GenerateInputs in{m, layout, lock, {}, ROOT};
|
||||
GenerateInputs in{m, layout, lock, {}, {}, ROOT};
|
||||
|
||||
auto out = cmake_lists(in);
|
||||
REQUIRE(out.find("-fsanitize=address,undefined") != std::string::npos);
|
||||
@@ -254,11 +254,11 @@ TEST_CASE("cmake_lists maps editions to standard numbers", "[codegen][cmake]") {
|
||||
Lockfile lock = lock_minimal();
|
||||
|
||||
Manifest m20{pkg("app", Edition::Cpp20), {}, {}};
|
||||
REQUIRE(cmake_lists(GenerateInputs{m20, layout, lock, {}, ROOT})
|
||||
REQUIRE(cmake_lists(GenerateInputs{m20, layout, lock, {}, {}, ROOT})
|
||||
.find("set(CMAKE_CXX_STANDARD 20)") != std::string::npos);
|
||||
|
||||
Manifest m26{pkg("app", Edition::Cpp26), {}, {}};
|
||||
REQUIRE(cmake_lists(GenerateInputs{m26, layout, lock, {}, ROOT})
|
||||
REQUIRE(cmake_lists(GenerateInputs{m26, layout, lock, {}, {}, ROOT})
|
||||
.find("set(CMAKE_CXX_STANDARD 26)") != std::string::npos);
|
||||
}
|
||||
|
||||
@@ -273,7 +273,72 @@ TEST_CASE("cmake_lists is deterministic", "[codegen][cmake]") {
|
||||
};
|
||||
Lockfile lock = lock_minimal();
|
||||
std::vector<Recipe> recipes = {recipe("fmt CONFIG REQUIRED", {"fmt::fmt"})};
|
||||
GenerateInputs in{m, layout, lock, recipes, ROOT};
|
||||
GenerateInputs in{m, layout, lock, recipes, {}, ROOT};
|
||||
|
||||
REQUIRE(cmake_lists(in) == cmake_lists(in));
|
||||
}
|
||||
|
||||
TEST_CASE("cmake_lists emits baseline warnings", "[codegen][cmake]") {
|
||||
Manifest m{pkg("app"), {}, {}};
|
||||
DiscoveredLayout layout{
|
||||
.library = std::nullopt,
|
||||
.binaries = {src_target(TargetKind::Binary, "app", "src/main.cpp")},
|
||||
.tests = {},
|
||||
.examples = {},
|
||||
};
|
||||
Lockfile lock = lock_minimal();
|
||||
GenerateInputs in{m, layout, lock, {}, {}, ROOT};
|
||||
|
||||
auto out = cmake_lists(in);
|
||||
REQUIRE(out.find("add_compile_options(-Wall -Wextra -Wpedantic -Wconversion)") !=
|
||||
std::string::npos);
|
||||
}
|
||||
|
||||
TEST_CASE("cmake_lists emits target_include_directories for [build].include_dirs",
|
||||
"[codegen][cmake]") {
|
||||
Manifest m{
|
||||
.package = pkg("widget"),
|
||||
.build = BuildSettings{.include_dirs = {"third_party", "vendor/json"}},
|
||||
};
|
||||
DiscoveredLayout layout{
|
||||
.library = src_target(TargetKind::Library, "widget", "src/lib.cppm",
|
||||
{"src/lib.cppm"}),
|
||||
.binaries = {},
|
||||
.tests = {},
|
||||
.examples = {},
|
||||
};
|
||||
Lockfile lock = lock_minimal();
|
||||
GenerateInputs in{m, layout, lock, {}, {}, ROOT};
|
||||
|
||||
auto out = cmake_lists(in);
|
||||
REQUIRE(out.find("target_include_directories(widget SYSTEM PRIVATE "
|
||||
"../third_party ../vendor/json)") != std::string::npos);
|
||||
}
|
||||
|
||||
TEST_CASE("cmake_lists threads dev_recipes through find_package and tests",
|
||||
"[codegen][cmake]") {
|
||||
Manifest m{pkg("app"), {}, {}};
|
||||
DiscoveredLayout layout{
|
||||
.library = src_target(TargetKind::Library, "app", "src/lib.cppm",
|
||||
{"src/lib.cppm"}),
|
||||
.binaries = {},
|
||||
.tests = {src_target(TargetKind::Test, "basic", "tests/basic.cpp")},
|
||||
.examples = {},
|
||||
};
|
||||
Lockfile lock = lock_minimal();
|
||||
std::vector<Recipe> dev_recipes = {
|
||||
recipe("Catch2 CONFIG REQUIRED", {"Catch2::Catch2WithMain"}),
|
||||
};
|
||||
GenerateInputs in{m, layout, lock, {}, dev_recipes, ROOT};
|
||||
|
||||
auto out = cmake_lists(in);
|
||||
REQUIRE(out.find("find_package(Catch2 CONFIG REQUIRED)") != std::string::npos);
|
||||
REQUIRE(out.find("include(Catch)") != std::string::npos);
|
||||
REQUIRE(out.find("catch_discover_tests(test_basic)") != std::string::npos);
|
||||
REQUIRE(out.find("add_test(NAME basic") == std::string::npos);
|
||||
auto link = out.find("target_link_libraries(test_basic PRIVATE");
|
||||
REQUIRE(link != std::string::npos);
|
||||
auto end = out.find(')', link);
|
||||
auto block = out.substr(link, end - link);
|
||||
REQUIRE(block.find("Catch2::Catch2WithMain") != std::string::npos);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user