#![cfg(feature = "yoke")]
use std::sync::Arc;
use dvb_bbframe::packet::{NmTsIter, NM_UP_SIZE, TS_SYNC_BYTE};
use yoke::Yoke;
fn two_up_data_field() -> Vec<u8> {
let mut data = Vec::with_capacity(2 * NM_UP_SIZE);
for up in 0..2u8 {
data.push(0x00); for j in 1..NM_UP_SIZE {
data.push(up.wrapping_mul(10).wrapping_add(j as u8));
}
}
data
}
#[test]
fn yoked_iter_outlives_source_vec() {
let yoked: Yoke<NmTsIter<'static>, Arc<[u8]>> = {
let cart: Arc<[u8]> = Arc::from(two_up_data_field()); Yoke::attach_to_cart(cart, |b| NmTsIter::new(b))
};
let (lo, hi) = yoked.get().size_hint();
assert_eq!(lo, 2);
assert_eq!(hi, Some(2));
let mut it: NmTsIter<'_> = *yoked.get();
let first = it.next().expect("first UP");
assert_eq!(first[0], TS_SYNC_BYTE);
assert_eq!(it.count(), 1); }
#[test]
fn yoked_iter_crosses_thread_boundary() {
let yoked: Yoke<NmTsIter<'static>, Arc<[u8]>> =
Yoke::attach_to_cart(Arc::from(two_up_data_field()), |b| NmTsIter::new(b));
let count = std::thread::spawn(move || (*yoked.get()).count())
.join()
.unwrap();
assert_eq!(count, 2);
}