Skip to content

Commit bde3d6a

Browse files
committed
Tests
1 parent 80d3695 commit bde3d6a

1 file changed

Lines changed: 108 additions & 0 deletions

File tree

ucan/src/delegation/policy/selector/select.rs

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)