From 66a8cfa336b3bc0b3d2584fb7ea5defb003aea25 Mon Sep 17 00:00:00 2001 From: Michael Lamparski Date: Sat, 28 Apr 2018 15:27:36 -0400 Subject: [PATCH] add tests with discontiguous owned data --- tests/array.rs | 97 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 78 insertions(+), 19 deletions(-) diff --git a/tests/array.rs b/tests/array.rs index 3c7ee4cf2..00257d159 100644 --- a/tests/array.rs +++ b/tests/array.rs @@ -274,28 +274,37 @@ fn test_slice_inplace_with_subview_inplace() { *elt = i; } - let mut vi = arr.view(); - vi.slice_inplace(s![1.., 2, ..;2]); - assert_eq!(vi.shape(), &[2, 1, 2]); - assert!( - vi.iter() - .zip(arr.slice(s![1.., 2..3, ..;2]).iter()) - .all(|(a, b)| a == b) - ); - - let mut vi = arr.view(); - vi.slice_inplace(s![1, 2, ..;2]); - assert_eq!(vi.shape(), &[1, 1, 2]); - assert!( - vi.iter() - .zip(arr.slice(s![1..2, 2..3, ..;2]).iter()) - .all(|(a, b)| a == b) - ); + { + let mut vi = arr.view(); + vi.slice_inplace(s![1.., 2, ..;2]); + assert_eq!(vi.shape(), &[2, 1, 2]); + assert!( + vi.iter() + .zip(arr.slice(s![1.., 2..3, ..;2]).iter()) + .all(|(a, b)| a == b) + ); + + let mut vi = arr.view(); + vi.slice_inplace(s![1, 2, ..;2]); + assert_eq!(vi.shape(), &[1, 1, 2]); + assert!( + vi.iter() + .zip(arr.slice(s![1..2, 2..3, ..;2]).iter()) + .all(|(a, b)| a == b) + ); + + let mut vi = arr.view(); + vi.slice_inplace(s![1, 2, 3]); + assert_eq!(vi.shape(), &[1, 1, 1]); + assert_eq!(vi, Array3::from_elem((1, 1, 1), arr[(1, 2, 3)])); + } - let mut vi = arr.view(); + // Do it to the RcArray itself + let elem = arr[(1, 2, 3)]; + let mut vi = arr; vi.slice_inplace(s![1, 2, 3]); assert_eq!(vi.shape(), &[1, 1, 1]); - assert_eq!(vi, Array3::from_elem((1, 1, 1), arr[(1, 2, 3)])); + assert_eq!(vi, Array3::from_elem((1, 1, 1), elem)); } #[should_panic] @@ -807,6 +816,44 @@ fn owned_array_with_stride() { assert_eq!(a.strides(), &[1, 4, 2]); } +#[test] +fn owned_array_discontiguous() { + use ::std::iter::repeat; + let v: Vec<_> = (0..12).flat_map(|x| repeat(x).take(2)).collect(); + let dim = (3, 2, 2); + let strides = (8, 4, 2); + + let a = Array::from_shape_vec(dim.strides(strides), v).unwrap(); + assert_eq!(a.strides(), &[8, 4, 2]); + println!("{:?}", a.iter().cloned().collect::>()); + itertools::assert_equal(a.iter().cloned(), 0..12); +} + +#[test] +fn owned_array_discontiguous_drop() { + use ::std::rc::Rc; + use ::std::cell::RefCell; + use ::std::collections::BTreeSet; + + struct InsertOnDrop(Rc>>, Option); + impl Drop for InsertOnDrop { + fn drop(&mut self) { + let InsertOnDrop(ref set, ref mut value) = *self; + set.borrow_mut().insert(value.take().expect("double drop!")); + } + } + + let set = Rc::new(RefCell::new(BTreeSet::new())); + { + let v: Vec<_> = (0..12).map(|x| InsertOnDrop(set.clone(), Some(x))).collect(); + let mut a = Array::from_shape_vec((2, 6), v).unwrap(); + // discontiguous and non-zero offset + a.slice_inplace(s![.., 1..]); + } + // each item was dropped exactly once + itertools::assert_equal(set.borrow().iter().cloned(), 0..12); +} + macro_rules! assert_matches { ($value:expr, $pat:pat) => { match $value { @@ -1372,6 +1419,18 @@ fn to_owned_neg_stride() { assert_eq!(c, co); } +#[test] +fn discontiguous_owned_to_owned() { + let mut c = arr2(&[[1, 2, 3], + [4, 5, 6]]); + c.slice_inplace(s![.., ..;2]); + + let co = c.to_owned(); + assert_eq!(c.strides(), &[3, 2]); + assert_eq!(co.strides(), &[2, 1]); + assert_eq!(c, co); +} + #[test] fn map_memory_order() { let a = arr3(&[[[1, 2, 3],