concinnity_core/
window_policy.rs1use core::sync::atomic::{AtomicBool, Ordering};
14
15static FORBIDDEN: AtomicBool = AtomicBool::new(false);
16
17pub fn forbid_windows() {
22 FORBIDDEN.store(true, Ordering::SeqCst);
23}
24
25pub fn allow_windows() {
27 FORBIDDEN.store(false, Ordering::SeqCst);
28}
29
30pub fn windows_forbidden() -> bool {
32 FORBIDDEN.load(Ordering::SeqCst)
33}
34
35pub fn assert_windows_allowed(backend: &str) {
40 assert!(
41 !windows_forbidden(),
42 "{backend} tried to open a window in a process that forbids them; \
43 run the world on the headless loop instead"
44 );
45}
46
47#[cfg(test)]
48mod tests {
49 use alloc::string::String;
50
51 use super::*;
52
53 static LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
56
57 #[test]
58 fn the_default_permits_a_window() {
59 let _guard = LOCK.lock().unwrap_or_else(|e| e.into_inner());
60 allow_windows();
61 assert!(!windows_forbidden());
62 assert_windows_allowed("a backend");
63 }
64
65 #[test]
66 fn a_forbidden_process_panics_naming_the_backend() {
67 let _guard = LOCK.lock().unwrap_or_else(|e| e.into_inner());
68 forbid_windows();
69 assert!(windows_forbidden());
70
71 let panicked = std::panic::catch_unwind(|| assert_windows_allowed("TestBackend"));
72 allow_windows();
73
74 let payload = panicked.expect_err("a forbidden window creation panics");
75 let msg = payload
76 .downcast_ref::<String>()
77 .expect("the panic carries its message");
78 assert!(msg.contains("TestBackend"), "{msg}");
79 assert!(msg.contains("headless"), "{msg}");
80 }
81}