From ebcc162a77407bc09ca6a2b54f708ed0dd6e9c0a Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sun, 25 Oct 2026 13:16:12 +0100 Subject: [PATCH] PriorityQueueInCSharp: port to .NET 10, Capacity, Remove, DequeueEnqueue and synchronized queue examples --- .../HospitalQueueComparer.cs | 31 +- .../PriorityQueueInCSharp/Patient.cs | 22 +- .../PriorityQueueInCSharp.csproj | 2 +- .../PriorityQueueInCSharp/Program.cs | 25 +- .../SynchronizedHospitalQueue.cs | 23 + .../PriorityQueueInCSharpTests.csproj | 15 +- .../PriorityQueueTests.cs | 442 +++++++++--------- 7 files changed, 305 insertions(+), 255 deletions(-) create mode 100644 collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/SynchronizedHospitalQueue.cs diff --git a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/HospitalQueueComparer.cs b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/HospitalQueueComparer.cs index 8976d86d90..802da8b141 100644 --- a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/HospitalQueueComparer.cs +++ b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/HospitalQueueComparer.cs @@ -1,23 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace PriorityQueueInCSharp; -namespace PriorityQueueInCSharp +public class HospitalQueueComparer : IComparer { - public class HospitalQueueComparer : IComparer + public int Compare(Patient? x, Patient? y) { - public int Compare(Patient x, Patient y) - { - Console.WriteLine($"Comparing {x.Name} and {y.Name}\n\r"); + ArgumentNullException.ThrowIfNull(x); + ArgumentNullException.ThrowIfNull(y); - if (x.Age == y.Age) - return 0; - else if(x.Age > y.Age) - return -1; - else - return 1; - } + Console.WriteLine($"Comparing {x.Name} and {y.Name}"); + Console.WriteLine(); + + if (x.Age == y.Age) + return 0; + else if (x.Age > y.Age) + return -1; + else + return 1; } } diff --git a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/Patient.cs b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/Patient.cs index 65f7db0639..9f1a86fac4 100644 --- a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/Patient.cs +++ b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/Patient.cs @@ -1,19 +1,13 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace PriorityQueueInCSharp; -namespace PriorityQueueInCSharp +public class Patient { - public class Patient + public string Name { get; set; } = string.Empty; + public int Age { get; set; } + + public Patient(string name, int age) { - public string Name { get; set; } = string.Empty; - public int Age { get; set; } - public Patient(string name, int age) - { - Name = name; - Age = age; - } + Name = name; + Age = age; } } diff --git a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/PriorityQueueInCSharp.csproj b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/PriorityQueueInCSharp.csproj index 74abf5c976..dfb40caafc 100644 --- a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/PriorityQueueInCSharp.csproj +++ b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/PriorityQueueInCSharp.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net10.0 enable enable diff --git a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/Program.cs b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/Program.cs index 4842cd784a..59df0ac766 100644 --- a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/Program.cs +++ b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/Program.cs @@ -1,14 +1,18 @@ -using PriorityQueueInCSharp; +using PriorityQueueInCSharp; + +ExploreEqualPriorities(); +ExploreSortingMechanism(); static void ExploreEqualPriorities() { - var hospitalQueue = new PriorityQueue(5); - hospitalQueue.Enqueue(new("Sarah", 23), 1); - hospitalQueue.Enqueue(new("Joe", 50), 1); - hospitalQueue.Enqueue(new("Elizabeth", 60), 1); - hospitalQueue.Enqueue(new("Natalie", 16), 1); - hospitalQueue.Enqueue(new("Angie", 25), 1); - while (hospitalQueue.Count > 0) + var hospitalQueue = new PriorityQueue(5); + hospitalQueue.Enqueue(new("Sarah", 23), 1); + hospitalQueue.Enqueue(new("Joe", 50), 1); + hospitalQueue.Enqueue(new("Elizabeth", 60), 1); + hospitalQueue.Enqueue(new("Natalie", 16), 1); + hospitalQueue.Enqueue(new("Angie", 25), 1); + + while (hospitalQueue.Count > 0) Console.WriteLine(hospitalQueue.Dequeue().Name); } @@ -23,7 +27,8 @@ static void ExploreSortingMechanism() new("Angie", 25), }; var hospitalQueue = new PriorityQueue(new HospitalQueueComparer()); - patients.ForEach(p => { + patients.ForEach(p => + { Console.WriteLine($"Enqueueing {p.Name}"); hospitalQueue.Enqueue(p, p); }); @@ -32,4 +37,4 @@ static void ExploreSortingMechanism() while (hospitalQueue.Count > 0) Console.WriteLine($"Dequeuing {hospitalQueue.Dequeue().Name}"); -} \ No newline at end of file +} diff --git a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/SynchronizedHospitalQueue.cs b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/SynchronizedHospitalQueue.cs new file mode 100644 index 0000000000..514a220d6b --- /dev/null +++ b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharp/SynchronizedHospitalQueue.cs @@ -0,0 +1,23 @@ +namespace PriorityQueueInCSharp; + +public class SynchronizedHospitalQueue +{ + private readonly PriorityQueue _queue = new(); + private readonly Lock _lock = new(); + + public void Enqueue(Patient patient, int priority) + { + lock (_lock) + { + _queue.Enqueue(patient, priority); + } + } + + public bool TryDequeue(out Patient? patient) + { + lock (_lock) + { + return _queue.TryDequeue(out patient, out _); + } + } +} diff --git a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharpTests/PriorityQueueInCSharpTests.csproj b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharpTests/PriorityQueueInCSharpTests.csproj index d0a5bbc79f..4f7aeb54d0 100644 --- a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharpTests/PriorityQueueInCSharpTests.csproj +++ b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharpTests/PriorityQueueInCSharpTests.csproj @@ -1,17 +1,22 @@ - net6.0 + net10.0 + enable enable false - - - - + + + + + + + + diff --git a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharpTests/PriorityQueueTests.cs b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharpTests/PriorityQueueTests.cs index ed4606a2c9..5a206c096f 100644 --- a/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharpTests/PriorityQueueTests.cs +++ b/collections-csharp/PriorityQueueInCSharp/PriorityQueueInCSharpTests/PriorityQueueTests.cs @@ -1,215 +1,241 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Collections.Generic; using PriorityQueueInCSharp; -using System; -namespace PriorityQueueInCSharpTests +namespace PriorityQueueInCSharpTests; + +[TestClass] +public class PriorityQueueTests { - [TestClass] - public class PriorityQueueTests + private static List<(Patient, int)> CreatePatients() => + [ + (new("Sarah", 23), 4), + (new("Joe", 50), 2), + (new("Elizabeth", 60), 1), + (new("Natalie", 16), 5), + (new("Angie", 25), 3) + ]; + + private static List CreatePatientsWithoutPriorities() => + [ + new("Sarah", 23), + new("Joe", 50), + new("Elizabeth", 60), + new("Natalie", 16), + new("Angie", 25), + ]; + + [TestMethod] + public void WhenUsingParameterlessConstructor_ThenPriorityQueueIsEmpty() { - [TestMethod] - public void WhenUsingParameterlessConstructor_ThenPriorityQueueIsEmpty() - { - var hospitalQueue = new PriorityQueue(); - Assert.AreEqual(0, hospitalQueue.EnsureCapacity(0)); - } + var hospitalQueue = new PriorityQueue(); + Assert.AreEqual(0, hospitalQueue.Capacity); + } - [TestMethod] - public void WhenUsingCapactiyConstructor_ThenPriorityQueueCapactityIsInitialized() - { - var hospitalQueue = new PriorityQueue(5); - Assert.AreEqual(5, hospitalQueue.EnsureCapacity(0)); - Assert.AreEqual(0, hospitalQueue.Count); - } + [TestMethod] + public void WhenUsingCapacityConstructor_ThenPriorityQueueCapacityIsInitialized() + { + var hospitalQueue = new PriorityQueue(5); + Assert.AreEqual(5, hospitalQueue.Capacity); + Assert.AreEqual(0, hospitalQueue.Count); + } - [TestMethod] - public void WhenUsingCollectionConstructor_ThenPriorityQueueCapactityIsInitialized() - { - var patients = new List<(Patient, int)>() - { - (new("Sarah", 23), 4), - (new("Joe", 50), 2), - (new("Elizabeth", 60), 1), - (new("Natalie", 16), 5), - (new("Angie", 25), 3) - }; - var hospitalQueue = new PriorityQueue(patients); - Assert.AreEqual(5, hospitalQueue.EnsureCapacity(0)); - Assert.AreEqual(5, hospitalQueue.Count); - } - - [TestMethod] - public void WhenClearingThePriorityQueue_ThenElementsAreCleared() - { - var patients = new List<(Patient, int)>() - { - (new("Sarah", 23), 4), - (new("Joe", 50), 2), - (new("Elizabeth", 60), 1), - (new("Natalie", 16), 5), - (new("Angie", 25), 3) - }; - var hospitalQueue = new PriorityQueue(patients); - - hospitalQueue.Clear(); - - Assert.AreEqual(5, hospitalQueue.EnsureCapacity(0)); - Assert.AreEqual(0, hospitalQueue.Count); - } - - [TestMethod] - public void WhenAddingAnElementToAFullQueue_ThenCapactityIsIncreased() - { - var patients = new List<(Patient, int)>() - { - (new("Sarah", 23), 4), - (new("Joe", 50), 2), - (new("Elizabeth", 60), 1), - (new("Natalie", 16), 5), - (new("Angie", 25), 3) - }; - var hospitalQueue = new PriorityQueue(patients); - Assert.AreEqual(5, hospitalQueue.EnsureCapacity(0)); - Assert.AreEqual(5, hospitalQueue.Count); - - hospitalQueue.Enqueue(new Patient("Roy", 23), 5); - Assert.AreEqual(10, hospitalQueue.EnsureCapacity(0)); - - Assert.AreEqual(20, hospitalQueue.EnsureCapacity(12)); - - Assert.AreEqual(42, hospitalQueue.EnsureCapacity(42)); - - hospitalQueue.TrimExcess(); - Assert.AreEqual(6, hospitalQueue.EnsureCapacity(0)); - } - - [TestMethod] - public void WhenAddingAnElementToAFullQueue_ThenCapactityIsIncreasedByFourAtLeast() - { - var patients = new List<(Patient, int)>() - { - (new("Sarah", 23), 4) - }; - var hospitalQueue = new PriorityQueue(patients); - - hospitalQueue.Enqueue(new Patient("Roy", 23), 5); - - Assert.AreEqual(5, hospitalQueue.EnsureCapacity(0)); - } - - [TestMethod] - public void WhenCallinfTrimExcess_ThenUnnecessaryMemoryIsReleased() - { - var patients = new List<(Patient, int)>() - { - (new("Sarah", 23), 4), - (new("Joe", 50), 2), - (new("Elizabeth", 60), 1), - (new("Natalie", 16), 5), - (new("Angie", 25), 3) - }; - var hospitalQueue = new PriorityQueue(patients); - Assert.AreEqual(12, hospitalQueue.EnsureCapacity(12)); - - hospitalQueue.TrimExcess(); - Assert.AreEqual(5, hospitalQueue.EnsureCapacity(0)); - - } - - [TestMethod] - public void WhenDequeueingAnElement_ThenElementWithLowestPriorityReturns() - { - var patients = new List<(Patient, int)>() - { - (new("Sarah", 23), 4), - (new("Joe", 50), 2), - (new("Elizabeth", 60), 1), - (new("Natalie", 16), 5), - (new("Angie", 25), 3) - }; - var hospitalQueue = new PriorityQueue(patients); - - var highestPriorityPatient = hospitalQueue.Dequeue(); - Assert.AreEqual(highestPriorityPatient.Age, 60); - Assert.AreEqual(highestPriorityPatient.Name, "Elizabeth"); - - var secondHighestPriorityPerson = hospitalQueue.Peek(); - Assert.AreEqual(secondHighestPriorityPerson.Age, 50); - Assert.AreEqual(secondHighestPriorityPerson.Name, "Joe"); - - hospitalQueue.Enqueue(new("Roy", 23), 1); - var currentHighestPriorityPatient = hospitalQueue.Peek(); - Assert.AreEqual(currentHighestPriorityPatient.Age, 23); - Assert.AreEqual(currentHighestPriorityPatient.Name, "Roy"); - } - - [TestMethod] - public void WhenEnqueueingAnElementToComparerPriorityQueue_ThenElementIsEnqueued() - { - var patients = new List() - { - new("Sarah", 23), - new("Joe", 50), - new("Elizabeth", 60), - new("Natalie", 16), - new("Angie", 25), - }; - var hospitalQueue = new PriorityQueue(new HospitalQueueComparer()); - patients.ForEach(p => hospitalQueue.Enqueue(p, p)); - - var highestPriorityPatient = hospitalQueue.Dequeue(); - Assert.AreEqual(highestPriorityPatient.Age, 60); - Assert.AreEqual(highestPriorityPatient.Name, "Elizabeth"); - - var secondHighestPriorityPatient = hospitalQueue.Peek(); - Assert.AreEqual(secondHighestPriorityPatient.Age, 50); - Assert.AreEqual(secondHighestPriorityPatient.Name, "Joe"); - } - - [TestMethod] - public void WhenEnqueueingDequeueingAnElement_ThenElementIsEnqueuedAndAnotherIsDequeued() - { - var patients = new List() - { - new("Sarah", 23), - new("Joe", 50), - new("Elizabeth", 60), - new("Natalie", 16), - new("Angie", 25), - }; - var hospitalQueue = new PriorityQueue(new HospitalQueueComparer()); - patients.ForEach(p => hospitalQueue.Enqueue(p, p)); - - var patientToAdd = new Patient("Roy", 59); - var highestPriorityPatient = hospitalQueue.EnqueueDequeue(patientToAdd, patientToAdd); - - Assert.AreEqual(highestPriorityPatient.Age, 60); - Assert.AreEqual(highestPriorityPatient.Name, "Elizabeth"); - - var secondHighestPriorityPatient = hospitalQueue.Peek(); - - Assert.AreEqual(secondHighestPriorityPatient.Age, 59); - Assert.AreEqual(secondHighestPriorityPatient.Name, "Roy"); - } - - [TestMethod] - public void WhenEnqueuingElementsWithSamePriorities_ThenTheyDoNotFollowFIFO() + [TestMethod] + public void WhenUsingCollectionConstructor_ThenPriorityQueueCapacityIsInitialized() + { + var hospitalQueue = new PriorityQueue(CreatePatients()); + Assert.AreEqual(5, hospitalQueue.Capacity); + Assert.AreEqual(5, hospitalQueue.Count); + } + + [TestMethod] + public void WhenClearingThePriorityQueue_ThenElementsAreCleared() + { + var hospitalQueue = new PriorityQueue(CreatePatients()); + + hospitalQueue.Clear(); + + Assert.AreEqual(5, hospitalQueue.Capacity); + Assert.AreEqual(0, hospitalQueue.Count); + } + + [TestMethod] + public void WhenAddingAnElementToAFullQueue_ThenCapacityIsIncreased() + { + var hospitalQueue = new PriorityQueue(CreatePatients()); + Assert.AreEqual(5, hospitalQueue.Capacity); + Assert.AreEqual(5, hospitalQueue.Count); + + hospitalQueue.Enqueue(new Patient("Roy", 23), 5); + Assert.AreEqual(10, hospitalQueue.Capacity); + + Assert.AreEqual(20, hospitalQueue.EnsureCapacity(12)); + + Assert.AreEqual(42, hospitalQueue.EnsureCapacity(42)); + + hospitalQueue.TrimExcess(); + Assert.AreEqual(6, hospitalQueue.Capacity); + } + + [TestMethod] + public void WhenAddingAnElementToAFullQueue_ThenCapacityIsIncreasedByFourAtLeast() + { + var hospitalQueue = new PriorityQueue([(new Patient("Sarah", 23), 4)]); + + hospitalQueue.Enqueue(new Patient("Roy", 23), 5); + + Assert.AreEqual(5, hospitalQueue.Capacity); + } + + [TestMethod] + public void WhenCallingTrimExcess_ThenUnnecessaryMemoryIsReleased() + { + var hospitalQueue = new PriorityQueue(CreatePatients()); + Assert.AreEqual(12, hospitalQueue.EnsureCapacity(12)); + + hospitalQueue.TrimExcess(); + Assert.AreEqual(5, hospitalQueue.Capacity); + } + + [TestMethod] + public void WhenDequeueingAnElement_ThenElementWithLowestPriorityReturns() + { + var hospitalQueue = new PriorityQueue(CreatePatients()); + + var highestPriorityPatient = hospitalQueue.Dequeue(); + Assert.AreEqual(60, highestPriorityPatient.Age); + Assert.AreEqual("Elizabeth", highestPriorityPatient.Name); + + var secondHighestPriorityPatient = hospitalQueue.Peek(); + Assert.AreEqual(50, secondHighestPriorityPatient.Age); + Assert.AreEqual("Joe", secondHighestPriorityPatient.Name); + + hospitalQueue.Enqueue(new("Roy", 23), 1); + var currentHighestPriorityPatient = hospitalQueue.Peek(); + Assert.AreEqual(23, currentHighestPriorityPatient.Age); + Assert.AreEqual("Roy", currentHighestPriorityPatient.Name); + } + + [TestMethod] + public void WhenEnqueueingAnElementToComparerPriorityQueue_ThenElementIsEnqueued() + { + var hospitalQueue = new PriorityQueue(new HospitalQueueComparer()); + CreatePatientsWithoutPriorities().ForEach(p => hospitalQueue.Enqueue(p, p)); + + var highestPriorityPatient = hospitalQueue.Dequeue(); + Assert.AreEqual(60, highestPriorityPatient.Age); + Assert.AreEqual("Elizabeth", highestPriorityPatient.Name); + + var secondHighestPriorityPatient = hospitalQueue.Peek(); + Assert.AreEqual(50, secondHighestPriorityPatient.Age); + Assert.AreEqual("Joe", secondHighestPriorityPatient.Name); + } + + [TestMethod] + public void WhenEnqueueingDequeueingAnElement_ThenElementIsEnqueuedAndAnotherIsDequeued() + { + var hospitalQueue = new PriorityQueue(new HospitalQueueComparer()); + CreatePatientsWithoutPriorities().ForEach(p => hospitalQueue.Enqueue(p, p)); + + var patientToAdd = new Patient("Roy", 59); + var highestPriorityPatient = hospitalQueue.EnqueueDequeue(patientToAdd, patientToAdd); + + Assert.AreEqual(60, highestPriorityPatient.Age); + Assert.AreEqual("Elizabeth", highestPriorityPatient.Name); + + var secondHighestPriorityPatient = hospitalQueue.Peek(); + + Assert.AreEqual(59, secondHighestPriorityPatient.Age); + Assert.AreEqual("Roy", secondHighestPriorityPatient.Name); + } + + [TestMethod] + public void WhenNewElementOutranksTheRoot_ThenEnqueueDequeueReturnsItAndDequeueEnqueueKeepsIt() + { + var patientToAdd = new Patient("Roy", 80); + + var firstQueue = new PriorityQueue(CreatePatients()); + var returnedByEnqueueDequeue = firstQueue.EnqueueDequeue(patientToAdd, 0); + Assert.AreEqual("Roy", returnedByEnqueueDequeue.Name); + Assert.AreEqual("Elizabeth", firstQueue.Peek().Name); + + var secondQueue = new PriorityQueue(CreatePatients()); + var returnedByDequeueEnqueue = secondQueue.DequeueEnqueue(patientToAdd, 0); + Assert.AreEqual("Elizabeth", returnedByDequeueEnqueue.Name); + Assert.AreEqual("Roy", secondQueue.Peek().Name); + } + + [TestMethod] + public void WhenRemovingAnElement_ThenItIsGoneAndCanBeEnqueuedWithANewPriority() + { + var patients = new List<(Patient, int)>() { - var hospitalQueue = new PriorityQueue(5); - hospitalQueue.Enqueue(new("Sarah", 23), 1); - hospitalQueue.Enqueue(new("Joe", 50), 1); - hospitalQueue.Enqueue(new("Elizabeth", 60), 1); - hospitalQueue.Enqueue(new("Natalie", 16), 1); - hospitalQueue.Enqueue(new("Angie", 25), 1); - - var elemetsFollowFIFO = hospitalQueue.Dequeue().Name == "Sarah" - && hospitalQueue.Dequeue().Name == "Joe" - && hospitalQueue.Dequeue().Name == "Elizabeth" - && hospitalQueue.Dequeue().Name == "Natalie" - && hospitalQueue.Dequeue().Name == "Angie"; - - Assert.IsFalse(elemetsFollowFIFO); - } - } -} \ No newline at end of file + (new("Sarah", 23), 4), + (new("Joe", 50), 2), + (new("Elizabeth", 60), 1), + (new("Natalie", 16), 5), + (new("Angie", 25), 3) + }; + var joe = patients[1].Item1; + var hospitalQueue = new PriorityQueue(patients); + + var removed = hospitalQueue.Remove(joe, out var removedPatient, out var oldPriority); + + Assert.IsTrue(removed); + Assert.AreEqual("Joe", removedPatient?.Name); + Assert.AreEqual(2, oldPriority); + Assert.AreEqual(4, hospitalQueue.Count); + + hospitalQueue.Enqueue(joe, 0); + Assert.AreEqual("Joe", hospitalQueue.Peek().Name); + } + + [TestMethod] + public void WhenEnumeratingUnorderedItems_ThenOrderIsHeapOrderNotPriorityOrder() + { + var hospitalQueue = new PriorityQueue(CreatePatients()); + + var names = hospitalQueue.UnorderedItems.Select(item => item.Element.Name).ToArray(); + + CollectionAssert.AreEqual(new[] { "Elizabeth", "Joe", "Sarah", "Natalie", "Angie" }, names); + } + + [TestMethod] + public void WhenEnqueuingElementsWithSamePriorities_ThenTheyDoNotFollowFIFO() + { + var hospitalQueue = new PriorityQueue(5); + hospitalQueue.Enqueue(new("Sarah", 23), 1); + hospitalQueue.Enqueue(new("Joe", 50), 1); + hospitalQueue.Enqueue(new("Elizabeth", 60), 1); + hospitalQueue.Enqueue(new("Natalie", 16), 1); + hospitalQueue.Enqueue(new("Angie", 25), 1); + + var elementsFollowFIFO = hospitalQueue.Dequeue().Name == "Sarah" + && hospitalQueue.Dequeue().Name == "Joe" + && hospitalQueue.Dequeue().Name == "Elizabeth" + && hospitalQueue.Dequeue().Name == "Natalie" + && hospitalQueue.Dequeue().Name == "Angie"; + + Assert.IsFalse(elementsFollowFIFO); + } + + [TestMethod] + public void WhenUsingSynchronizedQueue_ThenItDequeuesByPriority() + { + var hospitalQueue = new SynchronizedHospitalQueue(); + hospitalQueue.Enqueue(new("Sarah", 23), 4); + hospitalQueue.Enqueue(new("Elizabeth", 60), 1); + + Assert.IsTrue(hospitalQueue.TryDequeue(out var patient)); + Assert.AreEqual("Elizabeth", patient?.Name); + } + + [TestMethod] + public void WhenUsingAReversedComparer_ThenHighestNumberIsDequeuedFirst() + { + var hospitalQueue = new PriorityQueue(Comparer.Create((x, y) => y.CompareTo(x))); + hospitalQueue.Enqueue(new("Sarah", 23), 23); + hospitalQueue.Enqueue(new("Elizabeth", 60), 60); + hospitalQueue.Enqueue(new("Natalie", 16), 16); + + Assert.AreEqual("Elizabeth", hospitalQueue.Dequeue().Name); + } +}