import { BadiDate, badiDateSettings, LocalBadiDate } from '../src/localBadiDate';
import { BadiDate as BadiDateOrig } from '../src/badiDate';
import { clockLocationFromPolygons } from '../src/clockLocations';
import * as luxon from 'luxon';
import { clockMap } from './testData';
import { BadiDateSettings } from '../src/types';
const timesString = localBadiDate => (
`${localBadiDate.start.toFormat('HH:mm:ss')}|${
localBadiDate.sunrise.toFormat('HH:mm:ss')}|${
localBadiDate.solarNoon.toFormat('HH:mm:ss')}|${
localBadiDate.end.toFormat('HH:mm:ss')}`);
const bahjiLat = 32.943;
const bahjiLng = 35.092;
describe('API', () => {
expect(BadiDateOrig).toEqual(BadiDate);
});
describe('timestamps for start, sunrise, solar noon, and sunrise', () => {
const badiDate = new LocalBadiDate({ year: 172, month: 1, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
it('should have the correct timestamp for start', () => {
expect(badiDate.start.toISO()).toEqual('2015-03-20T17:51:00.000+02:00');
});
it('should have the correct timestamp for sunrise', () => {
expect(badiDate.sunrise.toISO()).toEqual('2015-03-21T05:43:00.000+02:00');
});
it('should have the correct timestamp for solar noon', () => {
expect(badiDate.solarNoon.toISO()).toEqual('2015-03-21T11:47:00.000+02:00');
});
it('should have the correct timestamp for end', () => {
expect(badiDate.end.toISO()).toEqual('2015-03-21T17:52:00.000+02:00');
});
});
describe('Getters', () => {
it('should return values from geographic getters', () => {
const badiDate = new LocalBadiDate({ year: 172, month: 1, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
expect(badiDate.latitude).toEqual(bahjiLat);
expect(badiDate.longitude).toEqual(bahjiLng);
expect(badiDate.timezoneId).toEqual('Asia/Jerusalem');
});
it('should return appropriate relative `LocalBadiDate` instances', () => {
const badiDate1 = new LocalBadiDate({ year: 172, month: 1, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
expect(badiDate1.nextMonth.badiDate.month).toEqual(2);
expect(badiDate1.nextMonth.badiDate.day).toEqual(1);
expect(badiDate1.previousMonth.badiDate.month).toEqual(19);
expect(badiDate1.previousMonth.badiDate.day).toEqual(1);
expect(badiDate1.nextDay.badiDate.month).toEqual(1);
expect(badiDate1.nextDay.badiDate.day).toEqual(2);
expect(badiDate1.previousDay.badiDate.month).toEqual(19);
expect(badiDate1.previousDay.badiDate.day).toEqual(19);
const badiDate2 = new LocalBadiDate({ year: 172, month: 9, day: 5 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
expect(badiDate2.nextMonth.badiDate.month).toEqual(10);
expect(badiDate2.nextMonth.badiDate.day).toEqual(1);
expect(badiDate2.previousMonth.badiDate.month).toEqual(8);
expect(badiDate2.previousMonth.badiDate.day).toEqual(1);
expect(badiDate2.nextDay.badiDate.month).toEqual(9);
expect(badiDate2.nextDay.badiDate.day).toEqual(6);
expect(badiDate2.previousDay.badiDate.month).toEqual(9);
expect(badiDate2.previousDay.badiDate.day).toEqual(4);
const badiDate3 = new LocalBadiDate({ year: 172, month: 19, day: 19 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
expect(badiDate3.nextMonth.badiDate.month).toEqual(1);
expect(badiDate3.nextMonth.badiDate.day).toEqual(1);
expect(badiDate3.previousMonth.badiDate.month).toEqual(20);
expect(badiDate3.previousMonth.badiDate.day).toEqual(1);
expect(badiDate3.nextDay.badiDate.month).toEqual(1);
expect(badiDate3.nextDay.badiDate.day).toEqual(1);
expect(badiDate3.previousDay.badiDate.month).toEqual(19);
expect(badiDate3.previousDay.badiDate.day).toEqual(18);
const badiDate4 = new LocalBadiDate({ year: 172, month: 19, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
expect(badiDate4.nextMonth.badiDate.month).toEqual(1);
expect(badiDate4.nextMonth.badiDate.day).toEqual(1);
expect(badiDate4.previousMonth.badiDate.month).toEqual(20);
expect(badiDate4.previousMonth.badiDate.day).toEqual(1);
expect(badiDate4.nextDay.badiDate.month).toEqual(19);
expect(badiDate4.nextDay.badiDate.day).toEqual(2);
expect(badiDate4.previousDay.badiDate.month).toEqual(20);
expect(badiDate4.previousDay.badiDate.day).toEqual(4);
const badiDate5 = new LocalBadiDate({ year: 178, month: 19, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
expect(badiDate5.nextMonth.badiDate.month).toEqual(1);
expect(badiDate5.nextMonth.badiDate.day).toEqual(1);
expect(badiDate5.previousMonth.badiDate.month).toEqual(20);
expect(badiDate5.previousMonth.badiDate.day).toEqual(1);
expect(badiDate5.nextDay.badiDate.month).toEqual(19);
expect(badiDate5.nextDay.badiDate.day).toEqual(2);
expect(badiDate5.previousDay.badiDate.month).toEqual(20);
expect(badiDate5.previousDay.badiDate.day).toEqual(5);
const badiDate6 = new LocalBadiDate({ year: 172, month: 20, day: 4 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
expect(badiDate6.nextMonth.badiDate.month).toEqual(19);
expect(badiDate6.nextMonth.badiDate.day).toEqual(1);
expect(badiDate6.previousMonth.badiDate.month).toEqual(18);
expect(badiDate6.previousMonth.badiDate.day).toEqual(1);
expect(badiDate6.nextDay.badiDate.month).toEqual(19);
expect(badiDate6.nextDay.badiDate.day).toEqual(1);
expect(badiDate6.previousDay.badiDate.month).toEqual(20);
expect(badiDate6.previousDay.badiDate.day).toEqual(3);
const badiDate7 = new LocalBadiDate({ year: 172, month: 18, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
expect(badiDate7.nextMonth.badiDate.month).toEqual(20);
expect(badiDate7.nextMonth.badiDate.day).toEqual(1);
expect(badiDate7.previousMonth.badiDate.month).toEqual(17);
expect(badiDate7.previousMonth.badiDate.day).toEqual(1);
expect(badiDate7.nextDay.badiDate.month).toEqual(18);
expect(badiDate7.nextDay.badiDate.day).toEqual(2);
expect(badiDate7.previousDay.badiDate.month).toEqual(17);
expect(badiDate7.previousDay.badiDate.day).toEqual(19);
});
});
it('should use the following day as input for the BadiDate if the input datetime is after sunset', () => {
const badiDate1 = new LocalBadiDate(luxon.DateTime.fromISO('2015-03-21T12:00:00', { zone: 'Asia/Jerusalem' }),
bahjiLat, bahjiLng, 'Asia/Jerusalem');
const badiDate2 = new LocalBadiDate(luxon.DateTime.fromISO('2015-03-21T20:00:00', { zone: 'Asia/Jerusalem' }),
bahjiLat, bahjiLng, 'Asia/Jerusalem');
expect(badiDate1.badiDate.gregorianDate.day).toEqual(21);
expect(badiDate2.badiDate.gregorianDate.day).toEqual(22);
});
describe('the BadiDate settings', () => {
const settingsData = [
{
settings: { defaultLanguage: 'en', underlineFormat: 'css' },
expectedOutput: 'Mashíyyat (Will)',
}, {
settings: { defaultLanguage: 'es', underlineFormat: 'css' },
expectedOutput: 'Mashíyyat (Voluntad)',
}, {
settings: { defaultLanguage: 'en', underlineFormat: 'diacritic' },
expectedOutput: 'Mas̲h̲íyyat (Will)',
}, {
settings: { defaultLanguage: 'es', underlineFormat: 'diacritic' },
expectedOutput: 'Mas̲h̲íyyat (Voluntad)',
},
];
const badiDate = new LocalBadiDate({ year: 172, month: 11, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
settingsData.forEach(({ settings, expectedOutput }) => {
it('should pass on the settings to the BadiDate class', () => {
badiDateSettings(settings as BadiDateSettings);
expect(badiDate.badiDate.format('MM+')).toEqual(expectedOutput);
});
});
});
describe('the useClockLocationSettings', () => {
afterAll(() => {
badiDateSettings({ useClockLocations: true });
});
const clockLocationDates = [
{
date: { year: 172, month: 1, day: 1 },
latitude: 65.0,
longitude: -150.0,
timezone: 'America/Anchorage',
fixedTimes: '19:00:00|07:00:00|13:00:00|19:00:00',
solarTimes: '20:16:00|07:57:00|14:07:00|20:19:00',
clockLocation: 'USA',
}, {
date: { year: 172, month: 1, day: 1 },
latitude: 62.0,
longitude: -120.0,
timezone: 'America/Edmonton',
fixedTimes: '18:00:00|06:30:00|12:00:00|18:00:00',
solarTimes: '20:15:00|07:58:00|14:07:00|20:18:00',
clockLocation: 'Canada',
}, {
date: { year: 172, month: 1, day: 1 },
latitude: 65.0,
longitude: -19.0,
timezone: 'Atlantic/Reykjavik',
fixedTimes: '18:00:00|06:00:00|13:00:00|18:00:00',
solarTimes: '19:31:00|07:14:00|13:23:00|19:34:00',
clockLocation: 'Iceland',
}, {
date: { year: 172, month: 1, day: 1 },
latitude: 60.0,
longitude: 10.0,
timezone: 'Europe/Oslo',
fixedTimes: '18:00:00|06:00:00|12:00:00|18:00:00',
solarTimes: '18:34:00|06:20:00|12:27:00|18:36:00',
clockLocation: 'Norway',
}, {
date: { year: 172, month: 1, day: 1 },
latitude: 65.0,
longitude: 17.0,
timezone: 'Europe/Stockholm',
fixedTimes: '18:00:00|06:00:00|12:00:00|18:00:00',
solarTimes: '18:07:00|05:51:00|11:59:00|18:10:00',
clockLocation: 'Sweden',
}, {
date: { year: 172, month: 1, day: 1 },
latitude: 65.0,
longitude: 28.0,
timezone: 'Europe/Helsinki',
fixedTimes: '18:00:00|06:00:00|12:00:00|18:00:00',
solarTimes: '18:23:00|06:07:00|12:15:00|18:26:00',
clockLocation: 'Finland',
}, {
date: { year: 172, month: 19, day: 19 },
latitude: 65.0,
longitude: 28.0,
timezone: 'Europe/Helsinki',
fixedTimes: '18:19:00|06:11:00|12:16:00|18:22:00',
solarTimes: '18:19:00|06:11:00|12:16:00|18:22:00',
clockLocation: 'Finland',
},
];
clockLocationDates.forEach(({ date, latitude, longitude, timezone, fixedTimes, clockLocation }) => {
it('should output the appropriate time for areas where fixed times are used', () => {
const badiDate = new LocalBadiDate(date, latitude, longitude, timezone);
expect(timesString(badiDate)).toEqual(fixedTimes);
expect(badiDate.clockLocation).toEqual(clockLocation);
});
});
clockLocationDates.forEach(({ date, latitude, longitude, timezone, solarTimes }) => {
it('should not output fixed times if useClockLocations if false', () => {
badiDateSettings({ useClockLocations: false });
const badiDate = new LocalBadiDate(date, latitude, longitude, timezone);
expect(timesString(badiDate)).toEqual(solarTimes);
expect(badiDate.clockLocation).toBeUndefined();
});
});
describe('should determine the correct region for the given coordinates', () => {
beforeEach(() => {
badiDateSettings({ useClockLocations: true });
});
const valueMapping = [undefined, 'USA', 'Canada', 'Iceland', 'Norway', 'Sweden', 'Finland'];
for (let i = 0; i < 40; i++) {
const lat = 90 - i;
for (let j = 0; j < 360; j++) {
const lng = -180 + j;
it(`latitude: ${lat}, longitude: ${lng}`, () => {
expect(clockLocationFromPolygons(lat, lng)).toEqual(valueMapping[clockMap[i][j]]);
});
}
}
});
});
describe('the Holy Day commemoration times', () => {
const holyDayDates = [
{ date: { year: 172, holyDayNumber: 1 }, commemorationTime: undefined },
{ date: { year: 172, holyDayNumber: 2 }, commemorationTime: '16:00:00' },
{ date: { year: 172, holyDayNumber: 3 }, commemorationTime: undefined },
{ date: { year: 172, holyDayNumber: 4 }, commemorationTime: undefined },
{ date: { year: 172, holyDayNumber: 5 }, commemorationTime: '21:48:00' },
{ date: { year: 172, holyDayNumber: 6 }, commemorationTime: '04:00:00' },
{ date: { year: 172, holyDayNumber: 7 }, commemorationTime: '12:45:00' },
{ date: { year: 172, holyDayNumber: 8 }, commemorationTime: undefined },
{ date: { year: 172, holyDayNumber: 9 }, commemorationTime: undefined },
{ date: { year: 172, holyDayNumber: 10 }, commemorationTime: undefined },
{ date: { year: 172, holyDayNumber: 11 }, commemorationTime: '01:00:00' },
];
holyDayDates.forEach(({ date, commemorationTime }) => {
it('should show the correct comemmoration time where appropriate', () => {
const badiDate = new LocalBadiDate(date, bahjiLat, bahjiLng, 'Asia/Jerusalem');
expect(badiDate.holyDayCommemoration?.toFormat?.('HH:mm:ss')).toEqual(commemorationTime);
});
});
const southernHemisphereCommemorationTimes = [
{ date: { year: 172, holyDayNumber: 2 }, commemorationTime: '15:00:00' },
{ date: { year: 172, holyDayNumber: 6 }, commemorationTime: '03:00:00' },
{ date: { year: 172, holyDayNumber: 11 }, commemorationTime: '02:00:00' },
];
southernHemisphereCommemorationTimes.forEach(({ date, commemorationTime }) => {
it('should show the correct commemoration time in the southern hemisphere with DST', () => {
const badiDate = new LocalBadiDate(date, 33.8, 151.2, 'Australia/Sydney');
expect(badiDate.holyDayCommemoration.toFormat?.('HH:mm:ss')).toEqual(commemorationTime);
});
});
});