view 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 source

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