@@ -7232,6 +7232,10 @@ static int OnAddTagA_invoked = 0;
72327232static int OnAddTagB_invoked = 0 ;
72337233static int OnRemoveTagA_invoked = 0 ;
72347234static int OnRemoveTagB_invoked = 0 ;
7235+ static int DataOnSet_invoked = 0 ;
7236+ static int DataOnAdd_invoked = 0 ;
7237+ static int RegularOnAdd_invoked = 0 ;
7238+ static int DataOnSet_value = -1 ;
72357239
72367240static void OnAddTagA (ecs_iter_t * it ) {
72377241 OnAddTagA_invoked += it -> count ;
@@ -7249,6 +7253,25 @@ static void OnRemoveTagB(ecs_iter_t *it) {
72497253 OnRemoveTagB_invoked += it -> count ;
72507254}
72517255
7256+ static void DataOnAdd (ecs_iter_t * it )
7257+ {
7258+ DataOnAdd_invoked ++ ;
7259+ }
7260+
7261+ static void DataOnSet (ecs_iter_t * it )
7262+ {
7263+ DataOnSet_invoked ++ ;
7264+ Velocity * d = ecs_field_at (it , Velocity , 0 , 0 );
7265+ if (d ) {
7266+ DataOnSet_value = d -> x ;
7267+ }
7268+ }
7269+
7270+ static void RegularOnAdd (ecs_iter_t * it )
7271+ {
7272+ RegularOnAdd_invoked ++ ;
7273+ }
7274+
72527275void Sparse_defer_add_two_sparse_w_observer (void ) {
72537276 ecs_world_t * world = ecs_mini ();
72547277
@@ -7324,3 +7347,81 @@ void Sparse_defer_remove_two_sparse_w_observer(void) {
73247347
73257348 ecs_fini (world );
73267349}
7350+
7351+ void Sparse_defer_set_batch_two_sparse_w_observer (void ) {
7352+ ecs_world_t * world = ecs_mini ();
7353+
7354+ ECS_COMPONENT (world , Position );
7355+ ECS_COMPONENT (world , Velocity );
7356+
7357+ ecs_add_id (world , ecs_id (Velocity ), EcsSparse );
7358+ if (!fragment ) ecs_add_id (world , ecs_id (Velocity ), EcsDontFragment );
7359+
7360+ ecs_observer (world , {
7361+ .query .terms = {{.id = ecs_id (Position ) }},
7362+ .events = { EcsOnAdd },
7363+ .callback = RegularOnAdd
7364+ });
7365+
7366+ ecs_observer (world , {
7367+ .query .terms = {{.id = ecs_id (Velocity ) }},
7368+ .events = { EcsOnAdd },
7369+ .callback = DataOnAdd
7370+ });
7371+
7372+ ecs_observer (world , {
7373+ .query .terms = {{.id = ecs_id (Velocity ) }},
7374+ .events = { EcsOnSet },
7375+ .callback = DataOnSet
7376+ });
7377+
7378+ ecs_entity_t e = ecs_new (world );
7379+
7380+ ecs_defer_begin (world );
7381+ ecs_set (world , e , Position , {42 });
7382+ ecs_set (world , e , Velocity , {99 });
7383+ ecs_defer_end (world );
7384+
7385+ test_int (RegularOnAdd_invoked , 1 );
7386+ test_int (DataOnAdd_invoked , 1 );
7387+ test_int (DataOnSet_invoked , 1 );
7388+ test_int (DataOnSet_value , 99 );
7389+ test_assert (ecs_has (world , e , Velocity ));
7390+ test_assert (ecs_get (world , e , Velocity )-> x == 99 );
7391+
7392+ ecs_fini (world );
7393+ }
7394+
7395+ void Sparse_defer_set_w_sparse_w_observer (void ) {
7396+ ecs_world_t * world = ecs_mini ();
7397+
7398+ ECS_COMPONENT (world , Velocity );
7399+ ecs_add_id (world , ecs_id (Velocity ), EcsSparse );
7400+ if (!fragment ) ecs_add_id (world , ecs_id (Velocity ), EcsDontFragment );
7401+
7402+ ecs_observer (world , {
7403+ .query .terms = {{ .id = ecs_id (Velocity ) }},
7404+ .events = { EcsOnAdd },
7405+ .callback = DataOnAdd
7406+ });
7407+
7408+ ecs_observer (world , {
7409+ .query .terms = {{ .id = ecs_id (Velocity ) }},
7410+ .events = { EcsOnSet },
7411+ .callback = DataOnSet
7412+ });
7413+
7414+ ecs_entity_t e = ecs_new (world );
7415+
7416+ ecs_defer_begin (world );
7417+ ecs_set (world , e , Velocity , {77 });
7418+ ecs_defer_end (world );
7419+
7420+ test_int (DataOnAdd_invoked , 1 );
7421+ test_int (DataOnSet_invoked , 1 );
7422+ test_int (DataOnSet_value , 77 );
7423+ test_assert (ecs_has (world , e , Velocity ));
7424+ test_assert (ecs_get (world , e , Velocity )-> x == 77 );
7425+
7426+ ecs_fini (world );
7427+ }
0 commit comments