go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/collections/priority_queue_test.go (about)

     1  /*
     2  
     3  Copyright (c) 2023 - Present. Will Charczuk. All rights reserved.
     4  Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository.
     5  
     6  */
     7  
     8  package collections
     9  
    10  import (
    11  	"testing"
    12  
    13  	. "go.charczuk.com/sdk/assert"
    14  )
    15  
    16  func Test_PriorityQueue(t *testing.T) {
    17  	pq := NewPriorityQueue[string]()
    18  	pq.Push("foo", 10)
    19  	pq.Push("bar", 20)
    20  	pq.Push("baz", 30)
    21  	pq.Push("moo", 5)
    22  	pq.Push("loo", 15)
    23  
    24  	ItsEqual(t, 5, pq.Len())
    25  
    26  	item, priority, ok := pq.Peek()
    27  	ItsEqual(t, true, ok)
    28  	ItsEqual(t, 5, priority)
    29  	ItsEqual(t, "moo", item)
    30  
    31  	ItsEqual(t, 5, pq.Len())
    32  
    33  	item, priority, ok = pq.Pop()
    34  	ItsEqual(t, true, ok)
    35  	ItsEqual(t, 5, priority)
    36  	ItsEqual(t, "moo", item)
    37  
    38  	ItsEqual(t, 4, pq.Len())
    39  
    40  	item, priority, ok = pq.Peek()
    41  	ItsEqual(t, true, ok)
    42  	ItsEqual(t, 10, priority)
    43  	ItsEqual(t, "foo", item)
    44  
    45  	ItsEqual(t, 4, pq.Len())
    46  
    47  	item, priority, ok = pq.Pop()
    48  	ItsEqual(t, true, ok)
    49  	ItsEqual(t, 10, priority)
    50  	ItsEqual(t, "foo", item)
    51  
    52  	ItsEqual(t, 3, pq.Len())
    53  
    54  	item, priority, ok = pq.Peek()
    55  	ItsEqual(t, true, ok)
    56  	ItsEqual(t, 15, priority)
    57  	ItsEqual(t, "loo", item)
    58  
    59  	ItsEqual(t, 3, pq.Len())
    60  
    61  	item, priority, ok = pq.Pop()
    62  	ItsEqual(t, true, ok)
    63  	ItsEqual(t, 15, priority)
    64  	ItsEqual(t, "loo", item)
    65  
    66  	ItsEqual(t, 2, pq.Len())
    67  
    68  	item, priority, ok = pq.Peek()
    69  	ItsEqual(t, true, ok)
    70  	ItsEqual(t, 20, priority)
    71  	ItsEqual(t, "bar", item)
    72  
    73  	ItsEqual(t, 2, pq.Len())
    74  
    75  	item, priority, ok = pq.Pop()
    76  	ItsEqual(t, true, ok)
    77  	ItsEqual(t, 20, priority)
    78  	ItsEqual(t, "bar", item)
    79  
    80  	ItsEqual(t, 1, pq.Len())
    81  
    82  	item, priority, ok = pq.Peek()
    83  	ItsEqual(t, true, ok)
    84  	ItsEqual(t, 30, priority)
    85  	ItsEqual(t, "baz", item)
    86  
    87  	ItsEqual(t, 1, pq.Len())
    88  
    89  	item, priority, ok = pq.Pop()
    90  	ItsEqual(t, true, ok)
    91  	ItsEqual(t, 30, priority)
    92  	ItsEqual(t, "baz", item)
    93  
    94  	ItsEqual(t, 0, pq.Len())
    95  
    96  	item, priority, ok = pq.Peek()
    97  	ItsEqual(t, false, ok)
    98  	ItsEqual(t, 0, priority)
    99  	ItsEqual(t, "", item)
   100  
   101  	ItsEqual(t, 0, pq.Len())
   102  
   103  	item, priority, ok = pq.Pop()
   104  	ItsEqual(t, false, ok)
   105  	ItsEqual(t, 0, priority)
   106  	ItsEqual(t, "", item)
   107  }
   108  
   109  func Test_PriorityQueue_PushPop(t *testing.T) {
   110  	pq := NewPriorityQueue[string]()
   111  
   112  	pq.Push("foo", 10)
   113  	pq.Push("bar", 20)
   114  	pq.Push("baz", 30)
   115  	pq.Push("moo", 5)
   116  	pq.Push("loo", 15)
   117  
   118  	item, priority, ok := pq.PushPop("woof", 25)
   119  	ItsEqual(t, true, ok)
   120  	ItsEqual(t, 5, priority)
   121  	ItsEqual(t, "moo", item)
   122  
   123  	ItsEqual(t, 5, pq.Len())
   124  
   125  	item, priority, ok = pq.Peek()
   126  	ItsEqual(t, true, ok)
   127  	ItsEqual(t, 10, priority)
   128  	ItsEqual(t, "foo", item)
   129  
   130  	item, priority, ok = pq.PushPop("doof", 5)
   131  	ItsEqual(t, true, ok)
   132  	ItsEqual(t, 10, priority)
   133  	ItsEqual(t, "foo", item)
   134  
   135  	ItsEqual(t, 5, pq.Len())
   136  
   137  	item, priority, ok = pq.Peek()
   138  	ItsEqual(t, true, ok)
   139  	ItsEqual(t, 5, priority)
   140  	ItsEqual(t, "doof", item)
   141  }
   142  
   143  func Test_PriorityQueue_PushPop_empty(t *testing.T) {
   144  	pq := NewPriorityQueue[string]()
   145  
   146  	item, priority, ok := pq.PushPop("woof", 25)
   147  	ItsEqual(t, false, ok)
   148  	ItsEqual(t, 0, priority)
   149  	ItsEqual(t, "", item)
   150  }