Skip to content

Commit d4a326d

Browse files
authored
Merge pull request #444 from ExpHP/owned-strided-tests
Add tests with discontiguous owned data
2 parents 9f18d6f + 66a8cfa commit d4a326d

File tree

1 file changed

+78
-19
lines changed

1 file changed

+78
-19
lines changed

tests/array.rs

Lines changed: 78 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -274,28 +274,37 @@ fn test_slice_inplace_with_subview_inplace() {
274274
*elt = i;
275275
}
276276

277-
let mut vi = arr.view();
278-
vi.slice_inplace(s![1.., 2, ..;2]);
279-
assert_eq!(vi.shape(), &[2, 1, 2]);
280-
assert!(
281-
vi.iter()
282-
.zip(arr.slice(s![1.., 2..3, ..;2]).iter())
283-
.all(|(a, b)| a == b)
284-
);
285-
286-
let mut vi = arr.view();
287-
vi.slice_inplace(s![1, 2, ..;2]);
288-
assert_eq!(vi.shape(), &[1, 1, 2]);
289-
assert!(
290-
vi.iter()
291-
.zip(arr.slice(s![1..2, 2..3, ..;2]).iter())
292-
.all(|(a, b)| a == b)
293-
);
277+
{
278+
let mut vi = arr.view();
279+
vi.slice_inplace(s![1.., 2, ..;2]);
280+
assert_eq!(vi.shape(), &[2, 1, 2]);
281+
assert!(
282+
vi.iter()
283+
.zip(arr.slice(s![1.., 2..3, ..;2]).iter())
284+
.all(|(a, b)| a == b)
285+
);
286+
287+
let mut vi = arr.view();
288+
vi.slice_inplace(s![1, 2, ..;2]);
289+
assert_eq!(vi.shape(), &[1, 1, 2]);
290+
assert!(
291+
vi.iter()
292+
.zip(arr.slice(s![1..2, 2..3, ..;2]).iter())
293+
.all(|(a, b)| a == b)
294+
);
295+
296+
let mut vi = arr.view();
297+
vi.slice_inplace(s![1, 2, 3]);
298+
assert_eq!(vi.shape(), &[1, 1, 1]);
299+
assert_eq!(vi, Array3::from_elem((1, 1, 1), arr[(1, 2, 3)]));
300+
}
294301

295-
let mut vi = arr.view();
302+
// Do it to the RcArray itself
303+
let elem = arr[(1, 2, 3)];
304+
let mut vi = arr;
296305
vi.slice_inplace(s![1, 2, 3]);
297306
assert_eq!(vi.shape(), &[1, 1, 1]);
298-
assert_eq!(vi, Array3::from_elem((1, 1, 1), arr[(1, 2, 3)]));
307+
assert_eq!(vi, Array3::from_elem((1, 1, 1), elem));
299308
}
300309

301310
#[should_panic]
@@ -807,6 +816,44 @@ fn owned_array_with_stride() {
807816
assert_eq!(a.strides(), &[1, 4, 2]);
808817
}
809818

819+
#[test]
820+
fn owned_array_discontiguous() {
821+
use ::std::iter::repeat;
822+
let v: Vec<_> = (0..12).flat_map(|x| repeat(x).take(2)).collect();
823+
let dim = (3, 2, 2);
824+
let strides = (8, 4, 2);
825+
826+
let a = Array::from_shape_vec(dim.strides(strides), v).unwrap();
827+
assert_eq!(a.strides(), &[8, 4, 2]);
828+
println!("{:?}", a.iter().cloned().collect::<Vec<_>>());
829+
itertools::assert_equal(a.iter().cloned(), 0..12);
830+
}
831+
832+
#[test]
833+
fn owned_array_discontiguous_drop() {
834+
use ::std::rc::Rc;
835+
use ::std::cell::RefCell;
836+
use ::std::collections::BTreeSet;
837+
838+
struct InsertOnDrop<T: Ord>(Rc<RefCell<BTreeSet<T>>>, Option<T>);
839+
impl<T: Ord> Drop for InsertOnDrop<T> {
840+
fn drop(&mut self) {
841+
let InsertOnDrop(ref set, ref mut value) = *self;
842+
set.borrow_mut().insert(value.take().expect("double drop!"));
843+
}
844+
}
845+
846+
let set = Rc::new(RefCell::new(BTreeSet::new()));
847+
{
848+
let v: Vec<_> = (0..12).map(|x| InsertOnDrop(set.clone(), Some(x))).collect();
849+
let mut a = Array::from_shape_vec((2, 6), v).unwrap();
850+
// discontiguous and non-zero offset
851+
a.slice_inplace(s![.., 1..]);
852+
}
853+
// each item was dropped exactly once
854+
itertools::assert_equal(set.borrow().iter().cloned(), 0..12);
855+
}
856+
810857
macro_rules! assert_matches {
811858
($value:expr, $pat:pat) => {
812859
match $value {
@@ -1372,6 +1419,18 @@ fn to_owned_neg_stride() {
13721419
assert_eq!(c, co);
13731420
}
13741421

1422+
#[test]
1423+
fn discontiguous_owned_to_owned() {
1424+
let mut c = arr2(&[[1, 2, 3],
1425+
[4, 5, 6]]);
1426+
c.slice_inplace(s![.., ..;2]);
1427+
1428+
let co = c.to_owned();
1429+
assert_eq!(c.strides(), &[3, 2]);
1430+
assert_eq!(co.strides(), &[2, 1]);
1431+
assert_eq!(c, co);
1432+
}
1433+
13751434
#[test]
13761435
fn map_memory_order() {
13771436
let a = arr3(&[[[1, 2, 3],

0 commit comments

Comments
 (0)