@@ -4115,3 +4115,137 @@ void NonFragmentingChildOf_delete_with_parent_mixed_nested_w_up_observer(void) {
41154115
41164116 ecs_fini (world );
41174117}
4118+
4119+ void NonFragmentingChildOf_delete_tree_1 (void ) {
4120+ ecs_world_t * world = ecs_mini ();
4121+
4122+ ECS_TAG (world , AlsoKill );
4123+
4124+ ecs_entity_t container = ecs_new (world );
4125+ ecs_entity_t a = ecs_new (world );
4126+
4127+ ecs_entity_t e = ecs_new (world );
4128+ ecs_set (world , e , EcsParent , {a });
4129+
4130+ ecs_add_pair (world , a , AlsoKill , e );
4131+
4132+ ecs_entity_t e_1 = ecs_new (world );
4133+ ecs_set (world , e_1 , EcsParent , {e });
4134+
4135+ ecs_entity_t e_2 = ecs_new (world );
4136+ ecs_set (world , e_2 , EcsParent , {e });
4137+
4138+ ecs_entity_t e_3 = ecs_new (world );
4139+ ecs_set (world , e_3 , EcsParent , {e });
4140+
4141+ ecs_add_pair (world , a , EcsChildOf , container );
4142+
4143+ ecs_delete (world , e );
4144+
4145+ test_assert (!ecs_is_alive (world , e ));
4146+ test_assert (!ecs_is_alive (world , e_1 ));
4147+ test_assert (!ecs_is_alive (world , e_2 ));
4148+ test_assert (!ecs_is_alive (world , e_3 ));
4149+
4150+ test_assert (ecs_is_alive (world , a ));
4151+ test_assert (ecs_is_alive (world , container ));
4152+
4153+ ecs_fini (world );
4154+ }
4155+
4156+ void NonFragmentingChildOf_delete_tree_2 (void ) {
4157+ ecs_world_t * world = ecs_mini ();
4158+
4159+ ECS_TAG (world , AlsoKill );
4160+
4161+ ecs_entity_t container = ecs_new (world );
4162+ ecs_entity_t a = ecs_new (world );
4163+
4164+ ecs_entity_t e = ecs_new (world );
4165+ ecs_set (world , e , EcsParent , {a });
4166+
4167+ ecs_add_pair (world , a , AlsoKill , e );
4168+
4169+ ecs_entity_t e_1 = ecs_new (world );
4170+ ecs_set (world , e_1 , EcsParent , {e });
4171+
4172+ ecs_entity_t e_2 = ecs_new (world );
4173+ ecs_set (world , e_2 , EcsParent , {e });
4174+
4175+ ecs_entity_t e_3 = ecs_new (world );
4176+ ecs_set (world , e_3 , EcsParent , {e });
4177+
4178+ ecs_defer_begin (world );
4179+ ecs_add_pair (world , a , EcsChildOf , container );
4180+ ecs_delete (world , e );
4181+ ecs_defer_end (world );
4182+
4183+ test_assert (!ecs_is_alive (world , e ));
4184+ test_assert (!ecs_is_alive (world , e_1 ));
4185+ test_assert (!ecs_is_alive (world , e_2 ));
4186+ test_assert (!ecs_is_alive (world , e_3 ));
4187+
4188+ test_assert (ecs_is_alive (world , a ));
4189+ test_assert (ecs_is_alive (world , container ));
4190+
4191+ ecs_fini (world );
4192+ }
4193+
4194+ static
4195+ void on_remove_rel (ecs_iter_t * it )
4196+ {
4197+ const ecs_id_t id = it -> ids [0 ];
4198+ for (int i = 0 ; i < it -> count ; i ++ ) {
4199+ ecs_entity_t also_kill_ent = ecs_pair_second (it -> world , id );
4200+ ecs_delete (it -> world , also_kill_ent );
4201+ }
4202+ }
4203+
4204+ void NonFragmentingChildOf_delete_tree_3 (void ) {
4205+ ecs_world_t * world = ecs_mini ();
4206+
4207+ ECS_TAG (world , Foo );
4208+ ECS_TAG (world , Rel );
4209+
4210+ ecs_observer (world , {
4211+ .query .terms = {{ ecs_pair (Rel , EcsWildcard ) }},
4212+ .events = {EcsOnRemove },
4213+ .callback = on_remove_rel
4214+ });
4215+
4216+ ecs_entity_t a = ecs_new (world );
4217+ ecs_entity_t e = ecs_new (world );
4218+ ecs_entity_t e_1 = ecs_new (world );
4219+
4220+ ecs_add (world , e , Foo );
4221+
4222+ ecs_set (world , e , EcsParent , {a });
4223+
4224+ ecs_add_pair (world , a , ecs_id (Rel ), e );
4225+
4226+ ecs_set (world , e_1 , EcsParent , {e });
4227+
4228+ ecs_delete (world , e );
4229+
4230+ test_assert (!ecs_is_alive (world , e ));
4231+ test_assert (!ecs_is_alive (world , e_1 ));
4232+ test_assert (ecs_is_alive (world , a ));
4233+
4234+ ecs_fini (world );
4235+ }
4236+
4237+ void NonFragmentingChildOf_delete_tree_4 (void ) {
4238+ install_test_abort ();
4239+
4240+ ecs_world_t * world = ecs_mini ();
4241+
4242+ ECS_TAG (world , Rel );
4243+
4244+ ecs_entity_t a = ecs_new (world );
4245+ ecs_entity_t e = ecs_new (world );
4246+
4247+ ecs_set (world , e , EcsParent , {a });
4248+
4249+ test_expect_abort (); // cycle
4250+ ecs_set (world , a , EcsParent , {e });
4251+ }
0 commit comments