80 lines
3.0 KiB
C++
80 lines
3.0 KiB
C++
#define IMGUI_DEFINE_MATH_OPERATORS
|
|
#include "e2e/canvas_selection_test.h"
|
|
|
|
#include "app/controller.h"
|
|
#include "test_utils.h"
|
|
|
|
void E2ETest_CanvasSelectionTest(ImGuiTestContext* ctx) {
|
|
yaze::test::gui::LoadRomInTest(ctx, "zelda3.sfc");
|
|
yaze::Controller* controller = (yaze::Controller*)ctx->Test->UserData;
|
|
yaze::zelda3::Overworld* overworld = controller->overworld();
|
|
|
|
// 1. Open the Overworld Editor
|
|
yaze::test::gui::OpenEditorInTest(ctx, "Overworld Editor");
|
|
|
|
// 2. Find the canvas
|
|
ctx->WindowFocus("Overworld Editor");
|
|
ctx->ItemClick("##Canvas");
|
|
|
|
// 3. Get the original tile data
|
|
// We'll check the 2x2 tile area at the paste location (600, 300)
|
|
// The tile at (600, 300) is at (75, 37) in tile coordinates.
|
|
// The overworld map is 128x128 tiles.
|
|
uint16_t orig_tile1 = overworld->GetTile(75, 37);
|
|
uint16_t orig_tile2 = overworld->GetTile(76, 37);
|
|
uint16_t orig_tile3 = overworld->GetTile(75, 38);
|
|
uint16_t orig_tile4 = overworld->GetTile(76, 38);
|
|
|
|
// 4. Perform a rectangle selection that crosses a 512px boundary
|
|
// The canvas is 1024x1024, with the top-left at (0,0).
|
|
// We'll select a 2x2 tile area from (510, 256) to (514, 258).
|
|
// This will cross the 512px boundary.
|
|
ctx->MouseMoveToPos(ImVec2(510, 256));
|
|
ctx->MouseDown(0);
|
|
ctx->MouseMoveToPos(ImVec2(514, 258));
|
|
ctx->MouseUp(0);
|
|
|
|
// 5. Copy the selection
|
|
ctx->KeyDown(ImGuiKey_LeftCtrl);
|
|
ctx->KeyPress(ImGuiKey_C);
|
|
ctx->KeyUp(ImGuiKey_LeftCtrl);
|
|
|
|
// 6. Paste the selection
|
|
ctx->MouseMoveToPos(ImVec2(600, 300));
|
|
ctx->KeyDown(ImGuiKey_LeftCtrl);
|
|
ctx->KeyPress(ImGuiKey_V);
|
|
ctx->KeyUp(ImGuiKey_LeftCtrl);
|
|
|
|
// 7. Verify that the pasted tiles are correct
|
|
uint16_t new_tile1 = overworld->GetTile(75, 37);
|
|
uint16_t new_tile2 = overworld->GetTile(76, 37);
|
|
uint16_t new_tile3 = overworld->GetTile(75, 38);
|
|
uint16_t new_tile4 = overworld->GetTile(76, 38);
|
|
|
|
// The bug is that the selection wraps around, so the pasted tiles are
|
|
// incorrect. We expect the new tiles to be different from the original tiles.
|
|
IM_CHECK_NE(orig_tile1, new_tile1);
|
|
IM_CHECK_NE(orig_tile2, new_tile2);
|
|
IM_CHECK_NE(orig_tile3, new_tile3);
|
|
IM_CHECK_NE(orig_tile4, new_tile4);
|
|
|
|
// We also expect the pasted tiles to be the same as the selected tiles.
|
|
// The selected tiles are at (63, 32) and (64, 32), (63, 33) and (64, 33).
|
|
uint16_t selected_tile1 = overworld->GetTile(63, 32);
|
|
uint16_t selected_tile2 = overworld->GetTile(64, 32);
|
|
uint16_t selected_tile3 = overworld->GetTile(63, 33);
|
|
uint16_t selected_tile4 = overworld->GetTile(64, 33);
|
|
|
|
IM_CHECK_EQ(new_tile1, selected_tile1);
|
|
IM_CHECK_EQ(new_tile2, selected_tile2);
|
|
IM_CHECK_EQ(new_tile3, selected_tile3);
|
|
IM_CHECK_EQ(new_tile4, selected_tile4);
|
|
|
|
ctx->LogInfo("Original tiles: %d, %d, %d, %d", orig_tile1, orig_tile2,
|
|
orig_tile3, orig_tile4);
|
|
ctx->LogInfo("Selected tiles: %d, %d, %d, %d", selected_tile1, selected_tile2,
|
|
selected_tile3, selected_tile4);
|
|
ctx->LogInfo("New tiles: %d, %d, %d, %d", new_tile1, new_tile2, new_tile3,
|
|
new_tile4);
|
|
}
|