ecs
Loading...
Searching...
No Matches
TestEcs.cpp
#include <gtest/gtest.h>
#include <string>
#include <memory>
#include <iostream>
#include "Ecs.hpp"
using namespace ecs;
struct Velocity {
int x, y;
bool operator==(const Velocity& other) const { return x == other.x && y == other.y; }
friend std::ostream& operator<<(std::ostream& os, const Velocity& v) {
return os << "Velocity(" << v.x << "," << v.y << ")";
}
};
struct Position {
int x, y;
bool operator==(const Position& other) const { return x == other.x && y == other.y; }
void operator+=(const Velocity& vel) { x += vel.x; y += vel.y; }
friend std::ostream& operator<<(std::ostream& os, const Position& p) {
return os << "Position(" << p.x << "," << p.y << ")";
}
};
struct Health {
int value;
friend std::ostream& operator<<(std::ostream& os, const Health& h) {
return os << "Health(" << h.value << ")";
}
};
// --- Instance ---
class Singleton {
public:
static Singleton& getInstance() {
static Singleton singleton;
return singleton;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
void display(Position& v) {
std::cerr << "pos .x: " << v.x << " .y: " << v.y << std::endl;
}
private:
Singleton() {}
int n = 2;
};
// --- Systems ---
class MoveSystem: public ISystem {
public:
void update(Registry &r) override {
auto& positions = r.getComponents<Position>();
auto& velocities = r.getComponents<Velocity>();
for(size_t i = 0; i < positions.size(); ++i) {
if (positions[i] && velocities[i])
positions[i].value() += velocities[i].value();
}
}
};
class DisplaySystem: public ISystem {
public:
DisplaySystem(Singleton& s):_s(s) {}
void update(Registry &r) override {
auto& positions = r.getComponents<Position>();
auto& velocities = r.getComponents<Velocity>();
for(size_t i = 0; i < positions.size(); ++i) {
if (positions[i]) {
_s.display(positions[i].value());
}
}
}
private:
Singleton& _s;
};
class HealthSystem: public ISystem {
public:
HealthSystem(int time) {}
void update(Registry &r) override {
auto& healths = r.getComponents<Health>();
for(size_t i = 0; i < healths.size(); ++i) {
if (healths[i]) {
std::cout << "entity(" << i << "): " << healths[i].value() << std::endl;
}
}
}
};
// --- Component registration ---
TEST(RegistryTest, RegisterAndRetrieveComponents) {
Registry registry;
auto& posArray = registry.getComponents<Position>();
EXPECT_EQ(posArray.size(), 0u);
// Ensure that the same instance is returned (not copies)
EXPECT_EQ(&registry.getComponents<Position>(), &posArray);
}
// --- Register by tuple extraction ---
TEST(RegistryExtractionTest, RegisterComponentsByExtraction) {
Registry registry;
using MyComponents = std::tuple<Position, Velocity, Health>;
registry.registerComponentsByExtraction<MyComponents>();
EXPECT_NO_THROW(registry.getComponents<Position>());
EXPECT_NO_THROW(registry.getComponents<Velocity>());
EXPECT_NO_THROW(registry.getComponents<Health>());
}
TEST(RegistryExtractionTest, Intergration) {
Registry registry;
using MyComponents = std::tuple<Position, Velocity, Health>;
registry.registerComponentsByExtraction<MyComponents>();
EXPECT_NO_THROW(registry.getComponents<Position>());
EXPECT_NO_THROW(registry.getComponents<Velocity>());
EXPECT_NO_THROW(registry.getComponents<Health>());
Entity player = registry.createEntity();
Entity enemy = registry.createEntity();
Health h{};
player.addComponent(Position{0, 0}, Velocity{1, 0}, h);
enemy.addComponent(Health{});
auto&positons = registry.getComponents<Position>();
registry.addSystem(MoveSystem(), ds, HealthSystem(0));
EXPECT_EQ(positons[0].value().x, 0);
EXPECT_EQ(positons[0].value().x, 1);
}
TEST(RegistryTest, RegisterAndRetrieveComponents)
Definition TestEcs.cpp:130
Definition TestEcs.cpp:96
void update(Registry &r) override
Pure virtual function executed by all concrete systems.
Definition TestEcs.cpp:100
Definition TestEcs.cpp:114
void update(Registry &r) override
Pure virtual function executed by all concrete systems.
Definition TestEcs.cpp:118
Definition TestEcs.cpp:81
MoveSystem()
Definition TestEcs.cpp:83
void update(Registry &r) override
Pure virtual function executed by all concrete systems.
Definition TestEcs.cpp:85
Definition TestEcs.cpp:59
static Singleton & getInstance()
Definition TestEcs.cpp:61
Singleton & operator=(const Singleton &)=delete
void display(Position &v)
Definition TestEcs.cpp:71
Entity class from ECS.
Definition Entity.hpp:26
void addComponent(Component &&... c)
add a component to the entity using the registryRef method addComponent
Definition Entity_impl.hpp:24
Definition System.hpp:26
define the Registry class
Definition Registry.hpp:44
Entity createEntity()
handling entities (define in Registry.cpp)
Definition Registry.cpp:14
void callSystem()
call a system
Definition Registry_impl.hpp:93
void registerComponents()
register a list of components
Definition Registry_impl.hpp:28
SparseArray< Component > & getComponents()
get components of a given type
Definition Registry_impl.hpp:40
void addSystem(System &s)
handling systems
Definition Registry_impl.hpp:68
void registerComponentsByExtraction()
register every components by extraction from a tuple
Definition Registry_impl.hpp:33
Entity Component System.
Health Value.
Definition TestEcs.cpp:50
friend std::ostream & operator<<(std::ostream &os, const Health &h)
Definition TestEcs.cpp:53
int value
Definition TestEcs.cpp:51
2Dposition
Definition TestEcs.cpp:35
int y
Definition TestEcs.cpp:36
void operator+=(const Velocity &vel)
Definition TestEcs.cpp:39
friend std::ostream & operator<<(std::ostream &os, const Position &p)
Definition TestEcs.cpp:41
bool operator==(const Position &other) const
Definition TestEcs.cpp:38
int x
Definition TestEcs.cpp:36
2Dvelocity
Definition TestEcs.cpp:23
int x
Definition TestEcs.cpp:24
int y
Definition TestEcs.cpp:24
friend std::ostream & operator<<(std::ostream &os, const Velocity &v)
Definition TestEcs.cpp:26
bool operator==(const Velocity &other) const
Definition TestEcs.cpp:25