summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/serialization-static-ui.cpp15
-rw-r--r--tests/pke-test-serialization.cpp173
2 files changed, 180 insertions, 8 deletions
diff --git a/src/serialization-static-ui.cpp b/src/serialization-static-ui.cpp
index 4c45cc1..7f15b10 100644
--- a/src/serialization-static-ui.cpp
+++ b/src/serialization-static-ui.cpp
@@ -56,12 +56,13 @@ void pke_deserialize_ui_box_internal(srlztn_deserialize_helper *h, pke_kve_conta
pk_handle pke_serialize_ui_box(srlztn_serialize_helper *h, pke_ui_box *box) {
char *s;
int len;
- pk_handle internal_type_handle = PK_HANDLE_MAX;
pke_kve kve{};
pke_kve_container kvec{};
+ kvec.child_handles.bkt = h->bkt;
+
if (box->type == PKE_UI_BOX_TYPE_TEXT) {
- internal_type_handle = pke_serialize_ui_box_internal(h, &box->type_data->text);
+ pk_arr_append_t(&kvec.child_handles, pke_serialize_ui_box_internal(h, &box->type_data->text));
}
kvec.srlztn_handle = h->handle_head;
@@ -69,11 +70,7 @@ pk_handle pke_serialize_ui_box(srlztn_serialize_helper *h, pke_ui_box *box) {
kvec.bkt = h->bkt;
kvec.arr.bkt = h->bkt;
kvec.children.bkt = h->bkt;
- kvec.child_handles.bkt = h->bkt;
h->handle_head.itemIndex++;
- if (internal_type_handle != PK_HANDLE_MAX) {
- pk_arr_append_t(&kvec.child_handles, internal_type_handle);
- }
if (box->uuid != pk_uuid_zed && box->uuid != pk_uuid_max) {
kve.key = SRLZTN_UI_BOX_UUID;
@@ -161,6 +158,12 @@ pk_handle pke_serialize_ui_box(srlztn_serialize_helper *h, pke_ui_box *box) {
}
pk_arr_append_t(&h->kvp_containers, kvec);
+ pke_kve_container *kvec_ptr = &h->kvp_containers[h->kvp_containers.next-1];
+
+ for (pke_ui_box_count_T i = 0; i < box->internal.h_children; ++i) {
+ pk_arr_append_t(&kvec_ptr->child_handles, pke_serialize_ui_box(h, box->internal.children[i]));
+ }
+
kvec.arr.data = nullptr;
kvec.children.data = nullptr;
kvec.child_handles.data = nullptr;
diff --git a/tests/pke-test-serialization.cpp b/tests/pke-test-serialization.cpp
index 840adfa..5663275 100644
--- a/tests/pke-test-serialization.cpp
+++ b/tests/pke-test-serialization.cpp
@@ -9,7 +9,6 @@
#include "physics.hpp"
#include "pk.h"
#include "scene.hpp"
-#include "serialization-camera.hpp"
#include "serialization-component.hpp"
#include "serialization.hpp"
#include "static-ui.hpp"
@@ -569,8 +568,168 @@ int pke_test_deserialization_103() {
return 0;
}
+const char *const test_004_str = R"VOGON(:PKFB:
+:0:
+
+UIBox:00000000!00000000
+ChildId:00000000!00000001
+UUID:02020202-0202-0202-0202-020202020202
+Flags:0x02
+PosTopLeft:1.000000;1.000000
+MaxSize:1278.000000;718.000000
+Type:0x00
+Layer:0x00
+
+UIBox:00000000!00000001
+UUID:01010101-0101-0101-0101-010101010101
+ParentUUID:02020202-0202-0202-0202-020202020202
+Flags:0x04
+PosTopLeft:0.100000;0.100000
+MaxSize:0.800000;0.800000
+Type:0x00
+Layer:0x00
+
+:PKFE:)VOGON";
+int pke_test_serialization_004() {
+ int64_t err_index = 0;
+ uint32_t i, k;
+ srlztn_serialize_helper *h = nullptr;
+ pke_kve *kve = nullptr;
+ std::stringstream ss;
+ try {
+ bkt = pk_bucket_create("pke_test_serialization", PK_DEFAULT_BUCKET_SIZE, false);
+ h = pke_serialize_init(bkt);
+
+ pke_ui_box *ui_box_p = pke_ui_box_new_root(PKE_UI_BOX_TYPE_STANDARD, uuid_n[2]);
+ ui_box_p->flags |= PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC;
+ ui_box_p->pos_top_left.x = 1.f;
+ ui_box_p->pos_top_left.y = 1.f;
+ ui_box_p->max_size.x = 1278.f;
+ ui_box_p->max_size.y = 718.f;
+
+ pke_ui_box *ui_box_c = pke_ui_box_new_child(ui_box_p, PKE_UI_BOX_TYPE_STANDARD, uuid_n[1]);
+ ui_box_c->flags |= PKE_UI_BOX_FLAG_POSITION_TYPE_DYNAMIC;
+ ui_box_c->pos_top_left.x = 0.1;
+ ui_box_c->pos_top_left.y = 0.1;
+ ui_box_c->max_size.x = 0.8;
+ ui_box_c->max_size.y = 0.8;
+
+ 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);
+ // ui box
+ PKE_TEST_ASSERT(h->kvp_containers[0].child_handles.next == 1, err_index);
+ PKE_TEST_ASSERT(h->kvp_containers[0].arr.next == 6, err_index);
+ // ui box
+ PKE_TEST_ASSERT(h->kvp_containers[1].child_handles.next == 0, err_index);
+ PKE_TEST_ASSERT(h->kvp_containers[1].arr.next == 7, 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 * (7 + 6))
+ 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);
+ }
+ }
+
+ // 47
+ PKE_TEST_ASSERT(strstr(test_004_str, s.c_str()) != nullptr, err_index);
+
+ pke_serialize_teardown(h);
+
+ } catch (const std::exception &ex) {
+ pk_bucket_destroy(bkt);
+ throw;
+ }
+ pk_bucket_destroy(bkt);
+ return 0;
+}
+
+int pke_test_deserialization_104() {
+ int64_t err_index = 0;
+ uint32_t i, k;
+ srlztn_deserialize_helper *h = nullptr;
+ pke_kve *kve = nullptr;
+ std::stringstream ss(test_004_str);
+ try {
+ bkt = pk_bucket_create("pke_test_serialization", PK_DEFAULT_BUCKET_SIZE, false);
+ h = pke_deserialize_init(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);
+ // ui box
+ PKE_TEST_ASSERT(h->kvp_containers[0].child_handles.next == 1, err_index);
+ PKE_TEST_ASSERT(h->kvp_containers[0].arr.next == 6, err_index);
+ // ui box
+ PKE_TEST_ASSERT(h->kvp_containers[1].child_handles.next == 0, err_index);
+ PKE_TEST_ASSERT(h->kvp_containers[1].arr.next == 7, 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 * (7 + 6))
+ 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);
+
+ pke_ui_box_count_T box_count;
+ pke_ui_box **root_boxes = pke_ui_get_root_boxes(&box_count);
+ // 47
+ PKE_TEST_ASSERT(root_boxes != nullptr, err_index);
+ PKE_TEST_ASSERT(box_count == 1, err_index);
+ PKE_TEST_ASSERT(root_boxes[0] != nullptr, err_index);
+
+ // 50
+ PKE_TEST_ASSERT(root_boxes[0]->uuid == uuid_n[2], err_index);
+ PKE_TEST_ASSERT(PK_HAS_FLAG(root_boxes[0]->flags, PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC), err_index);
+ PKE_TEST_ASSERT(root_boxes[0]->pos_top_left == glm::vec2(1.f,1.f), err_index);
+ PKE_TEST_ASSERT(root_boxes[0]->max_size == glm::vec2(1278.f,718.f), err_index);
+ PKE_TEST_ASSERT(PK_HAS_FLAG(root_boxes[0]->type, PKE_UI_BOX_TYPE_STANDARD), err_index);
+ PKE_TEST_ASSERT(root_boxes[0]->layer == 0, err_index);
+ PKE_TEST_ASSERT(root_boxes[0]->internal.parent == nullptr, err_index);
+ PKE_TEST_ASSERT(root_boxes[0]->internal.h_children == 1, err_index);
+ PKE_TEST_ASSERT(root_boxes[0]->internal.children != nullptr, err_index);
+ PKE_TEST_ASSERT(root_boxes[0]->internal.children[0] != nullptr, err_index);
+
+ pke_ui_box *box_c = root_boxes[0]->internal.children[0];
+ // 60
+ PKE_TEST_ASSERT(box_c->uuid == uuid_n[1], err_index);
+ PKE_TEST_ASSERT(PK_HAS_FLAG(box_c->flags, PKE_UI_BOX_FLAG_POSITION_TYPE_DYNAMIC), err_index);
+ PKE_TEST_ASSERT(box_c->pos_top_left == glm::vec2(0.1,0.1), err_index);
+ PKE_TEST_ASSERT(box_c->max_size == glm::vec2(0.8,0.8), err_index);
+ PKE_TEST_ASSERT(PK_HAS_FLAG(box_c->type, PKE_UI_BOX_TYPE_STANDARD), err_index);
+ PKE_TEST_ASSERT(box_c->layer == 0, err_index);
+ PKE_TEST_ASSERT(box_c->internal.parent == root_boxes[0], err_index);
+ PKE_TEST_ASSERT(box_c->internal.h_children == 0, err_index);
+ PKE_TEST_ASSERT(box_c->internal.children == nullptr, err_index);
+
+ pke_deserialize_teardown(h);
+
+ } catch (const std::exception &ex) {
+ pk_bucket_destroy(bkt);
+ throw;
+ }
+ pk_bucket_destroy(bkt);
+ return 0;
+}
+
struct pke_test_group *pke_test_serialization_get_group() {
- static const uint64_t test_count = 7;
+ static const uint64_t test_count = 9;
static struct pke_test tests[test_count] = {
{
.title = "test 999",
@@ -607,6 +766,16 @@ struct pke_test_group *pke_test_serialization_get_group() {
.func = pke_test_deserialization_103,
.expected_result = 0,
},
+ {
+ .title = "test 004",
+ .func = pke_test_serialization_004,
+ .expected_result = 0,
+ },
+ {
+ .title = "test 104",
+ .func = pke_test_deserialization_104,
+ .expected_result = 0,
+ },
};
static struct pke_test_group group = {};
group.title = "de/serialization";