
use futures::stream;

use std::prelude::v1::*;
use crates_unittest::test_case;
use super::support::*;

#[test_case]
fn unfold1() {
    let mut stream = stream::unfold(0, |state| {
        if state <= 2 {
            let res: Result<_,()> = Ok((state * 2, state + 1));
            Some(delay_future(res))
        } else {
            None
        }
    });
    // Creates the future with the closure
    // Not ready (delayed future)
    sassert_empty(&mut stream);
    // future is ready, yields the item
    sassert_next(&mut stream, 0);

    // Repeat
    sassert_empty(&mut stream);
    sassert_next(&mut stream, 2);

    sassert_empty(&mut stream);
    sassert_next(&mut stream, 4);

    // no more items
    sassert_done(&mut stream);
}

#[test_case]
fn unfold_err1() {
    let mut stream = stream::unfold(0, |state| {
        if state <= 2 {
            Some(Ok((state * 2, state + 1)))
        } else {
            Some(Err(-1))
        }
    });
    sassert_next(&mut stream, 0);
    sassert_next(&mut stream, 2);
    sassert_next(&mut stream, 4);
    sassert_err(&mut stream, -1);

    // An error was generated by the stream, it will then finish
    sassert_done(&mut stream);
}
