1use std::ptr;
4
5use crate::list::api::List;
6use crate::core::{DSError, Result};
7use crate::core::{Node, merge_sort};
8use crate::list::common::ListCommon;
9
10pub struct SinglyLinkedList<T> {
32 state: ListCommon<T>,
33}
34
35impl<T> SinglyLinkedList<T> {
36 pub fn new() -> Self {
38 Self {
39 state: ListCommon::new(),
40 }
41 }
42
43 pub fn from_slice(slice: &[T]) -> Self
47 where
48 T: Clone,
49 {
50 let mut list = SinglyLinkedList::new();
51 for value in slice {
52 list.push((*value).clone());
53 }
54 list
55 }
56
57 pub fn to_vec(&self) -> Vec<T>
61 where
62 T: Clone,
63 {
64 self.state.to_vec()
65 }
66
67 fn push_front(&mut self, payload: T) {
71 let ptr = Box::into_raw(Box::new(Node::new(payload)));
72 if self.is_empty() {
73 self.state.last = ptr;
74 } else {
75 unsafe { (*ptr).next = self.state.head }
76 }
77 self.state.head = ptr;
78 self.state.size += 1;
79 }
80
81 fn insert(&mut self, index: usize, payload: T) -> Result<()> {
86 if index > self.state.size {
87 return Err(DSError::IndexOutOfBounds {
88 index,
89 len: self.state.size,
90 });
91 }
92 if index == self.state.size {
93 self.push(payload);
94 return Ok(());
95 }
96 if index == 0 {
97 self.push_front(payload);
98 return Ok(());
99 }
100
101 let mut current = self.state.head;
103 let mut index = index;
104 unsafe {
105 while index > 1 {
106 current = (*current).next;
107 index -= 1;
108 }
109 }
110
111 let mut boxed = Box::new(Node::new(payload));
112 unsafe {
113 boxed.next = (*current).next;
114 (*current).next = Box::into_raw(boxed);
115 }
116
117 self.state.size += 1;
118 Ok(())
119 }
120
121 fn find_if(&self, predicate: impl Fn(&T) -> bool) -> Option<usize>
126 where
127 T: PartialEq,
128 {
129 self.state.find_if(predicate)
130 }
131
132 fn sort(&mut self)
138 where
139 T: PartialOrd + Default,
140 {
141 if self.state.len() <= 1 {
142 return; }
144
145 let head = self.state.head;
147 self.state.head = ptr::null_mut();
148 self.state.last = ptr::null_mut();
149 self.state.size = 0;
150
151 let sorted_head = merge_sort(head);
153
154 self.rebuild_from_sorted_list(sorted_head);
156 }
157
158 fn rebuild_from_sorted_list(&mut self, head: *mut Node<T>) {
160 self.state.head = head;
161 self.state.size = 0;
162
163 if head.is_null() {
164 self.state.last = std::ptr::null_mut();
165 return;
166 }
167
168 let mut current = head;
170 self.state.size = 1;
171
172 unsafe {
173 while !(*current).next.is_null() {
174 current = (*current).next;
175 self.state.size += 1;
176 }
177 self.state.last = current;
178 }
179 }
180}
181
182impl<'a, T: 'a> List<'a, T> for SinglyLinkedList<T> {
183 fn len(&self) -> usize {
187 self.state.len()
188 }
189
190 fn head(&self) -> Option<&T> {
194 self.state.head()
195 }
196
197 fn last(&self) -> Option<&T> {
201 self.state.last()
202 }
203
204 fn iter(&self) -> impl Iterator<Item = &'a T> {
206 self.state.iter()
207 }
208
209 fn iter_mut(&mut self) -> impl Iterator<Item = &'a mut T> {
211 self.state.iter_mut()
212 }
213
214 fn into_iter(self) -> impl Iterator<Item = T> {
216 self.state.into_iter()
217 }
218
219 fn push(&mut self, payload: T) {
223 self.state.push_back(payload);
224 }
225
226 fn pop_back(&mut self) -> Option<T> {
230 self.state.pop_back()
231 }
232
233 fn pop_front(&mut self) -> Option<T> {
237 self.state.pop_front()
238 }
239
240 fn remove(&mut self, index: usize) -> Result<T> {
245 self.state.remove(index)
246 }
247}
248
249
250#[cfg(test)]
251mod tests {
252 use super::*;
253
254 fn setup_list(n: usize) -> SinglyLinkedList<usize> {
256 let mut list = SinglyLinkedList::new();
257 for i in 0..n {
258 list.push(i);
259 }
260 list
261 }
262
263 #[test]
264 fn test_from_slice() {
265 let list = SinglyLinkedList::from_slice(&[2, 1, 5, 4, 3]);
266 assert_eq!(list.to_vec(), [2, 1, 5, 4, 3], "The order of elements must be preserved");
267 }
268
269 mod get {
270 use super::*;
271
272 #[test]
273 fn test_get_empty_list() {
274 let list: SinglyLinkedList<i32> = SinglyLinkedList::new();
275 assert!(
276 list.get(0).is_err(),
277 "get() on empty list should return error"
278 );
279 assert!(
280 list.get(1).is_err(),
281 "get() with any index on empty list should return error"
282 );
283 }
284
285 #[test]
286 fn test_get_index_out_of_bounds() {
287 let mut list = SinglyLinkedList::new();
288 list.push(10);
289 list.push(20);
290 list.push(30);
291
292 assert!(
293 list.get(3).is_err(),
294 "get() with index == size should return error (out of bounds)"
295 );
296 assert!(
297 list.get(4).is_err(),
298 "get() with index > size should return error"
299 );
300 assert!(
301 list.get(100).is_err(),
302 "get() with large out-of-bounds index should return error"
303 );
304 }
305
306 #[test]
307 fn test_get_first_element() {
308 let mut list = SinglyLinkedList::new();
309 list.push(100);
310 list.push(200);
311 list.push(300);
312
313 let result = list.get(0).unwrap();
314 assert_eq!(*result, 100, "get(0) should return first element (100)");
315 }
316
317 #[test]
318 fn test_get_last_element() {
319 let mut list = SinglyLinkedList::new();
320 list.push(100);
321 list.push(200);
322 list.push(300);
323
324 let result = list.get(2).unwrap(); assert_eq!(
326 *result, 300,
327 "get(last_index) should return last element (300)"
328 );
329 }
330
331 #[test]
332 fn test_get_middle_element() {
333 let mut list = SinglyLinkedList::new();
334 list.push(10);
335 list.push(20);
336 list.push(30);
337 list.push(40);
338 list.push(50);
339
340 let result = list.get(2).unwrap(); assert_eq!(*result, 30, "get(2) should return middle element (30)");
342
343 let result2 = list.get(1).unwrap();
344 assert_eq!(*result2, 20, "get(1) should return second element (20)");
345 }
346
347 #[test]
348 fn test_get_single_element_list() {
349 let mut list = SinglyLinkedList::new();
350 list.push(42);
351
352 let result = list.get(0).unwrap();
353 assert_eq!(
354 *result, 42,
355 "get(0) on single-element list should return that element"
356 );
357
358 assert!(
359 list.get(1).is_err(),
360 "get(1) on single-element list should be out of bounds"
361 );
362 }
363
364 #[test]
365 fn test_get_with_complex_types() {
366 let mut string_list = SinglyLinkedList::new();
368 string_list.push("apple".to_string());
369 string_list.push("banana".to_string());
370 string_list.push("cherry".to_string());
371
372 let first = string_list.get(0).unwrap();
373 assert_eq!(first, "apple", "get(0) should return 'apple'");
374
375 let last = string_list.get(2).unwrap();
376 assert_eq!(last, "cherry", "get(2) should return 'cherry'");
377
378 let mut vec_list = SinglyLinkedList::new();
380 vec_list.push(vec![1, 2]);
381 vec_list.push(vec![3, 4]);
382
383 let vec_result = vec_list.get(1).unwrap();
384 assert_eq!(vec_result, &vec![3, 4], "get(1) should return vec![3, 4]");
385 }
386
387 #[test]
388 fn test_get_preserves_list_integrity() {
389 let mut list = SinglyLinkedList::new();
390 list.push(1);
391 list.push(2);
392 list.push(3);
393
394 let _ = list.get(1).unwrap();
396
397 assert_eq!(
399 list.len(),
400 3,
401 "list length should remain unchanged after get()"
402 );
403 assert_eq!(list.head(), Some(&1), "head should remain the same");
404 assert_eq!(list.last(), Some(&3), "last should remain the same");
405
406 assert_eq!(
408 *list.get(0).unwrap(),
409 1,
410 "get(0) after get(1) should still work"
411 );
412 assert_eq!(
413 *list.get(2).unwrap(),
414 3,
415 "get(2) after get(1) should still work"
416 );
417 }
418
419 #[test]
420 fn test_get_mut_empty_list() {
421 let mut list: SinglyLinkedList<i32> = SinglyLinkedList::new();
422 assert!(
423 list.get_mut(0).is_err(),
424 "get_mut() on empty list should return error"
425 );
426 }
427
428 #[test]
429 fn test_get_mut_index_out_of_bounds() {
430 let mut list = SinglyLinkedList::new();
431 list.push(10);
432 list.push(20);
433
434 assert!(
435 list.get_mut(2).is_err(),
436 "get_mut() with index == size should return error"
437 );
438 assert!(
439 list.get_mut(5).is_err(),
440 "get_mut() with large out-of-bounds index should return error"
441 );
442 }
443
444 #[test]
445 fn test_get_mut_first_element() {
446 let mut list = SinglyLinkedList::new();
447 list.push(100);
448 list.push(200);
449 list.push(300);
450
451 let mut_ref = list.get_mut(0).unwrap();
452 *mut_ref = 999;
453
454 assert_eq!(
455 *list.get(0).unwrap(),
456 999,
457 "first element should be modified to 999"
458 );
459 assert_eq!(
460 *list.head().unwrap(),
461 999,
462 "head should reflect the modification"
463 );
464 }
465
466 #[test]
467 fn test_get_mut_last_element() {
468 let mut list = SinglyLinkedList::new();
469 list.push(100);
470 list.push(200);
471 list.push(300);
472
473 let mut_ref = list.get_mut(2).unwrap(); *mut_ref = 888;
475
476 assert_eq!(
477 *list.get(2).unwrap(),
478 888,
479 "last element should be modified to 888"
480 );
481 assert_eq!(
482 *list.last().unwrap(),
483 888,
484 "last should reflect the modification"
485 );
486 }
487
488 #[test]
489 fn test_get_mut_middle_element() {
490 let mut list = SinglyLinkedList::new();
491 list.push(10);
492 list.push(20);
493 list.push(30);
494 list.push(40);
495
496 let mut_ref = list.get_mut(2).unwrap(); *mut_ref *= 2; assert_eq!(
500 *list.get(2).unwrap(),
501 60,
502 "middle element should be doubled to 60"
503 );
504 }
505
506 #[test]
507 fn test_get_mut_single_element_list() {
508 let mut list = SinglyLinkedList::new();
509 list.push(42);
510
511 let mut_ref = list.get_mut(0).unwrap();
512 *mut_ref += 1;
513
514 assert_eq!(
515 *list.get(0).unwrap(),
516 43,
517 "single element should be modified to 43"
518 );
519 }
520
521 #[test]
522 fn test_get_mut_with_complex_types() {
523 let mut string_list = SinglyLinkedList::new();
525 string_list.push("hello".to_string());
526 string_list.push("world".to_string());
527
528 let mut_str = string_list.get_mut(0).unwrap();
529 mut_str.push_str(" there");
530
531 assert_eq!(
532 string_list.get(0).unwrap(),
533 "hello there",
534 "first string should be modified"
535 );
536
537 let mut vec_list = SinglyLinkedList::new();
539 vec_list.push(vec![1, 2]);
540 vec_list.push(vec![3, 4]);
541
542 let mut_vec = vec_list.get_mut(1).unwrap();
543 mut_vec.push(5);
544
545 assert_eq!(
546 vec_list.get(1).unwrap(),
547 &vec![3, 4, 5],
548 "second vector should have new element"
549 );
550 }
551
552 #[test]
553 fn test_get_mut_preserves_list_integrity() {
554 let mut list = SinglyLinkedList::new();
555 list.push(1);
556 list.push(2);
557 list.push(3);
558
559 let mut_ref = list.get_mut(1).unwrap();
561 *mut_ref *= 10; assert_eq!(
565 list.len(),
566 3,
567 "list length should remain unchanged after get_mut()"
568 );
569 assert_eq!(list.head(), Some(&1), "head should remain the same");
570 assert_eq!(list.last(), Some(&3), "last should remain the same");
571
572 assert_eq!(
574 *list.get(0).unwrap(),
575 1,
576 "first element should be unchanged"
577 );
578 assert_eq!(*list.get(2).unwrap(), 3, "last element should be unchanged");
579 }
580
581 #[test]
582 fn test_multiple_get_mut_calls() {
583 let mut list = SinglyLinkedList::new();
584 list.push(10);
585 list.push(20);
586 list.push(30);
587
588 let first = list.get_mut(0).unwrap();
590 *first += 5; let last = list.get_mut(2).unwrap();
594 *last *= 2; let values: Vec<i32> = list.iter().copied().collect();
598 assert_eq!(
599 values,
600 vec![15, 20, 60],
601 "all modifications should be applied correctly"
602 );
603 }
604
605 #[test]
606 fn test_get_mut_then_get() {
607 let mut list = SinglyLinkedList::new();
608 list.push(5);
609 list.push(15);
610 list.push(25);
611
612 let mid = list.get_mut(1).unwrap();
614 *mid = 99;
615
616 let mid_value = list.get(1).unwrap();
618
619 assert_eq!(
620 *mid_value, 99,
621 "get() should reflect changes made by get_mut()"
622 );
623 }
624
625 #[test]
626 fn test_get_mut_error_propagation() {
627 let mut list = SinglyLinkedList::new();
628 list.push(1);
629 list.push(2);
630
631 let result = list.get_mut(5);
633 assert!(
634 result.is_err(),
635 "get_mut() with out-of-bounds index should return error"
636 );
637
638 assert_eq!(
640 list.len(),
641 2,
642 "list should remain unchanged after failed get_mut()"
643 );
644 assert_eq!(*list.get(0).unwrap(), 1, "first element should remain 1");
645 assert_eq!(*list.get(1).unwrap(), 2, "second element should remain 2");
646 }
647 }
648
649 mod push {
650 use super::*;
651
652 #[test]
653 fn test_push_to_empty_list_updates_head_and_last() {
654 let mut list = SinglyLinkedList::new();
655
656 list.push(100);
657 assert_eq!(list.len(), 1);
658 assert_eq!(list.head(), Some(&100));
659 assert_eq!(list.last(), Some(&100));
660
661 let mut list2 = SinglyLinkedList::new();
662 list2.push_front(200);
663 assert_eq!(list2.len(), 1);
664 assert_eq!(list2.head(), Some(&200));
665 assert_eq!(list2.last(), Some(&200));
666 }
667
668 #[test]
669 fn test_push_front() {
670 let mut list: SinglyLinkedList<u8> = SinglyLinkedList::new();
671 assert_eq!(list.len(), 0, "is_empty() returns `false` after creation");
672
673 list.push_front(1);
674 assert_eq!(list.len(), 1, "bad length after push_front()");
675 assert_eq!(list.head(), Some(&1), "incorrect head after push_front()");
676 assert_eq!(list.last(), Some(&1), "incorrect last after push_front()");
677 assert_ne!(
678 list.len(), 0,
679 "is_empty() returns `true` after push_front()"
680 );
681
682 list.push_front(2);
683 assert_eq!(list.len(), 2, "bad length after push_front()");
684 assert!(list.head().is_some(), "head is None after push_front()");
685 assert_eq!(list.head(), Some(&2), "incorrect head payload");
686 assert_eq!(list.last(), Some(&1), "incorrect last after push_front()");
687 assert_ne!(
688 list.len(), 0,
689 "is_empty() returns `true` after push_front()"
690 );
691
692 let mut list: SinglyLinkedList<String> = SinglyLinkedList::new();
693 list.push_front("hello".to_string());
694 assert_eq!(list.len(), 1, "bad length after push_front()");
695 assert!(list.head().is_some(), "head is None after push_front()");
696 assert_eq!(list.head().unwrap(), "hello", "incorrect head payload");
697
698 let mut list: SinglyLinkedList<&[char]> = SinglyLinkedList::new();
699 list.push_front(&['a', 'b', 'c']);
700 assert_eq!(list.len(), 1, "bad length after push_front()");
701 assert!(list.head().is_some(), "head is None after push_front()");
702 assert_eq!(
703 list.head().unwrap(),
704 &['a', 'b', 'c'],
705 "incorrect head payload"
706 );
707 }
708
709 #[test]
710 fn test_mix_push() {
711 let mut list: SinglyLinkedList<u8> = SinglyLinkedList::new();
712 assert_eq!(list.len(), 0, "is_empty() returns `false` after creation");
713
714 list.push(1);
715 assert_eq!(list.len(), 1, "bad length after push_back()");
716 assert_eq!(list.head(), Some(&1), "incorrect head after push_back()");
717 assert_eq!(list.last(), Some(&1), "incorrect last after push_back()");
718 assert_ne!(list.len(), 0, "is_empty() returns `true` after push_back()");
719
720 list.push_front(2);
721 assert_eq!(list.len(), 2, "bad length after push_front()");
722 assert!(list.head().is_some(), "head is None after push_front()");
723 assert_eq!(list.head(), Some(&2), "incorrect head payload");
724 assert_eq!(list.last(), Some(&1), "incorrect last after push_front()");
725 assert_ne!(
726 list.len(), 0,
727 "is_empty() returns `true` after push_front()"
728 );
729
730 list.push(3);
731 assert_eq!(list.len(), 3, "bad length after push_back()");
732 assert!(list.head().is_some(), "head is None after push_back()");
733 assert_eq!(list.head(), Some(&2), "incorrect head payload");
734 assert_eq!(list.last(), Some(&3), "incorrect last after push_back()");
735 assert_ne!(list.len(), 0, "is_empty() returns `true` after push_back()");
736 }
737 }
738
739 mod mixed {
740 use super::*;
741
742 #[test]
743 fn test_mixed_push_pop_operations() {
744 let mut list = SinglyLinkedList::new();
745
746 list.push(1);
747 list.push_front(0);
748 list.push(2);
749
750 assert_eq!(list.len(), 3);
752 assert_eq!(list.head(), Some(&0));
753 assert_eq!(list.last(), Some(&2));
754
755 assert_eq!(list.pop_front(), Some(0));
756 assert_eq!(list.pop_back(), Some(2));
757 assert_eq!(list.pop_front(), Some(1));
758 assert!(list.is_empty());
759
760 assert_eq!(list.pop_back(), None);
762 assert_eq!(list.pop_front(), None);
763 }
764
765 #[test]
766 fn test_size_consistency_after_operations() {
767 let mut list = SinglyLinkedList::new();
768
769 list.push(10);
771 assert_eq!(list.len(), 1, "size after push(10) should be 1");
772
773 list.push(20);
774 assert_eq!(list.len(), 2, "size after second push should be 2");
775
776 list.pop_back();
778 assert_eq!(list.len(), 1, "size after pop_back should be 1");
779
780 list.push_front(5);
782 assert_eq!(list.len(), 2, "size after push_front(5) should be 2");
783
784 list.pop_front();
786 assert_eq!(list.len(), 1, "size after pop_front should be 1");
787
788 list.pop_back();
790 assert_eq!(list.len(), 0, "size should be 0 after all pops");
791 assert!(list.is_empty(), "list should be empty");
792 }
793
794 #[test]
795 fn test_head_last_consistency_after_mixed_operations() {
796 let mut list = SinglyLinkedList::new();
797
798 assert_eq!(list.head(), None);
800 assert_eq!(list.last(), None);
801
802 list.push(1);
804 assert_eq!(list.head(), Some(&1));
805 assert_eq!(list.last(), Some(&1));
806
807 list.push_front(0);
809 assert_eq!(list.head(), Some(&0));
810 assert_eq!(list.last(), Some(&1));
811
812 list.push(2);
814 assert_eq!(list.head(), Some(&0));
815 assert_eq!(list.last(), Some(&2));
816
817 list.pop_front();
819 assert_eq!(list.head(), Some(&1));
820 assert_eq!(list.last(), Some(&2));
821
822 list.pop_back();
824 assert_eq!(list.head(), Some(&1));
825 assert_eq!(list.last(), Some(&1));
826
827 list.pop_front();
829 assert_eq!(list.head(), None);
830 assert_eq!(list.last(), None);
831 assert!(list.is_empty());
832 }
833 }
834
835 mod complex_types {
836 use super::*;
837
838 #[test]
839 fn test_complex_types_string() {
840 let mut list = SinglyLinkedList::new();
841 list.push("hello".to_string());
842 list.push("world".to_string());
843
844 assert_eq!(list.len(), 2);
845 assert_eq!(list.head().unwrap(), "hello");
846 assert_eq!(list.last().unwrap(), "world");
847
848 assert_eq!(list.pop_front().unwrap(), "hello".to_string());
849 assert_eq!(list.pop_back().unwrap(), "world".to_string());
850 assert!(list.is_empty());
851 }
852
853 #[test]
854 fn test_complex_types_vec() {
855 let mut list = SinglyLinkedList::new();
856 list.push(vec![1, 2]);
857 list.push(vec![3, 4]);
858
859 assert_eq!(list.len(), 2);
860 assert_eq!(list.head().unwrap(), &vec![1, 2]);
861 assert_eq!(list.last().unwrap(), &vec![3, 4]);
862
863 let popped_front = list.pop_front().unwrap();
864 assert_eq!(popped_front, vec![1, 2]);
865
866 let popped_back = list.pop_back().unwrap();
867 assert_eq!(popped_back, vec![3, 4]);
868 assert!(list.is_empty());
869 }
870 }
871
872 mod insert {
873 use super::*;
874
875 #[test]
876 fn test_insert_at_beginning_empty_list() {
877 let mut list = SinglyLinkedList::new();
878 assert!(
879 list.insert(0, 42).is_ok(),
880 "insert at index 0 in empty list should succeed"
881 );
882 assert_eq!(list.len(), 1, "list size should be 1 after insertion");
883 assert_eq!(list.head(), Some(&42), "head should contain inserted value");
884 assert_eq!(list.last(), Some(&42), "last should contain inserted value");
885 }
886
887 #[test]
888 fn test_insert_at_beginning_non_empty_list() {
889 let mut list = setup_list(3); assert!(
891 list.insert(0, 99).is_ok(),
892 "insert at beginning should succeed"
893 );
894 assert_eq!(list.len(), 4, "size should increase by 1");
895 assert_eq!(list.head(), Some(&99), "new head should be 99");
896 assert_eq!(list.find(&99), Some(0), "find should locate 99 at index 0");
897 }
898
899 #[test]
900 fn test_insert_at_end() {
901 let mut list = setup_list(2); assert!(
903 list.insert(2, 999).is_ok(),
904 "insert at end (index == size) should succeed"
905 );
906 assert_eq!(list.len(), 3, "size should increase by 1");
907 assert_eq!(list.last(), Some(&999), "last element should be 999");
908 assert_eq!(
909 list.find(&999),
910 Some(2),
911 "find should locate 999 at index 2"
912 );
913 }
914
915 #[test]
916 fn test_insert_in_middle() {
917 let mut list = setup_list(3); assert!(
919 list.insert(1, 50).is_ok(),
920 "insert in middle should succeed"
921 );
922 assert_eq!(list.len(), 4, "size should increase by 1");
923
924 let mut iter = list.iter();
926 assert_eq!(iter.next(), Some(&0));
927 assert_eq!(iter.next(), Some(&50));
928 assert_eq!(iter.next(), Some(&1));
929 assert_eq!(iter.next(), Some(&2));
930 }
931
932 #[test]
933 fn test_insert_out_of_bounds() {
934 let mut list = setup_list(2); assert!(
938 list.insert(3, 42).is_err(),
939 "insert with index > size should return error"
940 );
941
942 assert!(
944 list.insert(100, 42).is_err(),
945 "insert with large out-of-bounds index should return error"
946 );
947
948 let mut empty_list = SinglyLinkedList::new();
950 assert!(
951 empty_list.insert(1, 42).is_err(),
952 "insert to empty list with index > 0 should return error"
953 );
954 }
955
956 #[test]
957 fn test_insert_with_complex_types_string() {
958 let mut list = SinglyLinkedList::new();
959 list.push("first".to_string());
960 list.push("third".to_string());
961
962 assert!(
963 list.insert(1, "second".to_string()).is_ok(),
964 "insert string in middle should succeed"
965 );
966 assert_eq!(list.len(), 3, "size should be 3 after insertion");
967
968 let values: Vec<String> = list.iter().map(|payload| payload.clone()).collect();
970 assert_eq!(values, vec!["first", "second", "third"]);
971 }
972
973 #[test]
974 fn test_insert_multiple_times() {
975 let mut list = SinglyLinkedList::new();
976
977 assert!(list.insert(0, 10).is_ok());
979 assert!(list.insert(1, 30).is_ok());
980 assert!(list.insert(1, 20).is_ok()); assert_eq!(list.len(), 3, "final size should be 3");
983
984 let mut iter = list.iter();
986 assert_eq!(iter.next(), Some(&10));
987 assert_eq!(iter.next(), Some(&20));
988 assert_eq!(iter.next(), Some(&30));
989 }
990
991 #[test]
992 fn test_insert_preserves_head_and_last_pointers() {
993 let mut list = setup_list(2); assert!(list.insert(1, 5).is_ok());
997
998 assert_eq!(list.head(), Some(&0), "head pointer should remain correct");
1000
1001 assert_eq!(list.last(), Some(&1), "last pointer should remain correct");
1003 }
1004
1005 #[test]
1006 fn test_insert_edge_cases() {
1007 let mut single_element = SinglyLinkedList::new();
1009 single_element.push(100);
1010
1011 assert!(single_element.insert(0, 50).is_ok());
1013 assert_eq!(single_element.find(&50), Some(0));
1014 assert_eq!(single_element.find(&100), Some(1));
1015
1016 assert!(single_element.insert(2, 150).is_ok());
1018 assert_eq!(single_element.find(&150), Some(2));
1019 }
1020 }
1021
1022 mod clear {
1023 use super::*;
1024
1025 #[test]
1026 fn test_clear_empty_list() {
1027 let mut list = SinglyLinkedList::<u8>::new();
1028 assert!(list.is_empty(), "list should be empty initially");
1029
1030 list.clear();
1031
1032 assert!(
1033 list.is_empty(),
1034 "clear() on empty list should leave it empty"
1035 );
1036 assert_eq!(
1037 list.len(),
1038 0,
1039 "length should remain 0 after clear() on empty list"
1040 );
1041 assert_eq!(
1042 list.head(),
1043 None,
1044 "head should be None after clear() on empty list"
1045 );
1046 assert_eq!(
1047 list.last(),
1048 None,
1049 "last should be None after clear() on empty list"
1050 );
1051 }
1052
1053 #[test]
1054 fn test_clear_single_element_list() {
1055 let mut list = SinglyLinkedList::new();
1056 list.push(42);
1057 assert!(!list.is_empty(), "list should not be empty before clear()");
1058 assert_eq!(list.len(), 1, "list should have length 1 before clear()");
1059
1060 list.clear();
1061
1062 assert!(list.is_empty(), "list should be empty after clear()");
1063 assert_eq!(list.len(), 0, "length should be 0 after clear()");
1064 assert_eq!(list.head(), None, "head should be None after clear()");
1065 assert_eq!(list.last(), None, "last should be None after clear()");
1066 }
1067
1068 #[test]
1069 fn test_clear_multiple_elements_list() {
1070 let mut list = SinglyLinkedList::new();
1071 list.push(10);
1072 list.push(20);
1073 list.push(30);
1074 assert_eq!(list.len(), 3, "list should have 3 elements before clear()");
1075
1076 list.clear();
1077
1078 assert!(
1079 list.is_empty(),
1080 "list should be empty after clearing multiple elements"
1081 );
1082 assert_eq!(
1083 list.len(),
1084 0,
1085 "length should be 0 after clearing multiple elements"
1086 );
1087 assert_eq!(
1088 list.head(),
1089 None,
1090 "head should be None after clearing multiple elements"
1091 );
1092 assert_eq!(
1093 list.last(),
1094 None,
1095 "last should be None after clearing multiple elements"
1096 );
1097 }
1098
1099 #[test]
1100 fn test_clear_then_reuse_list() {
1101 let mut list = SinglyLinkedList::new();
1102 list.push(1);
1103 list.push(2);
1104
1105 list.clear();
1106 assert!(list.is_empty(), "list should be empty after clear()");
1107
1108 list.push(100);
1110 list.push(200);
1111
1112 assert_eq!(
1113 list.len(),
1114 2,
1115 "list should accept new elements after clear()"
1116 );
1117 assert_eq!(*list.head().unwrap(), 100, "new head should be 100");
1118 assert_eq!(*list.last().unwrap(), 200, "new last should be 200");
1119 }
1120
1121 #[test]
1122 fn test_clear_with_complex_types() {
1123 let mut string_list = SinglyLinkedList::new();
1125 string_list.push("apple".to_string());
1126 string_list.push("banana".to_string());
1127
1128 string_list.clear();
1129 assert!(
1130 string_list.is_empty(),
1131 "string list should be empty after clear()"
1132 );
1133 assert_eq!(
1134 string_list.len(),
1135 0,
1136 "string list length should be 0 after clear()"
1137 );
1138
1139 let mut vec_list = SinglyLinkedList::new();
1141 vec_list.push(vec![1, 2]);
1142 vec_list.push(vec![3, 4]);
1143
1144 vec_list.clear();
1145 assert!(
1146 vec_list.is_empty(),
1147 "vec list should be empty after clear()"
1148 );
1149 assert_eq!(
1150 vec_list.len(),
1151 0,
1152 "vec list length should be 0 after clear()"
1153 );
1154 }
1155
1156 #[test]
1157 fn test_clear_preserves_list_integrity() {
1158 let mut list = SinglyLinkedList::new();
1159 list.push(5);
1160 list.push(10);
1161 list.push(15);
1162
1163 let initial_len = list.len();
1164 let head_before = list.head().cloned();
1165 let last_before = list.last().cloned();
1166 assert_eq!(initial_len, 3);
1167 assert_eq!(head_before.unwrap(), 5);
1168 assert_eq!(last_before.unwrap(), 15);
1169
1170 list.clear();
1171
1172 assert!(list.is_empty(), "list should be empty after clear()");
1174 assert_eq!(list.len(), 0, "length should be 0 after clear()");
1175 assert_eq!(list.head(), None, "head should be None after clear()");
1176 assert_eq!(list.last(), None, "last should be None after clear()");
1177
1178 let mut new_list = SinglyLinkedList::new();
1180 new_list.push(100);
1181 assert_eq!(
1182 new_list.len(),
1183 1,
1184 "new list should work correctly after previous clear()"
1185 );
1186 }
1187
1188 #[test]
1189 fn test_clear_performance_consistency() {
1190 for size in &[0, 1, 5, 10, 100] {
1192 let mut list = SinglyLinkedList::new();
1193
1194 for i in 0..*size {
1196 list.push(i);
1197 }
1198
1199 assert_eq!(
1200 list.len(),
1201 *size,
1202 "list should have correct length before clear() for size {}",
1203 size
1204 );
1205
1206 list.clear();
1207
1208 assert!(
1209 list.is_empty(),
1210 "list of size {} should be empty after clear()",
1211 size
1212 );
1213 assert_eq!(
1214 list.len(),
1215 0,
1216 "list of size {} should have length 0 after clear()",
1217 size
1218 );
1219 assert_eq!(
1220 list.head(),
1221 None,
1222 "head should be None for cleared list of size {}",
1223 size
1224 );
1225 assert_eq!(
1226 list.last(),
1227 None,
1228 "last should be None for cleared list of size {}",
1229 size
1230 );
1231 }
1232 }
1233
1234 #[test]
1235 fn test_clear_after_mixed_operations() {
1236 let mut list = SinglyLinkedList::new();
1237
1238 list.push(1);
1240 list.push_front(0);
1241 list.push(2);
1242 list.pop_front(); list.push(3);
1244
1245 assert_eq!(
1247 list.len(),
1248 3,
1249 "list should have 3 elements after mixed operations"
1250 );
1251 assert_eq!(
1252 *list.head().unwrap(),
1253 1,
1254 "head should be 1 after mixed operations"
1255 );
1256 assert_eq!(
1257 *list.last().unwrap(),
1258 3,
1259 "last should be 3 after mixed operations"
1260 );
1261
1262 list.clear();
1263
1264 assert!(
1265 list.is_empty(),
1266 "list should be empty after clear() following mixed operations"
1267 );
1268 assert_eq!(
1269 list.len(),
1270 0,
1271 "length should be 0 after clear() following mixed operations"
1272 );
1273 assert_eq!(
1274 list.head(),
1275 None,
1276 "head should be None after clear() following mixed operations"
1277 );
1278 assert_eq!(
1279 list.last(),
1280 None,
1281 "last should be None after clear() following mixed operations"
1282 );
1283 }
1284 }
1285
1286 mod sort {
1287 use super::*;
1288
1289 #[test]
1290 fn test_sort_empty_list() {
1291 let mut list = SinglyLinkedList::<i32>::new();
1292 assert_eq!(list.len(), 0, "list should be empty initially");
1293
1294 list.sort();
1295
1296 assert_eq!(list.len(), 0, "empty list should remain empty after sort()");
1297 assert!(list.is_empty(), "empty list should be empty after sort()");
1298 }
1299
1300 #[test]
1301 fn test_sort_single_element() {
1302 let mut list = SinglyLinkedList::new();
1303 list.push(42);
1304 assert_eq!(list.len(), 1, "list should have one element");
1305
1306 list.sort();
1307
1308 assert_eq!(
1309 list.len(),
1310 1,
1311 "single element list should have same length after sort()"
1312 );
1313 let values = list.to_vec();
1314 assert_eq!(values, vec![42], "single element should remain unchanged");
1315 }
1316
1317 #[test]
1318 fn test_sort_already_sorted() {
1319 let mut list = SinglyLinkedList::from_slice(&[1, 2, 3, 4, 5]);
1320 assert_eq!(list.len(), 5, "list should have 5 elements");
1321
1322 list.sort();
1323
1324 let values = list.to_vec();
1325 assert_eq!(
1326 values,
1327 vec![1, 2, 3, 4, 5],
1328 "already sorted list should remain sorted"
1329 );
1330 }
1331
1332 #[test]
1333 fn test_sort_reverse_sorted() {
1334 let mut list = SinglyLinkedList::from_slice(&[5, 4, 3, 2, 1]);
1335 assert_eq!(list.len(), 5, "list should have 5 elements");
1336
1337 list.sort();
1338
1339 let values = list.to_vec();
1340 assert_eq!(
1341 values,
1342 vec![1, 2, 3, 4, 5],
1343 "reverse sorted list should become ascending"
1344 );
1345 }
1346
1347 #[test]
1348 fn test_sort_random_order() {
1349 let mut list = SinglyLinkedList::from_slice(&[3, 1, 4, 1, 5, 9, 2, 6]);
1350 assert_eq!(list.len(), 8, "list should have 8 elements");
1351
1352 list.sort();
1353
1354 let values = list.to_vec();
1355 assert_eq!(
1356 values,
1357 vec![1, 1, 2, 3, 4, 5, 6, 9],
1358 "random order list should be sorted correctly"
1359 );
1360 }
1361
1362 #[test]
1363 fn test_sort_with_duplicates() {
1364 let mut list = SinglyLinkedList::from_slice(&[2, 2, 1, 1, 3, 3]);
1365 assert_eq!(list.len(), 6, "list should have 6 elements");
1366
1367 list.sort();
1368
1369 let values = list.to_vec();
1370 assert_eq!(
1371 values,
1372 vec![1, 1, 2, 2, 3, 3],
1373 "list with duplicates should be sorted with duplicates preserved"
1374 );
1375 }
1376
1377 #[test]
1378 fn test_sort_two_elements_unsorted() {
1379 let mut list = SinglyLinkedList::from_slice(&[2, 1]);
1380 assert_eq!(list.len(), 2, "list should have 2 elements");
1381
1382 list.sort();
1383
1384 let values = list.to_vec();
1385 assert_eq!(
1386 values,
1387 vec![1, 2],
1388 "two elements should be sorted in ascending order"
1389 );
1390 }
1391
1392 #[test]
1393 fn test_sort_two_elements_sorted() {
1394 let mut list = SinglyLinkedList::from_slice(&[1, 2]);
1395 assert_eq!(list.len(), 2, "list should have 2 elements");
1396
1397 list.sort();
1398
1399 let values = list.to_vec();
1400 assert_eq!(
1401 values,
1402 vec![1, 2],
1403 "already sorted two elements should remain the same"
1404 );
1405 }
1406
1407 #[test]
1408 fn test_sort_large_list() {
1409 let mut data: Vec<i32> = (1..=1000).collect();
1411 for chunk in data.chunks_mut(10) {
1413 chunk.reverse();
1414 }
1415
1416 let mut list = SinglyLinkedList::new();
1417 for &value in &data {
1418 list.push(value);
1419 }
1420
1421 assert_eq!(list.len(), 1000, "large list should have 1000 elements");
1422
1423 list.sort();
1424
1425 let sorted_data: Vec<i32> = (1..=1000).collect();
1426 let values = list.to_vec();
1427 assert_eq!(values, sorted_data, "large list should be sorted correctly");
1428 }
1429
1430 #[test]
1431 fn test_sort_after_operations() {
1432 let mut list = SinglyLinkedList::new();
1433
1434 list.push(5);
1436 list.push_front(1);
1437 list.push(3);
1438 list.pop_front(); list.push(2);
1440
1441 assert_eq!(
1443 list.len(),
1444 3,
1445 "list should have 3 elements after mixed operations"
1446 );
1447
1448 list.sort();
1449
1450 let values = list.to_vec();
1451 assert_eq!(
1452 values,
1453 vec![2, 3, 5],
1454 "list after mixed operations should be sorted correctly"
1455 );
1456 }
1457
1458 #[test]
1459 fn test_sort_string_list() {
1460 let mut list = SinglyLinkedList::new();
1461 list.push("zebra".to_string());
1462 list.push("apple".to_string());
1463 list.push("banana".to_string());
1464 list.push("cherry".to_string());
1465
1466 assert_eq!(list.len(), 4, "string list should have 4 elements");
1467
1468 list.sort();
1469
1470 let values: Vec<String> = list.into_iter().collect();
1471
1472 assert_eq!(
1473 values,
1474 vec![
1475 "apple".to_string(),
1476 "banana".to_string(),
1477 "cherry".to_string(),
1478 "zebra".to_string()
1479 ],
1480 "string list should be sorted alphabetically"
1481 );
1482 }
1483
1484 #[test]
1485 fn test_sort_preserves_last_pointer() {
1486 let mut list = SinglyLinkedList::from_slice(&[3, 1, 4, 2]);
1487
1488 list.sort();
1489
1490 let last_value = unsafe { (*list.state.last).payload };
1492 assert_eq!(
1493 last_value, 4,
1494 "last pointer should point to the maximum element after sorting"
1495 );
1496 }
1497 }
1498
1499 mod memory_leaks {
1500 use super::*;
1501 use drop_tracker::DropTracker;
1502
1503 #[test]
1504 fn test_memory_leaks() {
1505 let mut tracker = DropTracker::new();
1506
1507 let mut list = SinglyLinkedList::new();
1508 for i in 0..100 {
1509 list.push(tracker.track(i));
1510 }
1511 for i in 100..111 {
1512 list.push_front(tracker.track(i));
1513 }
1514
1515 assert_eq!(tracker.alive().count(), 111);
1516
1517 drop(list);
1518
1519 assert_eq!(tracker.alive().count(), 0);
1520 assert_eq!(tracker.dropped().count(), 111);
1521 }
1522
1523 #[test]
1524 fn test_iterators_with_drop_tracker() {
1525 let mut tracker = DropTracker::new();
1526
1527 let mut list = SinglyLinkedList::new();
1528 for i in 0..5 {
1529 list.push(tracker.track(i));
1530 }
1531
1532 assert_eq!(tracker.alive().count(), 5);
1533
1534 {
1536 let ref_count: usize = list.iter().count();
1538 assert_eq!(ref_count, 5);
1539 }
1540 {
1541 for item in list.iter_mut() {
1543 **item += 10;
1544 }
1545 }
1546 {
1547 let collected: Vec<_> = list.into_iter().collect();
1549 assert_eq!(collected, vec![10, 11, 12, 13, 14]);
1550 }
1551
1552 assert_eq!(tracker.alive().count(), 0);
1554 assert_eq!(tracker.dropped().count(), 5);
1555 }
1556
1557 #[test]
1558 fn test_memory_leaks_with_remove_operations() {
1559 let mut tracker = DropTracker::new();
1560
1561 let mut list = SinglyLinkedList::new();
1562 for i in 0..50 {
1563 list.push(tracker.track(i));
1564 }
1565
1566 assert_eq!(
1567 tracker.alive().count(),
1568 50,
1569 "50 elements should be alive after push"
1570 );
1571
1572 assert_eq!(list.remove(0).unwrap(), 0);
1574 assert_eq!(list.remove(48).unwrap(), 49); assert_eq!(list.remove(24).unwrap(), 25); assert_eq!(
1578 tracker.alive().count(),
1579 47,
1580 "After removing 3 elements, 47 should remain alive"
1581 );
1582
1583 while list.len() > 0 {
1585 let _ = list.pop_front();
1586 }
1587
1588 assert_eq!(
1589 tracker.alive().count(),
1590 0,
1591 "All elements should be dropped after clearing the list"
1592 );
1593 assert_eq!(
1594 tracker.dropped().count(),
1595 50,
1596 "All 50 elements should have been dropped"
1597 );
1598 }
1599
1600 #[test]
1601 fn test_memory_leaks_with_insert_operations() {
1602 let mut tracker = DropTracker::new();
1603
1604 let mut list = SinglyLinkedList::new();
1605 list.push(tracker.track(1));
1606 list.push(tracker.track(3));
1607
1608 assert_eq!(
1609 tracker.alive().count(),
1610 2,
1611 "2 elements should be alive initially"
1612 );
1613
1614 list.insert(1, tracker.track(2)).unwrap();
1616
1617 assert_eq!(
1618 tracker.alive().count(),
1619 3,
1620 "3 elements should be alive after insert"
1621 );
1622
1623 list.insert(0, tracker.track(0)).unwrap();
1625 list.insert(3, tracker.track(4)).unwrap();
1626
1627 assert_eq!(
1628 tracker.alive().count(),
1629 5,
1630 "5 elements should be alive after all inserts"
1631 );
1632
1633 drop(list);
1634
1635 assert_eq!(
1636 tracker.alive().count(),
1637 0,
1638 "All elements should be dropped when list is dropped"
1639 );
1640 assert_eq!(
1641 tracker.dropped().count(),
1642 5,
1643 "All 5 elements should have been dropped"
1644 );
1645 }
1646
1647 #[test]
1648 fn test_memory_leaks_partial_operations() {
1649 let mut tracker = DropTracker::new();
1650
1651 let mut list = SinglyLinkedList::new();
1652 for i in 0..20 {
1653 list.push(tracker.track(i));
1654 }
1655
1656 assert_eq!(tracker.alive().count(), 20, "20 elements should be alive");
1657
1658 for _ in 0..5 {
1660 let _ = list.pop_back();
1661 }
1662 for i in 100..103 {
1663 list.push_front(tracker.track(i));
1664 }
1665
1666 assert!(
1667 tracker.alive().count() < 20,
1668 "Fewer elements should be alive after partial operations"
1669 );
1670
1671 drop(list);
1672
1673 assert_eq!(
1674 tracker.alive().count(),
1675 0,
1676 "All remaining elements should be dropped"
1677 );
1678 assert_eq!(
1679 tracker.dropped().count(),
1680 23,
1681 "Total 23 elements should have been dropped (20 original + 3 added - 5 removed)"
1682 );
1683 }
1684
1685 #[test]
1686 fn test_memory_leaks_with_complex_types() {
1687 let mut tracker = DropTracker::new();
1688
1689 #[derive(Debug, PartialEq, Eq, Hash, Clone)]
1690 struct ComplexStruct {
1691 id: usize,
1692 data: String,
1693 }
1694
1695 impl Drop for ComplexStruct {
1696 fn drop(&mut self) {
1697 }
1699 }
1700
1701 let mut list = SinglyLinkedList::new();
1702 for i in 0..15 {
1703 list.push(tracker.track(ComplexStruct {
1704 id: i,
1705 data: format!("data_{}", i),
1706 }));
1707 }
1708
1709 assert_eq!(
1710 tracker.alive().count(),
1711 15,
1712 "15 ComplexStruct elements should be alive"
1713 );
1714
1715 for _ in 0..3 {
1717 let _ = list.pop_front();
1718 }
1719
1720 assert_eq!(
1721 tracker.alive().count(),
1722 12,
1723 "12 ComplexStruct elements should remain alive"
1724 );
1725
1726 drop(list);
1727
1728 assert_eq!(
1729 tracker.alive().count(),
1730 0,
1731 "All ComplexStruct elements should be dropped"
1732 );
1733 assert_eq!(
1734 tracker.dropped().count(),
1735 15,
1736 "All 15 ComplexStruct elements should have been dropped"
1737 );
1738 }
1739
1740 #[test]
1741 fn test_memory_leaks_error_conditions() {
1742 let mut tracker = DropTracker::new();
1743
1744 let mut list = SinglyLinkedList::new();
1745 for i in 0..10 {
1746 list.push(tracker.track(i));
1747 }
1748
1749 assert_eq!(tracker.alive().count(), 10, "10 elements should be alive");
1750
1751 assert!(list.remove(15).is_err());
1753
1754 assert!(list.insert(15, tracker.track(99)).is_err());
1756
1757 assert_eq!(
1758 tracker.alive().count(),
1759 10,
1760 "10 elements should be alive (10 original + 1 attempted insert)"
1761 );
1762
1763 while list.len() > 0 {
1765 let _ = list.pop_front();
1766 }
1767
1768 drop(list); assert_eq!(
1771 tracker.alive().count(),
1772 0,
1773 "All elements should be dropped even after error conditions"
1774 );
1775 assert_eq!(
1776 tracker.dropped().count(),
1777 11,
1778 "All 11 elements should have been dropped"
1779 );
1780 }
1781
1782 #[test]
1784 fn test_clear_no_memory_leak_with_drop_tracker() {
1785 let mut list = SinglyLinkedList::new();
1787 let mut tracker = DropTracker::new();
1788
1789 list.push(tracker.track(10));
1791 list.push(tracker.track(20));
1792 list.push(tracker.track(30));
1793 list.push(tracker.track(40));
1794 list.push(tracker.track(50));
1795
1796 assert_eq!(list.len(), 5, "list should have 5 elements before clear()");
1797 assert_eq!(tracker.alive().count(), 5, "no nodes should be dropped yet");
1798
1799 list.clear();
1801
1802 assert!(list.is_empty(), "list should be empty after clear()");
1803 assert_eq!(list.len(), 0, "length should be 0 after clear()");
1804 assert_eq!(
1805 tracker.alive().count(),
1806 0,
1807 "all 5 nodes should be dropped during clear()"
1808 );
1809
1810 assert_eq!(
1811 tracker.dropped().count(),
1812 5,
1813 "no additional drops should happen after list destruction"
1814 );
1815 }
1816
1817 #[test]
1819 fn test_clear_complex_types_no_memory_leak() {
1820 let mut list = SinglyLinkedList::new();
1821 let mut tracker = DropTracker::new();
1822
1823 list.push(tracker.track("first".to_string()));
1825 list.push(tracker.track("second".to_string()));
1826 list.push(tracker.track("third".to_string()));
1827
1828 assert_eq!(list.len(), 3, "complex type list should have correct size");
1829 assert_eq!(tracker.alive().count(), 3, "no drops before clear()");
1830
1831 list.clear();
1832
1833 assert!(
1834 list.is_empty(),
1835 "complex type list should be empty after clear()"
1836 );
1837 assert_eq!(
1838 tracker.alive().count(),
1839 0,
1840 "all 3 complex nodes should be dropped during clear()"
1841 );
1842
1843 assert_eq!(
1844 tracker.dropped().count(),
1845 3,
1846 "no extra drops after complex list destruction"
1847 );
1848 }
1849
1850 #[test]
1853 fn test_clear_after_partial_removal_no_leak() {
1854 let mut list = SinglyLinkedList::new();
1855 let mut tracker = DropTracker::new();
1856
1857 list.push(tracker.track(1));
1859 list.push(tracker.track(2));
1860 list.push(tracker.track(3));
1861 list.push(tracker.track(4));
1862
1863 assert_eq!(list.len(), 4, "initial list size should be 4");
1864 assert_eq!(tracker.alive().count(), 4, "no drops at start");
1865
1866 let _ = list.pop_front(); let _ = list.pop_back(); assert_eq!(list.len(), 2, "list size should be 2 after partial removal");
1871 assert_eq!(
1872 tracker.alive().count(),
1873 2,
1874 "2 nodes should be dropped by pop_front and pop_back"
1875 );
1876 assert_eq!(
1877 tracker.dropped().count(),
1878 2,
1879 "2 nodes should be dropped by pop_front and pop_back"
1880 );
1881
1882 list.clear();
1884
1885 assert!(list.is_empty(), "list should be empty after final clear()");
1886 assert_eq!(
1887 tracker.alive().count(),
1888 0,
1889 "total 4 nodes should be dropped (2 by pop, 2 by clear)"
1890 );
1891
1892 assert_eq!(
1893 tracker.dropped().count(),
1894 4,
1895 "no extra drops after list destruction"
1896 );
1897 }
1898 }
1899}