aboutsummaryrefslogtreecommitdiff
path: root/tests/test_cross_platform_integration.cc
blob: 8e9ee72f37528e1411d4bab6b59eb630c8fcc0b7 (plain)
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();
}