Skip to content

Commit 0a20274

Browse files
author
Nikola Yurukov
committed
[Dev] Add better error handling and tests for that
1 parent a81c0c1 commit 0a20274

File tree

2 files changed

+116
-4
lines changed

2 files changed

+116
-4
lines changed

fibheap/fibheap.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ func (heap *fibHeap) Size() uint {
172172

173173
func (heap *fibHeap) DequeueMin() (*Entry, error) {
174174
if heap.IsEmpty() {
175-
return nil, fmt.Errorf("Heap is empty")
175+
return nil, fmt.Errorf("Cannot dequeue minimum of empty heap")
176176
}
177177

178178
heap.size--
@@ -275,8 +275,17 @@ func (heap *fibHeap) DequeueMin() (*Entry, error) {
275275

276276
func (heap *fibHeap) DecreaseKey(node *Entry, newPriority float64) (*Entry, error) {
277277

278-
if newPriority > node.Priority {
279-
return nil, fmt.Errorf("The given new priority is larger than the old")
278+
if heap.IsEmpty() {
279+
return nil, fmt.Errorf("Cannot decrease key in an empty heap")
280+
}
281+
282+
if node == nil {
283+
return nil, fmt.Errorf("Cannot decrease key: given node is nil")
284+
}
285+
286+
if newPriority >= node.Priority {
287+
return nil, fmt.Errorf("The given new priority: %v, is larger than or equal to the old: %v",
288+
newPriority, node.Priority)
280289
}
281290

282291
decreaseKeyUnchecked(heap, node, newPriority)
@@ -285,6 +294,14 @@ func (heap *fibHeap) DecreaseKey(node *Entry, newPriority float64) (*Entry, erro
285294

286295
func (heap *fibHeap) Delete(node *Entry) error {
287296

297+
if heap.IsEmpty() {
298+
return fmt.Errorf("Cannot delete element from an empty heap")
299+
}
300+
301+
if node == nil {
302+
return fmt.Errorf("Cannot delete node: given node is nil")
303+
}
304+
288305
decreaseKeyUnchecked(heap, node, -math.MaxFloat64)
289306
heap.DequeueMin()
290307
return nil
@@ -299,10 +316,15 @@ func (heap *fibHeap) Delete(node *Entry) error {
299316
*/
300317
func (heap *fibHeap) Merge(other FloatingFibonacciHeap) (FloatingFibonacciHeap, error) {
301318

319+
if heap == nil || other == nil {
320+
return nil, fmt.Errorf("One of the heaps to merge is nil. Cannot merge")
321+
}
322+
302323
otherHeap, ok := other.(*fibHeap)
303324
if !ok {
304325
// throw an error
305-
return nil, fmt.Errorf("The passed object is of type %T, not of internal type *fibHeap. Please provide your own implementation of merge", other)
326+
return nil, fmt.Errorf("The passed object is of type %T, not of internal type *fibHeap. "+
327+
"Please provide your own implementation of merge", other)
306328
}
307329

308330
resultSize := heap.size + otherHeap.size

fibheap/fibheap_test.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,39 @@ func TestEnqueueDequeueMin(t *testing.T) {
148148
}
149149
}
150150

151+
func TestFibHeap_Enqueue_Min(t *testing.T) {
152+
heap := NewFloatFibHeap()
153+
for i := 0; i < len(NumberSequence1); i++ {
154+
heap.Enqueue(NumberSequence1[i])
155+
}
156+
157+
min, err := heap.Min()
158+
assert.NoError(t, err)
159+
assert.Equal(t, Seq1FirstMinimum, min.Priority)
160+
}
161+
162+
func TestFibHeap_Min_EmptyHeap(t *testing.T) {
163+
heap := NewFloatFibHeap()
164+
165+
heap.Enqueue(0)
166+
heap.DequeueMin()
167+
168+
// Heap should be empty at this point
169+
170+
min, err := heap.Min()
171+
172+
assert.EqualError(t, err, "Trying to get minimum element of empty heap")
173+
assert.Nil(t, min)
174+
}
175+
176+
func TestFibHeap_DequeueMin_EmptyHeap(t *testing.T) {
177+
heap := NewFloatFibHeap()
178+
min, err := heap.DequeueMin()
179+
180+
assert.EqualError(t, err, "Cannot dequeue minimum of empty heap")
181+
assert.Nil(t, min)
182+
}
183+
151184
func TestEnqueueDecreaseKey(t *testing.T) {
152185
heap := NewFloatFibHeap()
153186
var e1, e2, e3 *Entry
@@ -180,6 +213,37 @@ func TestEnqueueDecreaseKey(t *testing.T) {
180213
}
181214
}
182215

216+
func TestFibHeap_DecreaseKey_EmptyHeap(t *testing.T) {
217+
heap := NewFloatFibHeap()
218+
219+
elem := heap.Enqueue(15)
220+
heap.DequeueMin()
221+
222+
// Heap should be empty at this point
223+
min, err := heap.DecreaseKey(elem, 0)
224+
225+
assert.EqualError(t, err, "Cannot decrease key in an empty heap")
226+
assert.Nil(t, min)
227+
}
228+
229+
func TestFibHeap_DecreaseKey_NilNode(t *testing.T) {
230+
heap := NewFloatFibHeap()
231+
heap.Enqueue(1)
232+
min, err := heap.DecreaseKey(nil, 0)
233+
234+
assert.EqualError(t, err, "Cannot decrease key: given node is nil")
235+
assert.Nil(t, min)
236+
}
237+
238+
func TestFibHeap_DecreaseKey_LargerNewPriority(t *testing.T) {
239+
heap := NewFloatFibHeap()
240+
node := heap.Enqueue(1)
241+
min, err := heap.DecreaseKey(node, 20)
242+
243+
assert.EqualError(t, err, "The given new priority: 20, is larger than or equal to the old: 1")
244+
assert.Nil(t, min)
245+
}
246+
183247
func TestEnqueueDelete(t *testing.T) {
184248
heap := NewFloatFibHeap()
185249
var e1, e2, e3 *Entry
@@ -213,6 +277,24 @@ func TestEnqueueDelete(t *testing.T) {
213277
}
214278
}
215279

280+
func TestFibHeap_Delete_EmptyHeap(t *testing.T) {
281+
heap := NewFloatFibHeap()
282+
283+
elem := heap.Enqueue(15)
284+
heap.DequeueMin()
285+
286+
// Heap should be empty at this point
287+
err := heap.Delete(elem)
288+
assert.EqualError(t, err, "Cannot delete element from an empty heap")
289+
}
290+
291+
func TestFibHeap_Delete_NilNode(t *testing.T) {
292+
heap := NewFloatFibHeap()
293+
heap.Enqueue(1)
294+
err := heap.Delete(nil)
295+
assert.EqualError(t, err, "Cannot delete node: given node is nil")
296+
}
297+
216298
func TestMerge(t *testing.T) {
217299
heap1 := NewFloatFibHeap()
218300
for i := 0; i < len(NumberSequence3); i++ {
@@ -235,6 +317,14 @@ func TestMerge(t *testing.T) {
235317
}
236318
}
237319

320+
func TestFibHeap_Merge_NilHeap(t *testing.T) {
321+
var heap FloatingFibonacciHeap
322+
heap = NewFloatFibHeap()
323+
newHeap, err := heap.Merge(nil)
324+
assert.EqualError(t, err, "One of the heaps to merge is nil. Cannot merge")
325+
assert.Nil(t, newHeap)
326+
}
327+
238328
// ***************
239329
// BENCHMARK TESTS
240330
// ***************

0 commit comments

Comments
 (0)