diff --git a/test/plugin/preParsePostFormat.test.js b/test/plugin/preParsePostFormat.test.js new file mode 100755 index 000000000..88623496c --- /dev/null +++ b/test/plugin/preParsePostFormat.test.js @@ -0,0 +1,167 @@ +import MockDate from 'mockdate' +// import moment from 'moment' +import dayjs from '../../src' +import preParsePostFormat from '../../src/plugin/preParsePostFormat' +import duration from '../../src/plugin/duration' +import calendar from '../../src/plugin/calendar' +import objectSupport from '../../src/plugin/objectSupport' +import customParseFormat from '../../src/plugin/customParseFormat' +import relativeTime from '../../src/plugin/relativeTime' +import utc from '../../src/plugin/utc' +import arraySupport from '../../src/plugin/arraySupport' +import en from '../../src/locale/en' + +dayjs.extend(utc) +dayjs.extend(customParseFormat) +dayjs.extend(arraySupport) +dayjs.extend(objectSupport) +dayjs.extend(calendar) +dayjs.extend(duration) +dayjs.extend(relativeTime) +dayjs.extend(preParsePostFormat) + +const symbolMap = { + 1: '!', + 2: '@', + 3: '#', + 4: '$', + 5: '%', + 6: '^', + 7: '&', + 8: '*', + 9: '(', + 0: ')' +} +const numberMap = { + '!': '1', + '@': '2', + '#': '3', + $: '4', + '%': '5', + '^': '6', + '&': '7', + '*': '8', + '(': '9', + ')': '0' +} + +const localeCustomizations = { + ...en, + preparse(string) { + if (typeof string !== 'string') { + // console.error('preparse - Expected string, got', { + // string + // }) + throw new Error(`preparse - Expected string, got ${typeof string}`) + } + try { + const res = string.replace(/[!@#$%^&*()]/g, match => numberMap[match]) + // console.log('Called custom preparse', { string, res }) + return res + } catch (error) { + const errorMsg = `Unexpected error during preparse of '${string}' - ${error}` + // console.error(errorMsg) + throw new Error(errorMsg) + } + }, + postformat(string) { + if (typeof string !== 'string') { + // console.error('postformat - Expected string, got', { + // string + // }) + throw new Error(`postformat - Expected string, got ${typeof string}`) + } + try { + const res = string.replace(/\d/g, match => symbolMap[match]) + // console.log('Called custom postformat', { string, res }) + return res + } catch (error) { + const errorMsg = `Unexpected error during postFormat of '${string}' - ${error}` + // console.error(errorMsg) + throw new Error(errorMsg) + } + } +} + +beforeEach(() => { + MockDate.set(new Date()) + dayjs.locale('symbol', localeCustomizations) +}) + +afterEach(() => { + MockDate.reset() + dayjs.locale('symbol', null) +}) + +describe('preparse and postformat', () => { + describe('transform', () => { + const TEST_DATE = '@)!@-)*-@&' + const TEST_NUM = 1346025600 + it('preparse string + format', () => + expect(dayjs.utc(TEST_DATE, 'YYYY-MM-DD').unix()).toBe(TEST_NUM)) + it('preparse ISO8601 string', () => + expect(dayjs.utc(TEST_DATE).unix()).toBe(TEST_NUM)) + it('postformat', () => + expect(dayjs + .unix(TEST_NUM) + .utc() + .format('YYYY-MM-DD')) + .toBe(TEST_DATE)) + }) + + describe('transform from', () => { + dayjs.locale('symbol', localeCustomizations) + const start = dayjs([2007, 1, 28]) + + const t1 = dayjs([2007, 1, 28]).add({ s: 90 }) + it('postformat should work on dayjs.fn.from', () => + expect(start.from(t1, true)).toBe('@ minutes')) + + const t2 = dayjs().add(6, 'd') + it('postformat should work on dayjs.fn.fromNow', () => + expect(t2.fromNow(true)).toBe('^ days')) + + it('postformat should work on dayjs.duration.fn.humanize', () => + expect(dayjs.duration(10, 'h').humanize()).toBe('!) hours')) + }) +}) + +describe('calendar day', () => { + const a = dayjs() + .hour(12) + .minute(0) + .second(0) + + it('today at the same time', () => + expect(dayjs(a).calendar()).toBe('Today at !@:)) PM')) + + it('Now plus 25 min', () => + expect(dayjs(a) + .add({ m: 25 }) + .calendar()) + .toBe('Today at !@:@% PM')) + + it('Now plus 1 hour', () => + expect(dayjs(a) + .add({ h: 1 }) + .calendar()) + .toBe('Today at !:)) PM')) + + it('tomorrow at the same time', () => + expect(dayjs(a) + .add({ d: 1 }) + .calendar()) + .toBe('Tomorrow at !@:)) PM')) + + it('Now minus 1 hour', () => + expect(dayjs(a) + .subtract({ h: 1 }) + .calendar()) + .toBe('Today at !!:)) AM')) + + it('yesterday at the same time', () => + expect(dayjs(a) + .subtract({ d: 1 }) + .calendar()) + .toBe('Yesterday at !@:)) PM')) +})