@@ -442,3 +442,66 @@ mod tests {
442442 assert_eq ! ( & bytes[ ..] , [ 1u8 , 2 , 3 ] . as_slice( ) ) ;
443443 }
444444}
445+
446+ #[ cfg( kani) ]
447+ mod verification {
448+ use super :: * ;
449+ use kani:: BoundedArbitrary ;
450+
451+ #[ kani:: proof]
452+ #[ kani:: unwind( 16 ) ]
453+ pub fn check_view_prefix_ok ( ) {
454+ let data: Vec < u8 > = Vec :: bounded_any :: < 16 > ( ) ;
455+ kani:: assume ( data. len ( ) >= 4 ) ;
456+ let mut bytes = Bytes :: from_source ( data. clone ( ) ) ;
457+ let original = bytes. clone ( ) ;
458+ let view = bytes. view_prefix :: < [ u8 ; 4 ] > ( ) . expect ( "prefix exists" ) ;
459+ let expected: [ u8 ; 4 ] = original. as_ref ( ) [ ..4 ] . try_into ( ) . unwrap ( ) ;
460+ assert_eq ! ( * view, expected) ;
461+ assert_eq ! ( bytes. as_ref( ) , & original. as_ref( ) [ 4 ..] ) ;
462+ }
463+
464+ #[ kani:: proof]
465+ #[ kani:: unwind( 16 ) ]
466+ pub fn check_view_suffix_ok ( ) {
467+ let data: Vec < u8 > = Vec :: bounded_any :: < 16 > ( ) ;
468+ kani:: assume ( data. len ( ) >= 4 ) ;
469+ let mut bytes = Bytes :: from_source ( data. clone ( ) ) ;
470+ let original = bytes. clone ( ) ;
471+ let view = bytes. view_suffix :: < [ u8 ; 4 ] > ( ) . expect ( "suffix exists" ) ;
472+ let start = original. len ( ) - 4 ;
473+ let expected: [ u8 ; 4 ] = original. as_ref ( ) [ start..] . try_into ( ) . unwrap ( ) ;
474+ assert_eq ! ( * view, expected) ;
475+ assert_eq ! ( bytes. as_ref( ) , & original. as_ref( ) [ ..start] ) ;
476+ }
477+
478+ #[ derive(
479+ zerocopy:: TryFromBytes ,
480+ zerocopy:: IntoBytes ,
481+ zerocopy:: KnownLayout ,
482+ zerocopy:: Immutable ,
483+ Clone ,
484+ Copy ,
485+ ) ]
486+ #[ repr( C ) ]
487+ struct Pair {
488+ a : u32 ,
489+ b : u32 ,
490+ }
491+
492+ #[ kani:: proof]
493+ #[ kani:: unwind( 8 ) ]
494+ pub fn check_field_to_view_ok ( ) {
495+ let value = Pair {
496+ a : kani:: any ( ) ,
497+ b : kani:: any ( ) ,
498+ } ;
499+ let bytes = Bytes :: from_source ( Box :: new ( value) ) ;
500+ let view = bytes. view :: < Pair > ( ) . unwrap ( ) ;
501+ let field = view. field_to_view ( & view. a ) . expect ( "field view" ) ;
502+ assert_eq ! ( * field, view. a) ;
503+
504+ let other: u32 = kani:: any ( ) ;
505+ assert ! ( view. field_to_view( & other) . is_none( ) ) ;
506+ }
507+ }
0 commit comments