|
1 | 1 | use core::assert_matches; |
2 | | -use std::iter; |
3 | 2 | use std::ops::Bound::{Excluded, Included, Unbounded}; |
4 | 3 | use std::panic::{AssertUnwindSafe, catch_unwind}; |
5 | 4 | use std::sync::atomic::AtomicUsize; |
6 | 5 | use std::sync::atomic::Ordering::SeqCst; |
| 6 | +use std::{cmp, iter}; |
7 | 7 |
|
8 | 8 | use super::*; |
9 | 9 | use crate::boxed::Box; |
@@ -2144,45 +2144,59 @@ macro_rules! create_merge_test { |
2144 | 2144 |
|
2145 | 2145 | a.merge(b, |_, a_val, b_val| a_val + b_val); |
2146 | 2146 |
|
2147 | | - assert_eq!(a.len(), $len); |
2148 | | - assert_eq!(b.len(), 0); |
| 2147 | + assert_eq!(a.len(), cmp::max($len, 8)); |
2149 | 2148 |
|
2150 | | - for i in 0..$len { |
| 2149 | + for i in 0..cmp::max($len, 8) { |
2151 | 2150 | if i < 5 { |
2152 | 2151 | assert_eq!(a[&i], i); |
2153 | 2152 | } else { |
2154 | | - assert_eq!(a[&i], i + 2 * i); |
| 2153 | + if i < cmp::min($len, 8) { |
| 2154 | + assert_eq!(a[&i], i + 2 * i); |
| 2155 | + } else if i >= $len { |
| 2156 | + assert_eq!(a[&i], i); |
| 2157 | + } else { |
| 2158 | + assert_eq!(a[&i], 2 * i); |
| 2159 | + } |
2155 | 2160 | } |
2156 | 2161 | } |
2157 | 2162 |
|
2158 | 2163 | a.check(); |
2159 | | - assert_eq!(a.remove(&($len - 1)), Some(($len - 1) + 2 * ($len - 1))); |
| 2164 | + assert_eq!( |
| 2165 | + a.remove(&($len - 1)), |
| 2166 | + if $len >= 5 && $len < 8 { |
| 2167 | + Some(($len - 1) + 2 * ($len - 1)) |
| 2168 | + } else { |
| 2169 | + Some(2 * ($len - 1)) |
| 2170 | + } |
| 2171 | + ); |
2160 | 2172 | assert_eq!(a.insert($len - 1, 20), None); |
2161 | 2173 | a.check(); |
2162 | 2174 | } |
2163 | 2175 | }; |
2164 | 2176 | } |
2165 | 2177 |
|
2166 | 2178 | // These are mostly for testing the algorithm that "fixes" the right edge after insertion. |
| 2179 | +// Single node, merge conflicting key values. |
| 2180 | +create_merge_test!(test_merge_7, 7); |
2167 | 2181 | // Single node. |
2168 | | -create_merge_test!(test_append_9, 9); |
| 2182 | +create_merge_test!(test_merge_9, 9); |
2169 | 2183 | // Two leafs that don't need fixing. |
2170 | | -create_merge_test!(test_append_17, 17); |
| 2184 | +create_merge_test!(test_merge_17, 17); |
2171 | 2185 | // Two leafs where the second one ends up underfull and needs stealing at the end. |
2172 | | -create_merge_test!(test_append_14, 14); |
| 2186 | +create_merge_test!(test_merge_14, 14); |
2173 | 2187 | // Two leafs where the second one ends up empty because the insertion finished at the root. |
2174 | | -create_merge_test!(test_append_12, 12); |
| 2188 | +create_merge_test!(test_merge_12, 12); |
2175 | 2189 | // Three levels; insertion finished at the root. |
2176 | | -create_merge_test!(test_append_144, 144); |
| 2190 | +create_merge_test!(test_merge_144, 144); |
2177 | 2191 | // Three levels; insertion finished at leaf while there is an empty node on the second level. |
2178 | | -create_merge_test!(test_append_145, 145); |
| 2192 | +create_merge_test!(test_merge_145, 145); |
2179 | 2193 | // Tests for several randomly chosen sizes. |
2180 | | -create_merge_test!(test_append_170, 170); |
2181 | | -create_merge_test!(test_append_181, 181); |
| 2194 | +create_merge_test!(test_merge_170, 170); |
| 2195 | +create_merge_test!(test_merge_181, 181); |
2182 | 2196 | #[cfg(not(miri))] // Miri is too slow |
2183 | | -create_merge_test!(test_append_239, 239); |
| 2197 | +create_merge_test!(test_merge_239, 239); |
2184 | 2198 | #[cfg(not(miri))] // Miri is too slow |
2185 | | -create_merge_test!(test_append_1700, 1700); |
| 2199 | +create_merge_test!(test_merge_1700, 1700); |
2186 | 2200 |
|
2187 | 2201 | #[test] |
2188 | 2202 | #[cfg_attr(not(panic = "unwind"), ignore = "test requires unwinding support")] |
@@ -2680,10 +2694,10 @@ fn test_id_based_merge() { |
2680 | 2694 | lhs.insert(IdBased { id: 0, name: "lhs_k".to_string() }, "1".to_string()); |
2681 | 2695 | rhs.insert(IdBased { id: 0, name: "rhs_k".to_string() }, "2".to_string()); |
2682 | 2696 |
|
2683 | | - lhs.merge(rhs, |_, lhs_val, rhs_val| { |
2684 | | - lhs_val.push_str(rhs_val); |
| 2697 | + lhs.merge(rhs, |_, mut lhs_val, rhs_val| { |
| 2698 | + lhs_val.push_str(&rhs_val); |
2685 | 2699 | lhs_val |
2686 | 2700 | }); |
2687 | 2701 |
|
2688 | | - assert_eq!(lhs.pop_first().unwrap().0.name, "12".to_string()); |
| 2702 | + assert_eq!(lhs.pop_first().unwrap().0.name, "lhs_k".to_string()); |
2689 | 2703 | } |
0 commit comments