require "big"

describe Math::Mean do
  it "test several basic mean special case" do
    arr = ([] of Int32)
    arr.mean.should eq 0.0
    arr.quadratic_mean.should eq 0.0
    arr.harmonic_mean.should eq 0.0
    arr.geometric_mean.should eq 0.0
  end

  it "test mean on Array(Float64)" do
    [1.0, 2.0, 3.0].mean.should eq 2.0
    [1.0, 2.0, -3.0].mean.should eq 0.0
  end

  it "test mean on Array(Int32)" do
    [1, 2, 3].mean.should eq 2.0
    [1, 2, -3].mean.should eq 0.0
  end

  it "test mean on big" do
    [BigInt.new(1), 2, 3].mean.should eq 2.0
    [BigInt.new(1), BigInt.new(2), BigFloat.new(-3)].mean.should eq 0.0
  end

  it "test quadratic mean" do
    [1, 2, 3, 2].quadratic_mean.round(4).should eq(2.1213)
    [1, 2, 1, 5, 10, 9, 1, -13, 2].quadratic_mean.round(4).should eq(6.549)
  end

  it "test geometric mean" do
    [2, 32].geometric_mean.should eq(8)
    [10, 15].geometric_mean.round(2).should eq(12.25)
    [5, 3, 12].geometric_mean.round(2).should eq(5.65)
    [7, 9, 12].geometric_mean.round(2).should eq(9.11)
  end

  it "test harmonic mean" do
    [1, 4, 1, 2].harmonic_mean.round(3).should eq(1.455)
    [13, 23, 12, 44, 55].harmonic_mean.round(3).should eq(20.438)
  end
end
