Skip to content

Commit

Permalink
conflicting system order ambiguity test
Browse files Browse the repository at this point in the history
  • Loading branch information
Vrixyz committed Dec 9, 2024
1 parent 6950734 commit 080fe5a
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 1 deletion.
2 changes: 2 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ jobs:
run: cargo test --verbose -p bevy_rapier2d
- name: Test for bevy_rapier3d
run: cargo test --verbose -p bevy_rapier3d
- name: Test for no conflicting system order ambiguity
run: cargo run --bin ambiguity_detection
test-wasm:
runs-on: ubuntu-latest
env:
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[workspace]
members = ["bevy_rapier2d", "bevy_rapier3d", "bevy_rapier_benches3d"]
members = ["bevy_rapier2d", "bevy_rapier3d", "bevy_rapier_benches3d", "ci"]
resolver = "2"

[profile.dev]
Expand Down
15 changes: 15 additions & 0 deletions ci/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[package]
name = "ci"
version = "0.1.0"
edition = "2021"

[dependencies]
bevy = "0.15.0"
bevy_audio = "0.15.0"
bevy_rapier3d = { path = "../bevy_rapier3d" }
bevy_rapier2d = { path = "../bevy_rapier2d" }

[[bin]]
name = "ambiguity_detection"
test = false
bench = false
77 changes: 77 additions & 0 deletions ci/src/bin/ambiguity_detection.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
//! A test to confirm that `bevy` doesn't regress its system ambiguities count when using [`DefaultPlugins`].
//! This is run in CI.
//!
//! Note that because this test requires rendering, it isn't actually an integration test!
//! Instead, it's secretly an example: you can run this test manually using `cargo run --example ambiguity_detection`.
use bevy::{
ecs::schedule::{InternedScheduleLabel, LogLevel, ScheduleBuildSettings},
log::LogPlugin,
prelude::*,
utils::HashMap,
};
use bevy_rapier2d::plugin::NoUserData;
use bevy_rapier3d::plugin::RapierPhysicsPlugin;

fn main() {
check_ambiguities(RapierPhysicsPlugin::<NoUserData>::default(), true);
check_ambiguities(
RapierPhysicsPlugin::<NoUserData>::default().in_fixed_schedule(),
false,
);
}

fn check_ambiguities(plugin: RapierPhysicsPlugin, set_logger: bool) {
let mut app = App::new();
app.add_plugins((MinimalPlugins, TransformPlugin, AssetPlugin::default()));
if set_logger {
app.add_plugins(LogPlugin::default());
}
app.add_plugins(plugin);

let main_app = app.main_mut();
configure_ambiguity_detection(main_app);

app.finish();
app.cleanup();
app.update();

let main_app_ambiguities = count_ambiguities(app.main());
assert_eq!(
main_app_ambiguities.total(),
0,
"Main app has unexpected ambiguities among the following schedules: \n{main_app_ambiguities:#?}.",
);
}

/// Contains the number of conflicting systems per schedule.
#[derive(Debug, Deref, DerefMut)]
struct AmbiguitiesCount(pub HashMap<InternedScheduleLabel, usize>);

impl AmbiguitiesCount {
fn total(&self) -> usize {
self.values().sum()
}
}

fn configure_ambiguity_detection(sub_app: &mut SubApp) {
let mut schedules = sub_app.world_mut().resource_mut::<Schedules>();
for (_, schedule) in schedules.iter_mut() {
schedule.set_build_settings(ScheduleBuildSettings {
ambiguity_detection: LogLevel::Ignore,
use_shortnames: false,
..default()
});
}
}

/// Returns the number of conflicting systems per schedule.
fn count_ambiguities(sub_app: &SubApp) -> AmbiguitiesCount {
let schedules = sub_app.world().resource::<Schedules>();
let mut ambiguities = HashMap::new();
for (_, schedule) in schedules.iter() {
let ambiguities_in_schedule = schedule.graph().conflicting_systems().len();
ambiguities.insert(schedule.label(), ambiguities_in_schedule);
}
AmbiguitiesCount(ambiguities)
}

0 comments on commit 080fe5a

Please sign in to comment.