comparison 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
comparison
equal deleted inserted replaced
280:49e9e591c9bb 281:c57149ad216e
1 #include "infinite_canvas/scene_store.h"
2
3 #include <assert.h>
4 #include <stdio.h>
5 #include <string.h>
6 #if defined(_WIN32)
7 #include <windows.h>
8 #else
9 #include <unistd.h>
10 #endif
11
12 int main(void)
13 {
14 char path[256];
15 #if defined(_WIN32)
16 snprintf(
17 path,
18 sizeof(path),
19 "C:/temp/infinite-canvas-scene-%lu.zmap",
20 (unsigned long)GetCurrentProcessId());
21 #else
22 snprintf(
23 path,
24 sizeof(path),
25 "/tmp/infinite-canvas-scene-%ld.zmap",
26 (long)getpid());
27 #endif
28 char named_path[CANVAS_SCENE_STORE_PATH_CAPACITY];
29 #if defined(_WIN32)
30 assert(_putenv_s("XDG_STATE_HOME", "C:/temp/zenbu-scene-store-test") == 0);
31 #else
32 assert(setenv("XDG_STATE_HOME", "/tmp/zenbu-scene-store-test", 1) == 0);
33 #endif
34 assert(Canvas_Scene_Store_Path(
35 "workspace-1", named_path, sizeof(named_path)));
36 assert(strstr(named_path, "workspace-1.zmap"));
37 assert(!Canvas_Scene_Store_Path(
38 "../workspace", named_path, sizeof(named_path)));
39 Dowa_Arena *p_source_arena = Dowa_Arena_Create(4 * ONE_MEGA_BYTE);
40 Dowa_Arena *p_loaded_arena = Dowa_Arena_Create(4 * ONE_MEGA_BYTE);
41 assert(p_source_arena && p_loaded_arena);
42 Canvas_Scene source;
43 Canvas_Scene loaded;
44 Canvas_Camera source_camera;
45 Canvas_Camera loaded_camera;
46 Canvas_Scene_Init(&source, p_source_arena);
47 Canvas_Scene_Init(&loaded, p_loaded_arena);
48 Canvas_Camera_Init(&source_camera, 1200, 800);
49 Canvas_Camera_Init(&loaded_camera, 1200, 800);
50
51 assert(Canvas_Scene_Add(
52 &source, CANVAS_ENTITY_TEXT_AREA, (Vector2){42.0f, -17.0f}));
53 assert(Canvas_Scene_Add(
54 &source, CANVAS_ENTITY_CONVERSATION, (Vector2){800.0f, 120.0f}));
55 Canvas_Entity *p_text = &source.p_entities[0];
56 snprintf(p_text->label, sizeof(p_text->label), "Dictation");
57 snprintf(p_text->text, sizeof(p_text->text), "persist me");
58 p_text->pinned = TRUE;
59 p_text->pinned_screen_position = (Vector2){30.0f, 40.0f};
60 p_text->pinned_screen_size = (Vector2){280.0f, 148.0f};
61 Canvas_Entity *p_conversation = &source.p_entities[1];
62 p_conversation->active = TRUE;
63 p_conversation->parked = TRUE;
64 p_conversation->parked_restore_position = (Vector2){90.0f, 110.0f};
65 source.show_grid = TRUE;
66 source_camera.target = (Vector2){400.0f, -200.0f};
67 source_camera.zoom = 1.75f;
68
69 assert(Canvas_Scene_Store_Save(path, &source, &source_camera));
70 assert(Canvas_Scene_Store_Load(path, &loaded, &loaded_camera));
71 assert(Dowa_Array_Length(loaded.p_entities) == 2);
72 assert(strcmp(loaded.p_entities[0].label, "Dictation") == 0);
73 assert(strcmp(loaded.p_entities[0].text, "persist me") == 0);
74 assert(loaded.p_entities[0].pinned);
75 assert(loaded.p_entities[1].active);
76 assert(loaded.p_entities[1].parked);
77 assert(loaded.show_grid);
78 assert(loaded_camera.target.x == 400.0f);
79 assert(loaded_camera.target.y == -200.0f);
80 assert(loaded_camera.zoom == 1.75f);
81
82 FILE *p_file = fopen(path, "r+b");
83 assert(p_file);
84 assert(fseek(p_file, 50, SEEK_SET) == 0);
85 int byte = fgetc(p_file);
86 assert(byte != EOF);
87 assert(fseek(p_file, 50, SEEK_SET) == 0);
88 assert(fputc(byte ^ 0xff, p_file) != EOF);
89 fclose(p_file);
90 assert(!Canvas_Scene_Store_Load(path, &loaded, &loaded_camera));
91 assert(Dowa_Array_Length(loaded.p_entities) == 2);
92
93 remove(path);
94 Dowa_Arena_Free(p_loaded_arena);
95 Dowa_Arena_Free(p_source_arena);
96 return 0;
97 }