113 lines
2.3 KiB
C++
113 lines
2.3 KiB
C++
#include <psemek/test/test.hpp>
|
|
|
|
#include <psemek/ecs/entity_container.hpp>
|
|
#include <psemek/random/generator.hpp>
|
|
#include <psemek/random/uniform.hpp>
|
|
|
|
using namespace psemek;
|
|
using namespace psemek::ecs;
|
|
|
|
namespace
|
|
{
|
|
|
|
struct component_1
|
|
{
|
|
int value;
|
|
|
|
static constexpr util::uuid uuid()
|
|
{
|
|
return {1, 0};
|
|
}
|
|
};
|
|
|
|
struct component_2
|
|
{
|
|
int value;
|
|
|
|
static constexpr util::uuid uuid()
|
|
{
|
|
return {2, 0};
|
|
}
|
|
};
|
|
|
|
}
|
|
|
|
test_case(ecs_apply_empty)
|
|
{
|
|
entity_container container;
|
|
|
|
int const count = 2048;
|
|
for (int i = 0; i < count; ++i)
|
|
container.create();
|
|
|
|
int call_count = 0;
|
|
container.apply<>([&](ecs::entity_handle const &){ ++call_count; });
|
|
expect_equal(count, call_count);
|
|
}
|
|
|
|
test_case(ecs_apply_components_1)
|
|
{
|
|
entity_container container;
|
|
random::generator rng;
|
|
|
|
int const expected_count = 1024 * 1024;
|
|
int expected_sum = 0;
|
|
|
|
for (int i = 0; i < expected_count; ++i)
|
|
{
|
|
int value = random::uniform(rng, -1024, 1024);
|
|
expected_sum += value;
|
|
container.create(component_1{value});
|
|
}
|
|
|
|
int count = 0;
|
|
int sum = 0;
|
|
container.apply<component_1>([&](ecs::entity_handle const &, component_1 const & component){
|
|
++count;
|
|
sum += component.value;
|
|
});
|
|
|
|
expect_equal(count, expected_count);
|
|
expect_equal(sum, expected_sum);
|
|
}
|
|
|
|
test_case(ecs_apply_components_2)
|
|
{
|
|
entity_container container;
|
|
random::generator rng;
|
|
|
|
int const expected_count = 1024*1024;
|
|
int expected_sum = 0;
|
|
|
|
for (int i = 0; i < expected_count; ++i)
|
|
{
|
|
int value = random::uniform(rng, -1024, 1024);
|
|
int type = random::uniform(rng, 0, 2);
|
|
if (type == 0)
|
|
container.create(component_1{value});
|
|
else if (type == 1)
|
|
container.create(component_2{value});
|
|
else if (type == 2)
|
|
container.create(component_1{value}, component_2{value});
|
|
|
|
expected_sum += value;
|
|
}
|
|
|
|
int count = 0;
|
|
int sum = 0;
|
|
container.apply<component_1>([&](ecs::entity_handle const &, component_1 const & component){
|
|
++count;
|
|
sum += component.value;
|
|
});
|
|
container.apply<component_2>([&](ecs::entity_handle const &, component_2 const & component){
|
|
++count;
|
|
sum += component.value;
|
|
});
|
|
container.apply<component_1, component_2>([&](ecs::entity_handle const &, component_1 const & component1, component_2 const &){
|
|
--count;
|
|
sum -= component1.value;
|
|
});
|
|
|
|
expect_equal(count, expected_count);
|
|
expect_equal(sum, expected_sum);
|
|
}
|