#include struct Evt { }; struct IdA { }; struct IdB { }; void Event_evt_1_id_entity(void) { flecs::world ecs; auto evt = ecs.entity(); auto id = ecs.entity(); auto e1 = ecs.entity().add(id); int32_t count = 0; ecs.observer() .event(evt) .term(id) .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.event(evt) .id(id) .entity(e1) .emit(); test_int(count, 1); } void Event_evt_2_ids_entity(void) { flecs::world ecs; auto evt = ecs.entity(); auto id_a = ecs.entity(); auto id_b = ecs.entity(); auto e1 = ecs.entity().add(id_a).add(id_b); int32_t count = 0; ecs.observer() .event(evt) .term(id_a) .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.observer() .event(evt) .term(id_b) .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.event(evt) .id(id_a) .id(id_b) .entity(e1) .emit(); test_int(count, 2); } void Event_evt_1_id_table(void) { flecs::world ecs; auto evt = ecs.entity(); auto id = ecs.entity(); auto e1 = ecs.entity().add(id); auto table = e1.table(); int32_t count = 0; ecs.observer() .event(evt) .term(id) .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.event(evt) .id(id) .table(table) .emit(); test_int(count, 1); } void Event_evt_2_ids_table(void) { flecs::world ecs; auto evt = ecs.entity(); auto id_a = ecs.entity(); auto id_b = ecs.entity(); auto e1 = ecs.entity().add(id_a).add(id_b); auto table = e1.table(); int32_t count = 0; ecs.observer() .event(evt) .term(id_a) .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.observer() .event(evt) .term(id_b) .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.event(evt) .id(id_a) .id(id_b) .table(table) .emit(); test_int(count, 2); } void Event_evt_type(void) { flecs::world ecs; auto id = ecs.entity(); auto e1 = ecs.entity().add(id); int32_t count = 0; ecs.observer() .event() .term(id) .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.event() .id(id) .entity(e1) .emit(); test_int(count, 1); } void Event_evt_1_component(void) { flecs::world ecs; auto e1 = ecs.entity().add(); int32_t count = 0; ecs.observer() .event() .term() .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.event() .id() .entity(e1) .emit(); test_int(count, 1); } void Event_evt_2_components(void) { flecs::world ecs; auto e1 = ecs.entity().add().add(); int32_t count = 0; ecs.observer() .event() .term() .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.observer() .event() .term() .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.event() .id() .id() .entity(e1) .emit(); test_int(count, 2); } struct EvtData { int value; }; void Event_evt_void_ctx(void) { flecs::world ecs; auto evt = ecs.entity(); auto id = ecs.entity(); auto e1 = ecs.entity().add(id); int32_t count = 0; ecs.observer() .event(evt) .term(id) .iter([&](flecs::iter& it) { test_assert(it.entity(0) == e1); test_int(it.param()->value, 10); count ++; }); EvtData data = {10}; ecs.event(evt) .id(id) .entity(e1) .ctx(&data) .emit(); test_int(count, 1); } void Event_evt_typed_ctx(void) { flecs::world ecs; auto id = ecs.entity(); auto e1 = ecs.entity().add(id); int32_t count = 0; ecs.observer() .event() .term(id) .iter([&](flecs::iter& it) { test_assert(it.entity(0) == e1); test_int(it.param()->value, 10); count ++; }); ecs.event() .id(id) .entity(e1) .ctx(EvtData{10}) .emit(); test_int(count, 1); } void Event_evt_implicit_typed_ctx(void) { flecs::world ecs; auto id = ecs.entity(); auto e1 = ecs.entity().add(id); int32_t count = 0; ecs.observer() .event() .term(id) .iter([&](flecs::iter& it) { test_assert(it.entity(0) == e1); test_int(it.param()->value, 10); count ++; }); ecs.event() .id(id) .entity(e1) .ctx({10}) .emit(); test_int(count, 1); } void Event_evt_1_id_pair_rel_id_obj_id_entity(void) { flecs::world ecs; auto evt = ecs.entity(); auto rel = ecs.entity(); auto obj = ecs.entity(); auto e1 = ecs.entity().add(rel, obj); int32_t count = 0; ecs.observer() .event(evt) .term(rel, obj) .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.event(evt) .id(rel, obj) .entity(e1) .emit(); test_int(count, 1); } void Event_evt_1_id_pair_rel_obj_id_entity(void) { flecs::world ecs; auto evt = ecs.entity(); auto obj = ecs.entity(); auto e1 = ecs.entity().add(obj); int32_t count = 0; ecs.observer() .event(evt) .term(obj) .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.event(evt) .id(obj) .entity(e1) .emit(); test_int(count, 1); } void Event_evt_1_id_pair_rel_obj_entity(void) { flecs::world ecs; auto evt = ecs.entity(); auto e1 = ecs.entity().add(); int32_t count = 0; ecs.observer() .event(evt) .term() .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.event(evt) .id() .entity(e1) .emit(); test_int(count, 1); } void Event_emit_staged_from_world(void) { flecs::world ecs; auto evt = ecs.entity(); auto e1 = ecs.entity().add(); int32_t count = 0; ecs.observer() .event(evt) .term() .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.readonly_begin(); ecs.event(evt) .id() .entity(e1) .emit(); ecs.readonly_end(); test_int(count, 1); } void Event_emit_staged_from_stage(void) { flecs::world ecs; auto evt = ecs.entity(); auto e1 = ecs.entity().add(); int32_t count = 0; ecs.observer() .event(evt) .term() .each([&](flecs::entity e) { test_assert(e == e1); count ++; }); ecs.readonly_begin(); ecs.get_stage(0).event(evt) .id() .entity(e1) .emit(); ecs.readonly_end(); test_int(count, 1); } void Event_emit_custom_for_any(void) { flecs::world ecs; int count_a = 0; int count_b = 0; flecs::entity e1 = ecs.entity().add(); flecs::entity e2 = ecs.entity().add(); ecs.observer() .event() .with(flecs::Any).src(e1) .each([&](flecs::entity e) { test_assert(e == 0); count_a ++; }); ecs.observer() .event() .with(flecs::Any).src(e2) .each([&](flecs::entity e) { test_assert(e == 0); count_b ++; }); ecs.event() .id(flecs::Any) .entity(e1) .emit(); test_int(count_a, 1); test_int(count_b, 0); ecs.event() .id(flecs::Any) .entity(e2) .emit(); test_int(count_a, 1); test_int(count_b, 1); } void Event_entity_emit_event_id(void) { flecs::world ecs; flecs::entity evt = ecs.entity(); flecs::entity e = ecs.entity() .add(); int32_t count = 0; e.observe(evt, [&](flecs::entity src) { count ++; test_assert(src == e); }); test_int(count, 0); e.emit(evt); test_int(count, 1); } void Event_entity_emit_event_type(void) { flecs::world ecs; flecs::entity e = ecs.entity() .add(); int32_t count = 0; e.observe([&](flecs::entity src) { count ++; test_assert(src == e); }); test_int(count, 0); e.emit(); test_int(count, 1); } void Event_entity_emit_event_w_payload(void) { flecs::world ecs; flecs::entity e = ecs.entity() .add(); int32_t count = 0; e.observe([&](flecs::entity src, Position& p) { count ++; test_assert(src == e); test_int(p.x, 10); test_int(p.y, 20); }); test_int(count, 0); e.emit({10, 20}); test_int(count, 1); } void Event_entity_emit_event_id_no_src(void) { flecs::world ecs; flecs::entity evt = ecs.entity(); flecs::entity e = ecs.entity() .add(); int32_t count = 0; e.observe(evt, [&]() { count ++; }); test_int(count, 0); e.emit(evt); test_int(count, 1); } void Event_entity_emit_event_type_no_src(void) { flecs::world ecs; flecs::entity e = ecs.entity() .add(); int32_t count = 0; e.observe([&]() { count ++; }); test_int(count, 0); e.emit(); test_int(count, 1); } void Event_entity_emit_event_w_payload_no_src(void) { flecs::world ecs; flecs::entity e = ecs.entity() .add(); int32_t count = 0; e.observe([&](Position& p) { count ++; test_int(p.x, 10); test_int(p.y, 20); }); test_int(count, 0); e.emit({10, 20}); test_int(count, 1); } void Event_entity_emit_event_w_payload_derived_event_type(void) { flecs::world ecs; flecs::entity e = ecs.entity() .add(); int32_t count = 0; e.observe([&](flecs::entity src, Position& p) { count ++; test_assert(src == e); test_int(p.x, 10); test_int(p.y, 20); }); test_int(count, 0); e.emit({10, 20}); test_int(count, 1); } void Event_entity_emit_event_w_payload_derived_event_type_no_src(void) { flecs::world ecs; flecs::entity e = ecs.entity() .add(); int32_t count = 0; e.observe([&](Position& p) { count ++; test_int(p.x, 10); test_int(p.y, 20); }); test_int(count, 0); e.emit({10, 20}); test_int(count, 1); }