#include #include #include #define CATCH_CONFIG_MAIN #include //#define MAX_ZECSY_ENTITIES 4 #include "../zecsy.hpp" using namespace zecsy; TEST_CASE("Create a single entity and verify its existence") { world w; auto e = w.make_entity(); REQUIRE(w.is_alive(e)); REQUIRE(e.is_alive()); } TEST_CASE("Destroy an entity and ensure it no longer exists in the world") { world w; auto e = w.make_entity(); w.destroy_entity(e); REQUIRE_FALSE(w.is_alive(e)); REQUIRE_FALSE(e.is_alive()); } TEST_CASE("Entity #0 should be reserved and never used") { world w; auto e = w.make_entity(); REQUIRE(e != 0); REQUIRE(entity() == 0); REQUIRE_FALSE(entity().is_alive()); } TEST_CASE("World should throw on id overflow") { world w; for(int i = 0; i < MAX_ZECSY_ENTITIES; ++i) { w.make_entity(); } REQUIRE_THROWS(w.make_entity()); } struct ChoosenOne { }; TEST_CASE("Entity shouldn't have a component that wasn't attached to it") { world w; auto e = w.make_entity(); REQUIRE_FALSE(w.has(e)); REQUIRE_FALSE(e.has()); } TEST_CASE("Attempt of getting non-owned component should throw") { world w; auto e = w.make_entity(); REQUIRE_THROWS(w.get(e)); REQUIRE_THROWS(e.get()); } TEST_CASE("Attach a simple component to an entity and verify it is correctly associated") { world w; auto e1 = w.make_entity(); e1.set(ChoosenOne{}); REQUIRE(e1.has()); REQUIRE(w.has(e1)); auto e2 = w.make_entity(); w.set(e2, ChoosenOne{}); REQUIRE(e2.has()); REQUIRE(w.has(e2)); } struct Name { std::string value; }; TEST_CASE("Retrieve a component from an entity and verify its data matches what was set") { world w; auto e = w.make_entity(); e.set(Name{"zecsy!"}); REQUIRE(e.get().value == "zecsy!"); e.get().value = "super-zecsy!"; REQUIRE(e.get().value == "super-zecsy!"); } TEST_CASE("Remove a component from an entity and verify it is no longer attached") { world w; auto e = w.make_entity(); e.set(ChoosenOne{}); REQUIRE_NOTHROW(e.remove()); REQUIRE_FALSE(e.has()); e.set(ChoosenOne{}); REQUIRE_NOTHROW(w.remove(e)); REQUIRE_FALSE(w.has(e)); } TEST_CASE("Addresses of removed components should be reused") { world w; std::vector entities; std::vector addr; const int N = 4; for(int i = 0; i < 2; ++i) { for(int j = 0; j < N; ++j) { entities.emplace_back(w.make_entity()); entities.back().set(); } if(addr.empty()) { for(int j = 0; j < N; ++j) { addr.emplace_back(&entities[j].get()); } } else { for(int j = 0; j < N; ++j) { REQUIRE(&entities[j].get() == addr[j]); } } for(auto e: entities) { e.remove(); } entities.clear(); } }