|
81 | 81 | fn next(&mut self) -> Option<Self::Item> {
|
82 | 82 | if let Some(mut item) = self.consumed.pop() {
|
83 | 83 | item.set_value(self.last_seen.unwrap());
|
84 |
| - return Some((item, Interpolated::Yes)); |
| 84 | + let interpolation = if self.consumed.is_empty() { |
| 85 | + Interpolated::No |
| 86 | + } else { |
| 87 | + Interpolated::Yes |
| 88 | + }; |
| 89 | + return Some((item, interpolation)); |
85 | 90 | }
|
86 | 91 |
|
87 | 92 | let mut item = self.iterator.next()?;
|
@@ -131,3 +136,63 @@ where
|
131 | 136 | }
|
132 | 137 | }
|
133 | 138 | }
|
| 139 | + |
| 140 | +#[cfg(test)] |
| 141 | +mod tests { |
| 142 | + use super::{Interpolate, Interpolated}; |
| 143 | + |
| 144 | + #[test] |
| 145 | + fn test_no_interpolation() { |
| 146 | + let v = vec![("a", 1.0), ("b", 2.0)]; |
| 147 | + let mut iter = Interpolate::new(v.into_iter()); |
| 148 | + |
| 149 | + assert_eq!(iter.next().unwrap(), (("a", 1.0), Interpolated::No)); |
| 150 | + assert_eq!(iter.next().unwrap(), (("b", 2.0), Interpolated::No)); |
| 151 | + assert!(iter.next().is_none()); |
| 152 | + } |
| 153 | + |
| 154 | + #[test] |
| 155 | + fn test_leading_interpolation() { |
| 156 | + let v = vec![("a", None), ("b", None), ("c", Some(3.0)), ("d", Some(4.0))]; |
| 157 | + let mut iter = Interpolate::new(v.into_iter()); |
| 158 | + |
| 159 | + assert_eq!(iter.next().unwrap(), (("a", Some(3.0)), Interpolated::Yes)); |
| 160 | + assert_eq!(iter.next().unwrap(), (("b", Some(3.0)), Interpolated::Yes)); |
| 161 | + assert_eq!(iter.next().unwrap(), (("c", Some(3.0)), Interpolated::No)); |
| 162 | + assert_eq!(iter.next().unwrap(), (("d", Some(4.0)), Interpolated::No)); |
| 163 | + assert!(iter.next().is_none()); |
| 164 | + } |
| 165 | + |
| 166 | + #[test] |
| 167 | + fn test_inner_interpolation() { |
| 168 | + let v = vec![ |
| 169 | + ("a", Some(1.0)), |
| 170 | + ("b", Some(2.0)), |
| 171 | + ("c", None), |
| 172 | + ("d", None), |
| 173 | + ("e", Some(5.0)), |
| 174 | + ("f", Some(6.0)), |
| 175 | + ]; |
| 176 | + let mut iter = Interpolate::new(v.into_iter()); |
| 177 | + |
| 178 | + assert_eq!(iter.next().unwrap(), (("a", Some(1.0)), Interpolated::No)); |
| 179 | + assert_eq!(iter.next().unwrap(), (("b", Some(2.0)), Interpolated::No)); |
| 180 | + assert_eq!(iter.next().unwrap(), (("c", Some(2.0)), Interpolated::Yes)); |
| 181 | + assert_eq!(iter.next().unwrap(), (("d", Some(2.0)), Interpolated::Yes)); |
| 182 | + assert_eq!(iter.next().unwrap(), (("e", Some(5.0)), Interpolated::No)); |
| 183 | + assert_eq!(iter.next().unwrap(), (("f", Some(6.0)), Interpolated::No)); |
| 184 | + assert!(iter.next().is_none()); |
| 185 | + } |
| 186 | + |
| 187 | + #[test] |
| 188 | + fn test_trailing_interpolation() { |
| 189 | + let v = vec![("a", Some(1.0)), ("b", Some(2.0)), ("c", None), ("d", None)]; |
| 190 | + let mut iter = Interpolate::new(v.into_iter()); |
| 191 | + |
| 192 | + assert_eq!(iter.next().unwrap(), (("a", Some(1.0)), Interpolated::No)); |
| 193 | + assert_eq!(iter.next().unwrap(), (("b", Some(2.0)), Interpolated::No)); |
| 194 | + assert_eq!(iter.next().unwrap(), (("c", Some(2.0)), Interpolated::Yes)); |
| 195 | + assert_eq!(iter.next().unwrap(), (("d", Some(2.0)), Interpolated::Yes)); |
| 196 | + assert!(iter.next().is_none()); |
| 197 | + } |
| 198 | +} |
0 commit comments