You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.0 KiB
81 lines
2.0 KiB
2 weeks ago
|
#include <catch2/catch_test_macros.hpp>
|
||
|
#include <fmt/core.h>
|
||
|
#include <string>
|
||
|
#include "dinkyecs.hpp"
|
||
|
#include "components.hpp"
|
||
|
#include "save.hpp"
|
||
|
#include <optional>
|
||
|
#include <iostream>
|
||
|
#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> 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<Robot>();
|
||
|
|
||
|
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>(player);
|
||
|
|
||
|
world.set<Position>(player.entity, {10,10});
|
||
|
world.set<Motion>(player.entity, {0, 0});
|
||
|
world.set<Combat>(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<Position>(player.entity);
|
||
|
Position &position2 = in_world.get<Position>(player.entity);
|
||
|
|
||
|
// BUGGGGGGGG! This doesn't actually work, it's all fake
|
||
|
// The world uses an internal id to increment entities so
|
||
|
// by default player gets the first one, but all data after
|
||
|
// that is wrong.
|
||
|
REQUIRE(position1.location.x == position2.location.x);
|
||
|
REQUIRE(position1.location.y == position2.location.y);
|
||
|
}
|