diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-09-26 09:35:44 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-09-26 09:35:44 -0400 |
| commit | 5e27b4799853161ebf8e056e6d842fc5eda1e92c (patch) | |
| tree | 5a11e71dd95d75ae91dacfd3548623d3202b2614 | |
| parent | eb48a3affea5514811eed488f8c87aba066b062c (diff) | |
pke: deserialize empty string
| -rw-r--r-- | src/serialization.cpp | 2 | ||||
| -rw-r--r-- | tests/pke-test-serialization.cpp | 159 | ||||
| -rw-r--r-- | tests/pke-test.cpp | 18 |
3 files changed, 175 insertions, 4 deletions
diff --git a/src/serialization.cpp b/src/serialization.cpp index dbf9646..63415e0 100644 --- a/src/serialization.cpp +++ b/src/serialization.cpp @@ -208,7 +208,7 @@ void pke_deserialize_scene_from_stream(std::istream &i, srlztn_deserialize_helpe assert(strstr(read_line, SRLZTN_FILE_VERSION) != 0); while (i.getline(read_line, read_line_len)) { - if (strlen(read_line) == 0 && state != 1) continue; + if (strlen(read_line) == 0 && (state != 1 && state != 2)) continue; if (strstr(read_line, SRLZTN_FILE_END) == read_line) continue; // new object if (state == 0) { diff --git a/tests/pke-test-serialization.cpp b/tests/pke-test-serialization.cpp index 0d97174..3c77ff9 100644 --- a/tests/pke-test-serialization.cpp +++ b/tests/pke-test-serialization.cpp @@ -411,7 +411,7 @@ FontRenderUUID:01010101-0101-0101-0101-010101010101 UIBox:00000000!00000003 ChildId:00000000!00000002 UUID:02020202-0202-0202-0202-020202020202 -Flags:0x3 +Flags:0x84 PosTopLeft:0.100000;0.100000 MaxSize:0.800000;0.800000 Type:0x32 @@ -736,8 +736,153 @@ int pke_test_deserialization_104() { return 0; } +/* Test empty FontRender text */ +const char *const test_005_str = R"VOGON(:PKFB: +:0: + +FontRenderSettings:00000000!00000000 +CharScale:1.000000 +LineHeightScale:1.000000 +CharSpacingScale:1.000000 +SurfaceAreaSize:250;250 +SurfaceAreaPos:0;0 +SurfaceAreaFlags:0x03 +ColorForeground:0.400000;0.900000;0.500000;0.800000 +ColorBackground:0.000000;0.000000;0.000000;0.000000 + +FontRender:00000000!00000001 +ChildId:00000000!00000000 +UUID:01010101-0101-0101-0101-010101010101 +FontTypeTitle:fnt_mquin_7y +TextBegin:: + +:MULTILINE_END: + +:PKFE:)VOGON"; +int pke_test_serialization_005() { + int64_t err_index = 0; + uint32_t i, k; + srlztn_serialize_helper *h = nullptr; + pke_kve *kve = nullptr; + std::stringstream ss; + try { + h = pke_serialize_init(bkt); + + uint64_t idx_unused; + FontRenderSettings frs; + frs.char_scale = 1.0; + frs.char_spacing_scale = 1.0; + frs.line_height_scale = 1.0; + frs.surface_area_size = glm::ivec2(250, 250); + frs.surface_area_pos = glm::ivec2(0, 0); + frs.surface_area_type_flags = FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_CENTER_BOTH; + FontRenderHandle fr_handle = FontType_AddStringRender(FontType_GetFonts(idx_unused)[0].index_ft, cstring_to_pk_cstr(""), &frs, nullptr, uuid_n[1]); + + pke_serialize_scene(h); + pke_serialize_scene_to_stream(ss, h); + std::string s = ss.str(); + + PKE_TEST_ASSERT(h->bkt == bkt, err_index); + PKE_TEST_ASSERT(h->kvp_containers.bkt == bkt, err_index); + PKE_TEST_ASSERT(h->kvp_containers.next == 2, err_index); + // FontRenderSettings + PKE_TEST_ASSERT(h->kvp_containers[0].child_handles.next == 0, err_index); + PKE_TEST_ASSERT(h->kvp_containers[0].arr.next == 8, err_index); + // FontRender + PKE_TEST_ASSERT(h->kvp_containers[1].child_handles.next == 1, err_index); + PKE_TEST_ASSERT(h->kvp_containers[1].arr.next == 3, err_index); + + // 8 + for (k = 0; k < h->kvp_containers.next; ++k) { + for (i = 0; i < h->kvp_containers[k].arr.next; ++i) { + // 8 + (3 * (8 + 3)) + kve = &h->kvp_containers[k].arr[i]; + PKE_TEST_ASSERT(kve->key != nullptr, err_index); + PKE_TEST_ASSERT(kve->val != nullptr, err_index); + PKE_TEST_ASSERT(kve->end != nullptr, err_index); + } + } + + // 41 + PKE_TEST_ASSERT(strstr(test_005_str, s.c_str()) != nullptr, err_index); + + pke_serialize_teardown(h); + + } catch (const std::exception &ex) { + throw; + } + return 0; +} + +int pke_test_deserialization_105() { + int64_t err_index = 0; + uint32_t i, k; + pke_kve *kve; + srlztn_deserialize_helper *h; + std::stringstream ss(test_005_str); + try { + h = pke_deserialize_init(test_level, bkt); + + pke_deserialize_scene_from_stream(ss, h); + + PKE_TEST_ASSERT(h->bkt == bkt, err_index); + PKE_TEST_ASSERT(h->kvp_containers.bkt == bkt, err_index); + PKE_TEST_ASSERT(h->kvp_containers.next == 2, err_index); + // FontRenderSettings + PKE_TEST_ASSERT(h->kvp_containers[0].child_handles.next == 0, err_index); + PKE_TEST_ASSERT(h->kvp_containers[0].arr.next == 8, err_index); + // FontRender + PKE_TEST_ASSERT(h->kvp_containers[1].child_handles.next == 1, err_index); + PKE_TEST_ASSERT(h->kvp_containers[1].arr.next == 3, err_index); + + // 8 + for (k = 0; k < h->kvp_containers.next; ++k) { + for (i = 0; i < h->kvp_containers[k].arr.next; ++i) { + // 8 + (3 * (8 + 3)) + kve = &h->kvp_containers[k].arr[i]; + PKE_TEST_ASSERT(kve->key != nullptr, err_index); + PKE_TEST_ASSERT(kve->val != nullptr, err_index); + PKE_TEST_ASSERT(kve->end != nullptr, err_index); + } + } + + pke_deserialize_scene(h); + + uint64_t idx_unused; + FontType *fonts = FontType_GetFonts(idx_unused); + // 41 + PKE_TEST_ASSERT(fonts != nullptr, err_index); + PKE_TEST_ASSERT(idx_unused != 0xFFFFFFFFFFFFFFFF, err_index); + PKE_TEST_ASSERT(fonts->n_render > FontRenderIndex{0}, err_index); + FontRender *fr = &fonts[0].renders[0]; + + // 44 + PKE_TEST_ASSERT(fr->settings.char_scale == 1.f, err_index); + PKE_TEST_ASSERT(fr->settings.line_height_scale == 1.f, err_index); + PKE_TEST_ASSERT(fr->settings.char_spacing_scale == 1.f, err_index); + PKE_TEST_ASSERT(fr->settings.surface_area_size == glm::ivec2(250,250), err_index); + PKE_TEST_ASSERT(fr->settings.surface_area_pos == glm::ivec2(0,0), err_index); + PKE_TEST_ASSERT(fr->settings.surface_area_type_flags == FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_CENTER_BOTH, err_index); + // auto equal_4 = glm::epsilonEqual(fr->settings.color_foreground, glm::vec4(0.4, 0.9, 0.5, 0.8), epsilon_4); + // PKE_TEST_ASSERT(equal_4 == bool_4, err_index); + PKE_TEST_ASSERT(fr->settings.color_foreground == glm::vec4(0.4, 0.9, 0.5, 0.8), err_index); + PKE_TEST_ASSERT(fr->settings.color_background == glm::vec4(0.0, 0.0, 0.0, 0.0), err_index); + + // 52 + PKE_TEST_ASSERT(fr->uuid == uuid_n[1], err_index); + PKE_TEST_ASSERT(fr->text.val != nullptr, err_index); + PKE_TEST_ASSERT(fr->text.val[0] == '\0', err_index); + + pke_deserialize_teardown(h); + + } catch (const std::exception &ex) { + throw; + } + return 0; +} + struct pke_test_group *pke_test_serialization_get_group() { - static const uint64_t test_count = 9; + static const uint64_t test_count = 11; static struct pke_test tests[test_count] = { { .title = "test 999", @@ -784,6 +929,16 @@ struct pke_test_group *pke_test_serialization_get_group() { .func = pke_test_deserialization_104, .expected_result = 0, }, + { + .title = "test 005", + .func = pke_test_serialization_005, + .expected_result = 0, + }, + { + .title = "test 105", + .func = pke_test_deserialization_105, + .expected_result = 0, + }, }; static struct pke_test_group group = {}; group.title = "de/serialization"; diff --git a/tests/pke-test.cpp b/tests/pke-test.cpp index 5508394..7a314b5 100644 --- a/tests/pke-test.cpp +++ b/tests/pke-test.cpp @@ -34,10 +34,12 @@ int main(int argc, char *argv[]) (void)argv; int i = 0; int result; - uint32_t k, pass_count; + uint32_t k, pass_count, test_group_count, test_group_pass_count; double elapsed_ms; double group_ms; + double total_ms; pk_tmr func_tmr; + pk_tmr total_tmr; pke_test_get_group *group_fns[] = { pke_test_dummy_get_group, @@ -50,9 +52,14 @@ int main(int argc, char *argv[]) NULL, }; + total_ms = 0; + test_group_count = 0; + test_group_pass_count = 0; + pk_tmr_start(total_tmr); fprintf(stdout, "\r\n"); pke_test_get_group *fn = group_fns[i]; while (fn != NULL) { + test_group_count += 1; pass_count = 0; group_ms = 0; struct pke_test_group *group = (fn)(); @@ -68,6 +75,7 @@ int main(int argc, char *argv[]) pk_tmr_stop(func_tmr); elapsed_ms = pk_tmr_duration_dbl_mili(func_tmr); group_ms += elapsed_ms; + total_ms += elapsed_ms; if (result == group->tests[k].expected_result){ pass_count += 1; fprintf(stdout, "[pke-test]:[%s]:[%s] %sPassed.%s\n", group->title, group->tests[k].title, CLR_GREEN, CLR_WHITE); @@ -81,9 +89,17 @@ int main(int argc, char *argv[]) if (group->group_teardown != NULL) (group->group_teardown)(); fprintf(stdout, "[pke-test]:[%s] End. ( %s%03d%s / %03d ) Tests Completed.\n", group->title, pass_count == group->n_tests ? CLR_GREEN : CLR_RED, pass_count, CLR_WHITE, group->n_tests); fprintf(stdout, "[pke-test]:[%s] End. Elapsed ms: '%f'.\n\n", group->title, group_ms); + if (pass_count == group->n_tests) { + test_group_pass_count += 1; + } i += 1; fn = group_fns[i]; } + pk_tmr_stop(total_tmr); + + fprintf(stdout, "[pke-test] End. ( %s%03d%s / %03d ) Test Groups Completed.\n", test_group_count == test_group_pass_count ? CLR_GREEN : CLR_RED, test_group_pass_count, CLR_WHITE, test_group_count); + fprintf(stdout, "[pke-test] End. Elapsed ms: '%f' (test fn sum).\n", total_ms); + fprintf(stdout, "[pke-test] End. Elapsed ms: '%f' (actual).\n\n", pk_tmr_duration_dbl_mili(total_tmr)); return 0; } |
