@@ -15,6 +15,20 @@ use ndarray::{arr3, rcarr2};
15
15
use ndarray:: { Slice , SliceInfo , SliceOrIndex } ;
16
16
use std:: iter:: FromIterator ;
17
17
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
+
18
32
#[ test]
19
33
fn test_matmul_arcarray ( ) {
20
34
let mut A = ArcArray :: < usize , _ > :: zeros ( ( 2 , 3 ) ) ;
@@ -328,6 +342,82 @@ fn test_slice_collapse_with_indices() {
328
342
assert_eq ! ( vi, Array3 :: from_elem( ( 1 , 1 , 1 ) , elem) ) ;
329
343
}
330
344
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
+
331
421
#[ should_panic]
332
422
#[ test]
333
423
fn index_out_of_bounds ( ) {
0 commit comments