#include "pke-test-load-unload.h" #include "asset-manager.hpp" #include "audio.hpp" #include "camera.hpp" #include "ecs.hpp" #include "entities.hpp" #include "game-settings.hpp" #include "level.hpp" #include "physics.hpp" #include "pke-test-stubs.h" #include "pke-test-types.h" #include "player-input.hpp" #include "scene.hpp" #include "static-ui.hpp" #include "thread-pool.hpp" extern pk_arr_t entitiesMarkedForRemoval; extern pk_arr_t entitiesYetToBeRemoved; static pk_membucket *bkt; static pke_level *level_01; void Game_Tick(double); void print_entities_marked_for_removal() { bool b; pk_iter_t iter{}; fprintf(stdout, "marked for removal BEGIN\n"); b = pk_arr_iter_begin(&entitiesMarkedForRemoval, &iter); while (b == true) { fprintf(stdout, "0x%.2X 0x%.2X\n", (*iter)->handle.b, (*iter)->handle.i); b = pk_arr_iter_increment(&entitiesMarkedForRemoval, &iter); } fprintf(stdout, "marked for removal END\n\n"); } void print_entities_yet_to_be_removed() { bool b; pk_iter_t iter{}; fprintf(stdout, "yet to be removed BEGIN\n"); b = pk_arr_iter_begin(&entitiesYetToBeRemoved, &iter); while (b == true) { fprintf(stdout, "0x%.2X 0x%.2X\n", iter->b, iter->i); b = pk_arr_iter_increment(&entitiesYetToBeRemoved, &iter); } fprintf(stdout, "yet to be removed END\n\n"); } int pke_test_load_unload_do_thing_001(int iteration) { uint64_t err_index = iteration << 16; // fprintf(stdout, "begin\n"); pkeSettings.rt.activeLevel = pke_level_create("load_unload_faux", pk_uuid_zed, pk_uuid_zed); assert(pkeSettings.rt.activeLevel->isMarkedForRemoval == false); PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel == NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); // fprintf(stdout, "tick 1\n"); Game_Tick(double(1.0 / 120.0)); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel == NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); level_01 = pke_level_create("load_unload_01", pk_uuid_zed, pk_uuid_zed); assert(level_01->isMarkedForRemoval == false); pkeSettings.rt.nextLevel = level_01; /* JCB * Double tick so that the level can get flushed out. * We need to do this so the first few asserts get a clean starting point. * This *IS* expected behavior */ PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); // fprintf(stdout, "tick 2\n"); Game_Tick(double(1.0 / 120.0)); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel == NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); // fprintf(stdout, "tick 3\n"); Game_Tick(double(1.0 / 120.0)); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel == NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); return 0; } int pke_test_load_unload_do_thing_002(int iteration) { uint64_t err_index = iteration << 16; // fprintf(stdout, "begin\n"); pkeSettings.rt.activeLevel = pke_level_create("load_unload_faux", pk_uuid_zed, pk_uuid_zed); assert(pkeSettings.rt.activeLevel->isMarkedForRemoval == false); // 1 PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel == NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); // fprintf(stdout, "tick 1\n"); Game_Tick(double(1.0 / 120.0)); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel == NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); level_01 = pke_level_create("load_unload_01", pk_uuid_zed, pk_uuid_zed); assert(level_01->isMarkedForRemoval == false); pkeSettings.rt.nextLevel = level_01; pke_ui_box *bx = pke_ui_box_new_root(PKE_UI_BOX_TYPE_TEXT); FontRenderSettings frs_01{}; bx->type_data->text.font_type_render = FontType_AddStringRender({0,0}, std::move(cstring_to_pk_cstr("one")), &frs_01, bx); bx->flags |= PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC; pke_level_register_root_ui_box(level_01, bx); // 11 PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); // fprintf(stdout, "tick 2\n"); Game_Tick(double(1.0 / 120.0)); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel == NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); // fprintf(stdout, "tick 3\n"); Game_Tick(double(1.0 / 120.0)); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel == NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); pkeSettings.rt.nextLevel = pke_level_create("load_unload_faux", pk_uuid_zed, pk_uuid_zed); // 26 // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); // fprintf(stdout, "tick 4\n"); Game_Tick(double(1.0 / 120.0)); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel == NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); // fprintf(stdout, "tick 5\n"); Game_Tick(double(1.0 / 120.0)); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel == NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); // fprintf(stdout, "tick 6\n"); Game_Tick(double(1.0 / 120.0)); // print_entities_marked_for_removal(); // print_entities_yet_to_be_removed(); PKE_TEST_ASSERT(pkeSettings.rt.activeLevel != NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.nextLevel == NULL, err_index); PKE_TEST_ASSERT(pkeSettings.rt.previousLevel == NULL, err_index); PKE_TEST_ASSERT(entitiesMarkedForRemoval.next == 0, err_index); PKE_TEST_ASSERT(entitiesYetToBeRemoved.next == 0, err_index); return 0; } void pke_test_load_unload_init() { pke_test_stub_init_vulkan(); bkt = pk_mem_bucket_create("pke_test_load_unload", PK_MEM_DEFAULT_BUCKET_SIZE, PK_MEMBUCKET_FLAG_NONE); pk_mem_bucket_set_client_mem_bucket(bkt); pkeSettings.mem_bkt.game = bkt; pkeSettings.mem_bkt.game_transient = pk_mem_bucket_create("pke_test_load_unload_transient", PK_MEM_DEFAULT_BUCKET_SIZE, PK_MEMBUCKET_FLAG_TRANSIENT); pk_ev_init(bkt); Physics_Init(); PkeThreads_Init(); AM_Init(); ECS_Init(); pke_audio_init(); pke_input_init(); pke_ui_init(); PkeCamera_Init(); FontType_Init(); pke_scene_master_init(); pke_level_init(); EntityType_Init(); } void pke_test_load_unload_teardown() { EntityType_Teardown(); pke_level_teardown(); pke_scene_master_teardown(); FontType_Teardown(); PkeCamera_Teardown(); pke_ui_teardown(); pke_input_teardown(); pke_audio_teardown(); ECS_Teardown(); AM_Teardown(); PkeThreads_Teardown(); Physics_Teardown(); pk_ev_teardown(); pk_mem_bucket_destroy(pkeSettings.mem_bkt.game_transient); pk_mem_bucket_destroy(bkt); pk_mem_bucket_set_client_mem_bucket(nullptr); bkt = nullptr; pkeSettings.mem_bkt.game = nullptr; pkeSettings.mem_bkt.game_transient = nullptr; pkeSettings.rt.activeLevel = nullptr; pkeSettings.rt.nextLevel = nullptr; pkeSettings.rt.previousLevel = nullptr; pke_test_stub_teardown_vulkan(); } int pke_test_load_unload_001() { int i, k; for (i = 0; i < 255; ++i) { if (k = pke_test_load_unload_do_thing_001(i), k != 0){ return k; } } return 0; } int pke_test_load_unload_002() { int i, k; for (i = 0; i < 255; ++i) { if (k = pke_test_load_unload_do_thing_002(i), k != 0){ return k; } } return 0; } struct pk_test_group * pke_test_load_unload_get_group() { static const uint64_t test_count = 2; static struct pk_test tests[test_count] = { { .title = "test 001", .func = pke_test_load_unload_001, .expected_result = 0, }, { .title = "test 002", .func = pke_test_load_unload_002, .expected_result = 0, }, }; static struct pk_test_group group{}; group.title = "load-unload"; group.group_setup = nullptr; group.group_teardown = nullptr; group.test_setup = pke_test_load_unload_init; group.test_teardown = pke_test_load_unload_teardown; group.n_tests = test_count; group.tests = &tests[0]; return &group; }