Skip to main content

goud_engine/core/providers/impls/
null_window.rs

1//! Null window provider -- silent no-op for headless testing.
2
3use crate::core::error::GoudResult;
4use crate::core::providers::window::WindowProvider;
5
6/// A window provider that does nothing. Used for headless testing and as
7/// a default when no windowing system is available.
8pub struct NullWindowProvider {
9    should_close: bool,
10}
11
12impl NullWindowProvider {
13    /// Create a new null window provider.
14    pub fn new() -> Self {
15        Self {
16            should_close: false,
17        }
18    }
19}
20
21impl Default for NullWindowProvider {
22    fn default() -> Self {
23        Self::new()
24    }
25}
26
27impl WindowProvider for NullWindowProvider {
28    fn name(&self) -> &str {
29        "null"
30    }
31
32    fn init(&mut self) -> GoudResult<()> {
33        Ok(())
34    }
35
36    fn shutdown(&mut self) {}
37
38    fn should_close(&self) -> bool {
39        self.should_close
40    }
41
42    fn set_should_close(&mut self, value: bool) {
43        self.should_close = value;
44    }
45
46    fn poll_events(&mut self) {}
47
48    fn swap_buffers(&mut self) {}
49
50    fn get_size(&self) -> (u32, u32) {
51        (0, 0)
52    }
53
54    fn get_framebuffer_size(&self) -> (u32, u32) {
55        (0, 0)
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62
63    #[test]
64    fn test_null_window_construction() {
65        let provider = NullWindowProvider::new();
66        assert_eq!(provider.name(), "null");
67    }
68
69    #[test]
70    fn test_null_window_default() {
71        let provider = NullWindowProvider::default();
72        assert_eq!(provider.name(), "null");
73    }
74
75    #[test]
76    fn test_null_window_init_shutdown() {
77        let mut provider = NullWindowProvider::new();
78        assert!(provider.init().is_ok());
79        provider.shutdown();
80    }
81
82    #[test]
83    fn test_null_window_should_close() {
84        let mut provider = NullWindowProvider::new();
85        assert!(!provider.should_close());
86        provider.set_should_close(true);
87        assert!(provider.should_close());
88    }
89
90    #[test]
91    fn test_null_window_size() {
92        let provider = NullWindowProvider::new();
93        assert_eq!(provider.get_size(), (0, 0));
94        assert_eq!(provider.get_framebuffer_size(), (0, 0));
95    }
96
97    #[test]
98    fn test_null_window_poll_and_swap() {
99        let mut provider = NullWindowProvider::new();
100        provider.poll_events();
101        provider.swap_buffers();
102        // Verify that no-op operations don't change state
103        assert!(!provider.should_close());
104    }
105}