using Amphora; using Azimuth; using UnitTestSharp; namespace Konis.UnitTests { public class ParticleChannelTests : TestFixture { private static Particle Fresh() { return new Particle { Lifetime = 1 }; } public class OfTests : TestFixture { public void AVariationOfZero_IsAZeroChannelThatTakesNoColumn() { int columnCount = 3; ParticleChannel channel = ParticleChannel.Of(Variation.None, ref columnCount); CheckEqual(ChannelMode.Zero, channel.Mode); CheckEqual(0f, channel.Value); CheckEqual(-1, channel.Column); CheckEqual(3, columnCount); } public void ARangeWithNoWidthAboveZero_IsAConstantChannelThatTakesNoColumn() { int columnCount = 3; ParticleChannel channel = ParticleChannel.Of(2.5, ref columnCount); CheckEqual(ChannelMode.Constant, channel.Mode); CheckEqual(2.5f, channel.Value); CheckEqual(-1, channel.Column); CheckEqual(3, columnCount); } public void ARangeWithNoWidthBelowZero_IsAConstantChannel() { int columnCount = 0; ParticleChannel channel = ParticleChannel.Of(-9.5, ref columnCount); CheckEqual(ChannelMode.Constant, channel.Mode); CheckEqual(-9.5f, channel.Value); } public void ARangeWithWidth_IsAPerParticleChannelThatTakesTheNextColumn() { int columnCount = 3; ParticleChannel channel = ParticleChannel.Of(new Variation(1, 2), ref columnCount); CheckEqual(ChannelMode.PerParticle, channel.Mode); CheckEqual(0f, channel.Value); CheckEqual(3, channel.Column); CheckEqual(4, columnCount); } public void ARangeWithWidthStartingAtZero_IsAPerParticleChannel() { int columnCount = 0; CheckEqual(ChannelMode.PerParticle, ParticleChannel.Of(new Variation(0, 1), ref columnCount).Mode); } public void RangesWithWidth_TakeConsecutiveColumns() { int columnCount = 0; ParticleChannel first = ParticleChannel.Of(new Variation(0, 1), ref columnCount); ParticleChannel second = ParticleChannel.Of(new Variation(0, 1), ref columnCount); CheckEqual(0, first.Column); CheckEqual(1, second.Column); CheckEqual(2, columnCount); } public void KeepsTheVariation() { int columnCount = 0; var variation = new Variation(1, 2); CheckEqual(2.0, ParticleChannel.Of(variation, ref columnCount).Variation.Maximum.Value); } } public class BirthTests : TestFixture { public void PerParticle_DrawsTheParticlesValueIntoItsColumn() { int columnCount = 0; ParticleChannel channel = ParticleChannel.Of(new Variation(0, 16), ref columnCount); var store = new ParticleStore(capacity: 2, columnCount: columnCount); store.Add(Fresh()); int index = store.Add(Fresh()); ScriptedGenerator random = ScriptedGenerator.OfUnits(0.5); channel.Birth(store, index, random); CheckEqual(8f, store.Columns[0][1]); CheckEqual(0f, store.Columns[0][0]); CheckEqual(0, random.Remaining); } public void Constant_TakesNoRandomNumber() { int columnCount = 0; ParticleChannel channel = ParticleChannel.Of(3, ref columnCount); var store = new ParticleStore(capacity: 1, columnCount: columnCount); int index = store.Add(Fresh()); ScriptedGenerator random = ScriptedGenerator.OfUnits(0.25); channel.Birth(store, index, random); CheckEqual(1, random.Remaining); } public void Zero_TakesNoRandomNumber() { int columnCount = 0; ParticleChannel channel = ParticleChannel.Of(Variation.None, ref columnCount); var store = new ParticleStore(capacity: 1, columnCount: columnCount); int index = store.Add(Fresh()); ScriptedGenerator random = ScriptedGenerator.OfUnits(0.25); channel.Birth(store, index, random); CheckEqual(1, random.Remaining); } } public class GetTests : TestFixture { public void PerParticle_ReadsTheParticlesColumnEntry() { int columnCount = 0; ParticleChannel channel = ParticleChannel.Of(new Variation(0, 1), ref columnCount); var store = new ParticleStore(capacity: 2, columnCount: columnCount); store.Add(Fresh()); store.Add(Fresh()); store.Columns[0][1] = 6; CheckEqual(6f, channel.Get(store, 1)); CheckEqual(0f, channel.Get(store, 0)); } public void Constant_IsTheValueForEveryParticle() { int columnCount = 0; ParticleChannel channel = ParticleChannel.Of(2.5, ref columnCount); var store = new ParticleStore(capacity: 1, columnCount: columnCount); store.Add(Fresh()); CheckEqual(2.5f, channel.Get(store, 0)); } public void Zero_IsZero() { int columnCount = 0; ParticleChannel channel = ParticleChannel.Of(Variation.None, ref columnCount); var store = new ParticleStore(capacity: 1, columnCount: columnCount); store.Add(Fresh()); CheckEqual(0f, channel.Get(store, 0)); } } } }