diff options
Diffstat (limited to 'tests/pke-test-load-unload.cpp')
| -rw-r--r-- | tests/pke-test-load-unload.cpp | 303 |
1 files changed, 303 insertions, 0 deletions
diff --git a/tests/pke-test-load-unload.cpp b/tests/pke-test-load-unload.cpp new file mode 100644 index 0000000..f714538 --- /dev/null +++ b/tests/pke-test-load-unload.cpp @@ -0,0 +1,303 @@ + +#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 "game.hpp" +#include "level.hpp" +#include "physics.hpp" +#include "pk.h" +#include "player-input.hpp" +#include "scene.hpp" +#include "static-ui.hpp" +#include "thread-pool.hpp" + +#include "pk.h" + +extern pk_arr_t<Entity_Base*> entitiesMarkedForRemoval; +extern pk_arr_t<EntityHandle> entitiesYetToBeRemoved; + +static pk_membucket *bkt; +static pke_level *level_01; + +void print_entities_marked_for_removal() { + bool b; + pk_iter_t<Entity_Base*> 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<EntityHandle> 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 == 1, 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_render_handle = FontType_AddStringRender(FontTypeIndex{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 == 1, 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 == 3, 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() { + 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; +} + +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 pke_test_group * +pke_test_load_unload_get_group() +{ + static const uint64_t test_count = 2; + static struct pke_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 pke_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; +} + |
