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 }