require 'date'


describe "Date#new_start" do
  it "converts a date object into another with a new calendar reform" do
    Date.civil(1582, 10, 14, Date::ENGLAND).new_start.should == Date.civil(1582, 10, 24)
    Date.civil(1582, 10,  4, Date::ENGLAND).new_start.should == Date.civil(1582, 10,  4)
    Date.civil(1582, 10, 15).new_start(Date::ENGLAND).should == Date.civil(1582, 10,  5, Date::ENGLAND)
    Date.civil(1752,  9, 14).new_start(Date::ENGLAND).should == Date.civil(1752,  9, 14, Date::ENGLAND)
    Date.civil(1752,  9, 13).new_start(Date::ENGLAND).should == Date.civil(1752,  9,  2, Date::ENGLAND)
  end
end

describe "Date#italy" do
  it "converts a date object into another with the Italian calendar reform" do
    Date.civil(1582, 10, 14, Date::ENGLAND).italy.should == Date.civil(1582, 10, 24)
    Date.civil(1582, 10,  4, Date::ENGLAND).italy.should == Date.civil(1582, 10,  4)
  end
end

describe "Date#england" do
  it "converts a date object into another with the English calendar reform" do
    Date.civil(1582, 10, 15).england.should == Date.civil(1582, 10,  5, Date::ENGLAND)
    Date.civil(1752,  9, 14).england.should == Date.civil(1752,  9, 14, Date::ENGLAND)
    Date.civil(1752,  9, 13).england.should == Date.civil(1752,  9,  2, Date::ENGLAND)
  end
end

describe "Date#julian" do
  it "converts a date object into another with the Julian calendar" do
    Date.civil(1582, 10, 15).julian.should == Date.civil(1582, 10,  5, Date::JULIAN)
    Date.civil(1752,  9, 14).julian.should == Date.civil(1752,  9,  3, Date::JULIAN)
    Date.civil(1752,  9, 13).julian.should == Date.civil(1752,  9,  2, Date::JULIAN)
  end
end

describe "Date#gregorian" do
  it "converts a date object into another with the Gregorian calendar" do
    Date.civil(1582, 10,  4).gregorian.should == Date.civil(1582, 10, 14, Date::GREGORIAN)
    Date.civil(1752,  9, 14).gregorian.should == Date.civil(1752,  9, 14, Date::GREGORIAN)
  end
end

ruby_version_is "" ... "1.9" do
  describe "Date#ordinal_to_jd" do
    it "converts an ordinal date (year-day) to a Julian day number" do
      Date.ordinal_to_jd(2007, 55).should == 2454156
    end
  end

  describe "Date#jd_to_ordinal" do
    it "converts a Julian day number into an ordinal date" do
      Date.jd_to_ordinal(2454156).should == [2007, 55]
    end
  end

  describe "Date#civil_to_jd" do
    it "converts a civil date into a Julian day number" do
      Date.civil_to_jd(2007, 2, 24).should == 2454156
    end
  end

  describe "Date#jd_to_civil" do
    it "converts a Julian day into a civil date" do
      Date.jd_to_civil(2454156).should == [2007, 2, 24]
    end
  end

  describe "Date#commercial_to_jd" do
    it "converts a commercial date (year - week - day of week) into a Julian day number" do
      Date.commercial_to_jd(2007, 45, 1).should == 2454410
    end
  end

  describe "Date#jd_to_commercial" do
    it "converts a Julian day number into a commercial date" do
      Date.jd_to_commercial(2454410).should == [2007, 45, 1]
    end
  end

  describe "Date#ajd_to_jd" do
    it "converts a Astronomical Julian day number into a Julian day number" do
      Date.ajd_to_jd(2454410).should == [2454410, Rational(1,2)]
      Date.ajd_to_jd(2454410, 1.to_r / 2).should == [2454411, 0]
    end
  end

  describe "Date#jd_to_ajd" do
    it "converts a Julian day number into a Astronomical Julian day number" do
      Date.jd_to_ajd(2454410, 0).should == 2454410 - Rational(1, 2)
      Date.jd_to_ajd(2454410, 1.to_r / 2).should == 2454410
    end
  end

  describe "Date#day_fraction_to_time" do
    it "converts a day fraction into time" do
      Date.day_fraction_to_time(2).should == [48, 0, 0, 0]
      Date.day_fraction_to_time(1).should == [24, 0, 0, 0]
      Date.day_fraction_to_time(1.to_r / 2).should == [12, 0, 0, 0]
      Date.day_fraction_to_time(1.to_r / 7).should == [3, 25, 42, 1.to_r / 100800]
    end
  end

  describe "Date#time_to_day_fraction" do
    it "converts a time into a day fraction" do
      Date.time_to_day_fraction(48, 0, 0).should == 2
      Date.time_to_day_fraction(24, 0, 0).should == 1
      Date.time_to_day_fraction(12, 0, 0).should == 1.to_r / 2
      Date.time_to_day_fraction(10, 20, 10).should == 10.to_r / 24 + 20.to_r / (24 * 60) + 10.to_r / (24 * 60 * 60)
    end
  end

  describe "Date#amjd_to_ajd" do
    it "converts Astronomical Modified Julian day numbers into Astronomical Julian day numbers" do
      Date.amjd_to_ajd(10).should == 10 + 2400000 + 1.to_r / 2
    end
  end

  describe "Date#ajd_to_amjd" do
    it "converts Astronomical Julian day numbers into Astronomical Modified Julian day numbers" do
      Date.ajd_to_amjd(10000010).should == 10000010 - 2400000 - 1.to_r / 2
    end
  end

  describe "Date#mjd_to_jd" do
    it "converts Modified Julian day numbers into Julian day numbers" do
      Date.mjd_to_jd(2000).should == 2000 + 2400001
    end
  end

  describe "Date#jd_to_mjd" do
    it "converts Julian day numbers into Modified Julian day numbers" do
      Date.jd_to_mjd(2500000).should == 2500000 - 2400001
    end
  end

  describe "Date#ld_to_jd" do
    it "converts the number of days since the Gregorian calendar in Italy into Julian day numbers" do
      Date.ld_to_jd(450000).should == 450000 + 2299160
    end
  end

  describe "Date#jd_to_ld" do
    it "converts Julian day numbers into the number of days since the Gregorian calendar in Italy" do
      Date.jd_to_ld(2450000).should == 2450000 - 2299160
    end
  end

  describe "Date#jd_to_wday" do
    it "converts a Julian day number into a week day number" do
      Date.jd_to_wday(2454482).should == 3
    end
  end
end
