using System; using System.Collections.Generic; using System.Linq; using System.Text; using Azimuth.DataStructures; namespace Azimuth.UnitTests.DataStructures { public class PriorityQueueTests : UnitTestSharp.TestFixture { public void AddElements() { var pq = new PriorityQueue(); pq.Add(1, 2); pq.Add(0, 4); pq.Add(7, 1); var expected = new KeyValuePair[] { new KeyValuePair(0, 4), new KeyValuePair(1, 2), new KeyValuePair(7, 1), }; CheckEqual(expected, pq); } public void AddElements_Batch() { var expected = new KeyValuePair[] { new KeyValuePair(0, 4), new KeyValuePair(1, 2), new KeyValuePair(7, 1), }; var jumbled = new KeyValuePair[] { new KeyValuePair(1, 2), new KeyValuePair(7, 1), new KeyValuePair(0, 4), }; var pq = new PriorityQueue(); pq.BatchAdd(jumbled); CheckEqual(expected, pq); } public void IsEmpty_Empty() { var pq = new PriorityQueue(); Check(pq.IsEmpty); } public void IsEmpty_NotEmpty() { var pq = new PriorityQueue(); pq.Add(9, 10); CheckFalse(pq.IsEmpty); } public void RemoveAll_Full() { var expected = new KeyValuePair[] { new KeyValuePair(0, 4), }; var jumbled = new KeyValuePair[] { new KeyValuePair(0, 2), new KeyValuePair(0, 1), new KeyValuePair(0, 4), }; var pq = new PriorityQueue(); pq.BatchAdd(jumbled); pq.RemoveAll(x => x.Value == 1 || x.Value == 2); CheckEqual(expected, pq); } public void Remove_Existing() { var jumbled = new KeyValuePair[] { new KeyValuePair(0, 2), new KeyValuePair(0, 1), new KeyValuePair(0, 4), }; var pq = new PriorityQueue(); pq.BatchAdd(jumbled); pq.Remove(jumbled[0]); pq.Remove(jumbled[2]); CheckEqual(jumbled[1], pq.First()); } public void PopElements() { var expected = new KeyValuePair[] { new KeyValuePair(0, 2), new KeyValuePair(0, 1), new KeyValuePair(0, 4), }; var jumbled = new KeyValuePair[] { new KeyValuePair(0, 2), new KeyValuePair(0, 1), new KeyValuePair(0, 4), }; var pq = new PriorityQueue(); pq.BatchAdd(jumbled); CheckEqual(expected, pq.PopHighestPriorityElements()); Check(pq.IsEmpty); } public void PopElements_Empty() { var pq = new PriorityQueue(); CheckEqual(new int[] { }, pq.PopHighestPriorityElements()); } public void FuzzyPopElements() { var expected = new KeyValuePair[] { new KeyValuePair(0, 4), }; var removedElements = new KeyValuePair[] { new KeyValuePair(0, 2), new KeyValuePair(Scalar.FuzzyEqualityEpsilon * .49, 1), new KeyValuePair(Scalar.FuzzyEqualityEpsilon * .99, 4), }; var jumbled = new KeyValuePair[] { new KeyValuePair(0, 2), new KeyValuePair(Scalar.FuzzyEqualityEpsilon * .49, 1), new KeyValuePair(Scalar.FuzzyEqualityEpsilon * .99, 4), new KeyValuePair(Scalar.FuzzyEqualityEpsilon * 1.49, 7), }; var pq = new PriorityQueue(); pq.BatchAdd(jumbled); var elements = pq.PopHighestPriorityElements(); CheckEqual(removedElements, elements); CheckEqual(1, pq.Count()); CheckEqual(7, pq.First().Value); } public void BatchRemove() { var expected = new KeyValuePair[] { new KeyValuePair(0, 4), new KeyValuePair(1, 2), }; var jumbled = new KeyValuePair[] { new KeyValuePair(1, 2), new KeyValuePair(7, 1), new KeyValuePair(0, 4), }; var toRemove = new KeyValuePair[] { new KeyValuePair(7, 1), }; var pq = new PriorityQueue(); pq.BatchAdd(jumbled); pq.BatchRemove(toRemove); CheckEqual(expected, pq); } public void BatchRemove_RedundantRemove() { var expected = new KeyValuePair[] { new KeyValuePair(0, 4), new KeyValuePair(1, 2), }; var jumbled = new KeyValuePair[] { new KeyValuePair(1, 2), new KeyValuePair(7, 1), new KeyValuePair(0, 4), }; var toRemove = new KeyValuePair[] { new KeyValuePair(7, 1), new KeyValuePair(7, 1), }; var pq = new PriorityQueue(); pq.BatchAdd(jumbled); pq.BatchRemove(toRemove); CheckEqual(expected, pq); } public void BatchRemove_Redundant() { var expected = new KeyValuePair[] { new KeyValuePair(0, 4), new KeyValuePair(1, 2), new KeyValuePair(7, 1), }; var jumbled = new KeyValuePair[] { new KeyValuePair(1, 2), new KeyValuePair(7, 1), new KeyValuePair(7, 1), new KeyValuePair(0, 4), }; var toRemove = new KeyValuePair[] { new KeyValuePair(7, 1), }; var pq = new PriorityQueue(); pq.BatchAdd(jumbled); pq.BatchRemove(toRemove); CheckEqual(expected, pq); } } }