Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/tests/how_to_test_systems.rs
6589 views
1
#![expect(missing_docs, reason = "Not all docs are written yet, see #3492.")]
2
use bevy::prelude::*;
3
4
#[derive(Component, Default)]
5
struct Enemy {
6
hit_points: u32,
7
score_value: u32,
8
}
9
10
#[derive(BufferedEvent)]
11
struct EnemyDied(u32);
12
13
#[derive(Resource)]
14
struct Score(u32);
15
16
fn update_score(mut dead_enemies: EventReader<EnemyDied>, mut score: ResMut<Score>) {
17
for value in dead_enemies.read() {
18
score.0 += value.0;
19
}
20
}
21
22
fn despawn_dead_enemies(
23
mut commands: Commands,
24
mut dead_enemies: EventWriter<EnemyDied>,
25
enemies: Query<(Entity, &Enemy)>,
26
) {
27
for (entity, enemy) in &enemies {
28
if enemy.hit_points == 0 {
29
commands.entity(entity).despawn();
30
dead_enemies.write(EnemyDied(enemy.score_value));
31
}
32
}
33
}
34
35
fn hurt_enemies(mut enemies: Query<&mut Enemy>) {
36
for mut enemy in &mut enemies {
37
enemy.hit_points -= 1;
38
}
39
}
40
41
fn spawn_enemy(mut commands: Commands, keyboard_input: Res<ButtonInput<KeyCode>>) {
42
if keyboard_input.just_pressed(KeyCode::Space) {
43
commands.spawn(Enemy {
44
hit_points: 5,
45
score_value: 3,
46
});
47
}
48
}
49
50
#[test]
51
fn did_hurt_enemy() {
52
// Setup app
53
let mut app = App::new();
54
55
// Add Score resource
56
app.insert_resource(Score(0));
57
58
// Add `EnemyDied` event
59
app.add_event::<EnemyDied>();
60
61
// Add our two systems
62
app.add_systems(Update, (hurt_enemies, despawn_dead_enemies).chain());
63
64
// Setup test entities
65
let enemy_id = app
66
.world_mut()
67
.spawn(Enemy {
68
hit_points: 5,
69
score_value: 3,
70
})
71
.id();
72
73
// Run systems
74
app.update();
75
76
// Check resulting changes
77
assert!(app.world().get::<Enemy>(enemy_id).is_some());
78
assert_eq!(app.world().get::<Enemy>(enemy_id).unwrap().hit_points, 4);
79
}
80
81
#[test]
82
fn did_despawn_enemy() {
83
// Setup app
84
let mut app = App::new();
85
86
// Add Score resource
87
app.insert_resource(Score(0));
88
89
// Add `EnemyDied` event
90
app.add_event::<EnemyDied>();
91
92
// Add our two systems
93
app.add_systems(Update, (hurt_enemies, despawn_dead_enemies).chain());
94
95
// Setup test entities
96
let enemy_id = app
97
.world_mut()
98
.spawn(Enemy {
99
hit_points: 1,
100
score_value: 1,
101
})
102
.id();
103
104
// Run systems
105
app.update();
106
107
// Check enemy was despawned
108
assert!(app.world().get::<Enemy>(enemy_id).is_none());
109
110
// Get `EnemyDied` event reader
111
let enemy_died_events = app.world().resource::<Events<EnemyDied>>();
112
let mut enemy_died_reader = enemy_died_events.get_cursor();
113
let enemy_died = enemy_died_reader.read(enemy_died_events).next().unwrap();
114
115
// Check the event has been sent
116
assert_eq!(enemy_died.0, 1);
117
}
118
119
#[test]
120
fn spawn_enemy_using_input_resource() {
121
// Setup app
122
let mut app = App::new();
123
124
// Add our systems
125
app.add_systems(Update, spawn_enemy);
126
127
// Setup test resource
128
let mut input = ButtonInput::<KeyCode>::default();
129
input.press(KeyCode::Space);
130
app.insert_resource(input);
131
132
// Run systems
133
app.update();
134
135
// Check resulting changes, one entity has been spawned with `Enemy` component
136
assert_eq!(app.world_mut().query::<&Enemy>().iter(app.world()).len(), 1);
137
138
// Clear the `just_pressed` status for all `KeyCode`s
139
app.world_mut()
140
.resource_mut::<ButtonInput<KeyCode>>()
141
.clear();
142
143
// Run systems
144
app.update();
145
146
// Check resulting changes, no new entity has been spawned
147
assert_eq!(app.world_mut().query::<&Enemy>().iter(app.world()).len(), 1);
148
}
149
150
#[test]
151
fn update_score_on_event() {
152
// Setup app
153
let mut app = App::new();
154
155
// Add Score resource
156
app.insert_resource(Score(0));
157
158
// Add `EnemyDied` event
159
app.add_event::<EnemyDied>();
160
161
// Add our systems
162
app.add_systems(Update, update_score);
163
164
// Write an `EnemyDied` event
165
app.world_mut()
166
.resource_mut::<Events<EnemyDied>>()
167
.write(EnemyDied(3));
168
169
// Run systems
170
app.update();
171
172
// Check resulting changes
173
assert_eq!(app.world().resource::<Score>().0, 3);
174
}
175
176