1#[cfg(test)]
2mod tests {
3 use crate::dheap::*;
4
5 #[test]
6 fn create_dheap() {
7 let heap: DHeap<i32> = DHeap::with_capacity(16);
8 assert_eq!(heap.size(), 1);
9 }
10
11 #[test]
12 fn allocate_and_deallocate() {
13 let heap: DHeap<i32> = DHeap::with_capacity(16);
14 let val = 42;
15
16 let dbox = heap.safe_new(val).unwrap();
17 assert_eq!(heap.size(), 2);
18 assert_eq!(*dbox, val);
19
20 let inner_val = dbox.into_inner();
21 assert_eq!(inner_val, val);
22 assert_eq!(heap.size(), 2);
23 }
24
25 #[test]
26 fn multiple_allocations() {
27 let heap: DHeap<i32> = DHeap::with_capacity(16);
28 let vals = vec![1, 2, 3, 4, 5];
29
30 let mut dboxes = Vec::new();
31 for val in &vals {
32 dboxes.push(heap.safe_new(*val).unwrap());
33 }
34
35 for (i, dbox) in dboxes.iter().enumerate() {
36 assert_eq!(**dbox, vals[i]);
37 }
38
39 assert_eq!(heap.size(), 6);
40
41 dboxes.clear();
42
43 assert_eq!(heap.size(), 6);
44
45 for val in &vals {
46 dboxes.push(heap.safe_new(*val).unwrap());
47 }
48
49 for (i, dbox) in dboxes.iter().enumerate() {
50 assert_eq!(**dbox, vals[i]);
51 }
52
53 assert_eq!(heap.size(), 6);
54
55 for dbox in dboxes {
56 dbox.into_inner();
57 }
58
59 assert_eq!(heap.size(), 6);
60 }
61
62 struct ListNode<'a> {
63 value: i32,
64 next: Option<DBox<'a, ListNode<'a>>>,
65 }
66
67 #[test]
68 fn linked_list() {
69 let heap = DHeap::with_capacity(16);
70
71 let mut prev_node: Option<DBox<ListNode>> = None;
72
73 for value in 0..10 {
74 println!("Adding {}", value);
75 let node = heap
76 .safe_new(ListNode {
77 value,
78 next: prev_node.map(|node| heap.safe_new(node.into_inner()).unwrap()),
79 })
80 .unwrap();
81 prev_node = Some(node);
82 }
83
84 for _ in 0..4 {
85 if let Some(node) = prev_node {
86 println!("Popping {}", node.value);
87 prev_node = node.into_inner().next;
88 }
89 }
90
91 for value in 0..10 {
92 println!("Adding {}", value);
93 let node = heap
94 .safe_new(ListNode {
95 value,
96 next: prev_node.map(|node| heap.safe_new(node.into_inner()).unwrap()),
97 })
98 .unwrap();
99 prev_node = Some(node);
100 }
101
102 while let Some(node) = prev_node {
103 println!("Popping {}", node.value);
104 prev_node = node.into_inner().next;
105 }
106
107 println!("Final Size {}", heap.size());
108 }
109}