@Test
 public void testMean() {
   StatTracker s = new StatTracker();
   s.addStat(0.0);
   s.addStat(1.0);
   s.addStat(2.0);
   Assert.assertEquals(1.0, s.mean(), EPSILON);
   s.addStat(3.0);
   Assert.assertEquals(1.5, s.mean(), EPSILON);
 }
  @Test
  public void testSampleVariance() {
    StatTracker s = new StatTracker();
    s.addStat(0.0);
    s.addStat(1.0);
    s.addStat(2.0);
    // sum(-1.0^2 + 0.0^2 + 1.0^2)/2
    Assert.assertEquals(1.0, s.sampleVariance(), EPSILON);

    // sum(-1.5^2 + -0.5^2 + 0.5^2 + 1.5^2)/3
    s.addStat(3.0);
    Assert.assertEquals(5.0 / 3.0, s.sampleVariance(), EPSILON);
  }
  @Test
  public void testPopulationVariance() {
    StatTracker s = new StatTracker();
    s.addStat(0.0);
    s.addStat(1.0);
    s.addStat(2.0);
    // sum(-1.0^2 + 0.0^2 + 1.0^2)/3
    Assert.assertEquals(2.0 / 3.0, s.populationVariance(), EPSILON);

    s.addStat(3.0);
    // sum(-1.5^2 + -0.5^2 + 0.5^2 + 1.5^2)/4
    Assert.assertEquals(5.0 / 4.0, s.populationVariance(), EPSILON);
  }
 @Test
 public void testNormalization() {
   StatTracker s = new StatTracker();
   Assert.assertTrue(Double.isNaN(s.normalizeValue(4.0)));
   Assert.assertTrue(Double.isNaN(s.normalizeValue(5.0)));
   s.addStat(4.0);
   Assert.assertTrue(Double.isNaN(s.normalizeValue(4.0)));
   Assert.assertTrue(Double.isNaN(s.normalizeValue(5.0)));
   s.addStat(4.0);
   Assert.assertTrue(Double.isInfinite(s.normalizeValue(3.0)) && s.normalizeValue(3.0) < 0.0);
   Assert.assertTrue(Double.isNaN(s.normalizeValue(4.0)));
   Assert.assertTrue(Double.isInfinite(s.normalizeValue(5.0)) && s.normalizeValue(5.0) > 0.0);
   s.addStat(2.0);
   Assert.assertEquals(1.0, s.normalizeValue(4.0), EPSILON);
   Assert.assertEquals(1.5, s.normalizeValue(5.0), EPSILON);
   s.addStat(6.0);
   Assert.assertEquals(0.5, s.normalizeValue(4.0), EPSILON);
   Assert.assertEquals(0.75, s.normalizeValue(5.0), EPSILON);
 }