Skip to content

Commit 8b1abbb

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

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

crates/bevy_ecs/src/event.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,14 +328,25 @@ impl<T: Component> Events<T> {
328328
events.update();
329329
}
330330

331+
#[inline]
332+
fn increment_start_event_count(&mut self) {
333+
let count = self.event_count + 1;
334+
self.a_start_event_count = count;
335+
self.b_start_event_count = count;
336+
}
337+
331338
/// Removes all events.
339+
#[inline]
332340
pub fn clear(&mut self) {
341+
self.increment_start_event_count();
333342
self.events_a.clear();
334343
self.events_b.clear();
335344
}
336345

337346
/// Creates a draining iterator that removes all events.
338347
pub fn drain(&mut self) -> impl Iterator<Item = T> + '_ {
348+
self.increment_start_event_count();
349+
339350
let map = |i: EventInstance<T>| i.event;
340351
match self.state {
341352
State::A => self
@@ -480,4 +491,40 @@ mod tests {
480491
) -> Vec<TestEvent> {
481492
reader.iter(events).cloned().collect::<Vec<TestEvent>>()
482493
}
494+
495+
#[derive(PartialEq, Eq, Debug)]
496+
struct E(usize);
497+
498+
fn events_clear_and_read_impl(clear_func: impl FnOnce(&mut Events<E>)) {
499+
let mut events = Events::<E>::default();
500+
let mut reader = events.get_reader();
501+
502+
assert!(reader.iter(&events).next().is_none());
503+
504+
events.send(E(0));
505+
assert_eq!(*reader.iter(&events).next().unwrap(), E(0));
506+
assert_eq!(reader.iter(&events).next(), None);
507+
508+
events.send(E(1));
509+
clear_func(&mut events);
510+
assert!(reader.iter(&events).next().is_none());
511+
512+
events.send(E(2));
513+
events.update();
514+
events.send(E(3));
515+
516+
assert!(reader.iter(&events).eq([E(2), E(3)].iter()));
517+
}
518+
519+
#[test]
520+
fn test_events_clear_and_read() {
521+
events_clear_and_read_impl(|events| events.clear());
522+
}
523+
524+
#[test]
525+
fn test_events_drain_and_read() {
526+
events_clear_and_read_impl(|events| {
527+
assert!(events.drain().eq(vec![E(0), E(1)].into_iter()));
528+
});
529+
}
483530
}

0 commit comments

Comments
 (0)