@@ -15,6 +15,20 @@ use ndarray::{arr3, rcarr2};
1515use ndarray:: { Slice , SliceInfo , SliceOrIndex } ;
1616use std:: iter:: FromIterator ;
1717
18+ macro_rules! assert_panics {
19+ ( $body: expr) => {
20+ if let Ok ( v) = :: std:: panic:: catch_unwind( || $body) {
21+ panic!( "assertion failed: should_panic; \
22+ non-panicking result: {:?}", v) ;
23+ }
24+ } ;
25+ ( $body: expr, $( $arg: tt) * ) => {
26+ if let Ok ( _) = :: std:: panic:: catch_unwind( || $body) {
27+ panic!( $( $arg) * ) ;
28+ }
29+ } ;
30+ }
31+
1832#[ test]
1933fn test_matmul_arcarray ( ) {
2034 let mut A = ArcArray :: < usize , _ > :: zeros ( ( 2 , 3 ) ) ;
@@ -328,6 +342,82 @@ fn test_slice_collapse_with_indices() {
328342 assert_eq ! ( vi, Array3 :: from_elem( ( 1 , 1 , 1 ) , elem) ) ;
329343}
330344
345+ #[ test]
346+ fn test_multislice ( ) {
347+ macro_rules! do_test {
348+ ( $arr: expr, $( $s: expr) ,* ) => {
349+ {
350+ let arr = $arr;
351+ let copy = arr. clone( ) ;
352+ assert_eq!(
353+ arr. multi_slice_mut( ( $( $s, ) * ) ) ,
354+ ( $( copy. clone( ) . slice_mut( $s) , ) * )
355+ ) ;
356+ }
357+ } ;
358+ }
359+
360+ let mut arr = Array1 :: from_iter ( 0 ..48 ) . into_shape ( ( 8 , 6 ) ) . unwrap ( ) ;
361+
362+ assert_eq ! (
363+ ( arr. clone( ) . view_mut( ) , ) ,
364+ arr. multi_slice_mut( ( s![ .., ..] , ) ) ,
365+ ) ;
366+ assert_eq ! ( arr. multi_slice_mut( ( ) ) , ( ) ) ;
367+ do_test ! ( & mut arr, s![ 0 , ..] ) ;
368+ do_test ! ( & mut arr, s![ 0 , ..] , s![ 1 , ..] ) ;
369+ do_test ! ( & mut arr, s![ 0 , ..] , s![ -1 , ..] ) ;
370+ do_test ! ( & mut arr, s![ 0 , ..] , s![ 1 .., ..] ) ;
371+ do_test ! ( & mut arr, s![ 1 , ..] , s![ ..; 2 , ..] ) ;
372+ do_test ! ( & mut arr, s![ ..2 , ..] , s![ 2 .., ..] ) ;
373+ do_test ! ( & mut arr, s![ 1 ..; 2 , ..] , s![ ..; 2 , ..] ) ;
374+ do_test ! ( & mut arr, s![ ..; -2 , ..] , s![ ..; 2 , ..] ) ;
375+ do_test ! ( & mut arr, s![ ..; 12 , ..] , s![ 3 ..; 3 , ..] ) ;
376+ do_test ! ( & mut arr, s![ 3 , ..] , s![ ..-1 ; -2 , ..] ) ;
377+ do_test ! ( & mut arr, s![ 0 , ..] , s![ 1 , ..] , s![ 2 , ..] ) ;
378+ do_test ! ( & mut arr, s![ 0 , ..] , s![ 1 , ..] , s![ 2 , ..] , s![ 3 , ..] ) ;
379+ }
380+
381+ #[ test]
382+ fn test_multislice_intersecting ( ) {
383+ assert_panics ! ( {
384+ let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
385+ arr. multi_slice_mut( ( s![ 3 , ..] , s![ 3 , ..] ) ) ;
386+ } ) ;
387+ assert_panics ! ( {
388+ let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
389+ arr. multi_slice_mut( ( s![ 3 , ..] , s![ 3 .., ..] ) ) ;
390+ } ) ;
391+ assert_panics ! ( {
392+ let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
393+ arr. multi_slice_mut( ( s![ 3 , ..] , s![ ..; 3 , ..] ) ) ;
394+ } ) ;
395+ assert_panics ! ( {
396+ let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
397+ arr. multi_slice_mut( ( s![ ..; 6 , ..] , s![ 3 ..; 3 , ..] ) ) ;
398+ } ) ;
399+ assert_panics ! ( {
400+ let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
401+ arr. multi_slice_mut( ( s![ 2 , ..] , s![ ..-1 ; -2 , ..] ) ) ;
402+ } ) ;
403+ assert_panics ! ( {
404+ let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
405+ arr. multi_slice_mut( ( s![ 4 , ..] , s![ 3 , ..] , s![ 3 , ..] ) ) ;
406+ } ) ;
407+ assert_panics ! ( {
408+ let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
409+ arr. multi_slice_mut( ( s![ 3 , ..] , s![ 4 , ..] , s![ 3 , ..] ) ) ;
410+ } ) ;
411+ assert_panics ! ( {
412+ let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
413+ arr. multi_slice_mut( ( s![ 3 , ..] , s![ 3 , ..] , s![ 4 , ..] ) ) ;
414+ } ) ;
415+ assert_panics ! ( {
416+ let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
417+ arr. multi_slice_mut( ( s![ 3 , ..] , s![ 3 , ..] , s![ 4 , ..] , s![ 3 , ..] ) ) ;
418+ } ) ;
419+ }
420+
331421#[ should_panic]
332422#[ test]
333423fn index_out_of_bounds ( ) {
0 commit comments