Skip to content

Commit c623cc4

Browse files
Fix Events::<drain/clear> bug
Co-authored-by: Alice Cecile <[email protected]>
1 parent d4ffa3f commit c623cc4

File tree

1 file changed

+52
-2
lines changed

1 file changed

+52
-2
lines changed

crates/bevy_ecs/src/event.rs

+52-2
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,14 @@ fn map_instance_event<T>(event_instance: &EventInstance<T>) -> &T {
150150
}
151151

152152
/// Reads events of type `T` in order and tracks which events have already been read.
153-
#[derive(SystemParam)]
153+
#[derive(SystemParam, Debug)]
154154
pub struct EventReader<'a, T: Component> {
155155
last_event_count: Local<'a, (usize, PhantomData<T>)>,
156156
events: Res<'a, Events<T>>,
157157
}
158158

159159
/// Sends events of type `T`.
160-
#[derive(SystemParam)]
160+
#[derive(SystemParam, Debug)]
161161
pub struct EventWriter<'a, T: Component> {
162162
events: ResMut<'a, Events<T>>,
163163
}
@@ -172,6 +172,7 @@ impl<'a, T: Component> EventWriter<'a, T> {
172172
}
173173
}
174174

175+
#[derive(Debug)]
175176
pub struct ManualEventReader<T> {
176177
last_event_count: usize,
177178
_marker: PhantomData<T>,
@@ -328,14 +329,25 @@ impl<T: Component> Events<T> {
328329
events.update();
329330
}
330331

332+
#[inline]
333+
fn increment_start_event_count(&mut self) {
334+
let count = self.event_count + 1;
335+
self.a_start_event_count = count;
336+
self.b_start_event_count = count;
337+
}
338+
331339
/// Removes all events.
340+
#[inline]
332341
pub fn clear(&mut self) {
342+
self.increment_start_event_count();
333343
self.events_a.clear();
334344
self.events_b.clear();
335345
}
336346

337347
/// Creates a draining iterator that removes all events.
338348
pub fn drain(&mut self) -> impl Iterator<Item = T> + '_ {
349+
self.increment_start_event_count();
350+
339351
let map = |i: EventInstance<T>| i.event;
340352
match self.state {
341353
State::A => self
@@ -376,6 +388,8 @@ impl<T: Component> Events<T> {
376388

377389
#[cfg(test)]
378390
mod tests {
391+
use bevy_utils::tracing::event;
392+
379393
use super::*;
380394

381395
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
@@ -480,4 +494,40 @@ mod tests {
480494
) -> Vec<TestEvent> {
481495
reader.iter(events).cloned().collect::<Vec<TestEvent>>()
482496
}
497+
498+
#[derive(PartialEq, Eq, Debug)]
499+
struct E(usize);
500+
501+
fn events_clear_and_read_impl(clear_func: impl FnOnce(&mut Events<E>)) {
502+
let mut events = Events::<E>::default();
503+
let mut reader = events.get_reader();
504+
505+
assert!(reader.iter(&events).next().is_none());
506+
507+
events.send(E(0));
508+
assert_eq!(*reader.iter(&events).next().unwrap(), E(0));
509+
assert_eq!(reader.iter(&events).next(), None);
510+
511+
events.send(E(1));
512+
clear_func(&mut events);
513+
assert!(reader.iter(&events).next().is_none());
514+
515+
events.send(E(2));
516+
events.update();
517+
events.send(E(3));
518+
519+
assert!(reader.iter(&events).eq([E(2), E(3)].iter()));
520+
}
521+
522+
#[test]
523+
fn test_events_clear_and_read() {
524+
events_clear_and_read_impl(|events| events.clear());
525+
}
526+
527+
#[test]
528+
fn test_events_drain_and_read() {
529+
events_clear_and_read_impl(|events| {
530+
assert!(events.drain().eq(vec![E(0), E(1)].into_iter()));
531+
});
532+
}
483533
}

0 commit comments

Comments
 (0)