Skip to main content

plain_ds/list/
singly_linked.rs

1//! This module contains singly-linked list implementation.
2
3use 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
10/// A singly-linked list implementation with efficient insertion at the front and back.
11///
12/// The `SinglyLinkedList` stores elements in a linear sequence where each element
13/// points to the next one. It provides O(1) push and pop_front operations.
14///
15/// # Type Parameters
16/// * `T`: The type of elements stored in the list.
17///
18///
19/// # Examples
20/// ```
21/// use plain_ds::SinglyLinkedList;
22///
23/// let mut list = SinglyLinkedList::new();
24/// list.push(1);
25/// list.push(2);
26/// list.push(3);
27///
28/// assert_eq!(list.pop(), Some(3));
29/// assert_eq!(list.len(), 2);
30/// ```
31pub struct SinglyLinkedList<T> {
32    state: ListCommon<T>,
33}
34
35impl<T> SinglyLinkedList<T> {
36    /// Creates empty singly-linked list.
37    pub fn new() -> Self {
38        Self {
39            state: ListCommon::new(),
40        }
41    }
42
43    /// Creates list from slice.
44    ///
45    /// Efficiency: O(n)
46    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    /// Collect list values into a vector.
58    ///
59    /// Efficiency: O(n)
60    pub fn to_vec(&self) -> Vec<T>
61    where
62        T: Clone,
63    {
64        self.state.to_vec()
65    }
66
67    /// Adds a new node to the front of the list.
68    ///
69    /// Efficiency: O(1)
70    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    /// Insert a new node at the specified location in the list.
82    /// Error returns, if the index out of bounds.
83    ///
84    /// Efficiency: O(n)
85    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        // Finding the insert point
102        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    /// Finds the first node whose payload satisfies the predicate and returns its index.
122    /// Returns `None` if there is no such node.
123    ///
124    /// Efficiency: O(n)
125    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    /// Sorts the list in ascending order using merge sort algorithm.
133    ///
134    /// Efficiency: O(n log n)
135    ///
136    /// Space complexity: O(log n) due to recursion stack
137    fn sort(&mut self)
138    where
139        T: PartialOrd + Default,
140    {
141        if self.state.len() <= 1 {
142            return; // Already sorted
143        }
144
145        // Extract the head and reset the list
146        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        // Sort the extracted nodes and get new head
152        let sorted_head = merge_sort(head);
153
154        // Reconstruct the list with sorted nodes
155        self.rebuild_from_sorted_list(sorted_head);
156    }
157
158    /// Rebuilds the list from a sorted list of nodes
159    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        // Traverse to find the last node and count size
169        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    /// Returns list size.
184    ///
185    /// Efficiency: O(1)
186    fn len(&self) -> usize {
187        self.state.len()
188    }
189
190    /// Returns the payload value of the first node in the list.
191    ///
192    /// Efficiency: O(1)
193    fn head(&self) -> Option<&T> {
194        self.state.head()
195    }
196
197    /// Returns the payload value of the last node in the list.
198    ///
199    /// Efficiency: O(1)
200    fn last(&self) -> Option<&T> {
201        self.state.last()
202    }
203
204    /// Returns an iterator over the immutable items of the list.
205    fn iter(&self) -> impl Iterator<Item = &'a T> {
206        self.state.iter()
207    }
208
209    /// Returns an iterator over the mutable items of the list.
210    fn iter_mut(&mut self) -> impl Iterator<Item = &'a mut T> {
211        self.state.iter_mut()
212    }
213
214    /// Returns an iterator that consumes the list.
215    fn into_iter(self) -> impl Iterator<Item = T> {
216        self.state.into_iter()
217    }
218
219    /// Adds a new node to the end of the list.
220    ///
221    /// Efficiency: O(1)
222    fn push(&mut self, payload: T) {
223        self.state.push_back(payload);
224    }
225
226    /// Removes a node from the end of the list and returns its payload value.
227    ///
228    /// Efficiency: O(n)
229    fn pop_back(&mut self) -> Option<T> {
230        self.state.pop_back()
231    }
232
233    /// Removes a node from the front of the list and returns its payload value.
234    ///
235    /// Efficiency: O(1)
236    fn pop_front(&mut self) -> Option<T> {
237        self.state.pop_front()
238    }
239
240    /// Removes a node from the specified location in the list.
241    /// Error returns, if the index out of bounds.
242    ///
243    /// Efficiency: O(n)
244    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    // Helper function to create a list with values [0, 1, 2, ..., n-1]
255    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(); // index = size - 1
325            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(); // middle element
341            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            // Test with String
367            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            // Test with Vec
379            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            // Get element in the middle
395            let _ = list.get(1).unwrap();
396
397            // Verify list is unchanged
398            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            // Verify we can still get other elements
407            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(); // last element
474            *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(); // third element
497            *mut_ref *= 2; // 30 * 2 = 60
498
499            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            // Test with String — modify by pushing more text
524            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            // Test with Vec — modify by adding elements
538            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            // Modify middle element
560            let mut_ref = list.get_mut(1).unwrap();
561            *mut_ref *= 10; // 2 becomes 20
562
563            // Verify list structure is intact
564            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            // Verify other elements are accessible and unchanged
573            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            // First modification
589            let first = list.get_mut(0).unwrap();
590            *first += 5; // 10 becomes 15
591
592            // Second modification on different element
593            let last = list.get_mut(2).unwrap();
594            *last *= 2; // 30 becomes 60
595
596            // Final verification
597            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            // Modify using get_mut
613            let mid = list.get_mut(1).unwrap();
614            *mid = 99;
615
616            // Immediately read using get
617            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            // Try to get mutable reference to out-of-bounds index
632            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            // Ensure list is still valid after failed operation
639            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            // List: [0, 1, 2]
751            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            // Try one more pop
761            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            // Push back
770            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            // Pop back
777            list.pop_back();
778            assert_eq!(list.len(), 1, "size after pop_back should be 1");
779
780            // Push front
781            list.push_front(5);
782            assert_eq!(list.len(), 2, "size after push_front(5) should be 2");
783
784            // Pop front
785            list.pop_front();
786            assert_eq!(list.len(), 1, "size after pop_front should be 1");
787
788            // Final pop
789            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            // Start: empty
799            assert_eq!(list.head(), None);
800            assert_eq!(list.last(), None);
801
802            // push(1)
803            list.push(1);
804            assert_eq!(list.head(), Some(&1));
805            assert_eq!(list.last(), Some(&1));
806
807            // push_front(0)
808            list.push_front(0);
809            assert_eq!(list.head(), Some(&0));
810            assert_eq!(list.last(), Some(&1));
811
812            // push(2)
813            list.push(2);
814            assert_eq!(list.head(), Some(&0));
815            assert_eq!(list.last(), Some(&2));
816
817            // pop_front() → removes 0
818            list.pop_front();
819            assert_eq!(list.head(), Some(&1));
820            assert_eq!(list.last(), Some(&2));
821
822            // pop_back() → removes 2
823            list.pop_back();
824            assert_eq!(list.head(), Some(&1));
825            assert_eq!(list.last(), Some(&1));
826
827            // Final pop
828            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); // [0, 1, 2]
890            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); // [0, 1]
902            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); // [0, 1, 2]
918            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            // Verify the order: [0, 50, 1, 2]
925            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); // [0, 1]
935
936            // Index greater than size
937            assert!(
938                list.insert(3, 42).is_err(),
939                "insert with index > size should return error"
940            );
941
942            // Very large index
943            assert!(
944                list.insert(100, 42).is_err(),
945                "insert with large out-of-bounds index should return error"
946            );
947
948            // Empty list with non-zero index
949            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            // Verify order: ["first", "second", "third"]
969            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            // Insert at various positions multiple times
978            assert!(list.insert(0, 10).is_ok());
979            assert!(list.insert(1, 30).is_ok());
980            assert!(list.insert(1, 20).is_ok()); // Insert between 10 and 30
981
982            assert_eq!(list.len(), 3, "final size should be 3");
983
984            // Expected order: [10, 20, 30]
985            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); // [0, 1]
994
995            // Insert in the middle
996            assert!(list.insert(1, 5).is_ok());
997
998            // Head should still be the first element
999            assert_eq!(list.head(), Some(&0), "head pointer should remain correct");
1000
1001            // Last should still be the last element
1002            assert_eq!(list.last(), Some(&1), "last pointer should remain correct");
1003        }
1004
1005        #[test]
1006        fn test_insert_edge_cases() {
1007            // Test inserting into a list with one element
1008            let mut single_element = SinglyLinkedList::new();
1009            single_element.push(100);
1010
1011            // Insert at beginning (should work)
1012            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            // Insert at end (should work)
1017            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            // Reuse the list after clearing
1109            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            // Test with String
1124            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            // Test with Vec
1140            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            // Verify the list is properly cleared
1173            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            // Ensure we can create a new list and it works correctly
1179            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            // Test that clear() works correctly regardless of list size
1191            for size in &[0, 1, 5, 10, 100] {
1192                let mut list = SinglyLinkedList::new();
1193
1194                // Fill list with values
1195                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            // Perform various operations
1239            list.push(1);
1240            list.push_front(0);
1241            list.push(2);
1242            list.pop_front(); // removes 0
1243            list.push(3);
1244
1245            // List should now be [1, 2, 3]
1246            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            // Create a large list with random-like pattern
1410            let mut data: Vec<i32> = (1..=1000).collect();
1411            // Shuffle by reversing every 10 elements
1412            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            // Perform various operations
1435            list.push(5);
1436            list.push_front(1);
1437            list.push(3);
1438            list.pop_front(); // removes 1
1439            list.push(2);
1440
1441            // List should now be [5, 3, 2]
1442            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            // Verify that last pointer is correctly set to the last node
1491            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            // Use all types of iterators sequentially
1535            {
1536                // Итератор по ссылкам
1537                let ref_count: usize = list.iter().count();
1538                assert_eq!(ref_count, 5);
1539            }
1540            {
1541                // Mutable iterator (modify all elements)
1542                for item in list.iter_mut() {
1543                    **item += 10;
1544                }
1545            }
1546            {
1547                // IntoIterator — take ownership
1548                let collected: Vec<_> = list.into_iter().collect();
1549                assert_eq!(collected, vec![10, 11, 12, 13, 14]);
1550            }
1551
1552            // After IntoIterator the list is destroyed
1553            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            // Removing elements from different positions
1573            assert_eq!(list.remove(0).unwrap(), 0);
1574            assert_eq!(list.remove(48).unwrap(), 49); // last item
1575            assert_eq!(list.remove(24).unwrap(), 25); // middle item
1576
1577            assert_eq!(
1578                tracker.alive().count(),
1579                47,
1580                "After removing 3 elements, 47 should remain alive"
1581            );
1582
1583            // Clear the list completely
1584            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            // Insert an element into the middle
1615            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            // Insert at the beginning and end
1624            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            // Perform several deletion and addition operations
1659            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                    // Just mark the deletion
1698                }
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            // Deleting multiple elements
1716            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            // Attempted to delete at an invalid index (should not cause leaks)
1752            assert!(list.remove(15).is_err());
1753
1754            // Attempt to insert at invalid index
1755            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            // Clearing the list
1764            while list.len() > 0 {
1765                let _ = list.pop_front();
1766            }
1767
1768            drop(list); // Explicit deletion
1769
1770            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 that clear() properly frees all nodes and there's no memory leak
1783        #[test]
1784        fn test_clear_no_memory_leak_with_drop_tracker() {
1785            // Create a list with tracked nodes
1786            let mut list = SinglyLinkedList::new();
1787            let mut tracker = DropTracker::new();
1788
1789            // Add several elements — each will be wrapped in DropTracker
1790            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            // Clear the list — all nodes should be freed and their Drop impl called
1800            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 memory cleanup when clear() is called on a list with complex types
1818        #[test]
1819        fn test_clear_complex_types_no_memory_leak() {
1820            let mut list = SinglyLinkedList::new();
1821            let mut tracker = DropTracker::new();
1822
1823            // Use DropTracker with String type
1824            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 that clear() works correctly even if some nodes were already dropped
1851        // through other operations
1852        #[test]
1853        fn test_clear_after_partial_removal_no_leak() {
1854            let mut list = SinglyLinkedList::new();
1855            let mut tracker = DropTracker::new();
1856
1857            // Add 4 elements
1858            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            // Remove two elements manually
1867            let _ = list.pop_front(); // drops element 1
1868            let _ = list.pop_back(); // drops element 4
1869
1870            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            // Now clear the remaining two elements
1883            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}