public void CanRemove() { var pq = new TestPriorityQueue <char>(); foreach (char c in "abcdefghijklmnopqrstuvwxyz") { pq.Add(c); } Assert.IsFalse(pq.Remove('$')); // no such item Assert.AreEqual(26, pq.Count); // Last item: easy to remove Assert.IsTrue(pq.Remove('z')); Assert.AreEqual(25, pq.Count); Assert.AreEqual('a', pq.Top()); Assert.IsFalse(pq.Contains('z')); // Remove a bottom row item: Assert.IsTrue(pq.Remove('w')); Assert.AreEqual(24, pq.Count); Assert.AreEqual('a', pq.Top()); Assert.IsFalse(pq.Contains('w')); // Remove an inner item: Assert.IsTrue(pq.Remove('e')); Assert.AreEqual(23, pq.Count); Assert.AreEqual('a', pq.Top()); Assert.IsFalse(pq.Contains('e')); // Remove the root item: Assert.IsTrue(pq.Remove('a')); Assert.AreEqual(22, pq.Count); Assert.AreEqual('b', pq.Top()); Assert.IsFalse(pq.Contains('a')); // Remove returns false if not found: Assert.IsFalse(pq.Remove('z')); Assert.IsFalse(pq.Remove('w')); Assert.IsFalse(pq.Remove('e')); Assert.IsFalse(pq.Remove('a')); // Pop remaining items and verify order: Assert.AreEqual('b', pq.Pop()); Assert.AreEqual('c', pq.Pop()); Assert.AreEqual('d', pq.Pop()); Assert.AreEqual('f', pq.Pop()); Assert.AreEqual('g', pq.Pop()); Assert.AreEqual('h', pq.Pop()); Assert.AreEqual('i', pq.Pop()); Assert.AreEqual('j', pq.Pop()); Assert.AreEqual('k', pq.Pop()); Assert.AreEqual('l', pq.Pop()); Assert.AreEqual('m', pq.Pop()); Assert.AreEqual('n', pq.Pop()); Assert.AreEqual('o', pq.Pop()); Assert.AreEqual('p', pq.Pop()); Assert.AreEqual('q', pq.Pop()); Assert.AreEqual('r', pq.Pop()); Assert.AreEqual('s', pq.Pop()); Assert.AreEqual('t', pq.Pop()); Assert.AreEqual('u', pq.Pop()); Assert.AreEqual('v', pq.Pop()); Assert.AreEqual('x', pq.Pop()); Assert.AreEqual('y', pq.Pop()); Assert.AreEqual(0, pq.Count); }