using System; using UnitTestSharp; namespace Susurrus.UnitTests { public class VoiceTableTests : TestFixture { public class CtorTests : TestFixture { public void StartsEmpty() { VoiceTable table = new VoiceTable(3); CheckEqual(3, table.Capacity); CheckEqual(0, table.ActiveCount); } public void ZeroCapacity_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new VoiceTable(0); } } public class AcquireTests : TestFixture { public void HandsOutTheLowestFreeSlotFirst() { VoiceTable table = new VoiceTable(3); CheckEqual(0, table.Acquire().Slot); CheckEqual(1, table.Acquire().Slot); CheckEqual(2, table.Acquire().Slot); } public void FirstUseOfASlot_IsGenerationOne() { CheckEqual(1, new VoiceTable(1).Acquire().Generation); } public void CountsTheVoiceAsActive() { VoiceTable table = new VoiceTable(3); table.Acquire(); CheckEqual(1, table.ActiveCount); } public void WhenEverySlotIsInUse_ReturnsNone() { VoiceTable table = new VoiceTable(2); table.Acquire(); table.Acquire(); CheckEqual(Voice.None, table.Acquire()); CheckEqual(2, table.ActiveCount); } public void ReusingASlot_AdvancesItsGeneration() { VoiceTable table = new VoiceTable(1); Voice first = table.Acquire(); table.Release(first); Voice second = table.Acquire(); CheckEqual(first.Slot, second.Slot); CheckEqual(first.Generation + 1, second.Generation); } public void ReleasedSlots_AreReusedMostRecentFirst() { VoiceTable table = new VoiceTable(3); Voice zero = table.Acquire(); Voice one = table.Acquire(); table.Acquire(); table.Release(zero); table.Release(one); CheckEqual(1, table.Acquire().Slot); CheckEqual(0, table.Acquire().Slot); } } public class IsActiveTests : TestFixture { public void AnAcquiredVoice_IsActive() { VoiceTable table = new VoiceTable(2); CheckTrue(table.IsActive(table.Acquire())); } public void None_IsNotActive() { VoiceTable table = new VoiceTable(2); table.Acquire(); CheckFalse(table.IsActive(Voice.None)); } public void AReleasedVoice_IsNotActive() { VoiceTable table = new VoiceTable(2); Voice voice = table.Acquire(); table.Release(voice); CheckFalse(table.IsActive(voice)); } public void AVoiceWhoseSlotWasReused_IsNotActive() { VoiceTable table = new VoiceTable(1); Voice old = table.Acquire(); table.Release(old); Voice current = table.Acquire(); CheckFalse(table.IsActive(old)); CheckTrue(table.IsActive(current)); } public void AVoiceFromASlotThisTableDoesNotHave_IsNotActive() { VoiceTable table = new VoiceTable(1); table.Acquire(); CheckFalse(table.IsActive(new Voice(slot: 5, generation: 1))); } } public class ReleaseTests : TestFixture { public void FreesTheSlot() { VoiceTable table = new VoiceTable(2); Voice voice = table.Acquire(); CheckTrue(table.Release(voice)); CheckEqual(0, table.ActiveCount); } public void ReleasingTwice_ChangesNothingTheSecondTime() { VoiceTable table = new VoiceTable(2); Voice voice = table.Acquire(); table.Release(voice); CheckFalse(table.Release(voice)); CheckEqual(0, table.ActiveCount); } public void ReleasingAStaleVoice_LeavesTheNewOneRunning() { VoiceTable table = new VoiceTable(1); Voice old = table.Acquire(); table.Release(old); Voice current = table.Acquire(); CheckFalse(table.Release(old)); CheckTrue(table.IsActive(current)); } public void ReleasingNone_ChangesNothing() { VoiceTable table = new VoiceTable(2); table.Acquire(); CheckFalse(table.Release(Voice.None)); CheckEqual(1, table.ActiveCount); } public void ReleasingAFullTableThenAcquiring_WorksAgain() { VoiceTable table = new VoiceTable(1); table.Release(table.Acquire()); CheckFalse(table.Acquire().IsNone); } } public class VoiceAtTests : TestFixture { public void ReturnsTheVoiceInAnActiveSlot() { VoiceTable table = new VoiceTable(2); Voice voice = table.Acquire(); CheckEqual(voice, table.VoiceAt(voice.Slot)); } public void ReturnsNoneForAFreeSlot() { VoiceTable table = new VoiceTable(2); Voice voice = table.Acquire(); table.Release(voice); CheckEqual(Voice.None, table.VoiceAt(voice.Slot)); } public void NegativeSlot_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new VoiceTable(2).VoiceAt(-1); } public void SlotPastTheEnd_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new VoiceTable(2).VoiceAt(2); } } } }