github.com/rudderlabs/rudder-go-kit@v0.30.0/queue/priorityQueue_test.go (about) 1 package queue 2 3 import ( 4 "container/heap" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 ) 9 10 func TestPriorityQueue(t *testing.T) { 11 t.Run("different priorities", func(t *testing.T) { 12 pq := make(PriorityQueue[any], 0) 13 heap.Init(&pq) 14 for i := 0; i < 3; i++ { 15 item := &Item[any]{ 16 Priority: i * 2, 17 } 18 heap.Push(&pq, item) 19 } 20 expectedVals := []int{4, 2, 0} 21 actualVals := make([]int, 0) 22 for len(pq) > 0 { 23 topEle := pq.Top().(Item[any]) 24 _ = pq.GetIndex(&topEle) 25 _ = heap.Pop(&pq).(*Item[any]) 26 actualVals = append(actualVals, topEle.Priority) 27 } 28 require.Equal(t, expectedVals, actualVals) 29 }) 30 31 t.Run("same priorities", func(t *testing.T) { 32 pq := make(PriorityQueue[any], 3) 33 34 for i := 0; i < 3; i++ { 35 pq[i] = &Item[any]{ 36 Priority: 1, 37 timeStamp: int64(i), 38 } 39 } 40 41 pq.Update(pq[2], 3) 42 expectedVals := []int64{2, 0, 1} 43 actualVals := make([]int64, 0) 44 for pq.Len() > 0 { 45 item := heap.Pop(&pq).(*Item[any]) 46 actualVals = append(actualVals, item.timeStamp) 47 } 48 require.Equal(t, expectedVals, actualVals) 49 }) 50 51 t.Run("nil operations", func(t *testing.T) { 52 var pq PriorityQueue[any] 53 require.Nil(t, pq.Top()) 54 require.Nil(t, pq.Pop()) 55 require.Equal(t, 0, pq.Len()) 56 }) 57 58 t.Run("pop then try to update", func(t *testing.T) { 59 pq := make(PriorityQueue[any], 3) 60 61 for i := 0; i < 3; i++ { 62 pq[i] = &Item[any]{ 63 Priority: 1, 64 timeStamp: int64(i), 65 } 66 } 67 i1 := pq.Pop().((*Item[any])) // remove the item 68 require.Len(t, pq, 2, "pq should have 2 elements after pop") 69 pq.Update(i1, i1.Priority+1) // try to update the removed item 70 require.Len(t, pq, 2, "pq should still have 2 elements after updating the popped item") 71 }) 72 }