Skip to content

Commit c5b736b

Browse files
committed
shape: Add more .to_shape() tests
1 parent a0282ba commit c5b736b

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

tests/reshape.rs

+54
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,57 @@ fn to_shape_error2() {
176176
let v = aview1(&data);
177177
let _u = v.to_shape((2, usize::MAX)).unwrap();
178178
}
179+
180+
#[test]
181+
fn to_shape_discontig() {
182+
for &create_order in &[Order::C, Order::F] {
183+
let a = Array::from_iter(0..64);
184+
let mut a1 = a.to_shape(((4, 4, 4), create_order)).unwrap();
185+
a1.slice_collapse(s![.., ..;2, ..]); // now shape (4, 2, 4)
186+
assert!(a1.as_slice_memory_order().is_none());
187+
188+
for &order in &[Order::C, Order::F] {
189+
let v1 = a1.to_shape(((2, 2, 2, 2, 2), order)).unwrap();
190+
assert!(v1.is_view());
191+
let v1 = a1.to_shape(((4, 1, 2, 1, 2, 2), order)).unwrap();
192+
assert!(v1.is_view());
193+
let v1 = a1.to_shape(((4, 2, 4), order)).unwrap();
194+
assert!(v1.is_view());
195+
let v1 = a1.to_shape(((8, 4), order)).unwrap();
196+
assert_eq!(v1.is_view(), order == create_order && create_order == Order::C,
197+
"failed for {:?}, {:?}", create_order, order);
198+
let v1 = a1.to_shape(((4, 8), order)).unwrap();
199+
assert_eq!(v1.is_view(), order == create_order && create_order == Order::F,
200+
"failed for {:?}, {:?}", create_order, order);
201+
let v1 = a1.to_shape((32, order)).unwrap();
202+
assert!(!v1.is_view());
203+
}
204+
}
205+
}
206+
207+
#[test]
208+
fn to_shape_broadcast() {
209+
for &create_order in &[Order::C, Order::F] {
210+
let a = Array::from_iter(0..64);
211+
let mut a1 = a.to_shape(((4, 4, 4), create_order)).unwrap();
212+
a1.slice_collapse(s![.., ..1, ..]); // now shape (4, 1, 4)
213+
let v1 = a1.broadcast((4, 4, 4)).unwrap(); // Now shape (4, 4, 4)
214+
assert!(v1.as_slice_memory_order().is_none());
215+
216+
for &order in &[Order::C, Order::F] {
217+
let v2 = v1.to_shape(((2, 2, 2, 2, 2, 2), order)).unwrap();
218+
assert_eq!(v2.strides(), match (create_order, order) {
219+
(Order::C, Order::C) => { &[32, 16, 0, 0, 2, 1] }
220+
(Order::C, Order::F) => { &[16, 32, 0, 0, 1, 2] }
221+
(Order::F, Order::C) => { &[2, 1, 0, 0, 32, 16] }
222+
(Order::F, Order::F) => { &[1, 2, 0, 0, 16, 32] }
223+
_other => unreachable!()
224+
});
225+
226+
let v2 = v1.to_shape(((4, 4, 4), order)).unwrap();
227+
assert!(v2.is_view());
228+
let v2 = v1.to_shape(((8, 8), order)).unwrap();
229+
assert!(v2.is_owned());
230+
}
231+
}
232+
}

0 commit comments

Comments
 (0)