feat(options2): better tests for layered_option

The existing test can be solved with the following:

```rs
        while let Some(integer) = optional_integers.pop() {
            assert_eq!(integer.unwrap(), range);
```

Similarly with `expect(...)`, `unwrap_or(0)`, `unwrap_or_default()`, etc. However, none of these solutions use the learning point of stacking `Option<T>`s.

The updated test can _only_ be solved by stacking `Option<T>`s:

```rs
        while let Some(Some(integer)) = optional_integers.pop() {
            assert_eq!(integer, cursor);
```

With the updated test, using `unwrap` or `expect` will panic when it hits the `None` value, and using `unwrap_or` or `unwrap_or_default` will cause the final `assert_eq!(cursor, 0)`  to panic.
This commit is contained in:
lionel-rowe 2023-04-21 06:05:25 +01:00 committed by GitHub
parent fc81bb15fe
commit 836134202e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -18,17 +18,22 @@ mod tests {
#[test] #[test]
fn layered_option() { fn layered_option() {
let mut range = 10; let range = 10;
let mut optional_integers: Vec<Option<i8>> = Vec::new(); let mut optional_integers: Vec<Option<i8>> = vec![None];
for i in 0..(range + 1) {
for i in 1..(range + 1) {
optional_integers.push(Some(i)); optional_integers.push(Some(i));
} }
let mut cursor = range;
// TODO: make this a while let statement - remember that vector.pop also adds another layer of Option<T> // TODO: make this a while let statement - remember that vector.pop also adds another layer of Option<T>
// You can stack `Option<T>`'s into while let and if let // You can stack `Option<T>`s into while let and if let
integer = optional_integers.pop() { integer = optional_integers.pop() {
assert_eq!(integer, range); assert_eq!(integer, cursor);
range -= 1; cursor -= 1;
} }
assert_eq!(cursor, 0);
} }
} }