UNPKG

@wojtekmaj/date-utils

Version:

A collection of date-related utilities.

1,038 lines (741 loc) 25 kB
import { describe, expect, it } from 'vitest'; import { getYear, getMonth, getMonthHuman, getDate, getHours, getMinutes, getSeconds, getMilliseconds, getCenturyStart, getPreviousCenturyStart, getNextCenturyStart, getCenturyEnd, getPreviousCenturyEnd, getNextCenturyEnd, getCenturyRange, getDecadeStart, getPreviousDecadeStart, getNextDecadeStart, getDecadeEnd, getPreviousDecadeEnd, getNextDecadeEnd, getDecadeRange, getYearStart, getPreviousYearStart, getNextYearStart, getYearEnd, getPreviousYearEnd, getNextYearEnd, getYearRange, getMonthStart, getPreviousMonthStart, getNextMonthStart, getMonthEnd, getPreviousMonthEnd, getNextMonthEnd, getMonthRange, getDayStart, getPreviousDayStart, getNextDayStart, getDayEnd, getPreviousDayEnd, getNextDayEnd, getDayRange, getDaysInMonth, getHoursMinutes, getHoursMinutesSeconds, getISOLocalMonth, getISOLocalDate, getISOLocalDateTime, } from './index.js'; type DateLike = Date | number | string; function testThrow(fn: ((arg: Date) => void) | ((arg: DateLike) => void)) { it('throws an error when given nonsense data', () => { const text = 'wololo'; const flag = true; // @ts-expect-error-next-line expect(() => fn(text)).toThrow(); // @ts-expect-error-next-line expect(() => fn(flag)).toThrow(); // @ts-expect-error-next-line expect(() => fn()).toThrow(); }); } /** * Simple getters */ describe('getYear()', () => { it('returns proper year for a given date', () => { const date = new Date(2019, 0, 1); const year = getYear(date); expect(year).toBe(2019); }); it('returns proper year for a given number', () => { const date = 2019; const year = getYear(date); expect(year).toBe(2019); }); it('returns proper year for a given string', () => { const date = '2019'; const year = getYear(date); expect(year).toBe(2019); }); testThrow(getYear); }); describe('getMonth()', () => { it('returns proper month', () => { const date = new Date(2019, 0, 1); const result = getMonth(date); expect(result).toBe(0); }); testThrow(getMonth); }); describe('getMonthHuman()', () => { it('returns proper human-readable month', () => { const date = new Date(2019, 0, 1); const result = getMonthHuman(date); expect(result).toBe(1); }); testThrow(getMonthHuman); }); describe('getDate()', () => { it('returns proper date', () => { const date = new Date(2019, 0, 1); const result = getDate(date); expect(result).toBe(1); }); testThrow(getDate); }); describe('getHours()', () => { it('returns proper hours from Date', () => { const date = new Date(2019, 0, 1, 22, 41, 56); const result = getHours(date); expect(result).toBe(22); }); it('returns proper hours from string', () => { const date = '22:41:56'; const result = getHours(date); expect(result).toBe(22); }); testThrow(getHours); }); describe('getMinutes()', () => { it('returns proper minutes from Date', () => { const date = new Date(2019, 0, 1, 22, 41, 56); const result = getMinutes(date); expect(result).toBe(41); }); it('returns proper minutes from string', () => { const date = '22:41:56'; const result = getMinutes(date); expect(result).toBe(41); }); testThrow(getMinutes); }); describe('getSeconds()', () => { it('returns proper seconds from Date', () => { const date = new Date(2019, 0, 1, 22, 41, 56); const result = getSeconds(date); expect(result).toBe(56); }); it('returns proper seconds from string', () => { const date = '22:41:56'; const result = getSeconds(date); expect(result).toBe(56); }); it('returns proper seconds from string without seconds', () => { const date = '22:41'; const result = getSeconds(date); expect(result).toBe(0); }); it('returns proper seconds from string with milliseconds', () => { const date = '22:41:56.321'; const result = getSeconds(date); expect(result).toBe(56); }); testThrow(getSeconds); }); describe('getMilliseconds()', () => { it('returns proper milliseconds from Date', () => { const date = new Date(2019, 0, 1, 22, 41, 56, 321); const result = getMilliseconds(date); expect(result).toBe(321); }); it('returns proper millieconds from string', () => { const date = '22:41:56.321'; const result = getMilliseconds(date); expect(result).toBe(321); }); it('returns proper milliseconds from string without milliseconds', () => { const date = '22:41:56'; const result = getMilliseconds(date); expect(result).toBe(0); }); it('returns proper milliseconds from string without seconds', () => { const date = '22:41'; const result = getMilliseconds(date); expect(result).toBe(0); }); testThrow(getMilliseconds); }); /** * Century */ describe('getCenturyStart()', () => { it('returns proper start of the century', () => { const date = new Date(2019, 0, 1); const centuryStartDate = new Date(2001, 0, 1); const result = getCenturyStart(date); expect(result).toEqual(centuryStartDate); }); it('returns proper start of the century for year < 100', () => { const date = new Date(); date.setFullYear(19, 0, 1); date.setHours(0, 0, 0, 0); const centuryStartDate = new Date(); centuryStartDate.setFullYear(1, 0, 1); centuryStartDate.setHours(0, 0, 0, 0); const result = getCenturyStart(date); expect(result).toEqual(centuryStartDate); }); testThrow(getCenturyStart); }); describe('getPreviousCenturyStart()', () => { it('returns proper start of the previous century', () => { const date = new Date(2019, 0, 1); const previousCenturyStartDate = new Date(1901, 0, 1); const result = getPreviousCenturyStart(date); expect(result).toEqual(previousCenturyStartDate); }); testThrow(getPreviousCenturyStart); }); describe('getNextCenturyStart()', () => { it('returns proper start of the next century', () => { const date = new Date(2019, 0, 1); const nextCenturyStartDate = new Date(2101, 0, 1); const result = getNextCenturyStart(date); expect(result).toEqual(nextCenturyStartDate); }); testThrow(getNextCenturyStart); }); describe('getCenturyEnd()', () => { it('returns proper end of the century', () => { const date = new Date(2019, 0, 1); const centuryEndDate = new Date(2100, 11, 31, 23, 59, 59, 999); const result = getCenturyEnd(date); expect(result).toEqual(centuryEndDate); }); it('returns proper end of the century for year < 100', () => { const date = new Date(); date.setFullYear(19, 0, 1); date.setHours(0, 0, 0, 0); const centuryEndDate = new Date(); centuryEndDate.setFullYear(100, 11, 31); centuryEndDate.setHours(23, 59, 59, 999); const result = getCenturyEnd(date); expect(result).toEqual(centuryEndDate); }); testThrow(getCenturyEnd); }); describe('getPreviousCenturyEnd()', () => { it('returns proper end of the previous century', () => { const date = new Date(2019, 0, 1); const previousCenturyEndDate = new Date(2000, 11, 31, 23, 59, 59, 999); const result = getPreviousCenturyEnd(date); expect(result).toEqual(previousCenturyEndDate); }); testThrow(getPreviousCenturyEnd); }); describe('getNextCenturyEnd()', () => { it('returns proper end of the next century', () => { const date = new Date(2019, 0, 1); const nextCenturyEndDate = new Date(2200, 11, 31, 23, 59, 59, 999); const result = getNextCenturyEnd(date); expect(result).toEqual(nextCenturyEndDate); }); testThrow(getNextCenturyEnd); }); describe('getCenturyRange()', () => { it('returns proper century date range', () => { const date = new Date(2019, 0, 1); const centuryStartDate = new Date(2001, 0, 1); const centuryEndDate = new Date(2100, 11, 31, 23, 59, 59, 999); const result = getCenturyRange(date); expect(result).toHaveLength(2); expect(result).toEqual([centuryStartDate, centuryEndDate]); }); testThrow(getCenturyRange); }); /** * Decade */ describe('getDecadeStart()', () => { it('returns proper start of the decade', () => { const date = new Date(2019, 0, 1); const decadeStartDate = new Date(2011, 0, 1); const result = getDecadeStart(date); expect(result).toEqual(decadeStartDate); }); it('returns proper start of the decade for year < 100', () => { const date = new Date(); date.setFullYear(19, 0, 1); date.setHours(0, 0, 0, 0); const decadeStartDate = new Date(); decadeStartDate.setFullYear(11, 0, 1); decadeStartDate.setHours(0, 0, 0, 0); const result = getDecadeStart(date); expect(result).toEqual(decadeStartDate); }); testThrow(getDecadeStart); }); describe('getPreviousDecadeStart()', () => { it('returns proper start of the previous decade', () => { const date = new Date(2019, 0, 1); const previousDecadeStartDate = new Date(2001, 0, 1); const result = getPreviousDecadeStart(date); expect(result).toEqual(previousDecadeStartDate); }); testThrow(getPreviousDecadeStart); }); describe('getNextDecadeStart()', () => { it('returns proper start of the next decade', () => { const date = new Date(2019, 0, 1); const nextDecadeStartDate = new Date(2021, 0, 1); const result = getNextDecadeStart(date); expect(result).toEqual(nextDecadeStartDate); }); testThrow(getNextDecadeStart); }); describe('getDecadeEnd()', () => { it('returns proper end of the decade', () => { const date = new Date(2019, 0, 1); const decadeEndDate = new Date(2020, 11, 31, 23, 59, 59, 999); const result = getDecadeEnd(date); expect(result).toEqual(decadeEndDate); }); it('returns proper end of the decade for year < 100', () => { const date = new Date(); date.setFullYear(19, 0, 1); date.setHours(0, 0, 0, 0); const decadeEndDate = new Date(); decadeEndDate.setFullYear(20, 11, 31); decadeEndDate.setHours(23, 59, 59, 999); const result = getDecadeEnd(date); expect(result).toEqual(decadeEndDate); }); testThrow(getDecadeEnd); }); describe('getPreviousDecadeEnd()', () => { it('returns proper end of the previous decade', () => { const date = new Date(2019, 0, 1); const previousDecadeEndDate = new Date(2010, 11, 31, 23, 59, 59, 999); const result = getPreviousDecadeEnd(date); expect(result).toEqual(previousDecadeEndDate); }); testThrow(getPreviousDecadeEnd); }); describe('getNextDecadeEnd()', () => { it('returns proper end of the next decade', () => { const date = new Date(2019, 0, 1); const nextDecadeEndDate = new Date(2030, 11, 31, 23, 59, 59, 999); const result = getNextDecadeEnd(date); expect(result).toEqual(nextDecadeEndDate); }); testThrow(getNextDecadeEnd); }); describe('getDecadeRange()', () => { it('returns proper decade date range', () => { const date = new Date(2019, 0, 1); const decadeStartDate = new Date(2011, 0, 1); const decadeEndDate = new Date(2020, 11, 31, 23, 59, 59, 999); const result = getDecadeRange(date); expect(result).toHaveLength(2); expect(result).toEqual([decadeStartDate, decadeEndDate]); }); testThrow(getDecadeRange); }); /** * Year */ describe('getYearStart()', () => { it('returns proper start of the year', () => { const date = new Date(2019, 6, 1); const yearStartDate = new Date(2019, 0, 1); const result = getYearStart(date); expect(result).toEqual(yearStartDate); }); it('returns proper start of the year for year < 100', () => { const date = new Date(); date.setFullYear(19, 6, 1); date.setHours(0, 0, 0, 0); const yearStartDate = new Date(); yearStartDate.setFullYear(19, 0, 1); yearStartDate.setHours(0, 0, 0, 0); const result = getYearStart(date); expect(result).toEqual(yearStartDate); }); testThrow(getYearStart); }); describe('getPreviousYearStart()', () => { it('returns proper start of the previous year', () => { const date = new Date(2019, 6, 1); const previousYearStartDate = new Date(2018, 0, 1); const result = getPreviousYearStart(date); expect(result).toEqual(previousYearStartDate); }); testThrow(getPreviousYearStart); }); describe('getNextYearStart()', () => { it('returns proper start of the next year', () => { const date = new Date(2019, 6, 1); const nextYearStartDate = new Date(2020, 0, 1); const result = getNextYearStart(date); expect(result).toEqual(nextYearStartDate); }); testThrow(getNextYearStart); }); describe('getYearEnd()', () => { it('returns proper end of the year', () => { const date = new Date(2019, 6, 1); const yearEndDate = new Date(2019, 11, 31, 23, 59, 59, 999); const result = getYearEnd(date); expect(result).toEqual(yearEndDate); }); it('returns proper end of the year for year < 100', () => { const date = new Date(); date.setFullYear(19, 0, 1); date.setHours(0, 0, 0, 0); const yearEndDate = new Date(); yearEndDate.setFullYear(19, 11, 31); yearEndDate.setHours(23, 59, 59, 999); const result = getYearEnd(date); expect(result).toEqual(yearEndDate); }); testThrow(getYearEnd); }); describe('getPreviousYearEnd()', () => { it('returns proper end of the previous year', () => { const date = new Date(2019, 6, 1); const previousYearEndDate = new Date(2018, 11, 31, 23, 59, 59, 999); const result = getPreviousYearEnd(date); expect(result).toEqual(previousYearEndDate); }); testThrow(getPreviousYearEnd); }); describe('getNextYearEnd()', () => { it('returns proper end of the next year', () => { const date = new Date(2019, 6, 1); const nextYearEndDate = new Date(2020, 11, 31, 23, 59, 59, 999); const result = getNextYearEnd(date); expect(result).toEqual(nextYearEndDate); }); testThrow(getNextYearEnd); }); describe('getYearRange()', () => { it('returns proper year date range', () => { const date = new Date(2019, 6, 1); const yearStartDate = new Date(2019, 0, 1); const yearEndDate = new Date(2019, 11, 31, 23, 59, 59, 999); const result = getYearRange(date); expect(result).toHaveLength(2); expect(result).toEqual([yearStartDate, yearEndDate]); }); testThrow(getYearRange); }); /** * Month */ describe('getMonthStart()', () => { it('returns proper start of the month', () => { const date = new Date(2019, 6, 15); const monthStartDate = new Date(2019, 6, 1); const result = getMonthStart(date); expect(result).toEqual(monthStartDate); }); it('returns proper start of the month for year < 100', () => { const date = new Date(); date.setFullYear(19, 6, 15); date.setHours(0, 0, 0, 0); const monthStartDate = new Date(); monthStartDate.setFullYear(19, 6, 1); monthStartDate.setHours(0, 0, 0, 0); const result = getMonthStart(date); expect(result).toEqual(monthStartDate); }); testThrow(getMonthStart); }); describe('getPreviousMonthStart()', () => { it('returns proper start of the previous month', () => { const date = new Date(2019, 6, 15); const previousMonthStartDate = new Date(2019, 5, 1); const result = getPreviousMonthStart(date); expect(result).toEqual(previousMonthStartDate); }); testThrow(getPreviousMonthStart); }); describe('getNextMonthStart()', () => { it('returns proper start of the next month', () => { const date = new Date(2019, 6, 15); const nextMonthStartDate = new Date(2019, 7, 1); const result = getNextMonthStart(date); expect(result).toEqual(nextMonthStartDate); }); testThrow(getNextMonthStart); }); describe('getMonthEnd()', () => { it('returns proper end of the month', () => { const date = new Date(2019, 6, 15); const monthEndDate = new Date(2019, 6, 31, 23, 59, 59, 999); const result = getMonthEnd(date); expect(result).toEqual(monthEndDate); }); it('returns proper end of the month for year < 100', () => { const date = new Date(); date.setFullYear(19, 6, 15); date.setHours(0, 0, 0, 0); const monthEndDate = new Date(); monthEndDate.setFullYear(19, 6, 31); monthEndDate.setHours(23, 59, 59, 999); const result = getMonthEnd(date); expect(result).toEqual(monthEndDate); }); testThrow(getMonthEnd); }); describe('getPreviousMonthEnd()', () => { it('returns proper end of the previous month', () => { const date = new Date(2019, 6, 15); const previousMonthEndDate = new Date(2019, 5, 30, 23, 59, 59, 999); const result = getPreviousMonthEnd(date); expect(result).toEqual(previousMonthEndDate); }); testThrow(getPreviousMonthEnd); }); describe('getNextMonthEnd()', () => { it('returns proper end of the next month', () => { const date = new Date(2019, 6, 15); const nextMonthEndDate = new Date(2019, 7, 31, 23, 59, 59, 999); const result = getNextMonthEnd(date); expect(result).toEqual(nextMonthEndDate); }); testThrow(getNextMonthEnd); }); describe('getMonthRange()', () => { it('returns proper month date range', () => { const date = new Date(2019, 6, 15); const monthStartDate = new Date(2019, 6, 1); const monthEndDate = new Date(2019, 6, 31, 23, 59, 59, 999); const result = getMonthRange(date); expect(result).toHaveLength(2); expect(result).toEqual([monthStartDate, monthEndDate]); }); testThrow(getMonthRange); }); /** * Day */ describe('getDayStart()', () => { it('returns proper beginning of the day', () => { const date = new Date(2019, 6, 15, 12); const dayStartDate = new Date(2019, 6, 15); const result = getDayStart(date); expect(result).toEqual(dayStartDate); }); it('returns proper beginning of the day for year < 100', () => { const date = new Date(); date.setFullYear(19, 6, 15); date.setHours(0, 0, 0, 0); const dayStartDate = new Date(); dayStartDate.setFullYear(19, 6, 15); dayStartDate.setHours(0, 0, 0, 0); const result = getDayStart(date); expect(result).toEqual(dayStartDate); }); testThrow(getDayStart); }); describe('getPreviousDayStart()', () => { it('returns proper start of the previous day', () => { const date = new Date(2019, 6, 15, 12); const previousDayStartDate = new Date(2019, 6, 14); const result = getPreviousDayStart(date); expect(result).toEqual(previousDayStartDate); }); testThrow(getPreviousDayStart); }); describe('getNextDayStart()', () => { it('returns proper start of the next day', () => { const date = new Date(2019, 6, 15, 12); const nextDayStartDate = new Date(2019, 6, 16); const result = getNextDayStart(date); expect(result).toEqual(nextDayStartDate); }); testThrow(getNextDayStart); }); describe('getDayEnd()', () => { it('returns proper end of the day', () => { const date = new Date(2019, 6, 15, 12); const dayEndDate = new Date(2019, 6, 15, 23, 59, 59, 999); const result = getDayEnd(date); expect(result).toEqual(dayEndDate); }); it('returns proper end of the day for year < 100', () => { const date = new Date(); date.setFullYear(19, 6, 15); date.setHours(0, 0, 0, 0); const dayEndDate = new Date(); dayEndDate.setFullYear(19, 6, 15); dayEndDate.setHours(23, 59, 59, 999); const result = getDayEnd(date); expect(result).toEqual(dayEndDate); }); testThrow(getDayEnd); }); describe('getPreviousDayEnd()', () => { it('returns proper end of the previous day', () => { const date = new Date(2019, 6, 15, 12); const previousDayEndDate = new Date(2019, 6, 14, 23, 59, 59, 999); const result = getPreviousDayEnd(date); expect(result).toEqual(previousDayEndDate); }); testThrow(getPreviousDayEnd); }); describe('getNextDayEnd()', () => { it('returns proper end of the next day', () => { const date = new Date(2019, 6, 15, 12); const nextDayEndDate = new Date(2019, 6, 16, 23, 59, 59, 999); const result = getNextDayEnd(date); expect(result).toEqual(nextDayEndDate); }); testThrow(getNextDayEnd); }); describe('getDayRange', () => { it('returns proper day date range', () => { const date = new Date(2019, 6, 15, 12); const dayStartDate = new Date(2019, 6, 15); const dayEndDate = new Date(2019, 6, 15, 23, 59, 59, 999); const result = getDayRange(date); expect(result).toHaveLength(2); expect(result).toEqual([dayStartDate, dayEndDate]); }); testThrow(getDayRange); }); /** * Other */ describe('getDaysInMonth()', () => { it('returns proper number of days in a month', () => { const date1 = new Date(2019, 0, 1); const date2 = new Date(2019, 1, 1); const date3 = new Date(2019, 2, 1); const result1 = getDaysInMonth(date1); const result2 = getDaysInMonth(date2); const result3 = getDaysInMonth(date3); expect(result1).toBe(31); expect(result2).toBe(28); expect(result3).toBe(31); }); testThrow(getDaysInMonth); }); describe('getHoursMinutes', () => { it('returns proper hour and minute for a given date', () => { const date = new Date(2017, 0, 1, 16, 4); const hoursMinutes = getHoursMinutes(date); expect(hoursMinutes).toBe('16:04'); }); it('returns proper hour and minute for a given string of hour and minute', () => { const date = '16:04'; const hoursMinutes = getHoursMinutes(date); expect(hoursMinutes).toBe('16:04'); }); it('returns proper hour and minute for a given string of hour, minute and second', () => { const date = '16:04:08'; const hoursMinutes = getHoursMinutes(date); expect(hoursMinutes).toBe('16:04'); }); testThrow(getHoursMinutes); }); describe('getHoursMinutesSeconds', () => { it('returns proper hour, minute and second for a given date', () => { const date = new Date(2017, 0, 1, 16, 4, 41); const hoursMinutesSeconds = getHoursMinutesSeconds(date); expect(hoursMinutesSeconds).toBe('16:04:41'); }); it('returns proper hour, minute and second for a given string of hour and minute', () => { const date = '16:04'; const hoursMinutesSeconds = getHoursMinutesSeconds(date); expect(hoursMinutesSeconds).toBe('16:04:00'); }); it('returns proper hour, minute and second for a given string of hour, minute and second', () => { const date = '16:04:08'; const hoursMinutesSeconds = getHoursMinutesSeconds(date); expect(hoursMinutesSeconds).toBe('16:04:08'); }); testThrow(getHoursMinutesSeconds); }); describe('getISOLocalMonth()', () => { it('returns proper ISO month', () => { const date = new Date(2019, 0, 1); const ISOMonth = getISOLocalMonth(date); expect(ISOMonth).toBe('2019-01'); }); it('returns proper ISO date for year < 100', () => { const date = new Date(); date.setFullYear(19, 0, 1); date.setHours(0, 0, 0, 0); const ISODate = getISOLocalMonth(date); expect(ISODate).toBe('0019-01'); }); it('returns proper ISO date for year > 9999', () => { const date = new Date(); date.setFullYear(12345, 0, 1); date.setHours(0, 0, 0, 0); const ISODate = getISOLocalMonth(date); expect(ISODate).toBe('12345-01'); }); testThrow(getISOLocalMonth); }); describe('getISOLocalDate()', () => { it('returns proper ISO date', () => { const date = new Date(2019, 0, 1); const ISODate = getISOLocalDate(date); expect(ISODate).toBe('2019-01-01'); }); it('returns proper ISO date for year < 100', () => { const date = new Date(); date.setFullYear(19, 0, 1); date.setHours(0, 0, 0, 0); const ISODate = getISOLocalDate(date); expect(ISODate).toBe('0019-01-01'); }); it('returns proper ISO date for year > 9999', () => { const date = new Date(); date.setFullYear(12345, 0, 1); date.setHours(0, 0, 0, 0); const ISODate = getISOLocalDate(date); expect(ISODate).toBe('12345-01-01'); }); testThrow(getISOLocalDate); }); describe('getISOLocalDateTime()', () => { it('returns proper ISO date and time', () => { const date = new Date(2017, 0, 1, 16, 4, 41); const ISODate = getISOLocalDateTime(date); expect(ISODate).toBe('2017-01-01T16:04:41'); }); it('returns proper ISO date for year < 100', () => { const date = new Date(); date.setFullYear(19, 0, 1); date.setHours(16, 4, 41, 0); const ISODate = getISOLocalDateTime(date); expect(ISODate).toBe('0019-01-01T16:04:41'); }); it('returns proper ISO date for year > 9999', () => { const date = new Date(); date.setFullYear(12345, 0, 1); date.setHours(16, 4, 41, 0); const ISODate = getISOLocalDateTime(date); expect(ISODate).toBe('12345-01-01T16:04:41'); }); testThrow(getISOLocalDateTime); });