UNPKG

@onereach/time-interpreter

Version:

Convert dates, durations and time to canonical format (dates -> ISO 8601, durations -> milliseconds).

463 lines (418 loc) 12.6 kB
const jsonfile = require("jsonfile/index.js"); const _ = require("lodash"); const assert = require("assert").strict; const Interpreter = require("../index.js"); const converter = new Interpreter(); const dates = jsonfile.readFileSync("test/parse/dates/dates.json"); const dates_ordinalDay = jsonfile.readFileSync( "test/parse/dates/ordinal-day.json" ); const dates_strDay = jsonfile.readFileSync("test/parse/dates/str-day.json"); const dates_strMonth = jsonfile.readFileSync("test/parse/dates/str-month.json"); const datetimes = jsonfile.readFileSync("test/parse/datetimes/datetimes.json"); const datetimes_ordinalDay = jsonfile.readFileSync( "test/parse/datetimes/ordinal-day.json" ); const datetimes_strDay = jsonfile.readFileSync( "test/parse/datetimes/str-day.json" ); const datetimes_strMonth = jsonfile.readFileSync( "test/parse/datetimes/str-month.json" ); const datetimes_dd_mm_yyyy = jsonfile.readFileSync( "test/parse/datetimes/dd-mm-yyyy-time.json" ); const objects = jsonfile.readFileSync("test/parse/objects.json"); const numbers = jsonfile.readFileSync("test/parse/numbers.json"); const stringNumbers = jsonfile.readFileSync("test/parse/string-numbers.json"); const invalid = jsonfile.readFileSync("test/parse/invalid.json"); const testParseMethod = (assert, describe, input, expected) => { describe("test-1 #parse(date)", function () { input.forEach((date, i) => { if (typeof date === "number") key = "input-" + date; else if (typeof date === "object") key = JSON.stringify(date); else key = date; const expectedResult = expected[key].datetime; const actualResult = converter.parse(date, "", "", "2021"); if (actualResult) delete actualResult.isoWithFractSec; it(key, function () { assert.deepEqual(actualResult, expectedResult); }); }); }); describe("test-2 #parse(date, 'America/Denver')", function () { input.forEach((date, i) => { if (typeof date === "number") key = "input-" + date; else if (typeof date === "object") key = JSON.stringify(date); else key = date; const expectedResult = expected[key].inZone; const actualResult = converter.parse(date, "America/Denver", "", "2021"); if (actualResult) delete actualResult.isoWithFractSec; it(key, function () { assert.deepEqual( actualResult, expectedResult ); }); }); }); describe("test-3 #parse(date, '+01:00')", function () { input.forEach((date, i) => { if (typeof date === "number") key = "input-" + date; else if (typeof date === "object") key = JSON.stringify(date); else key = date; const expectedResult = expected[key].inOffset; const actualResult = converter.parse(date, "+01:00", "", "2021"); if (actualResult) delete actualResult.isoWithFractSec; it(key, function () { assert.deepEqual(actualResult, expectedResult); }); }); }); describe("test-4 #parse(date, '+01:00', 'GMT+0')", function () { input.forEach((date, i) => { if (typeof date === "number") key = "input-" + date; else if (typeof date === "object") key = JSON.stringify(date); else key = date; const expectedResult = expected[key].outZone; const actualResult = converter.parse(date, "+01:00", "GMT+0", "2021"); if (actualResult) delete actualResult.isoWithFractSec; it(key, function () { assert.deepEqual( actualResult, expectedResult ); }); }); }); describe("test-5 #parse(date, 'America/Denver', '-01:00')", function () { input.forEach((date, i) => { if (typeof date === "number") key = "input-" + date; else if (typeof date === "object") key = JSON.stringify(date); else key = date; const expectedResult = expected[key].outOffset; const actualResult = converter.parse(date, "America/Denver", "-01:00", "2021"); if (actualResult) delete actualResult.isoWithFractSec; it(key, function () { assert.deepEqual( actualResult, expectedResult ); }); }); }); describe("test-6 #parse(date, '', '', '2005')", function () { input.forEach((date, i) => { if (typeof date === "number") key = "input-" + date; else if (typeof date === "object") key = JSON.stringify(date); else key = date; const expectedResult = expected[key].year; const actualResult = converter.parse(date, "", "", "2005"); if (actualResult) delete actualResult.isoWithFractSec; it(key, function () { assert.deepEqual(actualResult, expectedResult); }); }); }); describe("test-7 #parse(date, '+01:00', 'GMT+0', '2021', '2008-12-15')", function () { input.forEach((date, i) => { if (typeof date === "number") key = "input-" + date; else if (typeof date === "object") key = JSON.stringify(date); else key = date; const expectedResult = expected[key].date; const actualResult = converter.parse(date, "+01:00", "GMT+0", "2021", "2008-12-15"); if (actualResult) delete actualResult.isoWithFractSec; it(key, function () { assert.deepEqual( actualResult, expectedResult ); }); }); }); }; // TYPE OF DATE WITHOUT TIME const ddmmyyyy = [ "6-10-2020, Indian/Kerguelen", "1995-02-04", "2020-18-04", "04-18-2020", "1995 2 04", "2020/18/4", "4-18-2020", "6-1-2020", "16.10.2020", ]; describe("input dates in format 'dd-mm-yyyy'", function () { testParseMethod(assert, describe, ddmmyyyy, dates); }); const ddmmyy = [ "20-18-4 Indian/Kerguelen", "95-02-04", "20.18.04", "04-18-20", "06.10.20", "4 18 20", "6-10-20", "20/18/04", "10/06/20", ]; describe("input dates in format 'dd-mm-yy'", function () { testParseMethod(assert, describe, ddmmyy, dates); }); describe("input dates in format '1st April 2020', '1999 sep 3rd' etc.", function () { testParseMethod( assert, describe, Object.keys(dates_ordinalDay), dates_ordinalDay ); }); describe("input dates in format 'mm-yyyy', 'yyyy/mm' etc.", function () { testParseMethod(assert, describe, ["12/1999", "10.2020"], dates); }); describe("input dates in format 'first April 2020', '1999 sep twenty' etc.", function () { testParseMethod(assert, describe, Object.keys(dates_strDay), dates_strDay); }); describe("input dates in format '6 April 2020', '1999 sep 20' etc.", function () { testParseMethod( assert, describe, Object.keys(dates_strMonth), dates_strMonth ); }); // TYPE OF DATE/TIME describe("input dates in format 'dd-mm-yyyy'", function () { testParseMethod( assert, describe, Object.keys(datetimes_dd_mm_yyyy), datetimes_dd_mm_yyyy ); }); describe("input dates in format 'dd-mm-yy' + time, '20150930 212421 -0400', '1995-02-04T10:00+01:00' etc.", function () { testParseMethod(assert, describe, Object.keys(datetimes), datetimes); }); describe("input dates in format '1st April 2020', '1999 sep 3rd' etc. + time", function () { testParseMethod( assert, describe, Object.keys(datetimes_ordinalDay), datetimes_ordinalDay ); }); describe("input dates in format 'first April 2020', '1999 sep twenty' etc. + time", function () { testParseMethod( assert, describe, Object.keys(datetimes_strDay), datetimes_strDay ); }); describe("input dates in format '6 April 2020', '1999 sep 20' etc. + time", function () { testParseMethod( assert, describe, Object.keys(datetimes_strMonth), datetimes_strMonth ); }); // TYPE OF NUMBER describe("input number timestamp", function () { testParseMethod( assert, describe, [ 1234567, 123456, 34567890, 169753368995, 11234566744, 1560211200000, 1318874398, 283142, 583042, ], numbers ); }); // TYPE OF STRING NUMBER describe("input string number timestamp", function () { testParseMethod(assert, describe, Object.keys(stringNumbers), stringNumbers); }); // TYPE OF OBJECT describe("input date/datetime object", function () { const obj = Object.keys(objects).map((k) => JSON.parse(k.replace(/\//g, ""))); testParseMethod(assert, describe, obj, objects); }); // INVALID describe("invalid input", function () { testParseMethod(assert, describe, Object.keys(invalid), invalid); }); // v1.0.14 it(`"2021-06-10T10:24:19Z+03:00", "GMT+0", "GMT+0"`, function () { assert.deepEqual( converter.parse("2021-06-10T10:24:19Z+03:00", "GMT+0", "GMT+0"), { time: { hourMinute12: '07:24', hourMinute24: '07:24', hour12: 7, hour24: 7, amPm: 'am', minute: 24 }, duration: 1623309859000, iso: '2021-06-10T07:24:19+00:00', isoWithFractSec: '2021-06-10T07:24:19.000+00:00', date: { dayOfWeek: 'Thursday', isWeekend: false, day: 10, month: 6, monthName: 'June', year: 2021 }, timezone: { name: 'GMT+0', offsetNum: 0, offsetText: '+00:00' } } ); }); it(`"2021-06-10T10:24:19Z+03:00"`, function () { assert.deepEqual( converter.parse("2021-06-10T10:24:19Z+03:00"), { time: { hourMinute12: '10:24', hourMinute24: '10:24', hour12: 10, hour24: 10, amPm: 'am', minute: 24 }, duration: 1623309859000, iso: '2021-06-10T10:24:19+03:00', isoWithFractSec: '2021-06-10T10:24:19.000+03:00', date: { dayOfWeek: 'Thursday', isWeekend: false, day: 10, month: 6, monthName: 'June', year: 2021 }, timezone: { name: '', offsetNum: 3, offsetText: '+03:00' } } ); }); // v1.0.16 it(`"6 April, 3456", "GMT+0", "GMT+0"`, function () { assert.deepEqual( converter.parse("6 April, 3456", "GMT+0", "GMT+0"), { time: { hourMinute12: '12:00', hourMinute24: '00:00', hour12: 12, hour24: 0, amPm: 'am', minute: 0 }, duration: 46901894400000, iso: '3456-04-06T00:00:00+00:00', isoWithFractSec: '3456-04-06T00:00:00.000+00:00', date: { dayOfWeek: 'Sunday', isWeekend: true, day: 6, month: 4, monthName: 'April', year: 3456 }, timezone: { name: 'GMT+0', offsetNum: 0, offsetText: '+00:00' } } ); }); it(`"5432-06-10T10:24:19Z+03:00"`, function () { assert.deepEqual( converter.parse("5432-06-10T10:24:19Z+03:00"), { time: { hourMinute12: '10:24', hourMinute24: '10:24', hour12: 10, hour24: 10, amPm: 'am', minute: 24 }, duration: 109264058659000, iso: '5432-06-10T10:24:19+03:00', isoWithFractSec: '5432-06-10T10:24:19.000+03:00', date: { dayOfWeek: 'Sunday', isWeekend: true, day: 10, month: 6, monthName: 'June', year: 5432 }, timezone: { name: '', offsetNum: 3, offsetText: '+03:00' } } ); }); // 1.0.17 it(`"2010-04-05T15:10:03+00:00"`, function () { assert.deepEqual( converter.parse("2010-04-05T15:10:03+00:00"), { "time": { "hourMinute12": "03:10", "hourMinute24": "15:10", "hour12": 3, "hour24": 15, "amPm": "pm", "minute": 10 }, "duration": 1270480203000, "iso": "2010-04-05T15:10:03+00:00", "isoWithFractSec": "2010-04-05T15:10:03.000+00:00", "date": { "dayOfWeek": "Monday", "isWeekend": false, "day": 5, "month": 4, "monthName": "April", "year": 2010 }, "timezone": { "name": "", "offsetNum": 0, "offsetText": "+00:00" } } ); }); it(`"12-30-00.123Z"`, function () { assert.deepEqual( converter.parse("12-30-00.123Z"), { "time": { "hourMinute12": "12:30", "hourMinute24": "12:30", "hour12": 12, "hour24": 12, "amPm": "pm", "minute": 30 }, "duration": 45000000, "iso": "12:30:00Z", "isoWithFractSec": "12:30:00.123Z", "date": null, "timezone": { "name": "", "offsetNum": 0, "offsetText": "+00:00" } } ); });