qcal/common/src/gregorian.test.ts
2023-04-22 21:57:03 -04:00

109 lines
4.7 KiB
TypeScript

import {gregorianJDN, jdnDate, jdnGregorian, JulianDay, JulianMonth, gregorianMonthDays} from './gregorian';
describe('gregorianJDN', () => {
it('works', () => {
expect(gregorianJDN(2000, 1, 1)).toBe(2451545);
expect(gregorianJDN(-4713, 11, 24)).toBe(0);
expect(gregorianJDN(11917, 9, 18)).toBe(6073915);
expect(gregorianJDN(-28565, 6, 17)).toBe(-8711925);
expect(gregorianJDN(-26650, 4, 13)).toBe(-8012550);
expect(gregorianJDN(17430, 3, 8)).toBe(8087303);
expect(gregorianJDN(3395, 7, 18)).toBe(2961257);
expect(gregorianJDN(4579, 3, 11)).toBe(3393575);
expect(gregorianJDN(-14851, 11, 22)).toBe(-3702831);
expect(gregorianJDN(8824, 11, 28)).toBe(4944292);
expect(gregorianJDN(19720, 8, 14)).toBe(8923868);
expect(gregorianJDN(7504, 7, 22)).toBe(4462042);
});
it('transition to Julian works', () => {
expect(gregorianJDN(2000, 1, 1, 2299161)).toBe(2451545);
expect(gregorianJDN(1969, 7, 20, 2299161)).toBe(2440423);
expect(gregorianJDN(1582, 10, 15, 2299161)).toBe(2299161);
expect(gregorianJDN(1582, 10, 4, 2299161)).toBe(2299160);
expect(gregorianJDN(1066, 10, 14, 2299161)).toBe(2110701);
expect(gregorianJDN(0, 12, 25, 2299161)).toBe(1721417);
expect(gregorianJDN(-4712, 1, 1, 2299161)).toBe(0);
});
});
describe('jdnGregorian', () => {
it('works', () => {
function checkJDN(jdn: number, year: number, month: JulianMonth, day: JulianDay) {
expect(jdnGregorian(jdn)).toEqual([year, month, day]);
expect(jdnDate(jdn)).toEqual(new Date(year, month - 1, day));
}
checkJDN(0, -4713, 11, 24);
checkJDN(2299160, 1582, 10, 14);
checkJDN(2299161, 1582, 10, 15);
checkJDN(2361221, 1752, 9, 13);
checkJDN(2361222, 1752, 9, 14);
checkJDN(2451545, 2000, 1, 1);
checkJDN(-8512316, -28019, 12, 20);
checkJDN(-8534852, -28080, 4, 8);
checkJDN(2653462, 2552, 10, 30);
checkJDN(3271156, 4244, 1, 8);
checkJDN(-666477, -6537, 2, 23);
checkJDN(2397854, 1852, 12, 31);
checkJDN(-1211235, -8029, 8, 26);
checkJDN(-91680, -4964, 11, 20);
checkJDN(-5605876, -20061, 7, 14);
checkJDN(-295121, -5521, 11, 19);
});
it('transition to Julian works', () => {
function checkJDN(jdn: number, year: number, month: JulianMonth, day: JulianDay) {
expect(jdnGregorian(jdn, 2299161)).toEqual([year, month, day]);
expect(jdnDate(jdn, 2299161)).toEqual(new Date(year, month - 1, day));
}
checkJDN(2451545, 2000, 1, 1);
checkJDN(2440423, 1969, 7, 20);
checkJDN(2299161, 1582, 10, 15);
checkJDN(2299160, 1582, 10, 4);
checkJDN(2110701, 1066, 10, 14);
checkJDN(1721417, 0, 12, 25);
checkJDN(0, -4712, 1, 1);
});
});
describe('monthLength', () => {
it('works for normal months', () => {
expect(gregorianMonthDays(2023, 1)).toEqual(31); // January
expect(gregorianMonthDays(2023, 3)).toEqual(31); // March
expect(gregorianMonthDays(2023, 4)).toEqual(30); // April
expect(gregorianMonthDays(2023, 5)).toEqual(31); // May
expect(gregorianMonthDays(2023, 6)).toEqual(30); // June
expect(gregorianMonthDays(2023, 7)).toEqual(31); // July
expect(gregorianMonthDays(2023, 8)).toEqual(31); // August
expect(gregorianMonthDays(2023, 9)).toEqual(30); // September
expect(gregorianMonthDays(2023, 10)).toEqual(31); // October
expect(gregorianMonthDays(2023, 11)).toEqual(30); // November
expect(gregorianMonthDays(2023, 12)).toEqual(31); // December
});
it('handles Gregorian leap years correctly', () => {
// Leap year: divisible by 400
expect(gregorianMonthDays(1600, 2)).toEqual(29);
expect(gregorianMonthDays(2000, 2)).toEqual(29);
expect(gregorianMonthDays(2400, 2)).toEqual(29);
// Not a leap year: divisible by 100 but not by 400
expect(gregorianMonthDays(1700, 2)).toEqual(28);
expect(gregorianMonthDays(1800, 2)).toEqual(28);
expect(gregorianMonthDays(1900, 2)).toEqual(28);
expect(gregorianMonthDays(2100, 2)).toEqual(28);
// Leap year: divisible by 4 but not by 100
expect(gregorianMonthDays(2004, 2)).toEqual(29);
expect(gregorianMonthDays(2008, 2)).toEqual(29);
expect(gregorianMonthDays(2012, 2)).toEqual(29);
expect(gregorianMonthDays(2016, 2)).toEqual(29);
expect(gregorianMonthDays(2001, 2)).toEqual(28);
expect(gregorianMonthDays(2002, 2)).toEqual(28);
expect(gregorianMonthDays(2003, 2)).toEqual(28);
});
});