Skip to main content

goud_engine/core/
event.rs

1//! Event system for decoupled communication between engine systems.
2//!
3//! Events enable systems to communicate without direct dependencies. The event
4//! system uses a double-buffered queue pattern where events are written during
5//! one frame and read during the next.
6//!
7//! # Design
8//!
9//! The event system consists of:
10//! - [`Event`]: Marker trait for types that can be sent as events
11//! - [`EventQueue<E>`]: Double-buffered storage for events of type E
12//! - [`EventReader<E>`]: Read-only accessor for consuming events
13//! - [`EventWriter<E>`]: Write-only accessor for sending events
14//! - [`Events<E>`]: ECS resource wrapper that manages the full event lifecycle
15//!
16//! # Usage
17//!
18//! Any type that is `Send + Sync + 'static` automatically implements `Event`:
19//!
20//! ```rust
21//! use goud_engine::core::event::Event;
22//!
23//! // Custom event types
24//! #[derive(Debug, Clone)]
25//! struct PlayerDied {
26//!     player_id: u32,
27//!     cause: String,
28//! }
29//!
30//! // PlayerDied automatically implements Event
31//! fn send_event<E: Event>(event: E) {
32//!     // ...
33//! }
34//!
35//! let event = PlayerDied {
36//!     player_id: 1,
37//!     cause: "fell into lava".to_string(),
38//! };
39//! send_event(event);
40//! ```
41//!
42//! # Thread Safety
43//!
44//! Events must be `Send + Sync` to support parallel system execution. The
45//! `'static` bound ensures events don't contain borrowed data, which would
46//! complicate lifetime management across frame boundaries.
47
48/// Marker trait for types that can be sent through the event system.
49///
50/// This trait is automatically implemented for any type that satisfies
51/// `Send + Sync + 'static`. These bounds ensure:
52///
53/// - `Send`: Events can be transferred between threads
54/// - `Sync`: Event references can be shared between threads
55/// - `'static`: Events don't contain borrowed data
56///
57/// # Blanket Implementation
58///
59/// You don't need to manually implement this trait. Any type meeting the
60/// bounds automatically qualifies:
61///
62/// ```rust
63/// use goud_engine::core::event::Event;
64///
65/// struct MyEvent {
66///     data: i32,
67/// }
68///
69/// // This compiles because MyEvent is Send + Sync + 'static
70/// fn accepts_event<E: Event>(_: E) {}
71/// accepts_event(MyEvent { data: 42 });
72/// ```
73///
74/// # Non-Qualifying Types
75///
76/// Types with non-static lifetimes or non-thread-safe internals won't
77/// implement Event:
78///
79/// ```compile_fail
80/// use std::rc::Rc;
81/// use goud_engine::core::event::Event;
82///
83/// struct BadEvent {
84///     data: Rc<i32>, // Rc is not Send
85/// }
86///
87/// fn accepts_event<E: Event>(_: E) {}
88/// accepts_event(BadEvent { data: Rc::new(42) }); // Won't compile
89/// ```
90pub trait Event: Send + Sync + 'static {}
91
92/// Blanket implementation of Event for all qualifying types.
93///
94/// This ensures any `Send + Sync + 'static` type can be used as an event
95/// without explicit implementation.
96impl<T: Send + Sync + 'static> Event for T {}
97
98/// Double-buffered event queue for storing events of a single type.
99///
100/// EventQueue uses a double-buffer pattern where events are written to the
101/// active buffer and read from the inactive buffer. At the end of each frame,
102/// `swap_buffers` is called to switch which buffer is active.
103///
104/// # Double-Buffer Pattern
105///
106/// ```text
107/// Frame N:
108///   - Systems write new events to Buffer A (active write buffer)
109///   - Systems read events from Buffer B (read buffer from Frame N-1)
110///
111/// End of Frame N: swap_buffers()
112///
113/// Frame N+1:
114///   - Systems write new events to Buffer B (now active write buffer)
115///   - Systems read events from Buffer A (read buffer from Frame N)
116/// ```
117///
118/// This pattern ensures:
119/// - Writers and readers never access the same buffer simultaneously
120/// - Events persist for exactly one frame after being written
121/// - No locking required within a single-threaded frame
122///
123/// # Example
124///
125/// ```rust
126/// use goud_engine::core::event::EventQueue;
127///
128/// #[derive(Debug, Clone, PartialEq)]
129/// struct DamageEvent { amount: u32 }
130///
131/// let mut queue: EventQueue<DamageEvent> = EventQueue::new();
132///
133/// // Write to active buffer
134/// queue.send(DamageEvent { amount: 10 });
135/// queue.send(DamageEvent { amount: 25 });
136///
137/// // Read buffer is empty (events are in write buffer)
138/// assert!(queue.drain().collect::<Vec<_>>().is_empty());
139///
140/// // Swap buffers at frame boundary
141/// queue.swap_buffers();
142///
143/// // Now we can read the events
144/// let events: Vec<_> = queue.drain().collect();
145/// assert_eq!(events.len(), 2);
146/// assert_eq!(events[0].amount, 10);
147/// assert_eq!(events[1].amount, 25);
148/// ```
149pub struct EventQueue<E: Event> {
150    /// First buffer for events
151    events_a: Vec<E>,
152    /// Second buffer for events
153    events_b: Vec<E>,
154    /// Which buffer is currently the write buffer.
155    /// - false: Buffer A is write, Buffer B is read
156    /// - true: Buffer B is write, Buffer A is read
157    active_buffer: bool,
158}
159
160impl<E: Event> EventQueue<E> {
161    /// Creates a new empty EventQueue.
162    ///
163    /// Both buffers start empty, and Buffer A is the initial write buffer.
164    ///
165    /// # Example
166    ///
167    /// ```rust
168    /// use goud_engine::core::event::EventQueue;
169    ///
170    /// struct MyEvent { data: i32 }
171    /// let queue: EventQueue<MyEvent> = EventQueue::new();
172    /// assert!(queue.is_empty());
173    /// ```
174    #[must_use]
175    pub fn new() -> Self {
176        Self {
177            events_a: Vec::new(),
178            events_b: Vec::new(),
179            active_buffer: false,
180        }
181    }
182
183    /// Sends an event to the write buffer.
184    ///
185    /// The event will be available for reading after the next `swap_buffers` call.
186    ///
187    /// # Example
188    ///
189    /// ```rust
190    /// use goud_engine::core::event::EventQueue;
191    ///
192    /// struct ScoreEvent { points: i32 }
193    /// let mut queue: EventQueue<ScoreEvent> = EventQueue::new();
194    ///
195    /// queue.send(ScoreEvent { points: 100 });
196    /// queue.send(ScoreEvent { points: 50 });
197    ///
198    /// assert_eq!(queue.len(), 2);
199    /// ```
200    pub fn send(&mut self, event: E) {
201        self.write_buffer_mut().push(event);
202    }
203
204    /// Drains all events from the read buffer, returning an iterator.
205    ///
206    /// After draining, the read buffer will be empty. This is the primary
207    /// way to consume events during a frame.
208    ///
209    /// # Example
210    ///
211    /// ```rust
212    /// use goud_engine::core::event::EventQueue;
213    ///
214    /// #[derive(Debug)]
215    /// struct Event { id: u32 }
216    ///
217    /// let mut queue: EventQueue<Event> = EventQueue::new();
218    /// queue.send(Event { id: 1 });
219    /// queue.send(Event { id: 2 });
220    /// queue.swap_buffers();
221    ///
222    /// for event in queue.drain() {
223    ///     println!("Processing event: {:?}", event);
224    /// }
225    /// ```
226    pub fn drain(&mut self) -> impl Iterator<Item = E> + '_ {
227        self.read_buffer_mut().drain(..)
228    }
229
230    /// Swaps the active and read buffers.
231    ///
232    /// This should be called exactly once per frame, typically at the frame
233    /// boundary. After swapping:
234    /// - The old write buffer becomes the new read buffer
235    /// - The old read buffer (now cleared) becomes the new write buffer
236    ///
237    /// # Example
238    ///
239    /// ```rust
240    /// use goud_engine::core::event::EventQueue;
241    ///
242    /// struct FrameEvent;
243    /// let mut queue: EventQueue<FrameEvent> = EventQueue::new();
244    ///
245    /// // Frame 1: send events
246    /// queue.send(FrameEvent);
247    ///
248    /// // End of Frame 1
249    /// queue.swap_buffers();
250    ///
251    /// // Frame 2: events from Frame 1 are now readable
252    /// let count = queue.drain().count();
253    /// assert_eq!(count, 1);
254    /// ```
255    pub fn swap_buffers(&mut self) {
256        // Clear the read buffer before it becomes the write buffer
257        self.read_buffer_mut().clear();
258        // Swap which buffer is active
259        self.active_buffer = !self.active_buffer;
260    }
261
262    /// Clears both buffers, removing all events.
263    ///
264    /// This is useful for resetting the event system, such as when
265    /// transitioning between game states.
266    ///
267    /// # Example
268    ///
269    /// ```rust
270    /// use goud_engine::core::event::EventQueue;
271    ///
272    /// struct Event;
273    /// let mut queue: EventQueue<Event> = EventQueue::new();
274    ///
275    /// queue.send(Event);
276    /// queue.swap_buffers();
277    /// queue.send(Event);
278    ///
279    /// queue.clear();
280    ///
281    /// assert!(queue.is_empty());
282    /// assert!(queue.drain().next().is_none());
283    /// ```
284    pub fn clear(&mut self) {
285        self.events_a.clear();
286        self.events_b.clear();
287    }
288
289    /// Returns `true` if the write buffer has no pending events.
290    ///
291    /// Note: This only checks the write buffer. The read buffer may still
292    /// contain events from the previous frame.
293    ///
294    /// # Example
295    ///
296    /// ```rust
297    /// use goud_engine::core::event::EventQueue;
298    ///
299    /// struct Event;
300    /// let mut queue: EventQueue<Event> = EventQueue::new();
301    ///
302    /// assert!(queue.is_empty());
303    ///
304    /// queue.send(Event);
305    /// assert!(!queue.is_empty());
306    /// ```
307    #[must_use]
308    pub fn is_empty(&self) -> bool {
309        self.write_buffer().is_empty()
310    }
311
312    /// Returns the number of events in the write buffer.
313    ///
314    /// Note: This only counts events in the write buffer (pending events).
315    /// Use `read_len()` to count events available for reading.
316    ///
317    /// # Example
318    ///
319    /// ```rust
320    /// use goud_engine::core::event::EventQueue;
321    ///
322    /// struct Event;
323    /// let mut queue: EventQueue<Event> = EventQueue::new();
324    ///
325    /// assert_eq!(queue.len(), 0);
326    ///
327    /// queue.send(Event);
328    /// queue.send(Event);
329    /// queue.send(Event);
330    ///
331    /// assert_eq!(queue.len(), 3);
332    /// ```
333    #[must_use]
334    pub fn len(&self) -> usize {
335        self.write_buffer().len()
336    }
337
338    /// Returns the number of events available for reading.
339    ///
340    /// # Example
341    ///
342    /// ```rust
343    /// use goud_engine::core::event::EventQueue;
344    ///
345    /// struct Event;
346    /// let mut queue: EventQueue<Event> = EventQueue::new();
347    ///
348    /// queue.send(Event);
349    /// queue.send(Event);
350    ///
351    /// // Events are in write buffer, not yet readable
352    /// assert_eq!(queue.read_len(), 0);
353    ///
354    /// queue.swap_buffers();
355    ///
356    /// // Now they're in the read buffer
357    /// assert_eq!(queue.read_len(), 2);
358    /// ```
359    #[must_use]
360    pub fn read_len(&self) -> usize {
361        self.read_buffer().len()
362    }
363
364    /// Returns a reference to the write buffer.
365    #[inline]
366    fn write_buffer(&self) -> &Vec<E> {
367        if self.active_buffer {
368            &self.events_b
369        } else {
370            &self.events_a
371        }
372    }
373
374    /// Returns a mutable reference to the write buffer.
375    #[inline]
376    fn write_buffer_mut(&mut self) -> &mut Vec<E> {
377        if self.active_buffer {
378            &mut self.events_b
379        } else {
380            &mut self.events_a
381        }
382    }
383
384    /// Returns a reference to the read buffer.
385    ///
386    /// This is exposed for use by [`EventReader`] to access events without draining.
387    #[inline]
388    pub fn read_buffer(&self) -> &Vec<E> {
389        if self.active_buffer {
390            &self.events_a
391        } else {
392            &self.events_b
393        }
394    }
395
396    /// Returns a mutable reference to the read buffer.
397    #[inline]
398    fn read_buffer_mut(&mut self) -> &mut Vec<E> {
399        if self.active_buffer {
400            &mut self.events_a
401        } else {
402            &mut self.events_b
403        }
404    }
405}
406
407impl<E: Event> Default for EventQueue<E> {
408    fn default() -> Self {
409        Self::new()
410    }
411}
412
413/// Read-only accessor for consuming events from an [`EventQueue`].
414///
415/// `EventReader` provides a way for systems to read events without consuming
416/// them immediately. It tracks a read index to ensure events are not read
417/// multiple times within the same frame by the same reader.
418///
419/// # Multiple Readers
420///
421/// Multiple `EventReader` instances can exist for the same queue (shared borrow).
422/// Each reader maintains its own read position, allowing different systems to
423/// read the same events independently.
424///
425/// # Read Tracking
426///
427/// The reader tracks which events have been read via an internal index. When
428/// `read()` is called, it returns only unread events and advances the index.
429/// This prevents double-processing of events within a single system.
430///
431/// # Example
432///
433/// ```rust
434/// use goud_engine::core::event::{EventQueue, EventReader};
435///
436/// #[derive(Debug, Clone)]
437/// struct DamageEvent { amount: u32 }
438///
439/// let mut queue: EventQueue<DamageEvent> = EventQueue::new();
440/// queue.send(DamageEvent { amount: 10 });
441/// queue.send(DamageEvent { amount: 25 });
442/// queue.swap_buffers();
443///
444/// // Create a reader
445/// let mut reader = EventReader::new(&queue);
446///
447/// // First read gets both events
448/// let events: Vec<_> = reader.read().collect();
449/// assert_eq!(events.len(), 2);
450///
451/// // Second read gets nothing (already read)
452/// let events: Vec<_> = reader.read().collect();
453/// assert!(events.is_empty());
454/// ```
455pub struct EventReader<'a, E: Event> {
456    /// Reference to the event queue
457    queue: &'a EventQueue<E>,
458    /// Index of the next unread event in the read buffer
459    read_index: usize,
460}
461
462impl<'a, E: Event> EventReader<'a, E> {
463    /// Creates a new `EventReader` for the given queue.
464    ///
465    /// The reader starts at index 0, meaning it will read all available events
466    /// in the read buffer on the first call to `read()`.
467    ///
468    /// # Example
469    ///
470    /// ```rust
471    /// use goud_engine::core::event::{EventQueue, EventReader};
472    ///
473    /// struct MyEvent { data: i32 }
474    ///
475    /// let queue: EventQueue<MyEvent> = EventQueue::new();
476    /// let reader = EventReader::new(&queue);
477    /// assert!(reader.is_empty());
478    /// ```
479    #[must_use]
480    pub fn new(queue: &'a EventQueue<E>) -> Self {
481        Self {
482            queue,
483            read_index: 0,
484        }
485    }
486
487    /// Returns an iterator over unread events.
488    ///
489    /// Each call to `read()` returns only events that haven't been read by
490    /// this reader instance yet. The read index is advanced after iteration.
491    ///
492    /// # Example
493    ///
494    /// ```rust
495    /// use goud_engine::core::event::{EventQueue, EventReader};
496    ///
497    /// #[derive(Debug)]
498    /// struct ScoreEvent { points: i32 }
499    ///
500    /// let mut queue: EventQueue<ScoreEvent> = EventQueue::new();
501    /// queue.send(ScoreEvent { points: 100 });
502    /// queue.send(ScoreEvent { points: 50 });
503    /// queue.swap_buffers();
504    ///
505    /// let mut reader = EventReader::new(&queue);
506    ///
507    /// // Read all events
508    /// for event in reader.read() {
509    ///     println!("Score: {}", event.points);
510    /// }
511    /// ```
512    pub fn read(&mut self) -> EventReaderIter<'_, 'a, E> {
513        EventReaderIter { reader: self }
514    }
515
516    /// Returns `true` if there are no unread events.
517    ///
518    /// This checks if all events in the read buffer have been consumed by
519    /// this reader.
520    ///
521    /// # Example
522    ///
523    /// ```rust
524    /// use goud_engine::core::event::{EventQueue, EventReader};
525    ///
526    /// struct Event;
527    ///
528    /// let mut queue: EventQueue<Event> = EventQueue::new();
529    /// queue.send(Event);
530    /// queue.swap_buffers();
531    ///
532    /// let mut reader = EventReader::new(&queue);
533    /// assert!(!reader.is_empty());
534    ///
535    /// // Consume all events
536    /// let _ = reader.read().count();
537    /// assert!(reader.is_empty());
538    /// ```
539    #[must_use]
540    pub fn is_empty(&self) -> bool {
541        self.read_index >= self.queue.read_len()
542    }
543
544    /// Returns the number of unread events.
545    ///
546    /// # Example
547    ///
548    /// ```rust
549    /// use goud_engine::core::event::{EventQueue, EventReader};
550    ///
551    /// struct Event;
552    ///
553    /// let mut queue: EventQueue<Event> = EventQueue::new();
554    /// queue.send(Event);
555    /// queue.send(Event);
556    /// queue.send(Event);
557    /// queue.swap_buffers();
558    ///
559    /// let mut reader = EventReader::new(&queue);
560    /// assert_eq!(reader.len(), 3);
561    ///
562    /// // Read one event
563    /// let _ = reader.read().next();
564    /// assert_eq!(reader.len(), 2);
565    /// ```
566    #[must_use]
567    pub fn len(&self) -> usize {
568        self.queue.read_len().saturating_sub(self.read_index)
569    }
570
571    /// Clears the reader's position, allowing events to be re-read.
572    ///
573    /// This resets the read index to 0. The next call to `read()` will
574    /// return all events in the read buffer again.
575    ///
576    /// # Example
577    ///
578    /// ```rust
579    /// use goud_engine::core::event::{EventQueue, EventReader};
580    ///
581    /// #[derive(Debug, Clone)]
582    /// struct Event { id: u32 }
583    ///
584    /// let mut queue: EventQueue<Event> = EventQueue::new();
585    /// queue.send(Event { id: 1 });
586    /// queue.swap_buffers();
587    ///
588    /// let mut reader = EventReader::new(&queue);
589    ///
590    /// // Read all events
591    /// let count1 = reader.read().count();
592    /// assert_eq!(count1, 1);
593    ///
594    /// // Nothing left to read
595    /// let count2 = reader.read().count();
596    /// assert_eq!(count2, 0);
597    ///
598    /// // Reset and read again
599    /// reader.clear();
600    /// let count3 = reader.read().count();
601    /// assert_eq!(count3, 1);
602    /// ```
603    pub fn clear(&mut self) {
604        self.read_index = 0;
605    }
606}
607
608/// Iterator over unread events from an [`EventReader`].
609///
610/// This iterator is returned by [`EventReader::read()`] and yields references
611/// to events that haven't been read yet by this reader.
612pub struct EventReaderIter<'r, 'a, E: Event> {
613    reader: &'r mut EventReader<'a, E>,
614}
615
616impl<'r, 'a, E: Event> Iterator for EventReaderIter<'r, 'a, E> {
617    type Item = &'a E;
618
619    fn next(&mut self) -> Option<Self::Item> {
620        let buffer = self.reader.queue.read_buffer();
621        if self.reader.read_index < buffer.len() {
622            let event = &buffer[self.reader.read_index];
623            self.reader.read_index += 1;
624            Some(event)
625        } else {
626            None
627        }
628    }
629
630    fn size_hint(&self) -> (usize, Option<usize>) {
631        let remaining = self.reader.len();
632        (remaining, Some(remaining))
633    }
634}
635
636impl<'r, 'a, E: Event> ExactSizeIterator for EventReaderIter<'r, 'a, E> {}
637
638/// Write-only accessor for sending events to an [`EventQueue`].
639///
640/// `EventWriter` provides exclusive (mutable) access to send events to a queue.
641/// Only one writer can exist at a time due to Rust's borrowing rules, which
642/// prevents data races.
643///
644/// # Usage Pattern
645///
646/// In an ECS context, systems that need to send events request an `EventWriter`
647/// as a system parameter. The borrow checker ensures no other system can
648/// simultaneously write to the same event queue.
649///
650/// # Example
651///
652/// ```rust
653/// use goud_engine::core::event::{EventQueue, EventWriter};
654///
655/// #[derive(Debug)]
656/// struct ExplosionEvent {
657///     x: f32,
658///     y: f32,
659///     radius: f32,
660/// }
661///
662/// let mut queue: EventQueue<ExplosionEvent> = EventQueue::new();
663///
664/// // Create a writer
665/// let mut writer = EventWriter::new(&mut queue);
666///
667/// // Send events
668/// writer.send(ExplosionEvent { x: 10.0, y: 20.0, radius: 5.0 });
669/// writer.send(ExplosionEvent { x: 30.0, y: 40.0, radius: 3.0 });
670///
671/// // Writer is dropped here, releasing the mutable borrow
672///
673/// // Now we can swap and read
674/// queue.swap_buffers();
675/// ```
676pub struct EventWriter<'a, E: Event> {
677    /// Mutable reference to the event queue
678    queue: &'a mut EventQueue<E>,
679}
680
681impl<'a, E: Event> EventWriter<'a, E> {
682    /// Creates a new `EventWriter` for the given queue.
683    ///
684    /// This takes a mutable reference to the queue, ensuring exclusive access.
685    ///
686    /// # Example
687    ///
688    /// ```rust
689    /// use goud_engine::core::event::{EventQueue, EventWriter};
690    ///
691    /// struct MyEvent { data: i32 }
692    ///
693    /// let mut queue: EventQueue<MyEvent> = EventQueue::new();
694    /// let mut writer = EventWriter::new(&mut queue);
695    ///
696    /// writer.send(MyEvent { data: 42 });
697    /// ```
698    #[must_use]
699    pub fn new(queue: &'a mut EventQueue<E>) -> Self {
700        Self { queue }
701    }
702
703    /// Sends a single event to the queue.
704    ///
705    /// The event is written to the write buffer and will be available for
706    /// reading after the next `swap_buffers()` call.
707    ///
708    /// # Example
709    ///
710    /// ```rust
711    /// use goud_engine::core::event::{EventQueue, EventWriter};
712    ///
713    /// struct InputEvent { key: char }
714    ///
715    /// let mut queue: EventQueue<InputEvent> = EventQueue::new();
716    /// let mut writer = EventWriter::new(&mut queue);
717    ///
718    /// writer.send(InputEvent { key: 'w' });
719    /// writer.send(InputEvent { key: 'a' });
720    /// writer.send(InputEvent { key: 's' });
721    /// writer.send(InputEvent { key: 'd' });
722    /// ```
723    pub fn send(&mut self, event: E) {
724        self.queue.send(event);
725    }
726
727    /// Sends multiple events to the queue in batch.
728    ///
729    /// This is more efficient than calling `send()` multiple times when you
730    /// have a collection of events to send.
731    ///
732    /// # Example
733    ///
734    /// ```rust
735    /// use goud_engine::core::event::{EventQueue, EventWriter};
736    ///
737    /// #[derive(Clone)]
738    /// struct SpawnEvent { entity_id: u32 }
739    ///
740    /// let mut queue: EventQueue<SpawnEvent> = EventQueue::new();
741    /// let mut writer = EventWriter::new(&mut queue);
742    ///
743    /// // Send a batch of events
744    /// let spawns = vec![
745    ///     SpawnEvent { entity_id: 1 },
746    ///     SpawnEvent { entity_id: 2 },
747    ///     SpawnEvent { entity_id: 3 },
748    /// ];
749    /// writer.send_batch(spawns);
750    /// ```
751    pub fn send_batch(&mut self, events: impl IntoIterator<Item = E>) {
752        for event in events {
753            self.queue.send(event);
754        }
755    }
756
757    /// Returns `true` if no events have been written in the current frame.
758    ///
759    /// Note: This only checks events written since the last `swap_buffers()`.
760    ///
761    /// # Example
762    ///
763    /// ```rust
764    /// use goud_engine::core::event::{EventQueue, EventWriter};
765    ///
766    /// struct Event;
767    ///
768    /// let mut queue: EventQueue<Event> = EventQueue::new();
769    /// let mut writer = EventWriter::new(&mut queue);
770    ///
771    /// assert!(writer.is_empty());
772    ///
773    /// writer.send(Event);
774    /// assert!(!writer.is_empty());
775    /// ```
776    #[must_use]
777    pub fn is_empty(&self) -> bool {
778        self.queue.is_empty()
779    }
780
781    /// Returns the number of events written in the current frame.
782    ///
783    /// # Example
784    ///
785    /// ```rust
786    /// use goud_engine::core::event::{EventQueue, EventWriter};
787    ///
788    /// struct Event;
789    ///
790    /// let mut queue: EventQueue<Event> = EventQueue::new();
791    /// let mut writer = EventWriter::new(&mut queue);
792    ///
793    /// writer.send(Event);
794    /// writer.send(Event);
795    ///
796    /// assert_eq!(writer.len(), 2);
797    /// ```
798    #[must_use]
799    pub fn len(&self) -> usize {
800        self.queue.len()
801    }
802}
803
804/// ECS-compatible resource wrapper for event queues.
805///
806/// `Events<E>` wraps an [`EventQueue<E>`] and provides a high-level API
807/// suitable for use as an ECS resource. It manages the event lifecycle
808/// automatically and provides convenient accessor methods.
809///
810/// # Resource Integration
811///
812/// In a typical ECS architecture, `Events<E>` is stored as a resource in the
813/// World. Systems that need to send or receive events request it via the
814/// resource system.
815///
816/// # Frame Lifecycle
817///
818/// The `update()` method must be called once per frame (typically at the start
819/// or end of the frame) to:
820/// 1. Swap the double buffers
821/// 2. Clear stale events from the previous frame
822///
823/// This ensures events persist for exactly one frame after being sent.
824///
825/// # Example
826///
827/// ```rust
828/// use goud_engine::core::event::Events;
829///
830/// #[derive(Debug, Clone)]
831/// struct DamageEvent {
832///     entity_id: u32,
833///     amount: i32,
834/// }
835///
836/// // Create the events resource
837/// let mut events: Events<DamageEvent> = Events::new();
838///
839/// // Systems can send events
840/// events.send(DamageEvent { entity_id: 1, amount: 50 });
841/// events.send(DamageEvent { entity_id: 2, amount: 25 });
842///
843/// // At frame boundary, call update
844/// events.update();
845///
846/// // Now systems can read the events
847/// let mut reader = events.reader();
848/// for event in reader.read() {
849///     println!("Entity {} took {} damage", event.entity_id, event.amount);
850/// }
851/// ```
852///
853/// # Thread Safety
854///
855/// `Events<E>` is `Send + Sync` when `E` is `Send + Sync`, enabling safe
856/// use in multi-threaded ECS systems.
857pub struct Events<E: Event> {
858    /// The underlying double-buffered event queue
859    queue: EventQueue<E>,
860}
861
862impl<E: Event> Events<E> {
863    /// Creates a new empty `Events` resource.
864    ///
865    /// # Example
866    ///
867    /// ```rust
868    /// use goud_engine::core::event::Events;
869    ///
870    /// struct MyEvent { data: i32 }
871    /// let events: Events<MyEvent> = Events::new();
872    /// ```
873    #[must_use]
874    pub fn new() -> Self {
875        Self {
876            queue: EventQueue::new(),
877        }
878    }
879
880    /// Creates an `EventReader` for reading events from this resource.
881    ///
882    /// Multiple readers can be created simultaneously, as they only require
883    /// shared access to the underlying queue.
884    ///
885    /// # Example
886    ///
887    /// ```rust
888    /// use goud_engine::core::event::Events;
889    ///
890    /// #[derive(Debug)]
891    /// struct MyEvent { id: u32 }
892    ///
893    /// let mut events: Events<MyEvent> = Events::new();
894    /// events.send(MyEvent { id: 1 });
895    /// events.update();
896    ///
897    /// let mut reader = events.reader();
898    /// for event in reader.read() {
899    ///     println!("Got event: {:?}", event);
900    /// }
901    /// ```
902    #[must_use]
903    pub fn reader(&self) -> EventReader<'_, E> {
904        EventReader::new(&self.queue)
905    }
906
907    /// Creates an `EventWriter` for sending events to this resource.
908    ///
909    /// Only one writer can exist at a time due to the mutable borrow requirement.
910    ///
911    /// # Example
912    ///
913    /// ```rust
914    /// use goud_engine::core::event::Events;
915    ///
916    /// struct SpawnEvent { entity_type: String }
917    ///
918    /// let mut events: Events<SpawnEvent> = Events::new();
919    ///
920    /// {
921    ///     let mut writer = events.writer();
922    ///     writer.send(SpawnEvent { entity_type: "enemy".to_string() });
923    ///     writer.send(SpawnEvent { entity_type: "item".to_string() });
924    /// }
925    /// ```
926    #[must_use]
927    pub fn writer(&mut self) -> EventWriter<'_, E> {
928        EventWriter::new(&mut self.queue)
929    }
930
931    /// Sends an event directly to the write buffer.
932    ///
933    /// This is a convenience method equivalent to creating a writer and
934    /// calling `send()` on it.
935    ///
936    /// # Example
937    ///
938    /// ```rust
939    /// use goud_engine::core::event::Events;
940    ///
941    /// struct InputEvent { key: char }
942    ///
943    /// let mut events: Events<InputEvent> = Events::new();
944    /// events.send(InputEvent { key: 'w' });
945    /// events.send(InputEvent { key: 'a' });
946    /// ```
947    pub fn send(&mut self, event: E) {
948        self.queue.send(event);
949    }
950
951    /// Sends multiple events to the write buffer in batch.
952    ///
953    /// More efficient than calling `send()` multiple times when you have
954    /// a collection of events.
955    ///
956    /// # Example
957    ///
958    /// ```rust
959    /// use goud_engine::core::event::Events;
960    ///
961    /// #[derive(Clone)]
962    /// struct ParticleEvent { x: f32, y: f32 }
963    ///
964    /// let mut events: Events<ParticleEvent> = Events::new();
965    /// let particles = vec![
966    ///     ParticleEvent { x: 0.0, y: 0.0 },
967    ///     ParticleEvent { x: 1.0, y: 1.0 },
968    ///     ParticleEvent { x: 2.0, y: 2.0 },
969    /// ];
970    /// events.send_batch(particles);
971    /// ```
972    pub fn send_batch(&mut self, events: impl IntoIterator<Item = E>) {
973        for event in events {
974            self.queue.send(event);
975        }
976    }
977
978    /// Updates the event system at frame boundary.
979    ///
980    /// This method MUST be called exactly once per frame, typically at the
981    /// start or end of the game loop. It:
982    /// 1. Clears events from the previous read buffer (they've had their chance)
983    /// 2. Swaps the buffers so newly written events become readable
984    ///
985    /// # Frame Timing
986    ///
987    /// ```text
988    /// Frame N:
989    ///   1. update() called - events from Frame N-1 become readable
990    ///   2. Systems read events
991    ///   3. Systems write new events
992    ///
993    /// Frame N+1:
994    ///   1. update() called - Frame N-1 events cleared, Frame N events readable
995    ///   ... and so on
996    /// ```
997    ///
998    /// # Important
999    ///
1000    /// - Calling `update()` more than once per frame will cause events to be
1001    ///   lost (the write buffer gets swapped to read before systems can write)
1002    /// - Not calling `update()` will cause events to accumulate and never
1003    ///   become readable
1004    ///
1005    /// # Example
1006    ///
1007    /// ```rust
1008    /// use goud_engine::core::event::Events;
1009    ///
1010    /// struct GameEvent;
1011    ///
1012    /// let mut events: Events<GameEvent> = Events::new();
1013    ///
1014    /// // Game loop
1015    /// for frame in 0..3 {
1016    ///     // Start of frame: update events
1017    ///     events.update();
1018    ///
1019    ///     // Read events from previous frame
1020    ///     let mut reader = events.reader();
1021    ///     for _ in reader.read() {
1022    ///         // Process events...
1023    ///     }
1024    ///
1025    ///     // Systems write new events
1026    ///     events.send(GameEvent);
1027    /// }
1028    /// ```
1029    pub fn update(&mut self) {
1030        self.queue.swap_buffers();
1031    }
1032
1033    /// Drains all events from the read buffer, consuming them.
1034    ///
1035    /// Unlike using a reader, this removes the events entirely from the buffer.
1036    ///
1037    /// # Example
1038    ///
1039    /// ```rust
1040    /// use goud_engine::core::event::Events;
1041    ///
1042    /// struct Event { id: u32 }
1043    ///
1044    /// let mut events: Events<Event> = Events::new();
1045    /// events.send(Event { id: 1 });
1046    /// events.send(Event { id: 2 });
1047    /// events.update();
1048    ///
1049    /// let collected: Vec<Event> = events.drain().collect();
1050    /// assert_eq!(collected.len(), 2);
1051    /// ```
1052    pub fn drain(&mut self) -> impl Iterator<Item = E> + '_ {
1053        self.queue.drain()
1054    }
1055
1056    /// Clears all events from both buffers.
1057    ///
1058    /// Use this when transitioning between game states or when you need
1059    /// to discard all pending events.
1060    ///
1061    /// # Example
1062    ///
1063    /// ```rust
1064    /// use goud_engine::core::event::Events;
1065    ///
1066    /// struct Event;
1067    ///
1068    /// let mut events: Events<Event> = Events::new();
1069    /// events.send(Event);
1070    /// events.update();
1071    /// events.send(Event);
1072    ///
1073    /// events.clear();
1074    /// assert!(events.is_empty());
1075    /// ```
1076    pub fn clear(&mut self) {
1077        self.queue.clear();
1078    }
1079
1080    /// Returns `true` if no events are pending in the write buffer.
1081    ///
1082    /// Note: The read buffer may still contain events from the previous frame.
1083    ///
1084    /// # Example
1085    ///
1086    /// ```rust
1087    /// use goud_engine::core::event::Events;
1088    ///
1089    /// struct Event;
1090    ///
1091    /// let mut events: Events<Event> = Events::new();
1092    /// assert!(events.is_empty());
1093    ///
1094    /// events.send(Event);
1095    /// assert!(!events.is_empty());
1096    /// ```
1097    #[must_use]
1098    pub fn is_empty(&self) -> bool {
1099        self.queue.is_empty()
1100    }
1101
1102    /// Returns the number of events in the write buffer.
1103    ///
1104    /// # Example
1105    ///
1106    /// ```rust
1107    /// use goud_engine::core::event::Events;
1108    ///
1109    /// struct Event;
1110    ///
1111    /// let mut events: Events<Event> = Events::new();
1112    /// events.send(Event);
1113    /// events.send(Event);
1114    ///
1115    /// assert_eq!(events.len(), 2);
1116    /// ```
1117    #[must_use]
1118    pub fn len(&self) -> usize {
1119        self.queue.len()
1120    }
1121
1122    /// Returns the number of events available for reading.
1123    ///
1124    /// # Example
1125    ///
1126    /// ```rust
1127    /// use goud_engine::core::event::Events;
1128    ///
1129    /// struct Event;
1130    ///
1131    /// let mut events: Events<Event> = Events::new();
1132    /// events.send(Event);
1133    /// events.send(Event);
1134    ///
1135    /// // Events are in write buffer
1136    /// assert_eq!(events.read_len(), 0);
1137    ///
1138    /// events.update();
1139    ///
1140    /// // Now in read buffer
1141    /// assert_eq!(events.read_len(), 2);
1142    /// ```
1143    #[must_use]
1144    pub fn read_len(&self) -> usize {
1145        self.queue.read_len()
1146    }
1147}
1148
1149impl<E: Event> Default for Events<E> {
1150    fn default() -> Self {
1151        Self::new()
1152    }
1153}
1154
1155// Note: Events<E> is automatically Send + Sync because EventQueue<E> is Send + Sync
1156// when E is Send + Sync, which is guaranteed by the Event trait bound.
1157// This is enforced by the test `test_events_is_send_sync`.
1158
1159#[cfg(test)]
1160mod tests {
1161    use super::*;
1162
1163    /// Test that simple struct implements Event
1164    #[test]
1165    fn test_simple_struct_is_event() {
1166        #[derive(Debug, Clone)]
1167        struct SimpleEvent {
1168            value: i32,
1169        }
1170
1171        fn accepts_event<E: Event>(_: E) {}
1172
1173        let event = SimpleEvent { value: 42 };
1174        accepts_event(event);
1175    }
1176
1177    /// Test that struct with String field implements Event
1178    #[test]
1179    fn test_event_with_string() {
1180        #[derive(Debug, Clone)]
1181        struct MessageEvent {
1182            message: String,
1183            priority: u8,
1184        }
1185
1186        fn accepts_event<E: Event>(_: E) {}
1187
1188        let event = MessageEvent {
1189            message: "hello".to_string(),
1190            priority: 1,
1191        };
1192        accepts_event(event);
1193    }
1194
1195    /// Test that unit struct implements Event
1196    #[test]
1197    fn test_unit_struct_event() {
1198        struct UnitEvent;
1199
1200        fn accepts_event<E: Event>(_: E) {}
1201        accepts_event(UnitEvent);
1202    }
1203
1204    /// Test that tuple struct implements Event
1205    #[test]
1206    fn test_tuple_struct_event() {
1207        struct TupleEvent(i32, String);
1208
1209        fn accepts_event<E: Event>(_: E) {}
1210        accepts_event(TupleEvent(1, "test".to_string()));
1211    }
1212
1213    /// Test that primitive types implement Event
1214    #[test]
1215    fn test_primitive_types_are_events() {
1216        fn accepts_event<E: Event>(_: E) {}
1217
1218        accepts_event(42i32);
1219        accepts_event(3.14f64);
1220        accepts_event(true);
1221        accepts_event("static string");
1222        accepts_event(String::from("owned string"));
1223    }
1224
1225    /// Test that Vec of events is itself an Event
1226    #[test]
1227    fn test_container_of_events() {
1228        #[derive(Clone)]
1229        struct InnerEvent {
1230            id: u32,
1231        }
1232
1233        fn accepts_event<E: Event>(_: E) {}
1234
1235        let events = vec![InnerEvent { id: 1 }, InnerEvent { id: 2 }];
1236        accepts_event(events);
1237    }
1238
1239    /// Test that Arc-wrapped data is an Event
1240    #[test]
1241    fn test_arc_wrapped_event() {
1242        use std::sync::Arc;
1243
1244        struct SharedData {
1245            data: i32,
1246        }
1247
1248        fn accepts_event<E: Event>(_: E) {}
1249
1250        let shared = Arc::new(SharedData { data: 42 });
1251        accepts_event(shared);
1252    }
1253
1254    /// Test Event trait bounds are correct
1255    #[test]
1256    fn test_event_trait_bounds() {
1257        fn assert_send<T: Send>() {}
1258        fn assert_sync<T: Sync>() {}
1259        fn assert_static<T: 'static>() {}
1260
1261        struct TestEvent;
1262
1263        // Event requires all these bounds
1264        assert_send::<TestEvent>();
1265        assert_sync::<TestEvent>();
1266        assert_static::<TestEvent>();
1267    }
1268
1269    // =========================================================================
1270    // EventQueue Tests
1271    // =========================================================================
1272
1273    /// Test EventQueue creation and default state
1274    #[test]
1275    fn test_event_queue_new() {
1276        #[derive(Debug)]
1277        struct TestEvent {
1278            id: u32,
1279        }
1280
1281        let queue: EventQueue<TestEvent> = EventQueue::new();
1282        assert!(queue.is_empty());
1283        assert_eq!(queue.len(), 0);
1284        assert_eq!(queue.read_len(), 0);
1285    }
1286
1287    /// Test EventQueue Default trait implementation
1288    #[test]
1289    fn test_event_queue_default() {
1290        #[derive(Debug)]
1291        struct TestEvent;
1292
1293        let queue: EventQueue<TestEvent> = EventQueue::default();
1294        assert!(queue.is_empty());
1295    }
1296
1297    /// Test sending events to write buffer
1298    #[test]
1299    fn test_event_queue_send() {
1300        #[derive(Debug, PartialEq)]
1301        struct CountEvent {
1302            count: i32,
1303        }
1304
1305        let mut queue: EventQueue<CountEvent> = EventQueue::new();
1306
1307        queue.send(CountEvent { count: 1 });
1308        assert_eq!(queue.len(), 1);
1309        assert!(!queue.is_empty());
1310
1311        queue.send(CountEvent { count: 2 });
1312        queue.send(CountEvent { count: 3 });
1313        assert_eq!(queue.len(), 3);
1314
1315        // Read buffer should still be empty
1316        assert_eq!(queue.read_len(), 0);
1317    }
1318
1319    /// Test buffer swapping moves events from write to read buffer
1320    #[test]
1321    fn test_event_queue_swap_buffers() {
1322        #[derive(Debug, PartialEq)]
1323        struct SwapEvent {
1324            value: i32,
1325        }
1326
1327        let mut queue: EventQueue<SwapEvent> = EventQueue::new();
1328
1329        // Send to write buffer
1330        queue.send(SwapEvent { value: 10 });
1331        queue.send(SwapEvent { value: 20 });
1332
1333        assert_eq!(queue.len(), 2);
1334        assert_eq!(queue.read_len(), 0);
1335
1336        // Swap buffers
1337        queue.swap_buffers();
1338
1339        // Now events are in read buffer
1340        assert_eq!(queue.len(), 0); // Write buffer is now empty
1341        assert_eq!(queue.read_len(), 2); // Read buffer has events
1342    }
1343
1344    /// Test draining events from read buffer
1345    #[test]
1346    fn test_event_queue_drain() {
1347        #[derive(Debug, PartialEq, Clone)]
1348        struct DrainEvent {
1349            data: String,
1350        }
1351
1352        let mut queue: EventQueue<DrainEvent> = EventQueue::new();
1353
1354        queue.send(DrainEvent {
1355            data: "first".to_string(),
1356        });
1357        queue.send(DrainEvent {
1358            data: "second".to_string(),
1359        });
1360        queue.send(DrainEvent {
1361            data: "third".to_string(),
1362        });
1363
1364        queue.swap_buffers();
1365
1366        // Drain and collect events
1367        let events: Vec<DrainEvent> = queue.drain().collect();
1368
1369        assert_eq!(events.len(), 3);
1370        assert_eq!(events[0].data, "first");
1371        assert_eq!(events[1].data, "second");
1372        assert_eq!(events[2].data, "third");
1373
1374        // Read buffer should now be empty
1375        assert_eq!(queue.read_len(), 0);
1376    }
1377
1378    /// Test that drain on empty read buffer yields nothing
1379    #[test]
1380    fn test_event_queue_drain_empty() {
1381        #[derive(Debug)]
1382        struct EmptyEvent;
1383
1384        let mut queue: EventQueue<EmptyEvent> = EventQueue::new();
1385
1386        // Drain without sending anything
1387        let events: Vec<EmptyEvent> = queue.drain().collect();
1388        assert!(events.is_empty());
1389
1390        // Send to write buffer but don't swap
1391        queue.send(EmptyEvent);
1392
1393        // Drain should still be empty (events in write buffer)
1394        let events: Vec<EmptyEvent> = queue.drain().collect();
1395        assert!(events.is_empty());
1396    }
1397
1398    /// Test clearing both buffers
1399    #[test]
1400    fn test_event_queue_clear() {
1401        #[derive(Debug)]
1402        struct ClearEvent {
1403            id: u32,
1404        }
1405
1406        let mut queue: EventQueue<ClearEvent> = EventQueue::new();
1407
1408        // Add events to write buffer
1409        queue.send(ClearEvent { id: 1 });
1410        queue.send(ClearEvent { id: 2 });
1411
1412        // Swap so some events are in read buffer
1413        queue.swap_buffers();
1414
1415        // Add more to new write buffer
1416        queue.send(ClearEvent { id: 3 });
1417
1418        assert_eq!(queue.len(), 1); // Write buffer
1419        assert_eq!(queue.read_len(), 2); // Read buffer
1420
1421        // Clear everything
1422        queue.clear();
1423
1424        assert!(queue.is_empty());
1425        assert_eq!(queue.len(), 0);
1426        assert_eq!(queue.read_len(), 0);
1427        assert!(queue.drain().next().is_none());
1428    }
1429
1430    /// Test multi-frame event lifecycle
1431    #[test]
1432    fn test_event_queue_multi_frame_lifecycle() {
1433        #[derive(Debug, PartialEq)]
1434        struct FrameEvent {
1435            frame: u32,
1436        }
1437
1438        let mut queue: EventQueue<FrameEvent> = EventQueue::new();
1439
1440        // Frame 1: Send event
1441        queue.send(FrameEvent { frame: 1 });
1442        assert_eq!(queue.len(), 1);
1443        assert_eq!(queue.read_len(), 0);
1444
1445        // End of Frame 1
1446        queue.swap_buffers();
1447
1448        // Frame 2: Event from frame 1 is now readable
1449        assert_eq!(queue.len(), 0);
1450        assert_eq!(queue.read_len(), 1);
1451
1452        // Read it
1453        let events: Vec<FrameEvent> = queue.drain().collect();
1454        assert_eq!(events.len(), 1);
1455        assert_eq!(events[0].frame, 1);
1456
1457        // Send new event in frame 2
1458        queue.send(FrameEvent { frame: 2 });
1459
1460        // End of Frame 2
1461        queue.swap_buffers();
1462
1463        // Frame 3: Event from frame 2 is readable, frame 1 event is gone
1464        let events: Vec<FrameEvent> = queue.drain().collect();
1465        assert_eq!(events.len(), 1);
1466        assert_eq!(events[0].frame, 2);
1467
1468        // End of Frame 3 (no new events)
1469        queue.swap_buffers();
1470
1471        // Frame 4: No events
1472        let events: Vec<FrameEvent> = queue.drain().collect();
1473        assert!(events.is_empty());
1474    }
1475
1476    /// Test that events preserve order
1477    #[test]
1478    fn test_event_queue_preserves_order() {
1479        #[derive(Debug, PartialEq)]
1480        struct OrderedEvent {
1481            sequence: usize,
1482        }
1483
1484        let mut queue: EventQueue<OrderedEvent> = EventQueue::new();
1485
1486        // Send events in order
1487        for i in 0..100 {
1488            queue.send(OrderedEvent { sequence: i });
1489        }
1490
1491        queue.swap_buffers();
1492
1493        // Verify order is preserved
1494        let events: Vec<OrderedEvent> = queue.drain().collect();
1495        assert_eq!(events.len(), 100);
1496
1497        for (i, event) in events.iter().enumerate() {
1498            assert_eq!(event.sequence, i, "Event order mismatch at index {}", i);
1499        }
1500    }
1501
1502    // =========================================================================
1503    // EventReader Tests
1504    // =========================================================================
1505
1506    /// Test EventReader creation
1507    #[test]
1508    fn test_event_reader_new() {
1509        #[derive(Debug)]
1510        struct TestEvent {
1511            id: u32,
1512        }
1513
1514        let queue: EventQueue<TestEvent> = EventQueue::new();
1515        let reader = EventReader::new(&queue);
1516
1517        assert!(reader.is_empty());
1518        assert_eq!(reader.len(), 0);
1519    }
1520
1521    /// Test EventReader reads all events
1522    #[test]
1523    fn test_event_reader_reads_all() {
1524        #[derive(Debug, PartialEq)]
1525        struct TestEvent {
1526            value: i32,
1527        }
1528
1529        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1530        queue.send(TestEvent { value: 1 });
1531        queue.send(TestEvent { value: 2 });
1532        queue.send(TestEvent { value: 3 });
1533        queue.swap_buffers();
1534
1535        let mut reader = EventReader::new(&queue);
1536
1537        let events: Vec<&TestEvent> = reader.read().collect();
1538        assert_eq!(events.len(), 3);
1539        assert_eq!(events[0].value, 1);
1540        assert_eq!(events[1].value, 2);
1541        assert_eq!(events[2].value, 3);
1542    }
1543
1544    /// Test EventReader tracks read position
1545    #[test]
1546    fn test_event_reader_tracks_position() {
1547        #[derive(Debug)]
1548        struct TestEvent {
1549            id: u32,
1550        }
1551
1552        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1553        queue.send(TestEvent { id: 1 });
1554        queue.send(TestEvent { id: 2 });
1555        queue.send(TestEvent { id: 3 });
1556        queue.swap_buffers();
1557
1558        let mut reader = EventReader::new(&queue);
1559        assert_eq!(reader.len(), 3);
1560
1561        // Read first event
1562        let first = reader.read().next();
1563        assert!(first.is_some());
1564        assert_eq!(first.unwrap().id, 1);
1565        assert_eq!(reader.len(), 2);
1566
1567        // Read second event
1568        let second = reader.read().next();
1569        assert!(second.is_some());
1570        assert_eq!(second.unwrap().id, 2);
1571        assert_eq!(reader.len(), 1);
1572
1573        // Read third event
1574        let third = reader.read().next();
1575        assert!(third.is_some());
1576        assert_eq!(third.unwrap().id, 3);
1577        assert_eq!(reader.len(), 0);
1578
1579        // No more events
1580        assert!(reader.is_empty());
1581        assert!(reader.read().next().is_none());
1582    }
1583
1584    /// Test EventReader doesn't re-read events
1585    #[test]
1586    fn test_event_reader_no_rereading() {
1587        #[derive(Debug)]
1588        struct TestEvent;
1589
1590        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1591        queue.send(TestEvent);
1592        queue.send(TestEvent);
1593        queue.swap_buffers();
1594
1595        let mut reader = EventReader::new(&queue);
1596
1597        // First read gets both
1598        let count1 = reader.read().count();
1599        assert_eq!(count1, 2);
1600
1601        // Second read gets nothing
1602        let count2 = reader.read().count();
1603        assert_eq!(count2, 0);
1604
1605        // Third read still gets nothing
1606        let count3 = reader.read().count();
1607        assert_eq!(count3, 0);
1608    }
1609
1610    /// Test EventReader clear resets position
1611    #[test]
1612    fn test_event_reader_clear() {
1613        #[derive(Debug)]
1614        struct TestEvent {
1615            id: u32,
1616        }
1617
1618        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1619        queue.send(TestEvent { id: 1 });
1620        queue.send(TestEvent { id: 2 });
1621        queue.swap_buffers();
1622
1623        let mut reader = EventReader::new(&queue);
1624
1625        // Read all events
1626        let count1 = reader.read().count();
1627        assert_eq!(count1, 2);
1628        assert!(reader.is_empty());
1629
1630        // Clear and read again
1631        reader.clear();
1632        assert!(!reader.is_empty());
1633        assert_eq!(reader.len(), 2);
1634
1635        let count2 = reader.read().count();
1636        assert_eq!(count2, 2);
1637    }
1638
1639    /// Test multiple EventReaders are independent
1640    #[test]
1641    fn test_event_reader_multiple_independent() {
1642        #[derive(Debug, PartialEq)]
1643        struct TestEvent {
1644            value: i32,
1645        }
1646
1647        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1648        queue.send(TestEvent { value: 10 });
1649        queue.send(TestEvent { value: 20 });
1650        queue.swap_buffers();
1651
1652        // Create two readers
1653        let mut reader1 = EventReader::new(&queue);
1654        let mut reader2 = EventReader::new(&queue);
1655
1656        // Reader 1 reads one event
1657        let event1 = reader1.read().next().unwrap();
1658        assert_eq!(event1.value, 10);
1659
1660        // Reader 2 still sees both events
1661        let events2: Vec<_> = reader2.read().collect();
1662        assert_eq!(events2.len(), 2);
1663        assert_eq!(events2[0].value, 10);
1664        assert_eq!(events2[1].value, 20);
1665
1666        // Reader 1 continues from where it left off
1667        let event1_second = reader1.read().next().unwrap();
1668        assert_eq!(event1_second.value, 20);
1669    }
1670
1671    /// Test EventReaderIter is ExactSizeIterator
1672    #[test]
1673    fn test_event_reader_iter_exact_size() {
1674        #[derive(Debug)]
1675        struct TestEvent;
1676
1677        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1678        queue.send(TestEvent);
1679        queue.send(TestEvent);
1680        queue.send(TestEvent);
1681        queue.swap_buffers();
1682
1683        let mut reader = EventReader::new(&queue);
1684        let iter = reader.read();
1685
1686        assert_eq!(iter.len(), 3);
1687    }
1688
1689    /// Test EventReader with empty queue
1690    #[test]
1691    fn test_event_reader_empty_queue() {
1692        #[derive(Debug)]
1693        struct TestEvent;
1694
1695        let queue: EventQueue<TestEvent> = EventQueue::new();
1696        let mut reader = EventReader::new(&queue);
1697
1698        assert!(reader.is_empty());
1699        assert_eq!(reader.len(), 0);
1700        assert!(reader.read().next().is_none());
1701    }
1702
1703    // =========================================================================
1704    // EventWriter Tests
1705    // =========================================================================
1706
1707    /// Test EventWriter creation
1708    #[test]
1709    fn test_event_writer_new() {
1710        #[derive(Debug)]
1711        struct TestEvent;
1712
1713        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1714        let writer = EventWriter::new(&mut queue);
1715
1716        assert!(writer.is_empty());
1717        assert_eq!(writer.len(), 0);
1718    }
1719
1720    /// Test EventWriter sends events
1721    #[test]
1722    fn test_event_writer_send() {
1723        #[derive(Debug, PartialEq)]
1724        struct TestEvent {
1725            value: i32,
1726        }
1727
1728        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1729
1730        {
1731            let mut writer = EventWriter::new(&mut queue);
1732            writer.send(TestEvent { value: 100 });
1733            writer.send(TestEvent { value: 200 });
1734
1735            assert_eq!(writer.len(), 2);
1736            assert!(!writer.is_empty());
1737        }
1738
1739        // Verify events were written
1740        assert_eq!(queue.len(), 2);
1741        queue.swap_buffers();
1742
1743        let events: Vec<TestEvent> = queue.drain().collect();
1744        assert_eq!(events[0].value, 100);
1745        assert_eq!(events[1].value, 200);
1746    }
1747
1748    /// Test EventWriter send_batch
1749    #[test]
1750    fn test_event_writer_send_batch() {
1751        #[derive(Debug, PartialEq, Clone)]
1752        struct TestEvent {
1753            id: u32,
1754        }
1755
1756        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1757
1758        {
1759            let mut writer = EventWriter::new(&mut queue);
1760            let batch = vec![
1761                TestEvent { id: 1 },
1762                TestEvent { id: 2 },
1763                TestEvent { id: 3 },
1764                TestEvent { id: 4 },
1765                TestEvent { id: 5 },
1766            ];
1767            writer.send_batch(batch);
1768
1769            assert_eq!(writer.len(), 5);
1770        }
1771
1772        queue.swap_buffers();
1773        let events: Vec<TestEvent> = queue.drain().collect();
1774        assert_eq!(events.len(), 5);
1775
1776        for (i, event) in events.iter().enumerate() {
1777            assert_eq!(event.id, (i + 1) as u32);
1778        }
1779    }
1780
1781    /// Test EventWriter send_batch with iterator
1782    #[test]
1783    fn test_event_writer_send_batch_iterator() {
1784        #[derive(Debug, PartialEq)]
1785        struct TestEvent {
1786            value: usize,
1787        }
1788
1789        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1790
1791        {
1792            let mut writer = EventWriter::new(&mut queue);
1793            // Send using a range iterator
1794            writer.send_batch((0..10).map(|i| TestEvent { value: i }));
1795            assert_eq!(writer.len(), 10);
1796        }
1797
1798        queue.swap_buffers();
1799        let events: Vec<TestEvent> = queue.drain().collect();
1800        assert_eq!(events.len(), 10);
1801
1802        for (i, event) in events.iter().enumerate() {
1803            assert_eq!(event.value, i);
1804        }
1805    }
1806
1807    /// Test EventWriter exclusive access
1808    #[test]
1809    fn test_event_writer_exclusive_access() {
1810        #[derive(Debug)]
1811        struct TestEvent {
1812            id: u32,
1813        }
1814
1815        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1816
1817        // Writer takes mutable borrow
1818        let mut writer = EventWriter::new(&mut queue);
1819        writer.send(TestEvent { id: 1 });
1820
1821        // Can't access queue while writer exists (this is compile-time enforced)
1822        // After writer is dropped, queue is accessible again
1823        drop(writer);
1824
1825        // Now we can access the queue
1826        assert_eq!(queue.len(), 1);
1827    }
1828
1829    /// Test EventWriter with reader pattern
1830    #[test]
1831    fn test_event_writer_reader_integration() {
1832        #[derive(Debug, PartialEq)]
1833        struct TestEvent {
1834            msg: String,
1835        }
1836
1837        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1838
1839        // Write phase
1840        {
1841            let mut writer = EventWriter::new(&mut queue);
1842            writer.send(TestEvent {
1843                msg: "hello".to_string(),
1844            });
1845            writer.send(TestEvent {
1846                msg: "world".to_string(),
1847            });
1848        }
1849
1850        // Swap buffers
1851        queue.swap_buffers();
1852
1853        // Read phase
1854        {
1855            let mut reader = EventReader::new(&queue);
1856            let events: Vec<&TestEvent> = reader.read().collect();
1857
1858            assert_eq!(events.len(), 2);
1859            assert_eq!(events[0].msg, "hello");
1860            assert_eq!(events[1].msg, "world");
1861        }
1862    }
1863
1864    /// Test EventWriter empty batch
1865    #[test]
1866    fn test_event_writer_empty_batch() {
1867        #[derive(Debug)]
1868        struct TestEvent;
1869
1870        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1871
1872        {
1873            let mut writer = EventWriter::new(&mut queue);
1874            let empty: Vec<TestEvent> = vec![];
1875            writer.send_batch(empty);
1876
1877            assert!(writer.is_empty());
1878            assert_eq!(writer.len(), 0);
1879        }
1880
1881        queue.swap_buffers();
1882        assert_eq!(queue.read_len(), 0);
1883    }
1884
1885    /// Test EventWriter preserves order
1886    #[test]
1887    fn test_event_writer_preserves_order() {
1888        #[derive(Debug, PartialEq)]
1889        struct TestEvent {
1890            sequence: usize,
1891        }
1892
1893        let mut queue: EventQueue<TestEvent> = EventQueue::new();
1894
1895        {
1896            let mut writer = EventWriter::new(&mut queue);
1897            for i in 0..50 {
1898                writer.send(TestEvent { sequence: i });
1899            }
1900        }
1901
1902        queue.swap_buffers();
1903
1904        let mut reader = EventReader::new(&queue);
1905        let events: Vec<&TestEvent> = reader.read().collect();
1906
1907        assert_eq!(events.len(), 50);
1908        for (i, event) in events.iter().enumerate() {
1909            assert_eq!(event.sequence, i, "Order mismatch at index {}", i);
1910        }
1911    }
1912
1913    // =========================================================================
1914    // Events Resource Wrapper Tests
1915    // =========================================================================
1916
1917    /// Test Events resource creation
1918    #[test]
1919    fn test_events_new() {
1920        #[derive(Debug)]
1921        struct TestEvent {
1922            id: u32,
1923        }
1924
1925        let events: Events<TestEvent> = Events::new();
1926        assert!(events.is_empty());
1927        assert_eq!(events.len(), 0);
1928    }
1929
1930    /// Test Events resource default
1931    #[test]
1932    fn test_events_default() {
1933        #[derive(Debug)]
1934        struct TestEvent;
1935
1936        let events: Events<TestEvent> = Events::default();
1937        assert!(events.is_empty());
1938    }
1939
1940    /// Test Events send and read cycle
1941    #[test]
1942    fn test_events_send_read_cycle() {
1943        #[derive(Debug, PartialEq)]
1944        struct TestEvent {
1945            value: i32,
1946        }
1947
1948        let mut events: Events<TestEvent> = Events::new();
1949
1950        // Send events
1951        events.send(TestEvent { value: 10 });
1952        events.send(TestEvent { value: 20 });
1953        events.send(TestEvent { value: 30 });
1954
1955        assert_eq!(events.len(), 3);
1956
1957        // Call update to swap buffers
1958        events.update();
1959
1960        // Now read the events
1961        let mut reader = events.reader();
1962        let received: Vec<&TestEvent> = reader.read().collect();
1963
1964        assert_eq!(received.len(), 3);
1965        assert_eq!(received[0].value, 10);
1966        assert_eq!(received[1].value, 20);
1967        assert_eq!(received[2].value, 30);
1968    }
1969
1970    /// Test Events writer access
1971    #[test]
1972    fn test_events_writer() {
1973        #[derive(Debug, PartialEq)]
1974        struct TestEvent {
1975            msg: String,
1976        }
1977
1978        let mut events: Events<TestEvent> = Events::new();
1979
1980        {
1981            let mut writer = events.writer();
1982            writer.send(TestEvent {
1983                msg: "hello".to_string(),
1984            });
1985            writer.send(TestEvent {
1986                msg: "world".to_string(),
1987            });
1988        }
1989
1990        assert_eq!(events.len(), 2);
1991
1992        events.update();
1993
1994        let mut reader = events.reader();
1995        let received: Vec<_> = reader.read().collect();
1996        assert_eq!(received.len(), 2);
1997    }
1998
1999    /// Test Events update clears old events
2000    #[test]
2001    fn test_events_update_clears_old() {
2002        #[derive(Debug)]
2003        struct TestEvent {
2004            frame: u32,
2005        }
2006
2007        let mut events: Events<TestEvent> = Events::new();
2008
2009        // Frame 1: send event
2010        events.send(TestEvent { frame: 1 });
2011        events.update();
2012
2013        // Frame 2: read event from frame 1
2014        {
2015            let mut reader = events.reader();
2016            let count = reader.read().count();
2017            assert_eq!(count, 1);
2018        }
2019
2020        // Send new event in frame 2
2021        events.send(TestEvent { frame: 2 });
2022        events.update();
2023
2024        // Frame 3: should only see event from frame 2
2025        {
2026            let mut reader = events.reader();
2027            let received: Vec<_> = reader.read().collect();
2028            assert_eq!(received.len(), 1);
2029            assert_eq!(received[0].frame, 2);
2030        }
2031
2032        // No new events
2033        events.update();
2034
2035        // Frame 4: no events
2036        {
2037            let mut reader = events.reader();
2038            let count = reader.read().count();
2039            assert_eq!(count, 0);
2040        }
2041    }
2042
2043    /// Test Events send_batch
2044    #[test]
2045    fn test_events_send_batch() {
2046        #[derive(Debug, PartialEq, Clone)]
2047        struct TestEvent {
2048            id: u32,
2049        }
2050
2051        let mut events: Events<TestEvent> = Events::new();
2052
2053        let batch = vec![
2054            TestEvent { id: 1 },
2055            TestEvent { id: 2 },
2056            TestEvent { id: 3 },
2057        ];
2058        events.send_batch(batch);
2059
2060        assert_eq!(events.len(), 3);
2061
2062        events.update();
2063
2064        let mut reader = events.reader();
2065        let received: Vec<_> = reader.read().collect();
2066        assert_eq!(received.len(), 3);
2067    }
2068
2069    /// Test Events clear
2070    #[test]
2071    fn test_events_clear() {
2072        #[derive(Debug)]
2073        struct TestEvent;
2074
2075        let mut events: Events<TestEvent> = Events::new();
2076
2077        events.send(TestEvent);
2078        events.update();
2079        events.send(TestEvent);
2080
2081        events.clear();
2082
2083        assert!(events.is_empty());
2084
2085        let mut reader = events.reader();
2086        assert!(reader.read().next().is_none());
2087    }
2088
2089    /// Test Events is Send + Sync
2090    #[test]
2091    fn test_events_is_send_sync() {
2092        fn assert_send<T: Send>() {}
2093        fn assert_sync<T: Sync>() {}
2094
2095        #[derive(Debug)]
2096        struct TestEvent {
2097            data: i32,
2098        }
2099
2100        assert_send::<Events<TestEvent>>();
2101        assert_sync::<Events<TestEvent>>();
2102    }
2103
2104    /// Test Events drain for consuming events
2105    #[test]
2106    fn test_events_drain() {
2107        #[derive(Debug, PartialEq)]
2108        struct TestEvent {
2109            value: i32,
2110        }
2111
2112        let mut events: Events<TestEvent> = Events::new();
2113
2114        events.send(TestEvent { value: 1 });
2115        events.send(TestEvent { value: 2 });
2116        events.update();
2117
2118        // Drain consumes the events
2119        let drained: Vec<_> = events.drain().collect();
2120        assert_eq!(drained.len(), 2);
2121        assert_eq!(drained[0].value, 1);
2122        assert_eq!(drained[1].value, 2);
2123
2124        // Events are gone
2125        let mut reader = events.reader();
2126        assert!(reader.read().next().is_none());
2127    }
2128
2129    /// Test Events multiple readers independent
2130    #[test]
2131    fn test_events_multiple_readers() {
2132        #[derive(Debug, PartialEq)]
2133        struct TestEvent {
2134            id: u32,
2135        }
2136
2137        let mut events: Events<TestEvent> = Events::new();
2138        events.send(TestEvent { id: 1 });
2139        events.send(TestEvent { id: 2 });
2140        events.update();
2141
2142        // Create two readers
2143        let mut reader1 = events.reader();
2144        let mut reader2 = events.reader();
2145
2146        // Both see all events
2147        assert_eq!(reader1.read().count(), 2);
2148        assert_eq!(reader2.read().count(), 2);
2149    }
2150}