Use actual tests for SystemParam regression tests (#8270)
# Objective Our regression tests for `SystemParam` currently consist of a bunch of loosely dispersed struct definitions. This is messy, and doesn't fully test their functionality. ## Solution Group the struct definitions into functions annotated with `#[test]`. This not only makes the module more organized, but it allows us to call `assert_is_system`, which has the potential to catch some bugs that would have been missed with the old approach. Also, this approach is consistent with how `WorldQuery` regression tests are organized.
This commit is contained in:
parent
300b275edc
commit
98954311b3
@ -1563,116 +1563,174 @@ mod tests {
|
|||||||
use crate::{
|
use crate::{
|
||||||
self as bevy_ecs, // Necessary for the `SystemParam` Derive when used inside `bevy_ecs`.
|
self as bevy_ecs, // Necessary for the `SystemParam` Derive when used inside `bevy_ecs`.
|
||||||
query::{ReadOnlyWorldQuery, WorldQuery},
|
query::{ReadOnlyWorldQuery, WorldQuery},
|
||||||
system::Query,
|
system::{assert_is_system, Query},
|
||||||
};
|
};
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
// Compile test for https://github.com/bevyengine/bevy/pull/2838.
|
// Compile test for https://github.com/bevyengine/bevy/pull/2838.
|
||||||
#[derive(SystemParam)]
|
#[test]
|
||||||
pub struct SpecialQuery<
|
fn system_param_generic_bounds() {
|
||||||
'w,
|
#[derive(SystemParam)]
|
||||||
's,
|
pub struct SpecialQuery<
|
||||||
Q: WorldQuery + Send + Sync + 'static,
|
'w,
|
||||||
F: ReadOnlyWorldQuery + Send + Sync + 'static = (),
|
's,
|
||||||
> {
|
Q: WorldQuery + Send + Sync + 'static,
|
||||||
_query: Query<'w, 's, Q, F>,
|
F: ReadOnlyWorldQuery + Send + Sync + 'static = (),
|
||||||
|
> {
|
||||||
|
_query: Query<'w, 's, Q, F>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn my_system(_: SpecialQuery<(), ()>) {}
|
||||||
|
assert_is_system(my_system);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile tests for https://github.com/bevyengine/bevy/pull/6694.
|
// Compile tests for https://github.com/bevyengine/bevy/pull/6694.
|
||||||
|
#[test]
|
||||||
|
fn system_param_flexibility() {
|
||||||
|
#[derive(SystemParam)]
|
||||||
|
pub struct SpecialRes<'w, T: Resource> {
|
||||||
|
_res: Res<'w, T>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(SystemParam)]
|
#[derive(SystemParam)]
|
||||||
pub struct SpecialRes<'w, T: Resource> {
|
pub struct SpecialLocal<'s, T: FromWorld + Send + 'static> {
|
||||||
_res: Res<'w, T>,
|
_local: Local<'s, T>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(SystemParam)]
|
#[derive(Resource)]
|
||||||
pub struct SpecialLocal<'s, T: FromWorld + Send + 'static> {
|
struct R;
|
||||||
_local: Local<'s, T>,
|
|
||||||
|
fn my_system(_: SpecialRes<R>, _: SpecialLocal<u32>) {}
|
||||||
|
assert_is_system(my_system);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Resource)]
|
#[derive(Resource)]
|
||||||
pub struct R<const I: usize>;
|
pub struct R<const I: usize>;
|
||||||
|
|
||||||
// Compile test for https://github.com/bevyengine/bevy/pull/7001.
|
// Compile test for https://github.com/bevyengine/bevy/pull/7001.
|
||||||
#[derive(SystemParam)]
|
#[test]
|
||||||
pub struct ConstGenericParam<'w, const I: usize>(Res<'w, R<I>>);
|
fn system_param_const_generics() {
|
||||||
|
#[derive(SystemParam)]
|
||||||
|
pub struct ConstGenericParam<'w, const I: usize>(Res<'w, R<I>>);
|
||||||
|
|
||||||
// Compile test for https://github.com/bevyengine/bevy/pull/6867.
|
fn my_system(_: ConstGenericParam<0>, _: ConstGenericParam<1000>) {}
|
||||||
#[derive(SystemParam)]
|
assert_is_system(my_system);
|
||||||
pub struct LongParam<'w> {
|
|
||||||
_r0: Res<'w, R<0>>,
|
|
||||||
_r1: Res<'w, R<1>>,
|
|
||||||
_r2: Res<'w, R<2>>,
|
|
||||||
_r3: Res<'w, R<3>>,
|
|
||||||
_r4: Res<'w, R<4>>,
|
|
||||||
_r5: Res<'w, R<5>>,
|
|
||||||
_r6: Res<'w, R<6>>,
|
|
||||||
_r7: Res<'w, R<7>>,
|
|
||||||
_r8: Res<'w, R<8>>,
|
|
||||||
_r9: Res<'w, R<9>>,
|
|
||||||
_r10: Res<'w, R<10>>,
|
|
||||||
_r11: Res<'w, R<11>>,
|
|
||||||
_r12: Res<'w, R<12>>,
|
|
||||||
_r13: Res<'w, R<13>>,
|
|
||||||
_r14: Res<'w, R<14>>,
|
|
||||||
_r15: Res<'w, R<15>>,
|
|
||||||
_r16: Res<'w, R<16>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
// Compile test for https://github.com/bevyengine/bevy/pull/6867.
|
||||||
fn long_system(_param: LongParam) {
|
#[test]
|
||||||
crate::system::assert_is_system(long_system);
|
fn system_param_field_limit() {
|
||||||
|
#[derive(SystemParam)]
|
||||||
|
pub struct LongParam<'w> {
|
||||||
|
// Each field should be a distinct type so there will
|
||||||
|
// be an error if the derive messes up the field order.
|
||||||
|
_r0: Res<'w, R<0>>,
|
||||||
|
_r1: Res<'w, R<1>>,
|
||||||
|
_r2: Res<'w, R<2>>,
|
||||||
|
_r3: Res<'w, R<3>>,
|
||||||
|
_r4: Res<'w, R<4>>,
|
||||||
|
_r5: Res<'w, R<5>>,
|
||||||
|
_r6: Res<'w, R<6>>,
|
||||||
|
_r7: Res<'w, R<7>>,
|
||||||
|
_r8: Res<'w, R<8>>,
|
||||||
|
_r9: Res<'w, R<9>>,
|
||||||
|
_r10: Res<'w, R<10>>,
|
||||||
|
_r11: Res<'w, R<11>>,
|
||||||
|
_r12: Res<'w, R<12>>,
|
||||||
|
_r13: Res<'w, R<13>>,
|
||||||
|
_r14: Res<'w, R<14>>,
|
||||||
|
_r15: Res<'w, R<15>>,
|
||||||
|
_r16: Res<'w, R<16>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn long_system(_: LongParam) {}
|
||||||
|
assert_is_system(long_system);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile test for https://github.com/bevyengine/bevy/pull/6919.
|
// Compile test for https://github.com/bevyengine/bevy/pull/6919.
|
||||||
// Regression test for https://github.com/bevyengine/bevy/issues/7447.
|
// Regression test for https://github.com/bevyengine/bevy/issues/7447.
|
||||||
#[derive(SystemParam)]
|
#[test]
|
||||||
struct IgnoredParam<'w, T: Resource, Marker: 'static> {
|
fn system_param_phantom_data() {
|
||||||
_foo: Res<'w, T>,
|
#[derive(SystemParam)]
|
||||||
#[system_param(ignore)]
|
struct IgnoredParam<'w, T: Resource, Marker: 'static> {
|
||||||
marker: PhantomData<&'w Marker>,
|
_foo: Res<'w, T>,
|
||||||
marker2: PhantomData<&'w Marker>,
|
#[system_param(ignore)]
|
||||||
|
marker: PhantomData<&'w Marker>,
|
||||||
|
marker2: PhantomData<&'w Marker>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn my_system(_: IgnoredParam<R<0>, ()>) {}
|
||||||
|
assert_is_system(my_system);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile tests for https://github.com/bevyengine/bevy/pull/6957.
|
// Compile tests for https://github.com/bevyengine/bevy/pull/6957.
|
||||||
|
#[test]
|
||||||
|
fn system_param_struct_variants() {
|
||||||
|
#[derive(SystemParam)]
|
||||||
|
pub struct UnitParam;
|
||||||
|
|
||||||
#[derive(SystemParam)]
|
#[derive(SystemParam)]
|
||||||
pub struct UnitParam;
|
pub struct TupleParam<'w, 's, R: Resource, L: FromWorld + Send + 'static>(
|
||||||
|
Res<'w, R>,
|
||||||
|
Local<'s, L>,
|
||||||
|
);
|
||||||
|
|
||||||
#[derive(SystemParam)]
|
fn my_system(_: UnitParam, _: TupleParam<R<0>, u32>) {}
|
||||||
pub struct TupleParam<'w, 's, R: Resource, L: FromWorld + Send + 'static>(
|
assert_is_system(my_system);
|
||||||
Res<'w, R>,
|
}
|
||||||
Local<'s, L>,
|
|
||||||
);
|
|
||||||
|
|
||||||
#[derive(Resource)]
|
|
||||||
struct PrivateResource;
|
|
||||||
|
|
||||||
// Regression test for https://github.com/bevyengine/bevy/issues/4200.
|
// Regression test for https://github.com/bevyengine/bevy/issues/4200.
|
||||||
#[derive(SystemParam)]
|
#[test]
|
||||||
pub struct EncapsulatedParam<'w>(Res<'w, PrivateResource>);
|
fn system_param_private_fields() {
|
||||||
|
#[derive(Resource)]
|
||||||
|
struct PrivateResource;
|
||||||
|
|
||||||
|
#[derive(SystemParam)]
|
||||||
|
pub struct EncapsulatedParam<'w>(Res<'w, PrivateResource>);
|
||||||
|
|
||||||
|
fn my_system(_: EncapsulatedParam) {}
|
||||||
|
assert_is_system(my_system);
|
||||||
|
}
|
||||||
|
|
||||||
// Regression test for https://github.com/bevyengine/bevy/issues/7103.
|
// Regression test for https://github.com/bevyengine/bevy/issues/7103.
|
||||||
#[derive(SystemParam)]
|
#[test]
|
||||||
pub struct WhereParam<'w, 's, Q>
|
fn system_param_where_clause() {
|
||||||
where
|
#[derive(SystemParam)]
|
||||||
Q: 'static + WorldQuery,
|
pub struct WhereParam<'w, 's, Q>
|
||||||
{
|
where
|
||||||
_q: Query<'w, 's, Q, ()>,
|
Q: 'static + WorldQuery,
|
||||||
|
{
|
||||||
|
_q: Query<'w, 's, Q, ()>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn my_system(_: WhereParam<()>) {}
|
||||||
|
assert_is_system(my_system);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Regression test for https://github.com/bevyengine/bevy/issues/1727.
|
// Regression test for https://github.com/bevyengine/bevy/issues/1727.
|
||||||
#[derive(SystemParam)]
|
#[test]
|
||||||
pub struct Collide<'w> {
|
fn system_param_name_collision() {
|
||||||
_x: Res<'w, FetchState>,
|
#[derive(Resource)]
|
||||||
}
|
pub struct FetchState;
|
||||||
|
|
||||||
#[derive(Resource)]
|
#[derive(SystemParam)]
|
||||||
pub struct FetchState;
|
pub struct Collide<'w> {
|
||||||
|
_x: Res<'w, FetchState>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn my_system(_: Collide) {}
|
||||||
|
assert_is_system(my_system);
|
||||||
|
}
|
||||||
|
|
||||||
// Regression test for https://github.com/bevyengine/bevy/issues/8192.
|
// Regression test for https://github.com/bevyengine/bevy/issues/8192.
|
||||||
#[derive(SystemParam)]
|
#[test]
|
||||||
pub struct InvariantParam<'w, 's> {
|
fn system_param_invariant_lifetime() {
|
||||||
_set: ParamSet<'w, 's, (Query<'w, 's, ()>,)>,
|
#[derive(SystemParam)]
|
||||||
|
pub struct InvariantParam<'w, 's> {
|
||||||
|
_set: ParamSet<'w, 's, (Query<'w, 's, ()>,)>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn my_system(_: InvariantParam) {}
|
||||||
|
assert_is_system(my_system);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user