yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
tile_selector_widget_test.cc
Go to the documentation of this file.
2
3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
5
6#include "app/gfx/bitmap.h"
7#include "app/gui/canvas.h"
8#include "testing.h"
9
10namespace yaze {
11namespace test {
12
13using ::testing::Eq;
14using ::testing::NotNull;
15
16class TileSelectorWidgetTest : public ::testing::Test {
17 protected:
18 void SetUp() override {
19 // Create a test canvas
20 canvas_ = std::make_unique<gui::Canvas>("TestCanvas", ImVec2(512, 512),
22
23 // Create a test config
24 config_.tile_size = 16;
27 config_.total_tiles = 64; // 8x8 grid
28 config_.draw_offset = {2.0f, 0.0f};
29 config_.show_tile_ids = false;
30 config_.highlight_color = {1.0f, 0.85f, 0.35f, 1.0f};
31 }
32
33 std::unique_ptr<gui::Canvas> canvas_;
35};
36
37// Test basic construction
39 gui::TileSelectorWidget widget("test_widget");
40 EXPECT_EQ(widget.GetSelectedTileID(), 0);
41}
42
43// Test construction with config
44TEST_F(TileSelectorWidgetTest, ConstructionWithConfig) {
45 gui::TileSelectorWidget widget("test_widget", config_);
46 EXPECT_EQ(widget.GetSelectedTileID(), 0);
47}
48
49// Test canvas attachment
51 gui::TileSelectorWidget widget("test_widget");
52 widget.AttachCanvas(canvas_.get());
53 // No crash means success
54}
55
56// Test tile count setting
58 gui::TileSelectorWidget widget("test_widget", config_);
59 widget.SetTileCount(128);
60 // Verify selection is clamped when tile count changes
61 widget.SetSelectedTile(100);
62 EXPECT_EQ(widget.GetSelectedTileID(), 100);
63
64 // Setting tile count lower should clamp selection
65 widget.SetTileCount(50);
66 EXPECT_EQ(widget.GetSelectedTileID(), 0); // Should reset to 0
67}
68
69// Test selected tile setting
70TEST_F(TileSelectorWidgetTest, SetSelectedTile) {
71 gui::TileSelectorWidget widget("test_widget", config_);
72 widget.SetTileCount(64);
73
74 widget.SetSelectedTile(10);
75 EXPECT_EQ(widget.GetSelectedTileID(), 10);
76
77 widget.SetSelectedTile(63);
78 EXPECT_EQ(widget.GetSelectedTileID(), 63);
79
80 // Out of bounds should be ignored
81 widget.SetSelectedTile(64);
82 EXPECT_EQ(widget.GetSelectedTileID(), 63); // Should remain unchanged
83
84 widget.SetSelectedTile(-1);
85 EXPECT_EQ(widget.GetSelectedTileID(), 63); // Should remain unchanged
86}
87
88// Test tile origin calculation
90 gui::TileSelectorWidget widget("test_widget", config_);
91 widget.SetTileCount(64);
92
93 // Test first tile (0,0)
94 auto origin = widget.TileOrigin(0);
95 EXPECT_FLOAT_EQ(origin.x, config_.draw_offset.x);
96 EXPECT_FLOAT_EQ(origin.y, config_.draw_offset.y);
97
98 // Test tile at (1,0)
99 origin = widget.TileOrigin(1);
100 float expected_x = config_.draw_offset.x +
101 (config_.tile_size * config_.display_scale);
102 EXPECT_FLOAT_EQ(origin.x, expected_x);
103 EXPECT_FLOAT_EQ(origin.y, config_.draw_offset.y);
104
105 // Test tile at (0,1) - first tile of second row
106 origin = widget.TileOrigin(8);
107 expected_x = config_.draw_offset.x;
108 float expected_y = config_.draw_offset.y +
109 (config_.tile_size * config_.display_scale);
110 EXPECT_FLOAT_EQ(origin.x, expected_x);
111 EXPECT_FLOAT_EQ(origin.y, expected_y);
112
113 // Test invalid tile ID
114 origin = widget.TileOrigin(64);
115 EXPECT_FLOAT_EQ(origin.x, -1.0f);
116 EXPECT_FLOAT_EQ(origin.y, -1.0f);
117}
118
119// Test render without atlas (should not crash)
120TEST_F(TileSelectorWidgetTest, RenderWithoutAtlas) {
121 gui::TileSelectorWidget widget("test_widget", config_);
122 widget.AttachCanvas(canvas_.get());
123
124 gfx::Bitmap atlas;
125 auto result = widget.Render(atlas, false);
126
127 EXPECT_FALSE(result.tile_clicked);
128 EXPECT_FALSE(result.tile_double_clicked);
129 EXPECT_FALSE(result.selection_changed);
130 EXPECT_EQ(result.selected_tile, -1);
131}
132
133// Test programmatic selection for AI/automation
134TEST_F(TileSelectorWidgetTest, ProgrammaticSelection) {
135 gui::TileSelectorWidget widget("test_widget", config_);
136 widget.AttachCanvas(canvas_.get());
137 widget.SetTileCount(64);
138
139 // Simulate AI/automation selecting tiles programmatically
140 for (int i = 0; i < 64; ++i) {
141 widget.SetSelectedTile(i);
142 EXPECT_EQ(widget.GetSelectedTileID(), i);
143
144 auto origin = widget.TileOrigin(i);
145 int expected_col = i % config_.tiles_per_row;
146 int expected_row = i / config_.tiles_per_row;
147 float expected_x = config_.draw_offset.x +
148 expected_col * config_.tile_size * config_.display_scale;
149 float expected_y = config_.draw_offset.y +
150 expected_row * config_.tile_size * config_.display_scale;
151
152 EXPECT_FLOAT_EQ(origin.x, expected_x);
153 EXPECT_FLOAT_EQ(origin.y, expected_y);
154 }
155}
156
157// Test scroll to tile
159 gui::TileSelectorWidget widget("test_widget", config_);
160 widget.AttachCanvas(canvas_.get());
161 widget.SetTileCount(64);
162
163 // Scroll to various tiles (should not crash)
164 widget.ScrollToTile(0);
165 widget.ScrollToTile(10);
166 widget.ScrollToTile(63);
167
168 // Invalid tile should not crash
169 widget.ScrollToTile(-1);
170 widget.ScrollToTile(64);
171}
172
173// Test different configs
174TEST_F(TileSelectorWidgetTest, DifferentConfigs) {
175 // Test with 16x16 grid
177 large_config.tile_size = 8;
178 large_config.display_scale = 1.0f;
179 large_config.tiles_per_row = 16;
180 large_config.total_tiles = 256;
181 large_config.draw_offset = {0.0f, 0.0f};
182
183 gui::TileSelectorWidget large_widget("large_widget", large_config);
184 large_widget.SetTileCount(256);
185
186 for (int i = 0; i < 256; ++i) {
187 large_widget.SetSelectedTile(i);
188 EXPECT_EQ(large_widget.GetSelectedTileID(), i);
189 }
190}
191
192} // namespace test
193} // namespace yaze
194
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:66
Reusable tile selector built on top of Canvas.
RenderResult Render(gfx::Bitmap &atlas, bool atlas_ready)
ImVec2 TileOrigin(int tile_id) const
void ScrollToTile(int tile_id, bool use_imgui_scroll=true)
gui::TileSelectorWidget::Config config_
TEST_F(DungeonObjectRenderingE2ETests, RunAllTests)
Main namespace for the application.