Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions benches/benches/bevy_ecs/scheduling/run_condition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ pub fn run_condition_no(criterion: &mut Criterion) {
group.finish();
}

#[derive(Component, Resource)]
#[derive(Component)]
struct TestBool(pub bool);

pub fn run_condition_yes_with_query(criterion: &mut Criterion) {
Expand Down Expand Up @@ -86,14 +86,17 @@ pub fn run_condition_yes_with_query(criterion: &mut Criterion) {
group.finish();
}

#[derive(Resource)]
struct TestResource(pub bool);

pub fn run_condition_yes_with_resource(criterion: &mut Criterion) {
let mut world = World::new();
world.insert_resource(TestBool(true));
world.insert_resource(TestResource(true));
let mut group = criterion.benchmark_group("run_condition/yes_using_resource");
group.warm_up_time(core::time::Duration::from_millis(500));
group.measurement_time(core::time::Duration::from_secs(3));
fn empty() {}
fn yes_with_resource(res: Res<TestBool>) -> bool {
fn yes_with_resource(res: Res<TestResource>) -> bool {
res.0
}
for amount in [10, 100, 1_000] {
Expand Down
26 changes: 14 additions & 12 deletions crates/bevy_ecs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,10 @@ mod tests {
};
use std::sync::Mutex;

#[derive(Component, Resource, Debug, PartialEq, Eq, Hash, Clone, Copy)]
#[derive(Component, Debug, PartialEq, Eq, Hash, Clone, Copy)]
struct A(usize);
#[derive(Resource, Debug, PartialEq, Eq)]
struct ResA(usize);
#[derive(Component, Debug, PartialEq, Eq, Hash, Clone, Copy)]
struct B(usize);
#[derive(Component, Debug, PartialEq, Eq, Clone, Copy)]
Expand Down Expand Up @@ -1421,10 +1423,10 @@ mod tests {
#[test]
fn non_send_resource_points_to_distinct_data() {
let mut world = World::default();
world.insert_resource(A(123));
world.insert_non_send_resource(A(456));
assert_eq!(*world.resource::<A>(), A(123));
assert_eq!(*world.non_send_resource::<A>(), A(456));
world.insert_resource(ResA(123));
world.insert_non_send_resource(ResA(456));
assert_eq!(*world.resource::<ResA>(), ResA(123));
assert_eq!(*world.non_send_resource::<ResA>(), ResA(456));
}

#[test]
Expand Down Expand Up @@ -1570,13 +1572,13 @@ mod tests {
#[test]
fn resource_scope() {
let mut world = World::default();
assert!(world.try_resource_scope::<A, _>(|_, _| {}).is_none());
world.insert_resource(A(0));
world.resource_scope(|world: &mut World, mut value: Mut<A>| {
assert!(world.try_resource_scope::<ResA, _>(|_, _| {}).is_none());
world.insert_resource(ResA(0));
world.resource_scope(|world: &mut World, mut value: Mut<ResA>| {
value.0 += 1;
assert!(!world.contains_resource::<A>());
assert!(!world.contains_resource::<ResA>());
});
assert_eq!(world.resource::<A>().0, 1);
assert_eq!(world.resource::<ResA>().0, 1);
}

#[test]
Expand Down Expand Up @@ -1636,7 +1638,7 @@ mod tests {
fn clear_entities() {
let mut world = World::default();

world.insert_resource(A(0));
world.insert_resource(ResA(0));
world.spawn(A(1));
world.spawn(SparseStored(1));

Expand Down Expand Up @@ -1666,7 +1668,7 @@ mod tests {
"world should not have any entities"
);
assert_eq!(
world.resource::<A>().0,
world.resource::<ResA>().0,
0,
"world should still contain resources"
);
Expand Down
18 changes: 0 additions & 18 deletions crates/bevy_ecs/src/schedule/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -795,9 +795,6 @@ mod tests {
#[derive(Message)]
struct E;

#[derive(Resource, Component)]
struct RC;

fn empty_system() {}
fn res_system(_res: Res<R>) {}
fn resmut_system(_res: ResMut<R>) {}
Expand Down Expand Up @@ -957,21 +954,6 @@ mod tests {
assert_eq!(schedule.graph().conflicting_systems().len(), 3);
}

/// Test that when a struct is both a Resource and a Component, they do not
/// conflict with each other.
#[test]
fn shared_resource_mut_component() {
let mut world = World::new();
world.insert_resource(RC);

let mut schedule = Schedule::default();
schedule.add_systems((|_: ResMut<RC>| {}, |_: Query<&mut RC>| {}));

let _ = schedule.initialize(&mut world);

assert_eq!(schedule.graph().conflicting_systems().len(), 0);
}

#[test]
fn resource_mut_and_entity_ref() {
let mut world = World::new();
Expand Down
31 changes: 17 additions & 14 deletions crates/bevy_ecs/src/system/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2477,16 +2477,19 @@ mod tests {
}
}

#[derive(Component, Resource)]
#[derive(Component)]
struct W<T>(T);

#[derive(Resource)]
struct V<T>(T);

fn simple_command(world: &mut World) {
world.spawn((W(0u32), W(42u64)));
}

impl FromWorld for W<String> {
fn from_world(world: &mut World) -> Self {
let v = world.resource::<W<usize>>();
let v = world.resource::<V<usize>>();
Self("*".repeat(v.0))
}
}
Expand Down Expand Up @@ -2527,7 +2530,7 @@ mod tests {
.or_insert(W(42));
queue.apply(&mut world);
assert_eq!(42, world.get::<W<u64>>(entity).unwrap().0);
world.insert_resource(W(5_usize));
world.insert_resource(V(5_usize));
let mut commands = Commands::new(&mut queue, &world);
commands.entity(entity).entry::<W<String>>().or_from_world();
queue.apply(&mut world);
Expand Down Expand Up @@ -2744,22 +2747,22 @@ mod tests {
let mut queue = CommandQueue::default();
{
let mut commands = Commands::new(&mut queue, &world);
commands.insert_resource(W(123i32));
commands.insert_resource(W(456.0f64));
commands.insert_resource(V(123i32));
commands.insert_resource(V(456.0f64));
}

queue.apply(&mut world);
assert!(world.contains_resource::<W<i32>>());
assert!(world.contains_resource::<W<f64>>());
assert!(world.contains_resource::<V<i32>>());
assert!(world.contains_resource::<V<f64>>());

{
let mut commands = Commands::new(&mut queue, &world);
// test resource removal
commands.remove_resource::<W<i32>>();
commands.remove_resource::<V<i32>>();
}
queue.apply(&mut world);
assert!(!world.contains_resource::<W<i32>>());
assert!(world.contains_resource::<W<f64>>());
assert!(!world.contains_resource::<V<i32>>());
assert!(world.contains_resource::<V<f64>>());
}

#[test]
Expand Down Expand Up @@ -2832,17 +2835,17 @@ mod tests {
let mut queue_1 = CommandQueue::default();
{
let mut commands = Commands::new(&mut queue_1, &world);
commands.insert_resource(W(123i32));
commands.insert_resource(V(123i32));
}
let mut queue_2 = CommandQueue::default();
{
let mut commands = Commands::new(&mut queue_2, &world);
commands.insert_resource(W(456.0f64));
commands.insert_resource(V(456.0f64));
}
queue_1.append(&mut queue_2);
queue_1.apply(&mut world);
assert!(world.contains_resource::<W<i32>>());
assert!(world.contains_resource::<W<f64>>());
assert!(world.contains_resource::<V<i32>>());
assert!(world.contains_resource::<V<f64>>());
}

#[test]
Expand Down
71 changes: 44 additions & 27 deletions crates/bevy_ecs/src/system/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -432,19 +432,32 @@ mod tests {
No,
}

#[derive(Component, Resource, Debug, Eq, PartialEq, Default)]
#[derive(Component, Debug, Eq, PartialEq, Default)]
struct A;
#[derive(Component, Resource)]
#[derive(Component)]
struct B;
#[derive(Component, Resource)]
#[derive(Component)]
struct C;
#[derive(Component, Resource)]
#[derive(Component)]
struct D;
#[derive(Component, Resource)]
#[derive(Component)]
struct E;
#[derive(Component, Resource)]
#[derive(Component)]
struct F;

#[derive(Resource)]
struct ResA;
#[derive(Resource)]
struct ResB;
#[derive(Resource)]
struct ResC;
#[derive(Resource)]
struct ResD;
#[derive(Resource)]
struct ResE;
#[derive(Resource)]
struct ResF;

#[derive(Component, Debug)]
struct W<T>(T);

Expand Down Expand Up @@ -913,8 +926,8 @@ mod tests {
fn test_for_conflicting_resources<Marker, S: IntoSystem<(), (), Marker>>(sys: S) {
let mut world = World::default();
world.insert_resource(BufferRes::default());
world.insert_resource(A);
world.insert_resource(B);
world.insert_resource(ResA);
world.insert_resource(ResB);
run_system(&mut world, sys);
}

Expand All @@ -941,7 +954,7 @@ mod tests {

#[test]
fn nonconflicting_system_resources() {
fn sys(_: Local<BufferRes>, _: ResMut<BufferRes>, _: Local<A>, _: ResMut<A>) {}
fn sys(_: Local<BufferRes>, _: ResMut<BufferRes>, _: Local<A>, _: ResMut<ResA>) {}
test_for_conflicting_resources(sys);
}

Expand Down Expand Up @@ -1156,9 +1169,9 @@ mod tests {

#[test]
fn get_system_conflicts() {
fn sys_x(_: Res<A>, _: Res<B>, _: Query<(&C, &D)>) {}
fn sys_x(_: Res<ResA>, _: Res<ResB>, _: Query<(&C, &D)>) {}

fn sys_y(_: Res<A>, _: ResMut<B>, _: Query<(&C, &mut D)>) {}
fn sys_y(_: Res<ResA>, _: ResMut<ResB>, _: Query<(&C, &mut D)>) {}

let mut world = World::default();
let mut x = IntoSystem::into_system(sys_x);
Expand All @@ -1169,7 +1182,7 @@ mod tests {
let conflicts = x_access.get_conflicts(&y_access);
let b_id = world
.components()
.get_resource_id(TypeId::of::<B>())
.get_resource_id(TypeId::of::<ResB>())
.unwrap();
let d_id = world.components().get_id(TypeId::of::<D>()).unwrap();
assert_eq!(conflicts, vec![b_id, d_id].into());
Expand Down Expand Up @@ -1202,12 +1215,12 @@ mod tests {
#[test]
fn can_have_16_parameters() {
fn sys_x(
_: Res<A>,
_: Res<B>,
_: Res<C>,
_: Res<D>,
_: Res<E>,
_: Res<F>,
_: Res<ResA>,
_: Res<ResB>,
_: Res<ResC>,
_: Res<ResD>,
_: Res<ResE>,
_: Res<ResF>,
_: Query<&A>,
_: Query<&B>,
_: Query<&C>,
Expand All @@ -1221,12 +1234,12 @@ mod tests {
}
fn sys_y(
_: (
Res<A>,
Res<B>,
Res<C>,
Res<D>,
Res<E>,
Res<F>,
Res<ResA>,
Res<ResB>,
Res<ResC>,
Res<ResD>,
Res<ResE>,
Res<ResF>,
Query<&A>,
Query<&B>,
Query<&C>,
Expand Down Expand Up @@ -1392,19 +1405,23 @@ mod tests {
reason = "This test exists to show that read-only world-only queries can return data that lives as long as `'world`."
)]
fn long_life_test() {
struct ResourceHolder<'w> {
value: &'w ResA,
}

struct Holder<'w> {
value: &'w A,
}

struct State {
state: SystemState<Res<'static, A>>,
state: SystemState<Res<'static, ResA>>,
state_q: SystemState<Query<'static, 'static, &'static A>>,
}

impl State {
fn hold_res<'w>(&mut self, world: &'w World) -> Holder<'w> {
fn hold_res<'w>(&mut self, world: &'w World) -> ResourceHolder<'w> {
let a = self.state.get(world);
Holder {
ResourceHolder {
value: a.into_inner(),
}
}
Expand Down
6 changes: 3 additions & 3 deletions crates/bevy_ecs/src/system/system.rs
Original file line number Diff line number Diff line change
Expand Up @@ -459,10 +459,9 @@ mod tests {

#[test]
fn run_system_once() {
#[derive(Resource)]
struct T(usize);

impl Resource for T {}

fn system(In(n): In<usize>, mut commands: Commands) -> usize {
commands.insert_resource(T(n));
n + 1
Expand Down Expand Up @@ -522,8 +521,9 @@ mod tests {

#[test]
fn run_system_once_invalid_params() {
#[derive(Resource)]
struct T;
impl Resource for T {}

fn system(_: Res<T>) {}

let mut world = World::default();
Expand Down
3 changes: 2 additions & 1 deletion crates/bevy_ecs/src/system/system_registry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -995,8 +995,9 @@ mod tests {
use crate::system::RegisteredSystemError;
use alloc::string::ToString;

#[derive(Resource)]
struct T;
impl Resource for T {}

fn system(_: Res<T>) {}

let mut world = World::new();
Expand Down
2 changes: 1 addition & 1 deletion crates/bevy_ecs/src/world/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3735,7 +3735,7 @@ mod tests {
Drop(ID),
}

#[derive(Resource, Component)]
#[derive(Component)]
struct MayPanicInDrop {
drop_log: Arc<Mutex<Vec<DropLogItem>>>,
expected_panic_flag: Arc<AtomicBool>,
Expand Down
Loading