@@ -73,11 +73,24 @@ pub fn matrix_cells(rows: u16, cols: u16) -> impl Iterator<Item = (usize, usize)
73
73
}
74
74
75
75
pub fn empty_cells ( matrix : & Matrix , cols : u16 , rows : u16 ) -> Vec < ( usize , usize ) > {
76
+ // TODO: Optimal solution is to use proper Matrix abstraction to derive empty cells
76
77
matrix_cells ( rows, cols)
77
- . filter ( |( row, col) | matrix. get ( * col) . and_then ( |col| col. get ( * row) ) . is_none ( ) )
78
+ . filter ( |( row, col) | {
79
+ matrix
80
+ . get ( * col)
81
+ . and_then ( |col| col. get ( * row) )
82
+ . map ( |cell| cell. is_none ( ) )
83
+ . unwrap_or ( true )
84
+ } )
78
85
. collect :: < Vec < ( usize , usize ) > > ( )
79
86
}
80
87
88
+ pub fn non_empty_cells_len ( matrix : & Matrix ) -> usize {
89
+ matrix
90
+ . iter ( )
91
+ . fold ( 0usize , |sum, val| sum + val. iter ( ) . flatten ( ) . count ( ) )
92
+ }
93
+
81
94
fn get_cell ( ipfs : & Ipfs < DefaultParams > , cid : & Cid ) -> Result < Option < Cell > > {
82
95
ipfs. get ( cid)
83
96
. and_then ( |result| result. ipld ( ) )
@@ -451,40 +464,35 @@ mod tests {
451
464
}
452
465
453
466
fn matrix_strategy ( ) -> impl Strategy < Value = Vec < Vec < Option < Vec < u8 > > > > > {
467
+ let rows_len = ( 1 ..64usize ) . next ( ) . unwrap ( ) ;
454
468
collection:: vec (
455
- collection:: vec ( any :: < Option < Vec < u8 > > > ( ) , collection :: size_range ( 1 .. 64 ) ) ,
469
+ collection:: vec ( any :: < Option < Vec < u8 > > > ( ) , rows_len ) ,
456
470
collection:: size_range ( 1 ..64 ) ,
457
471
)
458
472
}
459
473
460
- fn non_empty_cells ( matrix : & Matrix , cols : u16 , rows : u16 ) -> Vec < ( usize , usize ) > {
461
- matrix_cells ( rows as usize , cols as usize )
462
- . filter ( |( row, col) | matrix. get ( * col) . and_then ( |col| col. get ( * row) ) . is_some ( ) )
463
- . collect :: < Vec < ( usize , usize ) > > ( )
464
- }
465
-
466
474
proptest ! {
467
475
#[ test]
468
- fn matrix_cells_length_is_correct( rows in 0usize ..1024 , cols in 0usize ..1024 ) {
469
- prop_assert_eq!( matrix_cells( rows, cols) . count( ) , rows * cols) ;
476
+ fn matrix_cells_length_is_correct( rows in 0u16 ..1024 , cols in 0u16 ..1024 ) {
477
+ prop_assert_eq!( matrix_cells( rows, cols) . count( ) , rows as usize * cols as usize ) ;
470
478
}
471
479
472
480
#[ test]
473
481
fn empty_cells_length_is_correct( matrix in matrix_strategy( ) ) {
474
- let cols = matrix. len( ) as u16 ;
475
- let rows = matrix[ 0 ] . len( ) as u16 ;
476
- let empty_cells_len = empty_cells( & matrix, cols, rows) . len( ) as u16 ;
477
- let non_empty_cells_len = non_empty_cells ( & matrix, cols , rows ) . len ( ) as u16 ;
482
+ let cols = matrix. len( ) ;
483
+ let rows = matrix[ 0 ] . len( ) ;
484
+ let empty_cells_len = empty_cells( & matrix, cols as u16 , rows as u16 ) . len( ) ;
485
+ let non_empty_cells_len = non_empty_cells_len ( & matrix) ;
478
486
479
- prop_assert_eq!( empty_cells_len + non_empty_cells_len, rows * cols) ;
487
+ prop_assert_eq!( empty_cells_len + non_empty_cells_len, ( rows * cols) as usize ) ;
480
488
}
481
489
}
482
490
483
491
#[ test_case( 1 , 1 => vec![ ( 0 , 0 ) ] ; "one cell" ) ]
484
492
#[ test_case( 4 , 1 => vec![ ( 0 , 0 ) , ( 1 , 0 ) , ( 2 , 0 ) , ( 3 , 0 ) ] ; "four rows, one column" ) ]
485
493
#[ test_case( 1 , 4 => vec![ ( 0 , 0 ) , ( 0 , 1 ) , ( 0 , 2 ) , ( 0 , 3 ) ] ; "four columns, one row" ) ]
486
- #[ test_case( 2 , 2 => vec![ ( 0 , 0 ) , ( 0 , 1 ) , ( 1 , 0 ) , ( 1 , 1 ) ] ; "square matrix" ) ]
487
- fn test_matrix_cells ( rows : usize , cols : usize ) -> Vec < ( usize , usize ) > {
494
+ #[ test_case( 2 , 2 => vec![ ( 0 , 0 ) , ( 1 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) ] ; "square matrix" ) ]
495
+ fn test_matrix_cells ( rows : u16 , cols : u16 ) -> Vec < ( usize , usize ) > {
488
496
matrix_cells ( rows, cols) . collect :: < Vec < ( usize , usize ) > > ( )
489
497
}
490
498
0 commit comments