use pas::{slice, slice_attr, slice_attr_mut, slice_mut, Slice, SliceMut};
#[repr(C)]
#[derive(Clone, Copy, bytemuck::Pod, bytemuck::Zeroable)]
pub struct Vertex {
pub position: [u32; 3],
pub uv: [u32; 2],
}
pub fn data() -> Vec<Vertex> {
vec![
Vertex {
position: [0, 1, 2],
uv: [3, 4],
},
Vertex {
position: [5, 6, 7],
uv: [8, 9],
},
Vertex {
position: [10, 11, 12],
uv: [13, 14],
},
]
}
macro_rules! slice_attr_tests {
($slice_attr:ident) => {
paste::paste! {
#[test]
fn [<$slice_attr>]() {
#[allow(unused_mut)]
let mut vertices = data();
let slice = $slice_attr!(vertices, [0].position);
assert!(slice.iter().eq([[0, 1, 2], [5, 6, 7], [10, 11, 12]].iter()));
let slice = $slice_attr!(vertices, [1].position);
assert!(slice.iter().eq([[5, 6, 7], [10, 11, 12]].iter()));
let slice = $slice_attr!(vertices, [2].position);
assert!(slice.iter().eq([[10, 11, 12]].iter()));
let slice = slice_attr!(vertices, [0].uv);
assert!(slice.iter().eq([[3, 4], [8, 9], [13, 14]].iter()));
let slice = slice_attr!(vertices, [1].uv);
assert!(slice.iter().eq([[8, 9], [13, 14]].iter()));
let slice = slice_attr!(vertices, [2].uv);
assert!(slice.iter().eq([[13, 14]].iter()));
}
#[test]
fn [<strided_$slice_attr>]() {
#[allow(unused_mut)]
let mut values = vec![0, 1, 2, 3, 4, 5];
let slice = $slice_attr!(1, values, [0]);
assert!(slice.iter().eq([0, 1, 2, 3, 4, 5].iter()));
let slice = $slice_attr!(2, values, [1]);
assert!(slice.iter().eq([1, 3, 5].iter()));
}
}
};
}
macro_rules! slice_tests {
($slice:ident, $type:ty) => {
paste::paste! {
#[test]
fn [<$slice>]() {
#[allow(unused_mut)]
let mut vertices = data();
let slice: $type<u32> = $slice!(vertices, [1].position);
assert_eq!(slice.len(), 2);
assert!(slice.iter().eq([5, 10].iter()));
let slice: $type<u32> = $slice!(vertices, [1].position[1]);
assert_eq!(slice.len(), 2);
assert!(slice.iter().eq([6, 11].iter()));
let slice: $type<u32> = $slice!(vertices, [0].uv);
assert_eq!(slice.len(), 3);
assert!(slice.iter().eq([3, 8, 13].iter()));
}
#[test]
fn [<strided_$slice>]() {
#[allow(unused_mut)]
let mut values = vec![0, 1, 2, 3, 4, 5];
let slice: $type<u32> = $slice!(1, values, [0]);
assert!(slice.iter().eq([0, 1, 2, 3, 4, 5].iter()));
let slice: $type<u32> = $slice!(2, values, [1]);
assert!(slice.iter().eq([1, 3, 5].iter()));
}
}
};
}
slice_attr_tests!(slice_attr);
slice_attr_tests!(slice_attr_mut);
slice_tests!(slice, Slice);
slice_tests!(slice_mut, SliceMut);
#[test]
fn from_slice() {
let mut values: [u32; 6] = [0_u32, 1, 2, 3, 4, 5];
let _ = slice_attr!(&values, [0]);
let _: Slice<u32> = slice!(&values, [0]);
let _ = slice_attr!(&mut values, [0]);
let _: SliceMut<u32> = slice_mut!(&mut values, [0]);
}