in starlark/src/values/types/string/mod.rs [491:539]
fn test_slice_string() {
let heap = Heap::new();
for example in EXAMPLES {
let s = heap.alloc_str(example).to_value();
for i in -5..=6 {
for j in -5..=6 {
let start = if i == 6 {
None
} else {
Some(Value::new_int(i))
};
let stop = if j == 6 {
None
} else {
Some(Value::new_int(j))
};
// Compare list slicing (comparatively simple) to string slicing (complex unicode)
let res1 = apply_slice(&example.chars().collect::<Vec<_>>(), start, stop, None)
.unwrap()
.iter()
.collect::<String>();
let res2 = s
.slice(start, stop, None, &heap)
.unwrap()
.unpack_str()
.unwrap();
assert_eq!(
&res1,
res2,
"{:?}[{}:{}]",
example,
start.map_or("".to_owned(), |x| x.to_string()),
stop.map_or("".to_owned(), |x| x.to_string())
);
}
}
}
assert::all_true(
r#"
"abc"[1:] == "bc" # Remove the first element
"abc"[:-1] == "ab" # Remove the last element
"abc"[1:-1] == "b" # Remove the first and the last element
"banana"[1::2] == "aaa" # Select one element out of 2, skipping the first
"banana"[4::-2] == "nnb" # Select one element out of 2 in reverse order, starting at index 4
"242"[ -0:-2:-1] == "" # From https://github.com/facebookexperimental/starlark-rust/issues/35
"#,
);
}