fix: apply clang-format to all source files

Fixes formatting violations that were causing CI failures.
Applied clang-format-14 to ensure consistent code formatting
across the codebase.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
scawful
2025-11-20 01:35:33 -05:00
parent c2bb90a3f1
commit fa3da8fc27
600 changed files with 32605 additions and 27962 deletions

View File

@@ -57,12 +57,12 @@
#include "imgui_test_engine/imgui_te_ui.h"
#include "app/controller.h"
#include "app/platform/window.h"
#include "app/editor/dungeon/dungeon_editor_v2.h"
#include "app/platform/window.h"
#include "app/rom.h"
#include "test_utils.h"
#include "zelda3/dungeon/room.h"
#include "zelda3/dungeon/room_object.h"
#include "test_utils.h"
namespace yaze {
namespace test {
@@ -78,24 +78,24 @@ class DungeonObjectRenderingE2ETests : public TestRomManager::BoundRomTest {
// Initialize test environment
rom_ = std::shared_ptr<Rom>(rom(), [](Rom*) {});
dungeon_editor_ = std::make_unique<editor::DungeonEditorV2>();
dungeon_editor_->set_rom(rom_.get());
ASSERT_TRUE(dungeon_editor_->Load().ok());
// Initialize imgui test engine
engine_ = ImGuiTestEngine_CreateContext();
ImGuiTestEngineIO& test_io = ImGuiTestEngine_GetIO(engine_);
test_io.ConfigVerboseLevel = ImGuiTestVerboseLevel_Info;
test_io.ConfigVerboseLevelOnError = ImGuiTestVerboseLevel_Debug;
test_io.ConfigRunSpeed = ImGuiTestRunSpeed_Fast;
ImGuiTestEngine_Start(engine_, ImGui::GetCurrentContext());
// Register all test cases
RegisterAllTests();
}
void TearDown() override {
if (engine_) {
ImGuiTestEngine_Stop(engine_);
@@ -106,9 +106,9 @@ class DungeonObjectRenderingE2ETests : public TestRomManager::BoundRomTest {
rom_.reset();
BoundRomTest::TearDown();
}
void RegisterAllTests();
// Test registration helpers
void RegisterObjectBrowserTests();
void RegisterObjectPlacementTests();
@@ -117,7 +117,7 @@ class DungeonObjectRenderingE2ETests : public TestRomManager::BoundRomTest {
void RegisterSaveWorkflowTests();
void RegisterRenderingQualityTests();
void RegisterPerformanceTests();
ImGuiTestEngine* engine_ = nullptr;
std::shared_ptr<Rom> rom_;
std::unique_ptr<editor::DungeonEditorV2> dungeon_editor_;
@@ -136,7 +136,8 @@ class DungeonObjectRenderingE2ETests : public TestRomManager::BoundRomTest {
* - Object list is scrollable
*/
void DungeonObjectRenderingE2ETests::RegisterObjectBrowserTests() {
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering", "ObjectBrowser_NavigateCategories");
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering",
"ObjectBrowser_NavigateCategories");
test->GuiFunc = [](ImGuiTestContext* ctx) {
// Render dungeon editor UI
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
@@ -145,26 +146,22 @@ void DungeonObjectRenderingE2ETests::RegisterObjectBrowserTests() {
test->TestFunc = [](ImGuiTestContext* ctx) {
// Open dungeon editor window
ctx->SetRef("Dungeon Editor");
// Navigate to object selector
ctx->ItemClick("Object Selector##tab");
ctx->Yield();
// Test category tabs
const char* categories[] = {
"Type1##tab",
"Type2##tab",
"Type3##tab",
"All##tab"
};
const char* categories[] = {"Type1##tab", "Type2##tab", "Type3##tab",
"All##tab"};
for (const char* category : categories) {
ctx->ItemClick(category);
ctx->Yield();
// Verify object list is visible and has content
ctx->ItemExists("AssetBrowser##child");
// Try scrolling the list
ctx->ItemClick("AssetBrowser##child");
ctx->KeyPress(ImGuiKey_DownArrow, 5);
@@ -182,32 +179,34 @@ void DungeonObjectRenderingE2ETests::RegisterObjectBrowserTests() {
* - Preview updates when object selected
* - Object details window shows correct info
*/
void RegisterObjectBrowserTests_SelectObject(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "ObjectBrowser_SelectObject");
void RegisterObjectBrowserTests_SelectObject(
DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"ObjectBrowser_SelectObject");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
};
test->TestFunc = [](ImGuiTestContext* ctx) {
ctx->SetRef("Dungeon Editor");
// Navigate to object selector
ctx->ItemClick("Object Selector##tab");
ctx->Yield();
// Select Type1 category
ctx->ItemClick("Type1##tab");
ctx->Yield();
// Click on first object in list (wall object 0x10)
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
// Verify object details window appears
ctx->SetRef("Object Details");
ctx->ItemExists("Object ID: 0x10");
// Verify preview canvas shows object
ctx->SetRef("Dungeon Editor/PreviewCanvas");
ctx->ItemExists("**/canvas##child");
@@ -223,28 +222,30 @@ void RegisterObjectBrowserTests_SelectObject(DungeonObjectRenderingE2ETests* sel
* - Filtering by ID works
* - Clearing search restores full list
*/
void RegisterObjectBrowserTests_SearchFilter(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "ObjectBrowser_SearchFilter");
void RegisterObjectBrowserTests_SearchFilter(
DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"ObjectBrowser_SearchFilter");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
};
test->TestFunc = [](ImGuiTestContext* ctx) {
ctx->SetRef("Dungeon Editor/Object Selector");
// Type in search box
ctx->ItemClick("Search##input");
ctx->KeyCharsAppend("0x10");
ctx->Yield();
// Verify filtered results
ctx->ItemExists("Object_0x10");
ctx->ItemVerifyNotExists("Object_0x20");
// Clear search
ctx->ItemClick("Clear##button");
ctx->Yield();
// Verify full list restored
ctx->ItemExists("Object_0x10");
ctx->ItemExists("Object_0x20");
@@ -266,44 +267,45 @@ void RegisterObjectBrowserTests_SearchFilter(DungeonObjectRenderingE2ETests* sel
* - Canvas renders placed object
*/
void DungeonObjectRenderingE2ETests::RegisterObjectPlacementTests() {
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering", "ObjectPlacement_MouseClick");
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering",
"ObjectPlacement_MouseClick");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
};
test->TestFunc = [](ImGuiTestContext* ctx) {
ctx->SetRef("Dungeon Editor");
// Select an object (wall 0x10)
ctx->ItemClick("Object Selector##tab");
ctx->Yield();
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
// Switch to main canvas
ctx->SetRef("Dungeon Editor");
ctx->ItemClick("Canvas##tab");
ctx->Yield();
// Click on canvas to place object
ctx->SetRef("Dungeon Editor/Canvas");
// TODO: fix this
// ImVec2 canvas_center = ctx->ItemRectCenter("canvas##child");
// ctx->MouseMove(canvas_center);
// ctx->Yield();
// Verify preview is visible
// (Actual verification would check rendering)
ctx->MouseClick();
ctx->Yield();
// Verify object was placed
ctx->SetRef("Dungeon Editor");
ctx->ItemClick("Room Objects##tab");
ctx->Yield();
// Check object appears in list
ctx->ItemExists("Object ID: 0x10");
};
@@ -318,33 +320,35 @@ void DungeonObjectRenderingE2ETests::RegisterObjectPlacementTests() {
* - Object positions align to grid
* - Grid size can be changed
*/
void RegisterObjectPlacementTests_SnapToGrid(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "ObjectPlacement_SnapToGrid");
void RegisterObjectPlacementTests_SnapToGrid(
DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"ObjectPlacement_SnapToGrid");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
};
test->TestFunc = [](ImGuiTestContext* ctx) {
ctx->SetRef("Dungeon Editor");
// Enable snap to grid
ctx->ItemClick("Options##menu");
ctx->ItemClick("Snap to Grid##checkbox");
ctx->Yield();
// Select object
ctx->ItemClick("Object Selector##tab");
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
// Place object at arbitrary position
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_pos = ctx->ItemRectMin("canvas##child");
ctx->MouseMove(ImVec2(canvas_pos.x + 37, canvas_pos.y + 49));
ctx->MouseClick();
ctx->Yield();
// Verify object was placed at snapped position (32, 48)
ctx->SetRef("Dungeon Editor/Object Details");
ctx->ItemVerifyValue("X Position", 32);
@@ -361,25 +365,27 @@ void RegisterObjectPlacementTests_SnapToGrid(DungeonObjectRenderingE2ETests* sel
* - Each placement is independent
* - All placed objects render correctly
*/
void RegisterObjectPlacementTests_MultipleObjects(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "ObjectPlacement_MultipleObjects");
void RegisterObjectPlacementTests_MultipleObjects(
DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"ObjectPlacement_MultipleObjects");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
};
test->TestFunc = [](ImGuiTestContext* ctx) {
ctx->SetRef("Dungeon Editor");
// Place 5 different objects
const uint16_t object_ids[] = {0x10, 0x11, 0x20, 0x100, 0xF99};
for (int i = 0; i < 5; i++) {
// Select object
ctx->ItemClick("Object Selector##tab");
ctx->SetRef("AssetBrowser");
ctx->ItemClick(ImGuiTestRef_Str("Object_0x%02X", object_ids[i]));
ctx->Yield();
// Place at different position
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_pos = ctx->ItemRectMin("canvas##child");
@@ -387,7 +393,7 @@ void RegisterObjectPlacementTests_MultipleObjects(DungeonObjectRenderingE2ETests
ctx->MouseClick();
ctx->Yield();
}
// Verify all 5 objects in room
ctx->SetRef("Dungeon Editor/Room Objects");
ctx->ItemExists("Object Count: 5");
@@ -408,7 +414,8 @@ void RegisterObjectPlacementTests_MultipleObjects(DungeonObjectRenderingE2ETests
* - Object details update
*/
void DungeonObjectRenderingE2ETests::RegisterObjectSelectionTests() {
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering", "ObjectSelection_Click");
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering",
"ObjectSelection_Click");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
@@ -420,18 +427,18 @@ void DungeonObjectRenderingE2ETests::RegisterObjectSelectionTests() {
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_center = ctx->ItemRectCenter("canvas##child");
ctx->MouseMove(canvas_center);
ctx->MouseClick();
ctx->Yield();
// Now try to select it
ctx->MouseMove(canvas_center);
ctx->MouseClick();
ctx->Yield();
// Verify object is selected
ctx->SetRef("Dungeon Editor/Object Details");
ctx->ItemExists("Selected Object");
@@ -448,8 +455,10 @@ void DungeonObjectRenderingE2ETests::RegisterObjectSelectionTests() {
* - All objects in box are selected
* - Selection count is correct
*/
void RegisterObjectSelectionTests_MultiSelect(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "ObjectSelection_MultiSelect");
void RegisterObjectSelectionTests_MultiSelect(
DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"ObjectSelection_MultiSelect");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
@@ -462,14 +471,14 @@ void RegisterObjectSelectionTests_MultiSelect(DungeonObjectRenderingE2ETests* se
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_pos = ctx->ItemRectMin("canvas##child");
ctx->MouseMove(ImVec2(canvas_pos.x + (i * 32) + 16, canvas_pos.y + 16));
ctx->MouseClick();
ctx->Yield();
}
// Ctrl+drag to select all
ctx->KeyDown(ImGuiKey_LeftCtrl);
ImVec2 canvas_pos = ctx->ItemRectMin("canvas##child");
@@ -479,7 +488,7 @@ void RegisterObjectSelectionTests_MultiSelect(DungeonObjectRenderingE2ETests* se
ctx->MouseUp();
ctx->KeyUp(ImGuiKey_LeftCtrl);
ctx->Yield();
// Verify 3 objects selected
ctx->SetRef("Dungeon Editor");
ctx->ItemVerifyValue("Selected Objects", 3);
@@ -495,8 +504,10 @@ void RegisterObjectSelectionTests_MultiSelect(DungeonObjectRenderingE2ETests* se
* - Object position updates during drag
* - Final position is correct
*/
void RegisterObjectSelectionTests_MoveObject(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "ObjectSelection_MoveObject");
void RegisterObjectSelectionTests_MoveObject(
DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"ObjectSelection_MoveObject");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
@@ -508,14 +519,14 @@ void RegisterObjectSelectionTests_MoveObject(DungeonObjectRenderingE2ETests* sel
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_pos = ctx->ItemRectMin("canvas##child");
ImVec2 initial_pos = ImVec2(canvas_pos.x + 16, canvas_pos.y + 16);
ctx->MouseMove(initial_pos);
ctx->MouseClick();
ctx->Yield();
// Select and drag to (48, 48)
ctx->MouseMove(initial_pos);
ctx->MouseClick();
@@ -523,7 +534,7 @@ void RegisterObjectSelectionTests_MoveObject(DungeonObjectRenderingE2ETests* sel
ctx->MouseMove(ImVec2(canvas_pos.x + 48, canvas_pos.y + 48));
ctx->MouseUp();
ctx->Yield();
// Verify new position
ctx->SetRef("Dungeon Editor/Object Details");
ctx->ItemVerifyValue("X Position", 48);
@@ -540,8 +551,10 @@ void RegisterObjectSelectionTests_MoveObject(DungeonObjectRenderingE2ETests* sel
* - Object no longer in room list
* - Canvas no longer renders object
*/
void RegisterObjectSelectionTests_DeleteObject(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "ObjectSelection_DeleteObject");
void RegisterObjectSelectionTests_DeleteObject(
DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"ObjectSelection_DeleteObject");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
@@ -553,21 +566,21 @@ void RegisterObjectSelectionTests_DeleteObject(DungeonObjectRenderingE2ETests* s
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_center = ctx->ItemRectCenter("canvas##child");
ctx->MouseMove(canvas_center);
ctx->MouseClick();
ctx->Yield();
// Select object
ctx->MouseClick();
ctx->Yield();
// Delete with Delete key
ctx->KeyPress(ImGuiKey_Delete);
ctx->Yield();
// Verify object removed
ctx->SetRef("Dungeon Editor/Room Objects");
ctx->ItemVerifyValue("Object Count", 0);
@@ -588,29 +601,30 @@ void RegisterObjectSelectionTests_DeleteObject(DungeonObjectRenderingE2ETests* s
* - Layer can be shown again
*/
void DungeonObjectRenderingE2ETests::RegisterLayerManagementTests() {
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering", "LayerManagement_ToggleVisibility");
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering",
"LayerManagement_ToggleVisibility");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
};
test->TestFunc = [](ImGuiTestContext* ctx) {
ctx->SetRef("Dungeon Editor");
// Open layer management panel
ctx->ItemClick("Layers##tab");
ctx->Yield();
// Toggle Layer 1 visibility
ctx->ItemClick("Layer 1 Visible##checkbox");
ctx->Yield();
// Verify checkbox state
ctx->ItemVerifyValue("Layer 1 Visible##checkbox", false);
// Toggle back on
ctx->ItemClick("Layer 1 Visible##checkbox");
ctx->Yield();
ctx->ItemVerifyValue("Layer 1 Visible##checkbox", true);
};
test->UserData = this;
@@ -624,51 +638,53 @@ void DungeonObjectRenderingE2ETests::RegisterLayerManagementTests() {
* - Objects placed on correct layer
* - Layer indicator shows current layer
*/
void RegisterLayerManagementTests_PlaceOnLayers(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "LayerManagement_PlaceOnLayers");
void RegisterLayerManagementTests_PlaceOnLayers(
DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"LayerManagement_PlaceOnLayers");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
};
test->TestFunc = [](ImGuiTestContext* ctx) {
ctx->SetRef("Dungeon Editor");
// Place object on Layer 0
ctx->ItemClick("Layers##tab");
ctx->ItemClick("Layer 0##radio");
ctx->Yield();
ctx->ItemClick("Object Selector##tab");
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_pos = ctx->ItemRectMin("canvas##child");
ctx->MouseMove(ImVec2(canvas_pos.x + 16, canvas_pos.y + 16));
ctx->MouseClick();
ctx->Yield();
// Verify object on Layer 0
ctx->SetRef("Dungeon Editor/Object Details");
ctx->ItemVerifyValue("Layer", 0);
// Switch to Layer 1 and place another object
ctx->SetRef("Dungeon Editor");
ctx->ItemClick("Layers##tab");
ctx->ItemClick("Layer 1##radio");
ctx->Yield();
ctx->ItemClick("Object Selector##tab");
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x20");
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ctx->MouseMove(ImVec2(canvas_pos.x + 48, canvas_pos.y + 48));
ctx->MouseClick();
ctx->Yield();
// Verify object on Layer 1
ctx->SetRef("Dungeon Editor/Object Details");
ctx->ItemVerifyValue("Layer", 1);
@@ -684,8 +700,10 @@ void RegisterLayerManagementTests_PlaceOnLayers(DungeonObjectRenderingE2ETests*
* - Overlapping objects render correctly
* - Visual inspection of layer order
*/
void RegisterLayerManagementTests_RenderingOrder(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "LayerManagement_RenderingOrder");
void RegisterLayerManagementTests_RenderingOrder(
DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"LayerManagement_RenderingOrder");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
@@ -693,28 +711,28 @@ void RegisterLayerManagementTests_RenderingOrder(DungeonObjectRenderingE2ETests*
test->TestFunc = [](ImGuiTestContext* ctx) {
// Place 3 objects at same position on different layers
ctx->SetRef("Dungeon Editor");
for (int layer = 0; layer < 3; layer++) {
ctx->ItemClick("Layers##tab");
ctx->ItemClick(ImGuiTestRef_Str("Layer %d##radio", layer));
ctx->Yield();
ctx->ItemClick("Object Selector##tab");
ctx->SetRef("AssetBrowser");
ctx->ItemClick(ImGuiTestRef_Str("Object_0x%02X", 0x10 + layer));
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_center = ctx->ItemRectCenter("canvas##child");
ctx->MouseMove(canvas_center);
ctx->MouseClick();
ctx->Yield();
}
// Verify all 3 objects exist
ctx->SetRef("Dungeon Editor/Room Objects");
ctx->ItemVerifyValue("Object Count", 3);
// Visual verification would be done with snapshot comparison
// Here we just verify the objects are in the right layers
ctx->ItemExists("Layer 0: 1 object");
@@ -737,7 +755,8 @@ void RegisterLayerManagementTests_RenderingOrder(DungeonObjectRenderingE2ETests*
* - No errors during save
*/
void DungeonObjectRenderingE2ETests::RegisterSaveWorkflowTests() {
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering", "SaveWorkflow_SaveRoom");
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering",
"SaveWorkflow_SaveRoom");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
@@ -749,19 +768,19 @@ void DungeonObjectRenderingE2ETests::RegisterSaveWorkflowTests() {
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_center = ctx->ItemRectCenter("canvas##child");
ctx->MouseMove(canvas_center);
ctx->MouseClick();
ctx->Yield();
// Save room
ctx->SetRef("Dungeon Editor");
ctx->ItemClick("File##menu");
ctx->ItemClick("Save Room##menuitem");
ctx->Yield();
// Verify save success message
ctx->ItemExists("Save successful");
};
@@ -777,7 +796,8 @@ void DungeonObjectRenderingE2ETests::RegisterSaveWorkflowTests() {
* - No data corruption
*/
void RegisterSaveWorkflowTests_RoundTrip(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "SaveWorkflow_RoundTrip");
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"SaveWorkflow_RoundTrip");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
@@ -789,30 +809,30 @@ void RegisterSaveWorkflowTests_RoundTrip(DungeonObjectRenderingE2ETests* self) {
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_pos = ctx->ItemRectMin("canvas##child");
ctx->MouseMove(ImVec2(canvas_pos.x + 64, canvas_pos.y + 96));
ctx->MouseClick();
ctx->Yield();
// Verify initial state
ctx->SetRef("Dungeon Editor/Object Details");
int initial_x = ctx->ItemGetValue<int>("X Position");
int initial_y = ctx->ItemGetValue<int>("Y Position");
int initial_id = ctx->ItemGetValue<int>("Object ID");
// Save room
ctx->SetRef("Dungeon Editor");
ctx->ItemClick("File##menu");
ctx->ItemClick("Save Room##menuitem");
ctx->Yield();
// Reload room
ctx->ItemClick("File##menu");
ctx->ItemClick("Reload Room##menuitem");
ctx->Yield();
// Verify object persisted with same properties
ctx->SetRef("Dungeon Editor/Object Details");
ctx->ItemVerifyValue("X Position", initial_x);
@@ -830,8 +850,10 @@ void RegisterSaveWorkflowTests_RoundTrip(DungeonObjectRenderingE2ETests* self) {
* - Encoding is correct for each type
* - All objects reload correctly
*/
void RegisterSaveWorkflowTests_MultipleTypes(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "SaveWorkflow_MultipleTypes");
void RegisterSaveWorkflowTests_MultipleTypes(
DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"SaveWorkflow_MultipleTypes");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
@@ -839,40 +861,40 @@ void RegisterSaveWorkflowTests_MultipleTypes(DungeonObjectRenderingE2ETests* sel
test->TestFunc = [](ImGuiTestContext* ctx) {
// Place one of each object type
const uint16_t object_ids[] = {
0x10, // Type1
0x125, // Type2
0xF99 // Type3 (chest)
0x10, // Type1
0x125, // Type2
0xF99 // Type3 (chest)
};
ctx->SetRef("Dungeon Editor");
for (int i = 0; i < 3; i++) {
ctx->ItemClick("Object Selector##tab");
ctx->SetRef("AssetBrowser");
ctx->ItemClick(ImGuiTestRef_Str("Object_0x%02X", object_ids[i]));
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_pos = ctx->ItemRectMin("canvas##child");
ctx->MouseMove(ImVec2(canvas_pos.x + (i * 32), canvas_pos.y + (i * 32)));
ctx->MouseClick();
ctx->Yield();
}
// Save and reload
ctx->SetRef("Dungeon Editor");
ctx->ItemClick("File##menu");
ctx->ItemClick("Save Room##menuitem");
ctx->Yield();
ctx->ItemClick("File##menu");
ctx->ItemClick("Reload Room##menuitem");
ctx->Yield();
// Verify all 3 objects reloaded
ctx->SetRef("Dungeon Editor/Room Objects");
ctx->ItemVerifyValue("Object Count", 3);
// Verify each object type
for (int i = 0; i < 3; i++) {
ctx->ItemExists(ImGuiTestRef_Str("Object ID: 0x%02X", object_ids[i]));
@@ -895,7 +917,8 @@ void RegisterSaveWorkflowTests_MultipleTypes(DungeonObjectRenderingE2ETests* sel
* - All render at correct positions
*/
void DungeonObjectRenderingE2ETests::RegisterRenderingQualityTests() {
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering", "RenderingQuality_AllTypes");
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering",
"RenderingQuality_AllTypes");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
@@ -903,28 +926,29 @@ void DungeonObjectRenderingE2ETests::RegisterRenderingQualityTests() {
test->TestFunc = [](ImGuiTestContext* ctx) {
// This would typically involve visual snapshot comparison
// For now, we verify objects are placed and rendered without errors
const uint16_t object_ids[] = {
0x10, 0x11, 0x20, // Type1 objects
0x100, 0x125, // Type2 objects
0xF99, 0xFB1 // Type3 objects
0x10, 0x11, 0x20, // Type1 objects
0x100, 0x125, // Type2 objects
0xF99, 0xFB1 // Type3 objects
};
ctx->SetRef("Dungeon Editor");
for (int i = 0; i < 7; i++) {
ctx->ItemClick("Object Selector##tab");
ctx->SetRef("AssetBrowser");
ctx->ItemClick(ImGuiTestRef_Str("Object_0x%02X", object_ids[i]));
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_pos = ctx->ItemRectMin("canvas##child");
ctx->MouseMove(ImVec2(canvas_pos.x + ((i % 4) * 48), canvas_pos.y + ((i / 4) * 48)));
ctx->MouseMove(
ImVec2(canvas_pos.x + ((i % 4) * 48), canvas_pos.y + ((i / 4) * 48)));
ctx->MouseClick();
ctx->Yield();
}
// Verify all objects rendered without errors
ctx->SetRef("Dungeon Editor/Room Objects");
ctx->ItemVerifyValue("Object Count", 7);
@@ -941,8 +965,10 @@ void DungeonObjectRenderingE2ETests::RegisterRenderingQualityTests() {
* - Objects render with correct colors
* - No palette-related rendering errors
*/
void RegisterRenderingQualityTests_Palettes(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "RenderingQuality_Palettes");
void RegisterRenderingQualityTests_Palettes(
DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"RenderingQuality_Palettes");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
@@ -954,22 +980,22 @@ void RegisterRenderingQualityTests_Palettes(DungeonObjectRenderingE2ETests* self
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_center = ctx->ItemRectCenter("canvas##child");
ctx->MouseMove(canvas_center);
ctx->MouseClick();
ctx->Yield();
// Switch palettes and verify rendering
const int palette_ids[] = {0, 1, 2, 3, 4, 5};
for (int palette : palette_ids) {
ctx->SetRef("Dungeon Editor");
ctx->ItemClick("Options##menu");
ctx->ItemInput("Palette##input", palette);
ctx->Yield();
// Verify no rendering errors
ctx->ItemVerifyNotExists("Rendering Error");
}
@@ -985,8 +1011,10 @@ void RegisterRenderingQualityTests_Palettes(DungeonObjectRenderingE2ETests* self
* - Performance is acceptable
* - No rendering artifacts
*/
void RegisterRenderingQualityTests_ComplexRoom(DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering", "RenderingQuality_ComplexRoom");
void RegisterRenderingQualityTests_ComplexRoom(
DungeonObjectRenderingE2ETests* self) {
ImGuiTest* test = IM_REGISTER_TEST(self->engine_, "DungeonObjectRendering",
"RenderingQuality_ComplexRoom");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
@@ -994,7 +1022,7 @@ void RegisterRenderingQualityTests_ComplexRoom(DungeonObjectRenderingE2ETests* s
test->TestFunc = [](ImGuiTestContext* ctx) {
// Place many objects to create complex room
ctx->SetRef("Dungeon Editor");
// Place wall perimeter (Type1 objects)
for (int x = 0; x < 16; x++) {
for (int side = 0; side < 2; side++) {
@@ -1002,16 +1030,17 @@ void RegisterRenderingQualityTests_ComplexRoom(DungeonObjectRenderingE2ETests* s
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_pos = ctx->ItemRectMin("canvas##child");
int y = side == 0 ? 0 : 10;
ctx->MouseMove(ImVec2(canvas_pos.x + (x * 16), canvas_pos.y + (y * 16)));
ctx->MouseMove(
ImVec2(canvas_pos.x + (x * 16), canvas_pos.y + (y * 16)));
ctx->MouseClick();
ctx->Yield();
}
}
// Add some decorative objects
const uint16_t decorative_objects[] = {0x20, 0x21, 0xF99};
for (int i = 0; i < 3; i++) {
@@ -1019,18 +1048,18 @@ void RegisterRenderingQualityTests_ComplexRoom(DungeonObjectRenderingE2ETests* s
ctx->SetRef("AssetBrowser");
ctx->ItemClick(ImGuiTestRef_Str("Object_0x%02X", decorative_objects[i]));
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_pos = ctx->ItemRectMin("canvas##child");
ctx->MouseMove(ImVec2(canvas_pos.x + (i * 64) + 32, canvas_pos.y + 80));
ctx->MouseClick();
ctx->Yield();
}
// Verify all objects rendered
ctx->SetRef("Dungeon Editor/Room Objects");
ctx->ItemVerifyValue("Object Count", 35); // 32 walls + 3 decorative
// Verify no performance issues (frame time < 16ms for 60fps)
ctx->SetRef("Dungeon Editor");
ctx->ItemVerifyLessThan("Frame Time (ms)", 16.0f);
@@ -1051,38 +1080,37 @@ void RegisterRenderingQualityTests_ComplexRoom(DungeonObjectRenderingE2ETests* s
* - Memory usage is reasonable
*/
void DungeonObjectRenderingE2ETests::RegisterPerformanceTests() {
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering", "Performance_LargeRoom");
ImGuiTest* test = IM_REGISTER_TEST(engine_, "DungeonObjectRendering",
"Performance_LargeRoom");
test->GuiFunc = [](ImGuiTestContext* ctx) {
auto* self = (DungeonObjectRenderingE2ETests*)ctx->UserData;
self->dungeon_editor_->Update();
};
test->TestFunc = [](ImGuiTestContext* ctx) {
ctx->SetRef("Dungeon Editor");
// Place 100 objects
for (int i = 0; i < 100; i++) {
ctx->ItemClick("Object Selector##tab");
ctx->SetRef("AssetBrowser");
ctx->ItemClick("Object_0x10");
ctx->Yield();
ctx->SetRef("Dungeon Editor/Canvas");
ImVec2 canvas_pos = ctx->ItemRectMin("canvas##child");
ctx->MouseMove(ImVec2(
canvas_pos.x + ((i % 16) * 16),
canvas_pos.y + ((i / 16) * 16)
));
ctx->MouseMove(ImVec2(canvas_pos.x + ((i % 16) * 16),
canvas_pos.y + ((i / 16) * 16)));
ctx->MouseClick();
ctx->Yield();
}
// Measure rendering performance
ctx->SetRef("Dungeon Editor");
float frame_time = ctx->ItemGetValue<float>("Frame Time (ms)");
// Verify acceptable performance (< 16ms for 60fps)
IM_CHECK_LT(frame_time, 16.0f);
// Verify object count
ctx->SetRef("Dungeon Editor/Room Objects");
ctx->ItemVerifyValue("Object Count", 100);
@@ -1102,7 +1130,7 @@ void DungeonObjectRenderingE2ETests::RegisterAllTests() {
RegisterSaveWorkflowTests();
RegisterRenderingQualityTests();
RegisterPerformanceTests();
// Register additional helper tests
RegisterObjectBrowserTests_SelectObject(this);
RegisterObjectBrowserTests_SearchFilter(this);
@@ -1127,13 +1155,12 @@ TEST_F(DungeonObjectRenderingE2ETests, RunAllTests) {
// Run all registered tests
ImGuiTestEngine_QueueTests(engine_, ImGuiTestGroup_Tests, nullptr, nullptr);
ImGuiTestEngine_Run(engine_);
// Verify all tests passed
ImGuiTestEngineIO& test_io = ImGuiTestEngine_GetIO(engine_);
EXPECT_EQ(test_io.TestsFailedCount, 0)
<< "Some E2E tests failed. Check test engine output for details.";
EXPECT_EQ(test_io.TestsFailedCount, 0)
<< "Some E2E tests failed. Check test engine output for details.";
}
} // namespace test
} // namespace yaze