Skip to content

Commit 7423a4a

Browse files
Walt280siriak
andauthored
Add binary heap (#190)
Co-authored-by: Andrii Siriak <siryaka@gmail.com>
1 parent 332b24a commit 7423a4a

File tree

3 files changed

+401
-0
lines changed

3 files changed

+401
-0
lines changed
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
using NUnit.Framework;
5+
6+
namespace DataStructures.Tests
7+
{
8+
static class BinaryHeapTests
9+
{
10+
private static BinaryHeap<int> BuildTestHeap()
11+
{
12+
var heap = new BinaryHeap<int>();
13+
var elems = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
14+
foreach (int i in elems)
15+
{
16+
heap.Push(i);
17+
}
18+
19+
return heap;
20+
}
21+
22+
[Test]
23+
public static void Constructor_UseCustomComparer_BuildCorrectHeap()
24+
{
25+
var revHeap = new BinaryHeap<int>(Comparer<int>.Create((x, y) => y.CompareTo(x)));
26+
foreach (int i in new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 })
27+
{
28+
revHeap.Push(i);
29+
}
30+
31+
Assert.AreEqual(10, revHeap.Count);
32+
Assert.AreEqual(1, revHeap.Peek());
33+
Assert.AreEqual(1, revHeap.Pop());
34+
Assert.AreEqual(2, revHeap.Peek());
35+
}
36+
37+
[Test]
38+
public static void Push_AddElements_BuildCorrectHeap()
39+
{
40+
var heap = BuildTestHeap();
41+
42+
Assert.AreEqual(10, heap.Peek());
43+
Assert.AreEqual(10, heap.Count);
44+
}
45+
46+
public static void Pop_RemoveElements_HeapStillValid()
47+
{
48+
var heap = BuildTestHeap();
49+
50+
Assert.AreEqual(10, heap.Peek());
51+
Assert.AreEqual(10, heap.Count);
52+
53+
Assert.AreEqual(10, heap.Pop());
54+
Assert.AreEqual(9, heap.Count);
55+
Assert.IsFalse(heap.Contains(10));
56+
57+
Assert.AreEqual(9, heap.Pop());
58+
Assert.AreEqual(8, heap.Count);
59+
Assert.IsFalse(heap.Contains(9));
60+
}
61+
62+
[Test]
63+
public static void Pop_EmptyHeap_ThrowsCorrectException()
64+
{
65+
var heap = new BinaryHeap<int>();
66+
67+
Assert.Throws<InvalidOperationException>(() => heap.Pop());
68+
}
69+
70+
[Test]
71+
public static void Peek_NonEmptyHeap_ReturnsCorrectAnswer()
72+
{
73+
var heap = BuildTestHeap();
74+
75+
Assert.AreEqual(10, heap.Peek());
76+
}
77+
78+
[Test]
79+
public static void Peek_EmptyHeap_ThrowsCorrectException()
80+
{
81+
var heap = new BinaryHeap<int>();
82+
83+
Assert.Throws<InvalidOperationException>(() => heap.Peek());
84+
}
85+
86+
[Test]
87+
public static void PushPop_EmptyHeap_ReturnsCorrectAnswer()
88+
{
89+
var heap = new BinaryHeap<int>();
90+
91+
Assert.AreEqual(10, heap.PushPop(10));
92+
}
93+
94+
[Test]
95+
public static void PushPop_NonEmptyHeap_ReturnsCorrectAnswer()
96+
{
97+
var heap = BuildTestHeap();
98+
99+
Assert.AreEqual(20, heap.PushPop(20));
100+
Assert.AreEqual(10, heap.PushPop(-10));
101+
}
102+
103+
[Test]
104+
public static void Contains_NonEmptyHeap_ReturnsCorrectAnswer()
105+
{
106+
var heap = BuildTestHeap();
107+
108+
Assert.IsTrue(heap.Contains(1));
109+
Assert.IsTrue(heap.Contains(5));
110+
Assert.IsTrue(heap.Contains(10));
111+
Assert.IsFalse(heap.Contains(11));
112+
}
113+
114+
[Test]
115+
public static void Contains_EmptyHeap_ReturnsCorrectAnswer()
116+
{
117+
var heap = new BinaryHeap<int>();
118+
119+
Assert.IsFalse(heap.Contains(1));
120+
Assert.IsFalse(heap.Contains(5));
121+
Assert.IsFalse(heap.Contains(10));
122+
Assert.IsFalse(heap.Contains(11));
123+
}
124+
125+
[Test]
126+
public static void Remove_NonEmptyHeap_HeapStillValid()
127+
{
128+
var heap = BuildTestHeap();
129+
130+
heap.Remove(2);
131+
Assert.IsFalse(heap.Contains(2));
132+
Assert.AreEqual(10, heap.Peek());
133+
Assert.AreEqual(9, heap.Count);
134+
135+
heap.Remove(8);
136+
Assert.IsFalse(heap.Contains(8));
137+
Assert.AreEqual(10, heap.Peek());
138+
Assert.AreEqual(8, heap.Count);
139+
140+
heap.Remove(5);
141+
Assert.IsFalse(heap.Contains(5));
142+
Assert.AreEqual(10, heap.Peek());
143+
Assert.AreEqual(7, heap.Count);
144+
145+
Assert.Throws<ArgumentException>(() => heap.Remove(11));
146+
}
147+
148+
[Test]
149+
public static void Remove_EmptyHeap_ThrowsCorrectException()
150+
{
151+
var heap = new BinaryHeap<int>();
152+
153+
Assert.Throws<ArgumentException>(() => heap.Remove(1));
154+
}
155+
}
156+
}

0 commit comments

Comments
 (0)