| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- 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: 'Ma<span style="text-decoration:underline">sh</span>íyyat (Will)',
- }, {
- settings: { defaultLanguage: 'es', underlineFormat: 'css' },
- expectedOutput: 'Ma<span style="text-decoration:underline">sh</span>í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);
- });
- });
- });
|