#include "gtest/gtest.h"
#include "frc971/zeroing/averager.h"

namespace frc971 {
namespace zeroing {

class AveragerTest : public ::testing::Test {
 protected:
  void SetUp() override {}
};

// Makes sure that we can compute the average of a bunch of integers.
TEST_F(AveragerTest, ComputeIntegerAverage) {
  Averager<int, 6> averager;
  for (size_t i = 0; i < averager.size(); ++i) {
    ASSERT_FALSE(averager.full());
    averager.AddData(static_cast<int>(i));
  }
  ASSERT_TRUE(averager.full());
  ASSERT_EQ(2, averager.GetAverage()(0, 0));
}

// Makes sure that we can compute the average of a bunch of floats.
TEST_F(AveragerTest, ComputeFloatAverage) {
  Averager<float, 100> averager;
  for (size_t i = 0; i < averager.size(); ++i) {
    ASSERT_FALSE(averager.full());
    averager.AddData(static_cast<float>(i) / 3.0);
  }
  ASSERT_TRUE(averager.full());
  ASSERT_NEAR(16.5, averager.GetAverage()(0, 0), 0.001);
}

TEST_F(AveragerTest, CalculateRange) {
  Averager<float, 5, 2> averager;
  ASSERT_EQ(0, averager.GetRange());
  averager.AddData({100, 10});
  averager.AddData({105, 15});
  averager.AddData({90, 9});
  ASSERT_EQ(15, averager.GetRange());
  for (size_t ii = 0; ii < averager.size(); ++ii) {
    averager.AddData({10, 20});
  }
  ASSERT_EQ(0, averager.GetRange());
}

TEST_F(AveragerTest, ResetAverager) {
  Averager<float, 5> averager;
  for (size_t ii = 0; ii < averager.size(); ++ii) {
    averager.AddData(10);
  }
  ASSERT_TRUE(averager.full());
  ASSERT_EQ(10.0, averager.GetAverage()(0, 0));
  averager.Reset();
  ASSERT_FALSE(averager.full());
  ASSERT_EQ(0.0, averager.GetAverage()(0, 0));
}

}  // namespace zeroing
}  // namespace frc971
