|
| 1 | +use planus::ReadAsRoot; |
| 2 | + |
| 3 | +#[track_caller] |
| 4 | +fn eq<I1, I2>(iter1: I1, iter2: I2) |
| 5 | +where |
| 6 | + I1: Clone + Iterator + ExactSizeIterator, |
| 7 | + I2: Clone + Iterator + ExactSizeIterator, |
| 8 | + I1::Item: core::fmt::Debug + PartialEq<I2::Item>, |
| 9 | + I2::Item: core::fmt::Debug, |
| 10 | +{ |
| 11 | + if !iter1.clone().eq(iter2.clone()) { |
| 12 | + let iter1 = iter1.collect::<Vec<_>>(); |
| 13 | + let iter2 = iter2.collect::<Vec<_>>(); |
| 14 | + panic!( |
| 15 | + "Not equal: {iter1:?} {iter2:?}", |
| 16 | + iter1 = iter1, |
| 17 | + iter2 = iter2 |
| 18 | + ); |
| 19 | + } |
| 20 | + let mut len = iter2.len(); |
| 21 | + assert_eq!(len, iter1.len()); |
| 22 | + let mut iter2 = iter2; |
| 23 | + while let Some(_) = iter2.next() { |
| 24 | + assert_eq!(iter2.len(), len - 1); |
| 25 | + len -= 1; |
| 26 | + } |
| 27 | +} |
| 28 | + |
| 29 | +fn to_owned_vec<'buf>(vec: planus::UnionVector<'buf, UnionRef<'buf>>) -> Vec<Union> { |
| 30 | + vec.iter().map(|v| v.unwrap().try_into().unwrap()).collect() |
| 31 | +} |
| 32 | + |
| 33 | +#[track_caller] |
| 34 | +fn cmp<I1, I2, F, T>(iter1: I1, iter2: I2, f: F) |
| 35 | +where |
| 36 | + I1: Clone + Iterator + DoubleEndedIterator + ExactSizeIterator, |
| 37 | + I2: Clone + Iterator + DoubleEndedIterator + ExactSizeIterator, |
| 38 | + I1::Item: core::fmt::Debug + PartialEq<T>, |
| 39 | + F: Copy + Fn(I2::Item) -> T, |
| 40 | + T: core::fmt::Debug, |
| 41 | +{ |
| 42 | + eq(iter1.clone(), iter2.clone().map(f)); |
| 43 | + eq(iter1.clone().rev(), iter2.clone().rev().map(f)); |
| 44 | + for i in 1..=iter1.len() + 1 { |
| 45 | + eq(iter1.clone().step_by(i), iter2.clone().step_by(i).map(f)); |
| 46 | + eq( |
| 47 | + iter1.clone().step_by(i).rev(), |
| 48 | + iter2.clone().step_by(i).rev().map(f), |
| 49 | + ); |
| 50 | + eq( |
| 51 | + iter1.clone().rev().step_by(i), |
| 52 | + iter2.clone().rev().step_by(i).map(f), |
| 53 | + ); |
| 54 | + } |
| 55 | +} |
| 56 | + |
| 57 | +fn run_test(values: &[Union]) { |
| 58 | + let mut builder = planus::Builder::new(); |
| 59 | + for i in 0..=values.len() { |
| 60 | + builder.clear(); |
| 61 | + let root = Root::create(&mut builder, &values[..i]); |
| 62 | + let data = builder.finish(root, None); |
| 63 | + let root = RootRef::read_as_root(data).unwrap(); |
| 64 | + let vector = root.unions().unwrap().unwrap(); |
| 65 | + let owned: Vec<Union> = to_owned_vec(vector); |
| 66 | + assert_eq!(owned, &values[..i]); |
| 67 | + |
| 68 | + cmp( |
| 69 | + owned.iter().cloned(), |
| 70 | + vector.iter(), |
| 71 | + |u: Result<UnionRef<'_>, _>| -> Union { u.unwrap().try_into().unwrap() }, |
| 72 | + ); |
| 73 | + |
| 74 | + for i in 1..=values.len() + 1 { |
| 75 | + cmp(owned.chunks(i), vector.chunks(i), to_owned_vec); |
| 76 | + cmp(owned.chunks_exact(i), vector.chunks_exact(i), to_owned_vec); |
| 77 | + cmp(owned.rchunks(i), vector.rchunks(i), to_owned_vec); |
| 78 | + cmp( |
| 79 | + owned.rchunks_exact(i), |
| 80 | + vector.rchunks_exact(i), |
| 81 | + to_owned_vec, |
| 82 | + ); |
| 83 | + cmp(owned.windows(i), vector.windows(i), to_owned_vec); |
| 84 | + } |
| 85 | + } |
| 86 | +} |
| 87 | + |
| 88 | +run_test(&[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].map(|value| Union::Struct(Struct { value }))); |
| 89 | +run_test(&[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].map(|value| Union::String(format!("{value}")))); |
0 commit comments