#[test]
#[cfg(feature = "derive")]
fn derive_fetch_generic() {
    use flax::{Entity, FetchExt, Query, World};
    use glam::{vec3, Quat, Vec3};

    flax::component! {
        position: Vec3 => [flax::Debuggable],
        rotation: Quat => [flax::Debuggable],
        scale: Vec3 => [flax::Debuggable],
    }

    mod inner {

        use flax::{component::ComponentValue, Fetch, *};
        use glam::Quat;

        #[derive(Fetch)]
        #[fetch(item_derives = [Debug, PartialEq])]
        pub struct TransformQuery<V: ComponentValue> {
            pub pos: Component<V>,
            pub rot: Opt<Component<Quat>>,
            pub scale: Opt<Component<V>>,
        }
    }

    use inner::{TransformQuery, TransformQueryItem};

    let mut world = World::new();

    let id1 = Entity::builder()
        .set(position(), vec3(3.4, 2.4, 2.1))
        .spawn(&mut world);

    let id2 = Entity::builder()
        .set(position(), vec3(7.4, 9.2, 3.4))
        .set(rotation(), Quat::from_axis_angle(Vec3::Z, 1.0))
        .spawn(&mut world);

    let mut query = Query::new(TransformQuery {
        pos: position(),
        rot: rotation().opt(),
        scale: scale().opt(),
    });

    let mut query = query.borrow(&world);

    assert_eq!(
        query.get(id1),
        Ok(TransformQueryItem {
            pos: &vec3(3.4, 2.4, 2.1),
            rot: None,
            scale: None
        })
    );

    assert_eq!(
        query.get(id2),
        Ok(TransformQueryItem {
            pos: &vec3(7.4, 9.2, 3.4),
            rot: Some(&Quat::from_axis_angle(Vec3::Z, 1.0)),
            scale: None
        })
    );
}