Skip to content

Commit 05b67f5

Browse files
committed
example tests for systems
1 parent 45b2db7 commit 05b67f5

File tree

2 files changed

+128
-0
lines changed

2 files changed

+128
-0
lines changed

examples/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ git checkout v0.4.0
4747
- [Reflection](#reflection)
4848
- [Scene](#scene)
4949
- [Shaders](#shaders)
50+
- [Tests](#tests)
5051
- [Tools](#tools)
5152
- [UI (User Interface)](#ui-user-interface)
5253
- [Window](#window)
@@ -195,6 +196,14 @@ Example | File | Description
195196
`shader_custom_material` | [`shader/shader_custom_material.rs`](./shader/shader_custom_material.rs) | Illustrates creating a custom material and a shader that uses it
196197
`shader_defs` | [`shader/shader_defs.rs`](./shader/shader_defs.rs) | Demonstrates creating a custom material that uses "shaders defs" (a tool to selectively toggle parts of a shader)
197198

199+
## Tests
200+
201+
Those are not in examples, but in the tests folder.
202+
203+
Example | File | Description
204+
--- | --- | ---
205+
`how_to_test_systems` | [`../tests/how_to_test_systems.rs`](../tests/how_to_test_systems.rs) | How to tests systems with commands, queries or resources
206+
198207
## Tools
199208

200209
Example | File | Description

tests/how_to_test_systems.rs

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
use std::collections::HashMap;
2+
3+
use bevy::{ecs::system::CommandQueue, prelude::*};
4+
5+
struct Enemy {
6+
hit_points: u32,
7+
}
8+
9+
struct CharacterTemplate {
10+
hit_points: HashMap<&'static str, u32>,
11+
}
12+
13+
fn despawn_dead_enemies(mut commands: Commands, enemies: Query<(Entity, &Enemy)>) {
14+
for (entity, enemy) in enemies.iter() {
15+
if enemy.hit_points == 0 {
16+
commands.despawn_recursive(entity);
17+
}
18+
}
19+
}
20+
21+
fn hurt_enemies(mut enemies: Query<&mut Enemy>) {
22+
for mut enemy in enemies.iter_mut() {
23+
enemy.hit_points -= 1;
24+
}
25+
}
26+
27+
fn spawn_enemy(mut commands: Commands, character_template: Res<CharacterTemplate>) {
28+
commands.spawn((Enemy {
29+
hit_points: *character_template.hit_points.get("enemy").unwrap(),
30+
},));
31+
}
32+
33+
#[test]
34+
fn did_hurt_ennemy() {
35+
// Setup world and commands
36+
let mut world = World::default();
37+
let mut queue = CommandQueue::default();
38+
let mut commands = Commands::new(&mut queue, &world);
39+
40+
// Setup stage with our two systems
41+
let mut update_stage = SystemStage::parallel();
42+
update_stage.add_system(hurt_enemies.system().before("death"));
43+
update_stage.add_system(despawn_dead_enemies.system().label("death"));
44+
let mut schedule = Schedule::default();
45+
schedule.add_stage("update", update_stage);
46+
47+
// Setup test entities
48+
let ennemy_id = commands
49+
.spawn((Enemy { hit_points: 5 },))
50+
.current_entity()
51+
.unwrap();
52+
queue.apply(&mut world);
53+
54+
// Run systems
55+
schedule.run(&mut world);
56+
57+
// Check resulting changes
58+
assert!(world.get::<Enemy>(ennemy_id).is_some());
59+
assert_eq!(world.get::<Enemy>(ennemy_id).unwrap().hit_points, 4);
60+
}
61+
62+
#[test]
63+
fn did_despawn_ennemy() {
64+
// Setup world and commands
65+
let mut world = World::default();
66+
let mut queue = CommandQueue::default();
67+
let mut commands = Commands::new(&mut queue, &world);
68+
69+
// Setup stage with our two systems
70+
let mut update_stage = SystemStage::parallel();
71+
update_stage.add_system(hurt_enemies.system().before("death"));
72+
update_stage.add_system(despawn_dead_enemies.system().label("death"));
73+
let mut schedule = Schedule::default();
74+
schedule.add_stage("update", update_stage);
75+
76+
// Setup test entities
77+
let ennemy_id = commands
78+
.spawn((Enemy { hit_points: 1 },))
79+
.current_entity()
80+
.unwrap();
81+
queue.apply(&mut world);
82+
83+
// Run systems
84+
schedule.run(&mut world);
85+
86+
// Check resulting changes
87+
assert!(world.get::<Enemy>(ennemy_id).is_none());
88+
}
89+
90+
#[test]
91+
fn spawned_from_resource() {
92+
// Setup world and commands
93+
let mut world = World::default();
94+
let mut queue = CommandQueue::default();
95+
let mut commands = Commands::new(&mut queue, &world);
96+
97+
// Setup stage with a system
98+
let mut update_stage = SystemStage::parallel();
99+
update_stage.add_system(spawn_enemy.system());
100+
let mut schedule = Schedule::default();
101+
schedule.add_stage("update", update_stage);
102+
103+
// Setup test resource
104+
let mut hit_points = HashMap::new();
105+
hit_points.insert("enemy", 25);
106+
commands.insert_resource(CharacterTemplate { hit_points });
107+
queue.apply(&mut world);
108+
109+
// Run systems
110+
schedule.run(&mut world);
111+
112+
// Check resulting changes
113+
let mut query = world.query::<&Enemy>();
114+
let results = query
115+
.iter(&world)
116+
.map(|enemy| enemy.hit_points)
117+
.collect::<Vec<_>>();
118+
assert_eq!(results, vec![25]);
119+
}

0 commit comments

Comments
 (0)