r_collections/list/
queue.rs

1use crate::traits::{collection::Collection, list::{List, ListResults}};
2
3use super::linked_list::LinkedList;
4
5#[derive(Debug, Clone)]
6pub struct Queue<T: Clone + PartialEq> {
7    list: LinkedList<T>,
8}
9
10impl<T: Clone + PartialEq> Queue<T> {
11
12    pub fn new() -> Self {
13        Self {list: LinkedList::<T>::new()}
14    }
15
16    pub fn dequeue(&mut self) -> Result<T, ListResults> {
17        let result = self.list.remove(0);
18        match result {
19            Err(err) => return Err(err),
20            Ok(item) => {
21                return Ok(item);
22            },
23        }
24    }
25}
26
27impl<T: Clone + PartialEq> Collection<T> for Queue<T> {
28
29    fn is_empty(&self) -> bool {
30        self.list.len() == 0
31    }
32
33    fn len(&self) -> usize {
34        self.list.len()
35    }
36
37    fn contains(&self, data: T) -> bool {
38        self.list.contains(data)
39    }
40
41    fn insert(&mut self, data: T) {
42        self.list.append(data);
43    }
44}
45
46#[cfg(test)]
47
48mod queue_tests {
49    use crate::traits::collection::Collection;
50    use super::Queue;
51
52    #[test]
53    fn create_new_queue() {
54        let queue = Queue::<i8>::new();
55        assert!(queue.is_empty());
56        assert_eq!(queue.len(), 0);
57    }
58
59    #[test]
60    fn insert_test_if_queue_is_empty() {
61        let data = 1i8;
62        let mut queue = Queue::<i8>::new();
63
64        assert!(queue.is_empty());
65
66        queue.insert(data);
67
68        assert!(!queue.is_empty());
69        assert_eq!(queue.len(), 1);
70    }
71
72    #[test]
73    fn insert_test_with_many_items() {
74
75        let mut queue = Queue::<i8>::new();
76        assert!(queue.is_empty());
77
78        for i in 0..10 {
79            queue.insert(i);
80        }
81
82        assert_eq!(queue.len(), 10);
83
84
85    }
86
87    #[test]
88    fn dequeue_test() {
89        let mut queue = Queue::<i8>::new();
90
91        for i in 0..10 {
92            queue.insert(i);
93        }
94
95        assert!(!queue.is_empty());
96        assert_eq!(queue.len(), 10);
97
98        match queue.dequeue() {
99            Ok(item) => {
100                assert_eq!(item, 0);
101            },
102            Err(_) => panic!("Result must be some"),
103        }
104
105        assert_eq!(queue.len(), 9);
106    }
107
108    #[test]
109    fn dequeue_test_if_queue_is_empty() {
110        let mut queue = Queue::<i8>::new();
111
112        assert!(queue.is_empty());
113
114        match queue.dequeue() {
115            Ok(_) => panic!("Must be ListIsEmpty"),
116            Err(_) => (),
117        }
118    }
119
120    #[test]
121    fn queue_contains_test_if_item_contained() {
122        let data = 1i8;
123        let mut queue = Queue::<i8>::new();
124        queue.insert(data);
125        assert!(queue.contains(data));
126    }
127
128    #[test]
129    fn queue_contains_test_if_item_does_not_contained() {
130        let mut queue = Queue::<i8>::new();
131
132        queue.insert(1i8);
133
134        assert!(!queue.contains(2i8));
135    }
136}