4427 lines
117 KiB
C
4427 lines
117 KiB
C
#include <meta.h>
|
|
|
|
void Cursor_set_bool(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_bool_t value = false;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_bool_t), &value);
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
|
|
test_bool(value, true);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_byte(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_byte_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_byte_t), &value);
|
|
test_ok( ecs_meta_set_uint(&cur, 20) );
|
|
|
|
test_uint(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_char(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_char_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_char_t), &value);
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
|
|
test_int(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_i8(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_i8_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_i8_t), &value);
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
|
|
test_int(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_i16(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_i16_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_i16_t), &value);
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
|
|
test_int(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_i32(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_i32_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_i32_t), &value);
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
|
|
test_int(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_i64(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_i64_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_i64_t), &value);
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
|
|
test_int(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_iptr(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_iptr_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_iptr_t), &value);
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
|
|
test_int(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_u8(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_u8_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_u8_t), &value);
|
|
test_ok( ecs_meta_set_uint(&cur, 20) );
|
|
|
|
test_uint(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_u16(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_u16_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_u8_t), &value);
|
|
test_ok( ecs_meta_set_uint(&cur, 20) );
|
|
|
|
test_uint(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_u32(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_u32_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_u32_t), &value);
|
|
test_ok( ecs_meta_set_uint(&cur, 20) );
|
|
|
|
test_uint(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_u64(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
{
|
|
ecs_u64_t value = 10;
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_u64_t), &value);
|
|
test_ok( ecs_meta_set_uint(&cur, 20) );
|
|
test_uint(value, 20);
|
|
}
|
|
|
|
{
|
|
ecs_u64_t value = 10;
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_u64_t), &value);
|
|
test_ok( ecs_meta_set_uint(&cur, 2366700781656087864) );
|
|
test_uint(value, 2366700781656087864);
|
|
}
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_uptr(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_uptr_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_uptr_t), &value);
|
|
test_ok( ecs_meta_set_uint(&cur, 20) );
|
|
|
|
test_uint(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_float(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_f32_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_f32_t), &value);
|
|
test_ok( ecs_meta_set_float(&cur, 20.5) );
|
|
|
|
test_flt(value, 20.5);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_double(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_f64_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_f64_t), &value);
|
|
test_ok( ecs_meta_set_float(&cur, 20.5) );
|
|
|
|
test_flt(value, 20.5);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_string(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
char *value = NULL;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_string_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "HelloWorld") );
|
|
|
|
test_str(value, "HelloWorld");
|
|
ecs_os_free(value);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_string_literal(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
char *value = NULL;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_string_t), &value);
|
|
test_ok( ecs_meta_set_string_literal(&cur, "\"HelloWorld\"") );
|
|
|
|
test_str(value, "HelloWorld");
|
|
ecs_os_free(value);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_string_to_null(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
char *value = ecs_os_strdup("HelloWorld");
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_string_t), &value);
|
|
test_ok( ecs_meta_set_null(&cur) );
|
|
|
|
test_str(value, NULL);
|
|
ecs_os_free(value);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_entity(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t value = 0;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_entity_t), &value);
|
|
test_ok( ecs_meta_set_entity(&cur, EcsFlecs) );
|
|
|
|
test_uint(value, EcsFlecs);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_entity_to_number(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t value = 0;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_entity_t), &value);
|
|
test_ok( ecs_meta_set_uint(&cur, 500) );
|
|
|
|
test_uint(value, 500);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_entity_to_0(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t value = 0;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_entity_t), &value);
|
|
test_ok( ecs_meta_set_uint(&cur, 0) );
|
|
|
|
test_uint(value, 0);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_enum(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
typedef enum {
|
|
Red, Green, Blue
|
|
} Color;
|
|
|
|
ecs_entity_t t = ecs_enum(world, {
|
|
.constants = {
|
|
{ "Red" },
|
|
{ "Green" },
|
|
{ "Blue"}
|
|
}
|
|
});
|
|
test_assert(t != 0);
|
|
|
|
Color value = 0;
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_set_int(&cur, Green) );
|
|
|
|
test_int(value, Green);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_bitmask(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
uint32_t Bacon = 1;
|
|
uint32_t Lettuce = 2;
|
|
|
|
ecs_entity_t t = ecs_bitmask(world, {
|
|
.constants = {
|
|
{ "Bacon" },
|
|
{ "Lettuce" }
|
|
}
|
|
});
|
|
test_assert(t != 0);
|
|
|
|
uint32_t value = 0;
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_set_uint(&cur, Bacon | Lettuce) );
|
|
|
|
test_uint(value, Bacon | Lettuce);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_signed_as_unsigned(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
int32_t value = 0;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_i32_t), &value);
|
|
test_ok( ecs_meta_set_uint(&cur, 10) );
|
|
|
|
test_int(value, 10);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_unsigned_as_signed(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
uint32_t value = 0;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_u32_t), &value);
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
|
|
test_int(value, 10);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_signed_as_unsigned_out_of_range(void) {
|
|
ecs_log_set_level(-4);
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
int8_t value = 0;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_i8_t), &value);
|
|
test_fail( ecs_meta_set_uint(&cur, 128) );
|
|
|
|
test_int(value, 0);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_unsigned_as_signed_out_of_range(void) {
|
|
ecs_log_set_level(-4);
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
uint32_t value = 0;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_u32_t), &value);
|
|
test_fail( ecs_meta_set_int(&cur, -10) );
|
|
|
|
test_int(value, 0);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_string_to_null_as_signed(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
char *value = ecs_os_strdup("Hello");
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_string_t), &value);
|
|
test_ok( ecs_meta_set_int(&cur, 0) );
|
|
|
|
test_str(value, 0);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_string_to_null_as_unsigned(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
char *value = ecs_os_strdup("Hello");
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_string_t), &value);
|
|
test_ok( ecs_meta_set_uint(&cur, 0) );
|
|
|
|
test_str(value, 0);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_entity_as_signed(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t value = 0;
|
|
ecs_entity_t e = ecs_new_id(world);
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_entity_t), &value);
|
|
test_ok( ecs_meta_set_int(&cur, (int64_t)e) );
|
|
|
|
test_uint(value, e);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_entity_as_unsigned(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t value = 0;
|
|
ecs_entity_t e = ecs_new_id(world);
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_entity_t), &value);
|
|
test_ok( ecs_meta_set_uint(&cur, e) );
|
|
|
|
test_uint(value, e);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_entity_as_signed_out_of_range(void) {
|
|
ecs_log_set_level(-4);
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t value = 0;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_entity_t), &value);
|
|
test_fail( ecs_meta_set_int(&cur, -10) );
|
|
|
|
test_uint(value, 0);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_to_bool(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_bool_t value = false;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_bool_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "true") );
|
|
|
|
test_bool(value, true);
|
|
|
|
cur = ecs_meta_cursor(world, ecs_id(ecs_bool_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "false") );
|
|
|
|
test_bool(value, false);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_to_char(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_char_t value = false;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_char_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "10") );
|
|
|
|
test_bool(value, 10);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_literal_to_char(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_char_t value = false;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_char_t), &value);
|
|
test_ok( ecs_meta_set_string_literal(&cur, "\"a\"") );
|
|
|
|
test_int(value, 'a');
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_to_i8(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_i8_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_i8_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "20") );
|
|
|
|
test_int(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_to_i16(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_i16_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_i16_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "20") );
|
|
|
|
test_int(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_to_i32(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_i32_t value = 10;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_i32_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "20") );
|
|
|
|
test_int(value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_to_i64(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
{
|
|
ecs_i64_t value = 10;
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_i64_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "20") );
|
|
test_int(value, 20);
|
|
}
|
|
|
|
{
|
|
ecs_i64_t value = 10;
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_i64_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "2366700781656087864") );
|
|
test_int(value, 2366700781656087864);
|
|
}
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_to_u64(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
{
|
|
ecs_u64_t value = 10;
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_u64_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "20") );
|
|
test_uint(value, 20);
|
|
}
|
|
|
|
{
|
|
ecs_u64_t value = 10;
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_u64_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "2366700781656087864") );
|
|
test_uint(value, 2366700781656087864);
|
|
}
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_to_f32(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_f32_t value = 10.5;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_f32_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "20.5") );
|
|
|
|
test_flt(value, 20.5);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_to_f64(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_f64_t value = 10.5;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_f64_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "20.5") );
|
|
|
|
test_flt(value, 20.5);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_to_entity(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t value = 0;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_entity_t), &value);
|
|
test_ok( ecs_meta_set_string(&cur, "flecs.core") );
|
|
|
|
test_uint(value, EcsFlecsCore);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_to_invalid_bool(void) {
|
|
ecs_log_set_level(-4);
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_bool_t value = false;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_bool_t), &value);
|
|
test_fail( ecs_meta_set_string(&cur, "foo") );
|
|
|
|
test_bool(value, false);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_str_to_invalid_entity(void) {
|
|
ecs_log_set_level(-4);
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t value = 0;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(ecs_entity_t), &value);
|
|
test_fail( ecs_meta_set_string(&cur, "flops.core") );
|
|
|
|
test_uint(value, 0);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
|
|
test_int(value.x, 10);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_i32_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.x, 10);
|
|
test_int(value.y, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_i32_i32_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
ecs_i32_t z;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)},
|
|
{"z", ecs_id(ecs_i32_t)},
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.x, 10);
|
|
test_int(value.y, 20);
|
|
test_int(value.z, 30);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_bool(void) {
|
|
typedef struct {
|
|
ecs_bool_t x;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_bool_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
|
|
test_bool(value.x, true);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_bool_bool(void) {
|
|
typedef struct {
|
|
ecs_bool_t x;
|
|
ecs_bool_t y;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_bool_t)},
|
|
{"y", ecs_id(ecs_bool_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, false) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.x, true);
|
|
test_bool(value.y, false);
|
|
|
|
cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, false) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.x, false);
|
|
test_bool(value.y, true);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_bool_bool_bool(void) {
|
|
typedef struct {
|
|
ecs_bool_t x;
|
|
ecs_bool_t y;
|
|
ecs_bool_t z;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_bool_t)},
|
|
{"y", ecs_id(ecs_bool_t)},
|
|
{"z", ecs_id(ecs_bool_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, false) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.x, true);
|
|
test_bool(value.y, false);
|
|
test_bool(value.z, true);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_bool_bool_i32_bool(void) {
|
|
typedef struct {
|
|
ecs_bool_t x;
|
|
ecs_bool_t y;
|
|
ecs_i32_t z;
|
|
ecs_bool_t w;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_bool_t)},
|
|
{"y", ecs_id(ecs_bool_t)},
|
|
{"z", ecs_id(ecs_i32_t)},
|
|
{"w", ecs_id(ecs_bool_t)},
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, false) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.x, true);
|
|
test_bool(value.y, false);
|
|
test_int(value.z, 10);
|
|
test_bool(value.w, true);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_nested_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(n1 != 0);
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.n_1.x, 10);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_2_nested_1_i32_2_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
N1 n_2;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(n1 != 0);
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1},
|
|
{"n_2", n1}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.n_1.x, 10);
|
|
test_int(value.n_2.x, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_2_nested_1_i32_i32_2_i32_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
N1 n_2;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(n1 != 0);
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1},
|
|
{"n_2", n1}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.n_1.x, 10);
|
|
test_int(value.n_1.y, 20);
|
|
test_int(value.n_2.x, 30);
|
|
test_int(value.n_2.y, 40);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_2_nested_1_i32_i32_2_i32_i32_w_padding_members(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
bool p1;
|
|
N1 n_1;
|
|
bool p2;
|
|
N1 n_2;
|
|
bool p3;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(n1 != 0);
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"p1", ecs_id(ecs_bool_t)},
|
|
{"n_1", n1},
|
|
{"p2", ecs_id(ecs_bool_t)},
|
|
{"n_2", n1},
|
|
{"p3", ecs_id(ecs_bool_t)},
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.p1, true);
|
|
test_bool(value.p2, true);
|
|
test_bool(value.p3, true);
|
|
|
|
test_int(value.n_1.x, 10);
|
|
test_int(value.n_1.y, 20);
|
|
test_int(value.n_2.x, 30);
|
|
test_int(value.n_2.y, 40);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_array_i32_3(void) {
|
|
typedef struct {
|
|
ecs_i32_t x[3];
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t), 3}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.x[0], 10);
|
|
test_int(value.x[1], 20);
|
|
test_int(value.x[2], 30);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_2_array_i32_3(void) {
|
|
typedef struct {
|
|
ecs_i32_t x[3];
|
|
ecs_i32_t y[3];
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t), 3},
|
|
{"y", ecs_id(ecs_i32_t), 3}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 50) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 60) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.x[0], 10);
|
|
test_int(value.x[1], 20);
|
|
test_int(value.x[2], 30);
|
|
|
|
test_int(value.y[0], 40);
|
|
test_int(value.y[1], 50);
|
|
test_int(value.y[2], 60);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_2_array_i32_3_w_padding_members(void) {
|
|
typedef struct {
|
|
ecs_bool_t p1;
|
|
ecs_i32_t x[3];
|
|
ecs_bool_t p2;
|
|
ecs_i32_t y[3];
|
|
ecs_bool_t p3;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"p1", ecs_id(ecs_bool_t)},
|
|
{"x", ecs_id(ecs_i32_t), 3},
|
|
{"p2", ecs_id(ecs_bool_t)},
|
|
{"y", ecs_id(ecs_i32_t), 3},
|
|
{"p3", ecs_id(ecs_bool_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 50) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 60) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_bool(&cur, true) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.p1, true);
|
|
test_bool(value.p2, true);
|
|
test_bool(value.p3, true);
|
|
|
|
test_int(value.x[0], 10);
|
|
test_int(value.x[1], 20);
|
|
test_int(value.x[2], 30);
|
|
|
|
test_int(value.y[0], 40);
|
|
test_int(value.y[1], 50);
|
|
test_int(value.y[2], 60);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_array_w_struct_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1[3];
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1, 3}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.n_1[0].x, 10);
|
|
test_int(value.n_1[1].x, 20);
|
|
test_int(value.n_1[2].x, 30);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_2_array_w_struct_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1[3];
|
|
N1 n_2[3];
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1, 3},
|
|
{"n_2", n1, 3}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 50) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 60) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.n_1[0].x, 10);
|
|
test_int(value.n_1[1].x, 20);
|
|
test_int(value.n_1[2].x, 30);
|
|
|
|
test_int(value.n_2[0].x, 40);
|
|
test_int(value.n_2[1].x, 50);
|
|
test_int(value.n_2[2].x, 60);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_array_w_struct_w_array_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x[3];
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1[3];
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t), 3}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1, 3}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 11) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 12) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 21) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 22) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 31) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 32) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.n_1[0].x[0], 10);
|
|
test_int(value.n_1[0].x[1], 11);
|
|
test_int(value.n_1[0].x[2], 12);
|
|
|
|
test_int(value.n_1[1].x[0], 20);
|
|
test_int(value.n_1[1].x[1], 21);
|
|
test_int(value.n_1[1].x[2], 22);
|
|
|
|
test_int(value.n_1[2].x[0], 30);
|
|
test_int(value.n_1[2].x[1], 31);
|
|
test_int(value.n_1[2].x[2], 32);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_set_2_array_w_struct_w_array_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x[3];
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1[3];
|
|
N1 n_2[3];
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t), 3}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1, 3},
|
|
{"n_2", n1, 3}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 11) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 12) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 21) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 22) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 31) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 32) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 41) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 42) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 50) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 51) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 52) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 60) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 61) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 62) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.n_1[0].x[0], 10);
|
|
test_int(value.n_1[0].x[1], 11);
|
|
test_int(value.n_1[0].x[2], 12);
|
|
|
|
test_int(value.n_1[1].x[0], 20);
|
|
test_int(value.n_1[1].x[1], 21);
|
|
test_int(value.n_1[1].x[2], 22);
|
|
|
|
test_int(value.n_1[2].x[0], 30);
|
|
test_int(value.n_1[2].x[1], 31);
|
|
test_int(value.n_1[2].x[2], 32);
|
|
|
|
test_int(value.n_2[0].x[0], 40);
|
|
test_int(value.n_2[0].x[1], 41);
|
|
test_int(value.n_2[0].x[2], 42);
|
|
|
|
test_int(value.n_2[1].x[0], 50);
|
|
test_int(value.n_2[1].x[1], 51);
|
|
test_int(value.n_2[1].x[2], 52);
|
|
|
|
test_int(value.n_2[2].x[0], 60);
|
|
test_int(value.n_2[2].x[1], 61);
|
|
test_int(value.n_2[2].x[2], 62);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
|
|
void Cursor_struct_member_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "x"));
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
|
|
test_bool(value.x, 10);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_member_i32_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "x"));
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_member(&cur, "y"));
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
|
|
test_bool(value.x, 10);
|
|
test_bool(value.y, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_member_i32_i32_reverse(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "y"));
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_member(&cur, "x"));
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
|
|
test_bool(value.x, 10);
|
|
test_bool(value.y, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_member_nested_i32_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1},
|
|
}
|
|
});
|
|
|
|
T value = {{0}};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "n_1"));
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "y"));
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_member(&cur, "x"));
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.n_1.x, 10);
|
|
test_bool(value.n_1.y, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_member_2_nested_i32_i32(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
N1 n_2;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1},
|
|
{"n_2", n1},
|
|
}
|
|
});
|
|
|
|
T value = {{0}};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "n_1"));
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "y"));
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_member(&cur, "x"));
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_member(&cur, "n_2"));
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "y"));
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_member(&cur, "x"));
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.n_1.x, 10);
|
|
test_bool(value.n_1.y, 20);
|
|
test_bool(value.n_2.x, 30);
|
|
test_bool(value.n_2.y, 40);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_member_2_nested_i32_i32_reverse(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
N1 n_2;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1},
|
|
{"n_2", n1},
|
|
}
|
|
});
|
|
|
|
T value = {{0}};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "n_2"));
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "y"));
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_member(&cur, "x"));
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_member(&cur, "n_1"));
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "y"));
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_member(&cur, "x"));
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.n_1.x, 10);
|
|
test_bool(value.n_1.y, 20);
|
|
test_bool(value.n_2.x, 30);
|
|
test_bool(value.n_2.y, 40);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_dotmember(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
N1 n_2;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1},
|
|
{"n_2", n1},
|
|
}
|
|
});
|
|
|
|
T value = {{0}};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_1.y"));
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_1.x"));
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
|
|
test_ok( ecs_meta_dotmember(&cur, "n_2.y"));
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_2.x"));
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.n_1.x, 10);
|
|
test_bool(value.n_1.y, 20);
|
|
test_bool(value.n_2.x, 30);
|
|
test_bool(value.n_2.y, 40);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_dotmember_assign_twice(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
N1 n_2;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1},
|
|
{"n_2", n1},
|
|
}
|
|
});
|
|
|
|
T value = {{0}};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_1.y"));
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_set_int(&cur, 25) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_1.x"));
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_set_int(&cur, 15) );
|
|
|
|
test_ok( ecs_meta_dotmember(&cur, "n_2.y"));
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_set_int(&cur, 45) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_2.x"));
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_set_int(&cur, 35) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.n_1.x, 15);
|
|
test_bool(value.n_1.y, 25);
|
|
test_bool(value.n_2.x, 35);
|
|
test_bool(value.n_2.y, 45);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_member_after_dotmember(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
N1 n_2;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1},
|
|
{"n_2", n1},
|
|
}
|
|
});
|
|
|
|
T value = {{0}};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_2.y"));
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_2.x"));
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
|
|
test_ok( ecs_meta_member(&cur, "n_1"));
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "y"));
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_member(&cur, "x"));
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.n_1.x, 10);
|
|
test_bool(value.n_1.y, 20);
|
|
test_bool(value.n_2.x, 30);
|
|
test_bool(value.n_2.y, 40);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_next_after_dotmember(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
N1 n_2;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1},
|
|
{"n_2", n1},
|
|
}
|
|
});
|
|
|
|
T value = {{0}};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_2.y"));
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_2.x"));
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
|
|
test_ok( ecs_meta_member(&cur, "n_1"));
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "y"));
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_member(&cur, "x"));
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.n_1.x, 10);
|
|
test_bool(value.n_1.y, 20);
|
|
test_bool(value.n_2.x, 30);
|
|
test_bool(value.n_2.y, 40);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_pop_after_dotmember(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N2;
|
|
|
|
typedef struct {
|
|
N2 n_1;
|
|
N2 n_2;
|
|
} N1;
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
N1 n_2;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n2 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N2"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"n_1", n2},
|
|
{"n_2", n2}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1},
|
|
{"n_2", n1},
|
|
}
|
|
});
|
|
|
|
T value = {{0}};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_member(&cur, "n_2"));
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_2.y"));
|
|
test_ok( ecs_meta_set_int(&cur, 80) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_2.x"));
|
|
test_ok( ecs_meta_set_int(&cur, 70) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_1.y"));
|
|
test_ok( ecs_meta_set_int(&cur, 60) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_1.x"));
|
|
test_ok( ecs_meta_set_int(&cur, 50) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_member(&cur, "n_1"));
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_2.y"));
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_2.x"));
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_1.y"));
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_dotmember(&cur, "n_1.x"));
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_bool(value.n_1.n_1.x, 10);
|
|
test_bool(value.n_1.n_1.y, 20);
|
|
test_bool(value.n_1.n_2.x, 30);
|
|
test_bool(value.n_1.n_2.y, 40);
|
|
|
|
test_bool(value.n_2.n_1.x, 50);
|
|
test_bool(value.n_2.n_1.y, 60);
|
|
test_bool(value.n_2.n_2.x, 70);
|
|
test_bool(value.n_2.n_2.y, 80);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_w_array_type_i32_i32(void) {
|
|
typedef int32_t N1[2];
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_array_init(world, &(ecs_array_desc_t){
|
|
.entity = ecs_entity(world, {.name = "vec2"}),
|
|
.type = ecs_id(ecs_i32_t),
|
|
.count = 2
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1}
|
|
}
|
|
});
|
|
|
|
T value = {{ 0 }};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.n_1[0], 10);
|
|
test_int(value.n_1[1], 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_w_array_type_struct(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N1;
|
|
|
|
typedef N1 A1[2];
|
|
|
|
typedef struct {
|
|
A1 n_1;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(n1 != 0);
|
|
|
|
ecs_entity_t a1 = ecs_array_init(world, &(ecs_array_desc_t){
|
|
.entity = ecs_entity(world, {.name = "A1"}),
|
|
.type = n1,
|
|
.count = 2
|
|
});
|
|
|
|
test_assert(a1 != 0);
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", a1}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.n_1[0].x, 10);
|
|
test_int(value.n_1[0].y, 20);
|
|
test_int(value.n_1[1].x, 30);
|
|
test_int(value.n_1[1].y, 40);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_w_2_array_type_i32_i32(void) {
|
|
typedef int32_t N1[2];
|
|
|
|
typedef struct {
|
|
N1 n_1;
|
|
N1 n_2;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_array_init(world, &(ecs_array_desc_t){
|
|
.entity = ecs_entity(world, {.name = "vec2"}),
|
|
.type = ecs_id(ecs_i32_t),
|
|
.count = 2
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", n1},
|
|
{"n_2", n1}
|
|
}
|
|
});
|
|
|
|
T value = {{ 0 }};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.n_1[0], 10);
|
|
test_int(value.n_1[1], 20);
|
|
test_int(value.n_2[0], 30);
|
|
test_int(value.n_2[1], 40);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_struct_w_2_array_type_struct(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N1;
|
|
|
|
typedef N1 A1[2];
|
|
|
|
typedef struct {
|
|
A1 n_1;
|
|
A1 n_2;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t n1 = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N1"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(n1 != 0);
|
|
|
|
ecs_entity_t a1 = ecs_array_init(world, &(ecs_array_desc_t){
|
|
.entity = ecs_entity(world, {.name = "A1"}),
|
|
.type = n1,
|
|
.count = 2
|
|
});
|
|
|
|
test_assert(a1 != 0);
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"n_1", a1},
|
|
{"n_2", a1}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 10) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 20) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 30) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 40) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 50) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 60) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 70) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_set_int(&cur, 80) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
test_int(value.n_1[0].x, 10);
|
|
test_int(value.n_1[0].y, 20);
|
|
test_int(value.n_1[1].x, 30);
|
|
test_int(value.n_1[1].y, 40);
|
|
|
|
test_int(value.n_2[0].x, 50);
|
|
test_int(value.n_2[0].y, 60);
|
|
test_int(value.n_2[1].x, 70);
|
|
test_int(value.n_2[1].y, 80);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_array_i32_3(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
typedef struct {
|
|
int32_t a[3];
|
|
} T;
|
|
|
|
ecs_entity_t t = ecs_array_init(world, &(ecs_array_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.type = ecs_id(ecs_i32_t),
|
|
.count = 3
|
|
});
|
|
|
|
T value = {0};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
|
|
test_int(value.a[0], 10);
|
|
test_int(value.a[1], 20);
|
|
test_int(value.a[2], 30);
|
|
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_array_struct_3(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
typedef struct {
|
|
int32_t x, y;
|
|
} N;
|
|
|
|
typedef struct {
|
|
N a[2];
|
|
} T;
|
|
|
|
ecs_entity_t n = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_array_init(world, &(ecs_array_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.type = n,
|
|
.count = 2
|
|
});
|
|
|
|
T value = {0};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(0, ecs_meta_next(&cur));
|
|
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(value.a[0].x, 10);
|
|
test_int(value.a[0].y, 20);
|
|
test_int(value.a[1].x, 30);
|
|
test_int(value.a[1].y, 40);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_array_move_primitive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
typedef struct {
|
|
int32_t a[3];
|
|
} T;
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"a", ecs_id(ecs_i32_t), 3}
|
|
}
|
|
});
|
|
|
|
|
|
T value = {0};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
|
|
test_int(0, ecs_meta_elem(&cur, 2));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
|
|
test_int(value.a[0], 0);
|
|
test_int(value.a[1], 0);
|
|
test_int(value.a[2], 10);
|
|
|
|
test_int(0, ecs_meta_elem(&cur, 0));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
|
|
test_int(value.a[0], 20);
|
|
test_int(value.a[1], 0);
|
|
test_int(value.a[2], 10);
|
|
|
|
test_int(0, ecs_meta_elem(&cur, 1));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
|
|
test_int(value.a[0], 20);
|
|
test_int(value.a[1], 30);
|
|
test_int(value.a[2], 10);
|
|
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_array_move_struct(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} N;
|
|
|
|
typedef struct {
|
|
N a[3];
|
|
} T;
|
|
|
|
ecs_entity_t n = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "N"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"a", n, 3}
|
|
}
|
|
});
|
|
|
|
|
|
T value = {0};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
|
|
test_int(0, ecs_meta_elem(&cur, 2));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(value.a[0].x, 0);
|
|
test_int(value.a[0].y, 0);
|
|
test_int(value.a[1].x, 0);
|
|
test_int(value.a[1].y, 0);
|
|
test_int(value.a[2].x, 10);
|
|
test_int(value.a[2].y, 20);
|
|
|
|
test_int(0, ecs_meta_elem(&cur, 0));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(value.a[0].x, 30);
|
|
test_int(value.a[0].y, 40);
|
|
test_int(value.a[1].x, 0);
|
|
test_int(value.a[1].y, 0);
|
|
test_int(value.a[2].x, 10);
|
|
test_int(value.a[2].y, 20);
|
|
|
|
test_int(0, ecs_meta_elem(&cur, 1));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 50));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 60));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(value.a[0].x, 30);
|
|
test_int(value.a[0].y, 40);
|
|
test_int(value.a[1].x, 50);
|
|
test_int(value.a[1].y, 60);
|
|
test_int(value.a[2].x, 10);
|
|
test_int(value.a[2].y, 20);
|
|
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_array_move_out_of_range(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
typedef struct {
|
|
int32_t a[3];
|
|
} T;
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"a", ecs_id(ecs_i32_t), 3}
|
|
}
|
|
});
|
|
|
|
T value = {0};
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
|
|
test_assert(0 == ecs_meta_elem(&cur, 0)); /* Sanity check */
|
|
test_assert(0 == ecs_meta_elem(&cur, 2)); /* Sanity check */
|
|
|
|
ecs_log_set_level(-4);
|
|
|
|
test_assert(0 != ecs_meta_elem(&cur, -1));
|
|
test_assert(0 != ecs_meta_elem(&cur, 3));
|
|
|
|
ecs_log_set_level(-1);
|
|
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef const char* const_string_t;
|
|
|
|
#define OpaqueType(t)\
|
|
typedef struct { \
|
|
t value; \
|
|
} Opaque_##t; \
|
|
\
|
|
static void t##_set(void *ptr, t value) { \
|
|
((Opaque_##t*)ptr)->value = value; \
|
|
}
|
|
|
|
OpaqueType(bool)
|
|
OpaqueType(char)
|
|
OpaqueType(int64_t)
|
|
OpaqueType(uint64_t)
|
|
OpaqueType(double)
|
|
OpaqueType(const_string_t)
|
|
|
|
typedef struct {
|
|
ecs_entity_t value;
|
|
} Opaque_entity;
|
|
|
|
static void Opaque_entity_set(void *ptr, ecs_world_t *world, ecs_entity_t value) {
|
|
((Opaque_entity*)ptr)->value = value;
|
|
}
|
|
|
|
void Cursor_opaque_set_bool(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_bool);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_bool),
|
|
.type.as_type = ecs_id(ecs_bool_t),
|
|
.type.assign_bool = bool_set
|
|
});
|
|
|
|
Opaque_bool v = { false };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_bool), &v);
|
|
test_int(0, ecs_meta_set_bool(&cur, true));
|
|
test_bool(v.value, true);
|
|
test_int(0, ecs_meta_set_bool(&cur, false));
|
|
test_bool(v.value, false);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_char(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_char);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_char),
|
|
.type.as_type = ecs_id(ecs_char_t),
|
|
.type.assign_char = char_set
|
|
});
|
|
|
|
Opaque_char v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_char), &v);
|
|
test_int(0, ecs_meta_set_char(&cur, 'a'));
|
|
test_int(v.value, 'a');
|
|
test_int(0, ecs_meta_set_char(&cur, 'A'));
|
|
test_int(v.value, 'A');
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_int(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_int64_t);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_int64_t),
|
|
.type.as_type = ecs_id(ecs_i64_t),
|
|
.type.assign_int = int64_t_set
|
|
});
|
|
|
|
Opaque_int64_t v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_int64_t), &v);
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(v.value, 10);
|
|
test_int(0, ecs_meta_set_int(&cur, -10));
|
|
test_int(v.value, -10);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_uint(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_uint64_t);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_uint64_t),
|
|
.type.as_type = ecs_id(ecs_i64_t),
|
|
.type.assign_uint = uint64_t_set
|
|
});
|
|
|
|
Opaque_uint64_t v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_uint64_t), &v);
|
|
test_int(0, ecs_meta_set_uint(&cur, 10));
|
|
test_int(v.value, 10);
|
|
test_int(0, ecs_meta_set_uint(&cur, 20));
|
|
test_int(v.value, 20);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_float(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_double);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_double),
|
|
.type.as_type = ecs_id(ecs_f64_t),
|
|
.type.assign_float = double_set
|
|
});
|
|
|
|
Opaque_double v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_double), &v);
|
|
test_int(0, ecs_meta_set_float(&cur, 10.5));
|
|
test_flt(v.value, 10.5);
|
|
test_int(0, ecs_meta_set_float(&cur, 20.5));
|
|
test_flt(v.value, 20.5);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_string(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_const_string_t);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_const_string_t),
|
|
.type.as_type = ecs_id(ecs_string_t),
|
|
.type.assign_string = const_string_t_set
|
|
});
|
|
|
|
Opaque_const_string_t v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_const_string_t), &v);
|
|
test_int(0, ecs_meta_set_string(&cur, "Hello World"));
|
|
test_str(v.value, "Hello World");
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_entity(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_entity);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_entity),
|
|
.type.as_type = ecs_id(ecs_entity_t),
|
|
.type.assign_entity = Opaque_entity_set
|
|
});
|
|
|
|
Opaque_entity v = { 0 };
|
|
ecs_entity_t e1 = ecs_new_id(world);
|
|
ecs_entity_t e2 = ecs_new_id(world);
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_entity), &v);
|
|
test_int(0, ecs_meta_set_entity(&cur, e1));
|
|
test_uint(v.value, e1);
|
|
test_int(0, ecs_meta_set_entity(&cur, e2));
|
|
test_uint(v.value, e2);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef struct {
|
|
size_t count;
|
|
int32_t *array;
|
|
} IntVec;
|
|
|
|
static size_t IntVec_count(const void *ptr) {
|
|
const IntVec *data = ptr;
|
|
return data->count;
|
|
}
|
|
|
|
static void* IntVec_ensure(void *ptr, size_t index) {
|
|
IntVec *data = ptr;
|
|
if (data->count <= index) {
|
|
data->count = index + 1;
|
|
data->array = ecs_os_realloc_n(data->array, int32_t, data->count);
|
|
}
|
|
return &data->array[index];
|
|
}
|
|
|
|
static void IntVec_resize(void *ptr, size_t size) {
|
|
IntVec *data = ptr;
|
|
if (data->count != size) {
|
|
data->count = size;
|
|
if (!data->count) {
|
|
ecs_os_free(data->array);
|
|
data->array = NULL;
|
|
} else {
|
|
data->array = ecs_os_realloc_n(data->array, int32_t, size);
|
|
}
|
|
}
|
|
}
|
|
|
|
void Cursor_opaque_set_int_vec(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, IntVec);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(IntVec),
|
|
.type.as_type = ecs_vector(world, { .type = ecs_id(ecs_i32_t) }),
|
|
.type.ensure_element = IntVec_ensure,
|
|
.type.count = IntVec_count,
|
|
.type.resize = IntVec_resize
|
|
});
|
|
|
|
IntVec v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(IntVec), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.count, 3);
|
|
test_int(v.array[0], 10);
|
|
test_int(v.array[1], 20);
|
|
test_int(v.array[2], 30);
|
|
|
|
ecs_os_free(v.array);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_int_vec_empty(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, IntVec);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(IntVec),
|
|
.type.as_type = ecs_vector(world, { .type = ecs_id(ecs_i32_t)} ),
|
|
.type.ensure_element = IntVec_ensure,
|
|
.type.count = IntVec_count,
|
|
.type.resize = IntVec_resize
|
|
});
|
|
|
|
IntVec v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(IntVec), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.count, 0);
|
|
test_assert(v.array == NULL);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_int_vec_resize_smaller(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, IntVec);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(IntVec),
|
|
.type.as_type = ecs_vector(world, { .type = ecs_id(ecs_i32_t)} ),
|
|
.type.ensure_element = IntVec_ensure,
|
|
.type.count = IntVec_count,
|
|
.type.resize = IntVec_resize
|
|
});
|
|
|
|
IntVec v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(IntVec), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.count, 3);
|
|
test_int(v.array[0], 10);
|
|
test_int(v.array[1], 20);
|
|
test_int(v.array[2], 30);
|
|
|
|
cur = ecs_meta_cursor(world, ecs_id(IntVec), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 50));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.count, 2);
|
|
test_int(v.array[0], 40);
|
|
test_int(v.array[1], 50);
|
|
|
|
ecs_os_free(v.array);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_int_vec_resize_larger(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, IntVec);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(IntVec),
|
|
.type.as_type = ecs_vector(world, { .type = ecs_id(ecs_i32_t)} ),
|
|
.type.ensure_element = IntVec_ensure,
|
|
.type.count = IntVec_count,
|
|
.type.resize = IntVec_resize
|
|
});
|
|
|
|
IntVec v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(IntVec), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.count, 3);
|
|
test_int(v.array[0], 10);
|
|
test_int(v.array[1], 20);
|
|
test_int(v.array[2], 30);
|
|
|
|
cur = ecs_meta_cursor(world, ecs_id(IntVec), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 50));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 60));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 70));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.count, 4);
|
|
test_int(v.array[0], 40);
|
|
test_int(v.array[1], 50);
|
|
test_int(v.array[2], 60);
|
|
test_int(v.array[3], 70);
|
|
|
|
ecs_os_free(v.array);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_int_vec_resize_empty(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, IntVec);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(IntVec),
|
|
.type.as_type = ecs_vector(world, { .type = ecs_id(ecs_i32_t)} ),
|
|
.type.ensure_element = IntVec_ensure,
|
|
.type.count = IntVec_count,
|
|
.type.resize = IntVec_resize
|
|
});
|
|
|
|
IntVec v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(IntVec), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.count, 3);
|
|
test_int(v.array[0], 10);
|
|
test_int(v.array[1], 20);
|
|
test_int(v.array[2], 30);
|
|
|
|
cur = ecs_meta_cursor(world, ecs_id(IntVec), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.count, 0);
|
|
test_assert(v.array == NULL);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef struct {
|
|
int32_t value;
|
|
} Int;
|
|
|
|
typedef struct {
|
|
size_t count;
|
|
Int *array;
|
|
} BoxedIntVec;
|
|
|
|
static void Int_assign_int(void *ptr, int64_t value) {
|
|
Int *data = ptr;
|
|
data->value = value;
|
|
}
|
|
|
|
static size_t BoxedIntVec_count(const void *ptr) {
|
|
const BoxedIntVec *data = ptr;
|
|
return data->count;
|
|
}
|
|
|
|
static void* BoxedIntVec_ensure(void *ptr, size_t index) {
|
|
BoxedIntVec *data = ptr;
|
|
if (data->count <= index) {
|
|
data->count = index + 1;
|
|
data->array = ecs_os_realloc_n(data->array, Int, data->count);
|
|
}
|
|
return &data->array[index];
|
|
}
|
|
|
|
static void BoxedIntVec_resize(void *ptr, size_t size) {
|
|
BoxedIntVec *data = ptr;
|
|
if (data->count != size) {
|
|
data->count = size;
|
|
if (!data->count) {
|
|
ecs_os_free(data->array);
|
|
data->array = NULL;
|
|
} else {
|
|
data->array = ecs_os_realloc_n(data->array, Int, size);
|
|
}
|
|
}
|
|
}
|
|
|
|
void Cursor_opaque_set_opaque_int_vec(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, BoxedIntVec);
|
|
ECS_COMPONENT(world, Int);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Int),
|
|
.type.as_type = ecs_id(ecs_i32_t),
|
|
.type.assign_int = Int_assign_int
|
|
});
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(BoxedIntVec),
|
|
.type.as_type = ecs_vector(world, { .type = ecs_id(Int)} ),
|
|
.type.ensure_element = BoxedIntVec_ensure,
|
|
.type.count = BoxedIntVec_count,
|
|
.type.resize = BoxedIntVec_resize
|
|
});
|
|
|
|
BoxedIntVec v = { 0 };
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(BoxedIntVec), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.count, 3);
|
|
test_int(v.array[0].value, 10);
|
|
test_int(v.array[1].value, 20);
|
|
test_int(v.array[2].value, 30);
|
|
|
|
ecs_os_free(v.array);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef struct {
|
|
int32_t _dummy_1;
|
|
int32_t x;
|
|
int32_t _dummy_2;
|
|
int32_t y;
|
|
} OpaqueStruct;
|
|
|
|
static void* OpaqueStruct_member(void *ptr, const char *member) {
|
|
OpaqueStruct *data = ptr;
|
|
if (!strcmp(member, "x")) {
|
|
return &data->x;
|
|
} else if (!strcmp(member, "y")) {
|
|
return &data->y;
|
|
} else {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
void Cursor_opaque_set_struct(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, OpaqueStruct);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(OpaqueStruct),
|
|
.type.as_type = ecs_struct(world, {
|
|
.members = {
|
|
{"x", .type = ecs_id(ecs_i32_t)},
|
|
{"y", .type = ecs_id(ecs_i32_t)}
|
|
}
|
|
}),
|
|
.type.ensure_member = OpaqueStruct_member
|
|
});
|
|
|
|
OpaqueStruct v = { 0 };
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(OpaqueStruct), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(v.x, 10);
|
|
test_int(v.y, 20);
|
|
|
|
cur = ecs_meta_cursor(world, ecs_id(OpaqueStruct), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(v.x, 40);
|
|
test_int(v.y, 30);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef struct {
|
|
int32_t _dummy_1;
|
|
Position start;
|
|
int32_t _dummy_2;
|
|
Position stop;
|
|
} OpaqueNested;
|
|
|
|
static void* OpaqueNested_member(void *ptr, const char *member) {
|
|
OpaqueNested *data = ptr;
|
|
if (!strcmp(member, "start")) {
|
|
return &data->start;
|
|
} else if (!strcmp(member, "stop")) {
|
|
return &data->stop;
|
|
} else {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
void Cursor_opaque_set_nested_struct(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Position);
|
|
ECS_COMPONENT(world, OpaqueNested);
|
|
|
|
ecs_struct(world, {
|
|
.entity = ecs_id(Position),
|
|
.members = {
|
|
{"x", .type = ecs_id(ecs_i32_t)},
|
|
{"y", .type = ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(OpaqueNested),
|
|
.type.as_type = ecs_struct(world, {
|
|
.members = {
|
|
{"start", .type = ecs_id(Position)},
|
|
{"stop", .type = ecs_id(Position)}
|
|
}
|
|
}),
|
|
.type.ensure_member = OpaqueNested_member
|
|
});
|
|
|
|
OpaqueNested v = { 0 };
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(OpaqueNested), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "start"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "stop"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.start.x, 10);
|
|
test_int(v.start.y, 20);
|
|
test_int(v.stop.x, 30);
|
|
test_int(v.stop.y, 40);
|
|
|
|
cur = ecs_meta_cursor(world, ecs_id(OpaqueNested), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "stop"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 50));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 60));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "start"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 70));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 80));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.start.x, 80);
|
|
test_int(v.start.y, 70);
|
|
test_int(v.stop.x, 60);
|
|
test_int(v.stop.y, 50);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef struct {
|
|
int32_t _dummy_1;
|
|
OpaqueStruct start;
|
|
int32_t _dummy_2;
|
|
OpaqueStruct stop;
|
|
} OpaqueNestedOpaque;
|
|
|
|
static void* OpaqueNestedOpaque_member(void *ptr, const char *member) {
|
|
OpaqueNestedOpaque *data = ptr;
|
|
if (!strcmp(member, "start")) {
|
|
return &data->start;
|
|
} else if (!strcmp(member, "stop")) {
|
|
return &data->stop;
|
|
} else {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
void Cursor_opaque_set_nested_opaque_struct(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, OpaqueStruct);
|
|
ECS_COMPONENT(world, OpaqueNestedOpaque);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(OpaqueStruct),
|
|
.type.as_type = ecs_struct(world, {
|
|
.members = {
|
|
{"x", .type = ecs_id(ecs_i32_t)},
|
|
{"y", .type = ecs_id(ecs_i32_t)}
|
|
}
|
|
}),
|
|
.type.ensure_member = OpaqueStruct_member
|
|
});
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(OpaqueNestedOpaque),
|
|
.type.as_type = ecs_struct(world, {
|
|
.members = {
|
|
{"start", .type = ecs_id(OpaqueStruct)},
|
|
{"stop", .type = ecs_id(OpaqueStruct)}
|
|
}
|
|
}),
|
|
.type.ensure_member = OpaqueNestedOpaque_member
|
|
});
|
|
|
|
OpaqueNestedOpaque v = { 0 };
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(OpaqueNestedOpaque), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "start"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "stop"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.start.x, 10);
|
|
test_int(v.start.y, 20);
|
|
test_int(v.stop.x, 30);
|
|
test_int(v.stop.y, 40);
|
|
|
|
cur = ecs_meta_cursor(world, ecs_id(OpaqueNestedOpaque), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "stop"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 50));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 60));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "start"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 70));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 80));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.start.x, 80);
|
|
test_int(v.start.y, 70);
|
|
test_int(v.stop.x, 60);
|
|
test_int(v.stop.y, 50);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef struct {
|
|
int32_t el_1;
|
|
int32_t _dummy_1;
|
|
int32_t el_2;
|
|
int32_t _dummy_2;
|
|
int32_t el_3;
|
|
int32_t _dummy_3;
|
|
} OpaqueArray;
|
|
|
|
static void* OpaqueArray_ensure(void *ptr, size_t index) {
|
|
OpaqueArray *data = ptr;
|
|
switch(index) {
|
|
case 0: return &data->el_1;
|
|
case 1: return &data->el_2;
|
|
case 2: return &data->el_3;
|
|
default:
|
|
break;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void Cursor_opaque_set_array(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, OpaqueArray);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(OpaqueArray),
|
|
.type.as_type = ecs_array(world, { .type = ecs_id(ecs_i32_t), .count = 3 }),
|
|
.type.ensure_element = OpaqueArray_ensure
|
|
});
|
|
|
|
OpaqueArray v = { 0 };
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(OpaqueArray), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.el_1, 10);
|
|
test_int(v.el_2, 20);
|
|
test_int(v.el_3, 30);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_array_2_of_3_elems(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, OpaqueArray);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(OpaqueArray),
|
|
.type.as_type = ecs_array(world, { .type = ecs_id(ecs_i32_t), .count = 3 }),
|
|
.type.ensure_element = OpaqueArray_ensure
|
|
});
|
|
|
|
OpaqueArray v = { 0 };
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(OpaqueArray), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.el_1, 10);
|
|
test_int(v.el_2, 20);
|
|
test_int(v.el_3, 0);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_array_empty(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, OpaqueArray);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(OpaqueArray),
|
|
.type.as_type = ecs_array(world, { .type = ecs_id(ecs_i32_t), .count = 3 }),
|
|
.type.ensure_element = OpaqueArray_ensure
|
|
});
|
|
|
|
OpaqueArray v = { 0 };
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(OpaqueArray), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.el_1, 0);
|
|
test_int(v.el_2, 0);
|
|
test_int(v.el_3, 0);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_uint_to_int(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_int64_t);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_int64_t),
|
|
.type.as_type = ecs_id(ecs_i64_t),
|
|
.type.assign_int = int64_t_set
|
|
});
|
|
|
|
Opaque_int64_t v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_int64_t), &v);
|
|
test_int(0, ecs_meta_set_uint(&cur, 10));
|
|
test_int(v.value, 10);
|
|
test_int(0, ecs_meta_set_uint(&cur, 100));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_log_set_level(-4);
|
|
test_int(-1, ecs_meta_set_uint(&cur, (uint64_t)INT64_MAX + 1));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_float_to_int(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_int64_t);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_int64_t),
|
|
.type.as_type = ecs_id(ecs_i64_t),
|
|
.type.assign_int = int64_t_set
|
|
});
|
|
|
|
Opaque_int64_t v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_int64_t), &v);
|
|
test_int(0, ecs_meta_set_float(&cur, 10));
|
|
test_int(v.value, 10);
|
|
test_int(0, ecs_meta_set_float(&cur, 100));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_log_set_level(-4);
|
|
test_int(-1, ecs_meta_set_float(&cur, (double)INT64_MAX + 10000));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_int_to_uint(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_uint64_t);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_uint64_t),
|
|
.type.as_type = ecs_id(ecs_u64_t),
|
|
.type.assign_uint = uint64_t_set
|
|
});
|
|
|
|
Opaque_uint64_t v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_uint64_t), &v);
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(v.value, 10);
|
|
test_int(0, ecs_meta_set_int(&cur, 100));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_log_set_level(-4);
|
|
test_int(-1, ecs_meta_set_int(&cur, -1));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_float_to_uint(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_uint64_t);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_uint64_t),
|
|
.type.as_type = ecs_id(ecs_u64_t),
|
|
.type.assign_uint = uint64_t_set
|
|
});
|
|
|
|
Opaque_uint64_t v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_uint64_t), &v);
|
|
test_int(0, ecs_meta_set_float(&cur, 10));
|
|
test_int(v.value, 10);
|
|
test_int(0, ecs_meta_set_float(&cur, 100));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_log_set_level(-4);
|
|
test_int(-1, ecs_meta_set_float(&cur, -1));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_int_to_float(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_double);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_double),
|
|
.type.as_type = ecs_id(ecs_f64_t),
|
|
.type.assign_float = double_set
|
|
});
|
|
|
|
Opaque_double v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_double), &v);
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(v.value, 10);
|
|
test_int(0, ecs_meta_set_int(&cur, 100));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_uint_to_float(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_double);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_double),
|
|
.type.as_type = ecs_id(ecs_f64_t),
|
|
.type.assign_float = double_set
|
|
});
|
|
|
|
Opaque_double v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_double), &v);
|
|
test_int(0, ecs_meta_set_uint(&cur, 10));
|
|
test_int(v.value, 10);
|
|
test_int(0, ecs_meta_set_uint(&cur, 100));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_string_to_char(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_char);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_char),
|
|
.type.as_type = ecs_id(ecs_char_t),
|
|
.type.assign_char = char_set
|
|
});
|
|
|
|
Opaque_char v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_char), &v);
|
|
test_int(0, ecs_meta_set_string(&cur, "a"));
|
|
test_int(v.value, 'a');
|
|
test_int(0, ecs_meta_set_string(&cur, "b"));
|
|
test_int(v.value, 'b');
|
|
|
|
ecs_log_set_level(-4);
|
|
test_int(-1, ecs_meta_set_string(&cur, "ab"));
|
|
test_int(v.value, 'b');
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_int_to_char(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_char);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_char),
|
|
.type.as_type = ecs_id(ecs_char_t),
|
|
.type.assign_char = char_set
|
|
});
|
|
|
|
Opaque_char v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_char), &v);
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(v.value, 10);
|
|
test_int(0, ecs_meta_set_int(&cur, 100));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_log_set_level(-4);
|
|
test_int(-1, ecs_meta_set_int(&cur, 1000));
|
|
test_int(v.value, 100);
|
|
test_int(-1, ecs_meta_set_int(&cur, -10));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_uint_to_char(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_char);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_char),
|
|
.type.as_type = ecs_id(ecs_char_t),
|
|
.type.assign_char = char_set
|
|
});
|
|
|
|
Opaque_char v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_char), &v);
|
|
test_int(0, ecs_meta_set_uint(&cur, 10));
|
|
test_int(v.value, 10);
|
|
test_int(0, ecs_meta_set_uint(&cur, 100));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_log_set_level(-4);
|
|
test_int(-1, ecs_meta_set_uint(&cur, 1000));
|
|
test_int(v.value, 100);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_char_to_int(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_int64_t);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_int64_t),
|
|
.type.as_type = ecs_id(ecs_i64_t),
|
|
.type.assign_int = int64_t_set
|
|
});
|
|
|
|
Opaque_int64_t v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_int64_t), &v);
|
|
test_int(0, ecs_meta_set_char(&cur, 'a'));
|
|
test_int(v.value, 'a');
|
|
test_int(0, ecs_meta_set_char(&cur, 'b'));
|
|
test_int(v.value, 'b');
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_opaque_set_char_to_uint(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, Opaque_uint64_t);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Opaque_uint64_t),
|
|
.type.as_type = ecs_id(ecs_u64_t),
|
|
.type.assign_uint = uint64_t_set
|
|
});
|
|
|
|
Opaque_uint64_t v = { 0 };
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Opaque_uint64_t), &v);
|
|
test_int(0, ecs_meta_set_char(&cur, 'a'));
|
|
test_int(v.value, 'a');
|
|
test_int(0, ecs_meta_set_char(&cur, 'b'));
|
|
test_int(v.value, 'b');
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef struct {
|
|
OpaqueStruct foo;
|
|
OpaqueStruct bar;
|
|
} Struct_w_OpaqueStruct;
|
|
|
|
void Cursor_struct_w_2_opaque_structs(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, OpaqueStruct);
|
|
ECS_COMPONENT(world, Struct_w_OpaqueStruct);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(OpaqueStruct),
|
|
.type.as_type = ecs_struct(world, {
|
|
.members = {
|
|
{"x", .type = ecs_id(ecs_i32_t)},
|
|
{"y", .type = ecs_id(ecs_i32_t)}
|
|
}
|
|
}),
|
|
.type.ensure_member = OpaqueStruct_member
|
|
});
|
|
|
|
ecs_struct(world, {
|
|
.entity = ecs_id(Struct_w_OpaqueStruct),
|
|
.members = {
|
|
{"foo", ecs_id(OpaqueStruct)},
|
|
{"bar", ecs_id(OpaqueStruct)},
|
|
}
|
|
});
|
|
|
|
Struct_w_OpaqueStruct v = {0};
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Struct_w_OpaqueStruct), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "foo"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "bar"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.foo.x, 10);
|
|
test_int(v.foo.y, 20);
|
|
test_int(v.bar.x, 30);
|
|
test_int(v.bar.y, 40);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef struct {
|
|
IntVec foo;
|
|
IntVec bar;
|
|
} Struct_w_IntVec;
|
|
|
|
void Cursor_struct_w_2_opaque_vectors(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, IntVec);
|
|
ECS_COMPONENT(world, Struct_w_IntVec);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(IntVec),
|
|
.type.as_type = ecs_vector(world, { .type = ecs_id(ecs_i32_t) }),
|
|
.type.ensure_element = IntVec_ensure,
|
|
.type.count = IntVec_count,
|
|
.type.resize = IntVec_resize
|
|
});
|
|
|
|
ecs_struct(world, {
|
|
.entity = ecs_id(Struct_w_IntVec),
|
|
.members = {
|
|
{"foo", ecs_id(IntVec)},
|
|
{"bar", ecs_id(IntVec)},
|
|
}
|
|
});
|
|
|
|
Struct_w_IntVec v = {0};
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Struct_w_IntVec), &v);
|
|
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "foo"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "bar"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 50));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 60));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.foo.count, 3);
|
|
test_int(v.foo.array[0], 10);
|
|
test_int(v.foo.array[1], 20);
|
|
test_int(v.foo.array[2], 30);
|
|
|
|
test_int(v.bar.count, 3);
|
|
test_int(v.bar.array[0], 40);
|
|
test_int(v.bar.array[1], 50);
|
|
test_int(v.bar.array[2], 60);
|
|
|
|
ecs_os_free(v.foo.array);
|
|
ecs_os_free(v.bar.array);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef struct {
|
|
OpaqueArray foo;
|
|
OpaqueArray bar;
|
|
} Struct_w_OpaqueArray;
|
|
|
|
void Cursor_struct_w_2_opaque_arrays(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, OpaqueArray);
|
|
ECS_COMPONENT(world, Struct_w_OpaqueArray);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(OpaqueArray),
|
|
.type.as_type = ecs_array(world, { .type = ecs_id(ecs_i32_t), .count = 3 }),
|
|
.type.ensure_element = OpaqueArray_ensure
|
|
});
|
|
|
|
ecs_struct(world, {
|
|
.entity = ecs_id(Struct_w_OpaqueArray),
|
|
.members = {
|
|
{"foo", ecs_id(OpaqueArray)},
|
|
{"bar", ecs_id(OpaqueArray)},
|
|
}
|
|
});
|
|
|
|
Struct_w_OpaqueArray v = {0};
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Struct_w_OpaqueArray), &v);
|
|
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "foo"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "bar"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 50));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 60));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.foo.el_1, 10);
|
|
test_int(v.foo.el_2, 20);
|
|
test_int(v.foo.el_3, 30);
|
|
|
|
test_int(v.bar.el_1, 40);
|
|
test_int(v.bar.el_2, 50);
|
|
test_int(v.bar.el_3, 60);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef struct {
|
|
OpaqueStruct foo;
|
|
OpaqueStruct bar;
|
|
OpaqueStruct zoo;
|
|
} Struct_w_3_OpaqueStructs;
|
|
|
|
void Cursor_struct_w_3_opaque_structs(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, OpaqueStruct);
|
|
ECS_COMPONENT(world, Struct_w_3_OpaqueStructs);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(OpaqueStruct),
|
|
.type.as_type = ecs_struct(world, {
|
|
.members = {
|
|
{"x", .type = ecs_id(ecs_i32_t)},
|
|
{"y", .type = ecs_id(ecs_i32_t)}
|
|
}
|
|
}),
|
|
.type.ensure_member = OpaqueStruct_member
|
|
});
|
|
|
|
ecs_struct(world, {
|
|
.entity = ecs_id(Struct_w_3_OpaqueStructs),
|
|
.members = {
|
|
{"foo", ecs_id(OpaqueStruct)},
|
|
{"bar", ecs_id(OpaqueStruct)},
|
|
{"zoo", ecs_id(OpaqueStruct)},
|
|
}
|
|
});
|
|
|
|
Struct_w_3_OpaqueStructs v = {0};
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Struct_w_3_OpaqueStructs), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "foo"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "bar"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "zoo"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "x"));
|
|
test_int(0, ecs_meta_set_int(&cur, 50));
|
|
test_int(0, ecs_meta_member(&cur, "y"));
|
|
test_int(0, ecs_meta_set_int(&cur, 60));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.foo.x, 10);
|
|
test_int(v.foo.y, 20);
|
|
test_int(v.bar.x, 30);
|
|
test_int(v.bar.y, 40);
|
|
test_int(v.zoo.x, 50);
|
|
test_int(v.zoo.y, 60);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef struct {
|
|
IntVec foo;
|
|
IntVec bar;
|
|
IntVec zoo;
|
|
} Struct_w_3_IntVecs;
|
|
|
|
void Cursor_struct_w_3_opaque_vectors(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, IntVec);
|
|
ECS_COMPONENT(world, Struct_w_3_IntVecs);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(IntVec),
|
|
.type.as_type = ecs_vector(world, { .type = ecs_id(ecs_i32_t) }),
|
|
.type.ensure_element = IntVec_ensure,
|
|
.type.count = IntVec_count,
|
|
.type.resize = IntVec_resize
|
|
});
|
|
|
|
ecs_struct(world, {
|
|
.entity = ecs_id(Struct_w_3_IntVecs),
|
|
.members = {
|
|
{"foo", ecs_id(IntVec)},
|
|
{"bar", ecs_id(IntVec)},
|
|
{"zoo", ecs_id(IntVec)},
|
|
}
|
|
});
|
|
|
|
Struct_w_3_IntVecs v = {0};
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Struct_w_3_IntVecs), &v);
|
|
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "foo"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "bar"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 50));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 60));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "zoo"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 70));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 80));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 90));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.foo.count, 3);
|
|
test_int(v.foo.array[0], 10);
|
|
test_int(v.foo.array[1], 20);
|
|
test_int(v.foo.array[2], 30);
|
|
|
|
test_int(v.bar.count, 3);
|
|
test_int(v.bar.array[0], 40);
|
|
test_int(v.bar.array[1], 50);
|
|
test_int(v.bar.array[2], 60);
|
|
|
|
test_int(v.zoo.count, 3);
|
|
test_int(v.zoo.array[0], 70);
|
|
test_int(v.zoo.array[1], 80);
|
|
test_int(v.zoo.array[2], 90);
|
|
|
|
ecs_os_free(v.foo.array);
|
|
ecs_os_free(v.bar.array);
|
|
ecs_os_free(v.zoo.array);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
typedef struct {
|
|
OpaqueArray foo;
|
|
OpaqueArray bar;
|
|
OpaqueArray zoo;
|
|
} Struct_w_3_OpaqueArrays;
|
|
|
|
void Cursor_struct_w_3_opaque_arrays(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, OpaqueArray);
|
|
ECS_COMPONENT(world, Struct_w_3_OpaqueArrays);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(OpaqueArray),
|
|
.type.as_type = ecs_array(world, { .type = ecs_id(ecs_i32_t), .count = 3 }),
|
|
.type.ensure_element = OpaqueArray_ensure
|
|
});
|
|
|
|
ecs_struct(world, {
|
|
.entity = ecs_id(Struct_w_3_OpaqueArrays),
|
|
.members = {
|
|
{"foo", ecs_id(OpaqueArray)},
|
|
{"bar", ecs_id(OpaqueArray)},
|
|
{"zoo", ecs_id(OpaqueArray)},
|
|
}
|
|
});
|
|
|
|
Struct_w_3_OpaqueArrays v = {0};
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Struct_w_3_OpaqueArrays), &v);
|
|
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "foo"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "bar"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 50));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 60));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "zoo"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 70));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 80));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 90));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.foo.el_1, 10);
|
|
test_int(v.foo.el_2, 20);
|
|
test_int(v.foo.el_3, 30);
|
|
|
|
test_int(v.bar.el_1, 40);
|
|
test_int(v.bar.el_2, 50);
|
|
test_int(v.bar.el_3, 60);
|
|
|
|
test_int(v.zoo.el_1, 70);
|
|
test_int(v.zoo.el_2, 80);
|
|
test_int(v.zoo.el_3, 90);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
static void* OpaqueStructIntVec_member(void *ptr, const char *member) {
|
|
Struct_w_IntVec *data = ptr;
|
|
if (!strcmp(member, "foo")) {
|
|
return &data->foo;
|
|
} else if (!strcmp(member, "bar")) {
|
|
return &data->bar;
|
|
} else {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
void Cursor_opaque_struct_w_opaque_vec(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, IntVec);
|
|
ECS_COMPONENT(world, Struct_w_IntVec);
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(IntVec),
|
|
.type.as_type = ecs_vector(world, { .type = ecs_id(ecs_i32_t) }),
|
|
.type.ensure_element = IntVec_ensure,
|
|
.type.count = IntVec_count,
|
|
.type.resize = IntVec_resize
|
|
});
|
|
|
|
ecs_entity_t os = ecs_struct(world, {
|
|
.members = {
|
|
{"foo", ecs_id(IntVec)},
|
|
{"bar", ecs_id(IntVec)},
|
|
}
|
|
});
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(Struct_w_IntVec),
|
|
.type.as_type = os,
|
|
.type.ensure_member = OpaqueStructIntVec_member,
|
|
});
|
|
|
|
Struct_w_IntVec v = {0};
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(Struct_w_IntVec), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "foo"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "bar"));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 40));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 50));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_set_int(&cur, 60));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.foo.count, 3);
|
|
test_int(v.foo.array[0], 10);
|
|
test_int(v.foo.array[1], 20);
|
|
test_int(v.foo.array[2], 30);
|
|
test_int(v.bar.array[0], 40);
|
|
test_int(v.bar.array[1], 50);
|
|
test_int(v.bar.array[2], 60);
|
|
|
|
ecs_os_free(v.foo.array);
|
|
ecs_os_free(v.bar.array);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
static void* OpaqueStructElem_member(void *ptr, const char *member) {
|
|
if (!strcmp(member, "i")) {
|
|
return ptr;
|
|
} else {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
void Cursor_opaque_vec_w_opaque_elem(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_COMPONENT(world, IntVec);
|
|
ECS_COMPONENT(world, Struct_w_IntVec);
|
|
|
|
ecs_entity_t os = ecs_struct(world, {
|
|
.members = {
|
|
{"i", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
ecs_entity_t oelem = ecs_opaque(world, {
|
|
.entity = ecs_component(world, {
|
|
.type.size = ECS_SIZEOF(ecs_i32_t),
|
|
.type.alignment = ECS_ALIGNOF(ecs_i32_t)
|
|
}),
|
|
.type.as_type = os,
|
|
.type.ensure_member = OpaqueStructElem_member,
|
|
});
|
|
|
|
ecs_opaque(world, {
|
|
.entity = ecs_id(IntVec),
|
|
.type.as_type = ecs_vector(world, { .type = oelem }),
|
|
.type.ensure_element = IntVec_ensure,
|
|
.type.count = IntVec_count,
|
|
.type.resize = IntVec_resize
|
|
});
|
|
|
|
IntVec v = {0};
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, ecs_id(IntVec), &v);
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "i"));
|
|
test_int(0, ecs_meta_set_int(&cur, 10));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "i"));
|
|
test_int(0, ecs_meta_set_int(&cur, 20));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_next(&cur));
|
|
test_int(0, ecs_meta_push(&cur));
|
|
test_int(0, ecs_meta_member(&cur, "i"));
|
|
test_int(0, ecs_meta_set_int(&cur, 30));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
test_int(0, ecs_meta_pop(&cur));
|
|
|
|
test_int(v.count, 3);
|
|
test_int(v.array[0], 10);
|
|
test_int(v.array[1], 20);
|
|
test_int(v.array[2], 30);
|
|
|
|
ecs_os_free(v.array);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_next_out_of_bounds(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
|
|
ecs_log_set_level(-4);
|
|
test_fail( ecs_meta_next(&cur) );
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_set_out_of_bounds(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_ok( ecs_meta_next(&cur) );
|
|
ecs_log_set_level(-4);
|
|
test_fail(ecs_meta_set_int(&cur, 10));
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void Cursor_get_member_id(void) {
|
|
typedef struct {
|
|
ecs_i32_t x;
|
|
ecs_i32_t y;
|
|
} T;
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ecs_entity_t t = ecs_struct_init(world, &(ecs_struct_desc_t){
|
|
.entity = ecs_entity(world, {.name = "T"}),
|
|
.members = {
|
|
{"x", ecs_id(ecs_i32_t)},
|
|
{"y", ecs_id(ecs_i32_t)}
|
|
}
|
|
});
|
|
|
|
test_assert(t != 0);
|
|
|
|
T value;
|
|
|
|
ecs_meta_cursor_t cur = ecs_meta_cursor(world, t, &value);
|
|
test_ok( ecs_meta_push(&cur) );
|
|
test_assert(ecs_meta_get_member_id(&cur) != 0);
|
|
test_assert(ecs_meta_get_member_id(&cur) == ecs_lookup_fullpath(world, "T.x"));
|
|
test_ok( ecs_meta_next(&cur) );
|
|
test_assert(ecs_meta_get_member_id(&cur) != 0);
|
|
test_assert(ecs_meta_get_member_id(&cur) == ecs_lookup_fullpath(world, "T.y"));
|
|
test_ok( ecs_meta_pop(&cur) );
|
|
|
|
ecs_fini(world);
|
|
}
|