1mod binary_heap;
115pub use crate::binary_heap::*;
116
117#[cfg(test)]
125mod from_liballoc {
126 use super::binary_heap::*;
129 #[test]
134 fn test_iterator() {
135 let data = vec![5, 9, 3];
136 let iterout = [9, 5, 3];
137 let heap = BinaryHeap::from(data);
138 let mut i = 0;
139 for el in &heap {
140 assert_eq!(*el, iterout[i]);
141 i += 1;
142 }
143 }
144
145 #[test]
146 fn test_iterator_reverse() {
147 let data = vec![5, 9, 3];
148 let iterout = vec![3, 5, 9];
149 let pq = BinaryHeap::from(data);
150
151 let v: Vec<_> = pq.iter().rev().cloned().collect();
152 assert_eq!(v, iterout);
153 }
154
155 #[test]
156 fn test_move_iter() {
157 let data = vec![5, 9, 3];
158 let iterout = vec![9, 5, 3];
159 let pq = BinaryHeap::from(data);
160
161 let v: Vec<_> = pq.into_iter().collect();
162 assert_eq!(v, iterout);
163 }
164
165 #[test]
166 fn test_move_iter_size_hint() {
167 let data = vec![5, 9];
168 let pq = BinaryHeap::from(data);
169
170 let mut it = pq.into_iter();
171
172 assert_eq!(it.size_hint(), (2, Some(2)));
173 assert_eq!(it.next(), Some(9));
174
175 assert_eq!(it.size_hint(), (1, Some(1)));
176 assert_eq!(it.next(), Some(5));
177
178 assert_eq!(it.size_hint(), (0, Some(0)));
179 assert_eq!(it.next(), None);
180 }
181
182 #[test]
183 fn test_move_iter_reverse() {
184 let data = vec![5, 9, 3];
185 let iterout = vec![3, 5, 9];
186 let pq = BinaryHeap::from(data);
187
188 let v: Vec<_> = pq.into_iter().rev().collect();
189 assert_eq!(v, iterout);
190 }
191
192 #[test]
193 fn test_into_iter_sorted_collect() {
194 let heap = BinaryHeap::from(vec![2, 4, 6, 2, 1, 8, 10, 3, 5, 7, 0, 9, 1]);
195 let it = heap.into_iter_sorted();
196 let sorted = it.collect::<Vec<_>>();
197 assert_eq!(sorted, vec![10, 9, 8, 7, 6, 5, 4, 3, 2, 2, 1, 1, 0]);
198 }
199
200 #[test]
201 fn test_peek_and_pop() {
202 let data = vec![2, 4, 6, 2, 1, 8, 10, 3, 5, 7, 0, 9, 1];
203 let mut sorted = data.clone();
204 sorted.sort();
205 let mut heap = BinaryHeap::from(data);
206 while !heap.is_empty() {
207 assert_eq!(heap.peek().unwrap(), sorted.last().unwrap());
208 assert_eq!(heap.pop().unwrap(), sorted.pop().unwrap());
209 }
210 }
211
212 #[test]
213 fn test_peek_mut() {
214 let data = vec![2, 4, 6, 2, 1, 8, 10, 3, 5, 7, 0, 9, 1];
215 let mut heap = BinaryHeap::from(data);
216 assert_eq!(heap.peek(), Some(&10));
217 {
218 let mut top = heap.peek_mut().unwrap();
219 *top -= 2;
220 }
221 assert_eq!(heap.peek(), Some(&9));
222 }
223
224 #[test]
225 fn test_peek_mut_pop() {
226 let data = vec![2, 4, 6, 2, 1, 8, 10, 3, 5, 7, 0, 9, 1];
227 let mut heap = BinaryHeap::from(data);
228 assert_eq!(heap.peek(), Some(&10));
229 {
230 let mut top = heap.peek_mut().unwrap();
231 *top -= 2;
232 assert_eq!(PeekMut::pop(top), 8);
233 }
234 assert_eq!(heap.peek(), Some(&9));
235 }
236
237 #[test]
238 fn test_push() {
239 let mut heap = BinaryHeap::from(vec![2, 4, 9]);
240 assert_eq!(heap.len(), 3);
241 assert!(*heap.peek().unwrap() == 9);
242 heap.push(11);
243 assert_eq!(heap.len(), 4);
244 assert!(*heap.peek().unwrap() == 11);
245 heap.push(5);
246 assert_eq!(heap.len(), 5);
247 assert!(*heap.peek().unwrap() == 11);
248 heap.push(27);
249 assert_eq!(heap.len(), 6);
250 assert!(*heap.peek().unwrap() == 27);
251 heap.push(3);
252 assert_eq!(heap.len(), 7);
253 assert!(*heap.peek().unwrap() == 27);
254 heap.push(103);
255 assert_eq!(heap.len(), 8);
256 assert!(*heap.peek().unwrap() == 103);
257 }
258
259 fn check_to_vec(mut data: Vec<i32>) {
282 let heap = BinaryHeap::from(data.clone());
283 let mut v = heap.clone().into_vec();
284 v.sort();
285 data.sort();
286
287 assert_eq!(v, data);
288 assert_eq!(heap.into_sorted_vec(), data);
289 }
290
291 #[test]
292 fn test_to_vec() {
293 check_to_vec(vec![]);
294 check_to_vec(vec![5]);
295 check_to_vec(vec![3, 2]);
296 check_to_vec(vec![2, 3]);
297 check_to_vec(vec![5, 1, 2]);
298 check_to_vec(vec![1, 100, 2, 3]);
299 check_to_vec(vec![1, 3, 5, 7, 9, 2, 4, 6, 8, 0]);
300 check_to_vec(vec![2, 4, 6, 2, 1, 8, 10, 3, 5, 7, 0, 9, 1]);
301 check_to_vec(vec![9, 11, 9, 9, 9, 9, 11, 2, 3, 4, 11, 9, 0, 0, 0, 0]);
302 check_to_vec(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
303 check_to_vec(vec![10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]);
304 check_to_vec(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 1, 2]);
305 check_to_vec(vec![5, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2, 1]);
306 }
307
308 #[test]
309 fn test_empty_pop() {
310 let mut heap = BinaryHeap::<i32>::new();
311 assert!(heap.pop().is_none());
312 }
313
314 #[test]
315 fn test_empty_peek() {
316 let empty = BinaryHeap::<i32>::new();
317 assert!(empty.peek().is_none());
318 }
319
320 #[test]
321 fn test_empty_peek_mut() {
322 let mut empty = BinaryHeap::<i32>::new();
323 assert!(empty.peek_mut().is_none());
324 }
325
326 #[test]
327 fn test_from_iter() {
328 let xs = vec![9, 8, 7, 6, 5, 4, 3, 2, 1];
329
330 let mut q: BinaryHeap<_> = xs.iter().rev().cloned().collect();
331
332 for &x in &xs {
333 assert_eq!(q.pop().unwrap(), x);
334 }
335 }
336
337 #[test]
338 fn test_drain() {
339 let mut q: BinaryHeap<_> = [9, 8, 7, 6, 5, 4, 3, 2, 1].iter().cloned().collect();
340
341 assert_eq!(q.drain().take(5).count(), 5);
342
343 assert!(q.is_empty());
344 }
345
346 #[test]
347 fn test_extend_ref() {
348 let mut a = BinaryHeap::new();
349 a.push(1);
350 a.push(2);
351
352 a.extend(&[3, 4, 5]);
353
354 assert_eq!(a.len(), 5);
355 assert_eq!(a.into_sorted_vec(), [1, 2, 3, 4, 5]);
356
357 let mut a = BinaryHeap::new();
358 a.push(1);
359 a.push(2);
360 let mut b = BinaryHeap::new();
361 b.push(3);
362 b.push(4);
363 b.push(5);
364
365 a.extend(&b);
366
367 assert_eq!(a.len(), 5);
368 assert_eq!(a.into_sorted_vec(), [1, 2, 3, 4, 5]);
369 }
370
371 #[test]
372 fn test_append() {
373 let mut a = BinaryHeap::from(vec![-10, 1, 2, 3, 3]);
374 let mut b = BinaryHeap::from(vec![-20, 5, 43]);
375
376 a.append(&mut b);
377
378 assert_eq!(a.into_sorted_vec(), [-20, -10, 1, 2, 3, 3, 5, 43]);
379 assert!(b.is_empty());
380 }
381
382 #[test]
383 fn test_append_to_empty() {
384 let mut a = BinaryHeap::new();
385 let mut b = BinaryHeap::from(vec![-20, 5, 43]);
386
387 a.append(&mut b);
388
389 assert_eq!(a.into_sorted_vec(), [-20, 5, 43]);
390 assert!(b.is_empty());
391 }
392
393 #[test]
394 fn test_extend_specialization() {
395 let mut a = BinaryHeap::from(vec![-10, 1, 2, 3, 3]);
396 let b = BinaryHeap::from(vec![-20, 5, 43]);
397
398 a.extend(b);
399
400 assert_eq!(a.into_sorted_vec(), [-20, -10, 1, 2, 3, 3, 5, 43]);
401 }
402
403 #[allow(dead_code)]
428 fn assert_covariance() {
429 fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
430 d
431 }
432 }
433
434 #[test]
442 #[cfg(not(target_os = "emscripten"))]
443 fn panic_safe() {
444 use std::cmp;
445 use std::panic::{self, AssertUnwindSafe};
446 use std::sync::atomic::{AtomicUsize, Ordering};
447
448 use rand::{seq::SliceRandom, thread_rng};
449
450 static DROP_COUNTER: AtomicUsize = AtomicUsize::new(0);
451
452 #[derive(Eq, PartialEq, PartialOrd, Clone, Debug)]
453 struct PanicOrd<T>(T, bool);
454
455 impl<T> Drop for PanicOrd<T> {
456 fn drop(&mut self) {
457 DROP_COUNTER.fetch_add(1, Ordering::SeqCst);
459 }
460 }
461
462 impl<T: Ord> Ord for PanicOrd<T> {
463 fn cmp(&self, other: &Self) -> cmp::Ordering {
464 if self.1 || other.1 {
465 panic!("Panicking comparison");
466 }
467 self.0.cmp(&other.0)
468 }
469 }
470 let mut rng = thread_rng();
471 const DATASZ: usize = 32;
472 let ntest = if cfg!(miri) { 1 } else { 10 };
474
475 let data = (1..=DATASZ).collect::<Vec<_>>();
477
478 for _ in 0..ntest {
480 for i in 1..=DATASZ {
481 DROP_COUNTER.store(0, Ordering::SeqCst);
482
483 let mut panic_ords: Vec<_> = data
484 .iter()
485 .filter(|&&x| x != i)
486 .map(|&x| PanicOrd(x, false))
487 .collect();
488 let panic_item = PanicOrd(i, true);
489
490 panic_ords.shuffle(&mut rng);
492 let mut heap = BinaryHeap::from(panic_ords);
493 let inner_data;
494
495 {
496 let thread_result = {
498 let mut heap_ref = AssertUnwindSafe(&mut heap);
499 panic::catch_unwind(move || {
500 heap_ref.push(panic_item);
501 })
502 };
503 assert!(thread_result.is_err());
504
505 let drops = DROP_COUNTER.load(Ordering::SeqCst);
507 assert!(drops == 0, "Must not drop items. drops={}", drops);
508 inner_data = heap.clone().into_vec();
509 drop(heap);
510 }
511 let drops = DROP_COUNTER.load(Ordering::SeqCst);
512 assert_eq!(drops, DATASZ);
513
514 let mut data_sorted = inner_data.into_iter().map(|p| p.0).collect::<Vec<_>>();
515 data_sorted.sort();
516 assert_eq!(data_sorted, data);
517 }
518 }
519 }
520}
521
522#[cfg(feature = "serde")]
523#[cfg(test)]
524mod tests_serde {
525 use super::binary_heap::*;
526 use serde_json;
527
528 #[test]
529 fn deserialized_same_small_vec() {
530 let heap = BinaryHeap::from(vec![1, 2, 3]);
531 let serialized = serde_json::to_string(&heap).unwrap();
532 let deserialized: BinaryHeap<i32> = serde_json::from_str(&serialized).unwrap();
533
534 let v0: Vec<_> = heap.into_iter().collect();
535 let v1: Vec<_> = deserialized.into_iter().collect();
536 assert_eq!(v0, v1);
537 }
538 #[test]
539 fn deserialized_same() {
540 let vec: Vec<i32> = (0..1000).collect();
541 let heap = BinaryHeap::from(vec);
542 let serialized = serde_json::to_string(&heap).unwrap();
543 let deserialized: BinaryHeap<i32> = serde_json::from_str(&serialized).unwrap();
544
545 let v0: Vec<_> = heap.into_iter().collect();
546 let v1: Vec<_> = deserialized.into_iter().collect();
547 assert_eq!(v0, v1);
548 }
549}