@@ -32,6 +32,16 @@ pub fn Deque::with_capacity[T](cap : Int) -> Deque[T] {
3232 Deque ::{ buf : UninitializedArray ::make (cap ), len : 0 , head : 0 , tail : 0 }
3333}
3434
35+ test "with_capacity" {
36+ let d : Deque [Int ] = Deque ::with_capacity (0 )
37+ @assertion .assert_eq (d .buf.length (), 0 )?
38+ }
39+
40+ test "with_capacity_non_zero" {
41+ let d : Deque [Int ] = Deque ::with_capacity (10 )
42+ @assertion .assert_eq (d .buf.length (), 10 )?
43+ }
44+
3545/// Creates a new deque from an array.
3646pub fn Deque ::from_array [T ](arr : Array [T ]) -> Deque [T ] {
3747 let deq = Deque ::{
@@ -138,6 +148,9 @@ test "front_and_back" {
138148 let dq = Deque ::[1 , 2 , 3 , 4 , 5 ]
139149 @assertion .assert_eq (dq .back (), Some (5 ))?
140150 @assertion .assert_eq (dq .front (), Some (1 ))?
151+ let dq : Deque [Int ] = Deque ::[]
152+ @assertion .assert_eq (dq .back (), None )?
153+ @assertion .assert_eq (dq .front (), None )?
141154}
142155
143156/// Adds an element to the front of the deque.
@@ -260,6 +273,22 @@ test "push_and_pop" {
260273 @assertion .assert_eq (dq .length (), 6 )?
261274 @assertion .assert_eq (dq .pop_back (), Some (8 ))?
262275 @assertion .assert_eq (dq .back (), Some (7 ))?
276+
277+ let dq = Deque ::[1 ]
278+ @assertion .assert_eq (dq .pop_front (), Some (1 ))?
279+ @assertion .assert_eq (dq .pop_front (), None )?
280+ @assertion .assert_eq (dq .pop_back (), None )?
281+ }
282+
283+ test "push_realloc" {
284+ let dq : Deque [Int ] = Deque ::with_capacity (0 )
285+ dq .push_front (1 )
286+ @assertion .assert_eq (dq .pop_front (), Some (1 ))?
287+ @assertion .assert_true (dq .capacity () > 0 )?
288+ let dq : Deque [Int ] = Deque ::with_capacity (0 )
289+ dq .push_back (1 )
290+ @assertion .assert_eq (dq .pop_back (), Some (1 ))?
291+ @assertion .assert_true (dq .capacity () > 0 )?
263292}
264293
265294/// Retrieves the element at the specified index from the deque.
@@ -282,7 +311,7 @@ pub fn op_get[T](self : Deque[T], index : Int) -> T {
282311 if self .head + index < self .buf.length () {
283312 self .buf[self .head + index ]
284313 } else {
285- self .buf[index - self .head+ 1 ]
314+ self .buf[( self .head + index ) % self .buf. length () ]
286315 }
287316}
288317
@@ -293,8 +322,9 @@ test "op_get" {
293322 @assertion .assert_eq (dq [2 ], 3 )?
294323 @assertion .assert_eq (dq [3 ], 4 )?
295324 @assertion .assert_eq (dq [4 ], 5 )?
325+ let _ = dq .pop_front ()
296326 dq .push_back (1 )
297- @assertion .assert_eq (dq [5 ], 1 )?
327+ @assertion .assert_eq (dq [4 ], 1 )?
298328 dq .push_front (2 )
299329 @assertion .assert_eq (dq [0 ], 2 )?
300330}
@@ -324,6 +354,12 @@ pub fn op_set[T](self : Deque[T], index : Int, value : T) -> Unit {
324354 }
325355}
326356
357+ test "op_set" {
358+ let dq = Deque ::[1 ,2 ,3 ,4 ,5 ]
359+ dq [1 ] = 3
360+ @assertion .assert_eq (dq [1 ], 3 )?
361+ }
362+
327363/// Compares two deques for equality.
328364pub fn op_equal [T : Eq ](self : Deque [T ], other : Deque [T ]) -> Bool {
329365 if self .len != other .len {
@@ -337,6 +373,20 @@ pub fn op_equal[T : Eq](self : Deque[T], other : Deque[T]) -> Bool {
337373 true
338374}
339375
376+ test "op_equal" {
377+ let dq1 = Deque ::[1 , 2 , 3 ]
378+ let dq2 = Deque ::[1 , 2 , 3 ]
379+ @assertion .assert_true (dq1 == dq2 )?
380+ let dq1 = Deque ::[1 , 2 , 3 ]
381+ let dq2 = Deque ::[1 , 2 , 3 ]
382+ dq2 [0 ] = 2
383+ @assertion .assert_false (dq1 == dq2 )?
384+ let dq1 = Deque ::[1 , 2 , 3 ]
385+ let dq2 = Deque ::[1 , 2 , 3 ]
386+ dq2 .push_front (1 )
387+ @assertion .assert_false (dq1 == dq2 )?
388+ }
389+
340390/// Iterates over the elements of the deque.
341391///
342392/// # Example
0 commit comments