|
43 | 43 | }
|
44 | 44 | Some(point) => {
|
45 | 45 | count += 1;
|
46 |
| - sum += point.value().expect("present"); |
| 46 | + sum += point |
| 47 | + .value() |
| 48 | + .expect("Uninterpolated iterators are not supported"); |
47 | 49 | i += 1;
|
48 | 50 | if let Some(t) = &mut first {
|
49 | 51 | if point.interpolated() {
|
|
75 | 77 | }
|
76 | 78 | }
|
77 | 79 | }
|
| 80 | + |
| 81 | +#[cfg(test)] |
| 82 | +mod tests { |
| 83 | + use super::average; |
| 84 | + |
| 85 | + #[test] |
| 86 | + fn test_no_interpolation_average() { |
| 87 | + // Test that averaging works without interpolation. |
| 88 | + use crate::db::Point; |
| 89 | + |
| 90 | + let v = vec![ |
| 91 | + vec![("a", 0.0), ("b", 200.0)], |
| 92 | + vec![("a", 100.0), ("b", 300.0)], |
| 93 | + ]; |
| 94 | + |
| 95 | + let iterators: Vec<_> = v.into_iter().map(|v| v.into_iter()).collect(); |
| 96 | + let mut average = average(iterators); |
| 97 | + |
| 98 | + let a = average.next().unwrap(); |
| 99 | + assert_eq!(a, ("a", 50.0)); |
| 100 | + assert_eq!(a.interpolated(), false); |
| 101 | + |
| 102 | + let b = average.next().unwrap(); |
| 103 | + assert_eq!(b, ("b", 250.0)); |
| 104 | + assert_eq!(b.interpolated(), false); |
| 105 | + |
| 106 | + assert!(average.next().is_none()); |
| 107 | + } |
| 108 | + |
| 109 | + #[test] |
| 110 | + fn test_interpolation_average() { |
| 111 | + // Test that averaging works with interpolation. |
| 112 | + use crate::db::Point; |
| 113 | + use crate::interpolate::{Interpolate, Interpolated}; |
| 114 | + |
| 115 | + let v = vec![ |
| 116 | + vec![("a", Some(0.0)), ("b", Some(200.0))], |
| 117 | + vec![("a", Some(100.0)), ("b", None)], |
| 118 | + ]; |
| 119 | + |
| 120 | + let iterators: Vec<_> = v |
| 121 | + .into_iter() |
| 122 | + .map(|v| Interpolate::new(v.into_iter())) |
| 123 | + .collect(); |
| 124 | + |
| 125 | + let mut average = average(iterators); |
| 126 | + |
| 127 | + let a = average.next().unwrap(); |
| 128 | + assert_eq!(a, (("a", Some(50.0)), Interpolated::No)); |
| 129 | + assert_eq!(a.interpolated(), false); |
| 130 | + |
| 131 | + let b = average.next().unwrap(); |
| 132 | + assert_eq!(b, (("b", Some(150.0)), Interpolated::Yes)); |
| 133 | + assert_eq!(b.interpolated(), true); |
| 134 | + |
| 135 | + assert!(average.next().is_none()); |
| 136 | + } |
| 137 | + |
| 138 | + #[test] |
| 139 | + #[should_panic(expected = "Uninterpolated iterators are not supported")] |
| 140 | + fn test_uninterpolated_iterator() { |
| 141 | + let v = vec![vec![("a", Some(1.0)), ("b", Some(2.0))], vec![("a", None)]]; |
| 142 | + let iterators: Vec<_> = v.into_iter().map(|v| v.into_iter()).collect(); |
| 143 | + let _ = average(iterators).next(); |
| 144 | + } |
| 145 | + |
| 146 | + #[test] |
| 147 | + #[should_panic(expected = "Not all iterators of the same length")] |
| 148 | + fn test_unequal_length_iterators() { |
| 149 | + let v = vec![vec![("a", 1.0), ("b", 2.0)], vec![("a", 3.0)]]; |
| 150 | + let iterators: Vec<_> = v.into_iter().map(|v| v.into_iter()).collect(); |
| 151 | + for _ in average(iterators) {} |
| 152 | + } |
| 153 | +} |
0 commit comments