in starlark/src/values/types/range.rs [310:344]
fn test_range_exhaustive() {
// The range implementation is fairly hairy. Lots of corner cases etc.
// Especially around equality, length.
// Therefore, generate ranges exhaustively over a very small range
// and test lots of properties about them.
let mut ranges = Vec::with_capacity(294);
for start in -3..4 {
for stop in -3..4 {
for step in -3..3 {
let step = if step >= 0 { step + 1 } else { step };
ranges.push(range(start, stop, step))
}
}
}
assert_eq!(ranges.len(), 294); // Assert we don't accidentally take too long
let heap = Heap::new();
for x in &ranges {
let full: Vec<Value> = x.iterate(&heap).unwrap().collect();
assert_eq!(x.length().unwrap(), full.len() as i32);
for (i, v) in full.iter().enumerate() {
assert_eq!(x.at(Value::new_int(i as i32), &heap).unwrap(), *v);
}
}
// Takes 294^2 steps - but completes instantly
for x in &ranges {
for y in &ranges {
assert_eq!(
x == y,
Iterator::eq(x.iterate(&heap).unwrap(), y.iterate(&heap).unwrap())
)
}
}
}