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;
+}