@@ -441,6 +441,114 @@ mod tests {
441441 assert_eq ! ( result, Ipld :: Bytes ( vec![ 0xa9 , 0xc1 ] ) ) ;
442442 }
443443
444+ #[ test_log:: test]
445+ fn test_slice_both_negative ( ) {
446+ let data = Ipld :: List ( vec ! [
447+ Ipld :: Integer ( 10 ) ,
448+ Ipld :: Integer ( 20 ) ,
449+ Ipld :: Integer ( 30 ) ,
450+ Ipld :: Integer ( 40 ) ,
451+ Ipld :: Integer ( 50 ) ,
452+ ] ) ;
453+ let selector = Select :: < Ipld > :: from_str ( ".[-3:-1]" ) . expect ( "parse" ) ;
454+ let result = selector. get ( & data) . expect ( "get" ) ;
455+ assert_eq ! (
456+ result,
457+ Ipld :: List ( vec![ Ipld :: Integer ( 30 ) , Ipld :: Integer ( 40 ) ] )
458+ ) ;
459+ }
460+
461+ #[ test_log:: test]
462+ fn test_slice_negative_start_open_end ( ) {
463+ let data = Ipld :: List ( vec ! [
464+ Ipld :: Integer ( 10 ) ,
465+ Ipld :: Integer ( 20 ) ,
466+ Ipld :: Integer ( 30 ) ,
467+ ] ) ;
468+ let selector = Select :: < Ipld > :: from_str ( ".[-2:]" ) . expect ( "parse" ) ;
469+ let result = selector. get ( & data) . expect ( "get" ) ;
470+ assert_eq ! (
471+ result,
472+ Ipld :: List ( vec![ Ipld :: Integer ( 20 ) , Ipld :: Integer ( 30 ) ] )
473+ ) ;
474+ }
475+
476+ #[ test_log:: test]
477+ fn test_slice_full_copy ( ) {
478+ let data = Ipld :: List ( vec ! [ Ipld :: Integer ( 10 ) , Ipld :: Integer ( 20 ) ] ) ;
479+ let selector = Select :: < Ipld > :: from_str ( ".[:]" ) . expect ( "parse" ) ;
480+ let result = selector. get ( & data) . expect ( "get" ) ;
481+ assert_eq ! ( result, data) ;
482+ }
483+
484+ #[ test_log:: test]
485+ fn test_slice_empty_when_start_ge_end ( ) {
486+ let data = Ipld :: List ( vec ! [
487+ Ipld :: Integer ( 10 ) ,
488+ Ipld :: Integer ( 20 ) ,
489+ Ipld :: Integer ( 30 ) ,
490+ ] ) ;
491+ let selector = Select :: < Ipld > :: from_str ( ".[2:1]" ) . expect ( "parse" ) ;
492+ let result = selector. get ( & data) . expect ( "get" ) ;
493+ assert_eq ! ( result, Ipld :: List ( vec![ ] ) ) ;
494+ }
495+
496+ #[ test_log:: test]
497+ fn test_slice_out_of_bounds_clamps ( ) {
498+ let data = Ipld :: List ( vec ! [ Ipld :: Integer ( 10 ) , Ipld :: Integer ( 20 ) ] ) ;
499+ let selector = Select :: < Ipld > :: from_str ( ".[0:100]" ) . expect ( "parse" ) ;
500+ let result = selector. get ( & data) . expect ( "get" ) ;
501+ assert_eq ! ( result, data) ;
502+ }
503+
504+ #[ test_log:: test]
505+ fn test_byte_negative_index ( ) {
506+ let data = Ipld :: Bytes ( vec ! [ 0xAA , 0xBB , 0xCC ] ) ;
507+ let selector = Select :: < Ipld > :: from_str ( ".[-1]" ) . expect ( "parse" ) ;
508+ let result = selector. get ( & data) . expect ( "get" ) ;
509+ assert_eq ! ( result, Ipld :: Integer ( 0xCC ) ) ;
510+ }
511+
512+ #[ test_log:: test]
513+ fn test_byte_slice_negative ( ) {
514+ let data = Ipld :: Bytes ( vec ! [ 0xAA , 0xBB , 0xCC , 0xDD ] ) ;
515+ let selector = Select :: < Ipld > :: from_str ( ".[-2:]" ) . expect ( "parse" ) ;
516+ let result = selector. get ( & data) . expect ( "get" ) ;
517+ assert_eq ! ( result, Ipld :: Bytes ( vec![ 0xCC , 0xDD ] ) ) ;
518+ }
519+
520+ #[ test_log:: test]
521+ fn test_byte_index_out_of_bounds_with_try ( ) {
522+ let data = Ipld :: Bytes ( vec ! [ 0xAA , 0xBB ] ) ;
523+ let selector = Select :: < Ipld > :: from_str ( ".[99]?" ) . expect ( "parse" ) ;
524+ let result = selector. get ( & data) . expect ( "get" ) ;
525+ assert_eq ! ( result, Ipld :: Null ) ;
526+ }
527+
528+ #[ test_log:: test]
529+ fn test_slice_on_non_list_fails ( ) {
530+ let data = Ipld :: Integer ( 42 ) ;
531+ let selector = Select :: < Ipld > :: from_str ( ".[0:2]" ) . expect ( "parse" ) ;
532+ assert ! ( selector. get( & data) . is_err( ) ) ;
533+ }
534+
535+ #[ test_log:: test]
536+ fn test_slice_on_non_list_with_try_returns_null ( ) {
537+ let data = Ipld :: Integer ( 42 ) ;
538+ let selector = Select :: < Ipld > :: from_str ( ".[0:2]?" ) . expect ( "parse" ) ;
539+ let result = selector. get ( & data) . expect ( "get" ) ;
540+ assert_eq ! ( result, Ipld :: Null ) ;
541+ }
542+
543+ #[ test_log:: test]
544+ fn test_byte_index_spec_example ( ) {
545+ // From the spec: bytes 0xd6a9c18cf8c4, selector .[3] => 0x8c = 140
546+ let data = Ipld :: Bytes ( vec ! [ 0xd6 , 0xa9 , 0xc1 , 0x8c , 0xf8 , 0xc4 ] ) ;
547+ let selector = Select :: < Ipld > :: from_str ( ".[3]" ) . expect ( "parse" ) ;
548+ let result = selector. get ( & data) . expect ( "get" ) ;
549+ assert_eq ! ( result, Ipld :: Integer ( 140 ) ) ;
550+ }
551+
444552 proptest ! {
445553 #![ proptest_config( ProptestConfig { cases: 32 , ..ProptestConfig :: default ( ) } ) ]
446554 #[ test_log:: test]
0 commit comments