Mercurial
diff infinite_canvas/scene_store_test.c @ 281:c57149ad216e default tip
Copilot-Session: f68442b1-fa8f-46a0-9689-81710613bbd4
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Tue, 18 Aug 2026 22:18:15 -0700 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/infinite_canvas/scene_store_test.c Tue Aug 18 22:18:15 2026 -0700 @@ -0,0 +1,97 @@ +#include "infinite_canvas/scene_store.h" + +#include <assert.h> +#include <stdio.h> +#include <string.h> +#if defined(_WIN32) +#include <windows.h> +#else +#include <unistd.h> +#endif + +int main(void) +{ + char path[256]; +#if defined(_WIN32) + snprintf( + path, + sizeof(path), + "C:/temp/infinite-canvas-scene-%lu.zmap", + (unsigned long)GetCurrentProcessId()); +#else + snprintf( + path, + sizeof(path), + "/tmp/infinite-canvas-scene-%ld.zmap", + (long)getpid()); +#endif + char named_path[CANVAS_SCENE_STORE_PATH_CAPACITY]; +#if defined(_WIN32) + assert(_putenv_s("XDG_STATE_HOME", "C:/temp/zenbu-scene-store-test") == 0); +#else + assert(setenv("XDG_STATE_HOME", "/tmp/zenbu-scene-store-test", 1) == 0); +#endif + assert(Canvas_Scene_Store_Path( + "workspace-1", named_path, sizeof(named_path))); + assert(strstr(named_path, "workspace-1.zmap")); + assert(!Canvas_Scene_Store_Path( + "../workspace", named_path, sizeof(named_path))); + Dowa_Arena *p_source_arena = Dowa_Arena_Create(4 * ONE_MEGA_BYTE); + Dowa_Arena *p_loaded_arena = Dowa_Arena_Create(4 * ONE_MEGA_BYTE); + assert(p_source_arena && p_loaded_arena); + Canvas_Scene source; + Canvas_Scene loaded; + Canvas_Camera source_camera; + Canvas_Camera loaded_camera; + Canvas_Scene_Init(&source, p_source_arena); + Canvas_Scene_Init(&loaded, p_loaded_arena); + Canvas_Camera_Init(&source_camera, 1200, 800); + Canvas_Camera_Init(&loaded_camera, 1200, 800); + + assert(Canvas_Scene_Add( + &source, CANVAS_ENTITY_TEXT_AREA, (Vector2){42.0f, -17.0f})); + assert(Canvas_Scene_Add( + &source, CANVAS_ENTITY_CONVERSATION, (Vector2){800.0f, 120.0f})); + Canvas_Entity *p_text = &source.p_entities[0]; + snprintf(p_text->label, sizeof(p_text->label), "Dictation"); + snprintf(p_text->text, sizeof(p_text->text), "persist me"); + p_text->pinned = TRUE; + p_text->pinned_screen_position = (Vector2){30.0f, 40.0f}; + p_text->pinned_screen_size = (Vector2){280.0f, 148.0f}; + Canvas_Entity *p_conversation = &source.p_entities[1]; + p_conversation->active = TRUE; + p_conversation->parked = TRUE; + p_conversation->parked_restore_position = (Vector2){90.0f, 110.0f}; + source.show_grid = TRUE; + source_camera.target = (Vector2){400.0f, -200.0f}; + source_camera.zoom = 1.75f; + + assert(Canvas_Scene_Store_Save(path, &source, &source_camera)); + assert(Canvas_Scene_Store_Load(path, &loaded, &loaded_camera)); + assert(Dowa_Array_Length(loaded.p_entities) == 2); + assert(strcmp(loaded.p_entities[0].label, "Dictation") == 0); + assert(strcmp(loaded.p_entities[0].text, "persist me") == 0); + assert(loaded.p_entities[0].pinned); + assert(loaded.p_entities[1].active); + assert(loaded.p_entities[1].parked); + assert(loaded.show_grid); + assert(loaded_camera.target.x == 400.0f); + assert(loaded_camera.target.y == -200.0f); + assert(loaded_camera.zoom == 1.75f); + + FILE *p_file = fopen(path, "r+b"); + assert(p_file); + assert(fseek(p_file, 50, SEEK_SET) == 0); + int byte = fgetc(p_file); + assert(byte != EOF); + assert(fseek(p_file, 50, SEEK_SET) == 0); + assert(fputc(byte ^ 0xff, p_file) != EOF); + fclose(p_file); + assert(!Canvas_Scene_Store_Load(path, &loaded, &loaded_camera)); + assert(Dowa_Array_Length(loaded.p_entities) == 2); + + remove(path); + Dowa_Arena_Free(p_loaded_arena); + Dowa_Arena_Free(p_source_arena); + return 0; +}