1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
|
#include <gtest/gtest.h>
#include "../src/platform/platform_factory.h"
#include "../src/layouts/smart_placement.h"
#include "../src/config/lua_manager.h"
#include "../src/core/window_manager.h"
#include <memory>
class CrossPlatformIntegrationTest : public ::testing::Test {
protected:
void SetUp() override {
// Initialize platform
platform = PlatformFactory::create_platform();
EXPECT_NE(platform, nullptr);
// Initialize Lua manager
lua_manager = std::make_unique<LuaManager>();
EXPECT_TRUE(lua_manager->initialize());
// Initialize window manager
window_manager = std::make_unique<WindowManager>();
EXPECT_TRUE(window_manager->initialize());
}
void TearDown() override {
if (window_manager) {
window_manager->shutdown();
}
if (lua_manager) {
lua_manager->shutdown();
}
if (platform) {
platform->shutdown();
}
}
std::unique_ptr<Platform> platform;
std::unique_ptr<LuaManager> lua_manager;
std::unique_ptr<WindowManager> window_manager;
};
TEST_F(CrossPlatformIntegrationTest, PlatformDetection) {
auto detected_platform = PlatformFactory::detect_platform();
// Should detect one of the supported platforms
EXPECT_TRUE(detected_platform == PlatformType::Linux_X11 ||
detected_platform == PlatformType::Linux_Wayland ||
detected_platform == PlatformType::Windows ||
detected_platform == PlatformType::macOS);
// Platform name should match detection
std::string platform_name = platform->get_platform_name();
EXPECT_FALSE(platform_name.empty());
}
TEST_F(CrossPlatformIntegrationTest, WindowLifecycle) {
// Create window through platform
auto window = platform->create_window("Integration Test Window", 100, 100, 400, 300);
EXPECT_NE(window, nullptr);
if (window) {
// Test window properties
EXPECT_EQ(window->getTitle(), "Integration Test Window");
EXPECT_EQ(window->getX(), 100);
EXPECT_EQ(window->getY(), 100);
EXPECT_EQ(window->getWidth(), 400);
EXPECT_EQ(window->getHeight(), 300);
// Test window management
platform->set_window_position(window.get(), 200, 200);
platform->set_window_size(window.get(), 500, 400);
platform->focus_window(window.get());
// Test decoration controls
platform->set_window_decorations(window.get(), true);
EXPECT_TRUE(platform->get_window_decorations(window.get()));
platform->set_window_border_color(window.get(), 255, 0, 0);
platform->set_window_border_width(window.get(), 5);
// Clean up
platform->destroy_window(window.get());
}
}
TEST_F(CrossPlatformIntegrationTest, SmartPlacementIntegration) {
// Get monitor information
auto monitors = platform->get_monitors();
EXPECT_FALSE(monitors.empty());
Monitor monitor = monitors[0];
// Create test windows
std::vector<std::unique_ptr<Window>> existing_windows;
for (int i = 0; i < 3; ++i) {
auto window = platform->create_window(
"Test Window " + std::to_string(i),
100 + i * 50, 100 + i * 50,
400, 300
);
EXPECT_NE(window, nullptr);
existing_windows.push_back(std::move(window));
}
// Test smart placement
auto new_window = platform->create_window("Smart Placement Test", 0, 0, 400, 300);
EXPECT_NE(new_window, nullptr);
if (new_window) {
// Test grid placement
auto grid_result = SmartPlacement::place_in_grid(new_window.get(), monitor, existing_windows);
EXPECT_TRUE(grid_result.success);
// Test cascade placement
auto cascade_result = SmartPlacement::cascade_place(new_window.get(), monitor, existing_windows);
EXPECT_TRUE(cascade_result.success);
// Test smart tile
auto smart_result = SmartPlacement::smart_tile(new_window.get(), monitor, existing_windows);
EXPECT_TRUE(smart_result.success);
platform->destroy_window(new_window.get());
}
// Clean up existing windows
for (auto& window : existing_windows) {
platform->destroy_window(window.get());
}
}
TEST_F(CrossPlatformIntegrationTest, LuaConfigurationIntegration) {
// Test Lua configuration with platform integration
std::string config = R"(
-- Platform detection
local platform = srd.get_platform()
srd.set("detected_platform", platform)
-- Platform-specific settings
if platform == "x11" then
srd.set("border_width", 3)
srd.set("decorations_enabled", true)
elseif platform == "wayland" then
srd.set("border_width", 2)
srd.set("decorations_enabled", true)
elseif platform == "windows" then
srd.set("border_width", 2)
srd.set("decorations_enabled", true)
elseif platform == "macos" then
srd.set("border_width", 1)
srd.set("decorations_enabled", false)
end
-- Window decoration controls
srd.window.set_decorations("test_window", true)
srd.window.set_border_color("test_window", 255, 0, 0)
srd.window.set_border_width("test_window", 5)
-- Window state controls
srd.window.set_floating("test_window", true)
srd.window.toggle_floating("test_window")
)";
EXPECT_TRUE(lua_manager->load_config_string(config));
// Verify platform detection
std::string detected_platform = lua_manager->get_string("detected_platform", "");
EXPECT_FALSE(detected_platform.empty());
EXPECT_TRUE(detected_platform == "x11" ||
detected_platform == "wayland" ||
detected_platform == "windows" ||
detected_platform == "macos");
}
TEST_F(CrossPlatformIntegrationTest, EventSystemIntegration) {
// Test event polling
std::vector<Event> events;
bool result = platform->poll_events(events);
// Should not crash, even if no events are available
EXPECT_TRUE(result || events.empty());
// Test event processing
if (!events.empty()) {
for (const auto& event : events) {
// Process events through window manager
window_manager->process_event(event);
}
}
}
TEST_F(CrossPlatformIntegrationTest, MonitorIntegration) {
// Test monitor detection
auto monitors = platform->get_monitors();
EXPECT_FALSE(monitors.empty());
for (const auto& monitor : monitors) {
EXPECT_GT(monitor.id, 0);
EXPECT_FALSE(monitor.name.empty());
EXPECT_GT(monitor.width, 0);
EXPECT_GT(monitor.height, 0);
EXPECT_GT(monitor.refresh_rate, 0);
// Test smart placement with monitor
auto window = platform->create_window("Monitor Test", 0, 0, 400, 300);
EXPECT_NE(window, nullptr);
if (window) {
std::vector<std::unique_ptr<Window>> empty_windows;
auto result = SmartPlacement::place_in_grid(window.get(), monitor, empty_windows);
EXPECT_TRUE(result.success);
platform->destroy_window(window.get());
}
}
}
TEST_F(CrossPlatformIntegrationTest, InputHandlingIntegration) {
// Test input grabbing
platform->grab_keyboard();
platform->grab_pointer();
// Test input release
platform->ungrab_keyboard();
platform->ungrab_pointer();
}
TEST_F(CrossPlatformIntegrationTest, ConfigurationReloading) {
// Test configuration reloading with platform integration
std::string initial_config = R"(
srd.set("test.value", "initial")
srd.set("test.platform", srd.get_platform())
)";
EXPECT_TRUE(lua_manager->load_config_string(initial_config));
EXPECT_EQ(lua_manager->get_string("test.value", ""), "initial");
// Reload configuration
EXPECT_TRUE(lua_manager->reload_config());
// Should be reset to default
EXPECT_EQ(lua_manager->get_string("test.value", "default"), "default");
}
TEST_F(CrossPlatformIntegrationTest, ErrorHandling) {
// Test error handling with invalid inputs
Window* invalid_window = nullptr;
// These should not crash
platform->set_window_decorations(invalid_window, true);
platform->set_window_border_color(invalid_window, 255, 0, 0);
platform->set_window_border_width(invalid_window, 5);
platform->get_window_decorations(invalid_window);
// Test invalid Lua configuration
std::string invalid_config = "invalid lua code {";
EXPECT_FALSE(lua_manager->load_config_string(invalid_config));
// Should have errors
auto errors = lua_manager->get_errors();
EXPECT_FALSE(errors.empty());
}
TEST_F(CrossPlatformIntegrationTest, PerformanceTest) {
// Test performance with multiple windows and operations
std::vector<std::unique_ptr<Window>> windows;
// Create multiple windows
for (int i = 0; i < 10; ++i) {
auto window = platform->create_window(
"Performance Test " + std::to_string(i),
100 + i * 10, 100 + i * 10,
400, 300
);
EXPECT_NE(window, nullptr);
windows.push_back(std::move(window));
}
// Perform operations on all windows
for (auto& window : windows) {
platform->set_window_position(window.get(), 200, 200);
platform->set_window_size(window.get(), 500, 400);
platform->set_window_decorations(window.get(), true);
platform->set_window_border_color(window.get(), 255, 0, 0);
platform->set_window_border_width(window.get(), 5);
}
// Clean up
for (auto& window : windows) {
platform->destroy_window(window.get());
}
}
TEST_F(CrossPlatformIntegrationTest, ShutdownSequence) {
// Test proper shutdown sequence
EXPECT_TRUE(window_manager->shutdown());
EXPECT_TRUE(lua_manager->shutdown());
platform->shutdown();
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
|