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  }