#include #include #include #include "dinkyecs.hpp" #include "components.hpp" #include "save.hpp" #include #include #include "tser.hpp" using namespace fmt; using std::string; using namespace components; enum class Item : char { RADAR = 'R', TRAP = 'T', ORE = 'O' }; struct Pixel { int x = 0; int y = 0; DEFINE_SERIALIZABLE(Pixel, x, y); }; struct Robot { Pixel point; std::wstring name; std::optional item; DEFINE_SERIALIZABLE(Robot, point, name, item); }; TEST_CASE("test using tser for serialization", "[config]") { auto robot = Robot{ Pixel{3,4}, L"BIG NAME", Item::RADAR}; std::cout << robot << '\n'; tser::BinaryArchive archive; archive.save(robot); std::string_view archive_view = archive.get_buffer(); tser::BinaryArchive archive2(0); archive2.initialize(archive_view); auto loadedRobot = archive2.load(); REQUIRE(loadedRobot.point.x == robot.point.x); REQUIRE(loadedRobot.point.y == robot.point.y); REQUIRE(loadedRobot.name == robot.name); REQUIRE(loadedRobot.item == robot.item); } TEST_CASE("basic save a world", "[save]") { DinkyECS::World world; // configure a player as a fact of the world Player player{world.entity()}; world.set_the(player); world.set(player.entity, {10,10}); world.set(player.entity, {0, 0}); world.set(player.entity, {100, 10}); save::to_file("./savetest.world", world); DinkyECS::World in_world; save::from_file("./savetest.world", in_world); Position &position1 = world.get(player.entity); Position &position2 = in_world.get(player.entity); REQUIRE(position1.location.x == position2.location.x); REQUIRE(position1.location.y == position2.location.y); Combat &combat1 = in_world.get(player.entity); Combat &combat2 = in_world.get(player.entity); REQUIRE(combat1.hp == combat2.hp); Motion &motion1 = in_world.get(player.entity); Motion &motion2 = in_world.get(player.entity); REQUIRE(motion1.dx == motion2.dx); REQUIRE(motion1.dy == motion2.dy); }