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}