RunningAverage runningAverage = new FullRunningAverage();
assertEquals(0, runningAverage.getCount());
assertTrue(Double.isNaN(runningAverage.getAverage()));
runningAverage.addDatum(1.0);
assertEquals(1, runningAverage.getCount());
assertEquals(1.0, runningAverage.getAverage(), EPSILON);
runningAverage.addDatum(1.0);
assertEquals(2, runningAverage.getCount());
assertEquals(1.0, runningAverage.getAverage(), EPSILON);
runningAverage.addDatum(4.0);
assertEquals(3, runningAverage.getCount());
assertEquals(2.0, runningAverage.getAverage(), EPSILON);
runningAverage.addDatum(-4.0);
assertEquals(4, runningAverage.getCount());
assertEquals(0.5, runningAverage.getAverage(), EPSILON);
assertEquals(3, runningAverage.getCount());
assertEquals(2.0, runningAverage.getAverage(), EPSILON);
runningAverage.removeDatum(4.0);
assertEquals(2, runningAverage.getCount());
assertEquals(1.0, runningAverage.getAverage(), EPSILON);
assertEquals(2, runningAverage.getCount());
assertEquals(1.0, runningAverage.getAverage(), EPSILON);
runningAverage.changeDatum(2.0);
assertEquals(2, runningAverage.getCount());
assertEquals(2.0, runningAverage.getAverage(), EPSILON);