Disclaimer The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.
public class ContinuousAverage { private int count = 0; private decimal? currentAverage = null ; public decimal Average { get { if (currentAverage == null) throw new InvalidOperationException ("No numbers have been averaged"); return currentAverage.Value; } } public int Count { get { return count; } } public void Add(decimal number) { count++; if (currentAverage == null) { currentAverage = number; } else { decimal differenceFromAverage = number - currentAverage.Value; currentAverage += differenceFromAverage / count; } }}[TestFixture] public class ContinuousAverageTests{ [Test] [ExpectedException(typeof(InvalidOperationException ), "No numbers have been averaged")] public void TestAverageOfNoItemsThrowsException( ) { MovingAverage movingAverage = new MovingAverage (); decimal value = movingAverage.Average; } [Test] public void TestAverageOfOneItemIsItemValue( ) { MovingAverage movingAverage = new MovingAverage (); movingAverage.Add( 1.234M ); Assert.AreEqual( 1.234M, movingAverage.Average ); } [Test] public void TestAverageOfSeveralItemsIsStandardArithmeticMean() { MovingAverage movingAverage = new MovingAverage (); movingAverage.Add(6); movingAverage.Add(2); movingAverage.Add(4); movingAverage.Add(5); movingAverage.Add(6); movingAverage.Add(3); movingAverage.Add(2); Assert.AreEqual(7, movingAverage.Count); Assert.AreEqual(4, movingAverage.Average, "(6+2+4+5+6+3+2)/7 = (28/7) = 4"); }}
Remember Me