#include #include #include #include #include "daggy/Serialization.hpp" namespace fs = std::filesystem; TEST_CASE("parameter_deserialization", "[deserialize_parameters]") { SECTION("Basic Parse") { std::string testParams{ R"({"DATE": ["2021-05-06", "2021-05-07" ], "SOURCE": "name"})"}; auto params = daggy::configFromJSON(testParams); REQUIRE(params.size() == 2); REQUIRE(std::holds_alternative>(params["DATE"])); REQUIRE(std::holds_alternative(params["SOURCE"])); } SECTION("Invalid JSON") { std::string testParams{ R"({"DATE": ["2021-05-06", "2021-05-07" ], "SOURCE": "name")"}; REQUIRE_THROWS(daggy::configFromJSON(testParams)); } SECTION("Non-string Keys") { std::string testParams{ R"({"DATE": ["2021-05-06", "2021-05-07" ], 6: "name"})"}; REQUIRE_THROWS(daggy::configFromJSON(testParams)); } SECTION("Non-array/Non-string values") { std::string testParams{ R"({"DATE": ["2021-05-06", "2021-05-07" ], "SOURCE": {"name": "kevin"}})"}; REQUIRE_THROWS(daggy::configFromJSON(testParams)); } } TEST_CASE("task_deserialization", "[deserialize_task]") { SECTION("Build with no expansion") { std::string testTasks = R"({ "A": { "job": { "command": ["/bin/echo", "A"] }, "children": ["C"] }, "B": { "job": {"command": ["/bin/echo", "B"]}, "children": ["C"] }, "C": { "job": {"command": ["/bin/echo", "C"]} } })"; auto tasks = daggy::tasksFromJSON(testTasks); REQUIRE(tasks.size() == 3); } SECTION("Build with job defaults") { std::string testTasks = R"({ "A": { "job": { "command": ["/bin/echo", "A"] }, "children": ["B"] }, "B": { "job": { "command": ["/bin/echo", "C"], "memory": "1G" } } })"; daggy::ConfigValues jobDefaults{{"runtime", "60"}, {"memory", "300M"}}; auto tasks = daggy::tasksFromJSON(testTasks, jobDefaults); REQUIRE(tasks.size() == 2); REQUIRE(std::get(tasks["A"].job["runtime"]) == "60"); REQUIRE(std::get(tasks["A"].job["memory"]) == "300M"); REQUIRE(std::get(tasks["B"].job["runtime"]) == "60"); REQUIRE(std::get(tasks["B"].job["memory"]) == "1G"); } } TEST_CASE("task_serialization", "[serialize_tasks]") { SECTION("Build with no expansion") { std::string testTasks = R"({"A": {"job": {"command": ["/bin/echo", "A"]}, "children": ["C"]}, "B": {"job": {"command": ["/bin/echo", "B"]}, "children": ["C"]}, "C": {"job": {"command": ["/bin/echo", "C"]}}})"; auto tasks = daggy::tasksFromJSON(testTasks); auto genJSON = daggy::tasksToJSON(tasks); auto regenTasks = daggy::tasksFromJSON(genJSON); REQUIRE(regenTasks.size() == tasks.size()); for (const auto &[name, task] : regenTasks) { const auto &other = tasks[name]; REQUIRE(task == other); } } }