diff --git a/common/src/mayan.test.ts b/common/src/mayan.test.ts index d59aee3..9bcc8e3 100644 --- a/common/src/mayan.test.ts +++ b/common/src/mayan.test.ts @@ -2,7 +2,7 @@ import { formatHaab, formatLordOfNight, formatTzolkin, HaabMonth, haabMonthDays, - jdnHaab, jdnHaabExt, + jdnHaab, jdnHaabExt, haabExtJDN, jdnLordOfNight, jdnTzolkin, TzolkinName, @@ -207,6 +207,38 @@ describe('jdnHaabExt', () => { }); }); +describe('haabExtJDN', () => { + it('handles creation correctly', () => { + expect(haabExtJDN({year: -1, month: 19, day: 4})).toBe(583934); // end of the year before creation + expect(haabExtJDN({year: 0, month: 1, day: 0})).toBe(583935); // start of the year of creation + expect(haabExtJDN({year: 0, month: 18, day: 8})).toBe(584283); // creation + expect(haabExtJDN({year: 0, month: 19, day: 4})).toBe(584299); // end of the year of creation + expect(haabExtJDN({year: 1, month: 1, day: 0})).toBe(584300); // first 0 Pop after creation + }); + + it('handles 5141 cycles since creation correctly', () => { + expect(haabExtJDN({year: 5141, month: 18, day: 8})).toBe(2460748); // exactly 5141 years since creation + expect(haabExtJDN({year: 5141, month: 19, day: 4})).toBe(2460764); // end of that cycle + expect(haabExtJDN({year: 5142, month: 1, day: 0})).toBe(2460765); // start of the next cycle + }); + + it('converts sample dates from history correctly', () => { + expect(haabExtJDN({year: 0, month: 18, day: 8})).toBe(584283); // Mayan creation + expect(haabExtJDN({year: 3072, month: 11, day: 11})).toBe(1705426); // Ides of March + expect(haabExtJDN({year: 4609, month: 4, day: 16})).toBe(2266296); // Columbus reaches the Americas + expect(haabExtJDN({year: 5058, month: 12, day: 11})).toBe(2430336); // a date which will live in infamy + expect(haabExtJDN({year: 5086, month: 5, day: 18})).toBe(2440423); // Moon landing + expect(haabExtJDN({year: 5136, month: 18, day: 5})).toBe(2458920); // COVID-19 pandemic + }); + + it('handles negative JDN correctly', () => { + expect(haabExtJDN({year: -1601, month: 4, day: 5})).toBe(-365); + expect(haabExtJDN({year: -1601, month: 19, day: 4})).toBe(-66); + expect(haabExtJDN({year: -1600, month: 1, day: 0})).toBe(-65); + expect(haabExtJDN({year: -1600, month: 4, day: 4})).toBe(-1); + }); +}); + describe('formatLordOfNight', () => { it('should format Lord of Night 1', () => { expect(formatLordOfNight(1)).toBe('G1'); diff --git a/common/src/mayan.ts b/common/src/mayan.ts index 9bca945..ce270cd 100644 --- a/common/src/mayan.ts +++ b/common/src/mayan.ts @@ -125,6 +125,10 @@ export function jdnHaabExt(jdn: number): HaabExt { }; } +export function haabExtJDN({year, month, day}: HaabExt): number { + return 583935 + 365 * year + (month - 1) * 20 + day; +} + export type LordOfNight = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; export function formatLordOfNight(lordOfNight: LordOfNight): string {