src/period/__tests__/parser.spec.js
import { getPeriodFromPeriodId } from '../parser'
function makePeriodFixture(id, name, startDate, endDate, type) {
return { id, name, startDate, endDate, type }
}
const periodFixtures = {
// Daily
19810331: makePeriodFixture(
'19810331',
'March 31, 1981',
'1981-03-31',
'1981-03-31',
'Daily'
),
20171231: makePeriodFixture(
'20171231',
'December 31, 2017',
'2017-12-31',
'2017-12-31',
'Daily'
),
20040229: makePeriodFixture(
'20040229',
'February 29, 2004',
'2004-02-29',
'2004-02-29',
'Daily'
),
20170229: makePeriodFixture(
'20170301',
'March 1, 2017',
'2017-03-01',
'2017-03-01',
'Daily'
),
// Weekly
'2017W4': makePeriodFixture(
'2017W4',
'2017 W4 January 23 - 29',
'2017-01-23',
'2017-01-29',
'Weekly'
),
'1981W37': makePeriodFixture(
'1981W37',
'1981 W37 September 7 - 13',
'1981-09-07',
'1981-09-13',
'Weekly'
),
'2015W1': makePeriodFixture(
'2015W1',
'2015 W1 December 29 - January 4',
'2014-12-29',
'2015-01-04',
'Weekly'
),
'1981W1': makePeriodFixture(
'1981W1',
'1981 W1 December 29 - January 4',
'1980-12-29',
'1981-01-04',
'Weekly'
),
'2015W53': makePeriodFixture(
'2015W53',
'2015 W53 December 28 - January 3',
'2015-12-28',
'2016-01-03',
'Weekly'
),
'2016W53': makePeriodFixture(
'2017W1',
'2017 W1 January 2 - 8',
'2017-01-02',
'2017-01-08',
'Weekly'
),
'2016W52': makePeriodFixture(
'2016W52',
'2016 W52 December 26 - January 1',
'2016-12-26',
'2017-01-01',
'Weekly'
),
'2017W04': makePeriodFixture(
'2017W4',
'2017 W4 January 23 - 29',
'2017-01-23',
'2017-01-29',
'Weekly'
),
// Weekly Wednesday/Thursday/Saturday/Sunday
'2017WedW4': makePeriodFixture(
'2017WedW4',
'2017 W4 January 25 - 31',
'2017-01-25',
'2017-01-31',
'WeeklyWednesday'
),
'2017ThuW4': makePeriodFixture(
'2017ThuW4',
'2017 W4 January 26 - February 1',
'2017-01-26',
'2017-02-01',
'WeeklyThursday'
),
'2017SatW4': makePeriodFixture(
'2017SatW4',
'2017 W4 January 21 - 27',
'2017-01-21',
'2017-01-27',
'WeeklySaturday'
),
'2017SunW4': makePeriodFixture(
'2017SunW4',
'2017 W4 January 22 - 28',
'2017-01-22',
'2017-01-28',
'WeeklySunday'
),
// BiWeekly
'2019BiW12': makePeriodFixture(
'2019BiW12',
'2019 BiWeek 12 June 3 - 16',
'2019-06-03',
'2019-06-16',
'BiWeekly'
),
'2019BiW04': makePeriodFixture(
'2019BiW4',
'2019 BiWeek 4 February 11 - 24',
'2019-02-11',
'2019-02-24',
'BiWeekly'
),
'2015BiW1': makePeriodFixture(
'2015BiW1',
'2015 BiWeek 1 December 29 - January 11',
'2014-12-29',
'2015-01-11',
'BiWeekly'
),
'2016BiW27': makePeriodFixture(
'2017BiW1',
'2017 BiWeek 1 January 2 - 15',
'2017-01-02',
'2017-01-15',
'BiWeekly'
),
'2015BiW27': makePeriodFixture(
'2015BiW27',
'2015 BiWeek 27 December 28 - January 10',
'2015-12-28',
'2016-01-10',
'BiWeekly'
),
// Monthly
198103: makePeriodFixture(
'198103',
'March 1981',
'1981-03-01',
'1981-03-31',
'Monthly'
),
198002: makePeriodFixture(
'198002',
'February 1980',
'1980-02-01',
'1980-02-29',
'Monthly'
),
198102: makePeriodFixture(
'198102',
'February 1981',
'1981-02-01',
'1981-02-28',
'Monthly'
),
// BiMonthly
'198101B': makePeriodFixture(
'198101B',
'January - February 1981',
'1981-01-01',
'1981-02-28',
'BiMonthly'
),
'198102B': makePeriodFixture(
'198102B',
'March - April 1981',
'1981-03-01',
'1981-04-30',
'BiMonthly'
),
'198103B': makePeriodFixture(
'198103B',
'May - June 1981',
'1981-05-01',
'1981-06-30',
'BiMonthly'
),
'198104B': makePeriodFixture(
'198104B',
'July - August 1981',
'1981-07-01',
'1981-08-31',
'BiMonthly'
),
'198105B': makePeriodFixture(
'198105B',
'September - October 1981',
'1981-09-01',
'1981-10-31',
'BiMonthly'
),
'198106B': makePeriodFixture(
'198106B',
'November - December 1981',
'1981-11-01',
'1981-12-31',
'BiMonthly'
),
// Quarterly
'1981Q1': makePeriodFixture(
'1981Q1',
'January - March 1981',
'1981-01-01',
'1981-03-31',
'Quarterly'
),
'1981Q2': makePeriodFixture(
'1981Q2',
'April - June 1981',
'1981-04-01',
'1981-06-30',
'Quarterly'
),
'1981Q3': makePeriodFixture(
'1981Q3',
'July - September 1981',
'1981-07-01',
'1981-09-30',
'Quarterly'
),
'1981Q4': makePeriodFixture(
'1981Q4',
'October - December 1981',
'1981-10-01',
'1981-12-31',
'Quarterly'
),
// SixMonthly
'1981S1': makePeriodFixture(
'1981S1',
'January - June 1981',
'1981-01-01',
'1981-06-30',
'SixMonthly'
),
'1981S2': makePeriodFixture(
'1981S2',
'July - December 1981',
'1981-07-01',
'1981-12-31',
'SixMonthly'
),
// SixMonthlyApril
'1981AprilS1': makePeriodFixture(
'1981AprilS1',
'April - September 1981',
'1981-04-01',
'1981-09-30',
'SixMonthlyApril'
),
'1981AprilS2': makePeriodFixture(
'1981AprilS2',
'October 1981 - March 1982',
'1981-10-01',
'1982-03-31',
'SixMonthlyApril'
),
// SixMonthlyNov
'1981NovS1': makePeriodFixture(
'1981NovS1',
'November 1981 - April 1982',
'1981-11-01',
'1982-04-30',
'SixMonthlyNov'
),
'1981NovS2': makePeriodFixture(
'1981NovS2',
'May - October 1982',
'1982-05-01',
'1982-10-31',
'SixMonthlyNov'
),
// Yearly
1981: makePeriodFixture(
'1981',
'1981',
'1981-01-01',
'1981-12-31',
'Yearly'
),
2017: makePeriodFixture(
'2017',
'2017',
'2017-01-01',
'2017-12-31',
'Yearly'
),
// FinancialApril
'1981April': makePeriodFixture(
'1981April',
'April 1981 - March 1982',
'1981-04-01',
'1982-03-31',
'FinancialApril'
),
// FinancialJuly
'1981July': makePeriodFixture(
'1981July',
'July 1981 - June 1982',
'1981-07-01',
'1982-06-30',
'FinancialJuly'
),
// FinancialOct
'1981Oct': makePeriodFixture(
'1981Oct',
'October 1981 - September 1982',
'1981-10-01',
'1982-09-30',
'FinancialOct'
),
// FinancialNov
'1981Nov': makePeriodFixture(
'1981Nov',
'November 1981 - October 1982',
'1981-11-01',
'1982-10-31',
'FinancialNov'
),
}
function doPeriodTest(id) {
expect(getPeriodFromPeriodId(id)).toEqual(periodFixtures[id])
}
describe('getPeriodFromPeriodId(periodId, locale) period parser', () => {
describe('for Daily periods', () => {
it('should handle valid Daily periods', () => {
doPeriodTest('19810331')
doPeriodTest('20171231')
doPeriodTest('20040229')
})
// it('should handle Daily periods in French');
it('should accept nearly valid Daily periods', () => {
doPeriodTest('20170229')
})
it('should not accept invalid Daily periods', () => {
expect(() => getPeriodFromPeriodId('19813103')).toThrowError()
expect(() => getPeriodFromPeriodId('20170000')).toThrowError()
})
})
describe('for Weekly periods', () => {
it('should handle valid Weekly periods', () => {
doPeriodTest('2017W4')
doPeriodTest('1981W37')
})
// it('should handle Weekly periods in French');
it('should handle Week 1 that starts the previous year', () => {
doPeriodTest('2015W1')
doPeriodTest('1981W1')
})
it('should handle Week 53 for 53-week years', () => {
doPeriodTest('2015W53')
})
it('should handle Week 53 for 52-week years', () => {
doPeriodTest('2016W53')
})
it('should handle weeks that end the following year', () => {
doPeriodTest('2016W52')
})
it('should not accept week numbers higher than 53', () => {
expect(() => getPeriodFromPeriodId('2017W54')).toThrowError()
})
it('should not accept week numbers below 1', () => {
expect(() => getPeriodFromPeriodId('2017W0')).toThrowError()
})
it('should handle Week 1-9 with leading zero', () => {
doPeriodTest('2017W04')
})
it('should handle Weekly Wednesday period types', () => {
doPeriodTest('2017WedW4')
})
it('should handle Weekly Thursday period types', () => {
doPeriodTest('2017ThuW4')
})
it('should handle Weekly Saturday period types', () => {
doPeriodTest('2017SatW4')
})
it('should handle Weekly Sunday period types', () => {
doPeriodTest('2017SunW4')
})
})
describe('for BiWeekly periods', () => {
it('should handle valid BiWeekly periods', () => {
doPeriodTest('2019BiW12')
})
it('should handle BiWeek 1-9 with leading zero', () => {
doPeriodTest('2019BiW04')
})
it('should handle BiWeek 1 that starts the previous year', () => {
doPeriodTest('2015BiW1')
})
it('should handle BiWeek 27 for 52-week years', () => {
doPeriodTest('2016BiW27')
})
it('should handle BiWeek 27 for 53-week years', () => {
doPeriodTest('2015BiW27')
})
it('should not accept BiWeek numbers higher than 27', () => {
expect(() => getPeriodFromPeriodId('2017BiW28')).toThrowError()
})
it('should not accept BiWeek numbers below 1', () => {
expect(() => getPeriodFromPeriodId('2017BiW0')).toThrowError()
})
})
describe('for Monthly periods', () => {
it('should handle valid Monthly periods', () => {
doPeriodTest('198103')
})
// it('should handle Monthly periods in French');
it('should handle February properly in leap years', () => {
doPeriodTest('198002')
})
it('should handle February properly in normal years', () => {
doPeriodTest('198102')
})
it('should not accept invalid Monthly periods', () => {
expect(() => getPeriodFromPeriodId('193414')).toThrowError()
})
})
describe('for BiMonthly periods', () => {
it('should handle valid BiMonthly periods', () => {
doPeriodTest('198101B')
doPeriodTest('198102B')
doPeriodTest('198103B')
doPeriodTest('198104B')
doPeriodTest('198105B')
doPeriodTest('198106B')
})
// it('should handle BiMonthly periods in French');
it('should not accept invalid BiMonthly periods without leading zeros', () => {
expect(() => getPeriodFromPeriodId('19812B')).toThrowError()
})
it('should not accept BiMonthly periods above 6', () => {
expect(() => getPeriodFromPeriodId('198107B')).toThrowError()
})
it('should not accept BiMonthly periods below 1', () => {
expect(() => getPeriodFromPeriodId('198100B')).toThrowError()
})
})
describe('for Quarterly periods', () => {
it('should handle Quarters 1-4', () => {
doPeriodTest('1981Q1')
doPeriodTest('1981Q2')
doPeriodTest('1981Q3')
doPeriodTest('1981Q4')
})
// it('should handle Quarters in French');
it('should not accept Quarters below 1 or above 4', () => {
expect(() => getPeriodFromPeriodId('1981Q0')).toThrowError()
expect(() => getPeriodFromPeriodId('2017Q5')).toThrowError()
})
})
describe('for SixMonthly periods', () => {
it('should handle valid SixMonthly periods', () => {
doPeriodTest('1981S1')
doPeriodTest('1981S2')
})
// it('should handle SixMonthly periods in French');
it('should not accept SixMonthly periods below 1 or above 2', () => {
expect(() => getPeriodFromPeriodId('1981S0')).toThrowError()
expect(() => getPeriodFromPeriodId('1981S3')).toThrowError()
})
})
describe('for SixMonthlyApril periods', () => {
it('should handle valid SixMonthlyApril periods', () => {
doPeriodTest('1981AprilS1')
doPeriodTest('1981AprilS2')
})
// it('should handle SixMonthlyApril periods in French');
it('should not accept SixMonthlyApril periods below 1 or above 2', () => {
expect(() => getPeriodFromPeriodId('1981AprilS0')).toThrowError()
expect(() => getPeriodFromPeriodId('1981AprilS3')).toThrowError()
})
})
describe('for SixMonthlyNov periods', () => {
it('should handle valid SixMonthlyNov periods', () => {
doPeriodTest('1981NovS1')
doPeriodTest('1981NovS2')
})
it('should not accept SixMonthlyNov periods below 1 or above 2', () => {
expect(() => getPeriodFromPeriodId('1981NovS0')).toThrowError()
expect(() => getPeriodFromPeriodId('1981NovS3')).toThrowError()
})
})
describe('for Yearly periods', () => {
it('should handle valid Yearly periods', () => {
doPeriodTest('1981')
doPeriodTest('2017')
})
})
describe('for FinancialApril periods', () => {
it('should handle FinancialApril periods', () => {
doPeriodTest('1981April')
})
// xit('should handle FinancialApril periods in French', () => {
// expect(getPeriodFromPeriodId('1981April', 'fr')).to.deep.equal(
// makePeriodFixture('1981April', 'avril 1981 - march 1982', '1981-04-01', '1982-03-31')
// );
// });
})
describe('for FinancialJuly periods', () => {
it('should handle FinancialJuly periods', () => {
doPeriodTest('1981July')
})
// xit('should handle FinancialJuly periods in French', () => {
// expect(getPeriodFromPeriodId('1981July', 'fr')).to.deep.equal(
// makePeriodFixture('1981July', 'juilet 1981 - juin 1982', '1981-07-01', '1982-06-30')
// );
// });
})
describe('for FinancialOct periods', () => {
it('should handle FinancialOct periods', () => {
doPeriodTest('1981Oct')
})
// xit('should handle FinancialOct periods in French', () => {
// expect(getPeriodFromPeriodId('1981Oct', 'fr')).to.deep.equal(
// makePeriodFixture('1981Oct', 'octobre 1981 - septembre 1982', '1981-10-01', '1982-09-30')
// );
// });
})
describe('for FinancialNov periods', () => {
it('should handle FinancialNov periods', () => {
doPeriodTest('1981Nov')
})
})
describe('for invalid periods', () => {
it('should not accept invalid periods', () => {
expect(() => getPeriodFromPeriodId('test')).toThrowError()
expect(() => getPeriodFromPeriodId('1234567890')).toThrowError()
})
})
})