Skip to content

Commit c0d8368

Browse files
author
Nikola Yurukov
committed
[Test] Return typed errors for Fibonacci heap
1 parent 6124dc8 commit c0d8368

File tree

2 files changed

+53
-27
lines changed

2 files changed

+53
-27
lines changed

fibheap/fibheap.go

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,22 @@ type Entry struct {
9595
Priority float64
9696
}
9797

98+
// EmptyHeapError fires when the heap is empty and an operation could
99+
// not be completed for that reason. Its string holds additional data.
100+
type EmptyHeapError string
101+
102+
func (e EmptyHeapError) Error() string {
103+
return string(e)
104+
}
105+
106+
// NilError fires when a heap or entry is nil and an operation could
107+
// not be completed for that reason. Its string holds additional data.
108+
type NilError string
109+
110+
func (e NilError) Error() string {
111+
return string(e)
112+
}
113+
98114
// NewFloatFibHeap creates a new, empty, Fibonacci heap object.
99115
func NewFloatFibHeap() FloatingFibonacciHeap { return FloatingFibonacciHeap{nil, 0} }
100116

@@ -111,7 +127,7 @@ func (heap *FloatingFibonacciHeap) Enqueue(priority float64) *Entry {
111127
// Min returns the minimum element in the heap
112128
func (heap *FloatingFibonacciHeap) Min() (*Entry, error) {
113129
if heap.IsEmpty() {
114-
return nil, fmt.Errorf("Trying to get minimum element of empty heap")
130+
return nil, EmptyHeapError("Trying to get minimum element of empty heap")
115131
}
116132
return heap.min, nil
117133
}
@@ -130,7 +146,7 @@ func (heap *FloatingFibonacciHeap) Size() uint {
130146
// minimal element in the heap
131147
func (heap *FloatingFibonacciHeap) DequeueMin() (*Entry, error) {
132148
if heap.IsEmpty() {
133-
return nil, fmt.Errorf("Cannot dequeue minimum of empty heap")
149+
return nil, EmptyHeapError("Cannot dequeue minimum of empty heap")
134150
}
135151

136152
heap.size--
@@ -227,22 +243,19 @@ func (heap *FloatingFibonacciHeap) DequeueMin() (*Entry, error) {
227243
}
228244
}
229245

230-
// All done. Return minimum element and no error
231246
return min, nil
232247
}
233248

234-
// DecreaseKey decreases the key of the
235-
// given element, sets it to the new
236-
// given priority and returns the node
237-
// if successfully set
249+
// DecreaseKey decreases the key of the given element, sets it to the new
250+
// given priority and returns the node if successfully set
238251
func (heap *FloatingFibonacciHeap) DecreaseKey(node *Entry, newPriority float64) (*Entry, error) {
239252

240253
if heap.IsEmpty() {
241-
return nil, fmt.Errorf("Cannot decrease key in an empty heap")
254+
return nil, EmptyHeapError("Cannot decrease key in an empty heap")
242255
}
243256

244257
if node == nil {
245-
return nil, fmt.Errorf("Cannot decrease key: given node is nil")
258+
return nil, NilError("Cannot decrease key: given node is nil")
246259
}
247260

248261
if newPriority >= node.Priority {
@@ -258,11 +271,11 @@ func (heap *FloatingFibonacciHeap) DecreaseKey(node *Entry, newPriority float64)
258271
func (heap *FloatingFibonacciHeap) Delete(node *Entry) error {
259272

260273
if heap.IsEmpty() {
261-
return fmt.Errorf("Cannot delete element from an empty heap")
274+
return EmptyHeapError("Cannot delete element from an empty heap")
262275
}
263276

264277
if node == nil {
265-
return fmt.Errorf("Cannot delete node: given node is nil")
278+
return NilError("Cannot delete node: given node is nil")
266279
}
267280

268281
decreaseKeyUnchecked(heap, node, -math.MaxFloat64)
@@ -278,7 +291,7 @@ func (heap *FloatingFibonacciHeap) Delete(node *Entry) error {
278291
func (heap *FloatingFibonacciHeap) Merge(other *FloatingFibonacciHeap) (FloatingFibonacciHeap, error) {
279292

280293
if heap == nil || other == nil {
281-
return FloatingFibonacciHeap{}, fmt.Errorf("One of the heaps to merge is nil. Cannot merge")
294+
return FloatingFibonacciHeap{}, NilError("One of the heaps to merge is nil. Cannot merge")
282295
}
283296

284297
resultSize := heap.size + other.size

fibheap/fibheap_test.go

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"math/rand"
99

1010
"github.com/stretchr/testify/assert"
11+
"github.com/stretchr/testify/require"
1112
)
1213

1314
// Go does not have constant arrays.
@@ -132,7 +133,7 @@ func TestEnqueueDequeueMin(t *testing.T) {
132133
var err error
133134
for heap.Size() > 0 {
134135
min, err = heap.DequeueMin()
135-
assert.NoError(t, err)
136+
require.NoError(t, err)
136137
if heap.Size() == 199 {
137138
assert.Equal(t, Seq1FirstMinimum, min.Priority)
138139
}
@@ -155,19 +156,20 @@ func TestFibHeap_Enqueue_Min(t *testing.T) {
155156
}
156157

157158
min, err := heap.Min()
158-
assert.NoError(t, err)
159+
require.NoError(t, err)
159160
assert.Equal(t, Seq1FirstMinimum, min.Priority)
160161
}
161162

162163
func TestFibHeap_Min_EmptyHeap(t *testing.T) {
163164
heap := NewFloatFibHeap()
164165

165166
heap.Enqueue(0)
166-
heap.DequeueMin()
167+
min, err := heap.DequeueMin()
168+
require.NoError(t, err)
167169

168170
// Heap should be empty at this point
169171

170-
min, err := heap.Min()
172+
min, err = heap.Min()
171173

172174
assert.EqualError(t, err, "Trying to get minimum element of empty heap")
173175
assert.Nil(t, min)
@@ -177,6 +179,7 @@ func TestFibHeap_DequeueMin_EmptyHeap(t *testing.T) {
177179
heap := NewFloatFibHeap()
178180
min, err := heap.DequeueMin()
179181

182+
assert.IsType(t, EmptyHeapError(""), err)
180183
assert.EqualError(t, err, "Cannot dequeue minimum of empty heap")
181184
assert.Nil(t, min)
182185
}
@@ -196,19 +199,21 @@ func TestEnqueueDecreaseKey(t *testing.T) {
196199
}
197200
}
198201

199-
assert.NotNil(t, e1)
200-
assert.NotNil(t, e2)
201-
assert.NotNil(t, e3)
202+
require.NotNil(t, e1)
203+
require.NotNil(t, e2)
204+
require.NotNil(t, e3)
202205

203-
heap.DecreaseKey(e1, Seq2DecreaseKey1Trgt)
204-
heap.DecreaseKey(e2, Seq2DecreaseKey2Trgt)
205-
heap.DecreaseKey(e3, Seq2DecreaseKey3Trgt)
206+
_, err := heap.DecreaseKey(e1, Seq2DecreaseKey1Trgt)
207+
require.NoError(t, err)
208+
_, err = heap.DecreaseKey(e2, Seq2DecreaseKey2Trgt)
209+
require.NoError(t, err)
210+
_, err = heap.DecreaseKey(e3, Seq2DecreaseKey3Trgt)
211+
require.NoError(t, err)
206212

207213
var min *Entry
208-
var err error
209214
for i := 0; i < len(NumberSequence2Sorted); i++ {
210215
min, err = heap.DequeueMin()
211-
assert.NoError(t, err)
216+
require.NoError(t, err)
212217
assert.Equal(t, NumberSequence2Sorted[i], min.Priority)
213218
}
214219
}
@@ -222,6 +227,7 @@ func TestFibHeap_DecreaseKey_EmptyHeap(t *testing.T) {
222227
// Heap should be empty at this point
223228
min, err := heap.DecreaseKey(elem, 0)
224229

230+
assert.IsType(t, EmptyHeapError(""), err)
225231
assert.EqualError(t, err, "Cannot decrease key in an empty heap")
226232
assert.Nil(t, min)
227233
}
@@ -231,6 +237,7 @@ func TestFibHeap_DecreaseKey_NilNode(t *testing.T) {
231237
heap.Enqueue(1)
232238
min, err := heap.DecreaseKey(nil, 0)
233239

240+
assert.IsType(t, NilError(""), err)
234241
assert.EqualError(t, err, "Cannot decrease key: given node is nil")
235242
assert.Nil(t, min)
236243
}
@@ -266,13 +273,16 @@ func TestEnqueueDelete(t *testing.T) {
266273
var err error
267274

268275
err = heap.Delete(e1)
276+
require.NoError(t, err)
269277
err = heap.Delete(e2)
278+
require.NoError(t, err)
270279
err = heap.Delete(e3)
280+
require.NoError(t, err)
271281

272282
var min *Entry
273283
for i := 0; i < len(NumberSequence2Deleted3ElemSorted); i++ {
274284
min, err = heap.DequeueMin()
275-
assert.NoError(t, err)
285+
require.NoError(t, err)
276286
assert.Equal(t, NumberSequence2Deleted3ElemSorted[i], min.Priority)
277287
}
278288
}
@@ -285,13 +295,15 @@ func TestFibHeap_Delete_EmptyHeap(t *testing.T) {
285295

286296
// Heap should be empty at this point
287297
err := heap.Delete(elem)
298+
assert.IsType(t, EmptyHeapError(""), err)
288299
assert.EqualError(t, err, "Cannot delete element from an empty heap")
289300
}
290301

291302
func TestFibHeap_Delete_NilNode(t *testing.T) {
292303
heap := NewFloatFibHeap()
293304
heap.Enqueue(1)
294305
err := heap.Delete(nil)
306+
assert.IsType(t, NilError(""), err)
295307
assert.EqualError(t, err, "Cannot delete node: given node is nil")
296308
}
297309

@@ -307,12 +319,12 @@ func TestMerge(t *testing.T) {
307319
}
308320

309321
heap, err := heap1.Merge(&heap2)
310-
assert.NoError(t, err)
322+
require.NoError(t, err)
311323

312324
var min *Entry
313325
for i := 0; i < len(NumberSequenceMerged3And4Sorted); i++ {
314326
min, err = heap.DequeueMin()
315-
assert.NoError(t, err)
327+
require.NoError(t, err)
316328
assert.Equal(t, NumberSequenceMerged3And4Sorted[i], min.Priority)
317329
}
318330
}
@@ -321,6 +333,7 @@ func TestFibHeap_Merge_NilHeap(t *testing.T) {
321333
var heap FloatingFibonacciHeap
322334
heap = NewFloatFibHeap()
323335
newHeap, err := heap.Merge(nil)
336+
assert.IsType(t, NilError(""), err)
324337
assert.EqualError(t, err, "One of the heaps to merge is nil. Cannot merge")
325338
assert.Equal(t, newHeap, FloatingFibonacciHeap{})
326339
}

0 commit comments

Comments
 (0)