use std::io::Read;
use sumtype::sumtype;
#[sumtype(sumtype::traits::Read)]
fn make_reader(which: u8) -> impl Read {
match which {
0 => sumtype!(std::io::Cursor::new(vec![1u8, 2, 3, 4])),
1 => sumtype!(std::io::Cursor::new(&b"hello"[..])),
_ => sumtype!(std::io::empty()),
}
}
#[sumtype(sumtype::traits::Iterator + sumtype::traits::Clone)]
fn make_iter(a: usize) -> impl Iterator<Item = usize> + Clone {
match a {
0 => sumtype!(std::iter::empty::<usize>()),
1 => sumtype!(std::iter::once(7usize)),
_ => sumtype!(std::iter::repeat(9usize).take(3)),
}
}
#[sumtype(sumtype::traits::Copy)]
fn make_copy(b: bool) -> impl Copy {
if b {
sumtype!(1i8)
} else {
sumtype!(2i32)
}
}
#[test]
fn read_dispatches_and_reads_correct_bytes() {
let mut buf = Vec::new();
make_reader(0).read_to_end(&mut buf).unwrap();
assert_eq!(buf, vec![1, 2, 3, 4]);
let mut s = String::new();
make_reader(1).read_to_string(&mut s).unwrap();
assert_eq!(s, "hello");
let mut e = Vec::new();
make_reader(2).read_to_end(&mut e).unwrap();
assert_eq!(e, Vec::<u8>::new());
}
#[test]
fn clone_yields_independent_equal_iterator() {
let it = make_iter(2);
let cloned: Vec<_> = it.clone().collect();
let original: Vec<_> = it.collect();
assert_eq!(cloned, vec![9, 9, 9]);
assert_eq!(cloned, original);
let it2 = make_iter(1);
let mut c = it2.clone();
assert_eq!(c.next(), Some(7));
assert_eq!(it2.collect::<Vec<_>>(), vec![7]);
assert_eq!(make_iter(0).collect::<Vec<_>>(), Vec::<usize>::new());
}
#[test]
fn copy_value_is_usable_after_move() {
let x = make_copy(true);
let y = x;
let z = x;
let _ = (y, z);
}