#include #include #include #include "billy_objects.hpp" #include "character_sheet.hpp" using namespace character; namespace character::test { struct DummyObject { BillyObjects::container objects; }; void to_json(json &j, const DummyObject &a) { j.emplace(std::pair{ BillyObjects::json_key, json::array() }); BillyObjects::to_json(j.at(BillyObjects::json_key), a.objects); } void from_json(const json &j, DummyObject &dummy) { BillyObjects::from_json(j, dummy.objects); } } TEST_CASE("[C] Serialize empty BillyObjects", "[serialize][0]") { CharacterSheet sheet; json serializer; REQUIRE_NOTHROW(serializer.emplace("sheet", sheet)); const auto tester = serializer.at("sheet").at(BillyObjects::json_key); serializer.clear(); REQUIRE_NOTHROW(tester.empty() == true); REQUIRE(tester.empty()); { std::ofstream file{ "billy_objects_empty.json" }; file << tester << std::flush; } } TEST_CASE("[C] Serialize full BillyObjects", "[serialize][1]") { BillyObjects gestionnaire{}; test::DummyObject dummy_object; { CharacterSheet sheet; gestionnaire.push_object(weapons::Sword, sheet); gestionnaire.push_object(tools::Fourche, sheet); gestionnaire.push_object(equipments::MedicKit, sheet); dummy_object.objects = sheet.get_objects(); } json serializer; REQUIRE_NOTHROW(serializer.emplace("sheet", dummy_object)); const auto &tester = serializer.at("sheet").at(BillyObjects::json_key); REQUIRE_FALSE(tester.empty()); { std::ofstream file{ "billy_objects_full.json" }; file << tester << std::flush; } } TEST_CASE("[D] Deserialize empty BillyObjects", "[deserialize][0]") { BillyObjects gestionnaire{}; test::DummyObject dummy_object; const auto deserializer = []() -> json { std::ifstream file{ "billy_objects_empty.json" }; return json::parse(file); }(); REQUIRE_NOTHROW(deserializer.get_to(dummy_object)); REQUIRE_FALSE(!dummy_object.objects.empty()); } TEST_CASE("[D] Deserialize full BillyObjects", "[deserialize][1]") { BillyObjects gestionnaire{}; test::DummyObject dummy_object; const auto deserializer = []() -> json { std::ifstream file{ "billy_objects_full.json" }; return json::parse(file); }(); REQUIRE_NOTHROW(deserializer.get_to(dummy_object)); REQUIRE_FALSE(dummy_object.objects.empty()); REQUIRE_FALSE(std::holds_alternative(dummy_object.objects[0])); REQUIRE(std::holds_alternative(dummy_object.objects[0])); REQUIRE(std::get(dummy_object.objects[0]) == weapons::Sword); REQUIRE_FALSE(std::holds_alternative(dummy_object.objects[1])); REQUIRE(std::holds_alternative(dummy_object.objects[1])); REQUIRE(std::get(dummy_object.objects[1]) == tools::Fourche); REQUIRE_FALSE(std::holds_alternative(dummy_object.objects[2])); REQUIRE(std::holds_alternative(dummy_object.objects[2])); REQUIRE(std::get(dummy_object.objects[2]) == equipments::MedicKit); } TEST_CASE("[D] Pushing popping BillyObjects", "[pushpop][0]") { constexpr std::array all_objects{ weapons::Sword, weapons::Lance, weapons::Morgenstern, weapons::Bow, equipments::Chainmail, equipments::CookingPot, equipments::PamphletTourist, equipments::MedicKit, tools::Fourche, tools::Dagger, tools::RockClimbingKit, tools::SackOfGrain, }; BillyObjects gestionnaire{}; CharacterSheet sheet; REQUIRE(sheet.get_objects().empty()); REQUIRE_NOTHROW(gestionnaire.push_object(weapons::Sword, sheet)); REQUIRE_FALSE(sheet.get_objects().empty()); REQUIRE(std::holds_alternative(sheet.get_objects().back())); REQUIRE(std::get(sheet.get_objects().back()) == weapons::Sword); REQUIRE_NOTHROW(gestionnaire.pop_object(sheet)); REQUIRE(sheet.get_objects().empty()); for (std::size_t j = 0; j < all_objects.size(); j += 3) { for (std::size_t i = 0; i < 3; ++i) { REQUIRE_NOTHROW(gestionnaire.push_object(all_objects[i + j], sheet)); } REQUIRE_FALSE(sheet.get_objects().empty()); for (std::size_t i = 0; i < 3; ++i) { REQUIRE_NOTHROW(gestionnaire.pop_object(sheet)); } REQUIRE(sheet.get_objects().empty()); } } TEST_CASE("[D] Printing Billy's objects", "[printing]") { for (const auto &object: BillyObjects::all_objects) { REQUIRE_NOTHROW(BillyObjects::billy_object_to_string(object)); } } TEST_CASE("[Z] Cleaning after all tests", "[cleaning]") { namespace fs = std::filesystem; const auto pwd = is_directory(fs::current_path()) ? fs::directory_iterator(fs::current_path()) : fs::directory_iterator(fs::current_path().root_directory()); for (const auto &entry: pwd) { if (entry.is_regular_file() && entry.path().extension() == ".json") { fs::remove(entry); } } }