Skip to content

Commit 2ba758e

Browse files
authored
Simplify UI tests (#20512)
# Objective Simplify UI tests by replacing `camera_system` in the test schedule. Should remove the need for the `bevy_render` dependency in #20502. ## Solution New `update_cameras_test_system` system that updates each `Camera`'s render target info directly for UI tests without needing the extra dependencies and resource inits. ## Testing Run the tests.
1 parent ed13d9b commit 2ba758e

File tree

2 files changed

+45
-71
lines changed

2 files changed

+45
-71
lines changed

crates/bevy_ui/src/layout/mod.rs

Lines changed: 9 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -352,29 +352,21 @@ pub fn ui_layout_system(
352352

353353
#[cfg(test)]
354354
mod tests {
355+
use crate::update::update_cameras_test_system;
356+
use crate::{
357+
layout::ui_surface::UiSurface, prelude::*, ui_layout_system,
358+
update::propagate_ui_target_cameras, ContentSize, LayoutContext,
359+
};
355360
use bevy_app::{App, HierarchyPropagatePlugin, PostUpdate, PropagateSet};
356-
use taffy::TraversePartialTree;
357-
358-
use bevy_asset::{AssetEvent, Assets};
359361
use bevy_camera::{Camera, Camera2d};
360362
use bevy_ecs::{prelude::*, system::RunSystemOnce};
361-
use bevy_image::Image;
362363
use bevy_math::{Rect, UVec2, Vec2};
363364
use bevy_platform::collections::HashMap;
364-
use bevy_render::texture::ManualTextureViews;
365365
use bevy_transform::systems::mark_dirty_trees;
366366
use bevy_transform::systems::{propagate_parent_transforms, sync_simple_transforms};
367367
use bevy_utils::prelude::default;
368-
use bevy_window::{
369-
PrimaryWindow, Window, WindowCreated, WindowResized, WindowResolution,
370-
WindowScaleFactorChanged,
371-
};
372-
//use uuid::timestamp::UUID_TICKS_BETWEEN_EPOCHS;
373-
374-
use crate::{
375-
layout::ui_surface::UiSurface, prelude::*, ui_layout_system,
376-
update::propagate_ui_target_cameras, ContentSize, LayoutContext,
377-
};
368+
use bevy_window::{PrimaryWindow, Window, WindowResolution};
369+
use taffy::TraversePartialTree;
378370

379371
// these window dimensions are easy to convert to and from percentage values
380372
const WINDOW_WIDTH: f32 = 1000.;
@@ -388,22 +380,14 @@ mod tests {
388380
));
389381
app.init_resource::<UiScale>();
390382
app.init_resource::<UiSurface>();
391-
app.init_resource::<Events<WindowScaleFactorChanged>>();
392-
app.init_resource::<Events<WindowResized>>();
393-
// Required for the camera system
394-
app.init_resource::<Events<WindowCreated>>();
395-
app.init_resource::<Events<AssetEvent<Image>>>();
396-
app.init_resource::<Assets<Image>>();
397-
app.init_resource::<ManualTextureViews>();
398383
app.init_resource::<bevy_text::TextPipeline>();
399384
app.init_resource::<bevy_text::CosmicFontSystem>();
400385
app.init_resource::<bevy_text::SwashCache>();
401386

402387
app.add_systems(
403388
PostUpdate,
404389
(
405-
// UI is driven by calculated camera target info, so we need to run the camera system first
406-
bevy_render::camera::camera_system,
390+
update_cameras_test_system,
407391
propagate_ui_target_cameras,
408392
ApplyDeferred,
409393
ui_layout_system,
@@ -1064,14 +1048,7 @@ mod tests {
10641048

10651049
app.add_systems(
10661050
PostUpdate,
1067-
(
1068-
// UI is driven by calculated camera target info, so we need to run the camera system first
1069-
bevy_render::camera::camera_system,
1070-
propagate_ui_target_cameras,
1071-
ApplyDeferred,
1072-
ui_layout_system,
1073-
)
1074-
.chain(),
1051+
(propagate_ui_target_cameras, ApplyDeferred, ui_layout_system).chain(),
10751052
);
10761053

10771054
app.add_plugins(HierarchyPropagatePlugin::<ComputedUiTargetCamera>::new(
@@ -1088,29 +1065,13 @@ mod tests {
10881065
let world = app.world_mut();
10891066
world.init_resource::<UiScale>();
10901067
world.init_resource::<UiSurface>();
1091-
world.init_resource::<Events<WindowScaleFactorChanged>>();
1092-
world.init_resource::<Events<WindowResized>>();
1093-
// Required for the camera system
1094-
world.init_resource::<Events<WindowCreated>>();
1095-
world.init_resource::<Events<AssetEvent<Image>>>();
1096-
world.init_resource::<Assets<Image>>();
1097-
world.init_resource::<ManualTextureViews>();
10981068

10991069
world.init_resource::<bevy_text::TextPipeline>();
11001070

11011071
world.init_resource::<bevy_text::CosmicFontSystem>();
11021072

11031073
world.init_resource::<bevy_text::SwashCache>();
11041074

1105-
// spawn a dummy primary window and camera
1106-
world.spawn((
1107-
Window {
1108-
resolution: WindowResolution::new(WINDOW_WIDTH, WINDOW_HEIGHT),
1109-
..default()
1110-
},
1111-
PrimaryWindow,
1112-
));
1113-
11141075
let ui_root = world
11151076
.spawn(Node {
11161077
width: Val::Percent(100.),

crates/bevy_ui/src/update.rs

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -172,51 +172,64 @@ pub fn propagate_ui_target_cameras(
172172
}
173173
}
174174

175+
/// Update each `Camera`'s `RenderTargetInfo` from its associated `Window` render target.
176+
/// Cameras with non-window render targets are ignored.
177+
#[cfg(test)]
178+
pub(crate) fn update_cameras_test_system(
179+
primary_window: Query<Entity, bevy_ecs::query::With<bevy_window::PrimaryWindow>>,
180+
window_query: Query<&bevy_window::Window>,
181+
mut camera_query: Query<&mut Camera>,
182+
) {
183+
let primary_window = primary_window.single().ok();
184+
for mut camera in camera_query.iter_mut() {
185+
let Some(camera_target) = camera.target.normalize(primary_window) else {
186+
continue;
187+
};
188+
let bevy_camera::NormalizedRenderTarget::Window(window_ref) = camera_target else {
189+
continue;
190+
};
191+
let Ok(window) = window_query.get(bevy_ecs::entity::ContainsEntity::entity(&window_ref))
192+
else {
193+
continue;
194+
};
195+
196+
let render_target_info = bevy_camera::RenderTargetInfo {
197+
physical_size: window.physical_size(),
198+
scale_factor: window.scale_factor(),
199+
};
200+
camera.computed.target_info = Some(render_target_info);
201+
}
202+
}
203+
175204
#[cfg(test)]
176205
mod tests {
206+
use crate::update::propagate_ui_target_cameras;
207+
use crate::ComputedUiTargetCamera;
208+
use crate::IsDefaultUiCamera;
209+
use crate::Node;
210+
use crate::UiScale;
211+
use crate::UiTargetCamera;
177212
use bevy_app::App;
178213
use bevy_app::HierarchyPropagatePlugin;
179214
use bevy_app::PostUpdate;
180215
use bevy_app::PropagateSet;
181-
use bevy_asset::AssetEvent;
182-
use bevy_asset::Assets;
183216
use bevy_camera::Camera;
184217
use bevy_camera::Camera2d;
185218
use bevy_camera::RenderTarget;
186-
use bevy_ecs::event::Events;
187219
use bevy_ecs::hierarchy::ChildOf;
188220
use bevy_ecs::schedule::IntoScheduleConfigs;
189-
use bevy_image::Image;
190221
use bevy_math::UVec2;
191-
use bevy_render::texture::ManualTextureViews;
192222
use bevy_utils::default;
193223
use bevy_window::PrimaryWindow;
194224
use bevy_window::Window;
195-
use bevy_window::WindowCreated;
196225
use bevy_window::WindowRef;
197-
use bevy_window::WindowResized;
198226
use bevy_window::WindowResolution;
199-
use bevy_window::WindowScaleFactorChanged;
200-
201-
use crate::update::propagate_ui_target_cameras;
202-
use crate::ComputedUiTargetCamera;
203-
use crate::IsDefaultUiCamera;
204-
use crate::Node;
205-
use crate::UiScale;
206-
use crate::UiTargetCamera;
207227

208228
fn setup_test_app() -> App {
209229
let mut app = App::new();
210230

211231
app.init_resource::<UiScale>();
212232

213-
// init resources required by `camera_system`
214-
app.init_resource::<Events<WindowScaleFactorChanged>>();
215-
app.init_resource::<Events<WindowResized>>();
216-
app.init_resource::<Events<WindowCreated>>();
217-
app.init_resource::<Events<AssetEvent<Image>>>();
218-
app.init_resource::<Assets<Image>>();
219-
app.init_resource::<ManualTextureViews>();
220233
app.add_plugins(HierarchyPropagatePlugin::<ComputedUiTargetCamera>::new(
221234
PostUpdate,
222235
));
@@ -229,7 +242,7 @@ mod tests {
229242
app.add_systems(
230243
bevy_app::Update,
231244
(
232-
bevy_render::camera::camera_system,
245+
super::update_cameras_test_system,
233246
propagate_ui_target_cameras,
234247
)
235248
.chain(),

0 commit comments

Comments
 (0)