summaryrefslogtreecommitdiff
path: root/tests/pke-test-load-unload.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/pke-test-load-unload.cpp')
-rw-r--r--tests/pke-test-load-unload.cpp303
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;
+}
+